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)
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)
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)
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)
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'}
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'}
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)
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)
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)
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)