From e3ce834889860adba76bbcf27743ab15a96c4765 Mon Sep 17 00:00:00 2001 From: mbs Date: Fri, 8 Mar 2024 22:36:58 +0000 Subject: [PATCH] [bos #40619][CEA] Add Fuzzy parameter to partition and boolean operators --- doc/salome/gui/GEOM/images/bool1.png | Bin 25953 -> 32544 bytes doc/salome/gui/GEOM/images/bool2.png | Bin 24576 -> 37631 bytes doc/salome/gui/GEOM/images/bool3.png | Bin 26653 -> 33093 bytes doc/salome/gui/GEOM/images/neo-section.png | Bin 22532 -> 35179 bytes .../gui/GEOM/input/common_operation.doc | 10 +- doc/salome/gui/GEOM/input/cut_operation.doc | 12 +- doc/salome/gui/GEOM/input/fuse_operation.doc | 14 +- doc/salome/gui/GEOM/input/partition.doc | 10 +- .../gui/GEOM/input/section_operation.doc | 8 +- .../GEOM/input/using_boolean_operations.doc | 2 +- idl/GEOM_Gen.idl | 184 +++++++++++++++++ src/BooleanGUI/BooleanGUI_Dialog.cxx | 73 +++++-- src/BooleanGUI/BooleanGUI_Dialog.h | 5 + src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui | 2 +- src/GEOMGUI/GEOM_msg_en.ts | 8 + src/GEOMGUI/GEOM_msg_fr.ts | 8 + src/GEOMGUI/GEOM_msg_ja.ts | 8 + src/GEOMImpl/GEOMImpl_BooleanDriver.cxx | 53 ++++- src/GEOMImpl/GEOMImpl_BooleanDriver.hxx | 3 +- src/GEOMImpl/GEOMImpl_IBoolean.hxx | 5 + src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx | 72 ++++++- src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx | 31 +-- src/GEOMImpl/GEOMImpl_IPartition.hxx | 7 + src/GEOMImpl/GEOMImpl_PartitionDriver.cxx | 13 ++ src/GEOM_I/GEOM_IBooleanOperations_i.cc | 188 +++++++++++++++--- src/GEOM_I/GEOM_IBooleanOperations_i.hh | 90 +++++++-- src/GEOM_SWIG/geomBuilder.py | 124 +++++++++--- .../OperationGUI_PartitionDlg.cxx | 73 +++++-- src/OperationGUI/OperationGUI_PartitionDlg.h | 8 +- test/test_boolean_fuzzy.py | 146 ++++++++++++++ test/tests.set | 1 + 31 files changed, 982 insertions(+), 176 deletions(-) create mode 100644 test/test_boolean_fuzzy.py diff --git a/doc/salome/gui/GEOM/images/bool1.png b/doc/salome/gui/GEOM/images/bool1.png index c259c3fcc4a4d628486fae165d135e3d8943bf14..0a54bc2b3016c89396fe9e967edcdda743e8c5fc 100644 GIT binary patch literal 32544 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

    7Nf}I?NZ8Ex=f&HU1_=N)I}l2V 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%0DlUIe*66wuc|we8t^fc4 literal 25953 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 a`@!f(AKYRscj3!U5L#-ws-?;{;r{~*fGA`D diff --git a/doc/salome/gui/GEOM/images/bool2.png b/doc/salome/gui/GEOM/images/bool2.png index c19607ee051d94c148fe9598ab59ccc3c2a5d336..f3c67be5b04dc98ff5a49ae0f400211478ae5180 100644 GIT binary patch literal 37631 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

    r>!1O3T!BNG$N=gz&@mKDhJ7@ocV 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 W<}ngWt#CZ}NBg|KMwy!J-TwgrU~S?6 literal 26653 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 literal 22532 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

  • \subpage cut_operation_page "Cut" - cuts one shape with a list of others.
  • -
  • \subpage section_opeartion_page "Intersection" - performs an intersection between two shapes.
  • +
  • \subpage section_operation_page "Intersection" - performs an intersection between two shapes.
  • cogSizju+{CX)Ly_JBDorN_L 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 the common part which of should be found. - Activate the corresponding check-box if you wish to Detect Self-intersections +- Activate the corresponding check-box if you wish to use a fuzzy parameter . + If activated, you can define the fuzzy tolerance in the fuzzy parameter input box. - Activate \ref restore_presentation_parameters_page "Advanced options" if required. - Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). @@ -26,15 +28,15 @@ In this dialog: This operation can be performed using a TUI Command: -geompy.MakeCommonList(theShapesList, checkSelfInte) +geompy.MakeCommonList(theShapesList, checkSelfInte, name, fuzzyParam) -Arguments: Name + a list of shapes + an optional flag for self-intersection check. +Arguments: a list of shapes + an optional flag for self-intersection check + an optional name + an optional fuzzy parameter. There is also a special TUI Command for the Common operation on two shapes : -geompy.MakeCommon(s1, s2, checkSelfInte) +geompy.MakeCommon(s1, s2, checkSelfInte, name, fuzzyParam) -Arguments: Name + 2 shapes + an optional flag for self-intersection check. +Arguments: 2 shapes + an optional flag for self-intersection check + an optional name + an optional fuzzy parameter. Example: diff --git a/doc/salome/gui/GEOM/input/cut_operation.doc b/doc/salome/gui/GEOM/input/cut_operation.doc index 30235d6de..bbe25cccc 100644 --- a/doc/salome/gui/GEOM/input/cut_operation.doc +++ b/doc/salome/gui/GEOM/input/cut_operation.doc @@ -13,6 +13,8 @@ In this dialog: - Click the arrow button and select in the Object Browser or in the Viewer the Main Object, which will be cut by tool objects. - Select the Tool objects, which will cut the main object. - Activate the corresponding check-box if you wish to Detect Self-intersections . +- Activate the corresponding check-box if you wish to use a fuzzy parameter . + If activated, you can define the fuzzy tolerance in the fuzzy parameter input box. - Activate \ref restore_presentation_parameters_page "Advanced options" if required. - Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). @@ -25,15 +27,17 @@ In this dialog: This operation can be performed using a TUI Command: -geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte) +geompy.MakeCutList(theMainShape, theShapesList, checkSelfInte, name, fuzzyParam) -Arguments: Name + a main shape + a list of other shapes + an optional flag for self-intersection check. +Arguments: a main shape + a list of other shapes + an optional flag for self-intersection +check + an optional name + an optional fuzzy parameter. There is also a special TUI Command: for the Cut operation on two shapes (object and tool) : -geompy.MakeCut(s1, s2, checkSelfInte) +geompy.MakeCut(s1, s2, checkSelfInte, name, fuzzyParam) -Arguments: Name + the object + the tool + an optional flag for self-intersection check. +Arguments: the object + the tool + an optional flag for self-intersection check + an +optional name + an optional fuzzy parameter. Example: diff --git a/doc/salome/gui/GEOM/input/fuse_operation.doc b/doc/salome/gui/GEOM/input/fuse_operation.doc index e0a31b777..b01449428 100644 --- a/doc/salome/gui/GEOM/input/fuse_operation.doc +++ b/doc/salome/gui/GEOM/input/fuse_operation.doc @@ -13,6 +13,8 @@ In this dialog: - Click the arrow button and select in the Object Browser or in the Viewer the Objects to be fused. - Activate the corresponding check-box if you wish to Detect Self-intersections . - Activate the corresponding check-box if you wish to remove extra edges . +- Activate the corresponding check-box if you wish to use a fuzzy parameter . + If activated, you can define the fuzzy tolerance in the fuzzy parameter input box. - Activate \ref restore_presentation_parameters_page "Advanced options" if required. - Press "Apply" or "Apply & Close" button to get the result (GEOM_Object). @@ -25,17 +27,17 @@ In this dialog: This operation can be performed using a TUI Command: -geompy.MakeFuseList(theShapesList, checkSelfInte, rmExtraEdges) +geompy.MakeFuseList(theShapesList, checkSelfInte, rmExtraEdges, name, fuzzyParam) -Arguments: Name + a list of shapes + an optional flag for -self-intersection check + an optional flag to remove extra edges. +Arguments: a list of shapes + an optional flag for self-intersection +check + an optional flag to remove extra edges + an optional name + an optional fuzzy parameter. There is also a special TUI Command for \b Fuse operation on two shapes : -geompy.MakeFuse(s1, s2, checkSelfInte, rmExtraEdges) +geompy.MakeFuse(s1, s2, checkSelfInte, rmExtraEdges, name, fuzzyParam) -Arguments: Name + 2 shapes + an optional flag for self-intersection -check + an optional flag to remove extra edges. +Arguments: 2 shapes + an optional flag for self-intersection +check + an optional flag to remove extra edges + an optional name + an optional fuzzy parameter. Example: diff --git a/doc/salome/gui/GEOM/input/partition.doc b/doc/salome/gui/GEOM/input/partition.doc index e6e2db8b9..ad73a3cc7 100644 --- a/doc/salome/gui/GEOM/input/partition.doc +++ b/doc/salome/gui/GEOM/input/partition.doc @@ -62,6 +62,10 @@ If self-intersection is detected, the operation is aborted. all self-intersections please use \ref check_self_intersections_page "Detect Self-intersection tool". +Use Fuzzy Parameter check box is used to enable the usage of the fuzzy tolerance +inside the partition algorithm. The fuzzy tolerance itself can be given in the Fuzzy +Parameter input box. + - Activate \ref restore_presentation_parameters_page "Advanced options" if required. \note Partition is a complex operation, so its result of it depends @@ -74,13 +78,13 @@ If self-intersection is detected, the operation is aborted. geompy.MakePartition(ListOfShapes, ListOfTools, ListOfKeepInside, ListOfRemoveInside, Limit, RemoveWebs, ListOfMaterials, -KeepNonlimitShapes) +KeepNonlimitShapes, fuzzyParam) TUI Command (without sub-shapes intersection): geompy.MakePartitionNonSelfIntersectedShape(ListOfShapes, ListOfTools, ListOfKeepInside, ListOfRemoveInside, Limit, RemoveWebs, -ListOfMaterials, KeepNonlimitShapes, checkSelfInte) +ListOfMaterials, KeepNonlimitShapes, checkSelfInte, fuzzyParam) Here, - \em ListOfShapes is a list of shapes to be intersected @@ -91,6 +95,8 @@ Here, shapes of low dimension (than \em Limit) in the result. - \em checkSelfInte is a flag that indicates if the arguments should be checked for self-intersection prior to the operation. +- \em fuzzyParam is the used fuzzy tolerance inside the partition algorithm. +This tolerance is ignored, if this parameter is omitted or not positive. - Other parameters are obsolete and kept only for compatibility with previous versions of SALOME. diff --git a/doc/salome/gui/GEOM/input/section_operation.doc b/doc/salome/gui/GEOM/input/section_operation.doc index 0832ea886..cc0cf6bc4 100644 --- a/doc/salome/gui/GEOM/input/section_operation.doc +++ b/doc/salome/gui/GEOM/input/section_operation.doc @@ -1,6 +1,6 @@ /*! -\page section_opeartion_page Intersection +\page section_operation_page Intersection \b Intersection operation creates a vertex, an edge, a wire or a compound of them representing the intersection of two shapes. @@ -13,6 +13,8 @@ In this dialog: - Input or accept the default \b Name of the resulting shape. - Click the arrow button and select in the Object Browser or in the Viewer the intersecting Objects. - Activate the corresponding check-box if you wish to Detect Self-intersections. If a self-intersection detected the operation fails. +- Activate the corresponding check-box if you wish to use a fuzzy parameter . + If activated, you can define the fuzzy tolerance in the fuzzy parameter input box. - Activate \ref restore_presentation_parameters_page "Advanced options" if required. - Press "Apply" or "Apply & Close" button to get the result (VERTEX, EDGE, WIRE or COMPOUND). @@ -26,9 +28,9 @@ of the GUI module's documentation. This operation can be performed using a TUI Command: -geompy.MakeSection(s1, s2, checkSelfInte) +geompy.MakeSection(s1, s2, checkSelfInte, name, fuzzyParam) -Arguments: Name + 2 shapes + an optional flag for self-intersection check. +Arguments: 2 shapes + an optional flag for self-intersection check + an optional name + an optional fuzzy parameter. Example: diff --git a/doc/salome/gui/GEOM/input/using_boolean_operations.doc b/doc/salome/gui/GEOM/input/using_boolean_operations.doc index f5e8f0509..63351b45d 100644 --- a/doc/salome/gui/GEOM/input/using_boolean_operations.doc +++ b/doc/salome/gui/GEOM/input/using_boolean_operations.doc @@ -17,7 +17,7 @@ complex geometrical objects (2D & 3D elements): of a list of objects into an independent object.

You can use advanced TUI commands performing these operations diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 531f97cd9..b177871d9 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3397,6 +3397,190 @@ module GEOM */ GEOM_Object MakeHalfPartition (in GEOM_Object theShape, in GEOM_Object thePlane); + + /*! + * [bos#40619] [CEA] Add Fuzzy parameter to partition and boolean operators + * New interface methods were added to support a fuzzy parameter in + * all boolean and partition operations: + * - MakeBooleanWithFuzzy + * - MakeFuseWithFuzzy + * - MakeFuseListWithFuzzy + * - MakeCommonListWithFuzzy + * - MakeCutListWithFuzzy + * - MakePartitionWithFuzzy + * - MakePartitionNonSelfIntersectedShapeWithFuzzy + * - MakeHalfPartitionWithFuzzy + */ + + /*! + * \brief Perform one of boolean operations on two given shapes. + * \param theShape1 First argument for boolean operation. + * \param theShape2 Second argument for boolean operation. + * \param theOperation Indicates the operation to be done: + * 1 - Common, 2 - Cut, 3 - Fuse, 4 - Section. + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the boolean + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeBooleanWithFuzzy (in GEOM_Object theShape1, + in GEOM_Object theShape2, + in long theOperation, + in boolean IsCheckSelfInte, + in double theFuzzyParam); + /*! + * \brief Perform fusion boolean operation on two given shapes. + * \param theShape1 First argument for fuse operation. + * \param theShape2 Second argument for fuse operation. + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param IsRmExtraEdges If TRUE, perform removal of extra edges + * during an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the boolean + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFuseWithFuzzy (in GEOM_Object theShape1, + in GEOM_Object theShape2, + in boolean IsCheckSelfInte, + in boolean IsRmExtraEdges, + in double theFuzzyParam); + + /*! + * \brief Perform fusion boolean operation on list of objects. + * \param theShapes Shapes to be fused. + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param IsRmExtraEdges If TRUE, perform removal of extra edges + * during an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the boolean + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFuseListWithFuzzy (in ListOfGO theShapes, + in boolean IsCheckSelfInte, + in boolean IsRmExtraEdges, + in double theFuzzyParam); + + /*! + * \brief Perform common boolean operation on list of objects. + * \param theShapes Shapes for common operation. + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the boolean + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeCommonListWithFuzzy (in ListOfGO theShapes, + in boolean IsCheckSelfInte, + in double theFuzzyParam); + + /*! + * \brief Perform cutting of list of objects from theMainShape. + * \param theMainShape the object for cut operation. + * \param theShapes Shapes to be cut from theMainShape (tools). + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the boolean + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeCutListWithFuzzy (in GEOM_Object theMainShape, + in ListOfGO theShapes, + in boolean IsCheckSelfInte, + in double theFuzzyParam); + + /*! + * \brief Perform partition operation. + * + * \param theShapes Shapes to be intersected. + * \param theTools Shapes to intersect theShapes. + * \note Each compound from ListShapes and ListTools will be exploded in order + * to avoid possible intersection between shapes from this compound. + * \param theLimit Type of resulting shapes (corresponding to TopAbs_ShapeEnum). + * \param theKeepNonlimitShapes: if this parameter == 0, then only shapes of + * target type (equal to Limit) are kept in the result, + * else standalone shapes of lower dimension + * are kept also (if they exist). + * \param theFuzzyParam The fuzzy tolerance to be used in the partition + * algorithm, if the value is positive. + * + * After implementation new version of PartitionAlgo (October 2006) + * other parameters are ignored by current functionality. They are kept + * in this function only for supporting old versions. + * Ignored parameters: + * \param theKeepInside Shapes, outside which the results will be deleted. + * Each shape from theKeepInside must belong to theShapes also. + * \param theRemoveInside Shapes, inside which the results will be deleted. + * Each shape from theRemoveInside must belong to theShapes also. + * \param theRemoveWebs If TRUE, perform Glue 3D algorithm. + * \param theMaterials Material indices for each shape. Make sense, only if theRemoveWebs is TRUE. + * + * \return New GEOM_Object, containing the result shapes. + */ + GEOM_Object MakePartitionWithFuzzy (in ListOfGO theShapes, + in ListOfGO theTools, + in ListOfGO theKeepInside, + in ListOfGO theRemoveInside, + in short theLimit, + in boolean theRemoveWebs, + in ListOfLong theMaterials, + in short theKeepNonlimitShapes, + in double theFuzzyParam); + + /*! + * \brief Perform partition operation. + * + * This method may be useful if it is needed to make a partition for + * a compound containing nonintersected shapes. Performance will be better + * since intersection between shapes from compound is not performed. + * + * Description of all parameters as in previous method MakePartition(). + * One additional parameter is provided: + * \param IsCheckSelfInte If TRUE, perform check self intersection + * of arguments before an operation. + * \param theFuzzyParam The fuzzy tolerance to be used in the partition + * algorithm, if the value is positive. + * + * \note Passed compounds (via ListShapes or via ListTools) + * have to consist of nonintersecting shapes. + * + * \return New GEOM_Object, containing the result shapes. + */ + GEOM_Object MakePartitionNonSelfIntersectedShapeWithFuzzy (in ListOfGO theShapes, + in ListOfGO theTools, + in ListOfGO theKeepInside, + in ListOfGO theRemoveInside, + in short theLimit, + in boolean theRemoveWebs, + in ListOfLong theMaterials, + in short theKeepNonlimitShapes, + in boolean IsCheckSelfInte, + in double theFuzzyParam); + + /*! + * \brief Perform partition of the Shape with the Plane + * \param theShape Shape to be intersected. + * \param thePlane Tool shape, to intersect theShape. + * \param theFuzzyParam The fuzzy tolerance to be used in the partition + * algorithm, if the value is positive. + * \return New GEOM_Object, containing the result shape. + * + * \note This operation is a shortcut to the more general \ref MakePartition + * operation, where \a theShape specifies single "object" (shape being partitioned) + * and \a thePlane specifies single "tool" (intersector shape). Other parameters of + * \ref MakePartition operation have default values: + * - \a theLimit: GEOM::SHAPE (shape limit corresponds to the type of \a theShape) + * - \a theKeepNonlimitShapes: 0 + * - \a theKeepInside, \a theRemoveInside, \a theRemoveWebs, + * \a theMaterials (obsolete parameters): empty + * + * \sa MakePartition, MakePartitionNonSelfIntersectedShape + */ + GEOM_Object MakeHalfPartitionWithFuzzy (in GEOM_Object theShape, + in GEOM_Object thePlane, + in double theFuzzyParam); }; // # GEOM_ICurvesOperations: diff --git a/src/BooleanGUI/BooleanGUI_Dialog.cxx b/src/BooleanGUI/BooleanGUI_Dialog.cxx index 073fc5d96..4a007557d 100644 --- a/src/BooleanGUI/BooleanGUI_Dialog.cxx +++ b/src/BooleanGUI/BooleanGUI_Dialog.cxx @@ -41,6 +41,9 @@ // Comment next line to enable preview in BOP dialog box #define NO_PREVIEW +#define DEFAULT_FUZZY_VALUE 1e-5 + + //================================================================================= // class : BooleanGUI_Dialog() // purpose : Constructs a BooleanGUI_Dialog which is a child of 'parent', with the @@ -78,7 +81,7 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe image0 = QPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SECTION"))); aTitle = tr("GEOM_SECTION"); aCaption = tr("GEOM_SECTION_TITLE"); - setHelpFileName("section_opeartion_page.html"); + setHelpFileName("section_operation_page.html"); break; } QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -130,9 +133,21 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe myGroup->TextLabel4->hide(); myGroup->SpinBox_DX->hide(); myGroup->SpinBox_DY->hide(); - myGroup->CheckBox3->hide(); myGroup->CheckBox1->setText(tr("GEOM_CHECK_SELF_INTERSECTIONS")); + // Add all "fuzzy parameter" related widgets + myGroup->CheckBox3->setText(tr("GEOM_USE_FUZZY_PARAMETER")); + + myFuzzyLbl = new QLabel(myGroup->GroupBox1); + myFuzzyLbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myFuzzyLbl->setText(tr("GEOM_FUZZY_PARAMETER")); + myGroup->gridLayout1->addWidget(myFuzzyLbl, 7, 0, 1, 2); + + myFuzzyEdt = new SalomeApp_DoubleSpinBox(myGroup->GroupBox1); + initSpinBox( myFuzzyEdt, 1.e-7, 10.0, DEFAULT_FUZZY_VALUE, "length_tol_precision" ); + myFuzzyEdt->setValue(DEFAULT_FUZZY_VALUE); + myGroup->gridLayout1->addWidget(myFuzzyEdt, 7, 2); + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); layout->addWidget(myGroup); @@ -173,6 +188,11 @@ void BooleanGUI_Dialog::Init() myGroup->CheckBox2->setChecked(true); } + // Do not use Fuzzy parameter by default + myGroup->CheckBox3->setChecked(false); + myFuzzyLbl->setEnabled(false); + myFuzzyEdt->setEnabled(false); + myObject1.nullify(); reset(); @@ -186,6 +206,10 @@ void BooleanGUI_Dialog::Init() connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); } + if (!myGroup->CheckBox3->isHidden()) { + connect(myGroup->CheckBox3, SIGNAL(stateChanged(int)), this, SLOT(UseFuzzyChanged(int))); + } + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()), Qt::UniqueConnection); @@ -314,6 +338,21 @@ void BooleanGUI_Dialog::SelectionIntoArgument() processPreview(); } +//================================================================================= +// function : UseFuzzyChanged() +// purpose : This slot is called whenever the status of CheckButton3 has changed +//================================================================================= +void BooleanGUI_Dialog::UseFuzzyChanged(int state) +{ + QCheckBox* send = (QCheckBox*)sender(); + + if (send == myGroup->CheckBox3) { + bool isChecked = (state != Qt::Unchecked); + myFuzzyLbl->setEnabled(isChecked); + myFuzzyEdt->setEnabled(isChecked); + } +} + //================================================================================= // function : SetEditCurrentArgument() // purpose : @@ -417,6 +456,8 @@ bool BooleanGUI_Dialog::execute (ObjectList& objects) GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation()); const bool isCheckSelfInte = myGroup->CheckBox1->isChecked(); + const bool useFuzzyParam = myGroup->CheckBox3->isChecked(); + const double fuzzyValue = (useFuzzyParam ? myFuzzyEdt->value() : -1); GEOM::ListOfGO_var anObjects = new GEOM::ListOfGO(); anObjects->length( myObjects.count() ); @@ -427,24 +468,20 @@ bool BooleanGUI_Dialog::execute (ObjectList& objects) case BooleanGUI::FUSE: { const bool isRmExtraEdges = myGroup->CheckBox2->isChecked(); - - anObj = anOper->MakeFuseList - (anObjects, isCheckSelfInte, isRmExtraEdges); + anObj = anOper->MakeFuseListWithFuzzy(anObjects, isCheckSelfInte, isRmExtraEdges, fuzzyValue); } - break; + break; case BooleanGUI::COMMON: - anObj = anOper->MakeCommonList(anObjects, isCheckSelfInte); - break; - case BooleanGUI::CUT: - anObj = - anOper->MakeCutList(myObject1.get(), anObjects, isCheckSelfInte); - break; - case BooleanGUI::SECTION: - anObj = anOper->MakeBoolean - (myObject1.get(), anObjects[0], myOperation, isCheckSelfInte); - break; - default: - break; + anObj = anOper->MakeCommonListWithFuzzy(anObjects, isCheckSelfInte, fuzzyValue); + break; + case BooleanGUI::CUT: + anObj = anOper->MakeCutListWithFuzzy(myObject1.get(), anObjects, isCheckSelfInte, fuzzyValue); + break; + case BooleanGUI::SECTION: + anObj = anOper->MakeBooleanWithFuzzy(myObject1.get(), anObjects[0], myOperation, isCheckSelfInte, fuzzyValue); + break; + default: + break; } if (!anObj->_is_nil()) diff --git a/src/BooleanGUI/BooleanGUI_Dialog.h b/src/BooleanGUI/BooleanGUI_Dialog.h index dc7d66d73..71eb2667b 100644 --- a/src/BooleanGUI/BooleanGUI_Dialog.h +++ b/src/BooleanGUI/BooleanGUI_Dialog.h @@ -31,6 +31,8 @@ #include "GEOM_GenericObjPtr.h" class DlgRef_2Sel2Spin3Check; +class QLabel; +class SalomeApp_DoubleSpinBox; //================================================================================= // class : BooleanGUI_Dialog @@ -68,10 +70,13 @@ private: QList myObjects; DlgRef_2Sel2Spin3Check* myGroup; + QLabel* myFuzzyLbl; + SalomeApp_DoubleSpinBox* myFuzzyEdt; private slots: void ClickOnOk(); bool ClickOnApply(); + void UseFuzzyChanged(int state); void SetEditCurrentArgument(); void SelectionIntoArgument(); void ActivateThisDialog(); diff --git a/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui b/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui index 1d7620087..19442ef92 100644 --- a/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui +++ b/src/DlgRef/DlgRef_2Sel2Spin3Check_QTD.ui @@ -36,7 +36,7 @@ - + 9 diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index ba2b35507..41c3fa5de 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -427,6 +427,14 @@ Please, select face, shell or solid and try again GEOM_CHECK_SELF_INTERSECTIONS Detect Self-intersections + + GEOM_USE_FUZZY_PARAMETER + Use Fuzzy Parameter + + + GEOM_FUZZY_PARAMETER + Fuzzy Parameter + GEOM_FAST_CHECK_INTERSECTIONS Fast intersection diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index b61174223..6605a135e 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -427,6 +427,14 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_CHECK_SELF_INTERSECTIONS Détecter les auto-intersections + + GEOM_USE_FUZZY_PARAMETER + Utiliser le paramètre flou + + + GEOM_FUZZY_PARAMETER + Paramètre flou + GEOM_FAST_CHECK_INTERSECTIONS Intersection rapide diff --git a/src/GEOMGUI/GEOM_msg_ja.ts b/src/GEOMGUI/GEOM_msg_ja.ts index a485d6a7d..46a0ea135 100644 --- a/src/GEOMGUI/GEOM_msg_ja.ts +++ b/src/GEOMGUI/GEOM_msg_ja.ts @@ -423,6 +423,14 @@ GEOM_CHECK_SELF_INTERSECTIONS 自己交差の検出 + + GEOM_USE_FUZZY_PARAMETER + ファジーパラメータを使用する + + + GEOM_FUZZY_PARAMETER + ファジーパラメータ + GEOM_FAST_CHECK_INTERSECTIONS クイック交点 diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx index d61ee7603..4e55b8220 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -123,6 +123,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) Standard_Integer aType = aFunction->GetType(); const Standard_Boolean isCheckSelfInte = aCI.GetCheckSelfIntersection(); const Standard_Boolean isRmExtraEdges = aCI.GetRmExtraEdges(); + const Standard_Real aFuzzyParam = aCI.GetFuzzyParameter(); TopoDS_Shape aShape; @@ -165,7 +166,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) TNaming_CopyShape::CopyTool(aShape1, aMapTShapes, aShapeCopy1); TNaming_CopyShape::CopyTool(aShape2, aMapTShapes, aShapeCopy2); - aShape = performOperation (aShapeCopy1, aShapeCopy2, aType); + aShape = performOperation (aShapeCopy1, aShapeCopy2, aType, aFuzzyParam); if (isRmExtraEdges) { aShape = RemoveExtraEdges(aShape); @@ -229,7 +230,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) aList2.Append(aShape2); aCSI.SetArguments(aList2); aCSI.Perform(); - if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { + if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is self-intersected"); } } @@ -237,7 +238,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) // Copy shape aShapeCopy.Nullify(); TNaming_CopyShape::CopyTool(aShape2, aMapTShapes, aShapeCopy); - aShape = performOperation (aShape, aShapeCopy, aSimpleType); + aShape = performOperation (aShape, aShapeCopy, aSimpleType, aFuzzyParam); if (isRmExtraEdges) { aShape = RemoveExtraEdges(aShape); @@ -270,7 +271,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) aList1.Append(aShape); aCSI.SetArguments(aList1); aCSI.Perform(); - if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { + if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is self-intersected"); } } @@ -300,7 +301,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) aList2.Append(aTool); aCSI.SetArguments(aList2); aCSI.Perform(); - if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { + if (aCSI.HasErrors() || aCSI.DS().Interferences().Extent() > 0) { StdFail_NotDone::Raise("Boolean operation will not be performed, because argument shape is self-intersected"); } } @@ -308,7 +309,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(Handle(TFunction_Logbook)& log) // Copy shape aShapeCopy.Nullify(); TNaming_CopyShape::CopyTool(aTool, aMapTShapes, aShapeCopy); - aShape = performOperation (aShape, aShapeCopy, BOOLEAN_CUT); + aShape = performOperation (aShape, aShapeCopy, BOOLEAN_CUT, aFuzzyParam); if (aShape.IsNull()) { return 0; @@ -391,7 +392,8 @@ TopoDS_Shape GEOMImpl_BooleanDriver::makeCompoundShellFromFaces TopoDS_Shape GEOMImpl_BooleanDriver::performOperation (const TopoDS_Shape theShape1, const TopoDS_Shape theShape2, - const Standard_Integer theType)const + const Standard_Integer theType, + const Standard_Real theFuzzyParam) const { TopoDS_Shape aShape; @@ -414,7 +416,15 @@ TopoDS_Shape GEOMImpl_BooleanDriver::performOperation TopTools_ListIteratorOfListOfShape itSub2 (listShape2); for (; itSub2.More(); itSub2.Next()) { TopoDS_Shape aValue2 = itSub2.Value(); - BRepAlgoAPI_Common BO (aValue1, aValue2); + BRepAlgoAPI_Common BO; + TopTools_ListOfShape aArgShapes, aToolShapes; + aArgShapes.Append(aValue1); + aToolShapes.Append(aValue2); + BO.SetArguments(aArgShapes); + BO.SetTools(aToolShapes); + if (theFuzzyParam > 0) + BO.SetFuzzyValue(theFuzzyParam); + BO.Build(); if (!BO.IsDone()) { StdFail_NotDone::Raise("Common operation can not be performed on the given shapes"); } @@ -475,7 +485,15 @@ TopoDS_Shape GEOMImpl_BooleanDriver::performOperation TopTools_ListIteratorOfListOfShape itSub2 (listTools); for (; itSub2.More(); itSub2.Next()) { TopoDS_Shape aTool = itSub2.Value(); - BRepAlgoAPI_Cut BO (aCut, aTool); + BRepAlgoAPI_Cut BO; + TopTools_ListOfShape aArgShapes, aToolShapes; + aArgShapes.Append(aCut); + aToolShapes.Append(aTool); + BO.SetArguments(aArgShapes); + BO.SetTools(aToolShapes); + if (theFuzzyParam > 0) + BO.SetFuzzyValue(theFuzzyParam); + BO.Build(); if (!BO.IsDone()) { StdFail_NotDone::Raise("Cut operation can not be performed on the given shapes"); } @@ -537,7 +555,15 @@ TopoDS_Shape GEOMImpl_BooleanDriver::performOperation } // Perform - BRepAlgoAPI_Fuse BO (theShape1, theShape2); + BRepAlgoAPI_Fuse BO; + TopTools_ListOfShape aArgShapes, aToolShapes; + aArgShapes.Append(theShape1); + aToolShapes.Append(theShape2); + BO.SetArguments(aArgShapes); + BO.SetTools(aToolShapes); + if (theFuzzyParam > 0) + BO.SetFuzzyValue(theFuzzyParam); + BO.Build(); if (!BO.IsDone()) { StdFail_NotDone::Raise("Fuse operation can not be performed on the given shapes"); } @@ -566,6 +592,9 @@ TopoDS_Shape GEOMImpl_BooleanDriver::performOperation for (; itSub2.More(); itSub2.Next()) { TopoDS_Shape aValue2 = itSub2.Value(); BRepAlgoAPI_Section BO (aValue1, aValue2, Standard_False); + // Set the fuzzy parameter, if it is valid (negative value <=> do not use fuzzy tolerance) + if (theFuzzyParam > 0) + BO.SetFuzzyValue(theFuzzyParam); // Set approximation to have an attached 3D BSpline geometry to each edge, // where analytic curve is not possible. Without this flag in some cases // we obtain BSpline curve of degree 1 (C0), which is slowly @@ -652,6 +681,7 @@ GetCreationInformation(std::string& theOperationName, GEOMImpl_IBoolean aCI (function); Standard_Integer aType = function->GetType(); Standard_Boolean isCheckSelfInte = aCI.GetCheckSelfIntersection(); + Standard_Real aFuzzyParam = aCI.GetFuzzyParameter(); switch ( aType ) { case BOOLEAN_COMMON: @@ -700,6 +730,9 @@ GetCreationInformation(std::string& theOperationName, return false; } + if (aFuzzyParam > 0) + AddParam( theParams, "Fuzzy Parameter", aFuzzyParam ); + return true; } diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx index 2b8efef4f..e9c412e5c 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx @@ -50,7 +50,8 @@ private: TopoDS_Shape performOperation(const TopoDS_Shape theShape1, const TopoDS_Shape theShape2, - const Standard_Integer theType) const; + const Standard_Integer theType, + const Standard_Real theFuzzyParam) const; TopoDS_Shape makeCompoundShellFromFaces(const TopoDS_Shape theShape) const; diff --git a/src/GEOMImpl/GEOMImpl_IBoolean.hxx b/src/GEOMImpl/GEOMImpl_IBoolean.hxx index bb1e4285c..c33c42a4a 100644 --- a/src/GEOMImpl/GEOMImpl_IBoolean.hxx +++ b/src/GEOMImpl/GEOMImpl_IBoolean.hxx @@ -30,6 +30,7 @@ #define BOOL_ARG_SHAPES 3 #define BOOL_ARG_CHECK_SELF_INTERSECTION 4 #define BOOL_ARG_RM_EXTRA_EDGES 5 +#define BOOL_ARG_FUZZY_PARAMETER 6 class GEOMImpl_IBoolean { @@ -45,6 +46,8 @@ class GEOMImpl_IBoolean { _func->SetInteger(BOOL_ARG_CHECK_SELF_INTERSECTION, theFlag ? 1 : 0); } void SetRmExtraEdges (Standard_Boolean theFlag) { _func->SetInteger(BOOL_ARG_RM_EXTRA_EDGES, theFlag ? 1 : 0); } + void SetFuzzyParameter (Standard_Real theValue) + { _func->SetReal(BOOL_ARG_FUZZY_PARAMETER, theValue); } Handle(GEOM_Function) GetShape1() { return _func->GetReference(BOOL_ARG_SHAPE1); } Handle(GEOM_Function) GetShape2() { return _func->GetReference(BOOL_ARG_SHAPE2); } @@ -54,6 +57,8 @@ class GEOMImpl_IBoolean { return (_func->GetInteger(BOOL_ARG_CHECK_SELF_INTERSECTION) != 0); } Standard_Boolean GetRmExtraEdges() { return (_func->GetInteger(BOOL_ARG_RM_EXTRA_EDGES) != 0); } + Standard_Real GetFuzzyParameter() + { return _func->GetReal(BOOL_ARG_FUZZY_PARAMETER); } private: diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx index 51c234f49..5e1abd28e 100644 --- a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx @@ -73,7 +73,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, const Standard_Integer theOp, - const Standard_Boolean IsCheckSelfInte) + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -109,6 +110,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean aCI.SetShape1(aRef1); aCI.SetShape2(aRef2); aCI.SetCheckSelfIntersection(IsCheckSelfInte); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Boolean value try { @@ -137,6 +139,11 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean pd << ", True"; } + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } + pd << ")"; SetErrorCode(OK); @@ -152,7 +159,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuse (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, const bool IsCheckSelfInte, - const bool IsRmExtraEdges) + const bool IsRmExtraEdges, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -181,6 +189,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuse aCI.SetShape2(aRef2); aCI.SetCheckSelfIntersection(IsCheckSelfInte); aCI.SetRmExtraEdges(IsRmExtraEdges); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Boolean value try { @@ -200,7 +209,12 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuse pd << aBool << " = geompy.MakeFuse("; pd << theShape1 << ", " << theShape2 << ", " - << IsCheckSelfInte << ", " << IsRmExtraEdges << ")"; + << IsCheckSelfInte << ", " << IsRmExtraEdges; + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } + pd << ")"; SetErrorCode(OK); return aBool; @@ -214,7 +228,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuse Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList (const Handle(TColStd_HSequenceOfTransient)& theShapes, const bool IsCheckSelfInte, - const bool IsRmExtraEdges) + const bool IsRmExtraEdges, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -243,6 +258,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList aCI.SetShapes(aShapesSeq); aCI.SetCheckSelfIntersection(IsCheckSelfInte); aCI.SetRmExtraEdges(IsRmExtraEdges); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Boolean value try { @@ -261,7 +277,12 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList GEOM::TPythonDump pd (aFunction); pd << aBool << " = geompy.MakeFuseList([" << aDescription.ToCString() << "], " - << IsCheckSelfInte << ", " << IsRmExtraEdges << ")"; + << IsCheckSelfInte << ", " << IsRmExtraEdges; + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } + pd << ")"; SetErrorCode(OK); return aBool; @@ -274,7 +295,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeFuseList //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList (const Handle(TColStd_HSequenceOfTransient)& theShapes, - const Standard_Boolean IsCheckSelfInte) + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -302,6 +324,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList aCI.SetShapes(aShapesSeq); aCI.SetCheckSelfIntersection(IsCheckSelfInte); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Boolean value try { @@ -325,7 +348,10 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList if (IsCheckSelfInte) { pd << ", True"; } - + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } pd << ")"; SetErrorCode(OK); @@ -340,7 +366,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCommonList Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList (Handle(GEOM_Object) theMainShape, const Handle(TColStd_HSequenceOfTransient)& theShapes, - const Standard_Boolean IsCheckSelfInte) + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -372,6 +399,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList aCI.SetShape1(aMainRef); aCI.SetShapes(aShapesSeq); aCI.SetCheckSelfIntersection(IsCheckSelfInte); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Boolean value try { @@ -396,6 +424,11 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeCutList pd << ", True"; } + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } + pd << ")"; SetErrorCode(OK); @@ -417,7 +450,8 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition const Handle(TColStd_HArray1OfInteger)& theMaterials, const Standard_Integer theKeepNonlimitShapes, const Standard_Boolean thePerformSelfIntersections, - const Standard_Boolean IsCheckSelfInte) + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -497,6 +531,9 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition } } + // Fuzzy parameter + aCI.SetFuzzyParameter(theFuzzyParam); + //Compute the Partition try { OCC_CATCH_SIGNALS; @@ -537,6 +574,11 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition if (IsCheckSelfInte && !thePerformSelfIntersections) { pd << ", True"; } + + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } pd << ")"; @@ -550,7 +592,9 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition - (Handle(GEOM_Object) theShape, Handle(GEOM_Object) thePlane) + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePlane, + const Standard_Real theFuzzyParam) { SetErrorCode(KO); @@ -576,6 +620,7 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition aCI.SetShape(aRef1); aCI.SetPlane(aRef2); + aCI.SetFuzzyParameter(theFuzzyParam); //Compute the Partition value try { @@ -593,7 +638,12 @@ Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition //Make a Python command GEOM::TPythonDump pd (aFunction); pd << aPart << " = geompy.MakeHalfPartition(" - << theShape << ", " << thePlane << ")"; + << theShape << ", " << thePlane; + if (theFuzzyParam > 0) { + // Use named argument for the fuzzy parameter + pd << ", theFuzzyParam=" << theFuzzyParam; + } + pd << ")"; SetErrorCode(OK); return aPart; diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx index d9c548cc5..01c30eab6 100644 --- a/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx @@ -40,27 +40,32 @@ class GEOMImpl_IBooleanOperations : public GEOM_IOperations { (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, const Standard_Integer theOp, - const Standard_Boolean IsCheckSelfInte); + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam = -1.); Standard_EXPORT Handle(GEOM_Object) MakeFuse (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, const bool IsCheckSelfInte, - const bool IsRmExtraEdges); + const bool IsRmExtraEdges, + const Standard_Real theFuzzyParam = -1.); Standard_EXPORT Handle(GEOM_Object) MakeFuseList (const Handle(TColStd_HSequenceOfTransient)& theShapes, const bool IsCheckSelfInte, - const bool IsRmExtraEdges); + const bool IsRmExtraEdges, + const Standard_Real theFuzzyParam = -1.); Standard_EXPORT Handle(GEOM_Object) MakeCommonList (const Handle(TColStd_HSequenceOfTransient)& theShapes, - const Standard_Boolean IsCheckSelfInte); + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam = -1.); Standard_EXPORT Handle(GEOM_Object) MakeCutList - (Handle(GEOM_Object) theMainShape, + (Handle(GEOM_Object) theMainShape, const Handle(TColStd_HSequenceOfTransient)& theShapes, - const Standard_Boolean IsCheckSelfInte); + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam = -1.); Standard_EXPORT Handle(GEOM_Object) MakePartition (const Handle(TColStd_HSequenceOfTransient)& theShapes, @@ -70,12 +75,14 @@ class GEOMImpl_IBooleanOperations : public GEOM_IOperations { const Standard_Integer theLimit, const Standard_Boolean theRemoveWebs, const Handle(TColStd_HArray1OfInteger)& theMaterials, - const Standard_Integer theKeepNonlimitShapes, - const Standard_Boolean thePerformSelfIntersections, - const Standard_Boolean IsCheckSelfInte); - - Standard_EXPORT Handle(GEOM_Object) MakeHalfPartition (Handle(GEOM_Object) theShape, - Handle(GEOM_Object) thePlane); + const Standard_Integer theKeepNonlimitShapes, + const Standard_Boolean thePerformSelfIntersections, + const Standard_Boolean IsCheckSelfInte, + const Standard_Real theFuzzyParam = -1.); + + Standard_EXPORT Handle(GEOM_Object) MakeHalfPartition (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePlane, + const Standard_Real theFuzzyParam = -1.); private: diff --git a/src/GEOMImpl/GEOMImpl_IPartition.hxx b/src/GEOMImpl/GEOMImpl_IPartition.hxx index 6975ea463..1b49e268c 100644 --- a/src/GEOMImpl/GEOMImpl_IPartition.hxx +++ b/src/GEOMImpl/GEOMImpl_IPartition.hxx @@ -40,6 +40,7 @@ #define PART_ARG_KEEP_NONLIMIT_SHAPES 9 #define PART_ARG_CHECK_SELF_INTERSECTION 10 +#define PART_ARG_FUZZY_PARAMETER 11 class GEOMImpl_IPartition { @@ -70,6 +71,9 @@ class GEOMImpl_IPartition void SetCheckSelfIntersection (Standard_Boolean theFlag) { _func->SetInteger(PART_ARG_CHECK_SELF_INTERSECTION, theFlag ? 1 : 0); } + void SetFuzzyParameter (Standard_Real theValue) + { _func->SetReal(PART_ARG_FUZZY_PARAMETER, theValue); } + int GetLimit() { return _func->GetInteger(PART_ARG_LIMIT); } int GetKeepNonlimitShapes() { return _func->GetInteger(PART_ARG_KEEP_NONLIMIT_SHAPES); } @@ -91,6 +95,9 @@ class GEOMImpl_IPartition Standard_Boolean GetCheckSelfIntersection() { return (_func->GetInteger(PART_ARG_CHECK_SELF_INTERSECTION) != 0); } + Standard_Real GetFuzzyParameter() + { return _func->GetReal(PART_ARG_FUZZY_PARAMETER); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx index c9d2f12f9..9bee2250f 100644 --- a/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx @@ -125,6 +125,7 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(Handle(TFunction_Logbook)& lo GEOMImpl_IPartition aCI (aFunction); Standard_Integer aType = aFunction->GetType(); const Standard_Boolean isCheckSelfInte = aCI.GetCheckSelfIntersection(); + const Standard_Real aFuzzyParam = aCI.GetFuzzyParameter(); TopoDS_Shape aShape; GEOMAlgo_Splitter PS; @@ -311,6 +312,10 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(Handle(TFunction_Logbook)& lo PS.SetLimitMode(aCI.GetKeepNonlimitShapes()); PS.SetLimit((TopAbs_ShapeEnum)aCI.GetLimit()); + if (aFuzzyParam > 0) { + PS.SetFuzzyValue(aFuzzyParam); + } + // Set parallel processing mode (default is false) Standard_Boolean bRunParallel = Standard_True; PS.SetRunParallel(bRunParallel); @@ -406,6 +411,10 @@ Standard_Integer GEOMImpl_PartitionDriver::Execute(Handle(TFunction_Logbook)& lo PS.AddTool(aPlaneArg_copy); //PS.AddTool(aPlaneArg); + if (aFuzzyParam > 0) { + PS.SetFuzzyValue(aFuzzyParam); + } + //skl PS.Compute(); PS.Perform(); //PS.SetRemoveWebs(Standard_False); @@ -523,6 +532,7 @@ GetCreationInformation(std::string& theOperationName, GEOMImpl_IPartition aCI( function ); Standard_Integer aType = function->GetType(); + Standard_Real aFuzzyParam = aCI.GetFuzzyParameter(); theOperationName = "PARTITION"; @@ -557,6 +567,9 @@ GetCreationInformation(std::string& theOperationName, default: return false; } + + if (aFuzzyParam > 0) + AddParam( theParams, "Fuzzy Parameter", aFuzzyParam ); return true; } diff --git a/src/GEOM_I/GEOM_IBooleanOperations_i.cc b/src/GEOM_I/GEOM_IBooleanOperations_i.cc index 33c8f99ea..1fe76bd3f 100644 --- a/src/GEOM_I/GEOM_IBooleanOperations_i.cc +++ b/src/GEOM_I/GEOM_IBooleanOperations_i.cc @@ -66,6 +66,127 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBoolean GEOM::GEOM_Object_ptr theShape2, CORBA::Long theOp, CORBA::Boolean IsCheckSelfInte) +{ + return MakeBooleanWithFuzzy(theShape1, theShape2, theOp, IsCheckSelfInte, -1.0); +} + +//============================================================================= +/*! + * MakeFuse + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuse + (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Boolean IsCheckSelfInte, + CORBA::Boolean IsRmExtraEdges) +{ + return MakeFuseWithFuzzy(theShape1, theShape2, IsCheckSelfInte, IsRmExtraEdges, -1.0); +} + +//============================================================================= +/*! + * MakeFuseList + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseList + (const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte, + CORBA::Boolean IsRmExtraEdges) +{ + return MakeFuseListWithFuzzy(theShapes, IsCheckSelfInte, IsRmExtraEdges, -1.0); +} + +//============================================================================= +/*! + * MakeCommonList + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonList + (const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte) +{ + return MakeCommonListWithFuzzy(theShapes, IsCheckSelfInte, -1.0); +} + +//============================================================================= +/*! + * MakeCutList + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutList + (GEOM::GEOM_Object_ptr theMainShape, + const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte) +{ + return MakeCutListWithFuzzy(theMainShape, theShapes, IsCheckSelfInte, -1.0); +} + +//============================================================================= +/*! + * MakePartition + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition + (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepIns, + const GEOM::ListOfGO& theRemoveIns, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes) +{ + return MakePartitionWithFuzzy(theShapes, theTools, theKeepIns, theRemoveIns, theLimit, + theRemoveWebs, theMaterials, theKeepNonlimitShapes, -1.0); +} + +//============================================================================= +/*! + * MakePartitionNonSelfIntersectedShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersectedShape + (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepIns, + const GEOM::ListOfGO& theRemoveIns, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes, + CORBA::Boolean IsCheckSelfInte) +{ + return MakePartitionNonSelfIntersectedShapeWithFuzzy(theShapes, theTools, theKeepIns, theRemoveIns, + theLimit, theRemoveWebs, theMaterials, + theKeepNonlimitShapes, IsCheckSelfInte, -1.0); +} + +//============================================================================= +/*! + * MakeHalfPartition + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeHalfPartition + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane) +{ + return MakeHalfPartitionWithFuzzy(theShape, thePlane, -1.0); +} + + + +//============================================================================= +/*! + * MakeBooleanWithFuzzy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBooleanWithFuzzy + (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOp, + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -80,7 +201,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBoolean // Make Boolean Handle(::GEOM_Object) anObject = - GetOperations()->MakeBoolean(aSh1, aSh2, theOp, IsCheckSelfInte); + GetOperations()->MakeBoolean(aSh1, aSh2, theOp, IsCheckSelfInte, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -89,14 +210,15 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBoolean //============================================================================= /*! - * MakeFuse + * MakeFuseWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuse +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseWithFuzzy (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2, CORBA::Boolean IsCheckSelfInte, - CORBA::Boolean IsRmExtraEdges) + CORBA::Boolean IsRmExtraEdges, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -111,7 +233,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuse // Make Boolean Handle(::GEOM_Object) anObject = GetOperations()->MakeFuse - (aSh1, aSh2, IsCheckSelfInte, IsRmExtraEdges); + (aSh1, aSh2, IsCheckSelfInte, IsRmExtraEdges, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -121,13 +243,14 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuse //============================================================================= /*! - * MakeFuseList + * MakeFuseListWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseList +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseListWithFuzzy (const GEOM::ListOfGO& theShapes, CORBA::Boolean IsCheckSelfInte, - CORBA::Boolean IsRmExtraEdges) + CORBA::Boolean IsRmExtraEdges, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -143,7 +266,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseList // Make fusion Handle(::GEOM_Object) anObject = - GetOperations()->MakeFuseList(aShapes, IsCheckSelfInte, IsRmExtraEdges); + GetOperations()->MakeFuseList(aShapes, IsCheckSelfInte, IsRmExtraEdges, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -153,12 +276,13 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeFuseList //============================================================================= /*! - * MakeCommonList + * MakeCommonListWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonList +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonListWithFuzzy (const GEOM::ListOfGO& theShapes, - CORBA::Boolean IsCheckSelfInte) + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -174,7 +298,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonList // Make fusion Handle(::GEOM_Object) anObject = - GetOperations()->MakeCommonList(aShapes, IsCheckSelfInte); + GetOperations()->MakeCommonList(aShapes, IsCheckSelfInte, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -184,13 +308,14 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCommonList //============================================================================= /*! - * MakeCutList + * MakeCutListWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutList +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutListWithFuzzy (GEOM::GEOM_Object_ptr theMainShape, const GEOM::ListOfGO& theShapes, - CORBA::Boolean IsCheckSelfInte) + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -212,7 +337,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutList // Make fusion Handle(::GEOM_Object) anObject = - GetOperations()->MakeCutList(aMainShape, aShapes, IsCheckSelfInte); + GetOperations()->MakeCutList(aMainShape, aShapes, IsCheckSelfInte, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -222,10 +347,10 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeCutList //============================================================================= /*! - * MakePartition + * MakePartitionWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionWithFuzzy (const GEOM::ListOfGO& theShapes, const GEOM::ListOfGO& theTools, const GEOM::ListOfGO& theKeepIns, @@ -233,7 +358,8 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition CORBA::Short theLimit, CORBA::Boolean theRemoveWebs, const GEOM::ListOfLong& theMaterials, - CORBA::Short theKeepNonlimitShapes) + CORBA::Short theKeepNonlimitShapes, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -267,7 +393,8 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition theLimit, theRemoveWebs, aMaterials, theKeepNonlimitShapes, /*PerformSelfIntersections*/Standard_True, - /*IsCheckSelfInte*/Standard_False); + /*IsCheckSelfInte*/Standard_False, + theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -276,10 +403,10 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition //============================================================================= /*! - * MakePartitionNonSelfIntersectedShape + * MakePartitionNonSelfIntersectedShapeWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersectedShape +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersectedShapeWithFuzzy (const GEOM::ListOfGO& theShapes, const GEOM::ListOfGO& theTools, const GEOM::ListOfGO& theKeepIns, @@ -288,7 +415,8 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersected CORBA::Boolean theRemoveWebs, const GEOM::ListOfLong& theMaterials, CORBA::Short theKeepNonlimitShapes, - CORBA::Boolean IsCheckSelfInte) + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -322,7 +450,8 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersected theLimit, theRemoveWebs, aMaterials, theKeepNonlimitShapes, /*PerformSelfIntersections*/Standard_False, - IsCheckSelfInte); + IsCheckSelfInte, + theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -331,12 +460,13 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartitionNonSelfIntersected //============================================================================= /*! - * MakeHalfPartition + * MakeHalfPartitionWithFuzzy */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeHalfPartition +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeHalfPartitionWithFuzzy (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePlane) + GEOM::GEOM_Object_ptr thePlane, + CORBA::Double theFuzzyParam) { GEOM::GEOM_Object_var aGEOMObject; @@ -351,7 +481,7 @@ GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeHalfPartition // Make Half Partition Handle(::GEOM_Object) anObject = - GetOperations()->MakeHalfPartition(aSh, aPl); + GetOperations()->MakeHalfPartition(aSh, aPl, theFuzzyParam); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_IBooleanOperations_i.hh b/src/GEOM_I/GEOM_IBooleanOperations_i.hh index 521640d7b..55b96af18 100644 --- a/src/GEOM_I/GEOM_IBooleanOperations_i.hh +++ b/src/GEOM_I/GEOM_IBooleanOperations_i.hh @@ -43,12 +43,12 @@ class GEOM_I_EXPORT GEOM_IBooleanOperations_i : ~GEOM_IBooleanOperations_i(); GEOM::GEOM_Object_ptr MakeBoolean (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2, - CORBA::Long theOp, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOp, CORBA::Boolean IsCheckSelfInte); GEOM::GEOM_Object_ptr MakeFuse (GEOM::GEOM_Object_ptr theShape1, - GEOM::GEOM_Object_ptr theShape2, + GEOM::GEOM_Object_ptr theShape2, CORBA::Boolean IsCheckSelfInte, CORBA::Boolean IsRmExtraEdges); @@ -64,27 +64,79 @@ class GEOM_I_EXPORT GEOM_IBooleanOperations_i : CORBA::Boolean IsCheckSelfInte); GEOM::GEOM_Object_ptr MakePartition (const GEOM::ListOfGO& theShapes, - const GEOM::ListOfGO& theTools, - const GEOM::ListOfGO& theKeepInside, - const GEOM::ListOfGO& theRemoveInside, - CORBA::Short theLimit, - CORBA::Boolean theRemoveWebs, - const GEOM::ListOfLong& theMaterials, - CORBA::Short theKeepNonlimitShapes); + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepInside, + const GEOM::ListOfGO& theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes); GEOM::GEOM_Object_ptr MakePartitionNonSelfIntersectedShape (const GEOM::ListOfGO& theShapes, - const GEOM::ListOfGO& theTools, - const GEOM::ListOfGO& theKeepInside, - const GEOM::ListOfGO& theRemoveInside, - CORBA::Short theLimit, - CORBA::Boolean theRemoveWebs, - const GEOM::ListOfLong& theMaterials, - CORBA::Short theKeepNonlimitShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepInside, + const GEOM::ListOfGO& theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes, CORBA::Boolean IsCheckSelfInte); - GEOM::GEOM_Object_ptr MakeHalfPartition (GEOM::GEOM_Object_ptr theShape, - GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr thePlane); + + // New interface methods with "Fuzzy parameter" support + + GEOM::GEOM_Object_ptr MakeBooleanWithFuzzy (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOp, + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakeFuseWithFuzzy (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Boolean IsCheckSelfInte, + CORBA::Boolean IsRmExtraEdges, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakeFuseListWithFuzzy (const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte, + CORBA::Boolean IsRmExtraEdges, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakeCommonListWithFuzzy (const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakeCutListWithFuzzy (GEOM::GEOM_Object_ptr theMainShape, + const GEOM::ListOfGO& theShapes, + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakePartitionWithFuzzy (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepInside, + const GEOM::ListOfGO& theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakePartitionNonSelfIntersectedShapeWithFuzzy (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepInside, + const GEOM::ListOfGO& theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials, + CORBA::Short theKeepNonlimitShapes, + CORBA::Boolean IsCheckSelfInte, + CORBA::Double theFuzzyParam); + + GEOM::GEOM_Object_ptr MakeHalfPartitionWithFuzzy (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane, + CORBA::Double theFuzzyParam); ::GEOMImpl_IBooleanOperations* GetOperations() { return (::GEOMImpl_IBooleanOperations*)GetImpl(); } diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 9ff29d8b8..d1fee65e2 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -7762,6 +7762,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -7775,7 +7778,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # # @ref tui_fuse "Example" @ManageTransactions("BoolOp") - def MakeBoolean(self, theShape1, theShape2, theOperation, checkSelfInte=False, theName=None): + def MakeBoolean(self, theShape1, theShape2, theOperation, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform one of boolean operations on two given shapes. @@ -7790,6 +7793,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -7804,7 +7810,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): New GEOM.GEOM_Object, containing the result shape. """ # Example: see GEOM_TestAll.py - anObj = self.BoolOp.MakeBoolean(theShape1, theShape2, theOperation, checkSelfInte) + anObj = self.BoolOp.MakeBooleanWithFuzzy(theShape1, theShape2, theOperation, checkSelfInte, theFuzzyParam) RaiseIfFailed("MakeBoolean", self.BoolOp) def_names = { 1: "common", 2: "cut", 3: "fuse", 4: "section" } self._autoPublish(anObj, theName, def_names[theOperation]) @@ -7818,6 +7824,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -7831,7 +7840,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # # @ref tui_common "Example 1" # \n @ref swig_MakeCommon "Example 2" - def MakeCommon(self, theShape1, theShape2, checkSelfInte=False, theName=None): + def MakeCommon(self, theShape1, theShape2, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform Common boolean operation on two given shapes. @@ -7844,6 +7853,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -7859,7 +7871,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py # note: auto-publishing is done in self.MakeBoolean() - return self.MakeBoolean(theShape1, theShape2, 1, checkSelfInte, theName) + return self.MakeBoolean(theShape1, theShape2, 1, checkSelfInte, theName, theFuzzyParam) ## Perform Cut boolean operation on two given shapes. # @param theShape1 First argument for boolean operation. @@ -7869,6 +7881,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -7882,7 +7897,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # # @ref tui_cut "Example 1" # \n @ref swig_MakeCommon "Example 2" - def MakeCut(self, theShape1, theShape2, checkSelfInte=False, theName=None): + def MakeCut(self, theShape1, theShape2, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform Cut boolean operation on two given shapes. @@ -7895,6 +7910,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -7911,7 +7929,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py # note: auto-publishing is done in self.MakeBoolean() - return self.MakeBoolean(theShape1, theShape2, 2, checkSelfInte, theName) + return self.MakeBoolean(theShape1, theShape2, 2, checkSelfInte, theName, theFuzzyParam) ## Perform Fuse boolean operation on two given shapes. # @param theShape1 First argument for boolean operation. @@ -7923,6 +7941,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -7938,7 +7959,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # \n @ref swig_MakeCommon "Example 2" @ManageTransactions("BoolOp") def MakeFuse(self, theShape1, theShape2, checkSelfInte=False, - rmExtraEdges=False, theName=None): + rmExtraEdges=False, theName=None, theFuzzyParam=-1): """ Perform Fuse boolean operation on two given shapes. @@ -7953,6 +7974,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -7968,8 +7992,8 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py - anObj = self.BoolOp.MakeFuse(theShape1, theShape2, - checkSelfInte, rmExtraEdges) + anObj = self.BoolOp.MakeFuseWithFuzzy(theShape1, theShape2, checkSelfInte, + rmExtraEdges, theFuzzyParam) RaiseIfFailed("MakeFuse", self.BoolOp) self._autoPublish(anObj, theName, "fuse") return anObj @@ -7983,11 +8007,14 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # @return New GEOM.GEOM_Object, containing the result shape. # # @ref tui_section "Example 1" # \n @ref swig_MakeCommon "Example 2" - def MakeSection(self, theShape1, theShape2, checkSelfInte=False, theName=None): + def MakeSection(self, theShape1, theShape2, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform Section boolean operation on two given shapes. @@ -8000,13 +8027,16 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Returns: New GEOM.GEOM_Object, containing the result shape. """ # Example: see GEOM_TestOthers.py # note: auto-publishing is done in self.MakeBoolean() - return self.MakeBoolean(theShape1, theShape2, 4, checkSelfInte, theName) + return self.MakeBoolean(theShape1, theShape2, 4, checkSelfInte, theName, theFuzzyParam) ## Perform Fuse boolean operation on the list of shapes. # @param theShapesList Shapes to be fused. @@ -8017,6 +8047,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -8032,7 +8065,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # \n @ref swig_MakeCommon "Example 2" @ManageTransactions("BoolOp") def MakeFuseList(self, theShapesList, checkSelfInte=False, - rmExtraEdges=False, theName=None): + rmExtraEdges=False, theName=None, theFuzzyParam=-1): """ Perform Fuse boolean operation on the list of shapes. @@ -8046,6 +8079,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -8061,8 +8097,8 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py - anObj = self.BoolOp.MakeFuseList(theShapesList, checkSelfInte, - rmExtraEdges) + anObj = self.BoolOp.MakeFuseListWithFuzzy(theShapesList, checkSelfInte, + rmExtraEdges, theFuzzyParam) RaiseIfFailed("MakeFuseList", self.BoolOp) self._autoPublish(anObj, theName, "fuse") return anObj @@ -8074,6 +8110,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -8088,7 +8127,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @ref tui_common "Example 1" # \n @ref swig_MakeCommon "Example 2" @ManageTransactions("BoolOp") - def MakeCommonList(self, theShapesList, checkSelfInte=False, theName=None): + def MakeCommonList(self, theShapesList, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform Common boolean operation on the list of shapes. @@ -8100,6 +8139,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -8115,7 +8157,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py - anObj = self.BoolOp.MakeCommonList(theShapesList, checkSelfInte) + anObj = self.BoolOp.MakeCommonListWithFuzzy(theShapesList, checkSelfInte, theFuzzyParam) RaiseIfFailed("MakeCommonList", self.BoolOp) self._autoPublish(anObj, theName, "common") return anObj @@ -8128,6 +8170,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the boolean + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the boolean operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -8142,7 +8187,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @ref tui_cut "Example 1" # \n @ref swig_MakeCommon "Example 2" @ManageTransactions("BoolOp") - def MakeCutList(self, theMainShape, theShapesList, checkSelfInte=False, theName=None): + def MakeCutList(self, theMainShape, theShapesList, checkSelfInte=False, theName=None, theFuzzyParam=-1): """ Perform Cut boolean operation on one object and the list of tools. @@ -8155,6 +8200,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. + theFuzzyParam The fuzzy parameter to be used for the boolean operation. + If the value is not positive, no fuzzy tolerance will be + considered for the boolean operation. Note: This algorithm doesn't find all types of self-intersections. @@ -8170,7 +8218,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): """ # Example: see GEOM_TestOthers.py - anObj = self.BoolOp.MakeCutList(theMainShape, theShapesList, checkSelfInte) + anObj = self.BoolOp.MakeCutListWithFuzzy(theMainShape, theShapesList, checkSelfInte, theFuzzyParam) RaiseIfFailed("MakeCutList", self.BoolOp) self._autoPublish(anObj, theName, "cut") return anObj @@ -8191,10 +8239,12 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # target type (equal to Limit) are kept in the result, # else standalone shapes of lower dimension # are kept also (if they exist). - # # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the partition + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the partition operation. # # @note Each compound from ListShapes and ListTools will be exploded # in order to avoid possible intersection between shapes from this compound. @@ -8216,7 +8266,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): @ManageTransactions("BoolOp") def MakePartition(self, ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], Limit=ShapeType["AUTO"], RemoveWebs=0, ListMaterials=[], - KeepNonlimitShapes=0, theName=None): + KeepNonlimitShapes=0, theName=None, theFuzzyParam=-1): """ Perform partition operation. @@ -8261,10 +8311,10 @@ class geomBuilder(GEOM._objref_GEOM_Gen): for s in ListShapes: lim = min(lim, s.GetMaxShapeType()) Limit = EnumToLong(lim) pass - anObj = self.BoolOp.MakePartition(ListShapes, ListTools, - ListKeepInside, ListRemoveInside, - Limit, RemoveWebs, ListMaterials, - KeepNonlimitShapes); + anObj = self.BoolOp.MakePartitionWithFuzzy(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials, + KeepNonlimitShapes, theFuzzyParam) RaiseIfFailed("MakePartition", self.BoolOp) self._autoPublish(anObj, theName, "partition") return anObj @@ -8278,6 +8328,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # One additional parameter is provided: # @param checkSelfInte The flag that tells if the arguments should # be checked for self-intersection prior to the operation. + # @param theFuzzyParam The fuzzy parameter to be used for the partition + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the partition operation. # # @note This algorithm doesn't find all types of self-intersections. # It is tuned to detect vertex/vertex, vertex/edge, edge/edge, @@ -8298,7 +8351,8 @@ class geomBuilder(GEOM._objref_GEOM_Gen): ListKeepInside=[], ListRemoveInside=[], Limit=ShapeType["AUTO"], RemoveWebs=0, ListMaterials=[], KeepNonlimitShapes=0, - checkSelfInte=False, theName=None): + checkSelfInte=False, theName=None, + theFuzzyParam=-1): """ Perform partition operation. This method may be useful if it is needed to make a partition for @@ -8334,10 +8388,11 @@ class geomBuilder(GEOM._objref_GEOM_Gen): for s in ListShapes: lim = min(lim, s.GetMaxShapeType()) Limit = EnumToLong(lim) pass - anObj = self.BoolOp.MakePartitionNonSelfIntersectedShape(ListShapes, ListTools, - ListKeepInside, ListRemoveInside, - Limit, RemoveWebs, ListMaterials, - KeepNonlimitShapes, checkSelfInte); + anObj = self.BoolOp.MakePartitionNonSelfIntersectedShapeWithFuzzy(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials, + KeepNonlimitShapes, checkSelfInte, + theFuzzyParam) RaiseIfFailed("MakePartitionNonSelfIntersectedShape", self.BoolOp) self._autoPublish(anObj, theName, "partition") return anObj @@ -8348,7 +8403,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # \n @ref swig_Partition "Example 2" def Partition(self, ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], Limit=ShapeType["AUTO"], RemoveWebs=0, ListMaterials=[], - KeepNonlimitShapes=0, theName=None): + KeepNonlimitShapes=0, theName=None, theFuzzyParam=-1): """ See method geompy.MakePartition for more information. """ @@ -8357,7 +8412,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): anObj = self.MakePartition(ListShapes, ListTools, ListKeepInside, ListRemoveInside, Limit, RemoveWebs, ListMaterials, - KeepNonlimitShapes, theName); + KeepNonlimitShapes, theName, theFuzzyParam) return anObj ## Perform partition of the Shape with the Plane @@ -8366,6 +8421,9 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. + # @param theFuzzyParam The fuzzy parameter to be used for the partition + # operation. If the value is not positive, no fuzzy tolerance will + # be considered for the partition operation. # # @return New GEOM.GEOM_Object, containing the result shape. # @@ -8388,7 +8446,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): # # @ref tui_partition "Example" @ManageTransactions("BoolOp") - def MakeHalfPartition(self, theShape, thePlane, theName=None): + def MakeHalfPartition(self, theShape, thePlane, theName=None, theFuzzyParam=-1): """ Perform partition of the Shape with the Plane @@ -8415,7 +8473,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen): Result = geompy.MakePartition([Object], [Plane]) """ # Example: see GEOM_TestAll.py - anObj = self.BoolOp.MakeHalfPartition(theShape, thePlane) + anObj = self.BoolOp.MakeHalfPartitionWithFuzzy(theShape, thePlane, theFuzzyParam) RaiseIfFailed("MakeHalfPartition", self.BoolOp) self._autoPublish(anObj, theName, "partition") return anObj diff --git a/src/OperationGUI/OperationGUI_PartitionDlg.cxx b/src/OperationGUI/OperationGUI_PartitionDlg.cxx index 69b6a3839..df00065f4 100644 --- a/src/OperationGUI/OperationGUI_PartitionDlg.cxx +++ b/src/OperationGUI/OperationGUI_PartitionDlg.cxx @@ -46,6 +46,9 @@ // Comment next line to enable preview in Partition dialog box #define NO_PREVIEW +#define DEFAULT_FUZZY_VALUE 1e-5 + + //================================================================================= // class : OperationGUI_PartitionDlg() // purpose : Constructs a OperationGUI_PartitionDlg which is a child of 'parent', with the @@ -91,6 +94,21 @@ OperationGUI_PartitionDlg::OperationGUI_PartitionDlg( GeometryGUI* theGeometryGU mySelfInte->setText(tr("GEOM_CHECK_SELF_INTERSECTIONS")); GroupPoints->gridLayout1->addWidget(mySelfInte, 5, 0, 1, 3); + // Add all "fuzzy parameter" related widgets + myFuzzyChk = new QCheckBox(GroupPoints->GroupBox1); + myFuzzyChk->setText(tr("GEOM_USE_FUZZY_PARAMETER")); + GroupPoints->gridLayout1->addWidget(myFuzzyChk, 6, 0, 1, 3); + + myFuzzyLbl = new QLabel(GroupPoints->GroupBox1); + myFuzzyLbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myFuzzyLbl->setText(tr("GEOM_FUZZY_PARAMETER")); + GroupPoints->gridLayout1->addWidget(myFuzzyLbl, 7, 0, 1, 2); + + myFuzzyEdt = new SalomeApp_DoubleSpinBox(GroupPoints->GroupBox1); + initSpinBox( myFuzzyEdt, 1.e-7, 10.0, DEFAULT_FUZZY_VALUE, "length_tol_precision" ); + myFuzzyEdt->setValue(DEFAULT_FUZZY_VALUE); + GroupPoints->gridLayout1->addWidget(myFuzzyEdt, 7, 2); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupPoints ); @@ -148,6 +166,11 @@ void OperationGUI_PartitionDlg::Init() GroupPoints->CheckButton1->setChecked( false ); mySelfInte->setChecked(false); + // Do not use Fuzzy parameter by default + myFuzzyChk->setChecked(false); + myFuzzyLbl->setEnabled(false); + myFuzzyEdt->setEnabled(false); + mainFrame()->GroupBoxPublish->show(); /* signals and slots connections */ @@ -172,6 +195,8 @@ void OperationGUI_PartitionDlg::Init() connect( GroupPoints->CheckButton2, SIGNAL(toggled(bool)), mySelfInte, SLOT(setEnabled(bool)) ); connect( mySelfInte, SIGNAL(toggled(bool)), this, SLOT(processPreview()) ); + connect( myFuzzyChk, SIGNAL(stateChanged(int)), this, SLOT(UseFuzzyChanged(int))); + mySelfInte->setEnabled(GroupPoints->CheckButton2->isChecked()); initName( tr( "GEOM_PARTITION" ) ); @@ -189,12 +214,6 @@ void OperationGUI_PartitionDlg::ConstructorsClicked( int constructorId ) disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); globalSelection(); - //myListShapes.length( 0 ); - //myListTools.length( 0 ); - //myListKeepInside.length( 0 ); // obsolete - //myListRemoveInside.length( 0 ); // obsolete - //myListMaterials.length( 0 ); // obsolete - switch ( constructorId ) { case 0: /*Full partition */ GroupPoints->GroupBox1->setTitle( tr( "GEOM_PARTITION" ) ); @@ -268,6 +287,22 @@ bool OperationGUI_PartitionDlg::ClickOnApply() } +//================================================================================= +// function : UseFuzzyChanged() +// purpose : This slot is called whenever the status of CheckButton3 has changed +//================================================================================= +void OperationGUI_PartitionDlg::UseFuzzyChanged(int state) +{ + QCheckBox* send = (QCheckBox*)sender(); + + if (send == myFuzzyChk) { + bool isChecked = (state != Qt::Unchecked); + myFuzzyLbl->setEnabled(isChecked); + myFuzzyEdt->setEnabled(isChecked); + } +} + + //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection as changed or other case @@ -455,6 +490,9 @@ bool OperationGUI_PartitionDlg::execute (ObjectList& objects) GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation()); + bool useFuzzyParam = myFuzzyChk->isChecked(); + double aFuzzyParam = (useFuzzyParam ? myFuzzyEdt->value() : -1.0); + switch ( getConstructorId() ) { case 0: { @@ -464,19 +502,19 @@ bool OperationGUI_PartitionDlg::execute (ObjectList& objects) bool aNoSelfIntersection = GroupPoints->CheckButton2->isChecked(); anObj = aNoSelfIntersection ? - anOper->MakePartitionNonSelfIntersectedShape(myListShapes, myListTools, - myListKeepInside, myListRemoveInside, - aLimit, false, myListMaterials, aKeepNonlimitShapes, - isDetectSelfInte) : - anOper->MakePartition(myListShapes, myListTools, - myListKeepInside, myListRemoveInside, - aLimit, false, myListMaterials, aKeepNonlimitShapes); + anOper->MakePartitionNonSelfIntersectedShapeWithFuzzy(myListShapes, myListTools, + myListKeepInside, myListRemoveInside, + aLimit, false, myListMaterials, aKeepNonlimitShapes, + isDetectSelfInte, aFuzzyParam) : + anOper->MakePartitionWithFuzzy(myListShapes, myListTools, + myListKeepInside, myListRemoveInside, + aLimit, false, myListMaterials, aKeepNonlimitShapes, aFuzzyParam); res = true; } break; case 1: { - anObj = anOper->MakeHalfPartition(myListShapes[0].in(), myListTools[0].in()); + anObj = anOper->MakeHalfPartitionWithFuzzy(myListShapes[0].in(), myListTools[0].in(), aFuzzyParam); res = true; } break; @@ -522,13 +560,6 @@ void OperationGUI_PartitionDlg::restoreSubShapes( SALOMEDS::SObject_ptr theSObje //======================================================================= void OperationGUI_PartitionDlg::ComboTextChanged() { - //bool IsEnabled = GroupPoints->ComboBox1->currentItem() < 3; - //GroupPoints->LineEdit3->setEnabled(IsEnabled); - //GroupPoints->LineEdit4->setEnabled(IsEnabled); - //GroupPoints->TextLabel4->setEnabled(IsEnabled); - //GroupPoints->TextLabel5->setEnabled(IsEnabled); - //GroupPoints->PushButton3->setEnabled(IsEnabled); - //GroupPoints->PushButton4->setEnabled(IsEnabled); processPreview(); } diff --git a/src/OperationGUI/OperationGUI_PartitionDlg.h b/src/OperationGUI/OperationGUI_PartitionDlg.h index cfa65f776..317dc68a4 100644 --- a/src/OperationGUI/OperationGUI_PartitionDlg.h +++ b/src/OperationGUI/OperationGUI_PartitionDlg.h @@ -29,6 +29,8 @@ class DlgRef_2Sel1List2Check; class QCheckBox; +class QLabel; +class SalomeApp_DoubleSpinBox; //================================================================================= // class : OperationGUI_PartitionDlg @@ -66,11 +68,15 @@ private: GEOM::ListOfGO myListKeepInside; DlgRef_2Sel1List2Check* GroupPoints; - QCheckBox *mySelfInte; + QCheckBox* mySelfInte; + QCheckBox* myFuzzyChk; + QLabel* myFuzzyLbl; + SalomeApp_DoubleSpinBox* myFuzzyEdt; private slots: void ClickOnOk(); bool ClickOnApply(); + void UseFuzzyChanged(int state); void ActivateThisDialog(); void LineEditReturnPressed(); void SelectionIntoArgument(); diff --git a/test/test_boolean_fuzzy.py b/test/test_boolean_fuzzy.py new file mode 100644 index 000000000..737b8a287 --- /dev/null +++ b/test/test_boolean_fuzzy.py @@ -0,0 +1,146 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import salome +### +salome.salome_init() + +import GEOM +from salome.geom import geomBuilder +import math +import SALOMEDS + +geompy = geomBuilder.New() + +import unittest + +def HasSameSubShapes( shape, expected_info ): + """ + Compare topology information about shape with expected data + param shape - shape to be checked + param expected_info - expected WhatIsInformation for the shape + return True, if number of shapes are equal - False, otherwise + """ + name = shape.GetName() + if name: + name = '"%s"' % name + what_is = geompy.WhatIs( shape ) + what_is_list = what_is.strip().split( "\n" ) + # Remove flat content + if what_is_list.count( " Flat content : " ): + wIndex = what_is_list.index( " Flat content : " ) + what_is_list = what_is_list[:( wIndex - len( what_is_list ) - 1 )] + got_info_dict = {} + for item in what_is_list: + pair = item.split( ":" ) + if len(pair)==2: + type = item.split( ":" )[0].strip() + value = item.split( ":" )[1].strip() + if type.find( "Number of sub-shapes" ) == -1: + got_info_dict[type] = value + if len( expected_info ) > len( got_info_dict ): + print( "ERROR!!! Got topology information about shape %s isn't complete..." % name ) + return False + for key in expected_info: + if key not in got_info_dict: + print( "ERROR!!! There is no information about number of " + key + "(s) in %s shape!!!" % name ) + return False + elif str( expected_info[key] ).find( str( got_info_dict[key] )) == -1 or len( str( expected_info[key] )) != len( str( got_info_dict[key] )): + print( "ERROR!!! The number of " + key + "(s) is incorrect in %s shape!!! ( " % name + str( got_info_dict[key] ) + " instead of " + str( expected_info[key] ) + " )" ) + return False + return True + + +class GEOMTestBooleanFuzzy(unittest.TestCase): + def testFuse(self): + Vertex_1 = geompy.MakeVertex(10, 0, 0) + Vertex_2 = geompy.MakeVertex(20, 10.0001, 10.0001) + Box_1 = geompy.MakeBoxDXDYDZ(10, 10, 10) + Box_2 = geompy.MakeBoxTwoPnt(Vertex_1, Vertex_2) + # Fuse without fuzzy parameter + Fuse_1 = geompy.MakeFuse(Box_1, Box_2, True, True) + WHAT_IS_1={"VERTEX":14, "EDGE":21, "WIRE":9, "FACE":9, "SHELL":1, "SOLID":1, "COMPSOLID":0, "COMPOUND":0, "SHAPE":55} + assert(HasSameSubShapes(Fuse_1, WHAT_IS_1)) + # Fuse with fuzzy parameter + Fuse_2 = geompy.MakeFuse(Box_1, Box_2, True, True, None, 1.e-4) + WHAT_IS_2={"VERTEX":11, "EDGE":17, "WIRE":8, "FACE":8, "SHELL":1, "SOLID":1, "COMPSOLID":0, "COMPOUND":0, "SHAPE":46} + assert(HasSameSubShapes(Fuse_2, WHAT_IS_2)) + + def testCommon(self): + Vertex_1 = geompy.MakeVertex(0, 9.999995, 0) + Sphere_1 = geompy.MakeSphereR(5) + Sphere_2 = geompy.MakeSpherePntR(Vertex_1, 5) + # Common without fuzzy parameter + Common_1 = geompy.MakeCommon(Sphere_1, Sphere_2, True) + WHAT_IS_1={"VERTEX":1, "EDGE":1, "WIRE":2, "FACE":2, "SHELL":1, "SOLID":1, "COMPSOLID":0, "COMPOUND":0, "SHAPE":8} + assert(HasSameSubShapes(Common_1, WHAT_IS_1)) + # Common with fuzzy parameter + Common_2 = geompy.MakeCommon(Sphere_1, Sphere_2, True, None, 1.e-5) + WHAT_IS_2={"VERTEX":0, "EDGE":0, "WIRE":0, "FACE":0, "SHELL":0, "SOLID":0, "COMPSOLID":0, "COMPOUND":1, "SHAPE":1} + assert(HasSameSubShapes(Common_2, WHAT_IS_2)) + + def testCut(self): + OX = geompy.MakeVectorDXDYDZ(1, 0, 0) + Vertex_1 = geompy.MakeVertex(5.e-5, 5, 5) + Box_1 = geompy.MakeBoxDXDYDZ(10, 10, 10) + Cylinder_1 = geompy.MakeCylinder(Vertex_1, OX, 6, 13) + # Cut with low fuzzy parameter + Cut_1 = geompy.MakeCut(Box_1, Cylinder_1, True, None, 1.e-5) + WHAT_IS_1={"VERTEX":24, "EDGE":36, "WIRE":14, "FACE":14, "SHELL":1, "SOLID":1, "COMPSOLID":0, "COMPOUND":0, "SHAPE":90} + assert(HasSameSubShapes(Cut_1, WHAT_IS_1)) + # Cut with high fuzzy parameter + Cut_2 = geompy.MakeCut(Box_1, Cylinder_1, True, None, 5.e-5) + WHAT_IS_2={"VERTEX":24, "EDGE":36, "WIRE":20, "FACE":20, "SHELL":4, "SOLID":4, "COMPSOLID":0, "COMPOUND":1, "SHAPE":109} + assert(HasSameSubShapes(Cut_2, WHAT_IS_2)) + + def testBoolean(self): + Vertex_1 = geompy.MakeVertex(0, 9.999995, 0) + Sphere_1 = geompy.MakeSphereR(5) + Sphere_2 = geompy.MakeSpherePntR(Vertex_1, 5) + # Common without fuzzy parameter + Common_1 = geompy.MakeBoolean(Sphere_1, Sphere_2, 1, True) + WHAT_IS_1={"VERTEX":1, "EDGE":1, "WIRE":2, "FACE":2, "SHELL":1, "SOLID":1, "COMPSOLID":0, "COMPOUND":0, "SHAPE":8} + assert(HasSameSubShapes(Common_1, WHAT_IS_1)) + # Common with fuzzy parameter + Common_2 = geompy.MakeBoolean(Sphere_1, Sphere_2, 1, True, None, 1.e-5) + WHAT_IS_2={"VERTEX":0, "EDGE":0, "WIRE":0, "FACE":0, "SHELL":0, "SOLID":0, "COMPSOLID":0, "COMPOUND":1, "SHAPE":1} + assert(HasSameSubShapes(Common_2, WHAT_IS_2)) + + def testPartition(self): + Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) + Cylinder_1 = geompy.MakeCylinderRH(100, 300) + Box_2 = geompy.MakeBoxDXDYDZ(200, 200, 200) + Box_translated_slightly_inside = geompy.MakeTranslation(Box_2, 0, -199.9999, 0) + Box_translated_slightly_outside = geompy.MakeTranslation(Box_2, 0, -200.0001, 0) + Partitition_small_intersection = geompy.MakePartition([Box_1, Cylinder_1, Box_translated_slightly_inside]) + WHAT_IS_1={"VERTEX":25, "EDGE":49, "WIRE":32, "FACE":32, "SHELL":7, "SOLID":7, "COMPSOLID":0, "COMPOUND":1, "SHAPE":153} + assert(HasSameSubShapes(Partitition_small_intersection, WHAT_IS_1)) + Partitition_small_intersection_fixed_by_fuzzy = geompy.MakePartition([Box_1, Cylinder_1, Box_translated_slightly_inside], theFuzzyParam=0.0001) + WHAT_IS_2={"VERTEX":19, "EDGE":36, "WIRE":23, "FACE":23, "SHELL":5, "SOLID":5, "COMPSOLID":0, "COMPOUND":1, "SHAPE":112} + assert(HasSameSubShapes(Partitition_small_intersection_fixed_by_fuzzy, WHAT_IS_2)) + Partitition_small_gap = geompy.MakePartition([Box_1, Cylinder_1, Box_translated_slightly_outside]) + WHAT_IS_3={"VERTEX":25, "EDGE":44, "WIRE":25, "FACE":25, "SHELL":5, "SOLID":5, "COMPSOLID":0, "COMPOUND":1, "SHAPE":130} + assert(HasSameSubShapes(Partitition_small_gap, WHAT_IS_3)) + Partitition_small_gap_fixed_by_fuzzy = geompy.MakePartition([Box_1, Cylinder_1, Box_translated_slightly_inside], theFuzzyParam=0.0001) + WHAT_IS_4={"VERTEX":19, "EDGE":36, "WIRE":23, "FACE":23, "SHELL":5, "SOLID":5, "COMPSOLID":0, "COMPOUND":1, "SHAPE":112} + assert(HasSameSubShapes(Partitition_small_gap_fixed_by_fuzzy, WHAT_IS_4)) + +if __name__ == '__main__': + unittest.main() diff --git a/test/tests.set b/test/tests.set index 15aa6d2b7..5e264b447 100644 --- a/test/tests.set +++ b/test/tests.set @@ -30,5 +30,6 @@ IF(${OpenCASCADE_VERSION}.${OpenCASCADE_SP_VERSION} VERSION_GREATER "7.5.3.3") test_kind_of_shape.py test_proximity_edge_edge.py test_proximity_face_face.py + test_boolean_fuzzy.py ) ENDIF() -- 2.39.2