예제 #1
0
    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:])
예제 #2
0
    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:] )
예제 #4
0
    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]] )
예제 #5
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:])