[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3749] branches/protopipe: joint factory and working model alignment

Aurel W aurel.w at gmail.com
Sun Sep 16 20:44:34 CEST 2012


Revision: 3749
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3749
Author:   aurel
Date:     2012-09-16 18:44:33 +0000 (Sun, 16 Sep 2012)
Log Message:
-----------
joint factory and working model alignment

Modified Paths:
--------------
    branches/protopipe/__init__.py
    branches/protopipe/jointproto.py
    branches/protopipe/tests.py

Modified: branches/protopipe/__init__.py
===================================================================
--- branches/protopipe/__init__.py	2012-09-16 12:49:35 UTC (rev 3748)
+++ branches/protopipe/__init__.py	2012-09-16 18:44:33 UTC (rev 3749)
@@ -16,6 +16,10 @@
 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
 
+# to properly import numpy
+import sys
+sys.path.append('/usr/lib/python3/dist-packages')
+
 bl_info = {
     "name": "ProtoPipe",
     "author": "Aurel Wildfellner",
@@ -26,23 +30,26 @@
     "warning": "",
     "wiki_url": "http://wiki.blender.org/index.php/Dev:2.6/",
     "tracker_url": "",
-    "category": "Object"}
+    "category": "Object"
+}
 
 
 
 if "bpy" in locals():
     import imp
-    imp.reload(protopipe)
+    imp.reload(ppapp)
 else:
-    from . import *
+    from . import ppapp
 
 
 def register():
-    pass
+    ppapp.loadLibs()
 
+
 def unregister():
     pass
 
+
 if __name__ == "__main__":
     register()
 

Modified: branches/protopipe/jointproto.py
===================================================================
--- branches/protopipe/jointproto.py	2012-09-16 12:49:35 UTC (rev 3748)
+++ branches/protopipe/jointproto.py	2012-09-16 18:44:33 UTC (rev 3749)
@@ -15,6 +15,8 @@
 # along with this program; if not, write to the Free Software Foundation,
 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
+import sys
+sys.path.append('/usr/lib/python3/dist-packages')
 
 import bpy
 import bmesh
@@ -24,6 +26,7 @@
 import numpy
 import itertools
 
+
 class JointProto:
 
     """
@@ -51,14 +54,19 @@
         self.jointLengthsOut = []
         self.diameter = -1
         self.name = "Unnamed Joint Prototype"
+        self.model = None
         pass
 
 
-    def setName(self, name)
+    def setName(self, name):
         self.name = name
 
 
-    def setDiameter(self, diameter)
+    def setModel(self, model):
+        self.model = model
+
+
+    def setDiameter(self, diameter):
         self.diameter = diameter
 
 
@@ -115,6 +123,7 @@
             return False
         if descriptor.diameter != self.diameter:
             return False
+        return True
 
 
     def registerDescriptor(self, descriptor):
@@ -127,6 +136,7 @@
           right transformation.
         """
         if not self.quickDescriptorCheck(descriptor):
+            print ("quick descritpr check failed")
             return (False, None)
 
         # the prototype matrix
@@ -135,7 +145,8 @@
         descriptor_mat = self.buildJointVectorMatrix(descriptor.jointVectors)
 
         # try all possible pairings until a fit is found
-        for md in itertools.permutation(descriptor_mat):
+        for md in itertools.permutations(descriptor_mat):
+            print("permutation...")
             ### calculate the optimal superposition for the pairing ###
             correlation_mat = numpy.dot ( numpy.transpose(mp), md)
             v, s, w_tr = numpy.linalg.svd(correlation_mat)
@@ -152,13 +163,19 @@
                     math.acos(numpy.dot(v0, v1)),
                     r_vecs, mp)
 
+            deviation_error = False
             for angle in deviation_angles:
                 # A threshhold of how the model is alowed to deviate from
                 # the descritor, continue with next permutation if error
                 # is too high.
                 if angle > 0.01:
-                    continue # with permutation
+                    print("deviation angle too high")
+                    deviation_error = True
+                    break
 
+            if deviation_error:
+                continue # with permutation
+
             # everything is fine and aligned
             return (True, rot_mat)
 
@@ -180,33 +197,107 @@
 
 
 
-class ProtoDescriptor:
+class JointDescriptor:
 
