Hi @stevebaer,
Regarding this article.
When is it really useful?
I am asking because I have a case where I’m tring to cut about 40 000 breps. And the difference is just 1 second between serial and prallel.
It is possible that I’m not using it correctly
here’s my code (I cannot provide the 3d model):
###################
### trim by box ###
###################
import System
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
import time
import math
#import uuid
import System.Threading.Tasks as tasks
tol = sc.doc.ModelAbsoluteTolerance
def TST(cutter_brep_obj=None,to_be_trimmed=None,parallel=False):
if cutter_brep_obj == None:
cutter_brep_obj_id = rs.GetObject("select cutting box: ",rs.filter.polysurface)
cutter_brep_obj = rs.coercebrep(cutter_brep_obj_id)
rs.AddLayer(rs.ObjectName(cutter_brep_obj_id))
if cutter_brep_obj == None:return
if to_be_trimmed == None:
to_be_trimmed_ids = rs.GetObjects("select objects to be trimmed: ",rs.filter.surface|rs.filter.polysurface)
to_be_trimmed = [rs.coercebrep(id) for id in to_be_trimmed_ids if id is not None]
if to_be_trimmed == None:return
rs.EnableRedraw(False)
#if cutter_brep_obj == None or to_be_trimmed == None: return
iterations_count = len(to_be_trimmed)
def foo(i):
if cutter_brep_obj.Faces.Count > 1:
#print obj.Trim.Overloads[Rhino.Geometry.Brep,System.Double](cutter_brep_obj,tol)
trimmed = to_be_trimmed[i].Trim.Overloads[Rhino.Geometry.Brep,System.Double](cutter_brep_obj,tol)
for brep in trimmed:
trimmed_brep_id = sc.doc.Objects.AddBrep(brep)
#rs.MatchObjectAttributes(trimmed_brep_id,to_be_trimmed_ids[i])
#rs.ObjectLayer(trimmed_brep_id,rs.ObjectName(cutter_brep_obj_id))
if parallel:
tasks.Parallel.ForEach(xrange(iterations_count), foo)
else:
for i in range(iterations_count):
foo(i)
#rs.DeleteObjects(to_be_trimmed_ids)
rs.EnableRedraw(True)
if __name__ == "__main__":
cutter_brep_obj_id = rs.GetObject("select cutting box: ",rs.filter.polysurface)
cutter_brep_obj = rs.coercebrep(cutter_brep_obj_id)
to_be_trimmed_ids = rs.GetObjects("select objects to be trimmed: ",rs.filter.surface|rs.filter.polysurface)
to_be_trimmed = [rs.coercebrep(id) for id in to_be_trimmed_ids if id is not None]
rs.EnableRedraw(False)
cutter_brep_obj.EnsurePrivateCopy()
ts = time.time()
TST(cutter_brep_obj,to_be_trimmed,False)
print "Elapsed time is {:.2f}".format(time.time()-ts)
ts = time.time()
TST(cutter_brep_obj,to_be_trimmed,True)
print "Elapsed time is {:.2f}".format(time.time()-ts)
UPDATE:
Correction, just saw my model consists of 39360 surfaces and 38212 polysurfaces. So close to 80k and 1 second difference.