def getRoofMaterial(self, element): """ Returns a Blender material for the building roof Args: element: OSM element (building=* or building:part=*) """ # material name is just the related color (either a hex or a CSS color) name = Manager.normalizeColor(element.tags.get(tags[roofIndex])) if name is None: # <name> is invalid as a color name if self.outline is element: # Building oultine is rendererd if there are no parts or # if the outline has <building:part=yes> # take the name for the related default color name = defaultColorNames[roofIndex] # check if Blender material has been created before material = bpy.data.materials.get(name) if material is None: # the related Blender material hasn't been created yet, so create it material = createDiffuseMaterial(name, defaultColors[roofIndex]) if self.parts: # If there are parts, store <material>, # since it will set for the roof of another building part, # if the building part doesn't have an OSM tag for the roof color self.defaultMaterials[roofIndex] = material else: # this a building part (building:part=yes), not the building outline # check if the Blender material for the default color has been set before if self.defaultMaterials[roofIndex] is None: # Check if the material index for the default color has been set before # Use the related Blender material for that index, # if it has been set before # Otherwise get the roof Blender material for the default color, # i.e. the roof material for <self.outline> material = self.getRoofMaterial(self.outline)\ if self.defaultMaterialIndices[roofIndex] is None else\ self.obj.data.materials[self.defaultMaterialIndices[roofIndex]] else: # The Blender material for the default color has been set before, so use it, # i.e. use the roof color for <self.outline> material = self.defaultMaterials[roofIndex] else: # check if the related Blender material has been created before material = bpy.data.materials.get(name) if material is None: # The related Blender material hasn't been created before, # so create it material = createDiffuseMaterial(name, Manager.getColor(name)) # If <element is self.outline> and there are parts, store <material>, # since it will set for the roof of another building part, # if the building part doesn't have an OSM tag for the roof color if element is self.outline and self.parts: self.defaultMaterials[roofIndex] = material return material
def getElementMaterialIndex(self, element): # the material name is simply <id> of the layer name = self.layer.id materialIndex = self.getMaterialIndexByName(name) if materialIndex is None: # create Blender material materialIndex = self.getMaterialIndex( createDiffuseMaterial(name, self.app.colors[name]) ) return materialIndex
def getMaterial(self, element): # the material name is simply <id> of the layer name = self.layer.id material = bpy.data.materials.get(name) if not material: # create Blender material material = createDiffuseMaterial(name, self.app.colors[name]) return material
def getMaterialIndexByPart(self, element, partIndex): """ Returns the material index either for building walls or for buildings roof Args: element: OSM element (building=* or building:part=*) partIndex (int): Equal to either <roofIndex> or <wallIndex> """ # material name is just the related color (either a hex or a CSS color) name = Manager.normalizeColor(element.tags.get(tags[partIndex])) if name is None: # <name> is invalid as a color name if self.outline is element: # Building oultine is rendererd if there are no parts or # if the outline has <building:part=yes> # take the name for the related default color name = defaultColorNames[partIndex] # check if Blender material has been already created materialIndex = self.getMaterialIndexByName(name) if materialIndex is None: # the related Blender material hasn't been created yet, so create it materialIndex = self.getMaterialIndex( createDiffuseMaterial(name, defaultColors[partIndex])) if self.parts: # If there are parts, store <materialIndex>, # since it's set for a building part, if it doesn't have an OSM tag for color self.defaultMaterialIndices[partIndex] = materialIndex else: # this a building part (building:part=yes), not the building outline # check if the material index for the default color has been set before if self.defaultMaterialIndices[partIndex] is None: # The material index hasn't been set before if self.defaultMaterials[partIndex] is None: # A Blender material also hasn't been set before # Get the material index for the default color, # i.e. the material index for <self.outline> materialIndex = self.getMaterialIndexByPart( self.outline, partIndex) else: # A Blender material also has been set before # Append the Blender material to the related Blender object and # get its material index materialIndex = self.getMaterialIndex( self.defaultMaterials[partIndex]) # Store the material index, so we won't need to check # defaultMaterials for the next building part self.defaultMaterialIndices[partIndex] = materialIndex else: # The material index for the default color has been set before, so use it, # i.e. use the color for <self.outline> materialIndex = self.defaultMaterialIndices[partIndex] else: # check if the related Blender material has been already created materialIndex = self.getMaterialIndexByName(name) if materialIndex is None: # The related Blender material hasn't been already created, # so create it materialIndex = self.getMaterialIndex( createDiffuseMaterial(name, Manager.getColor(name))) # If <element is self.outline> and there are parts, store <materialIndex>, # since it's set for a building part, if it doesn't have an OSM tag for color if element is self.outline and self.parts: self.defaultMaterialIndices[partIndex] = materialIndex return materialIndex