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.1k 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.
    • thomthomT Offline
      thomthom
      last edited by

      Are you sure it's add_group being slow?
      Are you by any chance also using Sketchup.status_text as well? Updating the progress of your script?

      Do you have a sample script you're testing with?

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

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

        @thomthom said:

        Are you sure it's add_group being slow?
        Are you by any chance also using Sketchup.status_text as well? Updating the progress of your script?

        Do you have a sample script you're testing with?

        We use indeed the Sketchup.status_text in our script for updating the progress. But this isn't to problem because the problem also occurs with te following simple script.
        Create a model with 1000 solids and run the following script:

        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*10,0,0)
        c = g.entities.add_cpoint point1
        g.explode
        end

        On PC this goes fast, on mac this takes a very long time.

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

          hm... will have to have a look...

          as for status text: http://forums.sketchucation.com/viewtopic.php?f=180&p=305388#p305248

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

          1 Reply Last reply Reply Quote 0
          • T Offline
            th3lurker
            last edited by

            I've had the same problem. I wrote an import tool for a custom format, and add_group (if i create a group for each volume) or add_face/add_point(if i create just one main group, and keep adding to that) greatly slows down the import. It gets exponentially slower (1.2 secs for 100 volumes, 120 seconds for 1400, 0.02 secods/add_group in the beginning, ~0.2 seconds/add_group near the end). I tested this with the GWD's code, and even without all my other code, it is just as slow. Any ideas/ workarounds? I work on windows vista (not my fault πŸ˜„ ).

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

              @dan rathbun said:

              
              >       if PC
              >         Sketchup.send_action(57603)
              >       else # Mac
              >         # may be convoluted on Mac
              >       end
              > 
              

              Why not use Model.save ?
              http://code.google.com/apis/sketchup/docs/ourdoc/model.html#save

              And I don't see how saving would free up the undo stack. ❓ Seems to operate the same after a save...

              I don't think saving has any effect - it's SketchUp that process existing geometry whenever new is added in order for auto-merge to work.

              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

                @thomthom said:

                Why not use Model.save ?

                I was under the impression that the API would not let use use that method to overwrite the current file. But I just tested it and yes, it does work.

                @thomthom said:

                And I don't see how saving would free up the undo stack. ❓ Seems to operate the same after a save...

                And, your're correct again. (Maybe I made an assumption.) On PC we can clear the undo stack by saving, then asking for a new model, then reloading the old model. (The API does not have a method to close the active model, yet. So it may be a no go on Mac.)

                Here's an updated example:

                model = Sketchup.active_model
                entities = model.entities
                disable_ui = true
                save = true
                if save
                  path = UI.savepanel("Save Model to","*.skp")
                  if path.nil?
                    save = false
                  else
                    path = File.expand_path(path)
                  end
                end
                
                for n in 1..1000 do
                  begin
                    model.start_operation("Group#{n}",disable_ui)
                    g = entities.add_group
                    g.name = n.to_s
                    point1 = Geom;;Point3d.new(n*10,0,0)
                    c = g.entities.add_cpoint point1
                    g.explode
                  rescue => e
                    model.abort_operation
                    puts("Error #<#{e.class.name}; #{e.message}>")
                    puts(e.backtrace)
                  else
                    model.commit_operation
                    # opt save model here
                    if save
                      Sketchup.active_model.save(path)
                      Sketchup.file_new
                      Sketchup.open_file(path)
                    end
                  end
                end
                

                I'm not here much anymore.

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

                  Is it explode that is slow ? Or adding group definitions ?

                  If making groups (and explode) is avoided, is it still as slow ?

                  Does turning off shadows and textures speed things up ?

                  I'm not here much anymore.

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

                    There are issues with model.save.
                    It only saves by name, but not path obtained using File from model.path etc.
                    It does NOT save by the name of the current SKP, although it returns 'true'...
                    To test this make a simple SKP and save it as 'aaa.skp'.

                    model=Sketchup.active_model Dir.pwd

                    if not where aaa.skp is located use

                    Dir.chdir(File.dirname(model.path))

                    now use

                    model.save("xxx.skp")### it saves a copy as xxx.skp

                    you are still inside aaa.rb

                    model.save(File.basename(model.path))### saves as itself - aaa.skp [supposedly, as it returns 'true' !]

                    Now edit the SKP with a noticeable change, and repeat

                    model.save("xxx.skp") model.save(File.basename(model.path))

                    Exit without saving further...
                    xxx.skp WILL show the changes
                    aaa.skp will NOT show the changes, that it said were saved, BUT were not!

                    TIG

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

                      @dan rathbun said:

                      Is it explode that is slow ? Or adding group definitions ?

                      Both. Adding geometry gets slower and slower in SU. When you explode you take the entities from one context and add it to another - so it suffers from the same slowdown of adding them.

                      @dan rathbun said:

                      Does turning off shadows and textures speed things up ?

                      It seems to be that SU processes all existing geometry when anything is added to a context.

                      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

                        @tig said:

                        There are issues with model.save.

                        Thanks TIG... I knew you had expounded on this subject before.. and tried to get the Google team to fix this save BS.

                        Well, the example above at least DOES clear the undostack on PC...

                        which is why (ThomThom) I originally used the send_action for the PC menu's "Save" option. (Which does work.)

                        I'm not here much anymore.

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

                          @dan rathbun said:

                          which is why (ThomThom) I originally used the send_action for the PC menu's "Save" option. (Which does work.)

                          ...under Windows only...

                          πŸ˜’ sigh the Ruby API makes my head ache all too often...

                          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

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

                            Dittos.. on the API.

                            I'm not here much anymore.

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

                              I wish that PolygonMesh had more features in the Ruby API. In the C++ SDK you can define more info when you create the mesh. Under the Ruby API you are more limited.

                              One example, you can retrieve the mesh of any geometry - from that you can get info on hidden/soft edges and UV mapping. But you cannot create a mesh with UV mapping or control hidden/smooth. That severely limits the usability of PolygonMesh as a method of creating geometry.

                              So either complex and very slow geometry creation, or simple and less slow creation.

                              Or use the C++ API - ...which require C++ knowledge... 😞 Slower development...

                              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

                                @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.)

                                I'm not here much anymore.

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

                                  You might try saving the model to a temp file, after each group. That should clear the undo stack.
                                  The file must have a name other than "Untitled" or the save dialog will popup.

                                  Also use the disable_ui flag in an operation:

                                  model = Sketchup.active_model
                                  entities = model.entities
                                  disable_ui = true
                                  PC =( RUBY_PLATFORM =~ /(mswin|mingw)/ ? true ; false )
                                  save = true
                                  for n in 1..1000 do
                                    begin
                                      model.start_operation("Group#{n}",disable_ui)
                                      g = entities.add_group
                                      g.name = n.to_s
                                      point1 = Geom;;Point3d.new(n*10,0,0)
                                      c = g.entities.add_cpoint point1
                                      g.explode
                                    rescue
                                      model.abort_operation
                                    else
                                      model.commit_operation
                                      # opt save model here
                                      if save
                                        if PC
                                          Sketchup.send_action(57603)
                                        else # Mac
                                          Sketchup.send_action("saveDocument;")
                                        end
                                      end
                                    end
                                  end
                                  

                                  I'm not here much anymore.

                                  1 Reply Last reply Reply Quote 0
                                  • 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
                                            • 1
                                            • 2
                                            • 3
                                            • 3 / 3
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement