{"id":2691,"date":"2013-12-08T16:17:42","date_gmt":"2013-12-08T16:17:42","guid":{"rendered":"http:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/?page_id=2691"},"modified":"2013-12-17T23:46:34","modified_gmt":"2013-12-17T23:46:34","slug":"code","status":"publish","type":"page","link":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/67-2\/code\/","title":{"rendered":"Code \/ Script \/ Gsapp"},"content":{"rendered":"<p>Code 3 scenario<\/p>\n<p>&#8211; Sarx<\/p>\n<p>&#8211; Caging<\/p>\n<p>\/\/ Sprial Path<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nimport math<br \/>\na =[]<\/p>\n<p>class spiral():<\/p>\n<p>def __init__(self, GUID, MAG, SPINF, SPINA, PUSH, DECAY):<br \/>\nself.id = GUID<br \/>\nself.dPts = rs.DivideCurve(self.id,200)<br \/>\nself.dParams = []<br \/>\nself.tans = []<br \/>\nfor dPt in self.dPts:<br \/>\nt = rs.CurveClosestPoint(self.id,dPt)<br \/>\nself.dParams.append(t)<br \/>\nself.tans.append(rs.CurveTangent(self.id, t))<br \/>\nself.mag = MAG<br \/>\nself.spinf = SPINF<br \/>\nself.spina = SPINA<br \/>\nself.push = PUSH<br \/>\nself.decay = DECAY<\/p>\n<p>def getInfluenceVec(self, testPointCoord):<br \/>\n#create a vector between the current agent and the current attractor<br \/>\nindex = rs.PointArrayClosestPoint(self.dPts,testPointCoord)<br \/>\nself.pos = self.dPts[index]<br \/>\nt = self.dParams[index]<br \/>\nself.tan = self.tans[index]<br \/>\norVec = rs.VectorCreate(self.pos,testPointCoord)<br \/>\ndist = rs.VectorLength(orVec)<br \/>\n#unitize keep the direction of the vector but makes the length equal to 1<br \/>\nmagVec = rs.VectorUnitize(orVec)<br \/>\n#scale the vector according to the magnitude of the attractor (and the distance from it)<br \/>\nif dist&gt;0.1:<br \/>\nmagVec = rs.VectorScale(magVec,self.mag\/dist)<br \/>\npushVec = rs.VectorScale(self.tan, self.push\/dist)<br \/>\nspinVec = rs.VectorRotate(orVec, self.spina*180, self.tan)<br \/>\nspinVec = rs.VectorScale(spinVec, self.spinf\/dist)<br \/>\nsumVec = rs.VectorAdd(magVec, pushVec)<br \/>\nsumVec = rs.VectorAdd(sumVec, spinVec)<br \/>\nelse:<br \/>\nsumVec = [0,0,0]<br \/>\nreturn sumVec<\/p>\n<p>def Main():<br \/>\nfor attr in attrCrvs:<br \/>\na.append(spiral(attr,mag,spinForce,spinAngle,pushForce, decayFactor))<br \/>\nMain()<\/p>\n<p>\\\\<\/p>\n<p>\/\/ Paths Cohesion<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nfrom random import choice<\/p>\n<p>a = []<\/p>\n<p>class Agent():<\/p>\n<p>def __init__(self, POS, VEC, ALIGNMENT, SEPARATION ,COHESION, SPIRALF, RADIOUS, TYPE):<br \/>\n#here we initiate the class by matching the inputs to the variables in the class<br \/>\nself.pos = POS<br \/>\nself.vec = VEC<br \/>\nself.alignment = ALIGNMENT<br \/>\nself.separation = SEPARATION<br \/>\nself.cohesion = COHESION<br \/>\nself.spiralF = SPIRALF<br \/>\nself.radious = RADIOUS<br \/>\nself.type = TYPE<br \/>\n#here we make a new list to contain all previous positions for the trail<br \/>\nself.trailPts = []<br \/>\n#save the current position as the first point in the trail<br \/>\nself.trailPts.append(self.pos)<br \/>\n#here we make a new variable to contan the ID string of the trail<br \/>\nself.trailID = &#8220;&#8221;<br \/>\nself.Continue = True<\/p>\n<p>def update(self, agentPopulation):<br \/>\nself.updateVec(agentPopulation)<br \/>\nself.move()<br \/>\nself.drawTrail()<\/p>\n<p>def SpiralVector(self, emfPtList):<br \/>\nif self.Continue:<br \/>\nvecSum = [0,0,0]<br \/>\nfor emfPt in emfPtList:<br \/>\ninfluenceVec = emfPt.getInfluenceVec(self.pos)<br \/>\nif influenceVec == [0,0,0]:<br \/>\nself.Continue = False<br \/>\narrivedAt = emfPt<br \/>\nvecSum = rs.VectorAdd(vecSum,influenceVec)<br \/>\nvecSum = rs.VectorScale(vecSum, self.spiralF)<br \/>\nreturn vecSum<\/p>\n<p>def move(self):<br \/>\nself.pos = rs.PointAdd(self.pos, self.vec)<br \/>\nself.trailPts.append(self.pos)<\/p>\n<p>def updateVec(self, agentPopulation):<br \/>\nneighborAgents = self.createNeighborhood(agentPopulation)[0]<br \/>\nneighborAgentsDistances = self.createNeighborhood(agentPopulation)[1]<br \/>\nif len(neighborAgents)&gt;0:<br \/>\nacc = [0,0,0]<\/p>\n<p>aVec = self.AlignmentVector(neighborAgents, neighborAgentsDistances)<br \/>\nsVec = self.SeparationVector (neighborAgents, neighborAgentsDistances)<br \/>\ncVec = self.CohesionVector (neighborAgents)<br \/>\nsVec = self.SpiralVector(spiralf)<\/p>\n<p>acc = rs.PointAdd(acc, sVec)<br \/>\nacc = rs.PointAdd(acc, aVec)<br \/>\nacc = rs.PointAdd(acc, sVec)<br \/>\nacc = rs.PointAdd(acc, cVec)<\/p>\n<p>self.vec = rs.PointAdd(self.vec, acc)<br \/>\nself.vec = rs.VectorUnitize(self.vec)<\/p>\n<p>def createNeighborhood(self, agentPopulation):<br \/>\nneighborAgents = []<br \/>\nneighborAgentsDistances = []<br \/>\nfor otherAgent in agentPopulation :<br \/>\notherPos = otherAgent.pos<br \/>\ndist = rs.Distance (self.pos,otherPos)<br \/>\nif dist&lt; self.radious and dist&gt;0:<br \/>\nneighborAgents.append(otherAgent)<br \/>\nneighborAgentsDistances.append(dist)<br \/>\nreturn [neighborAgents,neighborAgentsDistances]<\/p>\n<p>def AlignmentVector(self, neighborAgents, neighborAgentsDistances):<br \/>\nsumVec =[0,0,0]<br \/>\nfor i in range(len(neighborAgents)):<br \/>\nagent = neighborAgents[i]<br \/>\nif agent.type == self.type:<br \/>\ncurrentDist = neighborAgentsDistances[i]<br \/>\nvec = rs.VectorScale(agent.vec,self.radious\/currentDist)<br \/>\nsumVec = rs.PointAdd(sumVec, vec)<br \/>\nif rs.VectorLength(sumVec)&gt;0:<br \/>\nsumVec = rs.VectorUnitize(sumVec)<br \/>\nsumVec = rs.VectorScale(sumVec, self.alignment)<br \/>\nreturn sumVec<\/p>\n<p>def SeparationVector (self, neighborAgents, neighborAgentsDistances):<br \/>\nsumVec = [0,0,0]<br \/>\nfor i in range(len(neighborAgents)):<br \/>\nagent = neighborAgents[i]<br \/>\ncurrentDist = neighborAgentsDistances[i]<br \/>\notherPos = agent.pos<br \/>\ntempVec = rs.VectorCreate(self.pos, otherPos)<br \/>\ntempVec = rs.VectorScale(tempVec, self.radious\/currentDist)<br \/>\nif tempVec != None : sumVec = rs.PointAdd (sumVec, tempVec)<br \/>\nif rs.VectorLength(sumVec)&gt;0:<br \/>\nsumVec = rs.VectorUnitize(sumVec)<br \/>\nsumVec = rs.VectorScale(sumVec, self.separation)<br \/>\nreturn sumVec<\/p>\n<p>def CohesionVector (self, neighborAgents):<br \/>\nsumVec = [0,0,0]<br \/>\nfor agent in neighborAgents :<br \/>\nsumVec = rs.PointAdd(agent.pos, sumVec)<br \/>\nsumVec = rs.VectorScale(sumVec,1\/len(neighborAgents))<br \/>\ncurrentDist = rs.Distance(self.pos, sumVec)<br \/>\nsumVec = rs.VectorCreate(sumVec, self.pos)<br \/>\nsumVec = rs.VectorScale(sumVec,self.radious\/currentDist)<br \/>\nif rs.VectorLength(sumVec)&gt;0:<br \/>\nsumVec = rs.VectorUnitize(sumVec)<br \/>\nsumVec = rs.VectorScale(sumVec, self.cohesion)<br \/>\nreturn sumVec<\/p>\n<p>def drawTrail(self):<br \/>\n#delete the old trail curve<br \/>\nif self.trailID:<br \/>\nrs.DeleteObject(self.trailID)<br \/>\n#make a new trail curve from the trailPts list<br \/>\nself.trailID = rs.AddCurve(self.trailPts)<\/p>\n<p>def Main():<br \/>\n####CREATE AGENTS#####<br \/>\nagentPopulation = []<br \/>\ntype = [&#8220;A&#8221;,&#8221;B&#8221;,&#8221;C&#8221;,&#8221;D&#8221;,&#8221;E&#8221;]<br \/>\nfor pointGUID in pointGUIDs:<br \/>\ncoord = rs.PointCoordinates(pointGUID)<br \/>\nagentPopulation.append(Agent(coord,[0,0,1], al, sep, coh, spir, rad, choice(type)) )<\/p>\n<p>####UPDATE AGENTS#####<br \/>\nfor i in range(steps):<br \/>\nfor agent in agentPopulation:<br \/>\nagent.update(agentPopulation)<\/p>\n<p>####DRAW RESULT####<br \/>\nfor agent in agentPopulation:<br \/>\na.append(agent.trailID)<\/p>\n<p>Main()<\/p>\n<p>\\\\<\/p>\n<p>\/\/ Catenaries<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nimport random as r<\/p>\n<p>class monkey():<\/p>\n<p>def __init__(self, POS, VEC, MESHID, REACH):<\/p>\n<p>self.pos = POS<br \/>\nself.vec = VEC<br \/>\nself.mesh = MESHID<br \/>\nself.reach = REACH<br \/>\nself.trailID = &#8220;imnotatrailyet&#8221;<br \/>\nself.trailPts = []<br \/>\nself.trailPts.append(self.pos)<\/p>\n<p>def move(self):<br \/>\ntempos = rs.PointAdd(self.pos,self.vec)<br \/>\nself.vec = rs.VectorCreate(tempos,self.pos)<br \/>\nrndx = r.random()-0.5<br \/>\nrndy = r.random()-0.5<br \/>\nrndz = r.random()-0.5<br \/>\nself.vec = rs.VectorAdd(self.vec,[rndx,rndy,rndz])<br \/>\nself.vec = rs.VectorUnitize(self.vec)<br \/>\nself.vec = rs.VectorScale(self.vec, self.reach)<br \/>\nmeshclPtdata = rs.MeshClosestPoint (self.mesh, tempos)<br \/>\nself.pos = meshclPtdata[0]<br \/>\nif self.pos not in self.trailPts:<br \/>\nself.trailPts.append(self.pos)<\/p>\n<p>def drawTrail(self):<br \/>\nif self.trailID != &#8220;imnotatrailyet&#8221;:<br \/>\nrs.DeleteObject(self.trailID)<br \/>\n#make a new trail curve from the trailPts list<br \/>\nself.trailID = rs.AddPolyline(self.trailPts)<br \/>\nreturn self.trailID<br \/>\na = []<br \/>\ndef Main():<br \/>\n#mesh = rs.GetObject(&#8220;select the mesh from amira&#8221;,rs.filter.mesh)<br \/>\n#startPts = rs.GetObjects(&#8220;sel ect the starting points for the monkeys&#8221;, rs.filter.point)<br \/>\nstartPts = pts<br \/>\nmyMonkeys = []<br \/>\nfor startPt in startPts:<br \/>\ncoord = rs.PointCoordinates(startPt)<br \/>\nmyMonkeys.append(monkey(coord,[0,0,0],mesh,rad))<\/p>\n<p>for i in range(int(gens)):<br \/>\nfor myMonkey in myMonkeys:<br \/>\nmyMonkey.move()<\/p>\n<p>for myMonkey in myMonkeys:<br \/>\na.append(myMonkey.drawTrail())<br \/>\nMain()<\/p>\n<p>\\\\<\/p>\n<p>&nbsp;<\/p>\n<p>-Nursery<\/p>\n<p>import rhinoscriptsyntax as rs<br \/>\nimport scriptcontext<br \/>\nimport Rhino<\/p>\n<p>class Agent():<\/p>\n<p>def __init__(self, POINTID, ATTRS):<\/p>\n<p>self.id = POINTID<br \/>\nself.pos = rs.PointCoordinates(self.id)<br \/>\nself.vec = [0,0,0]<br \/>\nself.trailPts = []<br \/>\nself.trailID = None<br \/>\nself.trailPts.append(rs.VectorAdd(self.pos, self.vec))<br \/>\nself.attrs = ATTRS<br \/>\nself.range = 1<br \/>\nself.live = True<br \/>\nself.radius = 1<br \/>\nself.turnCount = 0<\/p>\n<p>def move(self):<br \/>\nself.attractorPull()<br \/>\nself.pos = rs.VectorAdd(self.pos, self.vec)<br \/>\n#rs.AddPoint(self.pos)<br \/>\nself.trailPts.append(self.pos)<\/p>\n<p>def attractorPull (self):<br \/>\nclAttr = self.getClosestAttr()<br \/>\nif clAttr is not None:<br \/>\notherPos = clAttr.pos<br \/>\notherDist = clAttr.dist<br \/>\nattrVec = rs.VectorCreate(otherPos, self.pos)<\/p>\n<p>#self.vec = rs.VectorAdd(self.vec, attrVec)<br \/>\n#self.vec = rs.VectorUnitize(self.vec)<br \/>\n#self.vec = rs.VectorScale(self.vec, otherDist\/2)<\/p>\n<p># make the Turn<br \/>\nif otherDist &lt;= (self.range*4):<br \/>\nself.turnCount += 1<br \/>\nrotVec = rs.VectorCrossProduct(attrVec, [0,0,1])<br \/>\nrotVec = rs.VectorScale(rotVec,15\/otherDist)<br \/>\nself.vec = rs.VectorAdd(self.vec, rotVec)<br \/>\nself.vec = rs.VectorAdd(self.vec, attrVec)<br \/>\nself.vec = rs.VectorUnitize(self.vec)<br \/>\nself.vec = rs.VectorScale(self.vec, self.radius)<\/p>\n<p>if self.turnCount == 10:<br \/>\nclAttr.state = False<br \/>\nself.turnCount = 0<br \/>\nelse:<br \/>\nself.live = False<\/p>\n<p>def getClosestAttr(self):<br \/>\ndist = 100000<br \/>\nclAttr = None<br \/>\nindex = None<br \/>\nfor i in range(len(self.attrs)):<br \/>\nattr = self.attrs[i]<br \/>\nif attr.state:<br \/>\ntestDist = rs.Distance(self.pos, attr.pos)<br \/>\nif testDist &lt; dist:<br \/>\ndist = testDist<br \/>\nattr.dist = dist<br \/>\nclAttr = attr<br \/>\nreturn clAttr<\/p>\n<p>def drawTrail(self):<br \/>\nif self.trailID is not None:<br \/>\nrs.DeleteObject(self.trailID)<br \/>\nself.trailID = rs.AddCurve(self.trailPts,3)<\/p>\n<p>class Attractor():<\/p>\n<p>def __init__(self, ID, INDEX):<br \/>\nself.id = ID<br \/>\nself.index = INDEX<br \/>\nself.dist = None<br \/>\nself.pos = rs.PointCoordinates(self.id)<br \/>\nself.state = True<\/p>\n<p>def Main():<br \/>\nRhino.RhinoApp.Wait()<br \/>\nattrs = []<\/p>\n<p>startPt = rs.GetObject(&#8220;Pick start point&#8221;, rs.filter.point, preselect =True)<br \/>\nweavePts = rs.GetObjects(&#8220;Pick attractors&#8221;, rs.filter.point)<\/p>\n<p>for i in range(len(weavePts)):<br \/>\nattrs.append(Attractor(weavePts[i],i))<\/p>\n<p>myAgent = Agent(startPt, attrs)<\/p>\n<p>for i in range(100):<br \/>\nif myAgent.live:<br \/>\nmyAgent.move()<br \/>\nmyAgent.drawTrail()<br \/>\nscriptcontext.escape_test()<\/p>\n<p>#print myAgent.trailPts<\/p>\n<p>Main()<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Code 3 scenario &#8211; Sarx &#8211; Caging \/\/ Sprial Path import rhinoscriptsyntax as rs import math a =[] class spiral(): def __init__(self, GUID, MAG, SPINF, SPINA, PUSH, DECAY): self.id = GUID self.dPts = rs.DivideCurve(self.id,200) self.dParams = [] self.tans = [] for dPt in self.dPts: t = rs.CurveClosestPoint(self.id,dPt) self.dParams.append(t) self.tans.append(rs.CurveTangent(self.id, t)) self.mag = MAG self.spinf = [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":67,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-2691","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/pages\/2691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/comments?post=2691"}],"version-history":[{"count":8,"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/pages\/2691\/revisions"}],"predecessor-version":[{"id":2877,"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/pages\/2691\/revisions\/2877"}],"up":[{"embeddable":true,"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/pages\/67"}],"wp:attachment":[{"href":"https:\/\/new-territories.com\/blog\/2013GSAPP-UPENN\/wp-json\/wp\/v2\/media?parent=2691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}