Hello,

Sorry in advance for the long email.

I have a two-part script. The first parts creates a structure made of
nested lists. Some of these lists have only strings, other have other
lists. Anyway the point is to ultimately write this structure as a XML
file.


Here is the script that builds the structure:



for oCharacter in oCharacters:
                # --------------------------
                # < bb_file >
                
                aFileTag = []
                aFileTag.append( 'bb_file' )
                aFileTag.append( [ ( 'type', '"bb_characterxml"' ), (
'character_name', '""' ), ( 'character_version', '""' ), (
'syntax_version', '"1.0"' ) ] )
                
                
                # --------------------------
                # < model >
                
                aModelTag = []
                aModelTag.append( 'model' )
                aModelTag.append( [] ) # No options
                aModelTag.append( [ str( oCharacter.fullname ) ] )
                
                
                # --------------------------
                # < objects >
                
                aObjectsTag = []
                aObjectsTag.append( 'objects' )
                aObjectsTag.append( [] ) # No options
                
                
                # --------------------------
                # < object >
                
                # Get renderable character children
                oChildren = xsifactory.CreateObject( 'XSI.Collection' )
                oChildren.additems( oCharacter.findchildren() )
                oRenderable = xsiHandler.process( 20, oChildren, '01_02_01', 
(1,0),
23, bVerbose )
                
                for oObject in oRenderable:
                        
                        aObjectTag = []
                        aObjectTag.append( 'object' )
                        aObjectTag.append( [ ( 'objectname', '"' + str( 
oObject.name ) + '"' ) ] )
                        
                        
                        # --------------------------                    
                        
                        # < material >
                        
                        aMaterialTag = []
                        aMaterialTag.append( 'material' )
                        aMaterialTag.append( [ ( 'stylename', '"styleX"' ) ] )
                        aMaterialTag.append( [ str( oObject.material.name ) ] )
                        
                        aObjectTag.append( aMaterialTag )
                        
                        
                        # --------------------------
                        
                        # < clusters >
                        
                        if hasattr( oObject.activeprimitive.geometry, 
'clusters' ) == False: pass
                        else:
                                aClustersTag = []
                                aClustersTag.append( 'clusters' )
                                aClustersTag.append( [] ) # No options
                                
                                
                                # < cluster >
                                
                                aClusterTags = []
                                
                                for oCluster in 
oObject.activeprimitive.geometry.clusters:
                                        
                                        # < cluster >
                                        
                                        aClusterTag = []
                                        aClusterTag.append( 'cluster' )
                                        aClusterTag.append( [ ( 'clustername', 
str( oCluster.name ) ), (
'clustertype', str( oCluster.type ) ) ] )
                                        
                                        # Check if cluster has material
                                        if oCluster.localproperties.count > 0:
                                                for oLocalProp in 
oCluster.localproperties:
                                                        if oCluster.type == 
'poly' and oLocalProp.type == c.siMaterialType:
                                                                # < 
clustermaterial >
                                                                
aClusterMaterialTag = []
                                                                
aClusterMaterialTag.append( 'clustermaterial' )
                                                                
aClusterMaterialTag.append( [ ( 'stylename', '"styleX"' ) ] )
                                                                
aClusterMaterialTag.append( [ str( oLocalProp.name ) ] )
                                                                
aClusterTag.append( [ aClusterMaterialTag ] )
                                                        elif oCluster.type == 
'sample' and oLocalProp.type ==
c.siClsUVSpaceTxtType:
                                                                # < uvset >
                                                                aUVsetTag = []
                                                                
aUVsetTag.append( 'uvset' )
                                                                
aUVsetTag.append( [ ( 'stylename', '"sytleX"' ) ] )
                                                                
aUVsetTag.append( [ str( oLocalProp.name ) ] )
                                                                
aClusterTag.append( [ aUVsetTag ] )
                                        
                                        # Add this cluster tag to list of 
cluster tags
                                        aClusterTags.append( aClusterTag )
                                
                                # Add list of cluster tags to clusters tag (!)
                                aClustersTag.append( aClusterTags )
                                
                                # Add cluster tag to object tag
                                aObjectTag.append( aClustersTag )
                        
                        # Add object tag to list of objects tag (!)
                        aObjectsTag.append( aObjectTag )
                
                
                # Add tags under file tags to file tag
                aFileTag.append( [ aModelTag, aObjectsTag ] )
                #aFileTag.append( [ aModelTag, aRenderingStylesTag, aObjectsTag,
aMaterialLibraryTag ] )
                
                printTag( aFileTag, 0 )





So I get my structure, and to this point I'm 100% positive the
structure is in the appropriate state. I can confirm this by simply
print the structure as a string, and then reorganize this string in a
tree-view. This gives:


