Строка Python неправильные символы

Позвольте мне начать с того, что я попытался создать минимальный пример, но не смог воспроизвести результаты. Я стараюсь не превращать в привычку выкидывать весь мой код сюда, но я не уверен в другом способе проиллюстрировать проблему. Я пишу класс для вывода данных из моего приложения в определенный формат, и я получаю неправильные результаты в коде.

Формат, который я пытаюсь вывести, должен выглядеть следующим образом:

Nodestyle "nodeType" "имя"

"атрибут-тип атрибут-имя" [значение]

Если атрибут связан с другим узлом

"refrence attribute-type attribute-name" ["имя-узла: имя-атрибута-выхода"]

Пример:

 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] 

Похоже, если вывести специальные символы и дополнительные элементы в строке до того места, где есть ссылка на другой узел. если я ссылаюсь на другой атрибут, скажем, базовый цвет, то он даст только неверные результаты вплоть до базового цвета. Если нет никаких соединений, то нет проблем. Почему строка дает такое поведение? Вот этот класс под вопросом. Класс принимает массив узловых объектов, через которые я перехожу.

#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])

1 ответ

Решение

Когда я преобразовывал этот код из операторов печати в хранилище информации в списке, я пропустил запятую. Кортежи могут быть объявлены так:

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 '
Другие вопросы по тегам