-    def __init__():
+    def __init__(self):
         self.jointVectors = []
         self.diameter = -1
 
 
     def buildFromVert(self, bm, vertIndex):
         """
-        Builds a JointDescripor at the vertex of a mesh.
+        Builds a JointDescriptor at the vertex of a mesh.
 
         bm -- A BMesh.
         vertIndex -- The index of the vertex to build the descriptor. 
         """
 
         vc = bm.verts[vertIndex]
-        for edge in vc.edges:
+        for edge in vc.link_edges:
             if edge.verts[0] == vc:
                 vec = edge.verts[1].co - vc.co
             else:
                 vec = edge.verts[0].co - vc.co
 
-            jointVectors.append(vec.normalized)
+            self.jointVectors.append(vec.normalized())
 
 
-    def setDiameter(self, diameter)
+    def setDiameter(self, diameter):
         """ only one global diameter for now """
         self.diameter = diameter
 
 
+class JointProtoProvider:
+
+    def __init__(self):
+        pass
+
+    def search(self, descriptor):
+        pass
+
+
+
+
+class ProtoLibrary(JointProtoProvider):
+
+    def __init__(self):
+        super().__init__()
+        self.name = "none"
+        self.protos = []
+        pass
+
+    def loadFromBlendFile(self, fpath):
+        # import external scene
+        with bpy.data.libraries.load(fpath) as (ext_data, int_data):
+            for scenename in ext_data.scenes:
+                if scenename[:3] == "pp_":
+                    self.name = scenename
+            # append
+            if not self.name in int_data.scenes:
+                int_data.scenes = [self.name]
+
+        # scan the scene for prototype objects
+        objects = bpy.data.scenes[self.name].objects
+        for pobj in objects:
+            tname = pobj.name.split('.')[0]
+            # is it a prototype?
+            if tname[:3] == "pp_" and tname[-5:] == "proto":
+                jproto = JointProto()
+                jproto.buildFromMeshProto(pobj.data)
+                jproto.setName(tname[3:-6])
+                # find a model and assign it
+                modelName = tname[:-5] + "model"
+                if modelName in objects:
+                    jproto.setModel(objects[modelName])
+                # append to lib
+                self.protos.append(jproto)
+
+
+    def search(self, descriptor):
+        super().search(descriptor)
+        isreg = False
+        for jproto in self.protos:
+            (isreg, rot_mat) = jproto.registerDescriptor(descriptor)
+
+        if isreg:
+            return (True, rot_mat, jproto)
+        else:
+            return (False, None, None)
+
+
+
+
+class JointFactory:
+
+    def __init__(self):
+        self.providers = []
+
+    def getProto(self, desc):
+        for provider in self.providers:
+            (isreg, rot_mat, jproto) = provider.search(desc)
+            if isreg:
+                return (True, rot_mat, jproto)
+
+    def addJointProtoProvider(self, provider):
+        self.providers.append(provider)
+

Modified: branches/protopipe/tests.py
===================================================================
--- branches/protopipe/tests.py	2012-09-16 12:49:35 UTC (rev 3748)
+++ branches/protopipe/tests.py	2012-09-16 18:44:33 UTC (rev 3749)
@@ -4,12 +4,41 @@
 from mathutils import *
 
 from protopipe.jointproto import JointProto
+from protopipe.jointproto import JointDescriptor
+from protopipe.jointproto import ProtoLibrary
 
+jp = JointProto()
+desc = None
+lib = None
 
 def findCenter():
-    jp = JointProto()
+    global jb
     bm = bmesh.new()
     bm.from_object(bpy.context.active_object)
     idx = jp.findCenter(bm)
     print("The index of the center: ", idx)
 
+
+def buildProto():
+    jp.buildFromMeshProto(bpy.context.active_object.data)
+
+def descriptor(idx=2):
+    global desc
+    desc = JointDescriptor()
+    bm = bmesh.new()
+    bm.from_object(bpy.context.active_object)
+    desc.buildFromVert(bm, idx)
+
+def register():
+    (valid, m) = jp.registerDescriptor(desc)
+    if valid:
+        print("Registered! ")
+        print(m)
+    else:
+        print("NOT Registered!")
+
+def libload():
+    global lib
+    lib = ProtoLibrary()
+    lib.loadFromBlendFile("/home/aurel/pvclib.blend")
+



More information about the Bf-extensions-cvs mailing list