[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