From a283b389c811dd9e363f9505e943456b1cbb253a Mon Sep 17 00:00:00 2001 From: abd Date: Wed, 18 Apr 2007 15:44:19 +0000 Subject: [PATCH] Merging from V3_2_6pre4 --- configure.ac | 1 - doc/salome/gui/GEOM/arc.htm | 174 +++- doc/salome/gui/GEOM/geom.log | 7 +- doc/salome/gui/GEOM/image2.jpg | Bin 0 -> 13387 bytes doc/salome/gui/GEOM/image34.gif | Bin 0 -> 1825 bytes doc/salome/gui/GEOM/image36.gif | Bin 0 -> 2979 bytes doc/salome/gui/GEOM/image47.gif | Bin 0 -> 2937 bytes doc/salome/gui/GEOM/occ_viewer.htm | 258 ----- doc/salome/gui/GEOM/pics/arc2.png | Bin 0 -> 16382 bytes doc/salome/gui/GEOM/pics/arcsn1.png | Bin 0 -> 2245 bytes doc/salome/gui/GEOM/pics/arcsn2.png | Bin 0 -> 2415 bytes doc/salome/gui/GEOM/pics/clipping.png | Bin 12933 -> 0 bytes doc/salome/gui/GEOM/pics/image100.gif | Bin 1040 -> 0 bytes doc/salome/gui/GEOM/pics/image102.gif | Bin 2409 -> 0 bytes doc/salome/gui/GEOM/pics/image103.gif | Bin 1046 -> 0 bytes doc/salome/gui/GEOM/pics/image105.gif | Bin 1038 -> 0 bytes doc/salome/gui/GEOM/pics/image106.gif | Bin 984 -> 0 bytes doc/salome/gui/GEOM/pics/image77.gif | Bin 1022 -> 0 bytes doc/salome/gui/GEOM/pics/image86.gif | Bin 1017 -> 0 bytes doc/salome/gui/GEOM/pics/image88.gif | Bin 1000 -> 0 bytes doc/salome/gui/GEOM/pics/image89.gif | Bin 1020 -> 0 bytes doc/salome/gui/GEOM/pics/image91.gif | Bin 1010 -> 0 bytes doc/salome/gui/GEOM/pics/image95.gif | Bin 2711 -> 0 bytes doc/salome/gui/GEOM/pics/image96.gif | Bin 1055 -> 0 bytes doc/salome/gui/GEOM/pics/image97.gif | Bin 1065 -> 0 bytes doc/salome/gui/GEOM/pics/image98.gif | Bin 1047 -> 0 bytes doc/salome/gui/GEOM/pics/image99.gif | Bin 1035 -> 0 bytes .../GEOM/pics/set_rotation_point_dialog1.png | Bin 11693 -> 0 bytes .../GEOM/pics/set_rotation_point_dialog2.png | Bin 11232 -> 0 bytes .../gui/GEOM/pics/view_rotation_point.png | Bin 293 -> 0 bytes doc/salome/gui/GEOM/pics/workplane4.png | Bin 11943 -> 13415 bytes doc/salome/gui/GEOM/pics/workplane5.png | Bin 12268 -> 14474 bytes doc/salome/gui/GEOM/pics/workplane6.png | Bin 11761 -> 14331 bytes doc/salome/gui/GEOM/vector.htm | 5 +- .../gui/GEOM/viewing_geometrical_objects.htm | 32 +- doc/salome/gui/GEOM/whdata/whfwdata0.htm | 164 ++-- doc/salome/gui/GEOM/whdata/whtdata0.htm | 9 +- doc/salome/gui/GEOM/whxdata/whfwdata0.xml | 164 ++-- doc/salome/gui/GEOM/whxdata/whtdata0.xml | 3 +- doc/salome/gui/GEOM/working_plane.htm | 72 +- idl/GEOM_Gen.idl | 119 ++- idl/GEOM_Superv.idl | 18 +- resources/GEOMCatalog.xml.in | 36 + resources/ImportExport | 14 +- resources/Makefile.am | 4 +- resources/arccenter.png | Bin 0 -> 485 bytes resources/glue2.png | Bin 0 -> 410 bytes src/BasicGUI/BasicGUI_ArcDlg.cxx | 218 ++++- src/BasicGUI/BasicGUI_ArcDlg.h | 8 +- src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx | 252 +++-- src/BasicGUI/BasicGUI_WorkingPlaneDlg.h | 7 + src/DlgRef/DlgRef_3Sel1Check_QTD.cxx | 127 +++ src/DlgRef/DlgRef_3Sel1Check_QTD.h | 56 ++ src/DlgRef/Makefile.am | 7 +- src/DlgRef/UIFiles/DlgRef_3Sel1Check_QTD.ui | 210 ++++ src/EntityGUI/EntityGUI_SketcherDlg.cxx | 28 +- src/EntityGUI/EntityGUI_SketcherDlg.h | 4 +- src/EntityGUI/EntityGUI_SubShapeDlg.cxx | 2 +- src/GEOMAlgo/GEOMAlgo.cdl | 98 +- src/GEOMAlgo/GEOMAlgo_Builder.cdl | 9 +- src/GEOMAlgo/GEOMAlgo_Builder.cxx | 24 +- src/GEOMAlgo/GEOMAlgo_Builder.hxx | 5 + src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx | 137 +-- src/GEOMAlgo/GEOMAlgo_ClsfSolid.cdl | 59 ++ src/GEOMAlgo/GEOMAlgo_ClsfSolid.cxx | 139 +++ src/GEOMAlgo/GEOMAlgo_ClsfSolid.hxx | 106 +++ src/GEOMAlgo/GEOMAlgo_ClsfSolid.ixx | 74 ++ src/GEOMAlgo/GEOMAlgo_ClsfSolid.jxx | 25 + ...apIteratorOfDataMapOfPassKeyShapeShape.hxx | 113 +++ ...IteratorOfDataMapOfPassKeyShapeShape_0.cxx | 57 ++ ...ataMapNodeOfDataMapOfPassKeyShapeShape.hxx | 132 +++ ...aMapNodeOfDataMapOfPassKeyShapeShape_0.cxx | 103 ++ .../GEOMAlgo_DataMapOfPassKeyShapeShape.hxx | 155 +++ .../GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx | 60 ++ src/GEOMAlgo/GEOMAlgo_Gluer.cxx | 161 ++-- src/GEOMAlgo/GEOMAlgo_Gluer1.cdl | 71 ++ src/GEOMAlgo/GEOMAlgo_Gluer1.cxx | 542 +++++++++++ src/GEOMAlgo/GEOMAlgo_Gluer1.hxx | 125 +++ src/GEOMAlgo/GEOMAlgo_Gluer1.ixx | 24 + src/GEOMAlgo/GEOMAlgo_Gluer1.jxx | 25 + ...apNodeOfIndexedDataMapOfShapeShapeInfo.hxx | 139 +++ ...NodeOfIndexedDataMapOfShapeShapeInfo_0.cxx | 100 ++ ...EOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx | 172 ++++ ...MAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx | 60 ++ src/GEOMAlgo/GEOMAlgo_KindOfBounds.hxx | 37 + src/GEOMAlgo/GEOMAlgo_KindOfClosed.hxx | 37 + src/GEOMAlgo/GEOMAlgo_KindOfName.hxx | 54 ++ src/GEOMAlgo/GEOMAlgo_KindOfShape.hxx | 45 + src/GEOMAlgo/GEOMAlgo_ShapeInfo.cdl | 190 ++++ src/GEOMAlgo/GEOMAlgo_ShapeInfo.cxx | 871 +++++++++++++++++ src/GEOMAlgo/GEOMAlgo_ShapeInfo.hxx | 272 ++++++ src/GEOMAlgo/GEOMAlgo_ShapeInfo.ixx | 26 + src/GEOMAlgo/GEOMAlgo_ShapeInfo.jxx | 15 + src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cdl | 132 +++ src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx | 792 ++++++++++++++++ src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.hxx | 186 ++++ src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.ixx | 26 + src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.jxx | 30 + src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller_1.cxx | 738 +++++++++++++++ src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx | 17 +- src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx | 53 +- src/GEOMAlgo/Handle_GEOMAlgo_ClsfSolid.hxx | 72 ++ ...ataMapNodeOfDataMapOfPassKeyShapeShape.hxx | 72 ++ ...apNodeOfIndexedDataMapOfShapeShapeInfo.hxx | 74 ++ src/GEOMAlgo/Makefile.am | 39 +- src/GEOMBase/GEOMBase_Helper.cxx | 103 +- src/GEOMBase/GEOMBase_Helper.h | 11 +- src/GEOMBase/GEOMBase_Skeleton.h | 2 +- src/GEOMGUI/GEOMGUI_OCCSelector.cxx | 14 +- src/GEOMGUI/GEOMGUI_Selection.cxx | 26 +- src/GEOMGUI/GEOMGUI_Selection.h | 1 + src/GEOMGUI/GEOM_Displayer.cxx | 83 +- src/GEOMGUI/GEOM_Displayer.h | 58 +- src/GEOMGUI/GEOM_images.po | 28 + src/GEOMGUI/GEOM_msg_en.po | 110 +++ src/GEOMGUI/GeometryGUI.cxx | 105 ++ src/GEOMGUI/GeometryGUI.h | 4 +- src/GEOMImpl/GEOMImpl_ArcDriver.cxx | 37 +- src/GEOMImpl/GEOMImpl_BooleanDriver.cxx | 76 ++ src/GEOMImpl/GEOMImpl_GlueDriver.cxx | 90 +- src/GEOMImpl/GEOMImpl_GlueDriver.hxx | 7 + src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 174 +++- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 19 +- src/GEOMImpl/GEOMImpl_IArc.hxx | 5 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 69 +- src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 5 + src/GEOMImpl/GEOMImpl_IGlue.hxx | 9 + src/GEOMImpl/GEOMImpl_IInsertOperations.cxx | 113 ++- src/GEOMImpl/GEOMImpl_IInsertOperations.hxx | 1 + src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 636 ++++++++++++- src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 45 + src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx | 6 +- src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx | 55 ++ src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 168 ++++ src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 68 +- src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 894 +++++++++++++++++- src/GEOMImpl/GEOMImpl_PipeDriver.hxx | 32 +- src/GEOMImpl/GEOMImpl_Types.hxx | 3 + src/GEOMImpl/Makefile.am | 6 +- src/GEOMToolsGUI/GEOMToolsGUI.cxx | 57 +- src/GEOMToolsGUI/GEOMToolsGUI.h | 4 +- src/GEOMToolsGUI/GEOMToolsGUI_1.cxx | 15 + src/GEOMToolsGUI/Makefile.am | 1 + src/GEOM_I/GEOM_Gen_i.cc | 28 +- src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 77 ++ src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 7 + src/GEOM_I/GEOM_ICurvesOperations_i.cc | 37 + src/GEOM_I/GEOM_ICurvesOperations_i.hh | 7 +- src/GEOM_I/GEOM_IMeasureOperations_i.cc | 46 + src/GEOM_I/GEOM_IMeasureOperations_i.hh | 4 + src/GEOM_I/GEOM_IShapesOperations_i.cc | 86 ++ src/GEOM_I/GEOM_IShapesOperations_i.hh | 7 + src/GEOM_I/GEOM_Object_i.cc | 4 +- src/GEOM_I/GEOM_Object_i.hh | 2 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 85 +- src/GEOM_I_Superv/GEOM_Superv_i.hh | 18 +- src/GEOM_SWIG/GEOM_TestAll.py | 1 + src/GEOM_SWIG/GEOM_TestMeasures.py | 18 + src/GEOM_SWIG/GEOM_shared_modules.py | 4 +- src/GEOM_SWIG/geompy.py | 152 +++ src/NMTDS/NMTDS_ShapesDataStructure.cxx | 44 +- src/NMTTools/NMTTools_DEProcessor.cxx | 12 +- src/NMTTools/NMTTools_PaveFiller_4.cxx | 373 +++++++- src/NMTTools/NMTTools_PaveFiller_6.cxx | 147 ++- src/NMTTools/NMTTools_PaveFiller_7.cxx | 30 + src/OBJECT/GEOM_AISShape.cxx | 14 +- src/OBJECT/GEOM_AISShape.hxx | 28 +- src/OBJECT/GEOM_AISVector.cxx | 91 ++ src/OBJECT/GEOM_AISVector.hxx | 63 ++ src/OBJECT/GEOM_Actor.cxx | 11 +- src/OBJECT/GEOM_Actor.h | 6 +- src/OBJECT/GEOM_AssemblyBuilder.cxx | 18 +- src/OBJECT/GEOM_AssemblyBuilder.h | 3 +- src/OBJECT/GEOM_OCCReader.cxx | 98 +- src/OBJECT/GEOM_OCCReader.h | 3 +- src/OBJECT/Makefile.am | 4 +- src/RepairGUI/RepairGUI_GlueDlg.cxx | 521 ++++++++-- src/RepairGUI/RepairGUI_GlueDlg.h | 36 +- 178 files changed, 12493 insertions(+), 1224 deletions(-) create mode 100755 doc/salome/gui/GEOM/image2.jpg create mode 100755 doc/salome/gui/GEOM/image34.gif create mode 100755 doc/salome/gui/GEOM/image36.gif create mode 100755 doc/salome/gui/GEOM/image47.gif delete mode 100755 doc/salome/gui/GEOM/occ_viewer.htm create mode 100644 doc/salome/gui/GEOM/pics/arc2.png create mode 100644 doc/salome/gui/GEOM/pics/arcsn1.png create mode 100644 doc/salome/gui/GEOM/pics/arcsn2.png delete mode 100755 doc/salome/gui/GEOM/pics/clipping.png delete mode 100755 doc/salome/gui/GEOM/pics/image100.gif delete mode 100755 doc/salome/gui/GEOM/pics/image102.gif delete mode 100755 doc/salome/gui/GEOM/pics/image103.gif delete mode 100755 doc/salome/gui/GEOM/pics/image105.gif delete mode 100755 doc/salome/gui/GEOM/pics/image106.gif delete mode 100755 doc/salome/gui/GEOM/pics/image77.gif delete mode 100755 doc/salome/gui/GEOM/pics/image86.gif delete mode 100755 doc/salome/gui/GEOM/pics/image88.gif delete mode 100755 doc/salome/gui/GEOM/pics/image89.gif delete mode 100755 doc/salome/gui/GEOM/pics/image91.gif delete mode 100755 doc/salome/gui/GEOM/pics/image95.gif delete mode 100755 doc/salome/gui/GEOM/pics/image96.gif delete mode 100755 doc/salome/gui/GEOM/pics/image97.gif delete mode 100755 doc/salome/gui/GEOM/pics/image98.gif delete mode 100755 doc/salome/gui/GEOM/pics/image99.gif delete mode 100644 doc/salome/gui/GEOM/pics/set_rotation_point_dialog1.png delete mode 100644 doc/salome/gui/GEOM/pics/set_rotation_point_dialog2.png delete mode 100644 doc/salome/gui/GEOM/pics/view_rotation_point.png create mode 100644 resources/arccenter.png create mode 100644 resources/glue2.png create mode 100644 src/DlgRef/DlgRef_3Sel1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Sel1Check_QTD.h create mode 100644 src/DlgRef/UIFiles/DlgRef_3Sel1Check_QTD.ui create mode 100755 src/GEOMAlgo/GEOMAlgo_ClsfSolid.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_ClsfSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ClsfSolid.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ClsfSolid.ixx create mode 100644 src/GEOMAlgo/GEOMAlgo_ClsfSolid.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_0.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_0.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx create mode 100755 src/GEOMAlgo/GEOMAlgo_Gluer1.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_Gluer1.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Gluer1.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Gluer1.ixx create mode 100644 src/GEOMAlgo/GEOMAlgo_Gluer1.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_0.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_KindOfBounds.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_KindOfClosed.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_KindOfName.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_KindOfShape.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfo.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfo.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfo.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfo.ixx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfo.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.ixx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller_1.cxx create mode 100644 src/GEOMAlgo/Handle_GEOMAlgo_ClsfSolid.hxx create mode 100644 src/GEOMAlgo/Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx create mode 100644 src/GEOMAlgo/Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx create mode 100644 src/OBJECT/GEOM_AISVector.cxx create mode 100644 src/OBJECT/GEOM_AISVector.hxx diff --git a/configure.ac b/configure.ac index c5b8a5b74..90b44741a 100644 --- a/configure.ac +++ b/configure.ac @@ -350,7 +350,6 @@ echo AC_OUTPUT_COMMANDS([ \ chmod +x ./bin/*; \ - chmod +x ./bin/salome/*; \ ]) # This list is initiated using autoscan and must be updated manually diff --git a/doc/salome/gui/GEOM/arc.htm b/doc/salome/gui/GEOM/arc.htm index 3b8691125..cdf4570ad 100755 --- a/doc/salome/gui/GEOM/arc.htm +++ b/doc/salome/gui/GEOM/arc.htm @@ -16,14 +16,53 @@ if (navigator.appName !="Netscape") - + - - - - - - - - - - -

OCC 3D Viewer

- -

OCC (Open CasCade) 3D viewer - has been developed on the basis of Open CASCADE Technology. This is the - default viewer for Geometry Module, providing good representation of construction - and transformation of geometrical objects. Only this viewer allows to - work with groups and sub-shapes. This viewer can also work in Mesh module, - however, it doesn't allow to visualize meshes.

- -

 

- -

The functions of OCC viewer are available via its Viewer Toolbar. Buttons - marked with small downward triangles have extended functionality which - can be accessed by locking on them with left mouse button.  

- -

 

- -

- -

 

- - - - - -

- -

 

- -

By default the rotation point is located - in the Center of the bounding box of an object.

- -

 

- -

- -

 

- -

Unchecking Use - Bounding Box Center box allows you to define the coordinates of - the rotation point manually.

- -

 

- -

Set to Origin - button restores the default rotation point coordinates.

- -

Select Point - from View button allows to select the rotation point in the 3D - Viewer

- -

 

- - - -

 

- -

- -

 

- - - -

 

- - - - diff --git a/doc/salome/gui/GEOM/pics/arc2.png b/doc/salome/gui/GEOM/pics/arc2.png new file mode 100644 index 0000000000000000000000000000000000000000..2bced2ae0eb7370d081b1ea8eab4b4a8c9600e4f GIT binary patch literal 16382 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

0h7z!HJ1y6uNa^R3s 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 R@VS17vVw+u(IbnO{}0#hW|jZ| literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/arcsn1.png b/doc/salome/gui/GEOM/pics/arcsn1.png new file mode 100644 index 0000000000000000000000000000000000000000..564f12edf0277bfb41fc5c5b34e469612c2ea82c GIT binary patch literal 2245 zcmaJ@dpOkF8lFflB_zhRnVMWn(?lj=X1nK3N(v*lA{jJ=VK%vs+}gQ}vMY8+w&NNx zsqu4Za!q4r$G8ld=z_s-Waj4}XLQb==Q+>wK5Kp7yWV#_-?P?wo^NHkx!B3dsL8-! zFj@OE)@McY-!RyYy;5SLD1lhp0E02s{p!=fUt95wi&%#%d>#w_Acftao`H~VcGAZ6S=}{{yxDC9tXYKx?bVpt z+7xX3ILNOmlcZfj+9CmZMfZ2t=h?lI80Jqjed?#jU0+x0o=H*RzBX2#KqGO~gE(rX z+SICailJS9&?2uhd z^tcs8#Uo%^iS`d| zrYqC-Qja7>$Ya`n7k7cs15;g`a|DH%@mF}~q@I7mr zEAieUuj0rU4sA!dXRKEz{K!j>98+p+U@%NbyNTA66Uwxa5)x|(p>BR?2UF)VkxWE;g%Q_+C?8x zm@*@igXsIffv)y(8E{}w)9*m1_-J?&{Dant^q?-1Tp9)9!>&CYJH;EJ32C8yic@=Ff#- zaeI}ym$DW#7aI?cEA4TvP;~wGQ=?DMO8c3m?810~d#K`PNW& z#4u?>&-D%+Vo$1ab%5YejG(z;`pG+UCOvk{{n61C&>%q?HJfRuffzTPcj}_!OuHtv zUqU;gtfpK>w??xfHoYa>COrjh=EC9Cq?B93s_I~Pv1XvF91jdP<>|UAeE>lhxAeE1 zWr-%RkUfbJJa>otm3c_a>it6(x3{t8uYG=h@k9olHON8Etk1*o1a5e=EA!2TFDGOI zT@CNYXmcJC@CfS!!~JCTL#Aiz;{3tXdb9wh65nUv1y^#o%m1FAXtligtpV>FkQ{Pn zW5&@~BPrWlai(rX3-ju|y2aPB5dQ4&;U0FQWdaLJ&AGh0zy%0elnPo<{lgpx2}mxu zn)Qcxx752s$3}}OEsOL1_4uwwCJu5MD6U0nBUN0W?RT%PGuu3C!5K*H#|*3HqQ@Q| zX-U%G+5 zpd2UIUlsXljVq9P{soS^E?X7p+*QQ6#`3zNR9jjzPZ^4`sTXt1cb!X9qZ7~>h3pkh zw{5+A5y##u&GC5S!W=p3urx6(IL5eEiuk5$X2?)*BfDKBGw8OB)Z%()?Su!i=(5Ji zyH(gL-zJthol?K&2FCVa^$N}Zi3Ki&TB<{nbDLhe& zU6R<`kadcuc2`Kl!dY!#wf-$yfGpQgJ5A*XB|dIrzJChTiGoxe?n2cLO3|Wb;GYN- zdy_L+45PU{0}QITBvT&oUxZ}m#fRk#svy+LFu>+olPPcpFSEY_gELBokm>&mwxN`X znUJLS(4ZJs)UuYhe!zD7uMm#C@KZM5~bWWEqT?v~HH3EFlY2ix+gQHU1c@*uM*~EC7`+qw5{~xz@ ZxQ{vOvx+=;qVEaJ-p0kc*79=lzXANZX;J_H literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/arcsn2.png b/doc/salome/gui/GEOM/pics/arcsn2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bec5d298ec0aa5e257fe49b65fc3392182acbf GIT binary patch literal 2415 zcma)8dsLEJ7S~)oZdAFKS<_;}&<^z?Di+`483o%Qhyx-zea*LJ-2b@RZE4<>ir^#VE^CS%oh%>`1Mzh&*df7j8m6iiZlo> zyo-?5tH1pZo?2gTOQ2gEE4{-LEW9W)hXDtT2vlq7hET5QqkumPEY_;^_xo$8^6R$G zCRMc+QmhgGQp=tp!>{qKE(*pqb0(=F^n&PX+Tq`;nP(htjJz)l+lv7Dg{xrM!LX5P zrfwd;Sk1}hrwkLSw)~VY0)i4FLC4xjI~}W_EX1wge!~a(ur6BIBjlya>?JAMl+k^U zdCZ-^T;#*o_I$pYP7M{HlovyN&0y9$);Rkast^|IT>cPxHKIDxr+zbrgwNiB({808`&XA*k6C;WZh~J-GDV+W zk4q%*-^E?e*6IX<^ujALm)XIv2-PWXu&qU4$v`r~8xr9m6TU@AFhFA@eo=}H2}KPb z1n>C=H(8@$Q=_miPVOdZzL}_^7zuD&ilaU^jaDfyFK+gL3nEnA4_?`$q>;}ZCCRkg zKUt)N-BCL+NgH6bPEZajq_v#oPl(E)W6iBLr~@>f$SMm$1xA^Q28qL!f}AwQ3`?D4 zGBNK5G9<3yVdMu?nJtUhen$<5!Yzim?o!v4k1O(_W-w(|%u- z#U)n~?K>iy#EIy>Rzzo#@Q`H*8`v`Om@|Kzb^(|ye{48VN4y2J9;fXCMk`+|LNUkF zWvz(Vp*o^W7^<=(fJiFQVDR)+tZn_)DZ8VfH?ldlP?m-zIU}a*yus2>zvMkla*<3( z)w%9pY9o~M)xN5}SZG%UvRZD$R19pM>I;N+8E|i8rUo{Nqc{0OxxMkE2k0&c(&4&_ zhc1I)13bfl$>ut(_LI0EYCkO3UB-)0=HI7F@6u&I_eC3&Kp-aJZn^He2kYj%r>05C z+CBt@#lh3Ufbd4)*xtmDiT3(52nqApc{sKUqKH_}L5xc4h$j!sKq=f}`k!8LUY+%~ zTDgxUEB-Le6FPr+7}os=KSKGs#_8MT2-;U?)dV-uu_<5`qAO|0HI<%eT_cy6B4-oT zAqtdk=5x;#^oj`8i3jMHJ>Vk)xyRJDO2)L&;6R}2VY51K9K+>HV>^9y!_XUthIHR+ zPFlPs#~f!UU#~ve0UxzQ0IGTKkBwOOdLFql zqj4}x_3(F%#9vrE&MF1tH4pU>J25Bn9qO@QbVonU4o|xR;2d#dmoV=4hfpRHt4?gs zW#06cA};L%O{^EVI=4vpv4>Pi*iBI6h)Ww=uRbYIcNV(1L>Mo;NfN5}{KkuxO7G5m zW8z>?g@}-%`u5!`U}mNUY2p?&xncI@Vax$2+sZf}_sklI(%|*&3m=8h5kh~&srs_O zq9Bs7)vNUJ{D3Uu*<-fhD!YGz8+(YX3p~+r0GFbmAF}~X?2kiq=jtExL|lk&Z(cVK z?Z!{GZA}_~KinbE9-UpC_T06w3Zk=-ID|7CK%EgK#InuU)#S>h?QDv5BDk^Y`S6=( zmiQsWrR4@T#U={^fqSd?cnz$Fc0iRJsM)3T9eP8a4$xSwTf$C|TBA0gFA(dc6$iH)BPNR{BXFI77kt#nf*(nY8a$U#-`)Ogx zGU3#C*O?b}o?z0Wo3^b!QCDR{B;Dc0@3t?WYG&4mDQtU+moATvvr?EGnOl} zU3q*zu+4OpCg+{4`N9DCK3Olf4DZpYY0ka|nx*4yTc46)%8YEy?8t@e5^yu zk2z28+NJMwju@h&52+E6M5hq<2eHFD2h-D|R)Y8=3S7b$!3{OIDhmpG_pp0QB zaMaeR*JPq9;!c9uO|dISt?y5#ikGqpW>=!cZc@}5=A1b|!YPmWfTsPfA%R(pRPj2( zblz3anx#e=k6Tx%IVR&ZK45`;cPLXf8gt{YxTjXIHf1qLqj#?0Proe7@X5gb;;A@H R2=tNC!yLkT)p;I2|8K=I7RCSo literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/clipping.png b/doc/salome/gui/GEOM/pics/clipping.png deleted file mode 100755 index 6d738558ef738fb4d486114723a367e9821e145e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12933 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≦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 diff --git a/doc/salome/gui/GEOM/pics/image103.gif b/doc/salome/gui/GEOM/pics/image103.gif deleted file mode 100755 index be534c39ed6e4fcb2c89d35d36d61fe594218977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1046 zcmZ?wbh9u|lwy!z_|5d-onYcI@80d(WRg zfB*jd_wV2T|7Z9Q#G_y|1cp%v=z#nJ$_oq}zZv8?WNs{2;K;@ytQT=2;NXFFHhwji z6B`~LZe(O)Us&o|{w7Phx74yWlxxxhEs1kVb0M#ut}YFmTCOJa9-1Zgk5PyKw5OdeeNqRhxLM z%3d=vaLPz%Bs^H&$jqH-XJIhyO(UCaVOFVu*?Z^h(aKCKtP>orF|lw-?E9gRbZ`wH zn+Su#^mk9Xr!nTc{SJPe-Z9NwN}*vU10(Zt&Zx8klh+L=HnO&*9hhF4e0D>4(7oP- ky!f>oMd9<#G8|-l%r;5;zHP|cf@dMRas3@d=?)Cm0A1#YBme*a diff --git a/doc/salome/gui/GEOM/pics/image105.gif b/doc/salome/gui/GEOM/pics/image105.gif deleted file mode 100755 index 4f6173f828f6a0cc9c921e2241ad06185d1d8f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1038 zcmZ?wbh9u|lwy!%_|5OSa6V)Ls%=~gu%fB?QHyNE+;lT zbZ!!q^jQ)S*m$^`Pb%fkjs=U|C-4TzdE9JRaY<8Ry z84e8x&h;6vGVRcGU}#vx+@s}E^)Zu~k%i&HmdY(jLG1opH>s>DUUhwyH+zJv!2*Zy z?u=Tyvs&Br76my!9W5G3^O~x diff --git a/doc/salome/gui/GEOM/pics/image106.gif b/doc/salome/gui/GEOM/pics/image106.gif deleted file mode 100755 index 2bbcb4d94f3cc0890a91aac9e669445ba6907579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 984 zcmZ?wbh9u|lx2`&_|5utp~0;~#{{8#!K=A+j|NjjCfp`>*hQJUE0UeN=L3x3J<1vFi zhm6OD1qYisgtcN$Y*=`>T|n6@CSu{DqurvyDhEz%WNPhKaFkk5u)wjAnVqX8=H#S9 zO-yV&bEae}ENx`hjg;GPp!i@TyN&LQlm`sy=lYpA1SA*^9%5L^!om~a@a2U&0~41< ztLB32Fcxm9h@}l*Ra%&t_tf!PZ+pW$C2+48gZ8zon=>&-kkn#8!pM*}pgoaH`tP3PfDhg(PWM=1;$OyZ;p!DLUrT*p> hyt}u(y}d))`^MSb+uz^cr_3Smw`a%4M~sXN)&K>ViW2|; diff --git a/doc/salome/gui/GEOM/pics/image86.gif b/doc/salome/gui/GEOM/pics/image86.gif deleted file mode 100755 index 339733193ef3faf4e1ff413ba156f244f33f5502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmZ?wbh9u|lwpu%_|5$6Dudv zACr|^)Pv`9&SPTjn)r%gwe#GxyI$L#g)d4J_cP_b_QGuv7xRj(H@7Ws*v&M@iTA+t z^@pZ~@p8!7EZA_PwdnsXnKcO;k`E?rot66MhT++EUCr>e9+SsO2Yb!Ak9qIILrGiT1yrAybYUAuMb*1dc89y@mIIS{;m{{H>@??CYX z`~Uw8|ABZEjE2DQ3IQFEcR+c8f#WQLEQgH8h6M+kIfS)hPHb3sxLrWltfON?qboC; zOvIdy36015YpwZklc&&M@O^xUw0u+|{&u8E;;ZSHu zzrg6q`6ouJ_&~s9wx($+7ba^4EN5IGW>9&lA#{NgtAIj5LQ3PR_+&QL4IAH{+LF~Q zwpa7YGtV6c>96K?URf4CpNolGY)@!IA_Jq4v+S828yhFZd-qfBsR6N$$N;* zP+)B87T{%C5%JN%t%<=btmQ!A!sf~9&a2kEP;m6_)=0L>aG1Qzi-9-9%wxmm1B@&} z*<5QY7dV`lV_Eo)$7)Mv;8G8BubKb`$IA;j7AT#K3~V^R+IgW}$1DX01}3%xT&xF7 zULIqJ<6n_$5So2r6C+y)>+NqVZf`1_Z6x7SVZgLl`|K;%fE^njFJg9@)%$vfQ6h^! zJBL8Sw2e=X@pCY1crEyxenCiIS|j1W=a+{T>dXK5xog{7)*Z#K@13pQ-gN&!Gq=3n KpT&n77_0&5X@{Et diff --git a/doc/salome/gui/GEOM/pics/image91.gif b/doc/salome/gui/GEOM/pics/image91.gif deleted file mode 100755 index 9e93c1c720f198df9a35fa5f0cc90246341a5d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010 zcmZ?wbh9u|lwy!#_|5d-onYcI-J2ynp`w z{rm4g@c;Y&{|x_ucod9=z;Fox9gs&rd4YlBI)fsIjK_ur2b(#BwPH?eSm@lwFQ-=H zAjo*MLr9UqjWIKpPcU2 zWLuHL@Hure6O)DA1ItghH_Ho7i90*%VAJ&t$*1S(MmN5_y`%W`xw(dk4h+@+U?hNy diff --git a/doc/salome/gui/GEOM/pics/image95.gif b/doc/salome/gui/GEOM/pics/image95.gif deleted file mode 100755 index fb293e23475a5b23151773b875982f47d76a505c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2711 zcmeH``#;kQ1INE(HerlbhPmgM+j)$_a%hx$TQk?qHFBpTmm*F!krg>AWpbNg=9Wt% zDV|M{Rw~Iba!tZXJwmlEdz{zvPdq=I_v`a|eSZDCKCjQm#m(8q`ZyM(4txgwM-Gq! zz~OLRU0ngrlrS~@#BdwY8a2M2{h z;mpj;@(v%CKYaM`c?Zd72>?hWJKFJo_@{yY_XbS=4*2&M09grOD~ob%WAe|-?luk_ zYO8*b2iJEmcWq}42Xd4q&6Yc_^3?4HbD|1o z;9BHr6-DAY8xe{3x>(cq(n<*XMdr)+dKAlk+8y3B-zcxH5-b~fJ~TJz-;HkqxY8lO z?tMq700;-(b;QWBk_U2J=_#=7)|8)1fR4+7<}Qbp^k+|Xs}ALUR9hgvh=Pe_P+!`^ z8l|Ll6p9%03loJJ+ksy*-VRO!_|EcQ1Ea<;6UP}^VA@67mg68bq_l{=hX zmVF+|)eQUf2QOu1qdC_vkf7w68|dq8W==~MJB~YcAzWS6nTLSSvDY`;y~hT6vo}vS6WLdQ5S0X%&-K4fMfj%k#7x3 zGJDMC0I=&SQj4Zc&(pp{v@_5K{G1#3-bmwd8e$GTb2`)kk~l~{UY^o_ z5eJdOB~qp2P{ie`l&cXDgi^8^h)I>w0f9}N+sO0|H)?bR>cpS{6jlHg)t>6PjwUCD z9gGQ3qq;jl5OdIJ4gz?w?_|eaN$k|Ma-o|(8l0(#Q9{3*Dgn!w1vOy`7VxDz>OKwkFzc2RG z?NfTT><&LCdGt`$ULvoj(4onKHQK*2)_Kj?yjWTe@DqU=g=bfKRbC*&23NbRE9ra- zfeGt1Y#@S8gALH`Q@5w$n7aZlqxrkEO{a)T^fJyX(i7vRYb%7O5u>4AnrLt9D}E7_ z!x)d`A&rza8la~wd5B`6$H`Rw^S4|JCMF=mnh8dR;y`;6iPS|1oQPvTD5PLsfRnpg zMcY?OT3JfOBBRmT_Oz4<2S04ENTD@ujo%5;eAknNq0Vwn*tSefs;J^?^7mxO&?fxX zE>+d&Y(o(vsSqt5B>hjUMQN^4+Q!1#vyyA!Ga9If91H`fELTApVDJY zD;l7U$uSv^Siv)5-(TQ*v56966rlLoaN}_^<>J9ADdU}ew6*@h52r+Fy|apHX)!DH z6s1X0qWMXs&SuI0Rl2ByJ265y4YgGJpfF)KX^J~jx;7?_Wok^B8s$CIW8@b}?Z;tP z3ut0aeD2`lRAXmKa*qFtp+BInp zm1nM@(9dFZ}1A z+z0|=>=VB!SWD9fT@AxoR+Wwr9l52?yNhd4p=dI)hYFeIR;zpo$vEjHC|mG~#fMRq z14N$8P@O7$nMTSv_m|~3Y8uKs*ropENG3k??ATPqzwYczJPe0N`t$Ir>YlCLn~igV z;e<9 zbEkL3XGuh;?y76RjiABrGQ1KXNLFB~(PMWj&?k~=FL*sVE^2!sJ@Q6B;wQ}RebXp( zac}F<3MHQ_Ng46{nEau4fVH$eH)pNqV`&r*iHMiioQNe z`58mUiYVA`U!NOnC6|Ek(fUd~FVOZWM@kB!ou5qNRq5PX{mV4B0P#!4GcMbDc!iK5 z9%U+aa$NAMq%!d<4k4BO`UK7QUeB0nT4!?ILrGiT1yrAybYUAuMb*1dc89y@mI+O=!FKb$ffMA2?WG>^jBOMnN8kpI*1QZw+G%!w3(6!6?X{6RPpM$}~ zARzGI(MBGhUn&L(4Gfc6yW~_k4lppXuyCD7;bLICIMpNj-x;gov~U))QahhpTVFCT zvGL8=^D9jE(h?396Ws!bb&ZT1OgtO7FQ(jMEQ}ZXv2wbB=VWHTSuLL1S0*oQ*f?#k z*5yqX+r8E+o!|-44rVHI{$HZKp!D+0OndG%w-UDA-fk?N@>gp&qucHEzR&mVGILrGiT1yrAybYUAuMb*1dc89y@mI+O=!d`3n$PHcR9lud(iMaqIrPn)JOXvLKILrGiT1yrAybYUAuMb*1dc89y@mI+O=!CP|H$9SasZvkEAy8SI#_ z@Nk=;YS5Y!50sAeaH)wsxp7hX!~|(krih)N6g?&~NuLO*JmA2{#KItAP$2ZoVV0R7 zhwFmL>2C8m!`V~~5*iw&vc?6mBs4HEF|pILrGiT1yrAybYUAuMb*1dc89y@mI`Sa)R-@pI<{rms_ z4F7?66pV(za0~$*kf%U-fq~-#gCvK{iUkV}vTz71MeHb0aBOB3)=KF(u+X7{RouhJ zVdEm#9&RTogN6-@UD*T}Wg;9JR6Qrlb2H7@nb2^Si7mluN+kmWBLgD~&w-VbA2czu zG4MnP99Y)K>dGo-8sPASm+0OMUZtu%qUyn9*^XEVF__)MzRd(UDH?qRtBbZd$jlc93 QD!+evlt1r{gaCsz0F~i_6#xJL diff --git a/doc/salome/gui/GEOM/pics/set_rotation_point_dialog1.png b/doc/salome/gui/GEOM/pics/set_rotation_point_dialog1.png deleted file mode 100644 index bdab73b7d27db6ae050080a7272dc68381abc665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11693 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 D+KM@S diff --git a/doc/salome/gui/GEOM/pics/set_rotation_point_dialog2.png b/doc/salome/gui/GEOM/pics/set_rotation_point_dialog2.png deleted file mode 100644 index 7f3696a56b58ae68df8131cb877dbc716bf601f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11232 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 diff --git a/doc/salome/gui/GEOM/pics/workplane4.png b/doc/salome/gui/GEOM/pics/workplane4.png index 6e9ead8f93a981009ed2ea6cce8a1dea151b2987..00835eb544ac6999ea0f50241433508bc814d587 100755 GIT binary patch literal 13415 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 IZ}h+X4{&_Xl>h($ literal 11943 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 literal 12268 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 diff --git a/doc/salome/gui/GEOM/pics/workplane6.png b/doc/salome/gui/GEOM/pics/workplane6.png index 5e5134821333e750f8ab0a3fddd5956f10e8f0ca..1f65862f8df11fc6a29e1b92754e5f3003587dde 100755 GIT binary patch literal 14331 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 diff --git a/doc/salome/gui/GEOM/vector.htm b/doc/salome/gui/GEOM/vector.htm index e6ab39507..31fc7d1cd 100755 --- a/doc/salome/gui/GEOM/vector.htm +++ b/doc/salome/gui/GEOM/vector.htm @@ -21,7 +21,8 @@ p.whs4 { font-size:12pt; font-weight:bold; } p.whs5 { font-size:12pt; margin-left:40px; } img_whs6 { border:none; width:312px; height:324px; float:none; border-style:none; } img_whs7 { border:none; width:312px; height:358px; float:none; border-style:none; } -img_whs8 { border:none; width:298px; height:302px; float:none; border-style:none; } +p.whs8 { font-size:12pt; margin-left:40px; font-weight:bold; } +img_whs9 { border:none; width:156px; height:203px; } -->

Working Plane

+

Definition of a Working Plane + is necessary for work with Sketcher. +

+ +

 

+

To create a Working Plane in the Main Menu select New Entity - > Basic - > Working Plane

 

-

There are some algorithms to set the Working Plane and the Camera Position.

+

There is a number of algorithms to set the + Working Plane and the Camera Position.

 

@@ -98,12 +115,12 @@ if (window.writeIntopicBar) Face or a Local Coordinate System to be your Working Plane

-

Arguments: Name + 1 selection (face - or planar face),

+

Arguments: + Name + 1 selection (face or planar face),

 

-

+

 

@@ -112,9 +129,11 @@ if (window.writeIntopicBar)

Arguments: Name +  2 - vectors,

+ vectors.

-

+

 

+ +

 

@@ -124,9 +143,38 @@ if (window.writeIntopicBar)

 

-

+

-

 

+

 

+ +

Reverse the plane normal checkbox + allows changing the direction of the working plane.

+ +

 

+ +

Example: Working plane on the + upper face of a box.  

+ +

 

+ + +++ + + + + + + + +
+

Normal Direction

+

Reversed Direction

+

+

+ +

 

 

diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 59f490e7f..05c9fe46f 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -147,7 +147,7 @@ module GEOM /*! * Get the TopoDS_Shape, for colocated case only. */ - long getShape(); + long long getShape(); /*! ###################################################################### @@ -888,6 +888,29 @@ module GEOM in boolean theWithContact , in boolean theWithCorrection ); + /*! + * Create a shape by extrusion of the profile shape along + * the path shape. The path shape can be a shell or a face. + * the several profiles can be specified in the several locations of path. + * \param theSeqBases - list of Bases shape to be extruded. + * \param theSeqSubBases - list of corresponding subshapes of section shapes. + * \param theLocations - list of locations on the path corresponding + * specified list of the Bases shapes. Number of locations + * should be equal to number of bases or list of locations can be empty. + * \param thePath - Path shape to extrude the base shape along it. + * \param theWithContact - the mode defining that the section is translated to be in + * contact with the spine. + * \param - WithCorrection - defining that the section is rotated to be + * orthogonal to the spine tangent in the correspondent point + * \return New GEOM_Object, containing the created pipe. + */ + GEOM_Object MakePipeWithShellSections (in ListOfGO theSeqBases, + in ListOfGO theSeqSubBases, + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact , + in boolean theWithCorrection ); + }; /*! @@ -966,6 +989,25 @@ module GEOM */ GEOM_Object MakeGlueFaces (in GEOM_Object theShape, in double theTolerance); + /*! + * Find coincident faces in theShape for possible gluing. + * \param theShape Initial shape. + * \param theTolerance Maximum distance between faces, which can be considered as coincident. + * \return ListOfGO + */ + ListOfGO GetGlueFaces (in GEOM_Object theShape, in double theTolerance); + + /*! + * Replace coincident faces in theShape by one face + * in compliance with given list of faces + * \param theShape Initial shape. + * \param theTolerance Maximum distance between faces, which can be considered as coincident. + * \param theFaces List of faces for gluing. + * \return New GEOM_Object, containing a copy of theShape without some faces. + */ + GEOM_Object MakeGlueFacesByList (in GEOM_Object theShape, in double theTolerance, + in ListOfGO theFaces); + /*! * Explode a shape on subshapes of a given type. * \param theShape Shape to be exploded. @@ -1750,6 +1792,20 @@ module GEOM in GEOM_Object thePnt2, in GEOM_Object thePnt3); + /*! + * Create an arc of circle of center C from one point to another + * \param theCenter Center point of the arc. + * \param thePnt1 Start point of the arc. + * \param thePnt2 End point of the arc. + * \param theSense Orientation of the arc + * \return New GEOM_Object, containing the created arc. + */ + GEOM_Object MakeArcCenter (in GEOM_Object theCenter, + in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in boolean theSense); + + /*! * Create a polyline on the set of points. * \param thePoints Sequence of points for the polyline. @@ -2100,6 +2156,52 @@ module GEOM out string_array thePatterns); }; + /*! + * GEOM_IKindOfShape: namespace for shape_kind enumeration. + */ + interface GEOM_IKindOfShape + { + enum shape_kind { + NO_SHAPE, + // COMPOSITEs + COMPOUND, + COMPSOLID, + SHELL, + WIRE, + // SOLIDs + SPHERE, // full sphere + CYLINDER, // cylinder + BOX, // box with faces, parallel to global coordinate planes + ROTATED_BOX, // other box + TORUS, // full torus + CONE, // cone + POLYHEDRON, // solid, bounded by polygons + SOLID, // other solid + // FACEs + SPHERE2D, // spherical face (closed) + CYLINDER2D, // cylindrical face with defined height + TORUS2D, // toroidal face (closed) + CONE2D, // conical face with defined height + DISK_CIRCLE, // planar, bounded by circle + DISK_ELLIPSE, // planar, bounded by ellipse + POLYGON, // planar, bounded by segments + PLANE, // infinite planar + PLANAR, // other planar + FACE, // other face + // EDGEs + CIRCLE, // full circle + ARC_CIRCLE, // arc of circle + ELLIPSE, // full ellipse + ARC_ELLIPSE, // arc of ellipse + LINE, // infinite segment + SEGMENT, // segment + EDGE, // other edge + // VERTEX + VERTEX + }; + }; + + /*! * GEOM_IMeasureOperations: Interface for measurement (distance, whatis) and * properties calculation (like Centre of Mass, Inertia, etc.). @@ -2107,6 +2209,21 @@ module GEOM */ interface GEOM_IMeasureOperations : GEOM_IOperations { + /*! + * Get kind of theShape. + * \param theShape Shape to get a kind of. + * \param theIntegers Output. Integer and enumerated shape's parameters + * (kind of surface, closed/unclosed, number of edges, etc.) + * \param theDoubles Output. Double shape's parameters (coordinates, dimensions, etc.) + * \note Concrete meaning of each value, returned via \a theIntegers + * or \a theDoubles list depends on the kind of the shape. + * \return Returns a kind of shape in terms of GEOM_IKindOfShape.shape_kind enumeration. + */ + //short KindOfShape (in GEOM_Object theShape, + GEOM_IKindOfShape::shape_kind KindOfShape (in GEOM_Object theShape, + out ListOfLong theIntegers, + out ListOfDouble theDoubles); + /*! * Get position (LCS) of theShape. * \param theShape Shape to calculate position of. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 7c67d2826..92e6fc36d 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -177,6 +177,13 @@ module GEOM in boolean theWithContact , in boolean theWithCorrection ); + GEOM_Object MakePipeWithShellSections (in ListOfGO theSeqBases, + in ListOfGO theSeqSubBases, + in ListOfGO theLocations, + in GEOM_Object thePath, + in boolean theWithContact , + in boolean theWithCorrection ); + //-----------------------------------------------------------// // BooleanOperations // //-----------------------------------------------------------// @@ -305,7 +312,12 @@ module GEOM GEOM_Object MakeSolidShells (in GEOM_List theShells) ; GEOM_Object MakeCompound (in GEOM_List theShapes) ; GEOM_Object MakeGlueFaces (in GEOM_Object theShape, - in double theTolerance) ; + in double theTolerance); + GEOM_List GetGlueFaces (in GEOM_Object theShape, + in double theTolerance); + GEOM_Object MakeGlueFacesByList (in GEOM_Object theShape, + in double theTolerance, + in ListOfGO theFaces); GEOM_List MakeExplode (in GEOM_Object theShape, in long theShapeType, in boolean isSorted) ; @@ -403,6 +415,10 @@ module GEOM GEOM_Object MakeArc (in GEOM_Object thePnt1, in GEOM_Object thePnt2, in GEOM_Object thePnt3) ; + GEOM_Object MakeArcCenter (in GEOM_Object theCenter, + in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in boolean theSense) ; GEOM_Object MakePolyline (in GEOM_List thePoints) ; GEOM_Object MakeSplineBezier (in GEOM_List thePoints) ; GEOM_Object MakeSplineInterpolation (in GEOM_List thePoints) ; diff --git a/resources/GEOMCatalog.xml.in b/resources/GEOMCatalog.xml.in index 131c35263..4b05e9c22 100644 --- a/resources/GEOMCatalog.xml.in +++ b/resources/GEOMCatalog.xml.in @@ -3857,6 +3857,42 @@ + MakeArcCenter + ngr + 3.2.6 + unknown + 0 + + + theCenter + GEOM_Object + unknown + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + theSense + boolean + unknown + + + + + return + GEOM_Object + unknown + + + + MakePolyline mkr 2.1.0 diff --git a/resources/ImportExport b/resources/ImportExport index c79adbc1a..6f99dfe50 100644 --- a/resources/ImportExport +++ b/resources/ImportExport @@ -1,5 +1,5 @@ -Import: BREP|IGES|STEP -Export: BREP|IGES|IGES_5_3|STEP +Import: BREP|IGES|STEP|ACIS +Export: BREP|IGES|IGES_5_3|STEP|STL_Bin|STL_ASCII|ACIS BREP.Import: libBREPImport BREP.Export: libBREPExport @@ -16,3 +16,13 @@ IGES_5_3.Pattern: IGES 5.3 Files ( *.iges *.igs ) STEP.Import: libSTEPImport STEP.Export: libSTEPExport STEP.Pattern: STEP Files ( *.step *.stp ) + +STL_Bin.Export: libSTLExport.so +STL_Bin.Pattern: STL Binary Files ( *.stl ) + +STL_ASCII.Export: libSTLExport.so +STL_ASCII.Pattern: STL ASCII Files ( *.stl ) + +ACIS.Import: libACISImport.so +ACIS.Export: libACISExport.so +ACIS.Pattern: ACIS Files ( *.sat ) \ No newline at end of file diff --git a/resources/Makefile.am b/resources/Makefile.am index 0c78e8a53..30a1b92ae 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -188,6 +188,8 @@ check_blocks_compound.png \ free_faces.png \ propagate.png \ redo.png \ -undo.png +undo.png \ +arccenter.png \ +glue2.png nodist_salomeres_DATA = GEOMCatalog.xml diff --git a/resources/arccenter.png b/resources/arccenter.png new file mode 100644 index 0000000000000000000000000000000000000000..88ead9a7b7ab6394c9d34f381aed472c87c4cfd6 GIT binary patch literal 485 zcmVL1a6z*P}Sr*MvLb_mj? zZaNfPG8lM6;5j6hHtA`aDtHjyad~|1`+glk@TaQ<{3CEYi4N<0=%iq4<-x%P)eEYb8cVidXSkjh2mzlzPJi(xA${< zS_@2bASECGxWB#IZqy_*x!ryAC;=%)!F(2|bpS>~uT->B+ic`*=cPj}G2)_-)b#lh z7eWc>yEbbCG{rM1(xI04bFD7849IDsjuMc#kjDp&*_0(tBO$jm1l#}s0VhdB zK~y-)t&}ltgD@0^KSvA?iGfHASSBr}aa9dyV^Q5eg-t%b{^aa;D*)0gwc-dOLcEF9Y%HwW zXSCsTK2a3K!-S>Gs&iM>o8~$vBt%4hfoYc7En9|2ZL3+DrIY$RGumLZ8FkpU#U|JJ zVAyLZJz7RoF5j7At?dZ{N|*vZwZZjVeEh5Av3K=W8kp;x%lSg_U5ib$j8IDTbNL}Q zPo~U+`Lu6&ti!Dnj&*szTammc&A|V_LBVI!eo5t@d5n&N5 z5bp|&H?g__!yp_i+ZC6?@xc0JeS-lwV`Ed@Sse!O1DWn(&+LlP&;S4c07*qoM6N<$ Eg7Lbk)Bpeg literal 0 HcmV?d00001 diff --git a/src/BasicGUI/BasicGUI_ArcDlg.cxx b/src/BasicGUI/BasicGUI_ArcDlg.cxx index 15815209d..fec43e01e 100644 --- a/src/BasicGUI/BasicGUI_ArcDlg.cxx +++ b/src/BasicGUI/BasicGUI_ArcDlg.cxx @@ -59,14 +59,15 @@ BasicGUI_ArcDlg::BasicGUI_ArcDlg(GeometryGUI* theGeometryGUI, QWidget* parent, WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) { QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ARC"))); - QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ARC_CENTER"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); setCaption(tr("GEOM_ARC_TITLE")); /***************************************************************/ GroupConstructors->setTitle(tr("GEOM_ARC")); RadioButton1->setPixmap(image0); - RadioButton2->close(TRUE); + RadioButton2->setPixmap(image1); RadioButton3->close(TRUE); Group3Pnts = new DlgRef_3Sel_QTD(this, "Group3Pnts"); @@ -79,11 +80,29 @@ BasicGUI_ArcDlg::BasicGUI_ArcDlg(GeometryGUI* theGeometryGUI, QWidget* parent, Group3Pnts->LineEdit2->setReadOnly( true ); Group3Pnts->LineEdit3->setReadOnly( true ); - Group3Pnts->PushButton1->setPixmap(image1); - Group3Pnts->PushButton2->setPixmap(image1); - Group3Pnts->PushButton3->setPixmap(image1); + Group3Pnts->PushButton1->setPixmap(image2); + Group3Pnts->PushButton2->setPixmap(image2); + Group3Pnts->PushButton3->setPixmap(image2); + + + Group3Pnts2 = new DlgRef_3Sel1Check_QTD(this, "Group3Pnts2"); + Group3Pnts2->GroupBox1->setTitle(tr("GEOM_POINTS")); + Group3Pnts2->TextLabel1->setText(tr("GEOM_CENTER_POINT")); + Group3Pnts2->TextLabel2->setText(tr("GEOM_POINT_I").arg("Start")); + Group3Pnts2->TextLabel3->setText(tr("GEOM_POINT_I").arg("End")); + + Group3Pnts2->LineEdit1->setReadOnly( true ); + Group3Pnts2->LineEdit2->setReadOnly( true ); + Group3Pnts2->LineEdit3->setReadOnly( true ); + + Group3Pnts2->PushButton1->setPixmap(image2); + Group3Pnts2->PushButton2->setPixmap(image2); + Group3Pnts2->PushButton3->setPixmap(image2); + + Group3Pnts2->radioButton4->setText(tr("GEOM_REVERSE")); Layout1->addWidget( Group3Pnts, 2, 0 ); + Layout1->addWidget( Group3Pnts2, 2, 0 ); setHelpFileName("arc.htm"); @@ -109,17 +128,21 @@ void BasicGUI_ArcDlg::Init() /* init variables */ // myGeomGUI->SetState( 0 ); globalSelection( GEOM_POINT ); - + + myConstructorId = -1; myEditCurrentArgument = Group3Pnts->LineEdit1; myEditCurrentArgument->setFocus(); myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + Group3Pnts2->radioButton4->setChecked(FALSE); /* signals and slots connections */ connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - + + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); @@ -130,11 +153,24 @@ void BasicGUI_ArcDlg::Init() connect(Group3Pnts->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(Group3Pnts->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); connect(Group3Pnts->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(Group3Pnts2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts2->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group3Pnts2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group3Pnts2->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group3Pnts2->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(Group3Pnts2->radioButton4, SIGNAL(stateChanged(int)), this, SLOT(ReverseSense(int))); connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - initName( tr( "GEOM_ARC" ) ); + initName( tr( "GEOM_ARC" )); + + + ConstructorsClicked( 0 ); } @@ -173,8 +209,13 @@ bool BasicGUI_ArcDlg::ClickOnApply() Group3Pnts->LineEdit1->setText( "" ); Group3Pnts->LineEdit2->setText( "" ); Group3Pnts->LineEdit3->setText( "" ); - myEditCurrentArgument = Group3Pnts->LineEdit1; + Group3Pnts2->LineEdit1->setText( "" ); + Group3Pnts2->LineEdit2->setText( "" ); + Group3Pnts2->LineEdit3->setText( "" ); + if (getConstructorId() == 0) myEditCurrentArgument = Group3Pnts->LineEdit1; + if (getConstructorId() == 1) myEditCurrentArgument = Group3Pnts2->LineEdit1; + ConstructorsClicked( getConstructorId() ); return true; } @@ -185,25 +226,55 @@ bool BasicGUI_ArcDlg::ClickOnApply() //================================================================================= void BasicGUI_ArcDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText(""); - - if ( IObjectCount() != 1 ) - { - if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = GEOM::GEOM_Object::_nil(); - else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = GEOM::GEOM_Object::_nil(); - else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = GEOM::GEOM_Object::_nil(); + if ((getConstructorId() != 0) && (getConstructorId() != 1)) return; - } - + + myEditCurrentArgument->setText(""); + if ( IObjectCount() != 1 ){ + switch (getConstructorId()) + { + case 0: + { + if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = GEOM::GEOM_Object::_nil(); + return; + break; + } + case 1: + { + if ( myEditCurrentArgument == Group3Pnts2->LineEdit1 ) myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts2->LineEdit2 ) myPoint2 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 ) myPoint3 = GEOM::GEOM_Object::_nil(); + return; + break; + } + } + } // nbSel == 1 Standard_Boolean aRes = Standard_False; GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes ); if ( !CORBA::is_nil( aSelectedObject ) && aRes ) { - myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); - if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = aSelectedObject; - else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = aSelectedObject; - else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = aSelectedObject; + switch (getConstructorId()) + { + case 0: + { + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = aSelectedObject; + break; + } + case 1: + { + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + if ( myEditCurrentArgument == Group3Pnts2->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts2->LineEdit2 ) myPoint2 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 ) myPoint3 = aSelectedObject; + break; + } + } } displayPreview(); @@ -217,11 +288,23 @@ void BasicGUI_ArcDlg::SelectionIntoArgument() void BasicGUI_ArcDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - - if ( send == Group3Pnts->PushButton1 ) myEditCurrentArgument = Group3Pnts->LineEdit1; - else if ( send == Group3Pnts->PushButton2 ) myEditCurrentArgument = Group3Pnts->LineEdit2; - else if ( send == Group3Pnts->PushButton3 ) myEditCurrentArgument = Group3Pnts->LineEdit3; - + switch (getConstructorId()) + { + case 0: + { + if ( send == Group3Pnts->PushButton1 ) myEditCurrentArgument = Group3Pnts->LineEdit1; + else if ( send == Group3Pnts->PushButton2 ) myEditCurrentArgument = Group3Pnts->LineEdit2; + else if ( send == Group3Pnts->PushButton3 ) myEditCurrentArgument = Group3Pnts->LineEdit3; + break; + } + case 1: + { + if ( send == Group3Pnts2->PushButton1 ) myEditCurrentArgument = Group3Pnts2->LineEdit1; + else if ( send == Group3Pnts2->PushButton2 ) myEditCurrentArgument = Group3Pnts2->LineEdit2; + else if ( send == Group3Pnts2->PushButton3 ) myEditCurrentArgument = Group3Pnts2->LineEdit3; + break; + } + } myEditCurrentArgument->setFocus(); SelectionIntoArgument(); } @@ -234,9 +317,8 @@ void BasicGUI_ArcDlg::SetEditCurrentArgument() void BasicGUI_ArcDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); - if ( send == Group3Pnts->LineEdit1 || - send == Group3Pnts->LineEdit2 || - send == Group3Pnts->LineEdit3 ) + if ( send == Group3Pnts->LineEdit1 || send == Group3Pnts->LineEdit2 || send == Group3Pnts->LineEdit3 || + send == Group3Pnts2->LineEdit1 || send == Group3Pnts2->LineEdit2 || send == Group3Pnts2->LineEdit3 ) { myEditCurrentArgument = send; GEOMBase_Skeleton::LineEditReturnPressed(); @@ -264,6 +346,9 @@ void BasicGUI_ArcDlg::ActivateThisDialog() Group3Pnts->LineEdit2->setText( "" ); Group3Pnts->LineEdit3->setText( "" ); myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + + ConstructorsClicked( getConstructorId() ); + } //================================================================================= @@ -320,11 +405,34 @@ bool BasicGUI_ArcDlg::isValid( QString& msg ) //================================================================================= bool BasicGUI_ArcDlg::execute( ObjectList& objects ) { - GEOM::GEOM_Object_var anObj = - GEOM::GEOM_ICurvesOperations::_narrow(getOperation())->MakeArc(myPoint1, myPoint2, myPoint3); - if ( !anObj->_is_nil() ) + bool res = false; + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) + { + case 0: + { + if ( !CORBA::is_nil(myPoint1) && !CORBA::is_nil(myPoint2) &&!CORBA::is_nil(myPoint3) ){ + anObj = GEOM::GEOM_ICurvesOperations::_narrow(getOperation())->MakeArc(myPoint1, myPoint2, myPoint3); + res = true; + } + break; + } + case 1: + { + bool Sense; + (Group3Pnts2->radioButton4->isChecked()) ? Sense=true : Sense = false; + if ( !CORBA::is_nil(myPoint1) && !CORBA::is_nil(myPoint2) &&!CORBA::is_nil(myPoint3) ){ + anObj = GEOM::GEOM_ICurvesOperations::_narrow(getOperation())->MakeArcCenter(myPoint1, myPoint2, myPoint3,Sense); + res = true; + } + break; + } + } + if ( !anObj->_is_nil() ){ objects.push_back( anObj._retn() ); - return true; + } + return res; } //================================================================================= @@ -335,3 +443,45 @@ void BasicGUI_ArcDlg::closeEvent( QCloseEvent* e ) { GEOMBase_Skeleton::closeEvent( e ); } + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId ) +{ + + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch (constructorId) + { + case 0: + { + Group3Pnts->show(); + resize(0, 0); + Group3Pnts2->hide(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1: + { + Group3Pnts->hide(); + resize(0, 0); + Group3Pnts2->show(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + break; + } + } + displayPreview(); +} + +//================================================================================= +// function : ReverseSense() +// purpose : Orientation of the arc +//================================================================================= +void BasicGUI_ArcDlg::ReverseSense(int sense) +{ + displayPreview(); +} diff --git a/src/BasicGUI/BasicGUI_ArcDlg.h b/src/BasicGUI/BasicGUI_ArcDlg.h index 35038d452..6a5e73217 100644 --- a/src/BasicGUI/BasicGUI_ArcDlg.h +++ b/src/BasicGUI/BasicGUI_ArcDlg.h @@ -32,6 +32,7 @@ #include "GEOMBase_Skeleton.h" #include "DlgRef_3Sel_QTD.h" +#include "DlgRef_3Sel1Check_QTD.h" //================================================================================= // class : BasicGUI_ArcDlg @@ -57,10 +58,11 @@ protected: private : void Init(); void enterEvent(QEvent* e); - + int myConstructorId; GEOM::GEOM_Object_var myPoint1, myPoint2, myPoint3; DlgRef_3Sel_QTD* Group3Pnts; + DlgRef_3Sel1Check_QTD* Group3Pnts2; private slots: void ClickOnOk(); @@ -69,11 +71,11 @@ private slots: void ActivateThisDialog(); void DeactivateActiveDialog(); - + void ConstructorsClicked( int ); void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); - + void ReverseSense(int); }; #endif // DIALOGBOX_ARC_H diff --git a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx index 4522f191d..97a7421c2 100644 --- a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx +++ b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx @@ -102,6 +102,16 @@ BasicGUI_WorkingPlaneDlg::BasicGUI_WorkingPlaneDlg(GeometryGUI* theGeometryGUI, Layout1->addWidget(Group2, 1, 0); Layout1->addWidget(Group3, 1, 0); /***************************************************************/ + QGroupBox* aReverseGroupBox = new QGroupBox(this, "aReverseGroupBox"); + aReverseGroupBox->setTitle(tr("")); + aReverseGroupBox->setColumnLayout(1, Qt::Horizontal); + aReverseGroupBox->setInsideMargin(10); + + myReverseCB = new QCheckBox(aReverseGroupBox, "myReverseCB"); + myReverseCB->setText(tr("GEOM_REVERSE_PLANE")); + + Layout1->addWidget(aReverseGroupBox, 2, 0); + setHelpFileName("working_plane.htm"); @@ -156,6 +166,8 @@ void BasicGUI_WorkingPlaneDlg::Init() connect(Group3->GroupBox1, SIGNAL(clicked(int)), this, SLOT(GroupClicked(int))); + connect(myReverseCB, SIGNAL(clicked()), this, SLOT(onReverse())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -225,7 +237,8 @@ void BasicGUI_WorkingPlaneDlg::ConstructorsClicked(int constructorId) break; } } - displayPreview(); + + updateWPlane(); } //================================================================================= @@ -235,6 +248,7 @@ void BasicGUI_WorkingPlaneDlg::ConstructorsClicked(int constructorId) void BasicGUI_WorkingPlaneDlg::GroupClicked(int groupId) { aOriginType = groupId; + updateWPlane(); } //================================================================================= @@ -255,99 +269,12 @@ bool BasicGUI_WorkingPlaneDlg::ClickOnApply() { buttonApply->setFocus(); myGeomGUI->application()->putInfo(tr("")); - const int id = getConstructorId(); - - if (id == 0) { // by planar face selection - if (CORBA::is_nil(myFace)) { - showError( "Face has to be selected" ); - return false; - } - - // PAL12781: set center of WPL to face's center of mass - // like it is done for LCS creation - CORBA::Double Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz; - Ox = Oy = Oz = Zx = Zy = Xy = Xz = 0.; - Zz = Xx = 1.; - - GEOM::GEOM_IMeasureOperations_ptr aMeasureOp = - myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId()); - aMeasureOp->GetPosition(myFace, Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz); - - if (aMeasureOp->IsDone()) { - gp_Pnt aPnt (Ox,Oy,Oz); - gp_Dir aDirN (Zx,Zy,Zz); - gp_Dir aDirX (Xx,Xy,Xz); - myWPlane = gp_Ax3(aPnt, aDirN, aDirX); - } else { - showError( "Wrong shape selected (has to be a planar face)" ); - return false; - } - - } else if (id == 1) { // by two vectors (Ox & Oz) - if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) { - showError( "Two vectors have to be selected" ); - return false; - } - - TopoDS_Edge aVectX, aVectZ; - TopoDS_Vertex VX1, VX2, VZ1, VZ2; - gp_Vec aVX, aVZ; - - if (!GEOMBase::GetShape( myVectX, aVectX, TopAbs_EDGE ) || - !GEOMBase::GetShape( myVectZ, aVectZ, TopAbs_EDGE )) { - showError( "Wrong shape selected (two vectors(edges) have to be selected)" ); - return false; - } - - TopExp::Vertices(aVectX, VX1, VX2, Standard_True); - TopExp::Vertices(aVectZ, VZ1, VZ2, Standard_True); - - if (VX1.IsNull() || VX2.IsNull()) { - showError( "Bad OX vector" ); - return false; - } - if (VZ1.IsNull() || VZ2.IsNull()) { - showError( "Bad OZ vector" ); - return false; - } - - aVX = gp_Vec(BRep_Tool::Pnt(VX1), BRep_Tool::Pnt(VX2)); - aVZ = gp_Vec(BRep_Tool::Pnt(VZ1), BRep_Tool::Pnt(VZ2)); - - if (aVX.Magnitude() < Precision::Confusion()) { - showError( "Bad OX vector" ); - return false; - } - if (aVZ.Magnitude() < Precision::Confusion()) { - showError( "Bad OZ vector" ); - return false; - } - - gp_Dir aDirX = gp_Dir(aVX.X(), aVX.Y(), aVX.Z()); - gp_Dir aDirZ = gp_Dir(aVZ.X(), aVZ.Y(), aVZ.Z()); - - if (aDirX.IsParallel(aDirZ, Precision::Angular())) { - showError( "Parallel vectors selected" ); - return false; - } - - myWPlane = gp_Ax3(BRep_Tool::Pnt(VX1), aDirZ, aDirX); - - } else if (id == 2) { // by selection from standard (OXY or OYZ, or OZX) - gp_Ax2 anAx2; - - if (aOriginType == 1) anAx2 = gp::XOY(); - else if (aOriginType == 2) anAx2 = gp::YOZ(); - else if (aOriginType == 0) anAx2 = gp::ZOX(); - - myWPlane = gp_Ax3(anAx2); - - } else { - return false; + + if (updateWPlane(false)){ + myGeomGUI->SetWorkingPlane(myWPlane); + myGeomGUI->ActiveWorkingPlane(); } - - myGeomGUI->SetWorkingPlane(myWPlane); - myGeomGUI->ActiveWorkingPlane(); + return true; } @@ -387,6 +314,8 @@ void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument() myVectZ = aSelectedObject; myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + updateWPlane(); } @@ -430,6 +359,16 @@ void BasicGUI_WorkingPlaneDlg::LineEditReturnPressed() } +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::onReverse() +{ + updateWPlane(); +} + + //================================================================================= // function : ActivateThisDialog() // purpose : @@ -481,3 +420,130 @@ void BasicGUI_WorkingPlaneDlg::closeEvent( QCloseEvent* e ) { GEOMBase_Skeleton::closeEvent( e ); } + + +//================================================================================= +// function : updateWPlane +// purpose : +//================================================================================= +bool BasicGUI_WorkingPlaneDlg::updateWPlane( const bool showPreview ) +{ + erasePreview(); + + const int id = getConstructorId(); + + if (id == 0) { // by planar face selection + if (CORBA::is_nil(myFace)) { + if(!showPreview) + showError( "Face has to be selected" ); + return false; + } + + // PAL12781: set center of WPL to face's center of mass + // like it is done for LCS creation + CORBA::Double Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz; + Ox = Oy = Oz = Zx = Zy = Xy = Xz = 0.; + Zz = Xx = 1.; + + GEOM::GEOM_IMeasureOperations_ptr aMeasureOp = + myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId()); + aMeasureOp->GetPosition(myFace, Ox,Oy,Oz, Zx,Zy,Zz, Xx,Xy,Xz); + + if (aMeasureOp->IsDone()) { + gp_Pnt aPnt (Ox,Oy,Oz); + gp_Dir aDirN (Zx,Zy,Zz); + gp_Dir aDirX (Xx,Xy,Xz); + myWPlane = gp_Ax3(aPnt, aDirN, aDirX); + } else { + if(!showPreview) + showError( "Wrong shape selected (has to be a planar face)" ); + return false; + } + + } else if (id == 1) { // by two vectors (Ox & Oz) + if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) { + if(!showPreview) + showError( "Two vectors have to be selected" ); + return false; + } + + TopoDS_Edge aVectX, aVectZ; + TopoDS_Vertex VX1, VX2, VZ1, VZ2; + gp_Vec aVX, aVZ; + + if (!GEOMBase::GetShape( myVectX, aVectX, TopAbs_EDGE ) || + !GEOMBase::GetShape( myVectZ, aVectZ, TopAbs_EDGE )) { + if(!showPreview) + showError( "Wrong shape selected (two vectors(edges) have to be selected)" ); + return false; + } + + TopExp::Vertices(aVectX, VX1, VX2, Standard_True); + TopExp::Vertices(aVectZ, VZ1, VZ2, Standard_True); + + if (VX1.IsNull() || VX2.IsNull()) { + if(!showPreview) + showError( "Bad OX vector" ); + return false; + } + if (VZ1.IsNull() || VZ2.IsNull()) { + if(!showPreview) + showError( "Bad OZ vector" ); + return false; + } + + aVX = gp_Vec(BRep_Tool::Pnt(VX1), BRep_Tool::Pnt(VX2)); + aVZ = gp_Vec(BRep_Tool::Pnt(VZ1), BRep_Tool::Pnt(VZ2)); + + if (aVX.Magnitude() < Precision::Confusion()) { + if(!showPreview) + showError( "Bad OX vector" ); + return false; + } + if (aVZ.Magnitude() < Precision::Confusion()) { + if(!showPreview) + showError( "Bad OZ vector" ); + return false; + } + + gp_Dir aDirX = gp_Dir(aVX.X(), aVX.Y(), aVX.Z()); + gp_Dir aDirZ = gp_Dir(aVZ.X(), aVZ.Y(), aVZ.Z()); + + if (aDirX.IsParallel(aDirZ, Precision::Angular())) { + if(!showPreview) + showError( "Parallel vectors selected" ); + return false; + } + + myWPlane = gp_Ax3(BRep_Tool::Pnt(VX1), aDirZ, aDirX); + + } else if (id == 2) { // by selection from standard (OXY or OYZ, or OZX) + gp_Ax2 anAx2; + + if (aOriginType == 1) anAx2 = gp::XOY(); + else if (aOriginType == 2) anAx2 = gp::YOZ(); + else if (aOriginType == 0) anAx2 = gp::ZOX(); + + myWPlane = gp_Ax3(anAx2); + + } else { + return false; + } + + if (myReverseCB->isChecked()) + { + myWPlane.YReverse(); + myWPlane.ZReverse(); + } + + if (showPreview) + { + GEOM::GEOM_IBasicOperations_var aBasicOp = getGeomEngine()->GetIBasicOperations( getStudyId() ); + GEOM::GEOM_Object_var anObj = aBasicOp->MakeMarker( myWPlane.Location().X(), myWPlane.Location().Y(), myWPlane.Location().Z(), + myWPlane.XDirection().X(), myWPlane.XDirection().Y(), myWPlane.XDirection().Z(), + myWPlane.YDirection().X(), myWPlane.YDirection().Y(), myWPlane.YDirection().Z() ); + displayPreview(anObj); + } + + return true; +} diff --git a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.h b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.h index 35561c741..40cddf743 100644 --- a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.h +++ b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.h @@ -35,6 +35,8 @@ #include "DlgRef_2Sel_QTD.h" #include "DlgRef_3Check_QTD.h" +class QCheckBox; + //================================================================================= // class : BasicGUI_WorkingPlaneDlg // purpose : @@ -53,6 +55,8 @@ private: void Init(); void enterEvent(QEvent* e); + bool updateWPlane(const bool showPreview = true); + GEOM::GEOM_Object_var myFace; GEOM::GEOM_Object_var myVectX; GEOM::GEOM_Object_var myVectZ; @@ -63,6 +67,8 @@ private: DlgRef_2Sel_QTD* Group2; DlgRef_3Check_QTD* Group3; + QCheckBox* myReverseCB; + gp_Ax3 myWPlane; private slots: @@ -75,6 +81,7 @@ private slots: void SetEditCurrentArgument(); void SelectionIntoArgument(); void LineEditReturnPressed(); + void onReverse(); void ActivateThisDialog(); void DeactivateActiveDialog(); diff --git a/src/DlgRef/DlgRef_3Sel1Check_QTD.cxx b/src/DlgRef/DlgRef_3Sel1Check_QTD.cxx new file mode 100644 index 000000000..a1442eab4 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel1Check_QTD.cxx @@ -0,0 +1,127 @@ +/**************************************************************************** +** Form implementation generated from reading ui file 'UIFiles/DlgRef_3Sel1Check_QTD.ui' +** +** Created: Wed Feb 21 10:49:18 2007 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#include "DlgRef_3Sel1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel1Check_QTD as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Sel1Check_QTD::DlgRef_3Sel1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Sel1Check_QTD" ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, 0, 0, sizePolicy().hasHeightForWidth() ) ); + DlgRef_3Sel1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Sel1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + GroupBox1Layout->addWidget( LineEdit1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel1, 0, 0 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton2, 1, 1 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + GroupBox1Layout->addWidget( LineEdit2, 1, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel2, 1, 0 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( PushButton3, 2, 1 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + GroupBox1Layout->addWidget( LineEdit3, 2, 2 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + + GroupBox1Layout->addWidget( TextLabel3, 2, 0 ); + + radioButton4 = new QRadioButton( GroupBox1, "radioButton4" ); + + GroupBox1Layout->addMultiCellWidget( radioButton4, 3, 3, 0, 1 ); + Spacer3 = new QSpacerItem( 16, 721, QSizePolicy::Minimum, QSizePolicy::Expanding ); + GroupBox1Layout->addItem( Spacer3, 4, 2 ); + + DlgRef_3Sel1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + languageChange(); + resize( QSize(490, 878).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, PushButton3 ); + setTabOrder( PushButton3, LineEdit3 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel1Check_QTD::~DlgRef_3Sel1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void DlgRef_3Sel1Check_QTD::languageChange() +{ + setCaption( tr( "DlgRef_3Sel3Spin1Check_QTD" ) ); + GroupBox1->setTitle( QString::null ); + PushButton1->setText( QString::null ); + TextLabel1->setText( tr( "TL1" ) ); + PushButton2->setText( QString::null ); + TextLabel2->setText( tr( "TL2" ) ); + PushButton3->setText( QString::null ); + TextLabel3->setText( tr( "TL3" ) ); + radioButton4->setText( tr( "radioButton4" ) ); +} + diff --git a/src/DlgRef/DlgRef_3Sel1Check_QTD.h b/src/DlgRef/DlgRef_3Sel1Check_QTD.h new file mode 100644 index 000000000..0498e7b29 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel1Check_QTD.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** Form interface generated from reading ui file 'UIFiles/DlgRef_3Sel1Check_QTD.ui' +** +** Created: Wed Feb 21 10:48:39 2007 +** by: The User Interface Compiler ($Id$) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ + +#ifndef DLGREF_3SEL1CHECK_QTD_H +#define DLGREF_3SEL1CHECK_QTD_H + +#include +#include + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QGroupBox; +class QPushButton; +class QLineEdit; +class QLabel; +class QRadioButton; + +class DlgRef_3Sel1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Sel1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Sel1Check_QTD(); + + QGroupBox* GroupBox1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + QLabel* TextLabel1; + QPushButton* PushButton2; + QLineEdit* LineEdit2; + QLabel* TextLabel2; + QPushButton* PushButton3; + QLineEdit* LineEdit3; + QLabel* TextLabel3; + QRadioButton* radioButton4; + +protected: + QGridLayout* DlgRef_3Sel1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QSpacerItem* Spacer3; + +protected slots: + virtual void languageChange(); + +}; + +#endif // DLGREF_3SEL1CHECK_QTD_H diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index 2d893f870..efc180f90 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -86,7 +86,8 @@ dist_libDlgRef_la_SOURCES = \ DlgRef_3Sel1Spin.cxx \ DlgRef_3Check_QTD.cxx \ DlgRef_6Sel_QTD.cxx \ - DlgRef_4Sel1Spin2Check.cxx + DlgRef_4Sel1Spin2Check.cxx \ + DlgRef_3Sel1Check_QTD.cxx MOC_FILES = \ DlgRef_Skeleton_QTD_moc.cxx \ @@ -142,7 +143,8 @@ MOC_FILES = \ DlgRef_1Sel_Ext_moc.cxx \ DlgRef_3Check_QTD_moc.cxx \ DlgRef_6Sel_QTD_moc.cxx \ - DlgRef_4Sel1Spin2Check_moc.cxx + DlgRef_4Sel1Spin2Check_moc.cxx \ + DlgRef_3Sel1Check_QTD_moc.cxx # header files salomeinclude_HEADERS = \ @@ -200,6 +202,7 @@ salomeinclude_HEADERS = \ DlgRef_3Check_QTD.h \ DlgRef_6Sel_QTD.h \ DlgRef_4Sel1Spin2Check.h \ + DlgRef_3Sel1Check_QTD.h \ GEOM_DlgRef.hxx nodist_libDlgRef_la_SOURCES= \ diff --git a/src/DlgRef/UIFiles/DlgRef_3Sel1Check_QTD.ui b/src/DlgRef/UIFiles/DlgRef_3Sel1Check_QTD.ui new file mode 100644 index 000000000..6f9ef127c --- /dev/null +++ b/src/DlgRef/UIFiles/DlgRef_3Sel1Check_QTD.ui @@ -0,0 +1,210 @@ + +DlgRef_3Sel1Check_QTD + + + DlgRef_3Sel1Check_QTD + + + + 0 + 0 + 490 + 878 + + + + + 5 + 5 + 0 + 0 + + + + DlgRef_3Sel3Spin1Check_QTD + + + + unnamed + + + 0 + + + 6 + + + + GroupBox1 + + + + 5 + 5 + 0 + 0 + + + + + + + + unnamed + + + 11 + + + 6 + + + + PushButton1 + + + + 0 + 0 + 0 + 0 + + + + + + + + + LineEdit1 + + + + + TextLabel1 + + + + 0 + 0 + 0 + 0 + + + + TL1 + + + + + PushButton2 + + + + 0 + 0 + 0 + 0 + + + + + + + + + LineEdit2 + + + + + TextLabel2 + + + + 0 + 0 + 0 + 0 + + + + TL2 + + + + + PushButton3 + + + + 0 + 0 + 0 + 0 + + + + + + + + + LineEdit3 + + + + + TextLabel3 + + + + 0 + 0 + 0 + 0 + + + + TL3 + + + + + radioButton4 + + + radioButton4 + + + + + Spacer3 + + + Vertical + + + Expanding + + + + 16 + 721 + + + + + + + + + PushButton1 + LineEdit1 + PushButton2 + LineEdit2 + PushButton3 + LineEdit3 + + + diff --git a/src/EntityGUI/EntityGUI_SketcherDlg.cxx b/src/EntityGUI/EntityGUI_SketcherDlg.cxx index dac57b966..5a3baf23f 100644 --- a/src/EntityGUI/EntityGUI_SketcherDlg.cxx +++ b/src/EntityGUI/EntityGUI_SketcherDlg.cxx @@ -64,12 +64,14 @@ using namespace std; // TRUE to construct a modal dialog. //================================================================================= EntityGUI_SketcherDlg::EntityGUI_SketcherDlg(GeometryGUI* GUI, QWidget* parent, - const char* name, bool modal, WFlags fl) + const char* name, bool modal, WFlags fl, + const double lineWidth) :EntityGUI_Skeleton_QTD(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose), myIsAllAdded( false ), GEOMBase_Helper( dynamic_cast( parent ) ), - myGeometryGUI( GUI ) + myGeometryGUI( GUI ), + myLineWidth( lineWidth ) { myGeometryGUI->SetActiveDialogBox(this); @@ -344,7 +346,7 @@ void EntityGUI_SketcherDlg::Init() resize( 0, 0 ); TypeClicked(0); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } @@ -443,7 +445,7 @@ void EntityGUI_SketcherDlg::PointClicked(int constructorId) Group2Spin->show(); Group2Spin->buttonApply->setFocus(); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } else if ( constructorId == 0 ) { // DXDY @@ -459,7 +461,7 @@ void EntityGUI_SketcherDlg::PointClicked(int constructorId) Group2Spin->show(); Group2Spin->buttonApply->setFocus(); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } else if ( constructorId == 2 ) { // Selection @@ -693,7 +695,7 @@ void EntityGUI_SketcherDlg::Dir2Clicked(int constructorId) } } - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } @@ -764,7 +766,7 @@ bool EntityGUI_SketcherDlg::ClickOnApply() setEnabledUndo(true); setEnabledRedo(false); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); // Set focus to SpinBox_DX if (sender() == Group1Spin->buttonApply) { @@ -833,7 +835,7 @@ void EntityGUI_SketcherDlg::ClickOnUndo() setEnabledRedo(true); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } //================================================================================= @@ -854,7 +856,7 @@ void EntityGUI_SketcherDlg::ClickOnRedo() if(myUndoCommand.count() == 1) setEnabledRedo(false); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } //================================================================================= @@ -918,7 +920,7 @@ void EntityGUI_SketcherDlg::SelectionIntoArgument() } } - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } @@ -992,7 +994,7 @@ void EntityGUI_SketcherDlg::ActivateThisDialog() myEditCurrentArgument = Group1Sel->LineEdit1; myEditCurrentArgument->setFocus(); - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } @@ -1187,7 +1189,7 @@ void EntityGUI_SketcherDlg::ValueChangedInSpinBox(double newValue) } } - GEOMBase_Helper::displayPreview(); + GEOMBase_Helper::displayPreview(false, true, true, myLineWidth); } @@ -1450,7 +1452,7 @@ void EntityGUI_SketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object, getDisplayer()->SetColor( Quantity_NOC_RED ); // set width of displayed shape - getDisplayer()->SetWidth( lineWidth ); + getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth ); // Disable activation of selection getDisplayer()->SetToActivate( activate ); diff --git a/src/EntityGUI/EntityGUI_SketcherDlg.h b/src/EntityGUI/EntityGUI_SketcherDlg.h index 4f930f9bc..64260b2ae 100644 --- a/src/EntityGUI/EntityGUI_SketcherDlg.h +++ b/src/EntityGUI/EntityGUI_SketcherDlg.h @@ -65,7 +65,8 @@ class GEOM_ENTITYGUI_EXPORT EntityGUI_SketcherDlg : public EntityGUI_Skeleton_QT public: EntityGUI_SketcherDlg(GeometryGUI* GUI, QWidget* parent = 0, - const char* name = 0, bool modal = FALSE, WFlags fl = 0); + const char* name = 0, bool modal = FALSE, WFlags fl = 0, + const double lineWidth = 2.); ~EntityGUI_SketcherDlg(); bool eventFilter (QObject* object, QEvent* event); @@ -127,6 +128,7 @@ private : DIR_TAN_LENGTH, DIR_TAN_X, DIR_TAN_Y, DIR_DXDY_LENGTH, DIR_DXDY_X, DIR_DXDY_Y}; + double myLineWidth; virtual void displayPreview ( GEOM::GEOM_Object_ptr obj, const bool append = false, const bool activate = false, diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index 6a3685b66..cb6483921 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -546,7 +546,7 @@ bool EntityGUI_SubShapeDlg::isValid( QString& msg ) bool EntityGUI_SubShapeDlg::execute( ObjectList& objects ) { GEOM::ListOfGO_var aList = GEOM::GEOM_IShapesOperations::_narrow( - getOperation() )->MakeExplode( myObject, shapeType(), false ); + getOperation() )->MakeExplode( myObject, shapeType(), true ); if ( !aList->length() ) return false; diff --git a/src/GEOMAlgo/GEOMAlgo.cdl b/src/GEOMAlgo/GEOMAlgo.cdl index f290d14d0..1e1e88f79 100755 --- a/src/GEOMAlgo/GEOMAlgo.cdl +++ b/src/GEOMAlgo/GEOMAlgo.cdl @@ -61,6 +61,55 @@ is ST_INOUT end State; -- + enumeration KindOfShape is + KS_UNKNOWN, + KS_SPHERE, + KS_CYLINDER, + KS_BOX, + KS_TORUS, + KS_CONE, + KS_ELLIPSE, + KS_PLANE, + KS_CIRCLE, + KS_LINE, + KS_DEGENERATED + end KindOfShape; + -- + enumeration KindOfName is + KN_UNKNOWN, + KN_SPHERE, + KN_CYLINDER, + KN_TORUS, + KN_CONE, + KN_ELLIPSE, + KN_CIRCLE, + KN_PLANE, + KN_LINE, + KN_BOX, + KN_SEGMENT, + KN_ARCCIRCLE, + KN_POLYGON, + KN_POLYHEDRON, + KN_DISKCIRCLE, + KN_DISKELLIPSE, + KN_RECTANGLE, + KN_TRIANGLE, + KN_QUADRANGLE, + KN_ARCELLIPSE + end KindOfName; + -- + enumeration KindOfBounds is + KB_UNKNOWN, + KB_TRIMMED, + KB_INFINITE + end KindOfBounds; + -- + enumeration KindOfClosed is + KC_UNKNOWN, + KC_CLOSED, + KC_NOTCLOSED + end KindOfClosed; + -- deferred class HAlgo; deferred class Clsf; class ClsfSurf; @@ -73,8 +122,12 @@ is deferred class Algo; deferred class ShapeAlgo; -- + class ShapeInfo; + class ShapeInfoFiller; + -- -- gluer class Gluer; + class Gluer1; class GlueAnalyser; class CoupleOfShapes; class PassKey; @@ -94,7 +147,16 @@ is -- class FinderShapeOn1; class StateCollector; - + -- adds + deferred class HAlgo; + deferred class Clsf; + class ClsfSurf; + class ClsfBox; + --modified by NIZNHY-PKV Mon Jan 29 10:27:44 2007f + class ClsfSolid; + --modified by NIZNHY-PKV Mon Jan 29 10:27:46 2007t + class FinderShapeOn2; + class PassKeyShapeMapHasher; -- -- Builder/Splitter deferred class BuilderShape; @@ -151,21 +213,47 @@ is instantiates List from TCollection (CoupleOfShapes from GEOMAlgo); - class IndexedDataMapOfShapeState + class IndexedDataMapOfShapeState instantiates IndexedDataMap from TCollection (Shape from TopoDS, State from TopAbs, ShapeMapHasher from TopTools); - class ListOfPnt + class ListOfPnt instantiates List from TCollection (Pnt from gp); - class DataMapOfPassKeyInteger + class DataMapOfPassKeyInteger instantiates DataMap from TCollection (PassKey from GEOMAlgo, Integer from Standard, PassKeyMapHasher from GEOMAlgo); - class IndexedDataMapOfPassKeyShapeListOfShape + class IndexedDataMapOfPassKeyShapeListOfShape instantiates IndexedDataMap from TCollection (PassKeyShape from GEOMAlgo, ListOfShape from TopTools, PassKeyShapeMapHasher from GEOMAlgo); + class IndexedDataMapOfShapeShapeInfo + instantiates IndexedDataMap from TCollection (Shape from TopoDS, + ShapeInfo from GEOMAlgo, + ShapeMapHasher from TopTools); + + class DataMapOfPassKeyShapeShape + instantiates DataMap from TCollection (PassKeyShape from GEOMAlgo, + Shape from TopoDS, + PassKeyShapeMapHasher from GEOMAlgo); + + class DataMapOfShapeShapeSet instantiates + DataMap from TCollection(Shape from TopoDS, + ShapeSet from GEOMAlgo, + ShapeMapHasher from TopTools); + + class DataMapOfShapeReal instantiates + DataMap from TCollection(Shape from TopoDS, + Real from Standard, + ShapeMapHasher from TopTools); + + + class DataMapOfRealListOfShape instantiates + DataMap from TCollection(Real from Standard, + ListOfShape from TopTools, + MapRealHasher from TColStd); + end GEOMAlgo; diff --git a/src/GEOMAlgo/GEOMAlgo_Builder.cdl b/src/GEOMAlgo/GEOMAlgo_Builder.cdl index 42eb89e86..967bc05f9 100755 --- a/src/GEOMAlgo/GEOMAlgo_Builder.cdl +++ b/src/GEOMAlgo/GEOMAlgo_Builder.cdl @@ -99,6 +99,13 @@ is -- -- protected methods -- + -- + PerformInternal(me:out; + theDSF: DSFiller from NMTTools) + ---Purpose: Performs calculations using prepared DSFiller + -- object theDSF + is protected; + -- PrepareHistory (me:out) ---Purpose: Prepare information for history support is redefined protected; @@ -241,7 +248,7 @@ fields mySameDomainShapes: IndexedDataMapOfShapeShape from TopTools is protected; -- solids myDraftSolids : IndexedDataMapOfShapeShape from TopTools is protected; - + myEntryPoint : Integer from Standard is protected; -- end Builder; diff --git a/src/GEOMAlgo/GEOMAlgo_Builder.cxx b/src/GEOMAlgo/GEOMAlgo_Builder.cxx index 0ab651cde..284cd7b10 100755 --- a/src/GEOMAlgo/GEOMAlgo_Builder.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Builder.cxx @@ -52,6 +52,7 @@ { myNbTypes=9; myDSFiller=NULL; + myEntryPoint=0; // Entry point through PerformWithFiller () } //======================================================================= //function : ~ @@ -59,6 +60,12 @@ //======================================================================= GEOMAlgo_Builder::~GEOMAlgo_Builder() { + if (myEntryPoint==1) { + if (myDSFiller) { + delete myDSFiller; + myDSFiller=NULL; + } + } } //======================================================================= //function : AddCompound @@ -253,18 +260,33 @@ aBB.Add(aCS, aS); } // + if (myDSFiller) { + delete myDSFiller; + myDSFiller=NULL; + } NMTTools_DSFiller* pDSF=new NMTTools_DSFiller; // pDSF->SetCompositeShape(aCS); pDSF->Perform(); // - PerformWithFiller(*pDSF); + myEntryPoint=1; + PerformInternal(*pDSF); } //======================================================================= //function : PerformWithFiller //purpose : //======================================================================= void GEOMAlgo_Builder::PerformWithFiller(const NMTTools_DSFiller& theDSF) +{ + myEntryPoint=0; + // + PerformInternal(theDSF); +} +//======================================================================= +//function : PerformInternal +//purpose : +//======================================================================= + void GEOMAlgo_Builder::PerformInternal(const NMTTools_DSFiller& theDSF) { myErrorStatus=0; // diff --git a/src/GEOMAlgo/GEOMAlgo_Builder.hxx b/src/GEOMAlgo/GEOMAlgo_Builder.hxx index b6bc2e9e1..2f38d77fb 100644 --- a/src/GEOMAlgo/GEOMAlgo_Builder.hxx +++ b/src/GEOMAlgo/GEOMAlgo_Builder.hxx @@ -137,6 +137,10 @@ protected: // Methods PROTECTED // +//! Performs calculations using prepared DSFiller
+//! object theDSF
+Standard_EXPORT void PerformInternal(const NMTTools_DSFiller& theDSF) ; + //! Prepare information for history support
Standard_EXPORT virtual void PrepareHistory() ; @@ -220,6 +224,7 @@ TopTools_IndexedDataMapOfShapeListOfShape myInParts; BRepAlgo_Image mySplitFaces; TopTools_IndexedDataMapOfShapeShape mySameDomainShapes; TopTools_IndexedDataMapOfShapeShape myDraftSolids; +Standard_Integer myEntryPoint; private: diff --git a/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx b/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx index a6661075f..724e9c77f 100755 --- a/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx +++ b/src/GEOMAlgo/GEOMAlgo_BuilderFace.cxx @@ -578,7 +578,77 @@ void MakeInternalWires(const TopTools_MapOfShape& theME, theWires.Append(aW); } } +//======================================================================= +//function : IsInside +//purpose : +//======================================================================= +Standard_Boolean IsInside(const TopoDS_Shape& theHole, + const TopoDS_Shape& theF2, + IntTools_PContext& theContext) +{ + Standard_Boolean bRet; + Standard_Real aT, aU, aV; + + TopAbs_State aState; + TopExp_Explorer aExp; + TopTools_IndexedMapOfShape aME2; + gp_Pnt2d aP2D; + // + bRet=Standard_False; + aState=TopAbs_UNKNOWN; + const TopoDS_Face& aF2=TopoDS::Face(theF2); + // + TopExp::MapShapes(aF2, TopAbs_EDGE, aME2); + // + aExp.Init(theHole, TopAbs_EDGE); + if (aExp.More()) { + const TopoDS_Edge& aE = TopoDS::Edge(aExp.Current()); + if (aME2.Contains(aE)) { + return bRet; + } + // + aT=BOPTools_Tools2D::IntermediatePoint(aE); + BOPTools_Tools2D::PointOnSurface(aE, aF2, aT, aU, aV); + aP2D.SetCoord(aU, aV); + // + IntTools_FClass2d& aClsf=theContext->FClass2d(aF2); + aState=aClsf.Perform(aP2D); + bRet=(aState==TopAbs_IN); + } + // + return bRet; +} +//======================================================================= +//function : IsGrowthWire +//purpose : +//======================================================================= +Standard_Boolean IsGrowthWire(const TopoDS_Shape& theWire, + const TopTools_IndexedMapOfShape& theMHE) +{ + Standard_Boolean bRet; + TopoDS_Iterator aIt; + // + bRet=Standard_False; + if (theMHE.Extent()) { + aIt.Initialize(theWire); + for(; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aE=aIt.Value(); + if (theMHE.Contains(aE)) { + return !bRet; + } + } + } + return bRet; +} + +//BRepTools::Write(aFF, "ff"); +// +// ErrorStatus : +// 11 - Null Context +// 12 - Null face generix + +/* //======================================================================= //function : IsInside //purpose : @@ -606,71 +676,4 @@ Standard_Boolean IsInside(const TopoDS_Shape& theHole, } return (aState==TopAbs_IN); } -//======================================================================= -//function : IsGrowthWire -//purpose : -//======================================================================= -Standard_Boolean IsGrowthWire(const TopoDS_Shape& theWire, - const TopTools_IndexedMapOfShape& theMHE) -{ - Standard_Boolean bRet; - TopoDS_Iterator aIt; - // - bRet=Standard_False; - if (theMHE.Extent()) { - aIt.Initialize(theWire); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aE=aIt.Value(); - if (theMHE.Contains(aE)) { - return !bRet; - } - } - } - return bRet; -} -//modified by NIZNHY-PKV Mon Sep 18 13:18:27 2006f -/* -static - Standard_Boolean IsHole(const TopoDS_Shape& , - const TopoDS_Face& , - IntTools_PContext& ); */ -//modified by NIZNHY-PKV Mon Sep 18 13:18:34 2006t -//modified by NIZNHY-PKV Mon Sep 18 13:18:13 2006f -/* -//======================================================================= -//function : IsHole -//purpose : -//======================================================================= -Standard_Boolean IsHole(const TopoDS_Shape& theS2, - const TopoDS_Face& theFace, - IntTools_PContext& theContext) -{ - Standard_Boolean bIsHole; - Standard_Real aTol; - Handle(Geom_Surface) aS; - TopLoc_Location aLoc; - TopoDS_Face aF; - BRep_Builder aBB; - // - aTol=BRep_Tool::Tolerance(theFace); - aS=BRep_Tool::Surface(theFace, aLoc); - aBB.MakeFace(aF, aS, aLoc, aTol); - aBB.Add (aF, theS2); - // - IntTools_FClass2d& aClsf=theContext->FClass2d(aF); - // - bIsHole=aClsf.IsHole(); - // - return bIsHole; - // -} -*/ -//modified by NIZNHY-PKV Mon Sep 18 13:18:06 2006t - -//BRepTools::Write(aFF, "ff"); -// -// ErrorStatus : -// 11 - Null Context -// 12 - Null face generix - diff --git a/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cdl b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cdl new file mode 100755 index 000000000..ed6093c58 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cdl @@ -0,0 +1,59 @@ +-- Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +-- CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +-- +-- This library is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License. +-- +-- This library is distributed in the hope that it will be useful +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this library; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-- +-- See http:--www.salome-platform.org/ or email : webmaster.salome@opencascade.com +-- +-- File: GEOMAlgo_ClsfSolid.cdl +-- Created: Mon Jan 29 10:28:07 2007 +-- Author: Peter KURNEV +-- + + +class ClsfSolid from GEOMAlgo + inherits Clsf from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS + +--raises + +is + Create + returns mutable ClsfSolid from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ClsfSolid();" + + SetShape(me:mutable; + aS:Shape from TopoDS); + + Shape(me) + returns Shape from TopoDS; + ---C++: return const & + + Perform(me:mutable) + is redefined; + + CheckData(me:mutable) + is redefined; + + +fields + myShape: Shape from TopoDS is protected; + myPClsf: Address from Standard is protected; + +end ClsfSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cxx b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cxx new file mode 100755 index 000000000..0e779c996 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.cxx @@ -0,0 +1,139 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File: GEOMAlgo_ClsfSolid.cxx +// Created: Mon Jan 29 10:35:46 2007 +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_ClsfSolid::GEOMAlgo_ClsfSolid() +: + GEOMAlgo_Clsf() +{ + myPClsf=NULL; +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= + GEOMAlgo_ClsfSolid::~GEOMAlgo_ClsfSolid() +{ + if (myPClsf) { + BRepClass3d_SolidClassifier* pSC; + // + pSC=(BRepClass3d_SolidClassifier*)myPClsf; + delete pSC; + } +} +//======================================================================= +//function : SetShape +//purpose : +//======================================================================= + void GEOMAlgo_ClsfSolid::SetShape(const TopoDS_Shape& aS) +{ + myShape=aS; +} +//======================================================================= +//function : Shape +//purpose : +//======================================================================= + const TopoDS_Shape& GEOMAlgo_ClsfSolid::Shape()const +{ + return myShape; +} +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= + void GEOMAlgo_ClsfSolid::CheckData() +{ + myErrorStatus=0; + // + BRepClass3d_SolidClassifier* pSC; + TopAbs_ShapeEnum aType; + BRep_Builder aBB; + TopoDS_Solid aS; + // + if (myShape.IsNull()) { + myErrorStatus=10; // mySolid=NULL + return; + } + // + aType=myShape.ShapeType(); + if (!(aType==TopAbs_SOLID || aType==TopAbs_SHELL)) { + myErrorStatus=12; + return; + } + // + //=== + if (aType==TopAbs_SOLID) { + aS=TopoDS::Solid(myShape); + } + else { + aBB.MakeSolid(aS); + aBB.Add(aS, myShape); + } + // + if (myPClsf) { + pSC=(BRepClass3d_SolidClassifier*)myPClsf; + delete pSC; + } + // + pSC=new BRepClass3d_SolidClassifier(aS); + myPClsf=pSC; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + void GEOMAlgo_ClsfSolid::Perform() +{ + myErrorStatus=0; + // + if (!myPClsf) { + myErrorStatus=11; + return; + } + // + BRepClass3d_SolidClassifier* pSC; + // + pSC=(BRepClass3d_SolidClassifier*)myPClsf; + pSC->Perform(myPnt, myTolerance); + myState=pSC->State(); +} +// +// myErrorStatus : +// +// 10 - mySolid=NULL +// 11 - myPClsf=NULL +// 12 - unallowed type of myShape + diff --git a/src/GEOMAlgo/GEOMAlgo_ClsfSolid.hxx b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.hxx new file mode 100644 index 000000000..8feb5337e --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.hxx @@ -0,0 +1,106 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _GEOMAlgo_ClsfSolid_HeaderFile +#define _GEOMAlgo_ClsfSolid_HeaderFile + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_ClsfSolid_HeaderFile +#include +#endif + +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _Standard_Address_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Clsf_HeaderFile +#include +#endif +class TopoDS_Shape; + + + +class GEOMAlgo_ClsfSolid : public GEOMAlgo_Clsf { + +public: + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_ClsfSolid(); +Standard_EXPORT virtual ~GEOMAlgo_ClsfSolid(); + + +Standard_EXPORT void SetShape(const TopoDS_Shape& aS) ; + + +Standard_EXPORT const TopoDS_Shape& Shape() const; + + +Standard_EXPORT virtual void Perform() ; + + +Standard_EXPORT virtual void CheckData() ; +//Standard_EXPORT ~GEOMAlgo_ClsfSolid(); + + + + + // Type management + // + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const; + //Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const; + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // +TopoDS_Shape myShape; +Standard_Address myPClsf; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ClsfSolid.ixx b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.ixx new file mode 100644 index 000000000..c3a9f9b2d --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.ixx @@ -0,0 +1,74 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#include + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +//GEOMAlgo_ClsfSolid::~GEOMAlgo_ClsfSolid() {} + + + +Standard_EXPORT Handle_Standard_Type& GEOMAlgo_ClsfSolid_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(GEOMAlgo_Clsf); + static Handle_Standard_Type aType2 = STANDARD_TYPE(GEOMAlgo_HAlgo); + static Handle_Standard_Type aType3 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType4 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,aType4,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMAlgo_ClsfSolid", + sizeof(GEOMAlgo_ClsfSolid), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + + +// DownCast method +// allow safe downcasting +// +const Handle(GEOMAlgo_ClsfSolid) Handle(GEOMAlgo_ClsfSolid)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMAlgo_ClsfSolid) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMAlgo_ClsfSolid))) { + _anOtherObject = Handle(GEOMAlgo_ClsfSolid)((Handle(GEOMAlgo_ClsfSolid)&)AnObject); + } + } + + return _anOtherObject ; +} +const Handle(Standard_Type)& GEOMAlgo_ClsfSolid::DynamicType() const +{ + return STANDARD_TYPE(GEOMAlgo_ClsfSolid) ; +} +//Standard_Boolean GEOMAlgo_ClsfSolid::IsKind(const Handle(Standard_Type)& AType) const +//{ +// return (STANDARD_TYPE(GEOMAlgo_ClsfSolid) == AType || GEOMAlgo_Clsf::IsKind(AType)); +//} +//Handle_GEOMAlgo_ClsfSolid::~Handle_GEOMAlgo_ClsfSolid() {} + diff --git a/src/GEOMAlgo/GEOMAlgo_ClsfSolid.jxx b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.jxx new file mode 100644 index 000000000..3d84d0210 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ClsfSolid.jxx @@ -0,0 +1,25 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ClsfSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape.hxx b/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape.hxx new file mode 100644 index 000000000..8c046bf60 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape.hxx @@ -0,0 +1,113 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_HeaderFile +#define _GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_HeaderFile + +#ifndef _TCollection_BasicMapIterator_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +class Standard_NoSuchObject; +class GEOMAlgo_PassKeyShape; +class TopoDS_Shape; +class GEOMAlgo_PassKeyShapeMapHasher; +class GEOMAlgo_DataMapOfPassKeyShapeShape; +class GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape : public TCollection_BasicMapIterator { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape(); + + +Standard_EXPORT GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape(const GEOMAlgo_DataMapOfPassKeyShapeShape& aMap); + + +Standard_EXPORT void Initialize(const GEOMAlgo_DataMapOfPassKeyShapeShape& aMap) ; + + +Standard_EXPORT const GEOMAlgo_PassKeyShape& Key() const; + + +Standard_EXPORT const TopoDS_Shape& Value() const; + + + + + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_0.cxx b/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_0.cxx new file mode 100644 index 000000000..36e1955f0 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_0.cxx @@ -0,0 +1,57 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#include + +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShapeMapHasher_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif + + +#define TheKey GEOMAlgo_PassKeyShape +#define TheKey_hxx +#define TheItem TopoDS_Shape +#define TheItem_hxx +#define Hasher GEOMAlgo_PassKeyShapeMapHasher +#define Hasher_hxx +#define TCollection_DataMapNode GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_Type_() GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_Type_() +#define TCollection_DataMap GEOMAlgo_DataMapOfPassKeyShapeShape +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx b/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx new file mode 100644 index 000000000..856164622 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx @@ -0,0 +1,132 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#define _GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif + +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TCollection_MapNode_HeaderFile +#include +#endif +#ifndef _TCollection_MapNodePtr_HeaderFile +#include +#endif +class GEOMAlgo_PassKeyShape; +class TopoDS_Shape; +class GEOMAlgo_PassKeyShapeMapHasher; +class GEOMAlgo_DataMapOfPassKeyShapeShape; +class GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape; + + + +class GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape : public TCollection_MapNode { + +public: + // Methods PUBLIC + // + +GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape(const GEOMAlgo_PassKeyShape& K,const TopoDS_Shape& I,const TCollection_MapNodePtr& n); + + GEOMAlgo_PassKeyShape& Key() const; + + TopoDS_Shape& Value() const; +//Standard_EXPORT ~GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape(); + + + + + // Type management + // + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const; + //Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const; + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // +GEOMAlgo_PassKeyShape myKey; +TopoDS_Shape myValue; + + +}; + +#define TheKey GEOMAlgo_PassKeyShape +#define TheKey_hxx +#define TheItem TopoDS_Shape +#define TheItem_hxx +#define Hasher GEOMAlgo_PassKeyShapeMapHasher +#define Hasher_hxx +#define TCollection_DataMapNode GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_Type_() GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_Type_() +#define TCollection_DataMap GEOMAlgo_DataMapOfPassKeyShapeShape +#define TCollection_DataMap_hxx + +#include + +#undef TheKey +#undef TheKey_hxx +#undef TheItem +#undef TheItem_hxx +#undef Hasher +#undef Hasher_hxx +#undef TCollection_DataMapNode +#undef TCollection_DataMapNode_hxx +#undef TCollection_DataMapIterator +#undef TCollection_DataMapIterator_hxx +#undef Handle_TCollection_DataMapNode +#undef TCollection_DataMapNode_Type_ +#undef TCollection_DataMap +#undef TCollection_DataMap_hxx + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_0.cxx b/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_0.cxx new file mode 100644 index 000000000..424e74701 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_0.cxx @@ -0,0 +1,103 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#include + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShapeMapHasher_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +//GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape::~GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape() {} + + + +Standard_EXPORT Handle_Standard_Type& GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TCollection_MapNode); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape", + sizeof(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + + +// DownCast method +// allow safe downcasting +// +const Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape))) { + _anOtherObject = Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)((Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)&)AnObject); + } + } + + return _anOtherObject ; +} +const Handle(Standard_Type)& GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape::DynamicType() const +{ + return STANDARD_TYPE(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) ; +} +//Standard_Boolean GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape::IsKind(const Handle(Standard_Type)& AType) const +//{ +// return (STANDARD_TYPE(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) == AType || TCollection_MapNode::IsKind(AType)); +//} +//Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape::~Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape() {} +#define TheKey GEOMAlgo_PassKeyShape +#define TheKey_hxx +#define TheItem TopoDS_Shape +#define TheItem_hxx +#define Hasher GEOMAlgo_PassKeyShapeMapHasher +#define Hasher_hxx +#define TCollection_DataMapNode GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_Type_() GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_Type_() +#define TCollection_DataMap GEOMAlgo_DataMapOfPassKeyShapeShape +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape.hxx b/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape.hxx new file mode 100644 index 000000000..4e209557f --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape.hxx @@ -0,0 +1,155 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _GEOMAlgo_DataMapOfPassKeyShapeShape_HeaderFile +#define _GEOMAlgo_DataMapOfPassKeyShapeShape_HeaderFile + +#ifndef _TCollection_BasicMap_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _Standard_Boolean_HeaderFile +#include +#endif +class Standard_DomainError; +class Standard_NoSuchObject; +class GEOMAlgo_PassKeyShape; +class TopoDS_Shape; +class GEOMAlgo_PassKeyShapeMapHasher; +class GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape; +class GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_DataMapOfPassKeyShapeShape : public TCollection_BasicMap { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_DataMapOfPassKeyShapeShape(const Standard_Integer NbBuckets = 1); + + +Standard_EXPORT GEOMAlgo_DataMapOfPassKeyShapeShape& Assign(const GEOMAlgo_DataMapOfPassKeyShapeShape& Other) ; + GEOMAlgo_DataMapOfPassKeyShapeShape& operator =(const GEOMAlgo_DataMapOfPassKeyShapeShape& Other) +{ + return Assign(Other); +} + + + +Standard_EXPORT void ReSize(const Standard_Integer NbBuckets) ; + + +Standard_EXPORT void Clear() ; +~GEOMAlgo_DataMapOfPassKeyShapeShape() +{ + Clear(); +} + + + +Standard_EXPORT Standard_Boolean Bind(const GEOMAlgo_PassKeyShape& K,const TopoDS_Shape& I) ; + + +Standard_EXPORT Standard_Boolean IsBound(const GEOMAlgo_PassKeyShape& K) const; + + +Standard_EXPORT Standard_Boolean UnBind(const GEOMAlgo_PassKeyShape& K) ; + + +Standard_EXPORT const TopoDS_Shape& Find(const GEOMAlgo_PassKeyShape& K) const; + const TopoDS_Shape& operator()(const GEOMAlgo_PassKeyShape& K) const +{ + return Find(K); +} + + + +Standard_EXPORT TopoDS_Shape& ChangeFind(const GEOMAlgo_PassKeyShape& K) ; + TopoDS_Shape& operator()(const GEOMAlgo_PassKeyShape& K) +{ + return ChangeFind(K); +} + + + + + + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + +Standard_EXPORT GEOMAlgo_DataMapOfPassKeyShapeShape(const GEOMAlgo_DataMapOfPassKeyShapeShape& Other); + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx b/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx new file mode 100644 index 000000000..777551745 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx @@ -0,0 +1,60 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#include + +#ifndef _Standard_DomainError_HeaderFile +#include +#endif +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShapeMapHasher_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_HeaderFile +#include +#endif + + +#define TheKey GEOMAlgo_PassKeyShape +#define TheKey_hxx +#define TheItem TopoDS_Shape +#define TheItem_hxx +#define Hasher GEOMAlgo_PassKeyShapeMapHasher +#define Hasher_hxx +#define TCollection_DataMapNode GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape +#define TCollection_DataMapNode_Type_() GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_Type_() +#define TCollection_DataMap GEOMAlgo_DataMapOfPassKeyShapeShape +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx index cb2b0d424..9c27ede44 100755 --- a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx @@ -25,6 +25,11 @@ #include +#include +#include + +#include +#include #include #include @@ -77,8 +82,8 @@ #include #include -#include //qft -#include //qft +#include +#include #include // @@ -179,11 +184,9 @@ void GEOMAlgo_Gluer::MakeVertices() { myErrorStatus=0; // - Standard_Integer j, i, aNbV, aIndex, aNbVSD; + Standard_Integer j, i, aNbV, aNbVSD; TColStd_ListIteratorOfListOfInteger aIt; - Handle(Bnd_HArray1OfBox) aHAB; - Bnd_BoundSortBox aBSB; - TopoDS_Shape aSTmp, aVF; + TopoDS_Shape aVF; TopoDS_Vertex aVnew; TopTools_IndexedMapOfShape aMV, aMVProcessed; TopTools_ListIteratorOfListOfShape aItS; @@ -192,6 +195,11 @@ void GEOMAlgo_Gluer::MakeVertices() GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; GEOMAlgo_IndexedDataMapOfShapeBox aMSB; // + NMTDS_BoxBndTreeSelector aSelector; + NMTDS_BoxBndTree aBBTree; + NCollection_UBTreeFiller aTreeFiller(aBBTree); + // + // TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); aNbV=aMV.Extent(); if (!aNbV) { @@ -199,21 +207,23 @@ void GEOMAlgo_Gluer::MakeVertices() return; } // - aHAB=new Bnd_HArray1OfBox(1, aNbV); - // for (i=1; i<=aNbV; ++i) { const TopoDS_Shape& aV=aMV(i); Bnd_Box aBox; // aBox.SetGap(myTol); BRepBndLib::Add(aV, aBox); - aHAB->SetValue(i, aBox); + // + aTreeFiller.Add(i, aBox); + // aMIS.Add(i, aV); aMSB.Add(aV, aBox); } // - aBSB.Initialize(aHAB); + aTreeFiller.Fill(); // + //------------------------------ + // Chains for (i=1; i<=aNbV; ++i) { const TopoDS_Shape& aV=aMV(i); // @@ -221,31 +231,86 @@ void GEOMAlgo_Gluer::MakeVertices() continue; } // - const Bnd_Box& aBoxV=aMSB.FindFromKey(aV); - const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV); - aNbVSD=aLI.Extent(); - if (!aNbVSD) { - myErrorStatus=3; // it must not be - return; - } - // - // Images - // + Standard_Integer aNbIP, aIP, aNbIP1, aIP1; TopTools_ListOfShape aLVSD; + TColStd_MapOfInteger aMIP, aMIP1, aMIPC; + TColStd_MapIteratorOfMapOfInteger aIt1; // - aIt.Initialize(aLI); - for (j=0; aIt.More(); aIt.Next(), ++j) { - aIndex=aIt.Value(); - const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex); - if(!j) { - aVF=aVx; + aMIP.Add(i); + while(1) { + aNbIP=aMIP.Extent(); + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + if (aMIPC.Contains(aIP)) { + continue; + } + // + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + const Bnd_Box& aBoxVP=aMSB.FindFromKey(aVP); + // + aSelector.Clear(); + aSelector.SetBox(aBoxVP); + // + aNbVSD=aBBTree.Select(aSelector); + if (!aNbVSD) { + continue; // it must not be + } + // + const TColStd_ListOfInteger& aLI=aSelector.Indices(); + aIt.Initialize(aLI); + for (; aIt.More(); aIt.Next()) { + aIP1=aIt.Value(); + if (aMIP.Contains(aIP1)) { + continue; + } + aMIP1.Add(aIP1); + } //for (; aIt.More(); aIt.Next()) { + }//for(; aIt1.More(); aIt1.Next()) { + // + aNbIP1=aMIP1.Extent(); + if (!aNbIP1) { + break; } - aLVSD.Append(aVx); - aMVProcessed.Add(aVx); - } + // + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIPC.Add(aIP); + } + // + aMIP.Clear(); + aIt1.Initialize(aMIP1); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIP.Add(aIP); + } + aMIP1.Clear(); + }// while(1) // + // Fill myImages + aNbIP=aMIPC.Extent(); + // + if (!aNbIP) {// no SD vertices founded + aVF=aV; + aLVSD.Append(aV); + aMVProcessed.Add(aV); + } + else { // SD vertices founded [ aMIPC ] + aIt1.Initialize(aMIPC); + for(j=0; aIt1.More(); aIt1.Next(), ++j) { + aIP=aIt1.Key(); + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + if (!j) { + aVF=aVP; + } + aLVSD.Append(aVP); + aMVProcessed.Add(aVP); + } + } myImages.Bind(aVF, aLVSD); - } + }// for (i=1; i<=aNbV; ++i) { + //------------------------------ // // Make new vertices aMV.Clear(); @@ -281,7 +346,6 @@ void GEOMAlgo_Gluer::MakeVertices() for (; aItIm.More(); aItIm.Next()) { const TopoDS_Shape& aV=aItIm.Key(); const TopTools_ListOfShape& aLVSD=aItIm.Value(); - // aItS.Initialize(aLVSD); for (; aItS.More(); aItS.Next()) { const TopoDS_Shape& aVSD=aItS.Value(); @@ -424,8 +488,8 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) TopoDS_Shape aNewShape; TopTools_IndexedMapOfShape aMF; TopTools_ListIteratorOfListOfShape aItS; - GEOMAlgo_PassKeyShape aPKF;//qft - GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF;//qft + GEOMAlgo_PassKeyShape aPKF; + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF; // TopExp::MapShapes(myShape, aType, aMF); // @@ -433,7 +497,6 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) for (i=1; i<=aNbF; ++i) { const TopoDS_Shape& aS=aMF(i); // - //aPKF.Clear();//qft if (aType==TopAbs_FACE) { const TopoDS_Face& aF=TopoDS::Face(aS); FacePassKey(aF, aPKF); @@ -622,21 +685,12 @@ void GEOMAlgo_Gluer::InnerTolerance() void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF, GEOMAlgo_PassKeyShape& aPK) { - Standard_Integer i, aNbE;//, aNbMax;//qft + Standard_Integer i, aNbE; TopTools_ListOfShape aLE; TopTools_IndexedMapOfShape aME; // TopExp::MapShapes(aF, TopAbs_EDGE, aME); aNbE=aME.Extent(); - //qf - /* - aNbMax=aPK.NbMax(); - if (!aNbE || aNbE>aNbMax) { - myErrorStatus=101; // temprorary - return; - } - */ - //qt // for (i=1; i<=aNbE; ++i) { const TopoDS_Shape& aE=aME(i); @@ -647,10 +701,7 @@ void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF, const TopoDS_Shape& aER=myOrigins.Find(aE); aLE.Append(aER); } - //qf - //aPK.SetIds(aLE); aPK.SetShapes(aLE); - //qt } //======================================================================= //function : EdgePassKey @@ -669,10 +720,7 @@ void GEOMAlgo_Gluer::EdgePassKey(const TopoDS_Edge& aE, } const TopoDS_Shape& aVR1=myOrigins.Find(aV1); const TopoDS_Shape& aVR2=myOrigins.Find(aV2); - //qf - //aPK.SetIds(aVR1, aVR2); aPK.SetShapes(aVR1, aVR2); - //qt } //======================================================================= //function : MakeVertex @@ -774,7 +822,6 @@ void GEOMAlgo_Gluer::MakeEdge(const TopoDS_Edge& aE, BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge); } } -// //======================================================================= //function : MakeFace //purpose : @@ -834,15 +881,13 @@ void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, // aBB.Add(newWire, aER); } - //modified by NIZNHY-PKV Mon Jan 31 17:26:36 2005f - // + // xf TopTools_ListOfShape aLW; // aLW.Append(aW); myImages.Bind(newWire, aLW); myOrigins.Bind(aW, newWire); - // - //modified by NIZNHY-PKV Mon Jan 31 17:26:41 2005 t + // xt aBB.Add(newFace, newWire); } aNewFace=newFace; @@ -963,10 +1008,10 @@ const TopTools_ListOfShape& GEOMAlgo_Gluer::Modified (const TopoDS_Shape& aS) aType=aS.ShapeType(); if (aType==TopAbs_VERTEX || aType==TopAbs_EDGE || - aType==TopAbs_WIRE || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft + aType==TopAbs_WIRE || aType==TopAbs_FACE || - aType==TopAbs_SHELL || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft - aType==TopAbs_SOLID) { //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft + aType==TopAbs_SHELL || + aType==TopAbs_SOLID) { if(myOrigins.IsBound(aS)) { const TopoDS_Shape& aSnew=myOrigins.Find(aS); if (!aSnew.IsSame(aS)) { diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer1.cdl b/src/GEOMAlgo/GEOMAlgo_Gluer1.cdl new file mode 100755 index 000000000..d226781a7 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer1.cdl @@ -0,0 +1,71 @@ +-- Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +-- CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +-- +-- This library is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License. +-- +-- This library is distributed in the hope that it will be useful +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this library; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-- +-- See http:--www.salome-platform.org/ or email : webmaster.salome@opencascade.com +-- +-- File: GEOMAlgo_Gluer1.cdl +-- Created: Wed Jan 24 11:37:31 2007 +-- Author: Peter KURNEV +-- + + +class Gluer1 from GEOMAlgo + inherits Gluer from GEOMAlgo + + ---Purpose: + +uses + ListOfCoupleOfShapes from GEOMAlgo, + DataMapOfPassKeyShapeShape from GEOMAlgo + +--raises + +is + Create + returns Gluer1 from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_Gluer1();" + + SetFacesToUnglue(me:out; + aLCS:ListOfCoupleOfShapes from GEOMAlgo); + + FacesToUnglue(me) + returns ListOfCoupleOfShapes from GEOMAlgo; + ---C++: return const& + + GluedFaces(me) + returns ListOfCoupleOfShapes from GEOMAlgo; + ---C++: return const& + + RejectedFaces(me) + returns ListOfCoupleOfShapes from GEOMAlgo; + ---C++: return const& + + Perform(me:out) + is redefined; + + UnglueFaces(me:out); + + FillGluedFaces(me:out) + is protected; + +fields + myGluedFaces :ListOfCoupleOfShapes from GEOMAlgo is protected; + myFacesToUnglue :ListOfCoupleOfShapes from GEOMAlgo is protected; + myRejectedFaces :ListOfCoupleOfShapes from GEOMAlgo is protected; + myMapGN :DataMapOfPassKeyShapeShape from GEOMAlgo is protected; + +end Gluer1; diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer1.cxx b/src/GEOMAlgo/GEOMAlgo_Gluer1.cxx new file mode 100755 index 000000000..d1636fea5 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer1.cxx @@ -0,0 +1,542 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File: GEOMAlgo_Gluer1.cxx +// Created: Wed Jan 24 11:52:27 2007 +// Author: Peter KURNEV +// + + +#include + +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//class : GEOMAlgo_CoupleOfInteger +//purpose : +//======================================================================= +class GEOMAlgo_CoupleOfInteger { + // + public: + // + GEOMAlgo_CoupleOfInteger() { + myInt1=0; + myInt2=0; + } + // + ~GEOMAlgo_CoupleOfInteger() { + } + // + void SetValues(const Standard_Integer aI1, + const Standard_Integer aI2) { + myInt1=aI1; + myInt2=aI2; + } + // + void SetValue1(const Standard_Integer aI1) { + myInt1=aI1; + } + // + void SetValue2(const Standard_Integer aI1) { + myInt1=aI1; + } + // + void Values(Standard_Integer& aI1, + Standard_Integer& aI2) const { + aI1=myInt1; + aI2=myInt2; + } + // + Standard_Integer Value1()const { + return myInt1; + } + // + Standard_Integer Value2()const { + return myInt2; + } + // + protected: + Standard_Integer myInt1; + Standard_Integer myInt2; +}; +// +//======================================================================= +// +static + void SortShell(const Standard_Integer , + GEOMAlgo_CoupleOfInteger* ); +static + void RefineSolid(const TopoDS_Shape& , + const TopTools_DataMapOfShapeShape& , + TopTools_DataMapOfShapeShape& ); +static + void MakeFaceToReplace(const TopoDS_Face& , + TopoDS_Face& ); +// +//======================================================================= +//function : GEOMAlgo_Gluer1 +//purpose : +//======================================================================= + GEOMAlgo_Gluer1::GEOMAlgo_Gluer1() +: + GEOMAlgo_Gluer() +{ +} +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_Gluer1::~GEOMAlgo_Gluer1() +{ +} +//======================================================================= +//function : SetFacesToUnglue +//purpose : +//======================================================================= + void GEOMAlgo_Gluer1::SetFacesToUnglue(const GEOMAlgo_ListOfCoupleOfShapes& aLCS) +{ + myFacesToUnglue=aLCS; +} +//======================================================================= +//function : FacesToUnglue +//purpose : +//======================================================================= + const GEOMAlgo_ListOfCoupleOfShapes& GEOMAlgo_Gluer1::FacesToUnglue()const +{ + return myFacesToUnglue; +} +//======================================================================= +//function : GluedFaces +//purpose : +//======================================================================= + const GEOMAlgo_ListOfCoupleOfShapes& GEOMAlgo_Gluer1::GluedFaces()const +{ + return myGluedFaces; +} +//======================================================================= +//function : RejectedFaces +//purpose : +//======================================================================= + const GEOMAlgo_ListOfCoupleOfShapes& GEOMAlgo_Gluer1::RejectedFaces()const +{ + return myRejectedFaces; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + void GEOMAlgo_Gluer1::Perform() +{ + // 1. + GEOMAlgo_Gluer::Perform(); + if (myErrorStatus) { + return; + } + // + FillGluedFaces(); + if (myErrorStatus) { + return; + } +} +//======================================================================= +//function : FillGluedFaces +//purpose : +//======================================================================= + void GEOMAlgo_Gluer1::FillGluedFaces() +{ + myErrorStatus=0; + // + Standard_Integer aNbIm, aNbS, i; + TopAbs_ShapeEnum aType; + TopTools_ListIteratorOfListOfShape aItLS; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + GEOMAlgo_CoupleOfShapes aCS; + GEOMAlgo_PassKeyShape aPKS; + // + myMapGN.Clear(); + myGluedFaces.Clear(); + // + aNbIm=myImages.Extent(); + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aSnew=aItIm.Key(); + aType=aSnew.ShapeType(); + if (aType!=TopAbs_FACE) { + continue; + } + // + const TopTools_ListOfShape& aLS=aItIm.Value(); + aNbS=aLS.Extent(); + if (aNbS!=2) { + continue; + } + // + TopoDS_Shape aSold[2]; + aItLS.Initialize(aLS); + for (i=0; aItLS.More(); aItLS.Next(), ++i) { + const TopoDS_Shape& aSi=aItLS.Value(); + aSold[i]=aItLS.Value(); + } + // + aCS.SetShapes(aSold[0], aSold[1]); + myGluedFaces.Append(aCS); + // + aPKS.Clear(); + aPKS.SetShapes(aSold[0], aSold[1]); + myMapGN.Bind(aPKS, aSnew); + } +} +//======================================================================= +//function : UnglueFaces +//purpose : +//======================================================================= + void GEOMAlgo_Gluer1::UnglueFaces() +{ + if (myErrorStatus) { + return; + } + // + Standard_Boolean bFound; + Standard_Integer i, aNbUN, aNbS, aNbF, iX; + TopTools_IndexedDataMapOfShapeListOfShape aMFSR, aMFS, aMSF; + TopTools_ListIteratorOfListOfShape aItLS, aItLS1; + GEOMAlgo_PassKeyShape aPKS; + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes aItCS; + GEOMAlgo_DataMapOfPassKeyShapeShape aMapUN; + GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape aItUN; + GEOMAlgo_CoupleOfInteger *pIx; + // + if (myResult.IsNull()) { + myErrorStatus=200; // no result + return; + } + myWarningStatus=0; + myRejectedFaces.Clear(); + // + // 0. Fill map [Face]/Solid for myResult: aMFSR + TopExp::MapShapesAndAncestors(myResult, TopAbs_FACE, TopAbs_SOLID, aMFSR); + // + // 1. Fill Faces to process: aMapUN : [Fold1, Fold2] / Fnew + aNbUN=myFacesToUnglue.Extent(); + if (!aNbUN) { + // all faces that can be unglued will be unglued + aMapUN=myMapGN; + myFacesToUnglue=myGluedFaces; + } + else { + aItCS.Initialize(myFacesToUnglue); + for (; aItCS.More(); aItCS.Next()) { + const GEOMAlgo_CoupleOfShapes& aCS=aItCS.Value(); + const TopoDS_Shape& aS1=aCS.Shape1(); + const TopoDS_Shape& aS2=aCS.Shape2(); + aPKS.Clear(); + aPKS.SetShapes(aS1, aS2); + if (!myMapGN.IsBound(aPKS)) { + //some faces, wanted to unglue, are not glued at all; + myWarningStatus=2; + myRejectedFaces.Append(aCS); + continue; + } + // + const TopoDS_Shape& aFN=myMapGN.Find(aPKS); + aMapUN.Bind(aPKS, aFN); + } + } + // + // 2 Fill map FN/Solids for myResult: aMFS + aNbUN=aMapUN.Extent(); + aItUN.Initialize(aMapUN); + for (; aItUN.More(); aItUN.Next()) { + const TopoDS_Shape& aFN=aItUN.Value(); + if (!aMFSR.Contains(aFN)) { + myWarningStatus=3; // how can it be + continue; + } + // + const TopTools_ListOfShape& aLS=aMFSR.FindFromKey(aFN); + aNbS=aLS.Extent(); + if (aNbS!=2) { + // wrong result: More than 2 solids shared one face + myWarningStatus=4; + continue; + } + aMFS.Add(aFN, aLS); + } + // + // 3 Fill map Solids/FN for myResult: aMSF + aNbUN=aMFS.Extent(); + for (i=1; i<=aNbUN; ++i) { + const TopoDS_Shape& aFN=aMFS.FindKey(i); + const TopTools_ListOfShape& aLS=aMFS(i); + aItLS.Initialize(aLS); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aS=aItLS.Value(); + if (aMSF.Contains(aS)) { + TopTools_ListOfShape& aLF=aMSF.ChangeFromKey(aS); + aLF.Append(aFN); + } + else { + TopTools_ListOfShape aLF; + aLF.Append(aFN); + aMSF.Add(aS, aLF); + } + } + } + // + // 4 Sort indices of aMSF + aNbS=aMSF.Extent(); + if (aNbS<2) { + // wrong number of solids that have shared face + myWarningStatus=5; + } + // + pIx=new GEOMAlgo_CoupleOfInteger[aNbS]; + // + for (i=1; i<=aNbS; ++i) { + const TopTools_ListOfShape& aLF=aMSF(i); + aNbF=aLF.Extent(); + pIx[i-1].SetValues(aNbF, i); + } + SortShell(aNbS, pIx); + // + // 5 Refine solids + // + TopTools_DataMapOfShapeShape aMFNFN2, aMFNFD; + TopTools_DataMapIteratorOfDataMapOfShapeShape aItMSS; + TopTools_MapOfShape aMFNP; + TopTools_IndexedMapOfShape aMFD; + // + for (iX=aNbS-1; iX>=0; --iX) { + i=pIx[iX].Value2(); + // solid from myResult aSN + const TopoDS_Shape& aSN=aMSF.FindKey(i); + // + // candidates to be faces to replace for aSN + const TopTools_ListOfShape& aLFN=aMSF(i); + aNbF=aLFN.Extent(); + // + // original solid for aSN -> aSD + const TopTools_ListOfShape& aLSD=myImages.Find(aSN); + const TopoDS_Shape& aSD=aLSD.First(); + // + // faces of original solid -> aMFD + aMFD.Clear(); + TopExp::MapShapes(aSD, TopAbs_FACE, aMFD); + // + // faces to replace for aSN [FN]/FD -> aMFNFD + aMFNFD.Clear(); + aItLS.Initialize(aLFN); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aFN=aItLS.Value(); + if (!aMFNP.Add(aFN)) { + continue; + } + // + // original face from original solid -> FD + TopoDS_Shape aFD; + // + bFound=Standard_False; + const TopTools_ListOfShape& aLFD=myImages.Find(aFN); + aItLS1.Initialize(aLFD); + for (; aItLS1.More(); aItLS1.Next()) { + const TopoDS_Shape& aFDx=aItLS1.Value(); + if (aMFD.Contains(aFDx)) { + aFD=aFDx; + bFound=Standard_True; + break; + } + } + //if (!bFound) {...} + aMFNFD.Bind(aFN, aFD); + } // for (; aItLS.More(); aItLS.Next()) { + // + aNbF=aMFNFD.Extent(); + if (!aNbF) { + // nothing to do here + continue; + } + // update solid SN (and its shells) + RefineSolid(aSN, aMFNFD, aMFNFN2); + // + // update myOrigins / myImages + aItMSS.Initialize(aMFNFD); + for (; aItMSS.More(); aItMSS.Next()) { + const TopoDS_Shape& aFN=aItMSS.Key(); // face removed from aSN + const TopoDS_Shape& aFD=aItMSS.Value(); // old face from aSD + const TopoDS_Shape& aFN2=aMFNFN2.Find(aFN);// face added to aSN + // + // myOrigins + myOrigins.ChangeFind(aFD)=aFN2; + // + // myImages + TopTools_ListOfShape aLFDx; + // + TopTools_ListOfShape& aLFD=myImages.ChangeFind(aFN); + aItLS.Initialize(aLFD); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aFDx=aItLS.Value(); + if (!aFDx.IsSame(aFD)) { + aLFDx.Append(aFDx); + } + } + aLFD=aLFDx; + // + aLFDx.Clear(); + aLFDx.Append(aFD); + myImages.Bind(aFN2, aLFDx); + } // for (; aItMSS.More(); aItMSS.Next()) { + } // for (iX=aNbS-1; iX>=0; --iX) { + // + delete [] pIx; +} +//======================================================================= +// function: RefineSolid +// purpose : replace faces (aMFN) of solid aSd by new ones +//======================================================================= +void RefineSolid(const TopoDS_Shape& aSd, + const TopTools_DataMapOfShapeShape& aMFNFD, + TopTools_DataMapOfShapeShape& aMFNFN2) +{ + TopoDS_Shape *pSh; + TopoDS_Face aF2; + TopoDS_Iterator aItSd, aItSh; + BRep_Builder aBB; + TopTools_ListOfShape aLF; + TopTools_ListIteratorOfListOfShape aItLF; + // + aItSd.Initialize(aSd); + for (; aItSd.More(); aItSd.Next()) { + const TopoDS_Shape& aSh=aItSd.Value(); + pSh=(TopoDS_Shape *)&aSh; + pSh->Free(Standard_True); + aLF.Clear(); + aItSh.Initialize(*pSh); + for (; aItSh.More(); aItSh.Next()) { + const TopoDS_Shape& aF=aItSh.Value(); + if (aMFNFD.IsBound(aF)) { + aLF.Append(aF); + } + } + // + aItLF.Initialize(aLF); + for (; aItLF.More(); aItLF.Next()) { + const TopoDS_Face& aF=TopoDS::Face(aItLF.Value()); + // + MakeFaceToReplace(aF, aF2); + // + aMFNFN2.Bind(aF, aF2); + aBB.Remove(*pSh, aF); + aBB.Add(*pSh, aF2); + } + pSh->Free(Standard_False); + } +} +//======================================================================= +//function : MakeFaceToReplace +//purpose : +//======================================================================= +void MakeFaceToReplace(const TopoDS_Face& aF, + TopoDS_Face& aFR) +{ + Standard_Real aTol; + Handle(Geom_Surface) aS; + TopLoc_Location aLoc; + TopoDS_Face aFFWD, aFnew; + TopoDS_Iterator aItF; + BRep_Builder aBB; + // + aFFWD=aF; + aFFWD.Orientation(TopAbs_FORWARD); + aS=BRep_Tool::Surface(aFFWD, aLoc); + aTol=BRep_Tool::Tolerance(aFFWD); + // + aBB.MakeFace (aFnew, aS, aLoc, aTol); + aItF.Initialize(aFFWD); + for (; aItF.More(); aItF.Next()) { + const TopoDS_Shape& aW=aItF.Value(); + aBB.Add(aFnew, aW); + } + aFnew.Orientation(aF.Orientation()); + aFR=aFnew; +} +//======================================================================= +// function: SortShell +// purpose : +//======================================================================= +void SortShell(const Standard_Integer n, + GEOMAlgo_CoupleOfInteger* a) +{ + Standard_Integer nd, i, j, l, d=1; + GEOMAlgo_CoupleOfInteger x; + // + while(d<=n) { + d*=2; + } + // + while (d) { + d=(d-1)/2; + // + nd=n-d; + for (i=0; i -1) { + goto m30; + } + }//if (a[l] < a[j]){ + }//for (i=0; i +#endif +#ifndef _GEOMAlgo_DataMapOfPassKeyShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Gluer_HeaderFile +#include +#endif +class GEOMAlgo_ListOfCoupleOfShapes; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_Gluer1 : public GEOMAlgo_Gluer { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_Gluer1(); +Standard_EXPORT virtual ~GEOMAlgo_Gluer1(); + + +Standard_EXPORT void SetFacesToUnglue(const GEOMAlgo_ListOfCoupleOfShapes& aLCS) ; + + +Standard_EXPORT const GEOMAlgo_ListOfCoupleOfShapes& FacesToUnglue() const; + + +Standard_EXPORT const GEOMAlgo_ListOfCoupleOfShapes& GluedFaces() const; + + +Standard_EXPORT const GEOMAlgo_ListOfCoupleOfShapes& RejectedFaces() const; + + +Standard_EXPORT virtual void Perform() ; + + +Standard_EXPORT void UnglueFaces() ; + + + + + +protected: + + // Methods PROTECTED + // + + +Standard_EXPORT void FillGluedFaces() ; + + + // Fields PROTECTED + // +GEOMAlgo_ListOfCoupleOfShapes myGluedFaces; +GEOMAlgo_ListOfCoupleOfShapes myFacesToUnglue; +GEOMAlgo_ListOfCoupleOfShapes myRejectedFaces; +GEOMAlgo_DataMapOfPassKeyShapeShape myMapGN; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer1.ixx b/src/GEOMAlgo/GEOMAlgo_Gluer1.ixx new file mode 100644 index 000000000..9198a8dbb --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer1.ixx @@ -0,0 +1,24 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#include + + + + diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer1.jxx b/src/GEOMAlgo/GEOMAlgo_Gluer1.jxx new file mode 100644 index 000000000..bb63320eb --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer1.jxx @@ -0,0 +1,25 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _GEOMAlgo_ListOfCoupleOfShapes_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Gluer1_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx new file mode 100644 index 000000000..2c37056e2 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx @@ -0,0 +1,139 @@ +// File generated by CPPExt (Transient) +// +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile +#define _GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile +#include +#endif + +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif +#ifndef _TCollection_MapNodePtr_HeaderFile +#include +#endif +#ifndef _TCollection_MapNode_HeaderFile +#include +#endif +class TopoDS_Shape; +class GEOMAlgo_ShapeInfo; +class TopTools_ShapeMapHasher; +class GEOMAlgo_IndexedDataMapOfShapeShapeInfo; + + + +class GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo : public TCollection_MapNode { + +public: + // Methods PUBLIC + // + +GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo(const TopoDS_Shape& K1,const Standard_Integer K2,const GEOMAlgo_ShapeInfo& I,const TCollection_MapNodePtr& n1,const TCollection_MapNodePtr& n2); + + TopoDS_Shape& Key1() const; + + Standard_Integer& Key2() const; + + TCollection_MapNodePtr& Next2() const; + + GEOMAlgo_ShapeInfo& Value() const; +//Standard_EXPORT ~GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo(); + + + + + // Type management + // + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const; + //Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)&) const; + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // +TopoDS_Shape myKey1; +Standard_Integer myKey2; +GEOMAlgo_ShapeInfo myValue; +TCollection_MapNodePtr myNext2; + + +}; + +#define TheKey TopoDS_Shape +#define TheKey_hxx +#define TheItem GEOMAlgo_ShapeInfo +#define TheItem_hxx +#define Hasher TopTools_ShapeMapHasher +#define Hasher_hxx +#define TCollection_IndexedDataMapNode GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_hxx +#define Handle_TCollection_IndexedDataMapNode Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_Type_() GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_Type_() +#define TCollection_IndexedDataMap GEOMAlgo_IndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMap_hxx + +#include + +#undef TheKey +#undef TheKey_hxx +#undef TheItem +#undef TheItem_hxx +#undef Hasher +#undef Hasher_hxx +#undef TCollection_IndexedDataMapNode +#undef TCollection_IndexedDataMapNode_hxx +#undef Handle_TCollection_IndexedDataMapNode +#undef TCollection_IndexedDataMapNode_Type_ +#undef TCollection_IndexedDataMap +#undef TCollection_IndexedDataMap_hxx + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_0.cxx b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_0.cxx new file mode 100644 index 000000000..6afae1194 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_0.cxx @@ -0,0 +1,100 @@ +// File generated by CPPExt (Transient) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#include + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif +#ifndef _TopTools_ShapeMapHasher_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapOfShapeShapeInfo_HeaderFile +#include +#endif +//GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo::~GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo() {} + + + +Standard_EXPORT Handle_Standard_Type& GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TCollection_MapNode); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo", + sizeof(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + + +// DownCast method +// allow safe downcasting +// +const Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo))) { + _anOtherObject = Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)((Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)&)AnObject); + } + } + + return _anOtherObject ; +} +const Handle(Standard_Type)& GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo::DynamicType() const +{ + return STANDARD_TYPE(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) ; +} +//Standard_Boolean GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo::IsKind(const Handle(Standard_Type)& AType) const +//{ +// return (STANDARD_TYPE(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) == AType || TCollection_MapNode::IsKind(AType)); +//} +//Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo::~Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo() {} +#define TheKey TopoDS_Shape +#define TheKey_hxx +#define TheItem GEOMAlgo_ShapeInfo +#define TheItem_hxx +#define Hasher TopTools_ShapeMapHasher +#define Hasher_hxx +#define TCollection_IndexedDataMapNode GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_hxx +#define Handle_TCollection_IndexedDataMapNode Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_Type_() GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_Type_() +#define TCollection_IndexedDataMap GEOMAlgo_IndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMap_hxx +#include + diff --git a/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx new file mode 100644 index 000000000..ef912354e --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx @@ -0,0 +1,172 @@ +// File generated by CPPExt (Value) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_IndexedDataMapOfShapeShapeInfo_HeaderFile +#define _GEOMAlgo_IndexedDataMapOfShapeShapeInfo_HeaderFile + +#ifndef _TCollection_BasicMap_HeaderFile +#include +#endif +#ifndef _Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _Standard_Boolean_HeaderFile +#include +#endif +class Standard_DomainError; +class Standard_OutOfRange; +class Standard_NoSuchObject; +class TopoDS_Shape; +class GEOMAlgo_ShapeInfo; +class TopTools_ShapeMapHasher; +class GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_IndexedDataMapOfShapeShapeInfo : public TCollection_BasicMap { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_IndexedDataMapOfShapeShapeInfo(const Standard_Integer NbBuckets = 1); + + +Standard_EXPORT GEOMAlgo_IndexedDataMapOfShapeShapeInfo& Assign(const GEOMAlgo_IndexedDataMapOfShapeShapeInfo& Other) ; + GEOMAlgo_IndexedDataMapOfShapeShapeInfo& operator =(const GEOMAlgo_IndexedDataMapOfShapeShapeInfo& Other) +{ + return Assign(Other); +} + + + +Standard_EXPORT void ReSize(const Standard_Integer NbBuckets) ; + + +Standard_EXPORT void Clear() ; +~GEOMAlgo_IndexedDataMapOfShapeShapeInfo() +{ + Clear(); +} + + + +Standard_EXPORT Standard_Integer Add(const TopoDS_Shape& K,const GEOMAlgo_ShapeInfo& I) ; + + +Standard_EXPORT void Substitute(const Standard_Integer I,const TopoDS_Shape& K,const GEOMAlgo_ShapeInfo& T) ; + + +Standard_EXPORT void RemoveLast() ; + + +Standard_EXPORT Standard_Boolean Contains(const TopoDS_Shape& K) const; + + +Standard_EXPORT const TopoDS_Shape& FindKey(const Standard_Integer I) const; + + +Standard_EXPORT const GEOMAlgo_ShapeInfo& FindFromIndex(const Standard_Integer I) const; + const GEOMAlgo_ShapeInfo& operator ()(const Standard_Integer I) const +{ + return FindFromIndex(I); +} + + + +Standard_EXPORT GEOMAlgo_ShapeInfo& ChangeFromIndex(const Standard_Integer I) ; + GEOMAlgo_ShapeInfo& operator ()(const Standard_Integer I) +{ + return ChangeFromIndex(I); +} + + + +Standard_EXPORT Standard_Integer FindIndex(const TopoDS_Shape& K) const; + + +Standard_EXPORT const GEOMAlgo_ShapeInfo& FindFromKey(const TopoDS_Shape& K) const; + + +Standard_EXPORT GEOMAlgo_ShapeInfo& ChangeFromKey(const TopoDS_Shape& K) ; + + + + + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + +Standard_EXPORT GEOMAlgo_IndexedDataMapOfShapeShapeInfo(const GEOMAlgo_IndexedDataMapOfShapeShapeInfo& Other); + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx new file mode 100644 index 000000000..96604846e --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx @@ -0,0 +1,60 @@ +// File generated by CPPExt (Value) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#include + +#ifndef _Standard_DomainError_HeaderFile +#include +#endif +#ifndef _Standard_OutOfRange_HeaderFile +#include +#endif +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif +#ifndef _TopTools_ShapeMapHasher_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile +#include +#endif + + +#define TheKey TopoDS_Shape +#define TheKey_hxx +#define TheItem GEOMAlgo_ShapeInfo +#define TheItem_hxx +#define Hasher TopTools_ShapeMapHasher +#define Hasher_hxx +#define TCollection_IndexedDataMapNode GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_hxx +#define Handle_TCollection_IndexedDataMapNode Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMapNode_Type_() GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_Type_() +#define TCollection_IndexedDataMap GEOMAlgo_IndexedDataMapOfShapeShapeInfo +#define TCollection_IndexedDataMap_hxx +#include + diff --git a/src/GEOMAlgo/GEOMAlgo_KindOfBounds.hxx b/src/GEOMAlgo/GEOMAlgo_KindOfBounds.hxx new file mode 100644 index 000000000..ba0043ebb --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_KindOfBounds.hxx @@ -0,0 +1,37 @@ +// File generated by CPPExt (Enum) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_KindOfBounds_HeaderFile +#define _GEOMAlgo_KindOfBounds_HeaderFile + + +enum GEOMAlgo_KindOfBounds { + GEOMAlgo_KB_UNKNOWN, +GEOMAlgo_KB_TRIMMED, +GEOMAlgo_KB_INFINITE +}; + + +#ifndef _Standard_PrimitiveTypes_HeaderFile +#include +#endif + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_KindOfClosed.hxx b/src/GEOMAlgo/GEOMAlgo_KindOfClosed.hxx new file mode 100644 index 000000000..9854aed36 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_KindOfClosed.hxx @@ -0,0 +1,37 @@ +// File generated by CPPExt (Enum) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_KindOfClosed_HeaderFile +#define _GEOMAlgo_KindOfClosed_HeaderFile + + +enum GEOMAlgo_KindOfClosed { + GEOMAlgo_KC_UNKNOWN, +GEOMAlgo_KC_CLOSED, +GEOMAlgo_KC_NOTCLOSED +}; + + +#ifndef _Standard_PrimitiveTypes_HeaderFile +#include +#endif + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_KindOfName.hxx b/src/GEOMAlgo/GEOMAlgo_KindOfName.hxx new file mode 100644 index 000000000..74c83eb78 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_KindOfName.hxx @@ -0,0 +1,54 @@ +// File generated by CPPExt (Enum) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_KindOfName_HeaderFile +#define _GEOMAlgo_KindOfName_HeaderFile + + +enum GEOMAlgo_KindOfName { + GEOMAlgo_KN_UNKNOWN, +GEOMAlgo_KN_SPHERE, +GEOMAlgo_KN_CYLINDER, +GEOMAlgo_KN_TORUS, +GEOMAlgo_KN_CONE, +GEOMAlgo_KN_ELLIPSE, +GEOMAlgo_KN_CIRCLE, +GEOMAlgo_KN_PLANE, +GEOMAlgo_KN_LINE, +GEOMAlgo_KN_BOX, +GEOMAlgo_KN_SEGMENT, +GEOMAlgo_KN_ARCCIRCLE, +GEOMAlgo_KN_POLYGON, +GEOMAlgo_KN_POLYHEDRON, +GEOMAlgo_KN_DISKCIRCLE, +GEOMAlgo_KN_DISKELLIPSE, +GEOMAlgo_KN_RECTANGLE, +GEOMAlgo_KN_TRIANGLE, +GEOMAlgo_KN_QUADRANGLE, +GEOMAlgo_KN_ARCELLIPSE +}; + + +#ifndef _Standard_PrimitiveTypes_HeaderFile +#include +#endif + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_KindOfShape.hxx b/src/GEOMAlgo/GEOMAlgo_KindOfShape.hxx new file mode 100644 index 000000000..1b5ead9f9 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_KindOfShape.hxx @@ -0,0 +1,45 @@ +// File generated by CPPExt (Enum) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _GEOMAlgo_KindOfShape_HeaderFile +#define _GEOMAlgo_KindOfShape_HeaderFile + + +enum GEOMAlgo_KindOfShape { + GEOMAlgo_KS_UNKNOWN, +GEOMAlgo_KS_SPHERE, +GEOMAlgo_KS_CYLINDER, +GEOMAlgo_KS_BOX, +GEOMAlgo_KS_TORUS, +GEOMAlgo_KS_CONE, +GEOMAlgo_KS_ELLIPSE, +GEOMAlgo_KS_PLANE, +GEOMAlgo_KS_CIRCLE, +GEOMAlgo_KS_LINE, +GEOMAlgo_KS_DEGENERATED +}; + + +#ifndef _Standard_PrimitiveTypes_HeaderFile +#include +#endif + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cdl b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cdl new file mode 100644 index 000000000..625638b67 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cdl @@ -0,0 +1,190 @@ +-- File: GEOMAlgo_ShapeInfo.cdl +-- Created: Mon Apr 2 14:04:24 2007 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2007 + + +class ShapeInfo from GEOMAlgo + + ---Purpose: + +uses + Pnt from gp, + Dir from gp, + Ax2 from gp, + Ax3 from gp, + + ShapeEnum from TopAbs, + Shape from TopoDS, + + KindOfShape from GEOMAlgo, + KindOfBounds from GEOMAlgo, + KindOfClosed from GEOMAlgo, + KindOfName from GEOMAlgo +--raises + +is + Create + returns ShapeInfo from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ShapeInfo();" + + Reset(me:out); + + SetType(me:out; + aType:ShapeEnum from TopAbs); + + Type(me) + returns ShapeEnum from TopAbs; + + SetNbSubShapes(me:out; + aType:ShapeEnum from TopAbs; + aNb :Integer from Standard); + + NbSubShapes(me; + aType:ShapeEnum from TopAbs) + returns Integer from Standard; + + SetKindOfShape (me:out; + aT:KindOfShape from GEOMAlgo); + + KindOfShape (me) + returns KindOfShape from GEOMAlgo; + + SetKindOfName (me:out; + aT: KindOfName from GEOMAlgo); + + KindOfName(me) + returns KindOfName from GEOMAlgo; + + SetKindOfBounds (me:out; + aT:KindOfBounds from GEOMAlgo); + + KindOfBounds (me) + returns KindOfBounds from GEOMAlgo; + + SetKindOfClosed (me:out; + aT:KindOfClosed from GEOMAlgo); + + KindOfClosed(me) + returns KindOfClosed from GEOMAlgo; + + SetLocation (me:out; + aP: Pnt from gp); + + Location (me) + returns Pnt from gp; + ---C++: return const& + + SetDirection (me:out; + aD:Dir from gp); + + Direction (me) + returns Dir from gp; + ---C++: return const& + + SetPosition (me:out; + aAx2 : Ax2 from gp); + + SetPosition (me:out; + aAx3 : Ax3 from gp); + + Position (me) + returns Ax3 from gp; + ---C++: return const& + + SetPnt1 (me:out; + aP: Pnt from gp); + + Pnt1 (me) + returns Pnt from gp; + ---C++: return const& + + SetPnt2 (me:out; + aP: Pnt from gp); + + Pnt2 (me) + returns Pnt from gp; + ---C++: return const& + + SetRadius1 (me:out; + aR: Real from Standard); + + Radius1(me) + returns Real from Standard; + + SetRadius2 (me:out; + aR: Real from Standard); + + Radius2(me) + returns Real from Standard; + + SetLength(me:out; + aL: Real from Standard); + + Length(me) + returns Real from Standard; + + SetWidth(me:out; + aW: Real from Standard); + + Width(me) + returns Real from Standard; + + SetHeight(me:out; + aH: Real from Standard); + + Height(me) + returns Real from Standard; + -- + -- Dump + -- + Dump(me); + + DumpVertex(me) + is protected; + + DumpEdge(me) + is protected; + + DumpWire(me) + is protected; + + DumpFace(me) + is protected; + + DumpShell(me) + is protected; + + DumpSolid(me) + is protected; + + DumpCompSolid(me) + is protected; + + DumpCompound(me) + is protected; + +fields + myType : ShapeEnum from TopAbs is protected; + myNbSubShapes : Integer from Standard[9] is protected; + myKindOfShape : KindOfShape from GEOMAlgo is protected; + myKindOfName : KindOfName from GEOMAlgo is protected; + myKindOfBounds : KindOfBounds from GEOMAlgo is protected; + myKindOfClosed : KindOfClosed from GEOMAlgo is protected; + -- + myLocation : Pnt from gp is protected; + myDirection : Dir from gp is protected; + myPosition : Ax3 from gp is protected; + -- + myRadius1 : Real from Standard is protected; + myRadius2 : Real from Standard is protected; + myLength : Real from Standard is protected; + myWidth : Real from Standard is protected; + myHeight : Real from Standard is protected; + -- + myPnt1 : Pnt from gp is protected; + myPnt2 : Pnt from gp is protected; + -- + myNbTypes : Integer from Standard is protected; +end ShapeInfo; diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cxx new file mode 100644 index 000000000..c12606236 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.cxx @@ -0,0 +1,871 @@ +#include + + +static + Standard_Integer TypeToInteger(const TopAbs_ShapeEnum aType); +static + void DumpKindOfShape(const GEOMAlgo_KindOfShape aKS); +static + void DumpKindOfClosed(const GEOMAlgo_KindOfClosed aKC); +static + void DumpKindOfBounds(const GEOMAlgo_KindOfBounds aKB); +static + void DumpKindOfName(const GEOMAlgo_KindOfName aKS); +static + void DumpPosition(const gp_Ax3& aAx3); +static + void DumpLocation(const gp_Pnt& aP); +static + void DumpDirection(const gp_Dir& aD); +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_ShapeInfo::GEOMAlgo_ShapeInfo() +{ + Reset(); +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= + GEOMAlgo_ShapeInfo::~GEOMAlgo_ShapeInfo() +{ +} +//======================================================================= +//function : Reset +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfo::Reset() +{ + Standard_Integer i; + // + myType=TopAbs_SHAPE; + // + myNbTypes=9; + for (i=0; i=0 && iN=0 && iN +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_KindOfShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_KindOfName_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_KindOfBounds_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_KindOfClosed_HeaderFile +#include +#endif +#ifndef _gp_Pnt_HeaderFile +#include +#endif +#ifndef _gp_Dir_HeaderFile +#include +#endif +#ifndef _gp_Ax3_HeaderFile +#include +#endif +#ifndef _Standard_Real_HeaderFile +#include +#endif +class gp_Pnt; +class gp_Dir; +class gp_Ax2; +class gp_Ax3; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_ShapeInfo { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_ShapeInfo(); +Standard_EXPORT virtual ~GEOMAlgo_ShapeInfo(); + + +Standard_EXPORT void Reset() ; + + +Standard_EXPORT void SetType(const TopAbs_ShapeEnum aType) ; + + +Standard_EXPORT TopAbs_ShapeEnum Type() const; + + +Standard_EXPORT void SetNbSubShapes(const TopAbs_ShapeEnum aType,const Standard_Integer aNb) ; + + +Standard_EXPORT Standard_Integer NbSubShapes(const TopAbs_ShapeEnum aType) const; + + +Standard_EXPORT void SetKindOfShape(const GEOMAlgo_KindOfShape aT) ; + + +Standard_EXPORT GEOMAlgo_KindOfShape KindOfShape() const; + + +Standard_EXPORT void SetKindOfName(const GEOMAlgo_KindOfName aT) ; + + +Standard_EXPORT GEOMAlgo_KindOfName KindOfName() const; + + +Standard_EXPORT void SetKindOfBounds(const GEOMAlgo_KindOfBounds aT) ; + + +Standard_EXPORT GEOMAlgo_KindOfBounds KindOfBounds() const; + + +Standard_EXPORT void SetKindOfClosed(const GEOMAlgo_KindOfClosed aT) ; + + +Standard_EXPORT GEOMAlgo_KindOfClosed KindOfClosed() const; + + +Standard_EXPORT void SetLocation(const gp_Pnt& aP) ; + + +Standard_EXPORT const gp_Pnt& Location() const; + + +Standard_EXPORT void SetDirection(const gp_Dir& aD) ; + + +Standard_EXPORT const gp_Dir& Direction() const; + + +Standard_EXPORT void SetPosition(const gp_Ax2& aAx2) ; + + +Standard_EXPORT void SetPosition(const gp_Ax3& aAx3) ; + + +Standard_EXPORT const gp_Ax3& Position() const; + + +Standard_EXPORT void SetPnt1(const gp_Pnt& aP) ; + + +Standard_EXPORT const gp_Pnt& Pnt1() const; + + +Standard_EXPORT void SetPnt2(const gp_Pnt& aP) ; + + +Standard_EXPORT const gp_Pnt& Pnt2() const; + + +Standard_EXPORT void SetRadius1(const Standard_Real aR) ; + + +Standard_EXPORT Standard_Real Radius1() const; + + +Standard_EXPORT void SetRadius2(const Standard_Real aR) ; + + +Standard_EXPORT Standard_Real Radius2() const; + + +Standard_EXPORT void SetLength(const Standard_Real aL) ; + + +Standard_EXPORT Standard_Real Length() const; + + +Standard_EXPORT void SetWidth(const Standard_Real aW) ; + + +Standard_EXPORT Standard_Real Width() const; + + +Standard_EXPORT void SetHeight(const Standard_Real aH) ; + + +Standard_EXPORT Standard_Real Height() const; + + +Standard_EXPORT void Dump() const; + + + + + +protected: + + // Methods PROTECTED + // + + +Standard_EXPORT void DumpVertex() const; + + +Standard_EXPORT void DumpEdge() const; + + +Standard_EXPORT void DumpWire() const; + + +Standard_EXPORT void DumpFace() const; + + +Standard_EXPORT void DumpShell() const; + + +Standard_EXPORT void DumpSolid() const; + + +Standard_EXPORT void DumpCompSolid() const; + + +Standard_EXPORT void DumpCompound() const; + + + // Fields PROTECTED + // +TopAbs_ShapeEnum myType; +Standard_Integer myNbSubShapes[9]; +GEOMAlgo_KindOfShape myKindOfShape; +GEOMAlgo_KindOfName myKindOfName; +GEOMAlgo_KindOfBounds myKindOfBounds; +GEOMAlgo_KindOfClosed myKindOfClosed; +gp_Pnt myLocation; +gp_Dir myDirection; +gp_Ax3 myPosition; +Standard_Real myRadius1; +Standard_Real myRadius2; +Standard_Real myLength; +Standard_Real myWidth; +Standard_Real myHeight; +gp_Pnt myPnt1; +gp_Pnt myPnt2; +Standard_Integer myNbTypes; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfo.ixx b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.ixx new file mode 100644 index 000000000..4d87536e8 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.ixx @@ -0,0 +1,26 @@ +// File generated by CPPExt (Value) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#include + + + + diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfo.jxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.jxx new file mode 100644 index 000000000..493c1c8a7 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfo.jxx @@ -0,0 +1,15 @@ +#ifndef _gp_Pnt_HeaderFile +#include +#endif +#ifndef _gp_Dir_HeaderFile +#include +#endif +#ifndef _gp_Ax2_HeaderFile +#include +#endif +#ifndef _gp_Ax3_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cdl b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cdl new file mode 100644 index 000000000..599a77d85 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cdl @@ -0,0 +1,132 @@ +-- File: GEOMAlgo_ShapeInfoFiller.cdl +-- Created: Mon Apr 2 15:05:34 2007 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2007 + + +class ShapeInfoFiller from GEOMAlgo + inherits Algo from GEOMAlgo + + ---Purpose: + +uses + Pln from gp, + Sphere from gp, + Cylinder from gp, + Cone from gp, + Torus from gp, + + Shape from TopoDS, + Face from TopoDS, + Solid from TopoDS, + + ShapeInfo from GEOMAlgo, + KindOfName from GEOMAlgo, + IndexedDataMapOfShapeShapeInfo from GEOMAlgo + +--raises + +is + + Create + returns ShapeInfoFiller from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ShapeInfoFiller();" + + SetShape(me:out; + aS:Shape from TopoDS); + + Shape(me) + returns Shape from TopoDS; + ---C++:return const & + + SetTolerance(me:out; + aT:Real from Standard); + + Tolerance(me) + returns Real from Standard; + + Info(me) + returns ShapeInfo from GEOMAlgo; + ---C++:return const & + + Info(me; + aS:Shape from TopoDS) + returns ShapeInfo from GEOMAlgo; + ---C++:return const & + + Perform(me:out) + is redefined; + + CheckData(me:out) + is redefined protected; + + FillNbSubShapes(me:out; + aS:Shape from TopoDS; + aInfo: out ShapeInfo from GEOMAlgo) + is protected; + + FillSubShapes(me:out; + aS:Shape from TopoDS) + is protected; + + FillShape(me:out; + aS:Shape from TopoDS) + is protected; + + FillVertex(me:out; + aS:Shape from TopoDS) + is protected; + + FillEdge(me:out; + aS:Shape from TopoDS) + is protected; + + FillFace(me:out; + aS:Shape from TopoDS) + is protected; + + FillSolid(me:out; + aS:Shape from TopoDS) + is protected; + + FillContainer(me:out; + aS:Shape from TopoDS) + is protected; + + + FillDetails(me:out; + aF:Face from TopoDS; + aPln:Pln from gp) + is protected; + + FillDetails(me:out; + aF:Face from TopoDS; + aSph:Sphere from gp) + is protected; + + FillDetails(me:out; + aF:Face from TopoDS; + aCyl:Cylinder from gp) + is protected; + + FillDetails(me:out; + aF:Face from TopoDS; + aCone:Cone from gp) + is protected; + + FillDetails(me:out; + aF:Face from TopoDS; + aTorus:Torus from gp) + is protected; + + FillDetails(me:out; + aS:Solid from TopoDS) + is protected; + +fields + myShape : Shape from TopoDS is protected; + myEmptyInfo : ShapeInfo from GEOMAlgo is protected; + myMapInfo : IndexedDataMapOfShapeShapeInfo from GEOMAlgo is protected; + myTolerance : Real from Standard is protected; +end ShapeInfoFiller; diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx new file mode 100644 index 000000000..0e53aa6e4 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.cxx @@ -0,0 +1,792 @@ +#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 + + + + +static + Standard_Boolean IsAllowedType(const GeomAbs_CurveType aCT); +static + Standard_Boolean IsAllowedType(const GeomAbs_SurfaceType aST); +static + Standard_Integer NbWires(const TopoDS_Face& aF); +static + Standard_Integer NbShells(const TopoDS_Solid& aS); + +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_ShapeInfoFiller::GEOMAlgo_ShapeInfoFiller() +: + GEOMAlgo_Algo() +{ + myTolerance=0.0001; +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= + GEOMAlgo_ShapeInfoFiller::~GEOMAlgo_ShapeInfoFiller() +{ +} +//======================================================================= +//function : SetTolerance +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::SetTolerance(const Standard_Real aT) +{ + myTolerance=aT; +} +//======================================================================= +//function : Tolerance +//purpose : +//======================================================================= + Standard_Real GEOMAlgo_ShapeInfoFiller::Tolerance()const +{ + return myTolerance; +} +//======================================================================= +//function : SetShape +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::SetShape(const TopoDS_Shape& aS) +{ + myShape=aS; +} +//======================================================================= +//function : Shape +//purpose : +//======================================================================= + const TopoDS_Shape& GEOMAlgo_ShapeInfoFiller::Shape() const +{ + return myShape; +} +//======================================================================= +//function : Info +//purpose : +//======================================================================= + const GEOMAlgo_ShapeInfo& GEOMAlgo_ShapeInfoFiller::Info() const +{ + return Info(myShape); +} +//======================================================================= +//function : Info +//purpose : +//======================================================================= + const GEOMAlgo_ShapeInfo& GEOMAlgo_ShapeInfoFiller::Info(const TopoDS_Shape& aS) const +{ + if (!aS.IsNull()) { + if (myMapInfo.Contains(aS)) { + const GEOMAlgo_ShapeInfo& aInfo=myMapInfo.FindFromKey(aS); + return aInfo; + } + } + return myEmptyInfo; +} + +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::CheckData() +{ + myErrorStatus=0; + // + if (myShape.IsNull()) { + myErrorStatus=10; + return; + } +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::Perform() +{ + myErrorStatus=0; + // + myMapInfo.Clear(); + // + CheckData(); + if (myErrorStatus) { + return; + } + // + FillShape(myShape); +} +//======================================================================= +//function :FillShape +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillShape(const TopoDS_Shape& aS) +{ + TopAbs_ShapeEnum aType; + // + aType=aS.ShapeType(); + switch(aType) { + // + case TopAbs_VERTEX: + FillVertex(aS); + break; + // + case TopAbs_EDGE: + FillEdge(aS); + break; + // + case TopAbs_FACE: + FillFace(aS); + break; + // + case TopAbs_SOLID: + FillSolid(aS); + break; + // + case TopAbs_WIRE: + case TopAbs_SHELL: + case TopAbs_COMPSOLID: + case TopAbs_COMPOUND: + FillContainer(aS); + break; + // + default: + break; + } +} +//======================================================================= +//function :FillSubShapes +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillSubShapes(const TopoDS_Shape& aS) +{ + TopoDS_Iterator aIt; + // + aIt.Initialize(aS); + for (; aIt.More(); aIt.Next()){ + const TopoDS_Shape& aSx=aIt.Value(); + FillShape(aSx); + } +} +//======================================================================= +//function : FillContainer +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillContainer(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + Standard_Boolean bIsClosed; + TopAbs_ShapeEnum aType; + GEOMAlgo_KindOfClosed aKC; + // + aType=aS.ShapeType(); + //---------------------------------------------------- + if (myMapInfo.Contains(aS)) { + return; + } + else { + GEOMAlgo_ShapeInfo aInfoX; + myMapInfo.Add(aS, aInfoX); + } + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS); + //---------------------------------------------------- + aInfo.SetType(aType); + FillNbSubShapes(aS, aInfo); + // + if (aType==TopAbs_SHELL) { + bIsClosed=BRep_Tool::IsClosed(aS); + aKC=(bIsClosed) ? GEOMAlgo_KC_CLOSED :GEOMAlgo_KC_NOTCLOSED; + aInfo.SetKindOfClosed(aKC); + } + else if (aType==TopAbs_WIRE) { + TopoDS_Wire aW; + TopoDS_Vertex aV1, aV2; + // + aW=TopoDS::Wire(aS); + TopExp::Vertices(aW, aV1, aV2); + // + bIsClosed=aV1.IsSame(aV2); + aKC=(bIsClosed) ? GEOMAlgo_KC_CLOSED :GEOMAlgo_KC_NOTCLOSED; + aInfo.SetKindOfClosed(aKC); + } + // + FillSubShapes(aS); +} +//======================================================================= +//function : FillSolid +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillSolid(const TopoDS_Shape& aS) +{ + Standard_Integer aNbShells; + TopoDS_Solid aSd; + // + myErrorStatus=0; + //---------------------------------------------------- + if (myMapInfo.Contains(aS)) { + return; + } + else { + GEOMAlgo_ShapeInfo aInfoX; + myMapInfo.Add(aS, aInfoX); + } + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS); + //---------------------------------------------------- + aInfo.SetType(TopAbs_SOLID); + FillNbSubShapes(aS, aInfo); + FillSubShapes(aS); + // + aSd=TopoDS::Solid(aS); + // + aNbShells=NbShells(aSd); + if (aNbShells>1) { + return; + } + // + FillDetails(aSd); +} +//======================================================================= +//function :FillFace +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillFace(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + Standard_Boolean bIsAllowedType; + Standard_Integer aNbWires;//, iRet + Standard_Boolean bInf, bInfU1, bInfU2, bInfV1, bInfV2; + Standard_Real aUMin, aUMax, aVMin, aVMax, aR1, aR2; + gp_Pnt aP0; + gp_Dir aDN; + gp_Ax3 aAx3; + GeomAbs_SurfaceType aST; + Handle(Geom_Surface) aSurf; + TopoDS_Face aF; + //GEOMAlgo_KindOfName aKindOfName; + //---------------------------------------------------- + if (myMapInfo.Contains(aS)) { + return; + } + else { + GEOMAlgo_ShapeInfo aInfoX; + myMapInfo.Add(aS, aInfoX); + } + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS); + //---------------------------------------------------- + aInfo.SetType(TopAbs_FACE); + // + FillNbSubShapes(aS, aInfo); + // + FillSubShapes(aS); + // + aF=TopoDS::Face(aS); + // + aNbWires=NbWires(aF); + if (aNbWires>1) { + return; + } + // + aSurf=BRep_Tool::Surface(aF); + GeomAdaptor_Surface aGAS(aSurf); + aST=aGAS.GetType(); + bIsAllowedType=IsAllowedType(aST); + if (!bIsAllowedType) { + return; + } + // + // 1. Plane + if (aST==GeomAbs_Plane) { + gp_Pln aPln; + // + aPln=aGAS.Plane(); + aP0=aPln.Location(); + aAx3=aPln.Position(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_PLANE); + aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED); + aInfo.SetLocation(aP0); + aInfo.SetPosition(aAx3); + // + //aSurf->Bounds(aUMin, aUMax, aVMin, aVMax); + BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); + bInfU1=Precision::IsNegativeInfinite(aUMin); + bInfU2=Precision::IsPositiveInfinite(aUMax); + bInfV1=Precision::IsNegativeInfinite(aVMin); + bInfV2=Precision::IsPositiveInfinite(aVMax); + // + bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2); + if (bInf) { + aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE); + } + else { + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + } + // + FillDetails(aF, aPln); + }// if (aCT==GeomAbs_Line) { + // + // 2. Sphere + else if (aST==GeomAbs_Sphere) { + gp_Sphere aSphere; + // + aSphere=aGAS.Sphere(); + aP0=aSphere.Location(); + aAx3=aSphere.Position(); + aR1=aSphere.Radius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_SPHERE); + aInfo.SetLocation(aP0); + aInfo.SetPosition(aAx3); + aInfo.SetRadius1(aR1); + // + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED); + // + FillDetails(aF, aSphere); + }// else if (aST==GeomAbs_Sphere) { + // + // 3. Cylinder + else if (aST==GeomAbs_Cylinder) { + gp_Cylinder aCyl; + // + aCyl=aGAS.Cylinder(); + aP0=aCyl.Location(); + aAx3=aCyl.Position(); + aR1=aCyl.Radius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_CYLINDER); + aInfo.SetLocation(aP0); + aInfo.SetPosition(aAx3); + aInfo.SetRadius1(aR1); + // + BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); + bInfU1=Precision::IsNegativeInfinite(aUMin); + bInfU2=Precision::IsPositiveInfinite(aUMax); + bInfV1=Precision::IsNegativeInfinite(aVMin); + bInfV2=Precision::IsPositiveInfinite(aVMax); + // + bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2); + if (bInf) { + aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE); + } + else { + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + } + FillDetails(aF, aCyl); + } + // + // 4. Cone + else if (aST==GeomAbs_Cone) { + gp_Cone aCone; + // + aCone=aGAS.Cone(); + aP0=aCone.Location(); + aAx3=aCone.Position(); + //aR1=aCyl.Radius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_CONE); + aInfo.SetLocation(aP0); + aInfo.SetPosition(aAx3); + //aInfo.SetRadius1(aR1); + // + BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); + bInfU1=Precision::IsNegativeInfinite(aUMin); + bInfU2=Precision::IsPositiveInfinite(aUMax); + bInfV1=Precision::IsNegativeInfinite(aVMin); + bInfV2=Precision::IsPositiveInfinite(aVMax); + // + bInf=(bInfU1 || bInfU2 || bInfV1 || bInfV2); + if (bInf) { + aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE); + } + else { + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + } + FillDetails(aF, aCone); + } + // + // 5. Torus + else if (aST==GeomAbs_Torus) { + gp_Torus aTorus; + // + aTorus=aGAS.Torus(); + aP0=aTorus.Location(); + aAx3=aTorus.Position(); + aR1=aTorus.MajorRadius(); + aR2=aTorus.MinorRadius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_TORUS); + aInfo.SetLocation(aP0); + aInfo.SetPosition(aAx3); + aInfo.SetRadius1(aR1); + aInfo.SetRadius2(aR2); + // + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + + FillDetails(aF, aTorus); + } +} +//======================================================================= +//function :FillEdge +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillEdge(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + Standard_Boolean bDegenerated, bIsAllowedType; + Standard_Integer aNbV; + Standard_Real aR1, aR2; + gp_Pnt aP, aP1, aP2, aPc; + gp_Dir aD; + gp_Ax2 aAx2; + Standard_Real aT1, aT2; + GeomAbs_CurveType aCT; + Handle(Geom_Curve) aC3D; + TopoDS_Edge aE; + //---------------------------------------------------- + if (myMapInfo.Contains(aS)) { + return; + } + else { + GEOMAlgo_ShapeInfo aInfoX; + myMapInfo.Add(aS, aInfoX); + } + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS); + //---------------------------------------------------- + aInfo.SetType(TopAbs_EDGE); + // + FillNbSubShapes(aS, aInfo); + // + aE=TopoDS::Edge(aS); + // + bDegenerated=BRep_Tool::Degenerated(aE); + if (bDegenerated) { + aInfo.SetKindOfShape(GEOMAlgo_KS_DEGENERATED); + FillSubShapes(aS); + return; + } + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + GeomAdaptor_Curve aGAC(aC3D); + aCT=aGAC.GetType(); + bIsAllowedType=IsAllowedType(aCT); + if (!bIsAllowedType) { + FillSubShapes(aS); + return; + } + // Line + if (aCT==GeomAbs_Line) { + Standard_Boolean bInf1, bInf2; + Standard_Real aLength; + gp_Lin aLin; + gp_XYZ aXYZ1, aXYZ2, aXYZc; + // + aLin=aGAC.Line(); + aP=aLin.Location(); + aD=aLin.Direction(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_LINE); + aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED); + aInfo.SetLocation(aP); + aInfo.SetDirection(aD); + // + bInf1=Precision::IsNegativeInfinite(aT1); + bInf2=Precision::IsPositiveInfinite(aT2); + if (bInf1||bInf2) { + aInfo.SetKindOfBounds(GEOMAlgo_KB_INFINITE); + aInfo.SetKindOfName(GEOMAlgo_KN_LINE); + } + else { + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + aInfo.SetKindOfName(GEOMAlgo_KN_SEGMENT); + aGAC.D0(aT1, aP1); + aGAC.D0(aT2, aP2); + aInfo.SetPnt1(aP1); + aInfo.SetPnt2(aP2); + // + aLength=aP1.Distance(aP2); + aXYZ1=aP1.XYZ(); + aXYZ2=aP2.XYZ(); + aXYZc=aXYZ1+aXYZ2; + aXYZc.Multiply(0.5); + // + aPc.SetXYZ(aXYZc); + gp_Vec aVec(aPc, aP2); + gp_Dir aDir(aVec); + // + aInfo.SetLocation(aPc); + aInfo.SetDirection(aDir); + aInfo.SetLength(aLength); + } + }// if (aCT==GeomAbs_Line) { + // + // Circle + else if (aCT==GeomAbs_Circle) { + gp_Circ aCirc; + // + aCirc=aGAC.Circle(); + aP=aCirc.Location(); + aAx2=aCirc.Position(); + aR1=aCirc.Radius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_CIRCLE); + aInfo.SetLocation(aP); + aInfo.SetPosition(aAx2); + aInfo.SetRadius1(aR1); + // + aNbV=aInfo.NbSubShapes(TopAbs_VERTEX); + if (!aNbV) { + myErrorStatus=11; // circle edge without vertices + return; + } + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + aGAC.D0(aT1, aP1); + aGAC.D0(aT2, aP2); + aInfo.SetPnt1(aP1); + aInfo.SetPnt2(aP2); + // + if (aNbV==1) { + aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED); + aInfo.SetKindOfName(GEOMAlgo_KN_CIRCLE); + } + else { + aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED); + aInfo.SetKindOfName(GEOMAlgo_KN_ARCCIRCLE); + // + gp_Vec aVecX(aP, aP1); + gp_Dir aDirX(aVecX); + gp_Ax2 aAx2new(aP, aAx2.Direction(), aDirX); + aInfo.SetPosition(aAx2new); + } + }// else if (aCT==GeomAbs_Circle) { + // + // Ellipse + else if (aCT==GeomAbs_Ellipse) { + gp_Elips aElips; + // + aElips=aGAC.Ellipse(); + aP=aElips.Location(); + aAx2=aElips.Position(); + aR1=aElips.MajorRadius(); + aR2=aElips.MinorRadius(); + // + aInfo.SetKindOfShape(GEOMAlgo_KS_ELLIPSE); + aInfo.SetLocation(aP); + aInfo.SetPosition(aAx2); + aInfo.SetRadius1(aR1); + aInfo.SetRadius2(aR2); + // + aNbV=aInfo.NbSubShapes(TopAbs_VERTEX); + if (!aNbV) { + myErrorStatus=11; // ellipse edge without vertices + return; + } + aInfo.SetKindOfBounds(GEOMAlgo_KB_TRIMMED); + aGAC.D0(aT1, aP1); + aGAC.D0(aT2, aP2); + aInfo.SetPnt1(aP1); + aInfo.SetPnt2(aP2); + // + if (aNbV==1) { + aInfo.SetKindOfClosed(GEOMAlgo_KC_CLOSED); + aInfo.SetKindOfName(GEOMAlgo_KN_ELLIPSE); + } + else { + aInfo.SetKindOfClosed(GEOMAlgo_KC_NOTCLOSED); + aInfo.SetKindOfName(GEOMAlgo_KN_ARCELLIPSE); + // + gp_Vec aVecX(aP, aP1); + gp_Dir aDirX(aVecX); + gp_Ax2 aAx2new(aP, aAx2.Direction(), aDirX); + aInfo.SetPosition(aAx2new); + } + }// else if (aCT==GeomAbs_Ellipse) { + // + FillSubShapes(aS); +} +//======================================================================= +//function :FillVertex +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillVertex(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + gp_Pnt aP; + TopoDS_Vertex aV; + // + if (myMapInfo.Contains(aS)) { + return; + } + else { + GEOMAlgo_ShapeInfo aInfoX; + myMapInfo.Add(aS, aInfoX); + } + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aS); + // + aV=TopoDS::Vertex(aS); + aP=BRep_Tool::Pnt(aV); + // + aInfo.SetType(TopAbs_VERTEX); + aInfo.SetLocation(aP); + myMapInfo.Add(aS, aInfo); +} +//======================================================================= +//function : FillNbSubshapes +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillNbSubShapes(const TopoDS_Shape& aS, + GEOMAlgo_ShapeInfo& aInfo) +{ + myErrorStatus=0; + // + Standard_Integer i, aNb, aNbS; + TopTools_IndexedMapOfShape aM; + TopAbs_ShapeEnum aST; + TopAbs_ShapeEnum aTypes[]= { + //TopAbs_FACE, TopAbs_EDGE, TopAbs_VERTEX + TopAbs_COMPOUND, + TopAbs_COMPSOLID, + TopAbs_SOLID, + TopAbs_SHELL, + TopAbs_FACE, + TopAbs_WIRE, + TopAbs_EDGE, + TopAbs_VERTEX + }; + + // + aST=aS.ShapeType(); + aNb=sizeof(aTypes)/sizeof(aTypes[0]); + for (i=0; i +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapOfShapeShapeInfo_HeaderFile +#include +#endif +#ifndef _Standard_Real_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Algo_HeaderFile +#include +#endif +class TopoDS_Shape; +class GEOMAlgo_ShapeInfo; +class TopoDS_Face; +class gp_Pln; +class gp_Sphere; +class gp_Cylinder; +class gp_Cone; +class gp_Torus; +class TopoDS_Solid; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + + +class GEOMAlgo_ShapeInfoFiller : public GEOMAlgo_Algo { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + + +Standard_EXPORT GEOMAlgo_ShapeInfoFiller(); +Standard_EXPORT virtual ~GEOMAlgo_ShapeInfoFiller(); + + +Standard_EXPORT void SetShape(const TopoDS_Shape& aS) ; + + +Standard_EXPORT const TopoDS_Shape& Shape() const; + + +Standard_EXPORT void SetTolerance(const Standard_Real aT) ; + + +Standard_EXPORT Standard_Real Tolerance() const; + + +Standard_EXPORT const GEOMAlgo_ShapeInfo& Info() const; + + +Standard_EXPORT const GEOMAlgo_ShapeInfo& Info(const TopoDS_Shape& aS) const; + + +Standard_EXPORT virtual void Perform() ; + + + + + +protected: + + // Methods PROTECTED + // + + +Standard_EXPORT virtual void CheckData() ; + + +Standard_EXPORT void FillNbSubShapes(const TopoDS_Shape& aS,GEOMAlgo_ShapeInfo& aInfo) ; + + +Standard_EXPORT void FillSubShapes(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillShape(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillVertex(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillEdge(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillFace(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillSolid(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillContainer(const TopoDS_Shape& aS) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Face& aF,const gp_Pln& aPln) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Face& aF,const gp_Sphere& aSph) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Face& aF,const gp_Cylinder& aCyl) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Face& aF,const gp_Cone& aCone) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Face& aF,const gp_Torus& aTorus) ; + + +Standard_EXPORT void FillDetails(const TopoDS_Solid& aS) ; + + + // Fields PROTECTED + // +TopoDS_Shape myShape; +GEOMAlgo_ShapeInfo myEmptyInfo; +GEOMAlgo_IndexedDataMapOfShapeShapeInfo myMapInfo; +Standard_Real myTolerance; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.ixx b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.ixx new file mode 100644 index 000000000..a56973ba8 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.ixx @@ -0,0 +1,26 @@ +// File generated by CPPExt (Value) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#include + + + + diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.jxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.jxx new file mode 100644 index 000000000..f3d77a35b --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller.jxx @@ -0,0 +1,30 @@ +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfo_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _gp_Pln_HeaderFile +#include +#endif +#ifndef _gp_Sphere_HeaderFile +#include +#endif +#ifndef _gp_Cylinder_HeaderFile +#include +#endif +#ifndef _gp_Cone_HeaderFile +#include +#endif +#ifndef _gp_Torus_HeaderFile +#include +#endif +#ifndef _TopoDS_Solid_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeInfoFiller_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller_1.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller_1.cxx new file mode 100644 index 000000000..891b9c772 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeInfoFiller_1.cxx @@ -0,0 +1,738 @@ +#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 + +//======================================================================= +//function : FillDetails +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillDetails(const TopoDS_Solid& aSd) +{ + Standard_Integer i, aNbF, aNbCyl, aNbCon, aNbPgn, aNbRct, aNbCrc, aNbX; + TopoDS_Shape aFCyl, aFCon; + TopTools_IndexedMapOfShape aMF; + GEOMAlgo_KindOfName aKNF; + // + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aSd); + aInfo.SetKindOfName(GEOMAlgo_KN_UNKNOWN); + // + TopExp::MapShapes(aSd, TopAbs_FACE, aMF); + // + aNbF=aMF.Extent(); + if (!aNbF) { + return; + } + // + if (aNbF==1) { + const TopoDS_Shape& aF=aMF(1); + GEOMAlgo_ShapeInfo& aInfoF=myMapInfo.ChangeFromKey(aF); + aKNF=aInfoF.KindOfName(); // mb: sphere, torus + if (aKNF==GEOMAlgo_KN_SPHERE || + aKNF==GEOMAlgo_KN_TORUS) { + aInfo.SetKindOfName(aKNF); + aInfo.SetLocation(aInfoF.Location()); + aInfo.SetPosition(aInfoF.Position()); + aInfo.SetRadius1(aInfoF.Radius1()); + if(aKNF==GEOMAlgo_KN_TORUS) { + aInfo.SetRadius2(aInfoF.Radius2()); + } + return; + } + } + // + aNbCyl=0; + aNbCon=0; + aNbPgn=0; + aNbRct=0; + aNbCrc=0; + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aF=aMF(i); + GEOMAlgo_ShapeInfo& aInfoF=myMapInfo.ChangeFromKey(aF); + aKNF=aInfoF.KindOfName(); + if (aKNF==GEOMAlgo_KN_CYLINDER) { + aFCyl=aF; + ++aNbCyl; + } + else if (aKNF==GEOMAlgo_KN_CONE) { + aFCon=aF; + ++aNbCon; + } + else if (aKNF==GEOMAlgo_KN_DISKCIRCLE) { + ++aNbCrc; + } + else if (aKNF==GEOMAlgo_KN_POLYGON || + aKNF==GEOMAlgo_KN_TRIANGLE || + aKNF==GEOMAlgo_KN_QUADRANGLE) { + ++aNbPgn; + + } + else if (aKNF==GEOMAlgo_KN_RECTANGLE) { + ++aNbPgn; + ++aNbRct; + } + } + // + aNbX=aNbCyl+aNbCrc; + if (aNbCyl==1 && aNbCrc==2 && aNbX==aNbF) { + // cylinder (as they understand it) + GEOMAlgo_ShapeInfo& aInfoF=myMapInfo.ChangeFromKey(aFCyl); + aKNF=aInfoF.KindOfName(); + aInfo.SetKindOfName(aKNF); + aInfo.SetLocation(aInfoF.Location()); + aInfo.SetPosition(aInfoF.Position()); + aInfo.SetRadius1(aInfoF.Radius1()); + aInfo.SetHeight(aInfoF.Height()); + return; + } + // + aNbX=aNbCon+aNbCrc; + if (aNbCon==1 && (aNbCrc==1 || aNbCrc==2) && aNbX==aNbF) { + // cone + GEOMAlgo_ShapeInfo& aInfoF=myMapInfo.ChangeFromKey(aFCon); + aKNF=aInfoF.KindOfName(); + aInfo.SetKindOfName(aKNF); + aInfo.SetLocation(aInfoF.Location()); + aInfo.SetPosition(aInfoF.Position()); + aInfo.SetRadius1(aInfoF.Radius1()); + aInfo.SetRadius2(aInfoF.Radius2()); + aInfo.SetHeight(aInfoF.Height()); + return; + } + // + if (aNbPgn!=6) { + aInfo.SetKindOfName(GEOMAlgo_KN_POLYHEDRON); + return; + } + if (aNbPgn!=aNbRct) { + aInfo.SetKindOfName(GEOMAlgo_KN_POLYHEDRON); + return; + } + //=================================================== + // aNbRct=6; + // box + Standard_Integer j, aNbFi, aNbV, iMax, iMin, iMid; + Standard_Real aDot, aLength, aWidth, aHeight, aDist[3]; + Standard_Real aDistMin, aDistMax; + gp_Pnt aPi, aPc; + gp_Dir aDir[3]; + gp_XYZ aXYZc; + TColStd_IndexedMapOfInteger aMp; + TopTools_IndexedMapOfShape aMV, aMFi; + // + // barycenter aPc + TopExp::MapShapes(aSd, TopAbs_VERTEX, aMV); + aNbV=aMV.Extent(); + if (aNbV!=8) { + return; + } + // + aXYZc.SetCoord(0.,0.,0.); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Vertex& aVi=TopoDS::Vertex(aMV(i)); + aPi=BRep_Tool::Pnt(aVi); + const gp_XYZ& aXYZ=aPi.XYZ(); + aXYZc=aXYZc+aXYZ; + } + // + aXYZc.Divide(aNbV); + aPc.SetXYZ(aXYZc); + // + // 3 faces + for (i=1; i<=aNbF; ++i) { + if (aMp.Contains(i)) { + continue; + } + // + const TopoDS_Shape& aFi=aMF(i); + const GEOMAlgo_ShapeInfo& aIFi=myMapInfo.FindFromKey(aFi); + const gp_Dir& aDNi=aIFi.Position().Direction(); + // + for (j=i+1; j<=aNbF; ++j) { + if (aMp.Contains(j)) { + continue; + } + // + const TopoDS_Shape& aFj=aMF(j); + const GEOMAlgo_ShapeInfo& aIFj=myMapInfo.FindFromKey(aFj); + const gp_Dir& aDNj=aIFj.Position().Direction(); + // + aDot=aDNi*aDNj; + if (fabs(1.-aDot)<0.0001) { + aMp.Add(i); + aMp.Add(j); + aMFi.Add(aFi); + break; + } + // + } + } + aNbFi=aMFi.Extent(); + if (aNbFi!=3) { + return; + } + // + aDistMin=1.e15; + aDistMax=-aDistMin; + for (i=0; iaDistMax) { + aDistMax=aDist[i]; + iMax=i; + } + if (aDist[i] myTolerance) { + aInfo.SetKindOfName(GEOMAlgo_KN_QUADRANGLE); + return; + } + } + // + // rectangle + aInfo.SetKindOfName(GEOMAlgo_KN_RECTANGLE); + // + // shift location to the center and calc. sizes + aXYZc.SetCoord(0.,0.,0.); + TopExp::MapShapes(aF, TopAbs_VERTEX, aMV); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Vertex& aV=TopoDS::Vertex(aMV(i)); + aP=BRep_Tool::Pnt(aV); + const gp_XYZ& aXYZ=aP.XYZ(); + aXYZc=aXYZc+aXYZ; + } + // + // Location : aPc in center of rectangle + // Position : 0z is plane normal + // 0x is along length + // + aXYZc.Divide(4.); + aPc.SetXYZ(aXYZc); + // + gp_Lin aL0(aPx[0], aDx[0]); + gp_Lin aL1(aPx[1], aDx[1]); + // + aD0=aL0.Distance(aPc); + aD1=aL1.Distance(aPc); + // + aLength=aD0; + aWidth =aD1; + aDX=aL1.Direction(); + if (aD0aR[1]) { + aRmin=aR[1]; + aRmax=aR[0]; + aPc=aPC[0]; + gp_Vec aVz(aPC[0], aPC[1]); + gp_Vec aVx(aPC[0], aPX[0]); + gp_Dir aDz(aVz); + gp_Dir aDx(aVx); + gp_Ax2 aAx2(aPc, aDz, aDx); + aAx2new=aAx2; + } + else { + aRmin=aR[0]; + aRmax=aR[1]; + aPc=aPC[1]; + gp_Vec aVz(aPC[1], aPC[0]); + gp_Vec aVx(aPC[1], aPX[1]); + gp_Dir aDz(aVz); + gp_Dir aDx(aVx); + gp_Ax2 aAx2(aPc, aDz, aDx); + aAx2new=aAx2; + } + // + gp_Ax3 aAx3(aAx2new); + aInfo.SetLocation(aPc); + aInfo.SetPosition(aAx3); + aInfo.SetRadius1(aRmax); + aInfo.SetRadius2(aRmin); + aInfo.SetHeight(aHeight); + // + aInfo.SetKindOfName(GEOMAlgo_KN_CONE); +} +//======================================================================= +//function : FillDetails +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillDetails(const TopoDS_Face& aF, + const gp_Cylinder& aCyl) +{ + Standard_Integer i, aNbV, aNbE, aNbCE, aNbSE; + Standard_Real aT0, aT1, aHeight; + gp_Pnt aPC[3], aPc; + TopoDS_Edge aE; + TopExp_Explorer aExp; + TopTools_MapOfShape aM; + GEOMAlgo_KindOfShape aKS; + GEOMAlgo_KindOfName aKN, aKNE; + GEOMAlgo_KindOfClosed aKCE; + // + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aF); + aKN=GEOMAlgo_KN_UNKNOWN; + aInfo.SetKindOfName(aKN); + // + aKS=aInfo.KindOfShape(); + if (aKS!=GEOMAlgo_KS_CYLINDER) { + return; + } + // + if (aInfo.KindOfBounds()==GEOMAlgo_KB_INFINITE) { + return; + } + // + aNbV=aInfo.NbSubShapes(TopAbs_VERTEX); + aNbE=aInfo.NbSubShapes(TopAbs_EDGE); + if (!(aNbV==2 && aNbE==3)) { + return; + } + // + i=0; + aNbCE=0; + aNbSE=0; + aExp.Init(aF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + aE=TopoDS::Edge(aExp.Current()); + if(aM.Add(aE)) { + const GEOMAlgo_ShapeInfo& aInfoE=myMapInfo.FindFromKey(aE); + aKNE=aInfoE.KindOfName(); + aKCE=aInfoE.KindOfClosed(); + if (aKNE==GEOMAlgo_KN_CIRCLE && aKCE==GEOMAlgo_KC_CLOSED) { + aPC[aNbCE]=aInfoE.Location(); + ++aNbCE; + } + else if (aKNE==GEOMAlgo_KN_SEGMENT) { + if (BRep_Tool::IsClosed(aE, aF)) { + ++aNbSE; + } + } + } + } + // + if (!(aNbCE==2 && aNbSE==1)) { + return; + } + // + const gp_Ax1& aAx1=aCyl.Axis(); + const gp_Dir& aDir=aAx1.Direction(); + const gp_Pnt& aPLoc=aAx1.Location(); + gp_Lin aLin(aPLoc, aDir); + // + aT0=ElCLib::Parameter(aLin, aPC[0]); + aT1=ElCLib::Parameter(aLin, aPC[1]); + // + aPc=aPC[0];; + if (aT0>aT1) { + aPc=aPC[1]; + } + aHeight=aPC[0].Distance(aPC[1]); + // + gp_Ax3 aAx3=aCyl.Position(); + aAx3.SetLocation(aPc); + // + aInfo.SetKindOfName(GEOMAlgo_KN_CYLINDER); + aInfo.SetPosition(aAx3); + aInfo.SetLocation(aPc); + aInfo.SetHeight(aHeight); +} + +//======================================================================= +//function : FillDetails +//purpose : +//======================================================================= + void GEOMAlgo_ShapeInfoFiller::FillDetails(const TopoDS_Face& aF, + const gp_Torus& ) +{ + Standard_Integer aNbV, aNbE, aNbSE; + TopoDS_Edge aE; + TopExp_Explorer aExp; + TopTools_MapOfShape aM; + GEOMAlgo_KindOfShape aKS; + // + GEOMAlgo_ShapeInfo& aInfo=myMapInfo.ChangeFromKey(aF); + aInfo.SetKindOfName(GEOMAlgo_KN_UNKNOWN); + // + aKS=aInfo.KindOfShape(); + if (aKS!=GEOMAlgo_KS_TORUS) { + return; + } + // + aNbV=aInfo.NbSubShapes(TopAbs_VERTEX); + aNbE=aInfo.NbSubShapes(TopAbs_EDGE); + if (!(aNbV==1 && aNbE==2)) { + return; + } + // + aNbSE=0; + aExp.Init(aF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + aE=TopoDS::Edge(aExp.Current()); + if (aM.Add(aE)) { + //const GEOMAlgo_ShapeInfo& aInfoE=myMapInfo.FindFromKey(aE); + if (BRep_Tool::IsClosed(aE, aF)) { + ++aNbSE; + } + } + } + // + if (aNbSE!=2) { + return; + } + aInfo.SetKindOfName(GEOMAlgo_KN_TORUS); +} diff --git a/src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx b/src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx index 8cac72b9e..1b5a04035 100755 --- a/src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WESCorrector.cxx @@ -115,7 +115,7 @@ static //======================================================================= void GEOMAlgo_WESCorrector::DoConnexityBlocks() { - Standard_Boolean bRegular; + Standard_Boolean bRegular, bClosed; Standard_Integer i, aNbV, j, aNbC, aNbVP, aNbVS; TopTools_ListIteratorOfListOfShape aIt; TopoDS_Iterator aItE; @@ -208,17 +208,17 @@ static aER=aMEC(j); // if (aMER.Contains(aER)) { - Standard_Boolean bClosed; - // aER.Orientation(TopAbs_FORWARD); aLEC.Append(aER); aER.Orientation(TopAbs_REVERSED); aLEC.Append(aER); // - bClosed=BRep_Tool::IsClosed(TopoDS::Edge(aER), myWES->Face()); - if (!bClosed) { + //modified by NIZNHY-PKV Tue Nov 28 12:02:29 2006f + //bClosed=BRep_Tool::IsClosed(TopoDS::Edge(aER), myWES->Face()); + //if (!bClosed) { bRegular=Standard_False; - } + //} + //modified by NIZNHY-PKV Tue Nov 28 12:02:33 2006t } else { aLEC.Append(aER); @@ -234,11 +234,12 @@ static // aNbVR=aMVER.Extent(); for (k=1; k<=aNbVR; ++k) { - const TopTools_ListOfShape& aLER=aMVER(k);//?? it was aMVE(k) + const TopTools_ListOfShape& aLER=aMVER(k); aNbER=aLER.Extent(); if (aNbER==1) { const TopoDS_Edge& aEx=TopoDS::Edge(aER); - if (!BRep_Tool::IsClosed(aEx, myWES->Face())) { + bClosed=BRep_Tool::IsClosed(aEx, myWES->Face()); + if (!bClosed) { bRegular=!bRegular; break; } diff --git a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx index 3860f82fe..e4671d3a2 100755 --- a/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx +++ b/src/GEOMAlgo/GEOMAlgo_WireSplitter.cxx @@ -489,14 +489,6 @@ static aTol=2.*Tolerance2D(aVb, aGAS); aTol2=aTol*aTol; // - //modified by NIZNHY-PKV Tue Nov 14 16:56:19 2006f - /* - UVTolerance2D(aVb, aGAS, aTolUVb, aTolVVb); - aTolUVb = 2.*aTolUVb; - aTolVVb = 2.*aTolVVb; - */ - //modified by NIZNHY-PKV Tue Nov 14 16:56:26 2006t - // aNb=aLS.Length(); if (aNb>0) { // @@ -517,20 +509,6 @@ static // aD2=aPaPrev.SquareDistance(aPb); anIsSameV2d =aD2 aTolUVb) || (vdist > aTolVVb)) { - anIsSameV2d=!anIsSameV2d; - } - } - */ - //modified by NIZNHY-PKV Tue Nov 14 16:56:54 2006t }//if (anIsSameV) { // if (anIsSameV && anIsSameV2d) { @@ -685,7 +663,10 @@ static aTol2D=(aVr>anUr) ? aVr : anUr; // if (aType==GeomAbs_BSplineSurface|| - aType==GeomAbs_Sphere) { + aType==GeomAbs_Sphere|| + //modified by NIZNHY-PKV Wed Nov 29 10:18:50 2006f + GeomAbs_SurfaceOfRevolution) { + //modified by NIZNHY-PKV Wed Nov 29 10:18:55 2006t if (aTol2D < aTolV3D) { aTol2D=aTolV3D; } @@ -895,29 +876,3 @@ Standard_Integer NbWaysOut(const BOP_ListOfEdgeInfo& aLEInfo) } return iCnt; } -//modified by NIZNHY-PKV Tue Nov 14 16:55:31 2006f -/* -static - void UVTolerance2D (const TopoDS_Vertex& aV, - const GeomAdaptor_Surface& aGAS, - Standard_Real& aTolU, - Standard_Real& aTolV); -*/ -/* -//======================================================================= -//function : UVTolerance2D -//purpose : -//======================================================================= -void UVTolerance2D (const TopoDS_Vertex& aV, - const GeomAdaptor_Surface& aGAS, - Standard_Real& aTolU, - Standard_Real& aTolV) -{ - Standard_Real aTolV3D; - // - aTolV3D = BRep_Tool::Tolerance(aV); - aTolU=aGAS.UResolution(aTolV3D); - aTolV=aGAS.VResolution(aTolV3D); -} -*/ -//modified by NIZNHY-PKV Tue Nov 14 16:55:39 2006 diff --git a/src/GEOMAlgo/Handle_GEOMAlgo_ClsfSolid.hxx b/src/GEOMAlgo/Handle_GEOMAlgo_ClsfSolid.hxx new file mode 100644 index 000000000..8098ce527 --- /dev/null +++ b/src/GEOMAlgo/Handle_GEOMAlgo_ClsfSolid.hxx @@ -0,0 +1,72 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _Handle_GEOMAlgo_ClsfSolid_HeaderFile +#define _Handle_GEOMAlgo_ClsfSolid_HeaderFile + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Handle_GEOMAlgo_Clsf_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(GEOMAlgo_Clsf); +class GEOMAlgo_ClsfSolid; +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMAlgo_ClsfSolid); + +class Handle(GEOMAlgo_ClsfSolid) : public Handle(GEOMAlgo_Clsf) { + public: + Handle(GEOMAlgo_ClsfSolid)():Handle(GEOMAlgo_Clsf)() {} + Handle(GEOMAlgo_ClsfSolid)(const Handle(GEOMAlgo_ClsfSolid)& aHandle) : Handle(GEOMAlgo_Clsf)(aHandle) + { + } + + Handle(GEOMAlgo_ClsfSolid)(const GEOMAlgo_ClsfSolid* anItem) : Handle(GEOMAlgo_Clsf)((GEOMAlgo_Clsf *)anItem) + { + } + + Handle(GEOMAlgo_ClsfSolid)& operator=(const Handle(GEOMAlgo_ClsfSolid)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMAlgo_ClsfSolid)& operator=(const GEOMAlgo_ClsfSolid* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMAlgo_ClsfSolid* operator->() const + { + return (GEOMAlgo_ClsfSolid *)ControlAccess(); + } + +// Standard_EXPORT ~Handle(GEOMAlgo_ClsfSolid)(); + + Standard_EXPORT static const Handle(GEOMAlgo_ClsfSolid) DownCast(const Handle(Standard_Transient)& AnObject); +}; +#endif diff --git a/src/GEOMAlgo/Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx b/src/GEOMAlgo/Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx new file mode 100644 index 000000000..8360ec290 --- /dev/null +++ b/src/GEOMAlgo/Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx @@ -0,0 +1,72 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +#ifndef _Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile +#define _Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_HeaderFile + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Handle_TCollection_MapNode_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TCollection_MapNode); +class GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape; +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape); + +class Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) : public Handle(TCollection_MapNode) { + public: + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)():Handle(TCollection_MapNode)() {} + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)(const Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)& aHandle) : Handle(TCollection_MapNode)(aHandle) + { + } + + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)(const GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape* anItem) : Handle(TCollection_MapNode)((TCollection_MapNode *)anItem) + { + } + + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)& operator=(const Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)& operator=(const GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape* operator->() const + { + return (GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape *)ControlAccess(); + } + +// Standard_EXPORT ~Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape)(); + + Standard_EXPORT static const Handle(GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape) DownCast(const Handle(Standard_Transient)& AnObject); +}; +#endif diff --git a/src/GEOMAlgo/Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx b/src/GEOMAlgo/Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx new file mode 100644 index 000000000..ef425b4c2 --- /dev/null +++ b/src/GEOMAlgo/Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx @@ -0,0 +1,74 @@ +// File generated by CPPExt (Transient) +// +// Copyright (C) 1991 - 2000 by +// Matra Datavision SA. All rights reserved. +// +// Copyright (C) 2001 - 2004 by +// Open CASCADE SA. All rights reserved. +// +// This file is part of the Open CASCADE Technology software. +// +// This software may be distributed and/or modified under the terms and +// conditions of the Open CASCADE Public License as defined by Open CASCADE SA +// and appearing in the file LICENSE included in the packaging of this file. +// +// This software is distributed on an "AS IS" basis, without warranty of any +// kind, and Open CASCADE SA hereby disclaims all such warranties, +// including without limitation, any warranties of merchantability, fitness +// for a particular purpose or non-infringement. Please see the License for +// the specific terms and conditions governing rights and limitations under the +// License. + +#ifndef _Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile +#define _Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_HeaderFile + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Handle_TCollection_MapNode_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TCollection_MapNode); +class GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo; +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo); + +class Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) : public Handle(TCollection_MapNode) { + public: + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)():Handle(TCollection_MapNode)() {} + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)(const Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)& aHandle) : Handle(TCollection_MapNode)(aHandle) + { + } + + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)(const GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo* anItem) : Handle(TCollection_MapNode)((TCollection_MapNode *)anItem) + { + } + + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)& operator=(const Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)& operator=(const GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo* operator->() const + { + return (GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo *)ControlAccess(); + } + +// Standard_EXPORT ~Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo)(); + + Standard_EXPORT static const Handle(GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo) DownCast(const Handle(Standard_Transient)& AnObject); +}; +#endif diff --git a/src/GEOMAlgo/Makefile.am b/src/GEOMAlgo/Makefile.am index 99255ce32..ca32aed4b 100644 --- a/src/GEOMAlgo/Makefile.am +++ b/src/GEOMAlgo/Makefile.am @@ -109,10 +109,16 @@ dist_libGEOMAlgo_la_SOURCES = \ GEOMAlgo_WESCorrector.cxx \ GEOMAlgo_WireEdgeSet.cxx \ GEOMAlgo_WireSolid.cxx \ - GEOMAlgo_WireSplitter.cxx - -LIB_CLIENT_IDL = -LIB_SERVER_IDL = + GEOMAlgo_WireSplitter.cxx \ + GEOMAlgo_ClsfSolid.cxx \ + GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape_0.cxx \ + GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape_0.cxx \ + GEOMAlgo_DataMapOfPassKeyShapeShape_0.cxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo_0.cxx \ + GEOMAlgo_ShapeInfoFiller_1.cxx \ + GEOMAlgo_IndexedDataMapOfShapeShapeInfo_0.cxx \ + GEOMAlgo_ShapeInfo.cxx \ + GEOMAlgo_ShapeInfoFiller.cxx # header files salomeinclude_HEADERS = \ @@ -202,6 +208,31 @@ salomeinclude_HEADERS = \ Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeState.hxx \ Handle_GEOMAlgo_ListNodeOfListOfCoupleOfShapes.hxx \ Handle_GEOMAlgo_ListNodeOfListOfPnt.hxx + GEOMAlgo_ClsfSolid.hxx \ + GEOMAlgo_ClsfSolid.ixx \ + GEOMAlgo_ClsfSolid.jxx \ + GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyShapeShape.hxx \ + GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx \ + GEOMAlgo_DataMapOfPassKeyShapeShape.hxx \ + GEOMAlgo_Gluer1.cxx \ + GEOMAlgo_Gluer1.hxx \ + GEOMAlgo_Gluer1.ixx \ + GEOMAlgo_Gluer1.jxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx \ + GEOMAlgo_IndexedDataMapOfShapeShapeInfo.hxx \ + GEOMAlgo_KindOfBounds.hxx \ + GEOMAlgo_KindOfClosed.hxx \ + GEOMAlgo_KindOfName.hxx \ + GEOMAlgo_KindOfShape.hxx \ + GEOMAlgo_ShapeInfo.hxx \ + GEOMAlgo_ShapeInfo.ixx \ + GEOMAlgo_ShapeInfo.jxx \ + GEOMAlgo_ShapeInfoFiller.hxx \ + GEOMAlgo_ShapeInfoFiller.ixx \ + GEOMAlgo_ShapeInfoFiller.jxx \ + Handle_GEOMAlgo_ClsfSolid.hxx \ + Handle_GEOMAlgo_DataMapNodeOfDataMapOfPassKeyShapeShape.hxx \ + Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeShapeInfo.hxx libGEOMAlgo_la_CPPFLAGS = \ $(CAS_CPPFLAGS) \ diff --git a/src/GEOMBase/GEOMBase_Helper.cxx b/src/GEOMBase/GEOMBase_Helper.cxx index fe51c488f..efa81ac91 100755 --- a/src/GEOMBase/GEOMBase_Helper.cxx +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -44,9 +44,9 @@ #include #include #include +#include #include #include -#include #include #include @@ -106,9 +106,13 @@ GEOMBase_Helper::~GEOMBase_Helper() erasePreview(); if ( hasCommand() ) abortCommand(); - - globalSelection( GEOM_ALLOBJECTS, true ); - + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if(aGeomGUI) + globalSelection(aGeomGUI->getLocalSelectionMode() , true ); + } + if (myDisplayer) delete myDisplayer; } @@ -245,7 +249,9 @@ void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, void GEOMBase_Helper::displayPreview( const bool activate, const bool update, const bool toRemoveFromEngine, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color ) { isPreview = true; QString msg; @@ -267,7 +273,7 @@ void GEOMBase_Helper::displayPreview( const bool activate, else { for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { - displayPreview( *it, true, activate, false, lineWidth ); + displayPreview( *it, true, activate, false, lineWidth, displayMode, color ); if ( toRemoveFromEngine ) getGeomEngine()->RemoveObject( *it ); } @@ -291,13 +297,18 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, const bool append, const bool activate, const bool update, - const double lineWidth ) + const double lineWidth, + const int displayMode, + const int color ) { // Set color for preview shape - getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + getDisplayer()->SetColor( color == -1 ? Quantity_NOC_VIOLET : color ); // set width of displayed shape getDisplayer()->SetWidth( lineWidth ); + + // set display mode of displayed shape + int aPrevDispMode = getDisplayer()->SetDisplayMode( displayMode ); // Disable activation of selection getDisplayer()->SetToActivate( activate ); @@ -315,6 +326,8 @@ void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, displayPreview( aPrs, append, update ); getDisplayer()->UnsetName(); + getDisplayer()->UnsetColor(); + getDisplayer()->SetDisplayMode( aPrevDispMode ); // Enable activation of displayed objects getDisplayer()->SetToActivate( true ); @@ -762,7 +775,6 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) } else { const int nbObjs = objects.size(); - bool withChildren = false; int aNumber = 1; for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { if ( publish ) { @@ -783,14 +795,15 @@ bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) aName = GEOMBase::GetDefaultName( getPrefix( *it ) ); } addInStudy( *it, aName.latin1() ); - withChildren = false; + // updateView=false display( *it, false ); } - else { // asv : fix of PAL6454. If publish==false, then the original shape was modified, and need to be re-cached in GEOM_Client - // before redisplay + else { + // asv : fix of PAL6454. If publish==false, then the original shape + // was modified, and need to be re-cached in GEOM_Client before redisplay clearShapeBuffer( *it ); - withChildren = true; - redisplay( *it, withChildren, false ); + // withChildren=true, updateView=false + redisplay( *it, true, false ); } } @@ -909,22 +922,23 @@ QString GEOMBase_Helper::getPrefix( GEOM::GEOM_Object_ptr theObj ) const if ( !myPrefix.isEmpty() || theObj->_is_nil() ) return myPrefix; - TopoDS_Shape aShape; - if ( !GEOMBase::GetShape( theObj, aShape ) ) - return ""; - - long aType = aShape.ShapeType(); + //TopoDS_Shape aShape; + //if ( !GEOMBase::GetShape( theObj, aShape ) ) + // return ""; + // + //long aType = aShape.ShapeType(); + GEOM::shape_type aType = theObj->GetShapeType(); switch ( aType ) { - case TopAbs_VERTEX : return QObject::tr( "GEOM_VERTEX" ); - case TopAbs_EDGE : return QObject::tr( "GEOM_EDGE" ); - case TopAbs_WIRE : return QObject::tr( "GEOM_WIRE" ); - case TopAbs_FACE : return QObject::tr( "GEOM_FACE" ); - case TopAbs_SHELL : return QObject::tr( "GEOM_SHELL" ); - case TopAbs_SOLID : return QObject::tr( "GEOM_SOLID" ); - case TopAbs_COMPSOLID: return QObject::tr( "GEOM_COMPOUNDSOLID" ); - case TopAbs_COMPOUND : return QObject::tr( "GEOM_COMPOUND" ); + case GEOM::VERTEX : return QObject::tr( "GEOM_VERTEX" ); + case GEOM::EDGE : return QObject::tr( "GEOM_EDGE" ); + case GEOM::WIRE : return QObject::tr( "GEOM_WIRE" ); + case GEOM::FACE : return QObject::tr( "GEOM_FACE" ); + case GEOM::SHELL : return QObject::tr( "GEOM_SHELL" ); + case GEOM::SOLID : return QObject::tr( "GEOM_SOLID" ); + case GEOM::COMPSOLID: return QObject::tr( "GEOM_COMPOUNDSOLID" ); + case GEOM::COMPOUND : return QObject::tr( "GEOM_COMPOUND" ); default : return ""; } } @@ -985,3 +999,38 @@ SUIT_Desktop* GEOMBase_Helper::getDesktop() const return myDesktop; } +//================================================================ +// Function : selectObjects +// Purpose : Selects list of objects +//================================================================ +bool GEOMBase_Helper::selectObjects( ObjectList& objects ) +{ + SUIT_DataOwnerPtrList aList; + ObjectList::iterator anIter; + for ( anIter = objects.begin(); anIter != objects.end(); ++anIter ) + { + string entry = getEntry( *anIter ); + QString aEntry( entry.c_str() ); + LightApp_DataOwner* anOwher = new LightApp_DataOwner( aEntry ); + aList.append( anOwher ); + } + + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( !app ) + return false; + + LightApp_SelectionMgr* aMgr = app->selectionMgr(); + if ( !aMgr ) + return false; + + aMgr->setSelected( aList, false ); + + return true; +} + + + + + + \ No newline at end of file diff --git a/src/GEOMBase/GEOMBase_Helper.h b/src/GEOMBase/GEOMBase_Helper.h index 20bcdae79..e8c689864 100755 --- a/src/GEOMBase/GEOMBase_Helper.h +++ b/src/GEOMBase/GEOMBase_Helper.h @@ -76,7 +76,9 @@ protected: virtual void displayPreview ( const bool activate = false, const bool update = true, const bool toRemoveFromEngine = true, - const double lineWidth = -1 ); + const double lineWidth = -1, + const int displayMode = -1, + const int color = -1 ); // This is the easiest way to show preview. It is based on execute() method. // It removes temporary GEOM::GEOM_Objects automatically. @@ -84,7 +86,9 @@ protected: const bool append = false, const bool activate = false, const bool update = true, - const double lineWidth = -1 ); + const double lineWidth = -1, + const int displayMode = -1, + const int color = -1 ); void displayPreview ( const SALOME_Prs* prs, const bool append = false, const bool = true ); @@ -144,6 +148,9 @@ protected: Handle(SALOME_InteractiveObject) lastIObject() ; // Function returns the last selected object in the list // of selected objects + + bool selectObjects( ObjectList& objects ); + // Selects list of objects //////////////////////////////////////////////////////////////////////////// // Virtual methods, to be redefined in dialog classes diff --git a/src/GEOMBase/GEOMBase_Skeleton.h b/src/GEOMBase/GEOMBase_Skeleton.h index 251c29436..fdd00155b 100644 --- a/src/GEOMBase/GEOMBase_Skeleton.h +++ b/src/GEOMBase/GEOMBase_Skeleton.h @@ -79,7 +79,7 @@ protected: QString myHelpFileName; protected slots: - void ClickOnCancel(); + virtual void ClickOnCancel(); void LineEditReturnPressed(); void DeactivateActiveDialog(); void ActivateThisDialog(); diff --git a/src/GEOMGUI/GEOMGUI_OCCSelector.cxx b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx index ed6056650..5b225bec1 100644 --- a/src/GEOMGUI/GEOMGUI_OCCSelector.cxx +++ b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -76,7 +77,7 @@ void GEOMGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const { for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() ) { - Handle(SelectMgr_EntityOwner) anOwner = ic->SelectedOwner(); + Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(ic->SelectedOwner()); if ( anOwner.IsNull() ) continue; @@ -128,7 +129,7 @@ void GEOMGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const } // add externally selected objects SUIT_DataOwnerPtrList::const_iterator anExtIter; - for(anExtIter = getSelectedExt().begin(); anExtIter != getSelectedExt().end(); anExtIter++) { + for(anExtIter = mySelectedExternals.begin(); anExtIter != mySelectedExternals.end(); anExtIter++) { aList.append(*anExtIter); } @@ -239,7 +240,9 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) for ( int i = 1, n = owners.Extent(); i <= n; i++ ) { - Handle(SelectMgr_EntityOwner) anOwner = owners( i ); + + Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(owners( i )); + if ( anOwner.IsNull() || !anOwner->HasShape() ) continue; @@ -294,7 +297,7 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) vw->update(); // fill extra selected - clearSelExtOwners(); + mySelectedExternals.clear(); for ( SUIT_DataOwnerPtrList::const_iterator itr2 = aList.begin(); itr2 != aList.end(); ++itr2 ) { const LightApp_DataSubOwner* subOwner = dynamic_cast( (*itr2).operator->() ); if ( !subOwner ) @@ -304,8 +307,7 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) { SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); QString anEntry = appStudy->referencedToEntry( owner->entry() ); - if (globalSelMap[anEntry] == 1) - appendSelExtOwner(*itr2); + if (globalSelMap[anEntry] == 1) mySelectedExternals.append(*itr2); } } } diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index f4a15ea35..7af013b20 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -23,6 +23,7 @@ #include "GEOM_Displayer.h" #include +#include #include #include @@ -66,7 +67,9 @@ GEOMGUI_Selection::~GEOMGUI_Selection() QtxValue GEOMGUI_Selection::globalParam( const QString& p ) const { if ( p == "isOCC" ) return QtxValue( activeViewType() == OCCViewer_Viewer::Type() ); - + if ( p == "selectionmode" ){ + return QtxValue(selectionMode()); + } return LightApp_Selection::globalParam( p ); } @@ -201,3 +204,24 @@ GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const } return GEOM::GEOM_Object::_nil(); } + +QString GEOMGUI_Selection:: selectionMode() const +{ + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if(aGeomGUI) + switch(aGeomGUI->getLocalSelectionMode()) + { + case GEOM_POINT : return "VERTEX"; + case GEOM_EDGE : return "EDGE"; + case GEOM_WIRE : return "WIRE"; + case GEOM_FACE : return "FACE"; + case GEOM_SHELL : return "SHELL"; + case GEOM_SOLID : return "SOLID"; + case GEOM_COMPOUND : return "COMPOUND"; + case GEOM_ALLOBJECTS : return "ALL"; + default: return ""; + } + } +} diff --git a/src/GEOMGUI/GEOMGUI_Selection.h b/src/GEOMGUI/GEOMGUI_Selection.h index 5fb15727c..adca786b3 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.h +++ b/src/GEOMGUI/GEOMGUI_Selection.h @@ -49,6 +49,7 @@ private: bool isVisible( const int ) const; QString typeName( const int ) const; QString displayMode( const int ) const; + QString selectionMode() const; bool isComponent( const int ) const; GEOM::GEOM_Object_ptr getObject( const int ) const; diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index 3ca1ebbab..d13170019 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -40,6 +40,7 @@ #include "GEOM_Actor.h" #include "GEOM_AssemblyBuilder.h" #include "GEOM_AISShape.hxx" +#include "GEOM_AISVector.hxx" #include "GEOM_AISTrihedron.hxx" #include "GEOM_VTKTrihedron.hxx" @@ -237,6 +238,13 @@ GEOM_Displayer::GEOM_Displayer( SalomeApp_Study* st ) myShadingColor = SalomeApp_Tools::color( col ); myDisplayMode = resMgr->integerValue("Geometry", "display_mode", 0); + myTypeOfMarker = (Aspect_TypeOfMarker)resMgr->integerValue("Geometry", "type_of_marker", Aspect_TOM_PLUS); + myScaleOfMarker = resMgr->doubleValue("Geometry", "marker_scale", 1.); + if(myScaleOfMarker < 1.0) + myScaleOfMarker = 1.0; + if(myScaleOfMarker > 7.) + myScaleOfMarker = 7.; + myColor = -1; // This color is used for shape displaying. If it is equal -1 then @@ -513,7 +521,12 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) { if ( !myShape.IsNull() ) { - Handle(GEOM_AISShape) AISShape = new GEOM_AISShape( myShape, "" ); + //Handle(GEOM_AISShape) AISShape = new GEOM_AISShape( myShape, "" ); + Handle(GEOM_AISShape) AISShape; + if (myType == GEOM_VECTOR) + AISShape = new GEOM_AISVector (myShape, ""); + else + AISShape = new GEOM_AISShape (myShape, ""); // Temporary staff: vertex must be infinite for correct visualization AISShape->SetInfiniteState( myShape.Infinite() || myShape.ShapeType() == TopAbs_VERTEX ); @@ -523,21 +536,22 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) // Set color and number for iso lines SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); - QColor col = aResMgr->colorValue( "Geometry", "isos_color", QColor(int(0.5*255), int(0.5*255), int(0.5*255)) ); + QColor col = aResMgr->colorValue( "Geometry", "isos_color", + QColor(int(0.5*255), int(0.5*255), int(0.5*255)) ); Quantity_Color aColor = SalomeApp_Tools::color( col ); int anUIsoNumber = aResMgr->integerValue("OCCViewer", "iso_number_u", 1); int aVIsoNumber = aResMgr->integerValue("OCCViewer", "iso_number_v", 1); - + Handle(Prs3d_IsoAspect) anAspect = AISShape->Attributes()->UIsoAspect(); anAspect->SetNumber( anUIsoNumber ); anAspect->SetColor( aColor ); AISShape->Attributes()->SetUIsoAspect( anAspect ); - + anAspect = AISShape->Attributes()->VIsoAspect(); anAspect->SetNumber( aVIsoNumber ); anAspect->SetColor( aColor ); AISShape->Attributes()->SetVIsoAspect( anAspect ); - + if ( HasColor() ) { AISShape->SetColor( (Quantity_NameOfColor)GetColor() ); @@ -545,6 +559,8 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) { Handle(Prs3d_PointAspect) anAspect = AISShape->Attributes()->PointAspect(); anAspect->SetColor( (Quantity_NameOfColor)GetColor() ); + anAspect->SetScale( myScaleOfMarker ); + anAspect->SetTypeOfMarker( myTypeOfMarker ); AISShape->Attributes()->SetPointAspect( anAspect ); } } @@ -554,17 +570,19 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) { col = aResMgr->colorValue( "Geometry", "point_color", QColor( 255, 255, 0 ) ); aColor = SalomeApp_Tools::color( col ); - + Handle(Prs3d_PointAspect) anAspect = AISShape->Attributes()->PointAspect(); anAspect->SetColor( aColor ); - AISShape->Attributes()->SetPointAspect( anAspect ); + anAspect->SetScale( myScaleOfMarker ); + anAspect->SetTypeOfMarker( myTypeOfMarker ); + AISShape->Attributes()->SetPointAspect( anAspect ); } else { // Set line aspect col = aResMgr->colorValue( "Geometry", "wireframe_color", QColor( 255, 255, 0 ) ); aColor = SalomeApp_Tools::color( col ); - + Handle(Prs3d_LineAspect) anAspect = AISShape->Attributes()->LineAspect(); anAspect->SetColor( aColor ); AISShape->Attributes()->SetLineAspect( anAspect ); @@ -577,15 +595,15 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) // Set free boundaries aspect col = aResMgr->colorValue( "Geometry", "free_bound_color", QColor( 0, 255, 0 ) ); aColor = SalomeApp_Tools::color( col ); - + anAspect = AISShape->Attributes()->FreeBoundaryAspect(); anAspect->SetColor( aColor ); AISShape->Attributes()->SetFreeBoundaryAspect( anAspect ); - + // Set wire aspect col = aResMgr->colorValue( "Geometry", "line_color", QColor( 255, 0, 0 ) ); aColor = SalomeApp_Tools::color( col ); - + anAspect = AISShape->Attributes()->WireAspect(); anAspect->SetColor( aColor ); AISShape->Attributes()->SetWireAspect( anAspect ); @@ -664,7 +682,7 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) vtkActorCollection* theActors = 0; - if ( myType == GEOM_MARKER && !myShape.IsNull() && myShape.ShapeType() == TopAbs_FACE ) + if ( myType == GEOM_MARKER && myShape.ShapeType() == TopAbs_FACE ) { myToActivate = false; GEOM_VTKTrihedron* aTrh = GEOM_VTKTrihedron::New(); @@ -692,7 +710,10 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) theActors->AddItem( aTrh ); } else - theActors = GEOM_AssemblyBuilder::BuildActors( myShape, 0, 0, Standard_True ); + { + bool isVector = (myType == GEOM_VECTOR); + theActors = GEOM_AssemblyBuilder::BuildActors( myShape, 0, 0, Standard_True, isVector ); + } theActors->InitTraversal(); @@ -1054,7 +1075,13 @@ void GEOM_Displayer::AfterDisplay( SALOME_View*, const SALOME_OCCViewType& ) //================================================================= void GEOM_Displayer::SetColor( const int color ) { - myColor = color; + if ( color == -1 ) + UnsetColor(); + else + { + myColor = color; + myShadingColor = Quantity_Color( (Quantity_NameOfColor)color ); + } } int GEOM_Displayer::GetColor() const @@ -1070,6 +1097,10 @@ bool GEOM_Displayer::HasColor() const void GEOM_Displayer::UnsetColor() { myColor = -1; + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + QColor col = resMgr->colorValue( "Geometry", "shading_color", QColor( 255, 0, 0 ) ); + myShadingColor = SalomeApp_Tools::color( col ); } //================================================================= @@ -1162,3 +1193,27 @@ bool GEOM_Displayer::canBeDisplayed( const QString& /*entry*/, const QString& vi { return viewer_type==SOCC_Viewer::Type() || viewer_type==SVTK_Viewer::Type(); } + +int GEOM_Displayer::SetDisplayMode( const int theMode ) +{ + int aPrevMode = myDisplayMode; + if ( theMode != -1 ) + myDisplayMode = theMode; + else + { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + myDisplayMode = resMgr->integerValue( "Geometry", "display_mode", 0 ); + } + return aPrevMode; +} + +int GEOM_Displayer::GetDisplayMode() const +{ + return myDisplayMode; +} + +int GEOM_Displayer::UnsetDisplayMode() +{ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + myDisplayMode = resMgr->integerValue( "Geometry", "display_mode", 0 ); +} diff --git a/src/GEOMGUI/GEOM_Displayer.h b/src/GEOMGUI/GEOM_Displayer.h index 10c4d4ed4..878274ae4 100644 --- a/src/GEOMGUI/GEOM_Displayer.h +++ b/src/GEOMGUI/GEOM_Displayer.h @@ -1,22 +1,22 @@ // GEOM GEOMGUI : GUI for Geometry component // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // @@ -37,6 +37,7 @@ #include #include #include +#include #include @@ -59,7 +60,7 @@ class SUIT_SelectionFilter; class GEOMGUI_EXPORT GEOM_Displayer : public LightApp_Displayer { - + public: /* Constructor */ GEOM_Displayer( SalomeApp_Study* app ); @@ -75,9 +76,9 @@ public: // This overloaded Display() method can be useful for operations // not using dialog boxes. - void Display ( GEOM::GEOM_Object_ptr theObj, + void Display ( GEOM::GEOM_Object_ptr theObj, const bool updateViewer = true ); - + void Redisplay ( const Handle(SALOME_InteractiveObject)& theIO, const bool updateViewer = true ); @@ -88,17 +89,17 @@ public: void Erase ( GEOM::GEOM_Object_ptr theObj, const bool forced = false, - const bool updateViewer = true ); + const bool updateViewer = true ); /* Display/Erase list of objects methods */ - + void Display ( const SALOME_ListIO& theIOList, const bool updateViewer = true ); - + void Erase ( const SALOME_ListIO& theIOList, const bool forced = false, const bool updateViewer = true ); - + void Redisplay ( const SALOME_ListIO& theIOList, const bool updateViewer = true ); @@ -118,6 +119,11 @@ public: void UnsetWidth(); double GetWidth () const; bool HasWidth () const; + + /* Set display mode shape displaying. If it is equal -1 then display mode is used. */ + int SetDisplayMode( const int ); + int GetDisplayMode() const; + int UnsetDisplayMode(); /* Sets name - for temporary objects only */ @@ -146,20 +152,20 @@ protected: /* internal methods */ /* Builds presentation accordint to the current viewer type */ virtual SALOME_Prs* buildPresentation( const QString&, SALOME_View* = 0 ); - + /* Sets interactive object */ void setIO( const Handle(SALOME_InteractiveObject)& theIO ); - + /* Sets shape */ void setShape( const TopoDS_Shape& theShape ); - + /* Resets internal data */ void internalReset(); void clearTemporary( LightApp_SelectionMgr* theSelMgr ); SUIT_SelectionFilter* getFilter( const int theMode ); - + protected: Handle(SALOME_InteractiveObject) myIO; TopoDS_Shape myShape; @@ -173,6 +179,8 @@ protected: double myWidth; bool myToActivate; int myDisplayMode; + Aspect_TypeOfMarker myTypeOfMarker; + double myScaleOfMarker; private: SalomeApp_Application* myApp; diff --git a/src/GEOMGUI/GEOM_images.po b/src/GEOMGUI/GEOM_images.po index 130b32162..410405e9d 100644 --- a/src/GEOMGUI/GEOM_images.po +++ b/src/GEOMGUI/GEOM_images.po @@ -181,6 +181,10 @@ msgstr "pointonedge.png" msgid "ICON_DLG_ARC" msgstr "arc.png" +#ArcDlg +msgid "ICON_DLG_ARC_CENTER" +msgstr "arccenter.png" + #ArchimedeDlg msgid "ICON_DLG_ARCHIMEDE" msgstr "archimede.png" @@ -520,6 +524,9 @@ msgstr "block_face_4e.png" msgid "ICON_DLG_GLUE_FACES" msgstr "glue.png" +msgid "ICON_DLG_GLUE_FACES2" +msgstr "glue2.png" + msgid "ICON_DLG_FREE_FACES" msgstr "free_faces.png" @@ -762,3 +769,24 @@ msgstr "erase.png" msgid "ICO_POP_CREATE_GROUP" msgstr "group_new.png" + +msgid "ICO_VERTEX_SEL_ONLY" +msgstr "point2.png" + +msgid "ICO_EDGE_SEL_ONLY" +msgstr "build_edge.png" + +msgid "ICO_WIRE_SEL_ONLY" +msgstr "build_wire.png" + +msgid "ICO_FACE_SEL_ONLY" +msgstr "build_face.png" + +msgid "ICO_SHELL_SEL_ONLY" +msgstr "build_shell.png" + +msgid "ICO_SOLID_SEL_ONLY" +msgstr "build_solid.png" + +msgid "ICO_COMPOUND_SEL_ONLY" +msgstr "build_compound.png" \ No newline at end of file diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po index 6d538e649..01825cc9d 100644 --- a/src/GEOMGUI/GEOM_msg_en.po +++ b/src/GEOMGUI/GEOM_msg_en.po @@ -1263,6 +1263,10 @@ msgstr "OZX" msgid "GEOM_WPLANE_OXY" msgstr "OXY" +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_REVERSE_PLANE" +msgstr "Reverse the plane normal" + #: GeometryGUI_multiTranslationDlg.cxx:107 msgid "GEOM_MULTITRANSLATION_TITLE" msgstr "Multi-Translation" @@ -1970,6 +1974,18 @@ msgstr "Glue faces" msgid "GEOM_GLUE" msgstr "Glue" +msgid "RepairGUI_GlueDlg::SELECT_FACES" +msgstr "Select Faces" + +msgid "RepairGUI_GlueDlg::FACES_FOR_GLUING_ARE_DETECTED" +msgstr "There are %1 face(s) that can be glued. They are coloured on the screen with red colour\nPlease close this message box and select faces for glueing" + +msgid "RepairGUI_GlueDlg::GLUE_FACES" +msgstr "Glue faces" + +msgid "RepairGUI_GlueDlg::THERE_ARE_NO_FACES_FOR_GLUING" +msgstr "There are no faces for gluing" + msgid "GEOM_FREE_FACES_TITLE" msgstr "Free faces" @@ -2932,6 +2948,9 @@ msgstr "OCC Viewer 3d" msgid "PREF_GROUP_GENERAL" msgstr "General" +msgid "PREF_GROUP_VERTEX" +msgstr "Marker of Points" + msgid "PREF_SHADING_COLOR" msgstr "Default shading color" @@ -2959,8 +2978,99 @@ msgstr "Default display mode" msgid "PREF_TAB_SETTINGS" msgstr "Settings" +msgid "PREF_TYPE_OF_MARKER" +msgstr "Type" + +msgid "PREF_MARKER_SCALE" +msgstr "Size" + +msgid "TOM_POINT" +msgstr "." + +msgid "TOM_PLUS" +msgstr "+" + +msgid "TOM_STAR" +msgstr "*" + +msgid "TOM_O" +msgstr "O" + +msgid "TOM_X" +msgstr "X" + +msgid "TOM_O_POINT" +msgstr ". in O" + +msgid "TOM_O_PLUS" +msgstr "+ in O" + +msgid "TOM_O_STAR" +msgstr "* in O" + +msgid "TOM_O_X" +msgstr "X in O" + msgid "ERROR_SHAPE_TYPE" msgstr "Object of incorrect type selected!\nPlease, select face, shell or solid and try again" msgid "DEP_OBJECT" msgstr "Selected object has been used to create another one\n It can't be deleted " + +msgid "MEN_SELECT_ONLY" +msgstr "Select Only" + +msgid "STB_VERTEX_SEL_ONLY" +msgstr "Select only a Points" + +msgid "STB_EDGE_SEL_ONLY" +msgstr "Select only a Edges" + +msgid "STB_WIRE_SEL_ONLY" +msgstr "Select only a Wires" + +msgid "STB_FACE_SEL_ONLY" +msgstr "Select only a Faces" + +msgid "STB_SHELL_SEL_ONLY" +msgstr "Select only a Shells" + +msgid "STB_SOLID_SEL_ONLY" +msgstr "Select only a Solids" + +msgid "STB_COMPOUND_SEL_ONLY" +msgstr "Select only a Compounds" + +msgid "STB_ALL_SEL_ONLY" +msgstr "Select all Objects" + +msgid "MEN_VERTEX_SEL_ONLY" +msgstr "Vertex" + +msgid "MEN_EDGE_SEL_ONLY" +msgstr "Edge" + +msgid "MEN_WIRE_SEL_ONLY" +msgstr "Wire" + +msgid "MEN_FACE_SEL_ONLY" +msgstr "Face" + +msgid "MEN_SHELL_SEL_ONLY" +msgstr "Shell" + +msgid "MEN_SOLID_SEL_ONLY" +msgstr "Solid" + +msgid "MEN_COMPOUND_SEL_ONLY" +msgstr "Compound" + +msgid "MEN_ALL_SEL_ONLY" +msgstr "Select All" + + + + + + + diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 0ab1ed994..e7aa4ced1 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -61,6 +61,7 @@ #include #include +#include #include #include @@ -189,6 +190,7 @@ GeometryGUI::GeometryGUI() : myVTKSelectors.setAutoDelete( true ); myDisplayer = 0; + myLocalSelectionMode = GEOM_ALLOBJECTS; } //======================================================================= @@ -368,6 +370,14 @@ void GeometryGUI::OnGUIEvent( int id ) id == 121 || // MENU FILE - EXPORT BREP id == 122 || // MENU FILE - EXPORT IGES id == 123 || // MENU FILE - EXPORT STEP + id == 2171 || // POPUP VIEWER - SELECT ONLY - VERTEX + id == 2172 || // POPUP VIEWER - SELECT ONLY - EDGE + id == 2173 || // POPUP VIEWER - SELECT ONLY - WIRE + id == 2174 || // POPUP VIEWER - SELECT ONLY - FACE + id == 2175 || // POPUP VIEWER - SELECT ONLY - SHELL + id == 2176 || // POPUP VIEWER - SELECT ONLY - SOLID + id == 2177 || // POPUP VIEWER - SELECT ONLY - COMPOUND + id == 2178 || // POPUP VIEWER - SELECT ONLY - SELECT ALL id == 31 || // MENU EDIT - COPY id == 33 || // MENU EDIT - DELETE id == 411 || // MENU SETTINGS - ADD IN STUDY @@ -854,6 +864,14 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( 212, "DISPLAY_ALL" ); createGeomAction( 214, "ERASE_ALL" ); createGeomAction( 216, "DISPLAY" ); + createGeomAction( 2171, "VERTEX_SEL_ONLY" ,"", 0, true ); + createGeomAction( 2172, "EDGE_SEL_ONLY", "", 0, true ); + createGeomAction( 2173, "WIRE_SEL_ONLY", "", 0, true ); + createGeomAction( 2174, "FACE_SEL_ONLY", "", 0, true ); + createGeomAction( 2175, "SHELL_SEL_ONLY", "", 0, true ); + createGeomAction( 2176, "SOLID_SEL_ONLY", "", 0, true ); + createGeomAction( 2177, "COMPOUND_SEL_ONLY", "", 0, true ); + createGeomAction( 2178, "ALL_SEL_ONLY", "", 0, true ); createGeomAction( 213, "DISPLAY_ONLY" ); createGeomAction( 215, "ERASE" ); @@ -1115,6 +1133,35 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( 214 ), -1, -1 ); // erase All mgr->setRule( action( 214 ), clientOCCorVTK, true ); + QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)"; + + int selectolnyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1); //select only menu + mgr->insert( action(2171), selectolnyId, -1); //Vertex + mgr->setRule(action(2171), selectOnly, true); + mgr->setRule(action(2171), selectOnly + " and selectionmode='VERTEX'", false); + mgr->insert( action(2172), selectolnyId, -1); //Edge + mgr->setRule(action(2172), selectOnly, true); + mgr->setRule(action(2172), selectOnly + " and selectionmode='EDGE'", false); + mgr->insert( action(2173), selectolnyId, -1); //Wire + mgr->setRule(action(2173), selectOnly, true); + mgr->setRule(action(2173), selectOnly + " and selectionmode='WIRE'", false); + mgr->insert( action(2174), selectolnyId, -1); //Face + mgr->setRule(action(2174), selectOnly, true); + mgr->setRule(action(2174), selectOnly + " and selectionmode='FACE'", false); + mgr->insert( action(2175), selectolnyId, -1); //Shell + mgr->setRule(action(2175), selectOnly, true); + mgr->setRule(action(2175), selectOnly + " and selectionmode='SHELL'", false); + mgr->insert( action(2176), selectolnyId, -1); //Solid + mgr->setRule(action(2176), selectOnly, true); + mgr->setRule(action(2176), selectOnly + " and selectionmode='SOLID'", false); + mgr->insert( action(2177), selectolnyId, -1); //Compound + mgr->setRule(action(2177), selectOnly, true); + mgr->setRule(action(2177), selectOnly + " and selectionmode='COMPOUND'", false); + mgr->insert( separator(), selectolnyId, -1); + mgr->insert( action(2178), selectolnyId, -1); //Clear selection filter + mgr->setRule(action(2178), selectOnly, true); + mgr->setRule(action(2178), selectOnly + " and selectionmode='ALL'", false); + mgr->insert( action( 213 ), -1, -1 ); // display only mgr->setRule( action( 213 ), rule.arg( types ).arg( "true" ), true ); mgr->insert( separator(), -1, -1 ); @@ -1678,6 +1725,14 @@ void GeometryGUI::createPreferences() int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup, LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" ); + int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId ); + + int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup, + LightApp_Preferences::Selector, "Geometry", "type_of_marker" ); + + int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup, + LightApp_Preferences::DblSpin, "Geometry", "marker_scale" ); + // Set property for default display mode QStringList aModesList; aModesList.append( tr("MEN_WIREFRAME") ); @@ -1695,6 +1750,47 @@ void GeometryGUI::createPreferences() setPreferenceProperty( step, "max", 10000 ); setPreferenceProperty( step, "precision", 3 ); + // Set property for type of vertex marker + QStringList aTypeOfMarkerList; + QValueList anTypeOfMarkerIndexesList; + + aTypeOfMarkerList.append( tr("TOM_PLUS") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_PLUS); + + aTypeOfMarkerList.append( tr("TOM_POINT") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_POINT); + + aTypeOfMarkerList.append( tr("TOM_STAR") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_STAR); + + aTypeOfMarkerList.append( tr("TOM_O") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_O); + + aTypeOfMarkerList.append( tr("TOM_X") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_X); + + aTypeOfMarkerList.append( tr("TOM_O_POINT") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_O_POINT); + + aTypeOfMarkerList.append( tr("TOM_O_PLUS") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_O_PLUS); + + aTypeOfMarkerList.append( tr("TOM_O_STAR") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_O_STAR); + + aTypeOfMarkerList.append( tr("TOM_O_X") ); + anTypeOfMarkerIndexesList.append(Aspect_TOM_O_X); + + + setPreferenceProperty( typeOfMarker, "strings", aTypeOfMarkerList ); + setPreferenceProperty( typeOfMarker, "indexes", anTypeOfMarkerIndexesList ); + + // Set property for Vertex Marker scale + setPreferenceProperty( markerScale, "min", 1. ); + setPreferenceProperty( markerScale, "max", 7. ); + setPreferenceProperty( markerScale, "precision", 0.01 ); + setPreferenceProperty( markerScale, "step", 0.5 ); + } void GeometryGUI::preferencesChanged( const QString& section, const QString& param ) @@ -1714,3 +1810,12 @@ LightApp_Displayer* GeometryGUI::displayer() myDisplayer = new GEOM_Displayer( dynamic_cast( getApp()->activeStudy() ) ); return myDisplayer; } + +void GeometryGUI::setLocalSelectionMode(const int mode) +{ + myLocalSelectionMode = mode; +} +int GeometryGUI::getLocalSelectionMode() const +{ + return myLocalSelectionMode; +} diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h index f6e93644a..484e3883f 100644 --- a/src/GEOMGUI/GeometryGUI.h +++ b/src/GEOMGUI/GeometryGUI.h @@ -120,7 +120,8 @@ public: virtual void contextMenuPopup( const QString&, QPopupMenu*, QString& ); virtual void createPreferences(); virtual void preferencesChanged( const QString&, const QString& ); - + int getLocalSelectionMode() const; + void setLocalSelectionMode(const int mode); public slots: virtual bool deactivateModule( SUIT_Study* ); @@ -170,6 +171,7 @@ private: QPtrList myVTKSelectors; LightApp_Displayer* myDisplayer; + int myLocalSelectionMode; //Select Only friend class DisplayGUI; }; diff --git a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx index ded4e8b69..d25eb2199 100644 --- a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx @@ -35,12 +35,18 @@ #include #include - #include #include #include #include +#include +#include +#include +#include +#include + +#include "utilities.h" //======================================================================= //function : GetID //purpose : @@ -73,8 +79,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; - - if (aType == CIRC_ARC_THREE_PNT) { + if ((aType == CIRC_ARC_THREE_PNT)||(aType == CIRC_ARC_CENTER)) { Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1(); Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3(); @@ -93,8 +98,28 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const Standard_ConstructionError::Raise("Arc creation aborted: coincident points given"); if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) Standard_ConstructionError::Raise("Arc creation aborted: points lay on one line"); - GC_MakeArcOfCircle arc (aP1, aP2, aP3); - aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); + if (aType == CIRC_ARC_THREE_PNT){ + GC_MakeArcOfCircle arc(aP1, aP2, aP3); + aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); + + } + if (aType == CIRC_ARC_CENTER){ + Standard_Real Rad = aP1.Distance(aP2); + gce_MakeCirc MC(aP1,gce_MakePln(aP1, aP2, aP3).Value(),Rad); + Standard_Boolean sense = aCI.GetSense(); + if (MC.IsDone()) { + const gp_Circ& Circ = MC.Value(); + Standard_Real Alpha1 = ElCLib::Parameter(Circ,aP2); + Standard_Real Alpha2 = ElCLib::Parameter(Circ,aP3); + Handle(Geom_Circle) C = new Geom_Circle(Circ); + Handle(Geom_TrimmedCurve) TheArc; + if (!sense) + TheArc= new Geom_TrimmedCurve(C,Alpha1,Alpha2,false); + if (sense) + TheArc= new Geom_TrimmedCurve(C,Alpha2,Alpha1,false); + aShape = BRepBuilderAPI_MakeEdge(TheArc).Edge(); + } + } } } else { } @@ -104,7 +129,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const aFunction->SetValue(aShape); log.SetTouched(Label()); - + MESSAGE("Out of building step ..."); return 1; } diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx index 2a7c71386..4bf020b61 100644 --- a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -231,6 +232,81 @@ Standard_Integer GEOMImpl_BooleanDriver::Execute(TFunction_Logbook& log) const // perform FUSE operation else if (aType == BOOLEAN_FUSE) { + // Check arguments + TopTools_ListOfShape listShape1, listShape2; + AddSimpleShapes(aShape1, listShape1); + AddSimpleShapes(aShape2, listShape2); + + Standard_Boolean isIntersect = Standard_False; + + if (listShape1.Extent() > 1 && !isIntersect) { + // check intersections inside the first compound + TopTools_ListIteratorOfListOfShape it1 (listShape1); + for (; it1.More() && !isIntersect; it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape1); + for (; it2.More() && !isIntersect; it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + isIntersect = Standard_True; + } + } + } + } + } + } + + if (listShape2.Extent() > 1 && !isIntersect) { + // check intersections inside the second compound + TopTools_ListIteratorOfListOfShape it1 (listShape2); + for (; it1.More() && !isIntersect; it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape2); + for (; it2.More() && !isIntersect; it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + isIntersect = Standard_True; + } + } + } + } + } + } + + if (isIntersect) { + // have intersections inside compounds + // check intersections between compounds + TopTools_ListIteratorOfListOfShape it1 (listShape1); + for (; it1.More(); it1.Next()) { + TopoDS_Shape aValue1 = it1.Value(); + TopTools_ListIteratorOfListOfShape it2 (listShape2); + for (; it2.More(); it2.Next()) { + TopoDS_Shape aValue2 = it2.Value(); + if (aValue2 != aValue1) { + BRepAlgoAPI_Section BO (aValue1, aValue2); + if (BO.IsDone()) { + TopoDS_Shape aSect = BO.Shape(); + TopExp_Explorer anExp (aSect, TopAbs_EDGE); + if (anExp.More()) { + StdFail_NotDone::Raise("Bad argument for Fuse: compound with intersecting sub-shapes"); + } + } + } + } + } + } + + // Perform BRepAlgoAPI_Fuse BO (aShape1, aShape2); if (!BO.IsDone()) { StdFail_NotDone::Raise("Fuse operation can not be performed on the given shapes"); diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx index fd41180a9..e056bf7d8 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx @@ -28,6 +28,10 @@ #include #include +#include "GEOMAlgo_Gluer1.hxx" +#include "GEOMAlgo_ListIteratorOfListOfCoupleOfShapes.hxx" +#include "GEOMAlgo_CoupleOfShapes.hxx" +#include "GEOMAlgo_ListOfCoupleOfShapes.hxx" #include "utilities.h" @@ -187,6 +191,7 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueFacesWithWarnings (const TopoDS_Shape& the return aRes; } + //======================================================================= //function : GlueFaces //purpose : @@ -249,6 +254,56 @@ TopoDS_Shape GEOMImpl_GlueDriver::GlueFaces (const TopoDS_Shape& theShape, return aRes; } + +//======================================================================= +//function : GlueFacesByList +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_GlueDriver::GlueFacesByList (const TopoDS_Shape& theShape, + const Standard_Real theTolerance, + const TopTools_MapOfShape& aFaces) +{ + TopoDS_Shape aRes; + + GEOMAlgo_Gluer1 aGluer; + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes aItCS; + GEOMAlgo_CoupleOfShapes aCS; + GEOMAlgo_ListOfCoupleOfShapes aLCS; + + aGluer.SetShape(theShape); + aGluer.SetTolerance(theTolerance); + aGluer.Perform(); + Standard_Integer iErr = aGluer.ErrorStatus(); + if (iErr) return aRes; + + TopTools_ListOfShape listShape; + const GEOMAlgo_ListOfCoupleOfShapes& aLCSG = aGluer.GluedFaces(); + // Access to faces + aItCS.Initialize(aLCSG); + for (; aItCS.More(); aItCS.Next()) { + const GEOMAlgo_CoupleOfShapes& aCSG = aItCS.Value(); + const TopoDS_Shape& aF1 = aCSG.Shape1(); + const TopoDS_Shape& aF2 = aCSG.Shape2(); + if( aFaces.Contains(aF1) || aFaces.Contains(aF2) ) + continue; + aCS.SetShapes(aF1,aF2); + aLCS.Append(aCS); + } + + //cout<<"aLCS.Extent() = "<0) { + aGluer.SetFacesToUnglue(aLCS); + aGluer.UnglueFaces(); + iErr = aGluer.ErrorStatus(); + if (iErr) return aRes; + } + + aRes = aGluer.Result(); + + return aRes; +} + + //======================================================================= //function : Execute //purpose : @@ -264,16 +319,35 @@ Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShape; TCollection_AsciiString aWrn; - if (aType == GLUE_FACES) { - Handle(GEOM_Function) aRefBase = aCI.GetBase(); - TopoDS_Shape aShapeBase = aRefBase->GetValue(); - if (aShapeBase.IsNull()) { - Standard_NullObject::Raise("Shape for gluing is null"); - } + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + if (aShapeBase.IsNull()) { + Standard_NullObject::Raise("Shape for gluing is null"); + } - Standard_Real tol3d = aCI.GetTolerance(); + Standard_Real tol3d = aCI.GetTolerance(); + + if (aType == GLUE_FACES) { aShape = GlueFacesWithWarnings(aShapeBase, tol3d, aWrn); - } else { + } + else { // aType == GLUE_FACES_BY_LIST + Handle(TColStd_HSequenceOfTransient) SF = aCI.GetFaces(); + TopTools_MapOfShape aFaces; + int i=1; + for( ; i <= SF->Length(); i++) { + Handle(Standard_Transient) anItem = SF->Value(i); + if(anItem.IsNull()) + continue; + Handle(GEOM_Function) aRefSh = Handle(GEOM_Function)::DownCast(anItem); + if(aRefSh.IsNull()) + continue; + TopoDS_Shape aFace = aRefSh->GetValue(); + if(aFace.IsNull()) + continue; + if(!aFaces.Contains(aFace)) + aFaces.Add(aFace); + } + aShape = GlueFacesByList(aShapeBase, tol3d, aFaces); } if (aShape.IsNull()) return 0; diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx index 3c78c7bc8..eee00b868 100644 --- a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx @@ -53,6 +53,8 @@ class Handle_Standard_Type; class Handle(TFunction_Driver); class GEOMImpl_GlueDriver; +#include + Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_GlueDriver); class Handle(GEOMImpl_GlueDriver) : public Handle(TFunction_Driver) { @@ -154,6 +156,11 @@ Standard_EXPORT TopoDS_Shape GlueFacesWithWarnings (const TopoDS_Shape& theShape const Standard_Real theTolerance, TCollection_AsciiString& theWarning) const; +Standard_EXPORT static TopoDS_Shape GlueFacesByList (const TopoDS_Shape& theShape, + const Standard_Real theTolerance, + const TopTools_MapOfShape& aFaces); + + // Type management // Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_GlueDriver_Type_(); diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index a4ed0e79e..de70f1259 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -59,6 +59,7 @@ #include #include #include +#include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC @@ -1091,17 +1092,18 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeThruSections( } + //============================================================================= /*! * MakePipeWithDifferentSections */ //============================================================================= Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( - const Handle(TColStd_HSequenceOfTransient)& theBases, - const Handle(TColStd_HSequenceOfTransient)& theLocations, - const Handle(GEOM_Object)& thePath, - bool theWithContact, - bool theWithCorrections) + const Handle(TColStd_HSequenceOfTransient)& theBases, + const Handle(TColStd_HSequenceOfTransient)& theLocations, + const Handle(GEOM_Object)& thePath, + bool theWithContact, + bool theWithCorrections) { Handle(GEOM_Object) anObj; SetErrorCode(KO); @@ -1232,3 +1234,165 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithDifferentSections( } + + +//============================================================================= +/*! + * MakePipeWithShellSections + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeWithShellSections( + const Handle(TColStd_HSequenceOfTransient)& theBases, + const Handle(TColStd_HSequenceOfTransient)& theSubBases, + const Handle(TColStd_HSequenceOfTransient)& theLocations, + const Handle(GEOM_Object)& thePath, + bool theWithContact, + bool theWithCorrections) +{ + Handle(GEOM_Object) anObj; + SetErrorCode(KO); + if(theBases.IsNull()) + return anObj; + + Standard_Integer nbBases = theBases->Length(); + + if (!nbBases) + return anObj; + + Standard_Integer nbSubBases = (theSubBases.IsNull() ? 0 :theSubBases->Length()); + + Standard_Integer nbLocs = (theLocations.IsNull() ? 0 :theLocations->Length()); + + //Add a new Pipe object + Handle(GEOM_Object) aPipeDS = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + + //Add a new Pipe function + + Handle(GEOM_Function) aFunction = + aPipeDS->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_SHELL_SECTIONS); + if (aFunction.IsNull()) return anObj; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return anObj; + + //GEOMImpl_IPipeDiffSect aCI (aFunction); + GEOMImpl_IPipeShellSect aCI (aFunction); + + Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); + if(aRefPath.IsNull()) + return anObj; + + Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aSeqLocs = new TColStd_HSequenceOfTransient; + + Standard_Integer i =1; + for( ; i <= nbBases; i++) { + + Handle(Standard_Transient) anItem = theBases->Value(i); + if(anItem.IsNull()) + continue; + Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem); + if(aBase.IsNull()) + continue; + Handle(GEOM_Function) aRefBase = aBase->GetLastFunction(); + if(aRefBase.IsNull()) + continue; + + if( nbSubBases >= nbBases ) { + Handle(Standard_Transient) aSubItem = theSubBases->Value(i); + if(aSubItem.IsNull()) + continue; + Handle(GEOM_Object) aSubBase = Handle(GEOM_Object)::DownCast(aSubItem); + if(aSubBase.IsNull()) + continue; + Handle(GEOM_Function) aRefSubBase = aSubBase->GetLastFunction(); + if(aRefSubBase.IsNull()) + continue; + aSeqSubBases->Append(aRefSubBase); + } + + if(nbLocs) { + Handle(Standard_Transient) anItemLoc = theLocations->Value(i); + if(anItemLoc.IsNull()) + continue; + Handle(GEOM_Object) aLoc = Handle(GEOM_Object)::DownCast(anItemLoc); + if(aLoc.IsNull()) + continue; + Handle(GEOM_Function) aRefLoc = aLoc->GetLastFunction(); + if(aRefLoc.IsNull()) + continue; + aSeqLocs->Append(aRefLoc); + } + + aSeqBases->Append(aRefBase); + } + + if(!aSeqBases->Length()) + return anObj; + + aCI.SetBases(aSeqBases); + aCI.SetSubBases(aSeqSubBases); + aCI.SetLocations(aSeqLocs); + aCI.SetPath(aRefPath); + aCI.SetWithContactMode(theWithContact); + aCI.SetWithCorrectionMode(theWithCorrections); + + //Compute the Pipe value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Pipe with shell sections driver failed"); + return anObj; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return anObj; + } + + //Make a Python command + GEOM::TPythonDump pyDump(aFunction); + pyDump << aPipeDS << " = geompy.MakePipeWithShellSections(["; + + for(i =1 ; i <= nbBases; i++) { + + Handle(Standard_Transient) anItem = theBases->Value(i); + if(anItem.IsNull()) + continue; + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); + if(!anObj.IsNull()) { + pyDump<< anObj; + if(i < nbBases) + pyDump<<", "; + } + + } + + pyDump<< "], ["; + + for(i =1 ; i <= nbLocs; i++) { + + Handle(Standard_Transient) anItem = theLocations->Value(i); + if(anItem.IsNull()) + continue; + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(anItem); + if(!anObj.IsNull()) { + pyDump<< anObj; + if(i < nbLocs) + pyDump<<", "; + } + } + + pyDump<< "], "<SetReference(ARC_ARG_PI, theP); } void SetPoint2(Handle(GEOM_Function) theP) { _func->SetReference(ARC_ARG_PC, theP); } void SetPoint3(Handle(GEOM_Function) theP) { _func->SetReference(ARC_ARG_PE, theP); } + void SetSense(bool theSense) { _func->SetInteger(ARC_ARG_SE, theSense); } Handle(GEOM_Function) GetPoint1() { return _func->GetReference(ARC_ARG_PI); } Handle(GEOM_Function) GetPoint2() { return _func->GetReference(ARC_ARG_PC); } Handle(GEOM_Function) GetPoint3() { return _func->GetReference(ARC_ARG_PE); } - + bool GetSense() { return _func->GetInteger(ARC_ARG_SE); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx index a28543ca7..3643e6f39 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -332,24 +332,25 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArc (Handle(GEOM_Object) the //Add a new Circle Arc function Handle(GEOM_Function) aFunction = - anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_THREE_PNT); - if (aFunction.IsNull()) return NULL; + anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_THREE_PNT); + if (aFunction.IsNull()) return NULL; + //Check if the function is set correctly if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL; - GEOMImpl_IArc aCI (aFunction); Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction(); Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction(); Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction(); + if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL; aCI.SetPoint1(aRefPnt1); aCI.SetPoint2(aRefPnt2); aCI.SetPoint3(aRefPnt3); - + //Compute the Arc value try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 @@ -374,6 +375,66 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArc (Handle(GEOM_Object) the return anArc; } +//============================================================================= +/*! + * MakeArcCenter + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArcCenter (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3, + bool theSense) +{ + SetErrorCode(KO); + if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL; + + //Add a new Circle Arc object + Handle(GEOM_Object) anArc = GetEngine()->AddObject(GetDocID(), GEOM_CIRC_ARC); + + //Add a new Circle Arc function + Handle(GEOM_Function) aFunction = + anArc->AddFunction(GEOMImpl_ArcDriver::GetID(), CIRC_ARC_CENTER); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ArcDriver::GetID()) return NULL; + + GEOMImpl_IArc aCI (aFunction); + + Handle(GEOM_Function) aRefPnt1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRefPnt2 = thePnt2->GetLastFunction(); + Handle(GEOM_Function) aRefPnt3 = thePnt3->GetLastFunction(); + + if (aRefPnt1.IsNull() || aRefPnt2.IsNull() || aRefPnt3.IsNull()) return NULL; + + aCI.SetPoint1(aRefPnt1); + aCI.SetPoint2(aRefPnt2); + aCI.SetPoint3(aRefPnt3); + aCI.SetSense(theSense); + + //Compute the Arc value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Arc driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + //Make a Python command + GEOM::TPythonDump(aFunction) << anArc << " = geompy.MakeArcCenter(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << "," << theSense << ")"; + + SetErrorCode(OK); + return anArc; +} + //============================================================================= /*! * MakeSplineBezier diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx index 0d6dbe97c..b0aa3cd39 100644 --- a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -51,6 +51,11 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeArc (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2, Handle(GEOM_Object) thePnt3); + + Standard_EXPORT Handle(GEOM_Object) MakeArcCenter (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3, + bool theSense); Standard_EXPORT Handle(GEOM_Object) MakeSplineBezier (list thePoints); Standard_EXPORT Handle(GEOM_Object) MakeSplineInterpolation (list thePoints); diff --git a/src/GEOMImpl/GEOMImpl_IGlue.hxx b/src/GEOMImpl/GEOMImpl_IGlue.hxx index 31d0cd2d4..7670ed70a 100644 --- a/src/GEOMImpl/GEOMImpl_IGlue.hxx +++ b/src/GEOMImpl/GEOMImpl_IGlue.hxx @@ -22,8 +22,11 @@ #include "GEOM_Function.hxx" +#include + #define GLUE_ARG_BASE 1 #define GLUE_ARG_TOLER 2 +#define GLUE_ARG_FACES 3 class GEOMImpl_IGlue { @@ -41,6 +44,12 @@ class GEOMImpl_IGlue Standard_Real GetTolerance() { return _func->GetReal(GLUE_ARG_TOLER); } + void SetFaces(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(GLUE_ARG_FACES, theShapes); } + + Handle(TColStd_HSequenceOfTransient) GetFaces() + { return _func->GetReferenceList(GLUE_ARG_FACES); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx index 094e2fbb7..9339f4a47 100644 --- a/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx @@ -260,7 +260,7 @@ Standard_Boolean GEOMImpl_IInsertOperations::ImportTranslators if (!InitResMgr()) return Standard_False; - // Read Import formats list + // Read Import formats list from install directory if (myResMgr->Find("Import")) { TCollection_AsciiString aFormats (myResMgr->Value("Import")); TCollection_AsciiString aToken = aFormats.Token("| \t", 1); @@ -270,6 +270,25 @@ Standard_Boolean GEOMImpl_IInsertOperations::ImportTranslators } } + // Read Import formats from user directory + if (myResMgrUser->Find("Import")) { + TCollection_AsciiString aFormats (myResMgrUser->Value("Import")); + TCollection_AsciiString aToken = aFormats.Token("| \t", 1); + int i = 1; + for (; !aToken.IsEmpty(); aToken = aFormats.Token("| \t", ++i)) { + int aLenFormats = theFormats->Length(); + bool isFound = false; + for(int aInd=1;aInd<=aLenFormats;aInd++){ + if( theFormats->Value(aInd) == aToken){ + isFound = true; + break; + } + } + if(!isFound) + theFormats->Append(aToken); + } + } + // Read Patterns for each supported format int j = 1, len = theFormats->Length(); for (; j <= len; j++) { @@ -277,10 +296,14 @@ Standard_Boolean GEOMImpl_IInsertOperations::ImportTranslators aKey = theFormats->Value(j) + ".ImportPattern"; if (myResMgr->Find(aKey.ToCString())) aPattern = myResMgr->Value(aKey.ToCString()); + else if(myResMgrUser->Find(aKey.ToCString())) + aPattern = myResMgrUser->Value(aKey.ToCString()); else { aKey = theFormats->Value(j) + ".Pattern"; if (myResMgr->Find(aKey.ToCString())) aPattern = myResMgr->Value(aKey.ToCString()); + else if(myResMgrUser->Find(aKey.ToCString())) + aPattern = myResMgrUser->Value(aKey.ToCString()); else { aPattern = theFormats->Value(j); aPattern += " Files ( *.* )"; @@ -313,7 +336,7 @@ Standard_Boolean GEOMImpl_IInsertOperations::ExportTranslators if (!InitResMgr()) return Standard_False; - // Read Export formats list + // Read Export formats list from install directory if (myResMgr->Find("Export")) { TCollection_AsciiString aFormats (myResMgr->Value("Export")); TCollection_AsciiString aToken = aFormats.Token("| \t", 1); @@ -323,6 +346,25 @@ Standard_Boolean GEOMImpl_IInsertOperations::ExportTranslators } } + // Read Export formats list from user directory + if (myResMgrUser->Find("Export")) { + TCollection_AsciiString aFormats (myResMgrUser->Value("Export")); + TCollection_AsciiString aToken = aFormats.Token("| \t", 1); + int i = 1; + for (; !aToken.IsEmpty(); aToken = aFormats.Token("| \t", ++i)) { + int aLenFormats = theFormats->Length(); + bool isFound = false; + for(int aInd=1;aInd<=aLenFormats;aInd++){ + if( theFormats->Value(aInd) == aToken){ + isFound = true; + break; + } + } + if(!isFound) + theFormats->Append(aToken); + } + } + // Read Patterns for each supported format int j = 1, len = theFormats->Length(); for (; j <= len; j++) { @@ -330,10 +372,14 @@ Standard_Boolean GEOMImpl_IInsertOperations::ExportTranslators aKey = theFormats->Value(j) + ".ExportPattern"; if (myResMgr->Find(aKey.ToCString())) aPattern = myResMgr->Value(aKey.ToCString()); + else if (myResMgrUser->Find(aKey.ToCString())) + aPattern = myResMgrUser->Value(aKey.ToCString()); else { aKey = theFormats->Value(j) + ".Pattern"; if (myResMgr->Find(aKey.ToCString())) aPattern = myResMgr->Value(aKey.ToCString()); + else if (myResMgrUser->Find(aKey.ToCString())) + aPattern = myResMgrUser->Value(aKey.ToCString()); else { aPattern = theFormats->Value(j); aPattern += " Files ( *.* )"; @@ -363,7 +409,8 @@ Standard_Boolean GEOMImpl_IInsertOperations::IsSupported if (isImport) aMode = "Import"; else aMode = "Export"; - // Read supported formats for the certain mode + + // Read supported formats for the certain mode from install directory if (myResMgr->Find(aMode.ToCString())) { TCollection_AsciiString aFormats (myResMgr->Value(aMode.ToCString())); if (aFormats.Search(theFormat) > -1) { @@ -383,7 +430,23 @@ Standard_Boolean GEOMImpl_IInsertOperations::IsSupported } } } - + + // Read supported formats for the certain mode from user directory + if (myResMgrUser->Find(aMode.ToCString())) { + TCollection_AsciiString aFormats (myResMgrUser->Value(aMode.ToCString())); + if (aFormats.Search(theFormat) > -1) { + // Read library name for the supported format + TCollection_AsciiString aKey (theFormat); + aKey += "."; + aKey += aMode; + if (myResMgrUser->Find(aKey.ToCString())) { + TCollection_AsciiString aLibName (myResMgrUser->Value(aKey.ToCString())); + theLibName = new TCollection_HAsciiString (aLibName); + return Standard_True; + } + } + } + return Standard_False; } @@ -394,16 +457,34 @@ Standard_Boolean GEOMImpl_IInsertOperations::IsSupported //============================================================================= Standard_Boolean GEOMImpl_IInsertOperations::InitResMgr() { + bool isResourceFound = false; + bool isResourceFoundUser = false; + TCollection_AsciiString aUserResDir,aResDir; + if (myResMgr.IsNull()) { // Initialize the Resource Manager - TCollection_AsciiString aResDir (getenv("GEOM_ROOT_DIR")); + TCollection_AsciiString aNull; + aResDir = TCollection_AsciiString(getenv("GEOM_ROOT_DIR")); #ifdef WNT aResDir += "\\share\\salome\\resources\\geom"; #else aResDir += "/share/salome/resources/geom"; #endif + + myResMgr = new Resource_Manager ("ImportExport", aResDir, aNull, Standard_False); + + isResourceFound = true; + if (!myResMgr->Find("Import") && !myResMgr->Find("Export")) { + // instead of complains in Resource_Manager + isResourceFound = false; + INFOS("No valid file \"ImportExport\" found in " << aResDir.ToCString()); + } + } else + isResourceFound = true; + + if (myResMgrUser.IsNull()) { char * dir = getenv("GEOM_ENGINE_RESOURCES_DIR"); - TCollection_AsciiString aUserResDir; + TCollection_AsciiString aNull; if ( dir ) { aUserResDir = dir; @@ -417,14 +498,24 @@ Standard_Boolean GEOMImpl_IInsertOperations::InitResMgr() aUserResDir += "/.salome/resources"; #endif } - myResMgr = new Resource_Manager ("ImportExport", aResDir, aUserResDir, Standard_False); - if (!myResMgr->Find("Import") && !myResMgr->Find("Export")) { + myResMgrUser = new Resource_Manager ("ImportExport", aNull, aUserResDir, Standard_False); + + isResourceFoundUser = true; + + if (!myResMgrUser->Find("Import") && !myResMgrUser->Find("Export")) { // instead of complains in Resource_Manager - INFOS("No valid file \"ImportExport\" found in " << aResDir.ToCString() << - " and in " << aUserResDir.ToCString() ); + isResourceFoundUser = false; } + + } else + isResourceFoundUser = true; + + if(!isResourceFound && !isResourceFoundUser){ + INFOS("No valid file \"ImportExport\" found in " << aResDir.ToCString()); + INFOS("No valid file \"ImportExport\" found in " << aUserResDir.ToCString() ); } - return ( myResMgr->Find("Import") || myResMgr->Find("Export") ); + return ( myResMgr->Find("Import") || myResMgr->Find("Export") || + myResMgrUser->Find("Import") || myResMgrUser->Find("Export")); } diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx index 5a5148b1a..7660da21e 100644 --- a/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx @@ -60,6 +60,7 @@ class GEOMImpl_IInsertOperations : public GEOM_IOperations { private: Handle(Resource_Manager) myResMgr; + Handle(Resource_Manager) myResMgrUser; }; #endif diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 33fc39a94..f04746716 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -25,10 +25,13 @@ #include #include +#include +#include + #include #include -#include "utilities.h" +#include #include #include @@ -39,12 +42,14 @@ #include #include +#include +#include #include #include #include -#include -#include #include +#include +#include #include @@ -63,8 +68,20 @@ #include #include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include @@ -91,6 +108,619 @@ GEOMImpl_IMeasureOperations::~GEOMImpl_IMeasureOperations() MESSAGE("GEOMImpl_IMeasureOperations::~GEOMImpl_IMeasureOperations"); } +//============================================================================= +/*! Get kind and parameters of the given shape. + */ +//============================================================================= +GEOMImpl_IMeasureOperations::ShapeKind GEOMImpl_IMeasureOperations::KindOfShape + (Handle(GEOM_Object) theShape, + Handle(TColStd_HSequenceOfInteger)& theIntegers, + Handle(TColStd_HSequenceOfReal)& theDoubles) +{ + SetErrorCode(KO); + ShapeKind aKind = SK_NO_SHAPE; + + if (theIntegers.IsNull()) theIntegers = new TColStd_HSequenceOfInteger; + else theIntegers->Clear(); + + if (theDoubles.IsNull()) theDoubles = new TColStd_HSequenceOfReal; + else theDoubles->Clear(); + + if (theShape.IsNull()) + return aKind; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return aKind; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) return aKind; + + // Call algorithm + GEOMAlgo_ShapeInfoFiller aSF; + aSF.SetShape(aShape); + aSF.Perform(); + Standard_Integer iErr = aSF.ErrorStatus(); + if (iErr) { + SetErrorCode("Error in GEOMAlgo_ShapeInfoFiller"); + return SK_NO_SHAPE; + } + const GEOMAlgo_ShapeInfo& anInfo = aSF.Info(); + + // Interprete results + TopAbs_ShapeEnum aType = anInfo.Type(); + switch (aType) + { + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + { + // (+) geompy.kind.COMPOUND nb_solids nb_faces nb_edges nb_vertices + // (+) geompy.kind.COMPSOLID nb_solids nb_faces nb_edges nb_vertices + // ??? "nb_faces" - all faces or only 'standalone' faces? + if (aType == TopAbs_COMPOUND) + aKind = SK_COMPOUND; + else + aKind = SK_COMPSOLID; + + //theIntegers->Append(anInfo.NbSubShapes(TopAbs_COMPOUND)); + //theIntegers->Append(anInfo.NbSubShapes(TopAbs_COMPSOLID)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_SOLID)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + break; + + case TopAbs_SHELL: + { + // (+) geompy.kind.SHELL geompy.info.closed nb_faces nb_edges nb_vertices + // (+) geompy.kind.SHELL geompy.info.unclosed nb_faces nb_edges nb_vertices + aKind = SK_SHELL; + + theIntegers->Append((int)anInfo.KindOfClosed()); + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + break; + + case TopAbs_WIRE: + { + // (+) geompy.kind.WIRE geompy.info.closed nb_edges nb_vertices + // (+) geompy.kind.WIRE geompy.info.unclosed nb_edges nb_vertices + aKind = SK_WIRE; + + theIntegers->Append((int)anInfo.KindOfClosed()); + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + break; + + case TopAbs_SOLID: + { + aKind = SK_SOLID; + + GEOMAlgo_KindOfName aKN = anInfo.KindOfName(); + switch (aKN) + { + case GEOMAlgo_KN_SPHERE: + // (+) geompy.kind.SPHERE xc yc zc R + { + aKind = SK_SPHERE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + theDoubles->Append(anInfo.Radius1()); + } + break; + case GEOMAlgo_KN_CYLINDER: + // (+) geompy.kind.CYLINDER xb yb zb dx dy dz R H + { + aKind = SK_CYLINDER; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Height()); + } + break; + case GEOMAlgo_KN_BOX: + // (+) geompy.kind.BOX xc yc zc ax ay az + { + aKind = SK_BOX; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + gp_Dir aX = anAx3.XDirection(); + + // ax ay az + if (aD.IsParallel(gp::DZ(), Precision::Angular()) && + aX.IsParallel(gp::DX(), Precision::Angular())) { + theDoubles->Append(anInfo.Length()); // ax' + theDoubles->Append(anInfo.Width()); // ay' + theDoubles->Append(anInfo.Height()); // az' + } + else if (aD.IsParallel(gp::DZ(), Precision::Angular()) && + aX.IsParallel(gp::DY(), Precision::Angular())) { + theDoubles->Append(anInfo.Width()); // ay' + theDoubles->Append(anInfo.Length()); // ax' + theDoubles->Append(anInfo.Height()); // az' + } + else if (aD.IsParallel(gp::DX(), Precision::Angular()) && + aX.IsParallel(gp::DZ(), Precision::Angular())) { + theDoubles->Append(anInfo.Height()); // az' + theDoubles->Append(anInfo.Width()); // ay' + theDoubles->Append(anInfo.Length()); // ax' + } + else if (aD.IsParallel(gp::DX(), Precision::Angular()) && + aX.IsParallel(gp::DY(), Precision::Angular())) { + theDoubles->Append(anInfo.Height()); // az' + theDoubles->Append(anInfo.Length()); // ax' + theDoubles->Append(anInfo.Width()); // ay' + } + else if (aD.IsParallel(gp::DY(), Precision::Angular()) && + aX.IsParallel(gp::DZ(), Precision::Angular())) { + theDoubles->Append(anInfo.Width()); // ay' + theDoubles->Append(anInfo.Height()); // az' + theDoubles->Append(anInfo.Length()); // ax' + } + else if (aD.IsParallel(gp::DY(), Precision::Angular()) && + aX.IsParallel(gp::DX(), Precision::Angular())) { + theDoubles->Append(anInfo.Length()); // ax' + theDoubles->Append(anInfo.Height()); // az' + theDoubles->Append(anInfo.Width()); // ay' + } + else { + // (+) geompy.kind.ROTATED_BOX xo yo zo zx zy zz xx xy xz ax ay az + aKind = SK_ROTATED_BOX; + + // Direction and XDirection + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(aX.X()); + theDoubles->Append(aX.Y()); + theDoubles->Append(aX.Z()); + + // ax ay az + theDoubles->Append(anInfo.Length()); + theDoubles->Append(anInfo.Width()); + theDoubles->Append(anInfo.Height()); + } + } + break; + case GEOMAlgo_KN_TORUS: + // (+) geompy.kind.TORUS xc yc zc dx dy dz R_1 R_2 + { + aKind = SK_TORUS; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + } + break; + case GEOMAlgo_KN_CONE: + // (+) geompy.kind.CONE xb yb zb dx dy dz R_1 R_2 H + { + aKind = SK_CONE; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + theDoubles->Append(anInfo.Height()); + } + break; + case GEOMAlgo_KN_POLYHEDRON: + // (+) geompy.kind.POLYHEDRON nb_faces nb_edges nb_vertices + { + aKind = SK_POLYHEDRON; + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + break; + default: + // (+) geompy.kind.SOLID nb_faces nb_edges nb_vertices + { + theIntegers->Append(anInfo.NbSubShapes(TopAbs_FACE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + } + } + break; + + case TopAbs_FACE: + { + aKind = SK_FACE; + + GEOMAlgo_KindOfName aKN = anInfo.KindOfName(); + switch (aKN) { + case GEOMAlgo_KN_SPHERE: + // (+) geompy.kind.SPHERE2D xc yc zc R + { + aKind = SK_SPHERE2D; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + theDoubles->Append(anInfo.Radius1()); + } + break; + case GEOMAlgo_KN_CYLINDER: + // (+) geompy.kind.CYLINDER2D xb yb zb dx dy dz R H + { + aKind = SK_CYLINDER2D; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Height()); + } + break; + case GEOMAlgo_KN_TORUS: + // (+) geompy.kind.TORUS2D xc yc zc dx dy dz R_1 R_2 + { + aKind = SK_TORUS2D; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + } + break; + case GEOMAlgo_KN_CONE: + // (+) geompy.kind.CONE2D xc yc zc dx dy dz R_1 R_2 H + { + aKind = SK_CONE2D; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + theDoubles->Append(anInfo.Height()); + } + break; + case GEOMAlgo_KN_DISKCIRCLE: + // (+) geompy.kind.DISK_CIRCLE xc yc zc dx dy dz R + { + aKind = SK_DISK_CIRCLE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + } + break; + case GEOMAlgo_KN_DISKELLIPSE: + // (+) geompy.kind.DISK_ELLIPSE xc yc zc dx dy dz R_1 R_2 + { + aKind = SK_DISK_ELLIPSE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + } + break; + case GEOMAlgo_KN_RECTANGLE: + case GEOMAlgo_KN_TRIANGLE: + case GEOMAlgo_KN_QUADRANGLE: + case GEOMAlgo_KN_POLYGON: + // (+) geompy.kind.POLYGON xo yo zo dx dy dz nb_edges nb_vertices + { + aKind = SK_POLYGON; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + break; + case GEOMAlgo_KN_PLANE: // infinite + // (+) geompy.kind.PLANE xo yo zo dx dy dz + { + aKind = SK_PLANE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + } + break; + default: + if (anInfo.KindOfShape() == GEOMAlgo_KS_PLANE) { + // (+) geompy.kind.PLANAR xo yo zo dx dy dz nb_edges nb_vertices + + aKind = SK_PLANAR; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + else { + // ??? geompy.kind.FACE nb_edges nb_vertices _surface_type_id_ + // (+) geompy.kind.FACE nb_edges nb_vertices + + theIntegers->Append(anInfo.NbSubShapes(TopAbs_EDGE)); + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + } + } + break; + + case TopAbs_EDGE: + { + aKind = SK_EDGE; + + GEOMAlgo_KindOfName aKN = anInfo.KindOfName(); + switch (aKN) { + case GEOMAlgo_KN_CIRCLE: + { + // (+) geompy.kind.CIRCLE xc yc zc dx dy dz R + aKind = SK_CIRCLE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + } + break; + case GEOMAlgo_KN_ARCCIRCLE: + { + // (+) geompy.kind.ARC_CIRCLE xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2 + aKind = SK_ARC_CIRCLE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + + gp_Pnt aP1 = anInfo.Pnt1(); + theDoubles->Append(aP1.X()); + theDoubles->Append(aP1.Y()); + theDoubles->Append(aP1.Z()); + + gp_Pnt aP2 = anInfo.Pnt2(); + theDoubles->Append(aP2.X()); + theDoubles->Append(aP2.Y()); + theDoubles->Append(aP2.Z()); + } + break; + case GEOMAlgo_KN_ELLIPSE: + { + // (+) geompy.kind.ELLIPSE xc yc zc dx dy dz R_1 R_2 + aKind = SK_ELLIPSE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + } + break; + case GEOMAlgo_KN_ARCELLIPSE: + { + // (+) geompy.kind.ARC_ELLIPSE xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2 + aKind = SK_ARC_ELLIPSE; + + gp_Pnt aC = anInfo.Location(); + theDoubles->Append(aC.X()); + theDoubles->Append(aC.Y()); + theDoubles->Append(aC.Z()); + + gp_Ax3 anAx3 = anInfo.Position(); + gp_Dir aD = anAx3.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + + theDoubles->Append(anInfo.Radius1()); + theDoubles->Append(anInfo.Radius2()); + + gp_Pnt aP1 = anInfo.Pnt1(); + theDoubles->Append(aP1.X()); + theDoubles->Append(aP1.Y()); + theDoubles->Append(aP1.Z()); + + gp_Pnt aP2 = anInfo.Pnt2(); + theDoubles->Append(aP2.X()); + theDoubles->Append(aP2.Y()); + theDoubles->Append(aP2.Z()); + } + break; + case GEOMAlgo_KN_LINE: + { + // ??? geompy.kind.LINE x1 y1 z1 x2 y2 z2 + // (+) geompy.kind.LINE x1 y1 z1 dx dy dz + aKind = SK_LINE; + + gp_Pnt aO = anInfo.Location(); + theDoubles->Append(aO.X()); + theDoubles->Append(aO.Y()); + theDoubles->Append(aO.Z()); + + gp_Dir aD = anInfo.Direction(); + theDoubles->Append(aD.X()); + theDoubles->Append(aD.Y()); + theDoubles->Append(aD.Z()); + } + break; + case GEOMAlgo_KN_SEGMENT: + { + // (+) geompy.kind.SEGMENT x1 y1 z1 x2 y2 z2 + aKind = SK_SEGMENT; + + gp_Pnt aP1 = anInfo.Pnt1(); + theDoubles->Append(aP1.X()); + theDoubles->Append(aP1.Y()); + theDoubles->Append(aP1.Z()); + + gp_Pnt aP2 = anInfo.Pnt2(); + theDoubles->Append(aP2.X()); + theDoubles->Append(aP2.Y()); + theDoubles->Append(aP2.Z()); + } + break; + default: + // ??? geompy.kind.EDGE nb_vertices _curve_type_id_ + // (+) geompy.kind.EDGE nb_vertices + theIntegers->Append(anInfo.NbSubShapes(TopAbs_VERTEX)); + } + } + break; + + case TopAbs_VERTEX: + { + // (+) geompy.kind.VERTEX x y z + aKind = SK_VERTEX; + + gp_Pnt aP = anInfo.Location(); + theDoubles->Append(aP.X()); + theDoubles->Append(aP.Y()); + theDoubles->Append(aP.Z()); + } + break; + } + + SetErrorCode(OK); + return aKind; +} //============================================================================= /*! Get LCS, corresponding to the given shape. diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index 4a0cc980b..b889d3872 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include class GEOM_Engine; @@ -38,6 +40,49 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Standard_EXPORT GEOMImpl_IMeasureOperations(GEOM_Engine* theEngine, int theDocID); Standard_EXPORT ~GEOMImpl_IMeasureOperations(); + enum ShapeKind { + SK_NO_SHAPE, + // COMPOSITEs + SK_COMPOUND, + SK_COMPSOLID, + SK_SHELL, + SK_WIRE, + // SOLIDs + SK_SPHERE, // full sphere + SK_CYLINDER, // cylinder + SK_BOX, // box with faces, parallel to global coordinate planes + SK_ROTATED_BOX, // other box + SK_TORUS, // full torus + SK_CONE, // cone + SK_POLYHEDRON, // solid, bounded by polygons + SK_SOLID, // other solid + // FACEs + SK_SPHERE2D, // spherical face (closed) + SK_CYLINDER2D, // cylindrical face with defined height + SK_TORUS2D, // toroidal face (closed) + SK_CONE2D, // conical face with defined height + SK_DISK_CIRCLE, // planar, bounded by circle + SK_DISK_ELLIPSE, // planar, bounded by ellipse + SK_POLYGON, // planar, bounded by segments + SK_PLANE, // infinite planar + SK_PLANAR, // other planar + SK_FACE, // other face + // EDGEs + SK_CIRCLE, // full circle + SK_ARC_CIRCLE, // arc of circle + SK_ELLIPSE, // full ellipse + SK_ARC_ELLIPSE, // arc of ellipse + SK_LINE, // infinite segment + SK_SEGMENT, // segment + SK_EDGE, // other edge + // VERTEX + SK_VERTEX + }; + + Standard_EXPORT ShapeKind KindOfShape (Handle(GEOM_Object) theShape, + Handle(TColStd_HSequenceOfInteger)& theIntegers, + Handle(TColStd_HSequenceOfReal)& theDoubles); + Standard_EXPORT void GetPosition (Handle(GEOM_Object) theShape, Standard_Real& Ox, Standard_Real& Oy, Standard_Real& Oz, Standard_Real& Zx, Standard_Real& Zy, Standard_Real& Zz, diff --git a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx index 81458260b..711348b97 100644 --- a/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx +++ b/src/GEOMImpl/GEOMImpl_IPipeDiffSect.hxx @@ -42,13 +42,15 @@ class GEOMImpl_IPipeDiffSect : public GEOMImpl_IPipe GEOMImpl_IPipeDiffSect(const Handle(GEOM_Function)& theFunction):GEOMImpl_IPipe(theFunction) {} void SetBases (const Handle(TColStd_HSequenceOfTransient)& theBases) - { _func->SetReferenceList(PIPEDS_LIST_BASES,theBases); } + { + _func->SetReferenceList(PIPEDS_LIST_BASES,theBases); + } Handle(TColStd_HSequenceOfTransient) GetBases () { Handle(TColStd_HSequenceOfTransient) aBases = _func->GetReferenceList(PIPEDS_LIST_BASES); return aBases; - } + } void SetLocations (const Handle(TColStd_HSequenceOfTransient)& theLocations) { _func->SetReferenceList(PIPEDS_LIST_LOCATIONS,theLocations); } diff --git a/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx b/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx new file mode 100644 index 000000000..590e83697 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPipeShellSect.hxx @@ -0,0 +1,55 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +//NOTE: This is an intreface to a function for the Pipe creation. + +#ifndef _GEOMImpl_IPIPESHELLSECT_HXX_ +#define _GEOMImpl_IPIPESHELLSECT_HXX_ + +#include "GEOM_Function.hxx" + +#ifndef _GEOMImpl_IPIPEDIFFSECT_HXX_ +#include "GEOMImpl_IPipeDiffSect.hxx" +#endif + +#define PIPEDS_LIST_SUBBASES 6 + + +class GEOMImpl_IPipeShellSect : public GEOMImpl_IPipeDiffSect +{ + public: + + GEOMImpl_IPipeShellSect(const Handle(GEOM_Function)& theFunction): + GEOMImpl_IPipeDiffSect(theFunction) {} + + void SetSubBases (const Handle(TColStd_HSequenceOfTransient)& theSubBases) + { + _func->SetReferenceList(PIPEDS_LIST_SUBBASES,theSubBases); + } + + Handle(TColStd_HSequenceOfTransient) GetSubBases () + { + Handle(TColStd_HSequenceOfTransient) aSubBases = + _func->GetReferenceList(PIPEDS_LIST_SUBBASES); + return aSubBases; + } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 54d7d9aef..28cae6290 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -43,6 +43,10 @@ #include "GEOMAlgo_FinderShapeOn2.hxx" #include "GEOMAlgo_ClsfBox.hxx" //#include "GEOMAlgo_ClsfSurf.hxx" +#include "GEOMAlgo_Gluer1.hxx" +#include "GEOMAlgo_ListIteratorOfListOfCoupleOfShapes.hxx" +#include "GEOMAlgo_CoupleOfShapes.hxx" +#include "GEOMAlgo_ListOfCoupleOfShapes.hxx" #include "utilities.h" #include "OpUtil.hxx" @@ -548,6 +552,170 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeGlueFaces return aGlued; } +//============================================================================= +/*! + * GetGlueFaces + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetGlueFaces + (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + Standard_Integer iErr; + TopoDS_Shape aS; + GEOMAlgo_Gluer1 aGluer; + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes aItCS; + GEOMAlgo_CoupleOfShapes aCS; + GEOMAlgo_ListOfCoupleOfShapes aLCS; + + //aGluer = new GEOMAlgo_Gluer1; + aGluer.SetShape(aShape); + aGluer.SetTolerance(theTolerance); + aGluer.Perform(); + iErr = aGluer.ErrorStatus(); + if (iErr) return NULL; + + TopTools_ListOfShape listShape; + const GEOMAlgo_ListOfCoupleOfShapes& aLCSG = aGluer.GluedFaces(); + // Access to faces + aItCS.Initialize(aLCSG); + for (; aItCS.More(); aItCS.Next()) { + const GEOMAlgo_CoupleOfShapes& aCSG = aItCS.Value(); + listShape.Append(aCSG.Shape1()); + } + + TopTools_ListIteratorOfListOfShape itSub (listShape); + TCollection_AsciiString anAsciiList, anEntry; + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + Handle(GEOM_Object) anObj; + for (int index = 1; itSub.More(); itSub.Next(), ++index) { + TopoDS_Shape aValue = itSub.Value(); + anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aValue)); + anObj = GetEngine()->AddSubShape(theShape, anArray); + if (!anObj.IsNull()) { + aSeq->Append(anObj); + + // for python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + anAsciiList += anEntry; + anAsciiList += ","; + } + } + + //Make a Python command + if(anAsciiList.Length()>0) + anAsciiList.Trunc(anAsciiList.Length() - 1); + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + GEOM::TPythonDump pd (aFunction, /*append=*/true); + pd << "[" << anAsciiList.ToCString(); + pd << "] = geompy.GetGlueFaces" << theShape << ", " << theTolerance << ")"; + + SetErrorCode(OK); + + return aSeq; +} + + +//============================================================================= +/*! + * MakeGlueFacesByList + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeGlueFacesByList + (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance, + list theFaces) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + //Add a new Glued object + Handle(GEOM_Object) aGlued = GetEngine()->AddObject(GetDocID(), GEOM_GLUED); + + //Add a new Glue function + Handle(GEOM_Function) aFunction; + aFunction = aGlued->AddFunction(GEOMImpl_GlueDriver::GetID(), GLUE_FACES_BY_LIST); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_GlueDriver::GetID()) return NULL; + + GEOMImpl_IGlue aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetBase(aRefShape); + aCI.SetTolerance(theTolerance); + Handle(TColStd_HSequenceOfTransient) aFaces = new TColStd_HSequenceOfTransient; + list::iterator it = theFaces.begin(); + for (; it != theFaces.end(); it++) { + Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL argument shape for the shape construction"); + return NULL; + } + aFaces->Append(aRefSh); + } + aCI.SetFaces(aFaces); + + //Compute the sub-shape value + Standard_Boolean isWarning = Standard_False; + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape driver failed to glue faces"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + // to provide warning + if (!aFunction->GetValue().IsNull()) { + isWarning = Standard_True; + } else { + return NULL; + } + } + + //Make a Python command + + GEOM::TPythonDump pd(aFunction); + pd << aGlued << " = geompy.MakeGlueFacesByList(" + << theShape << ", " << theTolerance << ", ["; + // Faces + it = theFaces.begin(); + if (it != theFaces.end()) { + pd << (*it++); + while (it != theFaces.end()) { + pd << ", " << (*it++); + } + } + pd << "])"; + + + // to provide warning + if (!isWarning) SetErrorCode(OK); + return aGlued; +} + + + //============================================================================= /*! * MakeExplode diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index 09468c75c..42d2ed991 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -60,7 +60,14 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeCompound (list theShapes); Standard_EXPORT Handle(GEOM_Object) MakeGlueFaces (Handle(GEOM_Object) theShape, - const Standard_Real theTolerance); + const Standard_Real theTolerance); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetGlueFaces (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance); + + Standard_EXPORT Handle(GEOM_Object) MakeGlueFacesByList (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance, + list theFaces); Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakeExplode (Handle(GEOM_Object) theShape, const Standard_Integer theShapeType, @@ -97,11 +104,12 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { const Handle(GEOM_Object)& theAx1, const GEOMAlgo_State theState); - Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnPlaneWithLocation (const Handle(GEOM_Object)& theShape, - const Standard_Integer theShapeType, - const Handle(GEOM_Object)& theAx1, - const Handle(GEOM_Object)& thePnt, - const GEOMAlgo_State theState); + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) + GetShapesOnPlaneWithLocation (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const Handle(GEOM_Object)& thePnt, + const GEOMAlgo_State theState); Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnCylinder (const Handle(GEOM_Object)& theShape, @@ -121,11 +129,12 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { const Handle(GEOM_Object)& theAx1, const GEOMAlgo_State theState); - Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetShapesOnPlaneWithLocationIDs (const Handle(GEOM_Object)& theShape, - const Standard_Integer theShapeType, - const Handle(GEOM_Object)& theAx1, - const Handle(GEOM_Object)& thePnt, - const GEOMAlgo_State theState); + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) + GetShapesOnPlaneWithLocationIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const Handle(GEOM_Object)& thePnt, + const GEOMAlgo_State theState); Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetShapesOnCylinderIDs (const Handle(GEOM_Object)& theShape, const Standard_Integer theShapeType, @@ -190,18 +199,18 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { const Standard_Real theRadius); Standard_EXPORT Handle(GEOM_Object) GetInPlace (Handle(GEOM_Object) theShapeWhere, - Handle(GEOM_Object) theShapeWhat); + Handle(GEOM_Object) theShapeWhat); Standard_EXPORT static void SortShapes (TopTools_ListOfShape& SL); /*! * \brief Searches a shape equal to theWhat in the context of theWhere * \param theShapeWhere - a context shap - * \param theShapeWhat - a sample shape + * \param theShapeWhat - a sample shape * \retval Handle(GEOM_Object) - found shape */ - Standard_EXPORT Handle(GEOM_Object) GetSame(const Handle(GEOM_Object)& theShapeWhere, - const Handle(GEOM_Object)& theShapeWhat); + Standard_EXPORT Handle(GEOM_Object) GetSame(const Handle(GEOM_Object)& theShapeWhere, + const Handle(GEOM_Object)& theShapeWhat); /*! * \brief Find IDs of subshapes complying with given status about surface @@ -212,10 +221,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes */ Standard_EXPORT Handle(TColStd_HSequenceOfInteger) - GEOMImpl_IShapesOperations::GetShapesOnBoxIDs(const Handle(GEOM_Object)& theBox, - const Handle(GEOM_Object)& theShape, - const Standard_Integer theShapeType, - GEOMAlgo_State theState); + GetShapesOnBoxIDs(const Handle(GEOM_Object)& theBox, + const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + GEOMAlgo_State theState); /*! * \brief Find subshapes complying with given status about surface @@ -226,11 +235,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes */ Standard_EXPORT Handle(TColStd_HSequenceOfTransient) - GEOMImpl_IShapesOperations::GetShapesOnBox(const Handle(GEOM_Object)& theBox, - const Handle(GEOM_Object)& theShape, - const Standard_Integer theShapeType, - GEOMAlgo_State theState); - + GetShapesOnBox(const Handle(GEOM_Object)& theBox, + const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + GEOMAlgo_State theState); private: Handle(GEOM_Object) MakeShape (list theShapes, @@ -295,8 +303,7 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { const Handle(GEOM_Object)& theShape, TopAbs_ShapeEnum theShapeType, GEOMAlgo_State theState, - TCollection_AsciiString & theShapeEntries - ); + TCollection_AsciiString & theShapeEntries); /*! * \brief Find IDs of subshapes complying with given status about quadrangle @@ -326,11 +333,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations { * \param theState - required state * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes */ - Handle(TColStd_HSequenceOfInteger) - GEOMImpl_IShapesOperations::getShapesOnBoxIDs(const Handle(GEOM_Object)& theBox, - const Handle(GEOM_Object)& theShape, - const Standard_Integer theShapeType, - GEOMAlgo_State theState); + Handle(TColStd_HSequenceOfInteger) getShapesOnBoxIDs(const Handle(GEOM_Object)& theBox, + const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + GEOMAlgo_State theState); /*! * \brief Find shape objects and their entries by their ids diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx index d0875f842..b14de152b 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -35,9 +35,13 @@ #include #include #include +#include +#include +#include #include #include #include +#include #include #include @@ -47,6 +51,20 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include + //======================================================================= //function : GetID @@ -67,6 +85,834 @@ GEOMImpl_PipeDriver::GEOMImpl_PipeDriver() { } + +//======================================================================= +//function : FillForOtherEdges +//purpose : auxilary for CreatePipeForShellSections() +//======================================================================= +static bool FillForOtherEdges(const TopoDS_Shape& F1, + const TopoDS_Shape& E1, + const TopoDS_Shape& V1, + TopTools_IndexedDataMapOfShapeShape& FF) +{ + //cout<<"FillForOtherEdges"<GetBases(); + Handle(TColStd_HSequenceOfTransient) aSubBasesObjs = aCIDS->GetSubBases(); + Handle(TColStd_HSequenceOfTransient) aLocObjs = aCIDS->GetLocations(); + Standard_Boolean aWithContact = (aCIDS->GetWithContactMode()); + Standard_Boolean aWithCorrect = (aCIDS->GetWithCorrectionMode()); + + Standard_Integer nbBases = aBasesObjs->Length(), + nbSubBases = (aSubBasesObjs.IsNull() ? 0 :aSubBasesObjs->Length()), + nbLocs = (aLocObjs.IsNull() ? 0 :aLocObjs->Length()); + + if( nbLocs != nbBases) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Number of sections is not equal to number of locations "); + } + if( nbSubBases && nbSubBases != nbBases) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Number of sections is not equal to number of subsections "); + } + + //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); + + TopTools_SequenceOfShape VLocs; + for(i=1; i<=nbBases; i++) { + Handle(Standard_Transient) anItemLoc = aLocObjs->Value(i); + if(anItemLoc.IsNull()) + continue; + Handle(GEOM_Function) aRefLoc = Handle(GEOM_Function)::DownCast(anItemLoc); + TopoDS_Shape aShapeLoc = aRefLoc->GetValue(); + if(aShapeLoc.IsNull() || aShapeLoc.ShapeType() != TopAbs_VERTEX) + continue; + VLocs.Append(aShapeLoc); + } + nbLocs = VLocs.Length(); + if( nbLocs != nbBases) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("One of location shapes is not a vertex"); + } + // split wire path by location points + TColgp_SequenceOfPnt PLocs; + for(i=1; i<=nbLocs; i++) { + TopoDS_Vertex V = TopoDS::Vertex(VLocs.Value(i)); + PLocs.Append(BRep_Tool::Pnt(V)); + } + TopTools_SequenceOfShape Edges; + TopTools_SequenceOfShape Wires; + TopExp_Explorer anExp; + for ( anExp.Init( aWirePath, TopAbs_EDGE ); anExp.More(); anExp.Next() ) { + Edges.Append(anExp.Current()); + } + ShapeAnalysis_Edge sae; + TopoDS_Edge edge = TopoDS::Edge(Edges.First()); + double tol = BRep_Tool::Tolerance(edge); + TopoDS_Vertex VF = sae.FirstVertex(edge); + gp_Pnt PF = BRep_Tool::Pnt(VF); + //cout<<"PF("< tol ) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise + ("First location shapes is not coincided with first vertex of aWirePath"); + } + edge = TopoDS::Edge(Edges.Last()); + tol = BRep_Tool::Tolerance(edge); + TopoDS_Vertex VL = sae.LastVertex(edge); + gp_Pnt PL = BRep_Tool::Pnt(VL); + if( PL.Distance(PLocs.Last()) > tol ) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise + ("Last location shapes is not coincided with last vertex of aWirePath"); + } + int jcurr = 2; + TopTools_SequenceOfShape tmpEdges; + for(i=1; i<=Edges.Length() && jcurr0 && + PLocs.Value(jcurr).Distance(PPC.Point(1)) < tol ) { + double param = PPC.Parameter(1); + gp_Pnt PC1; + C->D0(param,PC1); + // split current edge + Handle(Geom_TrimmedCurve) tc1 = new Geom_TrimmedCurve(C,fp,param); + Handle(Geom_TrimmedCurve) tc2 = new Geom_TrimmedCurve(C,param,lp); + TopoDS_Edge E1,E2; + if(PC1.Distance(P1)Value(i); + if(anItem1.IsNull()) + continue; + Handle(GEOM_Function) aRefBase1 = Handle(GEOM_Function)::DownCast(anItem1); + if(aRefBase1.IsNull()) + continue; + TopoDS_Shape aShBase1 = aRefBase1->GetValue(); + if(aShBase1.IsNull()) + continue; + TopAbs_ShapeEnum aType1 = aShBase1.ShapeType(); + // 2 section + Handle(Standard_Transient) anItem2 = aBasesObjs->Value(i+1); + if(anItem2.IsNull()) + continue; + Handle(GEOM_Function) aRefBase2 = Handle(GEOM_Function)::DownCast(anItem2); + if(aRefBase2.IsNull()) + continue; + TopoDS_Shape aShBase2 = aRefBase2->GetValue(); + if(aShBase2.IsNull()) + continue; + TopAbs_ShapeEnum aType2 = aShBase2.ShapeType(); + + //BRepTools::Write(aShBase1,"/dn02/users_Linux/skl/work/Bugs/14857/base1.brep"); + + bool OkSec = ( aType1==TopAbs_SHELL || aType1==TopAbs_FACE ) && + ( aType2==TopAbs_SHELL || aType2==TopAbs_FACE ); + if( !OkSec ) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("One of section shapes has invalid type"); + } + + bool CreateFewSolids = false; + // compare sections + TopExp_Explorer anExp; + Standard_Integer nbf1 = 0; + for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + nbf1++; + } + Standard_Integer nbf2 = 0; + for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + nbf2++; + } + if(nbf1==nbf2) { + CreateFewSolids = true; + } + + if(!CreateFewSolids) { + // we can create only one solid + TopoDS_Shape aWire1, aWire2; + // prepare aWire1 + if(aType1==TopAbs_SHELL) { + // create wire as boundary contour if shell is no closed + // get free boundary shapes + ShapeAnalysis_FreeBounds anAnalizer( aShBase1 ); + TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); + //TopExp_Explorer anExp; + Standard_Integer NbWires = 0; + for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { + NbWires++; + aWire1 = anExp.Current(); + } + if(NbWires!=1) { + // bad case + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Bad shell is used as section "); + } + } + else { // aType1==TopAbs_FACE + TopExp_Explorer aExpW(aShBase1,TopAbs_WIRE); + aWire1 = aExpW.Current(); + } + // prepare aWire2 + if(aType2==TopAbs_SHELL) { + // create wire as boundary contour if shell is no closed + // get free boundary shapes + ShapeAnalysis_FreeBounds anAnalizer( aShBase2 ); + TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); + //TopExp_Explorer anExp; + Standard_Integer NbWires = 0; + for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { + NbWires++; + aWire2 = anExp.Current(); + } + if(NbWires!=1) { + // bad case + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Bad shell is used as section "); + } + } + else { // aType2==TopAbs_FACE + TopExp_Explorer aExpW(aShBase2,TopAbs_WIRE); + aWire2 = aExpW.Current(); + } + // make pipe using aWire1 and aWire2 + if( !aWire1.IsNull() && !aWire2.IsNull() ) { + //BRepOffsetAPI_MakePipeShell aBuilder(aWirePath); + BRepOffsetAPI_MakePipeShell aBuilder(WPath); + aBuilder.Add(aWire1, TopoDS::Vertex(VLocs(i)), + aWithContact, aWithCorrect); + aBuilder.Add(aWire2, TopoDS::Vertex(VLocs(i+1)), + aWithContact, aWithCorrect); + if(!aBuilder.IsReady()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); + } + aBuilder.Build(); + TopoDS_Shape aShape = aBuilder.Shape(); + TopoDS_Shell aShell; + B.MakeShell(aShell); + for ( anExp.Init( aShape, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + B.Add(aShell,anExp.Current()); + } + for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + B.Add(aShell,anExp.Current()); + } + for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + B.Add(aShell,anExp.Current()); + } + // make sewing for this shell + Handle(BRepBuilderAPI_Sewing) aSewing = new BRepBuilderAPI_Sewing; + aSewing->SetTolerance(Precision::Confusion()); + aSewing->SetFaceMode(Standard_True); + aSewing->SetFloatingEdgesMode(Standard_False); + aSewing->SetNonManifoldMode(Standard_False); + for ( anExp.Init( aShell, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + aSewing->Add(anExp.Current()); + } + aSewing->Perform(); + const TopoDS_Shape aSewShape = aSewing->SewedShape(); + if( aSewShape.ShapeType() == TopAbs_SHELL ) { + aShell = TopoDS::Shell(aSewShape); + if(BRep_Tool::IsClosed(aShell)) { + TopoDS_Solid aSolid; + B.MakeSolid(aSolid); + B.Add(aSolid,aShell); + B.Add(aComp,aSolid); + } + else { + B.Add(aComp,aShell); + } + } + else { + B.Add(aComp,aShell); + } + } + } + else { + // main block - creation few solids (for each pair of faces) + TopTools_MapOfShape aFaces1,aFaces2; + for ( anExp.Init( aShBase1, TopAbs_FACE ); anExp.More(); anExp.Next() ) + aFaces1.Add(anExp.Current()); + for ( anExp.Init( aShBase2, TopAbs_FACE ); anExp.More(); anExp.Next() ) + aFaces2.Add(anExp.Current()); + // creating map of edge faces + TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces1; + TopExp::MapShapesAndAncestors(aShBase1, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces1); + TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces2; + TopExp::MapShapesAndAncestors(aShBase2, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces2); + + // constuct map face->face + TopTools_IndexedDataMapOfShapeShape FF; + TopoDS_Shape FS1,FS2; + if(nbSubBases==0) { + // find edge the most distant from location point + // (this edge is not shared by two faces) + double maxdist = 0.; + TopoDS_Shape E1; + TopoDS_Vertex V11,V21; + for(j=1; j<=aMapEdgeFaces1.Extent(); j++) { + TopoDS_Shape tmp = aMapEdgeFaces1.FindKey(j); + const TopTools_ListOfShape& aList = aMapEdgeFaces1.FindFromKey(tmp); + if(aList.Extent()>1) + continue; + TopExp_Explorer expv; + expv.Init( tmp, TopAbs_VERTEX ); + TopoDS_Vertex V1 = TopoDS::Vertex(expv.Current()); + expv.Next(); + TopoDS_Vertex V2 = TopoDS::Vertex(expv.Current()); + gp_Pnt P1 = BRep_Tool::Pnt(V1); + gp_Pnt P2 = BRep_Tool::Pnt(V2); + double dist = PLocs.Value(i).Distance(P1) + PLocs.Value(i).Distance(P2); + if(dist>maxdist) { + E1 = tmp; + V11 = V1; + V21 = V2; + TopTools_ListIteratorOfListOfShape anIter(aList); + FS1 = anIter.Value(); + maxdist = dist; + } + } + // main direction for comparing + gp_Vec VM(PLocs.Value(i),PLocs.Value(i+1)); + // find corresponding edge from next section + double minang = PI; + gp_Pnt P11 = BRep_Tool::Pnt(V11); + gp_Pnt P21 = BRep_Tool::Pnt(V21); + TopoDS_Shape E2; + TopoDS_Vertex V12,V22; + for(j=1; j<=aMapEdgeFaces2.Extent(); j++) { + TopoDS_Shape tmp = aMapEdgeFaces2.FindKey(j); + const TopTools_ListOfShape& aList = aMapEdgeFaces2.FindFromKey(tmp); + if(aList.Extent()>1) + continue; + TopExp_Explorer expv; + expv.Init( tmp, TopAbs_VERTEX ); + TopoDS_Vertex V1tmp = TopoDS::Vertex(expv.Current()); + expv.Next(); + TopoDS_Vertex V2tmp = TopoDS::Vertex(expv.Current()); + gp_Pnt P1tmp = BRep_Tool::Pnt(V1tmp); + gp_Pnt P2tmp = BRep_Tool::Pnt(V2tmp); + double d1 = P1tmp.Distance(P11) + P2tmp.Distance(P21); + double d2 = P1tmp.Distance(P21) + P2tmp.Distance(P11); + TopoDS_Vertex V1,V2; + gp_Pnt P1,P2; + if(d1>d2) { + V1 = V2tmp; P1 = P2tmp; + V2 = V1tmp; P2 = P1tmp; + } + else { + V1 = V1tmp; P1 = P1tmp; + V2 = V2tmp; P2 = P2tmp; + } + gp_Vec Vec1(P11,P1); + gp_Vec Vec2(P21,P2); + double ang = fabs(Vec1.Angle(VM)) + fabs(Vec2.Angle(VM)); + if(angValue(i); + if(anItem.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem); + if(aRefBase.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + TopoDS_Shape aSh = aRefBase->GetValue(); + if(aSh.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + if(aSh.ShapeType()!=TopAbs_FACE) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + FS1 = aSh; + } + { // 2 section + Handle(Standard_Transient) anItem = aSubBasesObjs->Value(i+1); + if(anItem.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + Handle(GEOM_Function) aRefBase = Handle(GEOM_Function)::DownCast(anItem); + if(aRefBase.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + TopoDS_Shape aSh = aRefBase->GetValue(); + if(aSh.IsNull()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + if(aSh.ShapeType()!=TopAbs_FACE) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + FS2 = aSh; + } + + if( !aFaces1.Contains(FS1) || !aFaces2.Contains(FS2) ) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid subbase shape"); + } + + FF.Add(FS1,FS2); + + // add pairs of edges to FF + bool stat = FillCorrespondingEdges(FS1, FS2, TopoDS::Vertex(VLocs(i)), + TopoDS::Vertex(VLocs(i+1)), WPath, FF); + if( !stat ) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Can not create correct pipe"); + } + } + + FindNextPairOfFaces(FS1, aMapEdgeFaces1, aMapEdgeFaces2, FF, aCI); + + + // make pipe for each pair of faces + //BRepTools::Write(WPath,"/dn02/users_Linux/skl/work/Bugs/14857/wpath.brep"); + for(j=1; j<=FF.Extent(); j++) { + TopoDS_Shape F1 = FF.FindKey(j); + if( F1.ShapeType() != TopAbs_FACE ) + continue; + TopoDS_Shape F2 = FF.FindFromIndex(j); + TopExp_Explorer aExpW1(F1,TopAbs_WIRE); + TopoDS_Wire aWire1 = TopoDS::Wire(aExpW1.Current()); + TopExp_Explorer aExpW2(F2,TopAbs_WIRE); + TopoDS_Wire aWire2 = TopoDS::Wire(aExpW2.Current()); + // make pipe using aWire1 and aWire2 + if( !aWire1.IsNull() && !aWire2.IsNull() ) { + BRepOffsetAPI_MakePipeShell aBuilder(WPath); + aBuilder.Add(aWire1, TopoDS::Vertex(VLocs(i)), + aWithContact, aWithCorrect); + aBuilder.Add(aWire2, TopoDS::Vertex(VLocs(i+1)), + aWithContact, aWithCorrect); + if(!aBuilder.IsReady()) { + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Invalid input data for building PIPE: bases are invalid"); + } + aBuilder.Build(); + TopoDS_Shape aShape = aBuilder.Shape(); + TopoDS_Shell aShell; + B.MakeShell(aShell); + //int nbf=0; + for ( anExp.Init( aShape, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + //nbf++; + //cout<<"nbf="<SetTolerance(Precision::Confusion()); + aSewing->SetFaceMode(Standard_True); + aSewing->SetFloatingEdgesMode(Standard_False); + aSewing->SetNonManifoldMode(Standard_False); + for ( anExp.Init( aShell, TopAbs_FACE ); anExp.More(); anExp.Next() ) { + aSewing->Add(anExp.Current()); + } + aSewing->Perform(); + const TopoDS_Shape aSewShape = aSewing->SewedShape(); + if( aSewShape.ShapeType() == TopAbs_SHELL ) { + aShell = TopoDS::Shell(aSewShape); + if(BRep_Tool::IsClosed(aShell)) { + TopoDS_Solid aSolid; + B.MakeSolid(aSolid); + B.Add(aSolid,aShell); + B.Add(aComp,aSolid); + } + else { + B.Add(aComp,aShell); + } + } + else { + B.Add(aComp,aShell); + } + } + } + + } + } + + return aComp; +} + + //======================================================================= //function : Execute //purpose : @@ -81,6 +927,8 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const aCI = new GEOMImpl_IPipe(aFunction); else if(aType == PIPE_DIFFERENT_SECTIONS) aCI = new GEOMImpl_IPipeDiffSect(aFunction); + else if(aType == PIPE_SHELL_SECTIONS) + aCI = new GEOMImpl_IPipeShellSect(aFunction); else return 0; @@ -88,8 +936,7 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShapePath = aRefPath->GetValue(); - if (aShapePath.IsNull()) - { + if (aShapePath.IsNull()) { cout<<"Driver : path is null"<GetBase(); @@ -167,8 +1012,31 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const //if for section was specified face with a few wires then a few // pipes were build and make solid - if(aTypeBase == TopAbs_FACE) + Standard_Boolean NeedCreateSolid = Standard_False; + if(aTypeBase == TopAbs_SHELL) { + // create wire as boundary contour if shell is no closed + // get free boundary shapes + ShapeAnalysis_FreeBounds anAnalizer( aShapeBase ); + TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); + TopExp_Explorer anExp; + TopoDS_Shape aWire; + Standard_Integer NbWires = 0; + for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) { + NbWires++; + aWire = anExp.Current(); + } + if(NbWires!=1) { + // bad case + if(aCI) delete aCI; + Standard_ConstructionError::Raise("Bad shell is used as section "); + } + NeedCreateSolid = Standard_True; + aSeqFaces.Append(aShapeBase); + aSeqBases.Append(aWire); + } + else if(aTypeBase == TopAbs_FACE) { + NeedCreateSolid = Standard_True; //for case one path should be used other type function aSeqFaces.Append(aShapeBase); TopExp_Explorer aExpW(aShapeBase,TopAbs_WIRE); @@ -178,8 +1046,9 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const aSeqBases.Append(aWireProf); } } - else if(aTypeBase == TopAbs_WIRE || aTypeBase == TopAbs_VERTEX) + else if(aTypeBase == TopAbs_WIRE || aTypeBase == TopAbs_VERTEX) { aSeqBases.Append(aShapeBase); + } else if(aTypeBase == TopAbs_EDGE) { TopoDS_Edge anEdge = TopoDS::Edge(aShapeBase); @@ -252,6 +1121,12 @@ Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const aShape = aComp; } } + + //building pipe with shell sections + else if (aType == PIPE_SHELL_SECTIONS) { + aShape = CreatePipeForShellSections(aWirePath,aCI); + } + if (aShape.IsNull()) return 0; BRepCheck_Analyzer ana (aShape, Standard_False); @@ -309,3 +1184,4 @@ const Handle(GEOMImpl_PipeDriver) Handle(GEOMImpl_PipeDriver)::DownCast(const Ha return _anOtherObject ; } + diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx index 888b2cd5d..b57defc89 100644 --- a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx @@ -48,6 +48,7 @@ #include #endif + class Standard_Transient; class Handle_Standard_Type; class Handle(TFunction_Driver); @@ -136,22 +137,25 @@ public: if (anAddress) Standard::Free((Standard_Address&)anAddress); } - // Methods PUBLIC - // -Standard_EXPORT GEOMImpl_PipeDriver(); -Standard_EXPORT virtual Standard_Integer Execute(TFunction_Logbook& log) const; -Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {} -Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { return Standard_True; } -Standard_EXPORT static const Standard_GUID& GetID(); -Standard_EXPORT ~GEOMImpl_PipeDriver() {}; + // Methods PUBLIC + // + Standard_EXPORT GEOMImpl_PipeDriver(); + Standard_EXPORT virtual Standard_Integer Execute(TFunction_Logbook& log) const; + Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {} + Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const + { return Standard_True; } + Standard_EXPORT static const Standard_GUID& GetID(); + Standard_EXPORT ~GEOMImpl_PipeDriver() {}; - // Type management - // -Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PipeDriver_Type_(); -Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PipeDriver) ; } -Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PipeDriver) == AType || TFunction_Driver::IsKind(AType)); } - + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PipeDriver_Type_(); + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const + { return STANDARD_TYPE(GEOMImpl_PipeDriver) ; } + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const + { return (STANDARD_TYPE(GEOMImpl_PipeDriver) == AType || + TFunction_Driver::IsKind(AType)); } }; diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index c1c516fb7..adf629917 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -162,6 +162,7 @@ #define PIPE_BASE_PATH 1 #define PIPE_DIFFERENT_SECTIONS 2 +#define PIPE_SHELL_SECTIONS 3 #define THRUSECTIONS_RULED 1 #define THRUSECTIONS_SMOOTHED 2 @@ -186,6 +187,7 @@ #define ELLIPSE_PNT_VEC_RR 1 #define CIRC_ARC_THREE_PNT 1 +#define CIRC_ARC_CENTER 2 #define FILLET_SHAPE_ALL 1 #define FILLET_SHAPE_EDGES 2 @@ -221,6 +223,7 @@ #define BASIC_FILLING 1 #define GLUE_FACES 1 +#define GLUE_FACES_BY_LIST 2 #define SKETCHER_NINE_DOUBLS 1 #define SKETCHER_PLANE 2 diff --git a/src/GEOMImpl/Makefile.am b/src/GEOMImpl/Makefile.am index fd4f9639d..6ffbd0ce8 100644 --- a/src/GEOMImpl/Makefile.am +++ b/src/GEOMImpl/Makefile.am @@ -36,15 +36,15 @@ salomeinclude_HEADERS = \ GEOMImpl_Gen.hxx \ GEOMImpl_IBasicOperations.hxx \ GEOMImpl_ITransformOperations.hxx \ - GEOMImpl_IHealingOperations.hxx \ + GEOMImpl_IHealingOperations.hxx \ GEOMImpl_I3DPrimOperations.hxx \ GEOMImpl_IShapesOperations.hxx \ GEOMImpl_IBlocksOperations.hxx \ GEOMImpl_IBooleanOperations.hxx \ GEOMImpl_ICurvesOperations.hxx \ GEOMImpl_ILocalOperations.hxx \ - GEOMImpl_IInsertOperations.hxx \ - GEOMImpl_IMeasureOperations.hxx \ + GEOMImpl_IInsertOperations.hxx \ + GEOMImpl_IMeasureOperations.hxx \ GEOMImpl_IGroupOperations.hxx \ GEOMImpl_CopyDriver.hxx \ GEOMImpl_Types.hxx \ diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 1e9479c1c..4a3e34a71 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -154,6 +155,46 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) Export(); break; } + case 2171: // POPUP VIEWER - SELECT ONLY - VERTEX + { + OnSelectOnly( GEOM_POINT ); + break; + } + case 2172: // POPUP VIEWER - SELECT ONLY - EDGE + { + OnSelectOnly( GEOM_EDGE ); + break; + } + case 2173: // POPUP VIEWER - SELECT ONLY - WIRE + { + OnSelectOnly( GEOM_WIRE ); + break; + } + case 2174: // POPUP VIEWER - SELECT ONLY - FACE + { + OnSelectOnly( GEOM_FACE ); + break; + } + case 2175: // POPUP VIEWER - SELECT ONLY - SHELL + { + OnSelectOnly( GEOM_SHELL ); + break; + } + case 2176: // POPUP VIEWER - SELECT ONLY - SOLID + { + OnSelectOnly( GEOM_SOLID ); + break; + } + case 2177: // POPUP VIEWER - SELECT ONLY - COMPOUND + { + OnSelectOnly( GEOM_COMPOUND ); + break; + } + case 2178: // POPUP VIEWER - SELECT ONLY - SELECT ALL + { + OnSelectOnly( GEOM_ALLOBJECTS ); + break; + } case 411: // SETTINGS - ADD IN STUDY { // SAN -- TO BE REMOVED !!! @@ -459,7 +500,6 @@ bool GEOMToolsGUI::Import() anObj = aInsOp->Import(fileN, fileT); if ( !anObj->_is_nil() && aInsOp->IsDone() ) { - anObj->SetName(GEOMBase::GetDefaultName(QObject::tr("GEOM_IMPORT")).latin1()); QString aPublishObjName = GEOMBase::GetDefaultName(SUIT_Tools::file(fileName, /*withExten=*/true)); @@ -703,6 +743,21 @@ bool GEOMToolsGUI::CheckSubObjectInUse(_PTR(SObject) checkobj, return false; } +//================================================================================= +// function : deactivate() +// purpose : Called when GEOM component is deactivated +//================================================================================= +void GEOMToolsGUI::deactivate() +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + GEOM_Displayer aDisp (appStudy); + aDisp.GlobalSelection(); + getGeometryGUI()->setLocalSelectionMode(GEOM_ALLOBJECTS); + } +} + //===================================================================================== // EXPORTED METHODS //===================================================================================== diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index c2c9344d5..07dec456e 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -54,6 +54,7 @@ public : ~GEOMToolsGUI(); bool OnGUIEvent( int theCommandID, SUIT_Desktop* parent ); + virtual void deactivate(); private: // Import and export topology methods @@ -74,7 +75,8 @@ private: void OnTransparency(); void OnNbIsos(); void OnOpen(); - + void OnSelectOnly(int mode); + // returns name of Module (Component) of given objects (usually selected objects) // if objects belong to different Components, a NULL string is returned. QString getParentComponent( _PTR( Study ), const SALOME_ListIO& ); diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 94c92abfc..2becab38d 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -202,6 +202,10 @@ void GEOMToolsGUI::OnRename() if ( !newName.isEmpty() ) { aName->SetValue( newName.latin1() ); // rename the SObject IObject->setName( newName.latin1() );// rename the InteractiveObject + // Rename the corresponding GEOM_Object + GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj)); + if (!CORBA::is_nil( anObj )) + anObj->SetName( newName.latin1() ); (dynamic_cast(app->activeModule()))->updateObjBrowser( false ); } } // if ( name attribute ) @@ -433,3 +437,14 @@ void GEOMToolsGUI::OnOpen() } */ } + +void GEOMToolsGUI::OnSelectOnly(int mode) +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + GEOM_Displayer aDisp (appStudy); + aDisp.GlobalSelection(mode); + getGeometryGUI()->setLocalSelectionMode(mode); + } +} diff --git a/src/GEOMToolsGUI/Makefile.am b/src/GEOMToolsGUI/Makefile.am index 55acdfefd..45092979a 100644 --- a/src/GEOMToolsGUI/Makefile.am +++ b/src/GEOMToolsGUI/Makefile.am @@ -70,6 +70,7 @@ libGEOMToolsGUI_la_CPPFLAGS = \ -I$(srcdir)/../GEOMBase \ -I$(srcdir)/../GEOMGUI \ -I$(srcdir)/../GEOMClient \ + -I$(srcdir)/../GEOMImpl \ -I$(top_builddir)/idl \ -I$(top_builddir)/salome_adm/unix diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 2ae6d0a59..0ba246973 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -272,6 +272,9 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeName"); SALOMEDS::AttributeName_var aNameAttrib = SALOMEDS::AttributeName::_narrow(anAttr); aNameAttrib->SetValue(aShapeName.ToCString()); + + //Set a name of the GEOM object + aShape->SetName(theName); return aResultSO._retn(); } @@ -287,6 +290,17 @@ SALOMEDS::TMPFile* GEOM_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent, SALOMEDS::TMPFile_var aStreamFile; // Get a temporary directory to store a file std::string aTmpDir = (isMultiFile)?theURL:SALOMEDS_Tool::GetTmpDir(); + + // OCCT BUG: cannot save a document (in current folder) + // if directory name is empty + if (aTmpDir.size() == 0) { +#ifdef WNT + aTmpDir = ".\\"; +#else + aTmpDir = "./"; +#endif + } + // Create a list to store names of created files SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames; aSeq->length(1); @@ -338,8 +352,20 @@ CORBA::Boolean GEOM_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, // Get a temporary directory for a file std::string aTmpDir = isMultiFile?theURL:SALOMEDS_Tool::GetTmpDir(); + + // OCCT BUG: cannot load a document (from current folder) + // if directory name is empty + if (aTmpDir.size() == 0) { +#ifdef WNT + aTmpDir = ".\\"; +#else + aTmpDir = "./"; +#endif + } + // Conver the byte stream theStream to a file and place it in tmp directory - SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.c_str(), isMultiFile); + SALOMEDS::ListOfFileNames_var aSeq = + SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.c_str(), isMultiFile); // Prepare a file name to open TCollection_AsciiString aNameWithExt(""); diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc index 561d24512..83a98e3a4 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -582,3 +582,80 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithDifferentSections(co return GetObject(anObject); } + + +//============================================================================= +/*! + * MakePipeWithShellSections + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeWithShellSections + (const GEOM::ListOfGO& theBases, + const GEOM::ListOfGO& theSubBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + Handle(TColStd_HSequenceOfTransient) aSeqBases = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aSeqSubBases = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aSeqLocations = new TColStd_HSequenceOfTransient; + int ind=0, aNbBases=0, aNbSubBases=0, aNbLocs=0; + + //Get the shapes + aNbBases = theBases.length(); + aNbSubBases = theSubBases.length(); + aNbLocs = theLocations.length(); + + if( aNbLocs && aNbBases != aNbLocs) + return aGEOMObject._retn(); + + Handle(GEOM_Object) aPath = GetOperations()->GetEngine()->GetObject + (thePath->GetStudyID(), thePath->GetEntry()); + if(aPath.IsNull()) + return aGEOMObject._retn(); + + for (ind = 0; ind < aNbBases; ind++) { + if (theBases[ind] == NULL) continue; + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()-> + GetObject(theBases[ind]->GetStudyID(), theBases[ind]->GetEntry()); + if(aBase.IsNull()) + continue; + if(aNbLocs) { + Handle(GEOM_Object) aLoc = GetOperations()->GetEngine()->GetObject + (theLocations[ind]->GetStudyID(), theLocations[ind]->GetEntry()); + if(aLoc.IsNull()) + continue; + aSeqLocations->Append(aLoc); + } + aSeqBases->Append(aBase); + + if(aNbSubBases>=aNbBases) { + Handle(GEOM_Object) aSubBase = GetOperations()->GetEngine()-> + GetObject(theSubBases[ind]->GetStudyID(), theSubBases[ind]->GetEntry()); + if(aSubBase.IsNull()) { + aSeqSubBases->Clear(); + aNbSubBases = 0; + continue; + } + aSeqSubBases->Append(aSubBase); + } + + } + if(!aSeqBases->Length()) + return aGEOMObject._retn(); + + // Make pipe + Handle(GEOM_Object) anObject = + GetOperations()->MakePipeWithShellSections(aSeqBases, aSeqSubBases, + aSeqLocations, aPath, + theWithContact, theWithCorrections); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh index 8ce0c55a4..fe86685a9 100644 --- a/src/GEOM_I/GEOM_I3DPrimOperations_i.hh +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -106,6 +106,13 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i : CORBA::Boolean theWithContact, CORBA::Boolean theWithCorrections); + GEOM::GEOM_Object_ptr MakePipeWithShellSections(const GEOM::ListOfGO& theBases, + const GEOM::ListOfGO& theSubBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections); + ::GEOMImpl_I3DPrimOperations* GetOperations() { return (::GEOMImpl_I3DPrimOperations*)GetImpl(); } }; diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc index d0c097ed4..ea89b3709 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.cc +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -188,6 +188,43 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArc return GetObject(anObject); } + +//============================================================================= +/*! + * MakeArcCenter + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArcCenter + (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + CORBA::Boolean theSense) + +{ + GEOM::GEOM_Object_var aGEOMObject; + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == NULL || thePnt3 == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt1 = GetOperations()->GetEngine()->GetObject + (thePnt1->GetStudyID(), thePnt1->GetEntry()); + Handle(GEOM_Object) aPnt2 = GetOperations()->GetEngine()->GetObject + (thePnt2->GetStudyID(), thePnt2->GetEntry()); + Handle(GEOM_Object) aPnt3 = GetOperations()->GetEngine()->GetObject + (thePnt3->GetStudyID(), thePnt3->GetEntry()); + + if (aPnt1.IsNull() || aPnt2.IsNull() || aPnt3.IsNull()) return aGEOMObject._retn(); + + // Make ArcCenter + Handle(GEOM_Object) anObject = + GetOperations()->MakeArcCenter(aPnt1, aPnt2, aPnt3,theSense); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} //============================================================================= /*! * MakePolyline diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh index e5c0b0fc0..f316dab52 100644 --- a/src/GEOM_I/GEOM_ICurvesOperations_i.hh +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -55,7 +55,12 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i : GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3); - + + GEOM::GEOM_Object_ptr MakeArcCenter (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + bool theSense); + GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints); GEOM::GEOM_Object_ptr MakeSplineBezier (const GEOM::ListOfGO& thePoints); diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index 9b763dfaf..6167bf0e1 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -50,6 +50,52 @@ GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i() MESSAGE("GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i"); } +//============================================================================= +/*! + * KindOfShape + */ +//============================================================================= +GEOM::GEOM_IKindOfShape::shape_kind GEOM_IMeasureOperations_i::KindOfShape + (GEOM::GEOM_Object_ptr theShape, + GEOM::ListOfLong_out theIntegers, + GEOM::ListOfDouble_out theDoubles) +{ + GEOMImpl_IMeasureOperations::ShapeKind aKind = GEOMImpl_IMeasureOperations::SK_NO_SHAPE; + + // allocate the CORBA arrays + GEOM::ListOfLong_var anIntegersArray = new GEOM::ListOfLong(); + GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble(); + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (!aShape.IsNull()) { + Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger; + Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal; + + // Detect kind of shape and parameters + aKind = GetOperations()->KindOfShape(aShape, anIntegers, aDoubles); + + int nbInts = anIntegers->Length(); + int nbDbls = aDoubles->Length(); + + anIntegersArray->length(nbInts); + aDoublesArray->length(nbDbls); + + for (int ii = 0; ii < nbInts; ii++) { + anIntegersArray[ii] = anIntegers->Value(ii + 1); + } + for (int id = 0; id < nbDbls; id++) { + aDoublesArray[id] = aDoubles->Value(id + 1); + } + } + + // initialize out-parameters with local arrays + theIntegers = anIntegersArray._retn(); + theDoubles = aDoublesArray._retn(); + return (GEOM::GEOM_IKindOfShape::shape_kind)aKind; +} //============================================================================= /*! diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index 39c495774..474563256 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -40,6 +40,10 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i : ::GEOMImpl_IMeasureOperations* theImpl); ~GEOM_IMeasureOperations_i(); + GEOM::GEOM_IKindOfShape::shape_kind KindOfShape (GEOM::GEOM_Object_ptr theShape, + GEOM::ListOfLong_out theIntegers, + GEOM::ListOfDouble_out theDoubles); + void GetPosition (GEOM::GEOM_Object_ptr theShape, CORBA::Double& Ox, CORBA::Double& Oy, CORBA::Double& Oz, CORBA::Double& Zx, CORBA::Double& Zy, CORBA::Double& Zz, diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index b9893fd9c..b3edf98db 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -354,6 +354,92 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFaces return GetObject(anObject); } + +//============================================================================= +/*! + * GetGlueFaces + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetGlueFaces + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theTolerance) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShape.IsNull()) return aSeq._retn(); + + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetGlueFaces(aShape, theTolerance); + + //if (!GetOperations()->IsDone() || aHSeq.IsNull()) + // to allow warning + if(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(); +} + + +//============================================================================= +/*! + * MakeGlueFacesByList + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFacesByList + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return aGEOMObject._retn(); + + int ind, aLen; + list aFaces; + //Get the shapes + aLen = theFaces.length(); + for (ind = 0; ind < aLen; ind++) { + if (theFaces[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theFaces[ind]->GetStudyID(), theFaces[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aFaces.push_back(aSh); + } + + //Perform the gluing + Handle(GEOM_Object) anObject = + GetOperations()->MakeGlueFacesByList(aShape, theTolerance, aFaces); + //if (!GetOperations()->IsDone() || anObject.IsNull()) + // to allow warning + if (anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + //============================================================================= /*! * MakeExplode diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index b63eee1ca..84575a15d 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -63,6 +63,13 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theTolerance); + GEOM::ListOfGO* GetGlueFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance); + + GEOM::GEOM_Object_ptr MakeGlueFacesByList (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces); + GEOM::ListOfGO* MakeExplode (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, CORBA::Boolean isSorted); diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc index dce4e328b..6edeb5dac 100644 --- a/src/GEOM_I/GEOM_Object_i.cc +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -254,9 +254,9 @@ SALOMEDS::TMPFile* GEOM_Object_i::GetShapeStream() //function : getShape //purpose : return the TopoDS_Shape when client and servant are colocated, be careful //======================================================================= -CORBA::Long GEOM_Object_i::getShape() { +CORBA::LongLong GEOM_Object_i::getShape() { _geom = _impl->GetValue(); - return CORBA::Long(size_t(&_geom)); + return ((CORBA::LongLong)(&_geom)); } //============================================================================= diff --git a/src/GEOM_I/GEOM_Object_i.hh b/src/GEOM_I/GEOM_Object_i.hh index 660f0399c..fa670e45a 100644 --- a/src/GEOM_I/GEOM_Object_i.hh +++ b/src/GEOM_I/GEOM_Object_i.hh @@ -63,7 +63,7 @@ class GEOM_I_EXPORT GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public virtual SALOMEDS::TMPFile* GetShapeStream(); - virtual CORBA::Long getShape(); + virtual CORBA::LongLong getShape(); virtual bool IsMainShape() { return _impl->IsMainShape(); } diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 6d289ff68..299d9f550 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -978,11 +978,12 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeThruSections(const GEOM::ListOfGO& theS //============================================================================= // MakePipe: //============================================================================= -GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections(const GEOM::ListOfGO& theBases, - const GEOM::ListOfGO& theLocations, - GEOM::GEOM_Object_ptr thePath, - CORBA::Boolean theWithContact, - CORBA::Boolean theWithCorrections) +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections + (const GEOM::ListOfGO& theBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections) { beginService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); MESSAGE("GEOM_Superv_i::MakePipeWithDifferentSections"); @@ -991,6 +992,31 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithDifferentSections(const GEOM::L endService( " GEOM_Superv_i::MakePipeWithDifferentSections" ); return anObj; } + + +//============================================================================= +// MakePipe: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipeWithShellSections + (const GEOM::ListOfGO& theBases, + const GEOM::ListOfGO& theSubBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections) +{ + beginService( " GEOM_Superv_i::MakePipeWithShellSections" ); + MESSAGE("GEOM_Superv_i::MakePipeWithShellSections"); + get3DPrimOp(); + GEOM::GEOM_Object_ptr anObj = + my3DPrimOp->MakePipeWithShellSections(theBases, theSubBases, + theLocations, thePath, + theWithContact, theWithCorrections); + endService( " GEOM_Superv_i::MakePipeWithShellSections" ); + return anObj; +} + + //============================================================================= // MakeFuse: //============================================================================= @@ -1652,7 +1678,7 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCompound (GEOM::GEOM_List_ptr theShapes // MakeGlueFaces: //============================================================================= GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance) + CORBA::Double theTolerance) { beginService( " GEOM_Superv_i::MakeGlueFaces" ); MESSAGE("GEOM_Superv_i::MakeGlueFaces"); @@ -1662,6 +1688,37 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFaces (GEOM::GEOM_Object_ptr theSha return anObj; } +//============================================================================= +// GetGlueFaces: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::GetGlueFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance) +{ + beginService( " GEOM_Superv_i::GetGlueFaces" ); + MESSAGE("GEOM_Superv_i::GetGlueFaces"); + getShapesOp(); + GEOM::ListOfGO* aList = myShapesOp->GetGlueFaces(theShape, theTolerance); + GEOM_List_i* aListPtr = new GEOM_List_i(*(aList)); + MESSAGE(" List of "<GetList().length()<<" element(s)"); + endService( " GEOM_Superv_i::GetGlueFaces" ); + return aListPtr->_this(); +} + +//============================================================================= +// MakeGlueFacesByList: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFacesByList (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces) +{ + beginService( " GEOM_Superv_i::MakeGlueFacesByList" ); + MESSAGE("GEOM_Superv_i::MakeGlueFacesByList"); + getShapesOp(); + GEOM::GEOM_Object_ptr anObj = myShapesOp->MakeGlueFacesByList(theShape, theTolerance, theFaces); + endService( " GEOM_Superv_i::MakeGlueFacesByList" ); + return anObj; +} + //============================================================================= // MakeExplode: //============================================================================= @@ -2134,6 +2191,22 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArc (GEOM::GEOM_Object_ptr thePnt1, return anObj; } +//============================================================================= +// MakeArcCenter: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArcCenter (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + CORBA::Boolean theSense) +{ + beginService( " GEOM_Superv_i::MakeArcCenter" ); + MESSAGE("GEOM_Superv_i::MakeArcCenter"); + getCurvesOp(); + GEOM::GEOM_Object_ptr anObj = myCurvesOp->MakeArcCenter(theCenter, thePnt1, thePnt2,theSense); + endService( " GEOM_Superv_i::MakeArcCenter" ); + return anObj; +} + //============================================================================= // MakePolyline: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 4dce89ebb..298a01ede 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -237,6 +237,13 @@ public: CORBA::Boolean theWithContact, CORBA::Boolean theWithCorrections); + GEOM::GEOM_Object_ptr MakePipeWithShellSections(const GEOM::ListOfGO& theBases, + const GEOM::ListOfGO& theSubBases, + const GEOM::ListOfGO& theLocations, + GEOM::GEOM_Object_ptr thePath, + CORBA::Boolean theWithContact, + CORBA::Boolean theWithCorrections); + //-----------------------------------------------------------// // BooleanOperations // //-----------------------------------------------------------// @@ -371,7 +378,12 @@ public: GEOM::GEOM_Object_ptr MakeSolidShells (GEOM::GEOM_List_ptr theShells); GEOM::GEOM_Object_ptr MakeCompound (GEOM::GEOM_List_ptr theShapes); GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, - CORBA::Double theTolerance); + CORBA::Double theTolerance); + GEOM::GEOM_List_ptr GetGlueFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance); + GEOM::GEOM_Object_ptr MakeGlueFacesByList (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance, + const GEOM::ListOfGO& theFaces); GEOM::GEOM_List_ptr MakeExplode (GEOM::GEOM_Object_ptr theShape, CORBA::Long theShapeType, CORBA::Boolean isSorted); @@ -468,6 +480,10 @@ public: GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr MakeArcCenter (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + CORBA::Boolean theSense); GEOM::GEOM_Object_ptr MakePolyline (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSplineBezier (GEOM::GEOM_List_ptr thePoints); GEOM::GEOM_Object_ptr MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints); diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index ec0670186..a044befec 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -84,6 +84,7 @@ def TestAll (geompy, math): Plane1 = geompy.MakePlaneThreePnt(px, pz, p200, trimsize) #(4 Doubles)->GEOM_Object_ptr Arc = geompy.MakeArc(py, pz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr + Arc2 = geompy.MakeArcCenter(py, pz, px,0) #(3 GEOM_Object_ptr,Boolean)->GEOM_Object_ptr Circle = geompy.MakeCircle(p0, vz, radius1) #(2 GEOM_Object_ptr, Double)->GEOM_Object_ptr Circle1 = geompy.MakeCircleThreePnt(p0, pxyz, px) #(3 GEOM_Object_ptr)->GEOM_Object_ptr Ellipse = geompy.MakeEllipse(p0, vy, radius2, radius1) #(2 GEOM_Object_ptr, 2 Doubles)->GEOM_Object_ptr diff --git a/src/GEOM_SWIG/GEOM_TestMeasures.py b/src/GEOM_SWIG/GEOM_TestMeasures.py index 740d1b2d8..c18c30648 100644 --- a/src/GEOM_SWIG/GEOM_TestMeasures.py +++ b/src/GEOM_SWIG/GEOM_TestMeasures.py @@ -128,4 +128,22 @@ def TestMeasureOperations (geompy, math): print "Z axis: (", Pos[3], ", ", Pos[4], ", ", Pos[5], ")" print "X axis: (", Pos[6], ", ", Pos[7], ", ", Pos[8], ")" + ####### KindOfShape ####### + + Kind = geompy.KindOfShape(box) + print "\nKindOfShape(box 10x30x70):", Kind + #if Kind[0] != geompy.kind.BOX: + # print "Error: returned type is", Kind[0], "while must be", geompy.kind.BOX + + Kind = geompy.KindOfShape(p137) + print "\nKindOfShape(p137):", Kind + if Kind[0] != geompy.kind.VERTEX: + print " Error: returned type is", Kind[0], "while must be", geompy.kind.VERTEX + else: + dx = math.fabs(Kind[1] - 10) + dy = math.fabs(Kind[2] - 30) + dz = math.fabs(Kind[3] - 70) + if (dx + dy + dz) > 1e-5: + print " Error: coordinates are (", Kind[1], ",", Kind[2], ",", Kind[3], ") while must be (10, 20, 30)" + pass diff --git a/src/GEOM_SWIG/GEOM_shared_modules.py b/src/GEOM_SWIG/GEOM_shared_modules.py index 67f962a2f..1c05517c4 100644 --- a/src/GEOM_SWIG/GEOM_shared_modules.py +++ b/src/GEOM_SWIG/GEOM_shared_modules.py @@ -25,7 +25,9 @@ # see salome_shared_modules.py # (avoids incomplete import at run time) -print "============== import GEOM =======================" +from launchConfigureParser import verbose + +if verbose(): print "============== import GEOM =======================" import GEOM diff --git a/src/GEOM_SWIG/geompy.py b/src/GEOM_SWIG/geompy.py index 428939deb..089a39c6b 100644 --- a/src/GEOM_SWIG/geompy.py +++ b/src/GEOM_SWIG/geompy.py @@ -143,6 +143,17 @@ def addToStudyInFather(aFather, aShape, aName): ShapeType = {"COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8} +# ----------------------------------------------------------------------------- +# enumeration shape_kind +# ----------------------------------------------------------------------------- + +kind = GEOM.GEOM_IKindOfShape + +class info: + UNKNOWN = 0 + CLOSED = 1 + UNCLOSED = 2 + # ----------------------------------------------------------------------------- # Basic primitives # ----------------------------------------------------------------------------- @@ -339,6 +350,19 @@ def MakeArc(thePnt1, thePnt2, thePnt3): print "MakeArc : ", CurvesOp.GetErrorCode() return anObj +## Create an arc of circle from a center and 2 points. +# @param thePnt1 Center of the arc +# @param thePnt2 Start point of the arc. (Gives also the radius of the arc) +# @param thePnt3 End point of the arc (Gives also a direction) +# @return New GEOM_Object, containing the created arc. +# +# Example: see GEOM_TestAll.py +def MakeArcCenter(thePnt1, thePnt2, thePnt3,theSense): + anObj = CurvesOp.MakeArcCenter(thePnt1, thePnt2, thePnt3,theSense) + if CurvesOp.IsDone() == 0: + print "MakeArcCenter : ", CurvesOp.GetErrorCode() + return anObj + ## Create a circle with given center, normal vector and radius. # @param thePnt Circle center. # @param theVec Vector, normal to the plane of the circle. @@ -716,6 +740,32 @@ def MakePipeWithDifferentSections(theSeqBases, theLocations,thePath,theWithConta print "MakePipeWithDifferentSections : ", PrimOp.GetErrorCode() return anObj +## Create a shape by extrusion of the profile shape along +# the path shape. The path shape can be a shell or a face. +# the several profiles can be specified in the several locations of path. +# @param theSeqBases - list of Bases shape to be extruded. +# @param theSeqSubBases - list of corresponding subshapes of section shapes. +# @param theLocations - list of locations on the path corresponding +# specified list of the Bases shapes. Number of locations +# should be equal to number of bases or list of locations can be empty. +# @param thePath - Path shape to extrude the base shape along it. +# @param theWithContact - the mode defining that the section is translated to be in +# contact with the spine. +# @param - WithCorrection - defining that the section is rotated to be +# orthogonal to the spine tangent in the correspondent point +# @return New GEOM_Object, containing the created solids. +# +# Example: see GEOM_TestAll.py +def MakePipeWithShellSections(theSeqBases, theSeqSubBases, + theLocations, thePath, + theWithContact, theWithCorrection): + anObj = PrimOp.MakePipeWithShellSections(theSeqBases, theSeqSubBases, + theLocations, thePath, + theWithContact, theWithCorrection) + if PrimOp.IsDone() == 0: + print "MakePipeWithShellSections : ", PrimOp.GetErrorCode() + return anObj + # ----------------------------------------------------------------------------- # Create base shapes # ----------------------------------------------------------------------------- @@ -1337,6 +1387,38 @@ def MakeGlueFaces(theShape, theTolerance): print "MakeGlueFaces : ", ShapesOp.GetErrorCode() return anObj + +## Find coincident faces in theShape for possible gluing. +# @param theShape Initial shape. +# @param theTolerance Maximum distance between faces, +# which can be considered as coincident. +# @return ListOfGO. +# +# Example: see GEOM_Spanner.py +def GetGlueFaces(theShape, theTolerance): + anObj = ShapesOp.GetGlueFaces(theShape, theTolerance) + if ShapesOp.IsDone() == 0: + print "GetGlueFaces : ", ShapesOp.GetErrorCode() + return anObj + + +## Replace coincident faces in theShape by one face +# in compliance with given list of faces +# @param theShape Initial shape. +# @param theTolerance Maximum distance between faces, +# which can be considered as coincident. +# @param theFaces List of faces for gluing. +# @return New GEOM_Object, containing a copy of theShape +# without some faces. +# +# Example: see GEOM_Spanner.py +def MakeGlueFacesByList(theShape, theTolerance, theFaces): + anObj = ShapesOp.MakeGlueFacesByList(theShape, theTolerance, theFaces) + if ShapesOp.IsDone() == 0: + print "MakeGlueFacesByList : ", ShapesOp.GetErrorCode() + return anObj + + # ----------------------------------------------------------------------------- # Boolean (Common, Cut, Fuse, Section) # ----------------------------------------------------------------------------- @@ -1951,6 +2033,76 @@ def GetPosition(theShape): print "GetPosition : ", MeasuOp.GetErrorCode() return aTuple +## Get kind of theShape. +# +# @param theShape Shape to get a kind of. +# @return Returns a kind of shape in terms of GEOM_IKindOfShape.shape_kind enumeration +# and a list of parameters, describing the shape. +# @note Concrete meaning of each value, returned via \a theIntegers +# or \a theDoubles list depends on the kind of the shape. +# The full list of possible outputs is: +# +# geompy.kind.COMPOUND nb_solids nb_faces nb_edges nb_vertices +# geompy.kind.COMPSOLID nb_solids nb_faces nb_edges nb_vertices +# +# geompy.kind.SHELL geompy.info.CLOSED nb_faces nb_edges nb_vertices +# geompy.kind.SHELL geompy.info.UNCLOSED nb_faces nb_edges nb_vertices +# +# geompy.kind.WIRE geompy.info.CLOSED nb_edges nb_vertices +# geompy.kind.WIRE geompy.info.UNCLOSED nb_edges nb_vertices +# +# geompy.kind.SPHERE xc yc zc R +# geompy.kind.CYLINDER xb yb zb dx dy dz R H +# geompy.kind.BOX xc yc zc ax ay az +# geompy.kind.ROTATED_BOX xc yc zc zx zy zz xx xy xz ax ay az +# geompy.kind.TORUS xc yc zc dx dy dz R_1 R_2 +# geompy.kind.CONE xb yb zb dx dy dz R_1 R_2 H +# geompy.kind.POLYHEDRON nb_faces nb_edges nb_vertices +# geompy.kind.SOLID nb_faces nb_edges nb_vertices +# +# geompy.kind.SPHERE2D xc yc zc R +# geompy.kind.CYLINDER2D xb yb zb dx dy dz R H +# geompy.kind.TORUS2D xc yc zc dx dy dz R_1 R_2 +# geompy.kind.CONE2D xc yc zc dx dy dz R_1 R_2 H +# geompy.kind.DISK_CIRCLE xc yc zc dx dy dz R +# geompy.kind.DISK_ELLIPSE xc yc zc dx dy dz R_1 R_2 +# geompy.kind.POLYGON xo yo zo dx dy dz nb_edges nb_vertices +# geompy.kind.PLANE xo yo zo dx dy dz +# geompy.kind.PLANAR xo yo zo dx dy dz nb_edges nb_vertices +# geompy.kind.FACE nb_edges nb_vertices +# +# geompy.kind.CIRCLE xc yc zc dx dy dz R +# geompy.kind.ARC_CIRCLE xc yc zc dx dy dz R x1 y1 z1 x2 y2 z2 +# geompy.kind.ELLIPSE xc yc zc dx dy dz R_1 R_2 +# geompy.kind.ARC_ELLIPSE xc yc zc dx dy dz R_1 R_2 x1 y1 z1 x2 y2 z2 +# geompy.kind.LINE xo yo zo dx dy dz +# geompy.kind.SEGMENT x1 y1 z1 x2 y2 z2 +# geompy.kind.EDGE nb_vertices +# +# geompy.kind.VERTEX x y z +# +# Example: see GEOM_TestMeasures.py +def KindOfShape(theShape): + aRoughTuple = MeasuOp.KindOfShape(theShape) + if MeasuOp.IsDone() == 0: + print "KindOfShape : ", MeasuOp.GetErrorCode() + return [] + + aKind = aRoughTuple[0] + anInts = aRoughTuple[1] + aDbls = aRoughTuple[2] + + # Now there is no exception from this rule: + aKindTuple = [aKind] + aDbls + anInts + + # If they are we will regroup parameters for such kind of shape. + # For example: + #if aKind == kind.SOME_KIND: + # # SOME_KIND int int double int double double + # aKindTuple = [aKind, anInts[0], anInts[1], aDbls[0], anInts[2], aDbls[1], aDbls[2]] + + return aKindTuple + # ----------------------------------------------------------------------------- # Import/Export objects # ----------------------------------------------------------------------------- diff --git a/src/NMTDS/NMTDS_ShapesDataStructure.cxx b/src/NMTDS/NMTDS_ShapesDataStructure.cxx index 229f3c543..c7355995b 100644 --- a/src/NMTDS/NMTDS_ShapesDataStructure.cxx +++ b/src/NMTDS/NMTDS_ShapesDataStructure.cxx @@ -24,17 +24,19 @@ #include + +#include + #include #include -#include -#include -#include + #include -#include -// #include #include -#include + +#include +#include +#include //=========================================================================== //function : NMTDS_ShapesDataStructure::NMTDS_ShapesDataStructure @@ -152,27 +154,29 @@ NMTDS_ListOfIndexedDataMapOfShapeAncestorsSuccessors aLx; NMTDS_ListIteratorOfListOfIndexedDataMapOfShapeAncestorsSuccessors aLit; TopoDS_Iterator anIt; - // Modified Thu Sep 14 14:35:18 2006 - // Contribution of Samtech www.samcef.com BEGIN BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors aMSA; - // Contribution of Samtech www.samcef.com END // anIt.Initialize(myCompositeShape); - for (i=0; anIt.More(); anIt.Next(), ++i) { - // Modified Thu Sep 14 14:35:18 2006 - // Contribution of Samtech www.samcef.com BEGIN + for (; anIt.More(); anIt.Next()) { const TopoDS_Shape& aSx=anIt.Value(); BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors aMS; - FillMap(aSx, aMSA, aMS); - aLx.Append(aMS); - // Contribution of Samtech www.samcef.com END + //modified by NIZNHY-PKV Tue Feb 27 17:05:47 2007f + //FillMap(aSx, aMSA, aMS); + //aLx.Append(aMS); + // + if (!aMSA.Contains(aSx)) { + FillMap(aSx, aMSA, aMS); + aLx.Append(aMS); + } + //modified by NIZNHY-PKV Tue Feb 27 17:06:03 2007t } - // Modified Thu Sep 14 14:35:18 2006 - // Contribution of Samtech www.samcef.com BEGIN + // aNbS=aMSA.Extent(); - // Contribution of Samtech www.samcef.com END // // Fill myRanges + //modified by NIZNHY-PKV Tue Feb 27 17:10:07 2007f + i=aLx.Extent(); + //modified by NIZNHY-PKV Tue Feb 27 17:10:10 2007t myRanges.Resize(i); aLit.Initialize(aLx); for (i=1; aLit.More(); aLit.Next(), ++i) { @@ -210,8 +214,6 @@ // Contribution of Samtech www.samcef.com BEGIN // // Fill the table - //modified by NIZNHY-PKV Tue May 16 11:47:28 2006f - //aShift=0; //for (i=0; i<2; ++i) { // if (i) { @@ -224,7 +226,7 @@ // InsertShapeAndAncestorsSuccessors(aSx, aASx, aShift); // } //} - + aShift=0; for (j=1; j<=aNbS; ++j) { const TopoDS_Shape& aSx=aMSA.FindKey(j); diff --git a/src/NMTTools/NMTTools_DEProcessor.cxx b/src/NMTTools/NMTTools_DEProcessor.cxx index 0350ee38c..9c5f860f5 100644 --- a/src/NMTTools/NMTTools_DEProcessor.cxx +++ b/src/NMTTools/NMTTools_DEProcessor.cxx @@ -189,8 +189,9 @@ void NMTTools_DEProcessor::DoPaves() { - Standard_Integer i, aNbE, nED, nVD, nFD=0; + Standard_Integer i, aNbE, nED, nVD, nFD, aNbLPB; // + nFD=0; aNbE=myDEMap.Extent(); for (i=1; i<=aNbE; i++) { nED=myDEMap.FindKey(i); @@ -202,9 +203,16 @@ TColStd_ListIteratorOfListOfInteger anIt(nLF); for (; anIt.More(); anIt.Next()) { nFD=anIt.Value(); - + // BOPTools_ListOfPaveBlock aLPB; FindPaveBlocks(nED, nVD, nFD, aLPB); + //modified by NIZNHY-PKV Fri Mar 23 10:35:27 2007f + // + aNbLPB=aLPB.Extent(); + if (!aNbLPB) { + continue; + } + //modified by NIZNHY-PKV Fri Mar 23 10:35:33 2007t FillPaveSet (nED, nVD, nFD, aLPB); } // diff --git a/src/NMTTools/NMTTools_PaveFiller_4.cxx b/src/NMTTools/NMTTools_PaveFiller_4.cxx index af8d70fda..3a9a1c5c9 100644 --- a/src/NMTTools/NMTTools_PaveFiller_4.cxx +++ b/src/NMTTools/NMTTools_PaveFiller_4.cxx @@ -25,27 +25,11 @@ #include // -// Modified Thu Sep 14 14:35:18 2006 -// Contribution of Samtech www.samcef.com BEGIN -#include -#include -#include -#include -#include -// Contribution of Samtech www.samcef.com END - #include #include -#include - #include #include -#include -#include - -#include -#include #include #include @@ -53,17 +37,11 @@ #include #include -#include -#include -#include -#include -#include #include #include #include -#include #include #include @@ -97,15 +75,46 @@ #include #include -#include -#include -#include #include #include #include #include +// Modified Thu Sep 14 14:35:18 2006 +// Contribution of Samtech www.samcef.com BEGIN +#include +#include +#include +#include +#include +// Contribution of Samtech www.samcef.com END +// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include +#include +#include +#include + static void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI, @@ -117,7 +126,6 @@ static TopoDS_Vertex& aNewVertex); - static void VertexParameters(const IntTools_CommonPrt& aCPart, Standard_Real& aT1, @@ -137,6 +145,7 @@ static static void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB, NMTTools_ListOfCommonBlock& aLCB); + //======================================================================= // function: PerformEE // purpose: @@ -447,6 +456,9 @@ static }//for (; aIt.More(); aIt.Next()) { }// for (; aItIm.More(); aItIm.Next()) } +// +// case: use_02 +// completely rewritten //======================================================================= //function : TreatNewVertices //purpose : @@ -455,7 +467,7 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap TopTools_DataMapOfShapeListOfShape& myImages, TopTools_DataMapOfShapeShape& myOrigins) { - Standard_Integer j, i, aNbV, aIndex, aNbVSD; + Standard_Integer j, i, aNbV, aNbVSD; Standard_Real aTol; TColStd_ListIteratorOfListOfInteger aIt; TopoDS_Shape aSTmp, aVF; @@ -467,12 +479,10 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap NMTDS_IndexedDataMapOfIntegerShape aMIS; NMTDS_IndexedDataMapOfShapeBox aMSB; // - // NMTDS_BoxBndTreeSelector aSelector; NMTDS_BoxBndTree aBBTree; NCollection_UBTreeFiller aTreeFiller(aBBTree); // - // myImages.Clear(); myOrigins.Clear(); // @@ -498,6 +508,7 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap // aTreeFiller.Fill(); // + // Chains for (i=1; i<=aNbV; ++i) { const TopoDS_Shape& aV=aMV(i); // @@ -505,33 +516,84 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap continue; } // - const Bnd_Box& aBoxV=aMSB.FindFromKey(aV); - aSelector.Clear(); - aSelector.SetBox(aBoxV); - // - aNbVSD=aBBTree.Select(aSelector); - if (!aNbVSD) { - continue; // it must not be - } - // - // Images - // + Standard_Integer aNbIP, aIP, aNbIP1, aIP1; TopTools_ListOfShape aLVSD; + TColStd_MapOfInteger aMIP, aMIP1, aMIPC; + TColStd_MapIteratorOfMapOfInteger aIt1; // - const TColStd_ListOfInteger& aLI=aSelector.Indices(); - aIt.Initialize(aLI); - for (j=0; aIt.More(); aIt.Next(), ++j) { - aIndex=aIt.Value(); - const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex); - if(!j) { - aVF=aVx; + aMIP.Add(i); + while(1) { + aNbIP=aMIP.Extent(); + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + if (aMIPC.Contains(aIP)) { + continue; + } + // + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + const Bnd_Box& aBoxVP=aMSB.FindFromKey(aVP); + // + aSelector.Clear(); + aSelector.SetBox(aBoxVP); + // + aNbVSD=aBBTree.Select(aSelector); + if (!aNbVSD) { + continue; // it must not be + } + // + const TColStd_ListOfInteger& aLI=aSelector.Indices(); + aIt.Initialize(aLI); + for (; aIt.More(); aIt.Next()) { + aIP1=aIt.Value(); + if (aMIP.Contains(aIP1)) { + continue; + } + aMIP1.Add(aIP1); + } //for (; aIt.More(); aIt.Next()) { + }//for(; aIt1.More(); aIt1.Next()) { + // + aNbIP1=aMIP1.Extent(); + if (!aNbIP1) { + break; // from while(1) } - aLVSD.Append(aVx); - aMVProcessed.Add(aVx); + // + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIPC.Add(aIP); + } + // + aMIP.Clear(); + aIt1.Initialize(aMIP1); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIP.Add(aIP); + } + aMIP1.Clear(); + }// while(1) + //... + aNbIP=aMIPC.Extent(); + if (!aNbIP) { + //modified by NIZNHY-PKV Tue Jan 9 14:26:09 2007f + aMIPC.Add(i); + //continue; + //modified by NIZNHY-PKV Tue Jan 9 14:26:12 2007t } // + aIt1.Initialize(aMIPC); + for(j=0; aIt1.More(); aIt1.Next(), ++j) { + aIP=aIt1.Key(); + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + if (!j) { + aVF=aVP; + } + aLVSD.Append(aVP); + aMVProcessed.Add(aVP); + } myImages.Bind(aVF, aLVSD); - } + }// for (i=1; i<=aNbV; ++i) { + //------------------------------ // // Make new vertices aMV.Clear(); @@ -577,6 +639,7 @@ void TreatNewVertices(const BooleanOperations_IndexedDataMapOfShapeInteger& aMap } } } +// //======================================================================= //function : MakeNewVertex //purpose : @@ -1364,3 +1427,213 @@ void ProcessBlock(const BOPTools_PaveBlock& aPB, } } // Contribution of Samtech www.samcef.com END +/* +//======================================================================= +// function:EENewVertices +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EENewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) +{ + Standard_Integer aNb, i, j, aNewShape, aNbEdges, aNbIEE, aNbVV, aNbSimple; + Standard_Integer aWhat, aWith, i1, i2, nE1, nE2, nE, nV, aFlag; + Standard_Real aT; + TopoDS_Compound aCompound; + BRep_Builder aBB; + NMTTools_IndexedDataMapOfIndexedMapOfInteger aMNVE, aMNVIEE; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + BOPTools_Pave aPave; + TopoDS_Vertex aNewVertex; + TopTools_IndexedMapOfShape aMNVComplex, aMNVSimple; + // + BOPTools_CArray1OfEEInterference& aEEs=myIntrPool->EEInterferences(); + // + aNb=aMapVI.Extent(); + // + if (!aNb) { // no new vertices, no new problems + return; + } + // + // 0. + if (aNb==1) { + aNewVertex=TopoDS::Vertex(aMapVI.FindKey(1)); + EENewVertices(aNewVertex, aMapVI); + return; + } + // + // 1. Make compound from new vertices + aBB.MakeCompound(aCompound); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aV=aMapVI.FindKey(i); + aBB.Add(aCompound, aV); + } + // + // 2. VV intersection between these vertices + // using the auxiliary Filler + NMTDS_ShapesDataStructure tDS; + // + tDS.SetCompositeShape(aCompound); + tDS.Init(); + // + BOPTools_InterferencePool tInterfPool(tDS); + NMTTools_PaveFiller tPaveFiller(tInterfPool); + // + tPaveFiller.Init(); + // + tPaveFiller.PerformVV(); + tPaveFiller.PerformNewVertices(); + // + const BOPTools_CArray1OfVVInterference& aVVInterfs=tInterfPool.VVInterfs(); + // + // 3. Separate Comlex and Simple new vertices + aNbVV=aVVInterfs.Extent(); + for (i=1; i<=aNbVV; ++i) { + const BOPTools_VVInterference& aVV=aVVInterfs(i); + aVV.Indices(aWhat, aWith); + const TopoDS_Shape& aV1=tDS.Shape(aWhat); + const TopoDS_Shape& aV2=tDS.Shape(aWith); + aMNVComplex.Add(aV1); + aMNVComplex.Add(aV2); + } + // + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aV=aMapVI.FindKey(i); + if (!aMNVComplex.Contains(aV)) { + aMNVSimple.Add(aV); + } + } + // + // 4. Treat Simple new Vertices + aNbSimple=aMNVSimple.Extent(); + for (i=1; i<=aNbSimple; ++i) { + const TopoDS_Vertex& aV=TopoDS::Vertex(aMNVSimple(i)); + EENewVertices(aV, aMapVI); + } + // + // 3. Fill Maps : NewVertex-edges (aMNVE) + // NewVertex-interferences (aMNVIEE) + for (i=1; i<=aNbVV; ++i) { + const BOPTools_VVInterference& aVV=aVVInterfs(i); + aNewShape=aVV.NewShape(); + if (!aNewShape) { + continue; + } + // + if (!aMNVE.Contains(aNewShape)) { + TColStd_IndexedMapOfInteger aMx; + aMNVE.Add(aNewShape, aMx); + } + if (!aMNVIEE.Contains(aNewShape)) { + TColStd_IndexedMapOfInteger aMx; + aMNVIEE.Add(aNewShape, aMx); + } + // + TColStd_IndexedMapOfInteger& aME=aMNVE.ChangeFromKey(aNewShape); + TColStd_IndexedMapOfInteger& aMIEE=aMNVIEE.ChangeFromKey(aNewShape); + // + aVV.Indices(aWhat, aWith); + //aWhat + const TopoDS_Shape& aV1=tDS.Shape(aWhat); + i1=aMapVI.FindFromKey(aV1); + const BOPTools_EEInterference& aEE1=aEEs(i1); + aEE1.Indices(nE1, nE2); + aME.Add(nE1); + aME.Add(nE2); + aMIEE.Add(i1); + //aWith + const TopoDS_Shape& aV2=tDS.Shape(aWith); + i2=aMapVI.FindFromKey(aV2); + const BOPTools_EEInterference& aEE2=aEEs(i2); + aEE2.Indices(nE1, nE2); + aME.Add(nE1); + aME.Add(nE2); + aMIEE.Add(i2); + // + //printf(" VV: (%d, %d) -> %d\n", aWhat, aWith, aNewShape); + } + // + // 4. Process new vertices + aNb=aMNVE.Extent(); + for (i=1; i<=aNb; ++i) { // xx + // + // new Vertex + nV=aMNVE.FindKey(i); + aNewVertex=TopoDS::Vertex(tDS.Shape(nV)); + // + // Insert New Vertex in DS; + myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); + aNewShape=myDS->NumberOfInsertedShapes(); + myDS->SetState (aNewShape, BooleanOperations_ON); + // + // Update index of NewShape in EE interferences + const TColStd_IndexedMapOfInteger& aMIEE=aMNVIEE.FindFromKey(nV);//(i); + aNbIEE=aMIEE.Extent(); + for (j=1; j<=aNbIEE; ++j) { + i1=aMIEE(j); + BOPTools_EEInterference& aEE1=aEEs(i1); + aEE1.SetNewShape(aNewShape); + } + // + // Update Paves on edges + const TColStd_IndexedMapOfInteger& aME=aMNVE(i); + aNbEdges=aME.Extent(); + for (j=1; j<=aNbEdges; ++j) { + nE=aME(j); + const TopoDS_Edge aE=TopoDS::Edge(myDS->Shape(nE));//mpv + // + aFlag=myContext.ComputeVE (aNewVertex, aE, aT); + // + if (!aFlag) { + aPave.SetInterference(-1); + aPave.SetType (BooleanOperations_EdgeEdge); + aPave.SetIndex(aNewShape); + aPave.SetParam(aT); + // + BOPTools_PaveSet& aPaveSet=myPavePoolNew(myDS->RefEdge(nE)); + aPaveSet.Append(aPave); + } + } + }// for (i=1; i<=aNb; ++i) {// xx +} +//======================================================================= +// function:EENewVertices +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EENewVertices (const TopoDS_Vertex& aNewVertex, + const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) +{ + Standard_Integer i, aNewShape, nE1, nE2; + Standard_Real aT1, aT2; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + BOPTools_Pave aPave; + // + BOPTools_CArray1OfEEInterference& aEEs=myIntrPool->EEInterferences(); + // + // one new vertex case is treated in usual way + // + // Insert New Vertex in DS; + myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); + aNewShape=myDS->NumberOfInsertedShapes(); + myDS->SetState (aNewShape, BooleanOperations_ON); + // Insert New Vertex in EE Interference + i=aMapVI.FindFromKey(aNewVertex); + BOPTools_EEInterference& aEEInterf= aEEs(i); + aEEInterf.SetNewShape(aNewShape); + // Extact interference info + aEEInterf.Indices(nE1, nE2); + const IntTools_CommonPrt& aCPart=aEEInterf.CommonPrt(); + VertexParameters(aCPart, aT1, aT2); + // + // Add Paves to the myPavePoolNew + aPave.SetInterference(i); + aPave.SetType (BooleanOperations_EdgeEdge); + aPave.SetIndex(aNewShape); + // Pave for edge nE1 + aPave.SetParam(aT1); + BOPTools_PaveSet& aPaveSet1=myPavePoolNew(myDS->RefEdge(nE1)); + aPaveSet1.Append(aPave); + // Pave for edge nE2 + aPave.SetParam(aT2); + BOPTools_PaveSet& aPaveSet2=myPavePoolNew(myDS->RefEdge(nE2)); + aPaveSet2.Append(aPave); +} +*/ diff --git a/src/NMTTools/NMTTools_PaveFiller_6.cxx b/src/NMTTools/NMTTools_PaveFiller_6.cxx index 27a62d3c3..298162362 100644 --- a/src/NMTTools/NMTTools_PaveFiller_6.cxx +++ b/src/NMTTools/NMTTools_PaveFiller_6.cxx @@ -107,6 +107,8 @@ #include #include #include +// +#include static Standard_Boolean IsPairFound(const Standard_Integer nF1, @@ -135,6 +137,10 @@ static TopTools_ListOfShape& aLS); // Contribution of Samtech www.samcef.com END +static + Standard_Boolean IsMicroEdge(const TopoDS_Edge& aE, + IntTools_Context& aCtx); + //======================================================================= // function: PerformFF // purpose: @@ -272,6 +278,7 @@ static Standard_Boolean bIsExistingPaveBlock, bIsValidIn2D, bIsCoincided; // Contribution of Samtech www.samcef.com END // + Standard_Boolean bIsMicroEdge; Standard_Integer i, aNbFFs, nF1, nF2, aBid=0; Standard_Integer nV1, nV2, j, aNbCurves; Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion(); @@ -510,7 +517,17 @@ static // BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); // - //modified by NIZNHY-PKV Thu Nov 16 11:13:46 2006f SKL/PartC5 + // use_01 f + // + NMTTools_Tools::UpdateEdge (aES, aTolR3D); + bIsMicroEdge=IsMicroEdge(aES, myContext); + if (bIsMicroEdge) { + continue; + } + // + //use_01 t + // + // SKL/PartC5 f { Handle(Geom2d_Curve) aC2D1, aC2D2; // @@ -519,24 +536,8 @@ static // NMTTools_Tools::MakePCurve(aES, aF1, aC2D1); NMTTools_Tools::MakePCurve(aES, aF2, aC2D2); - NMTTools_Tools::UpdateEdge (aES, aTolR3D); + //SKL/PartC5 t } - - // - /* - { - Standard_Real aTolR2D; - Handle(Geom2d_Curve) aC2D1, aC2D2; - // - aTolR2D=aFFi.TolR2D(); - aC2D1=aIC.FirstCurve2d(); - aC2D2=aIC.SecondCurve2d(); - // - NMTTools_Tools::MakePCurve(aES, aF1, aC2D1, aTolR2D); - NMTTools_Tools::MakePCurve(aES, aF2, aC2D2, aTolR2D); - } - */ - //modified by NIZNHY-PKV Thu Nov 16 11:17:34 2006t // aMEPB.Add(aES, aPBNew); aMapEI.Add(aES, i); @@ -742,13 +743,11 @@ static aF2FWD=aF2; aF2FWD.Orientation(TopAbs_FORWARD); // - //modified by NIZNHY-PKV Thu Nov 16 12:49:13 2006f SKL/PartC5 - //NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1, aTolEx); - //NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2, aTolEx); + // SKL/PartC5 f NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1); NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2); NMTTools_Tools::UpdateEdge (aEx, aTolEx); - //modified by NIZNHY-PKV Thu Nov 16 12:49:24 2006t + //SKL/PartC5 t } //if (aCBAPI.IsCommonBlock(aPB)) // // new SE @@ -816,8 +815,12 @@ static void NMTTools_PaveFiller::MakePCurves() { Standard_Integer i, aNb, nF1, nF2, nE; + Standard_Integer aNbCB, aNbF, nSp, nF; TopoDS_Face aF1FWD, aF2FWD; + TColStd_ListIteratorOfListOfInteger aItF; BOPTools_ListIteratorOfListOfPaveBlock anIt; + NMTTools_ListIteratorOfListOfCommonBlock aItCB; + TopAbs_ShapeEnum aType; // BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); // @@ -846,7 +849,60 @@ static BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); } - } + } + // + //modified by NIZNHY-PKV Fri Mar 23 10:35:02 2007f + // Check common blocks between edges and faces + // Build P-Curves if they were not built in previos block. + // + // The main case is :arguments for e.g aEdge, aFace -> no FFs, + // but p-curves are needed. + // + aNb=myDS->NumberOfShapesOfTheObject(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myDS->Shape(i); + aType=aS.ShapeType(); + // + if (aType!=TopAbs_EDGE) { + continue; + } + const TopoDS_Edge& aE=TopoDS::Edge(aS); + // + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(i)); + aNbCB=aLCB.Extent(); + if (!aNbCB) { + continue; + } + // + aItCB.Initialize(aLCB); + for (; aItCB.More(); aItCB.Next()) { + const NMTTools_CommonBlock& aCB=aItCB.Value(); + const BOPTools_PaveBlock &aPB1=aCB.PaveBlock1(); + // + const TColStd_ListOfInteger& aLF=aCB.Faces(); + aNbF=aLF.Extent(); + if (!aNbF) { + continue; + } + // + nSp=aPB1.Edge(); + const TopoDS_Edge aSp=TopoDS::Edge(myDS->Shape(nSp));//mpv + // + aItF.Initialize(aLF); + for (; aItF.More(); aItF.Next()) { + nF=aItF.Value(); + aF1FWD=TopoDS::Face(myDS->Shape(nF)); + aF1FWD.Orientation(TopAbs_FORWARD); + // + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aSp, aF1FWD); + } // for (; aItCB.More(); aItCB.Next()) { + }//if (aS.ShapeType()==TopAbs_EDGE) { + } + //modified by NIZNHY-PKV Fri Mar 23 10:35:13 2007t } //======================================================================= // function: IsExistingPaveBlock @@ -1342,11 +1398,11 @@ void SharedEdges1(const TopoDS_Face& aF1, // V22 const BOPTools_Pave& aPave22=aPBR.Pave2(); nV22=aPave22.Index(); - //modified by NIZNHY-PKV Wed Nov 15 13:08:13 2006f + // if (nV11==nV21 || nV11==nV22 || nV12==nV21 || nV12==nV22) { continue; } - //modified by NIZNHY-PKV Wed Nov 15 13:08:15 2006t + // // E2 nE2=aPBR.Edge(); // @@ -1418,3 +1474,44 @@ void SharedEdges1(const TopoDS_Face& aF1, } // // Contribution of Samtech www.samcef.com END + +// use_01 f +//======================================================================= +//function : IsMicroEdge +//purpose : +//======================================================================= +Standard_Boolean IsMicroEdge(const TopoDS_Edge& aE, + IntTools_Context& aCtx) +{ + Standard_Boolean bRet; + Standard_Integer iErr; + Standard_Real aT1, aT2, aTmp; + Handle(Geom_Curve) aC3D; + TopoDS_Vertex aV1, aV2; + IntTools_Range aR; + // + bRet=(BRep_Tool::Degenerated(aE) || + !BRep_Tool::IsGeometric(aE)); + if (bRet) { + return bRet; + } + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + TopExp::Vertices(aE, aV1, aV2); + aT1=BRep_Tool::Parameter(aV1, aE); + aT2=BRep_Tool::Parameter(aV2, aE); + if (aT2Shape(nEx)); + aTolEx=BRep_Tool::Tolerance(aEx); + if (aTolEx>aTolExMax) { + aTolExMax=aTolEx; + aLPBx.Prepend(aPBx); + } + else{ + aLPBx.Append(aPBx); + } + } + // + pLPB->Clear(); + *pLPB=aLPBx; + } + //modified by NIZNHY-PKV Wed Nov 8 15:59:50 2006t + // BOPTools_PaveBlock& aPB=aCB.PaveBlock1(nE); nSp=SplitIndex(aPB); aPB.SetEdge(nSp); diff --git a/src/OBJECT/GEOM_AISShape.cxx b/src/OBJECT/GEOM_AISShape.cxx index 7c89cd2fe..4a3f6e0e9 100644 --- a/src/OBJECT/GEOM_AISShape.cxx +++ b/src/OBJECT/GEOM_AISShape.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -100,7 +101,7 @@ static void indicesToOwners( const TColStd_IndexedMapOfInteger& aIndexMap, TopExp::MapShapes(aMainShape, aMapOfShapes); for ( Standard_Integer i = 1, n = anAllMap.Extent(); i <= n; i++ ) { - Handle(SelectMgr_EntityOwner) anOwner = anAllMap( i ); + Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(anAllMap( i )); if ( anOwner.IsNull() || !anOwner->HasShape() ) continue; @@ -115,11 +116,9 @@ static void indicesToOwners( const TColStd_IndexedMapOfInteger& aIndexMap, } GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape, - const Standard_CString aName): SALOME_AISShape(shape) + const Standard_CString aName) + : SALOME_AISShape(shape), myName(aName) { - myName = new char [strlen(aName)+1]; - strcpy( myName, aName); - myShadingColor = Quantity_Color( Quantity_NOC_GOLDENROD ); } @@ -140,8 +139,7 @@ Standard_Boolean GEOM_AISShape::hasIO(){ void GEOM_AISShape::setName(const Standard_CString aName) { - myName = new char [strlen(aName)+1]; - strcpy( myName, aName); + myName = aName; Handle(SALOME_InteractiveObject) IO = getIO(); if ( !IO.IsNull() ) @@ -149,7 +147,7 @@ void GEOM_AISShape::setName(const Standard_CString aName) } Standard_CString GEOM_AISShape::getName(){ - return myName; + return myName.ToCString(); } void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, diff --git a/src/OBJECT/GEOM_AISShape.hxx b/src/OBJECT/GEOM_AISShape.hxx index 1fa87d0a8..a90919622 100644 --- a/src/OBJECT/GEOM_AISShape.hxx +++ b/src/OBJECT/GEOM_AISShape.hxx @@ -55,6 +55,8 @@ #include #endif +#include + class PrsMgr_PresentationManager3d; class Prs3d_Presentation; class SALOME_InteractiveObject; @@ -102,34 +104,16 @@ public: // friend Handle_Standard_Type& GEOM_AISShape_Type_(); const Handle(Standard_Type)& DynamicType() const; - Standard_Boolean IsKind(const Handle(Standard_Type)&) const; - -protected: - - // Methods PROTECTED - // - - - // Fields PROTECTED - // + Standard_Boolean IsKind(const Handle(Standard_Type)&) const; +protected: + Quantity_Color myShadingColor; private: - - // Methods PRIVATE - // - - - // Fields PRIVATE - // - Standard_CString myName; - Quantity_Color myShadingColor; + TCollection_AsciiString myName; }; - - - // other inline functions and methods (like "C++: function call" methods) // diff --git a/src/OBJECT/GEOM_AISVector.cxx b/src/OBJECT/GEOM_AISVector.cxx new file mode 100644 index 000000000..66e968da8 --- /dev/null +++ b/src/OBJECT/GEOM_AISVector.cxx @@ -0,0 +1,91 @@ +// GEOM OBJECT : interactive object for Geometry entities visualization +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// +// +// File : GEOM_AISVector.cxx +// Author : Julia DOROVSKIKH +// $Header$ + + +#include + +// OCCT Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_HANDLE(GEOM_AISVector, GEOM_AISShape) +IMPLEMENT_STANDARD_RTTIEXT(GEOM_AISVector, GEOM_AISShape) + +//======================================================================= +//function : GEOM_AISVector +//purpose : Constructor +//======================================================================= +GEOM_AISVector::GEOM_AISVector (const TopoDS_Shape& theShape, const Standard_CString theName) + : GEOM_AISShape(theShape, theName) +{ +} + +//======================================================================= +//function : Compute +//purpose : Compute a presentation +//======================================================================= +void GEOM_AISVector::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + GEOM_AISShape::Compute(thePresentationManager, thePrs, theMode); + + if (myshape.ShapeType() == TopAbs_EDGE) + { + TopoDS_Vertex aV1, aV2; + TopoDS_Edge anEdgeE = TopoDS::Edge(myshape); + TopExp::Vertices(anEdgeE, aV1, aV2); + gp_Pnt aP1 = BRep_Tool::Pnt(aV1); + gp_Pnt aP2 = BRep_Tool::Pnt(aV2); + + gp_Vec aVec (aP1, aP2); + Standard_Real aDist = aVec.Magnitude(); + if (aDist > gp::Resolution()) + { + gp_Dir aDir (aVec); + + Handle(Graphic3d_Group) aG = Prs3d_Root::CurrentGroup(thePrs); + + //thePrs->Color(myShadingColor.Name()); + //aG->BeginPrimitives(); + Prs3d_Arrow::Draw(thePrs, aP2, aDir, PI/180.*5., aDist/10.); + //aG->EndPrimitives(); + } + } + //thePrs->ReCompute(); // for hidden line recomputation if necessary... +} diff --git a/src/OBJECT/GEOM_AISVector.hxx b/src/OBJECT/GEOM_AISVector.hxx new file mode 100644 index 000000000..993e17c33 --- /dev/null +++ b/src/OBJECT/GEOM_AISVector.hxx @@ -0,0 +1,63 @@ +// GEOM OBJECT : interactive object for Geometry entities visualization +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// +// +// File : GEOM_AISVector.hxx +// Author : Julia DOROVSKIKH +// Module : GEOM + +#ifndef GEOM_AISVector_HeaderFile +#define GEOM_AISVector_HeaderFile + +#include +#include + +/*! + * \class GEOM_AISVector + * \brief Interactive object, representing a vector with arrow on its end + */ + +class GEOM_AISVector : public GEOM_AISShape +{ +public: + /*! + * Constructor + * \param theShape A linear edge to be represented as a vector + * \param theName A name to be passed in constructor of \a GEOM_AISShape + */ + Standard_EXPORT GEOM_AISVector (const TopoDS_Shape& theShape, const Standard_CString theName); + +protected: + /*! + * Redefined from GEOM_AISShape + */ + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0); + +public: + DEFINE_STANDARD_RTTI (GEOM_AISVector) +}; + +DEFINE_STANDARD_HANDLE(GEOM_AISVector, GEOM_AISShape) + +#endif diff --git a/src/OBJECT/GEOM_Actor.cxx b/src/OBJECT/GEOM_Actor.cxx index 0e7f3ccba..e1ff41541 100644 --- a/src/OBJECT/GEOM_Actor.cxx +++ b/src/OBJECT/GEOM_Actor.cxx @@ -113,7 +113,7 @@ void GEOM_Actor::ShallowCopy(vtkProp *prop) GEOM_Actor *f = GEOM_Actor::SafeDownCast(prop); if ( f != NULL ) { - this->setInputShape(f->getTopo(),f->getDeflection(),f->getDisplayMode()); + this->setInputShape(f->getTopo(),f->getDeflection(),f->getDisplayMode(),f->isVector()); this->setName( f->getName() ); if ( f->hasIO() ) this->setIO( f->getIO() ); @@ -155,9 +155,12 @@ void GEOM_Actor::setDeflection(double adef) { deflection = adef; } -void GEOM_Actor::setInputShape(const TopoDS_Shape& aShape,double adef,int imode) { +void GEOM_Actor::setInputShape(const TopoDS_Shape& aShape, double adef, + int imode, bool isVector) +{ myShape = aShape; deflection = adef; + myIsVector = isVector; setDisplayMode(imode); } @@ -192,10 +195,10 @@ void GEOM_Actor::CreateMapper(int theMode) { this->SetPosition(aPnt.X(),aPnt.Y(),aPnt.Z()); } GEOM_OCCReader* aread = GEOM_OCCReader::New(); - aread->setTopo(myShape); + aread->setTopo(myShape, myIsVector); aread->setDisplayMode(theMode); aread->GetOutput()->ReleaseDataFlagOn(); - + vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New(); if (theMode == 0) { aMapper->SetInput(aread->GetOutput()); diff --git a/src/OBJECT/GEOM_Actor.h b/src/OBJECT/GEOM_Actor.h index 9fb32dc83..ae4a08d10 100644 --- a/src/OBJECT/GEOM_Actor.h +++ b/src/OBJECT/GEOM_Actor.h @@ -58,11 +58,14 @@ class GEOM_OBJECT_EXPORT GEOM_Actor : public SALOME_Actor { void ReleaseGraphicsResources(vtkWindow *); const TopoDS_Shape& getTopo(); - void setInputShape(const TopoDS_Shape& ashape,double adef1,int imode); + void setInputShape(const TopoDS_Shape& ashape, double adef1, + int imode, bool isVector = false); double getDeflection(); void setDeflection(double adefl); + double isVector() { return myIsVector; } + // SubShape void SubShapeOn(); void SubShapeOff(); @@ -110,6 +113,7 @@ class GEOM_OBJECT_EXPORT GEOM_Actor : public SALOME_Actor { TopoDS_Shape myShape; double deflection; + bool myIsVector; vtkMapper* ShadingMapper; vtkMapper* WireframeMapper; diff --git a/src/OBJECT/GEOM_AssemblyBuilder.cxx b/src/OBJECT/GEOM_AssemblyBuilder.cxx index b4d94c841..cb1a8ba03 100644 --- a/src/OBJECT/GEOM_AssemblyBuilder.cxx +++ b/src/OBJECT/GEOM_AssemblyBuilder.cxx @@ -185,21 +185,23 @@ void GEOM_AssemblyBuilder::MeshShape(const TopoDS_Shape myShape, vtkActorCollection* GEOM_AssemblyBuilder::BuildActors(const TopoDS_Shape& myShape, - Standard_Real deflection, - Standard_Integer mode, - Standard_Boolean forced) { - + Standard_Real deflection, + Standard_Integer mode, + Standard_Boolean forced, + Standard_Boolean isVector) +{ vtkActorCollection* AISActors = vtkActorCollection::New(); if(myShape.ShapeType() == TopAbs_COMPOUND) { TopoDS_Iterator anItr(myShape); for(; anItr.More(); anItr.Next()) { - vtkActorCollection* theActors = GEOM_AssemblyBuilder::BuildActors(anItr.Value(), deflection, mode, forced); + vtkActorCollection* theActors = + GEOM_AssemblyBuilder::BuildActors(anItr.Value(), deflection, mode, forced); theActors->InitTraversal(); vtkActor* anActor = (vtkActor*)theActors->GetNextActor(); while(!(anActor==NULL)) { - AISActors->AddItem(anActor); - anActor = (vtkActor*)theActors->GetNextActor(); + AISActors->AddItem(anActor); + anActor = (vtkActor*)theActors->GetNextActor(); } } } @@ -301,7 +303,7 @@ vtkActorCollection* GEOM_AssemblyBuilder::BuildActors(const TopoDS_Shape& myShap } } else if ( myShape.ShapeType() == TopAbs_EDGE ) { // EDGE Actor GEOM_Actor* EdgeActor = GEOM_Actor::New(); - EdgeActor->setInputShape(myShape,deflection,mode); + EdgeActor->setInputShape(myShape,deflection,mode,isVector); EdgeActor->SetShadingProperty(EdgeIProp); EdgeActor->SetWireframeProperty(EdgeIProp); EdgeActor->SetPreviewProperty(EdgePVProp); diff --git a/src/OBJECT/GEOM_AssemblyBuilder.h b/src/OBJECT/GEOM_AssemblyBuilder.h index 36149732c..c74cc11d5 100644 --- a/src/OBJECT/GEOM_AssemblyBuilder.h +++ b/src/OBJECT/GEOM_AssemblyBuilder.h @@ -74,7 +74,8 @@ class GEOM_OBJECT_EXPORT GEOM_AssemblyBuilder { static vtkActorCollection* BuildActors(const TopoDS_Shape& myShape, Standard_Real deflection, Standard_Integer amode, - Standard_Boolean forced); + Standard_Boolean forced, + Standard_Boolean isVector = Standard_False); //------------------------------------------------------------------ diff --git a/src/OBJECT/GEOM_OCCReader.cxx b/src/OBJECT/GEOM_OCCReader.cxx index 2bd8dad5d..01400b67f 100644 --- a/src/OBJECT/GEOM_OCCReader.cxx +++ b/src/OBJECT/GEOM_OCCReader.cxx @@ -740,14 +740,19 @@ void GEOM_OCCReader::TransferEdgeWData(const TopoDS_Edge& aEdge, edgeTransf = aEdgeLoc.Transformation(); } + gp_Pnt aP1, aP2; + Standard_Integer nbnodes; if (aEdgePoly.IsNull()) { nbnodes = P->NbNodes(); const TColgp_Array1OfPnt& theNodesP = P->Nodes(); + aP1 = theNodesP(1); + aP2 = theNodesP(nbnodes); + float coord[3]; int pts[2]; - + for(int j=1;jNodes(); const TColgp_Array1OfPnt& theNodesPoly = T->Nodes(); + aP1 = theNodesPoly(1); + aP2 = theNodesPoly(nbnodes); + float coord[3]; int pts[2]; @@ -802,6 +810,91 @@ void GEOM_OCCReader::TransferEdgeWData(const TopoDS_Edge& aEdge, Cells->InsertNextCell(2,pts); } } + + // vector representation has an arrow on its end + if (myIsVector) + { + if (!isidtrsf) { + // apply edge transformation + aP1.Transform(edgeTransf); + aP2.Transform(edgeTransf); + } + + // draw an arrow + gp_Vec aDirVec (aP1, aP2); + Standard_Real aDist = aDirVec.Magnitude(); + if (aDist < gp::Resolution()) return; + gp_Dir aDirection (aDirVec); + + Standard_Real anAngle = PI/180.*5.; + Standard_Real aLength = aDist/10.; + + Standard_Real dx,dy,dz; + aDirection.Coord(dx,dy,dz); + + // Pointe de la fleche + Standard_Real xo,yo,zo; + aP2.Coord(xo,yo,zo); + + // Centre du cercle base de la fleche + gp_XYZ aPc = aP2.XYZ() - aDirection.XYZ() * aLength; + + // Construction d'un repere i,j pour le cercle + gp_Dir aDirN; + if (Abs(dx) <= Abs(dy) && Abs(dx) <= Abs(dz)) aDirN = gp::DX(); + else if (Abs(dy) <= Abs(dz) && Abs(dy) <= Abs(dx)) aDirN = gp::DY(); + else aDirN = gp::DZ(); + + gp_Dir aDirI = aDirection ^ aDirN; + gp_Dir aDirJ = aDirection ^ aDirI; + + // Add points and segments, composing the arrow + Standard_Real cosinus, sinus, Tg = tan(anAngle); + + float coord[3]; + coord[0] = xo; coord[1] = yo; coord[2] = zo; + + int ptLoc = Pts->InsertNextPoint(coord); + int ptFirst = 0; + int ptPrev = 0; + int ptCur = 0; + + int pts[2]; + + int NbPoints = 15; + for (int i = 1; i <= NbPoints; i++, ptPrev = ptCur) + { + cosinus = cos(2. * PI / NbPoints * (i-1)); + sinus = sin(2. * PI / NbPoints * (i-1)); + + gp_XYZ aP = aPc + (aDirI.XYZ() * cosinus + aDirJ.XYZ() * sinus) * aLength * Tg; + coord[0] = aP.X(); + coord[1] = aP.Y(); + coord[2] = aP.Z(); + + // insert pts + ptCur = Pts->InsertNextPoint(coord); + pts[0] = ptCur; + + if (i == 1) { + ptFirst = ptCur; + } + else { + // insert line (ptCur,ptPrev) + pts[1] = ptPrev; + Cells->InsertNextCell(2,pts); + } + + // insert line (ptCur,ptLoc) + pts[1] = ptLoc; + Cells->InsertNextCell(2,pts); + } + + // insert line (ptCur,ptFirst) + pts[0] = ptCur; + pts[1] = ptFirst; + Cells->InsertNextCell(2,pts); + } } /* Standard_Integer nbnodes = aEdgePoly->NbNodes(); @@ -972,8 +1065,9 @@ void GEOM_OCCReader::setDisplayMode(int thenewmode) { amode = thenewmode; } -void GEOM_OCCReader::setTopo(const TopoDS_Shape& aShape) { +void GEOM_OCCReader::setTopo(const TopoDS_Shape& aShape, bool isVector) { myShape = aShape; + myIsVector = isVector; } void GEOM_OCCReader::setForceUpdate(Standard_Boolean bol) { diff --git a/src/OBJECT/GEOM_OCCReader.h b/src/OBJECT/GEOM_OCCReader.h index d17f6d484..5c0288a75 100644 --- a/src/OBJECT/GEOM_OCCReader.h +++ b/src/OBJECT/GEOM_OCCReader.h @@ -59,7 +59,7 @@ class GEOM_OBJECT_EXPORT GEOM_OCCReader : public vtkPolyDataSource { const TopoDS_Shape& getTopo(); - void setTopo(const TopoDS_Shape& ashape); + void setTopo(const TopoDS_Shape& ashape, bool isVector = false); int getDisplayMode(); void setDisplayMode(int); @@ -133,6 +133,7 @@ class GEOM_OBJECT_EXPORT GEOM_OCCReader : public vtkPolyDataSource { int amode; int nbisos; TopoDS_Shape myShape; + bool myIsVector; }; diff --git a/src/OBJECT/Makefile.am b/src/OBJECT/Makefile.am index db262c7f0..3d3e0dacb 100644 --- a/src/OBJECT/Makefile.am +++ b/src/OBJECT/Makefile.am @@ -38,6 +38,7 @@ salomeinclude_HEADERS = \ Handle_GEOM_InteractiveObject.hxx \ GEOM_AISTrihedron.hxx \ GEOM_VTKTrihedron.hxx \ + GEOM_AISVector.hxx \ GEOM_OBJECT_defs.hxx # Libraries targets @@ -50,7 +51,8 @@ dist_libGEOMObject_la_SOURCES = \ GEOM_AISShape.cxx \ GEOM_InteractiveObject.cxx \ GEOM_AISTrihedron.cxx \ - GEOM_VTKTrihedron.cxx + GEOM_VTKTrihedron.cxx \ + GEOM_AISVector.cxx libGEOMObject_la_CPPFLAGS = \ diff --git a/src/RepairGUI/RepairGUI_GlueDlg.cxx b/src/RepairGUI/RepairGUI_GlueDlg.cxx index 1b2407c42..3c017c410 100644 --- a/src/RepairGUI/RepairGUI_GlueDlg.cxx +++ b/src/RepairGUI/RepairGUI_GlueDlg.cxx @@ -26,6 +26,8 @@ // Module : GEOM // $Header$ +#include "OCCViewer_ViewModel.h" + #include "RepairGUI_GlueDlg.h" #include "DlgRef_1Sel_Ext.h" #include "GEOMImpl_Types.hxx" @@ -46,6 +48,9 @@ #include #include +#include +#include +#include using namespace std; @@ -60,10 +65,12 @@ using namespace std; //================================================================================= RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) - :GEOMBase_Skeleton(theGeometryGUI, parent, name, modal, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +: GEOMBase_Skeleton(theGeometryGUI, parent, name, modal, WStyle_Customize | + WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myCurrConstrId( -1 ) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_GLUE_FACES"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_GLUE_FACES2"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); setCaption(tr("GEOM_GLUE_TITLE")); @@ -71,7 +78,8 @@ RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* paren /***************************************************************/ GroupConstructors->setTitle(tr("GEOM_GLUE_TITLE")); RadioButton1->setPixmap(image0); - RadioButton2->close(TRUE); + RadioButton2->setPixmap(image2); + //RadioButton2->close(TRUE); RadioButton3->close(TRUE); GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); @@ -79,22 +87,51 @@ RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* paren GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); GroupPoints->PushButton1->setPixmap(image1); GroupPoints->LineEdit1->setReadOnly( true ); + + int aWidth = GroupPoints->TextLabel1->sizeHint().width() + + GroupPoints->PushButton1->sizeHint().width() + + GroupPoints->getGroupBoxLayout()->spacing(); Layout1->addWidget(GroupPoints, 2, 0); - QGridLayout* aLay = new QGridLayout( 0, 2, 2, 0, 6, "aLay" ); - QLabel* aLbl1 = new QLabel( tr( "GEOM_TOLERANCE" ), GroupPoints->GroupBox1 ); - myTolEdt = new QtxDblSpinBox( 0, 100, 1e-7, GroupPoints->GroupBox1 ); + QHBox* aHBox = new QHBox( GroupPoints->GroupBox1 ); + aHBox->setSpacing( 5 ); + + (new QLabel( tr( "GEOM_TOLERANCE" ), aHBox ))->setFixedWidth( aWidth ); + myTolEdt = new QtxDblSpinBox( 0, 100, 1e-7, aHBox ); + myTolEdt->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); myTolEdt->setPrecision( 10 ); myTolEdt->setValue( DEFAULT_TOLERANCE_VALUE ); + GroupPoints->getGroupBoxLayout()->addWidget( aHBox, 3, 0 ); + /***************************************************************/ - aLay->addWidget( aLbl1, 0, 0 ); - aLay->addWidget( myTolEdt, 0, 1 ); + GroupPoints2 = new DlgRef_1Sel_Ext(this, "GroupPoints2"); + GroupPoints2->GroupBox1->setTitle(tr("GEOM_GLUE")); + GroupPoints2->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints2->PushButton1->setPixmap(image1); + GroupPoints2->LineEdit1->setReadOnly( true ); + Layout1->addWidget(GroupPoints2, 2, 0); - GroupPoints->getGroupBoxLayout()->addLayout( aLay, 3, 0 ); + QGrid* aGrid = new QGrid( 2, Qt::Horizontal, GroupPoints2->GroupBox1 ); + aGrid->setSpacing( 5 ); + (new QLabel( tr( "GEOM_TOLERANCE" ), aGrid ))->setFixedWidth( aWidth );; + myTolEdt2 = new QtxDblSpinBox( 0, 100, 1e-7, aGrid ); + myTolEdt2->setPrecision( 10 ); + myTolEdt2->setValue( DEFAULT_TOLERANCE_VALUE ); + myTolEdt2->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + (new QLabel( tr( "GLUE_FACES" ), aGrid ))->setFixedWidth( aWidth );; + myDetectBtn = new QPushButton( tr( "GEOM_DETECT" ), aGrid ); + myDetectBtn->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + mySubShapesChk = new QCheckBox( tr( "SELECT_FACES" ), aGrid ); + GroupPoints2->getGroupBoxLayout()->addWidget( aGrid, 3, 0 ); /***************************************************************/ setHelpFileName("glue_faces.htm"); + + // Disable second way of gluing if OCC viewer is not active one + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type()) + RadioButton2->setEnabled(false); Init(); } @@ -121,19 +158,100 @@ void RepairGUI_GlueDlg::Init() myObject = GEOM::GEOM_Object::_nil(); //myGeomGUI->SetState( 0 ); - globalSelection( GEOM_COMPOUND ); + //globalSelection( GEOM_COMPOUND ); /* signals and slots connections */ connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect(GroupPoints2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect( myTolEdt2, SIGNAL( valueChanged( double ) ), this, SLOT( onTolerChanged( double ) ) ); + connect( mySubShapesChk, SIGNAL( stateChanged( int ) ), this, SLOT( onSubShapesChk() ) ); + + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()) ); + + connect(myDetectBtn, SIGNAL(clicked()), this, SLOT(onDetect())); initName( tr( "GLUE_NEW_OBJ_NAME" ) ); + + ConstructorsClicked(0); + + activateSelection(); + updateButtonState(); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void RepairGUI_GlueDlg::ConstructorsClicked( int constructorId ) +{ + if ( myCurrConstrId == constructorId ) + return; + + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch ( constructorId ) + { + case 0: + { + GroupPoints2->hide(); + resize( 0, 0 ); + GroupPoints->show(); + GroupPoints->LineEdit1->setText( "" ); + myEditCurrentArgument = GroupPoints->LineEdit1; + + if ( myCurrConstrId >= 0 ) // i.e. it is not initialisation + { + // copy tolerance from previous tolerance field + myTolEdt->setValue( myTolEdt2->value() ); + } + + break; + } + case 1: + { + GroupPoints->hide(); + resize(0, 0); + GroupPoints2->show(); + GroupPoints->LineEdit1->setText(""); + myEditCurrentArgument = GroupPoints2->LineEdit1; + + if ( myCurrConstrId >= 0 ) // i.e. it is not initialisation + { + // copy tolerance from previous tolerance field + myTolEdt2->setValue( myTolEdt->value() ); + mySubShapesChk->setChecked( false ); + clearTemporary(); + } + + break; + } + } + + myCurrConstrId = constructorId; + + myEditCurrentArgument->setFocus(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + qApp->processEvents(); + updateGeometry(); + QSize aSize = minimumSizeHint(); + resize( width(), aSize.height() ); + + displayPreview(); + updateButtonState(); + activateSelection(); + SelectionIntoArgument(); } @@ -159,10 +277,12 @@ bool RepairGUI_GlueDlg::ClickOnApply() initName(); - GroupPoints->LineEdit1->setText(""); - myObject = GEOM::GEOM_Object::_nil(); + //GroupPoints->LineEdit1->setText(""); + //myObject = GEOM::GEOM_Object::_nil(); - globalSelection( GEOM_COMPOUND ); + //globalSelection( GEOM_COMPOUND ); + + ConstructorsClicked( getConstructorId() ); return true; } @@ -174,6 +294,9 @@ bool RepairGUI_GlueDlg::ClickOnApply() //================================================================================= void RepairGUI_GlueDlg::SelectionIntoArgument() { + if ( mySubShapesChk->isChecked() && getConstructorId() == 1 ) + return; + erasePreview(); myEditCurrentArgument->setText(""); myObject = GEOM::GEOM_Object::_nil(); @@ -185,6 +308,7 @@ void RepairGUI_GlueDlg::SelectionIntoArgument() if ( aRes ) myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); } + updateButtonState(); } //================================================================================= @@ -194,7 +318,7 @@ void RepairGUI_GlueDlg::SelectionIntoArgument() void RepairGUI_GlueDlg::SetEditCurrentArgument() { const QObject* send = sender(); - if ( send == GroupPoints->PushButton1 ) { + if ( send == GroupPoints->PushButton1 || send == GroupPoints2->PushButton1 ) { myEditCurrentArgument->setFocus(); SelectionIntoArgument(); } @@ -212,6 +336,10 @@ void RepairGUI_GlueDlg::LineEditReturnPressed() myEditCurrentArgument = GroupPoints->LineEdit1; GEOMBase_Skeleton::LineEditReturnPressed(); } + else if( send == GroupPoints2->LineEdit1 ) { + myEditCurrentArgument = GroupPoints2->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } } @@ -225,11 +353,13 @@ void RepairGUI_GlueDlg::ActivateThisDialog() connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - GroupPoints->LineEdit1->setText(""); - myObject = GEOM::GEOM_Object::_nil(); + //GroupPoints->LineEdit1->setText(""); + //GroupPoints2->LineEdit1->setText(""); + //myObject = GEOM::GEOM_Object::_nil(); //myGeomGUI->SetState( 0 ); - globalSelection( GEOM_COMPOUND ); + //globalSelection( GEOM_COMPOUND ); + activateSelection(); } @@ -243,7 +373,6 @@ void RepairGUI_GlueDlg::enterEvent(QEvent* e) ActivateThisDialog(); } - //================================================================================= // function : closeEvent() // purpose : @@ -254,6 +383,7 @@ void RepairGUI_GlueDlg::closeEvent(QCloseEvent* e) GEOMBase_Skeleton::closeEvent( e ); } + //================================================================================= // function : createOperation // purpose : @@ -279,15 +409,74 @@ bool RepairGUI_GlueDlg::isValid( QString& msg ) bool RepairGUI_GlueDlg::execute( ObjectList& objects ) { bool aResult = false; - GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow - ( getOperation() )->MakeGlueFaces( myObject, myTolEdt->value() ); - aResult = !anObj->_is_nil(); - if ( aResult ) - objects.push_back( anObj._retn() ); + objects.clear(); + + switch ( getConstructorId() ) + { + case 0 : + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow + ( getOperation() )->MakeGlueFaces( myObject, myTolEdt2->value() ); + aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + break; + } + case 1 : + if ( IsPreview() ) + { + // if this method is used for displaying preview then we must detect glue faces only + ObjectList::iterator anIter; + for (anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter) + objects.push_back( GEOM::GEOM_Object::_duplicate( *anIter ) ); + return myTmpObjs.size() ? true : false; + } // IsPreview + + // Make glue face by list. + // Iterate through myTmpObjs and verifies where each object is currently selected or not. + QMap selected; + + // Get names of selected objects + SALOME_ListIteratorOfListIO it ( selectedIO() ); + for (; it.More(); it.Next()) + selected.insert( it.Value()->getName(), 0 ); + + // Iterate through result and select objects with names from selection + // ObjectList toRemoveFromEnggine; + ObjectList toGlue; + ObjectList::iterator anIter; + for (anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter) + { + if ( selected.contains( myGeomGUI->getApp()->orb()->object_to_string(*anIter) ) ) + toGlue.push_back(*anIter); + } + + // make glue faces + GEOM::ListOfGO_var aListForGlue = new GEOM::ListOfGO(); + aListForGlue->length( toGlue.size() ); + ObjectList::iterator anIter3 = toGlue.begin(); + for ( int i = 0; anIter3 != toGlue.end(); ++anIter3, ++i ) + aListForGlue[ i ] = *anIter3; + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow + ( getOperation() )->MakeGlueFacesByList( myObject, myTolEdt2->value(), aListForGlue ); + + aResult = !anObj->_is_nil(); + + if ( aResult ) + objects.push_back( anObj._retn() ); + + // Remove from engine useless objects + clearTemporary(); + + updateButtonState(); + + break; + } // case return aResult; } + //================================================================ // Function : clearShapeBufferLocal // Purpose : @@ -326,7 +515,7 @@ void RepairGUI_GlueDlg::clearShapeBufferLocal( GEOM::GEOM_Object_ptr theObj ) // It perfroms user input validation, then it // performs a proper operation and manages transactions, etc. //================================================================ -bool RepairGUI_GlueDlg::onAcceptLocal( const bool publish, const bool useTransaction ) +bool RepairGUI_GlueDlg::onAcceptLocal() { if ( !getStudy() || !( getStudy()->studyDS() ) ) return false; @@ -334,76 +523,79 @@ bool RepairGUI_GlueDlg::onAcceptLocal( const bool publish, const bool useTransac _PTR(Study) aStudy = getStudy()->studyDS(); bool aLocked = aStudy->GetProperties()->IsLocked(); - if ( aLocked ) { + if ( aLocked ) + { MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); SUIT_MessageBox::warn1 ( (QWidget*)(SUIT_Session::session()->activeApplication()->desktop()), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED"), - QObject::tr("BUT_OK") ); + QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED"), QObject::tr("BUT_OK") ); return false; } QString msg; - if ( !isValid( msg ) ) { + if ( !isValid( msg ) ) + { showError( msg ); return false; } erasePreview( false ); - try { - if ( ( !publish && !useTransaction ) || openCommand() ) { - + try + { + if ( openCommand() ) + { SUIT_OverrideCursor wc; SUIT_Session::session()->activeApplication()->putInfo( "" ); ObjectList objects; - // JFA 28.12.2004 if ( !execute( objects ) || !getOperation()->IsDone() ) { - if ( !execute( objects ) ) { // JFA 28.12.2004 // To enable warnings - wc.suspend(); + + if ( !execute( objects ) ) + { + wc.suspend(); abortCommand(); - showError(); + showError(); } - else { - const int nbObjs = objects.size(); - bool withChildren = false; - for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { - if ( publish ) { - QString aName(""); - if ( nbObjs > 1 ) - aName = strlen( getNewObjectName() ) ? GEOMBase::GetDefaultName( getNewObjectName() ) : GEOMBase::GetDefaultName( getPrefix( *it ) ); - else { - aName = getNewObjectName(); - // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() - if ( aName.isEmpty() ) - aName = GEOMBase::GetDefaultName( getPrefix( *it ) ); - } - addInStudy( *it, aName.latin1() ); - withChildren = false; - display( *it, false ); - } - else { // asv : fix of PAL6454. If publish==false, then the original shape was modified, and need to be re-cached in GEOM_Client - // before redisplay - clearShapeBufferLocal( *it ); - withChildren = true; - redisplay( *it, withChildren, false ); + else + { + const int nbObjs = objects.size(); + bool withChildren = false; + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) + { + QString aName(""); + if ( nbObjs > 1 ) + { + aName = strlen( getNewObjectName() ) ? GEOMBase::GetDefaultName( getNewObjectName() ) : GEOMBase::GetDefaultName( getPrefix( *it ) ); } - } + else + { + aName = getNewObjectName(); + // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() + if ( aName.isEmpty() ) + aName = GEOMBase::GetDefaultName( getPrefix( *it ) ); + } + addInStudy( *it, aName.latin1() ); + withChildren = false; + display( *it, false ); + } - if ( nbObjs ) { - commitCommand(); - updateObjBrowser(); - SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") ); - } - else { - abortCommand(); + if ( nbObjs ) + { + commitCommand(); + updateObjBrowser(); + SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") ); + } + else + { + abortCommand(); } // JFA 28.12.2004 BEGIN // To enable warnings - if ( !getOperation()->_is_nil() ) { - if ( !getOperation()->IsDone() ) { + if ( !getOperation()->_is_nil() ) + { + if ( !getOperation()->IsDone() ) + { wc.suspend(); - QString msgw = QObject::tr( getOperation()->GetErrorCode() ); + QString msgw = QObject::tr( getOperation()->GetErrorCode() ); SUIT_MessageBox::warn1((QWidget*)(SUIT_Session::session()->activeApplication()->desktop()), QObject::tr( "WRN_WARNING" ), msgw, @@ -414,12 +606,195 @@ bool RepairGUI_GlueDlg::onAcceptLocal( const bool publish, const bool useTransac } } } - catch( const SALOME::SALOME_Exception& e ) { + catch( const SALOME::SALOME_Exception& e ) + { SalomeApp_Tools::QtCatchCorbaException( e ); abortCommand(); } updateViewer(); + activateSelection(); + updateButtonState(); return true; } + + +//================================================================================= +// function : onDetect +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::onDetect() +{ + clearTemporary(); + QString msg; + if ( !isValid( msg ) ) { + showError( msg ); + return; + } + + GEOM::ListOfGO_var aList = GEOM::GEOM_IShapesOperations::_narrow + ( getOperation() )->GetGlueFaces( myObject, myTolEdt2->value() ); + + for (int i = 0, n = aList->length(); i < n; i++) + myTmpObjs.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + + if ( myTmpObjs.size() > 0 ) + { + msg = tr( "FACES_FOR_GLUING_ARE_DETECTED" ).arg( myTmpObjs.size() ); + mySubShapesChk->setChecked( true ); + } + else + { + msg = tr( "THERE_ARE_NO_FACES_FOR_GLUING" ); + } + + SUIT_MessageBox::info1( this, tr( "GEOM_FREE_BOUNDS_TLT" ), msg, "Close" ); + updateButtonState(); + activateSelection(); +} + +//================================================================================= +// function : activateSelection +// purpose : Redisplay preview and Activate selection +//================================================================================= +void RepairGUI_GlueDlg::activateSelection() +{ + erasePreview(false); + + int anId = getConstructorId(); + if ( anId == 0 ) // Case of whole gluing + { + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()) ) ; + + globalSelection( GEOM_ALLSHAPES ); + if (myObject->_is_nil()) + SelectionIntoArgument(); + + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()) ) ; + } + else // Second case of gluing + { + if ( !mySubShapesChk->isChecked() ) + globalSelection( GEOM_ALLSHAPES ); + else + { + displayPreview( true, false, false, 2/*line width*/, 1/*display mode*/, Quantity_NOC_RED ); + globalSelection( GEOM_PREVIEW ); + } + } + + updateViewer(); +} + +//================================================================================= +// function : updateButtonState +// purpose : Update button state +//================================================================================= +void RepairGUI_GlueDlg::updateButtonState() +{ + int anId = getConstructorId(); + bool hasMainObj = !myObject->_is_nil(); + if ( anId == 0 ) + { + buttonOk->setEnabled( hasMainObj ); + buttonApply->setEnabled( hasMainObj ); + } + else + { + bool wasDetected = myTmpObjs.size() ? true : false; + buttonOk->setEnabled( hasMainObj && wasDetected ); + buttonApply->setEnabled( hasMainObj && wasDetected ); + mySubShapesChk->setEnabled( hasMainObj && wasDetected ); + myDetectBtn->setEnabled( hasMainObj ); + if ( !hasMainObj || !wasDetected ) + mySubShapesChk->setChecked( false ); + } +} + +//================================================================================= +// function : clearTemporary +// purpose : Remove temporary objects from engine +//================================================================================= +void RepairGUI_GlueDlg::clearTemporary() +{ + ObjectList::iterator anIter; + for (anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter) + getGeomEngine()->RemoveObject(*anIter); + + myTmpObjs.clear(); +} + +//================================================================================= +// function : onTolerChanged +// purpose : Remove temporary objects from engine +//================================================================================= +void RepairGUI_GlueDlg::onTolerChanged( double /*theVal*/ ) +{ + clearTemporary(); + activateSelection(); + updateButtonState(); +} + +//================================================================================= +// function : onSubShapesChk +// purpose : Update selection mode +//================================================================================= +void RepairGUI_GlueDlg::onSubShapesChk() +{ + if ( !mySubShapesChk->isChecked() ) + clearTemporary(); + activateSelection(); + updateButtonState(); +} + +//================================================================================= +// function : ClickOnCancel +// purpose : Remove temporary objects from engine and call method of base class +//================================================================================= +void RepairGUI_GlueDlg::ClickOnCancel() +{ + clearTemporary(); + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================ +// Function : getEntry +// Purpose : +//================================================================ +static string getEntry( GEOM::GEOM_Object_ptr object ) +{ + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( app ) + { + string IOR = app->orb()->object_to_string( object ); + if ( IOR != "" ) + { + SalomeApp_Study* study = ( SalomeApp_Study* )app->activeStudy(); + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); + if ( SO ) + return SO->GetID(); + } + } + return ""; +} + + + + + + + + + + + + + + + + + diff --git a/src/RepairGUI/RepairGUI_GlueDlg.h b/src/RepairGUI/RepairGUI_GlueDlg.h index e23ff3ff2..eef24c2ca 100644 --- a/src/RepairGUI/RepairGUI_GlueDlg.h +++ b/src/RepairGUI/RepairGUI_GlueDlg.h @@ -32,6 +32,7 @@ class QtxDblSpinBox; class DlgRef_1Sel_Ext; +class QCheckBox; //================================================================================= // class : RepairGUI_GlueDlg @@ -42,8 +43,8 @@ class RepairGUI_GlueDlg : public GEOMBase_Skeleton Q_OBJECT public: - RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* parent = 0, - const char* name = 0, bool modal = FALSE, WFlags fl = 0); + RepairGUI_GlueDlg( GeometryGUI* theGeometryGUI, QWidget* parent = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); ~RepairGUI_GlueDlg(); protected: @@ -57,16 +58,34 @@ private: void enterEvent(QEvent* e); void closeEvent(QCloseEvent* e); void initSelection(); + + void clearTemporary(); - bool onAcceptLocal( const bool publish = true, const bool useTransaction = true ); + bool onAcceptLocal(); void clearShapeBufferLocal( GEOM::GEOM_Object_ptr ); // Reimplementation of onAccept for local case of this class. - + + void activateSelection(); + void updateButtonState(); + void selectTmpInViewer(); + +private: + GEOM::GEOM_Object_var myObject; - + ObjectList myTmpObjs; + DlgRef_1Sel_Ext* GroupPoints; + DlgRef_1Sel_Ext* GroupPoints2; QtxDblSpinBox* myTolEdt; + QtxDblSpinBox* myTolEdt2; + QPushButton* myDetectBtn; + QCheckBox* mySubShapesChk; + int myCurrConstrId; + +protected slots: + virtual void ClickOnCancel(); + private slots: void ClickOnOk(); bool ClickOnApply(); @@ -76,6 +95,13 @@ private slots: void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + + void ConstructorsClicked(int); + //void ValueChangedInSpinBox(); + + void onDetect(); + void onTolerChanged( double ); + void onSubShapesChk(); }; #endif // DIALOGBOX_Glue_H