sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    [How to?] Observer to web dialog A,A&I

    Scheduled Pinned Locked Moved Developers' Forum
    12 Posts 3 Posters 1.1k Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R Offline
      RickW
      last edited by

      Some (hopefully) constructive comments:

      1. The "@" symbol indicates a class instance variable, but you haven't defined a class for your def when you introduce "@def". I'd suggest a new class "ChrisGlasierScenes".
      2. You add an observer every time "chrisglasierScenes" is run. This will add a lot of overhead. Adding the observer should take place outside any defined methods.
      3. Globals are generally frowned upon, unless you make sure you have a unique name for them. $dlg is pretty generic, and it's possible someone else could come up with $dlg, and then you (or they) are SOL. That said, after you create the class, you can save an instance of it in a specially-named global variable, like
      $chrisglasierScenes = ChrisGlasierScenes.new
      

      You can then access the global when you want the dialog to do something

      $chrisglasierScenes.dlg.execute_script(cmd)
      

      Here's a mockup bit of code incorporating my suggestions:

      class MySelectionObserver < Sketchup;;SelectionObserver
       def onSelectionBulkChange(selection)
        model = Sketchup.active_model
        selection = model.selection
        $ChrisGlasierScenes.selected = selection[0].name  #includes js array index
        puts $ChrisGlasierScenes.selected
        cmd = "sceneSelected('#{selected}');"
        $ChrisGlasierScenes.dlg.execute_script(cmd)
       end  # def
      end  # class
      
      
      class ChrisGlasierScenes # CREATE A NEW CLASS
      
       @@observer_added = false # A CLASS VARIABLE
       attr_accessor ;dialog, ;selected # PROVIDES ACCESS TO THESE VARIABLES FROM OUTSIDE THE INSTANCE
      
       def initialize # THE AUTOMATIC METHOD CALLED WHEN A NEW INSTANCE OF THE CLASS IS CREATED
        unless @@observer_added # IF THIS IS 'FALSE', THEN YOUR OBSERVER HAS NOT BEEN ADDED YET
         Sketchup.active_model.selection.add_observer(MySelectionObserver.new)
         @@observer_added = true # SET TO 'TRUE' SO NO ADDITIONAL OBSERVERS ARE ADDED
        end
        @dlg = UI;;WebDialog.new("cgScenes", true, "Scene machine", .... && on and on)
       end #initialize
      end #class ChrisGlasierScenes
      
      $ChrisGlasiserScenes = $ChrisGlasierScenes || ChrisGlaserScenes.new # SETS THE GLOBAL TO A NEW INSTANCE OF YOUR CLASS, UNLESS IT HAS ALREADY BEEN SET - SAVES OVERHEAD WHEN RELOADING THE .RB FILE
      
      

      I've used observers combined with dialogs on several of my presentation tools (NightSky was the first ever, then SelectAtStartup, PageUtilities2, SceneExporterPro, CameraControls, and a few others). It's a powerful combination!

      RickW
      [www.smustard.com](http://www.smustard.com)

      1 Reply Last reply Reply Quote 0
      • chrisglasierC Offline
        chrisglasier
        last edited by

        @rickw said:

        Here's a mockup bit of code incorporating my suggestions: ... It's a powerful combination!

        I put a link to this topic in a # above the vastly improved code - rather inadequate acknowledgement of your skill and generosity I am afraid.

        Many thanks

        Chris

        With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

        1 Reply Last reply Reply Quote 0
        • aadbuildA Offline
          aadbuild
          last edited by

          hi guys sorry to barge in and forgive me if I am off track. I see that you trying to export to web dialog. can I export say out liner, dynamic components ( by layer), groups or scenes? I have been trying for years now to get take offs from sketchup and I am still not there. I can get material quantities and lists to excel from the models. unfortunately they quickly become obsolete when the model is updated. I then have to re export and format the spread sheet to suit my requiremnts. If it where possible to have it update to web continuously I could have my suppliers pricing on the latest take offs when they log in. this would also help with my paperless office attempts

          Every building designed can be affordable & buildable, to help we built PlusSpec; VDC & BIM for Sketchup

          https://www.plusspec.com

          1 Reply Last reply Reply Quote 0
          • chrisglasierC Offline
            chrisglasier
            last edited by

            I thought I had it all figured out, but obviously I have done something to scupper it.

            Here is the top part with my comments marked #CG#:

            require 'sketchup.rb'
            
            class MySelectionObserver < Sketchup;;SelectionObserver
            def onSelectionBulkChange(selection)
            
            model = Sketchup.active_model
            selection = model.selection
            $chrisglasierScenes.selected = selection[0].name  #CG# does this need to be global - only used here
            puts $chrisglasierScenes.selected
            cmd = "sceneTest('#{selected}');"
            $chrisglasierScenes.dlg.execute_script(cmd)		
            #CG#don't really understand why this can be attached to a global!
            end  # def
            end  # class
            
            
            class ChrisGlasierScenes # CREATE A NEW CLASS
            
            attr_accessor ;dialog, ;selection # PROVIDES ACCESS TO THESE VARIABLES FROM OUTSIDE THE INSTANCE
            
            @@observer_added = false # A CLASS VARIABLE
            
            def initialize
             # THE AUTOMATIC METHOD CALLED WHEN A NEW INSTANCE OF THE CLASS IS CREATED
              unless @@observer_added # IF THIS IS 'FALSE', THEN YOUR OBSERVER HAS NOT BEEN ADDED YET
               Sketchup.active_model.selection.add_observer(MySelectionObserver.new)
               @@observer_added = true # SET TO 'TRUE' SO NO ADDITIONAL OBSERVERS ARE ADDED  
               end
            end	#cg# I ended initialize here - is that correct?
            
            
            def ChrisGlasierScenes.cgScenes		#CG# I added this - is it correct?
            
            Sketchup.send_action "selectSelectionTool;"
            
            @dlg = UI;;WebDialog.new("cgScenes02", true, "Scene machine", 300, 205, 0, 0, true)
            subDir = "chrisGlasierScenes02PC/"
            fileName = "scene machine.htm"
            	
            @dlg.set_file File.join(File.dirname(__FILE__), subDir+fileName)
            
            

            after that there is a bunch of @dlg.add_action_callbacks and then:

            
            
            @dlg.show()
                  
            end #cgScenes
            end #class ChrisGlasierScenes
            
            $chrisglasierScenes = $chrisglasierScenes || ChrisGlasierScenes.new # SETS THE GLOBAL TO A NEW INSTANCE OF YOUR CLASS, UNLESS IT HAS ALREADY BEEN SET - SAVES OVERHEAD WHEN RELOADING THE .RB FILE
            #CG# changed different spellings and capitalisation in mock up
            
            
            
            if (not file_loaded?("chrisglasierScenes02PC.rb"))
                
            UI.menu("Plugins").add_item("cgScenes02" ){ChrisGlasierScenes.cgScenes }
            
            end
            	
            file_loaded("chrisglasierScenes02PC.rb")   
            
            

            If Rick you or anyone else could spot my error(s) I would be most grateful.

            Thanks

            Chris

            With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

            1 Reply Last reply Reply Quote 0
            • chrisglasierC Offline
              chrisglasier
              last edited by

              @aadbuild said:

              hi guys sorry to barge in and forgive me if I am off track. I see that you trying to export to web dialog. can I export say out liner, dynamic components ( by layer), groups or scenes? I have been trying for years now to get take offs from sketchup and I am still not there. I can get material quantities and lists to excel from the models. unfortunately they quickly become obsolete when the model is updated. I then have to re export and format the spread sheet to suit my requiremnts. If it where possible to have it update to web continuously I could have my suppliers pricing on the latest take offs when they log in. this would also help with my paperless office attempts

              Far from barging in or off track, your participation is appreciated. I think you are one of few seriously pursuing the paperless office. This pursuit is made harder because office software is all about documents - digital equivalent of paperwork. We don't offer an ATM a cheque (check) because it needs a human being to interpret it; instead we use a digitised card. So if we want to automate we need to make digitised objects (they can be virtual). The working environment becomes object not document oriented.

              This topic is part of that, making the Sketchup display into a digital machine. When you select entities immediately you receive information about them in the webdialog. And of course there can be various integral devices that deal with tasks like the requests for quotations you mention.

              So I think it is wrong to think of this as exporting data. This is more an operating system, a mix of structured information and coding, that can be plugged into applications like Sketchup to set or get data, directly, from the app's display or via the web. Instead of using Excel and email you simply make your selections and click submit (like an SCF post) to make your quotation requests.

              So far the first small step after introducing the concept of namesets was the cgScenes 1.04 plugin. This reduces the necessity of opening and closing layer, outliner, style and scene windows and view menu when managing scenes. No big deal but it does substitute some human effort with automation - it has moving parts; it is a machine.

              The next step which I am struggling to complete (see previous post) is to expand the machine so that you can identify and navigate all parts of projects. It provides new indexes to run above layers, groups and outliner. These are nested so that you can move through various levels from the project to individual component or scene. There are six indexes: assembly (like a room), batch (like sanitaryware), concept (like fire precautions), dimension, label and scene.

              Scenes can be categorised by purpose such as presentation, setting out, layout, schedule, inventory, detail and trade. Dimensions and label selections use the SU layer system but assembly, batch and concept turn components on and off by level heading and/or individually. (All respective layers are turned on.) One big advantage is that components don't get stuck in one layer or group, so, for example, a tiled floor can appear in an assembly (room), batch (floor finishes) or concept (hygiene).

              So the best I can offer to relieve your take off (bill of material) problems and bolster your paperless office aspirations, is that I will do my best to get the new version out, and then we can discuss what devices are needed to operate your house building business.

              My regards

              Chris

              With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

              1 Reply Last reply Reply Quote 0
              • R Offline
                RickW
                last edited by

                @chrisglasier said:

                I thought I had it all figured out, but obviously I have done something to scupper it.

                Here is the top part with my comments marked #CG#:

                require 'sketchup.rb'
                > 
                > class MySelectionObserver < Sketchup;;SelectionObserver
                >  def onSelectionBulkChange(selection)
                >   model = Sketchup.active_model
                >   selection = model.selection
                >   $chrisglasierScenes.selected = selection[0].name  #CG# does this need to be global - only used here #RW# Yes, it references $chrisglasierScenes, which is set in your next code block - it is used to create a single instance of your class.
                >   puts $chrisglasierScenes.selected
                >   cmd = "sceneTest('#{selected}');"
                >   $chrisglasierScenes.dlg.execute_script(cmd)	#CG#don't really understand why this can be attached to a global! #RW# the global references an instance of your class.  Conceptually, it's really no different than "model = Sketchup.active_model".  Perhaps the confusing part is that the global is defined near the end of the code, but referenced earlier in code blocks.  It has to be set at the end; otherwise, it will return an error because the class it wants to be an instance of is not yet undefined.
                >  end  # def
                > end  # class
                > 
                > 
                > class ChrisGlasierScenes # CREATE A NEW CLASS
                > 
                >  attr_accessor ;dialog, ;selection # PROVIDES ACCESS TO THESE VARIABLES FROM OUTSIDE THE INSTANCE
                >  @@observer_added = false # A CLASS VARIABLE
                > 
                >  def initialize # THE AUTOMATIC METHOD CALLED WHEN A NEW INSTANCE OF THE CLASS IS CREATED
                >   @model = Sketchup.active_model
                >   unless @@observer_added # IF THIS IS 'FALSE', THEN YOUR OBSERVER HAS NOT BEEN ADDED YET
                >    Sketchup.active_model.selection.add_observer(MySelectionObserver.new)
                >    @@observer_added = true # SET TO 'TRUE' SO NO ADDITIONAL OBSERVERS ARE ADDED  
                >   end
                >  end	#cg# I ended initialize here - is that correct? #RW# yes
                > 
                > ###def ChrisGlasierScenes.cgScenes #CG# I added this - is it correct? #RW# it depends.  If you want to call the method without an instance, yes.  Since $chrisglasierScenes is created as an instance, it is not necessary - you can use "def cgScenes"
                > 
                >  def cgScenes
                >   Sketchup.send_action "selectSelectionTool;"
                >   @dlg = UI;;WebDialog.new("cgScenes02", true, "Scene machine", 300, 205, 0, 0, true)
                >   subDir = "chrisGlasierScenes02PC/"
                >   fileName = "scene machine.htm"
                >   @dlg.set_file File.join(File.dirname(__FILE__), subDir+fileName)
                > 
                

                after that there is a bunch of @dlg.add_action_callbacks and then:

                
                > 
                >   @dlg.show()
                >  end #cgScenes
                > end #class ChrisGlasierScenes
                > 
                > $chrisglasierScenes = $chrisglasierScenes || ChrisGlasierScenes.new # SETS THE GLOBAL TO A NEW INSTANCE OF YOUR CLASS, UNLESS IT HAS ALREADY BEEN SET - SAVES OVERHEAD WHEN RELOADING THE .RB FILE
                > #CG# changed different spellings and capitalisation in mock up
                > 
                > unless file_loaded?("chrisglasierScenes02PC.rb")
                >   file_loaded("chrisglasierScenes02PC.rb")
                >   ($submenu) ? (submenu = $submenu) ; (submenu = UI.menu("Plugins"))
                >   submenu.add_item("cgScenes02" ){ $chrisglasierScenes.cgScenes }
                > end #RW# edited to be compatible with Organizer ;) and to not repeat the "file_loaded" call when reloading.
                > 
                

                If Rick you or anyone else could spot my error(s) I would be most grateful.

                Thanks

                Chris

                Here you go, with added comments tagged with #RW#.

                RickW
                [www.smustard.com](http://www.smustard.com)

                1 Reply Last reply Reply Quote 0
                • chrisglasierC Offline
                  chrisglasier
                  last edited by

                  @rickw said:

                  Here you go, with added comments tagged with #RW#.

                  Sorry Rick but I get this with a new component in a newly opened file:

                  Observer transfer problem 2.png

                  and nothing here:

                  Observer transfer problem 3.png

                  with the same model in which $dlg works:

                  Observer.png

                  I tried changing this: attr_accessor :dialog, :selection to attr_accessor :dialog, :selected - no effect.

                  Thanks for all your comments, very useful for a reluctant coder like me! I am more familiar with JavaScript so I struggle quite a bit with Ruby. If you can spot the problem(s) please let me know. I can send the files but it seems presumptuous to do so here.

                  Thanks again

                  Chris

                  edit 1600hrs : also get nothing after I save the cylinder model

                  With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                  1 Reply Last reply Reply Quote 0
                  • chrisglasierC Offline
                    chrisglasier
                    last edited by

                    Thanks for your PM Rick.

                    With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                    1 Reply Last reply Reply Quote 0
                    • chrisglasierC Offline
                      chrisglasier
                      last edited by

                      @aadbuild said:

                      I may be able to help you a little with identifying components and materials I have several rubies that do this. Tf rubies does a great job of exporting timber and grouping it. We are also working on a ruby that searches sketchup for materials and then gives square meters by material and also lineal metrs by component. great fo a comprehensive break down.

                      That would be good; could you email me with them? Also would you be prepared to let me have one of your models? One part of cgScenes 2 analyses what already exists in a model and reforms it to start off the six indexes I describe above.

                      @unknownuser said:

                      We need to bring on the paperless office as quick possible

                      I agree; that's why I am so interested in developing alternatives in webdialogs.

                      Thanks

                      Chris

                      With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                      1 Reply Last reply Reply Quote 0
                      • aadbuildA Offline
                        aadbuild
                        last edited by

                        [

                        Every building designed can be affordable & buildable, to help we built PlusSpec; VDC & BIM for Sketchup

                        https://www.plusspec.com

                        1 Reply Last reply Reply Quote 0
                        • 1 / 1
                        • First post
                          Last post
                        Buy SketchPlus
                        Buy SUbD
                        Buy WrapR
                        Buy eBook
                        Buy Modelur
                        Buy Vertex Tools
                        Buy SketchCuisine
                        Buy FormFonts

                        Advertisement