def handler(way, parser, kwargs): wayNodes = way["nodes"] numNodes = len( wayNodes ) - 1 # we need to skip the last node which is the same as the first ones # a polygon must have at least 3 vertices if numNodes < 3: return if not kwargs["bm"]: # not a single mesh tags = way["tags"] osmId = way["id"] # compose object name name = osmId if "addr:housenumber" in tags and "addr:street" in tags: name = tags["addr:street"] + ", " + tags["addr:housenumber"] elif "name" in tags: name = tags["name"] bm = kwargs["bm"] if kwargs["bm"] else bmesh.new() verts = [] for node in range(numNodes): node = parser.nodes[wayNodes[node]] v = kwargs["projection"].fromGeographic(node["lat"], node["lon"]) verts.append(bm.verts.new((v[0], v[1], 0))) bm.faces.new(verts) if not kwargs["bm"]: tags = way["tags"] thickness = 0 if "height" in tags: # There's a height tag. It's parsed as text and could look like: 25, 25m, 25 ft, etc. thickness, unit = osm_utils.parse_scalar_and_unit( tags["height"]) else: thickness = kwargs["thickness"] if ("thickness" in kwargs) else 0 # extrude if thickness > 0: utils.extrudeMesh(bm, thickness) bm.normal_update() mesh = bpy.data.meshes.new(osmId) bm.to_mesh(mesh) obj = bpy.data.objects.new(name, mesh) bpy.context.scene.objects.link(obj) bpy.context.scene.update() # final adjustments obj.select = True # assign OSM tags to the blender object osm_utils.assignTags(obj, tags) utils.assignMaterials(obj, "roof", (1.0, 0.0, 0.0), [mesh.polygons[0]]) utils.assignMaterials(obj, "wall", (1, 0.7, 0.0), mesh.polygons[1:])
def handler(way, parser, kwargs): wayNodes = way["nodes"] numNodes = len( wayNodes ) # we need to skip the last node which is the same as the first ones if numNodes == 1: # This is some point "natural". # which we ignore for now (trees, etc.) pass numNodes = numNodes - 1 # a polygon must have at least 3 vertices if numNodes < 3: return tags = way["tags"] if not kwargs["bm"]: # not a single mesh osmId = way["id"] # compose object name name = osmId if "name" in tags: name = tags["name"] bm = kwargs["bm"] if kwargs["bm"] else bmesh.new() verts = [] for node in range(numNodes): node = parser.nodes.get(wayNodes[node]) if node is None: # skip that OSM way return v = kwargs["projection"].fromGeographic(node["lat"], node["lon"]) verts.append(bm.verts.new((v[0], v[1], 0))) bm.faces.new(verts) if not kwargs["bm"]: tags = way["tags"] bmesh.ops.recalc_face_normals(bm, faces=bm.faces) mesh = bpy.data.meshes.new(osmId) bm.to_mesh(mesh) obj = bpy.data.objects.new(name, mesh) bpy.context.scene.objects.link(obj) bpy.context.scene.update() # final adjustments obj.select = True # assign OSM tags to the blender object osm_utils.assignTags(obj, tags) naturaltype = tags["natural"] color = (0.5, 0.5, 0.5) if naturaltype == "water": color = (0, 0, 1) utils.assignMaterials(obj, naturaltype, color, [mesh.polygons[0]])
def handler(way, parser, kwargs): heightPerLevel = 2.70 # default height per level if building height is not specified wayNodes = way["nodes"] numNodes = len(wayNodes)-1 # we need to skip the last node which is the same as the first ones # a polygon must have at least 3 vertices if numNodes<3: return if not kwargs["bm"]: # not a single mesh tags = way["tags"] osmId = way["id"] # compose object name name = osmId if "addr:housenumber" in tags and "addr:street" in tags: name = tags["addr:street"] + ", " + tags["addr:housenumber"] elif "name" in tags: name = tags["name"] bm = kwargs["bm"] if kwargs["bm"] else bmesh.new() verts = [] for node in range(numNodes): node = parser.nodes[wayNodes[node]] v = kwargs["projection"].fromGeographic(node["lat"], node["lon"]) verts.append( bm.verts.new((v[0], v[1], 0)) ) bm.faces.new(verts) if not kwargs["bm"]: tags = way["tags"] thickness = 0 if "height" in tags: # There's a height tag. It's parsed as text and could look like: 25, 25m, 25 ft, etc. thickness,unit = osm_utils.parse_scalar_and_unit(tags["height"]) elif "building:levels" in tags: # If no height is given, calculate height of Building from Levels thickness = int(tags["building:levels"])*heightPerLevel else: thickness = kwargs["thickness"] if ("thickness" in kwargs) else 0 # extrude if thickness>0: utils.extrudeMesh(bm, thickness) bm.normal_update() mesh = bpy.data.meshes.new(osmId) bm.to_mesh(mesh) obj = bpy.data.objects.new(name, mesh) bpy.context.scene.objects.link(obj) bpy.context.scene.update() # final adjustments obj.select = True # assign OSM tags to the blender object osm_utils.assignTags(obj, tags) utils.assignMaterials( obj, "roof", (1.0,0.0,0.0), [mesh.polygons[0]] ) utils.assignMaterials( obj, "wall", (1,0.7,0.0), mesh.polygons[1:] )
def handler(way, parser, kwargs): # Never import naturals when single mesh. if kwargs["bm"]: return wayNodes = way["nodes"] numNodes = len(wayNodes) # we need to skip the last node which is the same as the first ones if numNodes == 1: # This is some "point natural" . # which we ignore for now (trees, etc.) pass numNodes = numNodes - 1 # a polygon must have at least 3 vertices if numNodes<3: return tags = way["tags"] osmId = way["id"] # compose object name name = osmId if "name" in tags: name = tags["name"] bm = kwargs["bm"] if kwargs["bm"] else bmesh.new() verts = [] for node in range(numNodes): node = parser.nodes[wayNodes[node]] v = kwargs["projection"].fromGeographic(node["lat"], node["lon"]) verts.append( bm.verts.new((v[0], v[1], 0)) ) bm.faces.new(verts) tags = way["tags"] bm.normal_update() mesh = bpy.data.meshes.new(osmId) bm.to_mesh(mesh) obj = bpy.data.objects.new(name, mesh) bpy.context.scene.objects.link(obj) bpy.context.scene.update() # final adjustments obj.select = True # assign OSM tags to the blender object osm_utils.assignTags(obj, tags) naturaltype = tags["natural"] color = (0.5,0.5,0.5) if naturaltype == "water": color = (0,0,1) utils.assignMaterials( obj, naturaltype, color, [mesh.polygons[0]] )
def handler(way, parser, kwargs): singleMesh = kwargs["bm"] wayNodes = way["nodes"] numNodes = len( wayNodes ) - 1 # we need to skip the last node which is the same as the first ones # a polygon must have at least 3 vertices if numNodes < 3: return if not singleMesh: tags = way["tags"] osmId = way["id"] # compose object name name = osmId if "addr:housenumber" in tags and "addr:street" in tags: name = tags["addr:street"] + ", " + tags["addr:housenumber"] elif "name" in tags: name = tags["name"] bm = kwargs["bm"] if singleMesh else bmesh.new() verts = [] for node in range(numNodes): node = parser.nodes.get(wayNodes[node]) if node is None: # skip that OSM way return v = kwargs["projection"].fromGeographic(node["lat"], node["lon"]) verts.append(bm.verts.new((v[0], v[1], 0))) face = bm.faces.new(verts) tags = way["tags"] height = kwargs["defaultHeight"] if "height" in tags: # There's a height tag. It's parsed as text and could look like: 25, 25m, 25 ft, etc. height = osm_utils.parse_scalar_and_unit(tags["height"])[0] elif "building:levels" in tags: numLevels = getNumber(tags["building:levels"]) if not numLevels is None: height = numLevels * kwargs["levelHeight"] # extrude if height > 0.: utils.extrudeMesh(bm, height, face if singleMesh else None) if not singleMesh: bmesh.ops.recalc_face_normals(bm, faces=bm.faces) mesh = bpy.data.meshes.new(osmId) bm.to_mesh(mesh) obj = bpy.data.objects.new(name, mesh) bpy.context.scene.objects.link(obj) bpy.context.scene.update() # final adjustments obj.select = True # assign OSM tags to the blender object osm_utils.assignTags(obj, tags) utils.assignMaterials(obj, "roof", (1.0, 0.0, 0.0), [mesh.polygons[0]]) utils.assignMaterials(obj, "wall", (1, 0.7, 0.0), mesh.polygons[1:])