From 3bf0f5115e5a5dbf851bfac0e279885e5ba3d170 Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 14 Mar 2013 09:29:42 +0000 Subject: [PATCH] 0021717: EDF 1718: Add thickness reduction to the Pipe T-Shape --- .../examples/advanced_geom_objs_ex01.py | 39 +- doc/salome/gui/GEOM/images/pipetshape_dlg.png | Bin 40204 -> 50971 bytes .../gui/GEOM/images/pipetshape_pos_dlg.png | Bin 0 -> 29488 bytes .../gui/GEOM/images/pipetshape_thr_dlg.png | Bin 0 -> 66841 bytes doc/salome/gui/GEOM/images/pipetshapethr.png | Bin 0 -> 22965 bytes .../gui/GEOM/input/creating_pipetshape.doc | 49 +- idl/GEOM_Gen.idl | 252 +++ resources/Makefile.am | 2 +- resources/pipetshape_section.png | Bin 0 -> 12959 bytes src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.cxx | 1827 ++++++++++------- src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h | 135 +- src/GEOMGUI/GEOM_images.ts | 4 + src/GEOMGUI/GEOM_msg_en.ts | 40 + src/GEOMGUI/GEOM_msg_fr.ts | 40 + src/GEOMImpl/GEOMImpl_BooleanDriver.cxx | 48 +- src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx | 1159 ++++++++--- src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx | 89 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 69 +- src/GEOMImpl/GEOMImpl_IPipeTShape.hxx | 51 +- src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx | 87 +- src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx | 27 +- src/GEOMUtils/GEOMUtils.cxx | 101 + src/GEOMUtils/GEOMUtils.hxx | 22 + src/GEOM_I/GEOM_IAdvancedOperations_i.cc | 424 +++- src/GEOM_I/GEOM_IAdvancedOperations_i.hh | 107 +- src/GEOM_SWIG/geompyDC.py | 176 +- 26 files changed, 3341 insertions(+), 1407 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png create mode 100644 doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png create mode 100644 doc/salome/gui/GEOM/images/pipetshapethr.png create mode 100644 resources/pipetshape_section.png diff --git a/doc/salome/examples/advanced_geom_objs_ex01.py b/doc/salome/examples/advanced_geom_objs_ex01.py index eb3db5fe5..036fe8f4e 100644 --- a/doc/salome/examples/advanced_geom_objs_ex01.py +++ b/doc/salome/examples/advanced_geom_objs_ex01.py @@ -27,6 +27,16 @@ id_pipetshape_position = geompy.addToStudy(pipetshape_position[0],"PipeTShape_po for g in pipetshape_position[1:]: geompy.addToStudyInFather(pipetshape_position[0], g, g.GetName()) +# create PipeTShape object with left thickness reduction +pipetshape_thr = geompy.MakePipeTShape(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, + theRL=60, theWL=20, theLtransL=40, theLthinL=20) + +# add object in the study +id_pipetshape_thr = geompy.addToStudy(pipetshape_thr[0],"PipeTShape_left_thickness_reduction") +# add groups in the study +for g in pipetshape_thr[1:]: + geompy.addToStudyInFather(pipetshape_thr[0], g, g.GetName()) + # create PipeTShape with chamfer object pipetshapechamfer = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0) @@ -45,6 +55,17 @@ id_pipetshapechamfer_position = geompy.addToStudy(pipetshapechamfer_position[0], for g in pipetshapechamfer_position[1:]: geompy.addToStudyInFather(pipetshapechamfer_position[0], g, g.GetName()) +# create PipeTShape with chamfer object with left and right thickness reductions +pipetshapechamfer_thr = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0, + theRL=60, theWL=20, theLtransL=40, theLthinL=20, + theRR=40, theWR=10, theLtransR=60, theLthinR=30) + +# add object in the study +id_pipetshapechamfer_thr = geompy.addToStudy(pipetshapechamfer_thr[0],"PipeTShapeChamfer_two_thickness_reductions") +# add groups in the study +for g in pipetshapechamfer_thr[1:]: + geompy.addToStudyInFather(pipetshapechamfer_thr[0], g, g.GetName()) + # create PipeTShape with fillet object pipetshapefillet = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 5.0) @@ -62,12 +83,28 @@ id_pipetshapefillet_position = geompy.addToStudy(pipetshapefillet_position[0],"P # add groups in the study for g in pipetshapefillet_position[1:]: geompy.addToStudyInFather(pipetshapefillet_position[0], g, g.GetName()) - + +# create PipeTShape with fillet object with three thickness reductions +pipetshapefillet_thr = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, + 5.0, True, None, None, None, + 60, 20, 40, 20, + 40, 10, 60, 30, + 20, 10, 30, 30) + +# add object in the study +id_pipetshapefillet_thr = geompy.addToStudy(pipetshapefillet_thr[0],"PipeTShapeFillet_three_thickness_reductions") +# add groups in the study +for g in pipetshapefillet_thr[1:]: + geompy.addToStudyInFather(pipetshapefillet_thr[0], g, g.GetName()) + # display pipetshapes gg.createAndDisplayGO(id_pipetshape) gg.createAndDisplayGO(id_pipetshape_position) +gg.createAndDisplayGO(id_pipetshape_thr) gg.createAndDisplayGO(id_pipetshapechamfer) gg.createAndDisplayGO(id_pipetshapechamfer_position) +gg.createAndDisplayGO(id_pipetshapechamfer_thr) gg.createAndDisplayGO(id_pipetshapefillet) gg.createAndDisplayGO(id_pipetshapefillet_position) +gg.createAndDisplayGO(id_pipetshapefillet_thr) diff --git a/doc/salome/gui/GEOM/images/pipetshape_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_dlg.png index c59e012e570abfd99aa0e201ee74c9374d7d8a22..e41f3c804db2be7c0579d06dbef38e9b8440e4b7 100644 GIT binary patch literal 50971 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 TAGHrS0FitrCt51}-uM3lM!}8W literal 40204 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

9UJl1oEKjAi8%v&oi4 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 RuK;@J=IZ%3mdoEy{R@ZRp^E?j diff --git a/doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_pos_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..c297142b6d5dd9e59ad5a2c9d8def554f05367d2 GIT binary patch literal 29488 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 Q)kEZER9+NIzyA0?0PzvP=Kufz literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png b/doc/salome/gui/GEOM/images/pipetshape_thr_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..c52a8aede2d573066f33d705f1fb8103f78d2d97 GIT binary patch literal 66841 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

5;j6 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

&Ak7yIt)Cs7>o*DU48|0+Z%r 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/images/pipetshapethr.png b/doc/salome/gui/GEOM/images/pipetshapethr.png new file mode 100644 index 0000000000000000000000000000000000000000..119e7331ea7b7f944cb688aeb77541559b461d0d GIT binary patch literal 22965 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/creating_pipetshape.doc b/doc/salome/gui/GEOM/input/creating_pipetshape.doc index b7f448ed9..44124f52e 100644 --- a/doc/salome/gui/GEOM/input/creating_pipetshape.doc +++ b/doc/salome/gui/GEOM/input/creating_pipetshape.doc @@ -8,6 +8,16 @@ Specify the parameters of the PipeTShape object in the opened dialog box and press "Apply" or "Apply & Close" button. The result of the operation will be a GEOM_Object. +\n Main parameters: + +\image html pipetshape_dlg.png + +\n Position parameters: + +\image html pipetshape_pos_dlg.png + +\n Advanced options \ref preview_anchor "Preview" + TUI Command: geompy.MakePipeTShape(R1, W1, L1, R2, W2, L2, HexMesh=True, P1=None, P2=None, P3=None) Arguments: @@ -18,19 +28,17 @@ The result of the operation will be a GEOM_Object. - \b W2 - Thickness of the incident T-shape pipe. - \b L2 - Length of the incident T-shape pipe. - \b HexMesh - If True, the shape is splitted into blocks (suitable for hexaedral mesh). + +Position arguments: - \b P1 - First junction point of the main pipe (GEOM Vertex). - \b P2 - Second junction point of the main pipe (GEOM Vertex). - \b P3 - Junction point of the incident pipe (GEOM Vertex). -\n Advanced options \ref preview_anchor "Preview" - -\image html pipetshape_dlg.png - Example: \image html pipetshape.png -A Pipe T-Shape can be created with a chamfer at the junction of the main and the incident pipes: +

A Pipe T-Shape can be created with a chamfer at the junction of the main and the incident pipes:

TUI Command: geompy.MakePipeTShapeChamfer(R1, W1, L1, R2, W2, L2, H, W, HexMesh=True, P1=None, P2=None, P3=None) @@ -42,7 +50,7 @@ Example: \image html pipetshapechamfer.png -A Pipe T-Shape can be created with a fillet at the junction of the main and the incident pipes: +

A Pipe T-Shape can be created with a fillet at the junction of the main and the incident pipes:

TUI Command: geompy.MakePipeTShapeFillet(R1, W1, L1, R2, W2, L2, RF, HexMesh=True, P1=None, P2=None, P3=None) @@ -53,6 +61,35 @@ Example: \image html pipetshapefillet.png +

All three types of T-Shape (basic, with chamfer and with fillet) can +have thickness reductions at its open ends (two ends of the main pipe +and one end of the incident pipe):

