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

    Add_group slow on mac

    Scheduled Pinned Locked Moved Developers' Forum
    48 Posts 7 Posters 17.0k Views 7 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.
    • G Offline
      GWD
      last edited by

      @dan rathbun said:

      @dan rathbun said:

      YUP. On PC, Sketchup.send_action("save:") returns false. I wonder what the standard action is for Mac ?

      Ok.. it's Sketchup.send_action("saveDocument:") (at least it works on PC, and is listed on the Apple site as an action for the NSDocument class.)

      the Sketchup.send_action("saveDocument:") works on mac!

      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        BUT saveDocument simply saves the current SKP and leaves the undo stack alone.
        IF we use
        pwd=Dir.pwd Dir.chdir(File.dirname(model.path))
        so we don't need to worry about full paths etc...
        Then use
        ` skp=File.basename(model.path)
        tmp=rand.to_s+File.basename(model.path)

        Sketchup.send_action("saveDocument:")
        model.save(tmp)
        Sketchup.open_file(tmp)
        Sketchup.open_file(skp)`

        on completion tidy up
        File.delete(tmp) if File.exist?(tmp) Dir.chdir(pwd)

        it will cause the "undo stack" to empty ! 😲
        BUT at the expense of the time delay of saving/opening/etc etc...
        There seems no easy way to clear the "undo stack" otherwise... πŸ˜•

        TIG

        1 Reply Last reply Reply Quote 0
        • thomthomT Offline
          thomthom
          last edited by

          And we have no signs of "clearing the undo stack" will actually improve the performance of adding geometry, do we?

          Thomas Thomassen β€” SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • D Offline
            driven
            last edited by

            @gwd said:

            the Sketchup.send_action("saveDocument:") works on mac!

            Was this a query? if so, the answer is yes, normally, but the way Dan has used it in the earlier snippets, the Dialog appears, but fails to change the windows name and the script then really does strange things in 'no mans land'

            i.e. it's not 'Untitled Window', or your given name, just 'Sketchup'. The cursor pulses, the view disintegrates[holes appeared] then the whole computer freezes... repeatable, yes but I'll pass.

            In my curiosity to learn some ruby, I cobbled together some additional test scripts and ran them on my mac.

            Script 1: 1.52668809890747 and generates 2000 undo steps #### this is the original from this thread
            Script 2: 0.175029039382935 and generates 1001 undo steps
            Script:3: 0.419209957122803 and generates 2 undo steps
            Script 4: 0.0664420127868652 and generates 2 undo steps #### this uses disable_ui and draws after the timer stops, so add 0.04 maybe...

            My scripts a probably really badly constructed, but they reliably return this similar timings... john

            #########################################################################
            # timer snippet from http://stackoverflow.com/questions/2289381/how-to-time-an-operation-in-milliseconds-in-ruby
            def time
              now = Time.now.to_f
              yield
              endd = Time.now.to_f
              endd - now
            end
            
            time{
            # This code draws a line of points in 1.52668809890747
            # and generates 2000 undo steps
             model = Sketchup.active_model
             entities = model.entities
            for n in 1..1000 do
             g = entities.add_group
             g.name = n.to_s
             point1 = Geom;;Point3d.new(n*1,0,0)
             c = g.entities.add_cpoint point1
             g.explode
            end
            }
            #########################################################################
            def time
              now = Time.now.to_f
              yield
              endd = Time.now.to_f
              endd - now
            end
            time{
            # This code draws a line of points in 0.175029039382935
            # and generates 1001 undo steps
             model = Sketchup.active_model
             entities = model.active_entities
             centerpoint = Geom;;Point3d.new
             full_group = entities.add_group()
             (0..1000).each do |i|
             # Create a line of points
             centerpoint = [i*1,10,0]
             full_group.entities.add_cpoint centerpoint
            end
            full_group.explode
            }
            #########################################################################
            def time
              now = Time.now.to_f
              yield
              endd = Time.now.to_f
              endd - now
            end
            time{
            # This code draws a line of points in  0.389806985855103 on mac
            # and generates 2 undo steps
            require 'sketchup.rb'
            require 'LangHandler.rb'
            
            # Using language handler makes sure that the string "Create Line" gets translated.
            # This is important as this string is shown in undo menu. 
            $make_cp_line_string = LanguageHandler.new("gettingstarted.strings");
            
            def cp_line()
                 model = Sketchup.active_model
                 selection = model.selection
              # Create a transaction so the box is one undo
              model.start_operation($make_cp_line_string.GetString("Create cp_Line"))
            
              entities = model.active_entities
              points_group = entities.add_group()
              centerpoint = Geom;;Point3d.new
              entities = points_group.entities
             
            (0..1000).each do |i|
             # Create a line of points
             centerpoint = [i*1,20,0].to_a
             c_pl = points_group.entities.add_cpoint centerpoint
             points_group.name = "Points Group" 
             points_group.description = "Example Group" 
             selection.add points_group
             
             
             end #create
              model.commit_operation
            
            end
            
            cp_line
            model = Sketchup.active_model
            selection = model.selection
            selection.length
            selection.each { |entity| (entity.explode) }
            }
            
            ##########################################################################
            def time
              now = Time.now.to_f
              yield
              endd = Time.now.to_f
              endd - now
            end
            time{
            # This code draws a line of points in 0.0667488574981689 with disable_ui on mac
            # and generates 2 undo steps
            require 'sketchup.rb'
            require 'LangHandler.rb'
            
            # Using language handler makes sure that the string "Create Line" gets translated.
            # This is important as this string is shown in undo menu. 
            $make_dcp_line_string = LanguageHandler.new("gettingstarted.strings");
            
            def dcp_line()
                 model = Sketchup.active_model
                 selection = model.selection
                 disable_ui = true
              # Create a transaction so the box is one undo
              model.start_operation($make_dcp_line_string.GetString("Create cp_Line"),disable_ui)
            
              entities = model.active_entities
              dis_pnts_group = entities.add_group()
              centerpoint = Geom;;Point3d.new
              entities = dis_pnts_group.entities
             
            (0..1000).each do |i|
             # Create a line of points
             centerpoint = [i*1,30,0].to_a
             dc_pl = dis_pnts_group.entities.add_cpoint centerpoint
             dis_pnts_group.name = "Dis Points Group" 
             dis_pnts_group.description = "Example 2 Group" 
             selection.add dis_pnts_group
             
             
             end #create
              model.commit_operation
            
            end
            
            dcp_line
            model = Sketchup.active_model
            selection = model.selection
            selection.length
            selection.each { |entity| (entity.explode) }
            disable_ui = false
            }
            
            ##########################################################################
            

            learn from the mistakes of others, you may not live long enough to make them all yourself...

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              Well, John, you've proved that disable_ui is much faster that not.

              But the topic is about that add_group and explode group is slow. Which you've also proved, of course, by testing the same entity generation within only 1 group and then exploding it AFTER the loop.

              I only speculated that Sketchup's writing to the Undo stack (and Undo Log file,) might slow things down.

              There is a registry entry on PC for "MaxUndo" (under the "Preferences" key,) which is set to 100 by default. There is no UI control to change this "on-the-fly." (And likely Sketchup would not see any change to the attribute while running.) But I wonder if setting it to 0 before startup would it disable the undo feature all together ?? (I don't know what it's called in the Mac plist.)

              But, regardless, ThomThom believes that it's not the undo stack, but instead the way the app seems to resort the model database, during add groups and explodes.
              What if all the temp groups, were first added to a master group (to separate them from the rest of the model, and then after the loop, the master group was exploded ?)

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                @dan rathbun said:

                There is a registry entry on PC for "MaxUndo" (under the "Preferences" key,) which is set to 100 by default. There is no UI control to change this "on-the-fly." (And likely Sketchup would not see any change to the attribute while running.) But I wonder if setting it to 0 before startup would it disable the undo feature all together ?? (I don't know what it's called in the Mac plist.)

                I just tried this.. set "MaxUndo" to 0 before SU start.

                The undo operations do NOT appear on the Edit menu.

                Sketchup still writes to the undo log, but after each tool operation, it writes a "Commit(0)" line.

                Changing the attribute back to 100 while Sketchup is running has no effect (as I suspected.) And Sketchup will rewrite it's "live" "MaxUndo" value of 0, back to the registry attribute. So you must change it back to whatever limit you wish, while Sketchup is closed, in order to turn the Undo feature back on.

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • Dan RathbunD Offline
                  Dan Rathbun
                  last edited by

                  Also, note. When "MaxUndo" is 0, calling Sketchup.send_action("editUndo:") still returns true, but nothing happens. (At least it does not BugSplat, which I did fear.)

                  I'm not here much anymore.

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    driven
                    last edited by

                    @dan rathbun said:

                    Well, John, you've proved that disable_ui is much faster that not.

                    But the topic is about that add_group and explode group is slow. Which you've also proved, of course, by testing the same entity generation within only 1 group and then exploding it AFTER the loop.

                    I only speculated that Sketchup's writing to the Undo stack (and Undo Log file,) might slow things down.
                    It appears to here, I can see a cursor image refresh as each group is created

                    @unknownuser said:

                    There is a registry entry on PC for "MaxUndo" (under the "Preferences" key,) which is set to 100 by default.There is no UI control to change this "on-the-fly." (And likely Sketchup would not see any change to the attribute while running.) But I wonder if setting it to 0 before startup would it disable the undo feature all together ?? (I don't know what it's called in the Mac plist.)

                    macSU .plist <key>SketchUp.Preferences.MaxUndo</key><string>100</string>
                    I think if you write to, then touch, then read SU uses the update, but I need to check if it works for SU prefs, it does for 'user' ruby ones.

                    @unknownuser said:

                    But, regardless, ThomThom believes that it's not the undo stack, but instead the way the app seems to resort the model database, during add groups and explodes.
                    making a 1000 groups adds 2000 undoes, which is much slower than putting it in the langhandler (which I thought would have a big overhead) with only 1 undo +1 for the explode outside.
                    @unknownuser said:

                    What if all the temp groups, were first added to a master group (to separate them from the rest of the model, and then after the loop, the master group was exploded ?)
                    I'll try and work out a script to do a test, unless you want to...
                    I wasn't really doing this to post back, it's just an exercise in me understanding SU ruby (on mac), but the results seemed to be relevant to the OP's mac/group inquiry. Yell at me if it's not.
                    john

                    learn from the mistakes of others, you may not live long enough to make them all yourself...

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      driven
                      last edited by

                      @dan rathbun said:

                      Also, note. When "MaxUndo" is 0, calling Sketchup.send_action("editUndo:") still returns true, but nothing happens. (At least it does not BugSplat, which I did fear.)

                      One thing I have found when modifying NIB files, is you often need to save, open/close SU then re-save 'manual' preference list changes, to clear SU's cache. Not sure if it's the same with coded writes and maybe it's only the SU ones that are cached?
                      john

                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                      1 Reply Last reply Reply Quote 0
                      • Dan RathbunD Offline
                        Dan Rathbun
                        last edited by

                        @driven said:

                        ... which is much slower than putting it in the langhandler (which I thought would have a big overhead) ...

                        The LanguageHandler class has nothing to do with this subject (speed & groups.) It's just a wrapper for a Hash, that has English (the keys,) strings translated to the user's local language.

                        Read the "langhandler.rb" file in the "Tools" dir, and you'll see it's quite simple. (I don't use this class, since it defaults to using the "Resources" path, and it's much simplier to just use plain old Hash of my own (which can be loaded from a UTF-8 encoded file.)

                        I'm not here much anymore.

                        1 Reply Last reply Reply Quote 0
                        • Dan RathbunD Offline
                          Dan Rathbun
                          last edited by

                          For version 8.0M2,
                          @unknownuser said:

                          (http://support.google.com/sketchup/bin/static.py?hl)":1pr50735]SketchUp Writer C++ API: In earlier versions, ISketchUpGroup::CreateGroup became slower each time it was called. This shouldn't slow down any longer.

                          I would think that this fix was added into the application code as well.

                          @Guy: Is your friend's Mac running Sketchup version 8.0M2 ??

                          I'm not here much anymore.

                          1 Reply Last reply Reply Quote 0
                          • G Offline
                            GWD
                            last edited by

                            @dan rathbun said:

                            For version 8.0M2,
                            @unknownuser said:

                            (http://support.google.com/sketchup/bin/static.py?hl)":100134bg]SketchUp Writer C++ API: In earlier versions, ISketchUpGroup::CreateGroup became slower each time it was called. This shouldn't slow down any longer.

                            I would think that this fix was added into the application code as well.

                            @Guy: Is your friend's Mac running Sketchup version 8.0M2 ??

                            We use on Mac and PC the latest version from google's website. (PC 8.0.11752/MAC 8.0.11.751)

                            I did some more testing:

                            model = Sketchup.active_model
                            entities = model.entities
                            puts '- Start test1 add_group bug on MAC -'
                            start = Time.now
                            for n in 1..1000 do #changed this setting for the testing
                            	g = entities.add_group
                            	g.name = n.to_s
                            	point1 = Geom;;Point3d.new(n*10,0,0)
                            	c = g.entities.add_cpoint point1
                            end
                            puts 'Total time; ' + (start - Time.now).to_s  
                            

                            Results: bugMAC.JPG

                            At this moment we use a workaround. Place the groups in a new model (use the multiple documents on MAC), make a component of all the groups. Save this component and insert it in the model and explode it. The biggest problem of this workaround is that it's impossible to close the new temporary model with ruby. A other problem is that is still a lot slower than on PC.
                            Anybody a solution?

                            1 Reply Last reply Reply Quote 0
                            • Dan RathbunD Offline
                              Dan Rathbun
                              last edited by

                              WoW! Excellent test report. Shows that the Mac still has a problem.

                              I wonder if the difference has to do with Ruby.? The Mac is still running the initial release of v1.8.5, and the PC was updated to v1.8.6-p287.

                              There is a thread on how to point the symbolic references for Sketchup Ruby to a "normal" full Ruby install elesewhere on the Mac's harddrive. (You need to backup the current links, so you can switch back if necessary. Perhaps a shell script?)

                              I'd be interested in seeing the comparison for the Mac, running v1.8.5-p0 and v1.8.6-p287, ... (and perhaps even the latest patchlevel for v1.8.7)

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • G Offline
                                GWD
                                last edited by

                                @dan rathbun said:

                                WoW! Excellent test report. Shows that the Mac still has a problem.

                                I wonder if the difference has to do with Ruby.? The Mac is still running the initial release of v1.8.5, and the PC was updated to v1.8.6-p287.

                                There is a thread on how to point the symbolic references for Sketchup Ruby to a "normal" full Ruby install elesewhere on the Mac's harddrive. (You need to backup the current links, so you can switch back if necessary. Perhaps a shell script?)

                                I'd be interested in seeing the comparison for the Mac, running v1.8.5-p0 and v1.8.6-p287, ... (and perhaps even the latest patchlevel for v1.8.7)

                                And here are the results for ruby 1.8.7 on mac:

                                100 - 0.58 sec
                                200 - 1.69 sec
                                400 - 10.55 sec
                                600 - 33.39 sec
                                1000 - 147 sec

                                Almost no difference with ruby 1.8.5 😞

                                1 Reply Last reply Reply Quote 0
                                • Dan RathbunD Offline
                                  Dan Rathbun
                                  last edited by

                                  Bummer... definately the problem is in the C++ code.

                                  I'm not here much anymore.

                                  1 Reply Last reply Reply Quote 0
                                  • J Offline
                                    jhauswirth
                                    last edited by

                                    Looking at the add_group Ruby code, its the same on both platforms.
                                    One reason (don't know if this is true) it could be slower on the Mac
                                    is the notifications that are sent around could be updating the Mac
                                    UI, like the component browser. This may be more efficiently done on
                                    the PC.

                                    Also, the same code (duplicate code/cut-n-pasted it looks like) that
                                    I fixed in the C++ API was also being used in the Ruby code.
                                    The bug report only mentioned the C++ API, so that's what got fixed.

                                    1 Reply Last reply Reply Quote 0
                                    • thomthomT Offline
                                      thomthom
                                      last edited by

                                      @jhauswirth said:

                                      Looking at the add_group Ruby code, its the same on both platforms.
                                      One reason (don't know if this is true) it could be slower on the Mac
                                      is the notifications that are sent around could be updating the Mac
                                      UI, like the component browser. This may be more efficiently done on
                                      the PC.

                                      I have noticed that if you use Sketchup.status_text within a loop it will be very slow under OSX. It seems that the UI is forcefully freshened all the time, while on Windows you get "white-out" and the UI stops updating - but completes the loop much much faster.

                                      But if it is the UI that slows things down, then running the test with start_operation and disable_ui argument set to true, should show a good performance increase, right?

                                      Thomas Thomassen β€” SketchUp Monkey & Coding addict
                                      List of my plugins and link to the CookieWare fund

                                      1 Reply Last reply Reply Quote 0
                                      • Dan RathbunD Offline
                                        Dan Rathbun
                                        last edited by

                                        @John: thanks for taking a look at this, and "weighing in."

                                        @GWD: Are all these groups to be added REALLY have all the same objects (like the example,) and just have a different location (transform) ?

                                        I'm not here much anymore.

                                        1 Reply Last reply Reply Quote 0
                                        • G Offline
                                          GWD
                                          last edited by

                                          @dan rathbun said:

                                          @John: thanks for taking a look at this, and "weighing in."

                                          @GWD: Are all these groups to be added REALLY have all the same objects (like the example,) and just have a different location (transform) ?

                                          Dan,

                                          No this is just a quick test that reproduce the problem. We have at this moment 2 totaly different script which have this problem.

                                          1 Reply Last reply Reply Quote 0
                                          • G Offline
                                            GWD
                                            last edited by

                                            @thomthom said:

                                            @jhauswirth said:

                                            Looking at the add_group Ruby code, its the same on both platforms.
                                            One reason (don't know if this is true) it could be slower on the Mac
                                            is the notifications that are sent around could be updating the Mac
                                            UI, like the component browser. This may be more efficiently done on
                                            the PC.

                                            I have noticed that if you use Sketchup.status_text within a loop it will be very slow under OSX. It seems that the UI is forcefully freshened all the time, while on Windows you get "white-out" and the UI stops updating - but completes the loop much much faster.

                                            But if it is the UI that slows things down, then running the test with start_operation and disable_ui argument set to true, should show a good performance increase, right?

                                            I tested it with start_operation and it as no effect!

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

                                            Advertisement