feat: finish i18n extract work
- masically finish u18n extract work (most fields are extracted)
This commit is contained in:
		| @ -55,7 +55,7 @@ class BBP_OT_add_bme_struct(bpy.types.Operator): | |||||||
|  |  | ||||||
|     ## Compromise used "outdated" flag. |     ## Compromise used "outdated" flag. | ||||||
|     outdated_flag: bpy.props.BoolProperty( |     outdated_flag: bpy.props.BoolProperty( | ||||||
|         # TR: Internal property should not have name and desc otherwise they will be written in translation. |         # TR: Property not showen should not have name and desc. | ||||||
|         # name = "Outdated Type", |         # name = "Outdated Type", | ||||||
|         # description = "Internal flag.", |         # description = "Internal flag.", | ||||||
|         options = {'HIDDEN', 'SKIP_SAVE'}, |         options = {'HIDDEN', 'SKIP_SAVE'}, | ||||||
| @ -243,49 +243,49 @@ class BBP_OT_add_bme_struct(bpy.types.Operator): | |||||||
|         op_cfgs_visitor: UTIL_functions.CollectionVisitor[BBP_PG_bme_adder_cfgs] |         op_cfgs_visitor: UTIL_functions.CollectionVisitor[BBP_PG_bme_adder_cfgs] | ||||||
|         op_cfgs_visitor = UTIL_functions.CollectionVisitor(self.bme_struct_cfgs) |         op_cfgs_visitor = UTIL_functions.CollectionVisitor(self.bme_struct_cfgs) | ||||||
|         # visit cfgs cache list to show cfg |         # visit cfgs cache list to show cfg | ||||||
|         layout.label(text = "Prototype Configurations:") |         layout.label(text="Prototype Configurations:", text_ctxt='BBP_OT_add_bme_struct/draw') | ||||||
|         for (cfg, cfg_index) in self.bme_struct_cfg_index_cache: |         for (cfg, cfg_index) in self.bme_struct_cfg_index_cache: | ||||||
|             # create box for cfgs |             # create box for cfgs | ||||||
|             box_layout: bpy.types.UILayout = layout.box() |             box_layout: bpy.types.UILayout = layout.box() | ||||||
|  |  | ||||||
|             # draw title and description first |             # draw title and description first | ||||||
|             box_layout.label(text = cfg.get_title()) |             box_layout.label(text=cfg.get_title()) # TODO: finish translation context | ||||||
|             box_layout.label(text = cfg.get_desc()) |             box_layout.label(text=cfg.get_desc()) | ||||||
|  |  | ||||||
|             # show prop differently by cfg type |             # show prop differently by cfg type | ||||||
|             match(cfg.get_type()): |             match(cfg.get_type()): | ||||||
|                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Integer: |                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Integer: | ||||||
|                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_int', text = '') |                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_int', text='') | ||||||
|                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Float: |                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Float: | ||||||
|                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_float', text = '') |                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_float', text='') | ||||||
|                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Boolean: |                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Boolean: | ||||||
|                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_bool', text = '') |                     box_layout.prop(op_cfgs_visitor[cfg_index], 'prop_bool', text='') | ||||||
|                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Face: |                 case UTIL_bme.PrototypeShowcaseCfgsTypes.Face: | ||||||
|                     # face will show a special layout (grid view) |                     # face will show a special layout (grid view) | ||||||
|                     grids = box_layout.grid_flow( |                     grids = box_layout.grid_flow( | ||||||
|                         row_major=True, columns=3, even_columns=True, even_rows=True, align=True) |                         row_major=True, columns=3, even_columns=True, even_rows=True, align=True) | ||||||
|                     grids.alignment = 'CENTER' |                     grids.alignment = 'CENTER' | ||||||
|                     grids.separator() |                     grids.separator() | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 0], 'prop_bool', text = 'Top') # top |                     grids.prop(op_cfgs_visitor[cfg_index + 0], 'prop_bool', text='Top', text_ctxt='BBP_OT_add_bme_struct/draw') # top | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 2], 'prop_bool', text = 'Front') # front |                     grids.prop(op_cfgs_visitor[cfg_index + 2], 'prop_bool', text='Front', text_ctxt='BBP_OT_add_bme_struct/draw') # front | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 4], 'prop_bool', text = 'Left') # left |                     grids.prop(op_cfgs_visitor[cfg_index + 4], 'prop_bool', text='Left', text_ctxt='BBP_OT_add_bme_struct/draw') # left | ||||||
|                     grids.label(text = '', icon = 'CUBE')   # show a 3d cube as icon |                     grids.label(text='', icon='CUBE')   # show a 3d cube as icon | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 5], 'prop_bool', text = 'Right') # right |                     grids.prop(op_cfgs_visitor[cfg_index + 5], 'prop_bool', text='Right', text_ctxt='BBP_OT_add_bme_struct/draw') # right | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 3], 'prop_bool', text = 'Back') # back |                     grids.prop(op_cfgs_visitor[cfg_index + 3], 'prop_bool', text='Back', text_ctxt='BBP_OT_add_bme_struct/draw') # back | ||||||
|                     grids.prop(op_cfgs_visitor[cfg_index + 1], 'prop_bool', text = 'Bottom') # bottom |                     grids.prop(op_cfgs_visitor[cfg_index + 1], 'prop_bool', text='Bottom', text_ctxt='BBP_OT_add_bme_struct/draw') # bottom | ||||||
|                     grids.separator() |                     grids.separator() | ||||||
|  |  | ||||||
|         # show extra transform props |         # show extra transform props | ||||||
|         # forcely order that each one are placed horizontally |         # forcely order that each one are placed horizontally | ||||||
|         layout.label(text = "Extra Transform") |         layout.label(text="Extra Transform", text_ctxt='BBP_OT_add_bme_struct/draw') | ||||||
|         # translation |         # translation | ||||||
|         layout.label(text = 'Translation') |         layout.label(text='Translation', text_ctxt='BBP_OT_add_bme_struct/draw') | ||||||
|         hbox_layout: bpy.types.UILayout = layout.row() |         hbox_layout: bpy.types.UILayout = layout.row() | ||||||
|         hbox_layout.prop(self, 'extra_translation', text = '') |         hbox_layout.prop(self, 'extra_translation', text='') | ||||||
|         # rotation |         # rotation | ||||||
|         layout.label(text = 'Rotation') |         layout.label(text='Rotation', text_ctxt='BBP_OT_add_bme_struct/draw') | ||||||
|         hbox_layout = layout.row() |         hbox_layout = layout.row() | ||||||
|         hbox_layout.prop(self, 'extra_rotation', text = '') |         hbox_layout.prop(self, 'extra_rotation', text='') | ||||||
|  |  | ||||||
|     @classmethod |     @classmethod | ||||||
|     def draw_blc_menu(cls, layout: bpy.types.UILayout): |     def draw_blc_menu(cls, layout: bpy.types.UILayout): | ||||||
|  | |||||||
| @ -224,7 +224,9 @@ class BBP_OT_add_component(bpy.types.Operator, ComponentSectorParam): | |||||||
|         # check for some special components and show warning |         # check for some special components and show warning | ||||||
|         elename: str | None = _check_component_existance(_g_EnumHelper_Component.get_selection(self.component_type), self.general_get_component_sector()) |         elename: str | None = _check_component_existance(_g_EnumHelper_Component.get_selection(self.component_type), self.general_get_component_sector()) | ||||||
|         if elename is not None: |         if elename is not None: | ||||||
|             layout.label(text = f'Warning: {elename} already exist.') |             tr_text: str = bpy.app.translations.pgettext_iface( | ||||||
|  |                 'Warning: {0} already exist.', 'BBP_OT_add_component/draw') | ||||||
|  |             layout.label(text=tr_text.format(elename), translate=False) | ||||||
|  |  | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         # call general creator |         # call general creator | ||||||
| @ -324,7 +326,8 @@ class BBP_OT_add_nong_ventilator(bpy.types.Operator, ComponentSectorParam, Compo | |||||||
|         self.draw_component_sector_params(layout) |         self.draw_component_sector_params(layout) | ||||||
|  |  | ||||||
|         # draw count settings by different source |         # draw count settings by different source | ||||||
|         layout.label(text = 'Count') |         layout.separator() | ||||||
|  |         layout.label(text='Count Source', text_ctxt='BBP_OT_add_nong_ventilator/draw') | ||||||
|         layout.prop(self, 'ventilator_count_source', expand = True) |         layout.prop(self, 'ventilator_count_source', expand = True) | ||||||
|         if (self.ventilator_count_source == 'CUSTOM'): |         if (self.ventilator_count_source == 'CUSTOM'): | ||||||
|             self.draw_component_count_params(layout) |             self.draw_component_count_params(layout) | ||||||
| @ -551,16 +554,20 @@ class BBP_OT_add_sector_component_pair(bpy.types.Operator, ComponentSectorParam) | |||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         self.draw_component_sector_params(layout) |         self.draw_component_sector_params(layout) | ||||||
|  |  | ||||||
|  |         # fetch warning string | ||||||
|  |         tr_text: str = bpy.app.translations.pgettext_iface( | ||||||
|  |             'Warning: {0} already exist.', 'BBP_OT_add_sector_component_pair/draw') | ||||||
|  |  | ||||||
|         # check checkpoint and resetpoint name conflict and show warnings |         # check checkpoint and resetpoint name conflict and show warnings | ||||||
|         (checkp_ty, checkp_sector) = self.__get_checkpoint() |         (checkp_ty, checkp_sector) = self.__get_checkpoint() | ||||||
|         elename: str | None = _check_component_existance(checkp_ty, checkp_sector) |         elename: str | None = _check_component_existance(checkp_ty, checkp_sector) | ||||||
|         if elename is not None: |         if elename is not None: | ||||||
|             layout.label(text = f'Warning: {elename} already exist.') |             layout.label(text=tr_text.format(elename), translate=False) | ||||||
|  |  | ||||||
|         (resetp_ty, resetp_sector) = self.__get_resetpoint() |         (resetp_ty, resetp_sector) = self.__get_resetpoint() | ||||||
|         elename = _check_component_existance(resetp_ty, resetp_sector) |         elename = _check_component_existance(resetp_ty, resetp_sector) | ||||||
|         if elename is not None: |         if elename is not None: | ||||||
|             layout.label(text = f'Warning: {elename} already exist.') |             layout.label(text=tr_text.format(elename), translate=False) | ||||||
|  |  | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         # create checkpoint and resetpoint individually in element context |         # create checkpoint and resetpoint individually in element context | ||||||
|  | |||||||
| @ -62,15 +62,15 @@ class SharedExtraTransform(): | |||||||
|     def draw_extra_transform_input(self, layout: bpy.types.UILayout) -> None: |     def draw_extra_transform_input(self, layout: bpy.types.UILayout) -> None: | ||||||
|         # show extra transform props |         # show extra transform props | ||||||
|         # forcely order that each one are placed horizontally |         # forcely order that each one are placed horizontally | ||||||
|         layout.label(text = "Extra Transform") |         layout.label(text="Extra Transform", text_ctxt='BBP/OP_ADDS_rail.SharedExtraTransform/draw') | ||||||
|         # translation |         # translation | ||||||
|         layout.label(text = 'Translation') |         layout.label(text='Translation', text_ctxt='BBP/OP_ADDS_rail.SharedExtraTransform/draw') | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.prop(self, 'extra_translation', text = '') |         row.prop(self, 'extra_translation', text='') | ||||||
|         # rotation |         # rotation | ||||||
|         layout.label(text = 'Rotation') |         layout.label(text='Rotation', text_ctxt='BBP/OP_ADDS_rail.SharedExtraTransform/draw') | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.prop(self, 'extra_rotation', text = '') |         row.prop(self, 'extra_rotation', text='') | ||||||
|  |  | ||||||
|     def general_get_extra_transform(self) -> mathutils.Matrix: |     def general_get_extra_transform(self) -> mathutils.Matrix: | ||||||
|         return mathutils.Matrix.LocRotScale( |         return mathutils.Matrix.LocRotScale( | ||||||
| @ -124,7 +124,7 @@ class SharedRailCapInputProperty(): | |||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     def draw_rail_cap_input(self, layout: bpy.types.UILayout) -> None: |     def draw_rail_cap_input(self, layout: bpy.types.UILayout) -> None: | ||||||
|         layout.label(text = "Cap Options") |         layout.label(text="Cap Options", text_ctxt='BBP/OP_ADDS_rail.SharedRailCapInputProperty/draw') | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.prop(self, "rail_start_cap", toggle = 1) |         row.prop(self, "rail_start_cap", toggle = 1) | ||||||
|         row.prop(self, "rail_end_cap", toggle = 1) |         row.prop(self, "rail_end_cap", toggle = 1) | ||||||
| @ -209,7 +209,7 @@ class SharedScrewRailInputProperty(): | |||||||
|      |      | ||||||
|     def draw_screw_rail_flip_input(self, layout: bpy.types.UILayout) -> None: |     def draw_screw_rail_flip_input(self, layout: bpy.types.UILayout) -> None: | ||||||
|         # flip options should placed horizontally |         # flip options should placed horizontally | ||||||
|         layout.label(text = "Flip Options") |         layout.label(text="Flip Options", text_ctxt='BBP/OP_ADDS_rail.SharedScrewRailInputProperty/draw') | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.prop(self, "rail_screw_flip_x", toggle = 1) |         row.prop(self, "rail_screw_flip_x", toggle = 1) | ||||||
|         row.prop(self, "rail_screw_flip_y", toggle = 1) |         row.prop(self, "rail_screw_flip_y", toggle = 1) | ||||||
| @ -263,7 +263,7 @@ class BBP_OT_add_transition_section(bpy.types.Operator): | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'No Options Available') |         layout.label(text='No Options Available', text_ctxt='BBP_OT_add_transition_section/draw') | ||||||
|  |  | ||||||
| class BBP_OT_add_straight_rail(SharedExtraTransform, SharedRailSectionInputProperty, SharedRailCapInputProperty, SharedStraightRailInputProperty, bpy.types.Operator): | class BBP_OT_add_straight_rail(SharedExtraTransform, SharedRailSectionInputProperty, SharedRailCapInputProperty, SharedStraightRailInputProperty, bpy.types.Operator): | ||||||
|     """Add Straight Rail""" |     """Add Straight Rail""" | ||||||
| @ -286,7 +286,7 @@ class BBP_OT_add_straight_rail(SharedExtraTransform, SharedRailSectionInputPrope | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Straight Rail') |         layout.label(text='Straight Rail', text_ctxt='BBP_OT_add_straight_rail/draw') | ||||||
|         self.draw_rail_section_input(layout) |         self.draw_rail_section_input(layout) | ||||||
|         self.draw_straight_rail_input(layout) |         self.draw_straight_rail_input(layout) | ||||||
|         layout.separator() |         layout.separator() | ||||||
| @ -315,7 +315,7 @@ class BBP_OT_add_transition_rail(SharedExtraTransform, SharedRailCapInputPropert | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Transition Rail') |         layout.label(text='Transition Rail', text_ctxt='BBP_OT_add_transition_rail/draw') | ||||||
|         self.draw_straight_rail_input(layout) |         self.draw_straight_rail_input(layout) | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         self.draw_rail_cap_input(layout) |         self.draw_rail_cap_input(layout) | ||||||
| @ -355,7 +355,7 @@ class BBP_OT_add_side_rail(SharedExtraTransform, SharedRailCapInputProperty, Sha | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Side Rail') |         layout.label(text='Side Rail', text_ctxt='BBP_OT_add_side_rail/draw') | ||||||
|         layout.prop(self, 'side_rail_type') |         layout.prop(self, 'side_rail_type') | ||||||
|         self.draw_straight_rail_input(layout) |         self.draw_straight_rail_input(layout) | ||||||
|         layout.separator() |         layout.separator() | ||||||
| @ -395,7 +395,7 @@ class BBP_OT_add_arc_rail(SharedExtraTransform, SharedRailSectionInputProperty, | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Arc Rail') |         layout.label(text='Arc Rail', text_ctxt='BBP_OT_add_arc_rail/draw') | ||||||
|         self.draw_rail_section_input(layout) |         self.draw_rail_section_input(layout) | ||||||
|         self.draw_screw_rail_input(layout) |         self.draw_screw_rail_input(layout) | ||||||
|         layout.prop(self, "rail_screw_angle") |         layout.prop(self, "rail_screw_angle") | ||||||
| @ -445,7 +445,7 @@ class BBP_OT_add_spiral_rail(SharedExtraTransform, SharedRailCapInputProperty, S | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Spiral Rail') |         layout.label(text='Spiral Rail', text_ctxt='BBP_OT_add_spiral_rail/draw') | ||||||
|         self.draw_screw_rail_input(layout) |         self.draw_screw_rail_input(layout) | ||||||
|         layout.prop(self, "rail_screw_screw") |         layout.prop(self, "rail_screw_screw") | ||||||
|         layout.prop(self, "rail_screw_iterations") |         layout.prop(self, "rail_screw_iterations") | ||||||
| @ -489,7 +489,7 @@ class BBP_OT_add_side_spiral_rail(SharedExtraTransform, SharedRailSectionInputPr | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text = 'Spiral Rail') |         layout.label(text='Spiral Rail', text_ctxt='BBP_OT_add_side_spiral_rail/draw') | ||||||
|         self.draw_screw_rail_input(layout) |         self.draw_screw_rail_input(layout) | ||||||
|         layout.prop(self, "rail_screw_iterations") |         layout.prop(self, "rail_screw_iterations") | ||||||
|         layout.separator() |         layout.separator() | ||||||
|  | |||||||
| @ -79,7 +79,9 @@ def _export_virtools( | |||||||
|  |  | ||||||
|     # create temp folder |     # create temp folder | ||||||
|     with tempfile.TemporaryDirectory() as vt_temp_folder: |     with tempfile.TemporaryDirectory() as vt_temp_folder: | ||||||
|         print(f'Virtools Engine Temp: {vt_temp_folder}') |         tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Virtools Engine Temporary Directory: {0}', 'BBP_OT_export_virtools/execute') | ||||||
|  |         print(tr_text.format(vt_temp_folder)) | ||||||
|  |  | ||||||
|         # create virtools reader context |         # create virtools reader context | ||||||
|         with bmap.BMFileWriter( |         with bmap.BMFileWriter( | ||||||
|  | |||||||
| @ -43,7 +43,9 @@ class BBP_OT_import_virtools(bpy.types.Operator, UTIL_file_browser.ImportVirtool | |||||||
| def _import_virtools(file_name_: str, encodings_: tuple[str], resolver: UTIL_ioport_shared.ConflictResolver) -> None: | def _import_virtools(file_name_: str, encodings_: tuple[str], resolver: UTIL_ioport_shared.ConflictResolver) -> None: | ||||||
|     # create temp folder |     # create temp folder | ||||||
|     with tempfile.TemporaryDirectory() as vt_temp_folder: |     with tempfile.TemporaryDirectory() as vt_temp_folder: | ||||||
|         print(f'Virtools Engine Temp: {vt_temp_folder}') |         tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Virtools Engine Temporary Directory: {0}', 'BBP_OT_import_virtools/execute') | ||||||
|  |         print(tr_text.format(vt_temp_folder)) | ||||||
|  |  | ||||||
|         # create virtools reader context |         # create virtools reader context | ||||||
|         with bmap.BMFileReader( |         with bmap.BMFileReader( | ||||||
| @ -82,7 +84,9 @@ def _import_virtools_textures( | |||||||
|  |  | ||||||
|     # create another temp folder for raw data virtools texture importing |     # create another temp folder for raw data virtools texture importing | ||||||
|     with tempfile.TemporaryDirectory() as rawdata_temp: |     with tempfile.TemporaryDirectory() as rawdata_temp: | ||||||
|         print(f'Texture Raw Data Temp: {rawdata_temp}') |         tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Texture Raw Data Temporary Directory: {0}', 'BBP_OT_import_virtools/execute') | ||||||
|  |         print(tr_text.format(rawdata_temp)) | ||||||
|  |  | ||||||
|         for vttexture in reader.get_textures(): |         for vttexture in reader.get_textures(): | ||||||
|             tex_cret: typing.Callable[[], bpy.types.Image] |             tex_cret: typing.Callable[[], bpy.types.Image] | ||||||
|  | |||||||
| @ -30,7 +30,9 @@ class BBP_OT_fix_all_material(bpy.types.Operator): | |||||||
|                 counter_suc += 1 |                 counter_suc += 1 | ||||||
|  |  | ||||||
|         # report and return |         # report and return | ||||||
|         self.report({'INFO'}, f'Fix {counter_suc}/{counter_all} materials.') |         tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Fix {0}/{1} materials.', 'BBP_OT_fix_all_material/draw') | ||||||
|  |         self.report({'INFO'}, tr_text.format(counter_suc, counter_all)) | ||||||
|         return {'FINISHED'} |         return {'FINISHED'} | ||||||
|  |  | ||||||
| def register() -> None: | def register() -> None: | ||||||
|  | |||||||
| @ -112,22 +112,22 @@ class BBP_OT_legacy_align(bpy.types.Operator): | |||||||
|         return None |         return None | ||||||
|      |      | ||||||
|     apply_flag: bpy.props.BoolProperty( |     apply_flag: bpy.props.BoolProperty( | ||||||
|         name = "Apply Flag", |         # TR: Property not showen should not have name and desc. | ||||||
|         description = "Internal flag.", |         # name = "Apply Flag", | ||||||
|  |         # description = "Internal flag.", | ||||||
|         options = {'HIDDEN', 'SKIP_SAVE'}, |         options = {'HIDDEN', 'SKIP_SAVE'}, | ||||||
|         default = True, # default True value to make it as a "light" button, not a grey one. |         default = True, # default True value to make it as a "light" button, not a grey one. | ||||||
|         update = apply_flag_updated, |         update = apply_flag_updated | ||||||
|         translation_context = 'BBP_OT_legacy_align/property' |  | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|     recursive_hinder: bpy.props.BoolProperty( |     recursive_hinder: bpy.props.BoolProperty( | ||||||
|         # TR: internal used property should not have name and description, otherwise it will be translated. |         # TR: Property not showen should not have name and desc. | ||||||
|         # name = "Recursive Hinder", |         # name = "Recursive Hinder", | ||||||
|         # description = "An internal flag to prevent the loop calling to apply_flags's updator.", |         # description = "An internal flag to prevent the loop calling to apply_flags's updator.", | ||||||
|         options = {'HIDDEN', 'SKIP_SAVE'}, |         options = {'HIDDEN', 'SKIP_SAVE'}, | ||||||
|         default = False |         default = False | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|     align_history : bpy.props.CollectionProperty( |     align_history : bpy.props.CollectionProperty( | ||||||
|         # TR: same reason for no name and description. |         # TR: Property not showen should not have name and desc. | ||||||
|         # name = "Historys", |         # name = "Historys", | ||||||
|         # description = "Align history.", |         # description = "Align history.", | ||||||
|         type = BBP_PG_legacy_align_history |         type = BBP_PG_legacy_align_history | ||||||
| @ -179,7 +179,7 @@ class BBP_OT_legacy_align(bpy.types.Operator): | |||||||
|         col = layout.column() |         col = layout.column() | ||||||
|  |  | ||||||
|         # show axis |         # show axis | ||||||
|         col.label(text="Align Axis (Multi-selection)") |         col.label(text="Align Axis (Multi-selection)", text_ctxt='BBP_OT_legacy_align/draw') | ||||||
|         row = col.row() |         row = col.row() | ||||||
|         row.prop(entry, "align_x", toggle = 1) |         row.prop(entry, "align_x", toggle = 1) | ||||||
|         row.prop(entry, "align_y", toggle = 1) |         row.prop(entry, "align_y", toggle = 1) | ||||||
| @ -187,9 +187,9 @@ class BBP_OT_legacy_align(bpy.types.Operator): | |||||||
|  |  | ||||||
|         # show mode |         # show mode | ||||||
|         col.separator() |         col.separator() | ||||||
|         col.label(text = 'Current Object (Active Object)') |         col.label(text='Current Object (Active Object)', text_ctxt='BBP_OT_legacy_align/draw') | ||||||
|         col.prop(entry, "current_align_mode", expand = True) |         col.prop(entry, "current_align_mode", expand = True) | ||||||
|         col.label(text = 'Target Objects (Selected Objects)') |         col.label(text='Target Objects (Selected Objects)', text_ctxt='BBP_OT_legacy_align/draw') | ||||||
|         col.prop(entry, "target_align_mode", expand = True) |         col.prop(entry, "target_align_mode", expand = True) | ||||||
|  |  | ||||||
|         # show apply button |         # show apply button | ||||||
| @ -198,8 +198,10 @@ class BBP_OT_legacy_align(bpy.types.Operator): | |||||||
|         # only allow Apply when there is a selected axis |         # only allow Apply when there is a selected axis | ||||||
|         conditional_disable_area.enabled = entry.align_x == True or entry.align_y == True or entry.align_z == True |         conditional_disable_area.enabled = entry.align_x == True or entry.align_y == True or entry.align_z == True | ||||||
|         # show apply and counter |         # show apply and counter | ||||||
|         conditional_disable_area.prop(self, 'apply_flag', text = 'Apply', icon = 'CHECKMARK', toggle = 1) |         conditional_disable_area.prop(self, 'apply_flag', toggle = 1, text='Apply', icon='CHECKMARK', text_ctxt='BBP_OT_legacy_align/draw') | ||||||
|         conditional_disable_area.label(text = f'Total {len(histories) - 1} applied alignments') |         tr_text: str = bpy.app.translations.pgettext_iface( | ||||||
|  |             'Total {0} applied alignments', 'BBP_OT_legacy_align/draw') | ||||||
|  |         conditional_disable_area.label(text=tr_text.format(len(histories) - 1), translate=False) | ||||||
|  |  | ||||||
| #region Core Functions | #region Core Functions | ||||||
|  |  | ||||||
|  | |||||||
| @ -82,11 +82,14 @@ def _rename_core( | |||||||
|             reporter.leave_object(obj) |             reporter.leave_object(obj) | ||||||
|  |  | ||||||
|         # report data |         # report data | ||||||
|  |         tr_text_1: str = bpy.app.translations.pgettext_rpt('View console to get more detail', 'BBP/OP_OBJECT_naming_convention._rename_core()') | ||||||
|  |         tr_text_2: str = bpy.app.translations.pgettext_rpt('All: {0}', 'BBP/OP_OBJECT_naming_convention._rename_core()') | ||||||
|  |         tr_text_3: str = bpy.app.translations.pgettext_rpt('Failed: {0}', 'BBP/OP_OBJECT_naming_convention._rename_core()') | ||||||
|         UTIL_functions.message_box( |         UTIL_functions.message_box( | ||||||
|             ( |             ( | ||||||
|                 'View console to get more detail', |                 tr_text_1, | ||||||
|                 f'All: {reporter.get_all_objs_count()}', |                 tr_text_2.format(reporter.get_all_objs_count()), | ||||||
|                 f'Failed: {reporter.get_failed_objs_count()}' |                 tr_text_3.format(reporter.get_failed_objs_count()) | ||||||
|             ), |             ), | ||||||
|             'Rename System Report', |             'Rename System Report', | ||||||
|             UTIL_icons_manager.BlenderPresetIcons.Info.value |             UTIL_icons_manager.BlenderPresetIcons.Info.value | ||||||
|  | |||||||
| @ -60,12 +60,12 @@ class BBP_OT_select_object_by_virtools_group(bpy.types.Operator, PROP_virtools_g | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text='Selection Mode') |         layout.label(text='Selection Mode', text_ctxt='BBP_OT_select_object_by_virtools_group/draw') | ||||||
|         sublayout = layout.column()    # make selection expand vertically, not horizontal. |         sublayout = layout.column()    # make selection expand vertically, not horizontal. | ||||||
|         sublayout.prop(self, 'selection_mode', expand = True) |         sublayout.prop(self, 'selection_mode', expand = True) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text='Group Parameters') |         layout.label(text='Group Parameters', text_ctxt='BBP_OT_select_object_by_virtools_group/draw') | ||||||
|         self.draw_group_name_input(layout) |         self.draw_group_name_input(layout) | ||||||
|  |  | ||||||
| def _select_object_by_virtools_group(context: bpy.types.Context, group_name: str, mode: SelectMode) -> None: | def _select_object_by_virtools_group(context: bpy.types.Context, group_name: str, mode: SelectMode) -> None: | ||||||
|  | |||||||
| @ -171,24 +171,26 @@ class BBP_OT_flatten_uv(bpy.types.Operator): | |||||||
|         # do flatten uv and report |         # do flatten uv and report | ||||||
|         failed: int = _flatten_uv_wrapper(context.active_object.data, flatten_param_) |         failed: int = _flatten_uv_wrapper(context.active_object.data, flatten_param_) | ||||||
|         if failed != 0: |         if failed != 0: | ||||||
|             print(f'[Flatten UV] {failed} faces are not be processed correctly because process failed.') |             tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |                 '[Flatten UV] {0} faces are not be processed correctly because process failed.', 'BBP_OT_flatten_uv/execute') | ||||||
|  |             print(tr_text.format(failed)) | ||||||
|         return {'FINISHED'} |         return {'FINISHED'} | ||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.emboss = 'NORMAL' |         layout.emboss = 'NORMAL' | ||||||
|         layout.label(text = "Flatten Method") |         layout.label(text="Flatten Method", text_ctxt='BBP_OT_flatten_uv/draw') | ||||||
|         sublayout = layout.row() |         sublayout = layout.row() | ||||||
|         sublayout.prop(self, "flatten_method", expand = True) |         sublayout.prop(self, "flatten_method", expand = True) | ||||||
|         layout.prop(self, "reference_edge") |         layout.prop(self, "reference_edge") | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text = "Scale Mode") |         layout.label(text="Scale Mode", text_ctxt='BBP_OT_flatten_uv/draw') | ||||||
|         sublayout = layout.row() |         sublayout = layout.row() | ||||||
|         sublayout.prop(self, "scale_mode", expand = True) |         sublayout.prop(self, "scale_mode", expand = True) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text = "Scale Config") |         layout.label(text="Scale Configuration", text_ctxt='BBP_OT_flatten_uv/draw') | ||||||
|         if self.scale_mode == 'NUM': |         if self.scale_mode == 'NUM': | ||||||
|             layout.prop(self, "scale_number") |             layout.prop(self, "scale_number") | ||||||
|         else: |         else: | ||||||
|  | |||||||
| @ -76,8 +76,12 @@ def _get_rail_target(context: bpy.types.Context) -> tuple[bool, typing.Iterable[ | |||||||
|     if has_invalid_objs: |     if has_invalid_objs: | ||||||
|         # output to console |         # output to console | ||||||
|         print('') |         print('') | ||||||
|         print('========== Rail UV Report ==========') |         tr_text: str = bpy.app.translations.pgettext_rpt('Rail UV Report', 'BBP_OT_rail_uv/execute') | ||||||
|         print('Following objects are not processed by Rail UV because they do not meet the requirements of Rail UV.') |         print(f'========== {tr_text} ==========') | ||||||
|  |         print(bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Following objects are not processed by Rail UV because they do not meet the requirements of Rail UV.', | ||||||
|  |             'BBP_OT_rail_uv/execute' | ||||||
|  |         )) | ||||||
|         for objname in error_objname: |         for objname in error_objname: | ||||||
|             print(objname) |             print(objname) | ||||||
|         print('') |         print('') | ||||||
|  | |||||||
| @ -39,9 +39,9 @@ class BBPPreferences(bpy.types.AddonPreferences): | |||||||
|          |          | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         col = row.column() |         col = row.column() | ||||||
|         col.label(text = "Ballance Texture Folder") |         col.label(text="Ballance Texture Folder", text_ctxt='BBPPreferences/draw') | ||||||
|         col.prop(self, "ballance_texture_folder", text = "") |         col.prop(self, "ballance_texture_folder", text = "") | ||||||
|         col.label(text = "No Component Collection") |         col.label(text="No Component Collection", text_ctxt='BBPPreferences/draw') | ||||||
|         col.prop(self, "no_component_collection", text = "") |         col.prop(self, "no_component_collection", text = "") | ||||||
|  |  | ||||||
| def get_preferences() -> BBPPreferences: | def get_preferences() -> BBPPreferences: | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ from . import UTIL_functions, UTIL_virtools_types | |||||||
| class BBP_PG_bmap_encoding(bpy.types.PropertyGroup): | class BBP_PG_bmap_encoding(bpy.types.PropertyGroup): | ||||||
|     encoding: bpy.props.StringProperty( |     encoding: bpy.props.StringProperty( | ||||||
|         name = "Encoding", |         name = "Encoding", | ||||||
|  |         description = "The name of BMap used encoding.", | ||||||
|         default = "", |         default = "", | ||||||
|         translation_context = 'BBP_PG_bmap_encoding/property' |         translation_context = 'BBP_PG_bmap_encoding/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
| @ -42,7 +43,7 @@ class BBP_PG_ptrprop_resolver(bpy.types.PropertyGroup): | |||||||
|         translation_context = 'BBP_PG_ptrprop_resolver/property' |         translation_context = 'BBP_PG_ptrprop_resolver/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     # TR: These encoding related items should not have explicit name and description |     # TR: Properties not showen should not have name and desc. | ||||||
|     ioport_encodings: bpy.props.CollectionProperty(type = BBP_PG_bmap_encoding) # type: ignore |     ioport_encodings: bpy.props.CollectionProperty(type = BBP_PG_bmap_encoding) # type: ignore | ||||||
|     active_ioport_encodings: bpy.props.IntProperty() # type: ignore |     active_ioport_encodings: bpy.props.IntProperty() # type: ignore | ||||||
|  |  | ||||||
|  | |||||||
| @ -252,21 +252,21 @@ class SharedGroupNameInputProperties(): | |||||||
|             ('DEFINED', "Predefined", "Pre-defined group name."), |             ('DEFINED', "Predefined", "Pre-defined group name."), | ||||||
|             ('CUSTOM', "Custom", "User specified group name."), |             ('CUSTOM', "Custom", "User specified group name."), | ||||||
|         ), |         ), | ||||||
|         translation_context = 'BME/PROP_virtools_grourp.SharedGroupNameInputProperties/property' |         translation_context = 'BBP/PROP_virtools_grourp.SharedGroupNameInputProperties/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|      |      | ||||||
|     preset_group_name: bpy.props.EnumProperty( |     preset_group_name: bpy.props.EnumProperty( | ||||||
|         name = "Group Name", |         name = "Group Name", | ||||||
|         description = "Pick vanilla Ballance group name.", |         description = "Pick vanilla Ballance group name.", | ||||||
|         items = _g_EnumHelper_Group.generate_items(), |         items = _g_EnumHelper_Group.generate_items(), | ||||||
|         translation_context = 'BME/PROP_virtools_grourp.SharedGroupNameInputProperties/property' |         translation_context = 'BBP/PROP_virtools_grourp.SharedGroupNameInputProperties/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|      |      | ||||||
|     custom_group_name: bpy.props.StringProperty( |     custom_group_name: bpy.props.StringProperty( | ||||||
|         name = "Custom Group Name", |         name = "Custom Group Name", | ||||||
|         description = "Input your custom group name.", |         description = "Input your custom group name.", | ||||||
|         default = "", |         default = "", | ||||||
|         translation_context = 'BME/PROP_virtools_grourp.SharedGroupNameInputProperties/property' |         translation_context = 'BBP/PROP_virtools_grourp.SharedGroupNameInputProperties/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|      |      | ||||||
|     def draw_group_name_input(self, layout: bpy.types.UILayout) -> None: |     def draw_group_name_input(self, layout: bpy.types.UILayout) -> None: | ||||||
| @ -388,7 +388,9 @@ class BBP_PT_virtools_groups(bpy.types.Panel): | |||||||
|  |  | ||||||
|         # notify on non-mesh object |         # notify on non-mesh object | ||||||
|         if target.type != 'MESH': |         if target.type != 'MESH': | ||||||
|             layout.label(text = 'Virtools Group is invalid on non-mesh object!', icon = 'ERROR') |             layout.label( | ||||||
|  |                 text='Virtools Group is invalid on non-mesh object!', icon='ERROR', | ||||||
|  |                 text_ctxt='BBP_PT_virtools_groups/draw') | ||||||
|  |  | ||||||
|         # draw main body |         # draw main body | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|  | |||||||
| @ -283,11 +283,13 @@ class BBP_PT_virtools_light(bpy.types.Panel): | |||||||
|         rawdata: RawVirtoolsLight = get_raw_virtools_light(lit) |         rawdata: RawVirtoolsLight = get_raw_virtools_light(lit) | ||||||
|  |  | ||||||
|         # draw operator |         # draw operator | ||||||
|         layout.operator(BBP_OT_apply_virtools_light.bl_idname, text = 'Apply', icon = 'NODETREE') |         layout.operator( | ||||||
|  |             BBP_OT_apply_virtools_light.bl_idname, text='Apply', icon='NODETREE', | ||||||
|  |             text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|  |  | ||||||
|         # draw data |         # draw data | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text = 'Basics') |         layout.label(text='Basics', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|         # all lights has type and color property |         # all lights has type and color property | ||||||
|         sublayout = layout.row() |         sublayout = layout.row() | ||||||
|         sublayout.use_property_split = False |         sublayout.use_property_split = False | ||||||
| @ -300,15 +302,15 @@ class BBP_PT_virtools_light(bpy.types.Panel): | |||||||
|         # all light has attenuation exception directional light |         # all light has attenuation exception directional light | ||||||
|         if rawdata.mType != UTIL_virtools_types.VXLIGHT_TYPE.VX_LIGHTDIREC: |         if rawdata.mType != UTIL_virtools_types.VXLIGHT_TYPE.VX_LIGHTDIREC: | ||||||
|             layout.separator() |             layout.separator() | ||||||
|             layout.label(text = 'Attenuation') |             layout.label(text='Attenuation', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|             layout.prop(props, 'constant_attenuation', text = 'Constant') |             layout.prop(props, 'constant_attenuation', text='Constant', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|             layout.prop(props, 'linear_attenuation', text = 'Linear') |             layout.prop(props, 'linear_attenuation', text='Linear', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|             layout.prop(props, 'quadratic_attenuation', text = 'Quadratic') |             layout.prop(props, 'quadratic_attenuation', text='Quadratic', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|  |  | ||||||
|         # only spot light has spot cone properties. |         # only spot light has spot cone properties. | ||||||
|         if rawdata.mType == UTIL_virtools_types.VXLIGHT_TYPE.VX_LIGHTSPOT: |         if rawdata.mType == UTIL_virtools_types.VXLIGHT_TYPE.VX_LIGHTSPOT: | ||||||
|             layout.separator() |             layout.separator() | ||||||
|             layout.label(text = 'Spot Cone') |             layout.label(text='Spot Cone', text_ctxt='BBP_PT_virtools_light/draw') | ||||||
|             layout.prop(props, 'hot_spot') |             layout.prop(props, 'hot_spot') | ||||||
|             layout.prop(props, 'falloff') |             layout.prop(props, 'falloff') | ||||||
|             layout.prop(props, 'falloff_shape') |             layout.prop(props, 'falloff_shape') | ||||||
|  | |||||||
| @ -907,7 +907,7 @@ class BBP_OT_apply_virtools_material(bpy.types.Operator): | |||||||
|         return context.material is not None |         return context.material is not None | ||||||
|      |      | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         mtl: bpy.types.Material = context.material |         mtl = typing.cast(bpy.types.Material, context.material) | ||||||
|         apply_to_blender_material(mtl) |         apply_to_blender_material(mtl) | ||||||
|         return {'FINISHED'} |         return {'FINISHED'} | ||||||
|  |  | ||||||
| @ -930,7 +930,7 @@ class BBP_OT_fix_single_material(bpy.types.Operator): | |||||||
|      |      | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         # get mtl and try to fix |         # get mtl and try to fix | ||||||
|         mtl: bpy.types.Material = context.material |         mtl = typing.cast(bpy.types.Material, context.material) | ||||||
|         ret: bool = fix_material(mtl) |         ret: bool = fix_material(mtl) | ||||||
|  |  | ||||||
|         # if suc, apply to blender mtl and show info |         # if suc, apply to blender mtl and show info | ||||||
| @ -969,7 +969,7 @@ class BBP_OT_preset_virtools_material(bpy.types.Operator): | |||||||
|      |      | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         # get essential value |         # get essential value | ||||||
|         mtl: bpy.types.Material = context.material |         mtl = typing.cast(bpy.types.Material, context.material) | ||||||
|         expected_preset: MaterialPresetType = _g_Helper_MtlPreset.get_selection(self.preset_type) |         expected_preset: MaterialPresetType = _g_Helper_MtlPreset.get_selection(self.preset_type) | ||||||
|          |          | ||||||
|         # apply preset to material |         # apply preset to material | ||||||
| @ -982,7 +982,7 @@ class BBP_OT_direct_set_virtools_texture(bpy.types.Operator, UTIL_file_browser.I | |||||||
|     """Import and Assign Texture Directly""" |     """Import and Assign Texture Directly""" | ||||||
|     bl_idname = "bbp.direct_set_virtools_texture" |     bl_idname = "bbp.direct_set_virtools_texture" | ||||||
|     bl_label = "Import and Assign Texture" |     bl_label = "Import and Assign Texture" | ||||||
|     bl_options = {'UNDO'} |     bl_options = {'UNDO', 'INTERNAL'} # NOTE: Use 'INTERNAL' to remove it from search result. | ||||||
|     bl_translation_context = 'BBP_OT_direct_set_virtools_texture' |     bl_translation_context = 'BBP_OT_direct_set_virtools_texture' | ||||||
|      |      | ||||||
|     @classmethod |     @classmethod | ||||||
| @ -1004,7 +1004,7 @@ class BBP_OT_direct_set_virtools_texture(bpy.types.Operator, UTIL_file_browser.I | |||||||
|      |      | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         # get assoc mtl |         # get assoc mtl | ||||||
|         mtl: bpy.types.Material = context.material |         mtl = typing.cast(bpy.types.Material, context.material) | ||||||
|         rawmtl: RawVirtoolsMaterial = get_raw_virtools_material(mtl) |         rawmtl: RawVirtoolsMaterial = get_raw_virtools_material(mtl) | ||||||
|  |  | ||||||
|         # import texture according to whether it is ballance texture |         # import texture according to whether it is ballance texture | ||||||
| @ -1045,18 +1045,22 @@ class BBP_PT_virtools_material(bpy.types.Panel): | |||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         # get layout and target |         # get layout and target | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         mtl: bpy.types.Material = context.material |         mtl = typing.cast(bpy.types.Material, context.material) | ||||||
|         props: BBP_PG_virtools_material = get_virtools_material(mtl) |         props: BBP_PG_virtools_material = get_virtools_material(mtl) | ||||||
|         rawdata: RawVirtoolsMaterial = get_raw_virtools_material(mtl) |         rawdata: RawVirtoolsMaterial = get_raw_virtools_material(mtl) | ||||||
|          |          | ||||||
|         # draw operator |         # draw operator | ||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.operator(BBP_OT_preset_virtools_material.bl_idname, text = 'Preset', icon = "PRESET") |         row.operator( | ||||||
|         row.operator(BBP_OT_apply_virtools_material.bl_idname, text = 'Apply', icon = "NODETREE") |             BBP_OT_preset_virtools_material.bl_idname, text='Preset', icon = "PRESET", | ||||||
|         row.operator(BBP_OT_fix_single_material.bl_idname, text = '', icon = "MODIFIER") |             text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|  |         row.operator( | ||||||
|  |             BBP_OT_apply_virtools_material.bl_idname, text='Apply', icon = "NODETREE", | ||||||
|  |             text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|  |         row.operator(BBP_OT_fix_single_material.bl_idname, text='', icon = "MODIFIER") | ||||||
|  |  | ||||||
|         # draw data |         # draw data | ||||||
|         layout.label(text="Color Parameters") |         layout.label(text="Color Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         layout.prop(props, 'ambient') |         layout.prop(props, 'ambient') | ||||||
|         layout.prop(props, 'diffuse') |         layout.prop(props, 'diffuse') | ||||||
|         layout.prop(props, 'specular') |         layout.prop(props, 'specular') | ||||||
| @ -1064,22 +1068,22 @@ class BBP_PT_virtools_material(bpy.types.Panel): | |||||||
|         layout.prop(props, 'specular_power') |         layout.prop(props, 'specular_power') | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Mode Parameters") |         layout.label(text="Mode Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         layout.prop(props, 'enable_two_sided') |         layout.prop(props, 'enable_two_sided') | ||||||
|         layout.prop(props, 'fill_mode') |         layout.prop(props, 'fill_mode') | ||||||
|         layout.prop(props, 'shade_mode') |         layout.prop(props, 'shade_mode') | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Texture Parameters") |         layout.label(text="Texture Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         # texture prop with direct importing |         # texture prop with direct importing | ||||||
|         sublay = layout.row() |         sublay = layout.row() | ||||||
|         sublay.prop(props, 'texture', emboss = True) |         sublay.prop(props, 'texture', emboss = True) | ||||||
|         sublay.operator(BBP_OT_direct_set_virtools_texture.bl_idname, text = '', icon = 'FILEBROWSER') |         sublay.operator(BBP_OT_direct_set_virtools_texture.bl_idname, text='', icon='FILEBROWSER') | ||||||
|         # texture detail |         # texture detail | ||||||
|         if rawdata.mTexture is not None: |         if rawdata.mTexture is not None: | ||||||
|             # have texture, show texture settings and enclosed by a border. |             # have texture, show texture settings and enclosed by a border. | ||||||
|             boxlayout = layout.box() |             boxlayout = layout.box() | ||||||
|             boxlayout.label(text="Virtools Texture Settings") |             boxlayout.label(text="Virtools Texture Settings", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|             PROP_virtools_texture.draw_virtools_texture(props.texture, boxlayout) |             PROP_virtools_texture.draw_virtools_texture(props.texture, boxlayout) | ||||||
|  |  | ||||||
|         layout.prop(props, 'texture_blend_mode') |         layout.prop(props, 'texture_blend_mode') | ||||||
| @ -1091,21 +1095,21 @@ class BBP_PT_virtools_material(bpy.types.Panel): | |||||||
|             layout.prop(props, 'texture_border_color') |             layout.prop(props, 'texture_border_color') | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Alpha Test Parameters") |         layout.label(text="Alpha Test Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         layout.prop(props, 'enable_alpha_test') |         layout.prop(props, 'enable_alpha_test') | ||||||
|         if rawdata.mEnableAlphaTest: |         if rawdata.mEnableAlphaTest: | ||||||
|             layout.prop(props, 'alpha_func') |             layout.prop(props, 'alpha_func') | ||||||
|             layout.prop(props, 'alpha_ref') |             layout.prop(props, 'alpha_ref') | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Alpha Blend Parameters") |         layout.label(text="Alpha Blend Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         layout.prop(props, 'enable_alpha_blend') |         layout.prop(props, 'enable_alpha_blend') | ||||||
|         if rawdata.mEnableAlphaBlend: |         if rawdata.mEnableAlphaBlend: | ||||||
|             layout.prop(props, 'source_blend') |             layout.prop(props, 'source_blend') | ||||||
|             layout.prop(props, 'dest_blend') |             layout.prop(props, 'dest_blend') | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Z Write Parameters") |         layout.label(text="Z Write Parameters", text_ctxt='BBP_PT_virtools_material/draw') | ||||||
|         layout.prop(props, 'enable_z_write') |         layout.prop(props, 'enable_z_write') | ||||||
|         if rawdata.mEnableZWrite: |         if rawdata.mEnableZWrite: | ||||||
|             layout.prop(props, 'z_func') |             layout.prop(props, 'z_func') | ||||||
|  | |||||||
| @ -88,7 +88,7 @@ class ExportVirtoolsFile(bpy_extras.io_utils.ExportHelper): | |||||||
| class ImportDirectory(bpy_extras.io_utils.ImportHelper): | class ImportDirectory(bpy_extras.io_utils.ImportHelper): | ||||||
|  |  | ||||||
|     # add directory prop to receive directory |     # add directory prop to receive directory | ||||||
|     directory: bpy.props.StringProperty() |     directory: bpy.props.StringProperty() # type: ignore | ||||||
|  |  | ||||||
|     # blank filter |     # blank filter | ||||||
|     filter_glob: bpy.props.StringProperty( |     filter_glob: bpy.props.StringProperty( | ||||||
|  | |||||||
| @ -159,7 +159,7 @@ class ImportParams(): | |||||||
|         items = _g_EnumHelper_ConflictStrategy.generate_items(), |         items = _g_EnumHelper_ConflictStrategy.generate_items(), | ||||||
|         description = "Define how to process texture name conflict", |         description = "Define how to process texture name conflict", | ||||||
|         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Current), |         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Current), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ImportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ImportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     material_conflict_strategy: bpy.props.EnumProperty( |     material_conflict_strategy: bpy.props.EnumProperty( | ||||||
| @ -167,7 +167,7 @@ class ImportParams(): | |||||||
|         items = _g_EnumHelper_ConflictStrategy.generate_items(), |         items = _g_EnumHelper_ConflictStrategy.generate_items(), | ||||||
|         description = "Define how to process material name conflict", |         description = "Define how to process material name conflict", | ||||||
|         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), |         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ImportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ImportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     mesh_conflict_strategy: bpy.props.EnumProperty( |     mesh_conflict_strategy: bpy.props.EnumProperty( | ||||||
| @ -175,7 +175,7 @@ class ImportParams(): | |||||||
|         items = _g_EnumHelper_ConflictStrategy.generate_items(), |         items = _g_EnumHelper_ConflictStrategy.generate_items(), | ||||||
|         description = "Define how to process mesh name conflict", |         description = "Define how to process mesh name conflict", | ||||||
|         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), |         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ImportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ImportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     light_conflict_strategy: bpy.props.EnumProperty( |     light_conflict_strategy: bpy.props.EnumProperty( | ||||||
| @ -183,7 +183,7 @@ class ImportParams(): | |||||||
|         items = _g_EnumHelper_ConflictStrategy.generate_items(), |         items = _g_EnumHelper_ConflictStrategy.generate_items(), | ||||||
|         description = "Define how to process light name conflict", |         description = "Define how to process light name conflict", | ||||||
|         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), |         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ImportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ImportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     object_conflict_strategy: bpy.props.EnumProperty( |     object_conflict_strategy: bpy.props.EnumProperty( | ||||||
| @ -191,28 +191,29 @@ class ImportParams(): | |||||||
|         items = _g_EnumHelper_ConflictStrategy.generate_items(), |         items = _g_EnumHelper_ConflictStrategy.generate_items(), | ||||||
|         description = "Define how to process object name conflict", |         description = "Define how to process object name conflict", | ||||||
|         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), |         default = _g_EnumHelper_ConflictStrategy.to_selection(ConflictStrategy.Rename), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ImportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ImportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     def draw_import_params(self, layout: bpy.types.UILayout) -> None: |     def draw_import_params(self, layout: bpy.types.UILayout) -> None: | ||||||
|         header: bpy.types.UILayout |         header: bpy.types.UILayout | ||||||
|         body: bpy.types.UILayout |         body: bpy.types.UILayout | ||||||
|         header, body = layout.panel("BBP_PT_ioport_shared_import_params", default_closed=False) |         header, body = layout.panel("BBP_PT_ioport_shared_import_params", default_closed=False) | ||||||
|         header.label(text = 'Import Parameters') |         header.label(text='Import Parameters', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|  |         # NOTE: if panel is collapsed, body will be None. So we need check it. | ||||||
|         if body is None: return |         if body is None: return | ||||||
|  |  | ||||||
|         body.label(text = 'Name Conflict Strategy') |         body.label(text='Name Conflict Strategy', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid = body.grid_flow(row_major = False, columns = 2) |         grid = body.grid_flow(row_major=False, columns=2) | ||||||
|         grid.label(text = 'Object', icon = 'CUBE') |         grid.label(text='Object', icon='CUBE', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid.label(text = 'Light', icon = 'LIGHT') |         grid.label(text='Light', icon='LIGHT', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid.label(text = 'Mesh', icon = 'MESH_DATA') |         grid.label(text='Mesh', icon='MESH_DATA', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid.label(text = 'Material', icon = 'MATERIAL') |         grid.label(text='Material', icon='MATERIAL', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid.label(text = 'Texture', icon = 'TEXTURE') |         grid.label(text='Texture', icon='TEXTURE', text_ctxt='BBP/UTIL_ioport_shared.ImportParams/draw') | ||||||
|         grid.prop(self, 'object_conflict_strategy', text = '') |         grid.prop(self, 'object_conflict_strategy', text='') | ||||||
|         grid.prop(self, 'light_conflict_strategy', text = '') |         grid.prop(self, 'light_conflict_strategy', text='') | ||||||
|         grid.prop(self, 'mesh_conflict_strategy', text = '') |         grid.prop(self, 'mesh_conflict_strategy', text='') | ||||||
|         grid.prop(self, 'material_conflict_strategy', text = '') |         grid.prop(self, 'material_conflict_strategy', text='') | ||||||
|         grid.prop(self, 'texture_conflict_strategy', text = '') |         grid.prop(self, 'texture_conflict_strategy', text='') | ||||||
|  |  | ||||||
|     def general_get_texture_conflict_strategy(self) -> ConflictStrategy: |     def general_get_texture_conflict_strategy(self) -> ConflictStrategy: | ||||||
|         return _g_EnumHelper_ConflictStrategy.get_selection(self.texture_conflict_strategy) |         return _g_EnumHelper_ConflictStrategy.get_selection(self.texture_conflict_strategy) | ||||||
| @ -245,20 +246,20 @@ class ExportParams(): | |||||||
|             ('COLLECTION', "Collection", "Export a collection", 'OUTLINER_COLLECTION', 0), |             ('COLLECTION', "Collection", "Export a collection", 'OUTLINER_COLLECTION', 0), | ||||||
|             ('OBJECT', "Object", "Export an object", 'OBJECT_DATA', 1), |             ('OBJECT', "Object", "Export an object", 'OBJECT_DATA', 1), | ||||||
|         ), |         ), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.ExportParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.ExportParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     def draw_export_params(self, context: bpy.types.Context, layout: bpy.types.UILayout) -> None: |     def draw_export_params(self, context: bpy.types.Context, layout: bpy.types.UILayout) -> None: | ||||||
|         header: bpy.types.UILayout |         header: bpy.types.UILayout | ||||||
|         body: bpy.types.UILayout |         body: bpy.types.UILayout | ||||||
|         header, body = layout.panel("BBP_PT_ioport_shared_export_params", default_closed=False) |         header, body = layout.panel("BBP_PT_ioport_shared_export_params", default_closed=False) | ||||||
|         header.label(text = 'Export Parameters') |         header.label(text='Export Parameters', text_ctxt='BBP/UTIL_ioport_shared.ExportParams/draw') | ||||||
|         if body is None: return |         if body is None: return | ||||||
|  |  | ||||||
|         # make prop expand horizontaly, not vertical. |         # make prop expand horizontaly, not vertical. | ||||||
|         horizon_body = body.row() |         horizon_body = body.row() | ||||||
|         # draw switch |         # draw switch | ||||||
|         horizon_body.prop(self, "export_mode", expand = True) |         horizon_body.prop(self, "export_mode", expand=True) | ||||||
|  |  | ||||||
|         # draw picker |         # draw picker | ||||||
|         ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene) |         ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene) | ||||||
| @ -291,14 +292,14 @@ class VirtoolsParams(): | |||||||
|         description = "Decide how texture saved if texture is specified as Use Global as its Save Options.", |         description = "Decide how texture saved if texture is specified as Use Global as its Save Options.", | ||||||
|         items = _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.generate_items(), |         items = _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.generate_items(), | ||||||
|         default = _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.to_selection(UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL), |         default = _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.to_selection(UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_EXTERNAL), | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.VirtoolsParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.VirtoolsParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     use_compress: bpy.props.BoolProperty( |     use_compress: bpy.props.BoolProperty( | ||||||
|         name="Use Compress", |         name="Use Compress", | ||||||
|         description = "Whether use ZLib to compress result when saving composition.", |         description = "Whether use ZLib to compress result when saving composition.", | ||||||
|         default = True, |         default = True, | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.VirtoolsParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.VirtoolsParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     compress_level: bpy.props.IntProperty( |     compress_level: bpy.props.IntProperty( | ||||||
| @ -306,29 +307,29 @@ class VirtoolsParams(): | |||||||
|         description = "The ZLib compress level used by Virtools Engine when saving composition.", |         description = "The ZLib compress level used by Virtools Engine when saving composition.", | ||||||
|         min = 1, max = 9, |         min = 1, max = 9, | ||||||
|         default = 5, |         default = 5, | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.VirtoolsParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.VirtoolsParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     def draw_virtools_params(self, context: bpy.types.Context, layout: bpy.types.UILayout, is_importer: bool) -> None: |     def draw_virtools_params(self, context: bpy.types.Context, layout: bpy.types.UILayout, is_importer: bool) -> None: | ||||||
|         header: bpy.types.UILayout |         header: bpy.types.UILayout | ||||||
|         body: bpy.types.UILayout |         body: bpy.types.UILayout | ||||||
|         header, body = layout.panel("BBP_PT_ioport_shared_virtools_params", default_closed=False) |         header, body = layout.panel("BBP_PT_ioport_shared_virtools_params", default_closed=False) | ||||||
|         header.label(text = 'Virtools Parameters') |         header.label(text='Virtools Parameters', text_ctxt='BBP/UTIL_ioport_shared.VirtoolsParams/draw') | ||||||
|         if body is None: return |         if body is None: return | ||||||
|  |  | ||||||
|         # draw encodings |         # draw encodings | ||||||
|         body.label(text = 'Encodings') |         body.label(text='Encodings', text_ctxt='BBP/UTIL_ioport_shared.VirtoolsParams/draw') | ||||||
|         ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene) |         ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene) | ||||||
|         ptrprops.draw_ioport_encodings(body) |         ptrprops.draw_ioport_encodings(body) | ||||||
|  |  | ||||||
|         # following field are only valid in exporter |         # following field are only valid in exporter | ||||||
|         if not is_importer: |         if not is_importer: | ||||||
|             body.separator() |             body.separator() | ||||||
|             body.label(text = 'Global Texture Save Options') |             body.label(text='Global Texture Save Options', text_ctxt='BBP/UTIL_ioport_shared.VirtoolsParams/draw') | ||||||
|             body.prop(self, 'texture_save_opt', text = '') |             body.prop(self, 'texture_save_opt', text='') | ||||||
|  |  | ||||||
|             body.separator() |             body.separator() | ||||||
|             body.label(text = 'Compression') |             body.label(text='Compression', text_ctxt='BBP/UTIL_ioport_shared.VirtoolsParams/draw') | ||||||
|             body.prop(self, 'use_compress') |             body.prop(self, 'use_compress') | ||||||
|             if self.use_compress: |             if self.use_compress: | ||||||
|                 body.prop(self, 'compress_level') |                 body.prop(self, 'compress_level') | ||||||
| @ -353,7 +354,7 @@ class BallanceParams(): | |||||||
|         name="Successive Sector", |         name="Successive Sector", | ||||||
|         description = "Whether order exporter to use document specified sector count to make sure sector is successive.", |         description = "Whether order exporter to use document specified sector count to make sure sector is successive.", | ||||||
|         default = True, |         default = True, | ||||||
|         translation_context = 'BME/UTIL_ioport_shared.BallanceParams/property' |         translation_context = 'BBP/UTIL_ioport_shared.BallanceParams/property' | ||||||
|     ) # type: ignore |     ) # type: ignore | ||||||
|  |  | ||||||
|     def draw_ballance_params(self, layout: bpy.types.UILayout, is_importer: bool) -> None: |     def draw_ballance_params(self, layout: bpy.types.UILayout, is_importer: bool) -> None: | ||||||
| @ -365,12 +366,14 @@ class BallanceParams(): | |||||||
|         header: bpy.types.UILayout |         header: bpy.types.UILayout | ||||||
|         body: bpy.types.UILayout |         body: bpy.types.UILayout | ||||||
|         header, body = layout.panel("BBP_PT_ioport_shared_ballance_params", default_closed=False) |         header, body = layout.panel("BBP_PT_ioport_shared_ballance_params", default_closed=False) | ||||||
|         header.label(text = 'Ballance Parameters') |         header.label(text='Ballance Parameters', text_ctxt='BBP/UTIL_ioport_shared.BallanceParams/draw') | ||||||
|         if body is None: return |         if body is None: return | ||||||
|  |  | ||||||
|         map_info: PROP_ballance_map_info.RawBallanceMapInfo = PROP_ballance_map_info.get_raw_ballance_map_info(bpy.context.scene) |         map_info: PROP_ballance_map_info.RawBallanceMapInfo = PROP_ballance_map_info.get_raw_ballance_map_info(bpy.context.scene) | ||||||
|         body.prop(self, 'successive_sector') |         body.prop(self, 'successive_sector') | ||||||
|         body.label(text = f'Map Sectors: {map_info.mSectorCount}') |         tr_text: str = bpy.app.translations.pgettext_iface( | ||||||
|  |             'Map Sectors: {0}', 'BBP/UTIL_ioport_shared.BallanceParams/draw') | ||||||
|  |         body.label(text=tr_text.format(map_info.mSectorCount), translate=False) | ||||||
|  |  | ||||||
|     def general_get_successive_sector(self) -> bool: |     def general_get_successive_sector(self) -> bool: | ||||||
|         return self.successive_sector |         return self.successive_sector | ||||||
|  | |||||||
| @ -70,7 +70,10 @@ class RenameErrorReporter(): | |||||||
|     def __enter__(self): |     def __enter__(self): | ||||||
|         # print console report header |         # print console report header | ||||||
|         print('============') |         print('============') | ||||||
|         print('Rename Report') |         print(bpy.app.translations.pgettext_rpt( | ||||||
|  |             'Rename Report', | ||||||
|  |             'BBP/UTIL_naming_convension.RenameErrorReporter' | ||||||
|  |         )) | ||||||
|         print('------------') |         print('------------') | ||||||
|         # return self as context |         # return self as context | ||||||
|         return self |         return self | ||||||
| @ -78,7 +81,9 @@ class RenameErrorReporter(): | |||||||
|     def __exit__(self, exc_type, exc_value, traceback): |     def __exit__(self, exc_type, exc_value, traceback): | ||||||
|         # print console report tail |         # print console report tail | ||||||
|         print('------------') |         print('------------') | ||||||
|         print(f'All / Failed - {self.mAllObjCounter} / {self.mFailedObjCounter}') |         tr_text: str = bpy.app.translations.pgettext_rpt( | ||||||
|  |             'All / Failed - {0} / {1}', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|  |         print(tr_text.format(self.mAllObjCounter, self.mFailedObjCounter)) | ||||||
|         print('============') |         print('============') | ||||||
|         # reset variables |         # reset variables | ||||||
|         self.mAllObjCounter = 0 |         self.mAllObjCounter = 0 | ||||||
| @ -99,11 +104,14 @@ class RenameErrorReporter(): | |||||||
|  |  | ||||||
|         # output header |         # output header | ||||||
|         # if new name is different with old name, output both of them |         # if new name is different with old name, output both of them | ||||||
|  |         tr_text: str | ||||||
|         new_name: str = obj.name |         new_name: str = obj.name | ||||||
|         if self.mOldName == new_name: |         if self.mOldName == new_name: | ||||||
|             print(f'For object "{new_name}"') |             tr_text = bpy.app.translations.pgettext_rpt('For object "{0}"', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|  |             print(tr_text.format(new_name)) | ||||||
|         else: |         else: | ||||||
|             print(f'For object "{new_name}" (Old name: "{self.mOldName}")') |             tr_text = bpy.app.translations.pgettext_rpt('For object "{0}" (Old name: "{1}")', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|  |             print(tr_text.format(new_name, self.mOldName)) | ||||||
|  |  | ||||||
|         # output error list with indent |         # output error list with indent | ||||||
|         for item in self.mErrList: |         for item in self.mErrList: | ||||||
| @ -116,9 +124,12 @@ class RenameErrorReporter(): | |||||||
|     @staticmethod |     @staticmethod | ||||||
|     def __errtype_to_string(err_v: _RenameErrorType) -> str: |     def __errtype_to_string(err_v: _RenameErrorType) -> str: | ||||||
|         match(err_v): |         match(err_v): | ||||||
|             case _RenameErrorType.ERROR: return 'ERROR' |             case _RenameErrorType.ERROR: | ||||||
|             case _RenameErrorType.WARNING: return 'WARN' |                 return bpy.app.translations.pgettext_rpt('ERROR', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|             case _RenameErrorType.INFO: return 'INFO' |             case _RenameErrorType.WARNING: | ||||||
|  |                 return bpy.app.translations.pgettext_rpt('WARN', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|  |             case _RenameErrorType.INFO: | ||||||
|  |                 return bpy.app.translations.pgettext_rpt('INFO', 'BBP/UTIL_naming_convension.RenameErrorReporter') | ||||||
|             case _: raise UTIL_functions.BBPException("Unknown error type.") |             case _: raise UTIL_functions.BBPException("Unknown error type.") | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def __erritem_to_string(item: _RenameErrorItem) -> str: |     def __erritem_to_string(item: _RenameErrorItem) -> str: | ||||||
|  | |||||||
| @ -9,18 +9,21 @@ import bpy | |||||||
| #  BME module has its own context naming convention which make sure all configuration fields of prototypes are properly translated. | #  BME module has its own context naming convention which make sure all configuration fields of prototypes are properly translated. | ||||||
| #  This module also provide a corresponding function to compute these context string from given BME prototype name and the index of configuration fields. | #  This module also provide a corresponding function to compute these context string from given BME prototype name and the index of configuration fields. | ||||||
| #   | #   | ||||||
| #  For BBP plugin self, there is a priniciple list which you should follow when providing translation context. | #  For BBP plugin self, there is a list containing multiple priniciples which you should follow when providing translation context. | ||||||
| #  - For operator, menu, panel and etc, set their `bl_translation_context` to their names, such as `BBP_OT_some_operator` | #  - For operator, menu, panel and etc. | ||||||
| #  - For property located in operator, menu, panel and etc, set their `translation_context` to corresponding class name,  | #      * For themselves, fill `bl_translation_context` to their name, such as `BBP_OT_some_operator`. | ||||||
| #    plus `/property` suffix, such as `BBP_OT_some_operator/property`. | #      * For properties located inside, add `/property` suffix, such as `BBP_OT_some_operator/property`. | ||||||
| #  - For draw function located in operator, menu, panel and etc, set their `translation_context` to corresponding class name,  | #      * For draw function (any function callings requiring translation context inside it), add `/draw` suffix, such as `BBP_OT_some_operator/draw`. | ||||||
| #    plus `/draw` suffix, such as `BBP_OT_some_operator/draw`. | #      * For execute function, or any functions mainly called by this execution function, add `/execute` suffix, such as `BBP_OT_some_operator/execute`. | ||||||
| #  - For property loacted in shared class (usually shared by multiple operators), set their `translation_context` to `BME/<MODULE_NAME>.<CLASS_NAME>/property`. | #  - For shared class (usually shared by multiple operators). | ||||||
| #    `<MODULE_NAME>` is the module name (file name) where this class located. `<CLASS_NAME>` is the name of this class. | #      * For themselves (usually not used because they don't have `bl_translation_context`), the default context is `BME/<MODULE_NAME>.<CLASS_NAME>`, such as `BBP/some_module.some_class`. | ||||||
| #    For example, `BBP/some_module.some_class/property` | #      * For properties located inside, add `/property` suffix, such as `BBP/some_module.some_class/property`. | ||||||
| #     | #      * For draw function (any function callings requiring translation context inside it), add `/draw` suffix, such as `BBP/some_module.some_class/draw`. | ||||||
| #  Due to the shitty design, I can't find a way to add translation context for descrption field. | #  - For menu draw function (usually defined in __init__ module). | ||||||
| #  So these description may collide with Blender official translation and thus not put in result file. | #      * For themselves (any calling inside them), the context is `BME/<MODULE_NAME>.<METHOD_NAME>()`, such as `BBP/some_module.some_method()`. | ||||||
|  | #   | ||||||
|  | #  Due to the shitty design, I can't find a way to add translation context for descrption field and report function used string. | ||||||
|  | #  So these description may collide with Blender official translation, thus they may not be put in result translation file. | ||||||
| #  I have no idea about this. | #  I have no idea about this. | ||||||
| #   | #   | ||||||
| #  Due to the shitty static analyse ability of Blender I18N plugin, all context should be written in literal, | #  Due to the shitty static analyse ability of Blender I18N plugin, all context should be written in literal, | ||||||
| @ -32,9 +35,18 @@ import bpy | |||||||
| #  please use `bpy.app.translations.pgettext_rpt()` to get translation message because they are report. | #  please use `bpy.app.translations.pgettext_rpt()` to get translation message because they are report. | ||||||
| #  For the string given to `UTIL_functions.message_box()`, please use `bpy.app.translations.pgettext_iface` because they are UI elements. | #  For the string given to `UTIL_functions.message_box()`, please use `bpy.app.translations.pgettext_iface` because they are UI elements. | ||||||
| #   | #   | ||||||
| #  It seema that `bpy.app.translations.pgettext` function family has fatal error when extracting message with context | #  `bpy.app.translations.pgettext` function family has fatal error when extracting message with context | ||||||
| #  (it will produce a correct one and a wrong one which just simply concat the message and its context. I don't know why). | #  (it will produce a correct one and a wrong one which just simply concat the message and its context. I don't know why). | ||||||
| #   | #  This will happen if you put `bpy.app.translations.pgettext` calling inside `UILayout.label` or any UILayout functions like it. | ||||||
|  | #  `bpy.app.translations.pgettext` will produce the correct entry but Blender used "magic of `UILayout.label` will produce the wrong one. | ||||||
|  | #  It seems that Blender's magic just join the string provided in `text` argument as much as possible. | ||||||
|  | #  So the solution is simple: | ||||||
|  | #  - If we use `bpy.app.translations.pgettext` and `UILayout.label` together | ||||||
|  | #      * Create a variable holding the result of `bpy.app.translations.pgettext`. | ||||||
|  | #      * Format this gotten string if necessary. | ||||||
|  | #      * Call `UILayout.label` and use this variable as its `text` argument. Then set `translated` to False. | ||||||
|  | #  - If we use `bpy.app.translations.pgettext` with other non-Blender functions, such as `print`. | ||||||
|  | #      * Use it as a normal function. | ||||||
| #   | #   | ||||||
| #  All translation annotation are started with `TR:` | #  All translation annotation are started with `TR:` | ||||||
| #   | #   | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import mathutils | import bpy, mathutils | ||||||
| import typing, math | import typing, math | ||||||
| from . import UTIL_functions | from . import UTIL_functions | ||||||
|  |  | ||||||
| @ -263,7 +263,7 @@ class EnumPropHelper(UTIL_functions.EnumPropHelper): | |||||||
|  |  | ||||||
| def virtools_name_regulator(name: str | None) -> str: | def virtools_name_regulator(name: str | None) -> str: | ||||||
|     if name: return name |     if name: return name | ||||||
|     else: return 'annoymous' |     else: return bpy.app.translations.pgettext_data('annoymous', 'BME/UTIL_virtools_types.virtools_name_regulator()') | ||||||
|  |  | ||||||
| ## Default Encoding for PyBMap | ## Default Encoding for PyBMap | ||||||
| #  Use semicolon split each encodings. Support Western European and Simplified Chinese in default. | #  Use semicolon split each encodings. Support Western European and Simplified Chinese in default. | ||||||
|  | |||||||
| @ -39,17 +39,17 @@ class BBP_MT_View3DMenu(bpy.types.Menu): | |||||||
|  |  | ||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|         layout.label(text='UV', icon='UV') |         layout.label(text='UV', icon='UV', text_ctxt='BBP_MT_View3DMenu/draw') | ||||||
|         layout.operator(OP_UV_flatten_uv.BBP_OT_flatten_uv.bl_idname) |         layout.operator(OP_UV_flatten_uv.BBP_OT_flatten_uv.bl_idname) | ||||||
|         layout.operator(OP_UV_rail_uv.BBP_OT_rail_uv.bl_idname) |         layout.operator(OP_UV_rail_uv.BBP_OT_rail_uv.bl_idname) | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text='Align', icon='SNAP_ON') |         layout.label(text='Align', icon='SNAP_ON', text_ctxt='BBP_MT_View3DMenu/draw') | ||||||
|         layout.operator(OP_OBJECT_legacy_align.BBP_OT_legacy_align.bl_idname) |         layout.operator(OP_OBJECT_legacy_align.BBP_OT_legacy_align.bl_idname) | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text='Select', icon='SELECT_SET') |         layout.label(text='Select', icon='SELECT_SET', text_ctxt='BBP_MT_View3DMenu/draw') | ||||||
|         layout.operator(OP_OBJECT_virtools_group.BBP_OT_select_object_by_virtools_group.bl_idname) |         layout.operator(OP_OBJECT_virtools_group.BBP_OT_select_object_by_virtools_group.bl_idname) | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text='Material', icon='MATERIAL') |         layout.label(text='Material', icon='MATERIAL', text_ctxt='BBP_MT_View3DMenu/draw') | ||||||
|         layout.operator(OP_MTL_fix_material.BBP_OT_fix_all_material.bl_idname) |         layout.operator(OP_MTL_fix_material.BBP_OT_fix_all_material.bl_idname) | ||||||
|  |  | ||||||
| class BBP_MT_AddBmeMenu(bpy.types.Menu): | class BBP_MT_AddBmeMenu(bpy.types.Menu): | ||||||
| @ -71,18 +71,18 @@ class BBP_MT_AddRailMenu(bpy.types.Menu): | |||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|  |  | ||||||
|         layout.label(text="Sections", icon='MESH_CIRCLE') |         layout.label(text="Sections", icon='MESH_CIRCLE', text_ctxt='BBP_MT_AddRailMenu/draw') | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_rail_section.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_rail_section.bl_idname) | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_transition_section.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_transition_section.bl_idname) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Straight Rails", icon='IPO_CONSTANT') |         layout.label(text="Straight Rails", icon='IPO_CONSTANT', text_ctxt='BBP_MT_AddRailMenu/draw') | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_straight_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_straight_rail.bl_idname) | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_transition_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_transition_rail.bl_idname) | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_side_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_side_rail.bl_idname) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Curve Rails", icon='MOD_SCREW') |         layout.label(text="Curve Rails", icon='MOD_SCREW', text_ctxt='BBP_MT_AddRailMenu/draw') | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_arc_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_arc_rail.bl_idname) | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_spiral_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_spiral_rail.bl_idname) | ||||||
|         layout.operator(OP_ADDS_rail.BBP_OT_add_side_spiral_rail.bl_idname) |         layout.operator(OP_ADDS_rail.BBP_OT_add_side_spiral_rail.bl_idname) | ||||||
| @ -96,22 +96,22 @@ class BBP_MT_AddComponentsMenu(bpy.types.Menu): | |||||||
|     def draw(self, context): |     def draw(self, context): | ||||||
|         layout = self.layout |         layout = self.layout | ||||||
|  |  | ||||||
|         layout.label(text="Basic Components") |         layout.label(text="Basic Components", text_ctxt='BBP_MT_AddComponentsMenu/draw') | ||||||
|         OP_ADDS_component.BBP_OT_add_component.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_component.draw_blc_menu(layout) | ||||||
|          |          | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Nong Components") |         layout.label(text="Nong Components", text_ctxt='BBP_MT_AddComponentsMenu/draw') | ||||||
|         OP_ADDS_component.BBP_OT_add_nong_extra_point.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_nong_extra_point.draw_blc_menu(layout) | ||||||
|         OP_ADDS_component.BBP_OT_add_nong_ventilator.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_nong_ventilator.draw_blc_menu(layout) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Series Components") |         layout.label(text="Series Components", text_ctxt='BBP_MT_AddComponentsMenu/draw') | ||||||
|         OP_ADDS_component.BBP_OT_add_tilting_block_series.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_tilting_block_series.draw_blc_menu(layout) | ||||||
|         OP_ADDS_component.BBP_OT_add_swing_series.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_swing_series.draw_blc_menu(layout) | ||||||
|         OP_ADDS_component.BBP_OT_add_ventilator_series.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_ventilator_series.draw_blc_menu(layout) | ||||||
|  |  | ||||||
|         layout.separator() |         layout.separator() | ||||||
|         layout.label(text="Components Pair") |         layout.label(text="Components Pair", text_ctxt='BBP_MT_AddComponentsMenu/draw') | ||||||
|         OP_ADDS_component.BBP_OT_add_sector_component_pair.draw_blc_menu(layout) |         OP_ADDS_component.BBP_OT_add_sector_component_pair.draw_blc_menu(layout) | ||||||
|  |  | ||||||
| # ===== Menu Drawer ===== | # ===== Menu Drawer ===== | ||||||
| @ -120,13 +120,29 @@ MenuDrawer_t = typing.Callable[[typing.Any, typing.Any], None] | |||||||
|  |  | ||||||
| def menu_drawer_import(self, context) -> None: | def menu_drawer_import(self, context) -> None: | ||||||
|     layout: bpy.types.UILayout = self.layout |     layout: bpy.types.UILayout = self.layout | ||||||
|     #layout.operator(OP_IMPORT_bmfile.BBP_OT_import_bmfile.bl_idname, text="Ballance Map (.bmx)") |     # layout.operator( | ||||||
|     layout.operator(OP_IMPORT_virtools.BBP_OT_import_virtools.bl_idname, text="Virtools File (.nmo/.cmo/.vmo) (experimental)") |     #     OP_IMPORT_bmfile.BBP_OT_import_bmfile.bl_idname, | ||||||
|  |     #     text="Ballance Map (.bmx)", | ||||||
|  |     #     text_ctxt='BBP/__init__.menu_drawer_import()' | ||||||
|  |     # ) | ||||||
|  |     layout.operator( | ||||||
|  |         OP_IMPORT_virtools.BBP_OT_import_virtools.bl_idname, | ||||||
|  |         text="Virtools File (.nmo/.cmo/.vmo) (experimental)", | ||||||
|  |         text_ctxt='BBP/__init__.menu_drawer_import()' | ||||||
|  |     ) | ||||||
|  |  | ||||||
| def menu_drawer_export(self, context) -> None: | def menu_drawer_export(self, context) -> None: | ||||||
|     layout: bpy.types.UILayout = self.layout |     layout: bpy.types.UILayout = self.layout | ||||||
|     #layout.operator(OP_EXPORT_bmfile.BBP_OT_export_bmfile.bl_idname, text="Ballance Map (.bmx)") |     # layout.operator( | ||||||
|     layout.operator(OP_EXPORT_virtools.BBP_OT_export_virtools.bl_idname, text="Virtools File (.nmo/.cmo/.vmo) (experimental)") |     #     OP_EXPORT_bmfile.BBP_OT_export_bmfile.bl_idname, | ||||||
|  |     #     text="Ballance Map (.bmx)", | ||||||
|  |     #     text_ctxt='BBP/__init__.menu_drawer_export()' | ||||||
|  |     # ) | ||||||
|  |     layout.operator( | ||||||
|  |         OP_EXPORT_virtools.BBP_OT_export_virtools.bl_idname, | ||||||
|  |         text="Virtools File (.nmo/.cmo/.vmo) (experimental)", | ||||||
|  |         text_ctxt='BBP/__init__.menu_drawer_export()' | ||||||
|  |     ) | ||||||
|  |  | ||||||
| def menu_drawer_view3d(self, context) -> None: | def menu_drawer_view3d(self, context) -> None: | ||||||
|     layout: bpy.types.UILayout = self.layout |     layout: bpy.types.UILayout = self.layout | ||||||
| @ -135,7 +151,7 @@ def menu_drawer_view3d(self, context) -> None: | |||||||
| def menu_drawer_add(self, context) -> None: | def menu_drawer_add(self, context) -> None: | ||||||
|     layout: bpy.types.UILayout = self.layout |     layout: bpy.types.UILayout = self.layout | ||||||
|     layout.separator() |     layout.separator() | ||||||
|     layout.label(text="Ballance") |     layout.label(text="Ballance", text_ctxt='BBP/__init__.menu_drawer_add()') | ||||||
|     layout.menu(BBP_MT_AddBmeMenu.bl_idname, icon='MESH_CUBE') |     layout.menu(BBP_MT_AddBmeMenu.bl_idname, icon='MESH_CUBE') | ||||||
|     layout.menu(BBP_MT_AddRailMenu.bl_idname, icon='MESH_CIRCLE') |     layout.menu(BBP_MT_AddRailMenu.bl_idname, icon='MESH_CIRCLE') | ||||||
|     layout.menu(BBP_MT_AddComponentsMenu.bl_idname, icon='MESH_ICOSPHERE') |     layout.menu(BBP_MT_AddComponentsMenu.bl_idname, icon='MESH_ICOSPHERE') | ||||||
| @ -151,15 +167,21 @@ def menu_drawer_grouping(self, context) -> None: | |||||||
|     col = layout.column() |     col = layout.column() | ||||||
|     col.operator_context = 'INVOKE_DEFAULT' |     col.operator_context = 'INVOKE_DEFAULT' | ||||||
|  |  | ||||||
|     col.label(text="Virtools Group") |     col.label(text="Virtools Group", text_ctxt='BBP/__init__.menu_drawer_grouping()') | ||||||
|     col.operator(OP_OBJECT_virtools_group.BBP_OT_add_objects_virtools_group.bl_idname, icon='ADD', text="Group into...") |     col.operator( | ||||||
|     col.operator(OP_OBJECT_virtools_group.BBP_OT_rm_objects_virtools_group.bl_idname, icon='REMOVE', text="Ungroup from...") |         OP_OBJECT_virtools_group.BBP_OT_add_objects_virtools_group.bl_idname, icon='ADD', text="Group into...", | ||||||
|     col.operator(OP_OBJECT_virtools_group.BBP_OT_clear_objects_virtools_group.bl_idname, icon='TRASH', text="Clear All Groups") |         text_ctxt='BBP/__init__.menu_drawer_grouping()') | ||||||
|  |     col.operator( | ||||||
|  |         OP_OBJECT_virtools_group.BBP_OT_rm_objects_virtools_group.bl_idname, icon='REMOVE', text="Ungroup from...", | ||||||
|  |         text_ctxt='BBP/__init__.menu_drawer_grouping()') | ||||||
|  |     col.operator( | ||||||
|  |         OP_OBJECT_virtools_group.BBP_OT_clear_objects_virtools_group.bl_idname, icon='TRASH', text="Clear All Groups", | ||||||
|  |         text_ctxt='BBP/__init__.menu_drawer_grouping()') | ||||||
|  |  | ||||||
| def menu_drawer_snoop_then_conv(self, context) -> None: | def menu_drawer_snoop_then_conv(self, context) -> None: | ||||||
|     layout: bpy.types.UILayout = self.layout |     layout: bpy.types.UILayout = self.layout | ||||||
|     layout.separator() |     layout.separator() | ||||||
|     layout.label(text="Ballance") |     layout.label(text="Ballance", text_ctxt='BBP/__init__.menu_drawer_snoop_then_conv()') | ||||||
|     layout.operator(OP_OBJECT_snoop_group_then_to_mesh.BBP_OT_snoop_group_then_to_mesh.bl_idname, icon='OUTLINER_OB_MESH') |     layout.operator(OP_OBJECT_snoop_group_then_to_mesh.BBP_OT_snoop_group_then_to_mesh.bl_idname, icon='OUTLINER_OB_MESH') | ||||||
|  |  | ||||||
| def menu_drawer_naming_convention(self, context) -> None: | def menu_drawer_naming_convention(self, context) -> None: | ||||||
| @ -170,7 +192,7 @@ def menu_drawer_naming_convention(self, context) -> None: | |||||||
|     col = layout.column() |     col = layout.column() | ||||||
|     col.operator_context = 'INVOKE_DEFAULT' |     col.operator_context = 'INVOKE_DEFAULT' | ||||||
|  |  | ||||||
|     col.label(text="Ballance") |     col.label(text="Ballance", text_ctxt='BBP/__init__.menu_drawer_naming_convention()') | ||||||
|     col.operator(OP_OBJECT_naming_convention.BBP_OT_regulate_objects_name.bl_idname, icon='GREASEPENCIL') |     col.operator(OP_OBJECT_naming_convention.BBP_OT_regulate_objects_name.bl_idname, icon='GREASEPENCIL') | ||||||
|     col.operator(OP_OBJECT_naming_convention.BBP_OT_auto_grouping.bl_idname, icon='GROUP') |     col.operator(OP_OBJECT_naming_convention.BBP_OT_auto_grouping.bl_idname, icon='GROUP') | ||||||
|     col.operator(OP_OBJECT_naming_convention.BBP_OT_convert_to_imengyu.bl_idname, icon='ARROW_LEFTRIGHT') |     col.operator(OP_OBJECT_naming_convention.BBP_OT_convert_to_imengyu.bl_idname, icon='ARROW_LEFTRIGHT') | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user