Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'add_mesh_geodesic_domes/vefm_271.py')
-rw-r--r--add_mesh_geodesic_domes/vefm_271.py1144
1 files changed, 1144 insertions, 0 deletions
diff --git a/add_mesh_geodesic_domes/vefm_271.py b/add_mesh_geodesic_domes/vefm_271.py
new file mode 100644
index 00000000..4c7fc19d
--- /dev/null
+++ b/add_mesh_geodesic_domes/vefm_271.py
@@ -0,0 +1,1144 @@
+# vert class and overloading experiments
+import bpy
+# PKHG>NEEDED?
+import bmesh
+from math import acos, pi, sin, cos, atan, tan
+from mathutils import Vector
+from bpy_extras.object_utils import AddObjectHelper, object_data_add
+
+# PKHG>DBG change the DBG_info and use extra_DBG_info
+DBG_info = {"MeshInfo": False, "StrutMesh": False, "HubMesh": False}
+
+
+def extra_DBG_info(name="value from DBG_info", info_text="default\n", info_obj=None):
+ global DBG_info
+ DBG_keys = DBG_info.keys()
+ if name in DBG_keys:
+ if DBG_info[name]:
+ print(info_text, info_obj)
+
+sgn = lambda x: (x > 0) - (x < 0) # missing signum function in Python
+
+
+def vefm_add_object(selfobj):
+ for i in range(len(selfobj.verts)):
+ selfobj.verts[i].index = i
+ v = [el.vector for el in selfobj.verts]
+
+ e = [[edge.a.index, edge.b.index] for edge in selfobj.edges]
+
+ if type(selfobj.faces[0]) == type([]):
+ # PKHG should be a list of vertices, which have an index
+ f = [[v.index for v in face] for face in selfobj.faces]
+ else:
+ f = [[v.index for v in face.vertices] for face in selfobj.faces]
+
+ m = bpy.data.meshes.new(name=selfobj.name)
+ m.from_pydata(v, e, f)
+ # useful for development when the mesh may be invalid.
+ m.validate(verbose=False)
+ object_data_add(bpy.context, m, operator=None)
+
+
+# extra test phase
+
+class vertex:
+ def __init__(self, vec=(0, 0, 0)): # default x = 0, y = 0, z = 0):
+ self.vector = Vector(vec)
+ self.length = self.vector.length
+ self.index = 0
+ self.normal = 0
+ self.edges = []
+ self.faces = []
+ self.boundary = 0
+
+ def findlength(self):
+ self.length = self.vector.length
+
+ def normalize(self):
+ self.findlength()
+ if self.length > 0:
+ tmp = 1.0 / self.length
+ self.vector = tmp * self.vector
+ self.length = 1.0
+
+ def findnormal(self):
+ target = []
+ if self.faces[:] == []:
+ print("vefm vertex L68 pkhg:*****ERROR**** findnormal has no faces")
+ return
+ for currentface in self.faces:
+ target.append(currentface.normal)
+ self.normal = average(target).centroid()
+ self.normal.findlength()
+ if self.length == 0:
+ print("******ERROR*** length zero in findnormal, j = (0,1,0) replaced")
+ self.normal = vertex((0, 1, 0))
+ self.normal.normalize()
+
+ def clockwise(self): # PKHG self is a vertex
+ if self.boundary:
+ start = self.boundarystart()
+ else:
+ start = self.faces[0]
+
+ self.tempedges = []
+ self.tempfaces = []
+ for i in range(len(self.edges)):
+
+ self.tempfaces.append(start)
+ for corner in start.corners:
+ if corner[0] is not self:
+ pass
+ elif corner[0] is self:
+ self.tempedges.append(corner[1])
+ nextedge = corner[2]
+ for facey in nextedge.faces:
+ if facey is not start:
+ start = facey
+ break
+ self.edges = self.tempedges
+ self.faces = self.tempfaces
+
+ def boundarystart(self):
+
+ pass
+
+ def __add__(self, other):
+ if isinstance(other, Vector):
+ tmp = self.vector + other
+ else:
+ tmp = self.vector + other.vector
+ return vertex(tmp)
+
+ def __sub__(self, other):
+ if isinstance(other, Vector):
+ tmp = self.vector - other
+ else:
+ tmp = self.vector - other.vector
+ return vertex(tmp)
+
+ def __mul__(self, other):
+ tmp = self.vector * other
+ return vertex(tmp)
+
+ def __truediv__(self, other):
+ denom = 1.0 / other
+ tmp = self.vector * denom
+ return (tmp)
+
+ def negative(self):
+ return vertex(-self.vector)
+
+
+class crossp:
+ # Takes in two vertices(vectors), returns the cross product.
+ def __init__(self, v1, v2):
+ self.v1 = v1
+ self.v2 = v2
+
+ def docrossproduct(self):
+ tmp = self.v1.vector.cross(self.v2.vector)
+ return vertex(tmp)
+
+
+class average:
+ # Takes a list of vertices and returns the average. If two verts are passed, returns midpoint.
+ def __init__(self, vertlist):
+ self.vertlist = vertlist
+
+ def centroid(self):
+ tmp = Vector()
+ # PKHG avoid emptylist problems
+ divisor = 1.0
+ nr_vertices = len(self.vertlist)
+ if nr_vertices > 1:
+ divisor = 1.0 / len(self.vertlist)
+ elif nr_vertices == 0:
+ print("\n***WARNING*** empty list in vefm_271.centroid! L158")
+ for vert in self.vertlist:
+ tmp = tmp + vert.vector
+ tmp = tmp * divisor
+ return vertex(tmp)
+
+
+class edge:
+ def __init__(self, a=0, b=0):
+ self.a = a
+ self.b = b
+ self.index = 0
+ self.normal = 0
+ self.cross = 0
+ self.unit = 0
+ self.faces = []
+ self.vect = 0 # PKHG becomes b - a
+ self.vectb = 0 # PKHG becomes a - b
+ self.boundary = 0
+ self.findvect()
+ self.findlength()
+
+ def findvect(self):
+ self.vect = self.b - self.a
+ self.vectb = self.a - self.b
+
+ def findlength(self):
+ self.vect.findlength()
+ self.vectb.length = self.vect.length
+
+ def findnormal(self):
+ if self.boundary:
+ self.normal = self.faces[0].normal # average([self.a, self.b]).centroid()
+ else:
+ self.normal = average([self.faces[0].normal, self.faces[1].normal]).centroid()
+ self.normal.normalize()
+
+
+class face:
+ def __init__(self, vertices=[]):
+ # PKHG ok good for tri's at least
+ self.vertices = vertices # List of vertex instances
+ self.edges = [] # Will be filled with the sides of the face
+ self.boundary = 0 # When set will have bool and id of edge concerned
+ self.normal = 0 # Face normal found through cross product
+ self.corners = []
+ self.spokes = [] # Vectors of the bisecting angles from each corner to the centre + dotproduct
+
+ self.index = 0
+
+ # dotproduct is misleading name, it is the hook between two vectors!
+ def dotproduct(self, v1, v2):
+ v1.findlength()
+ v2.findlength()
+ if v1.length == 0 or v2.length == 0:
+ print("\nPKHG warning, ===== vefm_271 dotproduct L212 ======"
+ " at least one zero vector 0 used")
+ return 0
+ dot = v1.vector.dot(v2.vector)
+ costheta = dot / (v1.length * v2.length)
+ tmp = acos(costheta)
+ return tmp
+
+ def orderedges(self):
+ temp = []
+ finish = len(self.vertices)
+ for i in range(finish):
+ current = self.vertices[i]
+ if i == finish - 1:
+ next = self.vertices[0]
+ else:
+ next = self.vertices[i + 1]
+ for edge in face.edges:
+ if edge.a == current and edge.b == next:
+ face.clockw.append(edge.vect)
+ face.aclockw.append(edge.vectb)
+ temp.append(edge)
+ if edge.b == current and edge.a == next:
+ face.clockw.append(edge.vectb)
+ face.aclockw.append(edge.vect)
+ temp.append(edge)
+ for edge in face.edges:
+ if edge.a == current and edge.b == next:
+ face.clockw.append(edge.vect)
+ face.aclockw.append(edge.vectb)
+ temp.append(edge)
+ if edge.b == current and edge.a == next:
+ face.clockw.append(edge.vectb)
+ face.aclockw.append(edge.vect)
+ temp.append(edge)
+ face.vertices = temp
+
+ def docorners(self):
+ # This function identifies and stores the vectors coming from each vertex
+ # allowing easier calculation of cross and dot products.
+ finish = len(self.vertices)
+
+ for i in range(finish):
+ current = self.vertices[i]
+ if i == finish - 1:
+ next = self.vertices[0]
+ else:
+ next = self.vertices[i + 1]
+ if i == 0:
+ previous = self.vertices[-1]
+ else:
+ previous = self.vertices[i - 1]
+ corner = [current] # PKHG new for each vertex = current
+ # corner = current
+ rightedge = None
+ leftedge = None
+ teller = -1
+ for edge in self.edges:
+ if finish == 3 and len(self.edges) == 2 and i == 2:
+ return
+ teller += 1
+ # next and previous are vertex with respect to ith vertex
+ if edge.a is current or edge.b is current: # does this edge contain our current vert
+ if edge.a is current:
+ if edge.b is next:
+ rightedge = edge
+ rightvect = edge.vect
+ if edge.b is previous:
+ leftedge = edge
+ leftvect = edge.vect
+ elif edge.b is current:
+ if edge.a is next:
+ rightedge = edge
+ rightvect = edge.vectb
+ if edge.a is previous:
+ leftedge = edge
+ leftvect = edge.vectb
+ corner.append(rightedge)
+ corner.append(leftedge)
+ if rightedge and leftedge:
+
+ dotty = self.dotproduct(rightvect, leftvect)
+ corner.append(dotty)
+ self.corners.append(corner)
+
+ def findnormal(self):
+ one = self.corners[1][2]
+ two = self.corners[1][1]
+ if one.a is self.corners[1][0]:
+ one = one.vect
+ elif one.b is self.corners[1][0]:
+ one = one.vectb
+ if two.a is self.corners[1][0]:
+ two = two.vect
+ elif two.b is self.corners[1][0]:
+ two = two.vectb
+ self.normal = crossp(one, two).docrossproduct()
+ self.normal.findlength()
+ self.normal.normalize()
+
+ def dospokes(self):
+ for corner in self.corners:
+ vert = corner[0]
+ right = corner[1]
+ left = corner[2]
+ if right.a is vert:
+ one = vertex(right.vect.vector)
+ elif right.b is vert:
+ one = vertex(right.vectb.vector)
+ if left.a is vert:
+ two = vertex(left.vect.vector)
+ elif left.b is vert:
+ two = vertex(left.vectb.vector)
+
+ one.normalize()
+ two.normalize()
+ spoke = one + two
+ spoke.normalize()
+ self.spokes.append(spoke)
+
+ def artspokes(self):
+ centre = average(self.vertices).centroid()
+ for point in self.vertices:
+ newedge = edge(point, centre)
+ self.spokes.append(newedge)
+
+
+class mesh:
+ def __init__(self, name="GD_mesh"):
+ self.name = name
+ self.verts = []
+ self.edges = []
+ self.faces = []
+ self.edgeflag = 0
+ self.faceflag = 0
+ self.vertexflag = 0
+ self.vertedgeflag = 0
+ self.vertfaceflag = 0
+ self.faceedgeflag = 0
+ self.boundaryflag = 0
+ self.vertnormalflag = 0
+ self.edgenormalflag = 0
+ self.facenormalflag = 0
+ self.a45 = pi * 0.25
+ self.a90 = pi * 0.5
+ self.a180 = pi
+ self.a270 = pi * 1.5
+ self.a360 = pi * 2
+
+ def power(self, a, b): # Returns a power, including negative numbers
+ result = sgn(a) * (abs(a) ** b)
+ return result
+
+ def sign(self, d): # Works out the sign of a number.
+ return sgn(d)
+
+ def ellipsecomp(self, efactor, theta):
+ if theta == self.a90:
+ result = self.a90
+ elif theta == self.a180:
+ result = self.a180
+ elif theta == self.a270:
+ result = self.a270
+ elif theta == self.a360:
+ result = 0.0
+ else:
+ result = atan(tan(theta) / efactor ** 0.5)
+ if result < 0.0:
+ if theta > self.a180:
+ result = result + self.a180
+ elif theta < self.a180:
+ result = result + self.a180
+
+ if result > 0.0:
+ if theta > self.a180:
+ result = result + self.a180
+ elif theta < self.a180:
+ result = result
+ return result
+
+ def connectivity(self):
+ self.dovertedge()
+ self.dovertface()
+ self.dofaceedge()
+ self.boundary()
+
+ def superell(self, n1, uv, turn):
+ t1 = sin(uv + turn)
+ t1 = abs(t1)
+ t1 = t1 ** n1
+ t2 = cos(uv + turn)
+ t2 = abs(t2)
+ t2 = t2 ** n1
+ r = self.power(1.0 / (t1 + t2), (1.0 / n1))
+ return r
+
+ def superform(self, m, n1, n2, n3, uv, a, b, twist):
+ t1 = cos(m * (uv + twist) * .25) * a
+ t1 = abs(t1)
+ t1 = t1 ** n2
+ t2 = sin(m * (uv + twist) * .25) * b
+ t2 = abs(t2)
+ t2 = t2 ** n3
+ r = self.power(1.0 / (t1 + t2), n1)
+ return r
+
+ def dovertedge(self):
+ if not self.vertedgeflag:
+ for vert in self.verts:
+ vert.edges = []
+ for currentedge in self.edges:
+ currentedge.a.edges.append(currentedge)
+ currentedge.b.edges.append(currentedge)
+ self.vertedgeflag = 1
+
+ def dovertface(self):
+ if not self.vertfaceflag:
+ for vert in self.verts:
+ vert.faces = []
+ for face in self.faces:
+ for vert in face.vertices:
+ vert.faces.append(face)
+ self.vertfaceflag = 1
+
+ def dofaceedge(self):
+ self.dovertedge() # just in case they haven't been done
+ self.dovertface()
+ if not self.faceedgeflag:
+ for edge in self.edges:
+ edge.faces = []
+ for face in self.faces:
+ face.edges = []
+ for face in self.faces:
+ finish = len(face.vertices)
+ for i in range(finish):
+ current = face.vertices[i]
+ if i == finish - 1:
+ next = face.vertices[0]
+ else:
+ next = face.vertices[i + 1]
+ for edge in current.edges:
+ if edge.a is current or edge.b is current:
+ if edge.b is next or edge.a is next:
+ edge.faces.append(face)
+ face.edges.append(edge)
+ self.faceedgeflag = 1
+
+ def boundary(self):
+ if not self.boundaryflag:
+ for edge in self.edges:
+ if len(edge.faces) < 2:
+ edge.boundary = 1
+ edge.faces[0].boundary = 1
+ edge.a.boundary = 1
+ edge.b.boundary = 1
+
+ # The functions below turn the basic triangular faces into
+ # hexagonal faces, creating the buckyball effect.
+ # PKHG seems to work only for meshes with tri's ;-)
+ def hexify(self):
+ self.hexverts = []
+ self.hexedges = []
+ self.hexfaces = []
+ # PKHG renumbering the index of the verts
+ for i in range(len(self.verts)):
+ self.verts[i].index = i
+ # PKHG renumbering the index of the edges
+ for i in range(len(self.edges)):
+ self.edges[i].index = i
+
+ self.connectivity()
+ hexvert_counter = 0
+ for edge in self.edges:
+
+ self.hexshorten(edge, hexvert_counter)
+ hexvert_counter += 2 # PKHG two new vertices done
+
+ for face in self.faces:
+ self.makehexfaces(face)
+
+ for vert in self.verts:
+ vert.clockwise()
+ self.hexvertface(vert)
+ self.verts = self.hexverts
+ self.edges = self.hexedges
+ self.faces = self.hexfaces
+ self.vertedgeflag = 0
+ self.vertfaceflag = 0
+ self.faceedgeflag = 0
+
+ def hexshorten(self, currentedge, hexvert_counter):
+ third = vertex(currentedge.vect / 3.0)
+ newvert1 = vertex(currentedge.a.vector)
+ newvert2 = vertex(currentedge.b.vector)
+ newvert1 = newvert1 + third
+ newvert1.index = hexvert_counter
+ newvert2 = newvert2 - third
+ newvert2.index = hexvert_counter + 1 # PKHG caller adjusts +=2
+ newedge = edge(newvert1, newvert2)
+ newedge.index = currentedge.index
+ self.hexverts.append(newvert1)
+ self.hexverts.append(newvert2)
+ self.hexedges.append(newedge)
+
+ def makehexfaces(self, currentface):
+ vertices = []
+ currentface.docorners()
+ for corner in currentface.corners:
+ vert = corner[0]
+ rightedge = corner[1]
+ leftedge = corner[2]
+ lid = leftedge.index
+ rid = rightedge.index
+
+ if leftedge.a is vert:
+ vertices.append(self.hexedges[lid].a)
+ elif leftedge.b is vert:
+ vertices.append(self.hexedges[lid].b)
+
+ if rightedge.a is vert:
+ vertices.append(self.hexedges[rid].a)
+ elif rightedge.b is vert:
+ vertices.append(self.hexedges[rid].b)
+
+ newface = face(vertices)
+ newedge1 = edge(vertices[0], vertices[1])
+ newedge2 = edge(vertices[2], vertices[3])
+ newedge3 = edge(vertices[4], vertices[5])
+ self.hexfaces.append(newface)
+ self.hexedges.append(newedge1)
+ self.hexedges.append(newedge2)
+ self.hexedges.append(newedge3)
+
+ def hexvertface(self, vert):
+ vertices = []
+ for edge in vert.edges:
+ eid = edge.index
+ if edge.a is vert:
+ vertices.append(self.hexedges[eid].a)
+ elif edge.b is vert:
+ vertices.append(self.hexedges[eid].b)
+ newface = face(vertices)
+ self.hexfaces.append(newface)
+
+ def starify(self):
+ self.starverts = []
+ self.staredges = []
+ self.starfaces = []
+ for i in range(len(self.verts)):
+ self.verts[i].index = i
+ for i in range(len(self.edges)):
+ self.edges[i].index = i
+ self.connectivity()
+ star_vert_counter = 0
+ for currentedge in self.edges:
+ newvert = average([currentedge.a, currentedge.b]).centroid()
+ newvert.index = star_vert_counter
+ star_vert_counter += 1
+ self.starverts.append(newvert)
+ star_face_counter = 0
+ star_edge_counter = 0
+ for currentface in self.faces:
+ currentface.docorners()
+ vertices = []
+ for corner in currentface.corners:
+ vert = self.starverts[corner[1].index]
+ vertices.append(vert)
+ newface = face(vertices)
+ newface.index = star_face_counter
+ star_face_counter += 1
+ newedge1 = edge(vertices[0], vertices[1])
+ newedge1.index = star_edge_counter
+ newedge2 = edge(vertices[1], vertices[2])
+ newedge2.index = star_edge_counter + 1
+ newedge3 = edge(vertices[2], vertices[0])
+ newedge3.index = star_edge_counter + 2
+ star_edge_counter += 3
+ self.starfaces.append(newface)
+ self.staredges.append(newedge1)
+ self.staredges.append(newedge2)
+ self.staredges.append(newedge3)
+ for vert in self.verts:
+ vertices = []
+ vert.clockwise()
+ for currentedge in vert.edges:
+ eid = currentedge.index
+ vertices.append(self.starverts[eid])
+ newface = face(vertices)
+ newface.index = star_face_counter
+ star_face_counter += 1
+ self.starfaces.append(newface)
+ self.verts = self.starverts
+ self.edges = self.staredges
+ self.faces = self.starfaces
+ self.vertedgeflag = 0
+ self.vertfaceflag = 0
+ self.faceedgeflag = 0
+
+ def class2(self):
+ self.class2verts = []
+ self.class2edges = []
+ self.class2faces = []
+
+ newvertstart = len(self.verts)
+ newedgestart = len(self.edges)
+ counter_verts = len(self.verts)
+ for i in range(counter_verts):
+ self.verts[i].index = i
+ for i in range(len(self.edges)):
+ self.edges[i].index = i
+ for i in range(len(self.faces)):
+ self.faces[i].index = i
+ self.connectivity()
+ for currentface in self.faces:
+ currentface.docorners()
+ newvert = average(currentface.vertices).centroid()
+ newvert.index = counter_verts
+
+ counter_verts += 1
+ self.verts.append(newvert)
+ newedge1 = edge(currentface.vertices[0], newvert)
+ newedge2 = edge(currentface.vertices[1], newvert)
+ newedge3 = edge(currentface.vertices[2], newvert)
+
+ self.edges.append(newedge1)
+ self.edges.append(newedge2)
+ self.edges.append(newedge3)
+ for currentedge in range(newedgestart):
+ self.edges[currentedge].a = self.verts[self.edges[currentedge].faces[0].index + newvertstart]
+ self.edges[currentedge].b = self.verts[self.edges[currentedge].faces[1].index + newvertstart]
+ self.edges[currentedge].findvect()
+
+ for currentvert in range(newvertstart):
+ vert = self.verts[currentvert]
+ vertices = []
+ vert.clockwise()
+ for currentface in vert.faces:
+ eid = currentface.index
+ vertices.append(self.verts[newvertstart + eid])
+
+ for i in range(len(vertices)):
+ if i == len(vertices) - 1:
+ next = vertices[0]
+ else:
+ next = vertices[i + 1]
+
+ newface = face([vert, vertices[i], next])
+ self.class2faces.append(newface)
+
+ self.faces = self.class2faces
+ self.vertedgeflag = 0
+ self.vertfaceflag = 0
+ self.faceedgeflag = 0
+
+ def dual(self):
+ self.dualverts = []
+
+ self.dualfaces = []
+
+ counter_verts = len(self.verts)
+ for i in range(counter_verts):
+ self.verts[i].index = i
+ for i in range(len(self.edges)):
+ self.edges[i].index = i
+ for i in range(len(self.faces)):
+ self.faces[i].index = i
+ self.connectivity()
+ counter_verts = 0
+ for currentface in self.faces:
+ currentface.docorners()
+ newvert = average(currentface.vertices).centroid()
+ newvert.index = counter_verts # PKHG needed in >= 2.59
+ counter_verts += 1
+ self.dualverts.append(newvert)
+ for vert in self.verts:
+ vertices = []
+ vert.clockwise()
+ for currentface in vert.faces:
+ eid = currentface.index
+ vertices.append(self.dualverts[eid])
+ newface = face(vertices)
+ self.dualfaces.append(newface)
+ for currentedge in self.edges:
+ currentedge.a = self.dualverts[currentedge.faces[0].index]
+ currentedge.b = self.dualverts[currentedge.faces[1].index]
+ self.verts = self.dualverts
+
+ self.faces = self.dualfaces
+ self.vertedgeflag = 0
+ self.vertfaceflag = 0
+ self.faceedgeflag = 0
+
+
+class facetype(mesh):
+ def __init__(self, basegeodesic, parameters, width, height, relative):
+ mesh.__init__(self)
+ self.detach = parameters[0]
+ self.endtype = parameters[1]
+ self.coords = parameters[2]
+ self.base = basegeodesic
+ self.relative = relative
+ self.width = width
+
+ if not self.relative:
+ newwidth = self.findrelative()
+ self.width = width * newwidth
+ self.height = height
+ self.base.connectivity()
+ for coord in self.coords:
+ coord[0] = coord[0] * self.width
+ coord[1] = coord[1] * self.height
+ if not self.base.facenormalflag:
+ for currentface in self.base.faces:
+
+ currentface.docorners()
+ currentface.findnormal()
+
+ self.base.facenormalflag = 1
+ if self.endtype == 4 and not self.base.vertnormalflag:
+ for currentvert in self.base.verts:
+ currentvert.findnormal()
+ self.base.vertnormalflag = 1
+ self.createfaces()
+
+ def findrelative(self):
+ centre = average(self.base.faces[0].vertices).centroid()
+ edgelist = []
+ for point in self.base.faces[0].vertices:
+ newedge = edge(centre, point)
+ edgelist.append(newedge)
+ length = 0
+ for edg in edgelist:
+ extra = edg.vect.length
+ length = length + extra
+
+ length = length / len(edgelist)
+
+ return length
+
+ def createfaces(self):
+ if not self.detach:
+ for point in self.base.verts:
+ self.verts.append(point)
+ if self.endtype == 4:
+ self.createghostverts()
+ for currentface in self.base.faces:
+ self.doface(currentface)
+
+ def createghostverts(self):
+ self.ghoststart = len(self.verts)
+ for vert in self.base.verts:
+ newvert = vert + (vert.normal * self.coords[-1][1])
+ self.verts.append(newvert)
+
+ def doface(self, candidate):
+ grid = []
+ candidate.dospokes()
+
+ if not self.detach:
+ line = []
+ for vert in candidate.vertices:
+ line.append(vert)
+ grid.append(line)
+ else:
+ line = []
+ for point in candidate.vertices:
+ newvert = vertex(point.vector)
+ self.verts.append(newvert)
+ line.append(newvert)
+ grid.append(line)
+ finish = len(self.coords)
+ if self.endtype == 1 or self.endtype == 4:
+ finish = finish - 1
+ for i in range(finish):
+ up = candidate.normal * self.coords[i][1]
+ line = []
+ for j in range(len(candidate.vertices)):
+ dotfac = candidate.corners[j][3] * 0.5
+ vec = (candidate.spokes[j] * (self.coords[i][0] / sin(dotfac)))
+
+ newvert = candidate.vertices[j] + vec + up
+ line.append(newvert)
+ self.verts.append(newvert)
+ grid.append(line)
+ if self.endtype == 4:
+ line = []
+ for i in range(len(candidate.vertices)):
+ vert = self.verts[candidate.vertices[i].index + self.ghoststart]
+ line.append(vert)
+
+ grid.append(line)
+ for line in grid:
+ line.append(line[0])
+ if self.endtype == 3:
+ grid.append(grid[0])
+ for i in range(len(grid) - 1):
+ for j in range(len(grid[i]) - 1):
+ one = grid[i][j]
+ two = grid[i][j + 1]
+ three = grid[i + 1][j + 1]
+ four = grid[i + 1][j]
+ newface = face([one, two, three, four])
+ self.faces.append(newface)
+ if self.endtype == 2:
+ finalfaceverts = grid[-1]
+ newface = face(finalfaceverts[:-1])
+ self.faces.append(newface)
+ if self.endtype == 1:
+ lastvert = average(candidate.vertices).centroid()
+ up = candidate.normal * self.coords[-1][1]
+ newvert = lastvert + up
+ self.verts.append(newvert)
+ ring = grid[-1]
+ for i in range(len(ring) - 1):
+ newface = face([newvert, ring[i], ring[i + 1]])
+ self.faces.append(newface)
+
+
+class importmesh(mesh):
+ def __init__(self, meshname, breakquadflag):
+ mesh.__init__(self)
+
+ obj = bpy.data.objects[meshname]
+ bpy.context.view_layer.objects.active = obj
+ obj.select_set(True)
+ impmesh = None
+ if not breakquadflag:
+ bpy.ops.object.mode_set(mode='EDIT')
+ impmesh = bmesh.new() # create an empty BMesh
+ impmesh.from_mesh(obj.data) # fill it in from a Mesh
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ if breakquadflag:
+ bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.mesh.quads_convert_to_tris()
+ impmesh = bmesh.new() # create an empty BMesh
+ impmesh.from_mesh(obj.data) # fill it in from a Mesh
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ for v in impmesh.verts:
+ vert = vertex(v.co)
+ vert.index = v.index
+ self.verts.append(vert)
+ # PKHG verts is now a list of vertex, so to say a copy of the Vectors
+
+ # PKHG edges
+ for e in impmesh.edges:
+ tmp = []
+ for vert in e.verts:
+ a = self.verts[vert.index]
+ tmp.append(a)
+ newedge = edge(tmp[0], tmp[1])
+ newedge.index = e.index
+ self.edges.append(newedge)
+ # PKHG faces
+ extra_DBG_info("MeshInfo", "vefm L868 the mesh impmesh", impmesh.faces[:])
+
+ for f in impmesh.faces:
+ temp = []
+ for vert in f.verts: # PKHG a list! of indices ??? PKHG>???
+ a = self.verts[vert.index] # PKHG verts contains already vertex objects
+ temp.append(a)
+ newface = face(temp)
+ newface.index = f.index # indexcount
+ self.faces.append(newface)
+ self.dovertedge()
+ self.dovertface()
+ self.temp = []
+
+ for i in range(len(self.verts)):
+ self.temp.append([])
+ self.verts[i].index = i
+ for i in range(len(self.verts)):
+ target = self.surroundingverts(self.verts[i])
+ for j in range(len(target)): # go through those verts
+ temptarg = self.temp[target[j].index]
+ flag = 0 # set a flag up
+
+ for k in range(len(temptarg)): # go through temp list for each of those verts
+
+ if temptarg[k] == i: # if we find a match to the current vert...
+ flag = 1 # raise the flag
+
+ if flag == 0: # if there is no flag after all that...
+ self.temp[target[j].index].append(i) # add current vert to temp list of this surrounding vert
+ self.temp[i].append(target[j].index) # add this surrounding vert to the current temp list
+ newedge = edge(self.verts[i], self.verts[target[j].index])
+ self.edges.append(newedge) # add the newly found edge to the edges list
+
+ for edg in self.edges:
+ edg.findvect()
+ self.vertedgeflag = 0
+ self.vertedgeflag = 0
+ self.connectivity()
+
+ def surroundingverts(self, vert):
+ ''' Find the verts surrounding vert'''
+ surround = [] # list to be filled and returned
+ for faces in vert.faces: # loop through faces attached to vert
+ finish = len(faces.vertices)
+ for i in range(finish):
+ if i == finish - 1:
+ next = faces.vertices[0]
+ else:
+ next = faces.vertices[i + 1]
+ if vert == faces.vertices[i]:
+ surround.append(next)
+ return surround
+
+ def breakquad(self, quad_face):
+ ''' turn quads into triangles'''
+ distance1 = quad_face.vertices[0] - quad_face.vertices[2]
+ distance2 = quad_face.vertices[1] - quad_face.vertices[3]
+ distance1.findlength()
+ distance2.findlength()
+ if abs(distance1.length) < abs(distance2.length):
+ self.faces[quad_face.index] = face([quad_face.vertices[0], quad_face.vertices[1], quad_face.vertices[2]])
+ self.faces.append(face([quad_face.vertices[0], quad_face.vertices[2], quad_face.vertices[3]]))
+ else:
+ self.faces[quad_face.index] = face([quad_face.vertices[0], quad_face.vertices[1], quad_face.vertices[3]])
+ self.faces.append(face([quad_face.vertices[1], quad_face.vertices[2], quad_face.vertices[3]]))
+
+
+class strut(mesh):
+ def __init__(self, base, struttype, width, height, length, widthtog, heighttog,
+ lengthtog, meshname, stretchflag, lift):
+
+ extra_DBG_info(name="StrutMesh", info_text="vefm L940\nstrut called: ",
+ info_obj=[base, struttype, width, height, length, widthtog,
+ heighttog, lengthtog, meshname, stretchflag, lift])
+ mesh.__init__(self)
+ # put in strut prep stuff here
+ if struttype is None:
+ return
+ total = 0
+ divvy = len(base.faces[0].edges)
+ for lengf in base.faces[0].edges:
+ lengf.vect.findlength()
+ total = total + lengf.vect.length
+ yardstick = total / divvy
+ if widthtog:
+ self.width = width
+ else:
+ self.width = width * yardstick
+ if heighttog:
+ self.height = height
+ else:
+ self.height = height * yardstick
+ if lengthtog:
+ self.shrink = length
+ else:
+ self.shrink = length * yardstick
+ if not base.facenormalflag:
+ for currentface in base.faces:
+ currentface.docorners()
+ currentface.findnormal()
+ base.facenormalflag = 1
+ for edj in base.edges:
+ edj.findnormal()
+ side = edge(edj.a, edj.b)
+ edj.unit = side.vect
+ edj.unit.normalize()
+ edj.cross = crossp(edj.normal, edj.unit).docrossproduct()
+ template = importmesh(meshname, 0)
+ maxx = 0
+ minx = 0
+ for vert in template.verts:
+ if vert.vector.x > maxx:
+ maxx = vert.vector.x
+ if vert.vector.x < minx:
+ minx = vert.vector.x
+ for edj in base.edges:
+ start = len(self.verts)
+ centre = average([edj.a, edj.b]).centroid()
+ split = edj.vect.length / 2
+ # PKHG no division by zero!!
+ tmp = 1.0
+ if maxx != minx:
+ tmp = 1.0 / (maxx - minx)
+ dubbl = edj.vect.length * tmp
+ # PKHG end no division by zero!!
+ diffplus = split - maxx
+ diffminus = -split - minx
+ for point in template.verts:
+ ay = (edj.normal * point.vector.z * self.height) + (edj.normal * lift)
+ ce = edj.cross * point.vector.y * self.width
+
+ if stretchflag:
+ be = edj.unit * self.shrink * dubbl * point.vector.x
+ else:
+ if point.vector.x > 0.0:
+ be = edj.unit * self.shrink * (point.vector.x + diffplus)
+ elif point.vector.x < 0.0:
+ be = edj.unit * self.shrink * (point.vector.x + diffminus)
+ elif point.vector.x == 0.0:
+ be = edj.unit * self.shrink * point.vector.x
+ de = ay + be + ce
+ newvert = centre + de
+ self.verts.append(newvert)
+ for edjy in template.edges:
+ one = edjy.a.index + start
+ two = edjy.b.index + start
+ newedge = edge(self.verts[one], self.verts[two])
+ self.edges.append(newedge)
+ for facey in template.faces:
+ faceverts = []
+ for verty in facey.vertices:
+ index = verty.index + start
+ faceverts.append(self.verts[index])
+ newface = face(faceverts)
+ self.faces.append(newface)
+ self.vertedgeflag = 0
+ self.vertedgeflag = 0
+ self.connectivity()
+
+
+class hub(mesh):
+ def __init__(self, base, hubtype, width, height, length,
+ widthtog, heighttog, lengthtog, meshname):
+ mesh.__init__(self)
+ self.width = 1.0
+ self.height = 1.0
+ self.shrink = 1.0
+ # put in strut prep stuff here
+ extra_DBG_info("vefm L1037 HubMesh", "base is ", str(dir(base)) + "\n and meshname = " + meshname)
+ if hubtype is None:
+ return
+ total = 0
+ divvy = len(base.faces[0].edges)
+ for lengf in base.verts[0].edges:
+ lengf.vect.findlength()
+ total = total + lengf.vect.length
+ yardstick = total / divvy
+ if widthtog:
+ self.width = width
+ else:
+ self.width = width * yardstick
+ if heighttog:
+ self.height = height
+ else:
+ self.height = height * yardstick
+ if lengthtog:
+ self.shrink = length
+ else:
+ self.shrink = length * yardstick
+
+ if not base.facenormalflag:
+ for currentface in base.faces:
+ currentface.docorners()
+ currentface.findnormal()
+ base.facenormalflag = 1
+
+ for apex in base.verts:
+ apex.findnormal()
+ side = edge(apex.edges[0].a, apex.edges[0].b)
+ apex.unit = side.vect # PKHG is Vector: b - a
+ apex.unit.normalize()
+ apex.cross = crossp(apex.normal, apex.unit).docrossproduct()
+ apex.unit = crossp(apex.cross, apex.normal).docrossproduct()
+
+ template = importmesh(meshname, 0)
+ for apex in base.verts:
+ start = len(self.verts)
+ centre = apex
+ for point in template.verts:
+ ay = apex.normal * point.vector.z * self.height
+ ce = apex.cross * point.vector.y * self.width
+ be = apex.unit * point.vector.x * self.shrink
+ de = ay + be + ce
+ newvert = centre + de
+ self.verts.append(newvert)
+ for edjy in template.edges:
+ one = edjy.a.index + start
+ two = edjy.b.index + start
+ newedge = edge(self.verts[one], self.verts[two])
+ self.edges.append(newedge)
+ for facey in template.faces:
+ faceverts = []
+ for verty in facey.vertices:
+ index = verty.index + start
+ faceverts.append(self.verts[index])
+ newface = face(faceverts)
+ self.faces.append(newface)
+ self.vertedgeflag = 0
+ self.vertedgeflag = 0
+ self.connectivity()
+
+
+# ???PKHG TODO Nmesh used yet wrong!
+def finalfill(source, target):
+ if source == target: # PKHG: otherwise >infinite< loop
+ print("\n***WARNING*** vefm_271.finalfill L1104 source == target empty mesh used")
+ target = mesh()
+ # PKHG_??? maybe renumverting and checking faces with >=4 5 vertices?
+ count = 0
+
+ for point in source.verts:
+ newvert = vertex(point.vector)
+ newvert.index = count
+ target.verts.append(newvert)
+ point.index = count # PKHG_INFO source renumbered too!
+
+ count += 1
+
+ for facey in source.faces:
+ row = len(facey.vertices)
+ if row >= 5:
+ tmp = Vector()
+ for el in facey.vertices:
+ tmp = tmp + target.verts[el.index].vector
+ tmp = tmp / row
+ centre = vertex(tmp)
+ centre.index = count # PKHG_??? give it a good index
+ count += 1
+
+ target.verts.append(centre)
+ for i in range(row):
+ if i == row - 1:
+ a = target.verts[facey.vertices[-1].index]
+ b = target.verts[facey.vertices[0].index]
+ else:
+ a = target.verts[facey.vertices[i].index]
+ b = target.verts[facey.vertices[i + 1].index]
+ target.faces.append([a, b, centre])
+ else:
+ f = []
+
+ for j in range(len(facey.vertices)):
+ a = facey.vertices[j]
+ f.append(target.verts[a.index])
+
+ target.faces.append(f)