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