コード例 #1
0
    def test_AssetDescription(self): # pylint: disable=C0103
        """test_AssetDescription"""
        fileid = FileId(filename = SerializationTest.filename)
        assetid = AssetId(subname = SerializationTest.subname, mimetype = SerializationTest.mimetype, file = fileid)
        asset_descr = AssetDescription(asset = assetid)
        
        dep = AssetId(subname = SerializationTest.subname, mimetype = SerializationTest.mimetype, file = fileid)
        asset_descr.dependencies = [dep]
        
        data = SerializeThriftMsg(asset_descr, self.protocol)

        msg = DeserializeThriftMsg(AssetDescription(), data, self.protocol)
        
        self.assertEqual(SerializationTest.filename, msg.asset.file.filename)
        self.assertEqual(SerializationTest.subname, msg.asset.subname)
        self.assertEqual(SerializationTest.mimetype, msg.asset.mimetype)
        
        self.assertEqual(dep, msg.dependencies[0])
コード例 #2
0
    def test_AssetDescription(self):  # pylint: disable=C0103
        """test_AssetDescription"""
        fileid = FileId(filename=SerializationTest.filename)
        assetid = AssetId(subname=SerializationTest.subname,
                          mimetype=SerializationTest.mimetype,
                          file=fileid)
        asset_descr = AssetDescription(asset=assetid)

        dep = AssetId(subname=SerializationTest.subname,
                      mimetype=SerializationTest.mimetype,
                      file=fileid)
        asset_descr.dependencies = [dep]

        data = SerializeThriftMsg(asset_descr, self.protocol)

        msg = DeserializeThriftMsg(AssetDescription(), data, self.protocol)

        self.assertEqual(SerializationTest.filename, msg.asset.file.filename)
        self.assertEqual(SerializationTest.subname, msg.asset.subname)
        self.assertEqual(SerializationTest.mimetype, msg.asset.mimetype)

        self.assertEqual(dep, msg.dependencies[0])
