21.06.2023 - 12:30
*
Hi,
Always on my interactor pythonpart, I'm now regarding the modification mode.
I can put an object (cuboid in my example) with a starting palette, load another palette when modifying (for generate cylinder).
The preview works great but :
1) when I click, the pythonpart doesn't apply the new geometry (with clearing model_ele_list)
2) I'd like to close the script when the new object is placed.
Best
class MyInteractor(): """ Definition of class MyInteractor """ def __init__(self, coord_input : Input.CoordinateInput, pyp_path : str, global_str_table_service : StringTableService, build_ele_list : List[BuildingElement], build_ele_composite : BuildingElementComposite, control_props_list : List[ControlProperties], modify_uuid_list : List[str]): """ Initialization of class MyInteractor Args: coord_input : coordinate input pyp_path : path of the pyp file global_str_table_service : global string table service build_ele_list : building element list build_ele_composite : building element composite control_props_list : control properties list modify_uuid_list : UUIDs of the existing elements in the modification mode """ self.coord_input = coord_input self.pyp_path = pyp_path self.str_table_service = global_str_table_service self.build_ele_list = build_ele_list self.build_ele_composite = build_ele_composite self.control_props_list = control_props_list self.modify_uuid_list = modify_uuid_list self.build_ele_service = BuildingElementService() self.modification_mode = modify_uuid_list != [] and modify_uuid_list[0] != "00000000-0000-0000-0000-000000000000--0" self.build_ele = self.build_ele_list[0] self.model_ele_list = [] self.selected_pnts = [] self.placement_mat = Geometry.Matrix3D() if not self.modification_mode else self.build_ele_list[0].get_insert_matrix() self.axis = Geometry.AxisPlacement3D(Geometry.Point3D(), Geometry.Vector3D(1, 0, 0), Geometry.Vector3D(0, 0, 1) ) self.palette_service : BuildingElementPaletteService = Any self.geo = None self.com_prop = BaseElements.CommonProperties() self.com_prop.GetGlobalProperties() if self.modification_mode: self.is_showing_palette = self.show_palette("ModifyTestInteractor.pal") else: self.is_showing_palette = self.show_palette("TestInteractor.pyp") if not self.is_showing_palette : return self.reset_pnts() def reset_pnts(self): """ Reset the input points """ self.selected_pnts.clear() self.coord_input.InitFirstElementInput(Input.InputStringConvert("Indiquez le point d'insertion")) def show_palette(self, palette_name): """ Show the palette Args: page : the page of the palette Returns: True/False for success. """ result, self.build_ele_script, self.build_ele_list, self.control_props_list, \ self.build_ele_composite, part_name, self.file_name = \ self.build_ele_service.read_data_from_pyp(f"{self.pyp_path}\\{palette_name}", self.str_table_service.str_table, False, self.str_table_service.material_str_table ) if not result: return False self.palette_service = BuildingElementPaletteService(self.build_ele_list, self.build_ele_composite, self.build_ele_script, self.control_props_list, self.file_name ) self.palette_service.show_palette(part_name) return True def modify_element_property(self, page, name, value): """ Modify property of element Args: page : the page of the property name : the name of the property value : new value for property. """ pass def on_cancel_by_menu_function(self): """ Check for input function cancel in case of a started menu function """ if self.modification_mode: self.create_pythonpart() if self.is_showing_palette : self.palette_service.close_palette() def on_cancel_function(self): """ Check for input function cancel in case of ESC Returns: True/False for success. """ if self.modification_mode: self.create_pythonpart() if self.is_showing_palette : self.palette_service.close_palette() return True def on_control_event(self, event_id: int): """ Handles on control event Args: event_id : event id of control. """ pass def on_mouse_leave(self): """ Handles the mouse leave event """ if self.modification_mode: self.modify_geometry(True) else: self.create_geometry(True) def on_preview_draw(self): """ Handles the preview draw event """ self.create_geometry(True) def on_value_input_control_enter(self): """ Handles the enter inside the value input control event Returns: True/False for success. """ pass def process_mouse_msg(self, mouse_msg, pnt, msg_info): """ Process the mouse message event Args: mouse_msg : the mouse message pnt : the input point in view coordinates msg_info : additional message info. Returns: True/False for success. """ input_pnt = self.coord_input.GetInputPoint(mouse_msg, pnt, msg_info).GetPoint() self.placement_mat.SetTranslation(Geometry.Vector3D(input_pnt)) if self.modification_mode: self.modify_geometry(True) else: self.create_geometry(True) if self.coord_input.IsMouseMove(mouse_msg): return True self.selected_pnts.append(input_pnt) if len(self.selected_pnts) == 1: if self.modification_mode: self.modify_geometry(False) else: self.create_geometry(False) self.reset_pnts() return True def create_geometry(self, is_preview): """ Create the geometry Args: is_preview : True/False. """ self.geo = Geometry.BRep3D.CreateCuboid(self.axis, 1000, 1000, 1000) self.model_ele_list.append(BasisElements.ModelElement3D(self.com_prop, self.geo)) if is_preview: self.draw_element_preview() else: self.create_pythonpart() def modify_geometry(self, is_preview): """ Modify the geometry Args: is_preview : True/False. """ self.model_ele_list.clear() self.geo = Geometry.BRep3D.CreateCylinder(self.axis, 500, 1000, True, True) self.model_ele_list.append(BasisElements.ModelElement3D(self.com_prop, self.geo)) if is_preview: self.draw_element_preview() else: self.create_pythonpart() def create_pythonpart(self): """ Create the PythonPart """ pyp_util = PythonPartUtil() pyp_util.add_pythonpart_view_2d3d(self.model_ele_list) pyp_transaction = PythonPartTransaction(self.coord_input.GetInputViewDocument()) pyp_transaction.execute(self.placement_mat, self.coord_input.GetViewWorldProjection(), pyp_util.create_pythonpart(self.build_ele), self.modify_uuid_list ) def draw_element_preview(self): """ Draw the preview """ BaseElements.DrawElementPreview(self.coord_input.GetInputViewDocument(), self.placement_mat, self.model_ele_list, True, None )