[Bf-extensions-cvs] [7590421] master: Move modules into 'space_view3d_cursor_control' addon

Campbell Barton noreply at git.blender.org
Tue Feb 10 14:36:16 CET 2015


Commit: 7590421902cba29e6147985678a2a1da510a845c
Author: Campbell Barton
Date:   Wed Feb 11 00:33:53 2015 +1100
Branches: master
https://developer.blender.org/rBAC7590421902cba29e6147985678a2a1da510a845c

Move modules into 'space_view3d_cursor_control' addon

These were meant to be generic but ended up being a fairly small set of modules only used by this addon.

===================================================================

A	space_view3d_cursor_control/constants_utils.py
A	space_view3d_cursor_control/cursor_utils.py
M	space_view3d_cursor_control/data.py
A	space_view3d_cursor_control/geometry_utils.py
M	space_view3d_cursor_control/history.py
A	space_view3d_cursor_control/misc_utils.py
M	space_view3d_cursor_control/operators.py
M	space_view3d_cursor_control/ui.py
A	space_view3d_cursor_control/ui_utils.py

===================================================================

diff --git a/space_view3d_cursor_control/constants_utils.py b/space_view3d_cursor_control/constants_utils.py
new file mode 100644
index 0000000..153553e
--- /dev/null
+++ b/space_view3d_cursor_control/constants_utils.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+"""
+    constants_utils.py
+
+    Useful constants...
+    
+
+
+"""
+
+
+
+# Golden mean
+PHI_INV = 0.61803398874989484820
+PHI     = 1.61803398874989484820
+PHI_SQR = 2.61803398874989484820
diff --git a/space_view3d_cursor_control/cursor_utils.py b/space_view3d_cursor_control/cursor_utils.py
new file mode 100644
index 0000000..b2f4ca0
--- /dev/null
+++ b/space_view3d_cursor_control/cursor_utils.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+"""
+    cursor_utils.py
+
+    Helper methods for accessing the 3D cursor
+    
+    
+
+"""
+
+
+import bpy
+
+
+class CursorAccess:
+
+    @classmethod
+    def findSpace(cls):
+        area = None
+        for area in bpy.data.window_managers[0].windows[0].screen.areas:
+            if area.type == 'VIEW_3D':
+                break
+        if area.type != 'VIEW_3D':
+            return None
+        for space in area.spaces:
+            if space.type == 'VIEW_3D':
+                break
+        if space.type != 'VIEW_3D':
+            return None
+        return space
+
+    @classmethod
+    def setCursor(cls,coordinates):
+        spc = cls.findSpace()
+        spc.cursor_location = coordinates
+
+    @classmethod
+    def getCursor(cls):
+        spc = cls.findSpace()
+        return spc.cursor_location
diff --git a/space_view3d_cursor_control/data.py b/space_view3d_cursor_control/data.py
index fcd82d1..2a7106b 100644
--- a/space_view3d_cursor_control/data.py
+++ b/space_view3d_cursor_control/data.py
@@ -42,11 +42,11 @@ import bgl
 import math
 from mathutils import Vector, Matrix
 from mathutils import geometry
-from misc_utils import *
-from constants_utils import *
-from cursor_utils import *
-from ui_utils import *
-from geometry_utils import *
+from .misc_utils import *
+from .constants_utils import *
+from .cursor_utils import *
+from .ui_utils import *
+from .geometry_utils import *
 
 
 PRECISION = 4