コード例 #3
0
def main():  # pylint: disable=R0914,R0912,R0915
    """The main method"""
    images = {}
    materials = {}
    meshes = {}
    objects = {}
    groups = {}
    texts = {}

    # Set up our FileDescription
    fileid = FileId(filename=bpy.path.abspath(bpy.data.filepath))
    file_descr = FileDescription(file=fileid)
    file_descr.assets = []

    def get_file_id(obj):
        """
        If the object is in a library, return a file for it, else return
        this fileid.
        """
        if obj.library:
            return FileId(filename=relpath(obj.library.filepath))
        return fileid

    # Images: Can be packed, so expose them with 'x-blender.image' mimetype.
    for image in bpy.data.images:
        image_fileid = get_file_id(image)
        image_mimetype = mimetypes.guess_type(image.filepath)[0]
        if image.source == 'FILE' and not image.packed_file:
            image_fileid = FileId(filename=relpath(
                image.filepath,
                start=image.library.filepath if image.library else None))
        if image.packed_file:
            image_mimetype = 'application/x-blender.image'
        asset_descr = AssetDescription(asset=AssetId(
            subname=image.name, mimetype=image_mimetype, file=image_fileid))
        if image.packed_file:
            asset_descr.metadata = metadata.MetaDataBlenderImage.extract(
                {'image': image})
            file_descr.assets.append(asset_descr)
        images[image.name] = asset_descr

    # Materials: Have images as dependency.
    for material in bpy.data.materials:
        asset_descr = AssetDescription(
            asset=AssetId(subname=material.name,
                          mimetype='application/x-blender.material',
                          file=get_file_id(material)))
        asset_descr.dependencies = []
        image_names = {}
        for slot in material.texture_slots:
            if slot and slot.texture and slot.texture.type == 'IMAGE' and slot.texture.image:
                image_names[slot.texture.image.name] = None
        for name in image_names:
            if name in images:
                dep = images[name].asset
                asset_descr.dependencies.append(dep)
        file_descr.assets.append(asset_descr)
        materials[material.name] = asset_descr

    # Meshes: Have materials as dependency and the images assigned its faces.
    for mesh in bpy.data.meshes:
        mesh.update(calc_tessface=True)
        asset_descr = AssetDescription(
            asset=AssetId(subname=mesh.name,
                          mimetype='application/x-blender.mesh',
                          file=get_file_id(mesh)))
        asset_descr.dependencies = []
        # Collect materials from the mesh
        for material in mesh.materials:
            if material:
                if material.name in materials:
                    dep = materials[material.name].asset
                    asset_descr.dependencies.append(dep)
        # Collect images from the faces
        image_names = {}
        for face in mesh.uv_textures:
            for data in face.data:
                if data.image:
                    image_names[data.image.name] = None
        for name in image_names:
            if name in images:
                dep = images[name].asset
                asset_descr.dependencies.append(dep)

        asset_descr.metadata = metadata.MetaDataBlenderMesh.extract(
            {'mesh': mesh})

        file_descr.assets.append(asset_descr)
        meshes[mesh.name] = asset_descr

    # Objects: Has a Mesh as a dependency and materials assigned to the object
    for obj in bpy.data.objects:
        if obj.type == 'MESH':
            object_type = ''
        else:
            object_type = '-' + str(obj.type).lower()
        # asset_type = obj.type.lower()
        asset_descr = AssetDescription(
            asset=AssetId(subname=obj.name,
                          mimetype='application/x-blender.object' +
                          object_type,
                          file=get_file_id(obj)))
        asset_descr.dependencies = []
        # Add the mesh as dependency
        if obj.data and obj.data.name in meshes:
            dep = meshes[obj.data.name].asset
            asset_descr.dependencies.append(dep)
        # Now the materials
        for slot in obj.material_slots:
            if slot and slot.material and slot.link == 'OBJECT':
                if slot.material.name in materials:
                    dep = materials[slot.material.name].asset
                    asset_descr.dependencies.append(dep)

        asset_descr.metadata = metadata.MetaDataBlenderObject.extract(
            {'object': obj})

        file_descr.assets.append(asset_descr)
        objects[obj.name] = asset_descr

    # Group: Has its objects as a dependencies.
    for group in bpy.data.groups:
        asset_descr = AssetDescription(
            asset=AssetId(subname=group.name,
                          mimetype='application/x-blender.group',
                          file=get_file_id(group)))
        asset_descr.dependencies = []
        # Add the objects as dependencies
        for obj in group.objects:
            dep = objects[obj.name].asset
            asset_descr.dependencies.append(dep)

        file_descr.assets.append(asset_descr)
        groups[group.name] = asset_descr

    # Texts: Can be packed, so expose them with 'x-blender.text' mimetype.
    for text in bpy.data.texts:
        text_fileid = get_file_id(text)
        text_mimetype = 'application/x-blender.text'
        if not text.is_in_memory:
            path = text.filepath if text.filepath else 'UNKNOWN'
            text_fileid = FileId(filename=relpath(
                path, start=text.library.filepath if text.library else None))
            text_mimetype = mimetypes.guess_type(path)[0]
        if not text_mimetype:
            text_mimetype = 'text/plain'
        asset_descr = AssetDescription(asset=AssetId(
            subname=text.name, mimetype=text_mimetype, file=text_fileid))
        file_descr.assets.append(asset_descr)
        texts[text.name] = asset_descr

    data = SerializeThriftMsg(file_descr)
    print('-**-\n%s\n-**-' % binascii.hexlify(data))
