import rhinoscriptsyntax as rs import clr clr.AddReference("Grasshopper") import Grasshopper.Kernel.Data.GH_Path as ghpath import Grasshopper.DataTree as datatree import System import math mag = 1000 rVec = [0,mag,0] Bounds = datatree[System.Object]() lpoints=datatree[System.Object]() graphPnts = datatree[System.Object]() for i in range(len(geo)): lpoints.AddRange(rs.CurvePoints(geo[i]),ghpath(i)) lpflat = datatree[System.Object](lpoints) lpflat.Flatten() lpflat=rs.CullDuplicatePoints(list(lpflat.Branch(0))) for i in range(len(lpflat)): for j in range(lpoints.BranchCount): p = lpoints.Branch(j) for k in range(len(p)): if rs.Distance(p[k],lpflat[i])<0.5: nlpflat=[] for l in range(len(lpflat[i])): nlpflat.append(round(lpflat[i][l]*tol)/tol) graphPnts.Add(j,ghpath(tuple(nlpflat))) def Next(cLine, se, sp, r): b=Bounds.Branch(r) br=b[len(b)-1] nLine=False Cang = 500 seP = [] seP.append(rs.CurveStartPoint(geo[cLine])) seP.append(rs.CurveEndPoint(geo[cLine])) eP = seP[se] sP = seP[not se] for coo in range(len(eP)): eP[coo]=float(round(eP[coo]*tol)/tol) sP[coo]=float(round(sP[coo]*tol)/tol) try: inds=list(graphPnts.Branch(ghpath(tuple(eP)))) except: inds=False #print "broken at endpoint: ",eP if inds: if br in(inds): inds.remove(br) for a in range(len(inds)): Assign=False oPnts = rs.CurvePoints(geo[inds[a]]) if rs.Distance(oPnts[0],eP)<1: oP = oPnts[1] oPind=1 else: oP = oPnts[0] oPind=0 v2 = rs.PointSubtract(oP,eP) v1 = rs.PointSubtract(sP,eP) ang = round(math.degrees(math.atan2((v1[0]*v2[1]-v1[1]*v2[0]),(v1[0]*v2[0]+v1[1]*v2[1])))) Nang = ang*sp #print r,inds,inds[a],ang,Nang #if ang has the same angle as needed, then will be positive if Nang<0: Nang+=360 if Nang!=0: if not nLine: Assign = True elif Nangrs.CurveLength(geo[inds[a]]): Assign=True if Assign: nLine=geo[inds[a]] Cang=Nang cLine=int(inds[a]) se = oPind if nLine: return cLine, se a=[] for i in range(len(x)): minDist = int(mag) Ray=rs.AddLine(x[i],rs.PointAdd(x[i],rVec)) for j in range(len(geo)): inter = rs.CurveCurveIntersection(Ray,geo[j]) if inter: ipnt = inter[0][1] dist = rs.Distance(x[i],ipnt) if dist0: spin=1 SE =1 Bounds.Add(Seg,ghpath(i)) nSeg = int(Seg) for j in range(60): next = Next(nSeg, SE, spin,i) if next: nSeg = next[0] SE = next[1] else: break if nSeg: if nSeg==Seg: #if it's the original break else: Bounds.Add(nSeg,ghpath(i))