diff --git a/space_view3d_cursor_control/geometry_utils.py b/space_view3d_cursor_control/geometry_utils.py
new file mode 100644
index 0000000..163d2b7
--- /dev/null
+++ b/space_view3d_cursor_control/geometry_utils.py
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+"""
+    geometry_utils.py
+
+    3d geometry calculations
+    
+    
+
+"""
+
+
+from mathutils import Vector, Matrix
+from mathutils import geometry
+
+
+# 3D Geometry
+class G3:
+
+    @classmethod
+    def distanceP2P(cls, p1, p2):
+        return (p1-p2).length
+
+    @classmethod
+    def closestP2L(cls, p, l1, l2):
+        vA = p - l1
+        vL = l2- l1
+        vL.normalize()
+        return vL * (vL.dot(vA)) + l1
+
+    @classmethod
+    def closestP2E(cls, p, e1, e2):
+        q = G3.closestP2L(p, e1, e2)
+        de = G3.distanceP2P(e1, e2)
+        d1 = G3.distanceP2P(q, e1)
+        d2 = G3.distanceP2P(q, e2)
+        if d1>de and d1>d2:
+            q = e2
+        if d2>de and d2>d1:
+            q = e1
+        return q
+
+    @classmethod
+    def heightP2S(cls, p, sO, sN):
+        return (p-sO).dot(sN) / sN.dot(sN)
+
+    @classmethod
+    def closestP2S(cls, p, sO, sN):
+        k = - G3.heightP2S(p, sO, sN)
+        q = p+sN*k
+        return q
+
+    @classmethod
+    def closestP2F(cls, p, fv, sN):
+        q = G3.closestP2S(p, fv[0], sN)
+        #pi = MeshEditor.addVertex(p)
+        #qi = MeshEditor.addVertex(q)
+        #MeshEditor.addEdge(pi, qi)
+        #print ([d0,d1,d2])
+        
+        if len(fv)==3:
+            h = G3.closestP2L(fv[0], fv[1], fv[2])
+            d = (fv[0]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[1], fv[2])
+            h = G3.closestP2L(fv[1], fv[2], fv[0])
+            d = (fv[1]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[2], fv[0])
+            h = G3.closestP2L(fv[2], fv[0], fv[1])
+            d = (fv[2]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[0], fv[1])
+            return q
+        if len(fv)==4:
+            h = G3.closestP2L(fv[0], fv[1], fv[2])
+            d = (fv[0]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[1], fv[2])
+            h = G3.closestP2L(fv[1], fv[2], fv[3])
+            d = (fv[1]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[2], fv[3])
+            h = G3.closestP2L(fv[2], fv[3], fv[0])
+            d = (fv[2]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[3], fv[0])
+            h = G3.closestP2L(fv[3], fv[0], fv[1])
+            d = (fv[3]-h).dot(q-h)
+            if d<=0:
+                return G3.closestP2E(q, fv[0], fv[1])
+            return q
+
+    @classmethod
+    def medianTriangle(cls, vv):
+        m0 = (vv[1]+vv[2])/2
+        m1 = (vv[0]+vv[2])/2
+        m2 = (vv[0]+vv[1])/2
+        return [m0, m1, m2]
+
+    @classmethod
+    def orthoCenter(cls, fv):
+        try:
+            h0 = G3.closestP2L(fv[0], fv[1], fv[2])
+            h1 = G3.closestP2L(fv[1], fv[0], fv[2])
+            #h2 = G3.closestP2L(fm[2], fm[0], fm[1])
+            return geometry.intersect_line_line (fv[0], h0, fv[1], h1)[0]
+        except(RuntimeError, TypeError):
+            return None
+
+    # Poor mans approach of finding center of circle
+    @classmethod
+    def circumCenter(cls, fv):
+        fm = G3.medianTriangle(fv)
+        return G3.orthoCenter(fm)
+
+    @classmethod
+    def ThreePnormal(cls, fv):
+        n = (fv[1]-fv[0]).cross(fv[2]-fv[0])
+        n.normalize()
+        return n
+
+    @classmethod
+    def closestP2CylinderAxis(cls, p, fv):
+        n = G3.ThreePnormal(fv)
+        c = G3.circumCenter(fv)
+        if(c==None):
+            return None
+        return G3.closestP2L(p, c, c+n)
+
+    # Poor mans approach of finding center of sphere
+    @classmethod
+    def centerOfSphere(cls, fv):
+        try:
+            if len(fv)==3:
+                return G3.circumCenter(fv) # Equator
+            if len(fv)==4:
+                fv3 = [fv[0],fv[1],fv[2]]
+                c1 = G3.circumCenter(fv)
+                n1 = G3.ThreePnormal(fv)
+                fv3 = [fv[1],fv[2],fv[3]]
+                c2 = G3.circumCenter(fv3)
+                n2 = G3.ThreePnormal(fv3)
+                d1 = c1+n1
+                d2 = c2+n2
+                return geometry.intersect_line_line (c1, d1, c2, d2)[0]
+        except(RuntimeError, TypeError):
+            return None
+
+    @classmethod
+    def closestP2Sphere(cls, p, fv):
+        #print ("G3.closestP2Sphere")
+        try:
+            c = G3.centerOfSphere(fv)
+            if c==None:
+                return None
+            pc = p-c
+            if pc.length == 0:
+                pc = pc + Vector((1,0,0))
+            else:
+                pc.normalize()
+            return c + (pc * G3.distanceP2P(c, fv[0]))
+        except(RuntimeError, TypeError):
+            return None
+
+    @classmethod
+    def closestP2Cylinder(cls, p, fv):
+        #print ("G3.closestP2Sphere")
+        c = G3.closestP2CylinderAxis(p, fv)
+        if c==None:
+            return None
+        r = (fv[0] - G3.centerOfSphere(fv)).length
+        pc = p-c
+        if pc.length == 0:
+            pc = pc + Vector((1,0,0))
+        else:
+            pc.normalize()
+        return c + (pc * r)
+
+    #@classmethod
+    #def closestP2Sphere4(cls, p, fv4):
+        ##print ("G3.closestP2Sphere")
+        #fv = [fv4[0],fv4[1],fv4[2]]
+        #c1 = G3.circumCenter(fv)
+        #n1 = G3.ThreePnormal(fv)
+        #fv = [fv4[1],fv4[2],fv4[3]]
+        #c2 = G3.circumC

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list