コード例 #4
0
ファイル: analyzer_assimp.py プロジェクト: induane/damn-at
    def analyze(self, an_uri):
        fileid = FileId(filename = os.path.abspath(an_uri))
        file_descr = FileDescription(file = fileid)
        file_descr.assets = []

        assimp_mimetype = 'application/assimp'

        scene = None
        try:
            scene = load(an_uri)

            textures = {}
            materials = {}

            from damn_at.analyzers.mesh.metadata import MetaDataAssimpTexture, MetaDataAssimpMesh, MetaDataAssimpMaterial

            for i, texture in enumerate(scene.textures):
                name = texture.mName.data if texture.mName and texture.mName.data else 'texture-'+str(i)
                asset_descr = AssetDescription(asset = AssetId(subname = name, mimetype = assimp_mimetype+".texture", file = fileid))
                asset_descr.metadata = MetaDataAssimpTexture.extract(texture)
                file_descr.assets.append(asset_descr)
                textures[i] = asset_descr

            for i, material in enumerate(scene.materials):
                properties = GetMaterialProperties(material)
                name = properties.get('?mat.name', 'material-'+str(i))
                asset_descr = AssetDescription(asset = AssetId(subname = name, mimetype = assimp_mimetype+".material", file = fileid))
                asset_descr.metadata = MetaDataAssimpMaterial.extract(properties)
                file_descr.assets.append(asset_descr)
                materials[i] = asset_descr

            for i, mesh in enumerate(scene.meshes):
                name = mesh.mName.data if mesh.mName and mesh.mName.data else 'mesh-'+str(i)
                asset_descr = AssetDescription(asset = AssetId(subname = name, mimetype = assimp_mimetype+".mesh", file = fileid))
                asset_descr.metadata = MetaDataAssimpMesh.extract(mesh)
                asset_descr.dependencies = []
                #Dependencies
                if mesh.mMaterialIndex is not None:
                    if mesh.mMaterialIndex in materials:
                        asset_descr.dependencies.append(materials[mesh.mMaterialIndex].asset)
                file_descr.assets.append(asset_descr)

        finally:
            release(scene)

        '''
        obj = Loader(an_uri)

        from damn_at.analyzers.mesh.metadata import MetaDataWaveFrontDefault, MetaDataWaveFrontGroup

        d_asset_descr = AssetDescription(asset = AssetId(subname = 'default', mimetype = "application/wavefront-obj", file = fileid))
        d_asset_descr.metadata = MetaDataWaveFrontDefault.extract(obj)
        file_descr.assets.append(d_asset_descr)


        for name, group in obj.groups.items():
            if name != 'default':
                asset_descr = AssetDescription(asset = AssetId(subname = name, mimetype = "application/wavefront-obj.group", file = fileid))
                asset_descr.metadata = MetaDataWaveFrontGroup.extract(group)
                asset_descr.dependencies = [d_asset_descr.asset]
                file_descr.assets.append(asset_descr)
        '''

        return file_descr
コード例 #5
0
    def analyze(self, an_uri):
        fileid = FileId(filename=os.path.abspath(an_uri))
        file_descr = FileDescription(file=fileid)
        file_descr.assets = []

        assimp_mimetype = 'application/assimp'

        scene = None
        try:
            scene = pyassimp.load(an_uri)

            textures = {}
            materials = {}

            from damn_at.analyzers.mesh.metadata import (
                MetaDataAssimpTexture,
                MetaDataAssimpMesh
            )

            for i, texture in enumerate(scene.textures):
                name = texture.name if texture.name else 'texture-'+str(i)
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".texture",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataAssimpTexture.extract(texture)
                file_descr.assets.append(asset_descr)
                textures[i] = asset_descr

            for i, material in enumerate(scene.materials):
                properties = {}
                for key, value in material.properties.items():
                    properties[key] = value
                name = properties.get('name', 'material-'+str(i))
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".material",
                    file=fileid
                ))
                asset_descr.metadata = {}
                for key, value in properties.items():
                    if key == 'name' or key == 'file':
                        continue
                    asset_descr.metadata[key] = MetaDataValue(
                        type=MetaDataType.STRING,
                        string_value=str(value)
                    )
                file_descr.assets.append(asset_descr)
                materials[i] = asset_descr

            for i, mesh in enumerate(scene.meshes):
                name = mesh.name if mesh.name else 'mesh-' + str(i)
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".mesh",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataAssimpMesh.extract(mesh)
                asset_descr.dependencies = []
                # Dependencies
                if mesh.materialindex is not None:
                    if mesh.materialindex in materials:
                        asset_descr.dependencies.append(
                            materials[mesh.materialindex].asset
                        )
                file_descr.assets.append(asset_descr)

        finally:
            pyassimp.release(scene)

        '''
        obj = Loader(an_uri)

        from damn_at.analyzers.mesh.metadata import (
            MetaDataWaveFrontDefault,
            MetaDataWaveFrontGroup
        )
        d_asset_descr = AssetDescription(asset=AssetId(
            subname='default',
            mimetype="application/wavefront-obj",
            file=fileid
        ))
        d_asset_descr.metadata = MetaDataWaveFrontDefault.extract(obj)
        file_descr.assets.append(d_asset_descr)


        for name, group in obj.groups.items():
            if name != 'default':
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype="application/wavefront-obj.group",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataWaveFrontGroup.extract(group)
                asset_descr.dependencies = [d_asset_descr.asset]
                file_descr.assets.append(asset_descr)'''

        return file_descr
