Example #1
0
    def create(self, controls, parent, profile):
        context = self.context

        profile, closed, clockwise = self.getProfileData(profile)

        obj = createMeshObject("extruded")
        obj["t"] = "extruded"

        bm = getBmesh(obj)
        # vertex groups are in the deform layer, create one before any operation with bmesh:
        layer = bm.verts.layers.deform.new()

        numVerts = len(profile)
        numControls = len(controls)
        for i in range(numControls):
            c = controls[i]
            corner = Corner(c.location,
                            pVert=controls[i - 1].location,
                            nVert=controls[(i + 1) % numControls].location)
            group = c["g"]
            for p in profile:
                v = bm.verts.new(corner.inset(p[0], p[1]))
                assignGroupToVerts(obj, layer, group, v)

        # create faces
        bm.verts.ensure_lookup_table()
        for i in range(numControls):
            offset1 = (i - 1) * numVerts
            offset2 = offset1 + numVerts
            v1_1 = bm.verts[offset1]
            v2_1 = bm.verts[offset2]
            for p in range(1, numVerts):
                v1_2 = bm.verts[offset1 + p]
                v2_2 = bm.verts[offset2 + p]
                bm.faces.new((v2_2, v1_2, v1_1,
                              v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
                v1_1 = v1_2
                v2_1 = v2_2
            if closed:
                v1_2 = bm.verts[offset1]
                v2_2 = bm.verts[offset2]
                bm.faces.new((v2_2, v1_2, v1_1,
                              v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))

        bm.to_mesh(obj.data)
        bm.free()

        # without scene.update() hook modifiers will not work correctly
        context.scene.update()
        # perform parenting
        parent_set(parent, obj)
        # one more update
        context.scene.update()

        # add hook modifiers
        for c in controls:
            group = c["g"]
            addHookModifier(obj, group, c, group)
Example #2
0
    def createFromArea(self, area):
        context = self.context
        controls = area.getControls()

        obj = createMeshObject(area.obj.name + "_finish")
        obj["t"] = self.type
        self.obj = obj

        bm = getBmesh(obj)
        # vertex groups are in the deform layer, create one before any operation with bmesh:
        layer = bm.verts.layers.deform.new()

        # a vector along z-axis with the length equal to the wall height
        height = getLevelHeight(context, area.obj) * zAxis
        numControls = len(controls)
        for c in controls:
            group = c["g"]
            # the vert at the bottom
            v_b = bm.verts.new(c.location)
            # the vert at the top
            v_t = bm.verts.new(c.location + height)
            assignGroupToVerts(obj, layer, group, v_b, v_t)
            # assign vertex group for the top vertex
            assignGroupToVerts(obj, layer, "t", v_t)

        # create faces
        bm.verts.ensure_lookup_table()
        v1_b = bm.verts[-2]
        v1_t = bm.verts[-1]
        for i in range(numControls):
            # <2> is the number of vertices (of the just created wall surface) per control point
            v2_b = bm.verts[i * 2]
            v2_t = bm.verts[i * 2 + 1]
            bm.faces.new((v1_b, v1_t, v2_t, v2_b))
            v1_b = v2_b
            v1_t = v2_t
        setBmesh(obj, bm)

        # without scene.update() hook modifiers will not work correctly
        context.scene.update()
        # perform parenting
        parent_set(area.obj.parent, obj)
        # one more update
        context.scene.update()

        # add HOOK modifiers
        for c in controls:
            group = c["g"]
            addHookModifier(obj, group, c, group)
        # add a HOOK modifier controlling the top vertices
        addHookModifier(obj, "t", getNextLevelParent(context, obj), "t")
        # add a SOLIDIFY modifier
        addSolidifyModifier(obj, "solidify", thickness=0.001, offset=1.)
        self.treatInsertions(controls)
Example #3
0
 def create(self, controls, parent, profile):
     context = self.context
     
     profile, closed, clockwise = self.getProfileData(profile)
     
     obj = createMeshObject("extruded")
     obj["t"] = "extruded"
     
     bm = getBmesh(obj)
     # vertex groups are in the deform layer, create one before any operation with bmesh:
     layer = bm.verts.layers.deform.new()
     
     numVerts = len(profile)
     numControls = len(controls)
     for i in range(numControls):
         c = controls[i]
         corner = Corner(c.location, pVert = controls[i-1].location, nVert = controls[(i+1)%numControls].location)
         group = c["g"]
         for p in profile:
             v = bm.verts.new(corner.inset(p[0], p[1]))
             assignGroupToVerts(obj, layer, group, v)
     
     # create faces
     bm.verts.ensure_lookup_table()
     for i in range(numControls):
         offset1 = (i-1)*numVerts
         offset2 = offset1+numVerts
         v1_1 = bm.verts[offset1]
         v2_1 = bm.verts[offset2]
         for p in range(1, numVerts):
             v1_2 = bm.verts[offset1+p]
             v2_2 = bm.verts[offset2+p]
             bm.faces.new((v2_2, v1_2, v1_1, v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
             v1_1 = v1_2
             v2_1 = v2_2
         if closed:
             v1_2 = bm.verts[offset1]
             v2_2 = bm.verts[offset2]
             bm.faces.new((v2_2, v1_2, v1_1, v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
     
     bm.to_mesh(obj.data)
     bm.free()
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     parent_set(parent, obj)
     # one more update
     context.scene.update()
     
     # add hook modifiers
     for c in controls:
         group = c["g"]
         addHookModifier(obj, group, c, group)
Example #4
0
 def createFromArea(self, area):
     context = self.context
     controls = area.getControls()
     
     obj = createMeshObject(area.obj.name+"_finish")
     obj["t"] = self.type
     self.obj = obj
     
     bm = getBmesh(obj)
     # vertex groups are in the deform layer, create one before any operation with bmesh:
     layer = bm.verts.layers.deform.new()
     
     # a vector along z-axis with the length equal to the wall height
     height = getLevelHeight(context, area.obj)*zAxis
     numControls = len(controls)
     for c in controls:
         group = c["g"]
         # the vert at the bottom
         v_b = bm.verts.new(c.location)
         # the vert at the top
         v_t = bm.verts.new(c.location+height)
         assignGroupToVerts(obj, layer, group, v_b, v_t)
         # assign vertex group for the top vertex
         assignGroupToVerts(obj, layer, "t", v_t)
     
     # create faces
     bm.verts.ensure_lookup_table()
     v1_b = bm.verts[-2]
     v1_t = bm.verts[-1]
     for i in range(numControls):
         # <2> is the number of vertices (of the just created wall surface) per control point
         v2_b = bm.verts[i*2]
         v2_t = bm.verts[i*2+1]
         bm.faces.new((v1_b, v1_t, v2_t, v2_b))
         v1_b = v2_b
         v1_t = v2_t
     setBmesh(obj, bm)
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     parent_set(area.obj.parent, obj)
     # one more update
     context.scene.update()
     
     # add HOOK modifiers
     for c in controls:
         group = c["g"]
         addHookModifier(obj, group, c, group)
     # add a HOOK modifier controlling the top vertices
     addHookModifier(obj, "t", getNextLevelParent(context, obj), "t")
     # add a SOLIDIFY modifier
     addSolidifyModifier(obj, "solidify", thickness=0.001, offset=1.)
     self.treatInsertions(controls)
Example #5
0
    def execute(self, context):
        # template Blender object
        o = context.object
        t = Template(o, skipInit=True)
        prk = context.scene.prk
        props = prk.item

        if self.setBaseDirectory:
            prk.baseDirectory = os.path.dirname(os.path.dirname(
                self.directory))

        # find the selected vertices
        bm = t.bm
        v = [v for v in bm.verts if v.select]
        verts = (v[0].co, v[1].co)
        # check if <verts> have the same <z>-coordinate (i.e. <verts> are located horizontally)
        if abs(verts[1].z - verts[0].z) < zero2:
            # verts[0] must be the leftmost vertex
            if verts[0].x > verts[1].x:
                verts = (verts[1], verts[0])
                v = (v[1], v[0])
        else:
            # verts[0] must be the lower vertex
            if verts[0].z > verts[1].z:
                verts = (verts[1], verts[0])
                v = (v[1], v[0])

        # <a> is for asset
        a = appendFromFile(context, self.filepath)
        a.location = verts[0] + self.relativePosition * (verts[1] -
                                                         verts[0]) / 100.
        parent_set(o, a)
        a["t"] = "asset"
        a["t2"] = props.window.assetType
        # the path is set relative to <prk.baseDirectory>
        a["path"] = self.filepath[len(prk.baseDirectory) + 1:]
        # store <vids> for the tuple <v> of BMesh vertices as custom Blender object attributes
        a["vid1"] = t.getVid(v[0])
        a["vid2"] = t.getVid(v[1])
        t.bm.free()
        # side (left or right) for the asset
        if props.assetSideLr != 'n':
            # <slr> stands for <side left or right>
            a["slr"] = props.assetSideLr
        showWired(a)

        makeActiveSelected(context, a)
        # Without bpy.ops.transform.translate() some complex stuff (some modifiers)
        # may not be initialized correctly
        bpy.ops.transform.translate()
        return {'FINISHED'}
Example #6
0
 def execute(self, context):
     # template Blender object
     o = context.object
     t = Template(o, skipInit = True)
     prk = context.scene.prk
     props = prk.item
     
     if self.setBaseDirectory:
         prk.baseDirectory = os.path.dirname(os.path.dirname(self.directory))
     
     # find the selected vertices
     bm = t.bm
     v = [v for v in bm.verts if v.select]
     verts = (v[0].co, v[1].co)
     # check if <verts> have the same <z>-coordinate (i.e. <verts> are located horizontally)
     if abs(verts[1].z - verts[0].z) < zero2:
         # verts[0] must be the leftmost vertex
         if verts[0].x > verts[1].x:
             verts = (verts[1], verts[0])
             v = (v[1], v[0])
     else:
         # verts[0] must be the lower vertex
         if verts[0].z > verts[1].z:
             verts = (verts[1], verts[0])
             v = (v[1], v[0])
     
     # <a> is for asset
     a = appendFromFile(context, self.filepath)
     a.location = verts[0] + self.relativePosition*(verts[1]-verts[0])/100.
     parent_set(o, a)
     a["t"] = "asset"
     a["t2"] = props.window.assetType
     # the path is set relative to <prk.baseDirectory>
     a["path"] = self.filepath[len(prk.baseDirectory)+1:]
     # store <vids> for the tuple <v> of BMesh vertices as custom Blender object attributes
     a["vid1"] = t.getVid(v[0])
     a["vid2"] = t.getVid(v[1])
     t.bm.free()
     # side (left or right) for the asset
     if props.assetSideLr != 'n':
         # <slr> stands for <side left or right>
         a["slr"] = props.assetSideLr
     showWired(a)
     
     makeActiveSelected(context, a)
     # Without bpy.ops.transform.translate() some complex stuff (some modifiers)
     # may not be initialized correctly
     bpy.ops.transform.translate()
     return {'FINISHED'}
Example #7
0
 def parent_set(self, parent, obj):
     if "co" in parent:
         modelParent = parent.parent
         # <parent> must be for the level with the index zero
         parent = None
         for levelParent in modelParent.children:
             if "level" in levelParent and not levelParent["level"]:
                 parent = levelParent
                 break
         if not parent:
             # create a Blender parent object for the level with the index zero
             parent = createEmptyObject("level0", (0., 0., 0.), True, **Wall.emptyPropsLevel)
             parent["level"] = 0
             parent_set(modelParent, parent)
     parent_set(parent, obj)
Example #8
0
 def setupMaster(self, context, point1, point2):
     o = self.o
     # create a master EMPTY resembling <o>
     master = createEmptyObject("tmp", o.location, empty_draw_type=o.empty_draw_type, empty_draw_size=o.empty_draw_size)
     master.lock_location[2] = True
     self.master = master
     # rotate master along the line defined by point1 and point2
     master.rotation_euler[2] = math.atan2(point2.y-point1.y, point2.x-point1.x)
     parent_set(o.parent, master)
     
     o.select = False
     # make <o> a slave of <master>
     # x
     x = o.driver_add("location", 0)
     addTransformsVariable(x, "x", master, "LOC_X")
     x.driver.expression = "x"
     # y
     y = o.driver_add("location", 1)
     addTransformsVariable(y, "y", master, "LOC_Y")
     y.driver.expression = "y"
     
     makeActiveSelected(context, master)
Example #9
0
 def make(self, t, **kwargs):
     verts = t.bm.verts
     context = self.context
     hooksForNodes = kwargs["hooksForNodes"]
     # template Blender object
     _o = t.o
     # Create a Blender EMPTY object to serve as a parent for the window mesh;
     # its name doesn't have <T_> prefix
     name = _o.name[2:]
     # <pt> stands for parent template
     pt = t.parentTemplate
     if pt:
         p = createEmptyObject(name, _o.location-pt.o.location, False, empty_draw_size=0.01)
     else:
         # parent for the whole hierarchy of window Blender objects
         p = t.p
     t.meshParent = p
     # start a Blender object for the template
     o = createMeshObject(name + "_mesh")
     t.meshObject = o
     
     context.scene.update()
     # perform parenting
     parent_set(p, o)
     if t.parentTemplate:
         parent_set(pt.meshParent, p)
     context.scene.update()
     context.scene.objects.active = o
     
     t.prepareOffsets()
     
     # iterate through the vertices of the template Blender object
     numVerts = 0
     for v in verts:
         # id of the vertex
         vid = t.getVid(v)
         if not (vid in _o and _o[vid] in bpy.data.objects):
             continue
         # Blender object for the node at the vertex
         j = bpy.data.objects[_o[vid]]
         t.setNode(v, j, o, context, hooksForNodes = hooksForNodes)
         numVerts += 1
     
     # final operations: bridging or extruding edges loops of the nodes, making surfaces
     bm = getBmesh(o)
     t.bridgeOrExtendNodes(o, bm, kwargs["dissolveEndEdges"])
     if numVerts == len(verts):
         t.makeSurfaces(o, bm)
     setBmesh(o, bm)
     
     # remove unneeded vertex group
     groups = [g for g in o.vertex_groups if g.name[0] in ("e", "s", "c")]
     for g in groups:
         o.vertex_groups.remove(g)
     
     # add Edge Split modifier
     if kwargs["addEdgeSplitModifier"]:
         addEdgeSplitModifier(o, o.name)
         
     # set maximum possible range for the shape keys
     if hooksForNodes and o.data.shape_keys:
         for kb in o.data.shape_keys.key_blocks:
             kb.slider_min = -10.
             kb.slider_max = 10.
     
     t.insertAssets(context)
     
     # hide the template Blender object and all its children
     hide(t.o, True)
Example #10
0
    def make(self, t, **kwargs):
        verts = t.bm.verts
        context = self.context
        hooksForNodes = kwargs["hooksForNodes"]
        # template Blender object
        _o = t.o
        # Create a Blender EMPTY object to serve as a parent for the window mesh;
        # its name doesn't have <T_> prefix
        name = _o.name[2:]
        # <pt> stands for parent template
        pt = t.parentTemplate
        if pt:
            p = createEmptyObject(name,
                                  _o.location - pt.o.location,
                                  False,
                                  empty_draw_size=0.01)
        else:
            # parent for the whole hierarchy of window Blender objects
            p = t.p
        t.meshParent = p
        # start a Blender object for the template
        o = createMeshObject(name + "_mesh")
        t.meshObject = o

        context.scene.update()
        # perform parenting
        parent_set(p, o)
        if t.parentTemplate:
            parent_set(pt.meshParent, p)
        context.scene.update()
        context.scene.objects.active = o

        t.prepareOffsets()

        # iterate through the vertices of the template Blender object
        numVerts = 0
        for v in verts:
            # id of the vertex
            vid = t.getVid(v)
            if not (vid in _o and _o[vid] in bpy.data.objects):
                continue
            # Blender object for the node at the vertex
            j = bpy.data.objects[_o[vid]]
            t.setNode(v, j, o, context, hooksForNodes=hooksForNodes)
            numVerts += 1

        # final operations: bridging or extruding edges loops of the nodes, making surfaces
        bm = getBmesh(o)
        t.bridgeOrExtendNodes(o, bm, kwargs["dissolveEndEdges"])
        if numVerts == len(verts):
            t.makeSurfaces(o, bm)
        setBmesh(o, bm)

        # remove unneeded vertex group
        groups = [g for g in o.vertex_groups if g.name[0] in ("e", "s", "c")]
        for g in groups:
            o.vertex_groups.remove(g)

        # add Edge Split modifier
        if kwargs["addEdgeSplitModifier"]:
            addEdgeSplitModifier(o, o.name)

        # set maximum possible range for the shape keys
        if hooksForNodes and o.data.shape_keys:
            for kb in o.data.shape_keys.key_blocks:
                kb.slider_min = -10.
                kb.slider_max = 10.

        t.insertAssets(context)

        # hide the template Blender object and all its children
        hide(t.o, True)