{"id":1474,"date":"2012-12-11T14:43:15","date_gmt":"2012-12-11T14:43:15","guid":{"rendered":"http:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/?page_id=1474"},"modified":"2012-12-19T00:59:30","modified_gmt":"2012-12-19T00:59:30","slug":"code-3-add-title","status":"publish","type":"page","link":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/code\/code-3-add-title\/","title":{"rendered":"&#8230;But Narcissus &#038; Nemesis"},"content":{"rendered":"<p>&#8220;&#8221;&#8221;<br \/>\n##########################################################<br \/>\nscript written by Luis Felipe Paris &amp; Ezio Blasetti<br \/>\nscript version Nov. 20, 2012<br \/>\n#########################################################<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nimport random<\/p>\n<p>class machine():<\/p>\n<p>def __init__(self,PTA,CRVS,DIST):<\/p>\n<p>####MAX DIST####<br \/>\nself.maxDist = DIST<br \/>\n####CLOSEST POINT###<br \/>\nminDist = 5000000000000000000 #large number<br \/>\nfor crv in CRVS:<br \/>\nif crv is not None:<br \/>\nt = rs.CurveClosestPoint(crv, PTA)<br \/>\nclPt = rs.EvaluateCurve(crv,t)<br \/>\ndist = rs.Distance(PTA, clPt) #distance to closest point on each curve<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclPt = clPt #set closest pt to this one<br \/>\n####POINT B####<br \/>\nvec = rs.VectorCreate(PTA,clPt)#vector to closest point<br \/>\nvec = rs.VectorUnitize(vec)<br \/>\nzVec = rs.VectorCreate([0,0,1],[0,0,0])#Unit Z Vector \\\\NOT NECESSARY FOR 3D<br \/>\ntrans = rs.VectorRotate(vec,90,zVec)<br \/>\nPTB = rs.CopyObject(PTA,trans) #end point for line<\/p>\n<p>####################<br \/>\nself.ptsA = [rs.PointCoordinates(PTA)] #list of points a<br \/>\nself.idsA = [PTA] #list of ids a<\/p>\n<p>self.ptsB = [rs.PointCoordinates(PTB)] #list of points b<br \/>\nself.idsB = [PTB] #list of ids b<\/p>\n<p>self.vecs = [vec] #list of direction vectors<\/p>\n<p>self.trailPts = [PTA] #list of trail points<br \/>\nself.trails = []<\/p>\n<p>self.boundsCount = [] #empty list for number of times is far from start point<br \/>\n####################<\/p>\n<p>def reflection(self,CRV,POS1,POS2,ID,SCALE):<\/p>\n<p>scaleR = SCALE*2<br \/>\nscaleP = 2000000<br \/>\n#create intersection for point a<br \/>\nt = rs.CurveClosestPoint(CRV,POS1)<br \/>\ninx = rs.EvaluateCurve(CRV, t)<br \/>\ninxL = rs.AddLine(POS1, inx)#line to intersect<br \/>\nmirrorIntersections = rs.CurveCurveIntersection(inxL, CRV)#list of intersection results<br \/>\nrs.DeleteObject(inxL) #delete line<br \/>\nfor mirrorInt in mirrorIntersections:<br \/>\ninxP = mirrorInt[3] #intersection point<br \/>\ninxT = mirrorInt[7] #parameter in CRV<\/p>\n<p>delList = []<\/p>\n<p>tan = rs.CurveTangent(CRV,inxT)#tangent vector<br \/>\ntan = rs.VectorAdd(tan, inxP)#tangent at curve<br \/>\ntan = rs.AddPoint(tan)#TANGENT ADD<br \/>\ndelList.append(tan)#Delete List Add<\/p>\n<p>zVec = rs.VectorCreate([0,0,1],[0,0,0])#Unit Z Vector \\\\NOT NECESSARY FOR 3D<\/p>\n<p>nor = rs.RotateObject(tan,inxP,90,zVec,copy=True)#rotate 90 degrees to get normal<br \/>\npt = rs.MirrorObject(ID,inxP,nor,copy=True)#mirror self using normal as plane info<br \/>\ndelList.append(nor)#Delete List Add<br \/>\ndelList.append(pt)#Delete List Add<\/p>\n<p>refl = rs.AddLine(inxP, pt)#line to intersect<br \/>\nrefl = rs.ScaleObject(refl,inxP,[scaleR,scaleR,scaleR])#scale<br \/>\ndelList.append(refl)#Delete List Add<\/p>\n<p>plane = rs.AddLine(POS1, POS2) #plane at direction of movement<br \/>\nmidPt = rs.VectorAdd(POS1, POS2)#midPoint of plane \/\/add and divide<br \/>\nmidPt = rs.VectorDivide(midPt, 2)<br \/>\nplane = rs.ScaleObject(plane,midPt,[scaleP,scaleP,scaleP])#scale plane to ensure intersection<br \/>\ndelList.append(plane)#Delete List Add<\/p>\n<p>reflIntersections = rs.CurveCurveIntersection(refl,plane)#list of intersection results<\/p>\n<p>if type(reflIntersections) == type([]):<br \/>\nreflInt = rs.AddPoint(reflIntersections[0][3])#resulting reflection<br \/>\nelse: reflInt = rs.CurveEndPoint(refl)<\/p>\n<p>rs.DeleteObjects(delList)<br \/>\nreturn reflInt<\/p>\n<p>def test(self,CRVS,TRAILS,FCT,MAX,INDEX,TRAILINDEX,RECU,INT):<\/p>\n<p>####PTS 0####<br \/>\nptA0 = self.ptsA[-1] #assign point a info (last item on list)<br \/>\nidA0 = self.idsA[-1]<\/p>\n<p>ptB0 = self.ptsB[-1] #assign point b info (last item on list)<br \/>\nidB0 = self.idsB[-1]<\/p>\n<p>####SEPARATION####<br \/>\nif RECU &gt; 0:<br \/>\nSEPM = self.separationMirror(CRVS,INDEX,RanOfVis)#find closest Point<br \/>\nif SEPM is None: SEPM = [0,0,0]<br \/>\nSEPS = self.separationSelf(CRVS,INDEX)#find closest Point<br \/>\nif SEPS is None: SEPS = [0,0,0]<\/p>\n<p>####COHESION####<br \/>\nif RECU &gt; 0:<br \/>\nCOH = self.cohesion(TRAILS,TRAILINDEX,RanOfVis)<br \/>\nif COH is None: COH = [0,0,0]<br \/>\nif INT &lt; div:<br \/>\nCOH = rs.VectorReverse(COH)<\/p>\n<p>####PTS 1####<br \/>\nCRV = self.findClosestCurve(CRVS,INDEX,RECU)#find closest Curve<br \/>\nmirrorVec = self.vecToRefl(idA0, CRV)#vector to point of reflection in mirror<br \/>\nscale = rs.VectorLength(mirrorVec)<\/p>\n<p>ptA1 = self.reflection(CRV, ptA0, ptB0, idA0, scale)#reflection point of point a<br \/>\nptB1 = self.reflection(CRV, ptB0, ptA0, idB0, scale) #reflection point of point b<\/p>\n<p>adjust = 1.00 #adjust for scaling (in case of no intersection)<\/p>\n<p>if rs.IsPoint(ptA1): ptA1=ptA1<br \/>\nelse:<br \/>\nptA1=rs.AddPoint(ptA1)<br \/>\nadjust = adjust-0.25<\/p>\n<p>if rs.IsPoint(ptB1): ptB1=ptB1<br \/>\nelse:<br \/>\nptB1=rs.AddPoint(ptB1)<br \/>\nadjust = adjust-0.25<\/p>\n<p>####DISTANCE TESTS####<br \/>\ndInc = rs.Distance(ptA0,ptB0) #distance point a to point b<br \/>\ndRefl = rs.Distance(ptA1,ptB1)*adjust #distance in reflected points<br \/>\nTest1 = rs.Distance(ptB0,ptA1) #test to check for inversion<br \/>\nTest2 = rs.Distance(ptA0,ptA1) #test to check for inversion<br \/>\ndStart = rs.Distance(self.ptsA[0],ptA0) #distance from start point<\/p>\n<p>rs.DeleteObject(ptA1) #delete reflected points<br \/>\nrs.DeleteObject(ptB1) #delete reflected points<\/p>\n<p>ratio = dRefl\/dInc #ratio of distortion<br \/>\nratio = 0.00000001 + ratio*FCT #scaling<br \/>\nif ratio &gt; MAX*FCT: ratio = MAX*FCT<\/p>\n<p>####TRANSLATION####<br \/>\ntrans = rs.VectorCreate(ptB0, ptA0)#translation vector<br \/>\nif unitizeCurrent == True: ##<br \/>\ntrans = rs.VectorUnitize(trans)<\/p>\n<p>if scaleCurrent == True: ##<br \/>\ntrans = rs.VectorScale(trans,ratio)<\/p>\n<p>vec = self.vecs[-1] #direction vector from previous translation<\/p>\n<p>if unitizePrevious == True: ##<br \/>\nvec = rs.VectorUnitize(vec)<\/p>\n<p>trans = rs.VectorAdd(vec,trans)<\/p>\n<p>if unitizeResult == True: ##<br \/>\ntrans = rs.VectorUnitize(trans)<\/p>\n<p>####DISTORTION STATES####<br \/>\n#if dInc == dRefl: print &#8220;true reflection&#8221;<\/p>\n<p>if dInc &lt; dRefl:<br \/>\n#print &#8220;augmented reflection&#8221;<br \/>\ntrans = rs.VectorSubtract(trans, rs.VectorScale(rs.VectorUnitize(mirrorVec), ratio))<\/p>\n<p>if dInc &gt; dRefl:<br \/>\n#print &#8220;reduced reflection&#8221;<br \/>\ntrans = rs.VectorAdd(trans, rs.VectorScale(rs.VectorUnitize(mirrorVec), ratio))<\/p>\n<p>if rs.VectorLength(trans) &gt; maxMove:<br \/>\ntrans = rs.VectorUnitize(trans)<br \/>\ntrans = rs.VectorScale(trans, maxMove)<\/p>\n<p>if Test1&gt;Test2:<br \/>\n#print &#8220;inversion&#8221;<br \/>\ntrans = rs.VectorReverse(trans)<\/p>\n<p>if dStart &gt;= self.maxDist:<br \/>\n#trans = -1*trans<br \/>\nself.boundsCount.append(1)<\/p>\n<p>####SUM VECTORS####<br \/>\nif RECU &gt; 0:<br \/>\nmag = rs.VectorLength(trans)<\/p>\n<p>if rs.VectorLength(SEPM) &gt; mag:<br \/>\nSEPM = rs.VectorUnitize(SEPM)<br \/>\nSEPM = rs.VectorScale(SEPM,mag)<br \/>\nif rs.VectorLength(SEPS) &gt; mag:<br \/>\nSEPS = rs.VectorUnitize(SEPS)<br \/>\nSEPS = rs.VectorScale(SEPS,mag)<br \/>\nif rs.VectorLength(COH) &gt; mag:<br \/>\nCOH = rs.VectorUnitize(COH)<br \/>\nCOH = rs.VectorScale(COH,mag)<\/p>\n<p>trans = rs.VectorAdd(SEPM, trans)<br \/>\ntrans = rs.VectorAdd(SEPS, trans)<br \/>\ntrans = rs.VectorAdd(COH, trans)<br \/>\ntrans = rs.VectorUnitize(trans)<br \/>\ntrans = rs.VectorScale(trans, mag)<\/p>\n<p>###################<br \/>\nself.vecs.append(trans)<br \/>\nnewPtA = rs.VectorAdd(ptA0, trans)<br \/>\nself.ptsA.append(newPtA)<br \/>\ntp = rs.AddPoint(newPtA)<br \/>\nself.idsA.append(tp)<\/p>\n<p>newPtB = rs.VectorAdd(ptB0, trans)<br \/>\nself.ptsB.append(newPtB)<br \/>\nself.idsB.append(rs.AddPoint(newPtB))<\/p>\n<p>self.trailPts.append(tp)<br \/>\n###################<\/p>\n<p>def makeTrails(self,INDEX,RECU):<br \/>\nif len(self.trailPts)&gt;2:<br \/>\nmyTrailID = rs.AddInterpCurve(self.trailPts) #Control Pts Curve Trajectory<br \/>\nself.trails.append(myTrailID)<br \/>\nreturn myTrailID<\/p>\n<p>def vecToRefl(self, PT1, CRV):<br \/>\nt = rs.CurveClosestPoint(CRV, PT1)<br \/>\nclPt = rs.EvaluateCurve(CRV,t)<br \/>\nvec = rs.VectorCreate(clPt, PT1)<br \/>\nreturn vec<\/p>\n<p>def findClosestCurve(self, CRVS, INDEX, RECU):<br \/>\nmycoord = self.ptsA[-1] #position at last item of ptsA list<br \/>\nminDist = 5000000000000000000 #large number<br \/>\nfor crv in CRVS:<br \/>\nif crv is not None:<br \/>\nif RECU &gt; 0 and crv is not CRVS[INDEX]:<br \/>\nt = rs.CurveClosestPoint(crv, mycoord)<br \/>\nclPt = rs.EvaluateCurve(crv,t)<br \/>\ndist = rs.Distance(mycoord, clPt) #distance to closest point on each curve<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclosestCurve = crv #set closest crv to this one<br \/>\nt = rs.CurveClosestPoint(crv, mycoord)<br \/>\nclPt = rs.EvaluateCurve(crv,t)<br \/>\ndist = rs.Distance(mycoord, clPt) #distance to closest point on each curve<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclosestCurve = crv #set closest crv to this one<br \/>\nreturn closestCurve<\/p>\n<p>def separationMirror(self,CRVS, INDEX, RANGE):<br \/>\nclosestPt = 0<br \/>\nmycoord = self.idsA[-1] #position at last item of ptsA list<br \/>\nminDist = RANGE<br \/>\nfor crv in CRVS:<br \/>\nif crv is not None:<br \/>\nif crv is not CRVS[INDEX]:<br \/>\nt = rs.CurveClosestPoint(crv, mycoord)<br \/>\nclPt = rs.EvaluateCurve(crv,t)<br \/>\ndist = rs.Distance(mycoord, clPt) #distance to closest point on each curve<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclosestPt = clPt #set closest point to this one<br \/>\nif closestPt != 0:<br \/>\nvec = rs.VectorCreate(mycoord, closestPt)<br \/>\nvec = rs.VectorScale(vec, sepMFct)<br \/>\nreturn vec<br \/>\nelse: return None<\/p>\n<p>def separationSelf(self,CRVS, INDEX):<br \/>\nmycoord = self.idsA[-1] #position at last item of ptsA list<br \/>\nminDist = 5000000000000000000 #large number<br \/>\nfor pt in self.idsA:<br \/>\nif pt is not mycoord:<br \/>\ndist = rs.Distance(mycoord, pt)#distance to each previous point<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclosestPt = pt #set closest point to this one<br \/>\nvec = rs.VectorCreate(mycoord, closestPt)<br \/>\nvec = rs.VectorScale(vec, sepSFct)<br \/>\nreturn vec<\/p>\n<p>def cohesion(self,TRAILS,TRAILINDEX,RANGE):<br \/>\nclosestPt = 0<br \/>\nmycoord = self.ptsA[-1] #position at last item of ptsA list<br \/>\nminDist = RANGE #large number<br \/>\nfor crv in TRAILS:<br \/>\nif crv is not TRAILS[TRAILINDEX]:<br \/>\nt = rs.CurveClosestPoint(crv, mycoord)<br \/>\nclPt = rs.EvaluateCurve(crv,t)<br \/>\ndist = rs.Distance(mycoord, clPt) #distance to closest point on each curve<br \/>\nif dist &lt; minDist: #if distance is smaller than last one<br \/>\nminDist = dist #set minDist to this one<br \/>\nclosestPt = clPt #set closest point to this one<br \/>\nif closestPt != 0:<br \/>\nvec = rs.VectorCreate(closestPt, mycoord)<br \/>\nvec = rs.VectorScale(vec, cohFct)<br \/>\nreturn vec<br \/>\nelse: return None<\/p>\n<p>def delete(self):<br \/>\nself.idsA.pop(0)<br \/>\nself.trails.pop()<br \/>\nrs.DeleteObjects(self.idsA)<br \/>\nrs.DeleteObjects(self.idsB)<br \/>\nrs.DeleteObjects(self.trails)<\/p>\n<p>def Main():<br \/>\nrs.EnableRedraw(drawOn)<\/p>\n<p>baseListLen = len(reflcrvs)<\/p>\n<p>####TRAILS####<br \/>\ntrails = []<\/p>\n<p>####MACHINE CREATION####<br \/>\nmyMachines = []<br \/>\nfor i in range(len(startPos)):<br \/>\nmyMachines.append(machine(startPos[i],reflcrvs, dist))<\/p>\n<p>####RUN TEST####<br \/>\ncount = 0<br \/>\ninterval = 0<br \/>\nfor i in range(int(recurrence)):<br \/>\nj = 0<br \/>\nfor m in myMachines:<br \/>\n#print j<br \/>\nif len(m.boundsCount) &gt; limit: break<br \/>\nk = baseListLen+j<br \/>\nm.test(reflcrvs,trails,amplitude,max,k,j,i,interval)<br \/>\ntrajectory = m.makeTrails(i,int(recurrence))#append resulting trajectory<br \/>\nif i == 0:<br \/>\nreflcrvs.append(trajectory)#append resulting trajectory<br \/>\ntrails.append(trajectory)<br \/>\nreflcrvs[k] = trajectory<br \/>\ntrails[j] = trajectory<br \/>\nj = j + 1<br \/>\ninterval = count % divisor<br \/>\ncount = count +1<\/p>\n<p>################<br \/>\nfor m in myMachines:<br \/>\nm.delete()<br \/>\n################<\/p>\n<p>#################################################################################<br \/>\ndrawOn = False<br \/>\nstartPos = rs.GetObjects(&#8220;Select Machine Locations&#8221;, rs.filter.point, preselect=True) #Initial Position<br \/>\nreflcrvs = rs.GetObjects(&#8220;Select Reflective Curves&#8221;, rs.filter.curve) #Mirrors<br \/>\n####AMPLITUDE####<br \/>\namplitude = 24 #Amplitude Scale<br \/>\nmax = 10.0 #Max Amplitude<br \/>\n####BOUNDS####<br \/>\nlimit = 500 #limit to kill<br \/>\ndist = 10000.0 #distance to kill<br \/>\n####SCALING FROM REFLECTION####<br \/>\nscaleCurrent = True<br \/>\nunitizeCurrent = False<br \/>\nunitizePrevious = True<br \/>\nunitizeResult = True<br \/>\n####SEPARATION &amp; COHESION####<br \/>\ncohFct = 0.1<br \/>\nsepSFct = 0.3<br \/>\nsepMFct = 0.7<\/p>\n<p>####GLOBALS######################################################################<br \/>\nrecurrence = 2000<br \/>\nmaxMove = 10.0<br \/>\nRanOfVis = 100.0<br \/>\ndivisor = RanOfVis\/maxMove*10<br \/>\ndiv = divisor\/5<br \/>\n#################################################################################<br \/>\nMain()<\/p>\n<p>&#8220;&#8221;&#8221;<br \/>\n##########################################################<br \/>\nscript written by Luis Felipe Paris &amp; Ezio Blasetti<br \/>\nscript version Nov. 12, 2012<br \/>\n#########################################################<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nimport math<br \/>\nimport random<\/p>\n<p>fx = 1.50 #Global Variable for Scaling<\/p>\n<p>def vertOffset(paths,spacing,max,fct,fct2,fct3,recu,per):<br \/>\nfor path in paths: #loop through paths<\/p>\n<p>pLen = rs.CurveLength(path) #length of path<br \/>\nnPoints = int(pLen\/spacing) #divide by distance<\/p>\n<p>crvs = [] #empty curves list<br \/>\ncrvLns = [] #empty length list<br \/>\ncrvs.append(path) #add path to curves list<br \/>\ncrvLns.append(rs.CurveLength(path)) #add length to length list<\/p>\n<p>for j in range(recu): #loop for a given number of curves to produce<\/p>\n<p>crv = crvs[j] #get curve<br \/>\ninitcrv = crvs[0] #original curve<br \/>\ncrvLen = crvLns[j] #get curve length<br \/>\npts = [] #empty points list<br \/>\ncurvRadiiList = curvPercentage(crv,nPoints) #get curve curvatures radii list<\/p>\n<p>for i in range(nPoints): #loop through points in curve<\/p>\n<p>domain = rs.CurveDomain(crv) #get curve domain<br \/>\nt = domain[0] + i*(domain[1]-domain[0])\/nPoints #scale parameter to evaluate to domain<\/p>\n<p>##4 PARAMETERS: VEC, NORMAL, RADIUS, PERCENTAGE<br \/>\nvec = rs.CurveCurvature(crv,t)[4]#curvature vector<br \/>\nvec = rs.VectorScale(vec,1\/fx)<br \/>\ntan = rs.CurveTangent(crv, t)<br \/>\nnormal = rs.VectorRotate(tan, 90, [0,0,1])#normal vector<br \/>\ncurvRad = rs.CurveCurvature(crv, t)[3]#curvature radius<br \/>\nindex = curvRadiiList.index(curvRad)+1<br \/>\ncurvRad = curvRad\/fx<br \/>\ncurvPer = index\/len(curvRadiiList)#curvature percentage<\/p>\n<p>##### FISHNET #####<br \/>\nif curvPer &gt;= per: #slider test<\/p>\n<p>##SCALING<br \/>\nvec = rs.VectorScale(vec, max\/2)<br \/>\nl = rs.VectorLength(vec)<\/p>\n<p>#for Height<br \/>\nif l &gt; max:<br \/>\nvec = rs.VectorUnitize(vec)<br \/>\nvec = rs.VectorScale(vec, max)<br \/>\nl = rs.VectorLength(vec)<\/p>\n<p>#for CurvatureVector<br \/>\nif l &gt; fct2:<br \/>\nvec = rs.VectorUnitize(vec)<br \/>\nvec = rs.VectorScale(vec, fct2)<\/p>\n<p>##GLOBAL NORMAL FROM ORIGINAL CURVE<br \/>\ninitdomain = rs.CurveDomain(initcrv)<br \/>\ninitT = initdomain[0] + i*(initdomain[1]-initdomain[0])\/nPoints<br \/>\nglobalNormal = rs.VectorRotate(rs.CurveTangent(initcrv, initT), 90, [0,0,1]) #normal at initcrv<\/p>\n<p>##CURVATURE RADIUS AT PREVIOUS &amp; NEXT T<br \/>\nt0Rad = 0<br \/>\nt2Rad = 0<br \/>\nif i &gt; nPoints-1 and i &lt; 0:<br \/>\nt0 = domain[0] + (i-1)*(domain[1]-domain[0])\/nPoints<br \/>\nt0Rad = rs.CurveCurvature(crv, t)[3]#curvature radius at t0<br \/>\nt2 = domain[0] + (i+1)*(domain[1]-domain[0])\/nPoints<br \/>\nt2Rad = rs.CurveCurvature(crv, t)[3]#curvature radius at t2<\/p>\n<p>if curvRad &#8211; t2Rad &gt; curvRad &#8211; t0Rad:<br \/>\nglobalNormal2 = rs.VectorAdd(globalNormal,rs.VectorReverse([normal[0],normal[1],globalNormal[2]]))<br \/>\nglobalNormal2 = rs.VectorUnitize(globalNormal2)<br \/>\nif globalNormal2:<br \/>\nglobalNormal2 = rs.VectorScale(globalNormal2, fct)<br \/>\nglobalNormal = globalNormal2<\/p>\n<p>globalNormal = rs.VectorScale(globalNormal, fct*max*math.sqrt(j*i\/nPoints)) #global normal scaling<br \/>\nglobalNormal = rs.VectorScale(globalNormal, curvPer+0.01)<\/p>\n<p>temp = rs.EvaluateCurve(crv,t)<br \/>\ntemp = rs.VectorAdd(temp,vec)<br \/>\ntemp = rs.VectorAdd(globalNormal, temp)<\/p>\n<p>pts.append([temp[0],temp[1],temp[2]+l])<\/p>\n<p>##### CURVATURE JITTER #####<br \/>\nelse:<br \/>\ncurvRad = curvRad*fct3<br \/>\nnormal = rs.VectorUnitize(normal)<br \/>\nnormal = rs.VectorScale(normal, curvRad)<\/p>\n<p>if rs.VectorLength(normal) &gt; fct3:<br \/>\nnormal = rs.VectorUnitize(normal)<br \/>\nnormal = rs.VectorScale(normal, fct3)<\/p>\n<p>if rs.VectorLength(normal) &lt; -1*fct3:<br \/>\nnormal = rs.VectorUnitize(normal)<br \/>\nnormal = rs.VectorScale(normal, -1*fct3)<\/p>\n<p>h = spacing*(1-curvPer)\/max<br \/>\nif h &lt; 0: h = 0<\/p>\n<p>pt = rs.EvaluateCurve(crv, t)<br \/>\npt = rs.VectorAdd(pt, normal)<\/p>\n<p>pts.append([pt[0],pt[1],pt[2]+h])<\/p>\n<p>result = rs.AddInterpCurve(pts)<br \/>\ncrvLns.append(rs.CurveLength(result))<br \/>\ncrvs.append(result)<\/p>\n<p>&#8220;&#8221;&#8221;<br \/>\n####MESHING####<br \/>\nvtxs = []<br \/>\nfvtxs = []<br \/>\ncolvtxs = []<br \/>\nnPoints = 2000<\/p>\n<p>for i in range(len(crvs)-1):<br \/>\nfor j in range(nPoints):<br \/>\nt = domain[0] + j*(domain[1]-domain[0])\/nPoints<br \/>\ntemp1 = rs.EvaluateCurve(crvs[i],t)<br \/>\ntemp2 = rs.EvaluateCurve(crvs[i+1],t)<br \/>\nvtxs.append(temp1)<br \/>\nvtxs.append(temp2)<\/p>\n<p>ran = 40<br \/>\nstart = 5<br \/>\nh1 = ((((i+1)\/recu)+((j+1)\/nPoints))\/2*ran)+start<br \/>\nh2 = ((((i+2)\/recu)+((j+1)\/nPoints))\/2*ran)+start<br \/>\nc1 = rs.ColorHLSToRGB([h1,127,255])<br \/>\nc2 = rs.ColorHLSToRGB([h2,127,255])<br \/>\ncolvtxs.append(c1)<br \/>\ncolvtxs.append(c2)<\/p>\n<p>if j&gt;0:<br \/>\ne = len(vtxs)<br \/>\nfvtxs.append([e-4,e-2,e-1,e-3])<\/p>\n<p>rs.AddMesh(vtxs,fvtxs,vertex_colors=colvtxs)<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>def curvPercentage(crv,nPoints):<br \/>\nlList = []<br \/>\ndomain = rs.CurveDomain(crv)<br \/>\nfor i in range(nPoints):<br \/>\nt = domain[0] + i*(domain[1]-domain[0])\/nPoints<br \/>\nr = rs.CurveCurvature(crv, t)[3] #radius<br \/>\nlList.append(r)<br \/>\nlList.sort()<br \/>\nreturn lList<\/p>\n<p>def Main():<br \/>\npaths = rs.GetObjects(&#8220;Select Curves&#8221;, rs.filter.curve, preselect=True)<\/p>\n<p>&#8220;&#8221;&#8221;<br \/>\n##relation should be length of curve\/10^2 for scaling and of curve\/10^5 for factors##<br \/>\ni.e. len:1000mm &amp; 7 Peaks<br \/>\nfx=1<br \/>\ndivLen = 5<br \/>\nyOffset = 12<br \/>\nfactor1 = 0.01<br \/>\nfactor2 = 0.08(5)<br \/>\n&#8220;&#8221;&#8221;<\/p>\n<p>####TUNING SCALE####<br \/>\ndivLen = 2\/fx #a point every __ units(i.e. mm)<br \/>\nyOffset = 5\/fx #vertical height offset<\/p>\n<p>####CONTROL####<br \/>\nfactor1 = 0.04\/fx #factor for: FISHNET: GlobalNormal (Overhang)<br \/>\nfactor2 = 1\/fx #factor for: FISHNET: Curvature Vector (Jitter)<br \/>\nfactor3 = 0.05\/fx #factor 2 for: JITTER: Normal (Loops); Usually good when == factor1*5<\/p>\n<p>####NUMBER####<br \/>\nrecurrence = 5 #number of curves<\/p>\n<p>####SLIDER####<br \/>\npercentage = 0.6 #split percentage point between FISHNET(-0.0001) to JITTER(1.0001)<\/p>\n<p>vertOffset(paths,divLen,yOffset,factor1,factor2,factor3,recurrence,percentage)<br \/>\nMain()<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;&#8221;&#8221; ########################################################## script written by Luis Felipe Paris &amp; Ezio Blasetti script version Nov. 20, 2012 ######################################################### &#8220;&#8221;&#8221; import rhinoscriptsyntax as rs import random class machine(): def __init__(self,PTA,CRVS,DIST): ####MAX DIST#### self.maxDist = DIST ####CLOSEST POINT### minDist = 5000000000000000000 #large number for crv in CRVS: if crv is not None: t = rs.CurveClosestPoint(crv, PTA) clPt = [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":9,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-1474","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/pages\/1474","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/comments?post=1474"}],"version-history":[{"count":4,"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/pages\/1474\/revisions"}],"predecessor-version":[{"id":1627,"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/pages\/1474\/revisions\/1627"}],"up":[{"embeddable":true,"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/pages\/9"}],"wp:attachment":[{"href":"https:\/\/www.new-territories.com\/blog\/ncertainties\/col12\/wp-json\/wp\/v2\/media?parent=1474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}