BallanceBlenderHelper/ballance_blender_plugin/add_elements.py

128 lines
4.3 KiB
Python
Raw Normal View History

import bpy,mathutils
2020-09-03 13:57:06 +08:00
from . import utils, config, bm_import_export
# ================================================= actual add
2020-09-03 13:57:06 +08:00
class BALLANCE_OT_add_elements(bpy.types.Operator):
"""Add sector related elements"""
2020-09-03 13:57:06 +08:00
bl_idname = "ballance.add_elements"
bl_label = "Add elements"
bl_options = {'UNDO'}
elements_type: bpy.props.EnumProperty(
name="Type",
description="This element type",
2020-09-03 13:57:06 +08:00
items=tuple(map(lambda x: (x, x, ""), config.component_list)),
)
2020-09-03 13:57:06 +08:00
attentionElements = ["PC_TwoFlames", "PR_Resetpoint"]
uniqueElements = ["PS_FourFlames", "PE_Balloon"]
elements_sector: bpy.props.IntProperty(
name="Sector",
description="Define which sector the object will be grouped in",
min=1,
max=8,
default=1,
)
def execute(self, context):
2020-09-03 13:57:06 +08:00
# get name
if self.elements_type in self.uniqueElements:
finalObjectName = self.elements_type + "_01"
else:
finalObjectName = self.elements_type + "_0" + str(self.elements_sector) + "_"
2020-09-03 13:57:06 +08:00
# create object
loadedMesh = bm_import_export.load_component(config.component_list.index(self.elements_type))
obj = bpy.data.objects.new(finalObjectName, loadedMesh)
2020-10-08 13:07:43 +08:00
utils.AddSceneAndMove2Cursor(obj)
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
def draw(self, context):
layout = self.layout
layout.prop(self, "elements_type")
2020-09-03 13:57:06 +08:00
if self.elements_type not in self.uniqueElements:
layout.prop(self, "elements_sector")
if self.elements_type in self.attentionElements:
layout.label(text="Please note that sector is suffix.")
class BALLANCE_OT_add_rail(bpy.types.Operator):
"""Add rail"""
bl_idname = "ballance.add_rail"
2020-09-03 23:44:47 +08:00
bl_label = "Add rail section"
bl_options = {'UNDO'}
rail_type: bpy.props.EnumProperty(
name="Type",
description="Rail type",
items=(('MONO', "Monorail", ""),
('DOUBLE', "Rail", ""),
),
)
rail_radius: bpy.props.FloatProperty(
name="Rail radius",
description="Define rail section radius",
default=0.375,
)
rail_span: bpy.props.FloatProperty(
name="Rail span",
description="Define rail span",
default=3.75,
)
def execute(self, context):
2020-09-03 23:44:47 +08:00
bpy.ops.object.select_all(action='DESELECT')
# create one first
bpy.ops.mesh.primitive_circle_add(vertices=8,
radius=self.rail_radius,
fill_type='NOTHING',
calc_uvs=False,
enter_editmode=False,
align='WORLD',
location=(0.0, 0.0, 0.0))
firstObj = bpy.context.selected_objects[0]
# for double rail
if self.rail_type == 'DOUBLE':
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_circle_add(vertices=8,
radius=self.rail_radius,
fill_type='NOTHING',
calc_uvs=False,
enter_editmode=False,
align='WORLD',
location=(self.rail_span, 0.0, 0.0))
secondObj = bpy.context.selected_objects[0]
# merge
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = firstObj
firstObj.select_set(True)
secondObj.select_set(True)
bpy.ops.object.join()
# apply 3d cursor
firstObj.matrix_world = bpy.context.scene.cursor.matrix
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
def draw(self, context):
layout = self.layout
layout.prop(self, "rail_type")
layout.prop(self, "rail_radius")
2020-09-03 23:44:47 +08:00
if self.rail_type == 'DOUBLE':
layout.prop(self, "rail_span")