[Bf-extensions-cvs] [a3ff3b98] master: The implementation of the function of changing the parameters of the object after creation. Function added to context menu (Change Gear and WormGear).

Spivak Vladimir cwolf3d noreply at git.blender.org
Sun Apr 21 17:18:32 CEST 2019


Commit: a3ff3b982f372652ccfd3cf4a1d96c5295677e62
Author: Spivak Vladimir (cwolf3d)
Date:   Sun Apr 21 18:16:20 2019 +0300
Branches: master
https://developer.blender.org/rBAa3ff3b982f372652ccfd3cf4a1d96c5295677e62

The implementation of the function of changing the parameters of the object after creation.
Function added to context menu (Change Gear and WormGear).

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

M	add_mesh_extra_objects/__init__.py
M	add_mesh_extra_objects/add_mesh_gears.py

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

diff --git a/add_mesh_extra_objects/__init__.py b/add_mesh_extra_objects/__init__.py
index 6f5c575b..13813d88 100644
--- a/add_mesh_extra_objects/__init__.py
+++ b/add_mesh_extra_objects/__init__.py
@@ -254,6 +254,45 @@ def menu_func(self, context):
     lay_out.operator("object.parent_to_empty",
                     text="Parent To Empty")
 
+def Extras_contex_menu(self, context):
+    bl_label = 'Change'
+    
+    obj = context.object
+    layout = self.layout
+    
+    if 'Gear' in obj.keys():
+        props = layout.operator("mesh.primitive_gear", text="Change Gear")
+        props.change = True
+        props.delete = obj.name
+        props.startlocation = obj.location
+        props.number_of_teeth = obj["number_of_teeth"]
+        props.radius = obj["radius"]
+        props.addendum = obj["addendum"]
+        props.dedendum = obj["dedendum"]
+        props.base = obj["base"]
+        props.angle = obj["angle"]
+        props.width = obj["width"]
+        props.skew = obj["skew"]
+        props.conangle = obj["conangle"]
+        props.crown = obj["crown"]
+        layout.separator()
+
+    if 'WormGear' in obj.keys():
+        props = layout.operator("mesh.primitive_worm_gear", text="Change WormGear")
+        props.change = True
+        props.delete = obj.name
+        props.startlocation = obj.location
+        props.number_of_teeth = obj["number_of_teeth"]
+        props.number_of_rows = obj["number_of_rows"]
+        props.radius = obj["radius"]
+        props.addendum = obj["addendum"]
+        props.dedendum = obj["dedendum"]
+        props.angle = obj["angle"]
+        props.row_height = obj["row_height"]
+        props.skew = obj["skew"]
+        props.crown = obj["crown"]
+        layout.separator()
+
 # Register
 classes = [
     VIEW3D_MT_mesh_vert_add,
@@ -302,12 +341,14 @@ def register():
     for cls in classes:
         register_class(cls)
 
-    # Add "Extras" menu to the "Add Mesh" menu
+    # Add "Extras" menu to the "Add Mesh" menu and context menu.
     bpy.types.VIEW3D_MT_mesh_add.append(menu_func)
+    bpy.types.VIEW3D_MT_object_context_menu.prepend(Extras_contex_menu)
 
 
 def unregister():
-    # Remove "Extras" menu from the "Add Mesh" menu.
+    # Remove "Extras" menu from the "Add Mesh" menu and context menu.
+    bpy.types.VIEW3D_MT_object_context_menu.remove(Extras_contex_menu)
     bpy.types.VIEW3D_MT_mesh_add.remove(menu_func)
     
     from bpy.utils import unregister_class
diff --git a/add_mesh_extra_objects/add_mesh_gears.py b/add_mesh_extra_objects/add_mesh_gears.py
index 6f5cc985..88552d01 100644
--- a/add_mesh_extra_objects/add_mesh_gears.py
+++ b/add_mesh_extra_objects/add_mesh_gears.py
@@ -10,8 +10,14 @@ from math import (
 from bpy.props import (
         FloatProperty,
         IntProperty,
+        BoolProperty,
+        StringProperty,
+        FloatVectorProperty
+        )
+from mathutils import (
+        Vector,
+        Matrix,
         )
-
 
 # Create a new mesh (object) from verts/edges/faces.
 # verts/edges/faces ... List of vertices/edges/faces for the
@@ -547,12 +553,67 @@ def add_worm(teethNum, rowNum, radius, Ad, De, p_angle,
 
     return verts, faces, vgroup_top, vgroup_valley
 
+#### Delete object
+def ObjectDelete(self, context, delete):
+
+    bpy.context.scene.update()
+    bpy.ops.object.mode_set(mode = 'OBJECT')
+    bpy.ops.object.delete()
+    bpy.context.scene.update()
+
+    return
+    
+##------------------------------------------------------------
+# 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
 
 class AddGear(Operator):
     bl_idname = "mesh.primitive_gear"
     bl_label = "Add Gear"
     bl_description = "Construct a gear mesh"
     bl_options = {'REGISTER', 'UNDO', 'PRESET'}
+    
+    # align_matrix for the invoke
+    align_matrix : Matrix()
+
+    Gear : BoolProperty(name = "Gear",
+                default = True,
+                description = "Gear")
+
+    #### change properties
+    name : StringProperty(name = "Name",
+                    description = "Name")
+
+    change : BoolProperty(name = "Change",
+                default = False,
+                description = "change Gear")
+
+    delete : StringProperty(name = "Delete",
+                    description = "Delete Gear")
+
+    startlocation : FloatVectorProperty(name = "",
+                description = "Start location",
+                default = (0.0, 0.0, 0.0),
+                subtype = 'XYZ')
+
+    rotation_euler : FloatVectorProperty(
+            name="",
+            description="Rotation",
+            default=(0.0, 0.0, 0.0),
+            subtype='EULER'
+            )
 
     number_of_teeth: IntProperty(name="Number of Teeth",
             description="Number of teeth on the gear",
@@ -645,7 +706,18 @@ class AddGear(Operator):
         box.prop(self, 'conangle')
         box.prop(self, 'crown')
 
+        box = layout.box()
+        box.label(text="Location:")
+        box.prop(self, "startlocation")
+        box = layout.box()
+        box.label(text="Rotation:")
+        box.prop(self, "rotation_euler")
+
     def execute(self, context):
+
+        if self.change:
+            ObjectDelete(self, context, self.delete)
+
         verts, faces, verts_tip, verts_valley = add_gear(
             self.number_of_teeth,
             self.radius,
@@ -661,6 +733,11 @@ class AddGear(Operator):
 
         # Actually create the mesh object from this geometry data.
         obj = create_mesh_object(context, verts, [], faces, "Gear")
+        
+        self.align_matrix = align_matrix(context, self.startlocation)
+        
+        obj.matrix_world = self.align_matrix  # apply matrix
+        obj.rotation_euler = self.rotation_euler
 
         # XXX, supporting adding in editmode is move involved
         if obj.mode != 'EDIT':
@@ -671,8 +748,34 @@ class AddGear(Operator):
             valleyGroup = obj.vertex_groups.new(name='Valleys')
             valleyGroup.add(verts_valley, 1.0, 'ADD')
 
+        obj["Gear"] = True
+        obj["change"] = False
+        obj["number_of_teeth"] = self.number_of_teeth
+        obj["radius"] = self.radius
+        obj["addendum"] = self.addendum
+        obj["dedendum"] = self.dedendum
+        obj["base"] = self.base
+        obj["angle"] = self.angle
+        obj["width"] = self.width
+        obj["skew"] = self.skew
+        obj["conangle"] = self.conangle
+        obj["crown"] = self.crown
+
         return {'FINISHED'}
 
+    ##### INVOKE #####
+    def invoke(self, context, event):
+        bpy.context.scene.update()
+        if self.change:
+            bpy.context.scene.cursor.location = self.startlocation
+        else:
+            self.startlocation = bpy.context.scene.cursor.location
+        
+        self.align_matrix = align_matrix(context, self.startlocation)
+
+        self.execute(context)
+
+        return {'FINISHED'}
 
 class AddWormGear(Operator):
     bl_idname = "mesh.primitive_worm_gear"
@@ -680,6 +783,36 @@ class AddWormGear(Operator):
     bl_description = "Construct a worm gear mesh"
     bl_options = {'REGISTER', 'UNDO', 'PRESET'}
 
+    # align_matrix for the invoke
+    align_matrix : Matrix()
+
+    WormGear : BoolProperty(name = "WormGear",
+                default = True,
+                description = "WormGear")
+
+    #### change properties
+    name : StringProperty(name = "Name",
+                    description = "Name")
+
+    change : BoolProperty(name = "Change",
+                default = False,
+                description = "change WormGear")
+
+    delete : StringProperty(name = "Delete",
+                    description = "Delete WormGear")
+
+    startlocation : FloatVectorProperty(name = "",
+                description = "Start location",
+                default = (0.0, 0.0, 0.0),
+                subtype = 'XYZ')
+
+    rotation_euler : FloatVectorProperty(
+            name="",
+            description="Rotation",
+            default=(0.0, 0.0, 0.0),
+            subtype='EULER'
+            )
+
     number_of_teeth: IntProperty(
             name="Number of Teeth",
             description="Number of teeth on the gear",
@@ -768,8 +901,18 @@ class AddWormGear(Operator):
         box.prop(self, "skew")
         box.prop(self, "crown")
 
+        box = layout.box()
+        box.label(text="Location:")
+        box.prop(self, "startlocation")
+        box = layout.box()
+        box.label(text="Rotation:")
+        box.prop(self, "rotation_euler")
+
     def execute(self, context):
 
+        if self.change:
+            ObjectDelete(self, context, self.delete)
+        
         verts, faces, verts_tip, verts_valley = add_worm(
             self.number_of_teeth,
             self.number_of_rows,
@@ -784,6 +927,11 @@ class AddWormGear(Operator):
 
         # Actually create the mesh object from this geometry data.
         obj = create_mesh_object(context, verts, [], faces, "Worm Gear")
+        
+        self.align_matrix = align_matrix(context, self.startlocation)
+        
+        obj.matrix_world = self.align_matrix  # apply matrix
+        obj.rotation_euler = self.rotation_euler
 
         # XXX, supporting adding in editmode is move involved
         if obj.mode != 'EDIT':
@@ -793,5 +941,33 @@ class AddWormGear(Operator):
 
             valleyGroup = obj.vertex_groups.new(name = 'Valleys')
             valleyGroup.add(verts_valley, 1.0, 'ADD')
+        
+        self.align_matrix = align_matrix(context, self.startlocation)
+        
+        obj["WormGear"] = True
+        obj["change"] = False
+        obj["number_of_teeth"] = self.number_of_teeth
+        obj["number_of_rows"] = self.number_of_rows
+        obj["radius"] = self.radius
+        obj["addendum"] = self.addendum
+        obj["dedendum"] = self.dedendum
+        obj["angle"] = self.angle
+        obj["row_height"] = self.row_hei

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list