diff options
-rw-r--r-- | add_mesh_geodesic_domes/__init__.py | 138 | ||||
-rw-r--r-- | add_mesh_geodesic_domes/third_domes_panel_271.py | 231 |
2 files changed, 356 insertions, 13 deletions
diff --git a/add_mesh_geodesic_domes/__init__.py b/add_mesh_geodesic_domes/__init__.py index b1954214..4b3d8fc1 100644 --- a/add_mesh_geodesic_domes/__init__.py +++ b/add_mesh_geodesic_domes/__init__.py @@ -19,7 +19,7 @@ bl_info = { "name": "Geodesic Domes2", "author": "Noctumsolis, PKHG, Meta Androcto, Andy Houston", - "version": (0, 3, 3), + "version": (0, 3, 4), "blender": (2, 80, 0), "location": "View3D > Add > Mesh", "description": "Create geodesic dome type objects.", @@ -45,6 +45,140 @@ else: import bpy +def Geodesic_contex_menu(self, context): + bl_label = 'Change' + + obj = context.object + layout = self.layout + + if 'GeodesicDome' in obj.keys(): + props = layout.operator("mesh.generate_geodesic_dome", text="Change Geodesic Dome") + props.change = True + props.delete = obj.name + props.location = obj.location + props.rotation_euler = obj.rotation_euler + props.save_parameters = obj["save_parameters"] + props.load_parameters = obj["load_parameters"] + props.gd_help_text_width = obj["gd_help_text_width"] + props.mainpages = obj["mainpages"] + props.facetype_menu = obj["facetype_menu"] + props.facetoggle = obj["facetoggle"] + props.face_use_imported_object = obj["face_use_imported_object"] + props.facewidth = obj["facewidth"] + props.fwtog = obj["fwtog"] + props.faceheight = obj["faceheight"] + props.fhtog = obj["fhtog"] + props.face_detach = obj["face_detach"] + props.fmeshname = obj["fmeshname"] + props.geodesic_types = obj["geodesic_types"] + props.import_mesh_name = obj["import_mesh_name"] + props.base_type = obj["base_type"] + props.orientation = obj["orientation"] + props.geodesic_class = obj["geodesic_class"] + props.tri_hex_star = obj["tri_hex_star"] + props.spherical_flat = obj["spherical_flat"] + props.use_imported_mesh = obj["use_imported_mesh"] + props.cyxres = obj["cyxres"] + props.cyyres = obj["cyyres"] + props.cyxsz = obj["cyxsz"] + props.cyysz = obj["cyysz"] + props.cyxell = obj["cyxell"] + props.cygap = obj["cygap"] + props.cygphase = obj["cygphase"] + props.paxres = obj["paxres"] + props.payres = obj["payres"] + props.paxsz = obj["paxsz"] + props.paysz = obj["paysz"] + props.paxell = obj["paxell"] + props.pagap = obj["pagap"] + props.pagphase = obj["pagphase"] + props.ures = obj["ures"] + props.vres = obj["vres"] + props.urad = obj["urad"] + props.vrad = obj["vrad"] + props.uellipse = obj["uellipse"] + props.vellipse = obj["vellipse"] + props.upart = obj["upart"] + props.vpart = obj["vpart"] + props.ugap = obj["ugap"] + props.vgap = obj["vgap"] + props.uphase = obj["uphase"] + props.vphase = obj["vphase"] + props.uexp = obj["uexp"] + props.vexp = obj["vexp"] + props.usuper = obj["usuper"] + props.vsuper = obj["vsuper"] + props.utwist = obj["utwist"] + props.vtwist = obj["vtwist"] + props.bures = obj["bures"] + props.bvres = obj["bvres"] + props.burad = obj["burad"] + props.bupart = obj["bupart"] + props.bvpart = obj["bvpart"] + props.buphase = obj["buphase"] + props.bvphase = obj["bvphase"] + props.buellipse = obj["buellipse"] + props.bvellipse = obj["bvellipse"] + props.grxres = obj["grxres"] + props.gryres = obj["gryres"] + props.grxsz = obj["grxsz"] + props.grysz = obj["grysz"] + props.cart = obj["cart"] + props.frequency = obj["frequency"] + props.eccentricity = obj["eccentricity"] + props.squish = obj["squish"] + props.radius = obj["radius"] + props.squareness = obj["squareness"] + props.squarez = obj["squarez"] + props.baselevel = obj["baselevel"] + props.dual = obj["dual"] + props.rotxy = obj["rotxy"] + props.rotz = obj["rotz"] + props.uact = obj["uact"] + props.vact = obj["vact"] + props.um = obj["um"] + props.un1 = obj["un1"] + props.un2 = obj["un2"] + props.un3 = obj["un3"] + props.ua = obj["ua"] + props.ub = obj["ub"] + props.vm = obj["vm"] + props.vn1 = obj["vn1"] + props.vn2 = obj["vn2"] + props.vn3 = obj["vn3"] + props.va = obj["va"] + props.vb = obj["vb"] + props.uturn = obj["uturn"] + props.vturn = obj["vturn"] + props.utwist = obj["utwist"] + props.vtwist = obj["vtwist"] + props.struttype = obj["struttype"] + props.struttoggle = obj["struttoggle"] + props.strutimporttoggle = obj["strutimporttoggle"] + props.strutimpmesh = obj["strutimpmesh"] + props.strutwidth = obj["strutwidth"] + props.swtog = obj["swtog"] + props.strutheight = obj["strutheight"] + props.shtog = obj["shtog"] + props.strutshrink = obj["strutshrink"] + props.sstog = obj["sstog"] + props.stretch = obj["stretch"] + props.lift = obj["lift"] + props.smeshname = obj["smeshname"] + props.hubtype = obj["hubtype"] + props.hubtoggle = obj["hubtoggle"] + props.hubimporttoggle = obj["hubimporttoggle"] + props.hubimpmesh = obj["hubimpmesh"] + props.hubwidth = obj["hubwidth"] + props.hwtog = obj["hwtog"] + props.hubheight = obj["hubheight"] + props.hhtog = obj["hhtog"] + props.hublength = obj["hublength"] + props.hstog = obj["hstog"] + props.hmeshname = obj["hmeshname"] + + layout.separator() + # Define "Extras" menu def menu_func(self, context): lay_out = self.layout @@ -68,10 +202,12 @@ def register(): # Add "Extras" menu to the "Add Mesh" menu bpy.types.VIEW3D_MT_mesh_add.append(menu_func) + bpy.types.VIEW3D_MT_object_context_menu.prepend(Geodesic_contex_menu) def unregister(): # Remove "Extras" menu from the "Add Mesh" menu. + bpy.types.VIEW3D_MT_object_context_menu.remove(Geodesic_contex_menu) bpy.types.VIEW3D_MT_mesh_add.remove(menu_func) from bpy.utils import unregister_class diff --git a/add_mesh_geodesic_domes/third_domes_panel_271.py b/add_mesh_geodesic_domes/third_domes_panel_271.py index 2a5a4409..41a3cf5d 100644 --- a/add_mesh_geodesic_domes/third_domes_panel_271.py +++ b/add_mesh_geodesic_domes/third_domes_panel_271.py @@ -12,9 +12,13 @@ from bpy.props import ( FloatProperty, StringProperty, BoolProperty, + FloatVectorProperty, ) from math import pi -from mathutils import Vector # used for vertex.vector values +from mathutils import ( + Vector, + Matrix, + ) # global # last_generated_object = None @@ -27,12 +31,68 @@ geodesic_not_yet_called = True # ###### EIND FOR SHAPEKEYS ###### +##------------------------------------------------------------ +# 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 + +#### 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 + class GenerateGeodesicDome(Operator): bl_label = "Modify Geodesic Objects" bl_idname = "mesh.generate_geodesic_dome" bl_description = "Create Geodesic Object Types" bl_options = {'REGISTER', 'UNDO', 'PRESET'} + + # align_matrix for the invoke + align_matrix : Matrix() + + GeodesicDome : BoolProperty(name = "Geodesic Dome", + default = True, + description = "Geodesic Dome") + + #### change properties + name : StringProperty(name = "Name", + description = "Name") + + change : BoolProperty(name = "Change", + default = False, + description = "change Gear") + + delete : StringProperty(name = "Delete", + description = "Delete Gear") + + location : FloatVectorProperty(name = "", + description = "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' + ) # PKHG_NEW saving and loading parameters save_parameters: BoolProperty( @@ -977,6 +1037,12 @@ class GenerateGeodesicDome(Operator): row.prop(self, "vturn") row = layout.row() row.prop(self, "vtwist") + box = layout.box() + box.label(text="Location:") + box.prop(self, "location") + box = layout.box() + box.label(text="Rotation:") + box.prop(self, "rotation_euler") # einde superform elif which_mainpages == "Hubs": row = layout.row() @@ -1088,6 +1154,10 @@ class GenerateGeodesicDome(Operator): multi_label(help_text, box, text_width) def execute(self, context): + + if self.change: + ObjectDelete(self, context, self.delete) + 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, @@ -1121,14 +1191,14 @@ class GenerateGeodesicDome(Operator): vefm_271.finalfill(basegeodesic, mesh) # always! for hexifiy etc. necessary!!! vefm_271.vefm_add_object(mesh) last_generated_object = context.active_object - last_generated_object.location = (0, 0, 0) + #last_generated_object.location = (0, 0, 0) context.view_layer.objects.active = last_generated_object elif self.geodesic_types == 'Grid': basegeodesic = forms_271.grid(self.grxres, self.gryres, self.grxsz, self.grysz, 1.0, 1.0, 0, 0, 0, 0, 1.0, 1.0, superformparam) vefm_271.vefm_add_object(basegeodesic) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) elif self.geodesic_types == "Cylinder": basegeodesic = forms_271.cylinder( self.cyxres, self.cyyres, @@ -1137,7 +1207,7 @@ class GenerateGeodesicDome(Operator): 1.0, superformparam ) vefm_271.vefm_add_object(basegeodesic) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) elif self.geodesic_types == "Parabola": basegeodesic = forms_271.parabola( @@ -1146,7 +1216,7 @@ class GenerateGeodesicDome(Operator): 0, 0, 0, self.paxell, 1.0, superformparam ) vefm_271.vefm_add_object(basegeodesic) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) elif self.geodesic_types == "Torus": basegeodesic = forms_271.torus( self.ures, self.vres, @@ -1155,7 +1225,7 @@ class GenerateGeodesicDome(Operator): self.vellipse, superformparam ) vefm_271.vefm_add_object(basegeodesic) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) elif self.geodesic_types == "Sphere": basegeodesic = forms_271.sphere( self.bures, self.bvres, @@ -1165,7 +1235,7 @@ class GenerateGeodesicDome(Operator): ) vefm_271.vefm_add_object(basegeodesic) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) elif self.geodesic_types == "Import your mesh": obj_name = self.import_mesh_name @@ -1183,7 +1253,7 @@ class GenerateGeodesicDome(Operator): vefm_271.vefm_add_object(your_obj) last_generated_object = bpy.context.active_object last_generated_object.name = "Imported mesh" - bpy.context.active_object.location = (0, 0, 0) + #bpy.context.active_object.location = (0, 0, 0) else: message = obj_name + " does not exist \nor is not a Mesh" error_message = message @@ -1215,7 +1285,7 @@ class GenerateGeodesicDome(Operator): mesh = vefm_271.mesh("test") vefm_271.finalfill(hub, mesh) vefm_271.vefm_add_object(mesh) - bpy.data.objects[-1].location = (0, 0, 0) + #bpy.data.objects[-1].location = (0, 0, 0) except: message = "***ERROR*** \nEither no mesh for hub\nor " + \ hmeshname + " available" @@ -1253,7 +1323,7 @@ class GenerateGeodesicDome(Operator): vefm_271.vefm_add_object(strutmesh) last_generated_object = context.active_object last_generated_object.name = smeshname - last_generated_object.location = (0, 0, 0) + #last_generated_object.location = (0, 0, 0) else: message = "***ERROR***\nStrut object " + strutimpmesh + "\nis not a Mesh" error_message = message @@ -1300,7 +1370,137 @@ class GenerateGeodesicDome(Operator): vefm_271.vefm_add_object(facemesh) obj = bpy.data.objects[-1] obj.name = self.fmeshname - obj.location = (0, 0, 0) + #obj.location = (0, 0, 0) + + + obj = context.active_object + self.align_matrix = align_matrix(context, self.location) + + obj.matrix_world = self.align_matrix # apply matrix + obj.rotation_euler = self.rotation_euler + + obj["GeodesicDome"] = True + obj["change"] = False + obj["delete"] = "" + obj["save_parameters"] = self.save_parameters + obj["load_parameters"] = self.load_parameters + obj["gd_help_text_width"] = self.gd_help_text_width + obj["mainpages"] = self.mainpages + obj["facetype_menu"] = self.facetype_menu + obj["facetoggle"] = self.facetoggle + obj["face_use_imported_object"] = self.face_use_imported_object + obj["facewidth"] = self.facewidth + obj["fwtog"] = self.fwtog + obj["faceheight"] = self.faceheight + obj["fhtog"] = self.fhtog + obj["face_detach"] = self.face_detach + obj["fmeshname"] = self.fmeshname + obj["geodesic_types"] = self.geodesic_types + obj["import_mesh_name"] = self.import_mesh_name + obj["base_type"] = self.base_type + obj["orientation"] = self.orientation + obj["geodesic_class"] = self.geodesic_class + obj["tri_hex_star"] = self.tri_hex_star + obj["spherical_flat"] = self.spherical_flat + obj["use_imported_mesh"] = self.use_imported_mesh + obj["cyxres"] = self.cyxres + obj["cyyres"] = self.cyyres + obj["cyxsz"] = self.cyxsz + obj["cyysz"] = self.cyysz + obj["cyxell"] = self.cyxell + obj["cygap"] = self.cygap + obj["cygphase"] = self.cygphase + obj["paxres"] = self.paxres + obj["payres"] = self.payres + obj["paxsz"] = self.paxsz + obj["paysz"] = self.paysz + obj["paxell"] = self.paxell + obj["pagap"] = self.pagap + obj["pagphase"] = self.pagphase + obj["ures"] = self.ures + obj["vres"] = self.vres + obj["urad"] = self.urad + obj["vrad"] = self.vrad + obj["uellipse"] = self.uellipse + obj["vellipse"] = self.vellipse + obj["upart"] = self.upart + obj["vpart"] = self.vpart + obj["ugap"] = self.ugap + obj["vgap"] = self.vgap + obj["uphase"] = self.uphase + obj["vphase"] = self.vphase + obj["uexp"] = self.uexp + obj["vexp"] = self.vexp + obj["usuper"] = self.usuper + obj["vsuper"] = self.vsuper + obj["utwist"] = self.utwist + obj["vtwist"] = self.vtwist + obj["bures"] = self.bures + obj["bvres"] = self.bvres + obj["burad"] = self.burad + obj["bupart"] = self.bupart + obj["bvpart"] = self.bvpart + obj["buphase"] = self.buphase + obj["bvphase"] = self.bvphase + obj["buellipse"] = self.buellipse + obj["bvellipse"] = self.bvellipse + obj["grxres"] = self.grxres + obj["gryres"] = self.gryres + obj["grxsz"] = self.grxsz + obj["grysz"] = self.grysz + obj["cart"] = self.cart + obj["frequency"] = self.frequency + obj["eccentricity"] = self.eccentricity + obj["squish"] = self.squish + obj["radius"] = self.radius + obj["squareness"] = self.squareness + obj["squarez"] = self.squarez + obj["baselevel"] = self.baselevel + obj["dual"] = self.dual + obj["rotxy"] = self.rotxy + obj["rotz"] = self.rotz + obj["uact"] = self.uact + obj["vact"] = self.vact + obj["um"] = self.um + obj["un1"] = self.un1 + obj["un2"] = self.un2 + obj["un3"] = self.un3 + obj["ua"] = self.ua + obj["ub"] = self.ub + obj["vm"] = self.vm + obj["vn1"] = self.vn1 + obj["vn2"] = self.vn2 + obj["vn3"] = self.vn3 + obj["va"] = self.va + obj["vb"] = self.vb + obj["uturn"] = self.uturn + obj["vturn"] = self.vturn + obj["utwist"] = self.utwist + obj["vtwist"] = self.vtwist + obj["struttype"] = self.struttype + obj["struttoggle"] = self.struttoggle + obj["strutimporttoggle"] = self.strutimporttoggle + obj["strutimpmesh"] = self.strutimpmesh + obj["strutwidth"] = self.strutwidth + obj["swtog"] = self.swtog + obj["strutheight"] = self.strutheight + obj["shtog"] = self.shtog + obj["strutshrink"] = self.strutshrink + obj["sstog"] = self.sstog + obj["stretch"] = self.stretch + obj["lift"] = self.lift + obj["smeshname"] = self.smeshname + obj["hubtype"] = self.hubtype + obj["hubtoggle"] = self.hubtoggle + obj["hubimporttoggle"] = self.hubimporttoggle + obj["hubimpmesh"] = self.hubimpmesh + obj["hubwidth"] = self.hubwidth + obj["hwtog"] = self.hwtog + obj["hubheight"] = self.hubheight + obj["hhtog"] = self.hhtog + obj["hublength"] = self.hublength + obj["hstog"] = self.hstog + obj["hmeshname"] = self.hmeshname # PKHG save or load (nearly) all parameters if self.save_parameters: @@ -1360,9 +1560,16 @@ class GenerateGeodesicDome(Operator): def invoke(self, context, event): global basegeodesic, geodesic_not_yet_called - bpy.ops.view3d.snap_cursor_to_center() + #bpy.ops.view3d.snap_cursor_to_center() if geodesic_not_yet_called: geodesic_not_yet_called = False + 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'} |