From f51be56206268bea1f4b376adb6d88c16dfb315b Mon Sep 17 00:00:00 2001 From: azv Date: Thu, 30 Jan 2020 15:53:06 +0300 Subject: [PATCH] Issue #17342: 3D Model defeaturing * Translation to French and Russian * Documentation --- src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts | 36 +++++++++++++ src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts | 36 +++++++++++++ src/FeaturesPlugin/doc/FeaturesPlugin.rst | 1 + .../doc/TUI_defeaturingFeature.rst | 12 +++++ src/FeaturesPlugin/doc/defeaturingFeature.rst | 49 ++++++++++++++++++ .../doc/examples/defeaturing.py | 12 +++++ src/FeaturesPlugin/doc/images/defeaturing.png | Bin 0 -> 577 bytes .../doc/images/defeaturing_property_panel.png | Bin 0 -> 6101 bytes .../doc/images/defeaturing_result.png | Bin 0 -> 10098 bytes 9 files changed, 146 insertions(+) create mode 100644 src/FeaturesPlugin/doc/TUI_defeaturingFeature.rst create mode 100644 src/FeaturesPlugin/doc/defeaturingFeature.rst create mode 100644 src/FeaturesPlugin/doc/examples/defeaturing.py create mode 100644 src/FeaturesPlugin/doc/images/defeaturing.png create mode 100644 src/FeaturesPlugin/doc/images/defeaturing_property_panel.png create mode 100644 src/FeaturesPlugin/doc/images/defeaturing_result.png diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts index df8d45ad1..71f2863f6 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts +++ b/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts @@ -248,6 +248,42 @@ + + + Defeaturing + + Defeaturing + Vaincre + + + Faces to remove + Visages à retirer + + + Select faces + Sélectionnez des faces + + + + Defeaturing:FeaturesPlugin_ValidatorDefeaturingSelection + + Error: This validator can only work with selection list attributes. + Erreur: ce validateur ne peut fonctionner qu'avec des attributs de liste de sélection. + + + Error: Empty attribute selection. + La sélection d'attribut est vide. + + + Error: Empty selection context. + Erreur: contexte de sélection vide. + + + Error: Not all selected shapes are sub-shapes of solids. + Erreur: toutes les formes sélectionnées ne sont pas des sous-formes de solides. + + + Extrusion diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts index 690108637..4e52f4527 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts +++ b/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts @@ -141,4 +141,40 @@ Выберите вспомогательные объекты. + + + + Defeaturing + + Defeaturing + Удаление фичеров + + + Faces to remove + Удаляемые грани + + + Select faces + Выберите грани + + + + Defeaturing:FeaturesPlugin_ValidatorDefeaturingSelection + + Error: This validator can only work with selection list attributes. + Ошибка: валидатор поддерживает только аттрибуты типа SelectionList. + + + Error: Empty attribute selection. + Ошибка: незаполненный аттрибут. + + + Error: Empty selection context. + Ошибка: пустой контекст. + + + Error: Not all selected shapes are sub-shapes of solids. + Ошибка: не все выбранные объекты являются подэлементами твердых тел. + + diff --git a/src/FeaturesPlugin/doc/FeaturesPlugin.rst b/src/FeaturesPlugin/doc/FeaturesPlugin.rst index 4d4a52d77..91db9f48f 100644 --- a/src/FeaturesPlugin/doc/FeaturesPlugin.rst +++ b/src/FeaturesPlugin/doc/FeaturesPlugin.rst @@ -15,6 +15,7 @@ Features plug-in provides a set of common topological operations. It implements commonFeature.rst copyFeature.rst cutFeature.rst + defeaturingFeature.rst extrusionCutFeature.rst extrusionFeature.rst extrusionFuseFeature.rst diff --git a/src/FeaturesPlugin/doc/TUI_defeaturingFeature.rst b/src/FeaturesPlugin/doc/TUI_defeaturingFeature.rst new file mode 100644 index 000000000..aafc73317 --- /dev/null +++ b/src/FeaturesPlugin/doc/TUI_defeaturingFeature.rst @@ -0,0 +1,12 @@ + + .. _tui_defeaturing: + +Perform Defeaturing +=================== + +.. literalinclude:: examples/defeaturing.py + :linenos: + :language: python + +:download:`Download this script ` + diff --git a/src/FeaturesPlugin/doc/defeaturingFeature.rst b/src/FeaturesPlugin/doc/defeaturingFeature.rst new file mode 100644 index 000000000..33ebe856e --- /dev/null +++ b/src/FeaturesPlugin/doc/defeaturingFeature.rst @@ -0,0 +1,49 @@ +.. |defeaturing.icon| image:: images/defeaturing.png + +Defeaturing +=========== + +**Defeaturing** operation is intended for removal of the unwanted parts or features from the model. These parts can be holes, protrusions, gaps, chamfers, fillets, etc. + +To create a Defeaturing in the active part: + +#. select in the Main Menu *Feature -> Defeaturing* item or +#. click |defeaturing.icon| **Defeaturing** button in the toolbar. + +After that select one or more faces of solids to suppress them. The Defeaturing works with faces from comsolids and compounds of solids as well. + +.. image:: images/defeaturing_property_panel.png + :align: center + +.. centered:: + Defeaturing property panel + +Input field: + +- **Faces to remove** panel contains the list of faces which should be suppressed. + +**TUI Command**: + +.. py:function:: model.addDefeaturing(Part_doc, [faces]) + + :param part: The current part object. + :param list: A list of faces in format *model.selection("FACE", shape)*. + :return: Created object. + +Result +"""""" + +Result of **Defeaturing** is shown below. + +.. image:: images/defeaturing_result.png + :align: center + +.. centered:: + Defeaturing operation + +**See Also** a sample TUI Script of :ref:`tui_defeaturing` operation. + +References +"""""""""" + +For more information, please, visit `OpenCASCADE Documentation `_. diff --git a/src/FeaturesPlugin/doc/examples/defeaturing.py b/src/FeaturesPlugin/doc/examples/defeaturing.py new file mode 100644 index 000000000..0dc1f52f8 --- /dev/null +++ b/src/FeaturesPlugin/doc/examples/defeaturing.py @@ -0,0 +1,12 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +Fillet_1_objects = [model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Top]"), model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Left]"), model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]")] +Fillet_1 = model.addFillet(Part_1_doc, Fillet_1_objects, 2) +Defeaturing_1 = model.addDefeaturing(Part_1_doc, [model.selection("FACE", "Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_3"), model.selection("FACE", "(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_1)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_2)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_3)")]) + +model.end() diff --git a/src/FeaturesPlugin/doc/images/defeaturing.png b/src/FeaturesPlugin/doc/images/defeaturing.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5ecc8d60fc96d29db0ff282b3bc37f55b7e21c GIT binary patch literal 577 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