[Bf-extensions-cvs] [602025d7] master: implementation of adding spirals (add_curve_spirals) in edit mode

Spivak Vladimir cwolf3d noreply at git.blender.org
Sun Feb 17 02:09:53 CET 2019


Commit: 602025d7506e0d1806c86f3a21714050d8960664
Author: Spivak Vladimir (cwolf3d)
Date:   Sun Feb 17 03:07:56 2019 +0200
Branches: master
https://developer.blender.org/rBA602025d7506e0d1806c86f3a21714050d8960664

implementation of adding spirals (add_curve_spirals) in edit mode

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

M	add_curve_extra_objects/__init__.py
M	add_curve_extra_objects/add_curve_spirals.py

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

diff --git a/add_curve_extra_objects/__init__.py b/add_curve_extra_objects/__init__.py
index d7fbe2a4..1653ad86 100644
--- a/add_curve_extra_objects/__init__.py
+++ b/add_curve_extra_objects/__init__.py
@@ -247,10 +247,10 @@ def menu_func(self, context):
     layout = self.layout
 
     layout.operator_menu_enum("curve.curveaceous_galore", "ProfileType", icon='CURVE_DATA')
+    layout.operator_menu_enum("curve.spirals", "spiral_type", icon='CURVE_DATA')
     if context.mode != 'OBJECT':
         # fix in D2142 will allow to work in EDIT_CURVE
         return None
-    layout.operator_menu_enum("curve.spirals", "spiral_type", icon='CURVE_DATA')
     layout.separator()
 
     layout.menu(INFO_MT_curve_knots_add.bl_idname, text="Knots", icon='CURVE_DATA')