コード例 #6
0
    def analyze(self, an_uri):
        fileid = FileId(filename=os.path.abspath(an_uri))
        file_descr = FileDescription(file=fileid)
        file_descr.assets = []

        assimp_mimetype = 'application/assimp'

        scene = None
        try:
            scene = load(an_uri)

            textures = {}
            materials = {}

            from damn_at.analyzers.mesh.metadata import (
                MetaDataAssimpTexture,
                MetaDataAssimpMesh,
                MetaDataAssimpMaterial
            )

            for i, texture in enumerate(scene.textures):
                name = texture.mName.data if texture.mName and texture.mName.data else 'texture-'+str(i)
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".texture",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataAssimpTexture.extract(texture)
                file_descr.assets.append(asset_descr)
                textures[i] = asset_descr

            for i, material in enumerate(scene.materials):
                properties = GetMaterialProperties(material)
                name = properties.get('?mat.name', 'material-'+str(i))
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".material",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataAssimpMaterial.extract(properties)
                file_descr.assets.append(asset_descr)
                materials[i] = asset_descr

            for i, mesh in enumerate(scene.meshes):
                name = mesh.mName.data if mesh.mName and mesh.mName.data else 'mesh-' + str(i)
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype=assimp_mimetype + ".mesh",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataAssimpMesh.extract(mesh)
                asset_descr.dependencies = []
                #Dependencies
                if mesh.mMaterialIndex is not None:
                    if mesh.mMaterialIndex in materials:
                        asset_descr.dependencies.append(
                            materials[mesh.mMaterialIndex].asset
                        )
                file_descr.assets.append(asset_descr)

        finally:
            release(scene)

        '''
        obj = Loader(an_uri)

        from damn_at.analyzers.mesh.metadata import (
            MetaDataWaveFrontDefault,
            MetaDataWaveFrontGroup
        )
        d_asset_descr = AssetDescription(asset=AssetId(
            subname='default',
            mimetype="application/wavefront-obj",
            file=fileid
        ))
        d_asset_descr.metadata = MetaDataWaveFrontDefault.extract(obj)
        file_descr.assets.append(d_asset_descr)


        for name, group in obj.groups.items():
            if name != 'default':
                asset_descr = AssetDescription(asset=AssetId(
                    subname=name,
                    mimetype="application/wavefront-obj.group",
                    file=fileid
                ))
                asset_descr.metadata = MetaDataWaveFrontGroup.extract(group)
                asset_descr.dependencies = [d_asset_descr.asset]
                file_descr.assets.append(asset_descr)
        '''

        return file_descr
