import random
##caculate points
node = hou.pwd()
geo = node.geometry()
points = geo.points()
## patterns points
node2 = node.input(1)
geo2 = node2.geometry()
blocksPoints=geo2.points()
##ports points
node3 = node.input(2)
geo3 = node3.geometry()
portPoints = geo3.points()
neighbors={}
types={}
maxAttempts=node.parm("../maxAttempts").eval()
seed =node.parm("../seed").eval()
for i,pt in enumerate(points):
neighbors[i]=pt.attribValue("neighbors")
types[i]=pt.attribValue("type")
jointDirection = ((1,0,0),(-1,0,0),(0,1,0),(0,-1,0),(0,0,1),(0,0,-1))
ignoredConnectors=["X","In"]
patternFrequencies = []
patternGroup = []
allPatterns = []
patternPriority=[]
patternRotate={}
patternConnectors={}
numUniquePattern = 0
connectorPort={}
outputCube={}
entropyCube={}
allowedAdjacencies={}
def FetchPatternsFromDataTable(PatternPoints):
global numUniquePattern
patterns = []
for i,pt in enumerate(PatternPoints):
freq = pt.attribValue("freq")
group = pt.attribValue("group")
name = pt.attribValue("name")
priority = pt.attribValue("priority")
rotate = pt.attribValue("rotate")
if rotate ==1:
name+="_0"
patternConnectors[name]=list(set() for dir in range(len(jointDirection)))
for j in range(6):
connector = pt.attribValue("dir_"+ str(j))
patternConnectors[name][j] = connector.split(',')
patterns.append(name)
patternFrequencies.append(freq)
patternGroup.append(group)
patternPriority.append(priority)
patternRotate[name]=rotate
numUniquePattern+=1
return patterns
def FectchPortFromDataTable(portPoints):
for i, pt in enumerate(portPoints):
name = pt.attribValue("name")
port = pt.attribValue("port")
connectorPort[name]=port.split(',')
def PatternRotation():
global numUniquePattern
rotList=[5,4,2,3,0,1]
newPatterns=[]
for index,pattern in enumerate(allPatterns):
if patternRotate[pattern]==0:continue
tempConnector = patternConnectors[pattern]
tempFrequency = patternFrequencies[index]
tempGroup = patternGroup[index]
tempPriority=patternPriority[index]
for i in range(3):
newConnector=[]
newPattern = pattern[:-1] +str(i+1)
for dir in rotList:
connectors = [a for a in tempConnector[dir]]
for index,connector in enumerate(connectors):
if connector.startswith("UD"):
connectors[index]=connector[:-1]+str(i+1)
newConnector.append(connectors)
newPatterns.append(newPattern)
tempConnector=newConnector
patternFrequencies.append(tempFrequency)
patternGroup.append(tempGroup)
patternPriority.append(tempPriority)
patternConnectors[newPattern]=newConnector
for newAddPattern in newPatterns:
allPatterns.append(newAddPattern)
numUniquePattern+=1
def InitializeWfcCube():
for i,pt in enumerate(points):
curNeighborPoints = neighbors[i]
validPatterns=[p for p in allPatterns]
invalidPatterns=set()
for neighborIndex ,neighborPoint in enumerate(curNeighborPoints):
if neighborPoint==-1:
for pattern in allPatterns:
if "In" in patternConnectors[pattern][neighborIndex]:
invalidPatterns.add(pattern)
else:
for pattern in allPatterns:
if "X" in patternConnectors[pattern][neighborIndex]:
invalidPatterns.add(pattern)
for p in validPatterns:
orderId=allPatterns.index(p)
if types[i] !="none" and patternGroup[orderId] !=types[i]:
invalidPatterns.add(p)
for p in invalidPatterns:
if p in validPatterns:
validPatterns.remove(p)
outputCube[i]=[p for p in validPatterns]
def InitializeEntropyCube():
for i,pt in enumerate(points):
entropyCube[i]=len(outputCube[i])
def CaculateAdjacencies():
for i,p in enumerate(allPatterns):
allowedAdjacencies[p]= tuple(set() for dir in range (len(jointDirection)))
##allowedAdjacencies[name][0]=(name1,name2,....)
for patternOne in range(numUniquePattern):
for patternTwo in range(numUniquePattern):
patternOneLeft = patternConnectors[allPatterns[patternOne]][0]
pattenTwoRight = patternConnectors[allPatterns[patternTwo]][1]
patternOneUp = patternConnectors[allPatterns[patternOne]][2]
patternTwoDown = patternConnectors[allPatterns[patternTwo]][3]
patternOneFront = patternConnectors[allPatterns[patternOne]][4]
patternTwoBack = patternConnectors[allPatterns[patternTwo]][5]
for leftConnector in patternOneLeft:
for rightConnector in pattenTwoRight:
if leftConnector in ignoredConnectors or rightConnector in ignoredConnectors:
continue
if leftConnector in connectorPort[rightConnector]:
allowedAdjacencies[allPatterns[patternTwo]][1].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][0].add(allPatterns[patternTwo])
if rightConnector in connectorPort[leftConnector]:
allowedAdjacencies[allPatterns[patternTwo]][1].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][0].add(allPatterns[patternTwo])
for upConnector in patternOneUp:
for downConnector in patternTwoDown:
if upConnector in ignoredConnectors or downConnector in ignoredConnectors:
continue
if upConnector in connectorPort[downConnector]:
allowedAdjacencies[allPatterns[patternTwo]][3].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][2].add(allPatterns[patternTwo])
if downConnector in connectorPort[upConnector]:
allowedAdjacencies[allPatterns[patternTwo]][3].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][2].add(allPatterns[patternTwo])
for forntConnector in patternOneFront:
for backConnector in patternTwoBack:
if forntConnector in ignoredConnectors or backConnector in ignoredConnectors:
continue
if forntConnector in connectorPort[backConnector]:
allowedAdjacencies[allPatterns[patternTwo]][5].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][4].add(allPatterns[patternTwo])
if backConnector in connectorPort[forntConnector]:
allowedAdjacencies[allPatterns[patternTwo]][5].add(allPatterns[patternOne])
allowedAdjacencies[allPatterns[patternOne]][4].add(allPatterns[patternTwo])
def Propagation(point):
toUpdatePoints={point}
loop =0
loopNum=2000
while len(toUpdatePoints) !=0 and loop <loopNum:
pointNum = toUpdatePoints.pop()
for dirIndex,direction in enumerate(jointDirection):
neighborIndexValid = True
neighborPointNum=neighbors[pointNum][dirIndex]
if neighborPointNum <0:
neighborIndexValid=False
if neighborPointNum in entropyCube and neighborIndexValid:
allowedNeighborPattern =set()
for pattern in outputCube[pointNum]:
for allowedPattern in allowedAdjacencies[pattern][dirIndex]:
allowedNeighborPattern.add(allowedPattern)
containedNeighborPattern=outputCube[neighborPointNum]
if not set(containedNeighborPattern).issubset(allowedNeighborPattern):
commonPattern=[pattern for pattern in allowedNeighborPattern if pattern in containedNeighborPattern]
if len(commonPattern)==0:
return False,1
outputCube[neighborPointNum]=commonPattern
entropyCube[neighborPointNum]=len(commonPattern)
toUpdatePoints.add(neighborPointNum)
loop+=1
return True,0
def setPatternNameToPoint(point,pattern):
outputCube[point]=[pattern]
del entropyCube[point]
points[point].setAttribValue('name',pattern)
def Main():
loop=0
loopNum=2000
Running= True
while Running and loop<loopNum:
lowestEntropyPoint=min(entropyCube,key = entropyCube.get)
maxPriority=0
for p in outputCube[lowestEntropyPoint]:
index= allPatterns.index(p)
curPriority=patternPriority[index]
if curPriority>maxPriority:
maxPriority=curPriority
targetPatterns=[]
targetFreq=[]
for p in outputCube[lowestEntropyPoint]:
index = allPatterns.index(p)
curPriority = patternPriority[index]
if curPriority==maxPriority:
targetPatterns.append(p)
targetFreq.append(patternFrequencies[index])
patternToChoose=[]
for i,p in enumerate(targetPatterns):
for freq in range(targetFreq[i]):
patternToChoose.append(p)
randPattern = random.choice(patternToChoose)
setPatternNameToPoint(lowestEntropyPoint,randPattern)
Running,Error= Propagation(lowestEntropyPoint)
if len(entropyCube)==0:
Running = False
loop+=1
if Error ==1:
return False
else:
return True
allPatterns= FetchPatternsFromDataTable(blocksPoints)
FectchPortFromDataTable(portPoints)
PatternRotation()
CaculateAdjacencies()
Error =0
Skip = False
for key in outputCube:
if len(outputCube[key]) == 0:
Skip = True
Error= 1
print(outputCube[key])
if not Skip:
for i in range(0,maxAttempts):
random.seed(seed+i)
InitializeWfcCube()
InitializeEntropyCube()
Success=Main()
if Success:
Error =0
break
else:
Error= 1
# allPatterns=FetchPatternsFromDataTable(blocksPoints)
# PatternRotation()
# print(numUniquePattern)
# FetchPatternsFromDataTable(blocksPoints)
# connectorNEW=[]
# connector = patternConnectors['wall_1b_400x350x200_0']
# rotList=[5,4,2,3,0,1]
# for dir in rotList:
# connectors = [a+"dd" for a in connector[dir]]
# connectorNEW.append(connectors)
# print(connectorNEW)
# FetchPatternsFromDataTable(blocksPoints)
# print(numUniquePattern)
这段代码报错 Python error: Traceback (most recent call last):
File "", line 303, in
File "", line 178, in CaculateAdjacencies
KeyError: 'In ' 请问怎么解决?
最新发布