diff --git a/add_mesh_extra_objects/__init__.py b/add_mesh_extra_objects/__init__.py index c481d53d862073b966c8f75178acda5a0c607610..bfc0359e494821a181bc51db5685e04999a78d9f 100644 --- a/add_mesh_extra_objects/__init__.py +++ b/add_mesh_extra_objects/__init__.py @@ -25,8 +25,8 @@ bl_info = { "name": "Extra Objects", "author": "Multiple Authors", - "version": (0, 3, 2), - "blender": (2, 74, 5), + "version": (0, 3, 3), + "blender": (2, 80, 0), "location": "View3D > Add > Mesh", "description": "Add extra mesh object types", "warning": "", @@ -181,9 +181,9 @@ class VIEW3D_MT_mesh_mech(Menu): layout = self.layout layout.operator_context = 'INVOKE_REGION_WIN' layout.menu("VIEW3D_MT_mesh_pipe_joints_add", - text="Pipe Joints", icon="SNAP_PEEL_OBJECT") + text="Pipe Joints") layout.menu("VIEW3D_MT_mesh_gears_add", - text="Gears", icon="SCRIPTWIN") + text="Gears") class VIEW3D_MT_mesh_extras_add(Menu): @@ -249,104 +249,6 @@ class VIEW3D_MT_mesh_pipe_joints_add(Menu): layout.operator("mesh.primitive_n_joint_add", text="Pipe N-Joint") - -class discombobulator_scene_props(bpy.types.PropertyGroup): - DISC_doodads = [] - # Protusions Buttons: - repeatprot: IntProperty( - name="Repeat protusions", - description=("Make several layers of protusion \n" - "Use carefully, runs recursively the discombulator"), - default=1, min=1, max=4 # set to 4 because it's 2**n reqursive - ) - doprots: BoolProperty( - name="Make protusions", - description="Check if we want to add protusions to the mesh", - default=True - ) - subpolygon1: BoolProperty( - name="1", - default=True - ) - subpolygon2: BoolProperty( - name="2", - default=True - ) - subpolygon3: BoolProperty( - name="3", - default=True - ) - subpolygon4: BoolProperty( - name="4", - default=True - ) - polygonschangedpercent: FloatProperty( - name="Polygon %", - description="Percentage of changed polygons", - default=1.0 - ) - minHeight: FloatProperty( - name="Min height", - description="Minimal height of the protusions", - default=0.2 - ) - maxHeight: FloatProperty( - name="Max height", - description="Maximal height of the protusions", - default=0.4 - ) - minTaper: FloatProperty( - name="Min taper", - description="Minimal height of the protusions", - default=0.15, min=0.0, max=1.0, - subtype='PERCENTAGE' - ) - maxTaper: FloatProperty( - name="Max taper", - description="Maximal height of the protusions", - default=0.35, min=0.0, max=1.0, - subtype='PERCENTAGE' - ) - # Doodads buttons: - dodoodads: BoolProperty( - name="Make doodads", - description="Check if we want to generate doodads", - default=False - ) - mindoodads: IntProperty( - name="Minimum doodads number", - description="Ask for the minimum number of doodads to generate per polygon", - default=1, min=0, max=50 - ) - maxdoodads: IntProperty( - name="Maximum doodads number", - description="Ask for the maximum number of doodads to generate per polygon", - default=6, min=1, max=50 - ) - doodMinScale: FloatProperty( - name="Scale min", description="Minimum scaling of doodad", - default=0.5, min=0.0, max=1.0, - subtype='PERCENTAGE' - ) - doodMaxScale: FloatProperty( - name="Scale max", - description="Maximum scaling of doodad", - default=1.0, min=0.0, max=1.0, - subtype='PERCENTAGE' - ) - # Materials buttons: - sideProtMat: IntProperty( - name="Side's prot mat", - description="Material of protusion's sides", - default=0, min=0 - ) - topProtMat: IntProperty( - name="Prot's top mat", - description="Material of protusion's top", - default=0, min=0 - ) - - # Register all operators and panels # Define "Extras" menu @@ -356,50 +258,83 @@ def menu_func(self, context): lay_out.separator() lay_out.menu("VIEW3D_MT_mesh_vert_add", - text="Single Vert", icon="LAYER_ACTIVE") + text="Single Vert") lay_out.operator("mesh.primitive_round_cube_add", - text="Round Cube", icon="MOD_SUBSURF") + text="Round Cube") lay_out.menu("VIEW3D_MT_mesh_math_add", text="Math Function", icon="PACKAGE") lay_out.menu("VIEW3D_MT_mesh_mech_add", - text="Mechanical", icon="SCRIPTWIN") + text="Mechanical") lay_out.menu("VIEW3D_MT_mesh_torus_add", - text="Torus Objects", icon="MESH_TORUS") + text="Torus Objects") lay_out.separator() lay_out.operator("mesh.generate_geodesic_dome", - text="Geodesic Dome", icon="MESH_ICOSPHERE") + text="Geodesic Dome") lay_out.operator("discombobulate.ops", - text="Discombobulator", icon="RETOPO") + text="Discombobulator") lay_out.separator() lay_out.menu("VIEW3D_MT_mesh_extras_add", - text="Extras", icon="MESH_DATA") + text="Extras") lay_out.separator() lay_out.operator("object.parent_to_empty", - text="Parent To Empty", icon="LINK_AREA") - + text="Parent To Empty") + +# Register +classes = [ + VIEW3D_MT_mesh_vert_add, + VIEW3D_MT_mesh_gears_add, + VIEW3D_MT_mesh_diamonds_add, + VIEW3D_MT_mesh_math_add, + VIEW3D_MT_mesh_mech, + VIEW3D_MT_mesh_extras_add, + VIEW3D_MT_mesh_torus_add, + VIEW3D_MT_mesh_pipe_joints_add, + add_mesh_star.AddStar, + add_mesh_twisted_torus.AddTwistedTorus, + add_mesh_gemstones.AddDiamond, + add_mesh_gemstones.AddGem, + add_mesh_gears.AddGear, + add_mesh_gears.AddWormGear, + add_mesh_3d_function_surface.AddZFunctionSurface, + add_mesh_3d_function_surface.AddXYZFunctionSurface, + add_mesh_round_cube.AddRoundCube, + add_mesh_supertoroid.add_supertoroid, + add_mesh_pyramid.AddPyramid, + add_mesh_torusknot.AddTorusKnot, + add_mesh_honeycomb.add_mesh_honeycomb, + add_mesh_teapot.AddTeapot, + add_mesh_pipe_joint.AddElbowJoint, + add_mesh_pipe_joint.AddTeeJoint, + add_mesh_pipe_joint.AddWyeJoint, + add_mesh_pipe_joint.AddCrossJoint, + add_mesh_pipe_joint.AddNJoint, + add_mesh_solid.Solids, + add_mesh_round_brilliant.MESH_OT_primitive_brilliant_add, + add_mesh_menger_sponge.AddMengerSponge, + add_mesh_vertex.AddVert, + add_mesh_vertex.AddEmptyVert, + add_mesh_vertex.AddSymmetricalEmpty, + add_mesh_vertex.AddSymmetricalVert, + add_empty_as_parent.P2E, + add_empty_as_parent.PreFix, + mesh_discombobulator.discombobulator, + mesh_discombobulator.discombobulator_dodads_list, + mesh_discombobulator.discombob_help, + mesh_discombobulator.VIEW3D_OT_tools_discombobulate, + mesh_discombobulator.chooseDoodad, + mesh_discombobulator.unchooseDoodad, + add_mesh_beam_builder.addBeam, + Wallfactory.add_mesh_wallb, + add_shape_geodesic.add_corrective_pose_shape_fast, + third_domes_panel_271.GenerateGeodesicDome, + third_domes_panel_271.DialogOperator, + add_mesh_triangles.MakeTriangle +] def register(): - bpy.utils.register_module(__name__) - - # Register Discombobulator properties - bpy.types.Scene.discomb = bpy.props.PointerProperty( - type=discombobulator_scene_props - ) - # Error messages for Geodesic Domes - bpy.types.Scene.error_message = StringProperty( - name="actual error", - default="" - ) - bpy.types.Scene.geodesic_not_yet_called = BoolProperty( - name="geodesic_not_called", - default=True - ) - bpy.types.Scene.gd_help_text_width = IntProperty( - name="Text Width", - description="The width above which the text wraps", - default=60, - max=180, min=20 - ) + from bpy.utils import register_class + for cls in classes: + register_class(cls) # Add "Extras" menu to the "Add Mesh" menu bpy.types.VIEW3D_MT_mesh_add.append(menu_func) @@ -408,14 +343,10 @@ def register(): def unregister(): # Remove "Extras" menu from the "Add Mesh" menu. bpy.types.VIEW3D_MT_mesh_add.remove(menu_func) - - del bpy.types.Scene.discomb - del bpy.types.Scene.error_message - del bpy.types.Scene.geodesic_not_yet_called - del bpy.types.Scene.gd_help_text_width - - bpy.utils.unregister_module(__name__) - + + from bpy.utils import unregister_class + for cls in reversed(classes): + unregister_class(cls) if __name__ == "__main__": register() diff --git a/add_mesh_extra_objects/add_mesh_beam_builder.py b/add_mesh_extra_objects/add_mesh_beam_builder.py index 0489050772f7e65b774c55ad049e4f3f107e3a83..207883cc242e8cc04afd47bebe68e36cfd7df856 100644 --- a/add_mesh_extra_objects/add_mesh_beam_builder.py +++ b/add_mesh_extra_objects/add_mesh_beam_builder.py @@ -742,9 +742,9 @@ class addBeam(Operator): layout = self.layout box = layout.box() - split = box.split(percentage=0.85, align=True) + split = box.split(factor=0.85, align=True) split.prop(self, "Type", text="") - split.prop(self, "Cursor", text="", icon="CURSOR") + split.prop(self, "Cursor", text="") box.prop(self, "beamZ") box.prop(self, "beamX") diff --git a/add_mesh_extra_objects/add_mesh_gears.py b/add_mesh_extra_objects/add_mesh_gears.py index c631f3948030b832891d7a164c745c24cd813a71..6f5cc9855352f2d1f90746a11968a74ab3ec3cde 100644 --- a/add_mesh_extra_objects/add_mesh_gears.py +++ b/add_mesh_extra_objects/add_mesh_gears.py @@ -261,7 +261,7 @@ def add_gear(teethNum, radius, Ad, De, base, p_angle, if rack: teethNum = 1 - print(radius, width, conangle) + #print(radius, width, conangle) scale = (radius - 2 * width * tan(conangle)) / radius verts = [] @@ -660,8 +660,7 @@ class AddGear(Operator): ) # Actually create the mesh object from this geometry data. - base = create_mesh_object(context, verts, [], faces, "Gear") - obj = base.object + obj = create_mesh_object(context, verts, [], faces, "Gear") # XXX, supporting adding in editmode is move involved if obj.mode != 'EDIT': @@ -784,16 +783,15 @@ class AddWormGear(Operator): ) # Actually create the mesh object from this geometry data. - base = create_mesh_object(context, verts, [], faces, "Worm Gear") - obj = base.object + obj = create_mesh_object(context, verts, [], faces, "Worm Gear") # XXX, supporting adding in editmode is move involved if obj.mode != 'EDIT': # Create vertex groups from stored vertices. - tipGroup = obj.vertex_groups.new(name='Tips') + tipGroup = obj.vertex_groups.new(name = 'Tips') tipGroup.add(verts_tip, 1.0, 'ADD') - valleyGroup = obj.vertex_groups.new('Valleys') + valleyGroup = obj.vertex_groups.new(name = 'Valleys') valleyGroup.add(verts_valley, 1.0, 'ADD') return {'FINISHED'} diff --git a/add_mesh_extra_objects/add_mesh_gemstones.py b/add_mesh_extra_objects/add_mesh_gemstones.py index a07c9f66bb64c8add881e9cd900c794ac90c3506..3db2af1085f402f1883c82331480dc5b9bb27545 100644 --- a/add_mesh_extra_objects/add_mesh_gemstones.py +++ b/add_mesh_extra_objects/add_mesh_gemstones.py @@ -182,12 +182,12 @@ def add_diamond(segments, girdle_radius, table_radius, # Row for flat side verts_flat.append(len(verts)) - vec = quat * Vector((table_radius, 0.0, height_flat)) + vec = quat @ Vector((table_radius, 0.0, height_flat)) verts.append(vec) # Row for the middle/girdle verts_girdle.append(len(verts)) - vec = quat * Vector((girdle_radius, 0.0, height_middle)) + vec = quat @ Vector((girdle_radius, 0.0, height_middle)) verts.append(vec) # Flat face diff --git a/add_mesh_extra_objects/add_mesh_honeycomb.py b/add_mesh_extra_objects/add_mesh_honeycomb.py index 90d69b2dd4db75db873c6bcc950302a5b3c31185..94c6f63fcaafd18b5fc79a531591cee1efc2c724 100644 --- a/add_mesh_extra_objects/add_mesh_honeycomb.py +++ b/add_mesh_extra_objects/add_mesh_honeycomb.py @@ -230,7 +230,7 @@ class add_mesh_honeycomb(bpy.types.Operator): min=1, max=100, description='Number of the columns' ) - layers = BoolVectorProperty( + layers: BoolVectorProperty( name="Layers", size=20, subtype='LAYER', diff --git a/add_mesh_extra_objects/add_mesh_menger_sponge.py b/add_mesh_extra_objects/add_mesh_menger_sponge.py index df4fcb21c193885d2da444757842ea499b75c819..20b0d10258decab437204c8015944b4c5648d89a 100644 --- a/add_mesh_extra_objects/add_mesh_menger_sponge.py +++ b/add_mesh_extra_objects/add_mesh_menger_sponge.py @@ -169,7 +169,7 @@ class AddMengerSponge(bpy.types.Operator): name="Rotation", subtype='EULER', ) - layers = BoolVectorProperty( + layers: BoolVectorProperty( name="Layers", size=20, subtype='LAYER', @@ -184,7 +184,7 @@ class AddMengerSponge(bpy.types.Operator): mesh = bpy.data.meshes.new(name='Sponge') mesh.from_pydata(vertices, [], faces) uvs = [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0)] - mesh.uv_textures.new() + mesh.uv_layers.new() for i, uvloop in enumerate(mesh.uv_layers.active.data): uvloop.uv = uvs[i % 4] diff --git a/add_mesh_extra_objects/add_mesh_pyramid.py b/add_mesh_extra_objects/add_mesh_pyramid.py index ec41cc4faeeb2f7821fc3665fd7d550ccd89391e..eccfd35892ba939ee880296fcb136db1be1566dd 100644 --- a/add_mesh_extra_objects/add_mesh_pyramid.py +++ b/add_mesh_extra_objects/add_mesh_pyramid.py @@ -33,7 +33,7 @@ def create_step(width, base_level, step_height, num_sides): init_vectors = [Vector([rad, 0, base_level])] * len(quaternions) quat_vector_pairs = list(zip(quaternions, init_vectors)) - vectors = [quaternion * vec for quaternion, vec in quat_vector_pairs] + vectors = [quaternion @ vec for quaternion, vec in quat_vector_pairs] bottom_list = [(vec.x, vec.y, vec.z) for vec in vectors] top_list = [(vec.x, vec.y, vec.z + step_height) for vec in vectors] full_list = bottom_list + top_list @@ -110,31 +110,31 @@ class AddPyramid(Operator, AddObjectHelper): num_sides: IntProperty( name="Number Sides", description="How many sides each step will have", - min=3, max=20, + min=3, default=4 ) num_steps: IntProperty( name="Number of Steps", description="How many steps for the overall pyramid", - min=1, max=20, + min=1, default=10 ) width: FloatProperty( name="Initial Width", description="Initial base step width", - min=0.01, max=100.0, + min=0.01, default=2 ) height: FloatProperty( name="Height", description="How tall each step will be", - min=0.01, max=100.0, + min=0.01, default=0.1 ) reduce_by: FloatProperty( name="Reduce Step By", description="How much to reduce each succeeding step by", - min=.01, max=2.0, + min=.01, default=.20 ) diff --git a/add_mesh_extra_objects/add_mesh_round_brilliant.py b/add_mesh_extra_objects/add_mesh_round_brilliant.py index 7794269e3e4ef14704492a5fa6237b2071e4c903..b8bf393a46d7386a6ad53bc7e1659aa1f843289e 100644 --- a/add_mesh_extra_objects/add_mesh_round_brilliant.py +++ b/add_mesh_extra_objects/add_mesh_round_brilliant.py @@ -230,7 +230,7 @@ def addBrilliant(context, s, table_w, crown_h, girdle_t, pavi_d, bezel_f, # Create object and link it into scene. from bpy_extras import object_utils - dobj = object_utils.object_data_add(context, dmesh, operator=None, name="dobj").object + dobj = object_utils.object_data_add(context, dmesh, operator=None, name="dobj") # activate and select object bpy.context.view_layer.objects.active = dobj diff --git a/add_mesh_extra_objects/add_mesh_star.py b/add_mesh_extra_objects/add_mesh_star.py index 411fa91d7ca4e552f3b3f947700062b4608308b5..265f9a80ae8ee544ba6cf57c28af6c17c06d6141 100644 --- a/add_mesh_extra_objects/add_mesh_star.py +++ b/add_mesh_extra_objects/add_mesh_star.py @@ -123,11 +123,11 @@ def add_star(points, outer_radius, inner_radius, height): radius = inner_radius edgeloop_top.append(len(verts)) - vec = quat * Vector((radius, 0, half_height)) + vec = quat @ Vector((radius, 0, half_height)) verts.append(vec) edgeloop_bottom.append(len(verts)) - vec = quat * Vector((radius, 0, -half_height)) + vec = quat @ Vector((radius, 0, -half_height)) verts.append(vec) faces_top = createFaces([vert_idx_top], edgeloop_top, closed=True) diff --git a/add_mesh_extra_objects/add_mesh_twisted_torus.py b/add_mesh_extra_objects/add_mesh_twisted_torus.py index 17d3f1a9a8729b7c7dce0484160bf54470178d4c..f9a4cc705358f64219c3c2dd1dad0a6f8855ee41 100644 --- a/add_mesh_extra_objects/add_mesh_twisted_torus.py +++ b/add_mesh_extra_objects/add_mesh_twisted_torus.py @@ -110,7 +110,7 @@ def add_twisted_torus(major_rad, minor_rad, major_seg, minor_seg, twists): major_rad + (cos(angle) * minor_rad), 0.0, sin(angle) * minor_rad)) - vec = quat * vec + vec = quat @ vec edgeloop.append(len(verts)) verts.append(vec) diff --git a/add_mesh_extra_objects/add_mesh_vertex.py b/add_mesh_extra_objects/add_mesh_vertex.py index da4eb33a1d1ed3eabe799822a7e39a3bd78d13b8..88b9d3452599ccd8e43a1ffa3a226cf09d97bac5 100644 --- a/add_mesh_extra_objects/add_mesh_vertex.py +++ b/add_mesh_extra_objects/add_mesh_vertex.py @@ -106,9 +106,9 @@ class AddSymmetricalEmpty(Operator): layout.label(text="Mirror Axis") row = layout.row(align=True) - row.prop(mirror, "use_x") - row.prop(mirror, "use_y") - row.prop(mirror, "use_z") + row.prop(mirror, "use_axis") + row.prop(mirror, "use_axis") + row.prop(mirror, "use_axis") def execute(self, context): Add_Symmetrical_Empty() @@ -130,9 +130,9 @@ class AddSymmetricalVert(Operator): layout.label(text="Mirror Axis") row = layout.row(align=True) - row.prop(mirror, "use_x") - row.prop(mirror, "use_y") - row.prop(mirror, "use_z") + row.prop(mirror, "use_axis") + row.prop(mirror, "use_axis") + row.prop(mirror, "use_axis") def execute(self, context): Add_Symmetrical_Vert() diff --git a/add_mesh_extra_objects/geodesic_domes/__init__.py b/add_mesh_extra_objects/geodesic_domes/__init__.py index 54ad464ab4e5bfbf4f69f4968d39be7e90428063..e183dfa5a3d8f2a2e1dd3ce9e69d168d978e1a04 100644 --- a/add_mesh_extra_objects/geodesic_domes/__init__.py +++ b/add_mesh_extra_objects/geodesic_domes/__init__.py @@ -19,8 +19,8 @@ bl_info = { "name": "Geodesic Domes2", "author": "Noctumsolis, PKHG, Meta Androcto, Andy Houston", - "version": (0, 3, 2), - "blender": (2, 71, 0), + "version": (0, 3, 3), + "blender": (2, 80, 0), "location": "Toolshelf > Create Tab", "description": "Create geodesic dome type objects.", "warning": "", diff --git a/add_mesh_extra_objects/geodesic_domes/third_domes_panel_271.py b/add_mesh_extra_objects/geodesic_domes/third_domes_panel_271.py index 5b51c1f2744c6c2e0ab1623b4109d8e4e9bb50d5..3cf1e0639d3eccb2fdf9da67ac99251f7ef64f64 100644 --- a/add_mesh_extra_objects/geodesic_domes/third_domes_panel_271.py +++ b/add_mesh_extra_objects/geodesic_domes/third_domes_panel_271.py @@ -16,12 +16,13 @@ from bpy.props import ( from math import pi from mathutils import Vector # used for vertex.vector values - # global # last_generated_object = None last_imported_mesh = None basegeodesic = None imported_hubmesh_to_use = None +error_message = "" +geodesic_not_yet_called = True # global end # # ###### EIND FOR SHAPEKEYS ###### @@ -1087,14 +1088,14 @@ class GenerateGeodesicDome(Operator): multi_label(help_text, box, text_width) def execute(self, context): - global last_generated_object, last_imported_mesh, basegeodesic, imported_hubmesh_to_use + global last_generated_object, last_imported_mesh, basegeodesic, imported_hubmesh_to_use, error_message # default superformparam = [3, 10, 10, 10, 1, 1, 4, 10, 10, 10, 1, 1, 0, 0, 0.0, 0.0, 0, 0]] superformparam = [self.um, self.un1, self.un2, self.un3, self.ua, self.ub, self.vm, self.vn1, self.vn2, self.vn3, self.va, self.vb, self.uact, self.vact, self.uturn * pi, self.vturn * pi, self.utwist, self.vtwist] - context.scene.error_message = "" + error_message = "" if self.mainpages == 'Main': if self.geodesic_types == "Geodesic": tmp_fs = self.tri_hex_star @@ -1170,7 +1171,7 @@ class GenerateGeodesicDome(Operator): obj_name = self.import_mesh_name if obj_name == "None": message = "Fill in a name \nof an existing mesh\nto be imported" - context.scene.error_message = message + error_message = message self.report({"INFO"}, message) print("***INFO*** You have to fill in the name of an existing mesh") else: @@ -1185,7 +1186,7 @@ class GenerateGeodesicDome(Operator): bpy.context.active_object.location = (0, 0, 0) else: message = obj_name + " does not exist \nor is not a Mesh" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') self.report({'ERROR'}, message) print("***ERROR***" + obj_name + " does not exist or is not a Mesh") @@ -1218,12 +1219,12 @@ class GenerateGeodesicDome(Operator): except: message = "***ERROR*** \nEither no mesh for hub\nor " + \ hmeshname + " available" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') print(message) else: message = "***INFO***\nEnable Hubs first" - context.scene.error_message = message + error_message = message print("\n***INFO*** Enable Hubs first") elif self.mainpages == "Struts": struttype = self.struttype @@ -1255,7 +1256,7 @@ class GenerateGeodesicDome(Operator): last_generated_object.location = (0, 0, 0) else: message = "***ERROR***\nStrut object " + strutimpmesh + "\nis not a Mesh" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') print("***ERROR*** Strut object is not a Mesh") else: @@ -1287,7 +1288,7 @@ class GenerateGeodesicDome(Operator): ) else: message = "***ERROR***\nNo imported message available\n" + "last geodesic used" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') print("\n***ERROR*** No imported mesh available \nLast geodesic used!") faceobject = vefm_271.facetype( @@ -1325,7 +1326,7 @@ class GenerateGeodesicDome(Operator): except: message = "***ERROR***\n Contakt PKHG, something wrong happened" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') if self.load_parameters: @@ -1352,17 +1353,16 @@ class GenerateGeodesicDome(Operator): # bpy.context.scene.instant_filenames = filenames except: message = "***ERROR***\n Contakt PKHG,\nsomething went wrong reading params happened" - context.scene.error_message = message + error_message = message bpy.ops.object.dialog_operator('INVOKE_DEFAULT') return {'FINISHED'} def invoke(self, context, event): - global basegeodesic + global basegeodesic, geodesic_not_yet_called bpy.ops.view3d.snap_cursor_to_center() - tmp = context.scene.geodesic_not_yet_called - if tmp: - context.scene.geodesic_not_yet_called = False + if geodesic_not_yet_called: + geodesic_not_yet_called = False self.execute(context) return {'FINISHED'} @@ -1436,7 +1436,7 @@ class DialogOperator(Operator): def draw(self, context): layout = self.layout - message = context.scene.error_message + message = error_message col = layout.column() tmp = message.split("\n") for el in tmp: diff --git a/add_mesh_extra_objects/mesh_discombobulator.py b/add_mesh_extra_objects/mesh_discombobulator.py index f31c3e628bdad00f06c01a81730c36484dc8860e..f1d564ac0542f222b71ee6c7f36319a11dce65f2 100644 --- a/add_mesh_extra_objects/mesh_discombobulator.py +++ b/add_mesh_extra_objects/mesh_discombobulator.py @@ -11,6 +11,12 @@ from mathutils import ( Vector, Quaternion, ) +from bpy.props import ( + BoolProperty, + IntProperty, + FloatProperty, + StringProperty, + ) # ################### Globals #################### # @@ -23,7 +29,7 @@ Verts = [] Polygons = [] dVerts = [] dPolygons = [] -i_prots = [] # index of the top polygons on which we'll generate the doodads +i_prots = [] # index of the top polygons on which we"ll generate the doodads i_dood_type = [] # type of doodad (given by index of the doodad obj) @@ -332,18 +338,18 @@ def doodads(object1, mesh1, dmin, dmax): while(j <= doods_nbr): origin_dood = randVertex(object1.data.polygons[i].vertices[0], object1.data.polygons[i].vertices[1], object1.data.polygons[i].vertices[2], object1.data.polygons[i].vertices[3], Verts) - type_dood = random.randint(0, len(bpy.context.scene.discomb.DISC_doodads) - 1) + type_dood = random.randint(0, len(self.DISC_doodads) - 1) polygons_add = [] verts_add = [] # First we have to apply scaling and rotation to the mesh - bpy.ops.object.select_pattern(pattern=bpy.context.scene.discomb.DISC_doodads[type_dood], extend=False) - bpy.context.view_layer.objects.active = bpy.data.objects[bpy.context.scene.discomb.DISC_doodads[type_dood]] + bpy.ops.object.select_pattern(pattern=self.DISC_doodads[type_dood], extend=False) + bpy.context.view_layer.objects.active = bpy.data.objects[self.DISC_doodads[type_dood]] bpy.ops.object.transform_apply(location=False, rotation=True, scale=True) - for polygon in bpy.data.objects[bpy.context.scene.discomb.DISC_doodads[type_dood]].data.polygons: + for polygon in bpy.data.objects[self.DISC_doodads[type_dood]].data.polygons: polygons_add.append(polygon.vertices) - for vertex in bpy.data.objects[bpy.context.scene.discomb.DISC_doodads[type_dood]].data.vertices: + for vertex in bpy.data.objects[self.DISC_doodads[type_dood]].data.vertices: verts_add.append(vertex.co.copy()) normal_original_polygon = object1.data.polygons[i].normal @@ -361,7 +367,7 @@ def doodads(object1, mesh1, dmin, dmax): for polygon in polygons_add: dPolygons.append([polygon[0] + findex, polygon[1] + findex, polygon[2] + findex, polygon[3] + findex]) - i_dood_type.append(bpy.data.objects[bpy.context.scene.discomb.DISC_doodads[type_dood]].name) + i_dood_type.append(bpy.data.objects[self.DISC_doodads[type_dood]].name) for vertex in verts_add: dVerts.append(vertex) @@ -402,11 +408,11 @@ def setMatProt(discObj, origObj, sideProtMat, topProtMat): polygon.material_index = 1 -def setMatDood(doodObj): +def setMatDood(self, doodObj): # First we add the materials slots bpy.ops.object.select_pattern(pattern=doodObj.name, extend=False) bpy.context.view_layer.objects.active = doodObj - for name in bpy.context.scene.discomb.DISC_doodads: + for name in self.DISC_doodads: try: bpy.ops.object.material_slot_add() doodObj.material_slots[-1].material = bpy.data.objects[name].material_slots[0].material @@ -417,15 +423,15 @@ def setMatDood(doodObj): print() -def clean_doodads(): - current_doodads = list(bpy.context.scene.discomb.DISC_doodads) +def clean_doodads(self): + current_doodads = list(self.DISC_doodads) for name in current_doodads: if name not in bpy.data.objects: - bpy.context.scene.discomb.DISC_doodads.remove(name) + self.DISC_doodads.remove(name) -def discombobulate(minHeight, maxHeight, minTaper, maxTaper, sf1, sf2, sf3, sf4, +def discombobulate(self, minHeight, maxHeight, minTaper, maxTaper, sf1, sf2, sf3, sf4, dmin, dmax, r_prot, sideProtMat, topProtMat, isLast): global doprots global nVerts @@ -438,8 +444,8 @@ def discombobulate(minHeight, maxHeight, minTaper, maxTaper, sf1, sf2, sf3, sf4, bpy.ops.object.mode_set(mode="OBJECT") - # start by cleaning up doodads that don't exist anymore - clean_doodads() + # start by cleaning up doodads that don"t exist anymore + clean_doodads(self) # Create the discombobulated mesh mesh = bpy.data.meshes.new("tmp") @@ -490,27 +496,27 @@ def discombobulate(minHeight, maxHeight, minTaper, maxTaper, sf1, sf2, sf3, sf4, mesh1.from_pydata(Verts, [], Polygons) mesh1.update(calc_edges=True) - # Set the material's of discombobulated object + # Set the material"s of discombobulated object setMatProt(object1, origObj, sideProtMat, topProtMat) bpy.ops.object.select_pattern(pattern=object1.name, extend=False) bpy.context.view_layer.objects.active = bpy.data.objects[object1.name] - bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.object.mode_set(mode="EDIT") bpy.ops.mesh.normals_make_consistent(inside=False) - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.mesh.select_all(action="DESELECT") + bpy.ops.object.mode_set(mode="OBJECT") # if(bpy.context.scene.repeatprot): protusions_repeat(object1, mesh1, r_prot) - if(len(bpy.context.scene.discomb.DISC_doodads) != 0 and bpy.context.scene.discomb.dodoodads and isLast): + if(len(self.DISC_doodads) != 0 and self.dodoodads and isLast): doodads(object1, mesh1, dmin, dmax) mesh2 = bpy.data.meshes.new("dood_mesh") object2 = bpy.data.objects.new("dood_obj", mesh2) bpy.context.collection.objects.link(object2) mesh2.from_pydata(dVerts, [], dPolygons) mesh2.update(calc_edges=True) - setMatDood(object2) + setMatDood(self, object2) object2.location = to_translate object2.rotation_euler = to_rotate object2.scale = to_scale @@ -540,7 +546,7 @@ class chooseDoodad(Operator): bl_label = "Discombobulate set doodad object" bl_description = ("Save the Active Object as Doodad \n" "Object has to be quads only") - bl_options = {'REGISTER'} + bl_options = {"REGISTER"} @classmethod def poll(cls, context): @@ -560,22 +566,22 @@ class chooseDoodad(Operator): obj_name = bpy.context.active_object.name msg = "Object with this name already saved" - if obj_name not in bpy.context.scene.discomb.DISC_doodads: - bpy.context.scene.discomb.DISC_doodads.append(obj_name) + if obj_name not in self.DISC_doodads: + self.DISC_doodads.append(obj_name) msg = "Saved Doodad object: {}".format(obj_name) - self.report({'INFO'}, message=msg) + self.report({"INFO"}, message=msg) def invoke(self, context, event): self.execute(context) - return {'FINISHED'} + return {"FINISHED"} class unchooseDoodad(Operator): bl_idname = "object.discombobulate_unset_doodad" bl_label = "Discombobulate unset doodad object" bl_description = "Remove the saved Doodad Object(s)" - bl_options = {'REGISTER'} + bl_options = {"REGISTER"} remove_all: bpy.props.BoolProperty( name="Remove all Doodads", @@ -584,24 +590,24 @@ class unchooseDoodad(Operator): def execute(self, context): msg = ("No doodads to remove") - doodadery = bpy.context.scene.discomb.DISC_doodads + doodadery = self.DISC_doodads if len(doodadery) > 0: if not self.remove_all: name = bpy.context.active_object.name if name in doodadery: - bpy.context.scene.discomb.DISC_doodads.remove(name) + self.DISC_doodads.remove(name) msg = ("Removed Doodad object: {}".format(name)) else: - bpy.context.scene.discomb.DISC_doodads[:] = [] + self.DISC_doodads[:] = [] msg = "Removed all Doodads" else: msg = "No Doodads to Remove" - self.report({'INFO'}, message=msg) + self.report({"INFO"}, message=msg) def invoke(self, context, event): self.execute(context) - return {'FINISHED'} + return {"FINISHED"} # ################## Interpolygon ################## # @@ -610,36 +616,35 @@ class discombobulator(Operator): bl_idname = "object.discombobulate" bl_label = "Discombobulate" bl_description = "Apply" - bl_options = {'REGISTER', 'UNDO'} + bl_options = {"REGISTER", "UNDO"} def execute(self, context): - scn = context.scene.discomb i = 0 - while i < bpy.context.scene.discomb.repeatprot: + while i < self.repeatprot: isLast = False - if i == scn.repeatprot - 1: + if i == self.repeatprot - 1: isLast = True - discombobulate(scn.minHeight, scn.maxHeight, scn.minTaper, scn.maxTaper, scn.subpolygon1, - scn.subpolygon2, scn.subpolygon3, scn.subpolygon4, scn.mindoodads, scn.maxdoodads, - scn.repeatprot, scn.sideProtMat, scn.topProtMat, isLast) + discombobulate(self.minHeight, self.maxHeight, self.minTaper, self.maxTaper, self.subpolygon1, + self.subpolygon2, self.subpolygon3, self.subpolygon4, self.mindoodads, self.maxdoodads, + self.repeatprot, self.sideProtMat, self.topProtMat, isLast) i += 1 - return {'FINISHED'} + return {"FINISHED"} class discombobulator_dodads_list(Menu): bl_idname = "OBJECT_MT_discombobulator_dodad_list" bl_label = "List of saved Doodads" bl_description = "List of the saved Doodad Object Names" - bl_options = {'REGISTER'} + bl_options = {"REGISTER"} def draw(self, context): layout = self.layout - doodle = len(bpy.context.scene.discomb.DISC_doodads) + doodle = len(self.DISC_doodads) layout.label(text="Saved doodads : {}".format(doodle)) layout.separator() if doodle > 0: - for name in bpy.context.scene.discomb.DISC_doodads: + for name in self.DISC_doodads: layout.label(text=name) @@ -647,7 +652,7 @@ class discombob_help(Menu): bl_idname = "HELP_MT_discombobulator" bl_label = "Usage Information" bl_description = "Help" - bl_options = {'REGISTER'} + bl_options = {"REGISTER"} def draw(self, context): layout = self.layout @@ -669,15 +674,109 @@ class discombob_help(Menu): layout.label(text="If possible, avoid using on a high polycount base mesh") layout.label("(It can run out of memory and take a long time to compute)") - class VIEW3D_OT_tools_discombobulate(Operator): bl_idname = "discombobulate.ops" bl_label = "Discombobulator" bl_description = ("Easily add sci-fi details to a surface \n" "Needs an existing active Mesh with Faces") - bl_options = {'REGISTER'} + bl_options = {"REGISTER"} executing = False + + DISC_doodads = [] + # Protusions Buttons: + repeatprot: IntProperty( + name="Repeat protusions", + description=("Make several layers of protusion \n" + "Use carefully, runs recursively the discombulator"), + default=1, min=1, max=4 # set to 4 because it's 2**n reqursive + ) + doprots: BoolProperty( + name="Make protusions", + description="Check if we want to add protusions to the mesh", + default=True + ) + subpolygon1: BoolProperty( + name="1", + default=True + ) + subpolygon2: BoolProperty( + name="2", + default=True + ) + subpolygon3: BoolProperty( + name="3", + default=True + ) + subpolygon4: BoolProperty( + name="4", + default=True + ) + polygonschangedpercent: FloatProperty( + name="Polygon %", + description="Percentage of changed polygons", + default=1.0 + ) + minHeight: FloatProperty( + name="Min height", + description="Minimal height of the protusions", + default=0.2 + ) + maxHeight: FloatProperty( + name="Max height", + description="Maximal height of the protusions", + default=0.4 + ) + minTaper: FloatProperty( + name="Min taper", + description="Minimal height of the protusions", + default=0.15, min=0.0, max=1.0, + subtype='PERCENTAGE' + ) + maxTaper: FloatProperty( + name="Max taper", + description="Maximal height of the protusions", + default=0.35, min=0.0, max=1.0, + subtype='PERCENTAGE' + ) + # Doodads buttons: + dodoodads: BoolProperty( + name="Make doodads", + description="Check if we want to generate doodads", + default=False + ) + mindoodads: IntProperty( + name="Minimum doodads number", + description="Ask for the minimum number of doodads to generate per polygon", + default=1, min=0, max=50 + ) + maxdoodads: IntProperty( + name="Maximum doodads number", + description="Ask for the maximum number of doodads to generate per polygon", + default=6, min=1, max=50 + ) + doodMinScale: FloatProperty( + name="Scale min", description="Minimum scaling of doodad", + default=0.5, min=0.0, max=1.0, + subtype='PERCENTAGE' + ) + doodMaxScale: FloatProperty( + name="Scale max", + description="Maximum scaling of doodad", + default=1.0, min=0.0, max=1.0, + subtype='PERCENTAGE' + ) + # Materials buttons: + sideProtMat: IntProperty( + name="Side's prot mat", + description="Material of protusion's sides", + default=0, min=0 + ) + topProtMat: IntProperty( + name="Prot's top mat", + description="Material of protusion's top", + default=0, min=0 + ) @classmethod def poll(cls, context): @@ -688,48 +787,48 @@ class VIEW3D_OT_tools_discombobulate(Operator): layout = self.layout row = layout.row() - row.menu('HELP_MT_discombobulator', icon='INFO') + row.menu("HELP_MT_discombobulator", icon="INFO") box = layout.box() box.label(text="Protusions settings") row = box.row() - row.prop(context.scene.discomb, 'doprots') + row.prop(self, "doprots") row = box.row() - row.prop(context.scene.discomb, 'minHeight') + row.prop(self, "minHeight") row = box.row() - row.prop(context.scene.discomb, 'maxHeight') + row.prop(self, "maxHeight") row = box.row() - row.prop(context.scene.discomb, 'minTaper') + row.prop(self, "minTaper") row = box.row() - row.prop(context.scene.discomb, 'maxTaper') + row.prop(self, "maxTaper") row = box.row() col1 = row.column(align=True) - col1.prop(context.scene.discomb, "subpolygon1") + col1.prop(self, "subpolygon1") col2 = row.column(align=True) - col2.prop(context.scene.discomb, "subpolygon2") + col2.prop(self, "subpolygon2") col3 = row.column(align=True) - col3.prop(context.scene.discomb, "subpolygon3") + col3.prop(self, "subpolygon3") col4 = row.column(align=True) - col4.prop(context.scene.discomb, "subpolygon4") + col4.prop(self, "subpolygon4") row = box.row() - row.prop(context.scene.discomb, "repeatprot") + row.prop(self, "repeatprot") box = layout.box() box.label(text="Doodads settings") row = box.row() - is_doodad = context.scene.discomb.dodoodads - row.prop(context.scene.discomb, 'dodoodads') + is_doodad = self.dodoodads + row.prop(self, "dodoodads") row = box.row() row.enabled = is_doodad - row.prop(context.scene.discomb, "mindoodads") + row.prop(self, "mindoodads") row = box.row() row.enabled = is_doodad - row.prop(context.scene.discomb, "maxdoodads") + row.prop(self, "maxdoodads") row = box.row() row.enabled = is_doodad - row.operator("object.discombobulate_set_doodad", text="Pick doodad") + oper = row.operator("object.discombobulate_set_doodad", text="Pick doodad") row = box.row() - splits = row.split(0.5) + splits = row.split(factor = 0.5) splits.enabled = is_doodad splits.operator("object.discombobulate_unset_doodad", text="Remove active doodad").remove_all = False @@ -737,7 +836,7 @@ class VIEW3D_OT_tools_discombobulate(Operator): text="Remove all doodads").remove_all = True col = box.column(align=True) - doodle = len(bpy.context.scene.discomb.DISC_doodads) + doodle = len(self.DISC_doodads) col.enabled = (True if doodle > 0 else False) col.menu("OBJECT_MT_discombobulator_dodad_list", @@ -746,9 +845,9 @@ class VIEW3D_OT_tools_discombobulate(Operator): box = layout.box() box.label(text="Materials settings") row = box.row() - row.prop(context.scene.discomb, 'topProtMat') + row.prop(self, "topProtMat") row = box.row() - row.prop(context.scene.discomb, "sideProtMat") + row.prop(self, "sideProtMat") def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self, width=300) @@ -758,6 +857,14 @@ class VIEW3D_OT_tools_discombobulate(Operator): def execute(self, context): self.executing = True - bpy.ops.object.discombobulate('INVOKE_DEFAULT') - - return {'FINISHED'} + i = 0 + while i < self.repeatprot: + isLast = False + if i == self.repeatprot - 1: + isLast = True + discombobulate(self, self.minHeight, self.maxHeight, self.minTaper, self.maxTaper, self.subpolygon1, + self.subpolygon2, self.subpolygon3, self.subpolygon4, self.mindoodads, self.maxdoodads, + self.repeatprot, self.sideProtMat, self.topProtMat, isLast) + i += 1 + return {"FINISHED"} + #bpy.ops.object.discombobulate("INVOKE_DEFAULT")