[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2097] trunk/py/scripts/addons/modules/ curve_utils.py: remove some 2d spesific functions, minor refactor

Campbell Barton ideasman42 at gmail.com
Wed Jul 6 08:46:37 CEST 2011


Revision: 2097
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2097
Author:   campbellbarton
Date:     2011-07-06 06:46:37 +0000 (Wed, 06 Jul 2011)
Log Message:
-----------
remove some 2d spesific functions, minor refactor

Modified Paths:
--------------
    trunk/py/scripts/addons/modules/curve_utils.py

Modified: trunk/py/scripts/addons/modules/curve_utils.py
===================================================================
--- trunk/py/scripts/addons/modules/curve_utils.py	2011-07-06 05:13:53 UTC (rev 2096)
+++ trunk/py/scripts/addons/modules/curve_utils.py	2011-07-06 06:46:37 UTC (rev 2097)
@@ -25,11 +25,6 @@
             ((l2[0] - pt[0]) * (l1[1] - pt[1])))
 
 
-def shell_angle_to_dist(angle):
-    from math import cos
-    return 1.0 if (angle < 0.0001) else abs(1.0 / cos(angle))
-
-
 def vis_curve_object():
     scene = bpy.data.scenes[0] # weak!
     cu = bpy.data.curves.new(name="Line", type='CURVE')
@@ -74,7 +69,6 @@
     if p3:
         spline = ob.data.splines.new(type='POLY')
         spline.points[0].co.xyz = p3.to_3d()
-        print(rad)
         if rad is not None:
             vis_circle_object(p3, rad)
 
@@ -137,7 +131,7 @@
 def points_to_bezier(points_orig,
                      double_limit=0.0001,
                      kink_tolerance=0.25,
-                     bezier_tolerance=0.1,  # error distance, scale dependant
+                     bezier_tolerance=0.02,  # error distance, scale dependant
                      subdiv=8,
                      angle_span=0.95,  # 1.0 tries to evaluate splines of 180d
                      ):
@@ -165,15 +159,7 @@
                 va = self.co - self.prev.co
                 vb = self.next.co - self.co
                 self.angle = va.angle(vb, 0.0)
-                
-                # XXX 2D
-                if line_point_side_v2(self.prev.co,
-                                      self.co,
-                                      self.next.co,
-                                      ) < 0.0:
 
-                    self.angle = -self.angle
-
         def angle_diff(self):
             """ use for detecting joints, detect difference in angle from
                 surrounding points.
@@ -186,21 +172,7 @@
                     return abs(self.angle - self.prev.angle) / math.pi
                 else:
                     return 0.0
-        
-        def angle_filter(self):
-            tot = 1
-            a = self.angle
-            if self.prev:
-                tot += 1
-                a += self.prev.angle
 
-            if self.next:
-                tot += 1
-                a += self.next.angle
-            
-            a = a / tot
-            return 0.0 if abs(a) < 0.01 else a
-        
         def calc_normal(self):
             v1 = v2 = None
             if self.prev and not self.prev.is_joint:
@@ -284,8 +256,8 @@
             self.calc_angle()
             self.calc_normal()
 
-        def total_angle(self):
-            return abs(sum((p.angle for p in self.points)))
+        #~ def total_angle(self):
+            #~ return abs(sum((p.angle for p in self.points)))
 
         def redistribute(self, segment_length, smooth=False):
             if len(self.points) == 1:
@@ -560,8 +532,6 @@
             fac_1 = intersect_point_line(p2_apex_co, p1.co, p1.co + l1_tan)[1] * fac_fac
             fac_2 = intersect_point_line(p1_apex_co, p2.co, p2.co + l2_tan)[1] * fac_fac
 
-            # TODO, scale the factors some useful way
-
             h1_fac = ((p1.co - p1_apex_co).length / 0.75) - fac_1
             h2_fac = ((p2.co - p2_apex_co).length / 0.75) - fac_2
 
@@ -579,14 +549,14 @@
             '''
             
 
-        def bezier_error(self):
+        def bezier_error(self, error_max=-1.0, test_count=8):
             from mathutils.geometry import interpolate_bezier
 
             test_points = interpolate_bezier(self.points[0].co.to_3d(),
                                              self.handle_left,
                                              self.handle_right,
                                              self.points[-1].co.to_3d(),
-                                             8,
+                                             test_count,
                                              )
 
             from mathutils.geometry import intersect_point_line
@@ -616,9 +586,15 @@
                             length_best = length
                             co_best = p_ix
                 
-                error += length_best
+                error += length_best / test_count
+                
+                if error_max != -1.0 and error > error_max:
+                    return True
 
-            return error
+            if error_max != -1.0:
+                return False
+            else:
+                return error
 
     class Curve(object):
         __slots__ = ("splines",
@@ -704,10 +680,8 @@
             s_prev = None
             iii = 0
             for s in self.splines:
-                print(iii)
                 assert(s.prev == s_prev)
                 if s_prev:
-                    print()
                     assert(s_prev.next == s)
                 s_prev = s
                 iii += 1
@@ -795,11 +769,7 @@
             base.select = True
 
             return cu
-            
-            
 
-
-
     points = list(points_orig)
     
     # remove doubles
@@ -823,39 +793,13 @@
     # return
     # curve.validate()
 
+    # higher quality but not really needed
+    '''
     curve.redistribute(segment_length / 4.0, smooth=True)
     curve.redistribute(segment_length, smooth=False)
+    '''
+    curve.redistribute(segment_length, smooth=True)
 
-    def swap_side(p):
-        angle = p.angle_filter()
-        if p.prev.prev is None:
-            swap_side.last = angle
-        else:
-            if (swap_side.last > 0.0) != (angle > 0.0):
-                if abs(p.angle) > 0.025:
-                    swap_side.last = p.angle
-                    return True
-
-        return False
-
-
-    #curve.split_func_map_point(lambda p: (p.angle_filter() >= 0) != \
-    #                              (p.prev.angle_filter() >= 0))
-    # curve.split_func_map_point(swap_side)
-
-
-    # now split based on total spline angle.
-    import math
-    angle_span_rad = angle_span * math.pi
-    curve.split_func_spline(lambda s:
-                                len(s.points) // 2
-                                if (s.total_angle() > angle_span_rad and
-                                    len(s.points) > 2)
-                                else -1,
-                            recursive=True,
-                            )
-
-
     # debug only!
     # to test how good the bezier spline fitting is without corrections
     
@@ -866,8 +810,9 @@
     # or recursively subdivide...
     curve.split_func_spline(lambda s:
                                 len(s.points) // 2
-                                if ((s.bezier_solve(), s.bezier_error())[1] >
-                                     bezier_tolerance) and (len(s.points))
+                                if ((s.bezier_solve(),
+                                     s.bezier_error(bezier_tolerance))[1]
+                                    and (len(s.points)))
                                 else -1,
                             recursive=True,
                             )
@@ -883,7 +828,6 @@
 
 
 if __name__ == "__main__":
-    print("A")
     bpy.ops.wm.open_mainfile(filepath="/root/curve_test1.blend")
     
     ob = bpy.data.objects["Curve"]



More information about the Bf-extensions-cvs mailing list