def create(self, o): context = self.context obj = createMeshObject(self.name) #obj.hide_select = True context.scene.prk.areaName = obj.name obj["t"] = self.type group = o["g"] # remember the group for the first vertex obj["last"] = group bm = getBmesh(obj) # create a deform layer to store vertex groups layer = bm.verts.layers.deform.new() vert = bm.verts.new(self.getLocation(o)) assignGroupToVerts(obj, layer, group, vert) bm.to_mesh(obj.data) bm.free() # without scene.update() hook modifiers will not work correctly context.scene.update() # perform parenting self.parent_set(o.parent, obj) # one more update context.scene.update() addHookModifier(obj, group, o, group)
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 makeFromEmpties(self, empties): context = self.context obj = createMeshObject(self.name) #obj.hide_select = True # type obj["t"] = self.type bm = getBmesh(obj) # create a deform layer to store vertex groups layer = bm.verts.layers.deform.new() for e in empties: vert = bm.verts.new(self.getLocation(e)) assignGroupToVerts(obj, layer, e["g"], vert) # the face face = bm.faces.new(bm.verts) bm.to_mesh(obj.data) if obj.data.polygons[0].normal[2]<-zero: bmesh.ops.reverse_faces(bm, faces = (face,)) bm.to_mesh(obj.data) bm.free() # without scene.update() hook modifiers will not work correctly context.scene.update() # perform parenting self.parent_set(empties[0].parent, obj) # one more update context.scene.update() # add HOOK modifiers for e in empties: group = e["g"] addHookModifier(obj, group, e, group) return obj
def extend(self, empty): context = self.context # get Blender object for the area obj = getAreaObject(self.context) bm = getBmesh(obj) bm.verts.ensure_lookup_table() _vert = bm.verts[-1] # find the Blender object for the empty that controls the last created area vertex prevEmpty = obj.modifiers[obj["last"]].object # If empty and prevEmpty belong to the same wall, # check if we need to create in-between verts for the area, # i.e. empty and prevEmpty aren't adjacent inbetweens = [] if empty.parent == prevEmpty.parent and empty["m"] == prevEmpty["m"]: wall = getWallFromEmpty(context, self.op, empty) if not (wall.getNext(empty) == prevEmpty or wall.getPrevious(empty) == prevEmpty): # find Blender empty objects for <wall>, located between empty and prevEmpty empties = [] # first searching in the forward direction e = prevEmpty while True: e = wall.getNext(e) if e == empty or not e: break empties.append(e) isClosed = wall.isClosed() if isClosed: # keep list of empties _empties = empties if not e or isClosed: # now try in the backward direction empties = [] e = prevEmpty while True: e = wall.getPrevious(e) if e == empty: break empties.append(e) # for the closed wall check whick path is shorter, in the forward or backward directions if isClosed and len(empties) > len(_empties): empties = _empties # finally, create area verts for EMTPYs for e in empties: group = e["g"] vert = bm.verts.new(self.getLocation(e)) assignGroupToVerts(obj, bm.verts.layers.deform[0], group, vert) _vert = vert inbetweens.append((e, group)) group = empty["g"] obj["last"] = group vert = bm.verts.new(self.getLocation(empty)) assignGroupToVerts(obj, bm.verts.layers.deform[0], group, vert) bm.to_mesh(obj.data) bm.free() # without scene.update() hook modifiers will not work correctly # this step is probably optional here, however it's required in AreaBegin.execute() context.scene.update() if inbetweens: for e,g in inbetweens: addHookModifier(obj, g, e, g) addHookModifier(obj, group, empty, group)