diff --git a/add_curve_extra_objects/add_curve_spirals.py b/add_curve_extra_objects/add_curve_spirals.py
index 7bb225d0..96eb8aba 100644
--- a/add_curve_extra_objects/add_curve_spirals.py
+++ b/add_curve_extra_objects/add_curve_spirals.py
@@ -24,6 +24,11 @@ from bpy.props import (
         BoolProperty,
         FloatProperty,
         IntProperty,
+        FloatVectorProperty
+        )
+from mathutils import (
+        Vector,
+        Matrix,
         )
 from math import (
         sin, cos, pi
@@ -58,7 +63,7 @@ def make_spiral(props, context):
     step_z = props.z_scale / (steps - 1)  # z increase in one step
 
     verts = []
-    verts.extend([props.radius, 0, 0, 1])
+    verts.append([props.radius, 0, 0])
 
     cur_phi = 0
     cur_z = 0
@@ -82,7 +87,7 @@ def make_spiral(props, context):
 
         px = cur_rad * cos(cur_phi)
         py = cur_rad * sin(cur_phi)
-        verts.extend([px, py, cur_z, 1])
+        verts.append([px, py, cur_z])
 
     return verts
 
@@ -104,7 +109,7 @@ def make_spiral_spheric(props, context):
     step_theta = pi / (steps - 1)  # theta increase in one step (pi == 180 deg)
 
     verts = []
-    verts.extend([0, 0, -props.radius, 1])  # First vertex at south pole
+    verts.append([0, 0, -props.radius])  # First vertex at south pole
 
     cur_phi = 0
     cur_theta = -pi / 2  # Beginning at south pole
@@ -115,7 +120,7 @@ def make_spiral_spheric(props, context):
         py = props.radius * cos(cur_theta) * sin(cur_phi)
         pz = props.radius * sin(cur_theta)
 
-        verts.extend([px, py, pz, 1])
+        verts.append([px, py, pz])
         cur_theta += step_theta
         cur_phi += step_phi
 
@@ -157,7 +162,7 @@ def make_spiral_torus(props, context):
               sin(props.curves_number * cur_theta)
         pz = cur_inner_rad * sin(cur_phi) + cur_z
 
-        verts.extend([px, py, pz, 1])
+        verts.append([px, py, pz])
 
         if props.touch and cur_phi >= n_cycle * 2 * pi:
             step_z = ((n_cycle + 1) * props.dif_inner_radius +
@@ -172,8 +177,50 @@ def make_spiral_torus(props, context):
 
     return verts
 
-
-def draw_curve(props, context):
+# ------------------------------------------------------------
+# calculates the matrix for the new object
+# depending on user pref
+
+def align_matrix(context, location):
+    loc = Matrix.Translation(location)
+    obj_align = context.preferences.edit.object_align
+    if (context.space_data.type == 'VIEW_3D' and
+            obj_align == 'VIEW'):
+        rot = context.space_data.region_3d.view_matrix.to_3x3().inverted().to_4x4()
+    else:
+        rot = Matrix()
+    align_matrix = loc @ rot
+
+    return align_matrix
+
+# ------------------------------------------------------------
+# get array of vertcoordinates according to splinetype
+def vertsToPoints(Verts, splineType):
+
+    # main vars
+    vertArray = []
+
+    # array for BEZIER spline output (V3)
+    if splineType == 'BEZIER':
+        for v in Verts:
+            vertArray += v
+
+    # array for nonBEZIER output (V4)
+    else:
+        for v in Verts:
+            vertArray += v
+            if splineType == 'NURBS':
+                # for nurbs w=1
+                vertArray.append(1)
+            else:
+                # for poly w=0
+                vertArray.append(0)
+    return vertArray
+
+def draw_curve(props, context, align_matrix):
+    # output splineType 'POLY' 'NURBS' 'BEZIER'
+    splineType = props.curve_type
+    
     if props.spiral_type == 'ARCH':
         verts = make_spiral(props, context)
     if props.spiral_type == 'LOG':
@@ -183,22 +230,44 @@ def draw_curve(props, context):
     if props.spiral_type == 'TORUS':
         verts = make_spiral_torus(props, context)
 
-    curve_data = bpy.data.curves.new(name='Spiral', type='CURVE')
-    curve_data.dimensions = '3D'
-
-    spline = curve_data.splines.new(type=props.curve_type)
-    """
-    if props.curve_type == 0:
-        spline = curve_data.splines.new(type='POLY')
-    elif props.curve_type == 1:
-        spline = curve_data.splines.new(type='NURBS')
-    """
-    spline.points.add(len(verts) * 0.25 - 1)
-    # Add only one quarter of points as elements in verts,
-    # because verts looks like: "x,y,z,?,x,y,z,?,x,..."
-    spline.points.foreach_set('co', verts)
-    new_obj = object_data_add(context, curve_data)
-
+    # create object
+    if bpy.context.mode == 'EDIT_CURVE':
+        Curve = context.active_object
+        spline = Curve.data.splines.new(type=splineType)          # spline
+    else:
+        # create curve
+        newCurve = bpy.data.curves.new(name='Spiral', type='CURVE')  # curvedatablock
+        spline = newCurve.splines.new(type=splineType)          # spline
+
+        # set curveOptions
+        newCurve.dimensions = props.shape
+        
+        # create object with newCurve
+        Curve = object_data_add(context, newCurve)  # place in active scene
+        Curve.select_set(True)
+        
+    Curve.matrix_world = align_matrix  # apply matrix
+    Curve.rotation_euler = props.rotation_euler
+        
+    # set curveOptions
+    spline.use_cyclic_u = props.use_cyclic_u
+    spline.use_endpoint_u = props.endp_u
+    spline.order_u = props.order_u
+    
+    # turn verts into array
+    vertArray = vertsToPoints(verts, splineType)
+        
+    # create spline from vertarray
+    if splineType == 'BEZIER':
+        spline.bezier_points.add(int(len(vertArray) * 0.33))
+        spline.bezier_points.foreach_set('co', vertArray)
+        for point in spline.bezier_points:
+            point.handle_right_type = props.handleType
+            point.handle_left_type = props.handleType
+    else:
+        spline.points.add(int(len(vertArray) * 0.25 - 1))
+        spline.points.foreach_set('co', vertArray)
+        spline.use_endpoint_u = False
 
 class CURVE_OT_spirals(Operator):
     bl_idname = "curve.spirals"
@@ -206,6 +275,9 @@ class CURVE_OT_spirals(Operator):
     bl_description = "Create different types of spirals"
     bl_options = {'REGISTER', 'UNDO', 'PRESET'}
 
+    # align_matrix for the invoke
+    align_matrix : Matrix()
+    
     spiral_type : EnumProperty(
             items=[('ARCH', "Archemedian", "Archemedian"),
                    ("LOG", "Logarithmic", "Logarithmic"),
@@ -215,13 +287,6 @@ class CURVE_OT_spirals(Operator):
             name="Spiral Type",
             description="Type of spiral to add"
             )
-    curve_type : EnumProperty(
-            items=[('POLY', "Poly", "PolyLine"),
-                   ("NURBS", "NURBS", "NURBS")],
-            default='POLY',
-            name="Curve Type",
-            description="Type of spline to use"
-            )
     spiral_direction : EnumProperty(
             items=[('COUNTER_CLOCKWISE', "Counter Clockwise",
                     "Wind in a counter clockwise direction"),
@@ -295,6 +360,62 @@ class CURVE_OT_spirals(Operator):
             default=False,
             description="No empty spaces between cycles"
             )
+    # Curve Options
+    shapeItems = [
+        ('2D', "2D", "2D shape Curve"),
+        ('3D', "3D", "3D shape Curve")]
+    shape : EnumProperty(
+            name="2D / 3D",
+            items=shapeItems,
+            description="2D or 3D Curve",
+            default='3D'
+            )
+    curve_type : EnumProperty(
+            name="Output splines",
+            description="Type of splines to output",
+            items=[
+            ('POLY', "Poly", "Poly Spline type"),
+            ('NURBS', "Nurbs", "Nurbs Spline type"),
+            ('BEZIER', "Bezier", "Bezier Spline type")],
+            default='POLY'
+            )
+    use_cyclic_u : BoolProperty(
+            name="Cyclic",
+            default=False,
+            description="make curve closed"
+            )
+    endp_u : BoolProperty(
+            name="Use endpoint u",
+            default=True,
+            description="stretch to endpoints"
+            )
+    order_u : IntProperty(
+            name="Order u",
+            default=4,
+            min=2, soft_min=2,
+            max=6, soft_max=6,
+            description="Order of nurbs spline"
+            )
+    handleType : EnumProperty(
+            name="Handle type",
+            default='VECTOR',
+            description="Bezier handles type",
+            items=[
+            ('VECTOR', "Vector", "Vector type Bezier handles"),
+            ('AUTO', "Auto", "Automatic type Bezier handles")]
+            )
+    startlocation : FloatVectorProperty(
+            name="",
+            description="Start location",
+            default=(0.0, 0.0, 0.0),
+            subtype='TRANSLATION'
+            )
+    rotation_euler : FloatVectorProperty(
+            name="",
+            description="Rotation",
+            default=(0.0, 0.0, 0.0),
+            subtype='EULER'
+            )
 
     def draw(self, context):
         layout = self.layout
@@ -305,12 +426,11 @@ class CURVE_OT_spirals(Operator):
         row = col.row(align=True)
         row.menu("OBJECT_MT_spiral_curve_presets",
                  text=bpy.types.OBJECT_MT_spiral_curve_presets.bl_label)
-        row.operator("curve_extras.spiral_presets", text="")
-        op = row.operator("curve_extras.spiral_presets", text="")
+        row.operator("curve_extras.spiral_presets", text=" + ")
+        op = row.operator("curve_extras.spiral_presets", text=" - ")
         op.remove_active = True
 
         layout.prop(self, "spiral_type")
-  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list