コード例 #7
0
def main():  # pylint: disable=R0914,R0912,R0915
    """The main method"""
    images = {}
    materials = {}
    meshes = {}
    objects = {}
    groups = {}
    texts = {}

    # Set up our FileDescription
    fileid = FileId(filename=bpy.path.abspath(bpy.data.filepath))
    file_descr = FileDescription(file=fileid)
    file_descr.assets = []

    def get_file_id(obj):
        """
        If the object is in a library, return a file for it, else return
        this fileid.
        """
        if obj.library:
            return FileId(filename=relpath(obj.library.filepath))
        return fileid

    # Images: Can be packed, so expose them with 'x-blender.image' mimetype.
    for image in bpy.data.images:
        image_fileid = get_file_id(image)
        image_mimetype = mimetypes.guess_type(image.filepath)[0]
        if image.source == 'FILE' and not image.packed_file:
            image_fileid = FileId(filename=relpath(
                image.filepath,
                start=image.library.filepath if image.library else None
            ))
        if image.packed_file:
            image_mimetype = 'application/x-blender.image'
        asset_descr = AssetDescription(asset=AssetId(
            subname=image.name,
            mimetype=image_mimetype,
            file=image_fileid
        ))
        if image.packed_file:
            asset_descr.metadata = metadata.MetaDataBlenderImage.extract(
                {'image': image}
            )
            file_descr.assets.append(asset_descr)
        images[image.name] = asset_descr

    # Materials: Have images as dependency.
    for material in bpy.data.materials:
        asset_descr = AssetDescription(asset=AssetId(
            subname=material.name,
            mimetype='application/x-blender.material',
            file=get_file_id(material)
        ))
        asset_descr.dependencies = []
        image_names = {}
        for slot in material.texture_slots:
            if slot and slot.texture and slot.texture.type == 'IMAGE' and slot.texture.image:
                image_names[slot.texture.image.name] = None
        for name in image_names:
            if name in images:
                dep = images[name].asset
                asset_descr.dependencies.append(dep)
        file_descr.assets.append(asset_descr)
        materials[material.name] = asset_descr

    # Meshes: Have materials as dependency and the images assigned its faces.
    for mesh in bpy.data.meshes:
        mesh.update(calc_tessface=True)
        asset_descr = AssetDescription(asset=AssetId(
            subname=mesh.name,
            mimetype='application/x-blender.mesh',
            file=get_file_id(mesh)
        ))
        asset_descr.dependencies = []
        # Collect materials from the mesh
        for material in mesh.materials:
            if material:
                if material.name in materials:
                    dep = materials[material.name].asset
                    asset_descr.dependencies.append(dep)
        # Collect images from the faces
        image_names = {}
        for face in mesh.uv_textures:
            for data in face.data:
                if data.image:
                    image_names[data.image.name] = None
        for name in image_names:
            if name in images:
                dep = images[name].asset
                asset_descr.dependencies.append(dep)

        asset_descr.metadata = metadata.MetaDataBlenderMesh.extract(
            {'mesh': mesh}
        )

        file_descr.assets.append(asset_descr)
        meshes[mesh.name] = asset_descr

    # Objects: Has a Mesh as a dependency and materials assigned to the object
    for obj in bpy.data.objects:
        if obj.type == 'MESH':
            object_type = ''
        else:
            object_type = '-'+str(obj.type).lower()
        # asset_type = obj.type.lower()
        asset_descr = AssetDescription(asset=AssetId(
            subname=obj.name,
            mimetype='application/x-blender.object' + object_type,
            file=get_file_id(obj)
        ))
        asset_descr.dependencies = []
        # Add the mesh as dependency
        if obj.data and obj.data.name in meshes:
            dep = meshes[obj.data.name].asset
            asset_descr.dependencies.append(dep)
        # Now the materials
        for slot in obj.material_slots:
            if slot and slot.material and slot.link == 'OBJECT':
                if slot.material.name in materials:
                    dep = materials[slot.material.name].asset
                    asset_descr.dependencies.append(dep)

        asset_descr.metadata = metadata.MetaDataBlenderObject.extract(
            {'object': obj}
        )

        file_descr.assets.append(asset_descr)
        objects[obj.name] = asset_descr

    # Group: Has its objects as a dependencies.
    for group in bpy.data.groups:
        asset_descr = AssetDescription(asset=AssetId(
            subname=group.name,
            mimetype='application/x-blender.group',
            file=get_file_id(group)
        ))
        asset_descr.dependencies = []
        # Add the objects as dependencies
        for obj in group.objects:
            dep = objects[obj.name].asset
            asset_descr.dependencies.append(dep)

        file_descr.assets.append(asset_descr)
        groups[group.name] = asset_descr

    # Texts: Can be packed, so expose them with 'x-blender.text' mimetype.
    for text in bpy.data.texts:
        text_fileid = get_file_id(text)
        text_mimetype = 'application/x-blender.text'
        if not text.is_in_memory:
            path = text.filepath if text.filepath else 'UNKNOWN'
            text_fileid = FileId(filename=relpath(
                path,
                start=text.library.filepath if text.library else None
            ))
            text_mimetype = mimetypes.guess_type(path)[0]
        if not text_mimetype:
            text_mimetype = 'text/plain'
        asset_descr = AssetDescription(asset=AssetId(
            subname=text.name,
            mimetype=text_mimetype,
            file=text_fileid
        ))
        file_descr.assets.append(asset_descr)
        texts[text.name] = asset_descr
    
    data = SerializeThriftMsg(file_descr)
    print('-**-\n%s\n-**-' % binascii.hexlify(data))