首先让我说我试图创建一个最小的例子但是无法复制结果。我试图不把它作为一个习惯来转储我在这里的所有代码,但我不确定另一种方式来说明这个问题。我正在编写一个类来将我的应用程序中的数据输出到特定格式,我在代码中得到了错误的结果。
我尝试输出的格式应如下所示:
Nodestyle" nodeType" "名称"
"属性类型属性名称" [数值]
如果属性链接到另一个节点
"参与属性类型属性名称" ["节点名:输出属性名称"]
示例:
Bxdf "PxrDisney" "7fcfd465-87c3-4092-98b9-b67d1655bc32"
"color baseColor" [0.20.50.8]
"color emitColor" [0.00.00.0]
"float subsurface" [0]
"reference color subsurfaceColor" ["a3bb37f2-dbb8-407b8a1ac93822ebef7c:resultRGB"]
"float metallic" [0]
"float specular" [.5]
"float specularTint" [0]
"float roughness" [.25]
"float anisotropic" [0]
"float sheen" [0]
"float sheenTint" [.5]
"float clearcoat" [0]
"float clearcoatGloss" [1]
"float presence" [1]
"int inputAOV" [0]
Pattern "PxrHSL" "a3bb37f2-dbb8-407b-8a1a-c93822ebef7c"
"color inputRGB" [0.00.00.0]
"float hue" [0.0]
"float saturation" [1.0]
"float luminance" [1.0]
我得到的结果如下:
('Bxdf "PxrDisney" "7fcfd465-87c3-4092-98b9-b67d1655bc32" \n "color baseColor" [0.20.50.8] \n "color emitColor" [0.00.00.0] \n "float subsurface" [0] \n "reference color subsurfaceColor"', '["a3bb37f2-dbb8-407b-8a1a-c93822ebef7c:resultRGB"] \n ')"float metallic" [0]
"float specular" [.5]
"float specularTint" [0]
"float roughness" [.25]
"float anisotropic" [0]
"float sheen" [0]
"float sheenTint" [.5]
"float clearcoat" [0]
"float clearcoatGloss" [1]
"float presence" [1]
"int inputAOV" [0]
Pattern "PxrHSL" "a3bb37f2-dbb8-407b-8a1a-c93822ebef7c"
"color inputRGB" [0.00.00.0]
"float hue" [0.0]
"float saturation" [1.0]
"float luminance" [1.0]
看起来如果在字符串中输出特殊字符和额外项目,直到有对另一个节点的引用。如果我链接到另一个属性让我们说basecolor它将只给出错误的结果到basecolor。如果根本没有连接则没有问题。为什么字符串会出现这种行为?这是有问题的课程。该类采用我逐步执行的节点对象数组。
#This will handel the export of the RIB contaning all the shader calls
class exporter ():
nodes = None
dicNodes = {}
outStream = []
#Method Two: Use shader as a starting point
#Find the shader
#go through each attribute on the shader
#if connected check attrs on connected node
def __init__(self, incomenodes):
self.nodes = incomenodes
dicNodes = {}
outStream = []
#create a dic using nids as keys
for node in self.nodes:
self.dicNodes[str(node.nid)] = node
#Run Export Command for each shader
x = 0
for node in self.nodes:
print str(node.nodeType.nType)
if str(node.nodeType.nType) == 'bxdf':
self.streamMe(node)
target = open('/home/jspada20/outStream.RIB', 'w')
print 'JAMES! There are ', len(self.outStream), 'items in the out stream'
for line in self.outStream:
target.write(line)
print line
target.close()
def streamMe(self, node):
#Layout for the header of a node call is....
#Pattern "PxrThinFilm" "PxrThinFilm1"
#Bxdf "PxrDisney" "PxrDisney1"
#{Type} "{Identifyer}" "{Name/UID}"
moreNodes = []
#need to fix lower case letters comming in from XML source
nodefunction = None
if str(node.nodeType.nType[0]) == 'p':
nodefunction = 'Pattern'
elif str(node.nodeType.nType[0]) == 'b':
nodefunction = "Bxdf"
else:
nodefunction = str(node.nodeType.nType)
self.outStream.append(nodefunction + ' "' + str(node.nodeType.nName) + '" ' + '"' + str(node.nid) + '" \n ')
for attr in node.inputs:
#Check to see if it is connected
#if not connected:
if attr.currentConnectedNode is None:
#Check to see what type the value is. This will govern the export scheme
if str(attr.argType) == "int":
#print '"'+ str(attr.argType), attr.name + '" [' + str(attr.value) + ']'
self.outStream[len(self.outStream) - 1] = self.outStream[len(self.outStream) - 1] + '"' + str(attr.argType) + " " + attr.name + '" [' + str(attr.value) + '] \n '
elif str(attr.argType) == "float":
if str(attr.value[len(str(attr.value))-1]) == '.':
outVal = str(attr.value) + '0'
else:
outVal = str(attr.value)
#print '"'+ str(attr.argType), attr.name + '" [' + outVal + ']'
self.outStream[len(self.outStream) - 1] = str(self.outStream[len(self.outStream) - 1]) + '"' + str(attr.argType) + " " + attr.name + '" [' + str(attr.value) + '] \n '
elif str(attr.argType) == "color":
#print '"'+ str(attr.argType), attr.name + '" [' + str(attr.value.r), str(attr.value.g), str(attr.value.b) + ']'
self.outStream[len(self.outStream) - 1] = str(self.outStream[len(self.outStream) - 1]) + '"' + str(attr.argType) + " " + attr.name + '" [' + str(attr.value.r) + str(attr.value.g) + str(attr.value.b) + '] \n '
elif str(attr.argType) == "string":
#print '"'+ str(attr.argType), attr.name + '" ["' + attr.value + '"]'
self.outStream[len(self.outStream) - 1] = str(self.outStream[len(self.outStream) - 1]) + '"' + str(attr.argType) + " " + attr.name + '" [' + str(attr.value) + '] \n '
else:
self.outStream[len(self.outStream) - 1] = str(self.outStream[len(self.outStream) - 1]) + '"reference ' + str(attr.argType) + " " + attr.name + '"', '["' + str(attr.currentConnectedNode.nid) + ':' + attr.currentConnectedOutput.name + '"] \n '
moreNodes.append(str(attr.currentConnectedNode.nid))
for ids in moreNodes:
self.streamMe(self.dicNodes[ids])
答案 0 :(得分:1)
当我将此代码从print语句转换为将信息存储在列表中时,我错过了一个逗号。元组可以这样声明:
myTuple =" 1"," 2"," 3"
通过在语句中使用逗号我正在转换字符串。
在此语句中将逗号更改为+可解决此问题。来自c ++,我不习惯可变数据类型!
self.outStream[len(self.outStream) - 1] = str(self.outStream[len(self.outStream) - 1]) + '"reference ' + str(attr.argType) + " " + attr.name + '"' '["' + str(attr.currentConnectedNode.nid) + ':' + attr.currentConnectedOutput.name + '"] \n '