Quantcast
Channel: Scripting - McNeel Forum
Viewing all articles
Browse latest Browse all 5881

[python] Usefulness of Multi-Threading

$
0
0

@ivelin.peychev wrote:

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 :stuck_out_tongue_winking_eye:

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.

Posts: 5

Participants: 3

Read full topic


Viewing all articles
Browse latest Browse all 5881

Trending Articles