+ +\image html pipetshape_thr_dlg.png + +TUI Commands: +\ngeompy.MakePipeTShape(R1, W1, L1, R2, W2, L2, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) +\ngeompy.MakePipeTShapeChamfer(R1, W1, L1, R2, W2, L2, H, W, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) +\ngeompy.MakePipeTShapeFillet(R1, W1, L1, R2, W2, L2, RF, HexMesh=True, P1=None, P2=None, P3=None, theRL=0, theWL=0, theLtransL=0, theLthinL=0, theRR=0, theWR=0, theLtransR=0, theLthinR=0, theRI=0, theWI=0, theLtransI=0, theLthinI=0) + +The additional arguments are: +- \b theRL - Internal radius of left thickness reduction. +- \b theWL - Width of left thickness reduction. +- \b theLtransL - Length of left transition part. +- \b theLthinL - Length of left thin part. +- \b theRR - Internal radius of right thickness reduction. +- \b theWR - Width of right thickness reduction. +- \b theLtransR - Length of right transition part. +- \b theLthinR - Length of right thin part. +- \b theRI - Internal radius of incident thickness reduction. +- \b theWI - Width of incident thickness reduction. +- \b theLtransI - Length of incident transition part. +- \b theLthinI - Length of incident thin part. + +Example: + +\image html pipetshapethr.png + Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_pipetshape "Advanced objects". diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index d16392a9f..1e3a7c076 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -3935,6 +3935,8 @@ module GEOM */ interface GEOM_IAdvancedOperations : GEOM_IOperations { + // T-Shape WITHOUT Thickness reduction + /*! * \brief Create a T-shape object with specified caracteristics for the main and * the incident pipes (radius, width, half-length). @@ -4062,6 +4064,256 @@ module GEOM in double theR2, in double theW2, in double theL2, in double theRF, in boolean theHexMesh, in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + + // T-Shape WITH Thickness reduction + + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTR (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRChamfer + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theH, in double theW, in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A chamfer is created on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRChamferWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theH, in double theW, in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A fillet is created on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRFillet + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theRF, in boolean theHexMesh); + /*! + * \brief Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * + * A fillet is created on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * + * \param theRL Internal radius of left thickness reduction + * \param theWL Width of left thickness reduction + * \param theLtransL Length of left transition part + * \param theLthinL Length of left thin part + * + * \param theRR Internal radius of right thickness reduction + * \param theWR Width of right thickness reduction + * \param theLtransR Length of right transition part + * \param theLthinR Length of right thin part + * + * \param theRI Internal radius of incident thickness reduction + * \param theWI Width of incident thickness reduction + * \param theLtransI Length of incident transition part + * \param theLthinI Length of incident thin part + * + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=true) + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Object, containing the created shape and propagation groups. + */ + ListOfGO MakePipeTShapeTRFilletWithPosition + (in double theR1, in double theW1, in double theL1, + in double theR2, in double theW2, in double theL2, + in double theRL, in double theWL, in double theLtransL, in double theLthinL, + in double theRR, in double theWR, in double theLtransR, in double theLthinR, + in double theRI, in double theWI, in double theLtransI, in double theLthinI, + in double theRF, in boolean theHexMesh, + in GEOM_Object theP1, in GEOM_Object theP2, in GEOM_Object theP3); + /*! * This function allows to create a disk already divided into blocks. It * can be use to create divided pipes for later meshing in hexaedra. diff --git a/resources/Makefile.am b/resources/Makefile.am index 57c92dd2d..efee8ce49 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -244,7 +244,7 @@ coordsys.png \ translation.png ADVANCED_RESOURCES = -ADVANCED_RESOURCES += pipetshape.png tree_pipetshape.png pipetshape_import_icon.png +ADVANCED_RESOURCES += pipetshape.png tree_pipetshape.png pipetshape_import_icon.png pipetshape_section.png ADVANCED_RESOURCES += dlg_pipetshape.png dlg_pipetshapechamfer.png dlg_pipetshapefillet.png ADVANCED_RESOURCES += dlg_pipetshapel1.png dlg_pipetshaper1.png dlg_pipetshapew1.png ADVANCED_RESOURCES += dlg_pipetshapel2.png dlg_pipetshaper2.png dlg_pipetshapew2.png diff --git a/resources/pipetshape_section.png b/resources/pipetshape_section.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e93c4a7c7f5f64dd4ea11b7df41342ccca1133 GIT binary patch literal 12959 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 tt%uQH0G6?p#-+%CJuo@+e|})a7W;+`x?uE5T>N #include #include +#include #include #include -#include // OCCT Includes +#include +#include #include #include #include #include -#include #include -#include + +#include #include //================================================================================= // Constructor //================================================================================= -AdvancedGUI_PipeTShapeDlg::AdvancedGUI_PipeTShapeDlg(GeometryGUI* theGeometryGUI, QWidget* parent) : - GEOMBase_Skeleton(theGeometryGUI, parent, false) { - QPixmap imageOp(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPETSHAPE"))); - QPixmap imageSel(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); - imageImp = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICO_PIPETSHAPE_IMPORT")); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - - setWindowTitle(tr("GEOM_PIPE_TSHAPE_TITLE")); - - /***************************************************************/ - mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE_TSHAPE")); - mainFrame()->RadioButton1->setIcon(imageOp); - mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton2->close(); - mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); - mainFrame()->RadioButton3->close(); - - QGridLayout* myMainLayout = new QGridLayout(centralWidget()); - myMainLayout->setMargin(0); - myMainLayout->setSpacing(6); - - tshapeScreenShotLabel = new QLabel(); - tshapeScreenShotLabel->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Expanding); - tshapeScreenShotLabel->setAlignment(Qt::AlignCenter); - tshapeScreenShotLabel->setMinimumSize(100, 100); - - MainTubeGroupParams = new DlgRef_3Spin(); - MainTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_MPIPE")); - MainTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - MainTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); - MainTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); - - IncidentTubeGroupParams = new DlgRef_3Spin(); - IncidentTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_IPIPE")); - IncidentTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - IncidentTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); - IncidentTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); - - ChamferGroupParams = new DlgRef_2Spin(); - ChamferGroupParams->GroupBox1->setCheckable(true); - ChamferGroupParams->GroupBox1->setChecked(false); - ChamferGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_CHAMFER")); - ChamferGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_H")); - ChamferGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_W")); - - FilletGroupParams = new DlgRef_1Spin(); - FilletGroupParams->GroupBox1->setCheckable(true); - FilletGroupParams->GroupBox1->setChecked(false); - FilletGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_FILLET")); - FilletGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); - - HexMeshCheckBox = new QCheckBox(); - HexMeshCheckBox->setText(tr("GEOM_PIPE_TSHAPE_HEX")); - HexMeshCheckBox->setChecked(true); - - JunctionPointsSel = new DlgRef_6Sel(); - JunctionPointsSel->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_POSITION")); - JunctionPointsSel->GroupBox1->setCheckable(true); - JunctionPointsSel->GroupBox1->setChecked(false); - JunctionPointsSel->PushButton1->setIcon(imageSel); - JunctionPointsSel->LineEdit1->setReadOnly(true); - JunctionPointsSel->LineEdit1->setText(""); - JunctionPointsSel->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P1")); - - JunctionPointsSel->PushButton2->setIcon(imageSel); - JunctionPointsSel->LineEdit2->setReadOnly(true); - JunctionPointsSel->LineEdit2->setText(""); - JunctionPointsSel->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P2")); - - JunctionPointsSel->PushButton3->setIcon(imageSel); - JunctionPointsSel->LineEdit3->setReadOnly(true); - JunctionPointsSel->LineEdit3->setText(""); - JunctionPointsSel->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P3")); - - JunctionPointsSel->PushButton4->setIcon(imageImp); - JunctionPointsSel->LineEdit4->setReadOnly(true); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L1")); - - JunctionPointsSel->PushButton5->setIcon(imageImp); - JunctionPointsSel->LineEdit5->setReadOnly(true); - JunctionPointsSel->LineEdit5->setText(""); - JunctionPointsSel->TextLabel5->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L2")); - - JunctionPointsSel->PushButton6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->PushButton6->close(); - JunctionPointsSel->LineEdit6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->LineEdit6->close(); - JunctionPointsSel->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); - JunctionPointsSel->TextLabel6->close(); - - // 1st row, height = 1, colspan = 3 - int rowPict = 0, colPict = 0, rowspanPict = 1, colspanPict = 3; - // 2nd row, height = 4, col 1 - int rowMain = rowspanPict, colMain = 0, rowspanMain = 2, colspanMain = 1; - int rowCham = rowspanPict + rowspanMain, colCham = 0, rowspanCham = 2, colspanCham = 1; - // 2nd row, height = 4, col 2 - int rowInc = rowspanPict, colInc = 1, rowspanInc = 2, colspanInc = 1; - int rowFill = rowspanPict + rowspanInc, colFill = 1, rowspanFill = 1, colspanFill = 1; - int rowHex = rowspanPict + rowspanInc + rowspanFill, colHex = 1, rowspanHex = 1, colspanHex = 1; - // 2nd row, height = 4, col 3 - int rowNewPosVal = rowspanPict, colNewPosVal = 2, rowspanNewPosVal = 4, colspanNewPosVal = 1; - - myMainLayout->addWidget(tshapeScreenShotLabel, rowPict, colPict, rowspanPict, colspanPict); - - myMainLayout->addWidget(MainTubeGroupParams, rowMain, colMain, rowspanMain, colspanMain); - myMainLayout->addWidget(FilletGroupParams, rowFill, colFill, rowspanFill, colspanFill); - myMainLayout->addWidget(HexMeshCheckBox, rowHex, colHex, rowspanHex, colspanHex); - - myMainLayout->addWidget(IncidentTubeGroupParams, rowInc, colInc, rowspanInc, colspanInc); - myMainLayout->addWidget(ChamferGroupParams, rowCham, colCham, rowspanCham, colspanCham); - - myMainLayout->addWidget(JunctionPointsSel, rowNewPosVal, colNewPosVal, rowspanNewPosVal, colspanNewPosVal); - /***************************************************************/ - - setHelpFileName("create_pipetshape_page.html"); - - Init(); +AdvancedGUI_PipeTShapeDlg::AdvancedGUI_PipeTShapeDlg (GeometryGUI* theGeometryGUI, QWidget* parent) + : GEOMBase_Skeleton(theGeometryGUI, parent, false) +{ + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QPixmap imageOp = aResMgr->loadPixmap("GEOM", tr("ICON_DLG_PIPETSHAPE")); + QPixmap imageSel = aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")); + QPixmap imageImp = aResMgr->loadPixmap("GEOM", tr("ICO_PIPETSHAPE_IMPORT")); + imagePipeTShape = aResMgr->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + imageReduction = aResMgr->loadPixmap("GEOM", tr("IMG_PIPETSHAPE_SECT")); + + setWindowTitle(tr("GEOM_PIPE_TSHAPE_TITLE")); + + /***************************************************************/ + mainFrame()->GroupConstructors->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->GroupConstructors->close(); + + QTabWidget* aTabWidget = new QTabWidget (centralWidget()); + + QGridLayout* myMainLayout = new QGridLayout (centralWidget()); + myMainLayout->setMargin(0); + myMainLayout->setSpacing(6); + + // Main parameters + QGroupBox* GroupMain = new QGroupBox(); + QGridLayout* layoutGroupMain = new QGridLayout (GroupMain); + + MainTubeGroupParams = new DlgRef_3Spin(); + MainTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_MPIPE")); + MainTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + MainTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); + MainTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); + MainTubeGroupParams->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); // ?? + + IncidentTubeGroupParams = new DlgRef_3Spin(); + IncidentTubeGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_IPIPE")); + IncidentTubeGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + IncidentTubeGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_W")); + IncidentTubeGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_L")); + + ChamferGroupParams = new DlgRef_2Spin(); + ChamferGroupParams->GroupBox1->setCheckable(true); + ChamferGroupParams->GroupBox1->setChecked(false); + ChamferGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_CHAMFER")); + ChamferGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_H")); + ChamferGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_CHAMFER_W")); + + FilletGroupParams = new DlgRef_1Spin(); + FilletGroupParams->GroupBox1->setCheckable(true); + FilletGroupParams->GroupBox1->setChecked(false); + FilletGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_FILLET")); + FilletGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_R")); + + HexMeshCheckBox = new QCheckBox(); + HexMeshCheckBox->setText(tr("GEOM_PIPE_TSHAPE_HEX")); + HexMeshCheckBox->setChecked(true); + + LabelImgPipeTShape = new QLabel(); + LabelImgPipeTShape->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + LabelImgPipeTShape->setAlignment(Qt::AlignCenter); + LabelImgPipeTShape->setMinimumSize(300, 300); + + layoutGroupMain->addWidget(MainTubeGroupParams, 0, 0, 1, 1); + layoutGroupMain->addWidget(IncidentTubeGroupParams, 1, 0, 1, 1); + layoutGroupMain->addWidget(ChamferGroupParams, 2, 0, 1, 1); + layoutGroupMain->addWidget(FilletGroupParams, 3, 0, 1, 1); + layoutGroupMain->addWidget(HexMeshCheckBox, 4, 0, 1, 1); + + layoutGroupMain->addWidget(LabelImgPipeTShape, 0, 1, 5, 1); + layoutGroupMain->setColumnStretch(1, 1); // stretch of column 0 is supposed 0 by default + + // Thickness reduction parameters + QGroupBox* GroupReduct = new QGroupBox(); + QGridLayout* layoutGroupReduct = new QGridLayout (GroupReduct); + + LReductionGroupParams = new AdvancedGUI_4Spin(); + LReductionGroupParams->GroupBox1->setCheckable(true); + LReductionGroupParams->GroupBox1->setChecked(false); + LReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_LEFT_TR")); + LReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("L")); + LReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("L")); + LReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("L")); + LReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("L")); + + RReductionGroupParams = new AdvancedGUI_4Spin(); + RReductionGroupParams->GroupBox1->setCheckable(true); + RReductionGroupParams->GroupBox1->setChecked(false); + RReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_RIGHT_TR")); + RReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("R")); + RReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("R")); + RReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("R")); + RReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("R")); + + IReductionGroupParams = new AdvancedGUI_4Spin(); + IReductionGroupParams->GroupBox1->setCheckable(true); + IReductionGroupParams->GroupBox1->setChecked(false); + IReductionGroupParams->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_INCI_TR")); + IReductionGroupParams->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_TR_R").arg("I")); + IReductionGroupParams->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_TR_W").arg("I")); + IReductionGroupParams->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_TR_L_TRANS").arg("I")); + IReductionGroupParams->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_TR_L_THIN").arg("I")); + + LabelImgReduction = new QLabel(); + LabelImgReduction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + LabelImgReduction->setAlignment(Qt::AlignCenter); + LabelImgReduction->setMinimumSize(300, 300); + + layoutGroupReduct->addWidget(LReductionGroupParams->GroupBox1, 0, 0, 1, 1); + layoutGroupReduct->addWidget(RReductionGroupParams->GroupBox1, 1, 0, 1, 1); + layoutGroupReduct->addWidget(IReductionGroupParams->GroupBox1, 2, 0, 1, 1); + + layoutGroupReduct->addWidget(LabelImgReduction, 0, 1, 3, 1); + layoutGroupReduct->setColumnStretch(1, 1); // stretch of column 0 is supposed 0 by default + + // Position parameters + QGroupBox* GroupPos = new QGroupBox(); + QVBoxLayout* layoutGroupPos = new QVBoxLayout (GroupPos); + + JunctionPointsSel = new DlgRef_6Sel(); + JunctionPointsSel->GroupBox1->setTitle(tr("GEOM_PIPE_TSHAPE_POSITION")); + JunctionPointsSel->GroupBox1->setCheckable(true); + JunctionPointsSel->GroupBox1->setChecked(false); + JunctionPointsSel->PushButton1->setIcon(imageSel); + JunctionPointsSel->LineEdit1->setReadOnly(true); + JunctionPointsSel->LineEdit1->setText(""); + JunctionPointsSel->TextLabel1->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P1")); + + JunctionPointsSel->PushButton2->setIcon(imageSel); + JunctionPointsSel->LineEdit2->setReadOnly(true); + JunctionPointsSel->LineEdit2->setText(""); + JunctionPointsSel->TextLabel2->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P2")); + + JunctionPointsSel->PushButton3->setIcon(imageSel); + JunctionPointsSel->LineEdit3->setReadOnly(true); + JunctionPointsSel->LineEdit3->setText(""); + JunctionPointsSel->TextLabel3->setText(tr("GEOM_PIPE_TSHAPE_POSITION_P3")); + + JunctionPointsSel->PushButton4->setIcon(imageImp); + JunctionPointsSel->LineEdit4->setReadOnly(true); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->TextLabel4->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L1")); + + JunctionPointsSel->PushButton5->setIcon(imageImp); + JunctionPointsSel->LineEdit5->setReadOnly(true); + JunctionPointsSel->LineEdit5->setText(""); + JunctionPointsSel->TextLabel5->setText(tr("GEOM_PIPE_TSHAPE_POSITION_LBL_L2")); + + JunctionPointsSel->PushButton6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->PushButton6->close(); + JunctionPointsSel->LineEdit6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->LineEdit6->close(); + JunctionPointsSel->TextLabel6->setAttribute(Qt::WA_DeleteOnClose); + JunctionPointsSel->TextLabel6->close(); + + layoutGroupPos->addWidget(JunctionPointsSel); + layoutGroupPos->addStretch(); + + aTabWidget->addTab(GroupMain, imageOp, tr("GEOM_PIPETSHAPE_GROUPMAIN")); + aTabWidget->addTab(GroupReduct, tr("GEOM_PIPETSHAPE_GROUPREDUCT")); + aTabWidget->addTab(GroupPos, tr("GEOM_PIPETSHAPE_GROUPPOS")); + + myMainLayout->addWidget(aTabWidget, 0, 0, 1, 1); + connect(aTabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); + /***************************************************************/ + + setHelpFileName("create_pipetshape_page.html"); + + Init(); } //================================================================================= // Destructor //================================================================================= AdvancedGUI_PipeTShapeDlg::~AdvancedGUI_PipeTShapeDlg() { - // no need to delete child widgets, Qt does it all for us + // no need to delete child widgets, Qt does it all for us } //================================================================================= // function : Init() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::Init() { - // Get setting of step value from file configuration - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); - - myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); - myOkPoint1 = myOkPoint2 = myOkPoint3 = false; - - pipeTShapeGroupObjects.clear(); - - // min, max, step and decimals for spin boxes - initSpinBox(MainTubeGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(MainTubeGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(MainTubeGroupParams->SpinBox_DZ, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(IncidentTubeGroupParams->SpinBox_DZ, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(ChamferGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(ChamferGroupParams->SpinBox_DY, Precision::Approximation(), COORD_MAX, step, "length_precision"); - initSpinBox(FilletGroupParams->SpinBox_DX, Precision::Approximation(), COORD_MAX, step, "length_precision"); - - // init variables - MainTubeGroupParams->SpinBox_DX->setValue(80); - MainTubeGroupParams->SpinBox_DY->setValue(20); - MainTubeGroupParams->SpinBox_DZ->setValue(200); - IncidentTubeGroupParams->SpinBox_DX->setValue(50); - IncidentTubeGroupParams->SpinBox_DY->setValue(20); - IncidentTubeGroupParams->SpinBox_DZ->setValue(200); - ChamferGroupParams->SpinBox_DX->setValue(20); - ChamferGroupParams->SpinBox_DY->setValue(10); - FilletGroupParams->SpinBox_DX->setValue(20); - - CssNormal = QString("QDoubleSpinBox {"); - CssNormal.append(MainTubeGroupParams->SpinBox_DZ->styleSheet()); - CssNormal.append("}"); - CssNormal.append("\nQPushButton {"); - CssNormal.append(JunctionPointsSel->PushButton4->styleSheet()); - CssNormal.append("}"); - CssAcceptable = "QDoubleSpinBox, QPushButton {background-color: rgb(85, 170, 127)}"; - CssRefused = "QDoubleSpinBox, QPushButton {background-color: rgb(255, 0, 0)}"; - - showOnlyPreviewControl(); - - // Signal/slot connections - connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); - // ValueChangedInSpinBox - connect(MainTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(MainTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(ChamferGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(ChamferGroupParams->SpinBox_DY, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - connect(FilletGroupParams->SpinBox_DX, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - // ChamferOrFillet - connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - // Preview -// connect(PreviewPushButton, SIGNAL(clicked()), this, SLOT(DisplayPreview())); - // Position - connect(JunctionPointsSel->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(SetPosition(bool))); - connect(JunctionPointsSel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(JunctionPointsSel->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(JunctionPointsSel->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - // ApplyNewDimensions - connect(JunctionPointsSel->PushButton4, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); - connect(JunctionPointsSel->PushButton5, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(UpdatePicture(QWidget*, QWidget*))); - //@@ put additional signal/slot connections here @@// - - initName(tr("GEOM_PIPE_TSHAPE")); - updateTshapeScreenshotLabel(); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::Init() +{ + // Get setting of step value from file configuration + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue("Geometry", "SettingsGeomStep", 100); + double minValue = Precision::Approximation(); + + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + myOkPoint1 = myOkPoint2 = myOkPoint3 = false; + + pipeTShapeGroupObjects.clear(); + + // min, max, step and decimals for spin boxes + initSpinBox(MainTubeGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(MainTubeGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(MainTubeGroupParams->SpinBox_DZ, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IncidentTubeGroupParams->SpinBox_DZ, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(ChamferGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(ChamferGroupParams->SpinBox_DY, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(FilletGroupParams->SpinBox_DX, minValue, COORD_MAX, step, "length_precision"); + + initSpinBox(LReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(LReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + initSpinBox(RReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(RReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + initSpinBox(IReductionGroupParams->SpinBox1, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox2, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox3, minValue, COORD_MAX, step, "length_precision"); + initSpinBox(IReductionGroupParams->SpinBox4, 0., COORD_MAX, step, "length_precision"); + + // init variables + MainTubeGroupParams->SpinBox_DX->setValue(80); + MainTubeGroupParams->SpinBox_DY->setValue(20); + MainTubeGroupParams->SpinBox_DZ->setValue(200); + IncidentTubeGroupParams->SpinBox_DX->setValue(50); + IncidentTubeGroupParams->SpinBox_DY->setValue(20); + IncidentTubeGroupParams->SpinBox_DZ->setValue(200); + ChamferGroupParams->SpinBox_DX->setValue(20); + ChamferGroupParams->SpinBox_DY->setValue(10); + FilletGroupParams->SpinBox_DX->setValue(20); + + LReductionGroupParams->SpinBox1->setValue(60); + LReductionGroupParams->SpinBox2->setValue(30); + LReductionGroupParams->SpinBox3->setValue(40); + LReductionGroupParams->SpinBox4->setValue(20); + + RReductionGroupParams->SpinBox1->setValue(60); + RReductionGroupParams->SpinBox2->setValue(30); + RReductionGroupParams->SpinBox3->setValue(40); + RReductionGroupParams->SpinBox4->setValue(20); + + IReductionGroupParams->SpinBox1->setValue(40); + IReductionGroupParams->SpinBox2->setValue(10); + IReductionGroupParams->SpinBox3->setValue(30); + IReductionGroupParams->SpinBox4->setValue(15); + + CssNormal = QString("QDoubleSpinBox {"); + CssNormal.append(MainTubeGroupParams->SpinBox_DZ->styleSheet()); + CssNormal.append("}"); + CssNormal.append("\nQPushButton {"); + CssNormal.append(JunctionPointsSel->PushButton4->styleSheet()); + CssNormal.append("}"); + CssAcceptable = "QDoubleSpinBox, QPushButton {background-color: rgb(85, 170, 127)}"; + CssRefused = "QDoubleSpinBox, QPushButton {background-color: rgb(255, 0, 0)}"; + + showOnlyPreviewControl(); + + // Signal/slot connections + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myGeomGUI, SIGNAL(SignalDefaultStepValueChanged(double)), this, SLOT(SetDoubleSpinBoxStep(double))); + //connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + // ValueChangedInSpinBox + connect(MainTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(MainTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(ChamferGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(ChamferGroupParams->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(FilletGroupParams->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + // ChamferOrFillet + connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + // Preview + //connect(PreviewPushButton, SIGNAL(clicked()), this, SLOT(DisplayPreview())); + // Position + connect(JunctionPointsSel->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(SetPosition(bool))); + connect(JunctionPointsSel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(JunctionPointsSel->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(JunctionPointsSel->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + // ApplyNewDimensions + connect(JunctionPointsSel->PushButton4, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); + connect(JunctionPointsSel->PushButton5, SIGNAL(clicked()), this, SLOT(ApplyNewDimensions())); + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(UpdatePicture(QWidget*, QWidget*))); + //@@ put additional signal/slot connections here @@// + + initName(tr("GEOM_PIPE_TSHAPE")); + + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + + updateLabelImgPipeTShape(); + LabelImgReduction->setPixmap(imageReduction.scaled(LabelImgReduction->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); + processPreview(); +} + +//================================================================================= +// function : currentChanged() +// purpose : Tab widget management +//================================================================================= +void AdvancedGUI_PipeTShapeDlg::currentChanged (int tabId) +{ + if (tabId == 0 || tabId == 1) + resizeEvent(NULL); } //================================================================================= // function : ApplyNewDimensions() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ApplyNewDimensions() { - QPushButton* send = (QPushButton*) sender(); - - bool ok = false; - double newVal; - if (send == JunctionPointsSel->PushButton4) { - if (!JunctionPointsSel->LineEdit4->text().isEmpty()) { - newVal = JunctionPointsSel->LineEdit4->text().toDouble(&ok); - if (ok) { - disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); - MainTubeGroupParams->SpinBox_DZ->setValue(newVal); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - MainTubeGroupParams->SpinBox_DZ->setToolTip(""); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } - } +void AdvancedGUI_PipeTShapeDlg::ApplyNewDimensions() +{ + QPushButton* send = (QPushButton*) sender(); + + bool ok = false; + double newVal; + if (send == JunctionPointsSel->PushButton4) { + if (!JunctionPointsSel->LineEdit4->text().isEmpty()) { + newVal = JunctionPointsSel->LineEdit4->text().toDouble(&ok); + if (ok) { + disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); + MainTubeGroupParams->SpinBox_DZ->setValue(newVal); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + MainTubeGroupParams->SpinBox_DZ->setToolTip(""); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } - else if (send == JunctionPointsSel->PushButton5) { - if (!JunctionPointsSel->LineEdit5->text().isEmpty()) { - newVal = JunctionPointsSel->LineEdit5->text().toDouble(&ok); - if (ok) { - disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); - IncidentTubeGroupParams->SpinBox_DZ->setValue(newVal); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } - } + } + else if (send == JunctionPointsSel->PushButton5) { + if (!JunctionPointsSel->LineEdit5->text().isEmpty()) { + newVal = JunctionPointsSel->LineEdit5->text().toDouble(&ok); + if (ok) { + disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); + IncidentTubeGroupParams->SpinBox_DZ->setValue(newVal); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet("background-color: rgb(255, 255, 255);"); + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } + } } //================================================================================= // function : UpdatePicture() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::UpdatePicture(QWidget* old, QWidget* now) { - - if (ChamferGroupParams->GroupBox1->isChecked()) - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L2")); - else if (now == ChamferGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_H")); - else if (now == ChamferGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); - else if (FilletGroupParams->GroupBox1->isChecked()) - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L2")); - else if (now == FilletGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_RF")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); - else - if (now == MainTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R1")); - else if (now == MainTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W1")); - else if (now == MainTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L1")); - else if (now == IncidentTubeGroupParams->SpinBox_DX) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R2")); - else if (now == IncidentTubeGroupParams->SpinBox_DY) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W2")); - else if (now == IncidentTubeGroupParams->SpinBox_DZ) - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L2")); - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - - updateTshapeScreenshotLabel(); +void AdvancedGUI_PipeTShapeDlg::UpdatePicture (QWidget* old, QWidget* now) +{ + if (ChamferGroupParams->GroupBox1->isChecked()) + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_L2")); + else if (now == ChamferGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_H")); + else if (now == ChamferGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER_W")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); + else if (FilletGroupParams->GroupBox1->isChecked()) + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_L2")); + else if (now == FilletGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET_RF")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); + else + if (now == MainTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R1")); + else if (now == MainTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W1")); + else if (now == MainTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L1")); + else if (now == IncidentTubeGroupParams->SpinBox_DX) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_R2")); + else if (now == IncidentTubeGroupParams->SpinBox_DY) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_W2")); + else if (now == IncidentTubeGroupParams->SpinBox_DZ) + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_L2")); + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + + updateLabelImgPipeTShape(); } //================================================================================= // function : SetPosition() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetPosition(bool isChecked) { - if (isChecked) { - erasePreview(); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); -// connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT( -// SelectionIntoArgument())); - JunctionPointsSel->PushButton1->click(); - SelectionIntoArgument(); - } else { - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); - processPreview(); - } +void AdvancedGUI_PipeTShapeDlg::SetPosition (bool isChecked) +{ + if (isChecked) { + erasePreview(); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + //connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT( + //SelectionIntoArgument())); + JunctionPointsSel->PushButton1->click(); + SelectionIntoArgument(); + } + else { + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + processPreview(); + } } //================================================================================= // function : ValueChangedInSpinBox() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ValueChangedInSpinBox(double newValue) +void AdvancedGUI_PipeTShapeDlg::ValueChangedInSpinBox (double newValue) { - if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); + if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); } //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection as changed or other case //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SelectionIntoArgument() { - - erasePreview(); -// myEditCurrentArgument->setText(""); - - LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); - SALOME_ListIO aSelList; - aSelMgr->selectedObjects(aSelList); - - if (aSelList.Extent() != 1) { - if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) - myOkPoint1 = false; - else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) - myOkPoint2 = false; - else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) - myOkPoint3 = false; - return; - myEditCurrentArgument->setText(""); - } - - // nbSel == 1 - if (aSelList.Extent() == 1) { - Handle(SALOME_InteractiveObject) anIO = aSelList.First(); - GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(anIO); - if (!CORBA::is_nil(aSelectedObject)) { - QString aName = GEOMBase::GetName(aSelectedObject); - TopoDS_Shape aShape; - if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull()) { - - TColStd_IndexedMapOfInteger aMap; - aSelMgr->GetIndexes(anIO, aMap); - if (aMap.Extent() == 1) { // Local Selection - int anIndex = aMap(1); - aName += QString(":vertex_%1").arg(anIndex); - - //Find SubShape Object in Father - GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName); - - if (aFindedObject->_is_nil()) { // Object not found in study - GEOM::GEOM_IShapesOperations_var aShapesOp = - getGeomEngine()->GetIShapesOperations(getStudyId()); - aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); - } else { - aSelectedObject = aFindedObject; // get Object from study - } - GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE); - } else { // Global Selection - if (aShape.ShapeType() != TopAbs_VERTEX) { - aSelectedObject = GEOM::GEOM_Object::_nil(); - aName = ""; - } - } - } - - if (aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX) { - return; - } - myEditCurrentArgument->setText(aName); - if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { - myPoint1 = aSelectedObject; - myOkPoint1 = true; - if (!myOkPoint2) - JunctionPointsSel->PushButton2->click(); - } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { - myPoint2 = aSelectedObject; - myOkPoint2 = true; - if (!myOkPoint3) - JunctionPointsSel->PushButton3->click(); - } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { - myPoint3 = aSelectedObject; - myOkPoint3 = true; - if (!myOkPoint1) - JunctionPointsSel->PushButton1->click(); - } - } - } - - if (myOkPoint1 && myOkPoint2 && myOkPoint3) { - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::SelectionIntoArgument() +{ + erasePreview(); + //myEditCurrentArgument->setText(""); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() != 1) { + if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) + myOkPoint1 = false; + else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) + myOkPoint2 = false; + else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) + myOkPoint3 = false; + return; + myEditCurrentArgument->setText(""); + } + + // nbSel == 1 + if (aSelList.Extent() == 1) { + Handle(SALOME_InteractiveObject) anIO = aSelList.First(); + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(anIO); + if (!CORBA::is_nil(aSelectedObject)) { + QString aName = GEOMBase::GetName(aSelectedObject); + TopoDS_Shape aShape; + if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull()) { + + TColStd_IndexedMapOfInteger aMap; + aSelMgr->GetIndexes(anIO, aMap); + if (aMap.Extent() == 1) { // Local Selection + int anIndex = aMap(1); + aName += QString(":vertex_%1").arg(anIndex); + + //Find SubShape Object in Father + GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName); + + if (aFindedObject->_is_nil()) { // Object not found in study + GEOM::GEOM_IShapesOperations_var aShapesOp = + getGeomEngine()->GetIShapesOperations(getStudyId()); + aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex); + } + else { + aSelectedObject = aFindedObject; // get Object from study + } + GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE); + } else { // Global Selection + if (aShape.ShapeType() != TopAbs_VERTEX) { + aSelectedObject = GEOM::GEOM_Object::_nil(); + aName = ""; + } + } + } + + if (aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX) { + return; + } + myEditCurrentArgument->setText(aName); + if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { + myPoint1 = aSelectedObject; + myOkPoint1 = true; + if (!myOkPoint2) + JunctionPointsSel->PushButton2->click(); + } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { + myPoint2 = aSelectedObject; + myOkPoint2 = true; + if (!myOkPoint3) + JunctionPointsSel->PushButton3->click(); + } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { + myPoint3 = aSelectedObject; + myOkPoint3 = true; + if (!myOkPoint1) + JunctionPointsSel->PushButton1->click(); + } } + } -// GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First()); -// if (aSelectedObject->_is_nil()) -// return; -// -// myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject)); -// -// // clear selection -// disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); -// myGeomGUI->getApp()->selectionMgr()->clearSelected(); -// connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); -// -// if (myEditCurrentArgument == JunctionPointsSel->LineEdit1) { -// myPoint1 = aSelectedObject; -// myOkPoint1 = true; -// if (!myOkPoint2) -// JunctionPointsSel->PushButton2->click(); -// // P2GroupParams->PushButton1->click(); -// } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit2) { -// // } else if (myEditCurrentArgument == P2GroupParams->LineEdit1) { -// myPoint2 = aSelectedObject; -// myOkPoint2 = true; -// if (!myOkPoint3) -// JunctionPointsSel->PushButton3->click(); -// // P3GroupParams->PushButton1->click(); -// } else if (myEditCurrentArgument == JunctionPointsSel->LineEdit3) { -// // } else if (myEditCurrentArgument == P3GroupParams->LineEdit1) { -// myPoint3 = aSelectedObject; -// myOkPoint3 = true; -// if (!myOkPoint1) -// JunctionPointsSel->PushButton1->click(); -// } + if (myOkPoint1 && myOkPoint2 && myOkPoint3) { + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } //================================================================================= // function : SetEditCurrentArgument() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetEditCurrentArgument() { - QPushButton* send = (QPushButton*) sender(); - - if (send == JunctionPointsSel->PushButton1) { - myEditCurrentArgument = JunctionPointsSel->LineEdit1; - JunctionPointsSel->PushButton2->setDown(false); - JunctionPointsSel->LineEdit2->setEnabled(false); - JunctionPointsSel->PushButton3->setDown(false); - JunctionPointsSel->LineEdit3->setEnabled(false); - } else if (send == JunctionPointsSel->PushButton2) { - myEditCurrentArgument = JunctionPointsSel->LineEdit2; - JunctionPointsSel->PushButton1->setDown(false); - JunctionPointsSel->LineEdit1->setEnabled(false); - JunctionPointsSel->PushButton3->setDown(false); - JunctionPointsSel->LineEdit3->setEnabled(false); - } else if (send == JunctionPointsSel->PushButton3) { - myEditCurrentArgument = JunctionPointsSel->LineEdit3; - JunctionPointsSel->PushButton1->setDown(false); - JunctionPointsSel->LineEdit1->setEnabled(false); - JunctionPointsSel->PushButton2->setDown(false); - JunctionPointsSel->LineEdit2->setEnabled(false); - } - - // enable line edit - myEditCurrentArgument->setEnabled(true); - myEditCurrentArgument->setFocus(); - myEditCurrentArgument->setText(""); - // after setFocus(), because it will be setDown(false) when loses focus - send->setDown(true); - - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); - - disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); -// globalSelection(GEOM_POINT); - globalSelection(); // close local contexts, if any - localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); - connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +void AdvancedGUI_PipeTShapeDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*) sender(); + + if (send == JunctionPointsSel->PushButton1) { + myEditCurrentArgument = JunctionPointsSel->LineEdit1; + JunctionPointsSel->PushButton2->setDown(false); + JunctionPointsSel->LineEdit2->setEnabled(false); + JunctionPointsSel->PushButton3->setDown(false); + JunctionPointsSel->LineEdit3->setEnabled(false); + } + else if (send == JunctionPointsSel->PushButton2) { + myEditCurrentArgument = JunctionPointsSel->LineEdit2; + JunctionPointsSel->PushButton1->setDown(false); + JunctionPointsSel->LineEdit1->setEnabled(false); + JunctionPointsSel->PushButton3->setDown(false); + JunctionPointsSel->LineEdit3->setEnabled(false); + } + else if (send == JunctionPointsSel->PushButton3) { + myEditCurrentArgument = JunctionPointsSel->LineEdit3; + JunctionPointsSel->PushButton1->setDown(false); + JunctionPointsSel->LineEdit1->setEnabled(false); + JunctionPointsSel->PushButton2->setDown(false); + JunctionPointsSel->LineEdit2->setEnabled(false); + } + + // enable line edit + myEditCurrentArgument->setEnabled(true); + myEditCurrentArgument->setFocus(); + myEditCurrentArgument->setText(""); + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(true); + + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); + + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + //globalSelection(GEOM_POINT); + globalSelection(); // close local contexts, if any + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); } //================================================================================= // function : SetDoubleSpinBoxStep() // purpose : Double spin box management //================================================================================= -void AdvancedGUI_PipeTShapeDlg::SetDoubleSpinBoxStep(double step) { - MainTubeGroupParams->SpinBox_DX->setSingleStep(step); - MainTubeGroupParams->SpinBox_DY->setSingleStep(step); - MainTubeGroupParams->SpinBox_DZ->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DX->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DY->setSingleStep(step); - IncidentTubeGroupParams->SpinBox_DZ->setSingleStep(step); - ChamferGroupParams->SpinBox_DX->setSingleStep(step); - ChamferGroupParams->SpinBox_DY->setSingleStep(step); - FilletGroupParams->SpinBox_DX->setSingleStep(step); +void AdvancedGUI_PipeTShapeDlg::SetDoubleSpinBoxStep (double step) +{ + MainTubeGroupParams->SpinBox_DX->setSingleStep(step); + MainTubeGroupParams->SpinBox_DY->setSingleStep(step); + MainTubeGroupParams->SpinBox_DZ->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DX->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DY->setSingleStep(step); + IncidentTubeGroupParams->SpinBox_DZ->setSingleStep(step); + ChamferGroupParams->SpinBox_DX->setSingleStep(step); + ChamferGroupParams->SpinBox_DY->setSingleStep(step); + FilletGroupParams->SpinBox_DX->setSingleStep(step); + + LReductionGroupParams->SpinBox1->setSingleStep(step); + LReductionGroupParams->SpinBox2->setSingleStep(step); + LReductionGroupParams->SpinBox3->setSingleStep(step); + LReductionGroupParams->SpinBox4->setSingleStep(step); + + RReductionGroupParams->SpinBox1->setSingleStep(step); + RReductionGroupParams->SpinBox2->setSingleStep(step); + RReductionGroupParams->SpinBox3->setSingleStep(step); + RReductionGroupParams->SpinBox4->setSingleStep(step); + + IReductionGroupParams->SpinBox1->setSingleStep(step); + IReductionGroupParams->SpinBox2->setSingleStep(step); + IReductionGroupParams->SpinBox3->setSingleStep(step); + IReductionGroupParams->SpinBox4->setSingleStep(step); } //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ClickOnOk() { +void AdvancedGUI_PipeTShapeDlg::ClickOnOk() +{ setIsApplyAndClose( true ); - if (ClickOnApply()) - ClickOnCancel(); + if (ClickOnApply()) + ClickOnCancel(); } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::ClickOnApply() { - if (!onAccept()) - return false; +bool AdvancedGUI_PipeTShapeDlg::ClickOnApply() +{ + if (!onAccept()) + return false; - initName(); + initName(); - return true; + return true; } //================================================================================= // function : ActivateThisDialog() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ActivateThisDialog() { - GEOMBase_Skeleton::ActivateThisDialog(); - // globalSelection( GEOM_POINT); - // connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL( - // currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); +void AdvancedGUI_PipeTShapeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + //globalSelection( GEOM_POINT); + //connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL( + // currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); } //================================================================================= // function : enterEvent [REDEFINED] // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::enterEvent(QEvent*) { - if (!mainFrame()->GroupConstructors->isEnabled()) - ActivateThisDialog(); +void AdvancedGUI_PipeTShapeDlg::enterEvent (QEvent*) +{ + if (!mainFrame()->GroupButtons->isEnabled()) + ActivateThisDialog(); } //================================================================================= // function : resizeEvent [REDEFINED] // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::resizeEvent(QResizeEvent */*event*/) { - QSize scaledSize = imagePipeTShape.size(); - scaledSize.scale(tshapeScreenShotLabel->size(), Qt::KeepAspectRatio); - if (!tshapeScreenShotLabel->pixmap() - || scaledSize != tshapeScreenShotLabel->pixmap()->size()) - updateTshapeScreenshotLabel(); +void AdvancedGUI_PipeTShapeDlg::resizeEvent (QResizeEvent */*event*/) +{ + QSize scaledSize1 = imagePipeTShape.size(); + scaledSize1.scale(LabelImgPipeTShape->size(), Qt::KeepAspectRatio); + if (!LabelImgPipeTShape->pixmap() || scaledSize1 != LabelImgPipeTShape->pixmap()->size()) + updateLabelImgPipeTShape(); + + QSize scaledSize2 = imageReduction.size(); + scaledSize2.scale(LabelImgReduction->size(), Qt::KeepAspectRatio); + if (!LabelImgReduction->pixmap() || scaledSize2 != LabelImgReduction->pixmap()->size()) + LabelImgReduction->setPixmap(imageReduction.scaled(LabelImgReduction->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); } //================================================================================= -// function : updateTshapeScreenshotLabel +// function : updateLabelImgPipeTShape // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::updateTshapeScreenshotLabel() { - tshapeScreenShotLabel->setPixmap(imagePipeTShape.scaled(tshapeScreenShotLabel->size(), - Qt::KeepAspectRatio, - Qt::SmoothTransformation)); +void AdvancedGUI_PipeTShapeDlg::updateLabelImgPipeTShape() +{ + LabelImgPipeTShape->setPixmap(imagePipeTShape.scaled(LabelImgPipeTShape->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation)); } //================================================================================= // function : ChamferOrFillet() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::ChamferOrFillet(bool) { - QGroupBox* send = (QGroupBox*) sender(); - - if (send == ChamferGroupParams->GroupBox1) { - if (send->isChecked()) { - disconnect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); - FilletGroupParams->GroupBox1->setChecked(false); - connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); - } - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - updateTshapeScreenshotLabel(); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } else if (send == FilletGroupParams->GroupBox1) { - if (send->isChecked()) { - disconnect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); - ChamferGroupParams->GroupBox1->setChecked(!send->isChecked()); - connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); - } - else - imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); - updateTshapeScreenshotLabel(); - if (myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - processPreview(); - } +void AdvancedGUI_PipeTShapeDlg::ChamferOrFillet (bool) +{ + QGroupBox* send = (QGroupBox*) sender(); + + if (send == ChamferGroupParams->GroupBox1) { + if (send->isChecked()) { + disconnect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); + FilletGroupParams->GroupBox1->setChecked(false); + connect(FilletGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_CHAMFER")); + } + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + + updateLabelImgPipeTShape(); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } + else if (send == FilletGroupParams->GroupBox1) { + if (send->isChecked()) { + disconnect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, 0); + ChamferGroupParams->GroupBox1->setChecked(!send->isChecked()); + connect(ChamferGroupParams->GroupBox1, SIGNAL(toggled(bool)), this, SLOT(ChamferOrFillet(bool))); + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE_FILLET")); + } + else + imagePipeTShape = SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("DLG_PIPETSHAPE")); + updateLabelImgPipeTShape(); + if (myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); + processPreview(); + } } //================================================================================= // function : DisplayPreview() // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::DisplayPreview(const bool activate, const bool update, const bool toRemoveFromEngine, - const double lineWidth, const int displayMode, const int color) { - isPreview = true; - QString msg; - if (!isValid(msg)) { - erasePreview(update); - isPreview = false; - return; - } - - erasePreview(false); - - try { - SUIT_OverrideCursor wc; - ObjectList objects; - bool hexMeshState = HexMeshCheckBox->isChecked(); - HexMeshCheckBox->setChecked(false); - if (!executeNoCheck(objects) || !getOperation()->IsDone()) { - wc.suspend(); - } else { - ObjectList::iterator it = objects.begin(); - GEOM::GEOM_Object_var obj = *it; - displayPreview(obj, true, activate, false, lineWidth, displayMode, color); - if (toRemoveFromEngine) - obj->UnRegister(); - } - HexMeshCheckBox->setChecked(hexMeshState); - } catch (const SALOME::SALOME_Exception& e) { - SalomeApp_Tools::QtCatchCorbaException(e); - } - - isPreview = false; - - if (update) - updateViewer(); +void AdvancedGUI_PipeTShapeDlg::DisplayPreview (const bool activate, const bool update, + const bool toRemoveFromEngine, const double lineWidth, + const int displayMode, const int color) +{ + QString msg; + if (!isValid(msg)) { + erasePreview(update); + return; + } + + erasePreview(false); + + try { + SUIT_OverrideCursor wc; + ObjectList objects; + bool hexMeshState = HexMeshCheckBox->isChecked(); + HexMeshCheckBox->setChecked(false); + if (!executeNoCheck(objects) || !getOperation()->IsDone()) { + wc.suspend(); + } + else { + ObjectList::iterator it = objects.begin(); + GEOM::GEOM_Object_var obj = *it; + displayPreview(obj, true, activate, false, lineWidth, displayMode, color); + if (toRemoveFromEngine) + obj->UnRegister(); + } + HexMeshCheckBox->setChecked(hexMeshState); + } catch (const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + } + + if (update) + updateViewer(); } + //================================================================================= // function : createOperation // purpose : //================================================================================= -GEOM::GEOM_IOperations_ptr AdvancedGUI_PipeTShapeDlg::createOperation() { - return getGeomEngine()->GetIAdvancedOperations(getStudyId()); +GEOM::GEOM_IOperations_ptr AdvancedGUI_PipeTShapeDlg::createOperation() +{ + return getGeomEngine()->GetIAdvancedOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::isValid(QString& msg) { - bool ok = true; - - ok = MainTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = MainTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = MainTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = IncidentTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; - ok = ChamferGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - ok = ChamferGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; - ok = FilletGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; - - ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(MainTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(MainTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(IncidentTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; - ok = fabs(ChamferGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - ok = fabs(ChamferGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; - ok = fabs(FilletGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; - - if (JunctionPointsSel->GroupBox1->isChecked()) - ok = myOkPoint1 && myOkPoint2 && myOkPoint3 && ok; - - return ok; +bool AdvancedGUI_PipeTShapeDlg::isValid (QString& msg) +{ + bool ok = true; + + ok = MainTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = MainTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = MainTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = IncidentTubeGroupParams->SpinBox_DZ->isValid(msg, !IsPreview()) && ok; + ok = ChamferGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + ok = ChamferGroupParams->SpinBox_DY->isValid(msg, !IsPreview()) && ok; + ok = FilletGroupParams->SpinBox_DX->isValid(msg, !IsPreview()) && ok; + + if (LReductionGroupParams->GroupBox1->isChecked()) { + ok = LReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = LReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + ok = RReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = RReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + ok = IReductionGroupParams->SpinBox1->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox2->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox3->isValid(msg, !IsPreview()) && ok; + ok = IReductionGroupParams->SpinBox4->isValid(msg, !IsPreview()) && ok; + } + + ok = fabs(MainTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(MainTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(MainTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(IncidentTubeGroupParams->SpinBox_DZ->value()) > Precision::Confusion() && ok; + ok = fabs(ChamferGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + ok = fabs(ChamferGroupParams->SpinBox_DY->value()) > Precision::Confusion() && ok; + ok = fabs(FilletGroupParams->SpinBox_DX->value()) > Precision::Confusion() && ok; + + if (JunctionPointsSel->GroupBox1->isChecked()) + ok = myOkPoint1 && myOkPoint2 && myOkPoint3 && ok; + + return ok; } //================================================================================= // function : CheckCompatiblePosition() // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::CheckCompatiblePosition(GEOM::GEOM_Object_var theP1, - GEOM::GEOM_Object_var theP2, GEOM::GEOM_Object_var theP3, double theTolerance) { +bool AdvancedGUI_PipeTShapeDlg::CheckCompatiblePosition + (GEOM::GEOM_Object_var theP1, GEOM::GEOM_Object_var theP2, GEOM::GEOM_Object_var theP3, + double theTolerance) +{ + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + JunctionPointsSel->LineEdit4->setText(""); + JunctionPointsSel->LineEdit5->setText(""); - JunctionPointsSel->LineEdit4->setText(""); - JunctionPointsSel->LineEdit5->setText(""); + MainTubeGroupParams->SpinBox_DZ->setToolTip(""); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); + + TopoDS_Shape aShape; + gp_Pnt P1, P2, P3; + if ( GEOMBase::GetShape( theP1, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; + + if ( GEOMBase::GetShape( theP2, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; - MainTubeGroupParams->SpinBox_DZ->setToolTip(""); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip(""); - - TopoDS_Shape aShape; - gp_Pnt P1, P2, P3; - if ( GEOMBase::GetShape( theP1, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - if ( GEOMBase::GetShape( theP2, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - if ( GEOMBase::GetShape( theP3, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) - P3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - else - return false; - - double d12 = P1.Distance(P2); - double d13 = P1.Distance(P3); - double d23 = P2.Distance(P3); - - if (Abs(d12) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P1 and P2 are identical"); - return false; + if ( GEOMBase::GetShape( theP3, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + P3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + else + return false; + + double d12 = P1.Distance(P2); + double d13 = P1.Distance(P3); + double d23 = P2.Distance(P3); + + if (Abs(d12) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P1 and P2 are identical"); + return false; + } + if (Abs(d13) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P1 and P3 are identical"); + return false; + } + if (Abs(d23) <= Precision::Confusion()) { + //SetErrorCode("Junctions points P2 and P3 are identical"); + return false; + } + + long double newL1 = 0.5 * d12; + long double newL2 = sqrt(pow(d13,2)-pow(newL1,2)); + + JunctionPointsSel->LineEdit4->setText(QString::number(newL1,'f',7)); + JunctionPointsSel->LineEdit5->setText(QString::number(newL2,'f',7)); + + if (fabs(newL1 - theL1) > Precision::Approximation()) { + if ((newL1 * (1 - theTolerance) - theL1 <= Precision::Approximation()) && + (newL1 * (1 + theTolerance) - theL1 >= Precision::Approximation())) { + disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); + MainTubeGroupParams->SpinBox_DZ->setValue(newL1); + connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged(double)), + this, SLOT(ValueChangedInSpinBox(double))); + MainTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); + JunctionPointsSel->PushButton4->setStyleSheet(CssAcceptable); } - if (Abs(d13) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P1 and P3 are identical"); - return false; + else { + MainTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); + JunctionPointsSel->PushButton4->setStyleSheet(CssRefused); } - if (Abs(d23) <= Precision::Confusion()) { -// SetErrorCode("Junctions points P2 and P3 are identical"); - return false; + } + else { + MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); + } + + if (fabs(newL2 - theL2) > Precision::Approximation()) { + if ((newL2 * (1 - theTolerance) - theL2 <= Precision::Approximation()) && + (newL2 * (1 + theTolerance) - theL2 >= Precision::Approximation())) { + disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); + IncidentTubeGroupParams->SpinBox_DZ->setValue(newL2); + connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); + JunctionPointsSel->PushButton5->setStyleSheet(CssAcceptable); } - - long double newL1 = 0.5 * d12; - long double newL2 = sqrt(pow(d13,2)-pow(newL1,2)); - - JunctionPointsSel->LineEdit4->setText(QString::number(newL1,'f',7)); - JunctionPointsSel->LineEdit5->setText(QString::number(newL2,'f',7)); - - if (fabs(newL1 - theL1) > Precision::Approximation()) { - if ((newL1 * (1 - theTolerance) - theL1 <= Precision::Approximation()) && - (newL1 * (1 + theTolerance) - theL1 >= Precision::Approximation())) { - disconnect(MainTubeGroupParams->SpinBox_DZ, 0, this, 0); - MainTubeGroupParams->SpinBox_DZ->setValue(newL1); - connect(MainTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - MainTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); - JunctionPointsSel->PushButton4->setStyleSheet(CssAcceptable); - } - else { - MainTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); - JunctionPointsSel->PushButton4->setStyleSheet(CssRefused); - } - } else { - MainTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton4->setStyleSheet(CssNormal); - } - - if (fabs(newL2 - theL2) > Precision::Approximation()) { - if ((newL2 * (1 - theTolerance) - theL2 <= Precision::Approximation()) && - (newL2 * (1 + theTolerance) - theL2 >= Precision::Approximation())) { - disconnect(IncidentTubeGroupParams->SpinBox_DZ, 0, this, 0); - IncidentTubeGroupParams->SpinBox_DZ->setValue(newL2); - connect(IncidentTubeGroupParams->SpinBox_DZ, SIGNAL(valueChanged( double )), this, SLOT(ValueChangedInSpinBox(double))); - IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value was recomputed to fit with position"); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssAcceptable); - JunctionPointsSel->PushButton5->setStyleSheet(CssAcceptable); - } - else { - IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); - JunctionPointsSel->PushButton5->setStyleSheet(CssRefused); - } - } - else { - IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); - JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + IncidentTubeGroupParams->SpinBox_DZ->setToolTip("Value is incompatible with position"); + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssRefused); + JunctionPointsSel->PushButton5->setStyleSheet(CssRefused); } + } + else { + IncidentTubeGroupParams->SpinBox_DZ->setStyleSheet(CssNormal); + JunctionPointsSel->PushButton5->setStyleSheet(CssNormal); + } - return true; + return true; } -bool AdvancedGUI_PipeTShapeDlg::execute(ObjectList& objects) { - - if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) - CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool AdvancedGUI_PipeTShapeDlg::execute (ObjectList& objects) +{ + if (JunctionPointsSel->GroupBox1->isChecked() && myOkPoint1 && myOkPoint2 && myOkPoint3) + CheckCompatiblePosition(myPoint1, myPoint2, myPoint3, 0.01); - return executeNoCheck(objects); + return executeNoCheck(objects); } //================================================================================= -// function : execute +// function : executeNoCheck // purpose : //================================================================================= -bool AdvancedGUI_PipeTShapeDlg::executeNoCheck(ObjectList& objects) { - bool res = false; - - // GEOM::GEOM_Object_var anObj; - GEOM::ListOfGO_var anObj; - - GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation()); - - //@@ retrieve input values from the widgets here @@// - CORBA::Double theR1 = MainTubeGroupParams->SpinBox_DX->value(); - CORBA::Double theW1 = MainTubeGroupParams->SpinBox_DY->value(); - CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theR2 = IncidentTubeGroupParams->SpinBox_DX->value(); - CORBA::Double theW2 = IncidentTubeGroupParams->SpinBox_DY->value(); - CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); - CORBA::Double theH = ChamferGroupParams->SpinBox_DX->value(); - CORBA::Double theW = ChamferGroupParams->SpinBox_DY->value(); - CORBA::Double theRF = FilletGroupParams->SpinBox_DX->value(); - CORBA::Boolean theHexMesh = HexMeshCheckBox->isChecked(); - -// if (JunctionPointsSel->GroupBox1->isChecked()) { -// CheckCompatiblePosition(theL1, theL2, myPoint1, myPoint2, myPoint3, 0.01); -// theL1 = MainTubeGroupParams->SpinBox_DZ->value(); -// theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); -// } - - // call engine function - if (ChamferGroupParams->GroupBox1->isChecked()) { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, - theHexMesh, myPoint1, myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh); - } - else if (FilletGroupParams->GroupBox1->isChecked()) { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theRF, - theHexMesh, myPoint1, myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh); - } - else { - if (JunctionPointsSel->GroupBox1->isChecked()) - anObj = anOper->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh, myPoint1, - myPoint2, myPoint3); - else - anObj = anOper->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh); - } - - res = anObj->length(); - if (!res) - return false; - - // res = !anObj->_is_nil(); - if (res && !IsPreview()) { - QStringList aParameters; - //@@ put stringified input parameters to the string list here to store in the data model for notebook @@// - aParameters << MainTubeGroupParams->SpinBox_DX->text(); // R1 parameter - aParameters << MainTubeGroupParams->SpinBox_DY->text(); // W1 parameter - aParameters << MainTubeGroupParams->SpinBox_DZ->text(); // L1 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DX->text(); // R2 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DY->text(); // W2 parameter - aParameters << IncidentTubeGroupParams->SpinBox_DZ->text(); // L2 parameter - if (ChamferGroupParams->GroupBox1->isChecked()) {// Chamfer parameter - aParameters << ChamferGroupParams->SpinBox_DX->text(); // H parameter - aParameters << ChamferGroupParams->SpinBox_DY->text(); // W parameter - } - if (FilletGroupParams->GroupBox1->isChecked()) // Fillet parameter - aParameters << FilletGroupParams->SpinBox_DX->text(); // RF parameter - - if (aParameters.count() > 0) - anObj[0]->SetParameters(aParameters.join(":").toLatin1().constData()); - } - - objects.push_back(anObj[0]._retn()); - pipeTShapeGroupObjects.clear(); - for (int i = 1, n = anObj->length(); i < n; i++) { - pipeTShapeGroupObjects.push_back(anObj[i]._retn()); - } - - return objects.size() > 0; +bool AdvancedGUI_PipeTShapeDlg::executeNoCheck (ObjectList& objects) +{ + bool res = false; + + // GEOM::GEOM_Object_var anObj; + GEOM::ListOfGO_var anObj; + + GEOM::GEOM_IAdvancedOperations_var anOper = GEOM::GEOM_IAdvancedOperations::_narrow(getOperation()); + + //@@ retrieve input values from the widgets here @@// + CORBA::Double theR1 = MainTubeGroupParams->SpinBox_DX->value(); + CORBA::Double theW1 = MainTubeGroupParams->SpinBox_DY->value(); + CORBA::Double theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theR2 = IncidentTubeGroupParams->SpinBox_DX->value(); + CORBA::Double theW2 = IncidentTubeGroupParams->SpinBox_DY->value(); + CORBA::Double theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + CORBA::Double theH = ChamferGroupParams->SpinBox_DX->value(); + CORBA::Double theW = ChamferGroupParams->SpinBox_DY->value(); + CORBA::Double theRF = FilletGroupParams->SpinBox_DX->value(); + CORBA::Boolean theHexMesh = HexMeshCheckBox->isChecked(); + + // Thickness reductions + CORBA::Double theRL = 0., theWL = 0., theLtransL = 0., theLthinL = 0.; + CORBA::Double theRR = 0., theWR = 0., theLtransR = 0., theLthinR = 0.; + CORBA::Double theRI = 0., theWI = 0., theLtransI = 0., theLthinI = 0.; + + if (LReductionGroupParams->GroupBox1->isChecked()) { + theRL = LReductionGroupParams->SpinBox1->value(); + theWL = LReductionGroupParams->SpinBox2->value(); + theLtransL = LReductionGroupParams->SpinBox3->value(); + theLthinL = LReductionGroupParams->SpinBox4->value(); + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + theRR = RReductionGroupParams->SpinBox1->value(); + theWR = RReductionGroupParams->SpinBox2->value(); + theLtransR = RReductionGroupParams->SpinBox3->value(); + theLthinR = RReductionGroupParams->SpinBox4->value(); + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + theRI = IReductionGroupParams->SpinBox1->value(); + theWI = IReductionGroupParams->SpinBox2->value(); + theLtransI = IReductionGroupParams->SpinBox3->value(); + theLthinI = IReductionGroupParams->SpinBox4->value(); + } + + //if (JunctionPointsSel->GroupBox1->isChecked()) { + // CheckCompatiblePosition(theL1, theL2, myPoint1, myPoint2, myPoint3, 0.01); + // theL1 = MainTubeGroupParams->SpinBox_DZ->value(); + // theL2 = IncidentTubeGroupParams->SpinBox_DZ->value(); + //} + + // call engine function + if (ChamferGroupParams->GroupBox1->isChecked()) { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTRChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh); + } + else if (FilletGroupParams->GroupBox1->isChecked()) { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTRFillet(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh); + } + else { + if (JunctionPointsSel->GroupBox1->isChecked()) + anObj = anOper->MakePipeTShapeTRWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh, myPoint1, myPoint2, myPoint3); + else + anObj = anOper->MakePipeTShapeTR(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh); + } + + res = anObj->length(); + if (!res) + return false; + + //res = !anObj->_is_nil(); + if (res && !IsPreview()) { + QStringList aParameters; + //@@ put stringified input parameters to the string list here to store in the data model for notebook @@// + aParameters << MainTubeGroupParams->SpinBox_DX->text(); // R1 parameter + aParameters << MainTubeGroupParams->SpinBox_DY->text(); // W1 parameter + aParameters << MainTubeGroupParams->SpinBox_DZ->text(); // L1 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DX->text(); // R2 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DY->text(); // W2 parameter + aParameters << IncidentTubeGroupParams->SpinBox_DZ->text(); // L2 parameter + + if (ChamferGroupParams->GroupBox1->isChecked()) { // Chamfer parameter + aParameters << ChamferGroupParams->SpinBox_DX->text(); // H parameter + aParameters << ChamferGroupParams->SpinBox_DY->text(); // W parameter + } + if (FilletGroupParams->GroupBox1->isChecked()) // Fillet parameter + aParameters << FilletGroupParams->SpinBox_DX->text(); // RF parameter + + // Thickness reductions + if (LReductionGroupParams->GroupBox1->isChecked()) { + aParameters << LReductionGroupParams->SpinBox1->text(); + aParameters << LReductionGroupParams->SpinBox2->text(); + aParameters << LReductionGroupParams->SpinBox3->text(); + aParameters << LReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + if (RReductionGroupParams->GroupBox1->isChecked()) { + aParameters << RReductionGroupParams->SpinBox1->text(); + aParameters << RReductionGroupParams->SpinBox2->text(); + aParameters << RReductionGroupParams->SpinBox3->text(); + aParameters << RReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + if (IReductionGroupParams->GroupBox1->isChecked()) { + aParameters << IReductionGroupParams->SpinBox1->text(); + aParameters << IReductionGroupParams->SpinBox2->text(); + aParameters << IReductionGroupParams->SpinBox3->text(); + aParameters << IReductionGroupParams->SpinBox4->text(); + } + else { + aParameters << "0" << "0" << "0" << "0"; + } + + if (aParameters.count() > 0) + anObj[0]->SetParameters(aParameters.join(":").toLatin1().constData()); + } + + objects.push_back(anObj[0]._retn()); + pipeTShapeGroupObjects.clear(); + for (int i = 1, n = anObj->length(); i < n; i++) { + pipeTShapeGroupObjects.push_back(anObj[i]._retn()); + } + + return objects.size() > 0; } //================================================================================= // function : restoreSubShapes // purpose : //================================================================================= -void AdvancedGUI_PipeTShapeDlg::restoreSubShapes(SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject) { - SALOMEDS::GenericAttribute_var anAttr; - if (!theSObject->FindAttribute(anAttr, "AttributeIOR")) - return; - - SALOMEDS::AttributeIOR_var anAttrIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var anIORso = anAttrIOR->Value(); +void AdvancedGUI_PipeTShapeDlg::restoreSubShapes (SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) +{ + SALOMEDS::GenericAttribute_var anAttr; + if (!theSObject->FindAttribute(anAttr, "AttributeIOR")) + return; - // get Object from SObject - GEOM::GEOM_Object_var theFather = GEOM::GEOM_Object::_narrow(myGeomGUI->getApp()->orb()->string_to_object(anIORso)); - if (CORBA::is_nil(theFather)) - return; + SALOMEDS::AttributeIOR_var anAttrIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + CORBA::String_var anIORso = anAttrIOR->Value(); - ObjectList::iterator it = pipeTShapeGroupObjects.begin(); + // get Object from SObject + GEOM::GEOM_Object_var theFather = + GEOM::GEOM_Object::_narrow(myGeomGUI->getApp()->orb()->string_to_object(anIORso)); + if (CORBA::is_nil(theFather)) + return; - for (int i = 0; it != pipeTShapeGroupObjects.end(); it++, i++) { - getGeomEngine()->AddInStudy(theStudy, (*it), tr((*it)->GetName()).toStdString().c_str(), theFather); - } + ObjectList::iterator it = pipeTShapeGroupObjects.begin(); + for (int i = 0; it != pipeTShapeGroupObjects.end(); it++, i++) { + getGeomEngine()->AddInStudy(theStudy, (*it), tr((*it)->GetName()).toStdString().c_str(), theFather); + } } //================================================================================= // function : processPreview() // purpose : Display preview if CheckBoxPreview is checked //================================================================================= -void AdvancedGUI_PipeTShapeDlg::processPreview() { - if(mainFrame()->CheckBoxPreview->isChecked()) +void AdvancedGUI_PipeTShapeDlg::processPreview() +{ + if (mainFrame()->CheckBoxPreview->isChecked()) DisplayPreview(); else erasePreview(true); } + +//================================================================================= +// function : AdvancedGUI_4Spin +// purpose : +//================================================================================= +AdvancedGUI_4Spin::AdvancedGUI_4Spin() +{ + GroupBox1 = new QGroupBox (); + + gridLayout1 = new QGridLayout (GroupBox1); + gridLayout1->setSpacing(6); + gridLayout1->setContentsMargins(11, 11, 11, 11); + gridLayout1->setHorizontalSpacing(6); + gridLayout1->setVerticalSpacing(6); + gridLayout1->setContentsMargins(9, 9, 9, 9); + + TextLabel1 = new QLabel (GroupBox1); + TextLabel2 = new QLabel (GroupBox1); + TextLabel3 = new QLabel (GroupBox1); + TextLabel4 = new QLabel (GroupBox1); + + SpinBox1 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox2 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox3 = new SalomeApp_DoubleSpinBox (GroupBox1); + SpinBox4 = new SalomeApp_DoubleSpinBox (GroupBox1); + + SpinBox1->setMinimumWidth(60); + SpinBox2->setMinimumWidth(60); + SpinBox3->setMinimumWidth(60); + SpinBox4->setMinimumWidth(60); + + gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1); + gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1); + gridLayout1->addWidget(TextLabel3, 2, 0, 1, 1); + gridLayout1->addWidget(TextLabel4, 3, 0, 1, 1); + + gridLayout1->addWidget(SpinBox1, 0, 1, 1, 1); + gridLayout1->addWidget(SpinBox2, 1, 1, 1, 1); + gridLayout1->addWidget(SpinBox3, 2, 1, 1, 1); + gridLayout1->addWidget(SpinBox4, 3, 1, 1, 1); +} + +//================================================================================= +// function : ~AdvancedGUI_4Spin() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +AdvancedGUI_4Spin::~AdvancedGUI_4Spin() +{ + // no need to delete child widgets, Qt does it all for us +} diff --git a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h index 04147ea96..670c2f9d0 100644 --- a/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h +++ b/src/AdvancedGUI/AdvancedGUI_PipeTShapeDlg.h @@ -15,7 +15,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef ADVANCEDGUI_PIPETSHAPEDLG_H #define ADVANCEDGUI_PIPETSHAPEDLG_H @@ -25,72 +24,114 @@ class DlgRef_1Spin; class DlgRef_2Spin; class DlgRef_3Spin; +class DlgRef_4Spin; class DlgRef_3Sel; class DlgRef_6Sel; class QCheckBox; class QLineEdit; class QLabel; +class QGridLayout; +class QGroupBox; +class SalomeApp_DoubleSpinBox; + +//================================================================================= +// class : AdvancedGUI_4Spin +// purpose : +//================================================================================= +class AdvancedGUI_4Spin : public QWidget +{ + Q_OBJECT + + public: + AdvancedGUI_4Spin (); + ~AdvancedGUI_4Spin(); + + public: + QGroupBox *GroupBox1; + QGridLayout *gridLayout1; + + QLabel *TextLabel1; + QLabel *TextLabel2; + QLabel *TextLabel3; + QLabel *TextLabel4; + SalomeApp_DoubleSpinBox *SpinBox1; + SalomeApp_DoubleSpinBox *SpinBox2; + SalomeApp_DoubleSpinBox *SpinBox3; + SalomeApp_DoubleSpinBox *SpinBox4; +}; //================================================================================= // class : AdvancedGUI_PipeTShapeDlg // purpose : //================================================================================= -class AdvancedGUI_PipeTShapeDlg: public GEOMBase_Skeleton { -Q_OBJECT +class AdvancedGUI_PipeTShapeDlg: public GEOMBase_Skeleton +{ + Q_OBJECT public: - AdvancedGUI_PipeTShapeDlg(GeometryGUI*, QWidget* = 0); - ~AdvancedGUI_PipeTShapeDlg(); + AdvancedGUI_PipeTShapeDlg (GeometryGUI*, QWidget* = 0); + ~AdvancedGUI_PipeTShapeDlg(); protected: - // redefined from GEOMBase_Helper - virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid(QString&); - virtual bool execute(ObjectList&); - virtual void restoreSubShapes(SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid (QString&); + virtual bool execute (ObjectList&); + virtual void restoreSubShapes (SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr); private: - void Init(); - void enterEvent(QEvent*); - void resizeEvent(QResizeEvent *event); - void updateTshapeScreenshotLabel(); - bool CheckCompatiblePosition(GEOM::GEOM_Object_var theP1, - GEOM::GEOM_Object_var theP2, - GEOM::GEOM_Object_var theP3, double theTolerance); + void Init(); + void enterEvent (QEvent*); + void resizeEvent (QResizeEvent *event); + void updateLabelImgPipeTShape(); + bool CheckCompatiblePosition (GEOM::GEOM_Object_var theP1, + GEOM::GEOM_Object_var theP2, + GEOM::GEOM_Object_var theP3, double theTolerance); private: - QPixmap imagePipeTShape; - QLabel* tshapeScreenShotLabel; - DlgRef_3Spin* MainTubeGroupParams; - DlgRef_3Spin* IncidentTubeGroupParams; - DlgRef_2Spin* ChamferGroupParams; - DlgRef_1Spin* FilletGroupParams; - DlgRef_6Sel* JunctionPointsSel; - QPixmap imageImp; - QString CssNormal, CssAcceptable, CssRefused; - QCheckBox* HexMeshCheckBox; - GEOM::GEOM_Object_var myPoint1, myPoint2, myPoint3; - bool myOkPoint1, myOkPoint2, myOkPoint3; - bool isPreview; - ObjectList pipeTShapeGroupObjects; + QPixmap imagePipeTShape; + QPixmap imageReduction; + QLabel* LabelImgPipeTShape; + QLabel* LabelImgReduction; + + // Main parameters + DlgRef_3Spin* MainTubeGroupParams; + DlgRef_3Spin* IncidentTubeGroupParams; + DlgRef_2Spin* ChamferGroupParams; + DlgRef_1Spin* FilletGroupParams; + QCheckBox* HexMeshCheckBox; + + // Thickness reduction parameters + AdvancedGUI_4Spin* LReductionGroupParams; + AdvancedGUI_4Spin* RReductionGroupParams; + AdvancedGUI_4Spin* IReductionGroupParams; + + // Position parameters + DlgRef_6Sel* JunctionPointsSel; + + QString CssNormal, CssAcceptable, CssRefused; + GEOM::GEOM_Object_var myPoint1, myPoint2, myPoint3; + bool myOkPoint1, myOkPoint2, myOkPoint3; + ObjectList pipeTShapeGroupObjects; private slots: - void ClickOnOk(); - bool ClickOnApply(); - void ActivateThisDialog(); - void SelectionIntoArgument(); - void SetEditCurrentArgument(); - void DisplayPreview(const bool activate = false, const bool update = true, - const bool toRemoveFromEngine = true, const double lineWidth = -1, - const int displayMode = -1, const int color = -1); - virtual void processPreview(); - void SetPosition(bool); - void ChamferOrFillet(bool); - void SetDoubleSpinBoxStep(double); - void ValueChangedInSpinBox( double ); - void UpdatePicture(QWidget* old, QWidget* now); - void ApplyNewDimensions(); - bool executeNoCheck( ObjectList& objects ); + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void currentChanged (int); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void DisplayPreview (const bool activate = false, const bool update = true, + const bool toRemoveFromEngine = true, const double lineWidth = -1, + const int displayMode = -1, const int color = -1); + virtual void processPreview(); + void SetPosition (bool); + void ChamferOrFillet (bool); + void SetDoubleSpinBoxStep (double); + void ValueChangedInSpinBox (double); + void UpdatePicture (QWidget* old, QWidget* now); + void ApplyNewDimensions(); + bool executeNoCheck (ObjectList& objects); }; #endif // ADVANCEDGUI_PIPETSHAPEDLG_H diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index e375fc5d5..f0bfad5a7 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -1207,6 +1207,10 @@ DLG_PIPETSHAPE dlg_pipetshape.png + + IMG_PIPETSHAPE_SECT + pipetshape_section.png + DLG_PIPETSHAPE_L1 dlg_pipetshapel1.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 87d23adbe..28275e13c 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -5801,6 +5801,46 @@ Do you want to create new material? GEOM_PIPE_TSHAPE_POSITION_LBL_L2 New L2 + + GEOM_PIPE_TSHAPE_LEFT_TR + Left thickness reduction + + + GEOM_PIPE_TSHAPE_RIGHT_TR + Right thickness reduction + + + GEOM_PIPE_TSHAPE_INCI_TR + Incident thickness reduction + + + GEOM_PIPE_TSHAPE_TR_R + Radius (r%1) + + + GEOM_PIPE_TSHAPE_TR_W + Width (w%1) + + + GEOM_PIPE_TSHAPE_TR_L_TRANS + Transition length (ltrans%1) + + + GEOM_PIPE_TSHAPE_TR_L_THIN + Thin part length (lthin%1) + + + GEOM_PIPETSHAPE_GROUPMAIN + Main parameters + + + GEOM_PIPETSHAPE_GROUPREDUCT + Thickness reduction + + + GEOM_PIPETSHAPE_GROUPPOS + Position + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index d07b791f5..70fb7487d 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -5784,6 +5784,46 @@ Voulez-vous en créer un nouveau ? GEOM_PIPE_TSHAPE_POSITION_LBL_L2 Nouvelle L2 + + GEOM_PIPE_TSHAPE_LEFT_TR + Left thickness reduction + + + GEOM_PIPE_TSHAPE_RIGHT_TR + Right thickness reduction + + + GEOM_PIPE_TSHAPE_INCI_TR + Incident thickness reduction + + + GEOM_PIPE_TSHAPE_TR_R + Radius (r%1) + + + GEOM_PIPE_TSHAPE_TR_W + Width (w%1) + + + GEOM_PIPE_TSHAPE_TR_L_TRANS + Transition length (ltrans%1) + + + GEOM_PIPE_TSHAPE_TR_L_THIN + Thin part length (lthin%1) + + + GEOM_PIPETSHAPE_GROUPMAIN + Main parameters + + + GEOM_PIPETSHAPE_GROUPREDUCT + Thickness reduction + + + GEOM_PIPETSHAPE_GROUPPOS + Position + GEOMToolsGUI_PublishDlg diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx index 1582f9126..78d277f2a 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -18,13 +18,13 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #include #include #include #include #include +#include #include @@ -72,30 +72,6 @@ GEOMImpl_BooleanDriver::GEOMImpl_BooleanDriver() { } -void AddSimpleShapes(TopoDS_Shape theShape, TopTools_ListOfShape& theList) -{ - if (theShape.ShapeType() != TopAbs_COMPOUND && - theShape.ShapeType() != TopAbs_COMPSOLID) { - theList.Append(theShape); - return; - } - - TopTools_MapOfShape mapShape; - TopoDS_Iterator It (theShape, Standard_True, Standard_True); - - for (; It.More(); It.Next()) { - TopoDS_Shape aShape_i = It.Value(); - if (mapShape.Add(aShape_i)) { - if (aShape_i.ShapeType() == TopAbs_COMPOUND || - aShape_i.ShapeType() == TopAbs_COMPSOLID) { - AddSimpleShapes(aShape_i, theList); - } else { - theList.Append(aShape_i); - } - } - } -} - //======================================================================= //function : Execute //purpose : @@ -131,8 +107,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isCompound = (listShape1.Extent() > 1 || listShape2.Extent() > 1); @@ -174,7 +150,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const if (isCompound) { /* TopTools_ListOfShape listShapeC; - AddSimpleShapes(C, listShapeC); + GEOMUtils::AddSimpleShapes(C, listShapeC); TopTools_ListIteratorOfListOfShape itSubC (listShapeC); bool isOnlySolids = true; for (; itSubC.More(); itSubC.Next()) { @@ -203,8 +179,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShapes, listTools; - AddSimpleShapes(aShape1, listShapes); - AddSimpleShapes(aShape2, listTools); + GEOMUtils::AddSimpleShapes(aShape1, listShapes); + GEOMUtils::AddSimpleShapes(aShape2, listTools); Standard_Boolean isCompound = (listShapes.Extent() > 1); @@ -245,7 +221,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const if (isCompound) { /* TopTools_ListOfShape listShapeC; - AddSimpleShapes(C, listShapeC); + GEOMUtils::AddSimpleShapes(C, listShapeC); TopTools_ListIteratorOfListOfShape itSubC (listShapeC); bool isOnlySolids = true; for (; itSubC.More(); itSubC.Next()) { @@ -272,8 +248,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const /* Fix for NPAL15379: refused // Check arguments TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isIntersect = Standard_False; @@ -360,8 +336,8 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const B.MakeCompound(C); TopTools_ListOfShape listShape1, listShape2; - AddSimpleShapes(aShape1, listShape1); - AddSimpleShapes(aShape2, listShape2); + GEOMUtils::AddSimpleShapes(aShape1, listShape1); + GEOMUtils::AddSimpleShapes(aShape2, listShape2); Standard_Boolean isCompound = (listShape1.Extent() > 1 || listShape2.Extent() > 1); @@ -433,7 +409,7 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute (TFunction_Logbook& log) const // as boolean operations always produce compound, lets simplify it // for the case, if it contains only one sub-shape TopTools_ListOfShape listShapeRes; - AddSimpleShapes(aShape, listShapeRes); + GEOMUtils::AddSimpleShapes(aShape, listShapeRes); if (listShapeRes.Extent() == 1) { aShape = listShapeRes.First(); if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx index 9b982e735..58e8f837e 100644 --- a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.cxx @@ -19,20 +19,7 @@ // File : GEOMImpl_IAdvancedOperations.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -#include - -#include "GEOMImpl_Types.hxx" #include "GEOMImpl_IAdvancedOperations.hxx" -#include "GEOMImpl_IBasicOperations.hxx" -#include "GEOMImpl_IBooleanOperations.hxx" -#include "GEOMImpl_IShapesOperations.hxx" -#include "GEOMImpl_ITransformOperations.hxx" -#include "GEOMImpl_IBlocksOperations.hxx" -#include "GEOMImpl_I3DPrimOperations.hxx" -#include "GEOMImpl_ILocalOperations.hxx" -#include "GEOMImpl_IHealingOperations.hxx" - -#include "GEOMImpl_Gen.hxx" #include @@ -42,37 +29,65 @@ #include "GEOM_Function.hxx" #include "GEOM_PythonDump.hxx" +#include "GEOMUtils.hxx" +#include "GEOMAlgo_Splitter.hxx" +#include "GEOMImpl_Gen.hxx" +#include "GEOMImpl_Types.hxx" + +#include "GEOMImpl_IBasicOperations.hxx" +#include "GEOMImpl_IBooleanOperations.hxx" +#include "GEOMImpl_IShapesOperations.hxx" +#include "GEOMImpl_ITransformOperations.hxx" +#include "GEOMImpl_IBlocksOperations.hxx" +#include "GEOMImpl_I3DPrimOperations.hxx" +#include "GEOMImpl_ILocalOperations.hxx" +#include "GEOMImpl_IHealingOperations.hxx" + +#include "GEOMImpl_GlueDriver.hxx" #include "GEOMImpl_PipeTShapeDriver.hxx" #include "GEOMImpl_IPipeTShape.hxx" -#include -#include -// #include -// #include +#include "GEOMImpl_DividedDiskDriver.hxx" +#include "GEOMImpl_IDividedDisk.hxx" +// #include "GEOMImpl_DividedCylinderDriver.hxx" +// #include "GEOMImpl_IDividedCylinder.hxx" /*@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@*/ +#include +#include +#include +#include +#include + #include #include #include #include #include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include +#include +#include + +#include +#include +#include +#include #include -#include -#include -#include -#include -#include +#include #include +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC #define HALF_LENGTH_MAIN_PIPE "Main pipe half length" //"Tuyau principal - demi longueur" @@ -85,6 +100,8 @@ #define JUNCTION_FACE_2 "Junction 2" //"Face de jonction 2" #define JUNCTION_FACE_3 "Junction 3" //"Face de jonction 3" +#define FIND_GROUPS_BY_POINTS 1 + //============================================================================= /*! * Constructor @@ -242,6 +259,7 @@ bool GEOMImpl_IAdvancedOperations::CheckCompatiblePosition(double& theL1, double bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int shapeType, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theH, double theW, double theRF, Handle(TColStd_HSequenceOfTransient) theSeq, gp_Trsf aTrsf) { @@ -411,6 +429,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int // == BEGIN } // == END + ///////////////////////// //// Groups of Edges //// ///////////////////////// @@ -424,10 +443,153 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int SetErrorCode("Propagation groups not found"); return false; } - Standard_Integer nbEdges, aNbGroups = aSeqPropagate->Length(); + Standard_Integer aNbGroups = aSeqPropagate->Length(); // Recover previous description to get rid of Propagate dump aFunction->SetDescription(theDesc); +#ifdef FIND_GROUPS_BY_POINTS + // BEGIN: new groups search + + // W2 R2 + // .----.-----.----. + // e| | | | | + // | | | | | + // . | | | . + // g / ''..| | |..'' \ + // f / ''''''' \ + // .---.--'.. | | | ..'--.---. + // |a \ '''...........''' / | + // |-------\------' | '------/-------. + // | \ | / | + // c| \ | / | + // | R1 \ | / | + // | \ | / | + // ._________________|_________________. + // | L1 | | + // | | | + // | | | + // b| | | + // | | | + // |-----------------|-----------------| + // | W1 | | + // '-----------------'-----------------' + // d + + // "Thickness" group (a) + gp_Pnt aPntA (-theL1, 0, theR1 + theW1/2.); + aPntA.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexA (aPntA); + TopoDS_Vertex aVertA = TopoDS::Vertex(mkVertexA.Shape()); + TopoDS_Shape anEdgeA = GEOMUtils::GetEdgeNearPoint(aShape, aVertA); + + // "Circular quarter of pipe" group (b) + gp_Pnt aPntB (-theL1, -aR1Ext * sin(M_PI/4.), -aR1Ext * sin(M_PI/4.)); + aPntB.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexB (aPntB); + TopoDS_Vertex aVertB = TopoDS::Vertex(mkVertexB.Shape()); + TopoDS_Shape anEdgeB = GEOMUtils::GetEdgeNearPoint(aShape, aVertB); + + // "Circular quarter of pipe" group (c) + gp_Pnt aPntC (-theL1, -aR1Ext * sin(M_PI/4.), aR1Ext * sin(M_PI/4.)); + aPntC.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexC (aPntC); + TopoDS_Vertex aVertC = TopoDS::Vertex(mkVertexC.Shape()); + TopoDS_Shape anEdgeC = GEOMUtils::GetEdgeNearPoint(aShape, aVertC); + + // "Main pipe half length" group (d) + gp_Pnt aPntD (-theL1/2., 0, -aR1Ext); + aPntD.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexD (aPntD); + TopoDS_Vertex aVertD = TopoDS::Vertex(mkVertexD.Shape()); + TopoDS_Shape anEdgeD = GEOMUtils::GetEdgeNearPoint(aShape, aVertD); + + // "Incident pipe half length" group (e) + double aTol10 = Precision::Confusion() * 10.; + gp_Pnt aPntE (-aR2Ext, 0, theL2 - aTol10); + aPntE.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexE (aPntE); + TopoDS_Vertex aVertE = TopoDS::Vertex(mkVertexE.Shape()); + TopoDS_Shape anEdgeE = GEOMUtils::GetEdgeNearPoint(aShape, aVertE); + + // "Flange" group (f) + double aFx = - aR2Ext - aTol10; + if (shapeType == TSHAPE_CHAMFER) + aFx -= theW; + else if (shapeType == TSHAPE_FILLET) + aFx -= theRF; + gp_Pnt aPntF (aFx, 0, aR1Ext); + aPntF.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexF (aPntF); + TopoDS_Vertex aVertF = TopoDS::Vertex(mkVertexF.Shape()); + TopoDS_Shape anEdgeF = GEOMUtils::GetEdgeNearPoint(aShape, aVertF); + + // "Chamfer or Fillet" group (g) + TopoDS_Shape anEdgeG; + if (shapeType == TSHAPE_CHAMFER) { + gp_Pnt aPntG (-aR2Ext - theW/2., 0, aR1Ext + theH/2.); + aPntG.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexG (aPntG); + TopoDS_Vertex aVertG = TopoDS::Vertex(mkVertexG.Shape()); + anEdgeG = GEOMUtils::GetEdgeNearPoint(aShape, aVertG); + } + else if (shapeType == TSHAPE_FILLET) { + gp_Pnt aPntG (-aR2Ext - theRF/2., 0, aR1Ext + theRF/2.); + aPntG.Transform(aTrsf); + BRepBuilderAPI_MakeVertex mkVertexG (aPntG); + TopoDS_Vertex aVertG = TopoDS::Vertex(mkVertexG.Shape()); + anEdgeG = GEOMUtils::GetEdgeNearPoint(aShape, aVertG); + } + + for (int i = 1 ; i <= aNbGroups; i++) { + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(aSeqPropagate->Value(i)); + if (aGroup.IsNull()) + continue; + + TopoDS_Shape aGroupShape = aGroup->GetValue(); + TopTools_IndexedMapOfShape anEdgesMap; + TopExp::MapShapes(aGroupShape, TopAbs_EDGE, anEdgesMap); + + if (anEdgesMap.Contains(anEdgeA)) { // a + aGroup->SetName("THICKNESS"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeB)) { // b + aGroup->SetName("CIRCULAR_QUARTER_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeC)) { // c + aGroup->SetName("CIRCULAR_QUARTER_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeD)) { // d + aGroup->SetName("HALF_LENGTH_MAIN_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeE)) { // e + aGroup->SetName("HALF_LENGTH_INCIDENT_PIPE"); + theSeq->Append(aGroup); + } + else if (anEdgesMap.Contains(anEdgeF)) { // f + aGroup->SetName("FLANGE"); + theSeq->Append(aGroup); + } + else if (shapeType == TSHAPE_CHAMFER) { // g + if (anEdgesMap.Contains(anEdgeG)) { + aGroup->SetName("CHAMFER"); + theSeq->Append(aGroup); + } + } + else if (shapeType == TSHAPE_FILLET) { // g + if (anEdgesMap.Contains(anEdgeG)) { + aGroup->SetName("FILLET"); + theSeq->Append(aGroup); + } + } + else { + } + } + // END: new groups search +#else bool addGroup; bool circularFoundAndAdded = false; bool circularFound10 = false; @@ -439,23 +601,23 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int bool flangeFoundAndAdded = false; bool chamferOrFilletFound = false; - for (int i=1 ; i<= aNbGroups; i++) { + for (int i = 1 ; i <= aNbGroups; i++) { addGroup = false; Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(aSeqPropagate->Value(i)); - if(aGroup.IsNull()) + if (aGroup.IsNull()) continue; TopoDS_Shape aGroupShape = aGroup->GetValue(); - BRepBuilderAPI_Transform aTransformationShapeInv(aGroupShape, aTrsfInv, Standard_False); + BRepBuilderAPI_Transform aTransformationShapeInv (aGroupShape, aTrsfInv, Standard_False); TopoDS_Shape aGroupShapeTrsfInv = aTransformationShapeInv.Shape(); TopTools_IndexedMapOfShape anEdgesMap; TopExp::MapShapes(aGroupShapeTrsfInv,TopAbs_EDGE, anEdgesMap); - nbEdges = anEdgesMap.Extent(); + Standard_Integer nbEdges = anEdgesMap.Extent(); if (shapeType == TSHAPE_BASIC) { - if ((nbEdges == 21) || /*R1Ext = R2Ext*/(nbEdges == 17)){ + if ((nbEdges >= 21) || /*R1Ext = R2Ext*/(nbEdges == 17)) { // 17, 17+8*{1,2,3}, 21, 21+8*{1,2,3} addGroup = true; aGroup->SetName("THICKNESS"); } @@ -469,7 +631,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int else if (nbEdges == 8) { incidentPipeFound = true; mainPipeFound = false; - radialFound =false; + radialFound = false; flangeFound = false; TopExp_Explorer Ex(aGroupShapeTrsfInv,TopAbs_VERTEX); @@ -522,7 +684,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int continue; } else if (shapeType == TSHAPE_CHAMFER || shapeType == TSHAPE_FILLET) { - if (nbEdges == 25) { + if (nbEdges >= 25) { // 25, 25+8, 25+16, 25+24 addGroup = true; aGroup->SetName("THICKNESS"); } @@ -622,6 +784,7 @@ bool GEOMImpl_IAdvancedOperations::MakeGroups(Handle(GEOM_Object) theShape, int if (addGroup) theSeq->Append(aGroup); } +#endif SetErrorCode(OK); return true; @@ -1078,7 +1241,8 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapePartition(Handle(GEOM_Object) t TopoDS_Shape aShape = Te3->GetValue(); theShape->GetLastFunction()->SetValue(aShape); - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return false; @@ -1193,6 +1357,224 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapeMirrorAndGlue(Handle(GEOM_Objec return true; } +//======================================================================= +//function : MakePipeTShapeThicknessReduction +//purpose : Static method. Add thiskness reduction elements at the three +// open ends of the T-Shape. +//======================================================================= +TopoDS_Shape GEOMImpl_IAdvancedOperations::MakePipeTShapeThicknessReduction + (TopoDS_Shape theShape, + double r1, double w1, double l1, + double r2, double w2, double l2, + double rL, double wL, double ltransL, double lthinL, + double rR, double wR, double ltransR, double lthinR, + double rI, double wI, double ltransI, double lthinI, + bool fuseReductions) +{ + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + // + // ---------------------. + // W \ + // ---------------------. \ + // ^ \ '-----------------. + // |R \ Wthin | + // | '-----------------' + // v Rthin + // --.--.--.--.--.--.--.--.--.--.--.--.--.--.-- + // Ltrans Lthin + + TopoDS_Shape aResult = theShape; + double aTol = Precision::Confusion(); + + gp_Vec aVX = gp::DX(), aVZ = gp::DZ(); + + // Left reduction (rL, wL, ltransL, lthinL) + if (rL > aTol && wL > aTol && ltransL > aTol) { + gp_Pnt aPLeft (-l1, 0, 0); + gp_Ax2 anAxesLeft (aPLeft, -aVX, aVZ); + TopoDS_Shape aReductionLeft = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesLeft, r1, w1, rL, wL, ltransL, lthinL, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseL (aResult, aReductionLeft); + if (!fuseL.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with left reduction"); + aResult = fuseL.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionLeft); + aResult = C; + } + } + + // Right reduction + if (rR > aTol && wR > aTol && ltransR > aTol) { + gp_Pnt aPRight (l1, 0, 0); + gp_Ax2 anAxesRight (aPRight, aVX, aVZ); + TopoDS_Shape aReductionRight = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesRight, r1, w1, rR, wR, ltransR, lthinR, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseR (aResult, aReductionRight); + if (!fuseR.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with right reduction"); + aResult = fuseR.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionRight); + aResult = C; + } + } + + // Incident reduction + if (rI > aTol && wI > aTol && ltransI > aTol) { + gp_Pnt aPInci (0, 0, l2); + gp_Ax2 anAxesInci (aPInci, aVZ, aVX); + TopoDS_Shape aReductionInci = GEOMImpl_IAdvancedOperations::MakeThicknessReduction + (anAxesInci, r2, w2, rI, wI, ltransI, lthinI, fuseReductions); + + if (fuseReductions) { + BRepAlgoAPI_Fuse fuseInci (aResult, aReductionInci); + if (!fuseInci.IsDone()) + StdFail_NotDone::Raise("Cannot fuse Te with incident reduction"); + aResult = fuseInci.Shape(); + } + else { + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + B.Add(C, aResult); + B.Add(C, aReductionInci); + aResult = C; + } + } + + // Get rid of extra compounds + TopTools_ListOfShape listShapeRes; + GEOMUtils::AddSimpleShapes(aResult, listShapeRes); + aResult = listShapeRes.First(); // useful for the case "fuseReductions == true" + + if (!fuseReductions && listShapeRes.Extent() > 1) { + // Simplify T-Shape compound (get rid of sub-compounds) and glue duplicated faces + BRep_Builder B; + TopoDS_Compound C; + B.MakeCompound(C); + + TopTools_ListIteratorOfListOfShape itSub (listShapeRes); + for (; itSub.More(); itSub.Next()) + B.Add(C, itSub.Value()); + + // GlueFaces + aResult = GEOMImpl_GlueDriver::GlueFaces(C, Precision::Confusion(), Standard_True); + } + + return aResult; +} + +//======================================================================= +//function : MakeThicknessReduction +//purpose : Static method. Create one thickness reduction element. +//======================================================================= +TopoDS_Shape GEOMImpl_IAdvancedOperations::MakeThicknessReduction (gp_Ax2 theAxes, + const double R, const double W, + const double Rthin, const double Wthin, + const double Ltrans, const double Lthin, + bool fuse) +{ + double aTol = Precision::Confusion(); + if (Rthin < aTol || Wthin < aTol || Ltrans < aTol) { + StdFail_NotDone::Raise("Cannot build thickness reduction: too small values"); + } + bool isThinPart = (Lthin > aTol); + + // . + // W |\ + // . \ + // ^ \ '-----------------. + // |R \| | Wthin + // | '-----------------' + // v Rthin + // --.--.--.--.--.--.--.--.--.--.--.--.--> theAxes.Direction() + // Ltrans Lthin + + double RExt = R + W; + double RthinExt = Rthin + Wthin; + + gp_Dir aNormal = theAxes.Direction(); + gp_Dir anXDir = theAxes.XDirection(); + gp_Pnt aPntCyl (theAxes.Location().XYZ() + aNormal.XYZ()*Ltrans); + gp_Ax2 anAxesCyl (aPntCyl, aNormal, anXDir); + + // Build the transition part + BRepPrimAPI_MakeCone ConeExt (theAxes, RExt, RthinExt, Ltrans); + BRepPrimAPI_MakeCone ConeInt (theAxes, R, Rthin, Ltrans); + ConeExt.Build(); + ConeInt.Build(); + if (!ConeExt.IsDone() || !ConeInt.IsDone()) + StdFail_NotDone::Raise("Cannot build cones of thickness reduction"); + BRepAlgoAPI_Cut cut1 (ConeExt.Shape(), ConeInt.Shape()); + if (!cut1.IsDone()) + StdFail_NotDone::Raise("Coudn't build transition part of thickness reduction"); + TopoDS_Shape aReduction = cut1.Shape(); + + // Build the thin part, if required + TopoDS_Shape aThinPart; + if (isThinPart) { + BRepPrimAPI_MakeCylinder CExt (anAxesCyl, RthinExt, Lthin); + BRepPrimAPI_MakeCylinder CInt (anAxesCyl, Rthin, Lthin); + CExt.Build(); + CInt.Build(); + if (!CExt.IsDone() || !CInt.IsDone()) + StdFail_NotDone::Raise("Cannot build cylinders of thickness reduction"); + BRepAlgoAPI_Cut cut2 (CExt.Shape(), CInt.Shape()); + if (!cut2.IsDone()) + StdFail_NotDone::Raise("Coudn't build thin part of thickness reduction"); + aThinPart = cut2.Shape(); + } + + // Join parts + if (fuse) { + if (isThinPart) { + BRepAlgoAPI_Fuse fuse1 (aReduction, aThinPart); + if (!fuse1.IsDone()) + StdFail_NotDone::Raise("Cannot fuse parts of thickness reduction"); + aReduction = fuse1.Shape(); + } + } + else { + // Partition the reduction on blocks + gp_Ax3 anAxesPln1 (aPntCyl, theAxes.XDirection(), aNormal); + gp_Ax3 anAxesPln2 (aPntCyl, theAxes.YDirection(), aNormal); + gp_Pln aPln1 (anAxesPln1); + gp_Pln aPln2 (anAxesPln2); + double aSize = Ltrans + Lthin + R + Rthin + Wthin; // to guarantee enough size in all directions + TopoDS_Shape aTool1 = BRepBuilderAPI_MakeFace(aPln1, -aSize, +aSize, -aSize, +aSize).Shape(); + TopoDS_Shape aTool2 = BRepBuilderAPI_MakeFace(aPln2, -aSize, +aSize, -aSize, +aSize).Shape(); + + GEOMAlgo_Splitter PS; + PS.AddShape(aReduction); + if (isThinPart) + PS.AddShape(aThinPart); + PS.AddTool(aTool1); + PS.AddTool(aTool2); + PS.SetLimit(TopAbs_SOLID); + PS.Perform(); + + aReduction = PS.Shape(); + } + + return aReduction; +} + //============================================================================= /*! * MakePipeTShape @@ -1212,6 +1594,9 @@ bool GEOMImpl_IAdvancedOperations::MakePipeTShapeMirrorAndGlue(Handle(GEOM_Objec Handle(TColStd_HSequenceOfTransient) GEOMImpl_IAdvancedOperations::MakePipeTShape(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh) { MESSAGE("GEOMImpl_IAdvancedOperations::MakePipeTShape"); @@ -1226,7 +1611,7 @@ Handle(TColStd_HSequenceOfTransient) //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_PipeTShapeDriver::GetID()) return NULL; - GEOMImpl_IPipeTShape aData(aFunction); + GEOMImpl_IPipeTShape aData (aFunction); aData.SetR1(theR1); aData.SetW1(theW1); @@ -1236,6 +1621,10 @@ Handle(TColStd_HSequenceOfTransient) aData.SetL2(theL2); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1245,28 +1634,40 @@ Handle(TColStd_HSequenceOfTransient) SetErrorCode("TShape driver failed"); return NULL; } + if (theHexMesh) { if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; } - } catch (Standard_Failure) { + + if (isTRL || isTRR || isTRI) { + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } - Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -1274,38 +1675,43 @@ Handle(TColStd_HSequenceOfTransient) SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() << "] = geompy.MakePipeTShape(" - << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " - << theHexMesh << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShape(" << theR1 << ", " << theW1 << ", " - << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShape(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1333,12 +1739,16 @@ Handle(TColStd_HSequenceOfTransient) */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -1368,6 +1778,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th aData.SetL2(theL2); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1377,19 +1791,32 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + + if (theHexMesh) { + if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) + return NULL; + if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) + return NULL; + } + + if (isTRL || isTRR || isTRI) { + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; } - if (theHexMesh) { - if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) - return NULL; - if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) - return NULL; - } - TopoDS_Shape Te = aShape->GetValue(); // Set Position @@ -1397,15 +1824,15 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); if (theHexMesh) { - // - // Get the groups: BEGIN - // + // Get the groups try { - if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) { + if (!MakeGroups(aShape,TSHAPE_BASIC, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., aSeq, aTrsf)) { return NULL; } } @@ -1414,40 +1841,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th SetErrorCode(aFail->GetMessageString()); return NULL; } - - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() << "] = geompy.MakePipeTShape(" - << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " - << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; } - // - // Get the groups: END - // - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShape(" << theR1 << ", " << theW1 << ", " - << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theHexMesh << ", " << theP1 - << ", " << theP2 << ", " << theP3 << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShape(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1474,10 +1904,14 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeWithPosition(double theR1, double th */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theH, double theW, - bool theHexMesh) +GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theH, double theW, + bool theHexMesh) { SetErrorCode(KO); //Add a new object @@ -1501,6 +1935,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, aData.SetW(theW); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1510,7 +1948,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -1578,39 +2017,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, aFunction->SetValue(aChamferShape); // END of chamfer - // bool doMesh = false; if (theHexMesh) { - // doMesh = true; - if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, 0, false)) { - MESSAGE("PipeTShape partition failed"); - // doMesh = false; + if (!MakePipeTShapePartition(aShape, theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, 0, false)) return NULL; - } - if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) { - MESSAGE("PipeTShape mirrors and glue failed"); - // doMesh = false; + if (!MakePipeTShapeMirrorAndGlue(aShape, theR1, theW1, theL1, theR2, theW2, theL2)) return NULL; + } + + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); } } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); - // if (doMesh) { if (theHexMesh) { - // - // Get the groups: BEGIN - // - //if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) { - // //Make a Python command - // GEOM::TPythonDump(aFunction) - // << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - // << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - // << ", " << theHexMesh << ")"; - //} - //else { + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, + theH, theW, 0., aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -1618,40 +2061,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, SetErrorCode(aFail->GetMessageString()); return NULL; } - - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW << ", " << theHexMesh << ")"; - //} } - // - // Get the groups: END - // - else { + + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - << ", " << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeChamfer(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theH << ", " << theW << ", " << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1682,13 +2128,17 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamfer(double theR1, double theW1, */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theH, double theW, - bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theH, double theW, + bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -1717,6 +2167,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do aData.SetW(theW); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1726,7 +2180,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -1799,21 +2254,42 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do return NULL; } - TopoDS_Shape Te = aShape->GetValue(); + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } // Set Position gp_Trsf aTrsf = GetPositionTrsf(theL1, theL2, theP1, theP2, theP3); - BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); + BRepBuilderAPI_Transform aTransformation (aShape->GetValue(), aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + if (!MakeGroups(aShape, TSHAPE_CHAMFER, theR1, theW1, theL1, theR2, theW2, theL2, + theH, theW, 0., aSeq, aTrsf)) return NULL; } catch (Standard_Failure) { @@ -1821,40 +2297,44 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW << ", " << theHexMesh << ", " - << theP1 << ", " << theP2 << ", " << theP3 << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeChamfer(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theH << ", " << theW - << ", " << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeChamfer(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theH << ", " << theW << ", " << theHexMesh << ", " + << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -1880,9 +2360,13 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeChamferWithPosition(double theR1, do */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theRF, bool theHexMesh) +GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theRF, bool theHexMesh) { SetErrorCode(KO); //Add a new object @@ -1905,6 +2389,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d aData.SetRF(theRF); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -1914,7 +2402,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -2003,14 +2492,36 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d return NULL; } + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, gp_Trsf())) + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., theRF, aSeq, gp_Trsf())) return NULL; } catch (Standard_Failure) { @@ -2018,39 +2529,43 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " << theHexMesh << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " - << theHexMesh << ")"; + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeFillet(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theRF << ", " << theHexMesh; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); @@ -2080,12 +2595,16 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFillet(double theR1, double theW1, d */ //============================================================================= Handle(TColStd_HSequenceOfTransient) -GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, double theW1, double theL1, - double theR2, double theW2, double theL2, - double theRF, bool theHexMesh, - Handle(GEOM_Object) theP1, - Handle(GEOM_Object) theP2, - Handle(GEOM_Object) theP3) +GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition + (double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, + double theRF, bool theHexMesh, + Handle(GEOM_Object) theP1, + Handle(GEOM_Object) theP2, + Handle(GEOM_Object) theP3) { SetErrorCode(KO); //Add a new object @@ -2113,6 +2632,10 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou aData.SetRF(theRF); aData.SetHexMesh(theHexMesh); + bool isTRL = (theRL + theWL + theLtransL + theLthinL) > Precision::Confusion(); + bool isTRR = (theRR + theWR + theLtransR + theLthinR) > Precision::Confusion(); + bool isTRI = (theRI + theWI + theLtransI + theLthinI) > Precision::Confusion(); + //Compute the resulting value try { #if OCC_VERSION_LARGE > 0x06010000 @@ -2122,7 +2645,8 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou SetErrorCode("TShape driver failed"); return NULL; } - } catch (Standard_Failure) { + } + catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); SetErrorCode(aFail->GetMessageString()); return NULL; @@ -2210,21 +2734,42 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou return NULL; } - TopoDS_Shape Te = aShape->GetValue(); + // Add thickness reduction elements + // at the three extremities: Left, Right and Incident + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + if (isTRL || isTRR || isTRI) { + TopoDS_Shape aResShape = + MakePipeTShapeThicknessReduction(aShape->GetValue(), theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + !theHexMesh); + aFunction->SetValue(aResShape); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } // Set Position gp_Trsf aTrsf = GetPositionTrsf(theL1, theL2, theP1, theP2, theP3); - BRepBuilderAPI_Transform aTransformation(Te, aTrsf, Standard_False); + BRepBuilderAPI_Transform aTransformation (aShape->GetValue(), aTrsf, Standard_False); TopoDS_Shape aTrsf_Shape = aTransformation.Shape(); aFunction->SetValue(aTrsf_Shape); + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; aSeq->Append(aShape); + if (theHexMesh) { - /* - * Get the groups: BEGIN - */ + // Get the groups try { - if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, aSeq, aTrsf)) + if (!MakeGroups(aShape, TSHAPE_FILLET, theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., theRF, aSeq, aTrsf)) return NULL; } catch (Standard_Failure) { @@ -2232,40 +2777,44 @@ GEOMImpl_IAdvancedOperations::MakePipeTShapeFilletWithPosition(double theR1, dou SetErrorCode(aFail->GetMessageString()); return NULL; } + } - TCollection_AsciiString aListRes, anEntry; - // Iterate over the sequence aSeq - Standard_Integer aNbGroups = aSeq->Length(); - Standard_Integer i = 2; - for (; i <= aNbGroups; i++) { - Handle(Standard_Transient) anItem = aSeq->Value(i); - if (anItem.IsNull()) continue; - Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); - if (aGroup.IsNull()) continue; - //Make a Python command - TDF_Tool::Entry(aGroup->GetEntry(), anEntry); - aListRes += anEntry + ", "; - } - - aListRes.Trunc(aListRes.Length() - 2); - - //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << ", " << aListRes.ToCString() - << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 << ", " << theL1 << ", " << theR2 - << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " << theHexMesh << ", " << theP1 << ", " - << theP2 << ", " << theP3 << ")"; - } - /* - * Get the groups: END - */ - else { + //Make a Python command + TCollection_AsciiString anEntry, aListRes("["); + // Iterate over the sequence aSeq + Standard_Integer aNbGroups = aSeq->Length(); + Standard_Integer i = 1; + for (; i <= aNbGroups; i++) { + Handle(Standard_Transient) anItem = aSeq->Value(i); + if (anItem.IsNull()) continue; + Handle(GEOM_Object) aGroup = Handle(GEOM_Object)::DownCast(anItem); + if (aGroup.IsNull()) continue; //Make a Python command - GEOM::TPythonDump(aFunction) - << "[" << aShape << "] = geompy.MakePipeTShapeFillet(" << theR1 << ", " << theW1 - << ", " << theL1 << ", " << theR2 << ", " << theW2 << ", " << theL2 << ", " << theRF << ", " - << theHexMesh << ", " << theP1 << ", " << theP2 << ", " << theP3 << ")"; - } + TDF_Tool::Entry(aGroup->GetEntry(), anEntry); + aListRes += anEntry + ", "; + } + aListRes.Trunc(aListRes.Length() - 2); + + GEOM::TPythonDump pd (aFunction); + + pd << aListRes.ToCString() << "] = geompy.MakePipeTShapeFillet(" + << theR1 << ", " << theW1 << ", " << theL1 << ", " + << theR2 << ", " << theW2 << ", " << theL2 << ", " + << theRF << ", " << theHexMesh << ", " + << theP1 << ", " << theP2 << ", " << theP3; + + // thickness reduction + if (isTRL) + pd << ", theRL=" << theRL << ", theWL=" << theWL + << ", theLtransL=" << theLtransL << ", theLthinL=" << theLthinL; + if (isTRR) + pd << ", theRR=" << theRR << ", theWR=" << theWR + << ", theLtransR=" << theLtransR << ", theLthinR=" << theLthinR; + if (isTRI) + pd << ", theRI=" << theRI << ", theWI=" << theWI + << ", theLtransI=" << theLtransI << ", theLthinI=" << theLthinI; + + pd << ")"; SetErrorCode(OK); diff --git a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx index a7c11d6ff..5611824cb 100644 --- a/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IAdvancedOperations.hxx @@ -27,6 +27,8 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" +#include + class GEOMImpl_IBasicOperations; class GEOMImpl_IBooleanOperations; class GEOMImpl_IShapesOperations; @@ -43,23 +45,36 @@ private: double theR2, double theW2, double theL2, double theH = 0, double theW = 0, double theRF = 0, bool isNormal = true); + bool MakePipeTShapeMirrorAndGlue(Handle(GEOM_Object) theShape, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2); + + bool MakePipeTShapeThicknessReduction (Handle(GEOM_Object) theShape, + double theR1, double theW1, double theL1, + double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI); + bool MakeGroups(Handle(GEOM_Object) theShape, int shapType, double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theH, double theW, double theRF, Handle(TColStd_HSequenceOfTransient) theSeq, gp_Trsf aTrsf); + gp_Trsf GetPositionTrsf(double theL1, double theL2, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + bool CheckCompatiblePosition(double& theL1, double& theL2, Handle(GEOM_Object) theP1, Handle(GEOM_Object) theP2, Handle(GEOM_Object) theP3, double theTolerance); + private: GEOMImpl_IBasicOperations* myBasicOperations; GEOMImpl_IBooleanOperations* myBooleanOperations; @@ -70,6 +85,57 @@ private: GEOMImpl_ILocalOperations* myLocalOperations; GEOMImpl_IHealingOperations* myHealingOperations; +public: + + /*! + * \brief Add three thickness reductions at the open ends of the pipe T-Shape + * + * \param theShape - the pipe T-Shape + * \param r1 - the internal radius of main pipe + * \param w1 - the thickness of main pipe + * \param l1 - the half-length of main pipe + * \param r2 - the internal radius of incident pipe + * \param w2 - the thickness of incident pipe + * \param l2 - the half-length of main pipe + * \param r*, w*, ltrans* and lthin* - internal radius, thickness, length of transition part + * and length of thin part of left(L), right(R) and + * incident(I) thickness reduction correspondingly + * \param fuseReductions - boolean flag (use true to generate single solid, + * false to obtain parts, useful for hexameshing) + * \retval TopoDS_Shape - Resulting shape + */ + Standard_EXPORT static TopoDS_Shape MakePipeTShapeThicknessReduction + (TopoDS_Shape theShape, + double r1, double w1, double l1, + double r2, double w2, double l2, + double rL, double wL, double ltransL, double lthinL, + double rR, double wR, double ltransR, double lthinR, + double rI, double wI, double ltransI, double lthinI, + bool fuseReductions); + + /*! + * \brief Create one thickness reduction element + * + * This method is called three times from MakePipeTShapeThicknessReduction + * to create three thickness reductions (one per each open end of a pipe T-Shape) + * + * \param theAxes - the position + * \param R - the internal radius of main pipe + * \param W - the thickness of main pipe + * \param Rthin - the internal radius of thin part + * \param Wthin - the thickness of thin part + * \param Ltrans - the length of transition part + * \param Lthin - the length of thin part + * \param fuse - boolean flag (use true to generate single solid, + * false to obtain parts, useful for hexameshing) + * \retval TopoDS_Shape - Resulting shape + */ + Standard_EXPORT static TopoDS_Shape MakeThicknessReduction (gp_Ax2 theAxes, + const double R, const double W, + const double Rthin, const double Wthin, + const double Ltrans, const double Lthin, + bool fuse); + public: Standard_EXPORT GEOMImpl_IAdvancedOperations(GEOM_Engine* theEngine, int theDocID); Standard_EXPORT ~GEOMImpl_IAdvancedOperations(); @@ -77,34 +143,57 @@ public: Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShape(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeChamfer(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theH, double theW, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeChamferWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, double theH, double theW, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, Handle(GEOM_Object) P3 = 0); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeFillet(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theRF, bool theHexMesh = true); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakePipeTShapeFilletWithPosition(double theR1, double theW1, double theL1, double theR2, double theW2, double theL2, + double theRL, double theWL, double theLtransL, double theLthinL, + double theRR, double theWR, double theLtransR, double theLthinR, + double theRI, double theWI, double theLtransI, double theLthinI, double theRF, bool theHexMesh = true, Handle(GEOM_Object) P1 = 0, Handle(GEOM_Object) P2 = 0, diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index 65b2ea018..27d432337 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -794,71 +794,14 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetEdgeNearPoint #if OCC_VERSION_LARGE > 0x06010000 OCC_CATCH_SIGNALS; #endif - TopoDS_Shape aShape; - TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + TopoDS_Shape aShape = GEOMUtils::GetEdgeNearPoint(aBlockOrComp, aVert); - // 1. Explode blocks on edges - TopTools_MapOfShape mapShape; - Standard_Integer nbEdges = 0; - TopExp_Explorer exp (aBlockOrComp, TopAbs_EDGE); - for (; exp.More(); exp.Next()) { - if (mapShape.Add(exp.Current())) { - nbEdges++; - } - } - - if (nbEdges == 0) { - SetErrorCode("Given shape contains no edges"); - return NULL; - } - - mapShape.Clear(); - Standard_Integer ind = 1; - TopTools_Array1OfShape anEdges (1, nbEdges); - TColStd_Array1OfReal aDistances (1, nbEdges); - for (exp.Init(aBlockOrComp, TopAbs_EDGE); exp.More(); exp.Next()) { - if (mapShape.Add(exp.Current())) { - TopoDS_Shape anEdge = exp.Current(); - anEdges(ind) = anEdge; - - // 2. Classify the point relatively each edge - BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind)); - if (!aDistTool.IsDone()) { - SetErrorCode("Can not find a distance from the given point to one of edges"); - return NULL; - } - aDistances(ind) = aDistTool.Value(); - ind++; - } - } - - // 3. Define edge, having minimum distance to the point - Standard_Real nearest = RealLast(), nbFound = 0; - Standard_Real prec = Precision::Confusion(); - for (ind = 1; ind <= nbEdges; ind++) { - if (Abs(aDistances(ind) - nearest) < prec) { - nbFound++; - } else if (aDistances(ind) < nearest) { - nearest = aDistances(ind); - aShape = anEdges(ind); - nbFound = 1; - } else { - } - } - if (nbFound > 1) { - SetErrorCode("Multiple edges near the given point are found"); - return NULL; - } else if (nbFound == 0) { - SetErrorCode("There are no edges near the given point"); - return NULL; - } else { - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aBlockOrComp, anIndices); - Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); - anArray->SetValue(1, anIndices.FindIndex(aShape)); - aResult = GetEngine()->AddSubShape(theShape, anArray); - } + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); } catch (Standard_Failure) { Handle(Standard_Failure) aFail = Standard_Failure::Caught(); diff --git a/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx b/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx index 8048d0313..981280427 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeTShape.hxx @@ -15,34 +15,13 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_IPipeTShape_HXX_ #define _GEOMImpl_IPipeTShape_HXX_ #include "GEOM_Function.hxx" -#define TSHAPE_ARG_R1 1 -#define TSHAPE_ARG_W1 2 -#define TSHAPE_ARG_L1 3 -#define TSHAPE_ARG_R2 4 -#define TSHAPE_ARG_W2 5 -#define TSHAPE_ARG_L2 6 - -// chamfer -#define TSHAPE_ARG_H 7 -#define TSHAPE_ARG_W 8 - -// fillet -#define TSHAPE_ARG_RF 9 - -// partition -#define TSHAPE_ARG_HEXMESH 10 - -// junction points -#define TSHAPE_ARG_P1 11 -#define TSHAPE_ARG_P2 12 -#define TSHAPE_ARG_P3 13 +#include class GEOMImpl_IPipeTShape { @@ -88,6 +67,34 @@ public: void SetP3(const Handle(GEOM_Function)& theP3){_func->SetReference(TSHAPE_ARG_P3, theP3); } Handle(GEOM_Function) GetP3() { return _func->GetReference(TSHAPE_ARG_P3); } +private: + enum { + // main pipe + TSHAPE_ARG_R1 = 1, + TSHAPE_ARG_W1 = 2, + TSHAPE_ARG_L1 = 3, + + // incident pipe + TSHAPE_ARG_R2 = 4, + TSHAPE_ARG_W2 = 5, + TSHAPE_ARG_L2 = 6, + + // chamfer + TSHAPE_ARG_H = 7, + TSHAPE_ARG_W = 8, + + // fillet + TSHAPE_ARG_RF = 9, + + // partition + TSHAPE_ARG_HEXMESH = 10, + + // junction points + TSHAPE_ARG_P1 = 11, + TSHAPE_ARG_P2 = 12, + TSHAPE_ARG_P3 = 13 + }; + private: Handle(GEOM_Function) _func; }; diff --git a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx index f28ff1f27..700c1163c 100644 --- a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,7 @@ #include #include +#include #include #include #include @@ -251,19 +253,19 @@ Handle(TColStd_HSequenceOfInteger) // along OX and OZ //======================================================================= void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& theShape, - TopAbs_ShapeEnum theShapeType, - double r1, - double r2, - Handle(TopTools_HSequenceOfShape)& commonShapes) const + TopAbs_ShapeEnum theShapeType, + double r1, + double r2, + Handle(TopTools_HSequenceOfShape)& commonShapes) const { gp_Pnt aP0 (0, 0, 0); gp_Vec aVX = gp::DX(), aVZ = gp::DZ(); - gp_Ax3 anAxis1 (aP0, aVX), anAxis2 (aP0, aVZ); + gp_Ax3 anAxis1 (aP0, aVX, aVZ), anAxis2 (aP0, aVZ, aVX); TopTools_IndexedMapOfShape aMapOfShapes; aMapOfShapes.Clear(); TopExp::MapShapes(theShape, aMapOfShapes); - + commonShapes->Clear(); int myID; @@ -289,9 +291,9 @@ void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& t for (int j=1; j<=aSeqExt1->Length();j++) { // std::cerr << "aSeqExt1->Value(j): " << aSeqExt1->Value(j) << std::endl; if (aSeqExt1->Value(j) == aSeqExt2->Value(i)) { - myID = aSeqExt1->Value(j); - commonShapes->Append(aMapOfShapes.FindKey(myID)); - found = true; + myID = aSeqExt1->Value(j); + commonShapes->Append(aMapOfShapes.FindKey(myID)); + found = true; } } } @@ -303,8 +305,8 @@ void GEOMImpl_PipeTShapeDriver::GetCommonShapesOnCylinders(const TopoDS_Shape& t //function : MakePipeTShape //purpose : //======================================================================= -TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const double w1, const double l1, - const double r2, const double w2, const double l2) const +TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape (const double r1, const double w1, const double l1, + const double r2, const double w2, const double l2) const { double r1Ext = r1 + w1; double r2Ext = r2 + w2; @@ -312,8 +314,8 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do gp_Pnt aP0 (0, 0, 0); gp_Pnt aP1 (-l1, 0, 0); gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); - gp_Ax2 anAxes1 (aP1, aVX); - gp_Ax2 anAxes2 (aP0, aVZ); + gp_Ax2 anAxes1 (aP1, aVX, aVZ); + gp_Ax2 anAxes2 (aP0, aVZ, aVX); // Build the initial pipes BRepPrimAPI_MakeCylinder C1Int (anAxes1, r1, Abs(2 * l1)); @@ -325,13 +327,13 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do C2Int.Build(); C2Ext.Build(); if (!C1Int.IsDone() || !C1Ext.IsDone() || !C2Int.IsDone() || !C2Ext.IsDone()) { - StdFail_NotDone::Raise("Couldn't build cylinders"); + StdFail_NotDone::Raise("Cannot build cylinders"); } // Fuse the 2 pipes BRepAlgoAPI_Fuse fuse1 (C1Ext.Shape(), C2Ext.Shape()); if (!fuse1.IsDone()) { - StdFail_NotDone::Raise("Couldn't fuse cylinders"); + StdFail_NotDone::Raise("Cannot fuse cylinders"); } // Remove small radius main pipe @@ -353,17 +355,17 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakePipeTShape(const double r1, const do //function : MakeQuarterPipeTShape //purpose : //======================================================================= -TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape(const double r1, const double w1, const double l1, - const double r2, const double w2, const double l2) const +TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape (const double r1, const double w1, const double l1, + const double r2, const double w2, const double l2) const { - double r1Ext = r1 + w1; TopoDS_Shape Te = MakePipeTShape(r1, w1, l1, r2, w2, l2); if (Te.IsNull()) StdFail_NotDone::Raise("Couldn't build Pipe TShape"); // Get a quarter of shape => Te2 - BRepPrimAPI_MakeBox box1 (gp_Pnt(0,-2*r1Ext,-2*r1Ext),gp_Pnt(Abs(2 * l1), 2*r1Ext, Abs(2*l2))); - BRepPrimAPI_MakeBox box2 (gp_Pnt(0,2*r1Ext,-2*r1Ext),gp_Pnt(-Abs(2 * l1), 0, Abs(2*l2))); + double r1Ext = r1 + w1; + BRepPrimAPI_MakeBox box1 (gp_Pnt(0, -2*r1Ext, -2*r1Ext), gp_Pnt( Abs(2 * l1), 2*r1Ext, Abs(2*l2))); + BRepPrimAPI_MakeBox box2 (gp_Pnt(0, 2*r1Ext, -2*r1Ext), gp_Pnt(-Abs(2 * l1), 0, Abs(2*l2))); box1.Build(); box2.Build(); if (!box1.IsDone() || !box2.IsDone()) { @@ -385,7 +387,7 @@ TopoDS_Shape GEOMImpl_PipeTShapeDriver::MakeQuarterPipeTShape(const double r1, c //function : Execute //purpose : //======================================================================= -Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) const +Standard_Integer GEOMImpl_PipeTShapeDriver::Execute (TFunction_Logbook& log) const { if (Label().IsNull()) return 0; Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); @@ -394,20 +396,20 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape, Te4, Te4Part; -// TopoDS_Edge arete_intersect_int; -// Handle(TopTools_HSequenceOfShape) edges_e = new TopTools_HSequenceOfShape; + //TopoDS_Edge arete_intersect_int; + //Handle(TopTools_HSequenceOfShape) edges_e = new TopTools_HSequenceOfShape; Handle(TColStd_HSequenceOfInteger) edges_e; -// Handle(TopTools_HSequenceOfShape) edges_i = new TopTools_HSequenceOfShape; -// gp_Pnt aP0 (0, 0, 0); -// gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); + //Handle(TopTools_HSequenceOfShape) edges_i = new TopTools_HSequenceOfShape; + //gp_Pnt aP0 (0, 0, 0); + //gp_Vec aVX = gp::DX(), aVY = gp::DY(), aVZ = gp::DZ(); bool hexMesh = (bool) aData.GetHexMesh(); // Useful values -// double aSize = 2*(aData.GetL1() + aData.GetL2()); + //double aSize = 2*(aData.GetL1() + aData.GetL2()); double epsilon = Precision::Approximation(); double aR1Ext = aData.GetR1() + aData.GetW1(); double aR2Ext = aData.GetR2() + aData.GetW2(); - + if (aData.GetR2() > aData.GetR1() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2 > R1"); } @@ -415,7 +417,7 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (aR2Ext > aR1Ext + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2+W2 > R1+W1"); } - + // external radius are equal if (fabs(aR2Ext - aR1Ext) < epsilon) { if (aType == TSHAPE_CHAMFER) @@ -428,11 +430,10 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons } } - if (aR1Ext >= aData.GetL2() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R1+W1 >= L2"); } - if (aR2Ext >= aData.GetL1() + epsilon) { + if (aR2Ext >= aData.GetL1() + epsilon) { StdFail_NotDone::Raise("TShape cannot be computed if R2+W2 >= L1"); } @@ -446,22 +447,22 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons } if (aType == TSHAPE_FILLET) { - if (aData.GetRF() >= (aData.GetL2() - aR1Ext + epsilon) || - aData.GetRF() >= (aData.GetL1() - aR2Ext + epsilon)) + if (aData.GetRF() >= (aData.GetL2() - aR1Ext + epsilon) || + aData.GetRF() >= (aData.GetL1() - aR2Ext + epsilon)) StdFail_NotDone::Raise("TShape cannot be computed: radius of fillet is too high"); } if (hexMesh) { // Create a quarter of a basic T-Shape pipe -// std::cerr << "Create a quarter of a basic T-Shape pipe" << std::endl; + //std::cerr << "Create a quarter of a basic T-Shape pipe" << std::endl; Te4 = MakeQuarterPipeTShape(aData.GetR1(), aData.GetW1(), aData.GetL1(), - aData.GetR2(), aData.GetW2(), aData.GetL2()); + aData.GetR2(), aData.GetW2(), aData.GetL2()); } else { // No need to cut pipe t-shape -// std::cerr << "Create a basic T-Shape pipe" << std::endl; + //std::cerr << "Create a basic T-Shape pipe" << std::endl; Te4 = MakePipeTShape(aData.GetR1(), aData.GetW1(), aData.GetL1(), - aData.GetR2(), aData.GetW2(), aData.GetL2()); + aData.GetR2(), aData.GetW2(), aData.GetL2()); } aShape = Te4; /* @@ -502,7 +503,6 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (edges_e.IsNull() || edges_e->Length() == 0) { StdFail_NotDone::Raise("Common edges not found"); } - TopTools_IndexedDataMapOfShapeListOfShape M; GEOMImpl_Block6Explorer::MapShapesAndAncestors(Te4, TopAbs_EDGE, TopAbs_FACE, M); @@ -547,10 +547,9 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (!chamfer.IsDone()) { StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters"); } - + // BB.Add(CC, chamfer.Shape()); - - + // aShape = CC; aShape = chamfer.Shape(); } @@ -558,10 +557,10 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons // TShape with fillet // Create fillet on the edge arete_intersect_ext BRepFilletAPI_MakeFillet fill (Te4); - + TopTools_IndexedMapOfShape anIndices; TopExp::MapShapes(Te4, anIndices); - + TopoDS_Shape theBox; if (hexMesh) { BRepPrimAPI_MakeBox aBox (gp_Pnt(0,0,0),gp_Pnt(-aR2Ext, -aR2Ext, aR1Ext)); @@ -584,7 +583,7 @@ Standard_Integer GEOMImpl_PipeTShapeDriver::Execute(TFunction_Logbook& log) cons if (edges_e.IsNull() || edges_e->Length() == 0) { StdFail_NotDone::Raise("Common edges not found"); } - + // fill.Add(TopoDS::Edge(edges_e->Value(1))); // if (!hexMesh) { for (int i=1;i<=edges_e->Length();i++) { diff --git a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx index 90d8f35ec..19196fedf 100644 --- a/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeTShapeDriver.hxx @@ -15,7 +15,6 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// #ifndef _GEOMImpl_PipeTShapeDriver_HXX #define _GEOMImpl_PipeTShapeDriver_HXX @@ -24,11 +23,12 @@ #include "GEOMAlgo_State.hxx" +#include #include #include #include -#include #include +#include #include @@ -125,32 +125,33 @@ public: return (STANDARD_TYPE(GEOMImpl_PipeTShapeDriver) == AType || TFunction_Driver::IsKind(AType)); } private: + /*! * \brief Create a T-Shape based on pipes * \param r1 - the internal radius of main pipe - * \param w1 - the thickness main pipe + * \param w1 - the thickness of main pipe * \param l1 - the half-length of main pipe * \param r2 - the internal radius of incident pipe - * \param w2 - the thickness incident pipe + * \param w2 - the thickness of incident pipe * \param l2 - the half-length of main pipe * \retval TopoDS_Shape - Resulting shape */ - TopoDS_Shape MakePipeTShape(double r1, double w1, double l1, double r2, double w2, double l2) const; + TopoDS_Shape MakePipeTShape(double r1, double w1, double l1, + double r2, double w2, double l2) const; /*! * \brief Create a quarter of a T-Shape based on pipes * \param r1 - the internal radius of main pipe - * \param w1 - the thickness main pipe + * \param w1 - the thickness of main pipe * \param l1 - the half-length of main pipe * \param r2 - the internal radius of incident pipe - * \param w2 - the thickness incident pipe + * \param w2 - the thickness of incident pipe * \param l2 - the half-length of main pipe * \retval TopoDS_Shape - Resulting shape */ - TopoDS_Shape MakeQuarterPipeTShape(double r1, double w1, double l1, double r2, double w2, double l2) const; + TopoDS_Shape MakeQuarterPipeTShape(double r1, double w1, double l1, + double r2, double w2, double l2) const; -//======================================================================= -//function : GetShapesOnSurfaceIDs /*! * \brief Find IDs of sub-shapes complying with given status about surface * \param theSurface - the surface to check state of sub-shapes against @@ -164,8 +165,7 @@ private: const TopoDS_Shape& theShape, TopAbs_ShapeEnum theShapeType, GEOMAlgo_State theState) const; -//======================================================================= -//function : getShapesOnBoxIDs + /*! * \brief Find IDs of sub-shapes complying with given status about surface * \param theBox - the box to check state of sub-shapes against @@ -174,7 +174,6 @@ private: * \param theState - required state * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found sub-shapes */ -//======================================================================= Handle(TColStd_HSequenceOfInteger) GetShapesOnBoxIDs(const TopoDS_Shape& aBox, const TopoDS_Shape& aShape, @@ -188,7 +187,7 @@ private: //======================================================================= void GetCommonShapesOnCylinders(const TopoDS_Shape& theShape, TopAbs_ShapeEnum theShapeType, - double r, double r2, + double r, double r2, Handle(TopTools_HSequenceOfShape)& commonShapes) const; }; diff --git a/src/GEOMUtils/GEOMUtils.cxx b/src/GEOMUtils/GEOMUtils.cxx index 292ab5c44..0b02a04a6 100644 --- a/src/GEOMUtils/GEOMUtils.cxx +++ b/src/GEOMUtils/GEOMUtils.cxx @@ -32,6 +32,8 @@ // OCCT Includes #include +#include + #include #include #include @@ -53,6 +55,7 @@ #include #include #include +#include #include #include @@ -63,6 +66,8 @@ #include #include +#include + #include #include @@ -427,6 +432,34 @@ TopoDS_Shape GEOMUtils::CompsolidToCompound (const TopoDS_Shape& theCompsolid) return aCompound; } +//======================================================================= +//function : AddSimpleShapes +//purpose : +//======================================================================= +void GEOMUtils::AddSimpleShapes (const TopoDS_Shape& theShape, TopTools_ListOfShape& theList) +{ + if (theShape.ShapeType() != TopAbs_COMPOUND && + theShape.ShapeType() != TopAbs_COMPSOLID) { + theList.Append(theShape); + return; + } + + TopTools_MapOfShape mapShape; + TopoDS_Iterator It (theShape, Standard_True, Standard_True); + + for (; It.More(); It.Next()) { + TopoDS_Shape aShape_i = It.Value(); + if (mapShape.Add(aShape_i)) { + if (aShape_i.ShapeType() == TopAbs_COMPOUND || + aShape_i.ShapeType() == TopAbs_COMPSOLID) { + AddSimpleShapes(aShape_i, theList); + } else { + theList.Append(aShape_i); + } + } + } +} + //======================================================================= //function : CheckTriangulation //purpose : @@ -497,3 +530,71 @@ TopAbs_ShapeEnum GEOMUtils::GetTypeOfSimplePart (const TopoDS_Shape& theShape) } return TopAbs_SHAPE; } + +//======================================================================= +//function : GetEdgeNearPoint +//purpose : +//======================================================================= +TopoDS_Shape GEOMUtils::GetEdgeNearPoint (const TopoDS_Shape& theShape, + const TopoDS_Vertex& thePoint) +{ + TopoDS_Shape aResult; + + // 1. Explode the shape on edges + TopTools_MapOfShape mapShape; + Standard_Integer nbEdges = 0; + TopExp_Explorer exp (theShape, TopAbs_EDGE); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbEdges++; + } + } + + if (nbEdges == 0) + Standard_NullObject::Raise("Given shape contains no edges"); + + mapShape.Clear(); + Standard_Integer ind = 1; + TopTools_Array1OfShape anEdges (1, nbEdges); + TColStd_Array1OfReal aDistances (1, nbEdges); + for (exp.Init(theShape, TopAbs_EDGE); exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape anEdge = exp.Current(); + anEdges(ind) = anEdge; + + // 2. Classify the point relatively each edge + BRepExtrema_DistShapeShape aDistTool (thePoint, anEdges(ind)); + if (!aDistTool.IsDone()) + Standard_ConstructionError::Raise("Cannot find a distance from the given point to one of edges"); + + aDistances(ind) = aDistTool.Value(); + ind++; + } + } + + // 3. Define edge, having minimum distance to the point + Standard_Real nearest = RealLast(), nbFound = 0; + Standard_Real prec = Precision::Confusion(); + for (ind = 1; ind <= nbEdges; ind++) { + if (Abs(aDistances(ind) - nearest) < prec) { + nbFound++; + } + else if (aDistances(ind) < nearest) { + nearest = aDistances(ind); + aResult = anEdges(ind); + nbFound = 1; + } + else { + } + } + if (nbFound > 1) { + Standard_ConstructionError::Raise("Multiple edges near the given point are found"); + } + else if (nbFound == 0) { + Standard_ConstructionError::Raise("There are no edges near the given point"); + } + else { + } + + return aResult; +} diff --git a/src/GEOMUtils/GEOMUtils.hxx b/src/GEOMUtils/GEOMUtils.hxx index d6b10816f..37e06bbf9 100644 --- a/src/GEOMUtils/GEOMUtils.hxx +++ b/src/GEOMUtils/GEOMUtils.hxx @@ -23,6 +23,7 @@ #define _GEOMUtils_HXX_ #include +#include #include @@ -89,6 +90,17 @@ class GEOMUtils { */ Standard_EXPORT static TopoDS_Shape CompsolidToCompound (const TopoDS_Shape& theCompsolid); + /*! + * \brief Recursively extract all shapes from compounds and compsolids of the given shape into theList. + * + * If theShape is not compound or compsolid, theList will contain only theShape itself. + * + * \param theShape The shape to be exploded. + * \param theList Output parameter. + */ + Standard_EXPORT static void AddSimpleShapes (const TopoDS_Shape& theShape, + TopTools_ListOfShape& theList); + /*! * \brief Build a triangulation on \a theShape if it is absent. * \param theShape The shape to check/build triangulation on. @@ -103,6 +115,16 @@ class GEOMUtils { */ Standard_EXPORT static TopAbs_ShapeEnum GetTypeOfSimplePart (const TopoDS_Shape& theShape); + /*! + * \brief Find an edge of theShape, closest to thePoint. + * + * \param theShape The shape to explore. + * \param thePoint The point near the required edge. + * \retval TopoDS_Shape Returns the found edge or an empty shape if multiple edges found. + */ + Standard_EXPORT static TopoDS_Shape GetEdgeNearPoint (const TopoDS_Shape& theShape, + const TopoDS_Vertex& thePoint); + }; #endif diff --git a/src/GEOM_I/GEOM_IAdvancedOperations_i.cc b/src/GEOM_I/GEOM_IAdvancedOperations_i.cc index 77310827f..9897b9785 100644 --- a/src/GEOM_I/GEOM_IAdvancedOperations_i.cc +++ b/src/GEOM_I/GEOM_IAdvancedOperations_i.cc @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOM_IAdvancedOperations.cc // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #include #include "GEOM_IAdvancedOperations_i.hh" @@ -68,8 +67,10 @@ GEOM_IAdvancedOperations_i::~GEOM_IAdvancedOperations_i() * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -77,10 +78,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -109,9 +113,11 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShape (CORBA::Double theR1, * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -125,10 +131,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::D if (aP1.IsNull() || aP2.IsNull() || aP3.IsNull())return aSeq._retn(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -156,9 +165,10 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeWithPosition (CORBA::D * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -166,10 +176,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theH, theW, theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -201,10 +214,11 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamfer(CORBA::Double * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -217,11 +231,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (C Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, - theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theH, theW, theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -248,9 +264,10 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeChamferWithPosition (C * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -258,10 +275,13 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double GetOperations()->SetNotDone(); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theRF, theHexMesh); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -292,10 +312,332 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFillet (CORBA::Double * \return List of GEOM_Objects, containing the created shape and propagation groups. */ //============================================================================= -GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + theRF, theHexMesh, aP1, aP2, aP3); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTR + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTR + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + if (aP1.IsNull() || aP2.IsNull() || aP3.IsNull()) return aSeq._retn(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh, aP1, aP2, aP3); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRChamfer + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theH Height of chamfer. + * \param theW Width of chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRChamferWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A chamfer is created + * on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theH Height of the chamfer. + * \param theW Width of the chamfer. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference vertices + Handle(GEOM_Object) aP1 = GetObjectImpl(theP1); + Handle(GEOM_Object) aP2 = GetObjectImpl(theP2); + Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh, aP1, aP2, aP3); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRFillet + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A fillet is created + * on the junction of the pipes. + * Center of the shape is (0,0,0). The main plane of the T-shape is XOY. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theRF Radius of curvature of fillet. + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the TShape + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakePipeTShapeTRFilletWithPosition + * Create a T-shape object with specified caracteristics for the main and + * the incident pipes (radius, width, half-length). A fillet is created + * on the junction of the pipes. + * The extremities of the main pipe are located on junctions points P1 and P2. + * The extremity of the incident pipe is located on junction point P3. + * \param theR1 Internal radius of main pipe + * \param theW1 Width of main pipe + * \param theL1 Half-length of main pipe + * \param theR2 Internal radius of incident pipe (R2 < R1) + * \param theW2 Width of incident pipe (R2+W2 < R1+W1) + * \param theL2 Half-length of incident pipe + * \param theRF Radius of curvature of fillet + * \param theHexMesh Boolean indicating if shape is prepared for hex mesh + * \param theP1 1st junction point of main pipe + * \param theP2 2nd junction point of main pipe + * \param theP3 Junction point of incident pipe + * \return List of GEOM_Objects, containing the created shape and propagation groups. + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeTRFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3) { GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; @@ -308,11 +650,15 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CO Handle(GEOM_Object) aP3 = GetObjectImpl(theP3); //Create the TShape - Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theRF, - theHexMesh, aP1, aP2, aP3); + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh, aP1, aP2, aP3); if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); - + Standard_Integer aLength = aHSeq->Length(); aSeq->length(aLength); for (Standard_Integer i = 1; i <= aLength; i++) @@ -330,8 +676,8 @@ GEOM::ListOfGO* GEOM_IAdvancedOperations_i::MakePipeTShapeFilletWithPosition (CO * \return New GEOM_Object, containing the created shape. */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double theR, - CORBA::Double theRatio, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double theR, + CORBA::Double theRatio, CORBA::Short theOrientation, GEOM::pattern thePattern) { @@ -353,7 +699,7 @@ GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDisk (CORBA::Double * MakeDividedDiskPntVecR */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr thePnt, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, CORBA::Double theR, CORBA::Double theRatio, @@ -387,7 +733,7 @@ GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedDiskPntVecR (GEOM:: * \return New GEOM_Object, containing the created shape. */ //============================================================================= -GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedCylinder (CORBA::Double theR, +GEOM::GEOM_Object_ptr GEOM_IAdvancedOperations_i::MakeDividedCylinder (CORBA::Double theR, CORBA::Double theH, GEOM::pattern thePattern) { diff --git a/src/GEOM_I/GEOM_IAdvancedOperations_i.hh b/src/GEOM_I/GEOM_IAdvancedOperations_i.hh index fde5fcfa5..b341a9fed 100644 --- a/src/GEOM_I/GEOM_IAdvancedOperations_i.hh +++ b/src/GEOM_I/GEOM_IAdvancedOperations_i.hh @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : GEOM_IAdvancedOperations.hh // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #ifndef _GEOM_IAdvancedOperations_i_HeaderFile #define _GEOM_IAdvancedOperations_i_HeaderFile @@ -39,43 +38,91 @@ class GEOM_I_EXPORT GEOM_IAdvancedOperations_i : { public: GEOM_IAdvancedOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, - ::GEOMImpl_IAdvancedOperations* theImpl); + ::GEOMImpl_IAdvancedOperations* theImpl); ~GEOM_IAdvancedOperations_i(); - GEOM::ListOfGO* MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::ListOfGO* MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - GEOM::ListOfGO* MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh); - GEOM::ListOfGO* MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, - CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, - CORBA::Double theRF, CORBA::Boolean theHexMesh, - GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); - - GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR, - CORBA::Double theRatio, + // PipeTShape without thickness reduction + GEOM::ListOfGO* MakePipeTShape (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeChamfer (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeChamferWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeFillet (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeFilletWithPosition (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + + // PipeTShape with thickness reduction + GEOM::ListOfGO* MakePipeTShapeTR + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeTRChamfer + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRChamferWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theH, CORBA::Double theW, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + GEOM::ListOfGO* MakePipeTShapeTRFillet + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh); + GEOM::ListOfGO* MakePipeTShapeTRFilletWithPosition + (CORBA::Double theR1, CORBA::Double theW1, CORBA::Double theL1, + CORBA::Double theR2, CORBA::Double theW2, CORBA::Double theL2, + CORBA::Double theRL, CORBA::Double theWL, CORBA::Double theLtransL, CORBA::Double theLthinL, + CORBA::Double theRR, CORBA::Double theWR, CORBA::Double theLtransR, CORBA::Double theLthinR, + CORBA::Double theRI, CORBA::Double theWI, CORBA::Double theLtransI, CORBA::Double theLthinI, + CORBA::Double theRF, CORBA::Boolean theHexMesh, + GEOM::GEOM_Object_ptr theP1, GEOM::GEOM_Object_ptr theP2, GEOM::GEOM_Object_ptr theP3); + + GEOM::GEOM_Object_ptr MakeDividedDisk (CORBA::Double theR, + CORBA::Double theRatio, CORBA::Short theOrientation, GEOM::pattern thePattern); - + GEOM::GEOM_Object_ptr MakeDividedDiskPntVecR (GEOM::GEOM_Object_ptr theCenter, GEOM::GEOM_Object_ptr theVector, CORBA::Double theR, CORBA::Double theRatio, GEOM::pattern thePattern); - - GEOM::GEOM_Object_ptr MakeDividedCylinder (CORBA::Double theR, + + GEOM::GEOM_Object_ptr MakeDividedCylinder (CORBA::Double theR, CORBA::Double theH, GEOM::pattern thePattern); /*@@ insert new functions before this line @@ do not remove this line @@*/ diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index a5959bf6e..937c2b27e 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -11514,16 +11514,34 @@ class geompyDC(GEOM._objref_GEOM_Gen): # The extremity of the incident pipe is located on junction point P3. # If P1, P2 and P3 are not given, the center of the shape is (0,0,0) and # the main plane of the T-shape is XOY. + # # @param theR1 Internal radius of main pipe # @param theW1 Width of main pipe # @param theL1 Half-length of main pipe # @param theR2 Internal radius of incident pipe (R2 < R1) # @param theW2 Width of incident pipe (R2+W2 < R1+W1) # @param theL2 Half-length of incident pipe + # # @param theHexMesh Boolean indicating if shape is prepared for hex mesh (default=True) # @param theP1 1st junction point of main pipe # @param theP2 2nd junction point of main pipe # @param theP3 Junction point of incident pipe + # + # @param theRL Internal radius of left thickness reduction + # @param theWL Width of left thickness reduction + # @param theLtransL Length of left transition part + # @param theLthinL Length of left thin part + # + # @param theRR Internal radius of right thickness reduction + # @param theWR Width of right thickness reduction + # @param theLtransR Length of right transition part + # @param theLthinR Length of right thin part + # + # @param theRI Internal radius of incident thickness reduction + # @param theWI Width of incident thickness reduction + # @param theLtransI Length of incident transition part + # @param theLthinI Length of incident thin part + # # @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. @@ -11531,7 +11549,12 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return List of GEOM.GEOM_Object, containing the created shape and propagation groups. # # @ref tui_creation_pipetshape "Example" - def MakePipeTShape(self, theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh=True, theP1=None, theP2=None, theP3=None, theName=None): + def MakePipeTShape (self, theR1, theW1, theL1, theR2, theW2, theL2, + theHexMesh=True, theP1=None, theP2=None, theP3=None, + theRL=0, theWL=0, theLtransL=0, theLthinL=0, + theRR=0, theWR=0, theLtransR=0, theLthinR=0, + theRI=0, theWI=0, theLtransI=0, theLthinI=0, + theName=None): """ Create a T-shape object with specified caracteristics for the main and the incident pipes (radius, width, half-length). @@ -11540,7 +11563,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): If P1, P2 and P3 are not given, the center of the shape is (0,0,0) and the main plane of the T-shape is XOY. - Paremeters: + Parameters: theR1 Internal radius of main pipe theW1 Width of main pipe theL1 Half-length of main pipe @@ -11551,6 +11574,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): theP1 1st junction point of main pipe theP2 2nd junction point of main pipe theP3 Junction point of incident pipe + + theRL Internal radius of left thickness reduction + theWL Width of left thickness reduction + theLtransL Length of left transition part + theLthinL Length of left thin part + + theRR Internal radius of right thickness reduction + theWR Width of right thickness reduction + theLtransR Length of right transition part + theLthinR Length of right thin part + + theRI Internal radius of incident thickness reduction + theWI Width of incident thickness reduction + theLtransI Length of incident transition part + theLthinI Length of incident thin part + 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. @@ -11563,12 +11602,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): pipetshape = geompy.MakePipeTShape(80.0, 20.0, 200.0, 50.0, 20.0, 200.0) # create PipeTShape object with position pipetshape_position = geompy.MakePipeTShape(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, True, P1, P2, P3) + # create PipeTShape object with left thickness reduction + pipetshape_thr = geompy.MakePipeTShape(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, theRL=60, theWL=20, theLtransL=40, theLthinL=20) """ - theR1, theW1, theL1, theR2, theW2, theL2, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2) + theR1, theW1, theL1, theR2, theW2, theL2, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI) if (theP1 and theP2 and theP3): - anObj = self.AdvOp.MakePipeTShapeWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh, theP1, theP2, theP3) + anObj = self.AdvOp.MakePipeTShapeTRWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh, theP1, theP2, theP3) else: - anObj = self.AdvOp.MakePipeTShape(theR1, theW1, theL1, theR2, theW2, theL2, theHexMesh) + anObj = self.AdvOp.MakePipeTShapeTR(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theHexMesh) RaiseIfFailed("MakePipeTShape", self.AdvOp) if Parameters: anObj[0].SetParameters(Parameters) def_names = [ "pipeTShape" ] + [ "pipeTShape_grp_%d" % i for i in range(1, len(anObj)) ] @@ -11594,6 +11643,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theP1 1st junction point of main pipe # @param theP2 2nd junction point of main pipe # @param theP3 Junction point of incident pipe + # + # @param theRL Internal radius of left thickness reduction + # @param theWL Width of left thickness reduction + # @param theLtransL Length of left transition part + # @param theLthinL Length of left thin part + # + # @param theRR Internal radius of right thickness reduction + # @param theWR Width of right thickness reduction + # @param theLtransR Length of right transition part + # @param theLthinR Length of right thin part + # + # @param theRI Internal radius of incident thickness reduction + # @param theWI Width of incident thickness reduction + # @param theLtransI Length of incident transition part + # @param theLthinI Length of incident thin part + # # @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. @@ -11601,7 +11666,12 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return List of GEOM.GEOM_Object, containing the created shape and propagation groups. # # @ref tui_creation_pipetshape "Example" - def MakePipeTShapeChamfer(self, theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh=True, theP1=None, theP2=None, theP3=None, theName=None): + def MakePipeTShapeChamfer (self, theR1, theW1, theL1, theR2, theW2, theL2, + theH, theW, theHexMesh=True, theP1=None, theP2=None, theP3=None, + theRL=0, theWL=0, theLtransL=0, theLthinL=0, + theRR=0, theWR=0, theLtransR=0, theLthinR=0, + theRI=0, theWI=0, theLtransI=0, theLthinI=0, + theName=None): """ Create a T-shape object with chamfer and with specified caracteristics for the main and the incident pipes (radius, width, half-length). The chamfer is @@ -11611,7 +11681,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): If P1, P2 and P3 are not given, the center of the shape is (0,0,0) and the main plane of the T-shape is XOY. - Paremeters: + Parameters: theR1 Internal radius of main pipe theW1 Width of main pipe theL1 Half-length of main pipe @@ -11624,6 +11694,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): theP1 1st junction point of main pipe theP2 2nd junction point of main pipe theP3 Junction point of incident pipe + + theRL Internal radius of left thickness reduction + theWL Width of left thickness reduction + theLtransL Length of left transition part + theLthinL Length of left thin part + + theRR Internal radius of right thickness reduction + theWR Width of right thickness reduction + theLtransR Length of right transition part + theLthinR Length of right thin part + + theRI Internal radius of incident thickness reduction + theWI Width of incident thickness reduction + theLtransI Length of incident transition part + theLthinI Length of incident thin part + 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. @@ -11636,12 +11722,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): pipetshapechamfer = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0) # create PipeTShape with chamfer object with position pipetshapechamfer_position = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0, True, P1, P2, P3) + # create PipeTShape with chamfer object with left thickness reduction + pipetshapechamfer_thr = geompy.MakePipeTShapeChamfer(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 20.0, 20.0, theRL=60, theWL=20, theLtransL=40, theLthinL=20) """ - theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW) + theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI) if (theP1 and theP2 and theP3): - anObj = self.AdvOp.MakePipeTShapeChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh, theP1, theP2, theP3) + anObj = self.AdvOp.MakePipeTShapeTRChamferWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh, theP1, theP2, theP3) else: - anObj = self.AdvOp.MakePipeTShapeChamfer(theR1, theW1, theL1, theR2, theW2, theL2, theH, theW, theHexMesh) + anObj = self.AdvOp.MakePipeTShapeTRChamfer(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theH, theW, theHexMesh) RaiseIfFailed("MakePipeTShapeChamfer", self.AdvOp) if Parameters: anObj[0].SetParameters(Parameters) def_names = [ "pipeTShape" ] + [ "pipeTShape_grp_%d" % i for i in range(1, len(anObj)) ] @@ -11666,6 +11762,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theP1 1st junction point of main pipe # @param theP2 2nd junction point of main pipe # @param theP3 Junction point of incident pipe + # + # @param theRL Internal radius of left thickness reduction + # @param theWL Width of left thickness reduction + # @param theLtransL Length of left transition part + # @param theLthinL Length of left thin part + # + # @param theRR Internal radius of right thickness reduction + # @param theWR Width of right thickness reduction + # @param theLtransR Length of right transition part + # @param theLthinR Length of right thin part + # + # @param theRI Internal radius of incident thickness reduction + # @param theWI Width of incident thickness reduction + # @param theLtransI Length of incident transition part + # @param theLthinI Length of incident thin part + # # @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. @@ -11673,7 +11785,12 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @return List of GEOM.GEOM_Object, containing the created shape and propagation groups. # # @ref tui_creation_pipetshape "Example" - def MakePipeTShapeFillet(self, theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh=True, theP1=None, theP2=None, theP3=None, theName=None): + def MakePipeTShapeFillet (self, theR1, theW1, theL1, theR2, theW2, theL2, + theRF, theHexMesh=True, theP1=None, theP2=None, theP3=None, + theRL=0, theWL=0, theLtransL=0, theLthinL=0, + theRR=0, theWR=0, theLtransR=0, theLthinR=0, + theRI=0, theWI=0, theLtransI=0, theLthinI=0, + theName=None): """ Create a T-shape object with fillet and with specified caracteristics for the main and the incident pipes (radius, width, half-length). The fillet is @@ -11681,7 +11798,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): The extremities of the main pipe are located on junctions points P1 and P2. The extremity of the incident pipe is located on junction point P3. - Paremeters: + Parameters: If P1, P2 and P3 are not given, the center of the shape is (0,0,0) and the main plane of the T-shape is XOY. theR1 Internal radius of main pipe @@ -11695,6 +11812,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): theP1 1st junction point of main pipe theP2 2nd junction point of main pipe theP3 Junction point of incident pipe + + theRL Internal radius of left thickness reduction + theWL Width of left thickness reduction + theLtransL Length of left transition part + theLthinL Length of left thin part + + theRR Internal radius of right thickness reduction + theWR Width of right thickness reduction + theLtransR Length of right transition part + theLthinR Length of right thin part + + theRI Internal radius of incident thickness reduction + theWI Width of incident thickness reduction + theLtransI Length of incident transition part + theLthinI Length of incident thin part + 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. @@ -11707,13 +11840,22 @@ class geompyDC(GEOM._objref_GEOM_Gen): pipetshapefillet = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 5.0) # create PipeTShape with fillet object with position pipetshapefillet_position = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 5.0, True, P1, P2, P3) - + # create PipeTShape with fillet object with left thickness reduction + pipetshapefillet_thr = geompy.MakePipeTShapeFillet(80.0, 20.0, 200.0, 50.0, 20.0, 200.0, 5.0, theRL=60, theWL=20, theLtransL=40, theLthinL=20) """ - theR1, theW1, theL1, theR2, theW2, theL2, theRF, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2, theRF) + theR1, theW1, theL1, theR2, theW2, theL2, theRF, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI, Parameters = ParseParameters(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theRL, theWL, theLtransL, theLthinL, theRR, theWR, theLtransR, theLthinR, theRI, theWI, theLtransI, theLthinI) if (theP1 and theP2 and theP3): - anObj = self.AdvOp.MakePipeTShapeFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh, theP1, theP2, theP3) + anObj = self.AdvOp.MakePipeTShapeTRFilletWithPosition(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh, theP1, theP2, theP3) else: - anObj = self.AdvOp.MakePipeTShapeFillet(theR1, theW1, theL1, theR2, theW2, theL2, theRF, theHexMesh) + anObj = self.AdvOp.MakePipeTShapeTRFillet(theR1, theW1, theL1, theR2, theW2, theL2, + theRL, theWL, theLtransL, theLthinL, + theRR, theWR, theLtransR, theLthinR, + theRI, theWI, theLtransI, theLthinI, + theRF, theHexMesh) RaiseIfFailed("MakePipeTShapeFillet", self.AdvOp) if Parameters: anObj[0].SetParameters(Parameters) def_names = [ "pipeTShape" ] + [ "pipeTShape_grp_%d" % i for i in range(1, len(anObj)) ] @@ -11847,7 +11989,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): """ Create a copy of the given object - Paremeters: + Parameters: theOriginal geometry object for copy theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic -- 2.39.2