[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