[
        'bb_file',
        [
                ('type', '"bb_characterxml"'),
                ('character_name', '""'),
                ('character_version', '""'),
                ('syntax_version', '"1.0"')
        ],
        [
                [
                        'model',
                        [],
                        [
                                'Model'
                        ]
                ], 
                
                
                [
                        'objects',
                        [],
                        [
                                'object',
                                [
                                        ('objectname', '"sphere"')
                                ], 
                                [
                                        'material',
                                        [
                                                ('stylename', '"styleX"')
                                        ],
                                        [
                                                'Scene_Material'
                                        ]
                                ],
                                
                                [
                                        'clusters',
                                        [],
                                        [
                                                [
                                                        'cluster',
                                                        [
                                                                ('clustername', 
u'Polygon'),
                                                                ('clustertype', 
u'poly')
                                                        ], 
                                                        [
                                                                [
                                                                        
'clustermaterial',
                                                                        [
                                                                                
('stylename', '"styleX"')
                                                                        ], 
                                                                        [
                                                                                
'Material'
                                                                        ]
                                                                ]
                                                        ]
                                                ],
                                                [
                                                        'cluster',
                                                        [
                                                                ('clustername', 
u'Texture_Coordinates_AUTO'),
                                                                ('clustertype', 
u'sample')
                                                        ], 
                                                        [
                                                                [
                                                                        'uvset',
                                                                        [
                                                                                
('stylename', '"sytleX"')
                                                                        ], 
                                                                        [
                                                                                
'Texture_Projection'
                                                                        ]
                                                                ]
                                                        ]
                                                ]
                                        ]
                                ]
                        ]
                
                ]
        ]


]



In XML format, the file I'm trying to output is:



<bb_file type="bb_characterxml" character_name="" character_version=""
syntax_version="1.0">

        <model>Model fullname</model>
        
        <objects>
                <object objectname="object name">
                        <material stylename="style name">Material 
name</material>
                        <clusters>
                                <cluster clustername="cluster name" 
clustertype="cluster type">
                                        <clustermaterial stylename="style 
name">Material name</clustermaterial>
                                </cluster>
                                <cluster clustername="cluster name" 
clustertype="cluster type">
                                        <uvset stylename="style name">Texture 
projection name</uvset>
                                        <uvset stylename="style name">Texture 
projection name</uvset>
                                </cluster>
                        </clusters>
                </object>
        </objects>
        
        <renderingstyles>
                <renderstyle stylename="style name">Library 
fullname</renderstyle>
                <renderstyle stylename="style name">Library 
fullname</renderstyle>
        </renderingstyles>
        
        <materiallibraries>
                <materiallibrary libraryname="library fullname">
                        <material>Material name</material>
                        <material>Material name</material>
                </materiallibrary>
        </materiallibraries>

</bb_file>





To this point, everything works fine. Now to the step of writing this
in XML format. The last line of the script calls this function:


def printTag( aTag, i ):
        
        # --------------------------
        # Opening tag
        sTag = aTag[0]
        aTagOptions = aTag[1]
        
        
        # Check if we have subtags
        if len( aTagOptions ) > 0:
                sOptions = ''
                sSpace = ' '
                sEqual = '='
                for tOption in aTagOptions:
                        sOption = '%s%s%s' % ( tOption[0], '=', tOption[1] )
                        sOptions += ' %s' % sOption
                sHeader = '%s%s' % ( sTag, sOptions )
        else:
                sHeader = sTag
        
        sOpen = '%s%s%s' % ( '<', sHeader, '>' )
        sClose = '%s%s%s%s' % ( '<', '/', sTag, '>' )
        
        
        # --------------------------
        # Tag value
        
        aTagValue = aTag[2]
        
        # Extract value, wich is always a list
        # The list contains only a string, or a list of tags
        aValue = aTagValue[0]
        
        # Is the tag empty?
        if len( aValue ) < 1:
                sString = '%s%s%s' % ( '\t' * i, sOpen, sClose )
                xsi.logmessage( sString )
        
        else:
                # Is the tag value a string?
                if type( aValue ) == types.StringType:
                        sString = '%s%s%s%s' % ( '\t' * i, sOpen, aValue, 
sClose )
                
                # Is the tag value a list?
                elif type( aValue ) == types.ListType:
                        sOpenString = '%s%s' % ( '\t' * i, sOpen )
                        sCloseString = '%s%s' % ( '\t' * i, sClose )
                        
                        xsi.logmessage( sOpenString )
                        
                        #xsi.logmessage( 'len( aTagValue ): ' + str( len( 
aTagValue ) ) )
                        # Iterate sub tags
                        for oTag in aTagValue:
                                printTag( oTag, i + 1 )
                                
                        xsi.logmessage( sCloseString )
                
                # No valid value!
                else: pass




So far so good. If you notice near the end, the function checks if
there are "tags" contained in the value list. If so, I want it to
recursively call itself, so it prints each tags in the entire
structure.


However, the problem is that it doesn't go further than the second level........


Any suggestion?


Thanks in advance
Bernard
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to