[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2402] branches/geodesic_domes/ geodesic_dome/vefm259.py: my first tries of vefm upgrade to 259
Peter K.H. Gragert
pkhgragert at gmail.com
Sun Oct 9 13:53:20 CEST 2011
Revision: 2402
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2402
Author: pkhg
Date: 2011-10-09 11:53:20 +0000 (Sun, 09 Oct 2011)
Log Message:
-----------
my first tries of vefm upgrade to 259
Added Paths:
-----------
branches/geodesic_domes/geodesic_dome/vefm259.py
Added: branches/geodesic_domes/geodesic_dome/vefm259.py
===================================================================
--- branches/geodesic_domes/geodesic_dome/vefm259.py (rev 0)
+++ branches/geodesic_domes/geodesic_dome/vefm259.py 2011-10-09 11:53:20 UTC (rev 2402)
@@ -0,0 +1,1223 @@
+## vert class and overloading experiments
+import bpy
+import math
+from math import sqrt,acos,pi,sin,cos,atan,tan,fabs
+#from Blender import NMesh
+from mathutils import Vector
+dbg = True
+sgn = lambda x : (x>0) - (x<0) #missing signum functin in Python
+breakpoint = bpy.types.bp.bp
+
+class vertex:
+
+ def __init__(self,vec=(0,0,0)): #x=0,y=0,z=0):
+
+ self.vector = Vector(vec)
+ self.x = vec[0]
+ self.y = vec[1]
+ self.z = vec[2]
+ self.length = self.vector.length
+ self.index = 0
+ self.normal = 0
+ self.edges = []
+ self.faces = []
+ self.boundary = 0
+ if dbg:
+ print("dbg: vertex generate with length = ",self.length)
+
+
+ def findlength(self):
+
+# self.length=sqrt(self.x*self.x+self.y*self.y+self.z*self.z)
+ 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.x = self.vector[0] #(1.0/self.length)
+ self.y = self.vector[1] #(1.0/self.length)
+ self.z = self.vector[2] #(1.0/self.length)
+ self.length = 1.0
+
+ def findnormal(self):
+ target = []
+ if self.faces[:] == []:
+ print("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*** lenght zero in findnormal")
+ self.normal.normalize()
+
+ def clockwise(self):
+ 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):
+ x = self.x+other.x
+ y = self.y+other.y
+ z = self.z+other.z
+ return vertex((x,y,z))
+
+ def __sub__(self,other):
+ x = self.x-other.x
+ y = self.y-other.y
+ z = self.z-other.z
+ return vertex((x,y,z))
+
+ def __mul__(self,other):
+ x = self.x*other
+ y = self.y*other
+ z = self.z*other
+ return vertex((x,y,z))
+
+ def __div__(self,other):
+ tmp = 1.0/other
+ x = self.x*tmp#(1/other)
+ y = self.y*tmp#(1/other)
+ z = self.z*tmp#(1/other)
+ return vertex((x,y,z))
+
+ def negative(self):
+ return vertex((-self.x,-self.y,-self.z))
+
+class crossp:
+ ## Takes in two vertices(vectors), returns the cross product.
+ def __init__(self,v1,v2):
+ self.v1 = v1
+ self.v2 = v2
+ # self.docrossproduct(v1,v2)
+#
+ def docrossproduct(self):
+ tmp = self.v1.vector.cross(self.v2.vector)
+# x = (self.v1.y*self.v2.z)-(self.v2.y*self.v1.z)
+# y = (self.v1.z*self.v2.x)-(self.v2.z*self.v1.x)
+# z = (self.v1.x*self.v2.y)-(self.v2.x*self.v1.y)
+# return vertex(x,y,z)
+ 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
+ # self.centroid()
+
+ def centroid(self):
+# x = y = z = 0
+ tmp = Vector()
+ divisor = 1.0 / len(self.vertlist)
+ for vert in self.vertlist:
+ tmp += vert.vector
+# x=x+vert.x
+# y=y+vert.y
+# z=z+vert.z
+ tmp *= divisor
+# return vertex(x/divisor,y/divisor,z/divisor)
+ #return vertex(tmp[0],tmp[1],tmp[2])
+ 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
+ self.vectb = 0
+# self.length = 0
+ self.boundary = 0
+ self.findvect()
+# print("vect len before",self.vect.length)
+ self.findlength()
+# print("vect after",self.vect.length)
+
+ def findvect(self):
+ self.vect = self.b-self.a
+ self.vectb = self.a-self.b
+
+ def findlength(self):
+ #print("in edge findlength")
+ 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()
+# def findother(self,vertindex):
+#
+# if vertindex==self.a:
+#
+# return self.b
+#
+# else:
+# return self.a
+## different classes for 3,4,> sides??
+class face:
+ def __init__(self,vertices=[]):
+ print("\ndbg face vertices = ",vertices)
+ 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):
+ # print("dp ",v1.x,v1.y,v1.z," ",v2.x,v2.y,v2.z)
+ # print("v1 length",v1.length)
+ # print("v2 length",v2.length)
+
+ v1.findlength()
+ v2.findlength()
+ if v1.length == 0 or v2.length == 0:
+ print("\nPKHG warning, =========== at least one zero vector 0.0 used")
+ return 0.0
+ # print("v1 length",v1.length)
+ # print("v2 length",v2.length)
+ dot=(v1.x*v2.x)+(v1.y*v2.y)+(v1.z*v2.z)
+ costheta=dot/(v1.length*v2.length)
+ pkhgtmp = v1.vector.dot(v2.vector)
+ tmp = acos(costheta)
+ print("dbg 204 dotprod in face",dot,pkhgtmp,tmp)
+ return tmp
+
+ def orderedges(self):
+ print("\n-----------------dbg 212 orderedeges called")
+ 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]
+ #corner = current
+ print("dbg current = ", current,self.edges[:])
+ rightedge = None
+ leftedge = None
+ for edge in self.edges:
+ print(edge.a, edge.a is current)
+ 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
+ #breakpoint(locals())
+ corner.append(rightedge)
+ corner.append(leftedge)
+ # print("corner stuff vert",current.index,"rightedge",rightedge.index,"leftedge",leftedge.index)
+ # print("corner",corner)
+ dotty=self.dotproduct(rightvect,leftvect)
+ corner.append(dotty)
+ # print("corner",corner)
+ self.corners.append(corner)
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list