代码如下,但是老出现如下错误(代码后面),不知道怎么解决了。。。求高手解决下。。老师周四就过来检查了可惜没事运行不了。。。蛋疼
import rhinoscriptsyntax as rs
import random
import math
#########################################################################
#LINES
#########################################################################
class MuscleLines():
def __init__(self):
self.lineIDs = []
self.pipeIDs = []
self.startPts = []
self.endPts = []
def draw(self, agent):
if len(agent.neighbors) > 0:
for neighbor in agent.neighbors:
if self.shouldIMakeIt(agent.point, neighbor):
self.lineIDs.append(rs.AddCurve([agent.point, neighbor], 1))
self.startPts.append( agent.point )
self.endPts.append( neighbor )
"""for line in self.lineIDs:
self.pipeIDs.append( rs.AddPipe(line, 0, .08 ))"""
for line in self.lineIDs:
rs.ObjectColor(line, [(rs.CurveLength(line)*2),(rs.CurveLength(line)*1.5),(rs.CurveLength(line)*3)])
def shouldIMakeIt(self, startPt, endPt):
for i in range(len(self.lineIDs)):
otherLineStartPt = self.startPts[i]
otherLineEndPt = self.endPts[i]
if otherLineStartPt == endPt and otherLineEndPt == startPt :
return False
return True
def cleanUp(self):
rs.DeleteObjects(self.lineIDs)
self.lineIDs = []
rs.DeleteObjects(self.pipeIDs)
self.pipeIDs = []
self.startPts = []
self.endPts = []
#########################################################################
#MUSCLES
#########################################################################
class Muscle():
"""initialize the class - pass it the point coordinates (POINT),
and the initial distance to reach out to neighbors(THRESHOLD)"""
def __init__(self, POINT, THRESHOLD, RESETTHRESHOLD, INDEX, GUID, STRENGTH):
self.point = POINT
self.positions = []
self.threshold = THRESHOLD
self.startThres = THRESHOLD
self.resetthreshold = RESETTHRESHOLD
self.strength = STRENGTH
self.resetStrength = STRENGTH
self.neighborstrength = []
#create empty list within object to store
self.myIndex = INDEX
self.id = GUID
self.neighbors = []
self.neighborLine = "empty"
self.neighborLines = []
self.neighborIndexes = []
self.moveVecs = []
self.MyTrail = "empty"
def MovePoint(self, listOfAgents):
MoveVec = [0,0,0]
TotalDist = 0
OverallDist = 0
AvgDist = 0
if len(self.neighbors) > 0:
for neighbor in self.neighbors:
NewVec = rs.VectorCreate(self.point, neighbor)
Dist = rs.Distance(self.point, neighbor)
if Dist < self.resetthreshold:
#unitize the vector so we just have direction
NewVec = rs.VectorUnitize(NewVec)
#scale the vector based on the neighbor's strength
if NewVec == None:
NewVec = [0,0,0]
NewVec = rs.VectorScale(NewVec,((Dist * (self.neighborstrength[self.neighbors.index(neighbor)]))-Dist))
#start toataling (to get average) of the vectors and the dists
MoveVec = rs.VectorAdd(MoveVec, NewVec)
TotalDist = TotalDist + ((Dist * (self.neighborstrength[self.neighbors.index(neighbor)]))-Dist)
else:
NewLine = rs.AddCurve([neighbor, self.point])
NewPoint = rs.AddPoint(rs.CurveMidPoint(NewLine))
NewMuscle = Muscle(rs.PointCoordinates(NewPoint), self.startThres, self.resetthreshold, (len(listOfAgents)+1), NewPoint, (self.resetStrength) )
listOfAgents.append(NewMuscle)
rs.DeleteObject(NewLine)
self.strength = self.resetStrength
self.threshold = self.startThres
print "we got one"
AvgDist = TotalDist/len(self.neighbors)
MoveVec = rs.VectorUnitize(MoveVec)
if MoveVec == None:
MoveVec = [0,0,0]
MoveVec = rs.VectorScale(MoveVec, AvgDist)
self.id = rs.MoveObject(self.id, MoveVec)
self.point = rs.PointCoordinates(self.id)
self.strength = self.strength + 0.008*rs.VectorLength(MoveVec)
self.threshold = self.threshold + 0.1*rs.VectorLength(MoveVec)
def Trail(self):
if self.MyTrail != "empty":
rs.DeleteObject(self.MyTrail)
if len(self.positions) > 2:
self.MyTrail = rs.AddCurve(self.positions,2)
rs.ObjectLayer(self.MyTrail, "TRAILS", True)
def cleanUp(self):
self.neighbors = []
self.neighborIndexes = []
#########################################################################
#MAIN FUNCTION
#########################################################################
def Main(thres, resetthresh):
myMuscleLines = MuscleLines()
#get starting points
POINTS=rs.GetLayer("select layer")
listOfPoints = rs.ObjectsByLayer(POINTS)
ATTRACTORS= rs.GetLayer("select layer")
listOfAttractors = rs.ObjectsByLayer(ATTRACTORS )
#create empty list for all agents
listOfAgents = []
#ASSIGN EACH POINT AS AN INSTANCE OF MUSCLE CLASS
for i in range(len(listOfPoints)):
myMuscle = Muscle(rs.PointCoordinates(listOfPoints[i]), thres, resetthresh, i, listOfPoints[i], 1 )
#append that instance to list of agents
listOfAgents.append(myMuscle)
#ASSIGN ATTRACTORS
for attractor in listOfAttractors:
for myAgent in listOfAgents:
SDist = rs.Distance(myAgent.point, rs.PointCoordinates(attractor))
if SDist < (thres*6):
myAgent.strength = myAgent.strength - ((thres/SDist) * .10)
Iter = 20
for y in range(Iter):
rs.EnableRedraw(False)
myMuscleLines.cleanUp()
for myAgent in listOfAgents:
myAgent.cleanUp()
listOfPosNeighbors = listOfAgents
for otherAgent in listOfPosNeighbors:
if myAgent.myIndex != otherAgent.myIndex:
dist = rs.Distance(myAgent.point, otherAgent.point)
if dist < myAgent.threshold:
myAgent.neighbors.append(otherAgent.point)
myAgent.neighborstrength.append(otherAgent.strength)
myAgent.neighborIndexes.append(listOfPosNeighbors.index(otherAgent))
myMuscleLines.draw(myAgent)
myAgent.Trail()
if y != (Iter-1):
for myAgent in listOfAgents:
myAgent.MovePoint(listOfAgents)
myAgent.positions.append(myAgent.point)
"""#CREATE ANIMATION FRAMES"
path = "C:UserstomDesktopTESTANIMATION"
frame = str(y)
rs.EnableRedraw(enable=True)
rs.Command("_Render")
#rs.Command("-_SaveRenderWindowAs "C:UserstomDesktopENCODED MATTERanimationtestRenderingone.jpg"")
rs.Command("-_SaveRenderWindowAs " + path +frame+".png")
rs.Command("_CloseRenderWindow")
rs.EnableRedraw(enable=False)"""
rs.EnableRedraw(True)
#Run it with the 1. lower threshold(how far we reach out) and upper threshold (when new agent are created)
Main(22,29)
错误:Message: Could not convert None to a list of points
|