Add_group slow on mac
-
I've a script that runs good on my PC. But when my friend uses it on his mac with the same model it's much slower (more than 10x). After a lot of testing to narrowed down the problem, adding a group with add_group on a big model is much slower on mac than on pc. How can we avoid this problem?
-
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?
-
@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
endOn PC this goes fast, on mac this takes a very long time.
-
hm... will have to have a look...
as for status text: http://forums.sketchucation.com/viewtopic.php?f=180&p=305388#p305248
-
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 ).
-
@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#saveAnd 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.
-
@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
-
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 ?
-
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.skpyou 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! -
@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.
-
@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.)
-
@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...
-
YUP. On PC,
Sketchup.send_action("save:")
returnsfalse
. I wonder what the standard action is for Mac ?Dittos.. on the API.
-
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...
-
@dan rathbun said:
YUP. On PC,
Sketchup.send_action("save:")
returnsfalse
. 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.) -
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
-
@dan rathbun said:
@dan rathbun said:
YUP. On PC,
Sketchup.send_action("save:")
returnsfalse
. 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!
-
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... -
And we have no signs of "clearing the undo stack" will actually improve the performance of adding geometry, do we?
-
@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 } ##########################################################################
Advertisement