From 7b45e8210edee224ee8f783feb422cd2113637be Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 28 Dec 2005 09:13:00 +0000 Subject: [PATCH] This commit was generated by cvs2git to create branch 'BR-D5-38-2003'. Cherrypick from master 2005-12-28 09:12:58 UTC jfa 'Join modifications from branch BR_3_1_0deb': INSTALL adm_local/unix/make_commence.in bin/VERSION build_configure doc/Makefile.in doc/salome/GEOM_index_v3.1.0.html doc/salome/Makefile.in doc/salome/gui/GEOM/add_point_on_edge.htm doc/salome/gui/GEOM/arc.htm doc/salome/gui/GEOM/archimede.htm doc/salome/gui/GEOM/basic_geometrical_objects.htm doc/salome/gui/GEOM/basic_operations.htm doc/salome/gui/GEOM/blocks_operations.htm doc/salome/gui/GEOM/boolean_operations.htm doc/salome/gui/GEOM/box.htm doc/salome/gui/GEOM/building_by_blocks.htm doc/salome/gui/GEOM/chamfer.htm doc/salome/gui/GEOM/changing_display_parameters.htm doc/salome/gui/GEOM/changing_displaying_parameters.htm doc/salome/gui/GEOM/check_free_boundaries.htm doc/salome/gui/GEOM/check_free_faces.htm doc/salome/gui/GEOM/circle.htm doc/salome/gui/GEOM/close_contour.htm doc/salome/gui/GEOM/common.htm doc/salome/gui/GEOM/complex_objects.htm doc/salome/gui/GEOM/compound.htm doc/salome/gui/GEOM/cone.htm doc/salome/gui/GEOM/curve.htm doc/salome/gui/GEOM/cut.htm doc/salome/gui/GEOM/cylinder.htm doc/salome/gui/GEOM/edge.htm doc/salome/gui/GEOM/ellipse.htm doc/salome/gui/GEOM/explode.htm doc/salome/gui/GEOM/explode_on_blocks.htm doc/salome/gui/GEOM/extrusion.htm doc/salome/gui/GEOM/face.htm doc/salome/gui/GEOM/files/salome2_sp3_basicgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_booleangui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_buildgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_generationgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_geomtoolsgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_measuregui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_operationgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_primitivegui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_repairgui_functions.htm doc/salome/gui/GEOM/files/salome2_sp3_transformationgui_functions.htm doc/salome/gui/GEOM/fillet.htm doc/salome/gui/GEOM/filling.htm doc/salome/gui/GEOM/fuse.htm doc/salome/gui/GEOM/geom.log doc/salome/gui/GEOM/geometrical_objects.htm doc/salome/gui/GEOM/geompy_doc/GEOM__TestMeasures_8py.html doc/salome/gui/GEOM/geompy_doc/doxygen.css doc/salome/gui/GEOM/geompy_doc/doxygen.png doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.jpg doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.map doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.md5 doc/salome/gui/GEOM/geompy_doc/namespaceGEOM__TestMeasures.html doc/salome/gui/GEOM/geompy_doc/namespacegeompy.html doc/salome/gui/GEOM/glue_faces.htm doc/salome/gui/GEOM/groups.htm doc/salome/gui/GEOM/image10.gif doc/salome/gui/GEOM/image27.gif doc/salome/gui/GEOM/image3.gif doc/salome/gui/GEOM/line.htm doc/salome/gui/GEOM/local_coordinate_system.htm doc/salome/gui/GEOM/measurement_tools.htm doc/salome/gui/GEOM/mirror_image.htm doc/salome/gui/GEOM/modify_the_location.htm doc/salome/gui/GEOM/multi_rotation.htm doc/salome/gui/GEOM/multi_transformation.htm doc/salome/gui/GEOM/multi_translation.htm doc/salome/gui/GEOM/newentity_blocks.htm doc/salome/gui/GEOM/offset_surface.htm doc/salome/gui/GEOM/partition.htm doc/salome/gui/GEOM/pics/arc.png doc/salome/gui/GEOM/pics/archimede.png doc/salome/gui/GEOM/pics/archimedesn1.png doc/salome/gui/GEOM/pics/archimedesn2.png doc/salome/gui/GEOM/pics/archimedesn3.png doc/salome/gui/GEOM/pics/arcsn.png doc/salome/gui/GEOM/pics/bezier.png doc/salome/gui/GEOM/pics/block1.png doc/salome/gui/GEOM/pics/block2.png doc/salome/gui/GEOM/pics/block3.png doc/salome/gui/GEOM/pics/block4.png doc/salome/gui/GEOM/pics/block5.png doc/salome/gui/GEOM/pics/block_explodesn.png doc/salome/gui/GEOM/pics/bool1.png doc/salome/gui/GEOM/pics/bool2.png doc/salome/gui/GEOM/pics/bool3.png doc/salome/gui/GEOM/pics/box1.png doc/salome/gui/GEOM/pics/box2.png doc/salome/gui/GEOM/pics/boxes.png doc/salome/gui/GEOM/pics/chamfer1.png doc/salome/gui/GEOM/pics/chamfer2.png doc/salome/gui/GEOM/pics/chamfer3.png doc/salome/gui/GEOM/pics/chamfer_all.png doc/salome/gui/GEOM/pics/chamfer_edge.png doc/salome/gui/GEOM/pics/chamfer_faces.png doc/salome/gui/GEOM/pics/circle1.png doc/salome/gui/GEOM/pics/circle2.png doc/salome/gui/GEOM/pics/circles.png doc/salome/gui/GEOM/pics/colorsn.png doc/salome/gui/GEOM/pics/commonsn.png doc/salome/gui/GEOM/pics/compoundsn.png doc/salome/gui/GEOM/pics/cone1.png doc/salome/gui/GEOM/pics/cone2.png doc/salome/gui/GEOM/pics/cones.png doc/salome/gui/GEOM/pics/creategroup.png doc/salome/gui/GEOM/pics/curve.png doc/salome/gui/GEOM/pics/cutsn.png doc/salome/gui/GEOM/pics/cylinder1.png doc/salome/gui/GEOM/pics/cylinder2.png doc/salome/gui/GEOM/pics/cylinders.png doc/salome/gui/GEOM/pics/disp_mode1sn.png doc/salome/gui/GEOM/pics/disp_mode2sn.png doc/salome/gui/GEOM/pics/distance.png doc/salome/gui/GEOM/pics/edgesn.png doc/salome/gui/GEOM/pics/editgroup.png doc/salome/gui/GEOM/pics/ellipse.png doc/salome/gui/GEOM/pics/ellipsesn.png doc/salome/gui/GEOM/pics/export.png doc/salome/gui/GEOM/pics/extrusion.png doc/salome/gui/GEOM/pics/facesn1.png doc/salome/gui/GEOM/pics/facesn2.png doc/salome/gui/GEOM/pics/facesn3.png doc/salome/gui/GEOM/pics/fillet1.png doc/salome/gui/GEOM/pics/fillet2.png doc/salome/gui/GEOM/pics/fillet3.png doc/salome/gui/GEOM/pics/fillet_all.png doc/salome/gui/GEOM/pics/fillet_edge.png doc/salome/gui/GEOM/pics/fillet_prism.png doc/salome/gui/GEOM/pics/filling.png doc/salome/gui/GEOM/pics/filling_compoundsn.png doc/salome/gui/GEOM/pics/fillingsn.png doc/salome/gui/GEOM/pics/free_boudaries1.png doc/salome/gui/GEOM/pics/free_boudaries2.png doc/salome/gui/GEOM/pics/free_faces1.png doc/salome/gui/GEOM/pics/free_faces2.png doc/salome/gui/GEOM/pics/fusesn1.png doc/salome/gui/GEOM/pics/fusesn2.png doc/salome/gui/GEOM/pics/glue_faces1.png doc/salome/gui/GEOM/pics/glue_faces2.png doc/salome/gui/GEOM/pics/import.png doc/salome/gui/GEOM/pics/interpol.png doc/salome/gui/GEOM/pics/isos_u12_v12sn.png doc/salome/gui/GEOM/pics/line.png doc/salome/gui/GEOM/pics/lines.png doc/salome/gui/GEOM/pics/measures1.png doc/salome/gui/GEOM/pics/measures10.png doc/salome/gui/GEOM/pics/measures3.png doc/salome/gui/GEOM/pics/measures4.png doc/salome/gui/GEOM/pics/measures5.png doc/salome/gui/GEOM/pics/measures8.png doc/salome/gui/GEOM/pics/measures9.png doc/salome/gui/GEOM/pics/mirror_axissn1.png doc/salome/gui/GEOM/pics/mirror_axissn2.png doc/salome/gui/GEOM/pics/mirror_planesn1.png doc/salome/gui/GEOM/pics/mirror_planesn2.png doc/salome/gui/GEOM/pics/mirror_pointsn1.png doc/salome/gui/GEOM/pics/mirror_pointsn2.png doc/salome/gui/GEOM/pics/mtrans1.png doc/salome/gui/GEOM/pics/mtrans2.png doc/salome/gui/GEOM/pics/mtransf1.png doc/salome/gui/GEOM/pics/mtransf2.png doc/salome/gui/GEOM/pics/mtransf3.png doc/salome/gui/GEOM/pics/mtransf4.png doc/salome/gui/GEOM/pics/multi_rotation1d1.png doc/salome/gui/GEOM/pics/multi_rotation1d2.png doc/salome/gui/GEOM/pics/multi_rotation2d1.png doc/salome/gui/GEOM/pics/multi_rotation2d2.png doc/salome/gui/GEOM/pics/multi_transformationsn1d.png doc/salome/gui/GEOM/pics/multi_transformationsn2d.png doc/salome/gui/GEOM/pics/multi_translation1dsn.png doc/salome/gui/GEOM/pics/multi_translation2dsn.png doc/salome/gui/GEOM/pics/multi_translation_initialsn.png doc/salome/gui/GEOM/pics/neo-basicprop.png doc/salome/gui/GEOM/pics/neo-detect2.png doc/salome/gui/GEOM/pics/neo-isos.png doc/salome/gui/GEOM/pics/neo-localcs1.png doc/salome/gui/GEOM/pics/neo-localcs2.png doc/salome/gui/GEOM/pics/neo-localcs3.png doc/salome/gui/GEOM/pics/neo-materials.png doc/salome/gui/GEOM/pics/neo-mrot1.png doc/salome/gui/GEOM/pics/neo-mrot2.png doc/salome/gui/GEOM/pics/neo-obj1.png doc/salome/gui/GEOM/pics/neo-obj2.png doc/salome/gui/GEOM/pics/neo-obj3.png doc/salome/gui/GEOM/pics/neo-obj4.png doc/salome/gui/GEOM/pics/neo-obj5.png doc/salome/gui/GEOM/pics/neo-obj6.png doc/salome/gui/GEOM/pics/neo-obj7.png doc/salome/gui/GEOM/pics/neo-point2.png doc/salome/gui/GEOM/pics/neo-scetcher1.png doc/salome/gui/GEOM/pics/neo-scetcher2.png doc/salome/gui/GEOM/pics/neo-section.png doc/salome/gui/GEOM/pics/neo-transparency.png doc/salome/gui/GEOM/pics/new-tolerance.png doc/salome/gui/GEOM/pics/offsetsn.png doc/salome/gui/GEOM/pics/partition1.png doc/salome/gui/GEOM/pics/partition2.png doc/salome/gui/GEOM/pics/partitionsn1.png doc/salome/gui/GEOM/pics/partitionsn2.png doc/salome/gui/GEOM/pics/pipe.png doc/salome/gui/GEOM/pics/pipe_wire_edgesn.png doc/salome/gui/GEOM/pics/pipesn.png doc/salome/gui/GEOM/pics/plane1.png doc/salome/gui/GEOM/pics/plane2.png doc/salome/gui/GEOM/pics/plane3.png doc/salome/gui/GEOM/pics/plane_on_face.png doc/salome/gui/GEOM/pics/planes1.png doc/salome/gui/GEOM/pics/point1.png doc/salome/gui/GEOM/pics/point3.png doc/salome/gui/GEOM/pics/points.png doc/salome/gui/GEOM/pics/polyline.png doc/salome/gui/GEOM/pics/prisms_basessn.png doc/salome/gui/GEOM/pics/prismssn.png doc/salome/gui/GEOM/pics/repair1.png doc/salome/gui/GEOM/pics/repair10.png doc/salome/gui/GEOM/pics/repair2.png doc/salome/gui/GEOM/pics/repair3.png doc/salome/gui/GEOM/pics/repair4.png doc/salome/gui/GEOM/pics/repair5.png doc/salome/gui/GEOM/pics/repair6.png doc/salome/gui/GEOM/pics/repair7.png doc/salome/gui/GEOM/pics/repair8.png doc/salome/gui/GEOM/pics/repair9.png doc/salome/gui/GEOM/pics/revolution.png doc/salome/gui/GEOM/pics/revolutionsn.png doc/salome/gui/GEOM/pics/rotationsn1.png doc/salome/gui/GEOM/pics/rotationsn2.png doc/salome/gui/GEOM/pics/scale_transformsn1.png doc/salome/gui/GEOM/pics/scale_transformsn2.png doc/salome/gui/GEOM/pics/sectionsn.png doc/salome/gui/GEOM/pics/shellsn.png doc/salome/gui/GEOM/pics/solidsn.png doc/salome/gui/GEOM/pics/sphere1.png doc/salome/gui/GEOM/pics/sphere2.png doc/salome/gui/GEOM/pics/spheres.png doc/salome/gui/GEOM/pics/supp_int_wires1.png doc/salome/gui/GEOM/pics/supp_int_wires2.png doc/salome/gui/GEOM/pics/suppress_faces1.png doc/salome/gui/GEOM/pics/suppress_faces2.png doc/salome/gui/GEOM/pics/torus1.png doc/salome/gui/GEOM/pics/torus2.png doc/salome/gui/GEOM/pics/toruses.png doc/salome/gui/GEOM/pics/transformation1.png doc/salome/gui/GEOM/pics/transformation10.png doc/salome/gui/GEOM/pics/transformation11.png doc/salome/gui/GEOM/pics/transformation2.png doc/salome/gui/GEOM/pics/transformation3.png doc/salome/gui/GEOM/pics/transformation4.png doc/salome/gui/GEOM/pics/transformation5.png doc/salome/gui/GEOM/pics/transformation6.png doc/salome/gui/GEOM/pics/transformation7.png doc/salome/gui/GEOM/pics/transformation8.png doc/salome/gui/GEOM/pics/transformation9.png doc/salome/gui/GEOM/pics/translationsn1.png doc/salome/gui/GEOM/pics/translationsn2.png doc/salome/gui/GEOM/pics/transparencysn.png doc/salome/gui/GEOM/pics/vector1.png doc/salome/gui/GEOM/pics/vector2.png doc/salome/gui/GEOM/pics/vectors.png doc/salome/gui/GEOM/pics/wiresn.png doc/salome/gui/GEOM/pics/workplane4.png doc/salome/gui/GEOM/pics/workplane5.png doc/salome/gui/GEOM/pics/workplane6.png doc/salome/gui/GEOM/pipe_creation.htm doc/salome/gui/GEOM/plane.htm doc/salome/gui/GEOM/point.htm doc/salome/gui/GEOM/primitives.htm doc/salome/gui/GEOM/propagate.htm doc/salome/gui/GEOM/repairing_operations.htm doc/salome/gui/GEOM/revolution.htm doc/salome/gui/GEOM/rotation.htm doc/salome/gui/GEOM/scale_transform.htm doc/salome/gui/GEOM/section.htm doc/salome/gui/GEOM/sewing.htm doc/salome/gui/GEOM/shape_processing.htm doc/salome/gui/GEOM/shell.htm doc/salome/gui/GEOM/sketcher.htm doc/salome/gui/GEOM/sketcher_tui.htm doc/salome/gui/GEOM/solid.htm doc/salome/gui/GEOM/sphere.htm doc/salome/gui/GEOM/suppress_faces.htm doc/salome/gui/GEOM/suppress_holes.htm doc/salome/gui/GEOM/suppress_internal_wires.htm doc/salome/gui/GEOM/transformation_operations.htm doc/salome/gui/GEOM/translation.htm doc/salome/gui/GEOM/turus.htm doc/salome/gui/GEOM/vector.htm doc/salome/gui/GEOM/whdata/whftdata0.htm doc/salome/gui/GEOM/whdata/whfts.htm doc/salome/gui/GEOM/whdata/whfwdata0.htm doc/salome/gui/GEOM/whdata/whtdata0.htm doc/salome/gui/GEOM/whgdata/whlstf0.htm doc/salome/gui/GEOM/whgdata/whlstf1.htm doc/salome/gui/GEOM/whgdata/whlstf10.htm doc/salome/gui/GEOM/whgdata/whlstf11.htm doc/salome/gui/GEOM/whgdata/whlstf12.htm doc/salome/gui/GEOM/whgdata/whlstf13.htm doc/salome/gui/GEOM/whgdata/whlstf14.htm doc/salome/gui/GEOM/whgdata/whlstf2.htm doc/salome/gui/GEOM/whgdata/whlstf3.htm doc/salome/gui/GEOM/whgdata/whlstf4.htm doc/salome/gui/GEOM/whgdata/whlstf5.htm doc/salome/gui/GEOM/whgdata/whlstf6.htm doc/salome/gui/GEOM/whgdata/whlstf7.htm doc/salome/gui/GEOM/whgdata/whlstf8.htm doc/salome/gui/GEOM/whgdata/whlstf9.htm doc/salome/gui/GEOM/whgdata/whlstfl0.htm doc/salome/gui/GEOM/whgdata/whlstfl10.htm doc/salome/gui/GEOM/whgdata/whlstfl11.htm doc/salome/gui/GEOM/whgdata/whlstfl12.htm doc/salome/gui/GEOM/whgdata/whlstfl13.htm doc/salome/gui/GEOM/whgdata/whlstfl14.htm doc/salome/gui/GEOM/whgdata/whlstfl15.htm doc/salome/gui/GEOM/whgdata/whlstfl16.htm doc/salome/gui/GEOM/whgdata/whlstfl17.htm doc/salome/gui/GEOM/whgdata/whlstfl18.htm doc/salome/gui/GEOM/whgdata/whlstfl19.htm doc/salome/gui/GEOM/whgdata/whlstfl2.htm doc/salome/gui/GEOM/whgdata/whlstfl20.htm doc/salome/gui/GEOM/whgdata/whlstfl21.htm doc/salome/gui/GEOM/whgdata/whlstfl22.htm doc/salome/gui/GEOM/whgdata/whlstfl23.htm doc/salome/gui/GEOM/whgdata/whlstfl24.htm doc/salome/gui/GEOM/whgdata/whlstfl25.htm doc/salome/gui/GEOM/whgdata/whlstfl3.htm doc/salome/gui/GEOM/whgdata/whlstfl4.htm doc/salome/gui/GEOM/whgdata/whlstfl5.htm doc/salome/gui/GEOM/whgdata/whlstfl6.htm doc/salome/gui/GEOM/whgdata/whlstfl7.htm doc/salome/gui/GEOM/whgdata/whlstfl8.htm doc/salome/gui/GEOM/whgdata/whlstfl9.htm doc/salome/gui/GEOM/whgdata/whlstt1.htm doc/salome/gui/GEOM/whgdata/whlstt10.htm doc/salome/gui/GEOM/whgdata/whlstt11.htm doc/salome/gui/GEOM/whgdata/whlstt12.htm doc/salome/gui/GEOM/whgdata/whlstt13.htm doc/salome/gui/GEOM/whgdata/whlstt14.htm doc/salome/gui/GEOM/whgdata/whlstt15.htm doc/salome/gui/GEOM/whgdata/whlstt16.htm doc/salome/gui/GEOM/whgdata/whlstt2.htm doc/salome/gui/GEOM/whgdata/whlstt3.htm doc/salome/gui/GEOM/whgdata/whlstt4.htm doc/salome/gui/GEOM/whgdata/whlstt5.htm doc/salome/gui/GEOM/whgdata/whlstt6.htm doc/salome/gui/GEOM/whgdata/whlstt7.htm doc/salome/gui/GEOM/whgdata/whlstt8.htm doc/salome/gui/GEOM/whgdata/whlstt9.htm doc/salome/gui/GEOM/whgdata/whnvl32.htm doc/salome/gui/GEOM/whskin_info.htm doc/salome/gui/GEOM/whxdata/whftdata0.xml doc/salome/gui/GEOM/whxdata/whfts.xml doc/salome/gui/GEOM/whxdata/whfwdata0.xml doc/salome/gui/GEOM/whxdata/whtdata0.xml doc/salome/gui/GEOM/wire.htm doc/salome/gui/GEOM/working_plane.htm doc/salome/gui/GEOM/working_with_groups.htm doc/salome/tui/GEOM/doxyfile doc/salome/tui/GEOM/doxyfile_py doc/salome/tui/GEOM/sources/static/tree.js idl/GEOM_Gen.idl resources/GEOMCatalog.xml src/BREPExport/BREPExport.cxx src/BREPImport/BREPImport.cxx src/BasicGUI/BasicGUI_ArcDlg.cxx src/BasicGUI/BasicGUI_CircleDlg.cxx src/BasicGUI/BasicGUI_CurveDlg.cxx src/BasicGUI/BasicGUI_EllipseDlg.cxx src/BasicGUI/BasicGUI_LineDlg.cxx src/BasicGUI/BasicGUI_MarkerDlg.cxx src/BasicGUI/BasicGUI_PlaneDlg.cxx src/BasicGUI/BasicGUI_PointDlg.cxx src/BasicGUI/BasicGUI_VectorDlg.cxx src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx src/BlocksGUI/BlocksGUI_BlockDlg.cxx src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx src/BlocksGUI/BlocksGUI_PropagateDlg.cxx src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx src/BlocksGUI/BlocksGUI_TrsfDlg.cxx src/BooleanGUI/BooleanGUI_Dialog.cxx src/BuildGUI/BuildGUI_CompoundDlg.cxx src/BuildGUI/BuildGUI_EdgeDlg.cxx src/BuildGUI/BuildGUI_FaceDlg.cxx src/BuildGUI/BuildGUI_ShellDlg.cxx src/BuildGUI/BuildGUI_SolidDlg.cxx src/BuildGUI/BuildGUI_WireDlg.cxx src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx src/DlgRef/DlgRef_1Sel1Check1List_QTD.h src/DlgRef/DlgRef_1Sel1Check_QTD.cxx src/DlgRef/DlgRef_1Sel1Check_QTD.h src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx src/DlgRef/DlgRef_1Sel1Spin_QTD.h src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx src/DlgRef/DlgRef_1Sel2Spin_QTD.h src/DlgRef/DlgRef_1Sel3Check_QTD.cxx src/DlgRef/DlgRef_1Sel3Check_QTD.h src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx src/DlgRef/DlgRef_1Sel3Spin_QTD.h src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx src/DlgRef/DlgRef_1Sel4Spin_QTD.h src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx src/DlgRef/DlgRef_1Sel5Spin_QTD.h src/DlgRef/DlgRef_1Sel_Ext.h src/DlgRef/DlgRef_1Sel_QTD.cxx src/DlgRef/DlgRef_1Sel_QTD.h src/DlgRef/DlgRef_1Spin_QTD.cxx src/DlgRef/DlgRef_1Spin_QTD.h src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.cxx src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx src/DlgRef/DlgRef_2Sel1Spin_QTD.h src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx src/DlgRef/DlgRef_2Sel2Spin_QTD.h src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx src/DlgRef/DlgRef_2Sel3Spin_QTD.h src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h src/DlgRef/DlgRef_2Sel_QTD.cxx src/DlgRef/DlgRef_2Sel_QTD.h src/DlgRef/DlgRef_2Spin_QTD.cxx src/DlgRef/DlgRef_2Spin_QTD.h src/DlgRef/DlgRef_3Check_QTD.cxx src/DlgRef/DlgRef_3Check_QTD.h src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h src/DlgRef/DlgRef_3Sel_QTD.cxx src/DlgRef/DlgRef_3Sel_QTD.h src/DlgRef/DlgRef_3Spin1Check_QTD.cxx src/DlgRef/DlgRef_3Spin1Check_QTD.h src/DlgRef/DlgRef_3Spin_QTD.cxx src/DlgRef/DlgRef_3Spin_QTD.h src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx src/DlgRef/DlgRef_4Sel1List1Check_QTD.h src/DlgRef/DlgRef_4Sel1List_QTD.cxx src/DlgRef/DlgRef_4Sel1List_QTD.h src/DlgRef/DlgRef_6Sel_QTD.cxx src/DlgRef/DlgRef_6Sel_QTD.h src/DlgRef/DlgRef_Skeleton_QTD.cxx src/DlgRef/DlgRef_Skeleton_QTD.h src/DlgRef/UIFiles/ui_to_cxx src/EntityGUI/EntityGUI.cxx src/EntityGUI/EntityGUI_1Sel_QTD.cxx src/EntityGUI/EntityGUI_1Sel_QTD.h src/EntityGUI/EntityGUI_1Spin_QTD.cxx src/EntityGUI/EntityGUI_1Spin_QTD.h src/EntityGUI/EntityGUI_2Spin_QTD.cxx src/EntityGUI/EntityGUI_2Spin_QTD.h src/EntityGUI/EntityGUI_3Spin_QTD.cxx src/EntityGUI/EntityGUI_3Spin_QTD.h src/EntityGUI/EntityGUI_4Spin_QTD.cxx src/EntityGUI/EntityGUI_4Spin_QTD.h src/EntityGUI/EntityGUI_Dir1_QTD.cxx src/EntityGUI/EntityGUI_Dir1_QTD.h src/EntityGUI/EntityGUI_Dir2_QTD.cxx src/EntityGUI/EntityGUI_Dir2_QTD.h src/EntityGUI/EntityGUI_Point_QTD.cxx src/EntityGUI/EntityGUI_Point_QTD.h src/EntityGUI/EntityGUI_Skeleton_QTD.cxx src/EntityGUI/EntityGUI_Skeleton_QTD.h src/EntityGUI/EntityGUI_SketcherDlg.cxx src/EntityGUI/EntityGUI_SubShapeDlg.cxx src/EntityGUI/UIFiles/ui_to_cxx src/GEOM/GEOM_Application.cxx src/GEOM/GEOM_Application.hxx src/GEOM/GEOM_Application.ixx src/GEOM/GEOM_Application.jxx src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx src/GEOM/GEOM_DataMapOfAsciiStringTransient.hxx src/GEOM/GEOM_DataMapOfAsciiStringTransient_0.cxx src/GEOM/GEOM_Engine.cxx src/GEOM/GEOM_Engine.hxx src/GEOM/GEOM_Function.cxx src/GEOM/GEOM_Function.hxx src/GEOM/GEOM_IOperations.cxx src/GEOM/GEOM_IOperations.hxx src/GEOM/GEOM_ISubShape.hxx src/GEOM/GEOM_Object.cxx src/GEOM/GEOM_Object.hxx src/GEOM/GEOM_PythonDump.cxx src/GEOM/GEOM_PythonDump.hxx src/GEOM/GEOM_Solver.cxx src/GEOM/GEOM_Solver.hxx src/GEOM/GEOM_SubShapeDriver.cxx src/GEOM/GEOM_SubShapeDriver.hxx src/GEOM/Handle_GEOM_Application.hxx src/GEOM/Makefile.in src/GEOMAlgo/BlockFix.cdl src/GEOMAlgo/BlockFix.cxx src/GEOMAlgo/BlockFix.jxx src/GEOMAlgo/BlockFix_BlockFixAPI.cdl src/GEOMAlgo/BlockFix_BlockFixAPI.cxx src/GEOMAlgo/BlockFix_BlockFixAPI.jxx src/GEOMAlgo/BlockFix_BlockFixAPI.lxx src/GEOMAlgo/BlockFix_CheckTool.cdl src/GEOMAlgo/BlockFix_CheckTool.cxx src/GEOMAlgo/BlockFix_CheckTool.jxx src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.cdl src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.cxx src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.jxx src/GEOMAlgo/BlockFix_SphereSpaceModifier.cdl src/GEOMAlgo/BlockFix_SphereSpaceModifier.cxx src/GEOMAlgo/BlockFix_SphereSpaceModifier.jxx src/GEOMAlgo/BlockFix_UnionEdges.cdl src/GEOMAlgo/BlockFix_UnionEdges.cxx src/GEOMAlgo/BlockFix_UnionEdges.jxx src/GEOMAlgo/BlockFix_UnionFaces.cdl src/GEOMAlgo/BlockFix_UnionFaces.cxx src/GEOMAlgo/BlockFix_UnionFaces.jxx src/GEOMAlgo/GEOMAlgo.cdl src/GEOMAlgo/GEOMAlgo_Algo.cdl src/GEOMAlgo/GEOMAlgo_Algo.cxx src/GEOMAlgo/GEOMAlgo_Algo.jxx src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.jxx src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx src/GEOMAlgo/GEOMAlgo_Gluer.cdl src/GEOMAlgo/GEOMAlgo_Gluer.cxx src/GEOMAlgo/GEOMAlgo_Gluer.jxx src/GEOMAlgo/GEOMAlgo_PassKey.cdl src/GEOMAlgo/GEOMAlgo_PassKey.cxx src/GEOMAlgo/GEOMAlgo_PassKey.jxx src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.jxx src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx src/GEOMAlgo/GEOMAlgo_ShapeAlgo.jxx src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx src/GEOMAlgo/GEOMAlgo_SolidSolid.jxx src/GEOMAlgo/GEOMAlgo_StateCollector.cdl src/GEOMAlgo/GEOMAlgo_StateCollector.cxx src/GEOMAlgo/GEOMAlgo_StateCollector.jxx src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx src/GEOMAlgo/GEOMAlgo_Tools.cdl src/GEOMAlgo/GEOMAlgo_Tools.cxx src/GEOMAlgo/GEOMAlgo_Tools.jxx src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx src/GEOMAlgo/GEOMAlgo_WireSolid.cdl src/GEOMAlgo/GEOMAlgo_WireSolid.cxx src/GEOMAlgo/GEOMAlgo_WireSolid.jxx src/GEOMAlgo/Makefile.in src/GEOMBase/GEOMBase.cxx src/GEOMBase/GEOMBase_Helper.cxx src/GEOMBase/GEOMBase_Skeleton.cxx src/GEOMBase/Makefile.in src/GEOMClient/Makefile.in src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx src/GEOMFiltersSelection/GEOM_EdgeFilter.h src/GEOMFiltersSelection/GEOM_FaceFilter.cxx src/GEOMFiltersSelection/GEOM_FaceFilter.h src/GEOMFiltersSelection/GEOM_LogicalFilter.cxx src/GEOMFiltersSelection/GEOM_LogicalFilter.h src/GEOMFiltersSelection/GEOM_OCCFilter.cxx src/GEOMFiltersSelection/GEOM_OCCFilter.h src/GEOMFiltersSelection/GEOM_PreviewFilter.cxx src/GEOMFiltersSelection/GEOM_PreviewFilter.h src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx src/GEOMFiltersSelection/GEOM_SelectionFilter.h src/GEOMFiltersSelection/GEOM_ShapeTypeFilter.cxx src/GEOMFiltersSelection/GEOM_TypeFilter.cxx src/GEOMFiltersSelection/GEOM_TypeFilter.h src/GEOMGUI/GEOMGUI_OCCSelector.cxx src/GEOMGUI/GEOMGUI_OCCSelector.h src/GEOMGUI/GEOMGUI_Selection.cxx src/GEOMGUI/GEOMGUI_Selection.h src/GEOMGUI/GEOM_Displayer.cxx src/GEOMGUI/GEOM_Displayer.h src/GEOMGUI/GEOM_msg_en.po src/GEOMGUI/GeometryGUI.cxx src/GEOMGUI/GeometryGUI.h src/GEOMImpl/GEOMImpl_ArcDriver.cxx src/GEOMImpl/GEOMImpl_ArcDriver.hxx src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx src/GEOMImpl/GEOMImpl_Block6Explorer.cxx src/GEOMImpl/GEOMImpl_Block6Explorer.hxx src/GEOMImpl/GEOMImpl_BlockDriver.cxx src/GEOMImpl/GEOMImpl_BlockDriver.hxx src/GEOMImpl/GEOMImpl_BooleanDriver.cxx src/GEOMImpl/GEOMImpl_BooleanDriver.hxx src/GEOMImpl/GEOMImpl_BoxDriver.cxx src/GEOMImpl/GEOMImpl_BoxDriver.hxx src/GEOMImpl/GEOMImpl_ChamferDriver.cxx src/GEOMImpl/GEOMImpl_ChamferDriver.hxx src/GEOMImpl/GEOMImpl_CircleDriver.cxx src/GEOMImpl/GEOMImpl_CircleDriver.hxx src/GEOMImpl/GEOMImpl_ConeDriver.cxx src/GEOMImpl/GEOMImpl_ConeDriver.hxx src/GEOMImpl/GEOMImpl_CopyDriver.cxx src/GEOMImpl/GEOMImpl_CopyDriver.hxx src/GEOMImpl/GEOMImpl_CylinderDriver.cxx src/GEOMImpl/GEOMImpl_CylinderDriver.hxx src/GEOMImpl/GEOMImpl_EllipseDriver.cxx src/GEOMImpl/GEOMImpl_EllipseDriver.hxx src/GEOMImpl/GEOMImpl_ExportDriver.cxx src/GEOMImpl/GEOMImpl_ExportDriver.hxx src/GEOMImpl/GEOMImpl_FilletDriver.cxx src/GEOMImpl/GEOMImpl_FilletDriver.hxx src/GEOMImpl/GEOMImpl_FillingDriver.cxx src/GEOMImpl/GEOMImpl_FillingDriver.hxx src/GEOMImpl/GEOMImpl_Gen.cxx src/GEOMImpl/GEOMImpl_Gen.hxx src/GEOMImpl/GEOMImpl_GlueDriver.cxx src/GEOMImpl/GEOMImpl_GlueDriver.hxx src/GEOMImpl/GEOMImpl_HealingDriver.cxx src/GEOMImpl/GEOMImpl_HealingDriver.hxx src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx src/GEOMImpl/GEOMImpl_IArc.hxx src/GEOMImpl/GEOMImpl_IArchimede.hxx src/GEOMImpl/GEOMImpl_IBasicOperations.cxx src/GEOMImpl/GEOMImpl_IBasicOperations.hxx src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx src/GEOMImpl/GEOMImpl_IBlocks.hxx src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx src/GEOMImpl/GEOMImpl_IBoolean.hxx src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx src/GEOMImpl/GEOMImpl_IBox.hxx src/GEOMImpl/GEOMImpl_IChamfer.hxx src/GEOMImpl/GEOMImpl_ICircle.hxx src/GEOMImpl/GEOMImpl_ICone.hxx src/GEOMImpl/GEOMImpl_ICopy.hxx src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx src/GEOMImpl/GEOMImpl_ICylinder.hxx src/GEOMImpl/GEOMImpl_IEllipse.hxx src/GEOMImpl/GEOMImpl_IFillet.hxx src/GEOMImpl/GEOMImpl_IFilling.hxx src/GEOMImpl/GEOMImpl_IGlue.hxx src/GEOMImpl/GEOMImpl_IGroupOperations.cxx src/GEOMImpl/GEOMImpl_IGroupOperations.hxx src/GEOMImpl/GEOMImpl_IHealing.hxx src/GEOMImpl/GEOMImpl_IHealingOperations.cxx src/GEOMImpl/GEOMImpl_IHealingOperations.hxx src/GEOMImpl/GEOMImpl_IImportExport.hxx src/GEOMImpl/GEOMImpl_IInsertOperations.cxx src/GEOMImpl/GEOMImpl_IInsertOperations.hxx src/GEOMImpl/GEOMImpl_ILine.hxx src/GEOMImpl/GEOMImpl_ILocalOperations.cxx src/GEOMImpl/GEOMImpl_ILocalOperations.hxx src/GEOMImpl/GEOMImpl_IMarker.hxx src/GEOMImpl/GEOMImpl_IMeasure.hxx src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx src/GEOMImpl/GEOMImpl_IMirror.hxx src/GEOMImpl/GEOMImpl_IOffset.hxx src/GEOMImpl/GEOMImpl_IPartition.hxx src/GEOMImpl/GEOMImpl_IPipe.hxx src/GEOMImpl/GEOMImpl_IPlane.hxx src/GEOMImpl/GEOMImpl_IPoint.hxx src/GEOMImpl/GEOMImpl_IPolyline.hxx src/GEOMImpl/GEOMImpl_IPosition.hxx src/GEOMImpl/GEOMImpl_IPrism.hxx src/GEOMImpl/GEOMImpl_IRevolution.hxx src/GEOMImpl/GEOMImpl_IRotate.hxx src/GEOMImpl/GEOMImpl_IScale.hxx src/GEOMImpl/GEOMImpl_IShapes.hxx src/GEOMImpl/GEOMImpl_IShapesOperations.cxx src/GEOMImpl/GEOMImpl_IShapesOperations.hxx src/GEOMImpl/GEOMImpl_ISketcher.hxx src/GEOMImpl/GEOMImpl_ISphere.hxx src/GEOMImpl/GEOMImpl_ISpline.hxx src/GEOMImpl/GEOMImpl_ITorus.hxx src/GEOMImpl/GEOMImpl_ITransformOperations.cxx src/GEOMImpl/GEOMImpl_ITransformOperations.hxx src/GEOMImpl/GEOMImpl_ITranslate.hxx src/GEOMImpl/GEOMImpl_IVector.hxx src/GEOMImpl/GEOMImpl_ImportDriver.cxx src/GEOMImpl/GEOMImpl_ImportDriver.hxx src/GEOMImpl/GEOMImpl_LineDriver.cxx src/GEOMImpl/GEOMImpl_LineDriver.hxx src/GEOMImpl/GEOMImpl_MarkerDriver.cxx src/GEOMImpl/GEOMImpl_MarkerDriver.hxx src/GEOMImpl/GEOMImpl_MeasureDriver.cxx src/GEOMImpl/GEOMImpl_MeasureDriver.hxx src/GEOMImpl/GEOMImpl_MirrorDriver.cxx src/GEOMImpl/GEOMImpl_MirrorDriver.hxx src/GEOMImpl/GEOMImpl_OffsetDriver.cxx src/GEOMImpl/GEOMImpl_OffsetDriver.hxx src/GEOMImpl/GEOMImpl_PartitionDriver.cxx src/GEOMImpl/GEOMImpl_PartitionDriver.hxx src/GEOMImpl/GEOMImpl_PipeDriver.cxx src/GEOMImpl/GEOMImpl_PipeDriver.hxx src/GEOMImpl/GEOMImpl_PlaneDriver.cxx src/GEOMImpl/GEOMImpl_PlaneDriver.hxx src/GEOMImpl/GEOMImpl_PointDriver.cxx src/GEOMImpl/GEOMImpl_PointDriver.hxx src/GEOMImpl/GEOMImpl_PolylineDriver.cxx src/GEOMImpl/GEOMImpl_PolylineDriver.hxx src/GEOMImpl/GEOMImpl_PositionDriver.cxx src/GEOMImpl/GEOMImpl_PositionDriver.hxx src/GEOMImpl/GEOMImpl_PrismDriver.cxx src/GEOMImpl/GEOMImpl_PrismDriver.hxx src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx src/GEOMImpl/GEOMImpl_RotateDriver.cxx src/GEOMImpl/GEOMImpl_RotateDriver.hxx src/GEOMImpl/GEOMImpl_ScaleDriver.cxx src/GEOMImpl/GEOMImpl_ScaleDriver.hxx src/GEOMImpl/GEOMImpl_ShapeDriver.cxx src/GEOMImpl/GEOMImpl_ShapeDriver.hxx src/GEOMImpl/GEOMImpl_SketcherDriver.cxx src/GEOMImpl/GEOMImpl_SketcherDriver.hxx src/GEOMImpl/GEOMImpl_SphereDriver.cxx src/GEOMImpl/GEOMImpl_SphereDriver.hxx src/GEOMImpl/GEOMImpl_SplineDriver.cxx src/GEOMImpl/GEOMImpl_SplineDriver.hxx src/GEOMImpl/GEOMImpl_Template.cxx src/GEOMImpl/GEOMImpl_Template.hxx src/GEOMImpl/GEOMImpl_TorusDriver.cxx src/GEOMImpl/GEOMImpl_TorusDriver.hxx src/GEOMImpl/GEOMImpl_TranslateDriver.cxx src/GEOMImpl/GEOMImpl_TranslateDriver.hxx src/GEOMImpl/GEOMImpl_Types.hxx src/GEOMImpl/GEOMImpl_VectorDriver.cxx src/GEOMImpl/GEOMImpl_VectorDriver.hxx src/GEOMToolsGUI/GEOMToolsGUI.cxx src/GEOM_I/GEOM_DumpPython.cc src/GEOM_I/GEOM_Gen_i.cc src/GEOM_I/GEOM_Gen_i.hh src/GEOM_I/GEOM_I3DPrimOperations_i.cc src/GEOM_I/GEOM_I3DPrimOperations_i.hh src/GEOM_I/GEOM_IBasicOperations_i.cc src/GEOM_I/GEOM_IBasicOperations_i.hh src/GEOM_I/GEOM_IBlocksOperations_i.cc src/GEOM_I/GEOM_IBlocksOperations_i.hh src/GEOM_I/GEOM_IBooleanOperations_i.cc src/GEOM_I/GEOM_IBooleanOperations_i.hh src/GEOM_I/GEOM_ICurvesOperations_i.cc src/GEOM_I/GEOM_ICurvesOperations_i.hh src/GEOM_I/GEOM_IGroupOperations_i.cc src/GEOM_I/GEOM_IGroupOperations_i.hh src/GEOM_I/GEOM_IHealingOperations_i.cc src/GEOM_I/GEOM_IHealingOperations_i.hh src/GEOM_I/GEOM_IInsertOperations_i.cc src/GEOM_I/GEOM_IInsertOperations_i.hh src/GEOM_I/GEOM_ILocalOperations_i.cc src/GEOM_I/GEOM_ILocalOperations_i.hh src/GEOM_I/GEOM_IMeasureOperations_i.cc src/GEOM_I/GEOM_IMeasureOperations_i.hh src/GEOM_I/GEOM_IOperations_i.cc src/GEOM_I/GEOM_IOperations_i.hh src/GEOM_I/GEOM_IShapesOperations_i.cc src/GEOM_I/GEOM_IShapesOperations_i.hh src/GEOM_I/GEOM_ITransformOperations_i.cc src/GEOM_I/GEOM_ITransformOperations_i.hh src/GEOM_I/GEOM_Object_i.cc src/GEOM_I/GEOM_Object_i.hh src/GEOM_I/Makefile.in src/GEOM_I_Superv/GEOM_List_i.hh src/GEOM_I_Superv/GEOM_Superv_i.cc src/GEOM_I_Superv/GEOM_Superv_i.hh src/GEOM_SWIG/GEOM_Nut.py src/GEOM_SWIG/GEOM_TestOthers.py src/GEOM_SWIG/batchmode_geompy.py src/GEOM_SWIG/geompy.py src/GEOM_SWIG/libGEOM_Swig.i src/GenerationGUI/GenerationGUI_FillingDlg.cxx src/GenerationGUI/GenerationGUI_PipeDlg.cxx src/GenerationGUI/GenerationGUI_PrismDlg.cxx src/GenerationGUI/GenerationGUI_RevolDlg.cxx src/GroupGUI/GroupGUI.cxx src/GroupGUI/GroupGUI_GroupDlg.cxx src/IGESExport/IGESExport.cxx src/IGESImport/IGESImport.cxx src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.cxx src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.h src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.cxx src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.cxx src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.cxx src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.cxx src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx src/MeasureGUI/MeasureGUI_PointDlg.cxx src/MeasureGUI/MeasureGUI_Skeleton.cxx src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx src/MeasureGUI/MeasureGUI_Skeleton_QTD.h src/MeasureGUI/UIFiles/ui_to_cxx src/NMTAlgo/Makefile.in src/NMTAlgo/NMTAlgo.cdl src/NMTAlgo/NMTAlgo_Algo.cdl src/NMTAlgo/NMTAlgo_Algo.cxx src/NMTAlgo/NMTAlgo_Algo.jxx src/NMTAlgo/NMTAlgo_Builder.cdl src/NMTAlgo/NMTAlgo_Builder.cxx src/NMTAlgo/NMTAlgo_Builder.jxx src/NMTAlgo/NMTAlgo_Loop3d.cdl src/NMTAlgo/NMTAlgo_Loop3d.cxx src/NMTAlgo/NMTAlgo_Loop3d.jxx src/NMTAlgo/NMTAlgo_Splitter.cdl src/NMTAlgo/NMTAlgo_Splitter.cxx src/NMTAlgo/NMTAlgo_Splitter.jxx src/NMTAlgo/NMTAlgo_Splitter1.cdl src/NMTAlgo/NMTAlgo_Splitter1.cxx src/NMTAlgo/NMTAlgo_Splitter1.jxx src/NMTAlgo/NMTAlgo_Splitter_1.cxx src/NMTAlgo/NMTAlgo_Splitter_2.cxx src/NMTAlgo/NMTAlgo_Tools.cdl src/NMTAlgo/NMTAlgo_Tools.cxx src/NMTAlgo/NMTAlgo_Tools.jxx src/NMTDS/NMTDS.cdl src/NMTDS/NMTDS_IndexRange.cdl src/NMTDS/NMTDS_IndexRange.cxx src/NMTDS/NMTDS_IndexRange.jxx src/NMTDS/NMTDS_ShapesDataStructure.cdl src/NMTDS/NMTDS_ShapesDataStructure.cxx src/NMTDS/NMTDS_ShapesDataStructure.hxx src/NMTDS/NMTDS_ShapesDataStructure.jxx src/NMTTools/Makefile.in src/NMTTools/NMTTools.cdl src/NMTTools/NMTTools_CommonBlock.cdl src/NMTTools/NMTTools_CommonBlock.cxx src/NMTTools/NMTTools_CommonBlock.jxx src/NMTTools/NMTTools_CommonBlockAPI.cdl src/NMTTools/NMTTools_CommonBlockAPI.cxx src/NMTTools/NMTTools_CommonBlockAPI.jxx src/NMTTools/NMTTools_CoupleOfShape.cdl src/NMTTools/NMTTools_CoupleOfShape.cxx src/NMTTools/NMTTools_CoupleOfShape.jxx src/NMTTools/NMTTools_DEProcessor.cdl src/NMTTools/NMTTools_DEProcessor.cxx src/NMTTools/NMTTools_DEProcessor.jxx src/NMTTools/NMTTools_DSFiller.cdl src/NMTTools/NMTTools_DSFiller.cxx src/NMTTools/NMTTools_DSFiller.jxx src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cdl src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cxx src/NMTTools/NMTTools_IteratorOfCoupleOfShape.jxx src/NMTTools/NMTTools_PCurveMaker.cdl src/NMTTools/NMTTools_PCurveMaker.cxx src/NMTTools/NMTTools_PCurveMaker.jxx src/NMTTools/NMTTools_PaveFiller.cdl src/NMTTools/NMTTools_PaveFiller.cxx src/NMTTools/NMTTools_PaveFiller.jxx src/NMTTools/NMTTools_PaveFiller_0.cxx src/NMTTools/NMTTools_PaveFiller_1.cxx src/NMTTools/NMTTools_PaveFiller_2.cxx src/NMTTools/NMTTools_PaveFiller_3.cxx src/NMTTools/NMTTools_PaveFiller_4.cxx src/NMTTools/NMTTools_PaveFiller_5.cxx src/NMTTools/NMTTools_PaveFiller_6.cxx src/NMTTools/NMTTools_PaveFiller_7.cxx src/NMTTools/NMTTools_PaveFiller_8.cxx src/NMTTools/NMTTools_PaveFiller_9.cxx src/NMTTools/NMTTools_Tools.cdl src/NMTTools/NMTTools_Tools.cxx src/NMTTools/NMTTools_Tools.jxx src/OperationGUI/OperationGUI_ArchimedeDlg.cxx src/OperationGUI/OperationGUI_ChamferDlg.cxx src/OperationGUI/OperationGUI_ClippingDlg.cxx src/OperationGUI/OperationGUI_FilletDlg.cxx src/OperationGUI/OperationGUI_MaterialDlg.cxx src/OperationGUI/OperationGUI_PartitionDlg.cxx src/PARTITION/Partition.cdl src/PARTITION/Partition_Inter2d.cdl src/PARTITION/Partition_Inter3d.cdl src/PARTITION/Partition_Loop.cdl src/PARTITION/Partition_Loop2d.cdl src/PARTITION/Partition_Loop3d.cdl src/PARTITION/Partition_Spliter.cdl src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx src/RepairGUI/RepairGUI.cxx src/RepairGUI/RepairGUI_CloseContourDlg.cxx src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx src/RepairGUI/RepairGUI_DivideEdgeDlg.h src/RepairGUI/RepairGUI_FreeBoundDlg.cxx src/RepairGUI/RepairGUI_FreeFacesDlg.cxx src/RepairGUI/RepairGUI_GlueDlg.cxx src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx src/RepairGUI/RepairGUI_SewingDlg.cxx src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx src/STEPExport/STEPExport.cxx src/STEPImport/STEPImport.cxx src/ShHealOper/Makefile.in src/ShHealOper/ShHealOper_CloseContour.cxx src/TransformationGUI/TransformationGUI_MirrorDlg.cxx src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx src/TransformationGUI/TransformationGUI_OffsetDlg.cxx src/TransformationGUI/TransformationGUI_PositionDlg.cxx src/TransformationGUI/TransformationGUI_RotationDlg.cxx src/TransformationGUI/TransformationGUI_ScaleDlg.cxx src/TransformationGUI/TransformationGUI_TranslationDlg.cxx --- INSTALL | 4 + adm_local/unix/make_commence.in | 257 + bin/VERSION | 1 + build_configure | 215 + doc/Makefile.in | 40 + doc/salome/GEOM_index_v3.1.0.html | 95 + doc/salome/Makefile.in | 45 + doc/salome/gui/GEOM/add_point_on_edge.htm | 165 + doc/salome/gui/GEOM/arc.htm | 135 + doc/salome/gui/GEOM/archimede.htm | 135 + .../gui/GEOM/basic_geometrical_objects.htm | 656 ++ doc/salome/gui/GEOM/basic_operations.htm | 242 + doc/salome/gui/GEOM/blocks_operations.htm | 258 + doc/salome/gui/GEOM/boolean_operations.htm | 348 + doc/salome/gui/GEOM/box.htm | 172 + doc/salome/gui/GEOM/building_by_blocks.htm | 330 + doc/salome/gui/GEOM/chamfer.htm | 192 + .../gui/GEOM/changing_display_parameters.htm | 176 + .../GEOM/changing_displaying_parameters.htm | 256 + doc/salome/gui/GEOM/check_free_boundaries.htm | 154 + doc/salome/gui/GEOM/check_free_faces.htm | 148 + doc/salome/gui/GEOM/circle.htm | 150 + doc/salome/gui/GEOM/close_contour.htm | 149 + doc/salome/gui/GEOM/common.htm | 141 + doc/salome/gui/GEOM/complex_objects.htm | 484 + doc/salome/gui/GEOM/compound.htm | 133 + doc/salome/gui/GEOM/cone.htm | 169 + doc/salome/gui/GEOM/curve.htm | 162 + doc/salome/gui/GEOM/cut.htm | 138 + doc/salome/gui/GEOM/cylinder.htm | 160 + doc/salome/gui/GEOM/edge.htm | 130 + doc/salome/gui/GEOM/ellipse.htm | 148 + doc/salome/gui/GEOM/explode.htm | 180 + doc/salome/gui/GEOM/explode_on_blocks.htm | 163 + doc/salome/gui/GEOM/extrusion.htm | 169 + doc/salome/gui/GEOM/face.htm | 151 + .../files/salome2_sp3_basicgui_functions.htm | 885 ++ .../salome2_sp3_booleangui_functions.htm | 153 + .../files/salome2_sp3_buildgui_functions.htm | 458 + .../salome2_sp3_generationgui_functions.htm | 307 + .../salome2_sp3_geomtoolsgui_functions.htm | 145 + .../salome2_sp3_measuregui_functions.htm | 597 ++ .../salome2_sp3_operationgui_functions.htm | 637 ++ .../salome2_sp3_primitivegui_functions.htm | 395 + .../files/salome2_sp3_repairgui_functions.htm | 898 ++ ...alome2_sp3_transformationgui_functions.htm | 669 ++ doc/salome/gui/GEOM/fillet.htm | 179 + doc/salome/gui/GEOM/filling.htm | 153 + doc/salome/gui/GEOM/fuse.htm | 147 + doc/salome/gui/GEOM/geom.log | 648 ++ doc/salome/gui/GEOM/geometrical_objects.htm | 571 ++ .../geompy_doc/GEOM__TestMeasures_8py.html | 29 + doc/salome/gui/GEOM/geompy_doc/doxygen.css | 218 + doc/salome/gui/GEOM/geompy_doc/doxygen.png | Bin 0 -> 1576 bytes .../gui/GEOM/geompy_doc/geompy_8py__incl.jpg | Bin 0 -> 4582 bytes .../gui/GEOM/geompy_doc/geompy_8py__incl.map | 1 + .../gui/GEOM/geompy_doc/geompy_8py__incl.md5 | 1 + .../namespaceGEOM__TestMeasures.html | 70 + .../gui/GEOM/geompy_doc/namespacegeompy.html | 8409 +++++++++++++++++ doc/salome/gui/GEOM/glue_faces.htm | 158 + doc/salome/gui/GEOM/groups.htm | 326 + doc/salome/gui/GEOM/image10.gif | Bin 0 -> 981 bytes doc/salome/gui/GEOM/image27.gif | Bin 0 -> 1022 bytes doc/salome/gui/GEOM/image3.gif | Bin 0 -> 964 bytes doc/salome/gui/GEOM/line.htm | 154 + .../gui/GEOM/local_coordinate_system.htm | 207 + doc/salome/gui/GEOM/measurement_tools.htm | 459 + doc/salome/gui/GEOM/mirror_image.htm | 178 + doc/salome/gui/GEOM/modify_the_location.htm | 152 + doc/salome/gui/GEOM/multi_rotation.htm | 182 + doc/salome/gui/GEOM/multi_transformation.htm | 192 + doc/salome/gui/GEOM/multi_translation.htm | 168 + doc/salome/gui/GEOM/newentity_blocks.htm | 322 + doc/salome/gui/GEOM/offset_surface.htm | 146 + doc/salome/gui/GEOM/partition.htm | 172 + doc/salome/gui/GEOM/pics/arc.png | Bin 0 -> 11731 bytes doc/salome/gui/GEOM/pics/archimede.png | Bin 0 -> 15311 bytes doc/salome/gui/GEOM/pics/archimedesn1.png | Bin 0 -> 3678 bytes doc/salome/gui/GEOM/pics/archimedesn2.png | Bin 0 -> 4140 bytes doc/salome/gui/GEOM/pics/archimedesn3.png | Bin 0 -> 1841 bytes doc/salome/gui/GEOM/pics/arcsn.png | Bin 0 -> 1672 bytes doc/salome/gui/GEOM/pics/bezier.png | Bin 0 -> 2442 bytes doc/salome/gui/GEOM/pics/block1.png | Bin 0 -> 15732 bytes doc/salome/gui/GEOM/pics/block2.png | Bin 0 -> 14326 bytes doc/salome/gui/GEOM/pics/block3.png | Bin 0 -> 15635 bytes doc/salome/gui/GEOM/pics/block4.png | Bin 0 -> 13453 bytes doc/salome/gui/GEOM/pics/block5.png | Bin 0 -> 16710 bytes doc/salome/gui/GEOM/pics/block_explodesn.png | Bin 0 -> 17436 bytes doc/salome/gui/GEOM/pics/bool1.png | Bin 0 -> 12677 bytes doc/salome/gui/GEOM/pics/bool2.png | Bin 0 -> 13285 bytes doc/salome/gui/GEOM/pics/bool3.png | Bin 0 -> 13184 bytes doc/salome/gui/GEOM/pics/box1.png | Bin 0 -> 11772 bytes doc/salome/gui/GEOM/pics/box2.png | Bin 0 -> 12087 bytes doc/salome/gui/GEOM/pics/boxes.png | Bin 0 -> 7689 bytes doc/salome/gui/GEOM/pics/chamfer1.png | Bin 0 -> 13428 bytes doc/salome/gui/GEOM/pics/chamfer2.png | Bin 0 -> 15527 bytes doc/salome/gui/GEOM/pics/chamfer3.png | Bin 0 -> 15147 bytes doc/salome/gui/GEOM/pics/chamfer_all.png | Bin 0 -> 11172 bytes doc/salome/gui/GEOM/pics/chamfer_edge.png | Bin 0 -> 9146 bytes doc/salome/gui/GEOM/pics/chamfer_faces.png | Bin 0 -> 10302 bytes doc/salome/gui/GEOM/pics/circle1.png | Bin 0 -> 12982 bytes doc/salome/gui/GEOM/pics/circle2.png | Bin 0 -> 12343 bytes doc/salome/gui/GEOM/pics/circles.png | Bin 0 -> 3217 bytes doc/salome/gui/GEOM/pics/colorsn.png | Bin 0 -> 23078 bytes doc/salome/gui/GEOM/pics/commonsn.png | Bin 0 -> 3754 bytes doc/salome/gui/GEOM/pics/compoundsn.png | Bin 0 -> 1653 bytes doc/salome/gui/GEOM/pics/cone1.png | Bin 0 -> 14640 bytes doc/salome/gui/GEOM/pics/cone2.png | Bin 0 -> 13421 bytes doc/salome/gui/GEOM/pics/cones.png | Bin 0 -> 10676 bytes doc/salome/gui/GEOM/pics/creategroup.png | Bin 0 -> 15350 bytes doc/salome/gui/GEOM/pics/curve.png | Bin 0 -> 11543 bytes doc/salome/gui/GEOM/pics/cutsn.png | Bin 0 -> 4941 bytes doc/salome/gui/GEOM/pics/cylinder1.png | Bin 0 -> 14719 bytes doc/salome/gui/GEOM/pics/cylinder2.png | Bin 0 -> 13539 bytes doc/salome/gui/GEOM/pics/cylinders.png | Bin 0 -> 12964 bytes doc/salome/gui/GEOM/pics/disp_mode1sn.png | Bin 0 -> 8130 bytes doc/salome/gui/GEOM/pics/disp_mode2sn.png | Bin 0 -> 20528 bytes doc/salome/gui/GEOM/pics/distance.png | Bin 0 -> 12635 bytes doc/salome/gui/GEOM/pics/edgesn.png | Bin 0 -> 1592 bytes doc/salome/gui/GEOM/pics/editgroup.png | Bin 0 -> 15719 bytes doc/salome/gui/GEOM/pics/ellipse.png | Bin 0 -> 13550 bytes doc/salome/gui/GEOM/pics/ellipsesn.png | Bin 0 -> 2931 bytes doc/salome/gui/GEOM/pics/export.png | Bin 0 -> 14172 bytes doc/salome/gui/GEOM/pics/extrusion.png | Bin 0 -> 13393 bytes doc/salome/gui/GEOM/pics/facesn1.png | Bin 0 -> 3142 bytes doc/salome/gui/GEOM/pics/facesn2.png | Bin 0 -> 2964 bytes doc/salome/gui/GEOM/pics/facesn3.png | Bin 0 -> 2187 bytes doc/salome/gui/GEOM/pics/fillet1.png | Bin 0 -> 12606 bytes doc/salome/gui/GEOM/pics/fillet2.png | Bin 0 -> 14015 bytes doc/salome/gui/GEOM/pics/fillet3.png | Bin 0 -> 13897 bytes doc/salome/gui/GEOM/pics/fillet_all.png | Bin 0 -> 12664 bytes doc/salome/gui/GEOM/pics/fillet_edge.png | Bin 0 -> 10707 bytes doc/salome/gui/GEOM/pics/fillet_prism.png | Bin 0 -> 8424 bytes doc/salome/gui/GEOM/pics/filling.png | Bin 0 -> 15332 bytes .../gui/GEOM/pics/filling_compoundsn.png | Bin 0 -> 2507 bytes doc/salome/gui/GEOM/pics/fillingsn.png | Bin 0 -> 9402 bytes doc/salome/gui/GEOM/pics/free_boudaries1.png | Bin 0 -> 12909 bytes doc/salome/gui/GEOM/pics/free_boudaries2.png | Bin 0 -> 13074 bytes doc/salome/gui/GEOM/pics/free_faces1.png | Bin 0 -> 19590 bytes doc/salome/gui/GEOM/pics/free_faces2.png | Bin 0 -> 22272 bytes doc/salome/gui/GEOM/pics/fusesn1.png | Bin 0 -> 14030 bytes doc/salome/gui/GEOM/pics/fusesn2.png | Bin 0 -> 16678 bytes doc/salome/gui/GEOM/pics/glue_faces1.png | Bin 0 -> 9842 bytes doc/salome/gui/GEOM/pics/glue_faces2.png | Bin 0 -> 9914 bytes doc/salome/gui/GEOM/pics/import.png | Bin 0 -> 15937 bytes doc/salome/gui/GEOM/pics/interpol.png | Bin 0 -> 2888 bytes doc/salome/gui/GEOM/pics/isos_u12_v12sn.png | Bin 0 -> 37129 bytes doc/salome/gui/GEOM/pics/line.png | Bin 0 -> 10742 bytes doc/salome/gui/GEOM/pics/lines.png | Bin 0 -> 2403 bytes doc/salome/gui/GEOM/pics/measures1.png | Bin 0 -> 10455 bytes doc/salome/gui/GEOM/pics/measures10.png | Bin 0 -> 14601 bytes doc/salome/gui/GEOM/pics/measures3.png | Bin 0 -> 14450 bytes doc/salome/gui/GEOM/pics/measures4.png | Bin 0 -> 17751 bytes doc/salome/gui/GEOM/pics/measures5.png | Bin 0 -> 14641 bytes doc/salome/gui/GEOM/pics/measures8.png | Bin 0 -> 16541 bytes doc/salome/gui/GEOM/pics/measures9.png | Bin 0 -> 12534 bytes doc/salome/gui/GEOM/pics/mirror_axissn1.png | Bin 0 -> 2248 bytes doc/salome/gui/GEOM/pics/mirror_axissn2.png | Bin 0 -> 3543 bytes doc/salome/gui/GEOM/pics/mirror_planesn1.png | Bin 0 -> 4646 bytes doc/salome/gui/GEOM/pics/mirror_planesn2.png | Bin 0 -> 5798 bytes doc/salome/gui/GEOM/pics/mirror_pointsn1.png | Bin 0 -> 2304 bytes doc/salome/gui/GEOM/pics/mirror_pointsn2.png | Bin 0 -> 3739 bytes doc/salome/gui/GEOM/pics/mtrans1.png | Bin 0 -> 15971 bytes doc/salome/gui/GEOM/pics/mtrans2.png | Bin 0 -> 19494 bytes doc/salome/gui/GEOM/pics/mtransf1.png | Bin 0 -> 17130 bytes doc/salome/gui/GEOM/pics/mtransf2.png | Bin 0 -> 20345 bytes doc/salome/gui/GEOM/pics/mtransf3.png | Bin 0 -> 13844 bytes doc/salome/gui/GEOM/pics/mtransf4.png | Bin 0 -> 9687 bytes .../gui/GEOM/pics/multi_rotation1d1.png | Bin 0 -> 4300 bytes .../gui/GEOM/pics/multi_rotation1d2.png | Bin 0 -> 8111 bytes .../gui/GEOM/pics/multi_rotation2d1.png | Bin 0 -> 3139 bytes .../gui/GEOM/pics/multi_rotation2d2.png | Bin 0 -> 16745 bytes .../GEOM/pics/multi_transformationsn1d.png | Bin 0 -> 11030 bytes .../GEOM/pics/multi_transformationsn2d.png | Bin 0 -> 11515 bytes .../gui/GEOM/pics/multi_translation1dsn.png | Bin 0 -> 3938 bytes .../gui/GEOM/pics/multi_translation2dsn.png | Bin 0 -> 7838 bytes .../GEOM/pics/multi_translation_initialsn.png | Bin 0 -> 2158 bytes doc/salome/gui/GEOM/pics/neo-basicprop.png | Bin 0 -> 14586 bytes doc/salome/gui/GEOM/pics/neo-detect2.png | Bin 0 -> 8014 bytes doc/salome/gui/GEOM/pics/neo-isos.png | Bin 0 -> 7042 bytes doc/salome/gui/GEOM/pics/neo-localcs1.png | Bin 0 -> 17595 bytes doc/salome/gui/GEOM/pics/neo-localcs2.png | Bin 0 -> 13085 bytes doc/salome/gui/GEOM/pics/neo-localcs3.png | Bin 0 -> 15322 bytes doc/salome/gui/GEOM/pics/neo-materials.png | Bin 0 -> 12972 bytes doc/salome/gui/GEOM/pics/neo-mrot1.png | Bin 0 -> 14401 bytes doc/salome/gui/GEOM/pics/neo-mrot2.png | Bin 0 -> 17583 bytes doc/salome/gui/GEOM/pics/neo-obj1.png | Bin 0 -> 13245 bytes doc/salome/gui/GEOM/pics/neo-obj2.png | Bin 0 -> 11136 bytes doc/salome/gui/GEOM/pics/neo-obj3.png | Bin 0 -> 11942 bytes doc/salome/gui/GEOM/pics/neo-obj4.png | Bin 0 -> 12077 bytes doc/salome/gui/GEOM/pics/neo-obj5.png | Bin 0 -> 11148 bytes doc/salome/gui/GEOM/pics/neo-obj6.png | Bin 0 -> 12508 bytes doc/salome/gui/GEOM/pics/neo-obj7.png | Bin 0 -> 11911 bytes doc/salome/gui/GEOM/pics/neo-point2.png | Bin 0 -> 15656 bytes doc/salome/gui/GEOM/pics/neo-scetcher1.png | Bin 0 -> 16921 bytes doc/salome/gui/GEOM/pics/neo-scetcher2.png | Bin 0 -> 21323 bytes doc/salome/gui/GEOM/pics/neo-section.png | Bin 0 -> 13547 bytes doc/salome/gui/GEOM/pics/neo-transparency.png | Bin 0 -> 6912 bytes doc/salome/gui/GEOM/pics/new-tolerance.png | Bin 0 -> 14146 bytes doc/salome/gui/GEOM/pics/offsetsn.png | Bin 0 -> 12215 bytes doc/salome/gui/GEOM/pics/partition1.png | Bin 0 -> 19008 bytes doc/salome/gui/GEOM/pics/partition2.png | Bin 0 -> 15665 bytes doc/salome/gui/GEOM/pics/partitionsn1.png | Bin 0 -> 5814 bytes doc/salome/gui/GEOM/pics/partitionsn2.png | Bin 0 -> 4535 bytes doc/salome/gui/GEOM/pics/pipe.png | Bin 0 -> 12462 bytes doc/salome/gui/GEOM/pics/pipe_wire_edgesn.png | Bin 0 -> 2000 bytes doc/salome/gui/GEOM/pics/pipesn.png | Bin 0 -> 11225 bytes doc/salome/gui/GEOM/pics/plane1.png | Bin 0 -> 13114 bytes doc/salome/gui/GEOM/pics/plane2.png | Bin 0 -> 13745 bytes doc/salome/gui/GEOM/pics/plane3.png | Bin 0 -> 12545 bytes doc/salome/gui/GEOM/pics/plane_on_face.png | Bin 0 -> 2595 bytes doc/salome/gui/GEOM/pics/planes1.png | Bin 0 -> 4168 bytes doc/salome/gui/GEOM/pics/point1.png | Bin 0 -> 12028 bytes doc/salome/gui/GEOM/pics/point3.png | Bin 0 -> 14515 bytes doc/salome/gui/GEOM/pics/points.png | Bin 0 -> 2941 bytes doc/salome/gui/GEOM/pics/polyline.png | Bin 0 -> 2813 bytes doc/salome/gui/GEOM/pics/prisms_basessn.png | Bin 0 -> 2654 bytes doc/salome/gui/GEOM/pics/prismssn.png | Bin 0 -> 7628 bytes doc/salome/gui/GEOM/pics/repair1.png | Bin 0 -> 21190 bytes doc/salome/gui/GEOM/pics/repair10.png | Bin 0 -> 7422 bytes doc/salome/gui/GEOM/pics/repair2.png | Bin 0 -> 12670 bytes doc/salome/gui/GEOM/pics/repair3.png | Bin 0 -> 15621 bytes doc/salome/gui/GEOM/pics/repair4.png | Bin 0 -> 15084 bytes doc/salome/gui/GEOM/pics/repair5.png | Bin 0 -> 14981 bytes doc/salome/gui/GEOM/pics/repair6.png | Bin 0 -> 15032 bytes doc/salome/gui/GEOM/pics/repair7.png | Bin 0 -> 12358 bytes doc/salome/gui/GEOM/pics/repair8.png | Bin 0 -> 14096 bytes doc/salome/gui/GEOM/pics/repair9.png | Bin 0 -> 9956 bytes doc/salome/gui/GEOM/pics/revolution.png | Bin 0 -> 14251 bytes doc/salome/gui/GEOM/pics/revolutionsn.png | Bin 0 -> 8811 bytes doc/salome/gui/GEOM/pics/rotationsn1.png | Bin 0 -> 7114 bytes doc/salome/gui/GEOM/pics/rotationsn2.png | Bin 0 -> 10612 bytes .../gui/GEOM/pics/scale_transformsn1.png | Bin 0 -> 4218 bytes .../gui/GEOM/pics/scale_transformsn2.png | Bin 0 -> 6158 bytes doc/salome/gui/GEOM/pics/sectionsn.png | Bin 0 -> 1911 bytes doc/salome/gui/GEOM/pics/shellsn.png | Bin 0 -> 2772 bytes doc/salome/gui/GEOM/pics/solidsn.png | Bin 0 -> 4965 bytes doc/salome/gui/GEOM/pics/sphere1.png | Bin 0 -> 12869 bytes doc/salome/gui/GEOM/pics/sphere2.png | Bin 0 -> 12115 bytes doc/salome/gui/GEOM/pics/spheres.png | Bin 0 -> 17852 bytes doc/salome/gui/GEOM/pics/supp_int_wires1.png | Bin 0 -> 13116 bytes doc/salome/gui/GEOM/pics/supp_int_wires2.png | Bin 0 -> 8364 bytes doc/salome/gui/GEOM/pics/suppress_faces1.png | Bin 0 -> 6169 bytes doc/salome/gui/GEOM/pics/suppress_faces2.png | Bin 0 -> 6653 bytes doc/salome/gui/GEOM/pics/torus1.png | Bin 0 -> 13801 bytes doc/salome/gui/GEOM/pics/torus2.png | Bin 0 -> 12610 bytes doc/salome/gui/GEOM/pics/toruses.png | Bin 0 -> 22148 bytes doc/salome/gui/GEOM/pics/transformation1.png | Bin 0 -> 14766 bytes doc/salome/gui/GEOM/pics/transformation10.png | Bin 0 -> 13674 bytes doc/salome/gui/GEOM/pics/transformation11.png | Bin 0 -> 12912 bytes doc/salome/gui/GEOM/pics/transformation2.png | Bin 0 -> 14864 bytes doc/salome/gui/GEOM/pics/transformation3.png | Bin 0 -> 14406 bytes doc/salome/gui/GEOM/pics/transformation4.png | Bin 0 -> 14979 bytes doc/salome/gui/GEOM/pics/transformation5.png | Bin 0 -> 14553 bytes doc/salome/gui/GEOM/pics/transformation6.png | Bin 0 -> 15455 bytes doc/salome/gui/GEOM/pics/transformation7.png | Bin 0 -> 13562 bytes doc/salome/gui/GEOM/pics/transformation8.png | Bin 0 -> 13701 bytes doc/salome/gui/GEOM/pics/transformation9.png | Bin 0 -> 13736 bytes doc/salome/gui/GEOM/pics/translationsn1.png | Bin 0 -> 6613 bytes doc/salome/gui/GEOM/pics/translationsn2.png | Bin 0 -> 11303 bytes doc/salome/gui/GEOM/pics/transparencysn.png | Bin 0 -> 28364 bytes doc/salome/gui/GEOM/pics/vector1.png | Bin 0 -> 11853 bytes doc/salome/gui/GEOM/pics/vector2.png | Bin 0 -> 13267 bytes doc/salome/gui/GEOM/pics/vectors.png | Bin 0 -> 2404 bytes doc/salome/gui/GEOM/pics/wiresn.png | Bin 0 -> 1956 bytes doc/salome/gui/GEOM/pics/workplane4.png | Bin 0 -> 11002 bytes doc/salome/gui/GEOM/pics/workplane5.png | Bin 0 -> 12268 bytes doc/salome/gui/GEOM/pics/workplane6.png | Bin 0 -> 11761 bytes doc/salome/gui/GEOM/pipe_creation.htm | 140 + doc/salome/gui/GEOM/plane.htm | 196 + doc/salome/gui/GEOM/point.htm | 193 + doc/salome/gui/GEOM/primitives.htm | 362 + doc/salome/gui/GEOM/propagate.htm | 149 + doc/salome/gui/GEOM/repairing_operations.htm | 1069 +++ doc/salome/gui/GEOM/revolution.htm | 147 + doc/salome/gui/GEOM/rotation.htm | 155 + doc/salome/gui/GEOM/scale_transform.htm | 147 + doc/salome/gui/GEOM/section.htm | 150 + doc/salome/gui/GEOM/sewing.htm | 143 + doc/salome/gui/GEOM/shape_processing.htm | 302 + doc/salome/gui/GEOM/shell.htm | 132 + doc/salome/gui/GEOM/sketcher.htm | 215 + doc/salome/gui/GEOM/sketcher_tui.htm | 176 + doc/salome/gui/GEOM/solid.htm | 133 + doc/salome/gui/GEOM/sphere.htm | 160 + doc/salome/gui/GEOM/suppress_faces.htm | 135 + doc/salome/gui/GEOM/suppress_holes.htm | 149 + .../gui/GEOM/suppress_internal_wires.htm | 159 + .../gui/GEOM/transformation_operations.htm | 1069 +++ doc/salome/gui/GEOM/translation.htm | 187 + doc/salome/gui/GEOM/turus.htm | 147 + doc/salome/gui/GEOM/vector.htm | 151 + doc/salome/gui/GEOM/whdata/whftdata0.htm | 104 + doc/salome/gui/GEOM/whdata/whfts.htm | 18 + doc/salome/gui/GEOM/whdata/whfwdata0.htm | 1260 +++ doc/salome/gui/GEOM/whdata/whtdata0.htm | 110 + doc/salome/gui/GEOM/whgdata/whlstf0.htm | 46 + doc/salome/gui/GEOM/whgdata/whlstf1.htm | 43 + doc/salome/gui/GEOM/whgdata/whlstf10.htm | 47 + doc/salome/gui/GEOM/whgdata/whlstf11.htm | 41 + doc/salome/gui/GEOM/whgdata/whlstf12.htm | 43 + doc/salome/gui/GEOM/whgdata/whlstf13.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstf14.htm | 48 + doc/salome/gui/GEOM/whgdata/whlstf2.htm | 43 + doc/salome/gui/GEOM/whgdata/whlstf3.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstf4.htm | 43 + doc/salome/gui/GEOM/whgdata/whlstf5.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstf6.htm | 49 + doc/salome/gui/GEOM/whgdata/whlstf7.htm | 43 + doc/salome/gui/GEOM/whgdata/whlstf8.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstf9.htm | 41 + doc/salome/gui/GEOM/whgdata/whlstfl0.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl10.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl11.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl12.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl13.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl14.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl15.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl16.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl17.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl18.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl19.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl2.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl20.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl21.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl22.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl23.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl24.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl25.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl3.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl4.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl5.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl6.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl7.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl8.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstfl9.htm | 45 + doc/salome/gui/GEOM/whgdata/whlstt1.htm | 58 + doc/salome/gui/GEOM/whgdata/whlstt10.htm | 68 + doc/salome/gui/GEOM/whgdata/whlstt11.htm | 73 + doc/salome/gui/GEOM/whgdata/whlstt12.htm | 66 + doc/salome/gui/GEOM/whgdata/whlstt13.htm | 73 + doc/salome/gui/GEOM/whgdata/whlstt14.htm | 63 + doc/salome/gui/GEOM/whgdata/whlstt15.htm | 69 + doc/salome/gui/GEOM/whgdata/whlstt16.htm | 67 + doc/salome/gui/GEOM/whgdata/whlstt2.htm | 60 + doc/salome/gui/GEOM/whgdata/whlstt3.htm | 65 + doc/salome/gui/GEOM/whgdata/whlstt4.htm | 75 + doc/salome/gui/GEOM/whgdata/whlstt5.htm | 70 + doc/salome/gui/GEOM/whgdata/whlstt6.htm | 69 + doc/salome/gui/GEOM/whgdata/whlstt7.htm | 72 + doc/salome/gui/GEOM/whgdata/whlstt8.htm | 63 + doc/salome/gui/GEOM/whgdata/whlstt9.htm | 65 + doc/salome/gui/GEOM/whgdata/whnvl32.htm | 72 + doc/salome/gui/GEOM/whskin_info.htm | 20 + doc/salome/gui/GEOM/whxdata/whftdata0.xml | 90 + doc/salome/gui/GEOM/whxdata/whfts.xml | 7 + doc/salome/gui/GEOM/whxdata/whfwdata0.xml | 1246 +++ doc/salome/gui/GEOM/whxdata/whtdata0.xml | 115 + doc/salome/gui/GEOM/wire.htm | 134 + doc/salome/gui/GEOM/working_plane.htm | 131 + doc/salome/gui/GEOM/working_with_groups.htm | 211 + doc/salome/tui/GEOM/doxyfile | 200 + doc/salome/tui/GEOM/doxyfile_py | 200 + doc/salome/tui/GEOM/sources/static/tree.js | 59 + idl/GEOM_Gen.idl | 2134 +++++ resources/GEOMCatalog.xml | 4276 +++++++++ src/BREPExport/BREPExport.cxx | 56 + src/BREPImport/BREPImport.cxx | 60 + src/BasicGUI/BasicGUI_ArcDlg.cxx | 337 + src/BasicGUI/BasicGUI_CircleDlg.cxx | 435 + src/BasicGUI/BasicGUI_CurveDlg.cxx | 397 + src/BasicGUI/BasicGUI_EllipseDlg.cxx | 348 + src/BasicGUI/BasicGUI_LineDlg.cxx | 296 + src/BasicGUI/BasicGUI_MarkerDlg.cxx | 748 ++ src/BasicGUI/BasicGUI_PlaneDlg.cxx | 507 + src/BasicGUI/BasicGUI_PointDlg.cxx | 595 ++ src/BasicGUI/BasicGUI_VectorDlg.cxx | 416 + src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx | 468 + src/BlocksGUI/BlocksGUI_BlockDlg.cxx | 400 + src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx | 505 + src/BlocksGUI/BlocksGUI_PropagateDlg.cxx | 319 + src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx | 413 + src/BlocksGUI/BlocksGUI_TrsfDlg.cxx | 520 + src/BooleanGUI/BooleanGUI_Dialog.cxx | 289 + src/BuildGUI/BuildGUI_CompoundDlg.cxx | 227 + src/BuildGUI/BuildGUI_EdgeDlg.cxx | 283 + src/BuildGUI/BuildGUI_FaceDlg.cxx | 243 + src/BuildGUI/BuildGUI_ShellDlg.cxx | 246 + src/BuildGUI/BuildGUI_SolidDlg.cxx | 262 + src/BuildGUI/BuildGUI_WireDlg.cxx | 245 + src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx | 92 + src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h | 69 + src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx | 110 + src/DlgRef/DlgRef_1Sel1Check1List_QTD.h | 72 + src/DlgRef/DlgRef_1Sel1Check_QTD.cxx | 102 + src/DlgRef/DlgRef_1Sel1Check_QTD.h | 69 + src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx | 114 + src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h | 67 + src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx | 108 + src/DlgRef/DlgRef_1Sel1Spin_QTD.h | 69 + src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx | 119 + src/DlgRef/DlgRef_1Sel2Spin_QTD.h | 67 + src/DlgRef/DlgRef_1Sel3Check_QTD.cxx | 114 + src/DlgRef/DlgRef_1Sel3Check_QTD.h | 65 + src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx | 130 + src/DlgRef/DlgRef_1Sel3Spin_QTD.h | 73 + src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx | 151 + src/DlgRef/DlgRef_1Sel4Spin_QTD.h | 74 + src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx | 152 + src/DlgRef/DlgRef_1Sel5Spin_QTD.h | 73 + src/DlgRef/DlgRef_1Sel_Ext.h | 53 + src/DlgRef/DlgRef_1Sel_QTD.cxx | 93 + src/DlgRef/DlgRef_1Sel_QTD.h | 67 + src/DlgRef/DlgRef_1Spin_QTD.cxx | 87 + src/DlgRef/DlgRef_1Spin_QTD.h | 63 + src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.cxx | 139 + src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h | 70 + src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx | 132 + src/DlgRef/DlgRef_2Sel1Spin_QTD.h | 74 + src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx | 149 + src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h | 72 + src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx | 135 + src/DlgRef/DlgRef_2Sel2Spin_QTD.h | 76 + src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx | 146 + src/DlgRef/DlgRef_2Sel3Spin_QTD.h | 76 + src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx | 177 + src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h | 77 + src/DlgRef/DlgRef_2Sel_QTD.cxx | 109 + src/DlgRef/DlgRef_2Sel_QTD.h | 70 + src/DlgRef/DlgRef_2Spin_QTD.cxx | 98 + src/DlgRef/DlgRef_2Spin_QTD.h | 65 + src/DlgRef/DlgRef_3Check_QTD.cxx | 94 + src/DlgRef/DlgRef_3Check_QTD.h | 65 + src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx | 177 + src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h | 76 + src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx | 201 + src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h | 81 + src/DlgRef/DlgRef_3Sel_QTD.cxx | 125 + src/DlgRef/DlgRef_3Sel_QTD.h | 73 + src/DlgRef/DlgRef_3Spin1Check_QTD.cxx | 115 + src/DlgRef/DlgRef_3Spin1Check_QTD.h | 71 + src/DlgRef/DlgRef_3Spin_QTD.cxx | 109 + src/DlgRef/DlgRef_3Spin_QTD.h | 68 + src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx | 195 + src/DlgRef/DlgRef_4Sel1List1Check_QTD.h | 85 + src/DlgRef/DlgRef_4Sel1List_QTD.cxx | 171 + src/DlgRef/DlgRef_4Sel1List_QTD.h | 76 + src/DlgRef/DlgRef_6Sel_QTD.cxx | 171 + src/DlgRef/DlgRef_6Sel_QTD.h | 82 + src/DlgRef/DlgRef_Skeleton_QTD.cxx | 158 + src/DlgRef/DlgRef_Skeleton_QTD.h | 83 + src/DlgRef/UIFiles/ui_to_cxx | 104 + src/EntityGUI/EntityGUI.cxx | 679 ++ src/EntityGUI/EntityGUI_1Sel_QTD.cxx | 122 + src/EntityGUI/EntityGUI_1Sel_QTD.h | 67 + src/EntityGUI/EntityGUI_1Spin_QTD.cxx | 116 + src/EntityGUI/EntityGUI_1Spin_QTD.h | 66 + src/EntityGUI/EntityGUI_2Spin_QTD.cxx | 127 + src/EntityGUI/EntityGUI_2Spin_QTD.h | 68 + src/EntityGUI/EntityGUI_3Spin_QTD.cxx | 138 + src/EntityGUI/EntityGUI_3Spin_QTD.h | 70 + src/EntityGUI/EntityGUI_4Spin_QTD.cxx | 149 + src/EntityGUI/EntityGUI_4Spin_QTD.h | 72 + src/EntityGUI/EntityGUI_Dir1_QTD.cxx | 99 + src/EntityGUI/EntityGUI_Dir1_QTD.h | 60 + src/EntityGUI/EntityGUI_Dir2_QTD.cxx | 95 + src/EntityGUI/EntityGUI_Dir2_QTD.h | 59 + src/EntityGUI/EntityGUI_Point_QTD.cxx | 93 + src/EntityGUI/EntityGUI_Point_QTD.h | 59 + src/EntityGUI/EntityGUI_Skeleton_QTD.cxx | 195 + src/EntityGUI/EntityGUI_Skeleton_QTD.h | 80 + src/EntityGUI/EntityGUI_SketcherDlg.cxx | 1406 +++ src/EntityGUI/EntityGUI_SubShapeDlg.cxx | 596 ++ src/EntityGUI/UIFiles/ui_to_cxx | 47 + src/GEOM/GEOM_Application.cxx | 58 + src/GEOM/GEOM_Application.hxx | 108 + src/GEOM/GEOM_Application.ixx | 82 + src/GEOM/GEOM_Application.jxx | 28 + ...teratorOfDataMapOfAsciiStringTransient.hxx | 105 + ...ratorOfDataMapOfAsciiStringTransient_0.cxx | 55 + ...MapNodeOfDataMapOfAsciiStringTransient.hxx | 142 + ...pNodeOfDataMapOfAsciiStringTransient_0.cxx | 104 + .../GEOM_DataMapOfAsciiStringTransient.hxx | 137 + .../GEOM_DataMapOfAsciiStringTransient_0.cxx | 58 + src/GEOM/GEOM_Engine.cxx | 651 ++ src/GEOM/GEOM_Engine.hxx | 106 + src/GEOM/GEOM_Function.cxx | 700 ++ src/GEOM/GEOM_Function.hxx | 270 + src/GEOM/GEOM_IOperations.cxx | 103 + src/GEOM/GEOM_IOperations.hxx | 85 + src/GEOM/GEOM_ISubShape.hxx | 53 + src/GEOM/GEOM_Object.cxx | 425 + src/GEOM/GEOM_Object.hxx | 256 + src/GEOM/GEOM_PythonDump.cxx | 99 + src/GEOM/GEOM_PythonDump.hxx | 56 + src/GEOM/GEOM_Solver.cxx | 69 + src/GEOM/GEOM_Solver.hxx | 53 + src/GEOM/GEOM_SubShapeDriver.cxx | 170 + src/GEOM/GEOM_SubShapeDriver.hxx | 158 + src/GEOM/Handle_GEOM_Application.hxx | 96 + src/GEOM/Makefile.in | 59 + src/GEOMAlgo/BlockFix.cdl | 69 + src/GEOMAlgo/BlockFix.cxx | 215 + src/GEOMAlgo/BlockFix.jxx | 25 + src/GEOMAlgo/BlockFix_BlockFixAPI.cdl | 67 + src/GEOMAlgo/BlockFix_BlockFixAPI.cxx | 67 + src/GEOMAlgo/BlockFix_BlockFixAPI.jxx | 28 + src/GEOMAlgo/BlockFix_BlockFixAPI.lxx | 61 + src/GEOMAlgo/BlockFix_CheckTool.cdl | 66 + src/GEOMAlgo/BlockFix_CheckTool.cxx | 260 + src/GEOMAlgo/BlockFix_CheckTool.jxx | 25 + .../BlockFix_PeriodicSurfaceModifier.cdl | 134 + .../BlockFix_PeriodicSurfaceModifier.cxx | 249 + .../BlockFix_PeriodicSurfaceModifier.jxx | 46 + src/GEOMAlgo/BlockFix_SphereSpaceModifier.cdl | 139 + src/GEOMAlgo/BlockFix_SphereSpaceModifier.cxx | 261 + src/GEOMAlgo/BlockFix_SphereSpaceModifier.jxx | 46 + src/GEOMAlgo/BlockFix_UnionEdges.cdl | 47 + src/GEOMAlgo/BlockFix_UnionEdges.cxx | 339 + src/GEOMAlgo/BlockFix_UnionEdges.jxx | 28 + src/GEOMAlgo/BlockFix_UnionFaces.cdl | 65 + src/GEOMAlgo/BlockFix_UnionFaces.cxx | 531 ++ src/GEOMAlgo/BlockFix_UnionFaces.jxx | 28 + src/GEOMAlgo/GEOMAlgo.cdl | 124 + src/GEOMAlgo/GEOMAlgo_Algo.cdl | 58 + src/GEOMAlgo/GEOMAlgo_Algo.cxx | 78 + src/GEOMAlgo/GEOMAlgo_Algo.jxx | 22 + src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl | 67 + src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx | 84 + src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.jxx | 25 + src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl | 115 + src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx | 547 ++ src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx | 34 + src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl | 143 + src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx | 854 ++ src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx | 149 + src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx | 40 + src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx | 143 + src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx | 59 + src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl | 82 + src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx | 458 + src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx | 28 + src/GEOMAlgo/GEOMAlgo_Gluer.cdl | 160 + src/GEOMAlgo/GEOMAlgo_Gluer.cxx | 1008 ++ src/GEOMAlgo/GEOMAlgo_Gluer.jxx | 46 + src/GEOMAlgo/GEOMAlgo_PassKey.cdl | 100 + src/GEOMAlgo/GEOMAlgo_PassKey.cxx | 305 + src/GEOMAlgo/GEOMAlgo_PassKey.jxx | 25 + src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl | 48 + src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx | 45 + src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.jxx | 25 + src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl | 67 + src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx | 131 + src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx | 28 + src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl | 66 + src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx | 85 + src/GEOMAlgo/GEOMAlgo_ShapeAlgo.jxx | 25 + src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl | 67 + src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx | 80 + src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx | 28 + src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl | 53 + src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx | 369 + src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx | 22 + src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl | 58 + src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx | 201 + src/GEOMAlgo/GEOMAlgo_SolidSolid.jxx | 25 + src/GEOMAlgo/GEOMAlgo_StateCollector.cdl | 50 + src/GEOMAlgo/GEOMAlgo_StateCollector.cxx | 90 + src/GEOMAlgo/GEOMAlgo_StateCollector.jxx | 22 + src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl | 97 + src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx | 268 + src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx | 40 + src/GEOMAlgo/GEOMAlgo_Tools.cdl | 113 + src/GEOMAlgo/GEOMAlgo_Tools.cxx | 457 + src/GEOMAlgo/GEOMAlgo_Tools.jxx | 49 + src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl | 51 + src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx | 238 + src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx | 22 + src/GEOMAlgo/GEOMAlgo_WireSolid.cdl | 50 + src/GEOMAlgo/GEOMAlgo_WireSolid.cxx | 171 + src/GEOMAlgo/GEOMAlgo_WireSolid.jxx | 22 + src/GEOMAlgo/Makefile.in | 111 + src/GEOMBase/GEOMBase.cxx | 981 ++ src/GEOMBase/GEOMBase_Helper.cxx | 974 ++ src/GEOMBase/GEOMBase_Skeleton.cxx | 219 + src/GEOMBase/Makefile.in | 71 + src/GEOMClient/Makefile.in | 62 + src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx | 66 + src/GEOMFiltersSelection/GEOM_EdgeFilter.h | 39 + src/GEOMFiltersSelection/GEOM_FaceFilter.cxx | 74 + src/GEOMFiltersSelection/GEOM_FaceFilter.h | 39 + .../GEOM_LogicalFilter.cxx | 95 + src/GEOMFiltersSelection/GEOM_LogicalFilter.h | 50 + src/GEOMFiltersSelection/GEOM_OCCFilter.cxx | 65 + src/GEOMFiltersSelection/GEOM_OCCFilter.h | 48 + .../GEOM_PreviewFilter.cxx | 50 + src/GEOMFiltersSelection/GEOM_PreviewFilter.h | 35 + .../GEOM_SelectionFilter.cxx | 195 + .../GEOM_SelectionFilter.h | 60 + .../GEOM_ShapeTypeFilter.cxx | 168 + src/GEOMFiltersSelection/GEOM_TypeFilter.cxx | 66 + src/GEOMFiltersSelection/GEOM_TypeFilter.h | 44 + src/GEOMGUI/GEOMGUI_OCCSelector.cxx | 286 + src/GEOMGUI/GEOMGUI_OCCSelector.h | 37 + src/GEOMGUI/GEOMGUI_Selection.cxx | 203 + src/GEOMGUI/GEOMGUI_Selection.h | 55 + src/GEOMGUI/GEOM_Displayer.cxx | 1101 +++ src/GEOMGUI/GEOM_Displayer.h | 191 + src/GEOMGUI/GEOM_msg_en.po | 2898 ++++++ src/GEOMGUI/GeometryGUI.cxx | 1648 ++++ src/GEOMGUI/GeometryGUI.h | 192 + src/GEOMImpl/GEOMImpl_ArcDriver.cxx | 152 + src/GEOMImpl/GEOMImpl_ArcDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx | 187 + src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_Block6Explorer.cxx | 1287 +++ src/GEOMImpl/GEOMImpl_Block6Explorer.hxx | 226 + src/GEOMImpl/GEOMImpl_BlockDriver.cxx | 1005 ++ src/GEOMImpl/GEOMImpl_BlockDriver.hxx | 174 + src/GEOMImpl/GEOMImpl_BooleanDriver.cxx | 158 + src/GEOMImpl/GEOMImpl_BooleanDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_BoxDriver.cxx | 151 + src/GEOMImpl/GEOMImpl_BoxDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ChamferDriver.cxx | 248 + src/GEOMImpl/GEOMImpl_ChamferDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_CircleDriver.cxx | 174 + src/GEOMImpl/GEOMImpl_CircleDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ConeDriver.cxx | 185 + src/GEOMImpl/GEOMImpl_ConeDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_CopyDriver.cxx | 134 + src/GEOMImpl/GEOMImpl_CopyDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_CylinderDriver.cxx | 168 + src/GEOMImpl/GEOMImpl_CylinderDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_EllipseDriver.cxx | 144 + src/GEOMImpl/GEOMImpl_EllipseDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ExportDriver.cxx | 159 + src/GEOMImpl/GEOMImpl_ExportDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_FilletDriver.cxx | 177 + src/GEOMImpl/GEOMImpl_FilletDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_FillingDriver.cxx | 186 + src/GEOMImpl/GEOMImpl_FillingDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_Gen.cxx | 375 + src/GEOMImpl/GEOMImpl_Gen.hxx | 92 + src/GEOMImpl/GEOMImpl_GlueDriver.cxx | 332 + src/GEOMImpl/GEOMImpl_GlueDriver.hxx | 166 + src/GEOMImpl/GEOMImpl_HealingDriver.cxx | 425 + src/GEOMImpl/GEOMImpl_HealingDriver.hxx | 171 + src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 935 ++ src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 78 + src/GEOMImpl/GEOMImpl_IArc.hxx | 46 + src/GEOMImpl/GEOMImpl_IArchimede.hxx | 55 + src/GEOMImpl/GEOMImpl_IBasicOperations.cxx | 643 ++ src/GEOMImpl/GEOMImpl_IBasicOperations.hxx | 75 + src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx | 61 + src/GEOMImpl/GEOMImpl_IBlocks.hxx | 45 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 3129 ++++++ src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 171 + src/GEOMImpl/GEOMImpl_IBoolean.hxx | 43 + src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx | 349 + src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx | 55 + src/GEOMImpl/GEOMImpl_IBox.hxx | 60 + src/GEOMImpl/GEOMImpl_IChamfer.hxx | 67 + src/GEOMImpl/GEOMImpl_ICircle.hxx | 60 + src/GEOMImpl/GEOMImpl_ICone.hxx | 60 + src/GEOMImpl/GEOMImpl_ICopy.hxx | 40 + src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx | 600 ++ src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx | 64 + src/GEOMImpl/GEOMImpl_ICylinder.hxx | 55 + src/GEOMImpl/GEOMImpl_IEllipse.hxx | 51 + src/GEOMImpl/GEOMImpl_IFillet.hxx | 59 + src/GEOMImpl/GEOMImpl_IFilling.hxx | 56 + src/GEOMImpl/GEOMImpl_IGlue.hxx | 47 + src/GEOMImpl/GEOMImpl_IGroupOperations.cxx | 728 ++ src/GEOMImpl/GEOMImpl_IGroupOperations.hxx | 64 + src/GEOMImpl/GEOMImpl_IHealing.hxx | 80 + src/GEOMImpl/GEOMImpl_IHealingOperations.cxx | 775 ++ src/GEOMImpl/GEOMImpl_IHealingOperations.hxx | 86 + src/GEOMImpl/GEOMImpl_IImportExport.hxx | 51 + src/GEOMImpl/GEOMImpl_IInsertOperations.cxx | 405 + src/GEOMImpl/GEOMImpl_IInsertOperations.hxx | 65 + src/GEOMImpl/GEOMImpl_ILine.hxx | 43 + src/GEOMImpl/GEOMImpl_ILocalOperations.cxx | 525 + src/GEOMImpl/GEOMImpl_ILocalOperations.hxx | 63 + src/GEOMImpl/GEOMImpl_IMarker.hxx | 88 + src/GEOMImpl/GEOMImpl_IMeasure.hxx | 41 + src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 926 ++ src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 93 + src/GEOMImpl/GEOMImpl_IMirror.hxx | 49 + src/GEOMImpl/GEOMImpl_IOffset.hxx | 45 + src/GEOMImpl/GEOMImpl_IPartition.hxx | 82 + src/GEOMImpl/GEOMImpl_IPipe.hxx | 43 + src/GEOMImpl/GEOMImpl_IPlane.hxx | 66 + src/GEOMImpl/GEOMImpl_IPoint.hxx | 63 + src/GEOMImpl/GEOMImpl_IPolyline.hxx | 45 + src/GEOMImpl/GEOMImpl_IPosition.hxx | 52 + src/GEOMImpl/GEOMImpl_IPrism.hxx | 54 + src/GEOMImpl/GEOMImpl_IRevolution.hxx | 50 + src/GEOMImpl/GEOMImpl_IRotate.hxx | 66 + src/GEOMImpl/GEOMImpl_IScale.hxx | 50 + src/GEOMImpl/GEOMImpl_IShapes.hxx | 74 + src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 2039 ++++ src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 284 + src/GEOMImpl/GEOMImpl_ISketcher.hxx | 53 + src/GEOMImpl/GEOMImpl_ISphere.hxx | 45 + src/GEOMImpl/GEOMImpl_ISpline.hxx | 45 + src/GEOMImpl/GEOMImpl_ITorus.hxx | 51 + .../GEOMImpl_ITransformOperations.cxx | 1329 +++ .../GEOMImpl_ITransformOperations.hxx | 112 + src/GEOMImpl/GEOMImpl_ITranslate.hxx | 95 + src/GEOMImpl/GEOMImpl_IVector.hxx | 55 + src/GEOMImpl/GEOMImpl_ImportDriver.cxx | 162 + src/GEOMImpl/GEOMImpl_ImportDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_LineDriver.cxx | 174 + src/GEOMImpl/GEOMImpl_LineDriver.hxx | 157 + src/GEOMImpl/GEOMImpl_MarkerDriver.cxx | 160 + src/GEOMImpl/GEOMImpl_MarkerDriver.hxx | 157 + src/GEOMImpl/GEOMImpl_MeasureDriver.cxx | 154 + src/GEOMImpl/GEOMImpl_MeasureDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_MirrorDriver.cxx | 186 + src/GEOMImpl/GEOMImpl_MirrorDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_OffsetDriver.cxx | 148 + src/GEOMImpl/GEOMImpl_OffsetDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_PartitionDriver.cxx | 288 + src/GEOMImpl/GEOMImpl_PartitionDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_PipeDriver.cxx | 159 + src/GEOMImpl/GEOMImpl_PipeDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_PlaneDriver.cxx | 183 + src/GEOMImpl/GEOMImpl_PlaneDriver.hxx | 157 + src/GEOMImpl/GEOMImpl_PointDriver.cxx | 158 + src/GEOMImpl/GEOMImpl_PointDriver.hxx | 157 + src/GEOMImpl/GEOMImpl_PolylineDriver.cxx | 144 + src/GEOMImpl/GEOMImpl_PolylineDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_PositionDriver.cxx | 193 + src/GEOMImpl/GEOMImpl_PositionDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_PrismDriver.cxx | 165 + src/GEOMImpl/GEOMImpl_PrismDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx | 165 + src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_RotateDriver.cxx | 264 + src/GEOMImpl/GEOMImpl_RotateDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ScaleDriver.cxx | 138 + src/GEOMImpl/GEOMImpl_ScaleDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 413 + src/GEOMImpl/GEOMImpl_ShapeDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_SketcherDriver.cxx | 169 + src/GEOMImpl/GEOMImpl_SketcherDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_SphereDriver.cxx | 133 + src/GEOMImpl/GEOMImpl_SphereDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_SplineDriver.cxx | 176 + src/GEOMImpl/GEOMImpl_SplineDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_Template.cxx | 107 + src/GEOMImpl/GEOMImpl_Template.hxx | 158 + src/GEOMImpl/GEOMImpl_TorusDriver.cxx | 162 + src/GEOMImpl/GEOMImpl_TorusDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_TranslateDriver.cxx | 243 + src/GEOMImpl/GEOMImpl_TranslateDriver.hxx | 158 + src/GEOMImpl/GEOMImpl_Types.hxx | 230 + src/GEOMImpl/GEOMImpl_VectorDriver.cxx | 155 + src/GEOMImpl/GEOMImpl_VectorDriver.hxx | 157 + src/GEOMToolsGUI/GEOMToolsGUI.cxx | 653 ++ src/GEOM_I/GEOM_DumpPython.cc | 113 + src/GEOM_I/GEOM_Gen_i.cc | 887 ++ src/GEOM_I/GEOM_Gen_i.hh | 227 + src/GEOM_I/GEOM_I3DPrimOperations_i.cc | 486 + src/GEOM_I/GEOM_I3DPrimOperations_i.hh | 101 + src/GEOM_I/GEOM_IBasicOperations_i.cc | 390 + src/GEOM_I/GEOM_IBasicOperations_i.hh | 87 + src/GEOM_I/GEOM_IBlocksOperations_i.cc | 1056 +++ src/GEOM_I/GEOM_IBlocksOperations_i.hh | 152 + src/GEOM_I/GEOM_IBooleanOperations_i.cc | 202 + src/GEOM_I/GEOM_IBooleanOperations_i.hh | 62 + src/GEOM_I/GEOM_ICurvesOperations_i.cc | 347 + src/GEOM_I/GEOM_ICurvesOperations_i.hh | 72 + src/GEOM_I/GEOM_IGroupOperations_i.cc | 330 + src/GEOM_I/GEOM_IGroupOperations_i.hh | 66 + src/GEOM_I/GEOM_IHealingOperations_i.cc | 456 + src/GEOM_I/GEOM_IHealingOperations_i.hh | 72 + src/GEOM_I/GEOM_IInsertOperations_i.cc | 219 + src/GEOM_I/GEOM_IInsertOperations_i.hh | 61 + src/GEOM_I/GEOM_ILocalOperations_i.cc | 294 + src/GEOM_I/GEOM_ILocalOperations_i.hh | 69 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 305 + src/GEOM_I/GEOM_IMeasureOperations_i.hh | 83 + src/GEOM_I/GEOM_IOperations_i.cc | 138 + src/GEOM_I/GEOM_IOperations_i.hh | 64 + src/GEOM_I/GEOM_IShapesOperations_i.cc | 998 ++ src/GEOM_I/GEOM_IShapesOperations_i.hh | 144 + src/GEOM_I/GEOM_ITransformOperations_i.cc | 950 ++ src/GEOM_I/GEOM_ITransformOperations_i.hh | 130 + src/GEOM_I/GEOM_Object_i.cc | 315 + src/GEOM_I/GEOM_Object_i.hh | 82 + src/GEOM_I/Makefile.in | 98 + src/GEOM_I_Superv/GEOM_List_i.hh | 104 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 1937 ++++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 503 + src/GEOM_SWIG/GEOM_Nut.py | 68 + src/GEOM_SWIG/GEOM_TestOthers.py | 451 + src/GEOM_SWIG/batchmode_geompy.py | 1203 +++ src/GEOM_SWIG/geompy.py | 2603 +++++ src/GEOM_SWIG/libGEOM_Swig.i | 31 + .../GenerationGUI_FillingDlg.cxx | 345 + src/GenerationGUI/GenerationGUI_PipeDlg.cxx | 308 + src/GenerationGUI/GenerationGUI_PrismDlg.cxx | 343 + src/GenerationGUI/GenerationGUI_RevolDlg.cxx | 363 + src/GroupGUI/GroupGUI.cxx | 152 + src/GroupGUI/GroupGUI_GroupDlg.cxx | 729 ++ src/IGESExport/IGESExport.cxx | 71 + src/IGESImport/IGESImport.cxx | 95 + .../MeasureGUI_1Sel12LineEdit_QTD.cxx | 169 + .../MeasureGUI_1Sel12LineEdit_QTD.h | 78 + .../MeasureGUI_1Sel1TextView_QTD.cxx | 96 + src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h | 63 + .../MeasureGUI_1Sel3LineEdit_QTD.cxx | 123 + src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h | 67 + .../MeasureGUI_1Sel6LineEdit_QTD.cxx | 151 + src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h | 73 + .../MeasureGUI_2Sel1LineEdit_QTD.cxx | 119 + src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h | 66 + src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx | 341 + src/MeasureGUI/MeasureGUI_PointDlg.cxx | 223 + src/MeasureGUI/MeasureGUI_Skeleton.cxx | 344 + src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx | 118 + src/MeasureGUI/MeasureGUI_Skeleton_QTD.h | 65 + src/MeasureGUI/UIFiles/ui_to_cxx | 38 + src/NMTAlgo/Makefile.in | 70 + src/NMTAlgo/NMTAlgo.cdl | 59 + src/NMTAlgo/NMTAlgo_Algo.cdl | 78 + src/NMTAlgo/NMTAlgo_Algo.cxx | 138 + src/NMTAlgo/NMTAlgo_Algo.jxx | 28 + src/NMTAlgo/NMTAlgo_Builder.cdl | 98 + src/NMTAlgo/NMTAlgo_Builder.cxx | 668 ++ src/NMTAlgo/NMTAlgo_Builder.jxx | 31 + src/NMTAlgo/NMTAlgo_Loop3d.cdl | 85 + src/NMTAlgo/NMTAlgo_Loop3d.cxx | 349 + src/NMTAlgo/NMTAlgo_Loop3d.jxx | 40 + src/NMTAlgo/NMTAlgo_Splitter.cdl | 200 + src/NMTAlgo/NMTAlgo_Splitter.cxx | 624 ++ src/NMTAlgo/NMTAlgo_Splitter.jxx | 31 + src/NMTAlgo/NMTAlgo_Splitter1.cdl | 92 + src/NMTAlgo/NMTAlgo_Splitter1.cxx | 375 + src/NMTAlgo/NMTAlgo_Splitter1.jxx | 28 + src/NMTAlgo/NMTAlgo_Splitter_1.cxx | 935 ++ src/NMTAlgo/NMTAlgo_Splitter_2.cxx | 679 ++ src/NMTAlgo/NMTAlgo_Tools.cdl | 90 + src/NMTAlgo/NMTAlgo_Tools.cxx | 518 + src/NMTAlgo/NMTAlgo_Tools.jxx | 40 + src/NMTDS/NMTDS.cdl | 58 + src/NMTDS/NMTDS_IndexRange.cdl | 58 + src/NMTDS/NMTDS_IndexRange.cxx | 76 + src/NMTDS/NMTDS_IndexRange.jxx | 22 + src/NMTDS/NMTDS_ShapesDataStructure.cdl | 77 + src/NMTDS/NMTDS_ShapesDataStructure.cxx | 257 + src/NMTDS/NMTDS_ShapesDataStructure.hxx | 116 + src/NMTDS/NMTDS_ShapesDataStructure.jxx | 28 + src/NMTTools/Makefile.in | 103 + src/NMTTools/NMTTools.cdl | 85 + src/NMTTools/NMTTools_CommonBlock.cdl | 107 + src/NMTTools/NMTTools_CommonBlock.cxx | 246 + src/NMTTools/NMTTools_CommonBlock.jxx | 31 + src/NMTTools/NMTTools_CommonBlockAPI.cdl | 73 + src/NMTTools/NMTTools_CommonBlockAPI.cxx | 133 + src/NMTTools/NMTTools_CommonBlockAPI.jxx | 34 + src/NMTTools/NMTTools_CoupleOfShape.cdl | 58 + src/NMTTools/NMTTools_CoupleOfShape.cxx | 64 + src/NMTTools/NMTTools_CoupleOfShape.jxx | 25 + src/NMTTools/NMTTools_DEProcessor.cdl | 124 + src/NMTTools/NMTTools_DEProcessor.cxx | 511 + src/NMTTools/NMTTools_DEProcessor.jxx | 37 + src/NMTTools/NMTTools_DSFiller.cdl | 99 + src/NMTTools/NMTTools_DSFiller.cxx | 168 + src/NMTTools/NMTTools_DSFiller.jxx | 34 + .../NMTTools_IteratorOfCoupleOfShape.cdl | 74 + .../NMTTools_IteratorOfCoupleOfShape.cxx | 159 + .../NMTTools_IteratorOfCoupleOfShape.jxx | 28 + src/NMTTools/NMTTools_PCurveMaker.cdl | 54 + src/NMTTools/NMTTools_PCurveMaker.cxx | 128 + src/NMTTools/NMTTools_PCurveMaker.jxx | 22 + src/NMTTools/NMTTools_PaveFiller.cdl | 460 + src/NMTTools/NMTTools_PaveFiller.cxx | 231 + src/NMTTools/NMTTools_PaveFiller.jxx | 85 + src/NMTTools/NMTTools_PaveFiller_0.cxx | 137 + src/NMTTools/NMTTools_PaveFiller_1.cxx | 189 + src/NMTTools/NMTTools_PaveFiller_2.cxx | 230 + src/NMTTools/NMTTools_PaveFiller_3.cxx | 107 + src/NMTTools/NMTTools_PaveFiller_4.cxx | 1095 +++ src/NMTTools/NMTTools_PaveFiller_5.cxx | 624 ++ src/NMTTools/NMTTools_PaveFiller_6.cxx | 1220 +++ src/NMTTools/NMTTools_PaveFiller_7.cxx | 280 + src/NMTTools/NMTTools_PaveFiller_8.cxx | 614 ++ src/NMTTools/NMTTools_PaveFiller_9.cxx | 124 + src/NMTTools/NMTTools_Tools.cdl | 91 + src/NMTTools/NMTTools_Tools.cxx | 569 ++ src/NMTTools/NMTTools_Tools.jxx | 55 + .../OperationGUI_ArchimedeDlg.cxx | 267 + src/OperationGUI/OperationGUI_ChamferDlg.cxx | 708 ++ src/OperationGUI/OperationGUI_ClippingDlg.cxx | 403 + src/OperationGUI/OperationGUI_FilletDlg.cxx | 635 ++ src/OperationGUI/OperationGUI_MaterialDlg.cxx | 238 + .../OperationGUI_PartitionDlg.cxx | 554 ++ src/PARTITION/Partition.cdl | 63 + src/PARTITION/Partition_Inter2d.cdl | 110 + src/PARTITION/Partition_Inter3d.cdl | 194 + src/PARTITION/Partition_Loop.cdl | 106 + src/PARTITION/Partition_Loop2d.cdl | 102 + src/PARTITION/Partition_Loop3d.cdl | 88 + src/PARTITION/Partition_Spliter.cdl | 204 + src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx | 412 + src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx | 471 + src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx | 447 + src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx | 398 + src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx | 445 + src/RepairGUI/RepairGUI.cxx | 146 + src/RepairGUI/RepairGUI_CloseContourDlg.cxx | 398 + src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx | 365 + src/RepairGUI/RepairGUI_DivideEdgeDlg.h | 88 + src/RepairGUI/RepairGUI_FreeBoundDlg.cxx | 282 + src/RepairGUI/RepairGUI_FreeFacesDlg.cxx | 330 + src/RepairGUI/RepairGUI_GlueDlg.cxx | 447 + src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx | 448 + src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx | 391 + src/RepairGUI/RepairGUI_SewingDlg.cxx | 369 + src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx | 847 ++ src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx | 349 + src/STEPExport/STEPExport.cxx | 72 + src/STEPImport/STEPImport.cxx | 133 + src/ShHealOper/Makefile.in | 80 + src/ShHealOper/ShHealOper_CloseContour.cxx | 426 + .../TransformationGUI_MirrorDlg.cxx | 452 + .../TransformationGUI_MultiRotationDlg.cxx | 483 + .../TransformationGUI_MultiTranslationDlg.cxx | 546 ++ .../TransformationGUI_OffsetDlg.cxx | 352 + .../TransformationGUI_PositionDlg.cxx | 445 + .../TransformationGUI_RotationDlg.cxx | 386 + .../TransformationGUI_ScaleDlg.cxx | 374 + .../TransformationGUI_TranslationDlg.cxx | 527 ++ 935 files changed, 171672 insertions(+) create mode 100644 INSTALL create mode 100644 adm_local/unix/make_commence.in create mode 100755 bin/VERSION create mode 100755 build_configure create mode 100644 doc/Makefile.in create mode 100644 doc/salome/GEOM_index_v3.1.0.html create mode 100644 doc/salome/Makefile.in create mode 100755 doc/salome/gui/GEOM/add_point_on_edge.htm create mode 100755 doc/salome/gui/GEOM/arc.htm create mode 100755 doc/salome/gui/GEOM/archimede.htm create mode 100755 doc/salome/gui/GEOM/basic_geometrical_objects.htm create mode 100755 doc/salome/gui/GEOM/basic_operations.htm create mode 100755 doc/salome/gui/GEOM/blocks_operations.htm create mode 100755 doc/salome/gui/GEOM/boolean_operations.htm create mode 100755 doc/salome/gui/GEOM/box.htm create mode 100755 doc/salome/gui/GEOM/building_by_blocks.htm create mode 100755 doc/salome/gui/GEOM/chamfer.htm create mode 100755 doc/salome/gui/GEOM/changing_display_parameters.htm create mode 100755 doc/salome/gui/GEOM/changing_displaying_parameters.htm create mode 100755 doc/salome/gui/GEOM/check_free_boundaries.htm create mode 100755 doc/salome/gui/GEOM/check_free_faces.htm create mode 100755 doc/salome/gui/GEOM/circle.htm create mode 100755 doc/salome/gui/GEOM/close_contour.htm create mode 100755 doc/salome/gui/GEOM/common.htm create mode 100755 doc/salome/gui/GEOM/complex_objects.htm create mode 100755 doc/salome/gui/GEOM/compound.htm create mode 100755 doc/salome/gui/GEOM/cone.htm create mode 100755 doc/salome/gui/GEOM/curve.htm create mode 100755 doc/salome/gui/GEOM/cut.htm create mode 100755 doc/salome/gui/GEOM/cylinder.htm create mode 100755 doc/salome/gui/GEOM/edge.htm create mode 100755 doc/salome/gui/GEOM/ellipse.htm create mode 100755 doc/salome/gui/GEOM/explode.htm create mode 100755 doc/salome/gui/GEOM/explode_on_blocks.htm create mode 100755 doc/salome/gui/GEOM/extrusion.htm create mode 100755 doc/salome/gui/GEOM/face.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_basicgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_booleangui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_buildgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_generationgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_geomtoolsgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_measuregui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_operationgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_primitivegui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_repairgui_functions.htm create mode 100755 doc/salome/gui/GEOM/files/salome2_sp3_transformationgui_functions.htm create mode 100755 doc/salome/gui/GEOM/fillet.htm create mode 100755 doc/salome/gui/GEOM/filling.htm create mode 100755 doc/salome/gui/GEOM/fuse.htm create mode 100755 doc/salome/gui/GEOM/geom.log create mode 100755 doc/salome/gui/GEOM/geometrical_objects.htm create mode 100644 doc/salome/gui/GEOM/geompy_doc/GEOM__TestMeasures_8py.html create mode 100644 doc/salome/gui/GEOM/geompy_doc/doxygen.css create mode 100644 doc/salome/gui/GEOM/geompy_doc/doxygen.png create mode 100644 doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.jpg create mode 100644 doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.map create mode 100644 doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.md5 create mode 100644 doc/salome/gui/GEOM/geompy_doc/namespaceGEOM__TestMeasures.html create mode 100644 doc/salome/gui/GEOM/geompy_doc/namespacegeompy.html create mode 100755 doc/salome/gui/GEOM/glue_faces.htm create mode 100755 doc/salome/gui/GEOM/groups.htm create mode 100755 doc/salome/gui/GEOM/image10.gif create mode 100755 doc/salome/gui/GEOM/image27.gif create mode 100755 doc/salome/gui/GEOM/image3.gif create mode 100755 doc/salome/gui/GEOM/line.htm create mode 100755 doc/salome/gui/GEOM/local_coordinate_system.htm create mode 100755 doc/salome/gui/GEOM/measurement_tools.htm create mode 100755 doc/salome/gui/GEOM/mirror_image.htm create mode 100755 doc/salome/gui/GEOM/modify_the_location.htm create mode 100755 doc/salome/gui/GEOM/multi_rotation.htm create mode 100755 doc/salome/gui/GEOM/multi_transformation.htm create mode 100755 doc/salome/gui/GEOM/multi_translation.htm create mode 100755 doc/salome/gui/GEOM/newentity_blocks.htm create mode 100755 doc/salome/gui/GEOM/offset_surface.htm create mode 100755 doc/salome/gui/GEOM/partition.htm create mode 100755 doc/salome/gui/GEOM/pics/arc.png create mode 100755 doc/salome/gui/GEOM/pics/archimede.png create mode 100755 doc/salome/gui/GEOM/pics/archimedesn1.png create mode 100755 doc/salome/gui/GEOM/pics/archimedesn2.png create mode 100755 doc/salome/gui/GEOM/pics/archimedesn3.png create mode 100755 doc/salome/gui/GEOM/pics/arcsn.png create mode 100755 doc/salome/gui/GEOM/pics/bezier.png create mode 100755 doc/salome/gui/GEOM/pics/block1.png create mode 100755 doc/salome/gui/GEOM/pics/block2.png create mode 100755 doc/salome/gui/GEOM/pics/block3.png create mode 100755 doc/salome/gui/GEOM/pics/block4.png create mode 100755 doc/salome/gui/GEOM/pics/block5.png create mode 100755 doc/salome/gui/GEOM/pics/block_explodesn.png create mode 100755 doc/salome/gui/GEOM/pics/bool1.png create mode 100755 doc/salome/gui/GEOM/pics/bool2.png create mode 100755 doc/salome/gui/GEOM/pics/bool3.png create mode 100755 doc/salome/gui/GEOM/pics/box1.png create mode 100755 doc/salome/gui/GEOM/pics/box2.png create mode 100755 doc/salome/gui/GEOM/pics/boxes.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer1.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer2.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer3.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer_all.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer_edge.png create mode 100755 doc/salome/gui/GEOM/pics/chamfer_faces.png create mode 100755 doc/salome/gui/GEOM/pics/circle1.png create mode 100755 doc/salome/gui/GEOM/pics/circle2.png create mode 100755 doc/salome/gui/GEOM/pics/circles.png create mode 100755 doc/salome/gui/GEOM/pics/colorsn.png create mode 100755 doc/salome/gui/GEOM/pics/commonsn.png create mode 100755 doc/salome/gui/GEOM/pics/compoundsn.png create mode 100755 doc/salome/gui/GEOM/pics/cone1.png create mode 100755 doc/salome/gui/GEOM/pics/cone2.png create mode 100755 doc/salome/gui/GEOM/pics/cones.png create mode 100755 doc/salome/gui/GEOM/pics/creategroup.png create mode 100755 doc/salome/gui/GEOM/pics/curve.png create mode 100755 doc/salome/gui/GEOM/pics/cutsn.png create mode 100755 doc/salome/gui/GEOM/pics/cylinder1.png create mode 100755 doc/salome/gui/GEOM/pics/cylinder2.png create mode 100755 doc/salome/gui/GEOM/pics/cylinders.png create mode 100755 doc/salome/gui/GEOM/pics/disp_mode1sn.png create mode 100755 doc/salome/gui/GEOM/pics/disp_mode2sn.png create mode 100755 doc/salome/gui/GEOM/pics/distance.png create mode 100755 doc/salome/gui/GEOM/pics/edgesn.png create mode 100755 doc/salome/gui/GEOM/pics/editgroup.png create mode 100755 doc/salome/gui/GEOM/pics/ellipse.png create mode 100755 doc/salome/gui/GEOM/pics/ellipsesn.png create mode 100755 doc/salome/gui/GEOM/pics/export.png create mode 100755 doc/salome/gui/GEOM/pics/extrusion.png create mode 100755 doc/salome/gui/GEOM/pics/facesn1.png create mode 100755 doc/salome/gui/GEOM/pics/facesn2.png create mode 100755 doc/salome/gui/GEOM/pics/facesn3.png create mode 100755 doc/salome/gui/GEOM/pics/fillet1.png create mode 100755 doc/salome/gui/GEOM/pics/fillet2.png create mode 100755 doc/salome/gui/GEOM/pics/fillet3.png create mode 100755 doc/salome/gui/GEOM/pics/fillet_all.png create mode 100755 doc/salome/gui/GEOM/pics/fillet_edge.png create mode 100755 doc/salome/gui/GEOM/pics/fillet_prism.png create mode 100755 doc/salome/gui/GEOM/pics/filling.png create mode 100755 doc/salome/gui/GEOM/pics/filling_compoundsn.png create mode 100755 doc/salome/gui/GEOM/pics/fillingsn.png create mode 100755 doc/salome/gui/GEOM/pics/free_boudaries1.png create mode 100755 doc/salome/gui/GEOM/pics/free_boudaries2.png create mode 100755 doc/salome/gui/GEOM/pics/free_faces1.png create mode 100755 doc/salome/gui/GEOM/pics/free_faces2.png create mode 100755 doc/salome/gui/GEOM/pics/fusesn1.png create mode 100755 doc/salome/gui/GEOM/pics/fusesn2.png create mode 100755 doc/salome/gui/GEOM/pics/glue_faces1.png create mode 100755 doc/salome/gui/GEOM/pics/glue_faces2.png create mode 100755 doc/salome/gui/GEOM/pics/import.png create mode 100755 doc/salome/gui/GEOM/pics/interpol.png create mode 100755 doc/salome/gui/GEOM/pics/isos_u12_v12sn.png create mode 100755 doc/salome/gui/GEOM/pics/line.png create mode 100755 doc/salome/gui/GEOM/pics/lines.png create mode 100755 doc/salome/gui/GEOM/pics/measures1.png create mode 100755 doc/salome/gui/GEOM/pics/measures10.png create mode 100755 doc/salome/gui/GEOM/pics/measures3.png create mode 100755 doc/salome/gui/GEOM/pics/measures4.png create mode 100755 doc/salome/gui/GEOM/pics/measures5.png create mode 100755 doc/salome/gui/GEOM/pics/measures8.png create mode 100755 doc/salome/gui/GEOM/pics/measures9.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_axissn1.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_axissn2.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_planesn1.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_planesn2.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_pointsn1.png create mode 100755 doc/salome/gui/GEOM/pics/mirror_pointsn2.png create mode 100755 doc/salome/gui/GEOM/pics/mtrans1.png create mode 100755 doc/salome/gui/GEOM/pics/mtrans2.png create mode 100755 doc/salome/gui/GEOM/pics/mtransf1.png create mode 100755 doc/salome/gui/GEOM/pics/mtransf2.png create mode 100755 doc/salome/gui/GEOM/pics/mtransf3.png create mode 100755 doc/salome/gui/GEOM/pics/mtransf4.png create mode 100755 doc/salome/gui/GEOM/pics/multi_rotation1d1.png create mode 100755 doc/salome/gui/GEOM/pics/multi_rotation1d2.png create mode 100755 doc/salome/gui/GEOM/pics/multi_rotation2d1.png create mode 100755 doc/salome/gui/GEOM/pics/multi_rotation2d2.png create mode 100755 doc/salome/gui/GEOM/pics/multi_transformationsn1d.png create mode 100755 doc/salome/gui/GEOM/pics/multi_transformationsn2d.png create mode 100755 doc/salome/gui/GEOM/pics/multi_translation1dsn.png create mode 100755 doc/salome/gui/GEOM/pics/multi_translation2dsn.png create mode 100755 doc/salome/gui/GEOM/pics/multi_translation_initialsn.png create mode 100755 doc/salome/gui/GEOM/pics/neo-basicprop.png create mode 100755 doc/salome/gui/GEOM/pics/neo-detect2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-isos.png create mode 100755 doc/salome/gui/GEOM/pics/neo-localcs1.png create mode 100755 doc/salome/gui/GEOM/pics/neo-localcs2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-localcs3.png create mode 100755 doc/salome/gui/GEOM/pics/neo-materials.png create mode 100755 doc/salome/gui/GEOM/pics/neo-mrot1.png create mode 100755 doc/salome/gui/GEOM/pics/neo-mrot2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj1.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj3.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj4.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj5.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj6.png create mode 100755 doc/salome/gui/GEOM/pics/neo-obj7.png create mode 100755 doc/salome/gui/GEOM/pics/neo-point2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-scetcher1.png create mode 100755 doc/salome/gui/GEOM/pics/neo-scetcher2.png create mode 100755 doc/salome/gui/GEOM/pics/neo-section.png create mode 100755 doc/salome/gui/GEOM/pics/neo-transparency.png create mode 100755 doc/salome/gui/GEOM/pics/new-tolerance.png create mode 100755 doc/salome/gui/GEOM/pics/offsetsn.png create mode 100755 doc/salome/gui/GEOM/pics/partition1.png create mode 100755 doc/salome/gui/GEOM/pics/partition2.png create mode 100755 doc/salome/gui/GEOM/pics/partitionsn1.png create mode 100755 doc/salome/gui/GEOM/pics/partitionsn2.png create mode 100755 doc/salome/gui/GEOM/pics/pipe.png create mode 100755 doc/salome/gui/GEOM/pics/pipe_wire_edgesn.png create mode 100755 doc/salome/gui/GEOM/pics/pipesn.png create mode 100755 doc/salome/gui/GEOM/pics/plane1.png create mode 100755 doc/salome/gui/GEOM/pics/plane2.png create mode 100755 doc/salome/gui/GEOM/pics/plane3.png create mode 100755 doc/salome/gui/GEOM/pics/plane_on_face.png create mode 100755 doc/salome/gui/GEOM/pics/planes1.png create mode 100755 doc/salome/gui/GEOM/pics/point1.png create mode 100755 doc/salome/gui/GEOM/pics/point3.png create mode 100755 doc/salome/gui/GEOM/pics/points.png create mode 100755 doc/salome/gui/GEOM/pics/polyline.png create mode 100755 doc/salome/gui/GEOM/pics/prisms_basessn.png create mode 100755 doc/salome/gui/GEOM/pics/prismssn.png create mode 100755 doc/salome/gui/GEOM/pics/repair1.png create mode 100755 doc/salome/gui/GEOM/pics/repair10.png create mode 100755 doc/salome/gui/GEOM/pics/repair2.png create mode 100755 doc/salome/gui/GEOM/pics/repair3.png create mode 100755 doc/salome/gui/GEOM/pics/repair4.png create mode 100755 doc/salome/gui/GEOM/pics/repair5.png create mode 100755 doc/salome/gui/GEOM/pics/repair6.png create mode 100755 doc/salome/gui/GEOM/pics/repair7.png create mode 100755 doc/salome/gui/GEOM/pics/repair8.png create mode 100755 doc/salome/gui/GEOM/pics/repair9.png create mode 100755 doc/salome/gui/GEOM/pics/revolution.png create mode 100755 doc/salome/gui/GEOM/pics/revolutionsn.png create mode 100755 doc/salome/gui/GEOM/pics/rotationsn1.png create mode 100755 doc/salome/gui/GEOM/pics/rotationsn2.png create mode 100755 doc/salome/gui/GEOM/pics/scale_transformsn1.png create mode 100755 doc/salome/gui/GEOM/pics/scale_transformsn2.png create mode 100755 doc/salome/gui/GEOM/pics/sectionsn.png create mode 100755 doc/salome/gui/GEOM/pics/shellsn.png create mode 100755 doc/salome/gui/GEOM/pics/solidsn.png create mode 100755 doc/salome/gui/GEOM/pics/sphere1.png create mode 100755 doc/salome/gui/GEOM/pics/sphere2.png create mode 100755 doc/salome/gui/GEOM/pics/spheres.png create mode 100755 doc/salome/gui/GEOM/pics/supp_int_wires1.png create mode 100755 doc/salome/gui/GEOM/pics/supp_int_wires2.png create mode 100755 doc/salome/gui/GEOM/pics/suppress_faces1.png create mode 100755 doc/salome/gui/GEOM/pics/suppress_faces2.png create mode 100755 doc/salome/gui/GEOM/pics/torus1.png create mode 100755 doc/salome/gui/GEOM/pics/torus2.png create mode 100755 doc/salome/gui/GEOM/pics/toruses.png create mode 100755 doc/salome/gui/GEOM/pics/transformation1.png create mode 100755 doc/salome/gui/GEOM/pics/transformation10.png create mode 100755 doc/salome/gui/GEOM/pics/transformation11.png create mode 100755 doc/salome/gui/GEOM/pics/transformation2.png create mode 100755 doc/salome/gui/GEOM/pics/transformation3.png create mode 100755 doc/salome/gui/GEOM/pics/transformation4.png create mode 100755 doc/salome/gui/GEOM/pics/transformation5.png create mode 100755 doc/salome/gui/GEOM/pics/transformation6.png create mode 100755 doc/salome/gui/GEOM/pics/transformation7.png create mode 100755 doc/salome/gui/GEOM/pics/transformation8.png create mode 100755 doc/salome/gui/GEOM/pics/transformation9.png create mode 100755 doc/salome/gui/GEOM/pics/translationsn1.png create mode 100755 doc/salome/gui/GEOM/pics/translationsn2.png create mode 100755 doc/salome/gui/GEOM/pics/transparencysn.png create mode 100755 doc/salome/gui/GEOM/pics/vector1.png create mode 100755 doc/salome/gui/GEOM/pics/vector2.png create mode 100755 doc/salome/gui/GEOM/pics/vectors.png create mode 100755 doc/salome/gui/GEOM/pics/wiresn.png create mode 100755 doc/salome/gui/GEOM/pics/workplane4.png create mode 100755 doc/salome/gui/GEOM/pics/workplane5.png create mode 100755 doc/salome/gui/GEOM/pics/workplane6.png create mode 100755 doc/salome/gui/GEOM/pipe_creation.htm create mode 100755 doc/salome/gui/GEOM/plane.htm create mode 100755 doc/salome/gui/GEOM/point.htm create mode 100755 doc/salome/gui/GEOM/primitives.htm create mode 100755 doc/salome/gui/GEOM/propagate.htm create mode 100755 doc/salome/gui/GEOM/repairing_operations.htm create mode 100755 doc/salome/gui/GEOM/revolution.htm create mode 100755 doc/salome/gui/GEOM/rotation.htm create mode 100755 doc/salome/gui/GEOM/scale_transform.htm create mode 100755 doc/salome/gui/GEOM/section.htm create mode 100755 doc/salome/gui/GEOM/sewing.htm create mode 100755 doc/salome/gui/GEOM/shape_processing.htm create mode 100755 doc/salome/gui/GEOM/shell.htm create mode 100755 doc/salome/gui/GEOM/sketcher.htm create mode 100755 doc/salome/gui/GEOM/sketcher_tui.htm create mode 100755 doc/salome/gui/GEOM/solid.htm create mode 100755 doc/salome/gui/GEOM/sphere.htm create mode 100755 doc/salome/gui/GEOM/suppress_faces.htm create mode 100755 doc/salome/gui/GEOM/suppress_holes.htm create mode 100755 doc/salome/gui/GEOM/suppress_internal_wires.htm create mode 100755 doc/salome/gui/GEOM/transformation_operations.htm create mode 100755 doc/salome/gui/GEOM/translation.htm create mode 100755 doc/salome/gui/GEOM/turus.htm create mode 100755 doc/salome/gui/GEOM/vector.htm create mode 100755 doc/salome/gui/GEOM/whdata/whftdata0.htm create mode 100755 doc/salome/gui/GEOM/whdata/whfts.htm create mode 100755 doc/salome/gui/GEOM/whdata/whfwdata0.htm create mode 100755 doc/salome/gui/GEOM/whdata/whtdata0.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf0.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf1.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf10.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf11.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf12.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf13.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf14.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf2.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf3.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf4.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf5.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf6.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf7.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf8.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstf9.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl0.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl10.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl11.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl12.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl13.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl14.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl15.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl16.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl17.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl18.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl19.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl2.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl20.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl21.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl22.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl23.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl24.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl25.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl3.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl4.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl5.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl6.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl7.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl8.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstfl9.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt1.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt10.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt11.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt12.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt13.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt14.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt15.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt16.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt2.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt3.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt4.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt5.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt6.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt7.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt8.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whlstt9.htm create mode 100755 doc/salome/gui/GEOM/whgdata/whnvl32.htm create mode 100755 doc/salome/gui/GEOM/whskin_info.htm create mode 100755 doc/salome/gui/GEOM/whxdata/whftdata0.xml create mode 100755 doc/salome/gui/GEOM/whxdata/whfts.xml create mode 100755 doc/salome/gui/GEOM/whxdata/whfwdata0.xml create mode 100755 doc/salome/gui/GEOM/whxdata/whtdata0.xml create mode 100755 doc/salome/gui/GEOM/wire.htm create mode 100755 doc/salome/gui/GEOM/working_plane.htm create mode 100755 doc/salome/gui/GEOM/working_with_groups.htm create mode 100755 doc/salome/tui/GEOM/doxyfile create mode 100755 doc/salome/tui/GEOM/doxyfile_py create mode 100755 doc/salome/tui/GEOM/sources/static/tree.js create mode 100644 idl/GEOM_Gen.idl create mode 100644 resources/GEOMCatalog.xml create mode 100644 src/BREPExport/BREPExport.cxx create mode 100644 src/BREPImport/BREPImport.cxx create mode 100644 src/BasicGUI/BasicGUI_ArcDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_CircleDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_CurveDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_EllipseDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_LineDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_MarkerDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_PlaneDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_PointDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_VectorDlg.cxx create mode 100644 src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx create mode 100644 src/BlocksGUI/BlocksGUI_BlockDlg.cxx create mode 100644 src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx create mode 100644 src/BlocksGUI/BlocksGUI_PropagateDlg.cxx create mode 100644 src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx create mode 100644 src/BlocksGUI/BlocksGUI_TrsfDlg.cxx create mode 100644 src/BooleanGUI/BooleanGUI_Dialog.cxx create mode 100644 src/BuildGUI/BuildGUI_CompoundDlg.cxx create mode 100644 src/BuildGUI/BuildGUI_EdgeDlg.cxx create mode 100644 src/BuildGUI/BuildGUI_FaceDlg.cxx create mode 100644 src/BuildGUI/BuildGUI_ShellDlg.cxx create mode 100644 src/BuildGUI/BuildGUI_SolidDlg.cxx create mode 100644 src/BuildGUI/BuildGUI_WireDlg.cxx create mode 100644 src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel1Check1List_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel1Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel2Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel3Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel3Check_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel3Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel4Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel5Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_1Sel_Ext.h create mode 100644 src/DlgRef/DlgRef_1Sel_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Sel_QTD.h create mode 100644 src/DlgRef/DlgRef_1Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_1Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel1Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel2Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel3Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_2Sel_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Sel_QTD.h create mode 100644 src/DlgRef/DlgRef_2Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_2Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_3Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Check_QTD.h create mode 100644 src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h create mode 100644 src/DlgRef/DlgRef_3Sel_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Sel_QTD.h create mode 100644 src/DlgRef/DlgRef_3Spin1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Spin1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_3Spin_QTD.cxx create mode 100644 src/DlgRef/DlgRef_3Spin_QTD.h create mode 100644 src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx create mode 100644 src/DlgRef/DlgRef_4Sel1List1Check_QTD.h create mode 100644 src/DlgRef/DlgRef_4Sel1List_QTD.cxx create mode 100644 src/DlgRef/DlgRef_4Sel1List_QTD.h create mode 100644 src/DlgRef/DlgRef_6Sel_QTD.cxx create mode 100644 src/DlgRef/DlgRef_6Sel_QTD.h create mode 100644 src/DlgRef/DlgRef_Skeleton_QTD.cxx create mode 100644 src/DlgRef/DlgRef_Skeleton_QTD.h create mode 100755 src/DlgRef/UIFiles/ui_to_cxx create mode 100644 src/EntityGUI/EntityGUI.cxx create mode 100644 src/EntityGUI/EntityGUI_1Sel_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_1Sel_QTD.h create mode 100644 src/EntityGUI/EntityGUI_1Spin_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_1Spin_QTD.h create mode 100644 src/EntityGUI/EntityGUI_2Spin_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_2Spin_QTD.h create mode 100644 src/EntityGUI/EntityGUI_3Spin_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_3Spin_QTD.h create mode 100644 src/EntityGUI/EntityGUI_4Spin_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_4Spin_QTD.h create mode 100644 src/EntityGUI/EntityGUI_Dir1_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_Dir1_QTD.h create mode 100644 src/EntityGUI/EntityGUI_Dir2_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_Dir2_QTD.h create mode 100644 src/EntityGUI/EntityGUI_Point_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_Point_QTD.h create mode 100644 src/EntityGUI/EntityGUI_Skeleton_QTD.cxx create mode 100644 src/EntityGUI/EntityGUI_Skeleton_QTD.h create mode 100644 src/EntityGUI/EntityGUI_SketcherDlg.cxx create mode 100644 src/EntityGUI/EntityGUI_SubShapeDlg.cxx create mode 100755 src/EntityGUI/UIFiles/ui_to_cxx create mode 100644 src/GEOM/GEOM_Application.cxx create mode 100644 src/GEOM/GEOM_Application.hxx create mode 100644 src/GEOM/GEOM_Application.ixx create mode 100644 src/GEOM/GEOM_Application.jxx create mode 100644 src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx create mode 100644 src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx create mode 100644 src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx create mode 100644 src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx create mode 100644 src/GEOM/GEOM_DataMapOfAsciiStringTransient.hxx create mode 100644 src/GEOM/GEOM_DataMapOfAsciiStringTransient_0.cxx create mode 100644 src/GEOM/GEOM_Engine.cxx create mode 100644 src/GEOM/GEOM_Engine.hxx create mode 100644 src/GEOM/GEOM_Function.cxx create mode 100644 src/GEOM/GEOM_Function.hxx create mode 100644 src/GEOM/GEOM_IOperations.cxx create mode 100644 src/GEOM/GEOM_IOperations.hxx create mode 100644 src/GEOM/GEOM_ISubShape.hxx create mode 100644 src/GEOM/GEOM_Object.cxx create mode 100644 src/GEOM/GEOM_Object.hxx create mode 100644 src/GEOM/GEOM_PythonDump.cxx create mode 100644 src/GEOM/GEOM_PythonDump.hxx create mode 100644 src/GEOM/GEOM_Solver.cxx create mode 100644 src/GEOM/GEOM_Solver.hxx create mode 100644 src/GEOM/GEOM_SubShapeDriver.cxx create mode 100644 src/GEOM/GEOM_SubShapeDriver.hxx create mode 100644 src/GEOM/Handle_GEOM_Application.hxx create mode 100644 src/GEOM/Makefile.in create mode 100644 src/GEOMAlgo/BlockFix.cdl create mode 100644 src/GEOMAlgo/BlockFix.cxx create mode 100644 src/GEOMAlgo/BlockFix.jxx create mode 100644 src/GEOMAlgo/BlockFix_BlockFixAPI.cdl create mode 100644 src/GEOMAlgo/BlockFix_BlockFixAPI.cxx create mode 100644 src/GEOMAlgo/BlockFix_BlockFixAPI.jxx create mode 100644 src/GEOMAlgo/BlockFix_BlockFixAPI.lxx create mode 100644 src/GEOMAlgo/BlockFix_CheckTool.cdl create mode 100644 src/GEOMAlgo/BlockFix_CheckTool.cxx create mode 100644 src/GEOMAlgo/BlockFix_CheckTool.jxx create mode 100644 src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.cdl create mode 100644 src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.cxx create mode 100644 src/GEOMAlgo/BlockFix_PeriodicSurfaceModifier.jxx create mode 100644 src/GEOMAlgo/BlockFix_SphereSpaceModifier.cdl create mode 100644 src/GEOMAlgo/BlockFix_SphereSpaceModifier.cxx create mode 100644 src/GEOMAlgo/BlockFix_SphereSpaceModifier.jxx create mode 100644 src/GEOMAlgo/BlockFix_UnionEdges.cdl create mode 100644 src/GEOMAlgo/BlockFix_UnionEdges.cxx create mode 100644 src/GEOMAlgo/BlockFix_UnionEdges.jxx create mode 100644 src/GEOMAlgo/BlockFix_UnionFaces.cdl create mode 100644 src/GEOMAlgo/BlockFix_UnionFaces.cxx create mode 100644 src/GEOMAlgo/BlockFix_UnionFaces.jxx create mode 100755 src/GEOMAlgo/GEOMAlgo.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_Algo.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_Algo.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Algo.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx create mode 100644 src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx create mode 100755 src/GEOMAlgo/GEOMAlgo_Gluer.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_Gluer.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Gluer.jxx create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKey.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKey.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_PassKey.jxx create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.jxx create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl create mode 100755 src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeAlgo.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_SolidSolid.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_StateCollector.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_StateCollector.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_StateCollector.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Tools.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_Tools.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_Tools.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx create mode 100644 src/GEOMAlgo/GEOMAlgo_WireSolid.cdl create mode 100644 src/GEOMAlgo/GEOMAlgo_WireSolid.cxx create mode 100644 src/GEOMAlgo/GEOMAlgo_WireSolid.jxx create mode 100644 src/GEOMAlgo/Makefile.in create mode 100644 src/GEOMBase/GEOMBase.cxx create mode 100755 src/GEOMBase/GEOMBase_Helper.cxx create mode 100644 src/GEOMBase/GEOMBase_Skeleton.cxx create mode 100644 src/GEOMBase/Makefile.in create mode 100644 src/GEOMClient/Makefile.in create mode 100644 src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_EdgeFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_FaceFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_FaceFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_LogicalFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_LogicalFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_OCCFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_OCCFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_PreviewFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_PreviewFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_SelectionFilter.h create mode 100644 src/GEOMFiltersSelection/GEOM_ShapeTypeFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_TypeFilter.cxx create mode 100644 src/GEOMFiltersSelection/GEOM_TypeFilter.h create mode 100644 src/GEOMGUI/GEOMGUI_OCCSelector.cxx create mode 100644 src/GEOMGUI/GEOMGUI_OCCSelector.h create mode 100644 src/GEOMGUI/GEOMGUI_Selection.cxx create mode 100644 src/GEOMGUI/GEOMGUI_Selection.h create mode 100644 src/GEOMGUI/GEOM_Displayer.cxx create mode 100644 src/GEOMGUI/GEOM_Displayer.h create mode 100644 src/GEOMGUI/GEOM_msg_en.po create mode 100644 src/GEOMGUI/GeometryGUI.cxx create mode 100644 src/GEOMGUI/GeometryGUI.h create mode 100644 src/GEOMImpl/GEOMImpl_ArcDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ArcDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_Block6Explorer.cxx create mode 100644 src/GEOMImpl/GEOMImpl_Block6Explorer.hxx create mode 100644 src/GEOMImpl/GEOMImpl_BlockDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_BlockDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_BooleanDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_BooleanDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_BoxDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_BoxDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ChamferDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ChamferDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_CircleDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_CircleDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ConeDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ConeDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_CopyDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_CopyDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_CylinderDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_CylinderDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_EllipseDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_EllipseDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ExportDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ExportDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_FilletDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_FilletDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_FillingDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_FillingDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_Gen.cxx create mode 100644 src/GEOMImpl/GEOMImpl_Gen.hxx create mode 100644 src/GEOMImpl/GEOMImpl_GlueDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_GlueDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_HealingDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_HealingDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IArc.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IArchimede.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBasicOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IBasicOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBlocks.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBoolean.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IBox.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IChamfer.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ICircle.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ICone.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ICopy.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ICylinder.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IEllipse.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IFillet.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IFilling.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IGlue.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IGroupOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IGroupOperations.hxx create mode 100755 src/GEOMImpl/GEOMImpl_IHealing.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IHealingOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IHealingOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IImportExport.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IInsertOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IInsertOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ILine.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ILocalOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ILocalOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IMarker.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IMeasure.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IMirror.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IOffset.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPartition.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPipe.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPlane.hxx create mode 100755 src/GEOMImpl/GEOMImpl_IPoint.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPolyline.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPosition.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IPrism.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IRevolution.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IRotate.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IScale.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IShapes.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IShapesOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_IShapesOperations.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ISketcher.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ISphere.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ISpline.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ITorus.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ITransformOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ITransformOperations.hxx create mode 100755 src/GEOMImpl/GEOMImpl_ITranslate.hxx create mode 100644 src/GEOMImpl/GEOMImpl_IVector.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ImportDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ImportDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_LineDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_LineDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_MarkerDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_MarkerDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_MeasureDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_MeasureDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_MirrorDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_MirrorDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_OffsetDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_OffsetDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PartitionDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PartitionDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PipeDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PipeDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PlaneDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PlaneDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PointDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PointDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PolylineDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PolylineDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PositionDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PositionDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_PrismDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_PrismDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_RotateDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_RotateDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ScaleDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ScaleDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_ShapeDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ShapeDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_SketcherDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_SketcherDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_SphereDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_SphereDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_SplineDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_SplineDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_Template.cxx create mode 100644 src/GEOMImpl/GEOMImpl_Template.hxx create mode 100644 src/GEOMImpl/GEOMImpl_TorusDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_TorusDriver.hxx create mode 100644 src/GEOMImpl/GEOMImpl_TranslateDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_TranslateDriver.hxx create mode 100755 src/GEOMImpl/GEOMImpl_Types.hxx create mode 100644 src/GEOMImpl/GEOMImpl_VectorDriver.cxx create mode 100644 src/GEOMImpl/GEOMImpl_VectorDriver.hxx create mode 100644 src/GEOMToolsGUI/GEOMToolsGUI.cxx create mode 100644 src/GEOM_I/GEOM_DumpPython.cc create mode 100644 src/GEOM_I/GEOM_Gen_i.cc create mode 100644 src/GEOM_I/GEOM_Gen_i.hh create mode 100644 src/GEOM_I/GEOM_I3DPrimOperations_i.cc create mode 100644 src/GEOM_I/GEOM_I3DPrimOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IBasicOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IBasicOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IBlocksOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IBlocksOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IBooleanOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IBooleanOperations_i.hh create mode 100644 src/GEOM_I/GEOM_ICurvesOperations_i.cc create mode 100644 src/GEOM_I/GEOM_ICurvesOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IGroupOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IGroupOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IHealingOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IHealingOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IInsertOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IInsertOperations_i.hh create mode 100644 src/GEOM_I/GEOM_ILocalOperations_i.cc create mode 100644 src/GEOM_I/GEOM_ILocalOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IMeasureOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IMeasureOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IOperations_i.hh create mode 100644 src/GEOM_I/GEOM_IShapesOperations_i.cc create mode 100644 src/GEOM_I/GEOM_IShapesOperations_i.hh create mode 100644 src/GEOM_I/GEOM_ITransformOperations_i.cc create mode 100644 src/GEOM_I/GEOM_ITransformOperations_i.hh create mode 100644 src/GEOM_I/GEOM_Object_i.cc create mode 100644 src/GEOM_I/GEOM_Object_i.hh create mode 100644 src/GEOM_I/Makefile.in create mode 100644 src/GEOM_I_Superv/GEOM_List_i.hh create mode 100644 src/GEOM_I_Superv/GEOM_Superv_i.cc create mode 100644 src/GEOM_I_Superv/GEOM_Superv_i.hh create mode 100755 src/GEOM_SWIG/GEOM_Nut.py create mode 100644 src/GEOM_SWIG/GEOM_TestOthers.py create mode 100644 src/GEOM_SWIG/batchmode_geompy.py create mode 100644 src/GEOM_SWIG/geompy.py create mode 100644 src/GEOM_SWIG/libGEOM_Swig.i create mode 100644 src/GenerationGUI/GenerationGUI_FillingDlg.cxx create mode 100644 src/GenerationGUI/GenerationGUI_PipeDlg.cxx create mode 100644 src/GenerationGUI/GenerationGUI_PrismDlg.cxx create mode 100644 src/GenerationGUI/GenerationGUI_RevolDlg.cxx create mode 100644 src/GroupGUI/GroupGUI.cxx create mode 100644 src/GroupGUI/GroupGUI_GroupDlg.cxx create mode 100644 src/IGESExport/IGESExport.cxx create mode 100644 src/IGESImport/IGESImport.cxx create mode 100644 src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.h create mode 100644 src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h create mode 100644 src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h create mode 100644 src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h create mode 100644 src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h create mode 100644 src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx create mode 100644 src/MeasureGUI/MeasureGUI_PointDlg.cxx create mode 100644 src/MeasureGUI/MeasureGUI_Skeleton.cxx create mode 100644 src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx create mode 100644 src/MeasureGUI/MeasureGUI_Skeleton_QTD.h create mode 100755 src/MeasureGUI/UIFiles/ui_to_cxx create mode 100644 src/NMTAlgo/Makefile.in create mode 100644 src/NMTAlgo/NMTAlgo.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Algo.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Algo.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Algo.jxx create mode 100644 src/NMTAlgo/NMTAlgo_Builder.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Builder.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Builder.jxx create mode 100644 src/NMTAlgo/NMTAlgo_Loop3d.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Loop3d.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Loop3d.jxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Splitter.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter.jxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter1.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Splitter1.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter1.jxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter_1.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Splitter_2.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Tools.cdl create mode 100644 src/NMTAlgo/NMTAlgo_Tools.cxx create mode 100644 src/NMTAlgo/NMTAlgo_Tools.jxx create mode 100644 src/NMTDS/NMTDS.cdl create mode 100644 src/NMTDS/NMTDS_IndexRange.cdl create mode 100644 src/NMTDS/NMTDS_IndexRange.cxx create mode 100644 src/NMTDS/NMTDS_IndexRange.jxx create mode 100644 src/NMTDS/NMTDS_ShapesDataStructure.cdl create mode 100644 src/NMTDS/NMTDS_ShapesDataStructure.cxx create mode 100644 src/NMTDS/NMTDS_ShapesDataStructure.hxx create mode 100644 src/NMTDS/NMTDS_ShapesDataStructure.jxx create mode 100644 src/NMTTools/Makefile.in create mode 100644 src/NMTTools/NMTTools.cdl create mode 100644 src/NMTTools/NMTTools_CommonBlock.cdl create mode 100644 src/NMTTools/NMTTools_CommonBlock.cxx create mode 100644 src/NMTTools/NMTTools_CommonBlock.jxx create mode 100644 src/NMTTools/NMTTools_CommonBlockAPI.cdl create mode 100644 src/NMTTools/NMTTools_CommonBlockAPI.cxx create mode 100644 src/NMTTools/NMTTools_CommonBlockAPI.jxx create mode 100644 src/NMTTools/NMTTools_CoupleOfShape.cdl create mode 100644 src/NMTTools/NMTTools_CoupleOfShape.cxx create mode 100644 src/NMTTools/NMTTools_CoupleOfShape.jxx create mode 100644 src/NMTTools/NMTTools_DEProcessor.cdl create mode 100644 src/NMTTools/NMTTools_DEProcessor.cxx create mode 100644 src/NMTTools/NMTTools_DEProcessor.jxx create mode 100644 src/NMTTools/NMTTools_DSFiller.cdl create mode 100644 src/NMTTools/NMTTools_DSFiller.cxx create mode 100644 src/NMTTools/NMTTools_DSFiller.jxx create mode 100644 src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cdl create mode 100644 src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cxx create mode 100644 src/NMTTools/NMTTools_IteratorOfCoupleOfShape.jxx create mode 100644 src/NMTTools/NMTTools_PCurveMaker.cdl create mode 100644 src/NMTTools/NMTTools_PCurveMaker.cxx create mode 100644 src/NMTTools/NMTTools_PCurveMaker.jxx create mode 100644 src/NMTTools/NMTTools_PaveFiller.cdl create mode 100644 src/NMTTools/NMTTools_PaveFiller.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller.jxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_0.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_1.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_2.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_3.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_4.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_5.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_6.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_7.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_8.cxx create mode 100644 src/NMTTools/NMTTools_PaveFiller_9.cxx create mode 100644 src/NMTTools/NMTTools_Tools.cdl create mode 100644 src/NMTTools/NMTTools_Tools.cxx create mode 100644 src/NMTTools/NMTTools_Tools.jxx create mode 100644 src/OperationGUI/OperationGUI_ArchimedeDlg.cxx create mode 100644 src/OperationGUI/OperationGUI_ChamferDlg.cxx create mode 100644 src/OperationGUI/OperationGUI_ClippingDlg.cxx create mode 100644 src/OperationGUI/OperationGUI_FilletDlg.cxx create mode 100644 src/OperationGUI/OperationGUI_MaterialDlg.cxx create mode 100644 src/OperationGUI/OperationGUI_PartitionDlg.cxx create mode 100644 src/PARTITION/Partition.cdl create mode 100644 src/PARTITION/Partition_Inter2d.cdl create mode 100644 src/PARTITION/Partition_Inter3d.cdl create mode 100644 src/PARTITION/Partition_Loop.cdl create mode 100644 src/PARTITION/Partition_Loop2d.cdl create mode 100644 src/PARTITION/Partition_Loop3d.cdl create mode 100644 src/PARTITION/Partition_Spliter.cdl create mode 100644 src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx create mode 100644 src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx create mode 100644 src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx create mode 100644 src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx create mode 100644 src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx create mode 100644 src/RepairGUI/RepairGUI.cxx create mode 100644 src/RepairGUI/RepairGUI_CloseContourDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_DivideEdgeDlg.h create mode 100644 src/RepairGUI/RepairGUI_FreeBoundDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_FreeFacesDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_GlueDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_SewingDlg.cxx create mode 100755 src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx create mode 100644 src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx create mode 100644 src/STEPExport/STEPExport.cxx create mode 100644 src/STEPImport/STEPImport.cxx create mode 100644 src/ShHealOper/Makefile.in create mode 100644 src/ShHealOper/ShHealOper_CloseContour.cxx create mode 100644 src/TransformationGUI/TransformationGUI_MirrorDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_OffsetDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_PositionDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_RotationDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_ScaleDlg.cxx create mode 100644 src/TransformationGUI/TransformationGUI_TranslationDlg.cxx diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..3adf46d88 --- /dev/null +++ b/INSTALL @@ -0,0 +1,4 @@ +This is the version 3.1.0 of GEOM +Compatible with : + - KERNEL 3.1.0 + - GUI 3.1.0 diff --git a/adm_local/unix/make_commence.in b/adm_local/unix/make_commence.in new file mode 100644 index 000000000..8054ab99b --- /dev/null +++ b/adm_local/unix/make_commence.in @@ -0,0 +1,257 @@ +# common directories to put headerfiles +inc_builddir=$(top_builddir)/include/salome + +@SET_MAKE@ +SHELL=/bin/sh + +# header missing + +HAVE_SSTREAM=@HAVE_SSTREAM@ + + +LIBS=@LIBS@ +LDFLAGS=@LDFLAGS@ -L$(top_builddir)/lib/salome -Xlinker -rpath-link -Xlinker -L$(top_builddir)/lib/salome +# add libstdc++ to link c++ library with libtool ! +LDFLAGS+= -lstdc++ + +CP=@CP@ + +# CPP + +CPP=@CPP@ +CXXCPP=@CXXCPP@ +CPPFLAGS=@CPPFLAGS@ -I$(inc_builddir) -I$(srcdir) -I. + +# C + +CC = @CC@ +CFLAGS = @CFLAGS@ +C_DEPEND_FLAG = @C_DEPEND_FLAG@ + +# C++ + +CXX = @CXX@ +CXXFLAGS = @CXXFLAGS@ +CXX_DEPEND_FLAG = @CXX_DEPEND_FLAG@ + +# BOOST Library + +BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ + +# JAVA + +JAVA_INCLUDES = @JAVA_INCLUDES@ +JAVA_LIBS = @JAVA_LIBS@ +JAVA_LDPATH = @JAVA_LDPATH@ + +# PYTHON + +PYTHON = @PYTHON@ +PYTHONHOME = @PYTHONHOME@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_VERSION = @PYTHON_VERSION@ +PYTHON_SITE = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages +PYTHON_SITE_INSTALL = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome +# QT + +QT_ROOT = @QT_ROOT@ +QT_INCLUDES = @QT_INCLUDES@ +QT_MT_INCLUDES = @QT_INCLUDES@ -DQT_THREAD_SUPPORT +QT_LIBS = @QT_LIBS@ +QT_MT_LIBS = @QT_MT_LIBS@ + +MOC = @MOC@ +UIC = @UIC@ + +MSG2QM = @MSG2QM@ + +#QWT + +QWT_INCLUDES=@QWT_INCLUDES@ +QWT_LIBS=@QWT_LIBS@ + +# SIP +SIP = @SIP@ +SIP_INCLUDES = @SIP_INCLUDES@ +SIP_LIBS = @SIP_LIBS@ + +# PYQT +PYQT_SIPS = @PYQT_SIPS@ +PYQT_LIBS = @PYQT_LIBS@ + +# openGL +OGL_INCLUDES=@OGL_INCLUDES@ +OGL_LIBS=@OGL_LIBS@ + +# VTK +VTK_INCLUDES=@VTK_INCLUDES@ +VTK_LIBS=@VTK_LIBS@ + +# HDF5 + +HDF5_INCLUDES=@HDF5_INCLUDES@ +HDF5_LIBS=@HDF5_LIBS@ +HDF5_MT_LIBS=@HDF5_MT_LIBS@ + +# OpenCasCade + +OCC_INCLUDES=@CAS_CPPFLAGS@ +OCC_CXXFLAGS=@CAS_CXXFLAGS@ + +#OCC_KERNEL_LIBS=@CAS_KERNEL@ +#OCC_OCAF_LIBS=@CAS_OCAF@ +#OCC_VIEWER_LIBS=@CAS_VIEWER@ +#OCC_MODELER_LIBS=@CAS_MODELER@ +#OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@ +#OCC_LIBS=@CAS_LDFLAGS@ +CAS_KERNEL=@CAS_KERNEL@ +CAS_MATH=@CAS_MATH@ +CAS_OCAF=@CAS_OCAF@ +CAS_OCAFVIS=@CAS_OCAFVIS@ +CAS_TKTopAlgo=@CAS_TKTopAlgo@ +CAS_VIEWER=@CAS_VIEWER@ +CAS_MODELER=@CAS_MODELER@ +CAS_DATAEXCHANGE=@CAS_DATAEXCHANGE@ +CAS_LDPATH=@CAS_LDPATH@ +# MPICH + +MPICH_INCLUDES=@MPICH_INCLUDES@ +MPICH_LIBS=@MPICH_LIBS@ + +# Swig C++ Python + +SWIG = @SWIG@ +SWIG_FLAGS = @SWIG_FLAGS@ -I$(inc_builddir) -I$(srcdir) -I. + +# OMNIORB + +OMNIORB_ROOT = @OMNIORB_ROOT@ +OMNIORB_INCLUDES = @OMNIORB_INCLUDES@ +OMNIORB_LIBS = @OMNIORB_LIBS@ +OMNIORB_CXXFLAGS = @OMNIORB_CXXFLAGS@ + +OMNIORB_IDL = @OMNIORB_IDL@ +OMNIORB_IDLCXXFLAGS = @OMNIORB_IDLCXXFLAGS@ +OMNIORB_IDLPYFLAGS = @OMNIORB_IDLPYFLAGS@ -I$(top_srcdir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome + +OMNIORB_IDL_CLN_H = @OMNIORB_IDL_CLN_H@ +OMNIORB_IDL_CLN_CXX = @OMNIORB_IDL_CLN_CXX@ +OMNIORB_IDL_CLN_OBJ = @OMNIORB_IDL_CLN_OBJ@ + +OMNIORB_IDL_SRV_H = @OMNIORB_IDL_SRV_H@ +OMNIORB_IDL_SRV_CXX = @OMNIORB_IDL_SRV_CXX@ +OMNIORB_IDL_SRV_OBJ = @OMNIORB_IDL_SRV_OBJ@ + +# Default ORB + +CORBA_ROOT = @CORBA_ROOT@ +CORBA_INCLUDES = @CORBA_INCLUDES@ +CORBA_LIBS = @CORBA_LIBS@ +CORBA_CXXFLAGS = @CORBA_CXXFLAGS@ + +IDLCXXFLAGS = -bcxx @IDLCXXFLAGS@ -I$(top_srcdir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome +IDLPYFLAGS = @IDLPYFLAGS@ + +IDL = @IDL@ + +IDL_CLN_H = @IDL_CLN_H@ +IDL_CLN_CXX = @IDL_CLN_CXX@ +IDL_CLN_OBJ = @IDL_CLN_OBJ@ + +IDL_SRV_H = @IDL_SRV_H@ +IDL_SRV_CXX = @IDL_SRV_CXX@ +IDL_SRV_OBJ = @IDL_SRV_OBJ@ + +CPPFLAGS+= $(CORBA_INCLUDES) +CXXFLAGS+= $(CORBA_CXXFLAGS) + +# add corba libs when link salome application ! +#LDFLAGS+= $(CORBA_LIBS) +LIBS+=$(CORBA_LIBS) + +DOXYGEN = @DOXYGEN@ + +## Shared libraries +LT_STATIC_EXEC=@LT_STATIC_EXEC@ +DYNAMIC_DIRS=@DYNAMIC_DIRS@ +LT_LIB=libtool +LT=$(top_builddir)/libtool +LT_COMPILE=$(LT) --mode=compile $(CC) +LT_LINK_LIB=$(LT_LIB) --mode=link $(CC) -rpath $(libdir) +LT_LINK_EXE=$(LT) --mode=link $(CC) $(LT_STATIC_EXEC) -dlopen self -rpath $(bindir) $(DYNAMIC_DIRS) +LT_RUN=$(LT) --mode=execute +LT_INSTALL_PROG=$(LT) --mode=install $(INSTALL_PROGRAM) +LT_INSTALL_LIB=$(LT) --mode=install $(INSTALL_DATA) +LT_UNINSTALL=$(LT) --mode=uninstall $(RM) + +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +INSTALL_DATA=@INSTALL_DATA@ + +# create a symbolic link (or a copie ?) +LN_S=@LN_S@ + +## Installation points +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@/salome +libdir=@libdir@/salome +# warning : if user give this path in configure we could have salome/salome :-( +includedir=@includedir@/salome +datadir=@datadir@/salome +idldir=${prefix}/idl/salome +sharedpydir=@libdir@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules +incmakedir=${prefix}/salome_adm/unix + +docdir=${prefix}/doc/salome + +# +# begin of package rules +# + +.PHONY: all lib bin inc resources data docs tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean + +.SUFFIXES: .cxx .cc .c .f .o .lo .idl .py .i .ui .po .qm + +all: + $(MAKE) inc + $(MAKE) depend_idl + $(MAKE) depend + $(MAKE) lib + $(MAKE) bin + $(MAKE) resources + +# +# add target to build administrative files +# + +Makefile: $(top_builddir)/config.status $(srcdir)/Makefile.in + cd $(top_builddir) ; ./config.status + +$(top_builddir)/config.status: $(top_srcdir)/configure + cd $(top_builddir) ; ./config.status --recheck + +# VPATH contain $(srcdir), so make configure is good in top_srcdir and we must add target configure otherwise :-) +ifneq ($(top_srcdir),$(srcdir)) +configure: $(top_srcdir)/configure +endif + +$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4 + cd $(top_srcdir) ; autoconf + +$(top_srcdir)/configure.in: $(top_srcdir)/configure.in.base + cd $(top_srcdir) && ./build_configure + + +ACLOCAL_SRC = \ +ac_cxx_bool.m4 check_corba.m4 check_vtk.m4 \ +ac_cxx_depend_flag.m4 check_hdf5.m4 enable_pthreads.m4 \ +ac_cxx_mutable.m4 check_mico.m4 libtool.m4 \ +ac_cxx_namespaces.m4 check_omniorb.m4 pyembed.m4 \ +ac_cxx_partial_specialization.m4 check_opengl.m4 python.m4 \ +ac_cxx_typename.m4 check_pthreads.m4 check_cas.m4 \ +ac_cc_warnings.m4 check_qt.m4 check_swig.m4 + +$(top_srcdir)/aclocal.m4: $(ACLOCAL_SRC:%=@KERNEL_ROOT_DIR@/salome_adm/unix/config_files/%) + cd $(top_srcdir) ; aclocal --acdir=adm_local/unix/config_files -I @KERNEL_ROOT_DIR@/salome_adm/unix/config_files diff --git a/bin/VERSION b/bin/VERSION new file mode 100755 index 000000000..2d918a5a9 --- /dev/null +++ b/bin/VERSION @@ -0,0 +1 @@ +THIS IS SALOME - GEOM VERSION: 3.1.0 diff --git a/build_configure b/build_configure new file mode 100755 index 000000000..6fdce3389 --- /dev/null +++ b/build_configure @@ -0,0 +1,215 @@ +#!/bin/bash + +# +# Tool for updating list of .in file for the SALOME project +# and regenerating configure script +# +# Author : Marc Tajchman - CEA +# Date : 10/10/2002 +# $Header$ +# + +ORIG_DIR=`pwd` +CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"` + +######################################################################## +# Test if the KERNEL_ROOT_DIR is set correctly +if test ! -d "${KERNEL_ROOT_DIR}"; then + echo "failed : KERNEL_ROOT_DIR variable is not correct !" + exit +fi + +# Test if the KERNEL_SRC is set correctly + +#if test ! -d "${KERNEL_SRC}"; then +# echo "failed : KERNEL_SRC variable is not correct !" +# exit +#fi +######################################################################## +# find_in - utility function +# +# usage : +# find_in directory filename +# +# Finds files following the *.in pattern, recursively in the +# directory (first argument). +# Results are appended into the file (second argument) +# +# Difference from the standard unix find is that files are tested +# before directories +# + +find_in() +{ + local i + local f=$2 + +# if the first argument is not a directory, returns + + if [ ! -d "$1" ] ; then + return + fi + +# dont look in the CVS directories + + case $1 in + */CVS) return ;; + */adm_local/*) return ;; + *) ;; + esac + +# for each regular file contained in the directory +# test if it's a .in file + + for i in "$1"/* + do + if [ -f "$i" ] ; then + case $i in + *.in) echo " "$i" \\" >> $f;; + *) ;; + esac + fi + done + +# for each subdirectory of the first argument, proceeds recursively + + for i in "$1"/* + do + if [ -d "$i" ] ; then + find_in "$i" "$f" + fi + done +} + + +####################################################################### +# Generate list of .in files (Makefile.in, config.h.in, etc) +# appending it in file configure.in + +cd ${CONF_DIR} +ABS_CONF_DIR=`pwd` + +# +# Common part of the configure.in file +# +chmod u+w configure.in.base +if ! \cp -f configure.in.base configure.in_tmp1 +then + echo + echo "error : can't create files in" ${CONF_DIR} + echo "aborting ..." + chmod u-w configure.in.base + exit +fi +chmod u-w configure.in.base + +if [ -e "${CONF_DIR}/salome_adm" ] ; then + \rm -f ${CONF_DIR}/salome_adm +fi + +# make a link allowing AC_OUTPUT to find the salome_adm/.../*.in files +echo "" >> configure.in_tmp1 +echo 'ln -fs ${KERNEL_ROOT_DIR}/salome_adm ${ROOT_SRCDIR}/.' >> configure.in_tmp1 + +echo "" >> configure.in_tmp1 +echo "AC_OUTPUT([ \\" >> configure.in_tmp1 + +# +# List of .in files in the adm/unix directory +# These files MUST be on top of AC_OUTPUT list so we +# put them "manually" +# + +echo " ./salome_adm/unix/SALOMEconfig.h \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/F77config.h \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/sstream \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/depend \\" >> configure.in_tmp1 +echo " ./adm_local/unix/make_omniorb \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/envScript \\" >> configure.in_tmp1 +echo " ./adm_local/unix/make_commence \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/make_conclude \\" >> configure.in_tmp1 +echo " ./salome_adm/unix/make_module \\" >> configure.in_tmp1 + +\rm -f configure.in_tmp2 configure.in_tmp3 +touch configure.in_tmp2 +find_in . configure.in_tmp2 +sed -e '/^...salome_adm/d' configure.in_tmp2 > configure.in_tmp3 +sed -e '/^...adm_local.unix.make_omniorb/d' configure.in_tmp3 > configure.in_tmp2 +sed -e '/^...adm_local.unix.make_commence/d' configure.in_tmp2 > configure.in_tmp3 +sed -e '/configure.in/d' configure.in_tmp3 > configure.in_tmp2 +sed -e 's/.in / /' configure.in_tmp2 >> configure.in_tmp1 +#sed '/^.salome_adm/d' configure.in_tmp2 > configure.in_tmp3 +#sed '/configure.in/d' configure.in_tmp3 > configure.in_tmp2 +#sed 's/.in / /' configure.in_tmp2 >> configure.in_tmp1 + +echo "])" >> configure.in_tmp1 + +# delete the link created for AC_OUTPUT +echo "" >> configure.in_tmp1 +#echo 'rm -f ${ROOT_SRCDIR}/salome_adm' >> configure.in_tmp1 +\mv configure.in_tmp1 configure.in_new +\rm -f configure.in_tmp2 configure.in_tmp3 + + +######################################################################## +# Create new (or replace old) configure.in file +# Print a message if the file is write protected +# + +echo +if test ! -f configure.in +then + echo -n "Creating new file 'configure.in' ... " + if \mv configure.in_new configure.in >& /dev/null + then + echo "done" + else + echo "error, check your file permissions" + fi +else + echo -n "Updating 'configure.in' file ... " + if ! \cp configure.in configure.in_old >& /dev/null + then + echo + echo + echo "Can't backup previous configure.in" + echo -n "Continue (you will not be able to revert) - (Y/N) ? " + read R + case "x$R" in + xn*) exit;; + xN*) exit;; + esac + echo + echo -n " " + fi + if \cp configure.in_new configure.in >& /dev/null + then + echo "done" + else + echo + echo "error, can't update previous configure.in" + fi +fi + +######################################################################## +# Use autoconf to rebuild the configure script +# + +if test -f configure +then + echo -n "Updating 'configure' script ... " +else + echo -n "Creating 'configure' script ... " +fi + +aclocal --acdir=adm_local/unix/config_files -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files +if autoconf +then + echo "done" +else + echo "failed (check file permissions and/or user quotas ...)" +fi + +cd ${ORIG_DIR} + +echo diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 000000000..7295ede75 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,40 @@ + +# -* Makefile *- +# +# Author : Patrick GOLDBRONN (CEA) +# Date : 30/11/2001 +# $Header$ +# +# source path +top_srcdir=@top_srcdir@ +top_builddir=.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + +SUBDIRS= salome + +@COMMENCE@ + +docs: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done +clean: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done + +distclean: clean + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done + +install: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done + +uninstall: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done diff --git a/doc/salome/GEOM_index_v3.1.0.html b/doc/salome/GEOM_index_v3.1.0.html new file mode 100644 index 000000000..e4488ebbc --- /dev/null +++ b/doc/salome/GEOM_index_v3.1.0.html @@ -0,0 +1,95 @@ + + + + + + + + Geometry Module Documentation + + + +
  +
+
                   +   
+ + + + + + + + + +
+ + + +
+ +
+
+
+

Geometry MODULE Documentation

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

Application-About.png +     

+
+ +
+ + + + +
+
+
+
+
+ +
+ +
GUI Documentation
+ +
+ +
+ +

+
+ +
+ +
TUI Documentation
+ +
+ +
+ +

+
+
+
+
+
+
+ + diff --git a/doc/salome/Makefile.in b/doc/salome/Makefile.in new file mode 100644 index 000000000..2af65570b --- /dev/null +++ b/doc/salome/Makefile.in @@ -0,0 +1,45 @@ +# Copyright (C) 2003 CEA/DEN, EDF R&D +# +# +# +# File : Makefile.in +# Author : Vasily Rusyaev (Open Cascade NN) +# Module : doc +# $Header: + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + +SUBDIRS= tui gui + +@COMMENCE@ + +docs: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done; \ + cp -f $(srcdir)/GEOM_index_v3.1.0.html GEOM_index_v3.1.0.html + +clean: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done + +distclean: clean + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done + +install: + $(MAKE) docs + (cd tui && $(MAKE) install); + (cd gui && $(MAKE) install); + cp -f GEOM_index_v3.1.0.html $(docdir) + +uninstall: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done; \ + rm -fr $(docdir)/GEOM_index_v3.1.0.html diff --git a/doc/salome/gui/GEOM/add_point_on_edge.htm b/doc/salome/gui/GEOM/add_point_on_edge.htm new file mode 100755 index 000000000..2134b248d --- /dev/null +++ b/doc/salome/gui/GEOM/add_point_on_edge.htm @@ -0,0 +1,165 @@ + + + + + +Add Point on Edge + + + + + + + + + + + + +

Add Point on Edge

+ +

To Add Point on Edge in the Main Menu select + Repair - > Add Point on Edge.

+ +

 

+ +

This operation splits an edge in two in accordance + with the specified mode (by length or by parameter) and a value specifying + the position of the point on edge (for example val =0.5; mode = Length). + This operation is available in OCC Viewer + only.

+ +

 

+ +

Result: GEOM_Object.

+ +

 

+ +

TUI Command : + geompy.DivideEdge(Shape, EdgeID, + Value, IsByParameter), where Shape is a shape which contains an + edge to be divided, EdgeID is the ID of the edge to be divided, if it + = -1, then Shape is an edge, Value is a paramter on the edge or a length. + IsByParameter if it is True then Value is the edge parameter in the range + [0:1] otherwise it is a length of the edge in the range [0:1]

+ +

 

+ +

Arguments: + Name + 1 Edge + 1 value setting the position of the point according to + one of the selected modes

+ +

 

+ +

Dialog + Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

     

+ +

 

+ +

Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/arc.htm b/doc/salome/gui/GEOM/arc.htm new file mode 100755 index 000000000..7d62f043c --- /dev/null +++ b/doc/salome/gui/GEOM/arc.htm @@ -0,0 +1,135 @@ + + + + + +Arc + + + + + + + + + + + +

Arc

+ +

To create an Arc in the Main + Menu select New Entity - > + Basic - > Arc

+ +

 

+ +

You can define + an Arc by by three + Points that lie on it. Point1 is the starting point of + the arc, Point2 is a middle point of the arc and Point3 is the ending + point of the arc.

+ +

The + Result of the operation will be a + GEOM_Object (edge).

+ +

 

+ +

TUI Command: + geompy.MakeArc(Point1, Point2, Point3)

+ +

Arguments: + Name + 3 vertices.

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Basic Geometric + Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/archimede.htm b/doc/salome/gui/GEOM/archimede.htm new file mode 100755 index 000000000..bc1c43e8b --- /dev/null +++ b/doc/salome/gui/GEOM/archimede.htm @@ -0,0 +1,135 @@ + + + + + +Archimede + + + + + + + + + + + +

Archimede

+ +

To produce + an Archimede operation in the + Main Menu select Operations - > Archimede

+ +

 

+ +

This + operation creates a plane corresponding to the modeled water-line of the + object plunged into the water (in Z direction).

+ +

 

+ +

The + Result will be any GEOM_Object.

+ +

TUI Command: + geompy.Archimede(Shape,Weight,WaterDensity,MeshingDeflection), + where Shape is a shape to put into the water, Weight is a weight of the + shape, WaterDensity  is + density of water, MeshingDeflection is a deflection of the mesh, using + to compute the section.

+ +

Arguments: + Name + 1 shape  + + 3 values (Weight, Water Density & Meshing Deflection).

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

   

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of the use of Basic Operations. +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/basic_geometrical_objects.htm b/doc/salome/gui/GEOM/basic_geometrical_objects.htm new file mode 100755 index 000000000..6e38ea76f --- /dev/null +++ b/doc/salome/gui/GEOM/basic_geometrical_objects.htm @@ -0,0 +1,656 @@ + + + + + +Basic Geometrical Objects + + + + + + + + + + + +

Basic Geometrical Objects

+ +

Creation of a Point

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0 = geompy.MakeVertex(0., + 0., 0.)

+ +

p100 = geompy.MakeVertexWithRef(p0, + 100., 100., 100.)

+ +

px = geompy.MakeVertex(100., + 0., 0.)

+ +

py = geompy.MakeVertex(0., + 100., 0.)

+ +

pz = geompy.MakeVertex(0., + 0., 100.)

+ +

 

+ +

# create a curve and a vertex on it

+ +

Arc = geompy.MakeArc(py, + pz, px)

+ +

p_on_arc = geompy.MakeVertexOnCurve(Arc, + 0.25)

+ +

 

+ +

# add objects in the study

+ +

id_p0       = + geompy.addToStudy(p0,   "Vertex + 0")

+ +

id_p100     = + geompy.addToStudy(p100, "Vertex 100")

+ +

id_px       = + geompy.addToStudy(px,   "Vertex + X")

+ +

id_py       = + geompy.addToStudy(py,   "Vertex + Y")

+ +

id_pz       = + geompy.addToStudy(pz,   "Vertex + Z")

+ +

id_Arc      = + geompy.addToStudy(Arc,  "Arc")

+ +

id_p_on_arc = geompy.addToStudy(p_on_arc, + "Vertex on Arc")

+ +

 

+ +

# display vertices

+ +

gg.createAndDisplayGO(id_p0)

+ +

gg.createAndDisplayGO(id_p100)

+ +

gg.createAndDisplayGO(id_Arc)

+ +

gg.createAndDisplayGO(id_p_on_arc) +

+ +

 

+ +

Creation of a Line

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0 = geompy.MakeVertex(0., + 0., 0.)

+ +

p100 = geompy.MakeVertexWithRef(p0, + 100., 100., 100.)

+ +

px = geompy.MakeVertex(100., + 0.  , 0. +  )

+ +

py = geompy.MakeVertex(0. +  , 100., + 0.  )

+ +

pz = geompy.MakeVertex(0. +  , 0.  , + 100.)

+ +

 

+ +

# create a vector on two points

+ +

vxy  = + geompy.MakeVector(px, py)

+ +

 

+ +

# create a line with a point and a vector

+ +

line1 = geompy.MakeLine(pz, + vxy)

+ +

 

+ +

#create a line on two points

+ +

line2 = geompy.MakeLineTwoPnt(p0, + p100)

+ +

 

+ +

# add objects in the study

+ +

id_vxy      = + geompy.addToStudy(vxy,  "Vector")

+ +

id_line1    = + geompy.addToStudy(line1,"Line1")

+ +

id_line2    = + geompy.addToStudy(line2,"Line2")

+ +

 

+ +

# display lines

+ +

gg.createAndDisplayGO(id_vxy)

+ +

gg.createAndDisplayGO(id_line1)

+ +

gg.createAndDisplayGO(id_line2) +

+ +

 

+ +

Creation of  a + Circle

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0 = geompy.MakeVertex(0., + 0., 0.)

+ +

px = geompy.MakeVertex(100., + 0.  , 0. +  )

+ +

py = geompy.MakeVertex(0. +  , 100., + 0.  )

+ +

pz = geompy.MakeVertex(0. +  , 0.  , + 100.)

+ +

 

+ +

# create vector on two points

+ +

vxy  = + geompy.MakeVector(px, py)

+ +

 

+ +

# create circle with point, vector and radius

+ +

circle1 = geompy.MakeCircle(pz, + vxy, 30)

+ +

 

+ +

#create circle on three points

+ +

circle2 = geompy.MakeCircleThreePnt(p0, + px, py)

+ +

 

+ +

# add objects in study

+ +

id_vxy      = + geompy.addToStudy(vxy,    "Vector")

+ +

id_circle1  = + geompy.addToStudy(circle1,"Circle1")

+ +

id_circle2  = + geompy.addToStudy(circle2,"Circle2")

+ +

 

+ +

# display circles

+ +

gg.createAndDisplayGO(id_vxy)

+ +

gg.createAndDisplayGO(id_circle1)

+ +

gg.createAndDisplayGO(id_circle2) +

+ +

 

+ +

Creation of an Ellipse

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0 = geompy.MakeVertex(0., + 0., 0.)

+ +

p50 = geompy.MakeVertex(50., + 50., 50.)

+ +

 

+ +

# create vector on two points

+ +

vector  = + geompy.MakeVector(p0, p50)

+ +

 

+ +

# create ellipse with point, vector and radiuses

+ +

ellipse = geompy.MakeEllipse(p50, + vector, 50, 25)

+ +

 

+ +

# add objects in study

+ +

id_vector  = + geompy.addToStudy(vector, "Vector")

+ +

id_ellipse = geompy.addToStudy(ellipse,"Ellipse")

+ +

 

+ +

# display normal vector and ellipse

+ +

gg.createAndDisplayGO(id_vector)

+ +

gg.createAndDisplayGO(id_ellipse) +

+ +

 

+ +

Creation of a Curve

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0 = geompy.MakeVertex(0. +  , 0.  , + 0.  )

+ +

p1 = geompy.MakeVertex(50. + , 100., 200.)

+ +

p2 = geompy.MakeVertex(150., +  50., 100.)

+ +

p3 = geompy.MakeVertex(100., + 150., 170.)

+ +

p4 = geompy.MakeVertex(200., + 200., 150.)

+ +

 

+ +

# create polyline on list of points

+ +

polyline = geompy.MakePolyline([p0, + p1, p2, p3, p4])

+ +

 

+ +

# create bezier on list of points

+ +

bezier = geompy.MakeBezier([p0, + p1, p2, p3, p4])

+ +

 

+ +

#create interpolation curve on list of points

+ +

interpol = geompy.MakeInterpol([p0, + p1, p2, p3, p4])

+ +

 

+ +

# add objects in study

+ +

id_p0       = + geompy.addToStudy(p0,       "Point1")

+ +

id_p1       = + geompy.addToStudy(p1,       "Point2")

+ +

id_p2       = + geompy.addToStudy(p2,       "Point3")

+ +

id_p3       = + geompy.addToStudy(p3,       "Point4")

+ +

id_p4       = + geompy.addToStudy(p4,       "Point5")

+ +

id_polyline = geompy.addToStudy(polyline, + "Polyline")

+ +

id_bezier   = + geompy.addToStudy(bezier,   "Bezier")

+ +

id_interpol = geompy.addToStudy(interpol, + "Interpol")

+ +

 

+ +

# display points and curves

+ +

gg.createAndDisplayGO(id_p0)

+ +

gg.createAndDisplayGO(id_p1)

+ +

gg.createAndDisplayGO(id_p2)

+ +

gg.createAndDisplayGO(id_p3)

+ +

gg.createAndDisplayGO(id_p4)

+ +

gg.createAndDisplayGO(id_polyline)

+ +

gg.createAndDisplayGO(id_bezier)

+ +

gg.createAndDisplayGO(id_interpol) +

+ +

 

+ +

Creation of a Vector

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p1 = geompy.MakeVertex(10., + 50., 20.)

+ +

p2 = geompy.MakeVertex(70., + 70., 70.)

+ +

 

+ +

# create vector on two points

+ +

vector1 = geompy.MakeVector(p1, + p2)

+ +

 

+ +

# create vector with the given components

+ +

vector2 = geompy.MakeVectorDXDYDZ(30, + 30, 100)

+ +

 

+ +

# add objects in study

+ +

id_p1      = + geompy.addToStudy(p1,     "Point1")

+ +

id_p2      = + geompy.addToStudy(p2,     "Point2")

+ +

id_vector1 = geompy.addToStudy(vector1,"Vector1")

+ +

id_vector2 = geompy.addToStudy(vector2,"Vector2")

+ +

 

+ +

# display points and vectors

+ +

gg.createAndDisplayGO(id_p1)

+ +

gg.createAndDisplayGO(id_p2)

+ +

gg.createAndDisplayGO(id_vector1)

+ +

gg.createAndDisplayGO(id_vector2) +

+ +

 

+ +

Creation of a Plane

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p1 = geompy.MakeVertex( +  0.,   0., + 100.)

+ +

p2 = geompy.MakeVertex(100., +   0., +   0.)

+ +

p3 = geompy.MakeVertex(200., + 200., 200.)

+ +

p4 = geompy.MakeVertex(100., + 100.,   0.)

+ +

p5 = geompy.MakeVertex(0. +  , 100., +   0.)

+ +

 

+ +

# create vector with the given components

+ +

vector = geompy.MakeVectorDXDYDZ(100., + 100., 100.)

+ +

 

+ +

# create vector with two points

+ +

vector_arc = geompy.MakeVector(p2, + p5)

+ +

 

+ +

# create arc with three points

+ +

arc = geompy.MakeArc(p2, + p4, p5)

+ +

 

+ +

# create wire

+ +

wire = geompy.MakeWire([vector_arc, + arc])

+ +

 

+ +

# create face

+ +

isPlanarWanted = 1

+ +

face = geompy.MakeFace(wire, + isPlanarWanted)

+ +

trimsize = 1000.

+ +

 

+ +

# create plane with point, vector and trimsize

+ +

plane1 = geompy.MakePlane(p1, + vector, trimsize)

+ +

 

+ +

# create plane with three points and trimsize

+ +

plane2 = geompy.MakePlaneThreePnt(p1, + p2, p3, trimsize)

+ +

 

+ +

# create plane with given face

+ +

plane3 = geompy.MakePlaneFace(face, + trimsize)

+ +

 

+ +

# add objects in study

+ +

id_face   = + geompy.addToStudy(face,  "Face")

+ +

id_plane1 = geompy.addToStudy(plane1,"Plane1")

+ +

id_plane2 = geompy.addToStudy(plane2,"Plane2")

+ +

id_plane3 = geompy.addToStudy(plane3,"Plane3")

+ +

 

+ +

# display points and vectors

+ +

gg.createAndDisplayGO(id_face)

+ +

gg.createAndDisplayGO(id_plane1)

+ +

gg.createAndDisplayGO(id_plane2)

+ +

gg.createAndDisplayGO(id_plane3)

+ +

gg.setDisplayMode(id_plane1,1)

+ +

gg.setTransparency(id_plane1,0.5)

+ +

gg.setDisplayMode(id_plane2,1)

+ +

gg.setTransparency(id_plane2,0.5)

+ +

gg.setDisplayMode(id_plane3,1)

+ +

gg.setTransparency(id_plane3,0.5) +

+ + + + diff --git a/doc/salome/gui/GEOM/basic_operations.htm b/doc/salome/gui/GEOM/basic_operations.htm new file mode 100755 index 000000000..afe039963 --- /dev/null +++ b/doc/salome/gui/GEOM/basic_operations.htm @@ -0,0 +1,242 @@ + + + + + +Basic Operations + + + + + + + + + + + +

Basic Operations

+ +

Partition

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p0   = + geompy.MakeVertex(  0., +   0., +   0.)

+ +

p200 = geompy.MakeVertex(200., + 200., 200.)

+ +

pz   = + geompy.MakeVertex(  0., +   0., + 100.)

+ +

 

+ +

# create vector

+ +

vxyz = geompy.MakeVectorDXDYDZ(100., + 100., 100.)

+ +

 

+ +

# create box with two points

+ +

box = geompy.MakeBoxTwoPnt(p0, + p200)

+ +

 

+ +

# create plane

+ +

trimsize  = + 500.

+ +

plane = geompy.MakePlane(pz, + vxyz, trimsize)

+ +

 

+ +

# create partition objects

+ +

partition1 = geompy.MakePartition([box], + [plane])

+ +

partition2 = geompy.Partition([box], + [plane])

+ +

partition3 = geompy.MakeHalfPartition(box, + plane)

+ +

 

+ +

# add objects in study

+ +

id_box = geompy.addToStudy(box,"Box")

+ +

id_plane = geompy.addToStudy(plane,"Plane")

+ +

id_partition1 = geompy.addToStudy(partition1,"MakePartition")

+ +

id_partition2 = geompy.addToStudy(partition2,"Partition")

+ +

id_partition3 = geompy.addToStudy(partition3,"MakeHalfPartition")

+ +

 

+ +

# display partition objects and plane

+ +

gg.createAndDisplayGO(id_box)

+ +

gg.setDisplayMode(id_box,1)

+ +

gg.createAndDisplayGO(id_plane)

+ +

gg.setDisplayMode(id_plane,1)

+ +

gg.createAndDisplayGO(id_partition1)

+ +

gg.createAndDisplayGO(id_partition2)

+ +

gg.createAndDisplayGO(id_partition3) +

+ +

Archimede

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p0   = + geompy.MakeVertex(  0., +   0., +   0.)

+ +

p200 = geompy.MakeVertex(200., + 200., 200.)

+ +

 

+ +

# create box with two points

+ +

box = geompy.MakeBoxTwoPnt(p0, + p200)

+ +

 

+ +

# perform an Archimede operation on the given shape with given parameters

+ +

weight  = + 1000000.

+ +

waterdensity = 1.

+ +

meshingdeflection + = 0.01

+ +

archimede  = + geompy.Archimede(box, weight, waterdensity, meshingdeflection)

+ +

 

+ +

# add objects in study

+ +

id_box = geompy.addToStudy(box,"Box")

+ +

id_archimede = geompy.addToStudy(archimede,"Archimede")

+ +

 

+ +

# display box and result of Archimede operation

+ +

gg.createAndDisplayGO(id_box)

+ +

gg.setDisplayMode(id_box,1)

+ +

gg.createAndDisplayGO(id_archimede)

+ +

gg.setDisplayMode(id_archimede,1) +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/blocks_operations.htm b/doc/salome/gui/GEOM/blocks_operations.htm new file mode 100755 index 000000000..6cff43bd2 --- /dev/null +++ b/doc/salome/gui/GEOM/blocks_operations.htm @@ -0,0 +1,258 @@ + + + + + +Blocks Operations + + + + + + + + + + + +

Blocks Operations

+ +

Multi Transformation

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p_25_25_50 = geompy.MakeVertex(25., + 25., 50.)

+ +

p_50_25_25 = geompy.MakeVertex(50., + 25., 25.)

+ +

p_25_50_25 = geompy.MakeVertex(25., + 50., 25.)

+ +

box = geompy.MakeBoxDXDYDZ(50, + 50, 50)

+ +

top_face = geompy.GetFaceNearPoint(box, + p_25_25_50)

+ +

yz_face = geompy.GetFaceNearPoint(box, + p_50_25_25)

+ +

xz_face = geompy.GetFaceNearPoint(box, + p_25_50_25)

+ +

top_face_ind = geompy.LocalOp.GetSubShapeIndex(box, + top_face)

+ +

yz_face_ind = geompy.LocalOp.GetSubShapeIndex(box, + yz_face)

+ +

xz_face_ind = geompy.LocalOp.GetSubShapeIndex(box, + xz_face)

+ +

 

+ +

# Multi-transformate block and glue the result

+ +

box_tr1 = geompy.MakeMultiTransformation1D(box, + yz_face_ind, top_face_ind, 3)

+ +

box_tr2 = geompy.MakeMultiTransformation2D(box, + xz_face_ind, yz_face_ind, 3, top_face_ind, 0, 2)

+ +

 

+ +

# add objects in study

+ +

id_box = geompy.addToStudy(box, + "Box")

+ +

id_box_tr1 = geompy.addToStudy(box_tr1, + "Multi-transformed Block 1D")

+ +

id_box_tr2 = geompy.addToStudy(box_tr2, + "Multi-transformed Block 2D")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_box)

+ +

gg.setDisplayMode(id_box,1)

+ +

gg.createAndDisplayGO(id_box_tr1)

+ +

gg.createAndDisplayGO(id_box_tr2) +

+ +

 

+ +

Explode on Blocks

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create box and sphere

+ +

box = geompy.MakeBoxDXDYDZ(200, + 200, 200)

+ +

sphere = geompy.MakeSphereR(100)

+ +

 

+ +

# make compound

+ +

compound = geompy.MakeCompound([box, + sphere])

+ +

 

+ +

# get all the blocks, contained in the given compound

+ +

make_block_explode + = geompy.MakeBlockExplode(compound, 1, 1)

+ +

 

+ +

# add objects in study

+ +

id_compound = geompy.addToStudy(compound, + "Compound")

+ +

id_make_block_explode + = geompy.addToStudy(make_block_explode[0], "MakeBlockExplode")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_compound)

+ +

gg.createAndDisplayGO(id_make_block_explode)

+ +

gg.setDisplayMode(id_make_block_explode,1) +

+ +

 

+ +

Propagate

+ +

import geompy

+ +

import salome

+ +

 

+ +

# create box and sphere

+ +

box = geompy.MakeBoxDXDYDZ(200, + 200, 200)

+ +

 

+ +

# check and improve

+ +

check_box = geompy.CheckAndImprove(box)

+ +

  

+ +

# build all possible propagation groups

+ +

listChains = geompy.Propagate(check_box)

+ +

 

+ +

# add objects in study

+ +

geompy.addToStudy(check_box, + "Box")

+ +

for chain in listChains:

+ +

    geompy.addToStudyInFather(check_box, + chain, "propagation chain")

+ +

salome.sg.updateObjBrowser(1) +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/boolean_operations.htm b/doc/salome/gui/GEOM/boolean_operations.htm new file mode 100755 index 000000000..86dc17fa8 --- /dev/null +++ b/doc/salome/gui/GEOM/boolean_operations.htm @@ -0,0 +1,348 @@ + + + + + +Boolean Operations + + + + + + + + + + + +

Boolean Operations

+ +

Fuse

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex(25, + 55, 0)

+ +

p2 = geompy.MakeVertex( + 0,  0, 0)

+ +

v = geompy.MakeVector(p1, + p2)

+ +

 

+ +

# create cylinder

+ +

height = 35

+ +

radius1 = 20

+ +

cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

+ +

 

+ +

# create sphere

+ +

sphere = geompy.MakeSphereR(40)

+ +

 

+ +

# make fuse

+ +

fuse = geompy.MakeFuse(cylinder, + sphere)

+ +

 

+ +

# add objects in study

+ +

id_cylinder = geompy.addToStudy(cylinder, + "Cylinder")

+ +

id_sphere = geompy.addToStudy(sphere, + "Sphere")

+ +

id_fuse = geompy.addToStudy(fuse, + "Fuse")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_cylinder)

+ +

gg.setDisplayMode(id_cylinder,1)

+ +

gg.createAndDisplayGO(id_sphere)

+ +

gg.setDisplayMode(id_sphere,1)

+ +

gg.createAndDisplayGO(id_fuse)

+ +

gg.setDisplayMode(id_fuse,1) +

+ +

 

+ +

Common

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex(25, + 55, 0)

+ +

p2 = geompy.MakeVertex( + 0,  0, 0)

+ +

v = geompy.MakeVector(p1, + p2)

+ +

 

+ +

# create cylinder

+ +

height = 35

+ +

radius1 = 20

+ +

cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

+ +

 

+ +

# create sphere

+ +

sphere = geompy.MakeSphereR(40)

+ +

 

+ +

# make common

+ +

common = geompy.MakeCommon(cylinder, + sphere)

+ +

 

+ +

# add objects in study

+ +

id_common = geompy.addToStudy(common, + "Common")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_common)

+ +

gg.setDisplayMode(id_common,1) +

+ +

 

+ +

Cut

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex(25, + 55, 0)

+ +

p2 = geompy.MakeVertex( + 0,  0, 0)

+ +

v = geompy.MakeVector(p1, + p2)

+ +

 

+ +

# create cylinder

+ +

height = 35

+ +

radius1 = 20

+ +

cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

+ +

 

+ +

# create sphere

+ +

sphere = geompy.MakeSphereR(40)

+ +

 

+ +

# make cut

+ +

cut = geompy.MakeCut(cylinder, + sphere)

+ +

 

+ +

# add objects in study

+ +

id_cut = geompy.addToStudy(cut, + "Cut")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_cut)

+ +

gg.setDisplayMode(id_cut,1) +

+ +

 

+ +

Section

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex(25, + 55, 0)

+ +

p2 = geompy.MakeVertex( + 0,  0, 0)

+ +

v = geompy.MakeVector(p1, + p2)

+ +

 

+ +

# create cylinder

+ +

height = 35

+ +

radius1 = 20

+ +

cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

+ +

 

+ +

# create sphere

+ +

sphere = geompy.MakeSphereR(40)

+ +

 

+ +

# make section

+ +

section = geompy.MakeSection(cylinder, + sphere)

+ +

 

+ +

# add objects in study

+ +

id_section = geompy.addToStudy(section, + "Section")

+ +

 

+ +

# display results

+ +

gg.createAndDisplayGO(id_section)

+ +

gg.setDisplayMode(id_section,1) +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/box.htm b/doc/salome/gui/GEOM/box.htm new file mode 100755 index 000000000..74feb2e36 --- /dev/null +++ b/doc/salome/gui/GEOM/box.htm @@ -0,0 +1,172 @@ + + + + + +Box + + + + + + + + + + + +

Box

+ +

To create a Box + in the Main Menu select New Entity - > Primitives - > Box

+ +

 

+ +

There are 2 algorithms for creation of a Box. +

+ +

The + Result of each operation will be a + GEOM_Object (SOLID).

+ +

 

+ +

Firstly, you can define a Box + by two specified Vertices (its + opposite corners), and with edges, parallel to the coordinate axes.

+ +

TUI Command + : geompy.MakeBoxTwoPnt(Point1, + Point2)

+ +

Arguments: Name + + 2 vertices (opposite corners of the box).

+ +

 

+ +

+ +

 

+ +

Secondly, + you can define a Box by specified dimensions along the coordinate + axes and with edges, parallel to them.  The + center of the box will be at point (DX/2, DY/2, DZ/2).

+ +

TUI Command + : geompy.MakeBoxDXDYDZ(DX, + DY, DZ)

+ +

Arguments: Name + + 3 values (dimensions at origin).

+ +

+ +

 

+ +

NB! The is + a third way to create a Box, which is currently accessible only via TUI commands.

+ +

You + can define a Box by the coordinates + of two Vertices (in this way + you don't need to create them in advance).

+ +

TUI Command: + geompy.MakeBox(x1,y1,z1,x2,y2,z2) +

+ +

Arguments: Name + X, + Y and Z coordinates of both points.

+ +

 

+ +

Example:

+ +

+ +

 

+ +

Our TUI Scripts + provide you with useful examples of creation of Primitives. +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/building_by_blocks.htm b/doc/salome/gui/GEOM/building_by_blocks.htm new file mode 100755 index 000000000..246c6f436 --- /dev/null +++ b/doc/salome/gui/GEOM/building_by_blocks.htm @@ -0,0 +1,330 @@ + + + + + +Building by Blocks + + + + + + + + + + + +

Building by Blocks

+ +

Quadrangle Face

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p1 = geompy.MakeVertex( +  0.,   0., +   0.)

+ +

p2 = geompy.MakeVertex(150., +  30.,   0.)

+ +

p3 = geompy.MakeVertex( +  0., 120., +  50.)

+ +

p4 = geompy.MakeVertex( +  0.,  40., +  70.)

+ +

 

+ +

# create edges

+ +

edge1 = geompy.MakeEdge(p1, + p2)

+ +

edge2 = geompy.MakeEdge(p2, + p3)

+ +

edge3 = geompy.MakeEdge(p3, + p4)

+ +

edge4 = geompy.MakeEdge(p4, + p1)

+ +

 

+ +

# create quadrangle face from four edges

+ +

qface1 = geompy.MakeQuad(edge1, + edge2, edge3, edge4)

+ +

 

+ +

# create quadrangle face on two edges

+ +

qface2 = geompy.MakeQuad2Edges(edge1, + edge3)

+ +

 

+ +

# create quadrangle with specified corners

+ +

qface3 = geompy.MakeQuad4Vertices(p1, + p2, p3, p4)

+ +

 

+ +

# add objects in study

+ +

id_p1 = geompy.addToStudy(p1,"Point1")

+ +

id_p2 = geompy.addToStudy(p2,"Point2")

+ +

id_p3 = geompy.addToStudy(p3,"Point3")

+ +

id_p4 = geompy.addToStudy(p4,"Point4")

+ +

id_edge1 = geompy.addToStudy(edge1,"Edge1")

+ +

id_edge2 = geompy.addToStudy(edge2,"Edge2")

+ +

id_edge3 = geompy.addToStudy(edge3,"Edge3")

+ +

id_edge4 = geompy.addToStudy(edge4,"Edge4")

+ +

id_qface1 = geompy.addToStudy(qface1,"Qface1")

+ +

id_qface2 = geompy.addToStudy(qface2,"Qface2")

+ +

id_qface3 = geompy.addToStudy(qface3,"Qface3")

+ +

 

+ +

# display vertices, edges and quadrangle faces

+ +

gg.createAndDisplayGO(id_p1)

+ +

gg.createAndDisplayGO(id_p2)

+ +

gg.createAndDisplayGO(id_p3)

+ +

gg.createAndDisplayGO(id_p4)

+ +

gg.createAndDisplayGO(id_edge1)

+ +

gg.createAndDisplayGO(id_edge2)

+ +

gg.createAndDisplayGO(id_edge3)

+ +

gg.createAndDisplayGO(id_edge4)

+ +

gg.createAndDisplayGO(id_qface1)

+ +

gg.setDisplayMode(id_qface1,1)

+ +

gg.createAndDisplayGO(id_qface2)

+ +

gg.setDisplayMode(id_qface2,1)

+ +

gg.createAndDisplayGO(id_qface3)

+ +

gg.setDisplayMode(id_qface3,1) +

+ +

 

+ +

Hexagonal Solid

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p1 = geompy.MakeVertex( +  0.,   0., +   0.)

+ +

p2 = geompy.MakeVertex(150., +  30.,   0.)

+ +

p3 = geompy.MakeVertex( +  0., 120., +  50.)

+ +

p4 = geompy.MakeVertex( +  0.,  40., +  70.)

+ +

p5 = geompy.MakeVertex(100., +  20.,  45.)

+ +

p6 = geompy.MakeVertex( +  0., 70., +  40.)

+ +

p7 = geompy.MakeVertex( + 70., 70.,  70.)

+ +

p8 = geompy.MakeVertex( + 70.,-15.,  70.)

+ +

p9 = geompy.MakeVertex( +  0.,  0., +  40.)

+ +

p10 = geompy.MakeVertex( +  0., 70., +   0.)

+ +

p11 = geompy.MakeVertex( + 70., 70.,   0.)

+ +

p12 = geompy.MakeVertex( + 70., -15.,   0.)

+ +

p13 = geompy.MakeVertex( +  0.,  0., +   0.)

+ +

 

+ +

# create faces

+ +

qface1 = geompy.MakeQuad4Vertices(p1, + p2, p3, p4)

+ +

qface2 = geompy.MakeQuad4Vertices(p1, + p2, p5, p4)

+ +

qface3 = geompy.MakeQuad4Vertices(p13, + p12, p11, p10)

+ +

qface4 = geompy.MakeQuad4Vertices(p9, + p8, p7, p6)

+ +

qface5 = geompy.MakeQuad4Vertices(p13, + p9, p6, p10)

+ +

qface6 = geompy.MakeQuad4Vertices(p13, + p9, p8, p12)

+ +

qface7 = geompy.MakeQuad4Vertices(p12, + p8, p7, p11)

+ +

qface8 = geompy.MakeQuad4Vertices(p11, + p7, p6, p10)

+ +

 

+ +

# create hexahedral solid between two given faces

+ +

solid1 = geompy.MakeHexa2Faces(qface1, + qface2)

+ +

 

+ +

# create hexahedral solids, bounded by the six given faces

+ +

solid2 = geompy.MakeHexa(qface3, + qface4, qface5, qface6, qface7, qface8)

+ +

 

+ +

# add objects in study

+ +

id_solid1 = geompy.addToStudy(solid1,"Solid1")

+ +

id_solid2 = geompy.addToStudy(solid2,"Solid2")

+ +

 

+ +

# display solids

+ +

gg.createAndDisplayGO(id_solid1)

+ +

gg.setDisplayMode(id_solid1,1)

+ +

gg.createAndDisplayGO(id_solid2)

+ +

gg.setDisplayMode(id_solid2,1) +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/chamfer.htm b/doc/salome/gui/GEOM/chamfer.htm new file mode 100755 index 000000000..4ad8cfcbe --- /dev/null +++ b/doc/salome/gui/GEOM/chamfer.htm @@ -0,0 +1,192 @@ + + + + + +Chamfer + + + + + + + + + + + + +

Chamfer

+ +

To produce + a Fillet in the Main Menu select + Operations - > Transformation - > + Fillet

+ +

 

+ +

This operation allows you to make chamfer + of the edges of a Shape.

+ +

The Result will + be a GEOM_Object.

+ +

 

+ +

To create + chamfer on all edges of the given shape, you need to define the Main Object to create a chamfer on and + the Dimension (radius) of the + chamfer.  

+ +

TUI Command: + geompy.MakeChamferAll(Shape, D) +

+ +

Arguments: Name + + 1 SHAPE + 1 value (Chamfer dimension).

+ +

 

+ +

 

+ +

 

+ +

To create chamfer on the specified edges of + the given shape,  you + need to define the Main Object + to create a fillet on, select the necessary edges in the object browser + or in the viewer and define the Dimension + of the Chamfer.

+ +

TUI Command: + geompy.MakeChamferEdge(Shape, D1, + D2, Face1, Face2), where Shape is a shape to create a chamfer on, + D1 is a chamfer size along Face1, D2 is a chamfer size along Face2, Face1 + and Face2 are indices of faces in Shape.

+ +

 

+ +

 

+ +

 

+ +

To create chamfer on the specified faces of + the given shape,  you + need to define the Main Object + to create a fillet on, select the necessary faces in the object browser + or in the viewer and define the Dimension + of the Chamfer.

+ +

TUI Command: + geompy.MakeChamferFace(Shape, D1, + D2, ListOfFaceID), where Shape is a shape to create chamfer on, + D1 is a chamfer size along a face from  ListOfFaceID, +  D2 is a + chamfer size along two faces connected to the edge to which the chamfer + is applied, ListOfFaceID is a list of indices of faces in Shape.

+ +

 

+ +

 

+ +

 

+ +

  Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/changing_display_parameters.htm b/doc/salome/gui/GEOM/changing_display_parameters.htm new file mode 100755 index 000000000..c2ed2dffe --- /dev/null +++ b/doc/salome/gui/GEOM/changing_display_parameters.htm @@ -0,0 +1,176 @@ + + + + + +Changing Display Parameters + + + + + + + + + + + +

Changing Displaying Parameters

+ +

Changing Color

+ +

import salome

+ +

import geompy

+ +

box = geompy.MakeBox(0,0,0, + 50,50,50)

+ +

 

+ +

sphere = geompy.MakeSphere(50,50,50, + 30)

+ +

fuse = geompy.MakeBoolean(box,sphere,3)

+ +

fuse_id = geompy.addToStudy(fuse,"Fuse")

+ +

 

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

gg.createAndDisplayGO(fuse_id)

+ +

gg.setDisplayMode(fuse_id,1)

+ +

gg.setColor(fuse_id,218,165,31) +

+ +

 

+ +

Changing Display Mode

+ +

import + salome

+ +

import geompy

+ +

box = geompy.MakeBox(0,0,0, + 50,50,50)

+ +

 

+ +

sphere = geompy.MakeSphere(50,50,50, + 30)

+ +

fuse = geompy.MakeBoolean(box,sphere,3)

+ +

fuse_id = geompy.addToStudy(fuse,"Fuse")

+ +

 

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

gg.createAndDisplayGO(fuse_id)

+ +

gg.setDisplayMode(fuse_id,1) +

+ +

 

+ +

Changing Transparency

+ +

import salome

+ +

import geompy

+ +

 

+ +

box = geompy.MakeBox(0,0,0, + 50,50,50)

+ +

sphere = geompy.MakeSphere(50,50,50, + 30)

+ +

 

+ +

fuse = geompy.MakeBoolean(box,sphere,3)

+ +

fuse_id = geompy.addToStudy(fuse,"Fuse")

+ +

 

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

gg.createAndDisplayGO(fuse_id)

+ +

gg.setDisplayMode(fuse_id,1)

+ +

gg.setColor(fuse_id,218,165,31)

+ +

gg.setTransparency(fuse_id,0.5) +

+ + + + diff --git a/doc/salome/gui/GEOM/changing_displaying_parameters.htm b/doc/salome/gui/GEOM/changing_displaying_parameters.htm new file mode 100755 index 000000000..42ab05be2 --- /dev/null +++ b/doc/salome/gui/GEOM/changing_displaying_parameters.htm @@ -0,0 +1,256 @@ + + + + + +Changing displaying parameters + + + + + + + + + + + +

Changing displaying parameters

+ +

In GEOM you can set different + displaying parameters for visualization of geometrical objects in the + viewer:

+ +

 

+ + + +

 

+ +

To set displaying parameters of a geometrical object:

+ +

 

+ +

Right-click on this geometrical object in + the viewer and from the pop-up menu select Properties.

+ +

 

+ +

 

+ +

Wireframe/Shading

+ +

 

+ +

Description: + Set the display mode of the selected shape.

+ +

 

+ +

TUI + Command: gg.setDisplayMode(ID, Short)

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

 

+ +

Color

+ +

 

+ +

Description: + Change the color of a shape.

+ +

 

+ +

TUI Command: + gg.setColor(ID, Short, Short, Short)

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

Transparency

+ +

 

+ +

Description: + Change the transparency (between 0 & 1) of a shape.

+ +

 

+ +

TUI Command: + gg.setTransparency(ID, Double)

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

Isos

+ +

 

+ +

Description: + Changes the number of isolines displayed within a shape.

+ +

 

+ +

Arguments: + 2 values (number of isolines).

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of Changing Displaying Parameters. +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/check_free_boundaries.htm b/doc/salome/gui/GEOM/check_free_boundaries.htm new file mode 100755 index 000000000..d5da15b92 --- /dev/null +++ b/doc/salome/gui/GEOM/check_free_boundaries.htm @@ -0,0 +1,154 @@ + + + + + +Check Free Boundaries + + + + + + + + + + + + +

Check Free Boundaries

+ +

To Check Free Boundaries in the Main Menu + select Repair - > Check Free Boundaries.

+ +

 

+ +

This operation detects wires and edges that + correspond to the shape's boundary, and highlights it

+ +

 

+ +

Result: GEOM_Object. +

+ +

 

+ +

TUI Command : (NoError, ClosedWires, OpenWires) = geompy.GetFreeBoundary(Shape), + where Shape is a shape to be checked, NoError is false if an error occurred + while checking free boundaries, ClosedWires is a list of closed free boundary + wires, OpenWires is a list of open free boundary wires.

+ +

 

+ +

Arguments: + Shape

+ +

 

+ +

Dialog + Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

  

+ +

 

+ +

Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/check_free_faces.htm b/doc/salome/gui/GEOM/check_free_faces.htm new file mode 100755 index 000000000..68757732c --- /dev/null +++ b/doc/salome/gui/GEOM/check_free_faces.htm @@ -0,0 +1,148 @@ + + + + + +Check Free Faces + + + + + + + + + + + + +

Check Free Faces

+ +

To Check Free Faces in the Main Menu select + Repair - > Check Free Faces.

+ +

 

+ +

This operation retrieves all free faces from + a given shape. A free face is a face not shared between two shells of + the shape.

+ +

 

+ +

Result: GEOM_Object. + Returns a list of IDs of all free faces, contained in the shape.

+ +

TUI Command : GetFreeFacesIDs(Shape), where + Shape is a shape to be checked.

+ +

Arguments: + Shape

+ +

 

+ +

 

+ +

+ +

 

+ +

Examples:

+ +

 

+ +

 

+ +

 

+ +

Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/circle.htm b/doc/salome/gui/GEOM/circle.htm new file mode 100755 index 000000000..22ad198ca --- /dev/null +++ b/doc/salome/gui/GEOM/circle.htm @@ -0,0 +1,150 @@ + + + + + +Circle + + + + + + + + + + + +

Circle

+ +

To create a Circle + in the Main Menu select New Entity - > Basic - > Circle

+ +

 

+ +

There + are 2 algorithms to create a Circle in + the 3D space.

+ +

The + Result of each operation will be a + GEOM_Object (edge).

+ +

 

+ +

Firstly, + you can define a Circle by a Center Point, a + Vector giving the circleÂ’s + normal and a Radius.

+ +

TUI Command: + geompy.MakeCircle(Point, Vector, Radius)

+ +

Arguments: + Name + 1 vertex (for the center) + + 1 edge (for the direction) + Radius.

+ +

 

+ +

+ +

 

+ +

Secondly, + you can define a Circle by three + Points that lie on it.

+ +

TUI + Command:  geompy.MakeCircleThreePnt(Point1, + Point2, Point3)

+ +

Arguments: + Name + 3 points which will form + the circle.

+ +

 

+ +

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Basic + Geometric Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/close_contour.htm b/doc/salome/gui/GEOM/close_contour.htm new file mode 100755 index 000000000..3dd603fc4 --- /dev/null +++ b/doc/salome/gui/GEOM/close_contour.htm @@ -0,0 +1,149 @@ + + + + + +Close Contour + + + + + + + + + + + +

Close Contour

+ +

To produce + a Close Contour operation in the + Main Menu select Repair - > Close + Contour.

+ +

 

+ +

This operation closes an open contour and modifies + the underlying face (if needed) in accordance with user specified mode:

+ + + +

This operation is available in OCC + Viewer only.

+ +

 

+ +

Result: GEOM_Object.

+ +

 

+ +

TUI Command: + geompy.CloseContour(Shape, Wires, + IsCommonVertex), where Shape is a shape to be processed, Wires + is a list of edges or wires IDÂ’s which has to be closed within the shape + (if the list contains only one element = -1, the shape itself is considered + as a wire),  IsCommonVertex + if this parameter is True a closure has to be done by creation of a common + vertex, otherwise an edge is added between the end vertices.

+ +

 

+ +

Arguments: Name + 1 shape + contour (Wire, + or a set of Edges) + mode of closure (by vertex or by edge)

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/common.htm b/doc/salome/gui/GEOM/common.htm new file mode 100755 index 000000000..02eab0666 --- /dev/null +++ b/doc/salome/gui/GEOM/common.htm @@ -0,0 +1,141 @@ + + + + + +Common + + + + + + + + + + + + +

Common

+ +

To produce + a Common in the Main Menu select + Operations - > Boolean - > Common

+ +

 

+ +

This + operation cuts the common part of two shapes and transforms + it into an independent geometrical object.

+ +

 

+ +

The + Result will be a GEOM_Object + (COMPOUND).

+ +

TUI Command: +  geompy.MakeCommon(s1, + s2)

+ +

Arguments: + Name + 2 shapes.

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of the use of Boolean Operations. +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/complex_objects.htm b/doc/salome/gui/GEOM/complex_objects.htm new file mode 100755 index 000000000..00e9e0437 --- /dev/null +++ b/doc/salome/gui/GEOM/complex_objects.htm @@ -0,0 +1,484 @@ + + + + + +Complex Objects + + + + + + + + + + + +

Complex Objects

+ +

Creation of a Prism

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex( +   0., +   0., +   0.)

+ +

p2 = geompy.MakeVertex( + 100.,   0., +   0.)

+ +

p3 = geompy.MakeVertex( + 100., 100.,   0.)

+ +

p4 = geompy.MakeVertex( +   0., + 100.,   0.)

+ +

p5 = geompy.MakeVertex( +   0., +   0., +  60.)

+ +

p6 = geompy.MakeVertex(-100., +   0., +   0.)

+ +

p7 = geompy.MakeVertex(-100.,-100., +   0.)

+ +

p8 = geompy.MakeVertex( +   0.,-100., +   0.)

+ +

 

+ +

# create vector with the given components

+ +

vector = geompy.MakeVectorDXDYDZ(50., + 50., 50.)

+ +

 

+ +

#create vectors with two points

+ +

vector1_arc1 = geompy.MakeVector(p1, + p2)

+ +

vector2_arc1 = geompy.MakeVector(p1, + p4)

+ +

vector1_arc2 = geompy.MakeVector(p1, + p6)

+ +

vector2_arc2 = geompy.MakeVector(p1, + p8)

+ +

 

+ +

# create arcs with three points

+ +

arc1 = geompy.MakeArc(p2, + p3, p4)

+ +

arc2 = geompy.MakeArc(p6, + p7, p8)

+ +

 

+ +

# create wires

+ +

wire1 = geompy.MakeWire([vector1_arc1, + arc1, vector2_arc1])

+ +

wire2 = geompy.MakeWire([vector1_arc2, + arc2, vector2_arc2])

+ +

 

+ +

# create faces

+ +

isPlanarWanted = 1

+ +

face1 = geompy.MakeFace(wire1, + isPlanarWanted)

+ +

face2 = geompy.MakeFace(wire2, + isPlanarWanted)

+ +

 

+ +

# create prisms

+ +

prism1 = geompy.MakePrism(face2, + p1, p5)

+ +

prism2 = geompy.MakePrismVecH(face1, + vector, 50)

+ +

 

+ +

# add objects in study

+ +

id_face1   = + geompy.addToStudy(face1,"Face1")

+ +

id_face2   = + geompy.addToStudy(face2,"Face2")

+ +

id_prism1 = geompy.addToStudy(prism1,"Prism1")

+ +

id_prism2 = geompy.addToStudy(prism2,"Prism2")

+ +

 

+ +

# display cylinders

+ +

gg.createAndDisplayGO(id_face1)

+ +

gg.setDisplayMode(id_face1,1)

+ +

gg.createAndDisplayGO(id_face2)

+ +

gg.setDisplayMode(id_face2,1)

+ +

gg.createAndDisplayGO(id_prism1)

+ +

gg.setDisplayMode(id_prism1,1)

+ +

gg.createAndDisplayGO(id_prism2)

+ +

gg.setDisplayMode(id_prism2,1) +

+ +

Creation of a Revolution

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex( +  10.,  10., +  10.)

+ +

p2 = geompy.MakeVertex( +  15.,  15., +  50.)

+ +

p3 = geompy.MakeVertex( +  40.,  40., +   0.)

+ +

 

+ +

#create vectors with two points

+ +

vector1 = geompy.MakeVector(p1, + p2)

+ +

vector2 = geompy.MakeVector(p1, + p3)

+ +

 

+ +

# create vector with the given components

+ +

vector3 = geompy.MakeVectorDXDYDZ(-20., + -20., 100.)

+ +

 

+ +

# create wire

+ +

wire = geompy.MakeWire([vector1, + vector2])

+ +

 

+ +

# create revolution

+ +

revolution = geompy.MakeRevolution(wire, + vector3, 2.3)

+ +

 

+ +

# add objects in study

+ +

id_vector3    = + geompy.addToStudy(vector3,"Axis")

+ +

id_wire       = + geompy.addToStudy(wire,"Wire")

+ +

id_revolution = geompy.addToStudy(revolution,"Revolution")

+ +

 

+ +

# display vector, wire and revolution

+ +

gg.createAndDisplayGO(id_vector3)

+ +

gg.createAndDisplayGO(id_wire)

+ +

gg.createAndDisplayGO(id_revolution)

+ +

gg.setDisplayMode(id_revolution,1) +

+ +

Creation of a Filling

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

mindeg = 2

+ +

maxdeg = 5

+ +

tol3d   = + 0.0001

+ +

tol2d   = + 0.0001

+ +

nbiter = 5

+ +

 

+ +

# create vertex and vector

+ +

p1 = geompy.MakeVertex( +  -30.,  -30., +  50.)

+ +

p2 = geompy.MakeVertex( +  -60.,  -60., +  30.)

+ +

p3 = geompy.MakeVertex( +  -30.,  -30., +  10.)

+ +

 

+ +

# create arc with three points

+ +

arc = geompy.MakeArc(p1, + p2, p3)

+ +

ShapeListCompound + = []

+ +

i = 0

+ +

while i <= 3 :

+ +

    S + = geompy.MakeTranslation(arc, i * 50., 0., 0.)

+ +

    ShapeListCompound.append(S)

+ +

    i + = i + 1

+ +

compound = geompy.MakeCompound(ShapeListCompound)

+ +

 

+ +

# create filling

+ +

filling = geompy.MakeFilling(compound, + mindeg, maxdeg, tol3d, tol2d, nbiter)

+ +

 

+ +

# add objects in study

+ +

id_compound = geompy.addToStudy(compound,"Compound")

+ +

id_filling = geompy.addToStudy(filling,"Filling")

+ +

 

+ +

# display compound and filling

+ +

gg.createAndDisplayGO(id_compound)

+ +

gg.createAndDisplayGO(id_filling)

+ +

gg.setDisplayMode(id_filling,1) +

+ +

 

+ +

Creation of a Pipe

+ +

import geompy

+ +

import salome

+ +

gg = salome.ImportComponentGUI("GEOM")

+ +

 

+ +

# create vertices

+ +

p0   = + geompy.MakeVertex(0.  , + 0.  , 0. +  )

+ +

px   = + geompy.MakeVertex(100., 0.  , + 0.  )

+ +

py   = + geompy.MakeVertex(0.  , + 100., 0.  )

+ +

pz   = + geompy.MakeVertex(0.  , + 0.  , 100.)

+ +

pxyz = geompy.MakeVertex(100., + 100., 100.)

+ +

 

+ +

# create vector on two points

+ +

vxy = geompy.MakeVector(px, + py)

+ +

 

+ +

# create arc with three points

+ +

arc = geompy.MakeArc(py, + pz, px)

+ +

 

+ +

# create wire

+ +

wire = geompy.MakeWire([vxy, + arc])

+ +

 

+ +

# create edge

+ +

edge = geompy.MakeEdge(p0, + pxyz)

+ +

 

+ +

# create pipe

+ +

pipe = geompy.MakePipe(wire, + edge)

+ +

 

+ +

# add objects in study

+ +

id_wire = geompy.addToStudy(wire,"Wire")

+ +

id_edge = geompy.addToStudy(edge,"Edge")

+ +

id_pipe = geompy.addToStudy(pipe,"Pipe")

+ +

 

+ +

# display wire, edge (path) and pipe

+ +

gg.createAndDisplayGO(id_wire)

+ +

gg.createAndDisplayGO(id_edge)

+ +

gg.createAndDisplayGO(id_pipe)

+ +

gg.setDisplayMode(id_pipe,1) +

+ + + + diff --git a/doc/salome/gui/GEOM/compound.htm b/doc/salome/gui/GEOM/compound.htm new file mode 100755 index 000000000..2649dacef --- /dev/null +++ b/doc/salome/gui/GEOM/compound.htm @@ -0,0 +1,133 @@ + + + + + +Compound + + + + + + + + + + + +

Compound

+ +

To create + a Compound in the Main Menu select + New Entity - > Build - > Compound.

+ +

 

+ +

You can create a compound from a list of shells. +

+ +

The + Result will be a GEOM_Object + (COMPOUND).

+ +

 

+ +

TUI Command: + geompy.MakeCompound(ListOfShape)

+ +

Arguments: + Name + List of shapes.

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

+ +

 

+ +

 

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/cone.htm b/doc/salome/gui/GEOM/cone.htm new file mode 100755 index 000000000..08858fe3f --- /dev/null +++ b/doc/salome/gui/GEOM/cone.htm @@ -0,0 +1,169 @@ + + + + + +Cone + + + + + + + + + + + + +

 Cone

+ +

To create a Cone + in the Main Menu select New Entity - > Primitives - > Cone

+ +

 

+ +

There are two algorithms for creation of a Torus. +

+ +

The + Result of each operation will be a + GEOM_Object (SOLID).

+ +

 

+ +

Firstly, you can define a Cone + by the Base Point (the central + point of the cone base), the Axis, + the Height and the first and the + second Radiuses.

+ +

TUI Command: geompy.MakeCone(Point, + Axis, Radius1, Radius2)

+ +

Arguments: + Name + 1 vertex + + 1 vector (for direction) + 3 values (Radius of the base part, radius + of the upper part, height).

+ +

+ +

 

+ +

Secondly, you can define a Cone + with the centre at the origin of coordinates by its Height + and Radiuses. The Axis + of the Cone will be collinear + to the OZ axis of the coordinate system.

+ +

TUI Command: geompy.MakeConeR1R2H(Radius1, + Radius2, Height)

+ +

Arguments: + Name + 3 values + (Radius of the base part, radius of the upper part, height).

+ +

  

+ +

 

+ +

Note: If both radiuses are non-zero, + the Cone will be truncated. If + the radiuses are equal, a Cylinder + will be created instead.

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Primitives.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/curve.htm b/doc/salome/gui/GEOM/curve.htm new file mode 100755 index 000000000..fd55288e3 --- /dev/null +++ b/doc/salome/gui/GEOM/curve.htm @@ -0,0 +1,162 @@ + + + + + +Curve + + + + + + + + + + + +

 Curve

+ +

To create a Curve in the Main Menu select New + Entity - > Basic - > Curve

+ +

 

+ +

There are three algorithms to create + a Curve in the 3D space. Each time you define it by + a list of Points through which the curve passes. The three Curve Construction menu choices correspond to the three possible + types of curves: Polyline, Besier or B-spline (Interpolated) curve.

+ +

The Result of + each operation will be a GEOM_Object (edge).

+ +

 

+ +

TUI Commands: +

+ + + +

ListOfShape is a list of points through which + the curve passes.

+ +

Arguments: + Name + at least 2 points which will serve as nodes on the curve.

+ +

 

+ +

+ +

 

+ +

Examples:

+ +

 

+ +

Polyline +                                                                      Bezier +                                                                        B-Spline

+ +

          

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Basic + Geometric Objects.

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/cut.htm b/doc/salome/gui/GEOM/cut.htm new file mode 100755 index 000000000..cc5d74ed0 --- /dev/null +++ b/doc/salome/gui/GEOM/cut.htm @@ -0,0 +1,138 @@ + + + + + +Cut + + + + + + + + + + + + +

Cut

+ +

To produce + a Cut in the Main Menu select + Operations - > Boolean - > Cut

+ +

 

+ +

This operation cuts a shape with another + one.

+ +

The + Result will be a  GEOM_Object + (COMPOUND).

+ +

Arguments: + Name + 2 shapes.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of the use of Boolean Operations. +

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/cylinder.htm b/doc/salome/gui/GEOM/cylinder.htm new file mode 100755 index 000000000..087d2d73d --- /dev/null +++ b/doc/salome/gui/GEOM/cylinder.htm @@ -0,0 +1,160 @@ + + + + + +Cylinder + + + + + + + + + + + + +

Cylinder

+ +

To create a Cylinder + in the Main Menu select New Entity - > Primitives - > Cylinder

+ +

 

+ +

There are 2 algorithms for creation of a Cylinder. +

+ +

The + Result of each operation will be a + GEOM_Object (SOLID).

+ +

 

+ +

Firstly, you can define a Cylinder + by the Base Point (the central + point of the cylinder base), the Vector + (the axis of the cylinder), and its dimensions: the Radius and the Height.

+ +

TUI Command: geompy.MakeCylinder(Point, + Axis, Radius, Height),

+ +

Arguments: +  Name + + 1 vertex + 1 vector + 2 values (Dimensions: radius and height).

+ +

+ +

 

+ +

Secondly, you can define a + Cylinder by the given radius + and the height at  the + origin of coordinate system. The axis of the cylinder will be collinear + to the OZ axis of the coordinate system.

+ +

TUI Command: geompy.MakeCylinderRH(Radius, + Height)

+ +

Arguments: Name + + 2 values (Dimensions at origin: radius and height).

+ +

  

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Primitives.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/edge.htm b/doc/salome/gui/GEOM/edge.htm new file mode 100755 index 000000000..184e5ba47 --- /dev/null +++ b/doc/salome/gui/GEOM/edge.htm @@ -0,0 +1,130 @@ + + + + + +Edge + + + + + + + + + + + +

Edge

+ +

To + create an Edge in the Main + Menu select New Entity - > + Build - > Edge

+ +

 

+ +

You can create an Edge + from two points (Point1 and Point2), being the first and the last + vertices of the edge.

+ +

The + Result  will + be a GEOM_Object (EDGE).

+ +

TUI Command: + geompy.MakeEdge(Vertex1, Vertex2), + where Vertex1 and Vertex2 are correspondingly the first and the last vertex + of the edge.

+ +

Arguments: + Name + 2 vertices.

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/ellipse.htm b/doc/salome/gui/GEOM/ellipse.htm new file mode 100755 index 000000000..f8b34dad2 --- /dev/null +++ b/doc/salome/gui/GEOM/ellipse.htm @@ -0,0 +1,148 @@ + + + + + +Ellipse + + + + + + + + + + + + +

Ellipse

+ +

To create an Ellipse in the Main + Menu select New Entity - > + Basic - > Ellipse

+ +

 

+ +

You + can define an Ellipse by its + Center Point, a Vector giving its normal, and its Major & + Minor Radiuses.

+ +

The + Result of the operation will be a + GEOM_Object (edge).

+ +

 

+ +

TUI Command: geompy.MakeEllipse(Point, Vector, RadiusMajor, + RadiusMinor),

+ +

Arguments: + Name + 1 vertex (for the center) + 1 edge (for the direction) + 1 X Radius + + 1 Y Radius.

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts + provide you with useful examples of creation of Basic + Geometric Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/explode.htm b/doc/salome/gui/GEOM/explode.htm new file mode 100755 index 000000000..46e1d3560 --- /dev/null +++ b/doc/salome/gui/GEOM/explode.htm @@ -0,0 +1,180 @@ + + + + + +Explode + + + + + + + + + + + + +

 Explode

+ +

To Explode + an object into subshapes, in the main menu select New + Entity > Explode.

+ +

 

+ +

To create a list of  subshapes + (vertices, edges, wires etc.) of the given shape using the Explode + operation, you need to define the Main + Object, which will be exploded and + the Type of Subshapes you wish to obtain from it.

+ +

The + Result of the operation will be a List + of GEOM_Objects (edges, faces, solids or compsolids).

+ +

 

+ +

Using + TUI Commands you can perform this operation + in a variety of ways:

+ + + +

 

+ +

Arguments: + 1 SHAPE + 1 type of SubShape.

+ +

 

+ +

 

+ +

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/explode_on_blocks.htm b/doc/salome/gui/GEOM/explode_on_blocks.htm new file mode 100755 index 000000000..7022e94bd --- /dev/null +++ b/doc/salome/gui/GEOM/explode_on_blocks.htm @@ -0,0 +1,163 @@ + + + + + +Explode on Blocks + + + + + + + + + + + + +

Explode on Blocks

+ +

To produce + an Explode on Blocks operation + in the Main Menu select Operations - + > Blocks - > Explode on Blocks.

+ +

 

+ +

This operation + returns blocks of the given compound. The user may define the type blocks + to be extracted by setting the minimum and maximum number of faces in + the target block. By checking the corresponding box the user may also + interactively choose the blocks from a compound .

+ +

 

+ +

The + Result will be a GEOM_Object.

+ +

 

+ +

TUI Command: + geompy.MakeBlockExplode(Compound, + MinNbFaces, MaxNbFaces), where Compound is a compound to be exploded + into the blocks, MinNbFaces, MaxNbFaces are correspondingly the minimal + and  the + maximal number of faces of the resulting blocks.

+ +

Arguments: 1 compound + 1 integer (min. and max. number + of faces in the block to be extracted).

+ +

 

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

   Our TUI + Scripts provide you with useful examples + of the use of Blocks + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/extrusion.htm b/doc/salome/gui/GEOM/extrusion.htm new file mode 100755 index 000000000..27efe7e60 --- /dev/null +++ b/doc/salome/gui/GEOM/extrusion.htm @@ -0,0 +1,169 @@ + + + + + +Extrusion + + + + + + + + + + + + +

 Extrusion

+ +

To generate an Extrusion on an object in the Main Menu select New + Entity - > Generation  - + > Extrusion

+ +

 

+ +

To create an Extrusion (Prism) you should define + the Base Shape (a basis of the + extrusion), the Vector + (a normal of the extrusion) and the Height + of extrusion.  

+ +

The + Result of the operation will be a + GEOM_Object (edge, face, solid or compsolid).

+ +

TUI + Command : geompy.MakePrismVecH(Base, + Vector, Height)

+ +

Arguments: Name + 1 shape (vertex, + edge, wire, face or shell) serving as base object + 1 vector (for direction) + + 1 value (dimension).

+ +

 

+ +

+ +

 

+ +

NB! The + is another way to create an Extrusion, which + is currently accessible only via TUI commands.

+ +

You + can define the Extrusion by + the Base Shape and the Start and End Point + of the Vector  (in + this way you don't need to create it in advance).

+ +

TUI + Command: geompy.MakePrism(Base, + Point1, Point2)

+ +

 

+ +

 

+ +

Examples:

+ +

 

+ +

Base Shape                                                          Prisms

+ +

 

+ +

 

+ +

Our TUI Scripts + provide you with useful examples of creation of Complex + Geometric Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/face.htm b/doc/salome/gui/GEOM/face.htm new file mode 100755 index 000000000..0b8231d67 --- /dev/null +++ b/doc/salome/gui/GEOM/face.htm @@ -0,0 +1,151 @@ + + + + + +Face + + + + + + + + + + + +

 Face

+ +

To create + a Face in the Main Menu select + New Entity - > Build - > Face

+ +

 

+ +

To + create a Face + you need to select a wire, whose elements will be connected so that the + surface of the resulting object was minimal. Check Try + to create a planar face to create + a planar face or nothing if it is impossible.

+ +

The + Result will be a GEOM_Object + (FACE).

+ +

 

+ +

TUI Command: + geompy.MakeFace(Wire, isPlanarWanted)

+ +

Arguments: + Name + 1 wire.

+ +

 

+ +

+ +

 

+ +

TUI commands + give you some advanced possibilities.

+ +

 

+ +

geompy.MakeFaceWires(Wires, + isPlanarWanted) - Creates a face on the given wires set. The argument + is not a single wire, but a list of wires.

+ +

geompy.MakeFaces(Wires, + isPlanarWanted) is a shortcut to MakeFaceWires(). +

+ +

 

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_basicgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_basicgui_functions.htm new file mode 100755 index 000000000..1630c691f --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_basicgui_functions.htm @@ -0,0 +1,885 @@ + + + + + +Titre + + + + + + + + + + + + +

Creating basic geometrical objects

+ +

In GEOM you can create basic geometrical objects (1D + & 2D elements) such as:

+ +

+ + + + + + +

 

+ +

 

+ +

To create basic geometrical objects:

+ +

 

+ +

In the main menu select New + Entity > Basic.

+ +

 

+ +  + +

Point

+ +

 

+ +

Description: + Creates a point.

+ +

 

+ +

Result: GEOM_Object + (vertex).

+ +

 

+ +

TUI Command : +   geompy.MakeVertex(X, + Y, Z) -

+ +

geompy.MakeVertexWithRef(Reference, + X, Y, Z)

+ +

geompy.MakeVertexOnCurve(Edge, Parameter) +

+ +

 

+ +

Arguments:

+ + + +

 

+ +

Dialog Box:

+ +

 

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

+

+

+ +

 

+ +

 

+ +

   

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

Line

+ +

 

+ +

Description: + Creates a line.

+ +

 

+ +

Result: GEOM_Object + (edge).

+ +

 

+ +

TUI Command: + geompy.MakeLine(Point1, Point2), + where Point1 and Point2 are points through  which + the line passes.

+ +

 

+ +

Arguments: + Name + 2 vertices.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

Circle

+ +

 

+ +

Description: + Creates a circle.

+ +

 

+ +

Result: GEOM_Object + (edge).

+ +

 

+ +

TUI Command: + geompy.MakeCircle(Point, Vector, Radius), + where Point defines the center of the circle, Vector gives the circleÂ’s + normal and Radius is the circleÂ’s  radius.

+ +

 

+ +

Arguments: +

+ + + +

 

+ +

 

+ +

 

+ +

Dialog Box:

+ +

 

+ + +++ + + + +
+

+

+ +

 

+ +

 

+ +

 

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Ellipse

+ +

 

+ +

Description: + Creates an ellipse.

+ +

 

+ +

Result: GEOM_Object + (edge).

+ +

 

+ +

TUI Command: geompy.MakeEllipse(Point, Vector, RadiusMajor, + RadiusMinor), where Point defines the center of the ellipse, Vector + gives the ellipseÂ’s normal, RadiusMajor and RadiusMinor  are + correspondingly a major and minor radiuses of the ellipse.

+ +

 

+ +

Arguments: + Name + 1 vertex (for the center) + 1 edge (for the direction) + 1 X Radius + + 1 Y Radius.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

Arc

+ +

 

+ +

Description: + Creates an arc.

+ +

 

+ +

Result: GEOM_Object + (edge).

+ +

 

+ +

TUI Command: + geompy.MakeArc(Point1, Point2, Point3), + where Point1 is the starting point of the arc, Point2 is a middle point + of the arc and Point3 is the ending point of the arc.

+ +

 

+ +

Arguments: + Name + 3 vertices.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

Curve

+ +

 

+ +

Description: + Creates a curve in 3D space.

+ +

 

+ +

Result: + GEOM_Object (edge).

+ +

 

+ +

TUI Command: +

+ + + +

 

+ +

Arguments: + Name + at least 2 points which will serve as nodes on the curve.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

Polyline +                                          Bezier +                                      B-Spline

+ +

          

+ +

 

+ +

 

+ +

Vector

+ +

 

+ +

Description: + Creates a vector.

+ +

 

+ +

Result: GEOM_Object + (edge).

+ +

 

+ +

TUI Command: + geompy.MakeVector(Point1, Point2), + where Point1 is the first point of the vector and the Point2 is the last + point of the vector.

+ +

 

+ +

Arguments :

+ + + +

 

+ +

Dialog Box:

+ +

 

+ +

      

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Plane

+ +

 

+ +

Description: + Creates a plane.

+ +

 

+ +

Result: GEOM_Object + (face).

+ +

 

+ +

TUI Command: + geompy.MakePlane(Point, Vector, TrimSize), + where Point is a point through which  the + plane passes, Vector gives a normal of the plane and TrimSize is a half + size of a side of quadrangle face, representing the plane.

+ +

 

+ +

Arguments:

+ + + +

 

+ +

Dialog Box:

+ +

 

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

+

+

+ +

 

+ +

 

+ +

         

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

Working + Plane

+ +

 

+ +

Description: + Sets the working plane (and the camera position).

+ +

 

+ +

Arguments: +

+ + + +

 

+ +

 

+ +

Dialog Box:

+ +

 

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

+

+

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

Local + coordinate system

+ +

 

+ +

Description: +  The user + may manually enter values of X, Y, and Z coordinates of origin in the + corresponding fields of the dialog box, or select a point in the object + browser or 3D viewer, in this case coordinates of origin are automatically + filled in with the coordinates of the selected point.

+ +

The user then specifies components of X and + Y axes direction.

+ +

Preview of the new LCS (small trihedron located + and oriented according to parameters of LCS) is displayed in the 3D viewer + and updated as soon as the user modifies some parameter.

+ +

Then the user presses «OK» or «Apply» button + to create an LCS at the location with the specified coordinates. The new + object is shown in the Object Browser and in 3D viewer.

+ +

 

+ +

 

+ +

TUI command: + geompy.MakeMarker(OX, OY, OZ, XDX, XDY, + XDZ, YDX, YDY, YDZ), where OX, OY, OZ are coordinates of the origin + of LCS, XDX, XDY, XDZ is a vector of OX  direction + of the LCS and YDX, YDY, YDZ is a a vector of OY direction of the LCS.

+ +

 

+ +

 

+ +

Arguments: +

+ + + +

 

+ +

.

+ +

 

+ +

Dialog Box:

+ +

 

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

+

+

+ +

 

+ +

Example:

+ +

 

+ +

+ + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_booleangui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_booleangui_functions.htm new file mode 100755 index 000000000..c290d8bf3 --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_booleangui_functions.htm @@ -0,0 +1,153 @@ + + + + + +Titre + + + + + + + + + + + + +

Using boolean operations

+ +

 

+ +

In GEOM for construction of more complex geometrical objects + (2D & 3D elements) you can use the following boolean operations:

+ +

 

+ + + + + +

 

+ +

There is a general TUI command covering + all these operations, which can be used alongside with separate commands + for each operation.

+ +

geompy.MakeBoolean(Shape1, + Shape2, Operation), where Shape1 is the first argument and Shape2 + is the second argument of Boolean operation, Operation is a type of the + Boolean operation (1 – Common, 2 – Cut, 3 – Fuse, 4 – Section).

+ +

 

+ +

Our TUI + Scripts provide you with useful examples of the use of Boolean + Operations.

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_buildgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_buildgui_functions.htm new file mode 100755 index 000000000..42c0ee8ea --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_buildgui_functions.htm @@ -0,0 +1,458 @@ + + + + + +Titre + + + + + + + + + + + +

Building geometrical objects

+ +

In GEOM you can create basic and advanced geometrical objects + (2D & 3D elements) using the following building functions:

+ +

 

+ + + +

 

+ +

 

+ +

 

+ +

To use Explode:

+ +

 

+ +

In the main menu select New + Entity > Explode.

+ +

 

+ +

Explode

+ +

 

+ +

Description: + Returns a list of subshapes (vertices, edges, wires etc.) of the given + shape.

+ +

 

+ +

Result : + List of GEOM_Objects.

+ +

 

+ +

TUI Command: +

+ + + +

 

+ +

Arguments: + 1 SHAPE + 1 type of SubShape.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

 

+ +

To use building functions:

+ +

 

+ +

In the main menu select + New Entity > Build + submenu.

+ +

 

+ +

Edge

+ +

 

+ +

Description: + Creates an edge.

+ +

 

+ +

Result: GEOM_Object + (EDGE).

+ +

 

+ +

TUI Command: + geompy.MakeEdge(Vertex1, Vertex2), + where Vertex1 and Vertex2 are correspondingly the first and the last vertex + of the edge.

+ +

 

+ +

Arguments: + Name + 2 vertices.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Wire

+ +

 

+ +

Description: + Creates a wire.

+ +

 

+ +

Result: GEOM_Object + (WIRE).

+ +

 

+ +

TUI Command : + geompy.MakeWire(ListOfShape), + where ListOfShape is a list of edges and/or wires from which the wire + to be constructed.

+ +

 

+ +

Arguments: + Name + List of connected wires or edges..

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Face

+ +

 

+ +

Description: + Creates a face.

+ +

 

+ +

Result: GEOM_Object + (FACE).

+ +

 

+ +

TUI Command: + geompy.MakeFace(Wire, WantPlanarFace), + where Wire is a wire and if boolean parameter WantPlanarFace is planar + then only a planar face or no face is constructed.

+ +

 

+ +

Arguments: + Name + 1 wire.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Shell

+ +

 

+ +

Description: + Creates a shell.

+ +

 

+ +

Result: GEOM_Object + (SHELL).

+ +

 

+ +

TUI Command: + geompy.MakeShell(ListOfShape), + where ListOfShape is a list of faces and (or) shells from which the shell + is constructed.

+ +

 

+ +

Arguments: + Name + List of faces having connected edges.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

Solid

+ +

 

+ +

Description: + Creates a solid - closed geometrical 3D element.

+ +

 

+ +

Result: GEOM_Object + (SOLID).

+ +

 

+ +

TUI Command: + geompy.MakeSolid(ListOfShape), + where ListOfShape is a list of shells from which the solid is constructed.

+ +

 

+ +

Arguments: + Name + A closed shell or a list of shells.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

 

+ +

Compound

+ +

 

+ +

Description: + Creates a compound.

+ +

 

+ +

Result: GEOM_Object + (COMPOUND).

+ +

 

+ +

TUI Command: + geompy.MakeCompound(ListOfShape), + where ListOfShape is a list of shapes from which the compound is constructed.

+ +

 

+ +

Arguments: + Name + List of shapes.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

+ +

 

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_generationgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_generationgui_functions.htm new file mode 100755 index 000000000..322971bfa --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_generationgui_functions.htm @@ -0,0 +1,307 @@ + + + + + +Titre + + + + + + + + + + + +

Generating complex objects

+ +

Generation operations in GEOM are used to create advanced + geometrical objects (3D elements). They are:

+ +

 

+ + + +

 

+ +

To use generation operations:

+ +

 

+ +

In the main menu select New + Entity > Generation.

+ +

 

+ +

Extrusion

+ +

Description: + Creates an extruded shape.

+ +

 

+ +

Result: GEOM_Object + (edge, face, solid or compsolid).

+ +

 

+ +

TUI Command : + geompy.MakePrism(baseShape, Vector, + Height), where baseShape is a basis of the prism, Vector is a normal + of the prism and Height is a height of the prism.

+ +

 

+ +

Arguments: + Name + 1 shape (vertex, edge, wire, face or shell) serving as base object + + 1 vector (for direction) + 1 value (dimension).

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

Revolution

+ +

+ +

Description: + Creates an extruded shape by revolution.

+ +

 

+ +

Result: GEOM_Object + (edge, face, solid or compsolid).

+ +

 

+ +

TUI Command: + geompy.MakeRevolution(Shape, Axis, + Angle), where Shape is a shape to rotate, Axis is the axis of the + revolution and Angle is an angle by which Shape has to be rotated around + Axis.

+ +

 

+ +

Arguments: + Name + 1 shape (vertex, edge, wire, face or shell) serving as base object + + 1 vector (for direction) + 1 value (angle).

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

Filling

+ +

 

+ +

Description: + Creates a curving face using several curves.

+ +

 

+ +

Result: GEOM_Object + (face).

+ +

 

+ +

TUI Command: + geompy.MakeFilling(Shape, MinDegree, + MaxDegree, Tol2D, Tol3D, NbIter), where Shape is a shape to fill, + MinDegree and MaxDegree are correspondingly maximal and minimal degree, + Tol2D is a tolerance for 2D and Tol3D is a tolerance for 3D, NbIter is + a number of iterations.

+ +

 

+ +

Arguments: + Name + 1 List of edges + 5 Parameters (Min. degree, Max. degree, Number + of iterations, 2D tolerance, 3D tolerance).

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ +

Pipe

+ +

+ +

Description: + Creates an extruded shape.

+ +

 

+ +

Result: GEOM_Object + (edge, face, solid or compsolid).

+ +

 

+ +

TUI Command: + geompy.MakePipe(baseShape, pathShape), + where baseShape is a shape to be extruded, pathShape is a path along which + baseShape is extruded.

+ +

 

+ +

Arguments: + Name + 1 shape (vertex, edge, wire, face or shell) serving as base object + + 1 shape (edge, face or shell) for definition of the path.

+ +

 

+ +

Dialog Box:

+ +

 

+ +

+ +

 

+ +

Example:

+ +

 

+ +

 

+ +

 

+ + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_geomtoolsgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_geomtoolsgui_functions.htm new file mode 100755 index 000000000..9baefc0bc --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_geomtoolsgui_functions.htm @@ -0,0 +1,145 @@ + + + + + +Titre + + + + + + + + + + + +

Importing\exporting geometrical objects

+ +

In GEOM you can import + and export geometrical objects from\into BREP, IGES, STEP files.

+ +  + +

To import geometrical objects from a BREP, IGES, STEP file:

+ +

 

+ +

From the File + menu choose Import and + select the required format of the file for importation. Then you will + see a standard dialog box allowing to search for and choose *.brep, *.iges + or *.step  file:

+ +

 

+ +

+ +

 

+ +

Select the required file and click OK. You file will be imported into GEOM + and its contents (geometrical objects) will be displayed in the Object Browser.

+ +

 

+ +

 

+ +

To export geometrical objects into a BREP, IGES, STEP file:

+ +

 

+ +

Select the object you wish to export, then + from the File menu choose Export and select the required format + of the file for exportation. You will see a standard dialog box allowing + to enter the name and select the location for the file which will be exported:

+ +

 

+ +

+ +

 

+ +

Click OK + to confirm your exportation.  

+ +

 

+ +

 

+ +
  •  

  • + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_measuregui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_measuregui_functions.htm new file mode 100755 index 000000000..cedecfb90 --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_measuregui_functions.htm @@ -0,0 +1,597 @@ + + + + + +Titre + + + + + + + + + + + + +

    Using measurement tools

    + +

    Measurement tools in GEOM are necessary for getting different + data concerning created or imported geometrical objects. They are:

    + +

     

    + + + +

     

    + +

    Our TUI Scripts + show how to use Measurement Tools + with  TUI + commands.

    + +

     

    + +

    To use measurement tools:

    + +

     

    + +

    In the main menu select Measures + submenu.

    + +

     

    + +

     

    + +

      Point coordinates

    + +

     

    + +

    Description: + Returns the coordinates of a point.

    + +

     

    + +

    Result: Point + coordinates (X, Y, Z) in 3D space in the form of Python Tuple.

    + +

     

    + +

    TUI command: + geompy.PointCoordinates(Point), + where Point is a point whose coordinates are inquired.

    + +

     

    + +

     

    + +

    Arguments: + 1 point.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Basic properties +

    + +

     

    + +

    Description: + Return the properties (Length, Surface & Volume) of a definite geometrical + object.

    + +

     

    + +

    Result: Display + Length, Surface & Volume in the form of Python Tuple.

    + +

     

    + +

    TUI command: + geompy.BasicProperties(Shape), + where Shape is a shape whose properties are inquired.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    + Center of mass

    + +

     

    + +

    Description: + Creates a gravity center of a shape and returns its coordinates.

    + +

     

    + +

    Result: GEOM_Object + (vertex).

    + +

     

    + +

    TUI Command: + geompy.MakeCDG(Shape), where + Shape is the shape for which a center of gravity is computed.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Inertia +

    + +

     

    + +

    Description: + Returns the inertia axis of a geometrical object.

    + +

     

    + +

    Result: Display + the matrix and moments of inretia in the form of Python Tuple (I11, I12, + I13,

    + +

     I21, + I22, I23,

    + +

     I31, + I32, I33,

    + +

     Ix, + Iy, Iz).

    + +

     

    + +

    TUI command: + geompy.Inertia(Shape), where + Shape is a shape for which a matrix of inertia and moment of inertia are + returned.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Bounding + box

    + +

     

    + +

    Description: + Returns the dimensions of the bounding box of a geometrical object.

    + +

     

    + +

    Result: Displays + the dimensions of the bounding box of a geometrical object in the form + of Python Tuple (Xmin, Xmax, Ymin, Ymax, Zmin, Zmax).

    + +

     

    + +

    TUI command: geompy.BoundingBox(Shape), where Shape is a shape for which a bounding + box is computed.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Min. distance

    + +

     

    + +

    Description: + Returns the min. distance between 2 geometrical objects.

    + +

     

    + +

    Result: Displays + the min. distance.

    + +

     

    + +

    TUI command: geompy.MinDistance(Shape1, + Shape2), where Shape1 and Shape2 + are shapes between which the minimal distance computed.

    + +

     

    + +

    Arguments: + 2 shapes.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    + Tolerance

    + +

     

    + +

    Description: + Returns the tolerance of a geometrical object.

    + +

     

    + +

    Result: Displays + the tolerance values (FaceMinTol, FaceMaxTol, EgdeMinTol, EgdeMaxTol, + VertexMinTol, VertexMaxTol).

    + +

     

    + +

    TUI command: geompy.Tolerance(Shape), where Shape is a shape for which minimal + and maximal tolerances are returned.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    WhatIs +

    + +

     

    + +

    Description: + Returns the type of a geometrical object.

    + +

     

    + +

    Result: Displays + all elements composing your geometrical object.

    + +

     

    + +

    TUI command: + geompy.WhatIs(Shape), where Shape + is a shape from which a description is returned.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Check +

    + +

     

    + +

    Description: + Returns True if this geometrical object is valid.

    + +

     

    + +

    Result: Boolean.

    + +

     

    + +

    TUI Command: + geompy.CheckShape(Shape), + where is shape which is checked for validity.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

     

    + +

     

    + +

    Check compound + of blocks

    + +

     

    + +

    Description: + Checks whether a shape is a compound of glued blocks. To be considered + as a compound of blocks, the given shape must satisfy the following conditions:

    + + + +

     

    + +

    Informs of the following possible errors:

    + + + +

     

    + +

    Result: Boolean; + highlight in the viewer.

    + +

     

    + +

    TUI Command: + geompy.CheckCompoundOfBlocks(Compound), + where the Compound is a shape, investigated in order to see, if it is + a valid compound of blocks. Validity flag is returned, encountered errors + are printed in the python console.

    + +

     

    + +

    Arguments: + 1 shape.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_operationgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_operationgui_functions.htm new file mode 100755 index 000000000..d67650a0a --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_operationgui_functions.htm @@ -0,0 +1,637 @@ + + + + + +Titre + + + + + + + + + + + + +

    Basic operations

    + +

    In GEOM you can perform + basic operations with geometrical objects aimed at creation of more complex + shapes. These operations are:

    + +

     

    + + + +

     

    + +

    To perform basic operations on geometrical objects:

    + +

     

    + +

    In the main menu select Operations.

    + +

     

    + +

     

    + +

    Partition

    + +

     

    + +

    Description: + Builds a shape by intersection.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakePartition(ListOfShapes, + ListOfTools, ListOfKeepInside, ListOfRemoveInside, Limit, RemoveWebs, + ListOfMaterials), where ListOfShapes is a list of shapes to be + intersected, ListOfTools is a list of shapes to intersect the shapes from + ListOfShapes, ListOfKeepInside is a list of shapes outside which the results + will be deleted, ListOfRemoveInside is a list of shapes inside which the + results will be deleted, Limit is a type of the result shapes, if RemoveWebs + is True the Glue 3D algorithm will be performed on the results, ListOfMaterials + is a list of materials indices for each shape, it makes sense only if + RemoveWebs is True.

    + +

     

    + +

    Arguments: + Up to 4 shapes + reconstruction limit.

    + + + +

     

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Archimede

    + +

     

    + +

    Description: + Creates a plane corresponding to the modeled water-line of the object + plunged into the water (in Z direction).

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.Archimede(Shape,Weight,WaterDensity,MeshingDeflection), + where Shape is a shape to put into the water, Weight is a weight of the + shape, WaterDensity  is + density of water, MeshingDeflection is a deflection of the mesh, using + to compute the section.

    + +

     

    + +

    GUI Arguments: + Name + 1 shape  + + 3 values (Weight, Water Density & Meshing Deflection).

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

       

    + +

     

    + +

     

    + +

    Fillet

    + +

     

    + +

    Description: + Make fillets of the edges of a shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeFillet(Shape, Radius, + ShapeType, ListOfShapeID), where Shape is a shape to create a fillet + on, Radius is a radius of the fillet, ShapeType is a type of shapes to + be processed, ListOfShapeID is a list of subshapeÂ’s Ids to be processed.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

       

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

     

    + +

    Chamfer

    + +

     

    + +

    Description: + Makes chamfer of the edges of a Shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: +

    + + + +

     

    + +

    Arguments:

    + +

     

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

       

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

    Block + multi-transformation

    + +

     

    + +

    Description: + Makes several translations of a block (solid) in one + or two directions depending on + the arguments specified by the user.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: +

    + + + +

     

    + +

    Arguments:

    + +

     

    + + + +

     

    + +

    Dialog Box:

    + + +++ + + + +
    +

    +

    + +

     

    + +

    Example:

    + +

     

    + +

        

    + +

     

    + +

     

    + +

    Explode + on Blocks

    + +

     

    + +

    Description: + Returns blocks of the given compound. The user may define the type blocks + to be extracted by setting the minimum and maximum number of faces in + the target block. By checking the corresponding box the user may also + interactively choose the blocks from a compound .

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeBlockExplode(Compound, + MinNbFaces, MaxNbFaces), where Compound is a compound to be exploded + into the blocks, MinNbFaces, MaxNbFaces are correspondingly the minimal + and  the + maximal number of faces of the resulting blocks.

    + +

     

    + +

    Arguments: 1 compound + 1 integer (min. and max. number + of faces in the block to be extracted).

    + +

     

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

     

    + +

    Propagate

    + +

     

    + +

    Description: + Breaks a multitude of edges of a shape into groups (builds all possible + propagation groups).

    + +

     

    + +

    Result: List + of GEOM_Objects. Each Geom Object will contain a group of edges.

    + +

     

    + +

    TUI Command: + geompy.Propagate(Shape), + where Shape is a shape to build propagation groups on.

    + +

     

    + +

    Arguments: 1 Shape.

    + +

     

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

         

    + + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_primitivegui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_primitivegui_functions.htm new file mode 100755 index 000000000..96c0d677f --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_primitivegui_functions.htm @@ -0,0 +1,395 @@ + + + + + +Titre + + + + + + + + + + + +

    Constructing primitives

    + +

    In + GEOM you can create different types of primitive geometrical objects (3D + elements):

    + +

     

    + + + +

     

    + +

    To construct primitive geometrical objects:

    + +

     

    + +

    In the main menu select New + Entity > Primitives.

    + +

     

    + +

    Box

    + +

     

    + +

    Description: Creates a box.

    + +

     

    + +

    Result: GEOM_Object (SOLID).

    + +

     

    + +

    TUI Command : geompy.MakeBox(X1, + Y1, Z1, X2, Y2, Z2),  where + (X1, Y1, X2) and (X2, Y2, Z2) are coordinates of two points which define + a diagonal of the box.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Cylinder

    + +

     

    + +

    Description: Creates a cylinder.

    + +

     

    + +

    Result: GEOM_Object (solid).

    + +

     

    + +

    TUI Command: geompy.MakeCylinder(Point, + Axis, Radius, Height), where Point is a central point of the cylinder + base, Axis (vector value) is an axis of the cylinder, Radius and Height + are correspondingly a radius and a height of the cylinder.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Sphere

    + +

     

    + +

    Description: Creates a sphere.

    + +

     

    + +

    Result: GEOM_Object (solid).

    + +

     

    + +

    TUI Command: geompy.MakeSphere(Point, + Radius), where Point is a center of the sphere and Radius is a + radius of the sphere.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Torus

    + +

     

    + +

    Description: Creates a torus.

    + +

     

    + +

    Result: GEOM_Object (solid).

    + +

     

    + +

    TUI Command: geompy.MakeTorus(Point, + Vector, RadiusMajor, RadiusMinor), where Point is a central point + of the torus, Vector is an axis of symmetry, RadiusMajor and RadiusMinor +  are correspondingly + a major and minor radiuses of the torus.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Cone

    + +

     

    + +

    Description: Creates a cone.

    + +

     

    + +

    Result: GEOM_Object (SOLID).

    + +

     

    + +

    TUI Command: geompy.MakeCone(Point, + Axis, Radius1, Radius2), where Point is a central point of the + cone base, Axis (vector value) is an axis of the cone, Radius1 and Radius2 + are correspondingly the first and the second radiuses of the cone

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_repairgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_repairgui_functions.htm new file mode 100755 index 000000000..56d2c9c22 --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_repairgui_functions.htm @@ -0,0 +1,898 @@ + + + + + +Titre + + + + + + + + + + + + +

    Repairing geometrical objects

    + +

    Repairing operations are + used for adjustment and modification of created geometrical shapes. The + are:

    + +

     

    + + + +

     

    + +

    The operations Suppress + faces, Close contour, Suppress internal wires, Suppress holes and + Add point on edge are + available only if you are using OCC + viewer.

    + +

     

    + +

    To apply repairing operations:

    + +

     

    + +

    In the main menu select Repair + submenu.

    + +

     

    + +

    Shape + processing

    + +

     

    + +

    Description: + Processes a shape using various operators.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.ProcessShape(Shape, Operators, + Parameters, Values), where Shape is a processed shape, Operators + is a list of names of operators ("FixShape", "SplitClosedFaces", + etc.), Parameters is a list of names of parameters (“FixShape.Tolerance3d”, + etc), Values is a list of values of parameters in the same order as the + Parameters list.

    + +

     

    + +

    Arguments: + 1 or more shapes.

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

    1

    +

    SplitAngle – + this operator is intended for splitting faces based on conical surfaces, + surfaces of revolution and cylindrical surfaces by angle

    +

    SplitAngle.Angle – angle (in radians) defining + size of result segments.

    +

    SplitAngle.MaxTolerance – maximal possible + tolerance on result shape

    +

    2

    +

    SplitClosedFaces + – this operator is intended for dividing all closed faces in the shape + according to the number of points.

    +

    SplitClosedFaces.NbSplitPoints – number of + points for cutting each closed faces.

    +

    3

    +

    FixFaceSize + – this operator is intended for removing small faces (case of the spot + face and strip face)

    +

    FixFaceSize.Tolerance – work tolerance defining + which faces will be removed.

    +

    4

    +

    DropSmallEdges + – this operator is intended for removing small edges or merging with neigbour. +  

    +

    DropSmallEdges.Tolerance3d – work tolerance + for detection and removing small edges.

    +

    5

    +

    BsplineRestriction + –this operator is intended for re-approximation BSplines curves and surfaces + or conversion of the curves and surfaces to BSplines with specified parameters. +

    +

    BSplineRestriction.SurfaceMode - mode of approximation + of surfaces if restriction is necessary

    +

    BSplineRestriction.Curve3dMode -mode of conversion + of any 3D curve to BSpline and approximation.

    +

    BSplineRestriction.Curve2dMode - mode of conversion + of any 2D curve to BSpline and approximation

    +

    BSplineRestriction.Tolerance3d – work tolerance + for definition of the possibility of the approximation of the surfaces + and 3D curves with specified parameters.

    +

    BSplineRestriction.Tolerance2d - work tolerance + for definition of the possibility of the approximation of the 2D curves + with specified parameters.

    +

    BSplineRestriction.Continuity3d – desired continuity + of the resultant surfaces and 3D curves.

    +

    BSplineRestriction.Continuity2d – desired continuity + of the resultant 2D curves.

    +

    BSplineRestriction.RequiredDegree - required + degree of the resultant BSplines

    +

    BSplineRestriction.RequiredNbSegments - required + maximum number of segments of resultant BSplines.

    +

    6

    +

    SplitContinuity + – this operator is intended for splitting shapes to achieve continuities + of curves and surfaces less than specified ones.

    +

    SplitContinuity.Tolerance3d - 3D tolerance + for correction of geometry.

    +

    SplitContinuity.SurfaceContinuity - required + continuity for surfaces.

    +

    SplitContinuity.CurveContinuity - required + continuity for curves.

    +

    7

    +

    ToBezier - this + operator is intended for conversion of the curves and surfaces of the + all types into Bezier curves and surfaces.

    +

    ToBezier.SurfaceMode - mode of conversion of + the surfaces.

    +

    ToBezier.Curve3dMode – mode for conversion + of the 3D curves.

    +

    ToBezier.Curve2dMode – mode for conversion + of the 2D curves.

    +

    ToBezier.MaxTolerance – max possible tolerance + on the resultant shape.

    +

    8

    +

    FixShape – this + operator is intended for correction of the invalid shapes

    +

    FixShape.Tolerance3d – work tolerance for detection + of the problems and correction of them.

    +

    FixShape.MaxTolerance3d - maximal possible + tolerance of the shape after correction.

    +

    9

    +

    SameParameter + – this operator is intended for fixing edges having not same parameter + 2D and 3D curves.

    +

    SameParameter.Tolerance3d – tolerance for detection + and fix problems.

    + +

     

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    Shape before applying Shape Processing (FixShape + operator).

    + +

     

    + +

       

    + +

     

    + +

    The + same shape after applying Shape Processing.

    + +

     

    + +

    + +

     

    + +

     

    + +

    Suppress faces

    + +

     

    + +

    Description: + Suppresses a face of a shape.

    + +

     

    + +

    Result: GEOM_Object + (ListOfGeomShapes).

    + +

     

    + +

    TUI Command: + geompy.SuppressFaces(Shape, ListOfID), + where Shape is a shape to be processed, ListOfID is a list of faces ID's + to be removed.

    + +

     

    + +

    Arguments: + Name + Faces which should be removed (you can select them in the 3D viewer).

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Close contour

    + +

     

    + +

    Description : + Closes an open contour and modifies the underlying face (if needed) in + accordance with user specified mode:

    + + + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.CloseContour(Shape, Wires, + IsCommonVertex), where Shape is a shape to be processed, Wires + is a list of edges or wires IDÂ’s which has to be closed within the shape + (if the list contains only one element = -1, the shape itself is considered + as a wire),  IsCommonVertex + if this parameter is True a closure has to be done by creation of a common + vertex, otherwise an edge is added between the end vertices.

    + +

     

    + +

    Arguments: Name + 1 shape + contour (Wire, + or a set of Edges) + mode of closure (by vertex or by edge)

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

    Suppress + internal wires

    + +

     

    + +

    Description : + Removes all internal wires or specified internal wires from user specified + faces.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.SuppressInternalWires(Shape, + Wires), where Shape is a shape where wires are to be removed, Wires + is a list of wires IDÂ’s to be removed; if the list is empty then all internal + wires are removed.

    + +

     

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

       

    + +

     

    + +

     

    + +

    Suppress + holes

    + +

     

    + +

    Description : +

    + + + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.SuppressHoles(Shape, + ListOfWireID), where Shape is a + shape where holes must be removed, ListOfWireID is a list of wire sub + shapes IDÂ’s. If it is empty, then all holes are removed.

    + +

     

    + +

    Arguments: Name + + 1 shape + Wires which should be removed.

    + +

    Remove all + holes checkbox allows to fill all holes of a definite shape.

    + +

    Detect button + allows to display the number of free boundaries in your shape:

    + +

     

    + +

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

      

    + +

    Example:

    + +

     

    + +

       

    + +

     

    + +

     

    + +

     

    + +

    Sewing

    + +

     

    + +

    Description: + Sew several  shapes.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command : + geompy.MakeSewing(ListOfShape, Precision), + where ListOfShape is list of shapes to be sewed, Precision is a precision + for sewing.

    + +

     

    + +

    Arguments: + Name + 1 or more shapes + 1 value (sew precision).

    + +

    Detect + button allows to display the number of free boundaries in your + shape:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

    Add point on edge

    + +

     

    + +

    Description: + Splits an edge in two in accordance with the specified mode (by length + or by parameter) and a value specifying the position of the point on edge + (for example val =0.5; mode = Length).

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command : + geompy.DivideEdge(Shape, EdgeID, + Value, IsByParameter), where Shape is a shape which contains an + edge to be divided, EdgeID is the ID of the edge to be divided, if it + = -1, then Shape is an edge, Value is a paramter on the edge or a length. + IsByParameter if it is True then Value is the edge parameter in the range + [0:1] otherwise it is a length of the edge in the range [0:1]

    + +

     

    + +

    Arguments: + Name + 1 Edge + 1 value setting the position of the point according to + one of the selected modes

    + +

     

    + +

    Dialog + Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

         

    + +

     

    + +

     

    + +

     

    + +

    Glue faces

    + +

     

    + +

    Description: + Glues faces that are coincident with respect to the given tolerance

    + +

    value.

    + +

     

    + +

    Result: + GEOM_Object.

    + +

     

    + +

    TUI Command + : geompy.MakeGlueFaces(theShape, + theTolerance), where theShape is a compound of shapesto be glued, + theTolerance is a maximum distance between two faces, which can be considered + as coincident.

    + +

     

    + +

    Arguments: + Name + 1 Compound + + Tolerance value

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

      

    + +

     

    + +

     

    + +

     

    + +

    Check free boundaries

    + +

     

    + +

    Description: + Detects wires and edges that correspond to the shape's boundary, and highlights + it

    + +

     

    + +

    Result: GEOM_Object. +

    + +

     

    + +

    TUI Command : (NoError, ClosedWires, OpenWires) = geompy.GetFreeBoundary(Shape), + where Shape is a shape to be checked, NoError is false if an error occurred + while checking free boundaries, ClosedWires is a list of closed free boundary + wires, OpenWires is a list of open free boundary wires.

    + +

     

    + +

    Arguments: + Shape

    + +

     

    + +

    Dialog + Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

      

    + +

     

    + +

     

    + +

     

    + +

    Check free + faces

    + +

     

    + +

    Description: + Retrieves all free faces from a given shape. A free face is + a face not shared between two shells of the shape.

    + +

     

    + +

    Result: GEOM_Object. + Returns a list of IDs of all free faces, contained in the shape.

    + +

     

    + +

    TUI Command : GetFreeFacesIDs(Shape), where + Shape is a shape to be checked.

    + +

     

    + +

    Arguments: + Shape

    + +

     

    + +

    Dialog + Box:

    + +

     

    + +

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/files/salome2_sp3_transformationgui_functions.htm b/doc/salome/gui/GEOM/files/salome2_sp3_transformationgui_functions.htm new file mode 100755 index 000000000..956e7ec71 --- /dev/null +++ b/doc/salome/gui/GEOM/files/salome2_sp3_transformationgui_functions.htm @@ -0,0 +1,669 @@ + + + + + +Titre + + + + + + + + + + + + +

    Using transformation operations

    + +

    In GEOM there is a set + of operations allowing to transform the initial geometrical object into + other objects, which will be also created. These operations are

    + +

     

    + + + +

     

    + +

    All these operations are accessible in the + main menu, via Operations / Transformation.

    + +

     

    + +

    Translation

    + +

     

    + +

    Description: + Makes a translation of a shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeTranslation(Shape, DX, + DY, DZ), where Shape is a shape to be translated, DX, DY, DZ are + components of translation vector.

    + +

     

    + +

    Arguments: +

    + + + +

     

    + +

    Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

       

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Rotation +

    + +

     

    + +

    Description: + Rotates the initial shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeRotation(Shape, Axis, + Angle), where Shape is a shape to be rotated, Axis is an axis of + rotation, Angle is an angle of rotation.

    + +

     

    + +

    Arguments: + 1 shape + 1 vector for direction of rotation + 1 angle.

    + +

    Reverse checkbox + allows to specify the direction of rotation.

    + +

    Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

     

    + +

    Modify the Location

    + +

     

    + +

    Description: + Modification of location of an object.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakePosition(theObject, theStartLCS, theEndLCS), where theObject + is a shape, location of which is modified, theStartLCS is a location to + move the shape from, theEndLCS is a location to move the shape to.

    + +

     

    + +

    Arguments: + Name + 1 GEOM_Object + [Starting Coordinate System] + End Coordinate System.

    + +

    Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

      

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

     

    + +

    Mirror +

    + +

     

    + +

    Description: + Symmetrical copy of a shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeMirrorByPlane(Shape, + Plane), where Shape is a shape to be mirrored, Plane is a plane + of symmetry.

    + +

     

    + +

    Arguments: +

    + + + +

    Create a copy + checkbox allows to keep the initial object, otherwise it + will be removed.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Scale transform +

    + +

     

    + +

    Description: + Creates a scaled shape basing on the initial shape.

    + +

     

    + +

    Result: GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakeScaleTransform(Shape, + CenterOfScale, Factor), where Shape is a shape to be scaled, CenterOfScale + is a center point of scale, Factor is a factor of the scale.

    + +

     

    + +

    Arguments: + Name + 1 shape(s) + 1 vertex + 1 Scale Factor.

    + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Offset surface

    + +

     

    + +

    Description: + Each point is translated along a local normal by a given distance (signed + number, negative value meaning inner offset). Offset operation is applicable + to faces, shells and solids.

    + +

     

    + +

    Result: GEOM_Object +

    + +

     

    + +

    TUI Command: + geompy.MakeOffset(Shape, Offset), + where Shape is a shape which has to be an offset, Offset is a value of + the offset.

    + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

    + +

     

    + +

     

    + +

    Multi-Translation

    + +

     

    + +

    Description: + Makes several translations of a shape in one + or two directions.

    + +

     

    + +

    Result: GEOM_Object + (compound).

    + +

     

    + +

    TUI Command:

    + + + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    One direction:

    + +

     

    + +

     

    + +

     

    + +

    Two directions:

    + +

     

    + +

     

    + +

     

    + +

     

    + +

    Multi-Rotation

    + +

     

    + +

    Description: + Creates several rotated geometrical objects in one + or two directions + basing on the initial geometrical object.

    + +

     

    + +

    Result: GEOM_Object + (compound).

    + +

     

    + +

    TUI Command:

    + + + +

     

    + +

    Arguments:

    + + + +

     

    + +

    Dialog Box:

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    One direction:

    + +

     

    + +

     

    + +

     

    + +

    Two directions:

    + +

     

    + +

     

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/fillet.htm b/doc/salome/gui/GEOM/fillet.htm new file mode 100755 index 000000000..9c7c45168 --- /dev/null +++ b/doc/salome/gui/GEOM/fillet.htm @@ -0,0 +1,179 @@ + + + + + +Fillet + + + + + + + + + + + + +

    Fillet

    + +

    To produce + a Fillet in the Main Menu select + Operations - > Transformation - > + Fillet  

    + +

     

    + +

    This operation creates + fillets on the edges of a shape.

    + +

    The + Result will be a GEOM_Object.

    + +

     

    + +

    To create fillets on all edges of the given + shape, you need to define the Main Object + to create a fillet on and the Radius + of the Fillet.  

    + +

    TUI Command: + geompy.MakeFilletAll(Shape, R)

    + +

    Arguments: Name + 1 shape + 1 value + (fillet radius).

    + +

     

    + +

    + +

     

    + +

    To create fillets  on + the specified edges or faces of the given shape,  you + need to define the Main Object + to create a fillet on, select the necessary edges or faces in the object + browser or in the viewer and define the  Radius + of the Fillet.

    + +

    TUI + Command: geompy.MakeFillet(Shape, R, ShapeType, ListShapes) +

    + +

    Arguments: Name + 1 shape + 1 Selection + of edges (or faces) + 1 value (Fillet radius).

    + +

     

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    Fillet on all                                           Fillet + on an edge                             Fillet + on a Face

    + +

     

    + +

        

    + +

      

    + +

    Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/filling.htm b/doc/salome/gui/GEOM/filling.htm new file mode 100755 index 000000000..2d6edb477 --- /dev/null +++ b/doc/salome/gui/GEOM/filling.htm @@ -0,0 +1,153 @@ + + + + + +Filling + + + + + + + + + + + + +

     Filling + Surface with Curves

    + +

    To generate + a Filling in the Main + Menu select New Entity - > + Generation  - + > Filling

    + +

     

    + +

    To create a curving face using several curves + you need to define the Curves, + which will be the components of your face, Minimum + and Maximum Degree, Tolerance + for 2D and for 3D +  and + the Number of Iterations.

    + +

    The + Result of the operation will be a + GEOM_Object (face).

    + +

     

    + +

    TUI Command: + geompy.MakeFilling(Shape, MinDegree, + MaxDegree, Tol2D, Tol3D, NbIter),

    + +

    Arguments: + Name + 1 List of edges + 5 Parameters (Min. degree, Max. degree, Number + of iterations, 2D tolerance, 3D tolerance).

    + +

     

    + +

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Our TUI Scripts provide you with useful examples + of creation of Complex Geometric + Objects.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/fuse.htm b/doc/salome/gui/GEOM/fuse.htm new file mode 100755 index 000000000..6108eb671 --- /dev/null +++ b/doc/salome/gui/GEOM/fuse.htm @@ -0,0 +1,147 @@ + + + + + +Fuse + + + + + + + + + + + + +

    Fuse

    + +

    To produce + a Fuse in the Main Menu select + Operations - > Boolean - > Fuse

    + +

     

    + +

    This operation creates a shape from two + shapes.

    + +

     

    + +

    The Result + will be a GEOM_Object (COMPOUND).

    + +

    Arguments: + Name + 2 shapes.

    + +

    TUI + Command:  geompy.MakeFuse(s1, + s2)

    + +

     

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Our TUI Scripts + provide you with useful examples of the use of Boolean + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/geom.log b/doc/salome/gui/GEOM/geom.log new file mode 100755 index 000000000..b154fdc0f --- /dev/null +++ b/doc/salome/gui/GEOM/geom.log @@ -0,0 +1,648 @@ +|SourceProjectName:GEOM.hpr +|DestinationProjectName:geom.htm +whhost.js +whmsg.js +whmozemu.js +whproxy.js +whstub.js +whutils.js +whver.js +whform.js +whphost.js +whstart.js +whtopic.js +whframes.js +whlang.js +whskin_info.htm +whskin_blank.htm +whskin_pickup.htm +whskin_homepage.htm +whskin_tw.htm +whnjs.htm +whthost.js +whtdhtml.htm +whihost.js +whibody.htm +whiform.htm +whfhost.js +whfbody.htm +whfform.htm +whghost.js +whgbody.htm +whgdhtml.htm +whgdef.htm +whproj.js +whproj.xml +whproj.htm +whxdata\whtoc.xml +whxdata\whidx.xml +whxdata\whfts.xml +whxdata\whglo.xml +whdata\whtoc.js +whdata\whtoc.htm +whdata\whtdata.js +whdata\whidx.js +whdata\whidx.htm +whdata\whidata.js +whdata\whfts.js +whdata\whfts.htm +whdata\whglo.js +whdata\whglo.htm +whdata\whgdata.js +whdata\whftdata.js +whdata\whfwdata.js +whres.xml +webhelp.jar +webhelp.cab +whgdata\whnvp30.htm +whgdata\whnvp31.htm +whgdata\whnvp32.htm +whgdata\whnvp33.htm +whgdata\whnvt30.htm +whgdata\whnvt31.htm +whgdata\whnvt32.htm +whgdata\whnvt33.htm +whgdata\whnvf30.htm +whgdata\whnvf31.htm +whgdata\whnvf32.htm +whgdata\whnvf33.htm +whgdata\whnvl31.htm +whgdata\whnvl32.htm +whgdata\whnvl33.htm +whgdata\whexpbar.gif +cshdat_webhelp.htm +whcsh_home.htm +whcshdata.htm +cshdat_robohelp.htm +wht_tab0.gif +wht_tab1.gif +wht_tab2.gif +wht_tab3.gif +wht_tab4.gif +wht_tab5.gif +wht_tab6.gif +wht_tab7.gif +wht_tab8.gif +wht_glo_h.gif +wht_glo_n.gif +wht_fts_h.gif +wht_fts_n.gif +wht_idx_h.gif +wht_idx_n.gif +wht_toc_h.gif +wht_toc_n.gif +wht_ws.gif +wht_ws_g.gif +wht_logo1.gif +wht_logo2.gif +wht_abgw.jpg +wht_abgi.jpg +wht_abge.jpg +wht_abtw.jpg +wht_abte.jpg +wht_abti.jpg +wht_spac.gif +wht_next.gif +wht_next_g.gif +wht_prev.gif +wht_prev_g.gif +wht_sync.gif +wht_hide.gif +wht_go.gif +whstart.ico +whestart.ico +whrstart.ico +whidhtml.htm +whfdhtml.htm +whskin_banner.htm +whtbar.js +whskin_pdhtml.htm +whskin_papplet.htm +whskin_plist.htm +whskin_tbars.htm +whskin_mbars.htm +wht_toc4.gif +wht_toc1.gif +wht_toc2.gif +wht_toc3.gif +whskin_frmset010.htm +whst_topics.xml +whskin_frmset01.htm +geom_hha.hhk +geom.hhc +geom.hhk +add_point_on_edge.htm +arc.htm +archimede.htm +basic_geometrical_objects.htm +basic_operations.htm +blocks.htm +blocks_operations.htm +boolean_operations.htm +box.htm +building_by_blocks.htm +chamfer.htm +changing_display_parameters.htm +changing_displaying_parameters.htm +check_free_boundaries.htm +check_free_faces.htm +circle.htm +close_contour.htm +common.htm +complex_objects.htm +compound.htm +cone.htm +curve.htm +cut.htm +cylinder.htm +edge.htm +ellipse.htm +explode.htm +explode_on_blocks.htm +extrusion.htm +face.htm +files\introduction_to_geom.htm +files\salome2_sp3_basicgui_functions.htm +files\salome2_sp3_booleangui_functions.htm +files\salome2_sp3_buildgui_functions.htm +files\salome2_sp3_displaygui_functions.htm +files\salome2_sp3_generationgui_functions.htm +files\salome2_sp3_geomtoolsgui_functions.htm +files\salome2_sp3_measuregui_functions.htm +files\salome2_sp3_operationgui_functions.htm +files\salome2_sp3_primitivegui_functions.htm +files\salome2_sp3_repairgui_functions.htm +files\salome2_sp3_transformationgui_functions.htm +fillet.htm +filling.htm +fuse.htm +geometrical_objects.htm +glue_faces.htm +groups.htm +line.htm +local_coordinate_system.htm +measurement_tools.htm +mirror_image.htm +modify_the_location.htm +multi_rotation.htm +multi_transformation.htm +multi_translation.htm +newentity_blocks.htm +offset_surface.htm +partition.htm +pipe_creation.htm +plane.htm +point.htm +primitives.htm +propagate.htm +repairing_operations.htm +revolution.htm +rotation.htm +scale_transform.htm +section.htm +sewing.htm +shape_processing.htm +shell.htm +sketcher.htm +sketcher_tui.htm +solid.htm +sphere.htm +suppress_faces.htm +suppress_holes.htm +suppress_internal_wires.htm +transformation_operations.htm +translation.htm +turus.htm +vector.htm +wire.htm +working_plane.htm +working_with_groups.htm +ehelp.xml +geom.glo +default.css +pics\chamfer_all.png +pics\edgesn.png +pics\boxes.png +pics\mtrans1.png +pics\transformation3.png +pics\mtransf2.png +pics\export.png +image15.jpg +image204.jpg +image56.gif +image149.jpg +image127.jpg +image23.gif +image12.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image73.gif +files\salome2_sp3_displaygui_functions_salome2_sp3_displaygui_functions_image55.gif +files\salome2_sp3_booleangui_functions_salome2_sp3_booleangui_functions_image4.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image17.gif +pics\archimedesn1.png +pics\neo-basicprop.png +pics\mtrans2.png +pics\transformation4.png +pics\mtransf3.png +pics\plane1.png +image16.jpg +image57.gif +image35.gif +image128.jpg +image24.gif +image27.jpg +image13.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image74.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image18.gif +pics\suppress_faces1.png +pics\mirror_axissn1.png +pics\archimedesn2.png +pics\revolutionsn.png +pics\ellipsesn.png +pics\transformation10.png +pics\transformation5.png +pics\mtransf4.png +pics\plane2.png +image206.jpg +image25.gif +image129.jpg +image14.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image75.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image30.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image19.gif +pics\suppress_faces2.png +pics\multi_translation1dsn.png +pics\mirror_axissn2.png +pics\multi_transformationsn2d.png +pics\archimedesn3.png +pics\wiresn.png +pics\transformation11.png +pics\transformation6.png +pics\block1.png +pics\creategroup.png +pics\pipe.png +pics\torus1.png +pics\plane3.png +image59.gif +image37.gif +image15.gif +image18.jpg +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image130.gif +files\salome2_sp3_operationgui_functions_salome2_sp3_operationgui_functions_image87.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image76.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image31.gif +pics\multi_transformationsn1d.png +pics\fillingsn.png +pics\spheres.png +pics\polyline.png +pics\neo-obj1.png +pics\repair1.png +pics\transformation7.png +pics\block2.png +pics\torus2.png +image27.gif +image191.jpg +image180.jpg +image49.gif +image109.jpg +image16.gif +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image131.gif +files\salome2_sp3_repairgui_functions_salome2_sp3_repairgui_functions_image119.gif +files\salome2_sp3_operationgui_functions_salome2_sp3_operationgui_functions_image88.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image77.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image32.gif +pics\glue_faces1.png +pics\supp_int_wires1.png +pics\fusesn1.png +pics\transparencysn.png +pics\arcsn.png +pics\points.png +pics\neo-obj2.png +pics\neo-localcs1.png +pics\measures10.png +pics\repair2.png +pics\transformation8.png +pics\block3.png +image181.jpg +image170.jpg +image80.jpg +image17.gif +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image132.gif +files\salome2_sp3_operationgui_functions_salome2_sp3_operationgui_functions_image89.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image78.gif +image3.jpg +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image33.gif +pics\glue_faces2.png +pics\supp_int_wires2.png +pics\sectionsn.png +pics\fusesn2.png +pics\toruses.png +pics\circles.png +pics\neo-materials.png +pics\neo-obj3.png +pics\neo-localcs2.png +pics\neo-isos.png +pics\measures1.png +pics\repair3.png +pics\transformation9.png +pics\bool1.png +pics\partition1.png +pics\block4.png +pics\sphere1.png +image193.jpg +image29.gif +image171.jpg +image160.jpg +image81.jpg +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image133.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image34.gif +pics\chamfer_faces.png +pics\fillet_prism.png +pics\rotationsn1.png +pics\disp_mode1sn.png +pics\pipesn.png +pics\pipe_wire_edgesn.png +pics\cones.png +pics\planes1.png +pics\lines.png +pics\neo-obj4.png +pics\neo-localcs3.png +pics\repair4.png +pics\bool2.png +pics\partition2.png +pics\block5.png +pics\sphere2.png +pics\point1.png +pics\import.png +image172.jpg +image150.jpg +image82.jpg +image19.gif +image5.jpg +pics\rotationsn2.png +pics\disp_mode2sn.png +pics\neo-detect2.png +pics\neo-section.png +pics\neo-obj5.png +pics\measures3.png +pics\repair5.png +pics\bool3.png +pics\chamfer1.png +pics\filling.png +pics\revolution.png +pics\arc.png +pics\ellipse.png +pics\circle1.png +image3.gif +image151.jpg +image94.jpg +image83.jpg +files\salome2_sp3_generationgui_functions_salome2_sp3_generationgui_functions_image56.gif +pics\free_boudaries1.png +pics\multi_rotation1d1.png +pics\multi_translation2dsn.png +pics\offsetsn.png +pics\isos_u12_v12sn.png +pics\compoundsn.png +pics\prisms_basessn.png +pics\cylinders.png +pics\vectors.png +pics\neo-obj6.png +pics\measures4.png +pics\repair6.png +pics\chamfer2.png +pics\cone1.png +pics\circle2.png +pics\point3.png +image185.jpg +image163.jpg +image130.jpg +image95.jpg +image84.jpg +image4.gif +files\salome2_sp3_generationgui_functions_salome2_sp3_generationgui_functions_image57.gif +pics\free_boudaries2.png +pics\multi_rotation2d1.png +pics\multi_rotation1d2.png +pics\mirror_pointsn1.png +pics\new-tolerance.png +pics\neo-obj7.png +pics\neo-point2.png +pics\measures5.png +pics\repair7.png +pics\chamfer3.png +pics\cone2.png +image197.jpg +image164.jpg +image96.jpg +image85.jpg +image52.jpg +image8.jpg +files\salome2_sp3_generationgui_functions_salome2_sp3_generationgui_functions_image58.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image27.gif +pics\chamfer_edge.png +pics\fillet_edge.png +pics\multi_rotation2d2.png +pics\scale_transformsn1.png +pics\mirror_pointsn2.png +pics\cutsn.png +pics\shellsn.png +pics\filling_compoundsn.png +pics\prismssn.png +pics\neo-mrot1.png +pics\repair8.png +pics\cylinder1.png +pics\vector1.png +image61.gif +image154.jpg +image121.jpg +image110.jpg +image97.jpg +image53.jpg +image9.jpg +image6.gif +files\salome2_sp3_generationgui_functions_salome2_sp3_generationgui_functions_image59.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image28.gif +pics\scale_transformsn2.png +pics\translationsn1.png +pics\facesn1.png +pics\neo-mrot2.png +pics\repair9.png +pics\cylinder2.png +pics\vector2.png +image188.jpg +image51.gif +image133.jpg +image122.jpg +image98.jpg +image76.jpg +image54.jpg +image7.gif +image10.jpg +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image128.gif +files\salome2_sp3_repairgui_functions_salome2_sp3_repairgui_functions_image121.gif +files\salome2_sp3_operationgui_functions_salome2_sp3_operationgui_functions_image90.gif +files\salome2_sp3_basicgui_functions_salome2_sp3_basicgui_functions_image29.gif +i_blue.jpg +pics\free_faces1.png +pics\fillet_all.png +pics\translationsn2.png +pics\partitionsn1.png +pics\colorsn.png +pics\facesn2.png +pics\interpol.png +pics\measures8.png +pics\fillet1.png +pics\archimede.png +pics\workplane4.png +image189.jpg +image52.gif +image167.jpg +image156.jpg +image41.gif +image145.jpg +image112.jpg +files\salome2_sp3_displaygui_functions_salome2_sp3_displaygui_functions_image51.gif +image8.gif +image11.jpg +files\salome2_sp3_transformationgui_functions_salome2_sp3_transformationgui_functions_image129.gif +files\salome2_sp3_repairgui_functions_salome2_sp3_repairgui_functions_image122.gif +files\salome2_sp3_primitivegui_functions_salome2_sp3_primitivegui_functions_image100.gif +files\salome2_sp3_primitivegui_functions_salome2_sp3_primitivegui_functions_image99.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image13.gif +pics\free_faces2.png +pics\mirror_planesn1.png +pics\block_explodesn.png +pics\partitionsn2.png +pics\solidsn.png +pics\facesn3.png +pics\distance.png +pics\neo-scetcher1.png +pics\neo-transparency.png +pics\measures9.png +pics\fillet2.png +pics\workplane5.png +image201.jpg +image53.gif +image168.jpg +image42.gif +image124.jpg +image113.jpg +image78.jpg +image20.gif +image67.jpg +image9.gif +image12.jpg +files\salome2_sp3_primitivegui_functions_salome2_sp3_primitivegui_functions_image101.gif +files\salome2_sp3_displaygui_functions_salome2_sp3_displaygui_functions_image52.gif +files\salome2_sp3_booleangui_functions_salome2_sp3_booleangui_functions_image1.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image14.gif +pics\mirror_planesn2.png +pics\neo-scetcher2.png +pics\transformation1.png +pics\fillet3.png +pics\box1.png +pics\workplane6.png +pics\curve.png +pics\line.png +image10.gif +image202.jpg +image147.jpg +image32.gif +image79.jpg +image21.gif +files\salome2_sp3_primitivegui_functions_salome2_sp3_primitivegui_functions_image102.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image71.gif +files\salome2_sp3_displaygui_functions_salome2_sp3_displaygui_functions_image53.gif +files\salome2_sp3_booleangui_functions_salome2_sp3_booleangui_functions_image2.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image15.gif +pics\multi_translation_initialsn.png +pics\plane_on_face.png +pics\bezier.png +pics\repair10.png +pics\transformation2.png +pics\mtransf1.png +pics\editgroup.png +pics\extrusion.png +pics\box2.png +image44.gif +image22.gif +image11.gif +files\salome2_sp3_primitivegui_functions_salome2_sp3_primitivegui_functions_image103.gif +files\salome2_sp3_measuregui_functions_salome2_sp3_measuregui_functions_image72.gif +files\salome2_sp3_displaygui_functions_salome2_sp3_displaygui_functions_image54.gif +files\salome2_sp3_booleangui_functions_salome2_sp3_booleangui_functions_image3.gif +salome2_sp3_buildgui_functions_salome2_sp3_buildgui_functions_image16.gif +ehlpdhtm.js +geom.ppf +default_ns.css +whxdata\whtdata0.xml +whxdata\whftdata0.xml +whxdata\whfwdata0.xml +whxdata\whgdata0.xml +whdata\whtdata0.htm +whdata\whftdata0.htm +whdata\whfwdata0.htm +whdata\whgdata0.htm +whgdata\whlstt0.htm +whgdata\whlstt1.htm +whgdata\whlstt2.htm +whgdata\whlstt3.htm +whgdata\whlstt4.htm +whgdata\whlstt5.htm +whgdata\whlstt6.htm +whgdata\whlstt7.htm +whgdata\whlstt8.htm +whgdata\whlstt9.htm +whgdata\whlstt10.htm +whgdata\whlstt11.htm +whgdata\whlstt12.htm +whgdata\whlstt13.htm +whgdata\whlstt14.htm +whgdata\whlstt15.htm +whgdata\whlstt16.htm +whgdata\whlsti0.htm +whgdata\whlstfl0.htm +whgdata\whlstfl1.htm +whgdata\whlstfl2.htm +whgdata\whlstfl3.htm +whgdata\whlstfl4.htm +whgdata\whlstfl5.htm +whgdata\whlstfl6.htm +whgdata\whlstfl7.htm +whgdata\whlstfl8.htm +whgdata\whlstfl9.htm +whgdata\whlstfl10.htm +whgdata\whlstfl11.htm +whgdata\whlstfl12.htm +whgdata\whlstfl13.htm +whgdata\whlstfl14.htm +whgdata\whlstfl15.htm +whgdata\whlstfl16.htm +whgdata\whlstfl17.htm +whgdata\whlstfl18.htm +whgdata\whlstfl19.htm +whgdata\whlstfl20.htm +whgdata\whlstfl21.htm +whgdata\whlstfl22.htm +whgdata\whlstfl23.htm +whgdata\whlstfl24.htm +whgdata\whlstfl25.htm +whgdata\whlstf0.htm +whgdata\whlstf1.htm +whgdata\whlstf2.htm +whgdata\whlstf3.htm +whgdata\whlstf4.htm +whgdata\whlstf5.htm +whgdata\whlstf6.htm +whgdata\whlstf7.htm +whgdata\whlstf8.htm +whgdata\whlstf9.htm +whgdata\whlstf10.htm +whgdata\whlstf11.htm +whgdata\whlstf12.htm +whgdata\whlstf13.htm +whgdata\whlstf14.htm +whgdata\whlstg0.htm +geom.htm +geom_csh.htm +geom_rhc.htm diff --git a/doc/salome/gui/GEOM/geometrical_objects.htm b/doc/salome/gui/GEOM/geometrical_objects.htm new file mode 100755 index 000000000..7008952e1 --- /dev/null +++ b/doc/salome/gui/GEOM/geometrical_objects.htm @@ -0,0 +1,571 @@ + + + + + +Geometrical Objects + + + + + + + + + + + +

    Advanced Geometrical Objects

    + +

    Creation of an Edge

    + +

    import geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create vertices

    + +

    p0   = + geompy.MakeVertex(0.  , + 0.  , 0. +  )

    + +

    pxyz = geompy.MakeVertex(100., + 100., 100.)

    + +

     

    + +

    # create edge

    + +

    edge = geompy.MakeEdge(p0, + pxyz)

    + +

     

    + +

    # add object in study

    + +

    id_edge = geompy.addToStudy(edge,"Edge")

    + +

     

    + +

    # display edge

    + +

    gg.createAndDisplayGO(id_edge) +

    + +

     

    + +

    Creation of a Wire

    + +

    import + geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create vertices

    + +

    px   = + geompy.MakeVertex(100., 0.  , + 0.  )

    + +

    py   = + geompy.MakeVertex(0.  , + 100., 0.  )

    + +

    pz   = + geompy.MakeVertex(0.  , + 0.  , 100.)

    + +

     

    + +

    # create vector on two + points

    + +

    vxy = geompy.MakeVector(px, + py)

    + +

     

    + +

    # create arc with three + points

    + +

    arc = geompy.MakeArc(py, + pz, px)

    + +

     

    + +

    # create wire

    + +

    wire = geompy.MakeWire([vxy, + arc])

    + +

     

    + +

    # add object in study

    + +

    id_wire = geompy.addToStudy(wire,"Wire")

    + +

     

    + +

    # display wire

    + +

    gg.createAndDisplayGO(id_wire) +

    + +

     

    + +

     

    + +

    Creation of a Face

    + +

    import + geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create vertices

    + +

    p0   = + geompy.MakeVertex(0.  , + 0.  , 0. +  )

    + +

    px   = + geompy.MakeVertex(100., 0.  , + 0.  )

    + +

    py   = + geompy.MakeVertex(0.  , + 100., 0.  )

    + +

    pz   = + geompy.MakeVertex(0.  , + 0.  , 100.)

    + +

    pxyz = geompy.MakeVertex(100., + 100., 100.)

    + +

     

    + +

    # create vector on two + points

    + +

    vxy = geompy.MakeVector(px, + py)

    + +

     

    + +

    # create arc with three + points

    + +

    arc = geompy.MakeArc(py, + pz, px)

    + +

     

    + +

    # create wire

    + +

    wire = geompy.MakeWire([vxy, + arc])

    + +

     

    + +

    # create sketchers

    + +

    sketcher1 = geompy.MakeSketcher("Sketcher:F + -100 -100:TT 250 -100:R 0:C 100 150:R 0:L 300:WW",

    + +

                                    [100,0,0, + 1,1,1, -1,1,0])

    + +

    sketcher2 = geompy.MakeSketcher("Sketcher:F + 0 0:TT 70 0:TT 70 70:TT 0 70:WW")

    + +

    sketcher3 = geompy.MakeSketcher("Sketcher:F + 20 20:TT 50 20:TT 50 50:TT 20 50:WW")

    + +

    isPlanarFace = 1

    + +

     

    + +

    # create face from wire

    + +

    face1 = geompy.MakeFace(wire, + isPlanarFace)

    + +

     

    + +

    # create faces from two + wires

    + +

    face2 = geompy.MakeFaceWires([wire, + sketcher1],isPlanarFace)

    + +

    face3 = geompy.MakeFaces([sketcher2, + sketcher3],isPlanarFace)

    + +

     

    + +

    # add objects in study

    + +

    id_face1 = geompy.addToStudy(face1,"Face1")

    + +

    id_face2 = geompy.addToStudy(face2,"Face2")

    + +

    id_face3 = geompy.addToStudy(face3,"Face3")

    + +

     

    + +

    # display faces

    + +

    gg.createAndDisplayGO(id_face1)

    + +

    gg.setDisplayMode(id_face1,1)

    + +

    gg.setTransparency(id_face1,0.2)

    + +

    gg.createAndDisplayGO(id_face2)

    + +

    gg.setDisplayMode(id_face2,1)

    + +

    gg.setTransparency(id_face2,0.2)

    + +

    gg.createAndDisplayGO(id_face3)

    + +

    gg.setDisplayMode(id_face3,1)

    + +

    gg.setTransparency(id_face3,0.2) +

    + +

     

    + +

    Creation of a Shell

    + +

    import + geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    #create vertices

    + +

    p0   = + geompy.MakeVertex( 0.,  0., +  0.)

    + +

    pxyz = geompy.MakeVertex( + 5.,  5., + 40.)

    + +

     

    + +

    # create sketchers

    + +

    sketcher1 = geompy.MakeSketcher("Sketcher:F + 0 0:TT 70 0:TT 70 70:TT 0 70:WW")

    + +

    sketcher2 = geompy.MakeSketcher("Sketcher:F + 20 20:TT 50 20:TT 50 50:TT 20 50:WW")

    + +

    isPlanarFace = 1

    + +

     

    + +

    # create face from two + wires

    + +

    face = geompy.MakeFaces([sketcher1, + sketcher2],isPlanarFace)

    + +

     

    + +

    # create prism

    + +

    prism = geompy.MakePrism(face, + p0, pxyz)

    + +

     

    + +

    # explode prism on faces

    + +

    prism_faces = geompy.SubShapeAllSorted(prism, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # create shell from the + set of faces

    + +

    shell = geompy.MakeShell([prism_faces[0], + prism_faces[2], prism_faces[3],

    + +

                              prism_faces[7], + prism_faces[9]])

    + +

     

    + +

    # add objects in study

    + +

    id_shell = geompy.addToStudy(shell,"Shell")

    + +

     

    + +

    # display shell

    + +

    gg.createAndDisplayGO(id_shell)

    + +

    gg.setDisplayMode(id_shell,1) +

    + +

     

    + +

    Creation of a Solid

    + +

    import + geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    #create vertices

    + +

    p0 = geompy.MakeVertex( + 0.,  0., +  0.)

    + +

    pz = geompy.MakeVertex( + 0.,  0., + 40.)

    + +

     

    + +

    # create sketchers

    + +

    sketcher = geompy.MakeSketcher("Sketcher:F + -50 -50:TT 100 -50:R 0:C 50 70:R 0:L 100:WW")

    + +

     

    + +

    # create faces from two + wires

    + +

    face = geompy.MakeFace(sketcher,1)

    + +

     

    + +

    # create prism

    + +

    prism = geompy.MakePrism(face, + p0, pz)

    + +

     

    + +

    # explode prism on faces

    + +

    prism_faces = geompy.SubShapeAllSorted(prism, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # create shell from the + set of faces

    + +

    shell = geompy.MakeShell([prism_faces[0], + prism_faces[1],

    + +

                              prism_faces[3], + prism_faces[4],

    + +

                              prism_faces[5], + prism_faces[2]])

    + +

     

    + +

    # create solid, bounded + by the given shells

    + +

    solid = geompy.MakeSolid([shell])

    + +

     

    + +

    # add objects in study

    + +

    id_solid = geompy.addToStudy(solid,"Solid")

    + +

     

    + +

    # display solid

    + +

    gg.createAndDisplayGO(id_solid)

    + +

    gg.setDisplayMode(id_solid,1) +

    + +

     

    + +

    Creation of a Compound

    + +

    import geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    #create vertices

    + +

    p0 = geompy.MakeVertex( + 0.,  0., +  0.)

    + +

    pz = geompy.MakeVertex( + 0.,  0., + 40.)

    + +

     

    + +

    # create sketchers

    + +

    sketcher = geompy.MakeSketcher("Sketcher:F + -50 -50:TT 100 -50:R 0:C 50 70:R 0:L 100:WW")

    + +

     

    + +

    # create faces from two + wires

    + +

    face = geompy.MakeFace(sketcher,1)

    + +

     

    + +

    # create prism

    + +

    prism = geompy.MakePrism(face, + p0, pz)

    + +

     

    + +

    # explode prism on faces

    + +

    prism_faces = geompy.SubShapeAllSorted(prism, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # create shell from the + set of faces

    + +

    shell = geompy.MakeShell([prism_faces[0], + prism_faces[1],

    + +

                              prism_faces[3], + prism_faces[4],

    + +

                              prism_faces[5], + prism_faces[2]])

    + +

     

    + +

    # create solid, bounded + by the given shells

    + +

    solid = geompy.MakeSolid([shell])

    + +

     

    + +

    # add objects in study

    + +

    id_solid = geompy.addToStudy(solid,"Solid")

    + +

     

    + +

    # display solid

    + +

    gg.createAndDisplayGO(id_solid)

    + +

    gg.setDisplayMode(id_solid,1) +

    + + + + diff --git a/doc/salome/gui/GEOM/geompy_doc/GEOM__TestMeasures_8py.html b/doc/salome/gui/GEOM/geompy_doc/GEOM__TestMeasures_8py.html new file mode 100644 index 000000000..06a37f66a --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/GEOM__TestMeasures_8py.html @@ -0,0 +1,29 @@ + + + + + + Main Page + + + +  +
    + +
    + + + + + +

    GEOM_TestMeasures.py File Reference

    + + + + +

    Namespaces

    namespace  GEOM_TestMeasures
    +
    Generated on Tue Oct 18 00:47:36 2005 for SALOME - GEOM - v.2.1.0 by + +doxygen 1.3.7
    + + diff --git a/doc/salome/gui/GEOM/geompy_doc/doxygen.css b/doc/salome/gui/GEOM/geompy_doc/doxygen.css new file mode 100644 index 000000000..dc9da5220 --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/doxygen.css @@ -0,0 +1,218 @@ +H1 { + text-align: center; + font-family: Geneva, Arial, Helvetica, sans-serif; +} +H2 { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #eeeeff; + border: 1px solid #B0B0B0; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 120%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; + padding: 2px; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D + padding: 2px; +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; + padding: 2px; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + padding: 2px 6px; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; + padding: 2px 6px; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code { text-decoration: none; font-weight: normal; color: #1A419D} +A.codeRef { font-weight: normal; color: #1A419D} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 6px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +TD.md { background-color: #F4F4FB; font-weight: bold; } +TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } +TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; + font-family: Geneva, Arial, Helvetica, sans-serif; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #eeeeff; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #eeeeff; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdTable { + border: 1px solid #868686; + background-color: #F4F4FB; +} +.mdRow { + padding: 8px 10px; +} +.mdescLeft { + font-size: smaller; + font-style: italic; + background-color: #FAFAFA; + padding-left: 8px; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + font-size: smaller; + font-style: italic; + background-color: #FAFAFA; + padding-left: 4px; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; + padding-bottom: 0px; + padding-right: 8px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-style: solid; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-family: Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; +} +.memItemRight { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-style: solid; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-family: Geneva, Arial, Helvetica, sans-serif; + font-size: 13px; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #eeeeff; +} +TD.tiny { font-size: 75%; +} +a { + color: #252E78; +} +a:visited { + color: #3D2185; +} diff --git a/doc/salome/gui/GEOM/geompy_doc/doxygen.png b/doc/salome/gui/GEOM/geompy_doc/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..9da55f95f5e73ec180fc0087b782a317a4fba360 GIT binary patch literal 1576 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.map b/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.map new file mode 100644 index 000000000..5a14779e7 --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.map @@ -0,0 +1 @@ +base referer diff --git a/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.md5 b/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.md5 new file mode 100644 index 000000000..1f2d2ba0e --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/geompy_8py__incl.md5 @@ -0,0 +1 @@ +0848e1ec9d428b6f7446355ed9f585a7 \ No newline at end of file diff --git a/doc/salome/gui/GEOM/geompy_doc/namespaceGEOM__TestMeasures.html b/doc/salome/gui/GEOM/geompy_doc/namespaceGEOM__TestMeasures.html new file mode 100644 index 000000000..24ab2972a --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/namespaceGEOM__TestMeasures.html @@ -0,0 +1,70 @@ + + + + + + Main Page + + + +  +
    + +
    + + + + + +

    Package GEOM_TestMeasures

    Module "GEOM_TestMeasures". +More... +

    + + + + + +

    Functions

     TestMeasureOperations (geompy, math)
    +


    Function Documentation

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    TestMeasureOperations geompy ,
    math 
    +
    + + + + + +
    +   + + +

    +

    +


    Generated on Tue Oct 18 00:47:37 2005 for SALOME - GEOM - v.2.1.0 by + +doxygen 1.3.7
    + + diff --git a/doc/salome/gui/GEOM/geompy_doc/namespacegeompy.html b/doc/salome/gui/GEOM/geompy_doc/namespacegeompy.html new file mode 100644 index 000000000..189eb4505 --- /dev/null +++ b/doc/salome/gui/GEOM/geompy_doc/namespacegeompy.html @@ -0,0 +1,8409 @@ + + + + + + Main Page + + + +  +
    + +
    + + + + + +

    Package geompy

    Module geompy. +More... +

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

    Functions

     init_geom (theStudy)
     SubShapeName (aSubObj, aMainObj)
     Get name for sub-shape aSubObj of shape aMainObj.

     addToStudy (aShape, aName)
     Publish in study aShape with name aName.

     addToStudyInFather (aFather, aShape, aName)
     Publish in study aShape with name aName as sub-object of previously published aFather.

     MakeVertex (theX, theY, theZ)
     Create point by three coordinates.

     MakeVertexWithRef (theReference, theX, theY, theZ)
     Create a point, distant from the referenced point on the given distances along the coordinate axes.

     MakeVertexOnCurve (theRefCurve, theParameter)
     Create a point, corresponding to the given parameter on the given curve.

     MakeVectorDXDYDZ (theDX, theDY, theDZ)
     Create a vector with the given components.

     MakeVector (thePnt1, thePnt2)
     Create a vector between two points.

     MakeLine (thePnt, theDir)
     Create a line, passing through the given point and parrallel to the given direction.

     MakeLineTwoPnt (thePnt1, thePnt2)
     Create a line, passing through the given points.

     MakePlane (thePnt, theVec, theTrimSize)
     Create a plane, passing through the given point and normal to the given vector.

     MakePlaneThreePnt (thePnt1, thePnt2, thePnt3, theTrimSize)
     Create a plane, passing through the three given points.

     MakePlaneFace (theFace, theTrimSize)
     Create a plane, similar to the existing one, but with another size of representing face.

     MakeMarker (OX, OY, OZ, XDX, XDY, XDZ, YDX, YDY, YDZ)
     Create a local coordinate system.

     MakeMarkerPntTwoVec (theOrigin, theXVec, theYVec)
     Create a local coordinate system.

     MakeArc (thePnt1, thePnt2, thePnt3)
     Create an arc of circle, passing through three given points.

     MakeCircle (thePnt, theVec, theR)
     Create a circle with given center, normal vector and radius.

     MakeCircleThreePnt (thePnt1, thePnt2, thePnt3)
     Create a circle, passing through three given points.

     MakeEllipse (thePnt, theVec, theRMajor, theRMinor)
     Create an ellipse with given center, normal vector and radiuses.

     MakePolyline (thePoints)
     Create a polyline on the set of points.

     MakeBezier (thePoints)
     Create bezier curve on the set of points.

     MakeInterpol (thePoints)
     Create B-Spline curve on the set of points.

     MakeSketcher (theCommand, theWorkingPlane=[0, 0, 0, 0, 0, 1, 1, 0, 0])
     Create a sketcher (wire or face), following the textual description, passed through theCommand argument.

     MakeSketcherOnPlane (theCommand, theWorkingPlane)
     Create a sketcher (wire or face), following the textual description, passed through theCommand argument.

     MakeBox (x1, y1, z1, x2, y2, z2)
     Create a box by coordinates of two opposite vertices.

     MakeBoxDXDYDZ (theDX, theDY, theDZ)
     Create a box with specified dimensions along the coordinate axes and with edges, parallel to the coordinate axes.

     MakeBoxTwoPnt (thePnt1, thePnt2)
     Create a box with two specified opposite vertices, and with edges, parallel to the coordinate axes.

     MakeCylinder (thePnt, theAxis, theR, theH)
     Create a cylinder with given base point, axis, radius and height.

     MakeCylinderRH (theR, theH)
     Create a cylinder with given radius and height at the origin of coordinate system.

     MakeSpherePntR (thePnt, theR)
     Create a sphere with given center and radius.

     MakeSphere (x, y, z, theR)
     Create a sphere with given center and radius.

     MakeSphereR (theR)
     Create a sphere with given radius at the origin of coordinate system.

     MakeCone (thePnt, theAxis, theR1, theR2, theH)
     Create a cone with given base point, axis, height and radiuses.

     MakeConeR1R2H (theR1, theR2, theH)
     Create a cone with given height and radiuses at the origin of coordinate system.

     MakeTorus (thePnt, theVec, theRMajor, theRMinor)
     Create a torus with given center, normal vector and radiuses.

     MakeTorusRR (theRMajor, theRMinor)
     Create a torus with given radiuses at the origin of coordinate system.

     MakePrism (theBase, thePoint1, thePoint2)
     Create a shape by extrusion of the base shape along a vector, defined by two points.

     MakePrismVecH (theBase, theVec, theH)
     Create a shape by extrusion of the base shape along the vector, i.e.

     MakePipe (theBase, thePath)
     Create a shape by extrusion of the base shape along the path shape.

     MakeRevolution (theBase, theAxis, theAngle)
     Create a shape by revolution of the base shape around the axis on the given angle, i.e.

     MakeEdge (thePnt1, thePnt2)
     Create a linear edge with specified ends.

     MakeWire (theEdgesAndWires)
     Create a wire from the set of edges and wires.

     MakeFace (theWire, isPlanarWanted)
     Create a face on the given wire.

     MakeFaceWires (theWires, isPlanarWanted)
     Create a face on the given wires set.

     MakeFaces (theWires, isPlanarWanted)
     Shortcut to MakeFaceWires().

     MakeShell (theFacesAndShells)
     Create a shell from the set of faces and shells.

     MakeSolid (theShells)
     Create a solid, bounded by the given shells.

     MakeCompound (theShapes)
     Create a compound of the given shapes.

     NumberOfFaces (theShape)
     Gives quantity of faces in the given shape.

     NumberOfEdges (theShape)
     Gives quantity of edges in the given shape.

     ChangeOrientation (theShape)
     Reverses an orientation the given shape.

     OrientationChange (theShape)
     Shortcut to ChangeOrientation().

     GetFreeFacesIDs (theShape)
     Retrieve all free faces from the given shape.

     GetSharedShapes (theShape1, theShape2, theShapeType)
     Get all sub-shapes of theShape1 of the given type, shared with theShape2.

     GetShapesOnPlane (theShape, theShapeType, theAx1, theState)
     Find in theShape all sub-shapes of type theShapeType, situated relatively the specified plane by the certain way, defined through theState parameter.

     GetShapesOnPlaneIDs (theShape, theShapeType, theAx1, theState)
     Works like the above method, but returns list of sub-shapes indices.

     GetShapesOnCylinder (theShape, theShapeType, theAxis, theRadius, theState)
     Find in theShape all sub-shapes of type theShapeType, situated relatively the specified cylinder by the certain way, defined through theState parameter.

     GetShapesOnCylinderIDs (theShape, theShapeType, theAxis, theRadius, theState)
     Works like the above method, but returns list of sub-shapes indices.

     GetShapesOnSphere (theShape, theShapeType, theCenter, theRadius, theState)
     Find in theShape all sub-shapes of type theShapeType, situated relatively the specified sphere by the certain way, defined through theState parameter.

     GetShapesOnSphereIDs (theShape, theShapeType, theCenter, theRadius, theState)
     Works like the above method, but returns list of sub-shapes indices.

     GetShapesOnQuadrangle (theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState)
     Find in theShape all sub-shapes of type theShapeType, situated relatively the specified quadrangle by the certain way, defined through theState parameter.

     GetShapesOnQuadrangleIDs (theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState)
     Works like the above method, but returns list of sub-shapes indices.

     GetInPlace (theShapeWhere, theShapeWhat)
     Get sub-shape(s) of theShapeWhere, which are coincident with theShapeWhat or could be a part of it.

     GetSubShape (aShape, ListOfID)
     Obtain a composite sub-shape of <ashape>, composed from sub-shapes of <ashape>, selected by their unique IDs inside <ashape>.

     GetSubShapeID (aShape, aSubShape)
     Obtain unique ID of sub-shape <asubshape> inside <ashape>.

     SubShapeAll (aShape, aType)
     Explode a shape on subshapes of a given type.

     SubShapeAllIDs (aShape, aType)
     Explode a shape on subshapes of a given type.

     SubShapeAllSorted (aShape, aType)
     Explode a shape on subshapes of a given type.

     SubShapeAllSortedIDs (aShape, aType)
     Explode a shape on subshapes of a given type.

     SubShape (aShape, aType, ListOfInd)
     Obtain a compound of sub-shapes of <ashape>, selected by they indices in list of all sub-shapes of type <atype>.

     SubShapeSorted (aShape, aType, ListOfInd)
     Obtain a compound of sub-shapes of <ashape>, selected by they indices in sorted list of all sub-shapes of type <atype>.

     ProcessShape (theShape, theOperators, theParameters, theValues)
     Apply a sequence of Shape Healing operators to the given object.

     SuppressFaces (theObject, theFaces)
     Remove faces from the given object (shape).

     MakeSewing (ListShape, theTolerance)
     Sewing of some shapes into single shape.

     Sew (theObject, theTolerance)
     Sewing of the given object.

     SuppressInternalWires (theObject, theWires)
     Remove internal wires and edges from the given object (face).

     SuppressHoles (theObject, theWires)
     Remove internal closed contours (holes) from the given object.

     CloseContour (theObject, theWires, isCommonVertex)
     Close an open wire.

     DivideEdge (theObject, theEdgeIndex, theValue, isByParameter)
     Addition of a point to a given edge object.

     GetFreeBoundary (theObject)
     Get a list of wires (wrapped in GEOM_Object-s), that constitute a free boundary of the given shape.

     MakeCopy (theOriginal)
     Create a copy of the given object.

     MakeFilling (theShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter)
     Create a filling from the given compound of contours.

     MakeGlueFaces (theShape, theTolerance)
     Replace coincident faces in theShape by one face.

     MakeBoolean (theShape1, theShape2, theOperation)
     Perform one of boolean operations on two given shapes.

     MakeCommon (s1, s2)
     Shortcut to MakeBoolean(s1, s2, 1).

     MakeCut (s1, s2)
     Shortcut to MakeBoolean(s1, s2, 2).

     MakeFuse (s1, s2)
     Shortcut to MakeBoolean(s1, s2, 3).

     MakeSection (s1, s2)
     Shortcut to MakeBoolean(s1, s2, 4).

     MakePartition (ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[])
     Perform partition operation.

     Partition (ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[])
     Shortcut to MakePartition().

     MakeHalfPartition (theShape, thePlane)
     Perform partition of the Shape with the Plane.

     MakeTranslationTwoPoints (theObject, thePoint1, thePoint2)
     Translate the given object along the vector, specified by its end points, creating its copy before the translation.

     MakeTranslation (theObject, theDX, theDY, theDZ)
     Translate the given object along the vector, specified by its components, creating its copy before the translation.

     MakeTranslationVector (theObject, theVector)
     Translate the given object along the given vector, creating its copy before the translation.

     MakeRotation (theObject, theAxis, theAngle)
     Rotate the given object around the given axis on the given angle, creating its copy before the rotatation.

     MakeScaleTransform (theObject, thePoint, theFactor)
     Scale the given object by the factor, creating its copy before the scaling.

     MakeMirrorByPlane (theObject, thePlane)
     Create an object, symmetrical to the given one relatively the given plane.

     MakeMirrorByAxis (theObject, theAxis)
     Create an object, symmetrical to the given one relatively the given axis.

     MakeMirrorByPoint (theObject, thePoint)
     Create an object, symmetrical to the given one relatively the given point.

     MakePosition (theObject, theStartLCS, theEndLCS)
     Modify the Location of the given object by LCS creating its copy before the setting.

     MakeOffset (theObject, theOffset)
     Create new object as offset of the given one.

     MakeMultiTranslation1D (theObject, theVector, theStep, theNbTimes)
     Translate the given object along the given vector a given number times.

     MakeMultiTranslation2D (theObject, theVector1, theStep1, theNbTimes1, theVector2, theStep2, theNbTimes2)
     Conseqently apply two specified translations to theObject specified number of times.

     MultiRotate1D (theObject, theAxis, theNbTimes)
     Rotate the given object around the given axis a given number times.

     MultiRotate2D (theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2)
     Rotate the given object around the given axis on the given angle a given number times and multi-translate each rotation result.

     MakeMultiRotation1D (aShape, aDir, aPoint, aNbTimes)
     The same, as MultiRotate1D(), but axis is given by direction and point.

     MakeMultiRotation2D (aShape, aDir, aPoint, anAngle, nbtimes1, aStep, nbtimes2)
     The same, as MultiRotate2D(), but axis is given by direction and point.

     MakeFilletAll (theShape, theR)
     Perform a fillet on all edges of the given shape.

     MakeFillet (theShape, theR, theShapeType, theListShapes)
     Perform a fillet on the specified edges/faces of the given shape.

     MakeChamferAll (theShape, theD)
     Perform a symmetric chamfer on all edges of the given shape.

     MakeChamferEdge (theShape, theD1, theD2, theFace1, theFace2)
     Perform a chamfer on edges, common to the specified faces, with distance D1 on the Face1.

     MakeChamferFaces (theShape, theD1, theD2, theFaces)
     Perform a chamfer on all edges of the specified faces, with distance D1 on the first specified face (if several for one edge).

     MakeChamfer (aShape, d1, d2, aShapeType, ListShape)
     Shortcut to MakeChamferEdge() and MakeChamferFaces().

     Archimede (theShape, theWeight, theWaterDensity, theMeshDeflection)
     Perform an Archimde operation on the given shape with given parameters.

     PointCoordinates (Point)
     Get point coordinates.

     BasicProperties (theShape)
     Get summarized length of all wires, area of surface and volume of the given shape.

     BoundingBox (theShape)
     Get parameters of bounding box of the given shape.

     Inertia (theShape)
     Get inertia matrix and moments of inertia of theShape.

     MinDistance (theShape1, theShape2)
     Get minimal distance between the given shapes.

     Tolerance (theShape)
     Get min and max tolerances of sub-shapes of theShape.

     WhatIs (theShape)
     Obtain description of the given shape (number of sub-shapes of each type).

     MakeCDG (theShape)
     Get a point, situated at the centre of mass of theShape.

     CheckShape (theShape)
     Check a topology of the given shape.

     Import (theFileName, theFormatName)
     Import a shape from the BREP or IGES or STEP file (depends on given format) with given name.

     ImportBREP (theFileName)
     Shortcut to Import() for BREP format.

     ImportIGES (theFileName)
     Shortcut to Import() for IGES format.

     ImportSTEP (theFileName)
     Shortcut to Import() for STEP format.

     Export (theObject, theFileName, theFormatName)
     Export the given shape into a file with given name.

     ExportBREP (theObject, theFileName)
     Shortcut to Export() for BREP format.

     ExportIGES (theObject, theFileName)
     Shortcut to Export() for IGES format.

     ExportSTEP (theObject, theFileName)
     Shortcut to Export() for STEP format.

     MakeQuad (E1, E2, E3, E4)
     Create a quadrangle face from four edges.

     MakeQuad2Edges (E1, E2)
     Create a quadrangle face on two edges.

     MakeQuad4Vertices (V1, V2, V3, V4)
     Create a quadrangle face with specified corners.

     MakeHexa (F1, F2, F3, F4, F5, F6)
     Create a hexahedral solid, bounded by the six given faces.

     MakeHexa2Faces (F1, F2)
     Create a hexahedral solid between two given faces.

     GetPoint (theShape, theX, theY, theZ, theEpsilon)
     Get a vertex, found in the given shape by its coordinates.

     GetEdge (theShape, thePoint1, thePoint2)
     Get an edge, found in the given shape by two given vertices.

     GetEdgeNearPoint (theShape, thePoint)
     Find an edge of the given shape, which has minimal distance to the given point.

     GetFaceByPoints (theShape, thePoint1, thePoint2, thePoint3, thePoint4)
     Returns a face, found in the given shape by four given corner vertices.

     GetFaceByEdges (theShape, theEdge1, theEdge2)
     Get a face of block, found in the given shape by two given edges.

     GetOppositeFace (theBlock, theFace)
     Find a face, opposite to the given one in the given block.

     GetFaceNearPoint (theShape, thePoint)
     Find a face of the given shape, which has minimal distance to the given point.

     GetFaceByNormale (theBlock, theVector)
     Find a face of block, whose outside normale has minimal angle with the given vector.

     CheckCompoundOfBlocks (theCompound)
     Check, if the compound of blocks is given.

     RemoveExtraEdges (theShape)
     Remove all seam and degenerated edges from theShape.

     CheckAndImprove (theShape)
     Check, if the given shape is a blocks compound.

     MakeBlockExplode (theCompound, theMinNbFaces, theMaxNbFaces)
     Get all the blocks, contained in the given compound.

     GetBlockNearPoint (theCompound, thePoint)
     Find block, containing the given point inside its volume or on boundary.

     GetBlockByParts (theCompound, theParts)
     Find block, containing all the elements, passed as the parts, or maximum quantity of them.

     GetBlocksByParts (theCompound, theParts)
     Return all blocks, containing all the elements, passed as the parts.

     MakeMultiTransformation1D (Block, DirFace1, DirFace2, NbTimes)
     Multi-transformate block and glue the result.

     MakeMultiTransformation2D (Block, DirFace1U, DirFace2U, NbTimesU, DirFace1V, DirFace2V, NbTimesV)
     Multi-transformate block and glue the result.

     Propagate (theShape)
     Build all possible propagation groups.

     CreateGroup (theMainShape, theShapeType)
     Creates a new group which will store sub shapes of theMainShape.

     AddObject (theGroup, theSubShapeID)
     Adds a sub object with ID theSubShapeId to the group.

     RemoveObject (theGroup, theSubShapeID)
     Removes a sub object with ID theSubShapeId from the group.

     UnionList (theGroup, theSubShapes)
     Adds to the group all the given shapes.

     UnionIDs (theGroup, theSubShapes)
     Works like the above method, but argument theSubShapes here is a list of sub-shapes indices.

     DifferenceList (theGroup, theSubShapes)
     Removes from the group all the given shapes.

     DifferenceIDs (theGroup, theSubShapes)
     Works like the above method, but argument theSubShapes here is a list of sub-shapes indices.

     GetObjectIDs (theGroup)
     Returns a list of sub objects ID stored in the group.

     GetType (theGroup)
     Returns a type of sub objects stored in the group.

     GetMainShape (theGroup)
     Returns a main shape associated with the group.

     GetEdgesByLength (theShape, min_length, max_length, include_min=1, include_max=1)
     Create group of edges of theShape, whose length is in range [min_length, max_length].

     SelectEdges (min_length, max_length, include_min=1, include_max=1)
     Create group of edges of selected shape, whose length is in range [min_length, max_length].

     addPath (Path)
     Add Path to load python scripts from.

    +


    Function Documentation

    +

    + + + + +
    + + + + + + + + + +
    init_geom theStudy   ) 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SubShapeName aSubObj ,
    aMainObj 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    addToStudy aShape ,
    aName 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    addToStudyInFather aFather ,
    aShape ,
    aName 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeVertex theX ,
    theY ,
    theZ 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theX The X coordinate of the point.
    theY The Y coordinate of the point.
    theZ The Z coordinate of the point.
    +
    +
    Returns:
    New GEOM_Object, containing the created point.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeVertexWithRef theReference ,
    theX ,
    theY ,
    theZ 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theReference The referenced point.
    theX Displacement from the referenced point along OX axis.
    theY Displacement from the referenced point along OY axis.
    theZ Displacement from the referenced point along OZ axis.
    +
    +
    Returns:
    New GEOM_Object, containing the created point.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeVertexOnCurve theRefCurve ,
    theParameter 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theRefCurve The referenced curve.
    theParameter Value of parameter on the referenced curve.
    +
    +
    Returns:
    New GEOM_Object, containing the created point.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeVectorDXDYDZ theDX ,
    theDY ,
    theDZ 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theDX X component of the vector.
    theDY Y component of the vector.
    theDZ Z component of the vector.
    +
    +
    Returns:
    New GEOM_Object, containing the created vector.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeVector thePnt1 ,
    thePnt2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt1 Start point for the vector.
    thePnt2 End point for the vector.
    +
    +
    Returns:
    New GEOM_Object, containing the created vector.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeLine thePnt ,
    theDir 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt Point. The resulting line will pass through it.
    theDir Direction. The resulting line will be parallel to it.
    +
    +
    Returns:
    New GEOM_Object, containing the created line.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeLineTwoPnt thePnt1 ,
    thePnt2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt1 First of two points, defining the line.
    thePnt2 Second of two points, defining the line.
    +
    +
    Returns:
    New GEOM_Object, containing the created line.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePlane thePnt ,
    theVec ,
    theTrimSize 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    thePnt Point, the plane has to pass through.
    theVec Vector, defining the plane normal direction.
    theTrimSize Half size of a side of quadrangle face, representing the plane.
    +
    +
    Returns:
    New GEOM_Object, containing the created plane.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePlaneThreePnt thePnt1 ,
    thePnt2 ,
    thePnt3 ,
    theTrimSize 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    thePnt1 First of three points, defining the plane.
    thePnt2 Second of three points, defining the plane.
    thePnt3 Fird of three points, defining the plane.
    theTrimSize Half size of a side of quadrangle face, representing the plane.
    +
    +
    Returns:
    New GEOM_Object, containing the created plane.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakePlaneFace theFace ,
    theTrimSize 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theFace Referenced plane.
    theTrimSize New half size of a side of quadrangle face, representing the plane.
    +
    +
    Returns:
    New GEOM_Object, containing the created plane.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMarker OX ,
    OY ,
    OZ ,
    XDX ,
    XDY ,
    XDZ ,
    YDX ,
    YDY ,
    YDZ 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    OX,OY,OZ Three coordinates of coordinate system origin.
    XDX,XDY,XDZ Three components of OX direction
    YDX,YDY,YDZ Three components of OY direction
    +
    +
    Returns:
    New GEOM_Object, containing the created coordinate system.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMarkerPntTwoVec theOrigin ,
    theXVec ,
    theYVec 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theOrigin Point of coordinate system origin.
    theXVec Vector of X direction
    theYVec Vector of Y direction
    +
    +
    Returns:
    New GEOM_Object, containing the created coordinate system.
    +
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeArc thePnt1 ,
    thePnt2 ,
    thePnt3 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    thePnt1 Start point of the arc.
    thePnt2 Middle point of the arc.
    thePnt3 End point of the arc.
    +
    +
    Returns:
    New GEOM_Object, containing the created arc.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeCircle thePnt ,
    theVec ,
    theR 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    thePnt Circle center.
    theVec Vector, normal to the plane of the circle.
    theR Circle radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created circle.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeCircleThreePnt thePnt1 ,
    thePnt2 ,
    thePnt3 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    thePnt1,thePnt2,thePnt3 Points, defining the circle.
    +
    +
    Returns:
    New GEOM_Object, containing the created circle.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeEllipse thePnt ,
    theVec ,
    theRMajor ,
    theRMinor 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    thePnt Ellipse center.
    theVec Vector, normal to the plane of the ellipse.
    theRMajor Major ellipse radius.
    theRMinor Minor ellipse radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created ellipse.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakePolyline thePoints   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    thePoints Sequence of points for the polyline.
    +
    +
    Returns:
    New GEOM_Object, containing the created polyline.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeBezier thePoints   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    thePoints Sequence of points for the bezier curve.
    +
    +
    Returns:
    New GEOM_Object, containing the created bezier curve.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeInterpol thePoints   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    thePoints Sequence of points for the B-Spline curve.
    +
    +
    Returns:
    New GEOM_Object, containing the created B-Spline curve.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeSketcher theCommand ,
    theWorkingPlane  = [0,
    ,
    ,
    ,
    ,
    ,
    ,
    ,
    0] 
    +
    + + + + + +
    +   + + +

    +
    + Edges of the resulting wire or face will be arcs of circles and/or linear segments.
    + Format of the description string have to be the following:

    +"Sketcher[:F x1 y1]:CMD[:CMD[:CMD...]]"

    +Where:

      +
    • x1, y1 are coordinates of the first sketcher point (zero by default),
    • CMD is one of
        +
      • "R angle" : Set the direction by angle
      • "D dx dy" : Set the direction by DX & DY
      +
      +
        +
      • "TT x y" : Create segment by point at X & Y
      • "T dx dy" : Create segment by point with DX & DY
      • "L length" : Create segment by direction & Length
      • "IX x" : Create segment by direction & Intersect. X
      • "IY y" : Create segment by direction & Intersect. Y
      +
      +
        +
      • "C radius length" : Create arc by direction, radius and length(in degree)
      +
      +
        +
      • "WW" : Close Wire (to finish)
      • "WF" : Close Wire and build face (to finish)
      +
    +

    +

    Parameters:
    + + + +
    theCommand String, defining the sketcher in local coordinates of the working plane.
    theWorkingPlane Nine double values, defining origin, OZ and OX directions of the working plane.
    +
    +
    Returns:
    New GEOM_Object, containing the created wire.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeSketcherOnPlane theCommand ,
    theWorkingPlane 
    +
    + + + + + +
    +   + + +

    +
    + For format of the description string see the previous method.
    +

    Parameters:
    + + + +
    theCommand String, defining the sketcher in local coordinates of the working plane.
    theWorkingPlane Planar Face of the working plane.
    +
    +
    Returns:
    New GEOM_Object, containing the created wire.
    +
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeBox x1 ,
    y1 ,
    z1 ,
    x2 ,
    y2 ,
    z2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeBoxDXDYDZ theDX ,
    theDY ,
    theDZ 
    +
    + + + + + +
    +   + + +

    +Center of the box will be at point (DX/2, DY/2, DZ/2).

    Parameters:
    + + + + +
    theDX Length of Box edges, parallel to OX axis.
    theDY Length of Box edges, parallel to OY axis.
    theDZ Length of Box edges, parallel to OZ axis.
    +
    +
    Returns:
    New GEOM_Object, containing the created box.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeBoxTwoPnt thePnt1 ,
    thePnt2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt1 First of two opposite vertices.
    thePnt2 Second of two opposite vertices.
    +
    +
    Returns:
    New GEOM_Object, containing the created box.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeCylinder thePnt ,
    theAxis ,
    theR ,
    theH 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    thePnt Central point of cylinder base.
    theAxis Cylinder axis.
    theR Cylinder radius.
    theH Cylinder height.
    +
    +
    Returns:
    New GEOM_Object, containing the created cylinder.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeCylinderRH theR ,
    theH 
    +
    + + + + + +
    +   + + +

    +Axis of the cylinder will be collinear to the OZ axis of the coordinate system.

    Parameters:
    + + + +
    theR Cylinder radius.
    theH Cylinder height.
    +
    +
    Returns:
    New GEOM_Object, containing the created cylinder.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeSpherePntR thePnt ,
    theR 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt Sphere center.
    theR Sphere radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created sphere.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeSphere ,
    ,
    ,
    theR 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    x,y,z Coordinates of sphere center.
    theR Sphere radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created sphere.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeSphereR theR   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theR Sphere radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created sphere.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeCone thePnt ,
    theAxis ,
    theR1 ,
    theR2 ,
    theH 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    thePnt Central point of the first cone base.
    theAxis Cone axis.
    theR1 Radius of the first cone base.
    theR2 Radius of the second cone base.
    +
    +
    Note:
    If both radiuses are non-zero, the cone will be truncated.

    +If the radiuses are equal, a cylinder will be created instead.

    +
    Parameters:
    + + +
    theH Cone height.
    +
    +
    Returns:
    New GEOM_Object, containing the created cone.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeConeR1R2H theR1 ,
    theR2 ,
    theH 
    +
    + + + + + +
    +   + + +

    +Axis of the cone will be collinear to the OZ axis of the coordinate system.

    Parameters:
    + + + +
    theR1 Radius of the first cone base.
    theR2 Radius of the second cone base.
    +
    +
    Note:
    If both radiuses are non-zero, the cone will be truncated.

    +If the radiuses are equal, a cylinder will be created instead.

    +
    Parameters:
    + + +
    theH Cone height.
    +
    +
    Returns:
    New GEOM_Object, containing the created cone.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeTorus thePnt ,
    theVec ,
    theRMajor ,
    theRMinor 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    thePnt Torus central point.
    theVec Torus axis of symmetry.
    theRMajor Torus major radius.
    theRMinor Torus minor radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created torus.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeTorusRR theRMajor ,
    theRMinor 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theRMajor Torus major radius.
    theRMinor Torus minor radius.
    +
    +
    Returns:
    New GEOM_Object, containing the created torus.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePrism theBase ,
    thePoint1 ,
    thePoint2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theBase Base shape to be extruded.
    thePoint1 First end of extrusion vector.
    thePoint2 Second end of extrusion vector.
    +
    +
    Returns:
    New GEOM_Object, containing the created prism.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePrismVecH theBase ,
    theVec ,
    theH 
    +
    + + + + + +
    +   + + +

    +all the space, transfixed by the base shape during its translation along the vector on the given distance.

    Parameters:
    + + + + +
    theBase Base shape to be extruded.
    theVec Direction of extrusion.
    theH Prism dimension along theVec.
    +
    +
    Returns:
    New GEOM_Object, containing the created prism.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakePipe theBase ,
    thePath 
    +
    + + + + + +
    +   + + +

    +The path shape can be a wire or an edge.

    Parameters:
    + + + +
    theBase Base shape to be extruded.
    thePath Path shape to extrude the base shape along it.
    +
    +
    Returns:
    New GEOM_Object, containing the created pipe.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeRevolution theBase ,
    theAxis ,
    theAngle 
    +
    + + + + + +
    +   + + +

    +all the space, transfixed by the base shape during its rotation around the axis on the given angle.

    Parameters:
    + + + + +
    theBase Base shape to be rotated.
    theAxis Rotation axis.
    theAngle Rotation angle in radians.
    +
    +
    Returns:
    New GEOM_Object, containing the created revolution.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeEdge thePnt1 ,
    thePnt2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    thePnt1 Point for the first end of edge.
    thePnt2 Point for the second end of edge.
    +
    +
    Returns:
    New GEOM_Object, containing the created edge.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeWire theEdgesAndWires   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theEdgesAndWires List of edges and/or wires.
    +
    +
    Returns:
    New GEOM_Object, containing the created wire.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeFace theWire ,
    isPlanarWanted 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theWire Wire to build the face on.
    isPlanarWanted If TRUE, only planar face will be built. If impossible, NULL object will be returned.
    +
    +
    Returns:
    New GEOM_Object, containing the created face.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeFaceWires theWires ,
    isPlanarWanted 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theWires List of wires to build the face on.
    isPlanarWanted If TRUE, only planar face will be built. If impossible, NULL object will be returned.
    +
    +
    Returns:
    New GEOM_Object, containing the created face.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeFaces theWires ,
    isPlanarWanted 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + +
    MakeShell theFacesAndShells   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theFacesAndShells List of faces and/or shells.
    +
    +
    Returns:
    New GEOM_Object, containing the created shell.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeSolid theShells   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShells Sequence of bounding shells.
    +
    +
    Returns:
    New GEOM_Object, containing the created solid.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    MakeCompound theShapes   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShapes List of shapes to put in compound.
    +
    +
    Returns:
    New GEOM_Object, containing the created compound.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    NumberOfFaces theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to count faces of.
    +
    +
    Returns:
    Quantity of faces.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    NumberOfEdges theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to count edges of.
    +
    +
    Returns:
    Quantity of edges.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    ChangeOrientation theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to be reversed.
    +
    +
    Returns:
    The reversed copy of theShape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    OrientationChange theShape   ) 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + +
    GetFreeFacesIDs theShape   ) 
    +
    + + + + + +
    +   + + +

    +Free face is a face, which is not shared between two shells of the shape.

    Parameters:
    + + +
    theShape Shape to find free faces in.
    +
    +
    Returns:
    List of IDs of all free faces, contained in theShape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    GetSharedShapes theShape1 ,
    theShape2 ,
    theShapeType 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theShape1 Shape to find sub-shapes in.
    theShape2 Shape to find shared sub-shapes with.
    theShapeType Type of sub-shapes to be retrieved.
    +
    +
    Returns:
    List of sub-shapes of theShape1, shared with theShape2.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnPlane theShape ,
    theShapeType ,
    theAx1 ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theShape Shape to find sub-shapes of.
    theShapeType Type of sub-shapes to be retrieved.
    theAx1 Vector (or line, or linear edge), specifying normal direction and location of the plane to find shapes on.
    theState The state of the subshapes to find. It can be one of ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN.
    +
    +
    Returns:
    List of all found sub-shapes.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnPlaneIDs theShape ,
    theShapeType ,
    theAx1 ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnCylinder theShape ,
    theShapeType ,
    theAxis ,
    theRadius ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + +
    theShape Shape to find sub-shapes of.
    theShapeType Type of sub-shapes to be retrieved.
    theAxis Vector (or line, or linear edge), specifying axis of the cylinder to find shapes on.
    theRadius Radius of the cylinder to find shapes on.
    theState The state of the subshapes to find. It can be one of ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN.
    +
    +
    Returns:
    List of all found sub-shapes.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnCylinderIDs theShape ,
    theShapeType ,
    theAxis ,
    theRadius ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnSphere theShape ,
    theShapeType ,
    theCenter ,
    theRadius ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + +
    theShape Shape to find sub-shapes of.
    theShapeType Type of sub-shapes to be retrieved.
    theCenter Point, specifying center of the sphere to find shapes on.
    theRadius Radius of the sphere to find shapes on.
    theState The state of the subshapes to find. It can be one of ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN.
    +
    +
    Returns:
    List of all found sub-shapes.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnSphereIDs theShape ,
    theShapeType ,
    theCenter ,
    theRadius ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnQuadrangle theShape ,
    theShapeType ,
    theTopLeftPoint ,
    theTopRigthPoint ,
    theBottomLeftPoint ,
    theBottomRigthPoint ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + +
    theShape Shape to find sub-shapes of.
    theShapeType Type of sub-shapes to be retrieved.
    theCenter Point, specifying center of the sphere to find shapes on.
    theRadius Radius of the sphere to find shapes on.
    theState The state of the subshapes to find. It can be one of ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN.
    +
    +
    Returns:
    List of all found sub-shapes.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetShapesOnQuadrangleIDs theShape ,
    theShapeType ,
    theTopLeftPoint ,
    theTopRigthPoint ,
    theBottomLeftPoint ,
    theBottomRigthPoint ,
    theState 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetInPlace theShapeWhere ,
    theShapeWhat 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShapeWhere Shape to find sub-shapes of.
    theShapeWhat Shape, specifying what to find.
    +
    +
    Returns:
    Group of all found sub-shapes or a single found sub-shape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetSubShape aShape ,
    ListOfID 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetSubShapeID aShape ,
    aSubShape 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SubShapeAll aShape ,
    aType 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Shape to be exploded.
    theShapeType Type of sub-shapes to be retrieved.
    +
    +
    Returns:
    List of sub-shapes of type theShapeType, contained in theShape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SubShapeAllIDs aShape ,
    aType 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Shape to be exploded.
    theShapeType Type of sub-shapes to be retrieved.
    +
    +
    Returns:
    List of IDs of sub-shapes.
    +
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SubShapeAllSorted aShape ,
    aType 
    +
    + + + + + +
    +   + + +

    +Sub-shapes will be sorted by coordinates of their gravity centers.

    Parameters:
    + + + +
    theShape Shape to be exploded.
    theShapeType Type of sub-shapes to be retrieved.
    +
    +
    Returns:
    List of sub-shapes of type theShapeType, contained in theShape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SubShapeAllSortedIDs aShape ,
    aType 
    +
    + + + + + +
    +   + + +

    +Sub-shapes will be sorted by coordinates of their gravity centers.

    Parameters:
    + + + +
    theShape Shape to be exploded.
    theShapeType Type of sub-shapes to be retrieved.
    +
    +
    Returns:
    List of IDs of sub-shapes.
    +
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    SubShape aShape ,
    aType ,
    ListOfInd 
    +
    + + + + + +
    +   + + +

    +Each index is in range [1, Nb_Sub-Shapes_Of_Given_Type]

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    SubShapeSorted aShape ,
    aType ,
    ListOfInd 
    +
    + + + + + +
    +   + + +

    +Each index is in range [1, Nb_Sub-Shapes_Of_Given_Type]

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ProcessShape theShape ,
    theOperators ,
    theParameters ,
    theValues 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theShape Shape to be processed.
    theOperators List of names of operators ("FixShape", "SplitClosedFaces", etc.).
    theParameters List of names of parameters ("FixShape.Tolerance3d", "SplitClosedFaces.NbSplitPoints", etc.).
    theValues List of values of parameters, in the same order as parameters are listed in theParameters list.
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SuppressFaces theObject ,
    theFaces 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject Shape to be processed.
    theFaces Indices of faces to be removed, if EMPTY then the method removes ALL faces of the given object.
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeSewing ListShape ,
    theTolerance 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestHealing.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    Sew theObject ,
    theTolerance 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject Shape to be processed.
    theTolerance Required tolerance value.
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see MakeSewing() above
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SuppressInternalWires theObject ,
    theWires 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject Shape to be processed.
    theWires Indices of wires to be removed, if EMPTY then the method removes ALL internal wires of the given object.
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    SuppressHoles theObject ,
    theWires 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject Shape to be processed.
    theWires Indices of wires to be removed, if EMPTY then the method removes ALL internal holes of the given object
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    CloseContour theObject ,
    theWires ,
    isCommonVertex 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theObject Shape to be processed.
    theWires Indexes of edge(s) and wire(s) to be closed within theObject's shape, if -1, then theObject itself is a wire.
    isCommonVertex If TRUE : closure by creation of a common vertex, If FALS : closure by creation of an edge between ends.
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DivideEdge theObject ,
    theEdgeIndex ,
    theValue ,
    isByParameter 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theObject Shape to be processed.
    theEdgeIndex Index of edge to be divided within theObject's shape, if -1, then theObject itself is the edge.
    theValue Value of parameter on edge or length parameter, depending on isByParameter.
    isByParameter If TRUE : theValue is treated as a curve parameter [0..1], if FALSE : theValue is treated as a length parameter [0..1]
    +
    +
    Returns:
    New GEOM_Object, containing processed shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + +
    GetFreeBoundary theObject   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theObject Shape to get free boundary of.
    +
    +
    Returns:
    [status, theClosedWires, theOpenWires] status: FALSE, if an error(s) occured during the method execution. theClosedWires: Closed wires on the free boundary of the given shape. theOpenWires: Open wires on the free boundary of the given shape.
    +Example: see GEOM_TestHealing.py
    +

    + + + + +
    + + + + + + + + + +
    MakeCopy theOriginal   ) 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeFilling theShape ,
    theMinDeg ,
    theMaxDeg ,
    theTol2D ,
    theTol3D ,
    theNbIter 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + + +
    theShape the compound of contours
    theMinDeg a minimal degree
    theMaxDeg a maximal degree
    theTol2D a 2d tolerance
    theTol3D a 3d tolerance
    theNbIter a number of iteration
    +
    +
    Returns:
    New GEOM_Object, containing the created filling surface.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeGlueFaces theShape ,
    theTolerance 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Initial shape.
    theTolerance Maximum distance between faces, which can be considered as coincident.
    +
    +
    Returns:
    New GEOM_Object, containing a copy of theShape without coincident faces.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeBoolean theShape1 ,
    theShape2 ,
    theOperation 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theShape1 First argument for boolean operation.
    theShape2 Second argument for boolean operation.
    theOperation Indicates the operation to be done: 1 - Common, 2 - Cut, 3 - Fuse, 4 - Section.
    +
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeCommon s1 ,
    s2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeCut s1 ,
    s2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeFuse s1 ,
    s2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeSection s1 ,
    s2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePartition ListShapes ,
    ListTools  = [],
    ListKeepInside  = [],
    ListRemoveInside  = [],
    Limit  = ShapeType["SHAPE"],
    RemoveWebs  = 0,
    ListMaterials  = []
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + + + +
    ListShapes Shapes to be intersected.
    ListTools Shapes to intersect theShapes.
    ListKeepInside Shapes, outside which the results will be deleted. Each shape from theKeepInside must belong to theShapes also.
    ListRemoveInside Shapes, inside which the results will be deleted. Each shape from theRemoveInside must belong to theShapes also.
    Limit Type of resulting shapes (corresponding to TopAbs_ShapeEnum).
    RemoveWebs If TRUE, perform Glue 3D algorithm.
    ListMaterials Material indices for each shape. Make sence, only if theRemoveWebs is TRUE.
    +
    +
    Returns:
    New GEOM_Object, containing the result shapes.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Partition ListShapes ,
    ListTools  = [],
    ListKeepInside  = [],
    ListRemoveInside  = [],
    Limit  = ShapeType["SHAPE"],
    RemoveWebs  = 0,
    ListMaterials  = []
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeHalfPartition theShape ,
    thePlane 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Shape to be intersected.
    thePlane Tool shape, to intersect theShape.
    +
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeTranslationTwoPoints theObject ,
    thePoint1 ,
    thePoint2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theObject The object to be translated.
    thePoint1 Start point of translation vector.
    thePoint2 End point of translation vector.
    +
    +
    Returns:
    New GEOM_Object, containing the translated object.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeTranslation theObject ,
    theDX ,
    theDY ,
    theDZ 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The object to be translated.
    theDX,theDY,theDZ Components of translation vector.
    +
    +
    Returns:
    New GEOM_Object, containing the translated object.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeTranslationVector theObject ,
    theVector 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The object to be translated.
    theVector The translation vector.
    +
    +
    Returns:
    New GEOM_Object, containing the translated object.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeRotation theObject ,
    theAxis ,
    theAngle 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theObject The object to be rotated.
    theAxis Rotation axis.
    theAngle Rotation angle in radians.
    +
    +
    Returns:
    New GEOM_Object, containing the rotated object.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeScaleTransform theObject ,
    thePoint ,
    theFactor 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theObject The object to be scaled.
    thePoint Center point for scaling.
    theFactor Scaling factor value.
    +
    +
    Returns:
    New GEOM_Object, containing the scaled shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeMirrorByPlane theObject ,
    thePlane 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The object to be mirrored.
    thePlane Plane of symmetry.
    +
    +
    Returns:
    New GEOM_Object, containing the mirrored shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeMirrorByAxis theObject ,
    theAxis 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The object to be mirrored.
    theAxis Axis of symmetry.
    +
    +
    Returns:
    New GEOM_Object, containing the mirrored shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeMirrorByPoint theObject ,
    thePoint 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The object to be mirrored.
    thePoint Point of symmetry.
    +
    +
    Returns:
    New GEOM_Object, containing the mirrored shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakePosition theObject ,
    theStartLCS ,
    theEndLCS 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestAll.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeOffset theObject ,
    theOffset 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theObject The base object for the offset.
    theOffset Offset value.
    +
    +
    Returns:
    New GEOM_Object, containing the offset object.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiTranslation1D theObject ,
    theVector ,
    theStep ,
    theNbTimes 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theObject The object to be translated.
    theVector Direction of the translation.
    theStep Distance to translate on.
    theNbTimes Quantity of translations to be done.
    +
    +
    Returns:
    New GEOM_Object, containing compound of all the shapes, obtained after each translation.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiTranslation2D theObject ,
    theVector1 ,
    theStep1 ,
    theNbTimes1 ,
    theVector2 ,
    theStep2 ,
    theNbTimes2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + + + + +
    theObject The object to be translated.
    theVector1 Direction of the first translation.
    theStep1 Step of the first translation.
    theNbTimes1 Quantity of translations to be done along theVector1.
    theVector2 Direction of the second translation.
    theStep2 Step of the second translation.
    theNbTimes2 Quantity of translations to be done along theVector2.
    +
    +
    Returns:
    New GEOM_Object, containing compound of all the shapes, obtained after each translation.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MultiRotate1D theObject ,
    theAxis ,
    theNbTimes 
    +
    + + + + + +
    +   + + +

    +Rotation angle will be 2*PI/theNbTimes.

    Parameters:
    + + + + +
    theObject The object to be rotated.
    theAxis The rotation axis.
    theNbTimes Quantity of rotations to be done.
    +
    +
    Returns:
    New GEOM_Object, containing compound of all the shapes, obtained after each rotation.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MultiRotate2D theObject ,
    theAxis ,
    theAngle ,
    theNbTimes1 ,
    theStep ,
    theNbTimes2 
    +
    + + + + + +
    +   + + +

    +Translation direction passes through center of gravity of rotated shape and its projection on the rotation axis.

    Parameters:
    + + + + + + + +
    theObject The object to be rotated.
    theAxis Rotation axis.
    theAngle Rotation angle in graduces.
    theNbTimes1 Quantity of rotations to be done.
    theStep Translation distance.
    theNbTimes2 Quantity of translations to be done.
    +
    +
    Returns:
    New GEOM_Object, containing compound of all the shapes, obtained after each transformation.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiRotation1D aShape ,
    aDir ,
    aPoint ,
    aNbTimes 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiRotation2D aShape ,
    aDir ,
    aPoint ,
    anAngle ,
    nbtimes1 ,
    aStep ,
    nbtimes2 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeFilletAll theShape ,
    theR 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Shape, to perform fillet on.
    theR Fillet radius.
    +
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeFillet theShape ,
    theR ,
    theShapeType ,
    theListShapes 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theShape Shape, to perform fillet on.
    theR Fillet radius.
    theShapeType Type of shapes in <thelistshapes>.
    theListShapes Global indices of edges/faces to perform fillet on.
    +
    +
    Note:
    Global index of sub-shape can be obtained, using method geompy.GetSubShapeID().
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeChamferAll theShape ,
    theD 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Shape, to perform chamfer on.
    theD Chamfer size along each face.
    +
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeChamferEdge theShape ,
    theD1 ,
    theD2 ,
    theFace1 ,
    theFace2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theShape Shape, to perform chamfer on.
    theD1 Chamfer size along theFace1.
    theD2 Chamfer size along theFace2.
    theFace1,theFace2 Global indices of two faces of theShape.
    +
    +
    Note:
    Global index of sub-shape can be obtained, using method geompy.GetSubShapeID().
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeChamferFaces theShape ,
    theD1 ,
    theD2 ,
    theFaces 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    theShape Shape, to perform chamfer on.
    theD1 Chamfer size along face from theFaces. If both faces, connected to the edge, are in theFaces, theD1 will be get along face, which is nearer to theFaces beginning.
    theD2 Chamfer size along another of two faces, connected to the edge.
    theFaces Sequence of global indices of faces of theShape.
    +
    +
    Note:
    Global index of sub-shape can be obtained, using method geompy.GetSubShapeID().
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeChamfer aShape ,
    d1 ,
    d2 ,
    aShapeType ,
    ListShape 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Archimede theShape ,
    theWeight ,
    theWaterDensity ,
    theMeshDeflection 
    +
    + + + + + +
    +   + + +

    +The object presenting the resulting face is returned

    Parameters:
    + + + + + +
    theShape Shape to be put in water.
    theWeight Weight og the shape.
    theWaterDensity Density of the water.
    theMeshDeflection Deflection of the mesh, using to compute the section.
    +
    +
    Returns:
    New GEOM_Object, containing a section of theShape by a plane, corresponding to water level.
    +Example: see GEOM_TestAll.py
    +

    + + + + +
    + + + + + + + + + +
    PointCoordinates Point   ) 
    +
    + + + + + +
    +   + + +

    +

    Returns:
    [x, y, z]
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    BasicProperties theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to define properties of.
    +
    +
    Returns:
    [theLength, theSurfArea, theVolume] theLength: Summarized length of all wires of the given shape. theSurfArea: Area of surface of the given shape. theVolume: Volume of the given shape.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    BoundingBox theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to obtain bounding box of.
    +
    +
    Returns:
    [Xmin,Xmax, Ymin,Ymax, Zmin,Zmax] Xmin,Xmax: Limits of shape along OX axis. Ymin,Ymax: Limits of shape along OY axis. Zmin,Zmax: Limits of shape along OZ axis.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    Inertia theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to calculate inertia of.
    +
    +
    Returns:
    [I11,I12,I13, I21,I22,I23, I31,I32,I33, Ix,Iy,Iz] I(1-3)(1-3): Components of the inertia matrix of the given shape. Ix,Iy,Iz: Moments of inertia of the given shape.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MinDistance theShape1 ,
    theShape2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape1,theShape2 Shapes to find minimal distance between.
    +
    +
    Returns:
    Value of the minimal distance between the given shapes.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    Tolerance theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape, to get tolerances of.
    +
    +
    Returns:
    [FaceMin,FaceMax, EdgeMin,EdgeMax, VertMin,VertMax] FaceMin,FaceMax: Min and max tolerances of the faces. EdgeMin,EdgeMax: Min and max tolerances of the edges. VertMin,VertMax: Min and max tolerances of the vertices.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    WhatIs theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to be described.
    +
    +
    Returns:
    Description of the given shape.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    MakeCDG theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to define centre of mass of.
    +
    +
    Returns:
    New GEOM_Object, containing the created point.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + +
    CheckShape theShape   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theShape Shape to check validity of.
    +
    +
    Returns:
    TRUE, if the shape "seems to be valid" from the topological point of view. If theShape is invalid, prints a description of problem.
    +Example: see GEOM_TestMeasures.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    Import theFileName ,
    theFormatName 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theFileName The file, containing the shape.
    theFormatName Specify format for the file reading. Available formats can be obtained with InsertOp.ImportTranslators() method.
    +
    +
    Returns:
    New GEOM_Object, containing the imported shape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    ImportBREP theFileName   ) 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + +
    ImportIGES theFileName   ) 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + +
    ImportSTEP theFileName   ) 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Export theObject ,
    theFileName ,
    theFormatName 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theObject Shape to be stored in the file.
    theFileName Name of the file to store the given shape in.
    theFormatName Specify format for the shape storage. Available formats can be obtained with InsertOp.ImportTranslators() method.
    +
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    ExportBREP theObject ,
    theFileName 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    ExportIGES theObject ,
    theFileName 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    ExportSTEP theObject ,
    theFileName 
    +
    + + + + + +
    +   + + +

    +Example: see GEOM_TestOthers.py

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeQuad E1 ,
    E2 ,
    E3 ,
    E4 
    +
    + + + + + +
    +   + + +

    +Order of Edges is not important. It is not necessary that edges share the same vertex.

    Parameters:
    + + +
    E1,E2,E3,E4 Edges for the face bound.
    +
    +
    Returns:
    New GEOM_Object, containing the created face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeQuad2Edges E1 ,
    E2 
    +
    + + + + + +
    +   + + +

    +The missing edges will be built by creating the shortest ones.

    Parameters:
    + + +
    E1,E2 Two opposite edges for the face.
    +
    +
    Returns:
    New GEOM_Object, containing the created face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeQuad4Vertices V1 ,
    V2 ,
    V3 ,
    V4 
    +
    + + + + + +
    +   + + +

    +The missing edges will be built by creating the shortest ones.

    Parameters:
    + + +
    V1,V2,V3,V4 Corner vertices for the face.
    +
    +
    Returns:
    New GEOM_Object, containing the created face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeHexa F1 ,
    F2 ,
    F3 ,
    F4 ,
    F5 ,
    F6 
    +
    + + + + + +
    +   + + +

    +Order of faces is not important. It is not necessary that Faces share the same edge.

    Parameters:
    + + +
    F1,F2,F3,F4,F5,F6 Faces for the hexahedral solid.
    +
    +
    Returns:
    New GEOM_Object, containing the created solid.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    MakeHexa2Faces F1 ,
    F2 
    +
    + + + + + +
    +   + + +

    +The missing faces will be built by creating the smallest ones.

    Parameters:
    + + +
    F1,F2 Two opposite faces for the hexahedral solid.
    +
    +
    Returns:
    New GEOM_Object, containing the created solid.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetPoint theShape ,
    theX ,
    theY ,
    theZ ,
    theEpsilon 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theShape Block or a compound of blocks.
    theX,theY,theZ Coordinates of the sought vertex.
    theEpsilon Maximum allowed distance between the resulting vertex and point with the given coordinates.
    +
    +
    Returns:
    New GEOM_Object, containing the found vertex.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    GetEdge theShape ,
    thePoint1 ,
    thePoint2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    thePoint1,thePoint2 Points, close to the ends of the desired edge.
    +
    +
    Returns:
    New GEOM_Object, containing the found edge.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetEdgeNearPoint theShape ,
    thePoint 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    thePoint Point, close to the desired edge.
    +
    +
    Returns:
    New GEOM_Object, containing the found edge.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetFaceByPoints theShape ,
    thePoint1 ,
    thePoint2 ,
    thePoint3 ,
    thePoint4 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    thePoint1-thePoint4 Points, close to the corners of the desired face.
    +
    +
    Returns:
    New GEOM_Object, containing the found face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    GetFaceByEdges theShape ,
    theEdge1 ,
    theEdge2 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    theEdge1,theEdge2 Edges, close to the edges of the desired face.
    +
    +
    Returns:
    New GEOM_Object, containing the found face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetOppositeFace theBlock ,
    theFace 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theBlock Must be a hexahedral solid.
    theFace Face of theBlock, opposite to the desired face.
    +
    +
    Returns:
    New GEOM_Object, containing the found face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetFaceNearPoint theShape ,
    thePoint 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    thePoint Point, close to the desired face.
    +
    +
    Returns:
    New GEOM_Object, containing the found face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetFaceByNormale theBlock ,
    theVector 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theShape Block or a compound of blocks.
    theVector Vector, close to the normale of the desired face.
    +
    +
    Returns:
    New GEOM_Object, containing the found face.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + +
    CheckCompoundOfBlocks theCompound   ) 
    +
    + + + + + +
    +   + + +

    +To be considered as a compound of blocks, the given shape must satisfy the following conditions:

      +
    • Each element of the compound should be a Block (6 faces and 12 edges).
    • A connection between two Blocks should be an entire quadrangle face or an entire edge.
    • The compound should be connexe.
    • The glue between two quadrangle faces should be applied.
      Parameters:
      + + +
      theCompound The compound to check.
      +
      +
      Returns:
      TRUE, if the given shape is a compound of blocks. If theCompound is not valid, prints all discovered errors.
      +Example: see GEOM_Spanner.py
    +
    +

    + + + + +
    + + + + + + + + + +
    RemoveExtraEdges theShape   ) 
    +
    + + + + + +
    +   + + +

    +Unite faces and edges, sharing one surface.

    Parameters:
    + + +
    theShape The compound or single solid to remove irregular edges from.
    +
    +
    Returns:
    Improved shape.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    CheckAndImprove theShape   ) 
    +
    + + + + + +
    +   + + +

    +Fix all detected errors.

    Note:
    Single block can be also fixed by this method.
    +
    Parameters:
    + + +
    theCompound The compound to check and improve.
    +
    +
    Returns:
    Improved compound.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeBlockExplode theCompound ,
    theMinNbFaces ,
    theMaxNbFaces 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + +
    theCompound The compound to explode.
    theMinNbFaces If solid has lower number of faces, it is not a block.
    theMaxNbFaces If solid has higher number of faces, it is not a block.
    +
    +
    Note:
    If theMaxNbFaces = 0, the maximum number of faces is not restricted.
    +
    Returns:
    List of GEOM_Objects, containing the retrieved blocks.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetBlockNearPoint theCompound ,
    thePoint 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theCompound Compound, to find block in.
    thePoint Point, close to the desired block. If the point lays on boundary between some blocks, we return block with nearest center.
    +
    +
    Returns:
    New GEOM_Object, containing the found block.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetBlockByParts theCompound ,
    theParts 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theCompound Compound, to find block in.
    theParts List of faces and/or edges and/or vertices to be parts of the found block.
    +
    +
    Returns:
    New GEOM_Object, containing the found block.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    GetBlocksByParts theCompound ,
    theParts 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theCompound Compound, to find blocks in.
    theParts List of faces and/or edges and/or vertices to be parts of the found blocks.
    +
    +
    Returns:
    List of GEOM_Objects, containing the found blocks.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiTransformation1D Block ,
    DirFace1 ,
    DirFace2 ,
    NbTimes 
    +
    + + + + + +
    +   + + +

    +Transformation is defined so, as to superpose direction faces.

    Parameters:
    + + + + + +
    Block Hexahedral solid to be multi-transformed.
    DirFace1 ID of First direction face.
    DirFace2 ID of Second direction face.
    NbTimes Quantity of transformations to be done.
    +
    +
    Note:
    Unique ID of sub-shape can be obtained, using method GetSubShapeID().
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MakeMultiTransformation2D Block ,
    DirFace1U ,
    DirFace2U ,
    NbTimesU ,
    DirFace1V ,
    DirFace2V ,
    NbTimesV 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + + + +
    Block Hexahedral solid to be multi-transformed.
    DirFace1U,DirFace2U IDs of Direction faces for the first transformation.
    DirFace1V,DirFace2V IDs of Direction faces for the second transformation.
    NbTimesU,NbTimesV Quantity of transformations to be done.
    +
    +
    Returns:
    New GEOM_Object, containing the result shape.
    +Example: see GEOM_Spanner.py
    +

    + + + + +
    + + + + + + + + + +
    Propagate theShape   ) 
    +
    + + + + + +
    +   + + +

    +Propagation group is a set of all edges, opposite to one (main) edge of this group directly or through other opposite edges. Notion of Opposite Edge make sence only on quadrangle face.

    Parameters:
    + + +
    theShape Shape to build propagation groups on.
    +
    +
    Returns:
    List of GEOM_Objects, each of them is a propagation group.
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    CreateGroup theMainShape ,
    theShapeType 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theMainShape is a GEOM object on which the group is selected
    theShapeType defines a shape type of the group
    +
    +
    Returns:
    a newly created GEOM group
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    AddObject theGroup ,
    theSubShapeID 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theGroup is a GEOM group to which the new sub shape is added
    theSubShapeID is a sub shape ID in the main object.
    +
    +
    Note:
    Use method GetSubShapeID() to get an unique ID of the sub shape
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    RemoveObject theGroup ,
    theSubShapeID 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + + +
    theGroup is a GEOM group from which the new sub shape is removed
    theSubShapeID is a sub shape ID in the main object.
    +
    +
    Note:
    Use method GetSubShapeID() to get an unique ID of the sub shape
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    UnionList theGroup ,
    theSubShapes 
    +
    + + + + + +
    +   + + +

    +No errors, if some shapes are alredy included.

    Parameters:
    + + + +
    theGroup is a GEOM group to which the new sub shapes are added.
    theSubShapes is a list of sub shapes to be added.
    +
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    UnionIDs theGroup ,
    theSubShapes 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    DifferenceList theGroup ,
    theSubShapes 
    +
    + + + + + +
    +   + + +

    +No errors, if some shapes are not included.

    Parameters:
    + + + +
    theGroup is a GEOM group from which the sub-shapes are removed.
    theSubShapes is a list of sub-shapes to be removed.
    +
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + +
    DifferenceIDs theGroup ,
    theSubShapes 
    +
    + + + + + +
    +   + + +

    +

    +

    + + + + +
    + + + + + + + + + +
    GetObjectIDs theGroup   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theGroup is a GEOM group for which a list of IDs is requested
    +
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    GetType theGroup   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theGroup is a GEOM group which type is returned.
    +
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + +
    GetMainShape theGroup   ) 
    +
    + + + + + +
    +   + + +

    +

    Parameters:
    + + +
    theGroup is a GEOM group for which a main shape object is requested
    +
    +
    Returns:
    a GEOM object which is a main shape for theGroup
    +Example: see GEOM_TestOthers.py
    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GetEdgesByLength theShape ,
    min_length ,
    max_length ,
    include_min  = 1,
    include_max  = 1
    +
    + + + + + +
    +   + + +

    +If include_min/max == 0, edges with length == min/max_length will not be included in result.

    +

    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SelectEdges min_length ,
    max_length ,
    include_min  = 1,
    include_max  = 1
    +
    + + + + + +
    +   + + +

    +If include_min/max == 0, edges with length == min/max_length will not be included in result.

    +

    + + + + +
    + + + + + + + + + +
    addPath Path   ) 
    +
    + + + + + +
    +   + + +

    +

    +


    Generated on Tue Oct 18 00:47:37 2005 for SALOME - GEOM - v.2.1.0 by + +doxygen 1.3.7
    + + diff --git a/doc/salome/gui/GEOM/glue_faces.htm b/doc/salome/gui/GEOM/glue_faces.htm new file mode 100755 index 000000000..d6a6ef4fd --- /dev/null +++ b/doc/salome/gui/GEOM/glue_faces.htm @@ -0,0 +1,158 @@ + + + + + +Glue Faces + + + + + + + + + + + + +

    Glue Faces

    + +

    To + Glue Faces in the Main Menu select Repair - > Glue Faces.

    + +

     

    + +

    This operation + glues faces that are coincident with respect to the given tolerance + value.

    + +

     

    + +

    Result: + GEOM_Object.

    + +

    TUI Command + : geompy.MakeGlueFaces(theShape, + theTolerance), where theShape is a compound of shapesto be glued, + theTolerance is a maximum distance between two faces, which can be considered + as coincident.

    + +

    Arguments: + Name + 1 Compound + + Tolerance value

    + +

     

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

      

    + +

     

    + +

     

    + +

    Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/groups.htm b/doc/salome/gui/GEOM/groups.htm new file mode 100755 index 000000000..9fadb7869 --- /dev/null +++ b/doc/salome/gui/GEOM/groups.htm @@ -0,0 +1,326 @@ + + + + + +Groups + + + + + + + + + + + +

    Groups

    + +

    Creation of a group

    + +

    import geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create two vertices

    + +

    p0 = geompy.MakeVertex(0. +  , 0.  , + 0.  )

    + +

    p200 = geompy.MakeVertex(200., + 200., 200.)

    + +

     

    + +

    # create a box on two points

    + +

    Box = geompy.MakeBoxTwoPnt(p0, + p200)

    + +

     

    + +

    # create group on box's faces

    + +

    group = geompy.CreateGroup(Box, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # add objects to the group

    + +

    SubFaceList = geompy.SubShapeAllSorted(Box, + geompy.ShapeType["FACE"])

    + +

    for i in [0, 3, 5] + :

    + +

        FaceID + = geompy.GetSubShapeID(Box, SubFaceList[i])

    + +

        geompy.AddObject(group, + FaceID)

    + +

     

    + +

    # add to the group all the given shapes from the list

    + +

    # (no errors, if some shapes are already included)

    + +

    geompy.UnionList(group, + [SubFaceList[0], SubFaceList[2], SubFaceList[5]])

    + +

     

    + +

    # remove object from the group

    + +

    geompy.RemoveObject(group, + FaceID)

    + +

     

    + +

    # remove from the group all the given shapes

    + +

    # (no errors, if some shapes are not included)

    + +

    geompy.DifferenceList(group, + [SubFaceList[2], SubFaceList[3], SubFaceList[4]])

    + +

    id_group1 = geompy.addToStudy(group, + "Group1")

    + +

     

    + +

    # display group's contents

    + +

    gg.createAndDisplayGO(id_group1)

    + +

    salome.sg.updateObjBrowser(1) +

    + +

     

    + +

     

    + +

    Adding an object in a group.

    + +

    import geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create two vertices

    + +

    p0 = geompy.MakeVertex(0. +  , 0.  , + 0.  )

    + +

    p200 = geompy.MakeVertex(200., + 200., 200.)

    + +

     

    + +

    # create a box on two points

    + +

    Box = geompy.MakeBoxTwoPnt(p0, + p200)

    + +

     

    + +

    # create group on box's faces

    + +

    group = geompy.CreateGroup(Box, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # add objects to the group

    + +

    SubFaceList = geompy.SubShapeAllSorted(Box, + geompy.ShapeType["FACE"])

    + +

    for i in [0, 3, 5] + :

    + +

        FaceID + = geompy.GetSubShapeID(Box, SubFaceList[i])

    + +

        geompy.AddObject(group, + FaceID)

    + +

    id_group1 = geompy.addToStudy(group, + "Group1")

    + +

     

    + +

    # display group's contents

    + +

    gg.createAndDisplayGO(id_group1)

    + +

    salome.sg.updateObjBrowser(1) +

    + +

     

    + +

    Removing an object from a group

    + +

    import geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create two vertices

    + +

    p0 = geompy.MakeVertex(0. +  , 0.  , + 0.  )

    + +

    p200 = geompy.MakeVertex(200., + 200., 200.)

    + +

     

    + +

    # create a box on two points

    + +

    Box = geompy.MakeBoxTwoPnt(p0, + p200)

    + +

     

    + +

    # create group on box's faces

    + +

    group = geompy.CreateGroup(Box, + geompy.ShapeType["FACE"])

    + +

     

    + +

    # add objects to the group

    + +

    SubFaceList = geompy.SubShapeAllSorted(Box, + geompy.ShapeType["FACE"])

    + +

    for i in [0, 3, 5] + :

    + +

        FaceID + = geompy.GetSubShapeID(Box, SubFaceList[i])

    + +

        geompy.AddObject(group, + FaceID)

    + +

     

    + +

    # add to the group all the given shapes from the list

    + +

    # (no errors, if some shapes are already included)

    + +

    geompy.UnionList(group, + [SubFaceList[0], SubFaceList[2], SubFaceList[5]])

    + +

     

    + +

    # remove object from the group

    + +

    geompy.RemoveObject(group, + FaceID)

    + +

    id_group1 = geompy.addToStudy(group, + "Group1")

    + +

     

    + +

    # display group's contents

    + +

    gg.createAndDisplayGO(id_group1)

    + +

    salome.sg.updateObjBrowser(1) +

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/image10.gif b/doc/salome/gui/GEOM/image10.gif new file mode 100755 index 0000000000000000000000000000000000000000..01327b7a8fa42f60927fbafe5f25254967d56c39 GIT binary patch literal 981 zcmZ?wbh9u|6lV})_|5Wj<>?fQ(KF}y>h%w z*M;xmas7AXcVPaB`E0AAQavU&_$^oAeWhZx`9S01iM(-bzqT}_PLfgVQj-v1um%7t Ck6IA` literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/image27.gif b/doc/salome/gui/GEOM/image27.gif new file mode 100755 index 0000000000000000000000000000000000000000..52d87e25ba103b4582026c677b0d3f26ddb439ea GIT binary patch literal 1022 zcmZ?wbh9u|lw=TR_|5oa>#gWSa7hJLs%>3 zgn?p1yMUsZ2uFiMOSc3k!we3ECf6Q8tGpD6jZcnFWMf^iq+?^lDMndmIS~cMLrjdk zNxMn{7BDoh@dXHpBwTJ_U}dP_DmdW4c!|+6UC%(k;XvbjW-gObt_LeFEYzxID!A$3 z$i!;7SE;1ZVNC;5+C@8wZjpz9EbIa$y4Ba7p5LV@Z(@6U>&nw>7mEFVrB?59Bvn2)L{{DaA0DT(B~@1c)-xq%)r8O zAww|PgMo!h#$d*RrKhJ$X$lz}xRm7DW1+7$!E^J1(-RG%^LPw4FY}mV=_~ZsGeA9H zhFImMJr%+$16JA@hWT1;$+)(_V56CDz{Dlz7J5fcd%DZmp@C6rc~kDovIA%O*?0vC mPH$fy%Ur=Lr{S<*L*il98FDTK2O1t9@3%FY<71$}U=08voL7DT literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/line.htm b/doc/salome/gui/GEOM/line.htm new file mode 100755 index 000000000..8cd5e7464 --- /dev/null +++ b/doc/salome/gui/GEOM/line.htm @@ -0,0 +1,154 @@ + + + + + +Line + + + + + + + + + + + +

    Line

    + +

    To create a Line in the Main Menu select New + Entity - > Basic - > Line

    + +

     

    + +

    To create a Line + you should define Point1 and Point2, which are the points through +  which the + Line passes.

    + +

    The + Result of the operation will be a + GEOM_Object (edge).

    + +

     

    + +

    TUI Command: + geompy.MakeLine(Point1, Point2) +

    + +

    Arguments: + Name + 2 vertices.

    + +

     

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

    NB! The + is another way to create a line, which is currently accessible only via + TUI commands.

    + +

     

    + +

    You + can define a line  passing + through the given Point and + parallel to the given Vector.

    + +

    TUI + Command: geompy.MakeLine(Point, + Vector)

    + +

     

    + +

    Our TUI Scripts + provide you with useful examples of creation of Basic + Geometric Objects.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/local_coordinate_system.htm b/doc/salome/gui/GEOM/local_coordinate_system.htm new file mode 100755 index 000000000..e4eaa59c8 --- /dev/null +++ b/doc/salome/gui/GEOM/local_coordinate_system.htm @@ -0,0 +1,207 @@ + + + + + +Local Coordinate System + + + + + + + + + + + + +

    Local Coordinate + System

    + +

    To create a Local Coordinate System + in the Main Menu select New Entity - > Basic - > Local Coordinate + System

    + +

     

    + +

    You can enter the values of X, Y, and Z coordinates + of origin in the corresponding fields of the dialog box, or select a point + in the object browser or 3D viewer, in this case the coordinates of origin + are automatically filled in with the coordinates of the selected point. +

    + +

    The user then specifies components of X and + Y axes direction.

    + +

    Preview of the new LCS (small trihedron located + and oriented according to parameters of LCS) is displayed in the 3D viewer + and updated as soon as the user modifies some parameter.

    + +

    Then the user presses «OK» or «Apply» button + to create an LCS at the location with the specified coordinates. The new + object is shown in the Object Browser and in 3D viewer.

    + +

     

    + +

    TUI command: + geompy.MakeMarker(OX, OY, OZ, XDX, XDY, + XDZ, YDX, YDY, YDZ), where OX, OY, OZ are coordinates of the origin + of LCS, XDX, XDY, XDZ is a vector of OX  direction + of the LCS and YDX, YDY, YDZ is a a vector of OY direction of the LCS.

    + +

     

    + +

     

    + +

    Arguments: +

    + +
      + +
    • 1st + Constructor : Name + Coordinates of origin, X axis direction, Y axis + direction

    • + +
    • 2nd + Constructor : Name + reference object.

    • + +
    • 3rd + Constructor : Name + 1 point of origin + X axis direction, Y axis + direction.

    • +
    + +

     

    + +

    .

    + +

     

    + +

    Dialog Box:

    + +

     

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

    +

    +

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/measurement_tools.htm b/doc/salome/gui/GEOM/measurement_tools.htm new file mode 100755 index 000000000..d06d968fd --- /dev/null +++ b/doc/salome/gui/GEOM/measurement_tools.htm @@ -0,0 +1,459 @@ + + + + + +Measurement Tools + + + + + + + + + + + +

    Measurement Tools

    + +

    Point Coordinates

    + +

    import geompy

    + +

     

    + +

    # create a point

    + +

    point = geompy.MakeVertex(15, + 23, 80)

    + +

     

    + +

    # get point's coordinates and check its values

    + +

    coords = geompy.PointCoordinates(point)

    + +

    if coords[0] != 15 + or coords[1] != 23 or coords[2] != 80 :

    + +

        print + "Coordinates of point must be (15, 23, 80), but returned (", + coords[0], ", ", coords[1], ", ", coords[2], ")"

    + +

    else :

    + +

        print + "All values are OK."

    + +

    Basic Properties

    + +

    import geompy

    + +

    import math

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    props = geompy.BasicProperties(box)

    + +

    print "\nBox + 100x30x100 Basic Properties:"

    + +

    print " Wires + length: ", props[0]

    + +

    print " Surface + area: ", props[1]

    + +

    print " Volume +      : + ", props[2]

    + +

    length = math.sqrt((props[0] + - 1840)*(props[0] - 1840))

    + +

    area = math.sqrt((props[1] + - 32000)*(props[1] - 32000))

    + +

    volume = math.sqrt((props[2] + - 300000)*(props[2] - 300000))

    + +

    if length > 1e-7 + or area > 1e-7 or volume > 1e-7:

    + +

        print + "While must be:"

    + +

        print + " Wires length: ", 1840

    + +

        print + " Surface area: ", 32000

    + +

        print + " Volume      : + ", 300000.

    + +

    Center of masses

    + +

    import geompy

    + +

    import math

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    cm = geompy.MakeCDG(box)

    + +

    if cm is None:

    + +

        raise + RuntimeError, "MakeCDG(box) failed"

    + +

    else:

    + +

        print + "\nCentre of gravity of box has been successfully obtained:"

    + +

        coords + = geompy.PointCoordinates(cm)

    + +

        print + "(", coords[0], ", ", coords[1], ", ", coords[2], + ")"

    + +

        dx + = math.sqrt((coords[0] - 50)*(coords[0] - 50))

    + +

        dy + = math.sqrt((coords[1] - 15)*(coords[1] - 15))

    + +

        dz + = math.sqrt((coords[2] - 50)*(coords[2] - 50))

    + +

        if + dx > 1e-7 or dy > 1e-7 or dz > 1e-7:

    + +

            print + "But must be (50, 15, 50)"

    + +

    Inertia

    + +

    import geompy

    + +

    import math

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    In = geompy.Inertia(box)

    + +

    print "\nInertia + matrix of box 100x30x100:"

    + +

    print " (", + In[0], ", ", In[1], ", ", In[2], ")"

    + +

    print " (", + In[3], ", ", In[4], ", ", In[5], ")"

    + +

    print " (", + In[6], ", ", In[7], ", ", In[8], ")"

    + +

    print "Main moments + of inertia of box 100x30x100:"

    + +

    print " Ix = + ", In[9], ", Iy = ", In[10], ", Iz = ", In[11] +

    + +

     

    + +

    Bounding Box

    + +

    import geompy

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    bb = geompy.BoundingBox(box)

    + +

    print "\nBounding + Box of box 100x30x100:"

    + +

    print " Xmin + = ", bb[0], ", Xmax = ", bb[1]

    + +

    print " Ymin + = ", bb[2], ", Ymax = ", bb[3]

    + +

    print " Zmin + = ", bb[4], ", Zmax = ", bb[5]

    + +

     

    + +

     

    + +

    Minimal Distance

    + +

    import + geompy

    + +

     

    + +

    # create boxes

    + +

    box1 = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    box2 = geompy.MakeBox(105,0,0,200,30,100)

    + +

    min_dist = geompy.MinDistance(box1,box2)

    + +

    print "\nMinimal + distance between box1 and box2 = ", min_dist

    + +

     

    + +

    Point Coordinates

    + +

     

    + +

     

    + +

    import + geompy

    + +

    # create a point

    + +

    point = geompy.MakeVertex(15, + 23, 80)

    + +

    # get point's coordinates + and check its values

    + +

    coords = geompy.PointCoordinates(point)

    + +

    if coords[0] != 15 + or coords[1] != 23 or coords[2] != 80 :

    + +

        print + "Coordinates of point must be (15, 23, 80), but returned (", + coords[0], ", ", coords[1], ", ", coords[2], ")"

    + +

    else :

    + +

        print + "All values are OK."

    + +

     

    + +

    Tolerance

    + +

    import + geompy

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    Toler = geompy.Tolerance(box)

    + +

    print "\nBox + 100x30x100 tolerance:"

    + +

    print " Face + min. tolerance: ", Toler[0]

    + +

    print " Face + max. tolerance: ", Toler[1]

    + +

    print " Edge + min. tolerance: ", Toler[2]

    + +

    print " Edge + max. tolerance: ", Toler[3]

    + +

    print " Vertex + min. tolerance: ", Toler[4]

    + +

    print " Vertex + max. tolerance: ", Toler[5]

    + +

     

    + +

    What Is

    + +

    import + geompy

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    Descr = geompy.WhatIs(box)

    + +

    print "\nBox + 100x30x100 description:"

    + +

    print Descr

    + +

     

    + +

    Check Shape

    + +

    import geompy

    + +

     

    + +

    # create a box

    + +

    box = geompy.MakeBoxDXDYDZ(100,30,100)

    + +

    IsValid = geompy.CheckShape(box)

    + +

    if IsValid == 0:

    + +

        raise + RuntimeError, "Invalid box created"

    + +

    else:

    + +

        print + "\nBox is valid"

    + +

     

    + +

     

    + +

    Check Compound of Blocks

    + +

    import + geompy

    + +

    import salome

    + +

    gg = salome.ImportComponentGUI("GEOM")

    + +

     

    + +

    # create boxes

    + +

    box1 = geompy.MakeBox(0,0,0,100,50,100)

    + +

    box2 = geompy.MakeBox(100,0,0,250,50,100)

    + +

     

    + +

    # make compound

    + +

    compound = geompy.MakeCompound([box1, + box2])

    + +

     

    + +

    # glue compound's faces

    + +

    tolerance = 1e-5

    + +

    glue = geompy.MakeGlueFaces(compound, + tolerance)

    + +

    IsValid = geompy.CheckCompoundOfBlocks(glue)

    + +

    if IsValid == 0:

    + +

        raise + RuntimeError, "Invalid compound created"

    + +

    else:

    + +

        print + "\nCompound is valid"

    + +

     

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/mirror_image.htm b/doc/salome/gui/GEOM/mirror_image.htm new file mode 100755 index 000000000..a71a3c140 --- /dev/null +++ b/doc/salome/gui/GEOM/mirror_image.htm @@ -0,0 +1,178 @@ + + + + + +Mirror Image + + + + + + + + + + + + +

    Mirror Image

    + +

    To produce + a Mirror Image in the Main Menu + select Operations - > Transformation + - > Mirror Image

    + +

     

    + +

    This operation creates a symmetrical copy of + an Object, which can be mirrored + in three different ways. Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

    + +

    The + Result will be a GEOM_Object.

    + +

     

    + +

    Firstly an Object + can be mirrored through a Plane + of symmetry

    + +

    TUI Command: + geompy.MakeMirrorByPlane(Shape, + Plane),

    + +

    Arguments: + Name + 1 shape + 1 plane

    + +

     

    + +

       

    + +

     

    + +

    Secondly an + Object can be mirrored through an Axis of symmetry

    + +

    TUI Command: + geompy.MakeMirrorByAxis(Object, + Axis)

    + +

    Arguments: Name + 1 shape + 1 vector.

    + +

     

    + +

       

    + +

     

    + +

    Finally an Object + can be mirrored through a Point + of symmetry

    + +

    TUI Command: + geompy.MakeMirrorByPoint(Object, + Point)

    + +

    Arguments: Name + 1 shape + 1 vertex.

    + +

     

    + +

       

    + +

     

    + +

      Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/modify_the_location.htm b/doc/salome/gui/GEOM/modify_the_location.htm new file mode 100755 index 000000000..56c7db721 --- /dev/null +++ b/doc/salome/gui/GEOM/modify_the_location.htm @@ -0,0 +1,152 @@ + + + + + +Modify the Location + + + + + + + + + + + + +

    Modify the Location

    + +

    To Modify the Location in the Main Menu + select Operations - > Transformation + - > Modify the Location

    + +

     

    + +

    This operation modifies the Location + of an Object.

    + +

    The Result will + be a  GEOM_Object.

    + +

     

    + +

    TUI Command: + geompy.MakePosition(theObject, theStartLCS, theEndLCS), where theObject + is a shape, location of which is modified, theStartLCS is a location to + move the shape from, theEndLCS is a location to move the shape to.

    + +

    Arguments: + Name + 1 GEOM_Object + [Starting Coordinate System] + End Coordinate System.

    + +

    Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

    + +

     

    + +

      

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

      Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/multi_rotation.htm b/doc/salome/gui/GEOM/multi_rotation.htm new file mode 100755 index 000000000..5d85b8283 --- /dev/null +++ b/doc/salome/gui/GEOM/multi_rotation.htm @@ -0,0 +1,182 @@ + + + + + +Multi Rotation + + + + + + + + + + + +

     Multi + Rotation

    + +

    To produce + a Multi Rotation in the Main Menu + select Operations - > Transformation + - > Multi Rotation

    + +

     

    + +

    This operation creates several geometrical + objects rotated in one or two dimentions basing on the initial + geometrical object.

    + +

    The Result will + be one or several GEOM_Objects (compound).

    + +

     

    + +

    To produce a Simple + Multi Rotation (in one dimension) you need to define a Shape + to be rotated, an Axis of rotation + and a Number of Times the shape + must be rotated. Rotation Angle + will be 2*PI/NbTimes

    + +

    TUI + Command: geompy.MakeMultiRotation1D(Shape, + Axis, NbTimes)

    + +

    Arguments: + Name + 1 shape + 1 vector for direction + + 1 value (repetition).

    + +

     

    + +

    There is a TUI + Command geompy.MakeMultiRotation1D(Shape, + Dir, Point, NbTimes) + which works in the same way, but the Axis is defined  by + direction and point.

    + +

     

    + +

     

    + +

     

    + +

    Double Multi + Rotation (in two dimensions) rotates the given Object + around the given Axis on the given + Angle a given Number + of Times and multi-translates each rotation result.  Translation + direction passes through the center of gravity of the rotated shape and + its projection on the rotation axis. Reverse + checkbox allows to set the direction of rotation.

    + +

    TUI + Command: geompy.MakeMultiRotation2D(Shape, + Axis, Angle, NbTimes1, Step, NbTimes2)

    + +

    Arguments: Name + 1 shape + 1 vector + for direction + 1 angle + 1 value (repetition) + 1 step value + 1 value + (repetition);

    + +

     

    + +

    There is a TUI + Command geompy.MakeMultiRotation2D(Shape, + Dir, Point, Angle, nbtimes1, Step, nbtimes2) + which works in the same way, but the Axis is defined  by + direction and point.

    + +

     

    + +

    + +

      

    + +

         

    + +

        

    + +

    Our TUI + Scripts provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/multi_transformation.htm b/doc/salome/gui/GEOM/multi_transformation.htm new file mode 100755 index 000000000..8cc27fc34 --- /dev/null +++ b/doc/salome/gui/GEOM/multi_transformation.htm @@ -0,0 +1,192 @@ + + + + + +Multi Transformation + + + + + + + + + + + + +

    Block Multi Transformation

    + +

    To produce + a Multi Translation operation + in the Main Menu select Operations - + > Blocks - > Multi Translation

    + +

     

    + +

    This operation makes several translations of + a block (solid) in one or two directions depending on the arguments + specified by the user.

    + +

    The + Result in both cases will be a + GEOM_Object.

    + +

     

    + +

    Simple Multi + Transformation (in one direction).

    + +

    TUI + Command: geompy. + MakeMultiTransformation1D(Block, DirFaceID1, DirFaceID2, NbTimes), where + Block is a block to be transformed, DirFaceID1 is an ID of the face which defines the first + direction of transformation, + DirFaceID2 is an ID of the face + which defines the second direction of transformation, + NbTimes is a number of transformations.

    + +

    Arguments: Name + + 1 hexahedral solid + 1 or 2 faces + 1 integer (number of blocks).

    + +

     

    + +

      

    + +

     

    + +

    Double + Multi Transformation (in two directions).

    + +

    TUI + Command: geompy. + MakeMultiTransformation2D(Block, DirFaceID1U, DirFaceID2U, NbTimesU, DirFaceID1V, + DirFaceID2V, NbTimesV), where Block + is a block to be transformed, DirFaceID1U and DirFace1V are IDÂ’s of the + faces, which define directions of the first transformation, DirFaceID1V + and DirFaceID2V are IDÂ’s of the faces which define directions of the second + transformation, NbTimesU and NbTimesV are numbers of transformations.

    + +

    Arguments:  Name + + 1 hexahedral solid +

    + +
      + +
        + +
      • 2 + faces and 1 integer, or

      • + +
      • 3 + or 4 faces and 2 integers

      • +
      +
    + +

     

    + +

     

    + +

     

    + +

       Our TUI Scripts + provide you with useful examples of the use of + Blocks Operations.

    + +

      

    + +

     

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/multi_translation.htm b/doc/salome/gui/GEOM/multi_translation.htm new file mode 100755 index 000000000..16f14a137 --- /dev/null +++ b/doc/salome/gui/GEOM/multi_translation.htm @@ -0,0 +1,168 @@ + + + + + +Multi Translation + + + + + + + + + + + + +

    Multi Translation

    + +

    To produce + a Multi Translation in the Main + Menu select Operations - > Transformation + - > Multi Translation

    + +

     

    + +

    This operation + makes several translations of a shape in one + or two directions.

    + +

    The + Result will be one or several + GEOM_Objects (compound).

    + +

     

    + +

    To produce a Simple + Multi Translation (in one direction) you need to indicate a Shape to be translated, a Vector + of translation, a Step of translation + and a Number of Times the shape + must be moved.

    + +

    TUI Command: + geompy.MakeMultiTranslation1D(Shape, + Dir, Step, NbTimes)

    + +

    Arguments: + Name + 1 shape + 1 vector (for direction) + 1 step value + + 1 value (repetition).

    + +

         

    + +

     

    + +

    To produce a Double + Multi Translation (in two directions) you need to indicate a Shape to be translated and a Vector + of translation, a Step of translation + and a Number of Times the shape + must be moved along each axis.

    + +

    TUI Command: + geompy.MakeMultiTranslation2D(Shape, Dir1, + Step1, NbTimes1, Dir2, Step2, NbTimes2), where Shape is a shape + to be translated, Dir1 is the first direction of translation, Step1 of + the first translation, NbTimes1 is a number of translations to be done + along, Dir2 is the second direction of translation, Step2 of the second + translation, NbTimes2 is a number of translations to be done along Dir2.

    + +

    Arguments: + Name + 1 shape + 2 vectors defining the direction + 2 step + values + 2 values (repetitions).

    + +

     

    + +

      

    + +

    Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/newentity_blocks.htm b/doc/salome/gui/GEOM/newentity_blocks.htm new file mode 100755 index 000000000..d4c7991ab --- /dev/null +++ b/doc/salome/gui/GEOM/newentity_blocks.htm @@ -0,0 +1,322 @@ + + + + + +Blocks + + + + + + + + + + + + +

    Building by blocks

    + +

    Introduction.

    + +

     

    + +

    Below are some general notions about blocks:

    + +

     

    + +

    A block is a an elementary geometric solid that + has specific geometric constraints oriented for meshing. In the hexahedral + case, blocks have 6 faces and each face has 4 edges.  

    + +

     

    + +

    Tetrahedral Block - is a block with constraints for tetrahedral meshing. +

    + +

     

    + +

    Hexahedral Block - is a block with constraints for hexahedral meshing.

    + +

     

    + +

    Block Compound - is a compound composed of blocks only.

    + +

     

    + +

    These functionalities are available from the main menu via New + Entity / Blocks.

    + +

     

    + + + +

     

    + +

     

    + +

    Quadrangle + face

    + +

     

    + +

    Description: + Builds a face using the below mentioned arguments. This operation allows + to build a face bypassing the intermediate stage of building edges and + wires (in the case of building by 4 points) or wires (in the case of building + by 4 or 2 edges).

    + +

     

    + +

    Result : + GEOM_Object (face).

    + +

     

    + +

    TUI Command:

    + +
      + +
    • geompy.MakeQuadFaceVertices(V1, + V2, V3, V4), where V1, V2, V3, V4 are + four vertices from which a face is constructed. Edges are created automatically.

    • + +
    • geompy.MakeQuadFaceEdges(E1, + E2), where E1, E2 are edges from which the face is constructed, + two other edges are created automatically.

    • + +
    • geompy.MakeQuadFace(E1, E2, E3, E4), + where E1, E2, E3, E4 are four edges from which the face is constructed.

    • +
    + +

     

    + +

    Arguments: +

    + +
      + +
    • Name + 4 Points, or

    • + +
    • Name + 2 Edges, or

    • + +
    • Name + 4 Edges.

    • +
    + +

     

    + +

    Dialog Box:

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

    +

    +

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

    + +

     

    + +

     

    + +

    Hexahedral + solid

    + +

     

    + +

    Description: + Builds a hexahedral solid. either of the below mentioned arguments. This + operation allows to build a solid bypassing the intermediate stage of + building a shell and 4 faces (in the case of building by 2 faces) or just + a shell (in the case of building by 6 faces).

    + +

     

    + +

    Result : + GEOM_Object.

    + +

     

    + +

    TUI Command:

    + +
      + +
    • geompy.MakeHexaSolid(F1, + F2, F3, F4, F5, F6), where F1 – F6 are six faces from which the + hexahedron is constructed.

    • + +
    • geompy.MakeHexaSolidTwoFaces(F1, + F2), where F1 and F2 are faces from which the hexahedron is constructed, + other four faces are created automatically.

    • +
    + +

     

    + +

    Arguments: +

    + +
      + +
    • Name + 2 Faces, or

    • + +
    • Name + 6 Faces.

    • +
    + +

     

    + +

    Dialog Box:

    + +

     

    + + +++ + + + +
    +

     

    +

    + +

     

    + +

    Example:

    + +

     

    + +

         

    + +

         

    + +

    Our TUI Scripts + provide you with useful examples of Building + by Blocks.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/offset_surface.htm b/doc/salome/gui/GEOM/offset_surface.htm new file mode 100755 index 000000000..204a067b7 --- /dev/null +++ b/doc/salome/gui/GEOM/offset_surface.htm @@ -0,0 +1,146 @@ + + + + + +Offset Surface + + + + + + + + + + + + +

    Offset Surface

    + +

    To produce + an Offset Surface in the Main + Menu select Operations - > Transformation + - > Offset Surface

    + +

     

    + +

    This operation + translates each point of an Object + (a set of Objects) along a local normal by a given Offset + distance (signed number, negative value meaning inner offset). Offset + operation is applicable to faces, shells and solids.

    + +

    The + Result will be a GEOM_Object +

    + +

    TUI + Command: geompy.MakeOffset(Shape, + Offset), where Shape is a shape which has to be an offset, Offset + is a value of the offset.

    + +

    Arguments: Name + Object (face, shell, solid, compound) + + Offset value

    + +

     

    + +

    + +

     

    + +

    Example:

    + +

    + +

     

    + +

      Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/partition.htm b/doc/salome/gui/GEOM/partition.htm new file mode 100755 index 000000000..60c97c87c --- /dev/null +++ b/doc/salome/gui/GEOM/partition.htm @@ -0,0 +1,172 @@ + + + + + +Partition + + + + + + + + + + + +

     Partition

    + +

    To produce + a Partition in the Main Menu select + Operations - > Partition

    + +

     

    + +

    This + operation builds a shape by intersection of two shapes or a shape + and a plane.

    + +

    The + Result will be any GEOM_Object.

    + +

     

    + +

    Intersection + of two shapes.

    + +

     

    + +

    TUI Command: + geompy.MakePartition(ListOfShapes, + ListOfTools, ListOfKeepInside, ListOfRemoveInside, Limit, RemoveWebs, + ListOfMaterials), where ListOfShapes is a list of shapes to be + intersected, ListOfTools is a list of shapes to intersect the shapes from + ListOfShapes, ListOfKeepInside is a list of shapes outside which the results + will be deleted, ListOfRemoveInside is a list of shapes inside which the + results will be deleted, Limit is a type of the result shapes, if RemoveWebs + is True the Glue 3D algorithm will be performed on the results, ListOfMaterials + is a list of materials indices for each shape, it makes sense only if + RemoveWebs is True.

    + +

    Arguments: + Name + 2 shapes (first shape will + be intersected by the second shape) + reconstruction limit.

    + +

     

    + +

    + +

     

    + +

    + +

     

    + +

     

    + +

    Intersection of a Shape + and a Plane.

    + +

    TUI Command +  geompy.MakeHalfPartition(Shape, + Plane), where Shape is + a Shape to be intersected and Plane + is a Tool shape, to intersect the Shape.

    + +

    Arguments: Name + + 1 shape which will be intersected + 1 cutting face.

    + +

     

    + +

    + +

     

    + +

     

    + +

    Example:

    + +

     

    + +

     

    + +

     

    + +

    Our TUI Scripts provide you with useful examples + of the use of Basic Operations. +

    + +

     

    + + + + diff --git a/doc/salome/gui/GEOM/pics/arc.png b/doc/salome/gui/GEOM/pics/arc.png new file mode 100755 index 0000000000000000000000000000000000000000..260a5fb7d6a00b9c4fb0c1b455c2af336c7211c7 GIT binary patch literal 11731 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 AUjP6A literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/archimede.png b/doc/salome/gui/GEOM/pics/archimede.png new file mode 100755 index 0000000000000000000000000000000000000000..cd620020e4e2159eb4888c2eacfe267efc1a3765 GIT binary patch literal 15311 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/archimedesn1.png b/doc/salome/gui/GEOM/pics/archimedesn1.png new file mode 100755 index 0000000000000000000000000000000000000000..402092052787db07dbd458ed24104632937e32b2 GIT binary patch literal 3678 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 L#k~09oqzua>(yZZ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/archimedesn2.png b/doc/salome/gui/GEOM/pics/archimedesn2.png new file mode 100755 index 0000000000000000000000000000000000000000..b3b84b155b3cf1df96dc019203969933bf825104 GIT binary patch literal 4140 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 KyA=lRG5-OcdrcYu literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/archimedesn3.png b/doc/salome/gui/GEOM/pics/archimedesn3.png new file mode 100755 index 0000000000000000000000000000000000000000..da57c0fb966fab409a3f0b3e876563e6e782d314 GIT binary patch literal 1841 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 NJYD@<);T3K0RV+-O2GgC literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/bezier.png b/doc/salome/gui/GEOM/pics/bezier.png new file mode 100755 index 0000000000000000000000000000000000000000..3c0e8df2b69292fb503584a104246bcc7b204e2a GIT binary patch literal 2442 zcmb7GX;hNi8rFteal^8*!8yxg$|08)n0BNzha5sQzyzmbnTk_lRN|aNn&yyk%yNiI zCB8oN=7)wuT3H!oipohWvqh-aFVjpg!=X#3Kew~`aqo})thL`^?{~d(HUaO9L}(+_ z)YOnJ2OYfB)YPq22fK2Kioz1pW7X7FdAc~*5zmx<7_^PrCeca}0d^|}oI?Io(-?Sl zIX5V1=|&6xG(E|`*2k||`eIp8*7M_9OYbgS@!@s@J22%`+eSyvOAdu3#hb**()|VJ zk+t$^1!%DGeNcTf@)~pKlE3=f9h3}R2w@$nMejC~T_bha0R?H~tt&u#jsKr9=~~m~ z_Gixf7UQ~MZpW4VF_`*Bf8WkODx@(b9!(j%J^^yRA$V;S|z z&x7Xa2+!Yv_m4>J!_2A0MYpC~YgKnm&6ozs>Nn{$jy+KV4^Av{3BSL)UO#uGW|Q}4 zLDHPubF2r{?y7N`-zsg&N{)PSXNl)9_JqT{iPTcclhgJ)nnfrkaD5APx4Y{Q)WJ+< zgTF7!e+$Pk1I!d4Jj4>XY=P8&*c;eu5+Ot6_le;mf`NZT$6?@V+!!g)hF=!Y(){)A z`Mc%luf#KqYuXHcW8&09<`jqw>?gg#eoT{mGOzSjH}i@H+ID_-8f;VFZf9P4HBQ;B z$Y=P;Itb8}w%9LV)QE80x$;$8-LP;k`aaK z_-DcSMXGTrq~~w(BQ?NYI{oyDJ(-_hkCmi7Yl(#mA>l`jkx`W}m#MS4|L+=KYD-@((I;+Dgvc4Q;J5)x_ z-Xpz+w@toNBuRLt*Z_zh>%|@8XSP1F`LI#PF_}P#v|FRY364z8UH;@YS*28IXma?( z^N~wI+P`0LRgnjdTpcl?uVmEUkWs@z9k z^Wk8(AHXMs8LgO}rer;qydFMCK|eMeJ_J!xT&+{dCY4_JDseXF(ylND0(j(G*{P#2 zJaMMAa@9(fT`0rXK6nR3uaK~%fc(UWn8_OH_qy&DsrxB-br_}d!Jgpl^{MB!6Cd9Y z-(Sh{3}bAz500Sdr4UL|j=F`!bQC`gRh)cmdiV}9!H8{X0hZfy+&zHkUx??w)uym$j!ajJ!>#A4RPNGoQXC`+CoK-A5P_y0)(+#82U5z2-I`#-ZDIxxmg5883 zxlS6`JvUXKiaQ;q@X4et#R_=QBXxyC8r`^!AE4Rf{6SQr8?u%QdhO!JM zVh0oEW807C%U|{YR(Z$39&m6I_IXmXU-ISTL-M(rUjBu$o=u^c2Lw>;Uop4ltA$a} zOt^XL9JMt*qLP0;dI>Imkb~iZkNa9 zB~i8D-E!+oNz~xql)4A1L2YhY?`XeGB&JZjD>~}Li7)LYbh&k(6*<||)Ovg+3jQLPVF)qBQMjX4DYu+2usid*09{XKDoNuqe?^s zijbs4%a$sN9t&p*l#!oo<|=RMUw~`^Im(;(Y^vVJh1&|3g>?;$i~)k!L;!WeQ*syo zF>0d9oFc3&N+BR9T;lK4+faEsciv0L&Kb;jH7W6+9iNa6$%;76&IjB&_ESlpw+4nO{-I3XIQ-oBf|tL zM20o15DaZ4g&x=hYJkb5y(%g_zdCf*QjyGFQB9y*AyLji(|7 z7Z0_njBu%Z|4m#J|4sa_Vp@5FwHi{gd~cPK4LVp?!W5bUFElt&gkto->hwx`RbBA< zoPe&2D3S)ZdWL*@rTUZv!GV{c&(tkc0d3n{Vm$_?PX5?@n$ zpt=Cn+Y4vQgzXU1Mqp_SmOJv?oq*AcsNQZ^O(t9h*{l{=V!sUxy{=KQ<4v(R+B1fp?Hz3@d( zE(9fQiP?<*gZ)hDvvYCjdARXdiNi=)bi I_JL>r1DNL2;{X5v literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/block1.png b/doc/salome/gui/GEOM/pics/block1.png new file mode 100755 index 0000000000000000000000000000000000000000..71a93b0c9bd2d768396d783b5aa5ae7a4cde33b0 GIT binary patch literal 15732 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

    J$SI^9TIybEAV_b7-N$I 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 Na#G5$;ui*={twidk;wo6 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/block3.png b/doc/salome/gui/GEOM/pics/block3.png new file mode 100755 index 0000000000000000000000000000000000000000..61aad9b43a4ca7540620889ad23c35d3fe2a7241 GIT binary patch literal 15635 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

    ^@O0#8+KGvOeyHUH+FF8GXiOoPcC3 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/block4.png b/doc/salome/gui/GEOM/pics/block4.png new file mode 100755 index 0000000000000000000000000000000000000000..d0661b6e98b1920495af89e0be060960f749ea52 GIT binary patch literal 13453 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 CQja76 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/block5.png b/doc/salome/gui/GEOM/pics/block5.png new file mode 100755 index 0000000000000000000000000000000000000000..9810f6f0dfd56691b09c95349195cc4b63d8c9c8 GIT binary patch literal 16710 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 XnY>uyS}X8*1=0s8CCM@gqc8srt3cwM literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/bool2.png b/doc/salome/gui/GEOM/pics/bool2.png new file mode 100755 index 0000000000000000000000000000000000000000..4e9b968622f6087d707521eb3f79ef268c368ba5 GIT binary patch literal 13285 zcmb7r1yodD+wUMsN(d?;AyU%P45>&+i=?E|odVJ=(gM;cAYIZmgh)$wH$%tJ3=DVk z{=e_Leb;-}V%9q6EY6<2&v~Bb7tfyHw~EquIOI4G2n0{&jl??$1Wf>ZB(N~Rm5TId zgAmA5h>XN5Rn5TNIaeLk6IAEnL}EDFJr_f#SC8X+ER*tsf0{HW%URg)_su9Mmj(yt z%=OHb#Qii5tgelH&#z*a&#EvpILj6PhmBX`1*gKxFHZgYksqa`K0pG=NJR%a+mbHQ z9Gl?oO&iJkQ;*cteuaGfT6-voMZ^5#{QPtK<$Kd>!Uqq2piEIgW_VPqMkcj6#+kEB zIC%(5`C6LPps3j*`Df3bsake16%-JG|2(DO3^IA;RbrDxC_WoU3y(fGI1K&M*~uc? z89_NVbmL0>s4Q&T#)C*4D>XXsm7#d9(GRuqq30%l3*vOtl&ZI0nUpZDKN0e0FPe$g z9lz^ty7%Uj`Q~P}-at?Ct6%a_x}-D(bj9j4{1ZeF@^*RN*9=nr*sy4SMN8-(G#stJ zW_^ife-od}V&o^LWt%>EzPXsEvsG;z|MMD*vT-a(nLklsJwm@2K!{N+D?&{y+97{m ztG9)bnFU#OoNJ?fS$9EwU!Z5w0J=;BSzS1%^lDvnD@p(xR*yYq5R z(CP4)XSuMCPDq;m5G=Q1rGDEDo-tpphNII?56Pa&D#;?g_~ zONglajs}euf6CF)xsY}8wsrBc7_F+)V$#-43@om#z0P@uOK^gdD7#DKQbPFK>0!$R z!JRE;vnscDD(`CJ9Ku^#Ui$fwf8Zep3tL@X|Mro~ert3;MZ`VgvdQJ`NM|xeNKd-? zluo^t&fFKS;wR6)>4s!#M$G^GX$sdB%6OQ9YnFFI^>%3cVS&3vp2_I4_AXAVQ%P3o zDZiHSKJ7(h=#D_iirqUrhXGHCw=+S|646)00~`Y1Q0Kd+4TQh3EnF?lcHq9b%F2Eld-dBk3d&4%4&UyM{P?!Ho$Np`#68o zB*-Z@=O?sCJL`Qor|iflCSDE#q(JQbY4n=r@~PBQ|1G6F*#30 zjxFXVmruXH+o!Jn5kLt)QbGjxn(>gcr!FXklaIZ5_q#SNP13yBqgaS>0Cf*X^=P!> zFlgbz8UFs^J*uYW2dR5_bc_>WiiJzaIrt=EgbZ=nvGmDuPDy@R^H}icVqZw8yZ_fG zlhS?#(u1=X9jG(ylAk8iY&8cl*E^H(8)c~9W;{68HymN^NfV4ho$@v%J<{6*j)+

    RjOkg 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 U2T;Gq5a0r|p6RJqKe3JaUxaI(tN;K2 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/filling.png b/doc/salome/gui/GEOM/pics/filling.png new file mode 100755 index 0000000000000000000000000000000000000000..5ed4f45a5d0c3f0b95f2338e3bda2cbddb99435f GIT binary patch literal 15332 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 P7e`56{aKN$$=m-6M6Z=Y literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/filling_compoundsn.png b/doc/salome/gui/GEOM/pics/filling_compoundsn.png new file mode 100755 index 0000000000000000000000000000000000000000..9d3846b2b3837d8c700726b63290259f38d7e71a GIT binary patch literal 2507 zcmb`Jdpy&N8^UAX-Jb4 zA-U5PSL=h<`u0xab z?<2S@TzTOxlr!tL&EZs?=Y#j*5cv2Hj-a@~^Ao+NU&1)V@!%^RFfVKE-JtQMxbru; z?nI{CRyBEB!WIYuahUlJ1WERj8=rYMc*Jn{dVT(V7%u7JT$AzGff(lS+)Wk$x4|WK zIQkJ#aVudxb*SibgGAQUnqY0PL)cK8ih*2w4UM0k;3iMb{Bd&80sw*D9i-hFIcJ%E z7o&0!hbz$$2AdwzR(0eJbl!^ACZJ3|vN`yN>`iEZbWyL+qKK7YgDY97he^t|j3<%& z8;WC=jiRq1p>9$NtK40YfGV9ShlEy8595;77hcV8uMi75?U>IAsQSr^VQb6tUq7z3 zJFfR(S}ub@4^0P_8IdxNMHHY7+OQL;zycsUa5xYR-7WvWUvo&X0*@#CEZ*4ivol3I z?Z}J&ikXzF*eLF&{0@MmGI)~kDpG}l%I|K0~>DMJRmfFT{H$?q#>CU=KBXes|=( zI5wEXyOn=L5JnlA#}wOBvA3DoZqhmVZEbpNW_FrnVI&EX66RT4f2hH?W-TOs07Mf1 zSx0Yc)vcJ3>bG86tv#Xpbi8q6FKQx@Lv}S=$MOT+6;t!4>8yyN*Ep5PXAG?<=4_N`zY1vO+gM15 zYq6XrM(u=t@N{GFn{uaD&|wc11bN+yHaIie*pTB=C-E zbOM_M|Yd>p3|Ez43yiyKXQE*>?A{+?(9i|rsbvDgtLy=iHuRZ4#(6E4qnpIit zzt3o2f`}-Ox_9`7E9?tTVFg)5CFHW|Yqf`4>{2g`$wPR!&M%lW#Z@dWzP!Kh^ehW39^mY}8 zPZ)O^!mR|lqvZ_=cTIU&fc{4ZbK!iiL9=4<@O9hF7G$^Cq6%Z1*lEy-13(Qq?Uxn< zDtBArRwBP~o!5$7$~&_rRx$Z6#Ddo06`XyZF7)bjbbyu!4am>B? z!szIxH@1c`G42Pvu6ti5I|!YcQ!%u1o!I=(XFrTkns=B0^v4lk^rnx&33@MmP7A!w zA`s+7OOFM#1HqnV^$Ig{0O>VKA&6>P%SDJ&JCDNX9;;@lt1g3Xsk$$SN4Y?g5u8PX zCKWKXw<$MPo4}kDt9I~lUT-u#uRAFoKN;V`H9#v>%|c_v9P zyF?UM0D{E2sXIG!_M2Eg!=9-!z^4DjGcj8V9X+}?h@LmZYtvkeG=qcE-+6>wdj=$* zs?0Nxa8(7qgyRUmc%)EbdmfC>_JLfsxYLU(osU33&B+S|Unlp*43i|&4YGZ~W~R3* zVWv1LwkTZ@38T{vlm}PEFNFT53`i*GMv*L{+f30(r<)Oa$;Yf<^nE4ww1%gQYlQTY z8fuCq5~LPy6p1f?G8|UDo#4o$h6Z=Nf8H3sP7b)^#Li`le&g-GNELBC;;K6N3?7-n z9M>X!R+;*VGZ91P51SSgu2XL%&TzfdrvDw|f8~f|b!gVje|LO9zfoc6^#+n2c(Hc>gf%UbHP-{U5C#`1p_|4?|gjNJ5V+(7R(kh0Q zJ78-37&=O(%m1wVI#{3IB{}$HVw_FQ@FKT*U*0uFj z^;b|UJ??{V9QyQ@Iy2Q3)RHl{HHMjyEgI}`qPruzA@iljqL>-UbIcbyY&%?{L)~Rp z#cvE`cXg$)S!I?ENc5)iPefnaZDwHOY`(qn!LB3g$o+NQKc->+A4N2}U0>eW5OBSJ RXI-Sp+2e_}MYyxke*;1+j{*Py literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/fillingsn.png b/doc/salome/gui/GEOM/pics/fillingsn.png new file mode 100755 index 0000000000000000000000000000000000000000..2446e89d514b049117bdfa37efd9f13e2e3088d2 GIT binary patch literal 9402 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 O1nBD+X;)}EME)PCg75PH literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/free_boudaries1.png b/doc/salome/gui/GEOM/pics/free_boudaries1.png new file mode 100755 index 0000000000000000000000000000000000000000..20c29f96519216cc0fc638364dd71297b4ed18f4 GIT binary patch literal 12909 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 aYF{Zms#hb+dg001OLOyrk4#*LXl0Du9Y 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/fusesn1.png b/doc/salome/gui/GEOM/pics/fusesn1.png new file mode 100755 index 0000000000000000000000000000000000000000..e0118cbd2f9f1166d6f1b448cc6029f0c779d8d7 GIT binary patch literal 14030 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

    1a*as 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%0DtKd3Z(3 z5Yxc+I!7Weo6ewx;rb3B26cKc1p$v-Mj@Ph|C38hJU!C;w+StOV>~{9(W3B08K@`^ zvOu#CBq)et;&O{Q0%KL0s#wMh#@-?-b{sUJCB88rsOe`{NWAg-%KQg)h_63utiT&0J zS`9&21h_TtPv%xh33&YzMm+kn-*CymBMoUb6C_{89phk01X`z9HU=R?Wkk=qNR!xQ zGTARorqPANdN#FJIb45*H#m~|ieLBe__^xc-g8wy37DuI1c6$dD_>3SdFWR&g!hxe z-X>>N*T48;KcEwtwGqT{R>;{tm2&_Ty*2G3{R}il9#hE!Tvs zjayl^Lo6L_E0G3Jd>@o$vE_~#ZjV1-VICFp(GM1UtuM|MwU^f|?3=jibG)>b6tmf< z&BRNNluP(uehS#Y9$FOj}lT-P{o+X;}6azHmf0S+@HbHVov$9|N_k~kY~)|cn{aobme0cs zRhOKu6bqh8PAW9Lru$Ef9Y*BEqE#m*?5^G$9_}i$`56BiZ)rVk(XI2!TeCl%2>CAM z^GKZcd`hhLDDOo%XJzu`|K<>Y|EHblrw<^x(a-3gs=r4(DhMdatI1W!mYNXC|!lb6f55xh`;&pRF4`L~?$!D)xDje`7|l#e^I5tH8J*p+5iSnG<_L zarv<*NxrTODGxOEGRIcBYRcx~ER=}KaFsZwfp3VsGuy|O2fS*jbDe(gb|WgvAgP6m zn@^kLs=U^m$h+MC$vLeBe?9~+_cm_Gek1at(<;1FK-Bfag z(Qy9zs~(5slr=|b$9Szxk*xT{e{fFYY|o{>wkV%R-sS`RE_}>>C+XMPM9Q->mm~9( zDu>7JY-8ol*-=HZUNy%#UH5lndn1yEMxL{?0K8aLg}ptFby^?)#UG-`X+-_`wPR5R zCJITQ_CUc`%vo4B+q7Sh^`f-mkf_qPPZL*Gp=YR$dL z%u25-nG2d$J(<_@-V*7^H>D^CVeP8rkNv^j&QDfzpp#BvgCbW&bj-A284Lz>>YtBU zDdy8tF8|m7Vr@@Z~39(c-Dcp`8HabxatY+D08T!5~g^u-|_5-m*Mx;6uO%Kn}_+hP8rRpGTdf z1>pOl>S&8w=aP-_C}8jFOvpD#coC&?d238Ik2fL)h2zLQw3P8IzmXOZ*Y}LL@`^pV zPjKCUIL>VrWrA81Bn>iT;2x-i>7Q-`F|+TL3S|7Ywq_(XZz!C9NEeEu_3tb##c|MB z`(OR{+T7gW$6JW*TJ8}N*x`UamrFfj37-GCG50Im5h{m35>4{8ZNH!bTn%b7n0-qC z(ubNx#5&K@&wUT)w|-(uaZ8?y0K7#>YePMPWgR|(K{>5COFVVt-UK6Ajt-;CvTH}0rH^VxW@P3m)>O8oSe_bjcHXrYC{anGIzn4eG-CbHU$H6d4n_~-2 z_uAk%_td-5^7`kc4%|S3h-gw448Y zoWh>penjoWeV7TfmB6YjRhAX|R7i;Nh#oin*$pi7<7N-BY$wGo%h(Q7LDGVrP5NR?T=tQP&)I zzD{`8Kd-ENKFpZwAT2orS(H_C)c=TBHpBpfL5lzvIYrIznna4Z`p-qedGSyvAHh0l zhL=6!`0#`N{HhRXVNY~F6$9?QS-TN_jcbY*CI#d;@PoYu>Yo~le6hFETp)u>7wUkXj#D1 zfwxG`q$ZR5V;2V7_vagq{IV+*Zf2NyXe`m{6`!~$k66S=m@M4Fw26}VrzKtC#GHUx z`%jpR+&V?Y zb8XSARFmVo>4W)b(Hzep0>SWQUv4PxLQ#4beeBD9!a#SSCCH|c5Eb17{sryXwdDpp zyMP@gk8}CY{^{yYW#L9aP!$!z0q;fDO1%((Z2K#~pPAhpE=DtIMsgPxu8NA``xi1k zdir>_d9|;AU_~qhvKG7!id<|YnJiIPNjwJ~>F90QV#}LxZZ?g;HbNn+GA~GX-Oo6O zkfEOu6#lJG$(1F6w~o*uIaW#K>1bdCJY>58o*is!>ri$FSv2qj;@`*i!$K}xjz_g{ zsv)$Em-{HnIF4B}kKcKg8PmAS+teX<<=w9YuBp z_jE%3($zI1Y#ROlwV404?9`Jg|L}OWi?L!iR()A9XI=KF7}bZnr%Nh4_qDyl{DH=7 zs?yOL=^Cf^u2kParak6ue`Yc65GkcV=FDREW6Uh{`ElK%ZgroH9i2TO{r(gHb z=6jt_*H`GFt%$K$OF&j5LK(h3{?5nJEGOIRX6np{d@2+Ooj?6kHVpS0X*|I)Vxy zq7=^|fqTp`VwHV%splGfY!i30Q{WbOe)%}f;u1D;*TPBJ-h!u3!QTCxzP*VBAmRUy zTH5GDQpDFu-08HmD_{K6D!2QEQ}};y6pS#QdYNTqW+h+yYSyu0Ym=gvVXhsEVI~9RFr{CGABiWOGVa z4yzximPX=PE+LsnoWcCoY2XZd1l^gTpWt*+4*dtW8xGIF&NLK^`MMYgqa5Rb{#n%M zN7RECAbvitFu!Qq#KEX^VdFk~zoF0D87HwI*d4d6kc^onK+axZz03B~CRnV~b!hb3< zi(WpljU-2wJ=&m(_o`^s%I<-gHcsYeTNI0$nwt-_buY?dq{%v>l3qwTME{sOqj5{} z6WORX6F)cZFbTq@$cCEZdWn8*R~(<^nQ|YO$l})-Y_HyIrDY8D*;xSuZ3>3n8P5j_ zwOvJzy zFmq2Cvt&HqN$jhCvR%I5*~9rUq*0-o@5BC)vVu#>HMATsgk6EAl%}Bx-a||Qa#T{= zvO67*;i-?nHLtl~DuxHLK9{J;a=z^=?lH*MD&;Buta)4T{1T+RboR|qwdAwrlC{Di z4s;v5biZm@dQUU1Js|jQbo}H4nPg#8J)VeB*J~5LrQQSrCle^2W0-2Nu$YsR?RHwS zS;;BHbf`kdt#5Y3oqqD2Bp~Z;cw$CXX7)QH>I=$K61Mw9{MpDzjXQ;*=#CYx*C95R zm+F>d%(`aN#p6*H_(KAxfH0LUPO6g#>%QzLeYQ*Ey^= zd}8OW(|LhgH>M>Pjrd5WZjTPz?}p?Z{%Nq%wne6I$gNn;*ZBDahWJA3B~IJ=+{Va^ zVG@b6JNierOsOYh#8-FIA^;g~Y!)D~W`@6aTROs_t4R9caniRPZ|}QCWF5xW84WA; zm5@}8g(-#d6uw-~T?X$~=%fMP4%xB!bHs!9!%8^;sR`RnL8sA$G)UrpV1*K?ltad& zGdoKL-@-U+lcWnLdmM`|d)8o{jmjJhy zdtE9PJX8MpVVYxew`^%rH|Tgpc2!43ATzki9uDxum-+DdwuUf);#q`cFW3q;haWiW0xmi$^`9}_h1#c7W z@C*20C|S6(=bU1bWx>YRI>mY0Exh3&J&}=bLn!l4Bz^?1JXUKLTL)xme8YuxU+G@S zZ)lQ))iwgcxujVYNzPs8KktJIv?1_$8s_R$n6Y5>gLnby2j7z}92Ebg{*-Id13I7N ztV%Wz%mHP7QRjn7Tnd@elb3hl+!Me%=YV4!qZePMK0h7Vt8{kVWxSZ+KxJbQiqG-i z{p3gnyqX0YXB_f3(lKMM+o>iSqDF4gKxLJN%Ee7Mm??S-=WJV zKbGkSCrA$mxxBqCCAZ!)ZG*VmPFtS;3+?H(EDK7OY3lB{(jg|vo*%h#CppT3cd@}$ z^iVH3NiAb0L%(^$Yuhs{Y6lyDrnJ_Gb_AqTyxOe#IqC?La_xbgh7+%t-1MG^#Vo+Fjsz>dVXE}odfa>zL@hot zqW;m5&^NiJS?UaSzwckC;|LuIqG@cNX3zfGc^T`~V8*N^2W`PjQHVVFa6; zx@N0U=tK@kNj6zjQxm`aK}rRHafu`B3bW!JdS&t!@II)^yFPN_6*~P z(m9xEMVas^XR`5P#E3-5SuIvW1hOLL-h4$7X*?M!_BhKT!Jv^ zBoz)B)s-w6kSpB-#GK!MRhg|KE2&8L4l&(!_9otl%9UEK&;*VWz#)zM1T}a=KE=h7 zR{&H|oKro|Iuer+B33ht_b($fQGn~ ze7%D+nY8e*U5SM2{>`rMsHRddcp-q{G&a@?(qpL}OC6hEBv|C#8x2V&(!CQ8pL5-{ z(=T(*4_Mi|KYryzlb_E%Yq|FQ0!qjDn?F+Nc@|-F;A`}J+e8YJu`F*35J0?-Y*zF! z&Z#x?NzepVCbjI+#B9rlzooDP%S?&nPtyk?;g&HkmxeMIfAICKDGuK(zwcFmtPgAb zY3p(COK!*t<@1j#itnPyix&{>$?)u{KV8<>7lc+W@OkzrVHxQF~Le zkY+VFzUmv?B1u1~6JB8jQ+}{4#~g@Fe%(XwFI^a+&vpTr3X5UNVR8k@iiu5Bsi1KJ zNbgH6As`IiKHdMO!iMlLB9qQ|E)TmI#v`bgg|yraInQjg)Fl_BN8d+`CVRVbP=b&W z{FScDFdin}_oW&tiA)!=jpU$a&9l&`r|Zuj&KHL=lOtJK;irAxH5lwE7FlM&lN2!Y z?N#xg>j5{bfx+sgn4n_>dD}fabKZ8f#BWsfp2}by;o$y8TB`V1Aaqf7?xh@pmHzDi zsl73a#opi8t*wZvv@Poo6kLVQBZcwyxB4}ggNzUBl+_g>Ujv-?h#`fL&YZ{Fw;M7O zT>+pvoE9sv(|i)v#hi=8pi!VpDKiBUq{i<2)p1#aZuOGtXQ{V4HLnnI2d2GN6on#2 z)1??Ull=|&fK?v~mQgf14b1Y=l*$ZeT-B=H&8YWck0|CoF`XkXj;~?9bjT*#2K#%p z)mLjcNxB6Lm0pme8R*S=1dBstCfo0B$G%b$N9YT!gtHTkB>jGk}I=vBb#7te?-fY3a;Bc1^_8&O&{6xSqv#UZ1bELLea9nkKQK@Vt(4U1!^y@;Dj-6*KUA;N38VJr|9u-a_{_s|&8%QVT8o}im zl^n0=naoGAnJjijT$+b42ve{4f6i6=?BdNycW2?a^B_Pyk9G;MrB!$7QxS;KeXMQ) z=*A9jo&ox_(W_GaO|Uf{gV&TCYyLStlXy6Ps+q#+l$d0llxrn2QJ2nGZIGM^D&Akm zC(KRc1`^~Fm_^llsqt})!ES?ry*vN;LAHJ_L7YlSsK-*FP z1azW_hSJEHNPN67D_;3XQ187{dm8HAybphhW`E>2p7JmcQrad~m-odOc1WdT8Bykb zzbX=SgnqN{fSn28L7b2*??_F9W zzPjL(H;)}>6`%aMjER8Rm{-!4jT2J~4NJ&5ZukT}ycL}kXNXN3Y&ITJ5&|gFAHqpWMzHxzS>u_!(Xfa%#=qed*g424?nWnSaES$UH4j>@9=qOvU-&Gzad@vW zt6bC<==Ew6SMSDFe!zCC9$IcFW!NbMrchy8#F8LUv?YQ?1lPCa2hehM8>pjDm>NJ- zWo#Gc2j6hoxRYdN0oWgqmva+|FzpYV%-dYtY@{>=)r|Ufst$=8ijC=#``=%c*OOTG zJ+~7WKB#lKC$(W6>?mlHIG7=sIbk?D0Tu&(pA7FAC)HRFGVd$lMfZB%GJX!?;3%fs zDP@4OQ`4!BjJpp82-nMfwtT%*QUI>$dVV7!TcV6R%001YY|3x8guMy^V>1jy*k==5 zIZB{#TcK6IFXU}|VfIJq20&7ijrO^(9pRBX0wGli(V2`)TG62Pep#gQU(o{q!AF!n zfG2w>o6dm2v8=qr*Cv71&A)w?eV8j%;6ts$wQ`q}`);mf_mE&4pQgW5v2T(SpJy5* zxAr12$Lh=7V+0}6FI#Wy%3*Okr`gaI`R$HECU2`l3da%TO5CmoSAS=fs-kVwXV=#; zI&TlvhBsL=T#lTgxD}8-?0n&4HvEYzrx>=ZcYFlPdw&>(E`^_rPhMd$PIz+|98bc$ zGU3&Z+OK)5Sa7Gt7jN3&?ty7HJTMi~-(OcrmYSmmqjVyk3=TUjOgX*#OEQ=M%ShhN zg5&;bvEYU%$(3~pa!R$r+e}fAl--}`HvsPXFHC{XnazjBzz%0b<|6fBL~tO816aoJ z=~t0UN*OwW#7M+k9=@UC_3HibwNSvEi!WQ1OX_~=fh_Gwr=wy-Qf&Vxutf3!^}O^C z8uC`a5)&RAAx}$FoGMu0a)SlcP{bDSjQuC7K(5D>^{DQ*5A-IP3YD3`<+lr7zD0lD zFaL>M`u%XCw3oJXhV=v`$8L`Ejz}vke zlcrHGS0zcl>eR71?{sH7G+lDyzYumm6tE2!JL5VRh2HpvI~;r7)Zhu-OZn4{jXM5O z+?PtuwHw^tE!2(wsB-m#WT6f;-P-h&!ej!4lhw9zV`Z6Ahp4}G`TWOpT#d?P2d-mf z6aJUyVFDa?lBq-7_4q!^e>>nKsN7Jo89JW+{^}>4=xa&=)xY0Inv&f{y$a^2+~J9* z@tRtz*~VTqGaIXf3eC2iz__NMJ*7FWg;XWw4q`Y(JTc`jWxnZm>m*pSDX5s$Fs*^E z17pQoJm())spjsxY`{v_vn^LOE-X);t%Ujq)K_WZkIvf?jT#EWBRALK2fuh!aZ#nQ zE?WU1*xPBEt}^qHjP{C7D#7sSbb`iq)}Eo%y5VZJL8T0=r28g^G<;NdPsV1eLbE-D z;pU9MexA}?5AQsOsg})&TYRaC>pk8xeD= ze;Qp)=P+Anu&3P#a>vqS?@QVte0Y5$q2PQ0E2AK|{C$3DsM#I9>u=v8{1Wjwya^q$ zfkMM^&jR3wGO`pKU-%SBBo1{lRTtZd{xpzm_RXXVF1tGU(Vn9n>8f?JbL@!Sj@<3A zdN0F<0wGR*@)_r7egdEJ5)JC~eli?(+IpE&5PxXNZ^>9s-)T_+mFO}LdUIVVz;*PW zI+k)p4TaG*#=k!)cuyu%1jHdi-^QISi{T>~zd!QDPaRbP_vbL-lxqtl!GLDRlG*BJ zL}ycw^1;-WXl()_hn#LGfV9;DZiZ(N_=eMhe-23bwO(hP*vt$f|h>ep|6ekvk2ymq4B?#OWPVhniM$p z12slP@7CHn{>QTFy2FFG~e)HN(nRuFO+Y0`UHIYV41S*zSywf zNs)mnKN!!>E(u~hU1IB}B+E}O z9%g;zV`t+$hmf)B_4iq=L?;+88Uzjtfjj|j|8ULr^Xompjc;l|;gS?S&l2d7`1FA;X7P=wj$ ziAd1vI-QZ9ecMFqEnYV;mj{m&k8%^j1XtierY z=~z9eiEauig-E@(5tLOq@dzBd1Z8xWr_C4O`En>KwBnb0i)8I$*9`s`;^P2Ose?d` zlGSvj9sJtm1M|3m&r=<3n>}raSS`OdAEKMJie^h)I0r*yfc@WWEmd zH2V$8xuzo5_WUSNdQ~}NsQ*`>3)qon`wz!R#9y=qjhBWOQOOS2Z&ykCqL0n&Nbz_@ zTMTAwi6Y3fEc%pj2;lP9^s?sxT|dNfz5SGZnlwF$)QYVH*J};>2PI*d%|0BHE0DEC zMsGly%KGt*lP?-tiN^rCTI*$OYVpvA+Z8YGjyI@%iM&|;)EM5*C~r|D%UHDQI{z-} ziL%KD7JU<{%u%1Wq&1se8R)V#-aS*T>uO#|DI};)H?{_d+dd98Fs8R#XG%4 z5B~C_7t)=h4a&nyt1?s2XM@?~7xsRULfm|TmHoT*%Tod!n!Y;xry!k{_Yt{;v=ZA8oq$2sBObGpaQC}7YN=^-r>zXVcHI&i# zZzclgA2`@}roVh?H-g6CV@hhz-QsE0S-OV50+Y4}yGy1f#w??RSTpkOvvnU_JuIIY z{@KC(pFJ)e^FuoQq>&oi5<9ci;*PsSZ4mUjI}4-6ISl@#22UF4UPtSa=^_>`6;!Q2 zb&~Q&W9Z8y1OHj`&Cu#lA_yMhbABE-DyUmgk?HuVq8M8jZkc<1tJHKAdh$RL9EKnxPzUL!l;yRrj2Nt(E*I zyULQq-?6DGv8fr#Nb(6(lf2Dp`}8J{?(_)3DB^29Kc%2vQoF69J|2tptQziw)<^=x z_pA&#FS`kcaX_aqg;_K3nNx@KxTBK43d~txPbXebh)mZ6KI3I^vUcF3L#+BnxJG~SRk3kQkQCbs^T(^zrkub=OZ8fK(UxfX6go> z{d@O>%BRCWevLNYSo|&t!&+A{%l_z+%Oy!hAxYNjz^~tF-Jzeul~a!6n|m7f-kt$g z?hu3=KFv$;hG*mtYEyaGX_Io9^yJ^hTpMQ+Tcn@}snv3Nt^4K^D*VlN%EZO}2Vkym zTCPcxV#X`d9`Kqfk2Tr~rDGc}Z{@B}IxZpQR^f z5^l91=VreZqnh15|3cH)Mw{dEhMe*WNr!o&9o{RkZ-;lh^99tJ^~AnG`WVLa)P)1# z)a5K%nVa^Ui0^|2-^`|r7_e^(r&&13h!?b$-GEf4Z_EBuG?Nx>kYpY!61tS3?~F?3 z6ogS6a)fKwS!I}H69lgUR0qB(e}hS$>D$YA9UM0-~~b__Xh9bcX<9G-+!0>&x-0tZsnR_SsKb$1EAV!hL|f z$%lo%Pn*xpXc3}IBSrIBA7?@TEyCMx-RWKSj(8z%dgb!qkQL*|{v|Q=^~U!FPj(ya z`+D)nICcD2JGtV&*Rw)CdjRF{Y_CXQ$dAhD9t580arYOUs+qZsrm)7f;+JvNR|YZd z3j1W$GR76S2t}5)-9GN8a2abrQME1`!6)$HG2ho;j)`OESLa2DW~K5EfF_jr;O6Ux zjL@wV8+b-UW=qdMZmR?r0ORIO*PR0XB9NOdfp9~_Q}ola z!eQO?!I@jFxUR>kZrglMZ3J3f+|DXaWX=4KwPD=!#q(^yT?p@gj(yItMbo^cIn2e{ z@_n<-C$_97%OxWEthpbbIvpn-eNOOyMF0CsDw7ndl_$y;KE}FB#%6TS^ltf`$5HCeR8?)I=%A?4Dm9a$sA_GoM~Cr2rB6#)mf$-*G;r7Kt_5%K7%;+JmU7j4{!W+M|bBp=W4Ml}i?)_PxTp%}|8 zuW_hdXgNq!z~`z}`qiyNh8~9#rG5>aKK}L5|Mpc)a?m<>bZCk?)~a~?ulC6Vp6;h% zH3ZmU`KFB}JeIkqH5Y>{uHeh` z{d69Qk3HXhOT^u5e|W@>(Xkdzx_?4I2ByPWX=di@=GQsNU42;dsO-_&Ulnyn?eF)r zqeuP{st9o7t+zzR52_%ZYBvo_HeOgx;x4@Sy*#%jnA0$qeJseaWRMyKdGq)!_@CP6bKYrD~5Rr2pH0SJD<|6`s$?6<3V116b@cp=l&xtd9d) zyj|W>-$UBR%8%DC@JVnl^)=b=u$1&pkVKKo2Z_G>pUCKL?>C8}@prxyyX?5@q7U6Y z;w@7xI@)*t@F%~+>PN#Hw}g-5Tx>3j5IR3aOLtro%F2=xw>X>Ik&vv7;=A{C4|+eC z7b%HJb2*dBVQL%S)v>G1s0F>pRb=}Q0i4bZN?{hKj6BM1_?^}pjqE|LCausz#XVy)Vn&=&2tKx57-Eq_~_B&t_4*tArAd4^j z*-np&01eXZMjQ`wY+4FFNF`)A*7=~`^)jEnAfX;wo725E5aJ~DV!Y5STLdd_S$H|p z-hM=(u$;)nRN-aj)f#(n;@B5;z?b|-_g>01A$Z-?lEk{j!4-xHY(}+eQ^mC@19{Hb#-A$oBDi~q zCh2gC6`0x!pn7(OZr=cR9&#v=*%tX2O3 z*XLEo+S?Jnccv`cee;~Xk2b@R*?aeD>F6yDAuj3RuTrt;=0)H4T61yoh90>IpcK$O z$a7)6$N`?ExxD>|&*B!MKwgrI(6gqzvf5wj#~XzlkLi4#wvJD2L$;flfX#uex*zjq z*+2MOqjp?0iXwK2!13hJWK8rQcb~veI=6rI*sf)0!6@BEr$E12#C53EbBy zHUeqNL7^JC?Gr?vd~Q2~ez&g8pBNLlfTM_>O7B!ev6xE;-KA=i_}X@Hxk15|S$2Ld zHVX)}Zj-f~CZ!tHu1yZ%}u!U7nG52=NE% zEjF}>UriDb@CI1A`I!;q`7zs_$iE2sE&t=ps>WSQTB~y84my*mWvqUNxs$CA-7)bP z8lY~gzGQk-!*Y7H$bKe~phCpBo%PeRjEaOlr+fi9q5iUJ z_!L4!m9jd2{%w2D9bxZ??HvYKdKGLUlp}8nLtQFs9g5zx_+%Mqrajc%E%yrrq3F5; z?hJdKafok2fdo&$kZ^TJPn(6ahOUgheKl)fPdxSg?@Cz6^Wi`Tw(3-me|*o+h?Byf z;dvSQykBIppX7+T8mpH9Lz)BHj{ZI#QfLI~Zb?m9h4!Qr7e~iHAuZ9BuDa`nfT@~I z-_la=kNoGS@^kx6g>yo=qay{y%k`g4=&$y@UFoV#-;7LCm-f<+-WK!rq>%2`=F7_G zj@4Zuw?9cW9}#>W;qF(&j88Xr=uyn-2g_dY82e7YJW&fokp0ZR*Y|ySvc*`6&)E`} z*1nz+dFWehnT=Pv91lQ@(bF>{&Yyn2@$b2~hXQVF`C!OvE7b+~>TB%Zb8@>Anf7B7 zxlB=D98QxCo!e0W{|Cskm zWbvdX%BfeqDER>FLiM8>efZJy^3gM``F4m)K;zcLCh_NfO$&TE9GC}rc6u-APq765 zI?F>I<|+k;9z;9`PcYV)Qua&(WLfK~HR^{}1ZW-NtXr$)iBL5k1Z}A-+L?l+vuplFU29^l{OB3)*vVc#teGh(m=l1_?%Z6R zLv4zkVXiS-5XEmqe{Z`u7iD3f&mUZ0J6laBKC=U-**>sFrm(yvGHp9Bx6h?!pd3L* zLdY&ODbI=)+07n)#GIVTtQT5bSH=*N%?BTOF19+}<8e)enoaTMxzcq8q60)Ai0Un4i$y|Lm8Q%X&jh< z8X5EjgGQ${LlG{>i7Vr-hY~rNpetTeHC5%cvW@OfMD7$do+# zyLF)h26$Io@WBX#$hy}4mICeZ`ZNFeVXVGKQ9@I0W6`gnmRt?pctn;naQxoJj5r+l z$b}Khh7oM7lOPfiLKvwL$-dD1}!Og?{X= zF%Oshimlh0FU^Xnx{R1q)3rBQDWv33;|V^roQcjoOuh0!<*mi7j~*hZ9sz8QBf)ZI z>Ae0WfHe8mI`NA6Pf>~I++v2PsMDc_tG97h*uJyR&Nm?lAf#hj)^6R zyWKr)nPJ$1jPfcSXOoo)1Rct-pg#H7dh-svmR*N>(DTf0Bz`sb?vM_@OT~{ZKdd9F zd|+v$^`6QJiwn~yJRxOlI&^#+xF)Y2ws>4m6ma0R>7yut>EY@hzxh3loSE6~DW}== zL$K`9U<6eYKVTPOLG1^!WWTZmvM0)0nn=PAnr}@vMC$&6J^RNE%Y2iTH{#(9w4M8M zyclPp;5JWKgqOY$ERUAoP{IdFlEk=euB~9SjM#yBvNHqtLw?`1|HMNCcOXi_*z%vL zjZar@4FYU?|GR0mlTZ9Tf7dy(?#2ET-M{DHW}J2=k~hvosrwgX7-_UQ^?LMsA2Uyw z{zK(q&yAr}WsuFSd*F|W-eCnD#lhS&PQdgJ)fT*!K%xddQER?G0P0;15;1zya@V3a zp1ZF&@5vw0R5vN~D=7~r;G^IvJp_Rjef5;e&U^2{^(%ok!WBo>p+Rw_u?1~tlva&; zKV`@)p@#N)sXZ_*Ttc@+Ds>&_ZK~XT5a@3J^Yxx9RKrxPfzSlNL-;$ z2Y*N>Az;ApYPj&%5zJd~Fk(QOf8z%X5ZJ2cd4t;jIc-p4Ggf$kRGV1_O>?-`Jo-X% z{p(ZAqLOo^53uIx2U9_Eo=Fzr^k5>qB|585b{f_WewPu%h>E#v0+qYNL(wcp&wXobKu@Wy+v zX9SVwO1|d19=r6Q-BVMr>jqPL>5*@-rYbZ~#$*Fj14cX9D}JGqZQ;WLypTYvw>W=6 z$Q7z8#6$p+xr|$E_-L3Xh90U{spA(Qh(|oBWX}}1+5=h0*Mv*1wVt_kMB;r7+p!+Z zTP;Xm+t`&k;-u)&h^@Eg3ke|RVNN1Kwue-_T*O0@Syh;Go4EFo=g?34!P!ur)MS(< z(GaOCwjhf;c{x5IpY>Ik?J0LkA&I)--)0jWZl*#D*}p4Sg;imbJh$w^zdc4hO#5Y2 zP-tC_%13CUASC&2_QGR&!(Zh}Z!%1vCgA8J-+?jyqbjFIP+#H6IAHOm-`}|1WYjB7 zu<7Vt2TIrVwqt~0SPCKnOVijbpZIpQydnoMwe3FbratoRh{BoFIeB#qyYc6qNV*dn0pw}YKw19JXh&G*8#%>6w$zKe79e`F#t{6qu$becejAb z%uIEX<2YJ*e{OTrjJdzXrHVa7d-YwS_RfHa2!|p*Aka+x9aryu@j=Yl@3b55dk4e+ zD~N^yceBs$=vGGgE$i-ikHm!za)incX2{F`hK~a3>EC|F14u@*-;lbU4PWPynnx{{ z^b%?uDoYT74JDX!mN*z;jjo`imiwJw$A^gBW*HpUz0vaI_8A$T1@v+EP05{s_3~Z! zf#h!$!%W&|T%FHF&}7`ocZ_$9-88=jNe0on3n06PY2_Blc)`dE+u}Pe>C|+79m%|Mcb;z zO-pUrm5f=`W4iT30g_{%DK3~9*R~AW$$u)~K1u5XNN>HcSODt(;C?S<7J2j z-qf_|>Zy9v*;GZg3m4!BC$VE{3jGN+)?MKFJfq#_Kwbr|61yx(pu4}uuD9Hibg^U0 zA*Mb$vsa`#UG|;iW}1#82oGtQb(2luP4JVL$xIiL?|PDOArrZ67rw`#)xCQ*F07u&>R^v|jguS6C*)tq&_*VY(ojmHieK{(lC3-OVdye+( z64=Vr2uNw=`Wf%L&U%DnO^};YpgZkH%g(IsnjPD9>(T=4XnkhtSY8l^z5R_xlKDA4 zG0g$acF~)Qua>OG^#G>sZ-+{)l%*>{^n(;PhI_qCTlw%L_SWa?sM9-@1 z-@S@yh~;|)@!N!-*P)#vvsN^p9&Sa?r9i#_dxjU950IO86xzrpV%bhBuH}#;=CBeU z2ORt2G28IkNecPgvH(_BmKp8jE=M!LxjNZX?sdaJ&q&KcZ=%a46TbOrc~4 zy}JJxvudtTor=FpgLDO|IIkVKx_^*u5~927*DHl!_3Y|pMmAF3{cB4{V?FRdJhi9H z58X#@_IAMB@J2*(#L(@t#~+yrMrfF|sS)TiJo+=99~0q#!yS`)mv@E^org+rxqDS^ zVM}lx!hqFGG^^?aIHz%1q?@%)$nc#%%ABy`?Eur<96A^DW>Zr?cF#cs#sjp5PP?q9 z+-T){E_Tc(SR@g38sJ;F2)O~C9_6^nRiDw}Bxl&PSpbI|9i{&e)%mVTl8V#bw-X~b z7p@Mg_hiwv_|OF-a$~+8k)W*Tkc^OA(x?DZ0>ggGR5OGnp29vir!`~>ex5$JwyAX* zOPV4#z&$aS$^!2zwEf}$)kABTdZtY@lBK#>wLAOaUBjH>pO2+J|IL4S;!u6jN1y== ztStpAQpJKpgfX7XGJXAjis{XQrW(UyGdq>#N#2el^{}^9W79jj9{P3~cZ ztDu1m6ctk1$U(`#4!IzZKVLDuh1pD{ryF0dq=wgcxA`^tl3$(m-;jx0qtjU88Tsl(9kSVI&sUFUJUAvprLpPK=M~DP zVRuuH@!*G?YR8&w6ES9@%brtJGoKZF{UlNDAI&|-)}v9Tqh1K|sp{jqr`Kj18|}5% zrf-uP9I3ol@cl1*gx^ldTB9#zmhX8vo6I`nhK^ytOfH@B`F5`ftN?p^h4!?05o|qc zT5%bz#3fAhsun zNxXx0G(oVz0)-uz;iLpkdwIglL-I9%FXK~cJw->aE3GS7sm$T^`` zab|^vEvnlVghgq73ynEhlb081zPpc$_hDPA#k6+)Zs6{$sXPCei&*bbh6W9a70Y1$UqoI!?7YhL zQ>CCPj0C85 z%m(lPo>aEFQ~1lOegl7k;iF#EZR|0-W>?5QzmR~HM8thY%}xkhZ2SrF1v1|$a^Pku z|5_^o*%5Q7jsuN&$BBbRBrg~Bi`dfxczxh(3Z*XNc60irY6@Bb@CuH~MDn2QT)e!FNyZ39YY!n;@3TydC%AX&D@)i?ut3><&!Pqz;BN z5>(_EL8d--%UV6WPasZA6UMv5w76OaIx!6nsT!?5x%fU9;I*i2M)2(Hh1>m>Er6I!NSQ<=Wk#%Yq^8Wx@gvLn(f{@9I-!@H8FHRNIGPirgvwBgm+D1@OILQs&Tsk}XWco)ByDn`X_KbyV@Uc7wVtEwp z0;Z2>Ee0vsx7Xrr$ot*sRc}IM7=Ncb1wc<~UUbLoy7t6E5xCvqZ^gDY~B6_|yo zlXfZ!&M_HoRNsr{oS|Eiu*>1}#E5<>xlN%np)P9wu!NP1SULH=+&Fkv3gC7wCkvk@ zf<;IIK*rP+{0aQzOM*|%GA)E5lObvLG*STfpSpOvwLQ;EZ5CcKUj_%Jw#%kp*)w$-xU5G_ptGJACRp| zX?Ko3YKUo1p`((_ z)w{*{dq;3&5W+VfhYASAq%CqSMZiunxsIhifH%NnO$-@x(14K>k4=x|KAta{``bb@ z4%?HE-|zMk?4iA2yrgVrRQ2SzN)GJd~H`5pN6Xsbg3bR07}WcEHW4Ujtt zul3+4@QB75x+$I`m0J-G@lA{G0!PAga?~MR#VO}QL{(y}Mjv>nz0=Sgo{muX@9A_k zL)jzrHGS#*pG9Uv1K%5*LU#~<#(oAy#dsmK`+;NJhR8i1(}~H*aPJ3P{kx^K0S4E7 zj#AM+uRKgRR;!>%3**L~fEEqPYzPBrVHE*C8~%Bs9sKbw!KLdD-bF*S+>eS`G@j;_ zZI*q7u&W$h$p70kgQ$nG^)T}p5?JOY0p+s&DsR8b`@5bf&{%pr#%24ORb}E0-^k2K zTMlze0$#0Ag{zQegq(OzpqQ!&P5V0`16RiH*Obz%(Z;8pYELzAt5cuJ?sM-|{M@q? zhAm`BfSLTHDMtoSndPduH6D=JJR`};5m@Ylxv-%jN3*BHS5~DjAwKMdO6pVNDVmrH zs5(Fg?K@o;f!G}b&Y#Nh#%A{d6)p)EfKS5&F5bCK5LrAF)o7?_xk_c`s9|34`SyWV zdUEJt|Baz`{cP!k@*m65zMxk^8=N=i3twhrOCkkJx73|61LZ7-`yRn}6rkGG<7fZU z&b4`dX1P*Y4?E7J{%Y~H@iI!g_iO0V)f&HN3C~^;T*BX2*LG4aX&sH?OHS~ zEN-v$`G#9udIv*!rOLVoP#Kvm^zc_}N!s}lvSLRHh{o|4Vma*mTROov1x46X?rK1z}mLUzyJ?x%p}$J$2=wls=;C^n-!)0 ziJL3}m`kPm10ZdNqAgykWp!mjP8PS`K=VwB-)%;k^>- z%*DkQ{jV0_*}}OPm7R9ew8;Ucn=`DPNvyVy7_joS%p=5bWrH7fLOX$1OJFc>S$=Qz#eWM6~7ap}fvrDWuboJ;u5Hk74q<9qv_W^x z0W^#9I0Vr1Uej`r_gQ4~V))v!ca3gBQvrb!wt8&f$KvSrm%Dyy1k2_cLaXkcYyefi zh}vSoa|^#@?w2>kdA|K}vhL1%i8rks^(8TVQR}raeWz`&Tdlo$kMvWFiuAi?>n7yk z(A?pe)n4qpnSER(1N_WFd=~Cm7TnK zFMCFU7WRR!r8i5)#dv6FZ~nN-aE>lD5fRzHq3($1M(&@^+{dsyvZgg2vFR~Ng!8XW zt=4SbmuDmCy6NF&Sz4dS>0h_QJb1elCVxu?p*^sEG!M?my z&WQAbU!0ZVVDO)(c8NUi6VX#n#z7gCuE&rMuY`|sFjlO?y4Vu@NcUy1=xVPx381>! zE4vP>{mev>1&T(Y?*5yct*`LA6h1ee3Q5z9A|71EcJk+r22N381nJvp%{<)9It_{e4Iv{P=+;RQA z;Evh#2YhuNYLxb?9eBq*@2(|7*xS4_RZBB{4Z)mhqxOqxulDqpX=rDd>vkN7d(6eW zeD2e`K;0O5A27eXMxxX`!Ou2aoV{B29h3#?8dlxtKYwTQ3X2irtQ)93=W&lDh(=-z z2|OCwonhBBYEbiU>FN71Uz=6e;a*Ipq@3YhNDz#x5V{6jGfjo=Y;} zb@Z()*gm@^8jx>70r`gr8+s&LE4pf56e%5P)fL4dkC4#)|M~yI pR+A?u;-jE_&c**}Em!*i&&;Am?mC$c=hUQeSzFj%t1Zan}1 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/import.png b/doc/salome/gui/GEOM/pics/import.png new file mode 100755 index 0000000000000000000000000000000000000000..8039e55a36902dda3d7c63d25633693add4508a7 GIT binary patch literal 15937 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/line.png b/doc/salome/gui/GEOM/pics/line.png new file mode 100755 index 0000000000000000000000000000000000000000..3c931a1e9a4f2270e5d79b3ec2f3d2762eaf8911 GIT binary patch literal 10742 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/lines.png b/doc/salome/gui/GEOM/pics/lines.png new file mode 100755 index 0000000000000000000000000000000000000000..de12c1122618c3e63797d3b8df0932ed7991a3f8 GIT binary patch literal 2403 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/measures1.png b/doc/salome/gui/GEOM/pics/measures1.png new file mode 100755 index 0000000000000000000000000000000000000000..6d5d698b4ef83462a01fde543b1f0deb367d696c GIT binary patch literal 10455 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/measures10.png b/doc/salome/gui/GEOM/pics/measures10.png new file mode 100755 index 0000000000000000000000000000000000000000..33023cc49af841d9fec69d0c50c0b0ac4624c28e GIT binary patch literal 14601 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 T%{1_eBS=9;Rl5AGN$~#y693AM literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/measures3.png b/doc/salome/gui/GEOM/pics/measures3.png new file mode 100755 index 0000000000000000000000000000000000000000..9a55aad4afbc44ba5e49931cdc14584185f9edbe GIT binary patch literal 14450 zcmb_@byQVvy8i)`7EnMMM7j|q4k;}S!lAoCx*HS_B&9n93F+<>kp}7RmhOi8@|`AjJHZp`L{=)u7yw-{6j(S{_VO+GrL6eS@wwv=S%v_RSYRu{)xfO?lhet#4 z;jSGpC2TLL{@i-5QL=tas?L7x_x7n8<8$lzMwB

    }VrmFm6ZKSbZ#OZ!HPYX`H5%2cL57{C?gj(~S{ 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

    Fb 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/measures5.png b/doc/salome/gui/GEOM/pics/measures5.png new file mode 100755 index 0000000000000000000000000000000000000000..a323426e60197e1a2c0d314c054ba611a1e47e21 GIT binary patch literal 14641 zcmb8WbzGF+yDmI{Ac}y9grp874T5wkh)79GcXxLPN=k!tDAJNccQ*`5Gjw-144lRH zclNvYen0!{v(F#H=b3q8t!Kq`U)Oct1b>v3z3gEzkrwv=cg}$C?G$Rw!n9AjB9AP;ZOY)j6>HX;4U?nAZ1|jyQF_n7 z>+;wpe4ZG1UN-Rf z)y@x|K^fZflAY;oC))i`_-x?HNFqmyK&n%vUsRn~ld<@(Cl4QSmLMF^n3`=r((vG0 z*kXvj!};DkO;5pw*)Ezv6$6o=4bWRMG=6DP=1;#dU;bvw*~rHFRxXv-pQc-XVR^%H z+#bC=NXfb7Gi?RctDq9&Cu9ly`~CgB)clO3bu+ReB9NArmM>qvJhtqie)*gFHU33*X+$7^A7c#I8`_W{cS-i&!# zl<<;WIISl0_g-C4x7#QtZib{G<_{GtI=S>^>30}AQx!ROOP%-7(e;vOv(5bU9)BFp zaNgn5wC|z0J|33)!|cP9Ldv1;9!Qlv_sS!8rtrDIi2)% z9uQ4V2>2{NFVge-BfqXb-=kL%jdHL{x{ZmF7o%I9`ZeYJ&nkz>WVAa<1xa~o8RL9? zAvZkbapt4>k^1HH$B9fIw!(a7ns?F6bVcHZobsP=|6xYftkPxt%a=D1eSfvx z&YGx^?uP9IDLio(DHO6xs=&6q3;2Ed3FoEGu)9mM&Hh&2l3J><^XMQ+ zcdrr#_GbGxhI4pr_aU#%M{E&X^S#;}aL6R8Egu!P2=*iCwsy9ohzy_p^-XuO$e9F6 zZv;HRs?Q8@d4H3ei`ShgHEiy>ySPqHmy=9fB<^w>cJFa4x!=wN&BQ=TbbZxVG46cP zFe#14&(s2$NrjDW{D{n^SJfk?7=l+guGmdS0;l;-4O9e#eMK{cm=rw-{`iyRBX$v<%ipYiW0ZVugXF_WvVn0sJ@c8b8X@HRzbHK5>g$v%Z^4g9 z#do(2FvJeQ_Ewmx#PC%w#>A_gFY3%-jlP)Gg0(Fn#qK@NcP4oA`^EC|M5+4QJ2;@C zLbI@a{@`}kzb%TiKR{2{Wuk{CrlmQsapC-6iH8iQtc)WV6E{qI*`Kg1`^ zm0Wx>*iK9fEa5j!n|q3%?v86Q%J+@b{u!L<9M^_5?Ok!&Od`7#s*jH=zA~%X!{#+9 zYueqxs)vF%1~GCDNM{yDxqpl>@rx1RIrZ_Hg@nDrqX zH@Omy@l7U>!*tiD2GE10xs}i_m6~6Xv@9(_tygS zRS2Ey$ThyFD&`F8mJ)*r0kNXHyL&!D7+yVAaSt8uX{?8S}I9yHM3bEs?ijbvj zdfbJLYYCY@*|6gM?*6Ea4fEkcJ{yEDqlbe*Tl2i72;!AsvR`%f1>EtsOY|3++lAPy z1_`UDU2KmYwLRzJ`hGU&lYS<2%@~#mbv5~uDOPzw>T|C$OIaE#y3s9oOjUSA9sb>I zSEjFIMd;>aT*u7mWDe!r06xwc5;7m=BS)LRvqQ#pqmbLE*m9D@l{?5EN=cPJuyc(! zF}CBLcI>0}=Ao3ard(Z-i|&KMx3*%TP=wQ25{Y9yTscP^_O2e58;>~KC@5}(^6lP2 zCYpSNchn=$=L2txe$Jf0(IWR3NFO!$p!(G9yhHWRN44Ew!_CEafLZW6A+E7~RSMM) z27jVhSE-g1XPS7nkRvtN_4>`FslG&v(L}|-3cJS{6%-~kQE>2YZr0)TT!pV8pFe+Iv#NXfBL#cC|MzrQf{9`s_0n3JOch5hf-Yf_%lv+h z-6i~tgeMJjf8@5U`dx665Ffv;P4xZy5=7;TJ$A>M2Pt$J zHXkbTU-Y}$p=EE(r^E2wPIX{C z>`=^tCxa7R+H}?C)RU9WLO1rfq+FJ|!>0~bhHD#&&Zjl37!;{hQEIR?`@hC7Hhc@a zFU1Sb;FH1qDX#-Lc=fh}{w%b>q!u~>j z$MuhdOrCk?J1ZModlIq-yVrF+-52+jTm9TlSHj4yt%d%0=`bC>4viK2dlRGS7ODsq>oA-JQwl}4e8^e}a^FL(Ox zdhei1+D`Xej%5dlJ`Gar(hU)CJ-L-aUIAII=C9}oOgh!-pM?kFD=@p@3`cn-B@NiD zTvi?lR_ING6htKOvkKzVe<>a2!x)gP#7-^{0IFeM&xZ?}*g`u={6FCC}XgMtWwIkK6 z4#QqrqqRF;J5kE>2q;nCIjT^bw&=a8u0G5AwX==%gpQJENf=+UpuRPKOstUlZNy59 zljp4MBgr}4*%_E8MFp@vqMDCR0 z9}Jdo18Yt$3B|?=`+mH=FDWIJsa|33x$hYd-6DMl35eoHSLJ>c-QE4Z^4c+>xJin> zoRx6YIrCi@n@o(d!^5g3ePdNJ9Da#go)4)~tTYS^y;g`_Vmmv#)xEJ7S>9AEDyiz@ z3mbuacr(-?Xgzd^JYEm>nr=8x4AS{-d!Y(Hn7%_O8gr17BT$w&mVL>!n zph_noK-R{lX+Xzk&h&Q*NeczfDV7G&hivHRr%{B3)`#6_GdaOfCva{cWE%PPy&oEu`WAk8WdRb7llT830n{#d^Wbb?CRcQeWn^^#ZR9hzU-&4&$&CFA;MQt^tPCh zWGMTBhSTa}s`)|-P!|5=SK&u(Ha;cZ!zj+XeGP`DX1kN?mRI?Gn}39|xduoG=bX*J zQ^c;7z$~D8&OE@wqfY`IYL_G6>$l!pYxDYpix(BD9aBKG;$e+~=_thSk)&t;p^T`G z8VZ$30 z$mj-}`0Nlu)y(7ZmPy6|T>W8|Nr-6Z^Fw1iJe|Jej>%gJKCTFby7VhfTUkLFIvg*}RJQk}S&}MhSq0mO9=b_9H z9BJu5j+%dUt`vR#_;VGbXB&7)$IX!k!<>>*at6!YQPWQ2S_HL%YfgnnLM&1qv)fHU znw}4hOaCzg$atgI*G;*6>c0NL?NseXzd8z7UT6yp-XiQOnyKsc;up7K<=}{kjEuCm zfRiGLqC%yV44>xZ*33Rp((OH?g&!#zLPIqUdz&?dc)H*RL z(#o}%SLnkg6Anfm@j0%~Z`#Ud&gXW&q?Jx-PLdlNDl?K=9Zc>630oyJib<#c4OVAB?K%91J4%Voe(Y zy9E13y0V`T5p{Kjk-CBHH)9RsL^dJA5zp8???nin5{D&oI)CMOdg~qheudk0f8O3K zM-!FgTAekGkDojP?PtNcBbW&Cud^Z7#7vgy| zXA?5xtv!(RdI@3Eggy`Y$5?d(sB4;4e}B#^85GB zrD2Nux~D0V(uo3JLGZKWB89E>JC9O2Ezqj`#gg-5BJ;tM_FAmQ@%J0oKJmWBabhcd+_%4j}U_?>wqE-qD z^+iqU=R6&PLcKryH-`+!V1_8C%t4)=u-LX0 z9|Kgps6&N3w5exC_bx1Z>Ls7~UCN@f+AEE?L!mdh3K-=a zhN&qn*UPOsSffrX8dc8Z4Ogds$^(LwNQAK0{mxbyU2j`|@<=qgNi?rnSO2a3i0q+C zjkt{5PapkM*z_k~ixJnI5xS@)^uW}FtysMxzk6j3%Y5x655uecZg~fJ+6YUTrlwPa zmHfEt(_tI2F=p{VaWT*4EfjKLhFOAs^u5>X_2kNK)7aywOL<+4zqG&`tiqNuLTmAU znd6UF{tEu#ne=VCX z;>$BR;b7pyER-%up2N-gw2KrQ#oK)@jx}IqDa`Bjy3wPTq>QSC%dVSt0duP7p{))M zgNm99^_$2zrQ-ZQu%Pp*4{o2{&K68on2+~5we}nu_3@@TlWBxA&#?~<=6!Qm(9|N5 zeuCGeN{>czs54OXi%94LXewW|f+0oxmqM;1idW+n?=6`13Cl`Px*wmIReq}!tlpi= z1LuTD$V0oo{shC%47GouC<0!K9{93B=?ed&!#sQ5QIGxkmX$x>f`XRiSADf>?2X)x z--?MneCZ$(zw+}63SCTFy^Gqh|Agv)0{H*%(2XWTX4vrHXUB0vEi2M`U1F}_>Tok! zm0bqk7le_jEyAk)RF_$|uAMR>!g>+^OKcwZW79l@(|COSN{3Zl?#boZmRu9*<(~o* zR$93eD;MvOLUZ8=kj?7=Dy0A3)hpb-?E`xAXliV=$c zJX_ajATm4|G=@WcJB1b=oc5-sE-_;z$YN}ihQE7F3bbBLdYWh++UrF!A z@1nkO+X+J9vu#I_e(KuTczt~Y=QJJiz1nL^m(P61Zh6i&UiNUl?soGL!BBXF%e_>7LNEJgX^HXw(mO6(TpWs=CemjwHI194qJ~C7eCFryWBInIkrc!M7?mrlFL}&wLcCy zUu%>4GR|F0h8B@eXRW; z(j@fI_ZTO0S@p*is3d{o)ob*l0q!~X;R;!KFLHMMFBel5#ff((bZ!ob9NsPlcp@(D z?oF+8t{saA4rY&Us+pFSmE;2LGgs}bGP?-jU|~6&xSgfVtY#`wGCMbb_B zzt%KoeK9s&;Ss-83X9mCC2}e5(n^QGjQYN>hMcL~b!HXBS&K^ZncmFGJEAi~DaL{^ zsL3Sr9o5*}JU=lh$-EIcSZA!MnWDx*v>mv}%CBCmEqJ;;`Bqx`TY=@-?#xJmD*U8g zYMce)xHp@67x6T1<8{1$Tq)0J!O_srP$n9^_*3~^Fa~{weN$4%gwE&DwB1$+R44P} z3KH1t{I=Xe37Od*wVim57iqP3bf7#YCDpLJLT|X~++xzKj*Ov`ePa4xxe{T`zsE;U zPd`$mRrk>id3h4*xxMRU$8hc*vNb%I%3re>!U(A@>x|9H!rPJb$Y zd@=^n%mBR;k_S1g=uW`B8Xrf*=NRa{6t-N3plCN5sH zGrY|UOMK<_@W+oIcRLQAxMQaQRS^1CUCjeTVU(DJ1ndIA{LPy!Z8>)N3HM_FRGzeL zp|;>%)H}_xcpO!1);H@KvgQIRZd zs@g8Ixb8W0k;7Zij}WgW;lIOo9ZKUh?8a)sGTC~(sOTZgr0Fd&k0oK3@jE5gD=zHk z{Fh)ttbNY(-W}`W^gE@h#SaehDagfYtI6~|SeL{J$!S76X2f}M$87NqnNy*%(IH1lB?h(*0Is8eX@ zZE93zczKxG*rvmrYW1e<9#qhkfdZ5U!-FSd-j&~#_lotMTFq68)O+YGg!DH4X02(t z>@_xI&CX7+8wjpvdF-}Ms)D47fchSA9kRWyPN`{V;v6ExehIj}&LCn|Z^xGt5CuC1 zf`^AEoy-*m1VPQ_H%j3&()%;-_p}=(%Zx$`>H)4=&NZfL*wn;nST}wZMZ15{$Jzub zu|jZN&J0B)-=FIjbeU@l#;0@DYr%pD+)OO3{5?DR3OfpIJJcn{Fz5=;l8B%vw-^tX zN#bbPy#090bwMwk3+y;0?K<3JX=0BF&!Ln=|2e9TEDS-<}Bw z?Hs&1Ll9A|c_S~`O$NzSinRxjXLIlf;hS}JF5PB``^jdOh%RNek>TzJS?Rse9A5%~alG@bE|L`J;I$Rj_EmAF}@HpLmK}*}I zTmIf)| zXs0d`b6FCDh`X}f69Y*RaEs1U%z0%w!KRuzkj#Y^nUL^4G=cD9%x1Qpmz3L@8Z79& z+cQC!F&s6+Y&hF;rk22$JHDwWU%8++tEn-?;pTFy80CC1l=Tq#1`QLF=d83)y&{B2 z$200|)*~V(%{?U9rg4%Hi60fRHi~y#vQQ)HxfI6zgzTxbu`zActaCvD+4KJ!y5U1K zeKsY;#2yn8c7kB~d3v5g*js?ZWYwk%fA;3hei--c{6QBbouFVUa9BI68bH6HDX{_f+ zFG7}obX)9fe|3CHrbAYEuvt({sJ1IW&Azt;_)~nYwq1mH`>j%lg`K7k@;u(V{DRl9cL0sf2iQ|_Oy*%Cl ztyXB}mwLRx+T@U+@ z(7-ImfgldCx3@nB!>ZMHx{KH2eNTX(GMFYRLD4;BjjNcJf`eJB<*!v+w*I~EL~^ge&#kAcllHjB+Y-JE}>TB_d> z0*$wMKmAe9>*?*9wJ@Li@yk2n3)s&7DZdSe&8`5%x@pPzbZ-uB5Fz+(i8gFws>0$2 zSB0FUn&#tpQmfHgf;#8jMSwZfJMVuwZH``V5flCtv7P=beK!WNrOcf3<7Duonz~&KZSq1KHFx6$(WMGvwNC(^=`V0 zJGt?P^Uf5RkY@r-Xgox>3gNc8VUoaO2OZ9lGXdnial28|mnFzIU|LwN&S|StRmW$= zj#RZnD@$0C)n0r@;%&eqz4MXO)Mn%;5}q$3^vg6FTKu7Ui$d@r%>U`fNe=!jF@!U$H_hRj*=WJJ1hkegt)YegEIs z4FAE0U^oe8ILKV|nnBN_252eSyATVFHxrJIX0R5{$Bg64cyWe}PtUj`u^7SG@#6pJ zVbqfhZH*VN)mju&@$-}VS|KX`z$D~k(}i{htb>A-9%^H+&o+1r=PA+w>*c+Q3gHqZ z1soV;c?ww}v+0XX}&!NbLQZ&u5a ze^CoOB~z!#`*{72|LG0_2CTkjnaDn;5i24brF+6Q97XYnvMKD~maIhW%_}@uq9$%6&JG>N#l2-(EM zL_n(jyC{9gd^N0VzFHxs=XmRNksur5a5m$DW_z_$#Q`Qkzpq2sO)w*ZOsKWYsIMBt z{Dhl!$6~9qmiv^3+Y_anAfW18(8O!D0;3t^n+zsO^d6CN{q8;i-H?fA(ORFXV02jR zr>_)XW)4ewZGrj`Olml#FpdZ~+1=Cg;^oVrt)jYc;2lC9$A^EU1R;V>>yxR-j;&lc&&V7T=KL7efJ?6dX?Oh~L_^H$nIMRB= z7!Xh$0-LM`(|U0=cPsn;J?6o|0pO7YH8&uqG+Av&1uFi&J>$rpI0RfKCM^wT`S!(N zPfv?}DL}ppP}B8{+nNj#O2lg1;)kwOtepx{KMosN@q~zQS5;?cE~Y4{{4H1F7T>Bn7Ho?(51v?P6#BOg2Ka{!-7EOp$`O= z(n(9l?TIMR?o;qC8IHMnJ^7V8H~@^V{-Bf8(8#D13?1YKx##0>$G9jc zWWi7aMavg?wRQl=A|@_w4%k~v>gBl;&h2$$zt!44quoCTFso%Ge0vQ;fEDG{-6Tg) z)j$DqfcZY?TkvG=2#~Wes6zDg_S)}Q+;#lfotpyiC^$Ua_^3*Q7^y1&JO>)<=iW;7 zC zZbRPGH~9*4hrL8P(!F0LuACbz&8I%BhHUO0$2Y+<$%logiXWPuar&IA*^#x4S&!GIwGOv?l{PSYeSKfssi` zy#O*%Mc%wY1y0$W8kyY==))Dh7Kvj}o@Rmf^!xy}3k`$ZhYvr&PQME+AX?Q~oA`i8 z0g&pwr6p5oX(<4(;)y$YA{Rj+xIR`$I#cJe1~AOX^{axmz{T%!A4xUP8Q`lVzP2Eg zllJhV3XEVg=zNssb*eUAxOT*_SLaUTc)qU(N*_8wT~>(Z%_+iWxY5f42%HZ}-T(#< zCk!GER^oMDnf;{(1qj&90Esq+exTigu`}y%WZ9aYR;stO7%*TrcdSdAEG^$ttOaMC|1~?WV%$v>B zRv?@~abyojxa0yn2dO?_>DdDORA_of-#?t(`TZ33_r^)DZr+B3l#&u2MI~|G)$Mbx zew&8YT3sDX?E|HhC_MJdn5>QGP~c9K zThC0LVM8qv-v1I$9Pe{iYx=9ohUzhG27`xLls{~1^yLx7q9sFAR>WdjgG z#mQMd;e2_#@fNH?h{f3NA9CqJMw{_UWG?A(r>yj>LUo`1UaZz|Q(NyV$Q@ctmeBx{ zlJ&$Lyshp~hA7BxDi)|P1EcKT9eNN8dGa{drT+fSqz%-JKH_f00q(f~Bo(OW2?c2D ze)y^#>tCzVOzE;epZG3rf3TkY+K~xIe zft?4?{nII|rqsp9cr_FMVdE)p`i^O_{Sq)0e&VB?*F=51+R(DxnuUCSt(-*xQr4Q? z|ABx0heL)Fd9r__q9Ju$#bB4`{ncKo`OV-Y;vcRTclZN5A}X6l?B68Re`xbxhpG{a zpDN4=qzGB<1OeZe+nBE5C}wi+NS=9&m-n=u&#w^>vvc6Ld)8kX0J!}&YHl=LZ8y7( z3b{Jl%K<)ye zZ5dC!!dltX&28>aUB-XjacNK=$?Afo0{eqh5V4a1WsHf9jV-QcO8)_-@&OfKOJuzE z)PMf`vAl7{%B1`zyhmPjbe99)gjvuc9iE7aib{LvC((Jal<)k_2aB5Dc{>Au`mgNl zCxADU8gzY7>QY@%aPCNz{50)tScPDhiOI;w@Z{EG?lZ|n79282j=4pL0u2amLEXQo zJz+`^hF_UHX}sF4y9TIIU$>}bV>3nbzllms6-?Os+BJCVJYUn3j*YFP`>@P2V5;dC zbv<9l0SLTD*C}gm8!Pdk@bGXo`x(&b0eVAOQbhTx#j@`1e33qZ1ASWLI&q=5^miSQ z`p{Z{f}DoIqxAZ8L9TiO_>6a%X5ij_-BfNTI|h;mbQ!ote{$p~pFDX2`2;h@_PRW# zSDO3JkD+rITIm?(T?c%b&9M9Nn>TN|dwcbPB?gid5MRIp%e=0ftDHQQS&Y^;$jW2% zh%Z(%1TP*{_$YhNrua9$L{n#xHNrN<+qV|kl791_MYVDsn)*?I0!2Axa8v$BRsCTH zQH=eK7KE?rSJo;kTNps#rl2s3Cak`X>hKPJWqVeEaL&l)Cv3)o{^FT6ew z-S7CyS_a&CA+0NVuy+87We25rT$U3eA|fj!s=x|P1DQw(hD)Ax5XldA>-L^JeR@ws zTKZ9O<0S)5U>m^@kd#Kf%k-eo9TXyPq$P=hV)akQz0kXyM{8^AUEo9BKh6OpPuk0o zA=?ZTEDe0iF&+Z3`r($3HlMMk0B~y}lpN=;fmb+U^HEqw4J1bn1u40m$%fNYWUH)a z-cLt%gX-Z=Ro3KifulzjLRxPf9XX#pd&Z4VSZ4?IsVOb9MX zQl1Vjf@G@eub&cMfv2%D|Jk3@Y^q(E%VL$ux?x9!gwqt#{Qt|L;QNlxxu$-_BC32U zrZa?qkr+8-s+tP?)k@3BH-O^+p_>g98-$vgdVd=R2SeC?gS^@puEV`61vyyk0R8$B z8~YTD`^O(hxYPpEzee3%>3rxd?!mF5+;ENyCCF2h-cvh2le%>tkVNZG<4C5D$pNA+ z1Sla;4FUn#2lk9x2sB^Z_Hx9GRxVK*$a`W?Z2@?Pp`jt0Uh9|t+P@rw^>uFe9RKw zswSXZ6MjzA^aHl^;ony4#ZBOzmv?-0?_u$~p+))`dGQY&ZW09af-}Gckk@um`a@P8 z+Y5FW@KK^d15njJh*OE+?SWtaUlQQ*;wJIIL9Q%i)`n3lguY*1TeN6~&iDtY7HO(| z_YMxy907Z|7Nh3CfP!|2r>Y-y$Y$sxoAfJGRM)Gp@eiZbEGbmb#l-rBN45jZZ6#AO z5W>N<6#n~G7~`FIO3A(qPF}-Ops-DP*49~jiMGU?+W4bYf5uevB;IjL8(qtnX7d+9 zoB2WA9htg3{A(GCxBbugncI}%sJ83-^lZ=jclSkA0U}a}1N;Btk1z+1(=lg4%`h3E z@7yiVS3Qvv5ppLwsDgY5mWl63`J)?wXnx%QSeNMSfeD7sFXKpOXr^r_D0MUL_zH8t zxjYY+zBxYv1)ZrVgW(wwIg@OkBNcxLtycp3YR7Y7JH=nfjv-Wd*b*|bY$;-5xC)7k z+v$k{MKp`DlC6^$0*r{=UW1{$Styhsn{z?)DX2GikN#4Ir*8Me?Q|WR?(RD;qZLnG z9bw>Ir5de9pf2Pj)53mEnJ*e-eh^Qb@4>tzaLgp+&>ovNN>*3B0);Nv`M zjL3egyU0ff@8G@UvcEOa)lV8K9aEL|S+v`$e+Z(;+4@M=#fysj0VuQ>x`f?ufkER! zJ!3r*+83fGbX=Au5sR4EIPILzIc7S;DHZI~4RncX!jdosWtN3_>w4-n_zYmm(**>0 zd4_M^rl>k_!Hr=k0gOfLgBUQgH1h4$9z}lvlPBtLQQ>2b%z|BZESv*2-C;L z5lHSE{PAj;QfP^RO?qkie8RWi3+uhKbUP~X-Tj}RQ3y_rR&QME?B)u%82dY*r0?lQ zlJUfP=DyMX1^(0TsUfdRq-M*sqftJG0bFo-xyX&0mX^eA9PK#^3(KvjE0`MPL0gP- apWVuw%kl?h``}+8A(G;07FO) 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 o`uh4Y?q6i25y)90Q{PhpHc>a200YC_ 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mirror_planesn1.png b/doc/salome/gui/GEOM/pics/mirror_planesn1.png new file mode 100755 index 0000000000000000000000000000000000000000..969f0e0f4fa3c8b37822cf2b6b13847635acbaca GIT binary patch literal 4646 zcmZu#XH-*7w#R9D&g?oGDj+Ms$HxaX zx?*6##|QcccyRmo05c7hw(5L*qQ8v{E?Pdy{GFwla0o3KlVf_I#R8=iWpJWAk8;TM zqk3Jr4KY2C6096=k`G;WjgyGl7}od@x%N`d@7C9z1xeS7IK^ZSk#?}4(5EWo`Tnrt z5(lgL;++dwq_}=K&tWrTJjkjnsPx|?(|vrE>$Zzxd|ConKHOs%-%kcV3PA?-cE`f* z2`{}nC(QRCfn1?`?y_+D@$080@Qs2p0ZxIws!R}@@>%K~IkI|UiXYP`_^LemsiKzJ z+d)gfdzN}+~QAO!xFzE z@hBDNVW2$aJ=YL)O+1Hh%Q@rSC1EWg-Wd=s<)M&Na^s0t_XcR-uKcBzflfJOMZMq?7{p(IZ}L|{BMXL9I56~(2tq0#UC5wk*_iANBOD52+ySsm6<_Nz z<%Bz@roy01kel*qAejmJM_Kc4G$v&PTI!}8W${qIS5WCjIV=(`lJcv;i4Uo8&}G&T zj7JHslJi1O6Cs5uClS~?bzSRKV8Il2ty^ODA(i=yxNwbETLgASKrh(ic>|zAd0gC* z=j{b`Ox?ez{TmPU4IIYEA+x-PRD^->{??9w*F`LlNNgPae(&I8W;klKwjxxN2pLvv zfWdMh(oIibu$x-=@O>uaithQ}#w$O2!Ma-W(TmXv;Sg*3@Xq~v4Tn}SRKoSY{M!gU z52TO^QqgoK7~o$?XV!Yl7(U?)`x1qtMHK-h6a^1o^6jeDUXJStJy+1238Umfj!^Pp zlr(ibN>;r_TcF?i86OcVc&BW>-p}510I0 zt!QE!anOaVJ-5eYM8Hy+LMYPm+&3XU*)kyPwbrTl3`1WA#D4OezD(Akf$LP-p?c|+ zd-Uc59=oY66SWY3N;{?TX?{8Bd_zt{osaEwu;Iq)ue&P|cH=g7^A*pts2NoyGXdEl z!O~o>90_(ef&T^Pe#X}D+{!ey$=G1$IZOUib;Yx)C96QrZ1TdD5@_)gGyjIXzP&L^ z-enE?17CuVdPyp&1@=2fEnHzg$bhpjZ9Tsxav(_#^2kkgxCZrc^=!1A2KCJ4QuHL2zuJy7$_Ordd+fsk^e=3pM(h*0a!HTM?hU?q2FrMY6B-S(RznVn5kt1;HEoto@qZ^(){5p#j#`z) zoMc+4wnNPcLQ8Tda;Dc>n@rTaGK({lhoV>eB%U#d+l_SFxtZ_`9> z?xY4x`lz&I{Hr|{Aon0=TCTpCF=81%dEnafV!GL#Gu(cn*M8~}r?jJY(TlVj+FD9o zh6ip=zS|j)EbM^BRg`FjjJW5rme1DrkcOG4=pb-f7GbzGjlAWM0n2|Mb0-K{E}}cf z8PXvTNaPRboq0`}^mo2L4x9P}yIC@$rF)&o(hv3OcSyqvsFtDEW4|rWmR*~Zzhn2^ z{2grm5i@VqyDEY-+?Jx}(BQkF9xx}b1ivFbSd%yQ$YjvzQP|IE&P%Cr!FyE0?B>zh zUY)V+UE~2vR`k@66OQnJ!-@X>wvz44O}o_|lRep~TH@}nuf)`L8*%?cl094haXX0e z;6_$p-_SOZ=VekquK#=8w~!8{4LS8C#$4^;Y{g21_gAx|M-{iHuSYnw4+3)}8tuGgV3~rT_x*_ItH;F#NvZzU{CMWx3 zHoIsCY;$_nmXLa6#A)r3@7)+|!4_g5Q8Oa2d!l%p^7}*y>%zC7wdF5%TRE|@!Q4NL z1{k|Ci|6I>ZT7;WRUVfYyu!Je!LD9g;wit|>_=^jLNs16b{>(Z+vi@93?y$-)7Mxn zL5ml@)b1qhhHgF_KPfu;eY8Pr`VqUU6QD&|nLCmgG<9!_XE604*LS3UcnmBv^RzXm zs_f36b+w==a97D&ciJ^!DWqNExzUE>9}aHB1YkYHEmIz?OqNk{cp)|uA%Eh2qo4O^ zATW&QaN^VIGz=Xdx}2eJjhi)UGp*R-Zq2i({daEAmmD*yNjE&7g=RK8+Lz3o!d5SY z@#Kiy$pxUmE$+{stvO4fApyLVpV^;_dbf}Xnln8J#K6`njU&y}=~>egvuSG+YPr%N zYGDTbSUdQJ%zS zxbWF=`h7Fgq=_&2>~RNw*{8FR9EU}F6Wffwe+!RQ(B7<*Tx?txv9XnKO0CSOi?cNGkBKE;OctX=UKCjKgE7C$+tA?ojo=Ry;&!Dn!6pfxeXuv-R)H@fTfW z=vSI5;jD&9UH!p&boL~qui5qDQ8Eo3>GQmjv^v%wtE0bSBG z*cT2H>m4M9MR&NB5pfApmXWXx8su`?t3cm#eyF8do>qam^p8g_{@eEtG=xc_dH>QS<&K`dNY zNb~KYTlu9I2kHB%wn_Dq{Y62t;+85+giMo>zc6ibUU&db_iUXs3sK5}lg!@iMc|hE zotD;dioU;UTrXdIAx<}=+(@E4^!a&MGdofMpk;q-u41@BbBiY*TPM0P*YVma01vDo zO*dfP1QTjoP>UKPZ|E}SlFUDLs2`wDcZ7VbrSVApJ9Hw2GQ zLqZsa;&h^uPjJn_4YR2q6B~^VkOBw-qn)RzcR?bVr9aNOsY{gr6f%D`lEyB;-C!8n z9eV=_*m$)Ek$*Ce$I#Hb%7|7BtqE)sd?Dw3c%PW8uxnvgI4sV4U~*wbn3dJyuwnlw zZ{G`sq46PZVNt)bEd5ISQ+S#^8oJM_I!}?D43|R6YO5+2#`7c8ef`-n0&8EdLJ%hy z2jwKX%p~m1{=rUREQJM%7Z#>2L~QgifxG?hKUFaKnqB<5QoB*p-@k&|-BFY*KZiNB zM(te6sf!P|a68q(?4Ro7tO?GrYsE(e3t-oyR#sbn|Mvz_yPf4{wQL~jt}12{pExR| z`ORz0=iIS0RS9u`tbc3)dMilq?%V+>(d2_P#NRqL)Vz;TqM7O0X;= z`I_tjQQ1fse|vtbPDHWgB>(9b=MFtpOZ#A4GxXWeaiRo-Fs5$j^LmLc?r9d+?(b(? zp7E(W;LaWLyIn;)yij0Zuy)-)W7j?gDlw-%GO{ zLI$Pk$!><+bW8Q>r&DbMj^!V6-=65c?{m87mbz7!$PHMYT&0MU|dEO`+W)e8Z81gO$*o#tomMnK2A12l7)X_ z_bVQ6DJDlYSItVh+lI&6%TZqF|pzhtEBO z|4TO49hL8k$a)+PmoR`}2O3+Vq(gmD;E}Mw@;vmqvg7*sR5*}SnDrgA9;ptCB%4dT zhpS#TC&MqJ0lZ<*xng>r_AIB7;7+R{-7A4$Ew8}jZaXO`;!|y{Ck(Sr-7NTJu^{;F zy*Kf;Eb`Oh0bv@c7vTTeCOZ=z9FWV!J{%QkCUnrYyViz?&CEt$jtRpH?=K5&AXV9 z4h1qu>D5{%0pQhmUi$bCJ_G~FtPsLBN*rW4R+GL$W3N`vMZn69emNR^1Y&wYl-NjE zFS^6$V8&mwvnxi_2OORL5l#jf&Gl360y1lT^^o6=hG|`Y?P%}-05O^cTaCQIc1F1| zMSrO_l7K1{j*sGpRpe7F-&!l>cAd_ zE1JB4U{N9~Z{L3aN<}GuzOV^JpdwUxojzb(Y#w^-g8%|W=l~L<#Qcy#IfrHdrTF?! z;hi^1e88!3+6n1Lb-clx_AjUN_Fz%sIBuH~42x1XHWj9a$BMrPa>^8Z7epv%OdA4Y z+$YWzk_;9lU~B^T4GNjbecJSJTeS z*ZKiwFh%?kvjYgenkHyl-1J}n$uWHM8t~RT1Na;FhT;ug2p}2-hJbP#Md0}6lLG%i zmq%p*`e?-@w*d1>k{n>%aRiAWKY`tq`jWwq0{JC-gH2Mj0V1Ty(wNdKWYE6G06{*^ z*N^!iybn#^T#?SlObL4R`(+AN|s;W*L#&1Q+wn;f;A?ji_4Kg z?8w&wxoOkwMX?FMmrDyRi;Ql9rmGO~|Jz1^{@j{{H#>ai8nD-^=U0-uHE%ci0sZ{k?pL`49-iUeEw)pack zH_pWg4(TmldK)f0)<`&#>rtH0%5t*IYFmk^`5|&D<%8z~;z3^5Pp3PMoU#tGml3EI ziRoUL*0kuhsNGzjU3~5^bu8XS-E(W&ee2yjTai12Nfcsga>z^!f%wP`A`}q+kCjdx zzw3kT^FUBeUj*;$_9P<7AFFr>bxn!}N@@v$IIgiT?;hya?uj_`0Z>3i9A!$}%0}w7 zk{5(wmg7%HNgS7y<5Gkgj?3ZGYndSIE%OWc1Hsr^IDQK1HrZp8&L`SVjvhW+31f;b z)uf?lh~EnRUOWV{EAbaNj27T`8{(-WhXcHV3MVg6VRp1aN5v;W@%`IL@WvjM=u~EukDugx6tBit;oSMQ%e&q8m^Kl9@mdR-CZxCxF6n9fC}u6T|4H$T>iQ zh*XkF2QKsm@jo=e1m6ugaWX$fN7l|B@PL2iJx}D{SvZA zV$6&nnDhcV?#V~c!n^=6JUFi3vWwU1mQeUNg*);B)NE*Ye3!JDBP8&c`+%$kCKxL& z?8KSoAtEKOJlHY8Ym5Yc5?qMLVCWQhZjf%Y_MS@=U#vO0vcdcsK@&I9x?t7=e6>11 zf^JG{dQ*+8T}$ zAQn!g&Kbyy*0_Wk*E$2OauKv1DnVI`{9pJCC~*WKAo!X7K1x3xK#=P9nUpS1Mm^5&yBo`5xovbxZ#c+a**ZoL*tBNq`_aY7IC z{9hp&Lij~=<6c;2n>QXMS4Gy821mVvpDm#>oij54FvWg7q+DdT(pv>Eg``$ZJJk_4 zQJ*sQ-K$#7zg9nL z+7+bArXDb!Vqe~`%Q1Uk&r;dolm;zn%3s4V{!VX9#O{q7Q+&8SzrCt#lWf$Xeyz)~ z@`CLjEXAc3rm(OR}CC?oXolGfglT#hNX) zq~p{>TB)*mr|&7gF7p-96BaE+^XkKO*c z`J+U5oJ875YF~Fv=HU02cR$~i7q=ZZXwaCM`2`ML6e<5?TbhxC&8ZzyWWP%Dj~WV? zdfUEN6}l422pf^BQi%=wH1g<;ex_k(@BVYjz$<3FMuEH`W|Y;KC)^t$wf|zZ&Dk!4 zs947Ox|qQS@76mkbv-r|ErWI%4x^{t2_$Y!cjlTINtuf|<8t*&Hkcwe5_w}nj_oE` z({8>6qx2f!4s`c?RGy=VERz>bgbGEly6T-B{mi3-bMyZGekvH5{-eBBB(}T!c}GK? z9CgK)5r_5@G&8zQ5+-)HNGtmF#WTk+a%i3<$L}p?9HK6J67|>1R;6rG(O0{7ePM&o z1_K*<=tjV0oqigBl4=o1+y2C+mhGD!Joi#bdT5aSx=G={8MO3Tql|Cgb04oopOvli zeHXJxq(`jOKN^B%^T=pJ<6ksq6~@0-B4Ig%Sw+EONy0*t&km|QfxIdW`(d9i=! zaFRrK+2K9=yfo3a>@LyHlebvx_WPE6%mNvWzJXVJIG6GGz>EEyqN2X?l>mq}GprfF z7F+Yz;4ECCy?@eL$;oOn$q=0Da4rPV?8%{T`+n({07?0WmF7x|I_7tupXL0~9NNlT zoQ~@DW~YkJhu_9S0_E7a4(p;6f6dDBOZZ9u)9*h3dOV~-Uf1Qu3&M}xnl?wa zkA$yInTVzlini9?zGSQ{-fXPkWF6I0tn3!wesM6oQ^6uKm)VxPUOKXQfw|w!EzsYS zU7t5!;O?eb!BEbaAaOu#hk7Yv3`=q_0h`n^J~g-)`o=KtZ=C?Q>smB6>==Y}fge}2kLF?yGI ztdUq{8}$9h)co<@x#=Ni0!JHTS9ww1+g zJ%(n%@qxT3ysd1%MPk3V?Mm`}yH;A%R#9~jkQTb)TIKEZu!6&UwI2DS{PHBL-g`zD zetlVnuC(RrIgO@BT(6*H%StX7T3VilVHEm^W+lEH%8>_RNLWmuoiBLBPd@o7Yu)ojdl`_6?{$_O`AW zTl3o*Sxt*Nws2hAPEN@o#?iZIY-X_h2H}aU@&2@90goo%|M}oM=3jpQ`Ptejm(Th! zz|5R;#TOU5?!{3Cb4|ZBa33A3I3GVpxaNNvV_A_#SCfvKt(;)}Wjvm2-#4W3d_Xst zZuuAw7GJQvGJjai&DOV}q~pNAbL$fsz_sMunm@hC-iz5q0|8%O)yNQ@&2u)X+UwL9 z6Au_qrg_x0=-f4zRd&v!Ew|dS9=bf?*}~9v0H*(W0?HK1HSQ61-ZR+vy?n8aTF%L9AvaV$S9{;oB_0RwE6k(!3Tqo1f@A>}K%e|1hOM z$&N&Y(#7l@AB9aJ6@F8PdLfT?e9hHw3YBx5G3zBm8o4AC%1Q-1dU(pqkI?x0_xHF= zJUs#SftdR@9+0XQnhVoz=lA(_ulmpL+m2j9oH01zQP~dxS#%})=jcr{3GMYkp(&Ss(UH`_F*M_V)KwE0>b8^v`|&xWC&rA=%dC z+mS}scs^g!i=Y%vy4~AJ#cb_O_v^JEZwH)%U`KAEOt)qFjwfbOLSqwKmq`lt|u}t^2ia}^JUqOE@8t} zZrv-ub(YxGva;Mc;u;x%;^E?R*FK)KDp>P5Y_*^@AB**$w>WFI_5R_TTp&8+1n3F@ zci=|#`2{+&&tuoS)i{5?P5!R6*bS_e-gP|-s)G-SrMZN6z0;0;7dYFb@(uLYzXznl zoS>f(8kd-Fx=l}Qv0CMhBx@e4tu8k8AFosvkP*lLWY2&-&)QP5lN^0}NFtWfZC{x2 z@V~}YRjJ&a0()eG4}V&wo|y=vtEX}%2H{t4(xP^$cGCk1LkL54yh6*4QcX=*B)OMp zOOHJ{0ph55&#jl=Z~888j+fHa?~$$_oS%7ZQbCFC?Ul5LVv+$1n)%ilW9a8LlXM}>q(k?l452P+*5KPN0KHe0eGHc)dRR%4Z37r# zzI2{WM)CfjC)v-r+Sy-CJnN3w2-gDJ=rgRQ<2%blI53|xoH|_XL6T-g1g~4@QPorBw`J8HqH?J z5fzMegO5Qv8=PaFAG~*KXw0mTq_hhUn)Pe}ar1U*)!WN`@joo6-|LRY2lrAHL&8pg zNA=2=L4IS>S;3)1U|i+lS(U)m&~&rrQ-;TrEneXX?kbYlQortQ4X!^;Vq z&+n5)l`n@T68B~R(H@#%bpO;ctj33s>$Ij>k1z<|wgn`y{BZC0jDuKM!b=lwSC+n; zU77m(J;H>Lr*Nbp1B5QOp+7lCoU=IBUgGYF8$u%SJx>P+83o|U!?cY8yVap5SqcZF z(Tvp!v#2Y+Ws8{sW}8uyx1SZgQ~}2a2s(X9Stb+c%Yn^9f{ON%#u(42_msxM0&vEB zQo8k+RFmLS6|m{&Sn(0#7H=jdf8_{`VgS+tSx=kT@Ieas$G)MotMRMgA@wss5QVPP zEF*Zd?6fBR;@Ly`5B2HAm)`)DEkLr-gP&!bT`}0}>&5I18F3@{t((*W^hV3IvRG~V zezAw)?T{#IaOU&-Kfz}$3GU72phRd4RJ{EmAr;wtW&KU z0uGA3!a~y13m%L}83v#QvGx^`Miq`<@rt@!4E$j1xLgd9f%$=9b^WjBKApG@y)3#l zdkF3DO`x`>!z#L;`tTFJ0{D?{l|D_q@Rhx! z9p)c%nH>FW9Fx=#kn~c5peNC6uz)QJ84&y}R|Rhjcap|yN;L;k!sLs-p5+6x2mec1 za=4LYu28)-@JB`1^?XtcleNA7>w4hE?nNJ{g*w{c2yG%pqbIijwq{d~Uo3X#z7XS8 z-kDzIL`fWHiUrWu*tU@;RlmE)I&(S~+ULkCM+;X&w$`6H;6a^tO23bXot&5}$3F@X z?XViGwMpV0GsH;xtu7vUZO7KFn{EC@_zDj-@Y}CPM6Do7#nIv5^MoJ#nUUB_3UQsM zZ^8fSn`B^EFj`&K>69o$CO0(+8Xzr0tC7W_3PC_R+EVKr8AyMUAZNL}ALdln^EL4q zApL@{@OQLx68xop#sKLx%Wv!}4;%Eis<%4n*l=Xpns_Q2dgs|01#!^r~ z<~&HVM}l>TFMnLs43N(h8)9!zQ2a7eMvtHEz+4yYesRzMc@#Yfy1{ZCbDg@n} ztSsR@Sw!`3ch`3<%y9TdBGCXT$~yvT?C22%Qee5l`i169cd-cp847AVd>L3X)xy*n zh90Ce@3?ShS+?RM86b<@BtW*iK`j9&jS-=R5#Up#X<@D)?)g6f#Kn~wP!PHBfiLv^ zya6)!svpb};1(vBHSYqofR=A?{A4aT>=7{;aFiD!XUF`U4hF=}(P)jm{16!x6AQbM zRsWUR^imsx;Mc-XBFrwr5oR?qs0qQ^7)rw571+RPg)inC>~^vEBrXUL7deUx%M=E< z>JR|ep=jp>SWV=RFpT7=?*=GFM&17eT$J;^-4c`p5Q>6Ez4Ge}e!mWW_WeLOGRI*!157m3*|&{5V4SKH={- zn0wfIn3tUR3`^^S-4bl8;8x%la~4Mn?77p=rSPN~k7zTeUD(47k{>Hn@{kWrge9N; z&#efaN!YDh_;h&cmI#k(LU-lBT`_fq_LCc|6FoEzN4ArU|L;}D;l4WZEb}DdhYmb{ OMu3-0@cBBog8vUPDhAU4 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mirror_pointsn1.png b/doc/salome/gui/GEOM/pics/mirror_pointsn1.png new file mode 100755 index 0000000000000000000000000000000000000000..675b0bff1b8147d0d1f2027e8c91d1f0cb99fa54 GIT binary patch literal 2304 zcmdT`dpOezAD2?viNw?_zr`XW%FHd76eE+`nWsthkA0sJsvb1?6@O`sCT4^S=-OdTT!h(k?M5zn4bRp}XbA ziyPj+hw7yZs+zI+?!j^3SWO!QD6HGfD`I&!dzK%j3794=((0;|?Y3UwmbLH1aJj%=qxh zOD`XUh!<|x+qGDGs z!6*EaaE%FAX6o6VXMBpiX~3?#_<{J2u?gt*f?(}HoU&APQqs~T6s8q!xiP-M~WlSz0|}i|&EslQqt;19S9712S!%!7B45G`9f};h>2 zgXTz#asl!jEQjpRfB$0*)&_rvN*;jEpO5=G${^}17Yu%TbaG&Z!|YS=eQ!}&v@G$0 zzG&+!&~oZQxbHaX99{Pn3hyoJp0=+Y%W35_B+qbk$@p1z!iF9R)Y-lpRpCv&oX*k3 zZmx139v!7pZF5F6cRlxx9vo?GF8>cE2rqd%#~DNAG# zrI_PYLHTluyZaP(Ua*ODx#IQOH7UKRb%s-YK9_0qGhEK9NbVd)Z;Z{v-s+Qw`mal5 zbL_pt=pkZ?qv>h2$h_4q&uM|X@Pm7s04ubVntvGlRyy2kO-$sIX5G+eReib7{m8Y> zb}K`n;mFWDBTW5~Z`MyHJ|4yI*>h#$ts5ZTxs6f*}pY@f?_DApoFf0df%& z-W!_x3AfNaOGEAL+&S{GNtJ%ACG(YMDWTu6wR`^*06k;~N*U2@@Jh_H>a#U>_XO{i zV~+`u-BW$W7#!lAMYXukx(4U^nOyDTS4_!x;y{PB06lxqSklq? zyilt>wzmkRAa-j(C$A35D+2mB=zocXr{d3hrYQnir zS-+0ej)OAblhJ&6>*fv5FPs(JNnv&PkE=zr_RMkK1K)T@6?S@vMC-HkzMNf}_bft!nRMo$wIrGrGr!hWg z-Lm6KOs{E(lGmV8OusKngi|gdWR?5kOpz_26+E1BC(aZCxPMQ&pLCz@WXn|J?`m-| zC?#C=NX*=bjEh(bqcnca@z{4cLoxf`lre<6A8WY=HM%Oal2!eE4uuRyfap#6F!H=Z wG_ZBszi4PUH|DiE{=cZ{|E|0LpOYI~UkgWsr&tqBo1cvW#`z4I?MS%)PkpF literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mirror_pointsn2.png b/doc/salome/gui/GEOM/pics/mirror_pointsn2.png new file mode 100755 index 0000000000000000000000000000000000000000..ab62359060417af05f9c1168017a1f2c081f7c28 GIT binary patch literal 3739 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mtrans1.png b/doc/salome/gui/GEOM/pics/mtrans1.png new file mode 100755 index 0000000000000000000000000000000000000000..7dfe730c375d34cf8b37b043a3b9e4f2b67573e9 GIT binary patch literal 15971 zcmbVz1z42b+U_8dQj#Ji(k&p;paY210Md<0Ni%eVfFLQ|jezk{wM0r-m55qWjY3WtT8lKTV|KOwf=oOY!0dpHg5aAQ% zhmze~%n$QXj9Dz2N&J;``yLykprG8(k(GXrh5b6JDW|{s=7C8keY9Aj3`}gG!_RRg z23cd`4;U3k!U1et+lT&Y;)7H zNWUKYd0|rd?(uO}nhv_w1gp&0bSF27z7xl+<+Ovfk&zL6vE5NVUwfsLW5T$L2jAKG zFgWY86C1K$y-fsd^_yIWboxuBenQxqK5a+N=QNct%eu~LS5g`pah{lmF8LZ=O4}^Q z@ofIKRA_mt_(v8jRn^teNl`6fF%(bD27P>dKDxNNW)7`)_IEKN%$9l+X9bMEO)i*h4+j7-wef=0-D0y>_6OOnLL) zvwt))&FF($@D<);wnTGdrjY$I%+}diT1`z=4NdBWa|Cp2(lJk~j4=?8s->sZulCC0 zy(&{kj|Q(yy)o<0&EcOvp*^G37bLZoWxC`hVwujua|Nq&s;W{iy6iJmzdGY(WF-;v za29`+@l)Nl8UMU-G?`sY@sazAF+N&-?`akYbi@K_1e>vH)+A5X|=pE=Q<%M*ygL-p0e zY9yrKbpCFjqArV_PRKcBKzU_}6ZX6%2gR9E?ni#Xua?%jjW3=*hu~5?Te=qOxrf*> z*x_5e3^n>_FQ%b>SE(t!GpAR=UeSKUIR5H)rWghZ-*tC{M_M@<7{>BBwb?=nl_Q<9VN z%UJX1f)ANnsB|J@t`B<;b3^GB{R@Q+UekFNYgziRc!YI;XC zAU+5tr?ec!;CR#>Zi?4;zSodvv@c-^hK93XEOOA*zuZ}xEVoFIXXGj4**!SQ z^rDLHo2~rN-Qb8M&Dd`huiZZ_Q5ZE;A=VVFrCJ?GXX528>n!EC$TKhc{-We=3O9vP zUtnSW9ofBhuW%eRB2)=~kQ0pmDM4xy$OEM$^@D`ab3Kil-cj zzT2^v?qYE{H9ckW2tuRqz-QwEBJJeWe85%L>AhmJu)fMzVqtN|`D~_-jq7l6xH!-U zb7Qnn&gd}E5_UQLwP1i3o#*GQ=d&$J@;8Pn;zU{%E>Up%i zT~(XRwUg%<(Y3OpI#X&7hZh*@c<>j~A*8KQ=X$=K?486mDifnQJD)u6K`)pv-p*iQ zp2n*>4E;j|6{Ge@xIpGcRUyT5)^+0ZLt7|CTt1uhB}c>8>9+YKe>g6(8piZJTPJsJ zc=XN<&vnG&h#g{QXIHn^&Pyrg8qjQW^Vz0$`obDf6U&HSFWH+zZnO}Xe4z(P5wH6w z)OU`uJ7v@Od*KHecLz-IS zWoy$AQVz|AJf`cyv}LZ!3$xz^EFI3A8O!g6Hb*IJZ*~{FQlZ2wY|?=sNvXHDb8^1C zl~?R=5ca=57ba;mU+EF(4J>4JK6ANa%cdu#tTsJ8y}Nrz&&$9&JKHgBJo}0te4dHv z0(N{Da*dXHhml0z<>X1aqBWLJaaO=E6PYs<}No${{l{bk4XV=LZ%y3T9Hq&^}7{|I@mJ)3K~ax)lb{QLLs zx|=S>Yq2YXI*X^YC5w`^Qz#(hS75H;gAG4Y#D4moimv4&59csl* z5LuKix@_==NZ>kIpC|1Q@3oFq@F)aw@wkP(uB(hC>=yYX~jN9bKTlHYi@Lb&4_BuYoHzGmY+soH@*=m)o zxDI-GiDty+b*g$`-0ND!0Z~-4nu0%j%+V;x6`HOABjvn&8l7%tSiBj3v*g(?4 z1Xbs}*4Nk99E3K83#DIv{WRM@-FY(gQ=7q3 z>xZT_!H7KP^wY4N&&6^XF_Sgqk9PEYailq_HKVAr%d4SSM8DY1GA&{;x1vS080&Y6 zrdz=>Pg>VI}z3PAY0bPjN27wf@vQq!eO`WdzSdcf!F{q1T`{f8jhrgE)_OST z628V{lI!C?vfX}L*nVonr1d{uI})04S@-&gYt~wBp>cM$n!dNYoAIXg<7kK-2YYr# zM+BAh>es<)IWoBXw)~Y5|9Ad0xcS8Ku;L9)M}%nc&i6$7C6wNi)u6+GKa2 z#ptz613V<-n%W~rIj%1c6t7Pg@jU==n{DvCP5bzI zgF7(HH%M(+^xT150;PfYufC4l!~BrXQBhDgH=)GD#GKsR#qDj_VtbhDoG*s$kb8;S zB8!;*Ih#fi$)%*N{RDr3F~6A-O)5-URu=nZcI4rq1E`Gw$;lMHzP=)dgA!HiqOU+J zJ}o{b({|GLnz&ddP{VvJ_oUf;6+B?$u6J*uB0(9dk z+pGg$qYdRouoEV&WFnuJWn`bbs88}TVrz;rDk?f4ym9d!->;yN}BCU3}1?#$&`*=is`gusgmcTN?o@C<{pCOh?3~Hm#FK!q0 z@gRpJdz+c`1VDVn3HS8!TYt;QlD$#DRIXm`0!y(-MpWy_w*m;VvbvLvg?y4%%dcs0Q*|Vb zQ7-1~j{RCwIDlZ8%_fe8O4vzNI`qK{B_)Dd@0nI)u~b|SDi`iG`gY@u*Qi%5X}!Lp zlhd<$_ahS!iUFghyZoPHQjD&+p1*vFo|cvtU~Qlu%-UGBMGO^)Yo2Y2Wz&F+SFL;h z@)qI0q3e-jg{vB6A{STNbPOtY2Gi1=E+sW{pEzwzOTD@vINq8vwMt=lu>Y~M?$i|` z?`A_7&8V1Vm)+im$L-hXJKq{uW;+i}dS)eCs9pX_PA+>WJN1FMSDjVg!kC* zI#>IZ-qhBtfDp|x6I?Mdv79eo?$7Y1MAAv$DKTum6X#jaZlHBMnRq%Y$@ojYsi!9d z#Qodcwm)ALlJ6inwoh37M;YkpKYOrL%NxfC&avaNyxK-TUPlB5gpd-BvV@jfjPaZ< zH;*bY_vUpf|7vgNdB30Yy1aO55iwYcTp!BC2iLaH9!BxgY^LR*Ed){PY(QraFj*Na?ck79`9?9*D9~=hHANO z=bj^Lz)c|2R<~wSOv|yFs(^_6*}e};6VNiNCpEr`m&2TI@?pc1QeK<>!mGlln5m+f z>*4()>?Pf5e=3{07SU{S=dTk+QVSix2Y27JPE=bkfdgCl^F@wbtB&4a3N9xvZ*+dR zUR7Ibf4r$x}pAoe8Ze4x7jH06HN3&R{J_c2sMkln?e9Bqo4C9NcvkbV#gAo^*52ZEkkmk7-wn` zg4FJd0>$nhA5HP%$|nf_>2gGZMACYi$C@P$Hn5KQ>6D(=97PP0f~qw8ZefdKs@k5Z zar-PbJ1|_R%(VqA-vQqmoTk6Oe^m{6%L~#g`};HcGbu7`9uwtkW4jGK$s4N9UUUH} zYSq-b)?-Dw_Krl7_R+0{hskMh##(r08OdI_@BVQ|QMxMHaB)pE(D9l;<2X3p z=d^d1YFmx+DZBivQK)U~?CE+pm0_BFRj;nT?wiKvg$$hOxkSJ4&4=YZM7W!e$+quZxvDR@$@p@0+xsm@&SIW1 z+V1xIje(>$X3dJZ+o4e}5BU@|c^t2sq48gGzZ@Xb4EFZ-v)aV9WA>thf;)`^^Ntzg zmDNb1%~|8mowldndv1L>iK1~tTkM>bxSVz|S1o?STViN4QH~sY9)a`BEI|c>oc%_7 z^_rV4_$}{VFzol6*9xa&2hL^)aEx@KTTVL)ErrmM6Zg*VRgHnuez;>pMXMB=%w~yT zb+Q}=IUFN7i@7b0r$k^AmwEWR8h&vt{q#>+bP7rRq&mE!3>37T+PXq-EdS$9L%+_R zFJsNi+dpE*eySTFIVvhnjw_}{LEy%B@ll7Mr)c{u^T86GZZepd~hn3YWWn%b!3#nQ^5 zz3tw?!f%!p-M$Od3U;pb#!;ROCD+)Fofqg7{sD66b3xNEJEB0qss1H>jm>}X*?*T#|C)J%OX`I| zL739S01n`(t@y~jdSxpq>`%}#-%V*7?)EB^04k7_;`e{k@n6^fSD8y{i|&m&FWR#H zyB>o|$icAr0~#I|jp5n;G9HHp=+J_W3#&T~H+Vjvb`NbwI@O(Te8($(CqMiE9glKt z7al+mtC)z&`ESi`s!l^K7SIT#fktXbM>y5Hg<2vY?*epq+j;WU*ho2ae^3KD{jm$O69j@bZ}t zKN4V0P|1Z&SlQb(;L}R}raTIj38cy*WqQw1UxrbVPK{%x#RMRZMk%FI} zAJU+E&Tz0gz{JNu!e6h`&-4(T$%<32=2ujkT(BDKg%v4Om7Nny zKuS4Jz3?HZs_#ZOwIrpa=GWIh{Wde2uCjwXz(IHWc=Btd7 zLQb1`;Sab!fS&1eQx`a95b{&d&LE~!ITBBhoY|j%^h*~B2or$yAtiQ0H$gWpMY^|1 z1}^cx?pc3JlI192a$SYAV_JU;fs3y`tmL+j6fX&~SU*ds{->*lQ2Xa>4Er|tp6vis zDpHk$adK2z+|}RjBsFrz91Jze*>bdtjEp>^wz0MmZ!+OYsk8h55shotoOm)p+@O)6>A~%ov;Ur^;3+o8%fwSN-WQKR{9ey$_DOn)irJKeb=fr;jocx zY)&e-&@4A60qK!&eEn3tK)3l2KbMG4DF4^i`gApKGQSPFA&4%K^R?_z$7*+BS9dWG zO&Ero<3AuS?(Sr@Fe&8+!cOc$so@vfwGkkGc6VFxiHL~amGupOQ*qsG#&BK#5)Vn> zHN^v}Y&N*=pH@?G5n|_^HCMffyjyX`#i{Pco0)pGP7d4CiQw!e{A=pn?)_=>_Qs?# zP$?1x?M*%*@2*XhF>P;e<2-yCbaT;ovj`;5TTLB6TLge)l?fYC<>Z@C*)|+^Gc9uD`yrWcUIq~P~>gmyJ_OykNot-X59F%iZs(n}A z15q|NKi{0lYib65#{2j0AyRR%ItMF#6F=TzfSboWRcVte6+#N|tfcYMp-+z}!+et| zI?pcoLFf_DOsZiSVu>YsYx~{K(WK2-T(zDbI&Rkcp|59dJm62jE{p-uKZPg;Z{bip z3k|qO7MDK*2o2%=`!B!;c27>21OyVQ?N|4KlsttHd-TW$fOwU9H^#vXz?h=^sI7l9VlLG+t^P(%S7TdEuYenIdF02SNuF!he)1UsR0X`kjP4ZX8Mh z0-xENQ-p~gNR!(FVt6fgfjF5JEc(r$swpg|Hj}_zaPfu;Sk9E9ZZW19qCLeI-j14Q zP&2K+fQ$cxNn<4Vv9JiT%v$)k?j1l94rk~Y71AUZUxrzYlC^_U4LB*gZq;XyYOlYm zbNu=9XYJ68sXc-f}W29%7|60`ZoqXk-iAaX!#`=8+4Ru2ffW{Hon z0auSkT)h+HHGd=)H_`6?{$o+m)baN}eu7YKay!`HJ-n@lhg(zeD}Biat>-iaNcLGj zAPZO&H@3(1>0nwC2F2%+1>)0u)haV7&@K-K0-W92AZ?LBW52W=%^pA<+C2hJn-7R) zQ-kvJjf{=&3v6D%{((q?YrAFKgw?|ekV;9ITpj{2$>W$_*J*YMXr zZot+W9HGX-&k{!Z%RhvYxUiW?`fx>D9$+g z)Vy8Bc3jGf-1rzqF$_T1(b|vfv+k)n<1)AXVHqTxhKA;-!%93~rb}jHoi}&HnW@17 zQIS^)Zv=F_`gS!Ri=fQaO0vx`py|ZgHZ$Tn71qiId$e1^I0z3M$M;y1#nS>NZEQF?2nCUJqXm zc3bWyah%w<84jls&c_p$}5;$o+|qM6=LRd7Hee!BZdGr>r;ZS;20+H|1Z9g-zZjPL?zCinbGkel6c79LKMZl~`ccJJ)eMY`Jiz^$ zMj!;;kJ$QS zB!rHSk8k#b-{P1(D=TaF@DSK%Jl4}yf4j&pf1CK=etY-Dix->MuK2}`q*|Lqr-ou! zTc4wSvvilJO73UzFe?-R(NDJ;j^-1Vd@X(1VZRJDD6|;Pi~OGa$iL@R)B9;fVQ;u2 zk-shZe}@KByqF}^mJ9}FS&k$nCC5eTrGoNdclu?PVED8tig?NaKnfA9Vue!cvasGU zovq|V(FmZYr?0BPf(pb^W?=(m#LbpO=}nnlS9XLyvlvztw&jM$lyr2XaA|pn_G8Iq z`oKIAC6JRKkqFJ8F_Cw5(TsQbmypd^w6ZVn6y52ju>KQGl;w~@eapzWcYckthqy9* z9V9}=T?I?1sgZJN%U5>P{LXgAuMr&$^X521MH}s^&0gsQYz6+^%2MHJ?xL zWijf-$E%AI02jmbiESzGQ*$k1Vryv7AG=@+yZ>-! zEIl{PBN$)ow5diBR9h5#%-$rv5GHEx55J2e`ZbQTq(TySjIqHk5P)L1UH6ShIkb%s zj6lZ{tG^ihVowHCuy-mQKi+jb81#l*T^!{Cl0Yd4zw6_Nf&T~m&~vH7#V=$Aj~N&O z{!!X+|fF(%f5D z?+Y}mKdjThn9LoBAvU3&epov&L*o|NwC$s(fO@@CU1ElSHltd@weW1c8cSJB7ala3 zWqc2oD$>@M%rEG*AOI}XySGJ#{nP;k90GIA2U8E5$)E3id0WPc4bpi{`v(iOc#)+5 zIjb~!c_J^IXtyAk_wFqM0Q~HNMiA~_GWZ1PeoF;GQnyRsi{4G3ky~OWw1&pe#2?NP zOJ&-}_sb`W1i;>;7Q6xTQ?@gyr<^~A-hK*YKV8}V(1L5&`I%NeMIdr`SQP>wQlfy} zV~LN`iOpW1SU>v!GYy6Q@td z`6m-B_ZU0#90GwDk4mWIsH1Sy7~Ch5wa=NS6qnz0ayi3LDau@azx{|q_4<`e1^d+T z`Va=bGd>Rw&x0qnJ__WYK7Hy<;P#7&Azm=~HL)rF&$*v+M&Q&QO8)EDuesILK+uC} zI=pcb{J3sqPk|}8tZa({W{167lh!pMKb~dE4!xUxbgq1VWka4PvDBNjl1v<`XFmte z4`gLzP%;#fpA}p=Sv4Hti(V3l7u?X!?r#ZKOmP&`(@*;|)4;hltQ19$h%?`0!U}m= z1iRc4%y;=;bz;pM653X7jsIw6IFjweQud;sV};0d%2Z*^Yr?tA(UfQA85Ivm)FKb( z@-Y)f1q*AkabEwm-5IbB;nv;4K@Jcg?_+v{S^vtwal!9+-}TTGHw6$gX=K|t>hj^U$mH*6v@}{sJlr7#`Gu}FP2k}^f8s;grHc>*hZ(N zfNC-9<9>5>k_f0xUnys5tt}9(3FFIwk@C8dZb#;_1-2oaTyGoQszxi@@eKupt~h`t z#-85$OEMxNBB0sGeCl~f#Md6F@SOk~o1a#4U4U=ygP-4??aAD)PehQ*Rq>ll8%cw| zMX}E{>e_6vI1sj1IwR>Ix1$Zz2=_s*EE=x*Q$iLNmfnzbjHa9u#vk4{UI2#M52S%nf84ey#z=*mq|xH&H|g5aP^73uF*Ajwk}~CCoROZ$`Jk zGy}wbU^_FA`p)J6%n=;SWQEneCb})^`K3?M&yW&O=w=0|;lxre)J96Z^LRen5@lTq z)MIFrnJ9et;Floso(B|)a!!0aJQKj;=oy%PIM3>v^roOZH#B^7ak7IkH*0V;wL(e# z{O@o8#qeYsaTjozg0b~|?_WMX5Rj91n;Pmb%s~HZ6*G`|RfVP8pbKY`xVgR}=Ytcc zdz^oAoG6$m3knWy85$x2h@{GH5t6|D4xO8u8x-jI#l_Z+JsQ-NxsdR16W|ia2POJc zR`LTIzBh%htn=J-AW`9v;`iE-n>-_t{YpPeI==QDP>cl9VIWaS^2cWeQd3eJD!W~=7kyTOqEcpWs)e^?Um zppCo7*4#wU7;!8CCLrqVY%qdp&o0{h|J2HOsjSBiSIxNv3qzon3mg?a1a15IHW7)M zFIy2tEbupCWR0sDwfey}lwTh!WZ~T!9~eLUb)>Kb0iuvhT*fUACIra@4dP*8?q!8` z3X0B+-jt*&t|<8ER|f10QqkOkHTGf@HfOc8eOZ{r{V zO7^+&W9l?&OEBvLqWTYj+{l#Ne^XIKc-P1o8-(wxsdaUCKX%e)2Zmh>U_|33ZzzQv zf{-EBsHro-QVaq00eZ+JdqjBnN*kGh5$GiB`gIAQ zS(n0>Wy#84W0rOAhf3sPOz$uEoGpZKVeZ_A6;751g@=CyQ+c7mlv0+K?7-Dr=weEv z_tF;u4VO~fD+MTbmg7|@J{{EVpYKZx8UNdm^bf;g__OiAHG{Eqy#>X`;aj$O` zD|d>S5Lo=pQ$t(ZCn029U+oOvMMXzXRBXW%E&dshBZThUxg+4PMgS;<$?S~hQ}DfY zV&SbKC)4($V?ZygyE>kNs21y|Qt(?VWxvEtE+NXwVzwk07(vAadrsJ!03f|HH^2P? z2E*eu=`ShzhbgF4W_q85Bp^4J3FsX_8PckhdG+cMCucb5`U?vS*adXwVP=PJqKwg> z0LdLk6g^J$qY!dn=4v>73_|I0zlZB~2m%7++1OvdB*9#V;Ao+a^jMLe9{A0cT8x~P zmD3{tmu^i}nt~|{r!lM9ABc0etxAh6YhH`vg2zZqEUY(IACIK0HI!R$=L#!l-U8CS zw6p{!<237BxFNhIy@tDU&Fp$LF}=O=Vi%jdW6xAEh4(+|N@4Qn8SzhPe3a<>gAJ-5 z5R=a0_$|jj-(2l@bDBjGFucR64kol#>e@CseZQ($Wc`64i-3e>IwJ}VxRf!HUxXw{ zpsG0V%wlFz*QDaSP}ZIubx=WATic?bs_JmO|H!cXdkfCa<7DKW3dxr=sVM%y+QTOW zjgg9VnfpQjrC@F4OSxS-|AfQ}UHFzgNObldLopTd^X%{6&VP4MBNb`W-eDJ|}G&^SAm`R5Jm658I{4}D2|hsd!36ITa^r@4x$E5L%6 zzp)j<7r(Uq)@?JL_v7enx48cLq0TcK+7g*Z`f2)G~*8@nxw-OMj5)Z=KdHUX}MQPOvIc`XPS1*L@9vsk#iq;R`Zfs<70R=;tgWol{ z2-PROWU5UI#qC!@B{s|lGkg(a(&3b}>`!~oXZreZeYoPix-QQSWE5oD6n5HyF1r=? zJ)bo=DmYC*wSJi2ShQekp*oCi(z17fCSy*w6IKwx}7 zS@6Dk^cE%m)kNVvsURdGN)+=H0#b5{sC!(IUJZQXkR{m@^`8l}^{lKry{RNB|MFskdb z0q-nk*>&**0vL$))u;;zd=HaHsOjVhHm>?o0g^MG96R=0l_$6P3?_-+{=$42`as#t z6S&$1vn36KRvAXCbD$t}00Bd@_869oMoPfp$rKmBFipywOe`OENN_TR?<{laMr2(pF&Rd3B#`yO1b7tWHK zqVw2)P$+&nUoFKIM?Sv`i{n1jEb(t%sQMRNfga0a(VCMCi9kG{;x&yZbTjSPZ`?~x zk-(gHi9LV+IBsH-3pjYS(vy1|--~Oiq@Y2;Ij=D&69!iGz*xE4^$`SUatR1>WV-9h zZ7Yq8E7acKs+`?F7!W_WJQ$clkoMLW-j3@SbrEV;T3hiBdB$_l!D1lE%!$h2aWR+X3}lKK2-f4o2OA z|F<(Le_>sL)0Q;%@6QLl1r~ZHu+aB0>4B6EjP+>gM_9D1tb#zF|7#HbW$1?PQm|)1Nrv>n?Sua9ZGa> zKi=;{1we$=;C~S$+x!g$0~D&V@57;ha{$Vvw)X7$=rVQq;nt_1AV4oYGN(FEbllp` zyr{s~2?kt8!!>%R(xdA{$Mt`wx7~i)u9f;3wPLu(vfN`sSdR+<>*X?72 zXUHUSzeim~z5W(8JNzF@No5F72Od0gcmRe#i_A;{oPqBTK$gqVh=!GkI`1iki_L=j z;nq+*V6`RAJ2TLDoltw4y0B#7&LeYekWAtzKK2q4NRc+Q*28&37f0aVA)eV zOPnS!P*;egcHiVyFVt@n=HA%_AeXe7(t6e+*|1^E2~1?*Jb2QCm7evs#%1p@?wyC@ z>=qz(+^$mnihjIn-#-?%DdTy=u-Fk{dTYbpHq_oU-eenf4~driyTnqoK*<`KNpBC1 zWlOl8cgT7vEqHWLB^!%V1-xc3OGutzzW zTEcyPzk}5sc3}YRfe?*07wHtC**Nfz_Dl}$AaGnWT@O}(_;)LM;asB&iBBfJ>j)Rz zX{}NMmq;t|@rm7nB+#%>UMVOTFZ}w1Lk?f1{L`z&>w0~*3c7I3_av>%D_~XvOXefU zAutp>4h&gPXGeXL5VgI5Ny1K>88Xp~qgUA4co{?MYruypZafz9OCw*(QGCrUdNEyg z>i{c8P+n~@v#A$k0H!f&_2I*Z@iJ3<2=H4N1q2@W0EGNiF}=S<>YnSxR^{!rg8@Ep z;C^7wl+gWzJt+B0x~jbb8}YkXvgRlwzl=}T4$Sv%LTc#jce62?;vbT zfUN4ow>-gUVKA6>baNI>=R6&DgW>hwU@HEVyAwhDnx7Bsrkx_TI{JPl|B?@y_r;)o z^jBD6KO$|P4}vy0>xsj-(nmZBbLaYH-zaNq>s$54&SZ!+3#`LG4oTZAsL)Kp;C;(Z59k3rk|2N-%4yIN8qRA(Tr(Nj|zKVfTZTZr~4 zlkj>j#n$J1IMknxt#<=@^*(sTRmdbgZhX;^7v+Zo4a$G<@3V>UbHOT5G)*WUk*p7L8S8H%IVneFH4Ik3a8dlICW)F(LCVtoMu4wAWpBh zEvswv7IB%O#BMg(4wWtMfwQff`jhm;=<8#N3w%&St`(q?@ zV=AF%a>URe?2HoIvJ}7CxTt0W4V%5y*-D=&(JG6vA!U?-r#56ybuekMHGl@!-~1)V z7=Gj?1Ua!4o(mJ!$1L84#ou$$TR>@%<~yCw;GfqdOK5$3JJ8OW6Xl=m z$dfUZolAPFpJ3X>wre1)qZTp+?DgVpm*Uv0`Pe68likBC(J2QkV21T%`Q^rkdEM#A1n20~gLAeg!_98TdhI#2mNwpNkxle4PVpRqzDD=-DRIQh$Q8$YSGJLdZ!1-} zoca6fXl0AAd2;~ruzkdZUpZB6vYzj2b%Kk$Bc--|I6&NaN|y#oXC_9>6m9M~dc8G= zZuwwYO}SNo16nYhrJgQ#H@`w8$IwQJ7v rK1akWGqb!cDf-*ld`)owZ!oNWPA@OV6Sjkg$00IOFv%jQ;fMbNPJg+6 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mtrans2.png b/doc/salome/gui/GEOM/pics/mtrans2.png new file mode 100755 index 0000000000000000000000000000000000000000..62b35bb0c172183481c7f9e6240c7ac577870097 GIT binary patch literal 19494 zcmd74by$?`x;H$4f|Q6zNhvAPAsq%OB?1D{Ez;d3EhXKcfFRx79YaZX_rTCy?={bg zZ>?wTwfEZJ@&568IHTgsaL09?=dUgT-^q$&V?4%yKp@zX5+d&*5F{S(xW0!9z7qOT z+YADE0+AGXrTEEfd)7%kYPIEdf1oH=GJzp7fwJmkLqRnVGt)53^L0Co9CSZplI5pJ zYYC@Y^t=?RFaj>&)w_;(l2~Q);e%glBbGIXCf8A(*q=`ul8&(C|F#* z^3^I6q-SgFI8t2U6htrKRq!bWTwIo6d{=>?eRhrJ;iy1=dVkW^NYmCt>DE~27}Edh#BDJirir8X!{tx<27QlV$(8Ovrp zEl`fr2WWA7)Mx`qP{$SZ4*i~mmet4VJx4z>ywfqVrxP@)ujOiO(OE25SeVs&%Lf;wzpSGRidl|h~N>lXLA89yTPpLXOJ6fL~;P
    ^1rM*708dIF)yTrtuwv##Y?0&aQs8@NkVF#;dLd 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mtransf1.png b/doc/salome/gui/GEOM/pics/mtransf1.png new file mode 100755 index 0000000000000000000000000000000000000000..207e920f9ca612daef5a63f9dc5447e6b35f1581 GIT binary patch literal 17130 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mtransf3.png b/doc/salome/gui/GEOM/pics/mtransf3.png new file mode 100755 index 0000000000000000000000000000000000000000..628d8b0a634fd410686589d102839957e8123888 GIT binary patch literal 13844 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 LELkXS^6`HG?=De0 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/mtransf4.png b/doc/salome/gui/GEOM/pics/mtransf4.png new file mode 100755 index 0000000000000000000000000000000000000000..cbe904444dcf774e376fd082cc7662371e33b5ab GIT binary patch literal 9687 zcmb7qbx>R1zHflyP{I!>4k<;77k7#mFNHwywpg&>Ee^%nLUDHrv{1AV++CVr#UZ#A zcelGach0=I@6EhB=Z|DocCzyVw<4?en<%{>Q$DTyjf7{Sl2n80#!q?EjYc*zRSo%FjnHC|45 zQ{Y|Z6yrR2^d0YUEsS0DdCWUm6N48DACekgy$^Y*_&}CPHzAfOI986;VGS+AD)0o- zq|vu`kO!b6wZ6H2|Ztr-uv-er{or7Y3H|_|@5|&~?xN?~7#_aJo8b zj~b@&=^gBQZ+WG_{fhkMYSy#G5I1S1;yN(}C8fg1XdM?<*Nyp>7IE0Nk2rRk@vIUg zxFB(PUFW>#x4w$Hx^DdE&v@?WEScxn+c)(_E%=aN&AzVe@@yTKVGd6iIjt}>96A=4 ze;I9l(iJ*Dyjg9X#N0M#v`<%$D(2#cuThe}+;+9VV^(O&8{>Fgataz^7p9?d;iKXD zo8aSScm;X*a_F7B9a7dDDXU%4*L%RiIrv;rLb>WyjX=Zp&LHZyT>ivHZ*9tYIxhxW zFdqzxiN*DR%9RhcL!Xt7raN>w`ej%G6Qm)+!IGAirg9VeE95y@EN$Gd5!A2u9z13^ zi#@ganYT&v(?Iq_TuefEU|<->1*?LT^^ojKgd`?bF-%DO@bIwCZ-+)NEdqy_CVR}b zZ*XvZy2=hDXg5t{X2vW#O?P+*jV-e)pZ;Cikm4_G7?GHsZv5vD{Eg0-?Zi$mk8&dQ zv6ov|PIOAbhaz2UlC}$2#leW>KUO9kD*dox;ShT}tixyTnl3o~{4iG7HTJd3Vsg>i ziy553PW0G#{IWhHbug7kG{*1uJ3Mty!N}ka~0RQW-|zrO3&)n>X<{paQ(-b3N>x=tKkMzabutzZv2cIhQskZCWlvsoV*z^@mIq@ z8e`_l4UJ>s+ibV`v z?yzm5fO**p$AFTs<;p}~PEKxU>!hGCtgtYf9k%-tkH}tg}nW2{T!BRoAzGi;TFs#;R5gb7y#H465*k5eSu{Bb|xQ42u z&3=xRn;9{qi8yNQQk~E-%JHgv*K_vBc$NraJDLIU6Lee(A4}Aljt~qC3bL847n%(% z=5(ziG23drAY89oj+B5=7c91~`tW?GY|5rv^E_f*AIQp8iDUgfPArO0;~teA!9Z6|V!e=+h3b-5!AN$M)g0INQX9b!8SWA~ zJFXE`1Yupg;>4Gdj1^_VU4?7<7V~qg#TsO(l`yTM zMAmA@+1|o2MpE=QvxLn;o56_f-(d+wHnRs9`XY*-X-4>mJ`clIHmh{MDlyB-%C4-f zQ9R8ZvFRP;oer{{YZQCLW6UJQox!Ssg%5vgz8W=Ad<-0H6mffkGx68OV<}izz8QA)tFO5x!r{D zA_EXBScSfmg&f(s+mg1zO&jh#45ucc8Pn7=|r*2xrcHjxu74oRD zW=Z~sdP@IkXU6dsZC9h1&P7(zDdzs1(X!}!SuKS#VU*7*cBY>V+b!{~#Zr9D`QVQz ze0x$9FWdX0b(^wZK5I1Z^sgDS%Flnl9;bnh1Cl7M2XA)J zJjNPLVL9x7PcB`yaMGtNqlmFX0t1i(Kc~TmZTne&$N7UayzexBl-eb1vWMrOX*ldo znjg%c5GC4QJ)COxm3X@oI90xEq@IzrR8dWsAzr!OnMu)FWIx}W5pBxrJU5-7NiX5# zvd3|%q_n@?i|b*#0qFE+ZNSsT!DGMMSA8)%X-b9B&UGGu!J%willC%ZeY(=#XaBB=$D1Hd4EfSR7bu~loCc7!JWVnn{=it z8_2Mv8eOlpq$bayB$M-TY>G2mj z@hAc1>Y)lKA2Z`ECrHLjJ@;yF+Nn?EYvc~xXl^ zxD2ha@0(vxLnOPpkYbfKW8@J^@^E-*QxX&`=Z8aESEr}@JbxsIJ$qtC0z!N(cx{Dv zD|nd=b2qMy_nrBW?KDdn{{6+QR+AT11SaF)P9UbF)G}M9?+#T~<1jV_MNxlfRMfZ8 z`fvL}Os5Yx$(@9I44|V%)~}J3s|unBQ zuV$5UNukhT_Wg^r+4Ly{Tvp`Px*PIUS_xp{-zBtRR!Pf}fe)ElD%FBa*xeRvL5GKq zj%ns|A9Gutd0d;8vie5m2xU(n!lpM2KuQrbit=a;3Q4LA?VrCpd_k;m)`2Kvc|PenY1GCp#p7YVV(`>J5R;oY<8#Z z$!CG;tm>>}S5d|QB|fe3#Z@hA&`1+5C{%4(z1< z6ch>`MGWeBDc2$#W&F~GxoL;rw-yp4v|J6WHC`;u23HBW@`wc`t(Pt$s~rCn4qh9= ze}Z=v^GEjo2+UGREb)|@wRC@&_x;rNCfj{$d?4JJp3YiU>q*A*TMa_`;=xauI1muBz?$B;wCdD4Tq?`AJ9PU{;gNmiO0cH9}oe1b>vwMJ^4&9856w8^^+&JsBFVWS14 zXJ}WgI`^b*PH!i<&zp5c=B_`!Zfa)1tqzZl&QB)HE_Q0>Uy^tEwZQzO#WNzU`cp}1 zXjGe_t401B`9q-CPr;xm?EJm7$&@A4( zgRUQB_LDwgTQ(Hlv$783J4}ESX3sfyc#YGP*sy1>*^=4j_Rvuk=44KDL0jw6-`;0d z>bie!dE0bGm+x0Db6CK?ckMJvKh?wn^zcuq`;@zW;)8T>yImFP7B8ZR77`4uQpD86 zTdaaNsIRP-441+_f#r0K4(!a_L54l~firZmID5ajQ-qM< z298WiaZrZd!!CS?q}c%%Ctht}jjY-u;A(AQ)+tg8f~kQYa`d)KM&{GVH@wtc}B>th10(uF`>2$Fj5 ztK4^JiU7EMH#dc@?grpxB#p|sMldE{YCBMP=Qe@mYKxW(eqhyl?uHwhl}}l$?KbQw zL7{*C{P~@VIj7LalKL6p$b5V=T zZuMi5Ros-pURU@dYSA}LJ&}w>2PeAF#Z%yxQBxMILP8V)B{R1g=szEd?yRo9kg+C; z$-oVaV+IQgT~1L3_SHsZtO98$NnlaZN&6(D(Z&FgO-)Uq(qy68Rm0LhGI7|yh(uuVrbGtG$kjBfW4y%3 z^I|n=s@j28ztk84H=xUq_`u4|9RcwCGoWXtsn`D?Ow$w<6dp9Z-&qPGkp{6>T?c<5 zOBQitK&+$INLuc&oRLew$S!w&AyZH1i{Un^(S;d>fQ8H_f4voYr4{jj?&Y^UZacim zh7XRK8RCkAnNk?FH4{zg;-0_7TJ-l!K>)u#^BRSLE{``l!p`&;_V%J){Uun-%X_lh zbY=>&_O(pl-TphAtDvYPCSzAM{rITpiZ=|Lvpf2_6`G`!3*qAWdUJIKfCl5~&Wy5$ zN3H8^bJNx5&y{DrfJMY@bv4g2ADokVfP>?*@rPx+*c9tI@ORFEwNnc~`1$SCUWR+T zUh}X0eJ8y#Q;nIS>b$(X=;Y+rNF$!$0&X~&6DXXL_g(if_4(yxY(_?ZPFHyP(bDqr zmxu@!X6B&D$=9Gv-&2E}9tCs$G}v$>wuAgkh1ZxZCAVp3rHodtcCM1!E}A+*NyqBq z*|0etF|pWUx4}jy z3#w%Q{PXJPAuu>>tgNBd1Jd$o(ZZ-KnU?o7tieup45UsCXWON^7rRpRakV;;8Ti`s zeT3Q}U{ke!0nL+z;Qy?NWZqRQ!Rr|bld`N=UBiF6vXxvVpy2* z_tygxPxFhn>y7PM){%Pzt(j8Ze4AgXB9z2$N_8lVc!Qlj@ZgIo|6+OaBwn%@}fC z3e(5++4~2%%MKE4f744oa{ac@5byPcDUgpQ0y>Ea3C?$#0#|v|iv5_lxzXjGkvCcDdZ$*-lJwP5f`kiIeN5>-y(SdeRc z9HbC@@<|O#6FN2%T9B~1oslpS^sj?j893?7hf(bv!%J;eIu0;$jgWaJv*B;~MA{(* z{>FcT5Yxp2Oq|6P)-UPd#2VH~MoOUta-)pye!RBm3Q@tZZqMqSu+zDP@dFWM zlAVavPZ|DnS@bd#3lSHNqvyi-5OkcHms2E206RrB-IUsu!zr9{a?ipkIBgi#Iq^4K zo9)ph!D7F$SL`>Ak9uf3g!M92YNFR8EOPvsZem(JGtf1h*c$TNMpJ(E?t1Ob!W{tUfBl;M&rQ6%fH3UHF;0SB7?!D zYZn;Sf`5{`DQMv03^7lF3m7G(7c7#W2D3*)jJL%u?KSze~yCP5eYWlF>>P{NnF>#0!KRVt&`6T2dF} zxFqz&7bl(S?^b$agiOo8?MJ#23#^*Suh*_?EuBGBK1BD1>zn+iKjr4i%~RLJAQcrA zRH_&u6bc9r^SNtJ086Iod~A+L7^P91Bc^Q=6G=cQ_Dc}{)K12L@ZXdXUyJ^Th3f&} zJN`ZiQ=Y?%FAk`xpX}~=%K!;dhdsZ*`|a2FL={0R;vsSBQ2$}iboVr|Mkb_y7XZSdJH99&hCD$G zO6#2M%;YyW2x?-F0xU*wM=kDFU`VN4=UC%k6v-f9xHDOvOG8Ti4SsE#o0=Y5{C;N| zIvZ0fuc4`;cXzboKRS>hA(4cknlWGJYAqxUF}?pHshb-rbGNlVVEMbSM*h>oP3tWG zAFTOLiu`Yu%2?oKSy@@GQv%k51p?OnZsRvuj(544V&2_#=yUw#F@TZ^`kwY}9^@?# zYy{K;>Oe@0#o)$bhs`!$LL#A|3HZ`-R}HdBs9dVc8V(W?5`t=IXh2(DpNR-Pek@l~ z4zcxA@xGpPUK_{=&tboxp1;qA>7-qfbCsk1p`c#n${({0=hC0P1~|*>_%BBMb!-2h zLS}%D^zNIaXvt zJDnIGPyP=X*}u9lH1zTzy?Ce88MW@BOk z$;ikgc5`EIw}}80_$tYJtE47b+?``j(C-sZ%hs!RM*UU-Q4hW11C%h(sK&ly>Jhcs zQtK?=L}0{|QLKi7jD}in~Y7pI3?(# zX}3MUzO4)a1pZUCG+D#ym5vU^Wc|*3C%3OY&v6MikTI6R1HmVm4~)5|nyhPz(wG#Q z*#0+^fLedxujSN<{;4@GU_Z&X9tRBuyXVf~()AMW%6V{7=MX>|6OR|r0g@}PMjyHR z&euOkPx~Ad^}(Gicwd}ffkMuMd!r5d%D{0vwuc#i(e%keA#C@sLs5E=ZhlOWn^Z0y z!1#pt^jLKl)rtqHV20l()3VDkTO%>jUIbSO^SG>PIY`!`_Z4 zKBv~_(#A)C1H-grY~{5xwE-lb{%UpNcqnj62lW1wOpDhDFXFTsd)7td1Hf{rXlb#D zi_?%(3EAqVAaAdcg9)bddC4k@b2f(b-$T;C?Y?6+B=E69XyfhW*7?;H78nd}O&4>0 zU1ghqK*c}Rq2l+zySX~CzPr5{*l>`aj*XA+{M@6wf4<*CeLeXml0k}~b+O}<=gOio zm9)L+;PswBUVc7;3r-C}n5CKQyia-rk0c|J!#jJGkMZGPNl{K-K3ts;5SiC?M+1XV zH)rNPbq8vu8Mhod`Q*OVFjV+6l)tO=mPoO6n-Sq>&u2IRNvtiMfMS{iw|u~Ei(cH#NmIggjfmT*+Rblwtl<$zTU$F_ z%DcMvP&tZ$g@gb1g+b96W^{bKLKK4(=*s+yZCG#`II~34+sVB9>)Y{S0}BfaP;^X8 zTd@IxO2FzX0tIML&}5w}+m1vfZ-tMChbSOAAB(Z1V9C(E0ZJv{#^LnSLwd}Gqd{pl z2;|$eLxK}o`_cW_s#i+&h7wT+$~rQ!v3(+CRu;|2vY)Q}0;IyRnVFi~?URp@y#G@@ z+A_BD7}rJvPy_5W1pvNOZ8;J1bRmu3lAyd?aqA}+z6eB82Us6D>wfVU7_P1-*8xkLOik0kko}dAH#^B7mDNiD$V4-V~Q7RzD zG9{)il!p4pMb3jM3a=Ibl{$;2`%l7Ac%u3)!Rhzoq6`SZfa!-Ko~dQvDtRv_`183< z7KNQ?hI>b=(h6uLy(Y$-@s$#j`&r(@;(;5a1JxE>!1CYq0J!epiP!)#pfvusW(iGQ zoGkpqKXSFXwz%n%NOio$(n5NtLoNZp_{RQ!h#tCwD7XiPFYoan3Zw@I2V>2uxk^08 z33iKsboluL&QMVPfxq_z&<7uwd;SA0Y`ZNtAI6u4a<3CFOGuC1-ekpFB;6ET0O>+Y zwxC`SZ#zO`qN870Q3IF}X}IhgN=&PSuBhcl_THA%hi%WN>aAnox)|v@#N8M*SloF% zOrj6knk#9zF7DKVD6H09Kk4`wgu7xbCd0B4TtJhAoxV)S^_%TV^>d-~1sEEyb(#Q% zGE0e)Fx?-DVMxb~_GM8RdqFaQ)!Y0}j_sx;i6#`PS7zAXih=d7Dg-PrW9h|^Cuv2) ztn=c46d**9cyJ07kh~N^qZ)Qx^$~_8jTdWa$9of5pKkZT_YfU~OCr9Gye*_kGX6_g zx|2|B&=lHlBpkPIiFtc_3sf{2Jv}kOR~n(;mOC5~4W|pb&{brF*5C#SY zDn;NEv`CNQX;O4_>*U{ZU?-qHCq;92I_PR6KMU{S!?la`EZ##aA;5IlAxzExMt{5S zI2P{1c(K{HfAUneXKF|Sv}A7Lfr=WR?XFGHlD-JG@y`r3EyK+Q^o7s);-^V_Ve1s2 z{p@dyED@t{x@;8DQV*m5gEwQpp+sI5U}gr!whj_0)Zr>pMOF1(=Q6X0&-pTupFJOd z818-V$Ev(MiFTK|!h=IYDN`sZDZ4LR*E6yvN{p1{d@zyoMv-lA3bt4&7fYpTiMK@d zN8_}Hg)6y1)&uFz1GIoc$2Vi$-#pg8cj(BBhuCM+-7|YtCN*$+W~HwMK_yOFk9bY< zpiV`PN2Y5WqclI*4GDSvu`u;Kp%CtLd^25Xqn;^A9nf;U%FE?xjqh)CC$dDgq)i@@ z{K!1{Zp~-h@%3O}4JG*Koq7g5s%R9+VEo@`Xdhz(^x>N&GI3zg`)qr)J%n&&Wo6X; z2)-OCReOEyBMe9P3JgjH0r?A{Ee4!0|Na{=#XSqr8zA4yby`3u0JF9EY} z)fR|dYWpKj;&kEt_GFvMhgn4zRenI?+0Rr*oS%EF%k(q&fn`6laED-m$6FIok8Y1KwWJR$=pDXzdu>K(J#(CsTwjb??ukVB-FO8C2BurK zx3^EW_{)HU{VVIOB%V>_@egFk&j*iG;Nxt!R32L>fiA!CPs zQijD}pq7!%wUI%K@}Wd+*&@+#aUGvyn8WCv=#z(N=PEz**njiT$3I|K%6KB&Wwn{3 zA3zAIXNTk9ijjhoL> z+-lC^^6LiL_iVPavvXm2IjHO1+s)CRrPGz-P~O2Djxf37Nmx#gQj+NW!E==oJ>>k| z?ODCO;TJSF8kERu<~LIbC~i@IvqlT&FUSO8DKQr6wEpgUFS1?U1DJ22k(VUjM>dkh z>{tQ0&gI;^y!RIfI*zJ6m%Ag((Y4Ms8h4vpWwzBZ4B5bZ|JL~MCmmXhef^Vhw;4c5V%-!{o zB=CYd#OgcOv;<`qnr14V2v(HcLuaO<`-zT=)M`GkT!Qx>s46G~i^I{P_fvZ|>t}jC z(y8hm#ip730!V2>GIbnZ|h`N0&oJDPhHJ@`>aHGIU_*k7$RCOX;4(4>4cq!33?C|v?DQ=j?o%^h&hM+h_zAfA|iU))z322kUiW7>Ig2B5*#ZFi+ zn%*u>JDxtIB{#)djymft@;=c_)cmG_#*4b0D^%`@fUzRL2FuelvH|aCjhQiXzHAcV2ES;VP<%| zz)v~6LBvMh$Go@;bgc^+Nas}fG>%BA3Fl>R|L^6!d@QlXGt2_fG8Si-<6H78e{x-2 zih7}$0rZ6RL_ZK!HO`?75Ms$*GGUk;1lg3xEIEP-Rc%*o3JONwwpPK01+Ky}+3>>W znufw`BtIr)aYS0)JAwcxvi5vq!>&*chHoQ}0mUQK3mc+bNzE<7QEYG&Wn(XNDf0jE ze1O;a2`g(3R(xQz&P|7@lU}L#t@$3swDJ!$LGNQW^P@$%!w|!%7Z8P;youTR-dvAe zQGvb~?HWIp<>Ln6)agO;f{;?$FJHfMd69kr9*Uw;uEn^PK{f2>e8xT+2Oii0sVHhH Jl*+vc{4dF?0F3|u literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/multi_rotation1d1.png b/doc/salome/gui/GEOM/pics/multi_rotation1d1.png new file mode 100755 index 0000000000000000000000000000000000000000..4085f434ba1ba0e703c8cd39b3716419e1c8aed2 GIT binary patch literal 4300 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 UZD%urL$T_>h+TJm9oMPOd=Z9KB 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/multi_translation_initialsn.png b/doc/salome/gui/GEOM/pics/multi_translation_initialsn.png new file mode 100755 index 0000000000000000000000000000000000000000..0b7b70afe34865d92e491e4577bbbddfe9559e1e GIT binary patch literal 2158 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 KUhvZJO%Se literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-detect2.png b/doc/salome/gui/GEOM/pics/neo-detect2.png new file mode 100755 index 0000000000000000000000000000000000000000..f0dabe311d338af72e518f734344895efc939200 GIT binary patch literal 8014 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-isos.png b/doc/salome/gui/GEOM/pics/neo-isos.png new file mode 100755 index 0000000000000000000000000000000000000000..dbbcf8ef534ca0fa2e5f1520528e7286c2661542 GIT binary patch literal 7042 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-localcs1.png b/doc/salome/gui/GEOM/pics/neo-localcs1.png new file mode 100755 index 0000000000000000000000000000000000000000..9bdacafa251f8537bd29c5b5adee370e6cf7aead GIT binary patch literal 17595 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 aZCfQRV=6673H(tKBuO#3*9D?FpZ_1!q(lM$ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-localcs2.png b/doc/salome/gui/GEOM/pics/neo-localcs2.png new file mode 100755 index 0000000000000000000000000000000000000000..3fc54a67ce73f3a8063668d7ebe59b20fbaaadef GIT binary patch literal 13085 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-localcs3.png b/doc/salome/gui/GEOM/pics/neo-localcs3.png new file mode 100755 index 0000000000000000000000000000000000000000..01c8e24fa2b9ea0458cfe7a59fed328d3399d68d GIT binary patch literal 15322 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 V+z2cI{AL#-E2SWrC-MIC{{e>+HWdH> literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-materials.png b/doc/salome/gui/GEOM/pics/neo-materials.png new file mode 100755 index 0000000000000000000000000000000000000000..66917490cdb8f0ff9a36c5efe8dd7ec628c15507 GIT binary patch literal 12972 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-obj1.png b/doc/salome/gui/GEOM/pics/neo-obj1.png new file mode 100755 index 0000000000000000000000000000000000000000..88a7a8b8a892c069aef47857a6ebefbce68ff238 GIT binary patch literal 13245 zcmb_@1yqz#pEseD2uMhSfJlSVjgl%Q(k(fJbmyQn2#83Rf^>JMN)6pTbPYXp?qzq+ zcXr=>_xpCw`8bDjo|$>(dG6f#-{1cicS7GO$vwoOz(GMldHCkF^m`N(R6+1hiG=~4 zQIbnIL_v9i@<#fVnpWV>oX1PGvD@2&^;Gf?t*z_=@AS0vbj7nZlC=CdY(tk0$F`Cm zYz;j9JHRkf@_x)sFydMyvY^p$IV#H5Ol&3sOG+vb4;08LBUmonNlMwzv#idu?6V@Dm1d9gHiE)`1^HKJDEh7 zl4n!&4w1+q3tmAHk>#bO&lQ}MOp2Tx-lWB*wI6unXr*fkw?A)lcgDvk1@}*NhgSAd z5fiJabqmmK2|}oOZ4%@eqP#09sO#!H^qL$4y)&adkGFn~S#`r;%RRAdD7=jobj8J< zNmdozeX2rGb@}G9t8&Wv^`B!F-TnQG7su9Q>c`nIen`9!EG0E%kR?pg(|k7~t5Ed* zdPaASe@r02XIoiak2ZU5zx2m2McgN-LowODAy|ZiI2JnWbbe_i zVr>^JO*;Z4k!f8XTTCl>^HdU7Zt^xM|^aZ|Rg!lfKuIfX;z_O=y#@ZEIy`d5czsfM{DR^w9R z(hO{;D46gIVEioKjk1Y6@1sJ5Fmp0kal&+tp73?@(Y{lOz?q8YUz!n(P~y#OeT4ESQob`}AQAlmvhdTLrX*{h^-FdB`_4#%| zCY7jTUhnF}O#{BNvSMSNV-d%)M&35R)Y$ZFg}jsR)%nNR3DU>{DK-HL0eePxLg%sd z#KFl)woLeAXNub5+2i^2xi}ukfPE*m+hAdIPz7||VbM{e&aB3249CvSPECEa*w=ch zM!d4?(5J(vdwu{TCOW!plPAY=@W-n}GxWIa_YYhKol(d!R8d%%bHl}^>jn1JA{pV6l(C!Py>z(Sp40Frz*HH!~>*;LqLx^Kuo9XW*k-VLs)@*f1)o`N$b1QQIS~06*-#eWgxz(68aI$fSO%n;kjtn3hFpE3aaY-cPRC zjOCxc=sh7-$Xbh2*GhDBjNo+>YS|^GT|Gv(=jpY??b=LbuM&Xd5HcXnRs8}FoKv&caA7hCXB;9{VALO4R%{9jNgwq-NpoOgKRCSqVTmL?ZymKgI=ba(f4 z{GN+2kBIn1>Bz<|!ox%K?tE?T0}W-v7~#h-G|G6%z5ZZ4neDKGjn;TI)EyyGKQ|T~(&-svHMoD%@pRW`NwFMf zYwB?RgQw^*G;ZKeUZHMHt z7mC`jeHJ^U&r&e2)ly$KLxa27biqsJy+*N568*wMnNIQsUM_^nEtUQoiA0Gsb0Tfp9OX+ zCarfXLcWFhg@pOIAiW9UIlC?Y?_0?8`hv|rKCZMz{(DP*NezE#H;BJv9tiX-+nAFU zk4TnZU=T}`aAO^4tPGynH$!ZwQk%z4ainT#YIF$3&KZ99NNJw3a|3f#YDyHJApHCLb%h{k<*!u~$bi#b{ z3=RX(*AsK9S=>EKbEE!l{Q4%gqZTx^4Rj6#@kGzhYwt#GIfWWbJ;Oo%<<(Qk|lm->f(Ji+`Vd3y>s zVwH9iahYDm2X;a+XR#(9R>@EfBUt5JkIjd#F3ILg#8eq>!t-nQ|Bf@PtWpEOH8h&J z(&cBa>OE;gqMl8(+{j$@^fRtqdbaciokEtU4xp3JpJJLyd(!KUf8HC8L^7aQz?;Po z#+S=e4)>tedl^16{8Up-VR%jR>~+dYS0QdW4(gXb!zj1}4E+sCIzjUtJ>tdH)+T!( zxv>Ww-p_^9NBnl4%y&#qegJTUH7q}4%*w&lfsTnUr)$skpu7Y^{@m0oI^B)I3q$#w zJOWLYB+X-ofVO`J#ZRN4sC0X{_C109lu-8D(a)n5*|#Sl%G@zD7dU(Z;j;Y`UA5m{ zci2SfmSwxNr*BCg{%p$SWazTqMhzqCJY~- za!R68T|X73T)mAg$Y%{}&NDmjibumD<4s>~fy!5`&Eq1FP{yr>92=7xVYk%6Q70-1 zr&Ql4v96&^Ig9y5p|-X*vf}i`#p1q1%43H3TTgtu5{&Kn3#fPEnN9Rb>{#_O#DKj@ z0a+i6Py3A5**^4~X&}qdO_!^<_Hy|25pB7X&fzLP6Z>)EgtC%SHd3spZevXjvqeP6 zx1*9{?fmcQn*$$Ks?NHW3d^Z0C0>e$LPA2>1{$xh>Vzn}ySwG?I}3A!p@FxWw0YW6 za8g8U9CI@3P(!#(W6#7`^s3uFFuy+u*~A=T-d{wx{X|h75dG6N1>GN_bo-g{&5n0z zX-Us~>fIR)f$C=x9Kp= zw|m&^pyl~FE(>F&q{*xpqD$1ypV@V$4T5ARwA_CwHRY{ zFKlgX*&{EbpSf)cy1hsph`Z$qYP^*b6M)de=eiTqY?U&$ckdx_4F0x!4173i&RTzO)`p9N{CzEOZbn64`(EFOK)&*-rU@iL42|5UG1-C zus^U+UlV^6nTODi&=ziDqOlb|xo(W=RY2#^t>&Fe*T9h(`oWw%LKZ z^vrFR>*{7*LO{QIC}AL)L9VvKNUGii0mw#{W!&+rKD^qb?O^=i!E$Y%^G;5xFr}Qu zEQrVp*NrByhc~evpF=1}1ZqsMHZ3T&>D0z8#rema8jqEflqzlKk}h`}@QeBrBXlFn zymw0Unsp9Y{4>l9YrfAldhh@|0Pi8g#V9W?@9OQ9E*M){UY3gI)F0eR358!V4bjpv z*K99|9^!S;Fc^J&Uj$Hdy(4n=Cz7E;gv) z^s_aaGIzvN!cvhw=qyc1t(=|s`Qp>5*T~SVl6RwBPICiKd@&hdK&&k^H_3Y^DQg2U z*_t%!S5HSDu9c$;3oNHqN9^0E_)f(#qA~^8YxR|jzcksC#iILDME|c(Fa{NzTgxYi zP16Ms2o#<9EA#BxA3iZ;D9O=MZ99G5WV3LxN9KVTn0-KcbA z1;e@|87Tkk$42&0r`}#NM5oX_E)h*BlZA|EtX?HAkRan3YnoZMlfCfYqk2QSfZV@f zkf{hKdv$kWNh~_6Z%f)5_96Mi&Rb7c0tl)!7uk7?#ihrX?{o3S|5l@u-cc8X+1^Xh z_^fz$qyBO|oYRE>f{Zw}G&5n82oGk8ZXuw(HAGYT)F@gW^i-AgG{LdB+_J0`SQ%cx}77>{cxq* z`?_z!-OJ1AY~M&0m$t10)3>N>6^G6$J-}rTt<((RCe3B2aTvQAOCtWFarS(OEd$lw z)xjK44qOV}5Z9gQgT6I8b{O%lCCQDbSr2g}tw{edVj|RAX_OhHkjNd_5kVQRyX(h&9437Y6BBqSsvse~lY{@6Fq9dbN)%)WrIYwj2r!1r&vBd8z7Zh(2h z&dXb=(~}qHht8@n{ToWPc06Gyr$St9Gb1~h@Eq^Px3r7fs!SkBbaLkvis#98cPJ54 zzM5?^zs)-weX-5?CXoV-;`X^Y>a0oqfj|VMm=!O|n>TNca5pTqWefP4j(z&3`TqR* z^EEChNF&E=veZap?*Uzajhb$&y6Mf;xx1%_DSPRW^B@ z3^V+|6mi}Dp*X{@&Z^1cYUw^Z>99Rtkt`cQ;jq|#e?Hu+MA}EhZTHW_1Stv>3I!Cv zVrL}j`*-4MJ2>7;V`KX0=xD%f9kxbUKKp+ba=p?TbB!ceiYwJ_<I-Q;V){}4P7=vln#rZ}Q z7Jds(_iSo@UEA~siOG|WXstT39xIiR3`y#-4bJ`hyHB()mx4`i!ux(@MnQJjUI(|i z9$C8g(Tj_jqX0Y{4o5-j*8*zIivWXvXQM)Pn@I2koJ#sc6*DcK=gW#Fd&W(L%d>3M z*~~SL4O_FZ6^fs4m<+1W&!TL$VJ|Lhdq)4<577+E_�CckgeM#4#yPN2N;W00Hc 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-obj4.png b/doc/salome/gui/GEOM/pics/neo-obj4.png new file mode 100755 index 0000000000000000000000000000000000000000..db5d497159b2af5f9ff007ef675d0a2586e11ce2 GIT binary patch literal 12077 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 PgNMjSDoB)wzxVxr!-=m$ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-obj5.png b/doc/salome/gui/GEOM/pics/neo-obj5.png new file mode 100755 index 0000000000000000000000000000000000000000..e1579f082403ed62cfca3e0872f5850901b6a74b GIT binary patch literal 11148 zcmbVyby!qwyYCv|G{%{&8)TNSOE&^J@8hpE@$2SrIEy>c^v)AgQqu5`6%AVXlw2?GRZ|?05Sml? z8{R*_&b^EOt}66_wB%KowI-Ap+id5 zELZqS$oQaq$k(V|YH5Xcn*UmMen?Ip-kuyauNe$~61`d&>I~;3&UMrFa`E(8?T1#G zxlJQ2*VimeP0cwLAwzCNwBfZ+zF6s!XvfBdhCWxPlT}ZcRZC=3tI#har=)bfyl?^O z8;*xAnX)fWO5x$DjcVvVb=5KUiv9h(l#!iSDY?KCvatPcuA&BqV&5mdV2 zsizcgJgs9=;dxx+U>>_*`e7aG-5gH6yxNlv<&h%B2M-=F55HCa=#we6+Ge+JNOH)C zeg8x7BsW2+wxnKKTIPV1vX&P4$cUq}M3ycWC0;CEuSflK?S9MdVohbkeWh%*RWV(LPBuiZt^cTChTp2X7hai!Af}fZbEw6$!%+k4b?yC{x;V*Ss zy~4^Km-@Qh%6{9~8g5TG{g@EH8W{n0e*_M}sS!dQWtn1lP0mb#3v$D66xdSs;T5&paT zuDU414blv=M*vzt+sj6(>lz~)8rO#nht2sPonVLzC-N!oML^%ZQ>ARWA@n1@)LcE& z&hx5$A~WM(F|_@C%ZsWghR0Fv?Sxb+*y}NSkhrqDyO86bpUZu-lsXLy85-_ut-r7h zy_X|?LT#6qMxF;sBpcYyJI>ayN=VR*3Dvu|8u%YV{fmyS6#QEeH*_6EuM4MxOl1c% zL}3-s))XV_7@~B-rO*9jf8pR1n3<>M`#GD``(DTx;QgsQon_Rky>jG1RwjL~VWXDK zvAl|eU06G@DP-{Lrb7eqUUmWb9=Z-hnl&qF6dKS_QR@B!?-Z#8LO1Ty+xDN zGpl~viH#Sag}`Q6?CwSrB>MJ0r>hCB>II}|r;FKZ_Mke)ySQf#UsR@e8k?3VNZFuy zwk6Xvwe?cWdySb>8~MKrUN1@%Ssc_6d!Kh2*qzMF7ngXbu&Wm)=6qmm-*P8qU{DVX zd{!hNk`d9?HY)vHyG-BZVCk8FhV|%WZZgDVcVi4DQ1YgB)+l_!{9s2?6LnIC1v;Ta zV}W>5Vw1TIT!Eu21*$koX%DPY^j0`R37Obye|w$&;(PZ&n{zx=RsSQjKHaGW9exJa zuHdZ_YzbEjQ_m*#X)U_*1te8XsimbCafCk?j=PW8mR0Roc{^0mom^=(sB(f{l>%80 zrgw55HldbZvI%YkJ)500dtbk!V;VeY_wn)^HVtpN%+{^xAIr`N^m`x|sj)nrfbEXS zq1NRRDQG<5H<)bf`JE@~#5W8yJ=zi6GypSPaS)uiJ*nt;crs}MJs z)P)QOK~-KE56YDaC=UlhKB&MyxsMH6HgGkf7Szix+6C7ro!D7fBkJ*|4(BI@A_=Hp z9Hr+=$*fAt_}<);@Qk)v$h4_H9~l&~4OE`-q?#JpZhI∾Y2-v-j!rKDF=g%@M5L{vzjb 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-obj6.png b/doc/salome/gui/GEOM/pics/neo-obj6.png new file mode 100755 index 0000000000000000000000000000000000000000..b6b3be4409089cadf829ac0dab8614cb6bc59646 GIT binary patch literal 12508 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-obj7.png b/doc/salome/gui/GEOM/pics/neo-obj7.png new file mode 100755 index 0000000000000000000000000000000000000000..15dfa23765872e6f56121e4df094e20d6c291d05 GIT binary patch literal 11911 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-scetcher1.png b/doc/salome/gui/GEOM/pics/neo-scetcher1.png new file mode 100755 index 0000000000000000000000000000000000000000..7130e8b0827131d778bceb29f058d6fba5630f7e GIT binary patch literal 16921 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 C5tZ-& literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-scetcher2.png b/doc/salome/gui/GEOM/pics/neo-scetcher2.png new file mode 100755 index 0000000000000000000000000000000000000000..330e1e3a355b324b9fb6c1aa96a2bda1563efb19 GIT binary patch literal 21323 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-section.png b/doc/salome/gui/GEOM/pics/neo-section.png new file mode 100755 index 0000000000000000000000000000000000000000..0d58ad2449132e77f5487e0ccce2808c668c57ce GIT binary patch literal 13547 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 F|6kX5(i{K) literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/neo-transparency.png b/doc/salome/gui/GEOM/pics/neo-transparency.png new file mode 100755 index 0000000000000000000000000000000000000000..ec1fb7f7065b0f3bd5d2cf710afc863a80455529 GIT binary patch literal 6912 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/new-tolerance.png b/doc/salome/gui/GEOM/pics/new-tolerance.png new file mode 100755 index 0000000000000000000000000000000000000000..796115ba90629a1d9fd8841230e4389b771263d7 GIT binary patch literal 14146 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�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 SZScQwkT;Tw5+$z;1O6A!eJsTQ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/offsetsn.png b/doc/salome/gui/GEOM/pics/offsetsn.png new file mode 100755 index 0000000000000000000000000000000000000000..6404310e03a92367697339bdaa78d1a20e962225 GIT binary patch literal 12215 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/partition1.png b/doc/salome/gui/GEOM/pics/partition1.png new file mode 100755 index 0000000000000000000000000000000000000000..eb6bf4305c6100f20ecd2fb05a5e3ef7c4c83ef6 GIT binary patch literal 19008 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
  • X8WM0dWv` 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/partitionsn2.png b/doc/salome/gui/GEOM/pics/partitionsn2.png new file mode 100755 index 0000000000000000000000000000000000000000..b7480a4fa333ab8a62c25880bdc5e449ee67bdd5 GIT binary patch literal 4535 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 t(6;kv9cbLH$NTYq{_uXh9*@^6*TdZjp{S_{ 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 b+~bZEwOn|uqI|F|yEy8~+DfI0mS6t|fkIjh literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/plane1.png b/doc/salome/gui/GEOM/pics/plane1.png new file mode 100755 index 0000000000000000000000000000000000000000..47a9b8bcdabb3ac9d803b779a0c07a9c7ebae69d GIT binary patch literal 13114 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
    8rDndWMyR^K6;eb=13aZ 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/plane_on_face.png b/doc/salome/gui/GEOM/pics/plane_on_face.png new file mode 100755 index 0000000000000000000000000000000000000000..5df8823cdb4f96a7f4d056aae88070dfc924e803 GIT binary patch literal 2595 zcmd5;`B&2E8mGld8=VuTH%+61iZ{!0LlhULWL&1cm`-7)rX}jIXjK7J;JHP5b%8^s#mmL8eQa{X-gL%->+ zn%*lflqJIU1h4HJkPYvr|1<-`?Y{Xp^x?mq+|~s>%{erERN>>Bd8EJMadzI8{k^tR z0l55vL&5Iq{`4mP!Rsk=CNnu1n)MyF8Vev z&6mM`(GDTVRUh*``Po_FENL3@ojUt5&zNNlm&vZXvZK{Pp{nbY<(_iSg)>u{myRA1 zKM^wi{N9hzAIV%6=BkI`p8Vje6qIbuxABJT=F>Q{mFxZZLd^bIp=yshkNmAiDl)xr*_m50%&2dmvFJDw|Z zzN#w}V9CmlNNTLRyaZN%akm^#ls@boRJpU=>9h!j6%P}~+9t#< zyf{&7w6GJt90%=`{=paoLN^b*YQ>ht+J*dC)!BV5B(fgbZda zM5M4wQw0`K+MPSQzLKt?fp+*4gRfviUXCnorw63SSX2QSs(IoH*^R6~ka%-dKMC?l zmVIE`g^TNx6xTFhL-J_I6}1y?t{dwboAEemAT%@_4oqua%4%TAS7OFkMg#|sT&Vo~ z`{x_q2S1!Ju4W`9ZoZb4z|sXVliDb_#RFGoZs#i!#L-Bb>uV@h5%&sk(_bV{m$)|q zHqUPyex?fm1OnKO=QbaaLdnOl{!-A60sK(USkec2eAiS_l3l&0zxBv^1>Ua-0tujB z0k%3b1Gy(?xwyOTisiJMG*T2GI4igG6_zIrvH57@{XwS<8H|q~E$yBM-Nfvq$ceVo zrEpTv(1aL8&S5bRn-7{g&)-{IYdJDI{*72IX1`(V-RFwPhU?DhGet6-XL9RGN^`-& zedH43&W)wo;x$h3#66ez^EZ|%%Yp%lG1<Dt^;{Kdq5v(rA%OI661O|Bn%A zbi=iV!Yj@*HD~D4<&WB;-{7I858fHSJ=wV;V-$#^we*dYtBWex_=vQSOGnf0t_9OP zCC|Dl>UJ0wy+{D+TiORA|ClfKK}bqRQ;}cho0>M(#p-eET=M9%o;vKgJ1h6t@z^?lPUHQ;ng#WzL&G3y>pP@08fV~7NK%~^TtzxO*gIr1`bhlwd&p$20}5Pvn1-sv34(}Sm|2Z?qNWi4S%V!TwuGil3dK%Bj zBh6ceXdmu#AcSp&a3!gsR8qvLOFjs`-+)VdofvFDwUXVM%sVSCoy@bp&r!mlTwP-C z0rX6I`;VUY2+Wr(n7tKKp#Ud<*)q$QxTQD|n$^09#!*|z;S>6aVVC2~#&ztY8NC-; zyuEe&N-%~!=H9b~i}v^Q9;C2gHf?W7y8pbB$imu%Q`Z+0_6n^c-~lm=s;1l8Uu(OG zP9+s7L*p_Y1O7{zXTpLr?;mE)gX^@=rkAt%5o;q8ojx5dbr-*+n7p+=%b@w--(=Al a-sJvl!tf#nDzwWV$nQrCy81-K&Hn-A0rHvv literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/planes1.png b/doc/salome/gui/GEOM/pics/planes1.png new file mode 100755 index 0000000000000000000000000000000000000000..c9a594ceecea1035f0dd88e0d6a64cb9560db8f5 GIT binary patch literal 4168 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 a3eQhw=HUw~gTX%p5Hk}i;~GP^g#QA_LOhWG literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/point1.png b/doc/salome/gui/GEOM/pics/point1.png new file mode 100755 index 0000000000000000000000000000000000000000..39bca25f4e9874b254099f7d58eade9b2cb631ba GIT binary patch literal 12028 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 NML8AOqF2VB{||w*2`K;o literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/point3.png b/doc/salome/gui/GEOM/pics/point3.png new file mode 100755 index 0000000000000000000000000000000000000000..0a2e325c64a4c0b6c2697790750ee6911bcb6ec7 GIT binary patch literal 14515 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/points.png b/doc/salome/gui/GEOM/pics/points.png new file mode 100755 index 0000000000000000000000000000000000000000..547b277fdcbee4a21cbbada934f25252b69ac7c3 GIT binary patch literal 2941 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 HUc2{yp`&N$ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/prismssn.png b/doc/salome/gui/GEOM/pics/prismssn.png new file mode 100755 index 0000000000000000000000000000000000000000..80c9af357b12f8aff04b0bcb6b5a3691c53f39c6 GIT binary patch literal 7628 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 Zgo(HL!CR_p;wvqQk)FA3gSLD8{{zpzu?heH literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair1.png b/doc/salome/gui/GEOM/pics/repair1.png new file mode 100755 index 0000000000000000000000000000000000000000..2b47fa5a4c4776616a6828a84e3e6a67d4775010 GIT binary patch literal 21190 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair10.png b/doc/salome/gui/GEOM/pics/repair10.png new file mode 100755 index 0000000000000000000000000000000000000000..c3c77164afa8b0bedb00d95174811afe74d01255 GIT binary patch literal 7422 zcma)>by$?a*Y_6@TzaLX1Xh&p?pOpw8l=0sOF}?cq(MNsK^g=JX^`$*y1Nt>35g}% z+u!@w`&{q!JkKAy*O{67ntSHVneTkg+!3nEa(LJj*dP!HPyWqobr1**2G|8)OyK{a z>lpzEMAa+*TI$`Kh@%xB|LDurhd*tJ?1a2Q)W|pm*n zWtsUw%pJ#Y0>m}B>te;pkb4;euID;_XF$R3`jFSg5dWM5i%e1iE^+%<_SRS=>$u@!UO#3q3Va2JSQctHknvi1MB-JN$rUuZl2^l zoAt8JWH=xl|A1zwrHr4p@M9T+_>$^?9}In)JHsrPb(}lF$bLvxL562_9*Lec`vHte zT-P|!Tw!CNMcfN3n#rMR`B>xiqwMPsfvx4E@u5Mf;<7CtwT zMV;A1vxvG@21(0kEaKpG!K4W%*~!^icW!O|+`OyM-J9{h-8;-e)nyf4PJKRR%2kLw zp8X4p-Fa12Rkc@7LLruB6H*9Sui%hO8$RLRUQe_U2-jwV=~9g+m0D5V8?<6#&x2&~ zC^wMKUrT2rSMn0vG@}rjZbz~o@#`qqw8~?mqwO2tU3{|l;~q=&!EB?>%4f9LnXlr| z?30EEP~f07v*u^!xGC~b6)SXZR)nC_js50%{P?k{=HXUxk+~+tm+N5?*mMB)1n=W6 z3MQL+Uv4FOZbfol``PG|lU=eHSzZb}{9^Q|g^^N?K$pJ`+%Xyac}A+Vqa;Zzx?b#t zY?VLq)a}tjxs}z3FDH8|sQivou?tVsC2{VwBxR~J8b^(#pBE$-c}_(*q{g(5Z2Dvht z&c^UxzkZ!N_e)KaL{n2rZGu-7jPIn_{RvOVV;>?L^08U!<7?g@?m{cFRel2n2UA^DfEqBFh*VF)-5?ZnJ_S57n!U?jyBExew-Bg)Y*)iX!UUy#@Er`^c^;GmOgE=py0KU z)T#dDo~_h$>bOyjaoL8v@Ck<l(0;-{C`GtB#AvoSV{ z`9zrJv{}@dI!ynjW7;VjEla08h2W%!;dNXj&KS*hCeKn1>5lJ^n{9M8AIlO6W9oi= z_o)*u;2M9GQL0#P$j+b_(AC{w;f{r!M{E#$Tz+K zc`g~-yCD{(ev|YhhI2BUScxI__D7bMoPg_)hsa#86-@t

    Xg6f4n8iy62$? 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair2.png b/doc/salome/gui/GEOM/pics/repair2.png new file mode 100755 index 0000000000000000000000000000000000000000..488a6a4c9c16326a68fb068082d1b4e9c753e1f9 GIT binary patch literal 12670 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 q`e<Q literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair3.png b/doc/salome/gui/GEOM/pics/repair3.png new file mode 100755 index 0000000000000000000000000000000000000000..4c2a41f9001a120b98cd681fde2c6257501de24b GIT binary patch literal 15621 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 K@gmXB-~JbrWZ*3T literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair5.png b/doc/salome/gui/GEOM/pics/repair5.png new file mode 100755 index 0000000000000000000000000000000000000000..b99fbcbafc6656e7864fccb721a683232bf72854 GIT binary patch literal 14981 zcmb7r1z1$w+V&twOGrt-NJ>gK=m;V$(v7r$Gz<+A(xG%KNJtFbje#^s!_eJ5H2jMb z|2hAA&iTLdU6;r(*X+I5-fOMvdkfC*fZ zgh;Uq8p$U|nW*-K>PMP0Q+j)mY;(%1{kk9UUDj6mu|;k(rqd*^hn^91}xud=_*A-Ca?73h(6?CmKu3 z@?*V;z`Dm%o66GD9b|C>pM2H_`7uu_f>aMH4`=DBuCGp9Ncm_(q!XX1nx_BR#PF_x zT5N1A2_pl8RQlefq{_Pmhv^YzDCX;z2lhkS+$`>E@m|hygwh2W(2*C-8%nmHF{CwN z==xeP2iFOrt=_Z6$EM3mG0EvLGxQv{uuEPpsfsUSY{aCb7=B8R+PgW(VpB=7U->;X z^a?>GJ|h0i)g`SN7oIi#tLOL+=Gn*%yePQrbkr8>j<1Fi9(s1$6LZ&QlX|o?f_BA{ z-;*6-(T~Ukz4u$01-TM08@;e`a0b_%YwPOfcXpyu>BzDmA^z_1)y=mF6GR>$;PD8e8w|?WGsLf`zG7^|?${bZ3~^ zKBq^QR{7P{*&?FJkKb0eY2!vwUP=sKskJ2zlE$uva$!GKN%E#pR;G1~PpB{PeS zNB$&%)<)eqJ#XtRCO-0@PbMe-V)13D`mOF{Rm0ub&OoKS>`$eT)R8WH$;)5KycTa3 zJ&DFH+?>L*4y-jK$b1V6Y->D2oD^qFnF4H^E5cGlH zx-uA&Ffj#mo(kU1GM&0Bq-~|$EKT-cNI^k<0d|=G4tmgN@s#~yq~O6cZ1%OIQ+80a z;P%u~tgCQzPg<7TW?xTNL8Wc_VBVw)8QX`~KQNBqXlaWN(!vT@SaLYyx(->;)P^4h zAu93L#sy+UZR>(Iy#u%r!(@dVsg;M6XUDR82j{dQAk` zLbk$p)9OH5anceUlb+t2Tw!53QEnFGf*Q5;N*;Fr7cw!r0D1NDB?*bN3r(B1_4e{< zQMX;cpp0_G;Xuo}$CO~@+meq+Ymo+5-|i2p9DrVr4nPa;#J zo#QfgtGls@`x6~@ju+cChcmt!kB_pYCJ~M@k(-V|zFZH!$H>weRGbCXlG@t7Z8zoF z-&~eYQeg7(_U`QNhNW~E4XC`F6Z5wk%DuPRmrhSF9*`hdoja{4&ET7=Qd}P%hCR4R zyyL_7Zpq~{BrxLi0is~O2xfPuA&50@tyv7=>!FbVEd2)8l*dNn`T=Sb%D_D|8ykA!8Cbnqz-Fq`AZ)*PyoZwNKjd^&y#xcdah*35;Q$b@5^{ zSneHTwqHv75F=`5Hj2~#cwxfyk0ONQt_BK(JyS44FySh;Y%$O2^1G}Eti06m%=+@` ztmFaz5#9Cqk^*w;#hl14X@tiHp+OpVJe_jWlA7y5>aL~dlu_PwM@I+INuQFESH%bB zOscl9#G8)B@tZPfE)8H8>6W9N4WNQ*cv+bM0EXJo~T+ zt7@#r!NH++neuKF3w%ceyHo0FtLf8p#1@ui#79wBL}_oTxerl%Ixp8c;b`5AgSBVW zdV+9pVhZ)VmPz=mTfC9~Le!9U25}_H#YOc)yr$-%&oa-s*umYgssq;^lWq=Y9rKPT z>dM_Sb_<+_LB>+vj+3H0=JC2dQ&%M-30NBo{WDww!W)m+U&)>waETEe%DfMDrQdzC!#G`=oSit z>8isIoiYCC$j!=U^=P6IguxDY4!SNQ5{g8p&3{-`sA$>qd(tFdlZf06Q**N#J-OUm zo`QfHq&})ogAYg3vo&y_--sVB>^m*ayy4DRzw*sL6VPe6QbI0Em6u$o@+TB!>@n}o zjh}d`OlN-j6p7FBTxnYyx{8sAGPe%ul%TsP$54%(;VZ@Twb8nJlGkZb9E+>i-EZB0 zQ0C|7htT$!6Pz0(XCd5}uo0$Jh`%WA?2hqmi^` z+N(ZP;vR9Or80ltdzW6^iMmrW zAxe4lTwEn?aW0I3V$)&2y4j@e;-ZU(-Fa@Z-~1^tFUl}1>~S(eEN zQj+nyc(^(aQk|pl=z765=W)xm&w7U8>D@s>-{&JWt#d1Fhb4A*i4P8O&Q1?$$LpM! zJ)?xVc#Xef`d`~~all(LEV9Rpj}D4U#ag5cE!YvADZa(hF4h5gdCcL9EpxeWbf0U+ z@Egtx%2EHD;KV%2!<#xBYpeS=`T|{Fx3)C9OU3rglU;uGw|M-443h5bx#@U_O-w7+ z)R=t!TL%F@bUIpG&&!0n(z049ht$gnr^{wGMC#3!Gp?$tc2-U7?d?J4Li2Z7_4>>! zJ`b&1I>mC;xl2=>(M_+zin8hznTQGsvQ+0JOQz?4W!yX5o%@=M!Cja7qW?unxvhO4 z=Y>1kEql9~;4AN=T+u1LN@y?X7|Uky09DPbgU+qGp4zW+_eRzL$pv1g&-z~0x_$q` zqGz$A__R+t47;duwBW|nubFZuWj-D z)C zdQ5h>D<-{JrZWhR=Xc<5wGNC8y~OTq-B?Kq3v1Xm9gi+-4t0HI5h2bwjZxSXcw4)g z;W>UYefOI1hJQBw6!0xF5|WP}Kek5}>kJlZmSAsk_V-rvM~co_EgbracNGiP*aym~ zFGEAhanY&!udncaN{pt@`ZV-3dtcZ)IV~pW+B)b(SX)Tqq&TwQO*i;_<9(u{Woo*U z>Um~#(TQH%ASO69`l$u*g)H8CzWEmk4rTnQQ8DTDl$p9aB^q@ES?ucS!kG!rT8qbq zCT^H)Yv<89Z#6sjnp|Fux_j57i$%%`kDTrh ze9C{pc>D@4K^LCq)Ui-M#F^``zaWi`js221$lw2tqod;~IQ|r@l0D=;laNqtSAF-Q zs{Kn*6b!Wo#`kTZYO{9ab!j50Pel#wM9yXd&&+ut4h%E zm~`K(9-=S@4ixc}6rO>Fsd@AalWwEv=opR;X}X$aDXk+_%@9LFafTL?=b0A<`X&s+8AopftSE6t4q5 zoc&u{!wa|X6S3ruCMI1<>2Gb<;|F>iwm}5Yke^?i6Z9vf)#11s3`^i-nw{)y?ako@ zs&KIZJy+GBzr52xVef$@Kqob%$#han~JyaXc+Gra5zjyOX zqT)J5@UnAMS*y~LkcNh4X=!P%J)CQx#IVJB#@74sMY8o#L}N-HS71JEPDKyov5(pV z((s_B3*@2n@1NGc_lCc!PL#XgY)@7#t_^03abIFJ3!nD#zmdlr6nl%r65wzH+vG>DNx1Yv@%TjOm5pPymj;+k$U>rx-aQSFaQre5_#P>Uw)HeW=| z`rf4bvY%qWX51};mXT&1k(3?#iye9~>Try7RyP^yv?cV!a=^im7`?M+|Ii z;R9`-Yssg(;uO<_%6dGcT8MkWK9V&u`a?dEV|lJEpeG_Fw9~ZRyn^u13U|5z2J7+N z8s|3ePth-y7@sP%(#0N3V_;y2@t~_xav2t$+oJv&(iA``U^ABvo1t@l$x^ISV|;$J zUioGy_qWGx%Z-mg#v#vCjooV9Y6ktIM_+$C`eD#``H6cX3BY}Z|A5NLVT0SAsP?8j zTwz2GEV{%Ot+Nrz zB<^{P_Q`IxIl{w3Eq)o&2b8y zR$PM!Q(C>Wd|f!w1+-;a7jkDp{zWE%>-MBHAXSCz7z69hXlQ5zw6w|?H+WxibIYAp zl_2+th>|6JC7x%07|K)ToohzH^)+@&E|1MqN?31swLx6*!}#^h^%WWhMg?rw;Le>p zX}M!x@RzHY1M?fuacTt<8r#CTnnO|tBiq}dq?|fyNdimrbhz%8n5gKu_Bu>-bnous zkj5k@clzJODPXVBz5HqX@Zm#y7_7sp>OMI+mfwVpx&4}vm(FQSdc5Lr4~va}ZgTmC zR;3#uZ?^fu{QSFKbCbaZ>8hOof`!SKP$+a5i-<|6FH3?~xbbFi-+locUCx1r?^RxCpKB^HQ&bh90yCEAR z#6qP)R=(w+Xr5D}Ax{K{zawfF^6rosAVQjZ2jo`M`O7F9V7os}AHU{FUUT$Jq^MyI zv=q_1Z;v#Zsx7+|bQ|GYGgsPjT^1i5%x`6L2$qYRXF)yP{%z-`x7v2BXP64dp-YKD z$FJR!osTkNyTU`iFlnUyq9(i8h@gC2oZ_7? zdB%yQAHmc#sY||7KRoY}eXl7OHvyA3{A&4>E-;sWy<2LlOSJQ`wXtBH`<8`n5J7LS zJl7G2uyNt`+CBKr`$?Gm_R3G{k48jU#G@-eQ=b@829GpWTYY-bHw8=s3 zH86-B)Sdqkxt#GbMqiaKQ2x0+62j*F=*3%C`EZ#xgD$&q1W+eE57H{mj)_mFKhFTD z98TrT*4nQ_#gFAMKa(h4^AN_i1$Ma5oG$2Yn~5pVB;h(1CJ^Y19ijG_E_lF8_M37X zxe5p-$Cgl)XxteB^Fzc2HUFQ<|KF^WCPX*|DX9kS2qv9WQ-M<};Bvzp6_fOXzF+#CG@)C)##63mD7;J#qX%uOx>>i`qjF)~k*d&4S z>EAmyzlav}#eJfqLm|Gq-g&yexY-o>l~9#jz(%WSj4ja8V}r{6?{#2wy`i8WO%#S_ zC}{`*DE4zpyFx`h{_@hx*dUUQg(XCtO|$IH5R;g=cxPAFLuY#yB4(xUTNW!`8}5+2 zen_`TA}YbvE51Q48PO_hFtRf}2Hk5roOkcuv1``{lCWu%UIVgVH4;`-#J;l))DF9d#_(E?n%kgvW%jZ zvyp*?ZDibx{^QGK0KZ?odWD%u+*iFll_Y3Kqg!p;W?W`erK4S8t{8unL@W`Sl#~P% zouK{Plb?~4GJcGHjPi*w2?@`)4z&FJ{a+|6=gAw9$+V(~9S^H2B=g*rm%+I}?q-{H zC!lHF5pq8;t@DQWAqk*r#myPq+I9{3BeFUdmYY*{Ez5SwSCOBe1v{SZy*@{-Zzjo< zjG>mgPU|czEd1*EC1p2|II*p!UiH&^YxpZsSe8&T2EfsUViGq`&+N50p2Hd-(h&V5 z#}i64bc|Aq1D`tPw(4CrpMwc2D7a5R@WjhYjQUbECMBh-FI^Png@S_V_2n5Lgi4tb zy?z(y_6NhV5KzD@`qI8SG%$XR^1UR?;wWh_o>NmLGl(EE{Qmv> zSxQNdQNn+;&v;+Bn>*GHy}Ky*8&U)JSu<6S`y#o{dHp_QDprEgb>das0N7*t{{Yy3 zTIYYp;%-J5Pi>0W_A|^e%eB-yDQ2zj#P*+stUPg53HndSeUHZ8T#`3cVtnaHACnG# zH!)&vM*oKM?%lg^%le3DiSv+#o%(Q4CmdJPVdXBH8k#UHmJ7Gz-?N1k3i`l7CV22b z%kCI!9-Ffc&vvf$oy}xrs0@w!cNN!SgL%z(mF(yHBbtVT&EB5P7dxWYM|qMC*Ivh& zmPOK=VtERvxItxSlXensry=6g&5S!Q}9-u*BK9+Cj5&Ui1gDfLJiL$k|6+0Su#?a_{Z0m1*jNMXTGgTc~ zGvg7SA@1ooq$o&8O&wWMVwcm6OTicNBb=`6YMiWysGivl=ULNU%>}Gl-ulMnP4-IiYz>NUsN0c8- zRs~NFX3Jn({Rtn3+-Go}s}+ z`S~tb#EgcrLR$>6}>frtk*_2QRLyJb(R~ zZhwD2>dm)c{5)_+xKu&|Z<1X$N5PaSdU%L{mBg;P3P7xPNLeznp+OY5qCLsH7=C~- z5>iq19FG|)o0~HouJ!|>mhdQ`ydf013lzHf!BVH2hleph*d`B`;we(-X3Das%CnQpn|Fmh%1c$%*6f)DAc*g&ff4x}9&8fzXqS0_XY{D)&z(_%qV{mG#{t1=!(~1CSts06H8Pamx?Y zS5vpYF$Zaih`YMmby}{qS~! zZ>5>G5l*_{l5G&y0@AA^$r@rRT#{kWVgY*n<9snVr3;OGY1Sa9p;P|LH*` zF>Z`y6ft3KKG*VaRv;G0+urDzl^C#}VY<^*zPJNV zPNIbUTE8d?oz@#BqN9k~%CbU$DM(Wm=X%GK!iZIC-nwPM$?H#)B^={7RQr3LiC%ax zjnA#syZo5w`Z7=Qa4#nKY$(8Y;jmw_#4))GFHX}GObCBU3)9=-TuJy#gWArW0!t-| zONMX%R`@Gk)ev!yteXw=DoW2YNjd$VLs?zf`FSf)MVwgxEwi~YWrKiiYJx19$S;ud z@sR*)mw=dfNeiB}9*jr55Jb*32LxDRB3ZX_Vi_{M3UVvr7r)VR!Rk;k@b(Z+{qu|4 z&o1z`ySFzB;tR(s-w*YB`T4nynyYM{qLJjZ< z2fG%}WNs65P?y0*S#H>EUObugU8TjjZUgFGd-;4+T791BDRW9VP(Jr41@`(xcL@O5 z)hO2G_C9x>tbFtAdmN^5Vux{=)(cr#Iw9y(HC`5QZ?k*ncVDVtG>2}DQJGe$PH~Yo z+j3bW1VZuTwilq{C->V^qHpd#KM$Rcc7Odglb4m3r+0N{fBN+4m%O|o#!?)>W+8Le z7rUzfkSn||Tr)g(gn_YHpf@}D@k1(sCcj%NwYXzkozrR-3%021mQl|dH`VzL0jP?( zcA3plXIpm7HHDVvWhNc9oA3s|1)0k@jX_6d!Esj5!YIpqyGk|>^>oU8(O2H|}&eYrY&)3)^5cx~XbIwu(cK`UIpVQs90 zwxI=~Z)-^OXYU|Q%;kRTBLw7UBz4D*c*C3NdVVraJtLP(tB%ShPvrgI%z+@w8w9s# zRcxmyTZ^Tl5rBc9l%JXVL1y^9ckQ-j;gE5l8SPVshlYf-PES*VVAIs}%k8iXYwhV& zR8)Wmdz*xmkDEPl*i+1uXlh?J@V#<*NKdcrcy+&iW~K_!oYHHK9*p-hF9?4^dqS!= zqQJiCc@$M=(xAy6?}dYEYUo}zBe*m%sObRt??@egCVu-Qaix(jx zuiMesNpU<+wpWuo=lRcOy>f*P5CAL@arlyo#yOkRw-3R6j-Ep-9

      8@#gWo`;3x2>7}5lB2IhyOx2Rh${)`++DJjk0qd1Ym{OrP6 zN2abm!n*qCRXD{bW+)~{tjVocVpaaHx^sSmQ$2N}f9uG?eaK2Dkszyx>8ke2pR}hw zf}T#wfZt(8Oe+*;eo|=gIU%3SU!Sfi&b4?5lM|9k0pHsMqGh3JOd_ z0;!RpqOQ#}iAGCa3sqS3u2g@TIt2`NyvB}}{&_@x>Ai-3t2pyVMWp}5h+IbY!n0fq zsvJpD1>Uv~4aEY53dIQKaaj27F?j&x^HCI;liSIdphYA9H>H>AQ2gI2N5>^hC&Og< z-I*rYndBZ|QofLrd&tfnfiHO;Gv#kf53DhAUURhxbmC}Mlf;hu#Kcm7m+9YWP!pYd zFUg&@Y9Xd9a}&j`Umf>GH7|Zjup#W6*KS6v+Gg7ShjE)#Rk?X@iipiyx|9qiYJ23^ zqBrO^xZM8Q!tK2F^6y3caP8P5&ukJjq3o;zy*`jFgAdtRcgJUr%7hpJA#-_L;%jz! zx^Mc$VgRgJ)+q=k9-jFRUA8?W^7-H+ew`Afbdk?2nu%ZY?OaKYE&gm)@^1taDC)=J z2{qVG*MCSzcwbQPXOpqdYUFj9)_9ArWLsO?)^tOnpC1GQvi7z6<3UMD4`@8Mxc#iE zxNWzDTz4lFK^sGz{rsK6MNLglZ@KrnX5JNr`I4cbp*@+BwAq8dfD9$KpM@x8h-h#7 zU=9wydHA1YZMlvMyG~kYgdiBm&e%rE{_Zw{9e2ba`GMS=Wm`;j!>=O!eHaDHr zGplkK4{(aq|F>RHPH0{zpP)~(&%NJDT3ShqPqUzW(f}Re5MyjoBc^2PfL`+O`K`d6n*? zLO?WtRf@I;!mm5P1D4J6Q(9VG)%1ATm@8m2{?g8cUwSzxbqgMLdk`lBL!kEs5~bAl z#s{>*P@|jx4dOJW4|~l=akigFyII@|ysOP(cy4Z%JyBMjL~5MjW4z?iG(msmU_ z@2_whG=?B|r<7m3z=Tjw!sft8ff)?+)_;{&D5MDu4$d5mFaL$-!~_RF=CxvCip5Ip zecn^Z?F@FZ0&StykVOBI1=Hb~Mdsq{AZ=_zC`cYMfIY)&zLn%S<$k%}kt}X4P;+5IZ!hgPFzQ{mbjkVe6rfz!II|!^N#>NkC zg{vi>xoH_~*Bx8BO-rhHA~T0>o$nSy->j^xU)|k>&dES0 z3>OqnaxxdJd?ZA4q)NJ8)|_vTz}NicFHeV}Z^!Wtu#%pY@4Yrt&G%A!e}YtsHQm?h z`>;-x>eRB-2t{u?E|4UE3M~S=95{cU3Rut1&b~KNJbU?);BR8dtV=#s!doOyDdVBI zc=}mM|LRV|?#jPQG%KxrgDuzlKlDqNFW*!H7xCA}9C;!8IY__w36;c*MCI0Tch1Y!#r@{-mw53I}??yGN?I zdq6Lei#S`>`TG9dijT(kZA7@^QHy-X;WcRe_6?Pbi!0#=r^&XcHFdXi3)Oae)i6^c znqH@VmHXl9eof2Oz5f`P5~@Dz;^5l;+#(^B+3Y>u>@E6Xi2ls0V^twlB(kogCkM7W z!?3Gh4uly4Bcu96KiJSbwg{m+>?pVP|9ZcY1ya6ZeYQpNR{VTBU(gS)tmFgw?H{~H z=uTg=L6hgn3b^S4d-0Xt)Q*H=-BK-f(2q7+q^;Uf%)SvjVZ+41QQY3rB0C=&5*kW( zzHE7`mJ>z$D~2-6`VhiL8zbR?foRRw=hk`4Qdds0t?Eak$A88rl7z(33Qc9mIdZ!j zwBtfrfm#KbIR@n9s44}=2_Lsi?)}=2wPx1BZ*Gj;QbR>gGdYwSJ zy;Hx*`D7+y^d&_vC#xUm+5ooT>8YE@DeMn^{&>KO@2F`ROwNdVVyzQF9UXbnMPPSY zjmvIpqJKcZL<5Wq1qDT^8$1zUDy!zgKhB%)e*1?i+h(B^bfs!I*~$e@pI)u~yOI6A z4iXoUbXDr*VwryjiyE+@Q0x5C(ilehgvWd~EV5Iv1((7_YrEsX^9Qb}BQTT?GktF` zVuM40*(z|f!N(TKItL+bDN70o!9+|?m+2HsJ%6sDW1s`hk3+`EKu;fV7bhGao9kb= z*X1)Bn)aCB_m7QQ{a7!Mz|*qvcQfr@H0((tVG<9yy2q-|Td-sa>RtNqXR%o8W8tvzy02}u9_uBxe zH!JH-ODNo6c%Lu)uj~yQM%PUw@hAPwm`=88Fbvv?ijo^uXL`?6SQD9^NEG1Bc2B1^<6%^c?{$d^&6jbK0_)~6m z|M1xQ(~PCEmevDMF4)p#s_nMbEiOiD(D8+0rt0DR6U}1@HnX|k%sS?F8W)w$D$sqg z>8$#enaT0IoSs}4Ehu9N(^++xp;+A9B~_1o%P6&7>qVxnrdSmzZhbd zu?MMH3u^|(j;|jm4g0NE_-XibG6W_btcCs<$#aIy&haZ)~OzBj76s z?%P#kwIw&+m&^UWuR$w9^Vtezhx3HN$l^yF@3yM!k0bkqXQorkHkU^9Gcz-$rlyb0 zdmg-;1EkhfyM^_)*6n2v+H&#T4mz37*1knQ5I3(ZZ1_TM_p_-J$d!rnP7RPCJbLsf zf`UH`Z1Jq2y2}kXQ?_>0oJO(Ek2GN?Ahyt3J34|ve@rs4$Ao)p92TGdj3SpeFvwu5 zUmpOMxQ%K+V~+{YYD#t*ycfytZ;$1Tyoj8oIG6$B&_xigK^3L-?UTKm`E ziWTS&fo=8}P-Bo8LPTIYJ;3l+R8je0k^#2%ePE}_wA0*n(#-l?a6k$*;19v;Xz}w0 zs5d+@fWFLdTrX^_j)x)m3^Ia7irs(_Fk}OJAc> z5((TtF{c8t(Y z{=QG7o`4EEVVveRQK=-n9)K`yvdVf4V*Oj_?EGBhDgdX{z75)!(WK+L@Er>@<)E~R zi|;zv^jB?;-X|mL80R)g7I9$(&MP=NsoDG77|A;X=nHttqxNiz&|XJ0L60L#^ZpD) zki0;WlaqTg#8U^eOK6_y0Mi`U8b%=fg>U3OGofnp-v2=c6v?fnB%JAy@#PBxC{R?) zR>+-4Gb4y9Ycgt4S7&xj6=6_hvVqMh#(PHoUQ(j*-RKtwkA+TVP&*x{XoNkMSazFE zXquawqujwvUYzV=7y+FFG(03GDe2ec*`aow6(d*U-W`*U2u4t>fPv>AaV&<>EYaF7 z-D`3(YsO4|yNwgC7AEoEOJ44M13h2AdV814UPlX4GiVYA<;jTm#?UDLRQD>~IHIzK2nAWq} z-G=Db%abKi^a5sG#0H+n{D9O$?Ck7tpQG9pyLCG#;Dy}~W{~p}fjI#gOgJgmoj+#? z#J-n{wEvH*Sg29_l)t+oKP>C9`PPG<5!9+X&KIbRAO^X)n7yGWw_dignMWreBh$>a z0b(brKYUh8Z^w}&K2up-8Fb2H;8D$e4yFNL;22SsNo5IWYb~0nNaFX@s2kdr%uXc| zOiUI4HX@Tk(#zb-Z_yG(vq}OeV3IZC58&L6%c{o!<)g{EtE64K(UILDiD}j>z+2$5b*{e5J4;1T&@2*?kAFWT{zafJSXi*JN5S1&>*}QT?UT1zL&c&1_jb zS66q>_2vjt#oH~#wS^z6J7S)2px!4Z%32%Fi-uYE`kVLKP6AAMj~fEX2GqkJAW zZYEE8{Xh?N!95e4DEftLsy4k4-~b_|dJ|G7MAp;!g9roQWH@Abjmsfo}7-?*4hG<5P~qpzLysrh_o zN1KLots1nQzzggvXal-`buAw33P5b<MSUG<%G7Xiaqly6!IhgtCQt~c|dXT8j zw$V=7+Iwvry1XQfn07Pk7#3oxpvIy{K&C9ZZl^47W9%u1vgy1vE7KbQGMd@ow_UDNOgoQ zp!mM~mzN7l=&=pgU1?EYHNUd5Fk;J%>iP5Qx`Km_^Mn$&L1rD{ zVER!!8}7q!xb*5{Y;63;ZWMz1_ZPefLkXaK+(>)W(;La(j7{A8>7(H5r4U(ZB`G-6 H$p8NUn$nX& literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair6.png b/doc/salome/gui/GEOM/pics/repair6.png new file mode 100755 index 0000000000000000000000000000000000000000..5123d1f841286f649175afca327df4fb17c53742 GIT binary patch literal 15032 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 z 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 PsSt5t8KD9}t#AJe*oU4M literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/repair7.png b/doc/salome/gui/GEOM/pics/repair7.png new file mode 100755 index 0000000000000000000000000000000000000000..2b553b9fd6f429e9ddb86e9b8d152b78cba22f32 GIT binary patch literal 12358 zcmb7rbzGEPyY(PSN=QmOA|c%!iXZ|4(hVXh-CY8Tw1AYPLwA=nO2Ysm;Lz#N-7xTN zp7%ZRz2`aSeBU4Zelz#X?0esPU)Q?UTGuA@m69wT4kZo*0>P7eA*~95pb3FLQ7jB_ zMQ$VQ2L$o}A}9S+UHkpkjHkZ((N*`}L~HgeM@JcpG)?bjHV| z&y)3K)T*ZW6&k<9=X=KO=epJe7Ec}NTBUsX(qO8ZIX;NTCTA97oOWg6SK~%a1}bcEMsg~YN5-x zo(cS@yG z!nN97xrJDHQ63)-<2FSue{$t+^|;g7BJDSbJHotngd-z!3>khb;G^i7q^KDo55;Ik zkzg{fR(!2n`C7H|mAS!m#WPOrHLNl%OXTrXvcd7O1# zSDKfDo=JztQObsXw0F+#kdTso9bMx}e(B-qY0R^1{EPH8>;B@j45v-)eo#KVj|0vj z>qCKuahEYGra0AyghXAvR}e}m9ETQo3kU0vQ>u*j)vH%MXU<6GO2qEbkxbcynznXN zgEJC>WqB{4t}gk3FYTT8ECt9T5=0-TXj>U!vy!r*p#%j5d3k|VWWSqfB7OhM=kypd zDn0PW_0^gT%I%(OPJ7&@#F~eUvM$Q6Ox1eW_j3q&WyqtKmX?&$f8OOhqV|+Okl)dV z1|ylDyyB|He>J=jX=-L380y*2`#OCZ(S|`J{>{ zlx0!=WsE`F4w98+O1;PoUCT5P#(Z4mju5`nd4kWZReDF?_LAroHzi5w{`i9RIPtP~ z)G!%2_qp5Bhd}gH)Yjd`sQahfCD<}d6GTq^;?yd#!|fNuEkhKBqbQDGhahu5kx5MN z1zQ2IhvC#k@z!O{QEpq4#(b128l)N;PgREbwXp8m$c2-!pDu*ZaizTE+dIiJ=)VO| z?`LA|*0e+DAP_4FCA{Za-)tI*D9k0lYEe7DogG*TVVU}FS?VqB_cCFVB>Ql`7a;;V z)5Epwia}m)EXSy(G4%6R%{Ai%LQ?K_Oq$u??jYPhCRtH6BlneIU5Zc-GYOI zGYeS^F3L=HE`s#OcgRuL-m_E#o#Eudj{COfN?T$Lu(s_lHPEcnmipE#@o0dCIoLrtdGs;gnuKG;v7CjBAXbYc~ z)P0prrfEJWGDC%kO8JJdXL(5N_q*y|)<}3m6(jGwGEJ!W4jbcv2BfL#)DI)-B46Gt z(Z#kK5?I=T9fycc*-lsAata;}8-Hg$V9x8Gs?cpCKukg+?dSKdUj!p4szYjmR=q!g zUD$Pr~nl}P#h(j+U8v*a~$6-=2C0N!`@o2e}{CTH4#VPfxhHTJ>i$XE!C8Kx#GEz-lUE0p? z9s(hJ|1OR|N@P=$Pq8LzYev7Loi!IFH|18H`)$5DgFR>6%1s#Tp#=gzgDpCHPHhTJ zTeOwcKl}O}jQM_K7fwG$D#C0h^D#3CroNrw7(SF{8(VS!ucYdC^~IbiRcVnXMUHTs zU(9eV+H0%c;~mwt-xoT57k+mrC@3~PEQAE{blp1z8axx-)KA9-UwHWPHAzqgJWP@A z6Fj*$;{LSYh~b*7t;g8c)AV=HYUJ_vxwsI)pU_7!1hZch9TGzj?u>!XOm0N8rJe<5 z(MAsR-!Ejj7>*_L!^r9E6~3155{^&9R5wUq5-iL=jRjJ;DI!hHEsO^TJ2k1LTCZc? zx0ay<@Gp#u`ZOdAAk>weho!h$yGxA<3U(2xfFbuoA3r7k#?iG5o zR+x3pUac}2`r1;&U9}{N89-*)ON~3f&A?Y0&Pt8o-Q6MMC6}qAk{JV;*Wz`K%P(+j zC#%2O&$VdtDj8O!eTU_Fk8FIsb9wolOt%i(SXBap#ra)?FD&;&7`V%n$$1ZJpZAkbpiI_HJ4>1a>`q$6S{0t z8IxfYjC2347s;K7=NA>3WzkV{HUb0YoFvWf)GVCJPV0;+ZHmU$RgdY1Xr%JmB$4hi zXwL_P26_;Z`^N_cDk_gbo!#e&*Ae*Kg!v==HN!3VpZdZuuQeR&hT81lDh9Ja-wt)L zs!TV(qzNC7q|~WM0D7Dx^Rjj=eUs5~^)*G}KXBxK9rPx)miu0~xiJ|{`c1}e6`vt> z)zuVye0;PiulY;9QR>&SuB9paEsjx~I6(b{*2r;AkA8V}MbiyAmu=41nDtkXoyBTd zE?+ZpEYG`_D6n4~+9R6kHXV!KUx$=Mhss?4?(N-4xaW4#r;A{cs(;qE$L2L-ll`{J zJUcfhCNU+vu1*jV{qp+jz?PG<^T?V@wGFAXVM`>Pe{cOFvZT6l(44oh5T-UiLvHV2 zKJ-CGaQAmaP*U@Nsj0cTwm`jk;*v-p5d}p-x!0h|=Ob68W2xeo1pAyu($ES) z(Ji^MXg>$zJ$=nOuu?dmej0Mv08@gl7o{}TE{`F-mUc{D@3?#S_EtC@jcHBoD6_tY zt-c~T-Rq{qwn4<|**C{GOQtUD>|LBKtkUswOqsJjWMFtthK6>yI+8U|sW2+yuIP&| z1PyMaxGR!=wSgBw;U$h7%2=ARZ|yYY8L73^Lk`yCM-^p0?tQ#^h~vB66!$PC=8W}Z zcVXPbj=hnu#CamqeyVmWmF-#GmmLbIbWmO)OM!(mK>x>SQhFmzp3ZQTW0W&;NSH2| zlbIQmuzfJNFzhC)IW*?@N}x*1W;ceACQ@sJL(u4f;qeG7P7(_Dh-gr{z{r<>Qusx&Xs86 zqq4)H*2O1T4Nqi9)~2Cg&7W^d z?_4bP{16%pXiUMw#p4au!=B&nNnxpIJpzyZ#kF(8>Z*>vk9dnv>LaDK|AbZITl9cg zZjH;NXI8p}R4I>w3HdFsYxQHyjsr%uuAtt~;QTU|Cg4xRQv z2^^_}FtkRo{!O&JQPNi88YlZ4GO3T}tNUzK89}_v#|wV%|M3Nmw4kD{EJ84e41G}7 zLh|Ju^OU5Nutpr>2Y9HWo~fs)ie)xX=i)#qOJjB19?u^V*+_l-P-dDy`l=F>3EXsg zMaLX6ENm!4FU%Bd*#_q0-M0355tqOz<|!D)Al(c;BE8wpWFQ2U{;tW>ze!+MkO`B& zR>T@9H%KtUfKag%mN?m0lY{xK@3Zkj^u;P#lvp)1;_K%8QfjOx-tc@W*DZ0`7>`6a zn~zq%Rcn(-P*d#wN_DmCpj&PEbb7yj(z2Ei_O3y!|1LyXg8O56IoGjIV`5ny!?;(D z^+f4PoWH-+n>P=yuC9Ql;kMrv%YB*NK~*%DU*pwszRs$YmtI=451vI~@q<64+;s~1 zgWY?p587YEVy^$Pp?@i%d+)q&Lg!$J|McPlJ#%6sS=8RHU?Xv}S6G6HiHXHdivuO zqHb&l$U%#%%QLa-%Yz^6(OF=YrlzKZBf^1iM|1ZMv-6S#{b|L$4j(|F?@$*fRlA+< za}t^z7Ni9Hza@j=04=c|FE03XLMruZI`e6eRZgldwovADw(ZO}e%WYRhKCOW4V%4V zz9h(NYLcaixUo1>)%^Gfk&}}<+#Z_}E}7U+nEFv*F_d2HtlGG_92W{{A?) zxSne{iGBKWRy9tGKd_N59v(t_dwbOcw#vG?lv8!~oOLa$+#{Ql&EairPvEJ--&6MN zZxK>b_O%CLHk|!Q@jOX$=k`wNXY(G-RbyJ$*<0#f^R_UGLirSv9e*I~FqkHC z$jW+dqGo&dv>yV>-|q3T`7h$E)5QbMQf>G7Aan|$*AILzj$Pq;=Y6VgOicFn_dBd= zc+C1fJ8e)2J3Ug#%EGF>Jz8kSIvG;Sa#DMqc`^RS@nsW&AI_yyyhq^_59Zwg%+pAXb0=?YUY2NU9t^^z)- zzdt;5ng6Mw?wOWAC{^_rj{Jo#Y}lYAn9H?cL-`bLDPeupA##wy8jJ->-!kEL>i_-K zIx!og3AXkG`7*sx7jODEi~u0nj0KXoQwF8=sZ=HgiKRSV z1xZMk$kz*xi)Q$x<08m=1_w(v{$NAJ2C~HK`{!(5#n%}N<15gJSM7hk+s?aYf%Oop z3ZcLD4WwC|>@D~`o6yjl*7hP;=2VR}`IC5j#rK4f(NpLg=K2x5zvWxp(Vjf^)3f$O zpAqg*#DcOcRyYHmnPOrXQ<6Wu1<%Vs`kbGwkLi?@fC1z6(BUKAtQ2-(Fd=U{h=@#x zV$D5j5`A-Fi=RX44clv-A%*wS=&|r|a@RBzi}XJb!i@J;Wj@5V=Q7I|G=Hnihr|oD z3N-)l!YLO)iOp(xj*@@{tS)^z$EZq*8^-w}RZcR9e@fo&>onuT;Bn7t%)G+FDsrv( zSv_ea772?#X${W?Hnh6C1Pxh_%35AnT>)j#c9p~+SxY754qwsKa~vq&cY5*qhk7x* zJ@S1F$F0B!r}#f4-8 z4E$JMXw1GbAZ7SIXd|#>d)#I7Nwy|u!W1lWSX#3qv>EvF-rZmBfv2xr)C`v@M?Y&L8W~sENRDxr1&KMhhX~KxGRj8t--*fRHy31 zf=ZVZI<_%9di3kLXfPpcd`xJ5-HOBzl(NUdpq>o>{{-$|_iA9DXKN=rpPS3LxR@Er zxH@FgEYa22SV6b>UH(wNC z7S_n_FQNH2U7epB#q2y&`>P8JQ$<|EGUp#a0EI~AcP1+=RDJcTEs&gSI7fk8^Y3u_ zJ;QG)D_xd=ev5z=$9}XVUT=KoKXAu_2_hTgzF&`Ru6E2t+_wjc%9{HMHHx&a%Z_f} zzWpgJZE(wd8eaW&GX> z!4<8$)*dfts@jVof=|Doy4$Jrk-^TB+Su4QJ3E_@m*WGwUS0WrLGE&zr8iv_uiFDz zI|jcRwfafR$`aF(!Efe+sImyvqm@nMFzD&&c>r?`=ADPodT(+wzD#nlPAlt(UR_b?l9xY4y!7V$uf?M!kA(=t4+;MX`3+HqWtgx3 zGoqtNL(&QhH5(#nMBSuSNRTdo{OKH>vs_+YzH;d!-KYbl=+}^04dUsCPed?3hYew& zkd4yDD6nm?LY9Svg&*DBqY~BPZ{NPPnQNg5P)rf1upD_9@tnRpnl5iA%~$yNfExlT z6_ZkGzEd;9cf1E)FZmkXb{=wZed4u%@0wqx#IxiT3*bW6$)j(l!kACb&u_{{LQCc6 z-@mn+nwkL9c$v&|2NK@dfsUeUYYmkouj1tK?Q(%&NCjW<0x|q^bQJCPw=L(zgl0y;a~x>(|BBpyC4lF$9ENh-h(z%2 zU3W>6VPn#P0k4T)sL9zf-(~*>*a8*d(8=|s<=uGu7-wA zgA>EdH`k>EJ-e@fKSfaThdCqR!V?WXNe5q8*x0hcyBghGLYNCJcD*0!yuxwmd7@{L zW(jPF#`ivt2i6JdOoEI>dq683tRx!kZ`IB1qfX{-2p=pf%X+IZq1q4SRob{M0+`Ku zwhuIzHF|ng)aTUUdBpwpws+`h2kYykek(dn9^7>Pm)syY?rhq3>wa^2Td=_rw&)X= zxO4z=Dw)eT@Boz$9J?&NIyW3z9e`ZL6W_yWt+k!nA61rg+^U&ynlNzxTF3&V4d2_J*#oxn7;}J@ zgnsb8sG4U z8DBmS5J_>W#ZwV*@TShdFin2VoK% zyNm`~x=^|jlyXeFP1*i@Mhr{;M0>+pD9ze>EnB4c@FVvL$I?tXaG_#(D#t)QMF#yV ztNCvV5tXk(R0}ki@JJ>SU5VD4Na~jsKfaLXrW}@vQLpg-J8All;rrR`$5j7&wE_W| zraG!RGeQlOre8>)ot~_*K3ks4_>`2?lY4FVW}~(Qut8q4eG+$d&S1-ItLdO{3UamW z{rVNhrj~uz@k?hsAY34;M_zy6DSGSY4Bk#rLm+zwz6gU;KM4_C(;$qU{Vn3|c56qw}k)TwBUoe4jF z96H6LFmOAwy!=z5p;y7cQHdri2t!AukdTlnXQUEX z3`Ctjor0mED$*AG&d07HOhm+rPhhMop!IHBcQ>ZJz5R1>?l4Y?>%}lv%zwvSBVeDT$d1O%1oay~c~SP^-9@&oaJDA^A7Vn>MveCy?EYBW{8Zrz9@G`q7^< zp=BQNgMtmQUqsMpS$q|K4u1CdU)Ac^d?U&nvc`mP2A$LIHsnhy>cj++M241 z291uz9i(#O@s_;p#=4+p6{r+INcF(sx!33@&-H@5R5SmBK|z=8>Ewxo=B~e`M&-Bl z?(>@8mAu?VC+Eg*>ib$98hq7SGxW+cS-TJw|@pRfN&Lm@#4kn>nl`5I7N5h9o!^d zcYObrlc5|t!Lv1xW8&cwzURART1FMdsQ8d-0JNqDc`4YqxS+RDX+B7atXzn`i%fny zGz_gqFJt$P1Z3q#fpZvq`xF!N6sUt-#T1M-1NWKEX-{Vas2^&1N@i2FwxoV@>#^x6 zgo*Xy^M2=hOaK|9Vaz_j1(c4AS{x<_c_A+kb1$2PA02u%_q&;~EB`|*2l#%>=#Q_N zsW9pO7!h$h6DaDOTG#(fvzq&%_Mlj)kaP;qR9Pr%Hn-qNN=lNXEvmw8#qH2D-FIfi zxYt9SrZk9&?4;_QyxZ8d%L863aMeva;cC@2Q>MZF(&)v+Qcq7kZe%MvdnDM(MjNg1 z{o&zP__Sg@gMxDdjXO=@h^c{R1mfxoZh)I@PB+AfZr2AH%x$vNlz>j_n-Q4I{mAE0 zbdpMQq8Cn^ND~Oh0tTTt;}?TQ_j{lTmdtD6!F#2MtQ2oNAw;morir@$1Qk=>cdiiV zkwtm1sal4SO!3!bBS0VAp<1 zPseW?x6L4~+vN8ot0@JJ7o7bF*x(}1N^75KeEcAPt2D~DYJ;k7i~-6N%nH!JF*r3i zg>av(kgc00+9%1tX!;`tXRJIF37``fSA ze-#|IG`kl}^<3Nu&YxR97|PQ_FICQvI9waWEXSMxlI=&@Sh!a)s3fHZjj^ez`Z-%5 zoZw5*l1j$LP_O26*NyQThntMkaNrBSb?OEX77?R)%A+uua9z8G{Gs(u+lQD0w5DB$ z6iI{Tpp~Gr+i|P3^~wvmzr1W}KA8Hxu#kj=qZcLO}%rjAz;MCY@M2IA2i=!XDQ&qC`psw`NK-HI8#Y&<+5h0l@bAS2^1 z9qVQ@*PbmG_q*0M#o6<3f$VJNWID3la=smtF8kjNy$%Wo22pZe=wl zi=#g-HgMNaOVE?Ca`h*7eoj74%_FZ~dH{cxD>iF*&wQ zyPu0`+KI#LKG$Rby3qU0b>pT20WleIpF0p86TiOLd7K6Bwe#oBZ9ocd5e89|V`?Ty*kG>(PQgd~n*Ge`?oqWOrcQCl7G)7RL4LbAV1loNuCjmsU&zeM23SN4y(|&GNEpE465U#uuch~*RyVJR zl}mvuhfZbi+GyU=&Q5f6G(rDj!U%}Jn`sf>yZ01$+W>)qWzpw3`3B$=(53gw>1ORF zt3ze!d_NDS2#(g-8zGOuS*H0(>#|PJjn76!%2?@I6+n?|4(J3J`n{a~-|+-@GZe2M zyEjKmT;)%%@S4LNk|l4H!G@F1wx6@R1Zq<)(H5l7IS;t;33z&Lt6$7OHTU%P8iR<} zDy}l^B|?6+@$+lxj~@lMb-viDYpm#uoLGTs(RJXh%MmDHK{PZBavR-u;K11Io5{7E zs`a@#L*{UJFT5wWDzSyViTYH;xqz|%D2Nb7HkRiA_zyJrLoc+D5Z1T++z86@AnQy( zA8%zx>6Vhm%V+f}>U=g%`2UN?`5$z>NYn1nmO0uM3rd+tiK+k0)ASkE$SJUYmK~{p z#l?WU>BaoLhsxg)MhPHX0H_>7jvJosllZ)3dX@F00~>0kW-BiC%KBMCKgt1gGM>ZR z|6i=vzos=d8QBtVj9pt_B{C?lsBq*$9BfHAP3ZtBEd16eKX{+dk}xzhbfuJ-nq)I~ z+;RxG?;rJOwYEhn{fo+YF6wF<#OI&TZWLNq`fns`&VBf9f}FSew!nB+h2xI{Erc(T zQykO$X7bnE%?nN?99yagaK40uhxN7)!Mw!$KC-YdUdVr3kD=8^fAIG&-hLJr($EMs zq8XZTpBY4gqqjIa_+t ze7BcdB0$Ph(_?LY0ne3>E;DHq3x zcH7iK{a;yK-~6kM3h?G zsk-9~as$$ln3x)O`aND{ZMH|!ihlvUxS06(J5NA!3RI6b zhpP(6PdA`U|2*O~AgbwBxoW|+YN@FnNBoxBu?kiKj1gIU{N?K z-Udy!%?tP}9JCGrL3#AQHz&1T<+0- z(&R7qerY)uJ@+KlP$7YJN#EmVEc~?+g~o8?C4PN%(mI2vRvoKzK-aE#(@A;&Y=_0m zro;H096PP?OCWy1nJ|#YCT#&|NrQhT-&&%ZaotZ6wr1qD7-Vy8Seje)7eFDy%zzJV zw)wk4Yv6iyDcY(o2JZ>jW{vD>?+7vBFgxFAt(BROF~AvF2HictVF3@{m5oP_7(X`} zn!K95ioch}S_Yz*MRo29ZLHf@BhB}4u++ZK;0p8w_Q9WKo!l4j8J>W8TgVGa^N3=3bl-QICX$P`r=jEaQv-LcPLe7JB$?`S}6)B?CRpHqF zJCNo@t2OR0^J$cBZP)XgE8_uitk0yd++!WJ{@aT6uZQZusgd(Hhe<9PsQoVJF`2j9(^@};<9L{PduJlR3|qoF1|9J^cttau$(_(F zl^ol24sg(VIP>9YKtZXvvk==wtz8B_v`Bv^R>%;X-(5&#mlFf}r@s_5umzF*0byn7 zA}>IHbv>={gPzV1j0Kzzw<`2}gfq-oEIiV@ED!j~0>b5o^nQ#KM`|vAKrGn1m)cDzRQLuop zTltAA%GjMcIr(S#VPT0Cr)_+7r!0kaa?yoP44-qz;%6iBR9=yIe=Q8m!nu%kjAyX! z>m4jAcTTZQ?BzGLm`fQC34+*CdLzB_hQCmp1+TDCo2`Xve+S= zjDFcb@`;1o1b0Dwy+GtFR_bF{uVuYUT=z=D(!e9x=LY95#w#YkuR~OwL?I99=?&~3 k-jn)>(RI%ba!sJFU+?S3HA4>mKL8>pqaAebbUoaxGO1h-Go1@Zj=s0wD z{`R?d<}-6=?%es!ABY_G`@Z|#`+3&0)_OJ}e<@1g-=nw(fk5zOq@l_X2!;Uo`g8{y zeDd8@#25m30+E5fQu*MwHSGacSYGJbLrglxa^|dOkxU|!}bZEYR|K2a9=SD?y11bAMHDjKr zBGd+XcM}$J`waV5R7xa41k$$l^&pu;YvE0>h5$m)K2`3(h9ygxX{tT%1p;NPenV95 z>yv=KVc3r!&m9jliuExCuWCcnpis|nyi05IQws9aM~UNjjEX}+Rznf;+`fmKLINDr zc&R0Ws50%;w-K}Gc zsE0U@PUqUY62A;2elZY`Rw!;ellPIG6wHgMot}stx-Lf{7B^5Ea_cqnCr-EF!KW7q zJh}0b4b4uMUJgQHYvgOjrp8ezDd7XAZL_m!zP^x4uc5tilZAeQxuqHieDJ&fk3Z{; zUv-L3_YaOb#%2)_!w2M#9wj97@<(b8&XRqkH2agO%O}RC_kz3p^lC|_EJbmBv@kRx zf>1+411tF@FkCi6xIw4$Q^Lpe(GJOd76TfOY+ zac382^OldW%@Ag~@cd6XbC^~H?0ceeZpZnLOGKqBhngdG;#o0!#7?;5wUr~BGH5YY zWd4N9$<;ebw0qz^5xAAa$G5w;M}O2$u9zmMP;NT#VW$4JpP%2j6<=9dxm{+~UK^pf z!|5&&J8mN!`{?5bgM>>LzUaj!GW9B-fKmL1-Ry0g4udl(qG_=C8H|iM?U!;*N)Tdk zJ%91x(zpD-g63)&?^-$$G}ZcKzFSexymSw<#_>Gks}Y-!n)!BC!SC4o`1OX+&fd{k zU0>a-MCLsnyt3cSPkn{_8Z%SnmOV8o)OBGb>FMdGXJ-aU4B6%%4fN}VzsW@ReHi{h zROh%8a1XY;e9kNPUg4iMak4q2Y#;6;@n`!yzOD#J$tq(uU6mxpykRVvuzDMHSIo)wfSYw3c#*#_e-pV}gb*zr;6_#O+o zf0E;9h{;y4dMujSQA!Nk$r;dd{qW&A7}~|7AatnL5}%K=oY=I}eKLN1Oa&Kq{n92y zFjQjD_Id*wIbpK0{_PACF4uSW2^Q86Cs%*HXm#;Wk)uzgN#Op7t9bcYGXI)ghdK`~ zuguvNk5-k}K-Fwo%LguOt!dNCCCfGrZb+AHcsF0UY?b{@T}l8C^|X>t|JEtvniKPJ(Qc#}4r@&7%6EFe`bxzQI!*?B6wr zPcO#aX;Vtgz+%x0@Op^B?-n-p{!|Y!`1auOV|htQ(^QzJm$k9U^42RImkE={qV6%= zIf!2+Z;6xiwvGG7%w$!nh7!Xg2IiFf7bnWTi$mVNnZbI(#um| zH^|OCrg}@y_uvcb$w<(`j+1RaIYqSbM!&0`kK~5e&3q8|mVm0Q(9eNHdMbhVyT-2- z3ljrW)qVuW;Y$m7$C;Um4pO$O-5ZeFQ7ZhJDwbRlX{w$u-nN-wQ6 z8E8834b7|IGs9oK)2+s%-yQ$uf5Um)Xeo{8XJ|$Q#m^u+{L&lDg2%?Z<*F22 zyw8_;5NxxFIbPP9yiZqB#Yx}0?55FUoOaQl9Bhxd3}&0uZpfYP-X~(Cyst8rR#W_J zf0~dHw-9Hpt@_pB`4!tt$c3d}B@!l=EHXu}Oth)6{^0(jmuhN!etym%NHepth*o#n z0^>dAomOro8$1FLCL^5I>1#iAdUY~uFO*_zoc)et^+A&Eiqp+Dnd-^e0SY7frv6W8 zvXqqrPO?F>@Ijr!Qa90y7cV{+PE~}NuhdfBQg6;O!7v>($T#-oeQ$wmBTr)Bcq@i{`!VUyL{@2I9-KDQH3dGJW|A z?iL04m6T)x12KdAH}k2+<|ot?#%9|rl<#Xiu|;h+Tl&ePt9K$fPTyp3LQ>Nx!pWU@ zJ*uvfX-}@gyEi23ruYp$n5Bk$R5h2`79fm`4`ah9`3XFdo9?>|Ty2|>it{JgMw}Ck z)I3uX;fteeLd{#Q@;6JcRWDM>yvL~7UASo4}wRBGxgO-+g}rBqjrjSW;#n%>|RRXB%p?aekU zPgq!ZN~fyN12<#!;+H98#;q2sDdiNujdSU$4GTV>Z86C5TZ>47;JO^65E;b;8XO6$DCn&ceb+ot4!<&7$l5*dwS;!1VHW zgS^4A`Ik-1Bb=%x9AB5M$x@4n!cRY&f)>T7K8!I$T}{Q=N$hAqJTJDYer}`?Kko85 z4O>Z(tlhX%F=jMU#&}PM^hsvhSCNgI!y%=+TjzJA%8I}1Oz}NFH6%|z&g~d|r>*sI zYIf0HSVESCdrDGY|H-wtH$X1gq&B~U*LSFH*kawC9c>o71+93`+MZ!R;I0XevO_?* zy2ijThW9+*6;7<%9{R%b=P^N9IlC!>irCeVyV<8CgA3RAIr^MB-i>3OIZ8<`yU@SaP}~$%a5$vx zJfd2lQx^y8W8A%poOil-r$un_GwY49(aDQh8o{knWaL{rsp{V2ttlx~zUJP>vw3Zz znc$rWc&Gge*@@E-4;QAt=;%?~?;#2H4fAPH_roWGoKg9c+MN+iOZ|FL?w>6~bF3dS zh3b9D87kADx8kEDCnpzdD8Qw43TcWC17OxXHipv%5pRMUwbaIspN_0O<>Z94b;W0N zJ-+SD;W(BO7Z;ba?Qy+_&xfV!Q;UVoX}nGyD0aqnb8UtrFAoYlCgvq>A*I7CR#dcp z4d&olZQf_t-aX4mF(ge(&_&m>=U&ra2^w5Jzt5+CeZJ8+Ai_A(d@w3Vit{y2HK_8~ zDb>v$m!n_jWnNqSRS<`+3~ZsJkh+iCv0^PpZ?ME^O*u6J!Q`>qf)k?k^Al?Zb^I{C z;bpY#+)dC|kv?NnA+P}BNVa}&ZyT<@m1&wcfq3axG`8Qo{jo(}T;X4?W5@qUZJmtr z@qqSP-XL%6l|U}j(3`7CR9^yHnORR5STb%x&-Xs`r-eV5=a?bD~9I9zEK%Ts!8d*6tTOqZF+$qzj>&}}(aN7NAH za3{wsGHJV(%{UuVFy}0ly&ar3e$JqC(s$@Fl=R-U)vVuy`KJ1@&>)>b>5#5xsw6w!G zP1tH?Y8n+6*IC?j-5W_S^+UawdQ8Wa>geNo`HDEs`x*oBFNYt4zAEO(?1vnDs`~IU zc~sCj=dsfK>E5ETiHX4@Y&0_!_es_Bxr$BmJ`efk{>o`%v~avuG&jCN4nsZmp^Y-} zr8h$gNV{~H-Tg>|cq3a2oVor)Zh^-HprqIdJO`%1bB~14 zo8vNkPS82cWo)`Y;~hvovq3m58ykL5TMH;rdwYAdtgK;{MK#zodOiy`9$%~ZT}d=t zy^qRV*6yo9MQ|;3(}Zo!+rA~!SO4_>R)@kC4Eh?c?QoYbIh-aU)pR-Vs^DzrmAAM~ z86>a2RtK!&yXKH?i8GqE{gZ?Fbr$vvRK>xJOr1A!g^k=@Q6l% z{+2WcU6@J|m${$$5NZ54ar8LTI!*?Q9?2|HqTDb0W*UQn0($f)=O#Kj-uKt6 zb#4SjcoDCIgH;&M$~RkS^X${#<$NWMOk#136SSxLJ{g9~!82x%7d)(8Q@&}~eD-`C z{g@P!#HH<)klC=HjW08|PPF9Ubob7k-S=wbo3t+8GUvB5 z;5x{K$@k-xq0)QcBSp9XMsueE4bjP;(A#<%x|$tFRtuz^7$s&1>Lh;K!5?ok9&ww7 z3C}$sCQcNAy#U!jG|4>Nplz@WDSWN9ce)sX#d+1UCZEQYqLyAbzS~5ZaDJ+SiG^h^ z@VFn&8~ue!xR&4h&ytMiZWGO~N^33B`syc2DRnMe`_-EZ9ibQreAX07;#WUCyghr2mlz~epzKRjU2*d;plDg z$Ei7#^Uv2#haYvaO&N>*YzcX+M#dh^`*O~Iz*q5)z96@-f^FD676coBA@I&G%myDrRtA&%hP!f`e}K2D_&221*J68v)7A+*Hm7<1CCc<;MDOhb3f*px`>X%h@Ga% zLkf!ZErwueu7`Fehi8?DhUr^GOo5n+P*yoKlw|o56ZI)KhXk82%|YAC9@^0vYM>#9 z6<8AQe%zIl#Yhd2D9All(!qHyjj~U%}RorcVqmF_8 zXYcy_#NJr&^!WWJ5BI9whm$%JMV|PikrW*)7^r)dpFZ7+7?LA)>YEj8DVd@eV)GsHouu?FG(+tZ;!hIhp`s&&VqQsxTVXCI=YwZQf1UeE=V4zoGo`LaZ6BoNFV3_3 zNVBM{xq0XG@-OIMdVWSLpByxgsd$DV%ELIfEbPV6^!CpFA@cJ^x+Ag?jKZRES1EMfu@?qwVQApV1Q< z?Dnn(t0+%blZj4QQwZn(8k}XmZE_N`!Mn%0IW7i?)wNMEtHuBtb+pa$tyjQFawMYeX0ri3|r;9DD?_ioo;S05> zterF`uNd|nNQRzf(IaahBCC5I$IZ=MtR3T0%dU*f%zOYP> z3|R^C4pnw^!$($VNrbcp?w%0nOzO&QI&9xZ51;`aMz43Op^Jg;VmcfEys~ z7V+g1Uv!Axv>DN?L`R6z7C1iw(e-0L%BX(eP&+9JJ4$-)S>_ zn9!tAZb~gqHfl=N@LD$0{l_0iJ9c#)XA&^Mzk_jKJV%b|dzPr^=!tq5H-wVUO8notLnKIFklBq4^sUfA3J)EaU5EMCG%~cwTnvl zLZy!k(cX53R0M;F2z*Pp(Rj0s3#N!9V+8me0LObsWX~j51b7Twz#h{#JXwrxJB!RY zqd53|{6B*6Kf~-|k)Ang_o<*@SCykT7!@z(UfN#X&&78NX8z|uuS#tP!qswCBNlrBZc`MX>^yVLq`NOiTq$tjV< zh)obi)XP>?49FIlgZC}?KE7^||?1NAvM#|i}aVSOp1|IVX+HlLaRvox%=+Vs>SQB-wwz*RW>-oiM(sPZ6f8^>f zw(C64*K(|88&j0T&OTLGj+K4*{oOELK~9e4=$zVZ&W|pqSi2@Fzo_=})x}ACtql>& zu59zP*U5A};2^Nq9lW1r*Lm|bYAl{{u)A>~UYtz3((Dv?1vy)e?RB?Hy|1%jyLKc)1y2gZt4!cCyXF`9`tXSdk9IY3)yd zQP&sy)nBxDZF9TxZ6M?l*mY`4^jk1j5NS$aJmiO7li0z^fKkiG+uQC^VUJ!#P>WXY z_p(gXI_KBb1F{xS#LdMO39kB8Zl+`d)*VgYK3hmcmd5a-fc8>$p#_H~Q?JPz30`-*Ed5PTnPJC0uq%Bt4Ibn#jPK}q z9gzUZX|&iG4y018(^{((jn^mhq|2jXACvRLHK?TIN^YG(GT$X2q}w~LGcd*mkCPQ( z>X|KdN5b6U0fmmIyYu~N;%SsN)qW%_Y9(G5F4SI!Z?okSTah)6xYI>to47SH30GvixkQP> z0LSD~i0+AIMDMx7T(h4@29id=&KE6Nn`Z6W@F9oW)5%yk1WV>p1{=r*5B}*|XDt2h zue4b+Vv&=*mQ^7j{g=rbCc!q(-dwwqa%gT+w-yT&(O!PXk>Yk}m;T5>$o|elyMZwt z7+m&q%^31S;N9q1^-_o8zLP%|v1xTC+cs)sTR+UT&a20X_mFNC z-l>fi-svST^}#Tsbvt4K$fg6D&;!K3Xb8-T%rC;*!oNI;duIQQVeg9I)k>>R}u z!-+Bz*yLa1Lh)cOps6Ac_B~gts;Djp7*0LGMD*`#oy=>h^x8jLY)wJ6wX5u24ywwG z#r6RC8_1?r>88CBtFCMBGwAgmbbLU-py9uxh@}cNgve?JZKi7@6B6EktIt%I!qqAc z9$AwKw3t)!IVT1I!#-4|=ec(~(BR>zV;7aHiXDrDMXKhke?Gy!p4Id4BAvRtAO__- zM`*HXVbZ*2-AGsQrceZ0*z4LF8hkR`OAQYmCitHi=zoA7^OEE&a>tpND3`sL%FcaL z2AY@efCH!Yco4ZRi~3)w?0?+oZ;V%!!VY(l^iREpqq4H{y_7C$Lk?A#If*(VPc@&} zSd?zTOO@0v+kAg;(zW_z#zUjY#!I!Z(wD~PytI35(Wp!PtsFG7EcU|SB7uubLNP+? z5l(Zes0Zk931&!!8}=t~;Zcg=`L?%18I)4x8@{=Js=VjSq5d9b1Mrt#GEDzudm1j} z{27H3Q9=!-OjKBsy`xE!1s*9ukbh#i>7P;~DTro3B^{ICUBJI(q8ayEZoFSkRa$H8 zE?|;&vfa`@j~+@CGjb29RDv=~d3t)*=&ih^-SKBxkCiFHF4AZS^w@3;QZp!ooL*n- zm`~U864NAh|76Vh4e&hPUfVZR`hwLqi^-~~4bP%C70BuK_`^C1R?u(al(8_%Te z>AG^015yV0gyw98W2#sQQ34@CkLy1`Rv|h91w1$ zr}D?t#H7?^OEZpLXPsRxSV%6g&s{0=1ty8>l?22w+BM`+Xda*?*I4pSny!arudICzuOx z)MI!pNAG)?{k-r1N|os0L+HXFG}U8U5OjXpKVsvq+L_>-hy=u<$Y^K~00^WN6if!; zf{^|c{`lMor7Qp*AP<3D(^{wu3<%(|Ux2#m&?!5r$~3cS{`~QBB8XDl$>;hsI$}Bv z_*&+WqO&1h>b`?yeji=GGH~_Yb>NBUU|I}324!}Q(5kfAs|I->!h0?``|HI36{1_ zf1?77CCv$tnTOf>r5``LZP=J7H^U-lNLiI@{!SUFwYff1m~x(YEI~8R-!@O*e=`n& zkoKX^0>u6r3T^B;xC#j>+E)g_pXn5=i8m(j;2uw8k`#tI=J9L08^qg&Ix3s^eLs3J@G zeRYWRz+3C0?+gqKFJSw|>$gYff2#hd^91Q4pURW??c0;0>VP-r1$rsgqMqM2*HWD=objy<_5CaS@+ExJ-3Znc(mVhMrgfTa1S?nCY^KY!z=VWh>$+hmG4c(|Rcn3)+w8VKs4N~dVIG{5F;?ZSu9HV(K zMHsgq>^pSf=GlHLlB~DFJ0Lmu$Sn(JtV!=iWENG=8H7sp_#zX{Q2MO}Q%HNFMbvt` zzD6GAbnj?mEC*2aaVx<@5!-7KLn9+#RH6HoV6f`@3-p8kTEDopBi--q8 zDUR&U?1`@4>!j3Z@)l*&tb}|6iBzD~RMa|^V@F*2#ln%Kf|GyRi5S#8}d`ham~jivQ*`SWMHdgQ%69h@N4EOE z7lnVB4*v!6c}-Oc0a(KtEuC12m=r4r1=LHPJ$>p1FZxCt*{ZVP8%j>RNWeG5b0E)+ zhvj>E>J}C8OdU1_G9jM`HMbAU0@kTSoy{_U;8zz%IeN3+PCGLxfETGq60=N$!U0|_ zk|Jjk8=ij>Cyc~vvpYdTtOD_K)}B5U$n372@wgG4ncWow{*t_pgS!cDjdFMd)ei7# zh6P5>@AFn6TTCAXcIoQ81uUhD#wXLHFAfq$Bc58fT^ov~mw?}SUmdAa!E_xGAQHBf52R*l)UnRjs!2BKk0zh*Vx$Gz5}Ki zpa~r2<;Kdz#YG)Iaoyqay(q#EbUc3AOjGzq(o2?Yg(`bZ>oM{eab|eByIT z4kr;25vyJ!9Mp4ZMMYDfEV5F&O!F&qR3-AXEAR#4t;{NgyB!>p1|N+5ZqoCCpw+}7 z`Ox$-nm>p8G_|mK+3r;XR*9`l#0QkpZYlJ&^LeIXe9{Da7PaH zD45896UNA)*4EYp0ei#9gJ5ah5g~LA*Z8yfe5>gV-Dr6Bj1k7_DwOgRV7GoV1o+va zgWR^)^_V8_(h`zT7hyT358tcHtT1gJ)E;e!RGRdSvTY**2HuTVejZi>cbhZxU2Y=D ztmi)gVH6Wj)+F!wy1r`-oX=U#(}UIn0D{X&h!=8N3_q6)r%+uzL{xd{rf(2O=H+nz z`4=|ke*uDjgq8eG5vyXqG>Ocg0M5+k%!rusEvW1$PBoyt8Io}SgVAP0jnrb^of;h5 zqSac7%x@NycB$CjgT>kSmjx}!5_xJB_|>0R%;!+RPsc*%sIJ@m?T9|`Q^ab^Z@fk$ zPT(6D@60r8n}eJMJGY2d!uCd87--wx=B$qmO8CVTu(@f`3Zy@O9l!=5{*#)-Qo@MB z-7S(x%?D`BuCS#*?sV~_^UJ_p;<0ALSI5;yR8(8`6XW)!{qClu`C|p9$ByM8RAk9! z?!e-aabxrw$ydkP?fxW%_Alxi&aKap$S%=YkTnpPzNQ<;&l-I zgo}UEtg;yZB5HM}L0H&zo3&DbP8pVG-CX15IA`|UozqkaZED9z<^0v;?F9;Snpq}n zY;K_FRi;FygX)Iw!ErO91HW_Ad~PM2#>N;>MWowec!6G1Dk+;*HL6F{&CvksWvFyV z?kEP%4CQG}flcii11NnpH$fNX);$%>_-rS%FT?1R z*DN}$>FAV&|97+dUq;Elw9X4CxL3o5wYiM$(Y)8Ps60JAy+?CDkB(_BQ?|WJeRDT# z!3)6Sz6Z_wt{)9 zW!k=r>gm&`)lD=aZubG_qH9wqSVX1ytOQcpd;>=5;p%Vywje^X1k}Y&Q;tDfpwsFv zKLRSD-Qjmiu=FfL64gon(BR7!@P*AzgjkjTE`|f-v zA&UohCLSZN1XbQXhtP=P6TKUp~(;EjXmSxi2+I@93YH}^E=CwGGwq0@$1rF zESu(L47}3~2=J+)K*CjD?)PD=juukN>FU1z>#zHP1JBC{Kt)LdOjIsn!=t+C;`CHS zu`LUUM%t`+-Fq)VtvUnl32y(;kGJ$_+2`cM!_jc~0DNwQNEKC`9@gyn%zv&1Yv#2W z4&Dv6GnG$k*{Yh|W~UJ}d^*)QE*Z_BAmFn3sF>YnWN{x@nXtiW&}l01Jaf~F)?wQQG}>ktir?3jhdQ6>@VGx`69ua zmz(sFo*!>*uu}>-J#P!bNA39B2#1ofW&ho(Of{?VtHL*)^YtsxsvFed`#Z4=p?*Bj zO+T6_Vi)C@cO6n*u7s0ukE?|-L0>7qbaIkaDsm$|izm+9MHX4Yg97c8GHvGeq29u}71IW&lXmPt)a&ZkMcILrt1{R`Os^FP`2PYuuK;vw-=baA+9cgK zS~jQZOwC8_$|n>2->idDI?MEz;Q!DG`!C=?;*e3SN^@{OGN}-WVKyQq0=nNUuFY#) zkBM@N(5d}Tdu{*Lw3GPx2KqDtpoGJ0)>~Ts^L1STqFiZ`qurMQ4Q1LVZ6VUm8IJ#| zE%zUjVcwLSjVcKm&v$T+i;aOVp}FK8;B7#%ⅅW*^GXDdj){tp`enqois^Br#m{h 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 VRsHHH;O#Y#qMWL1ne_WF{{~305JCU| literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/revolution.png b/doc/salome/gui/GEOM/pics/revolution.png new file mode 100755 index 0000000000000000000000000000000000000000..c02c859b1bf80dc0eead7039ff9111d4bec9e9c4 GIT binary patch literal 14251 zcmb7r1z1$yx;Kad(jrKMsDOY2N;lFXB`pjk(m8Z9Af<$ebeGhSQiIYUIfQg~OLxP! zIRAU^IrrT2-S2!n4-fm97-HCG&FqKSCT4dXy|<4R}UK# zoVnMJ0YO81h$bs3ruH^qbIMIe?eMB?cO;&|;ANvuq_Pf?TKPeY-T<*&;TC&2#|wFd zYQ{h6%zeL}#p)DgAOHMDKQ&oeZj(K0-wn-kxmUZDm-i!UnfO~A?n6#12X8nYXQ|(Z zvRyY3+LokEkGd7Unp5vyL@pv&-OOw?8J*rACidymr{Ke~o-=wbE;TQY=^QiR+V&1E z{%n)^I#rT4OTBS02?2KDA6oJLfq{tOFRE(l4B*O5e#Zy&=vSYMGKs|1+CRy4Sm~Xy z-Q24Ghl8opuL-#~=yKItJxuieznQgMEkakLo|V7mp==4&8v2^={-w}8B7QyWRMGUe zuQ9X~m0&>EO%cc@{MfI2Ld%WwX$*6Jz`cyu{T8J54iNM-4~kt1j13;5r1JYBl9QXm)<-(H6Z13*DYXk@l9H&4 z^y>*;CXYMq91W}LC(1g1e%+4``LW!ODq2YN)5v7t*J;o)@guN7(r*Ns>zI%^#Q zh(2ec9bTr3(cCE<_A4J$v&ovyc-I_w`!<(&@knN$S$ju!qY;<=)}$MoUX5h!8R4E! zDtj17^h|%*5BJQ1QeoB#tF%|n%)y5I?y)Hm$u65dDvoSv-`n75q=d=hPPX_%2iku$ zs}&74CtTIeX~K=@9xZhiZ-^8wv@KFD>S;^83^L^}tb5J5-A&!Gs@ZqR=3nBMP)C_? z<}p_|65%WuhL;%;L}w!r$*8civ-472T}}Otl$feqy3LgPV3BTOrc8Lo@xiyiRCa|w z#*y~IA?0`udB!-lnJ%5hiMX)ZbmrlEbAt&TG`>i;C80{Zk*fYta>h6OBA8ewS41dY>eB zd9yL*I%P%QgKc`Cbize{F;%cfGgl-4#cqAh;-Qb-W;XOI$ep{kgL?(Gz6`l_>z3JI z?!EAu^6bGS5x3$yv26Mo8im?ix%qQ@L)6~28awXeO~$Q0L#(-W3Kk-x)bMNfjhRCTU8}cbD(^vVTfMahtxk4ZIDyK>f8K|CLjO9b=_%$4@SXIe0pXP&S=FS(>=U2_Y3ZVsU9E# z$6k)7->uwBp&(X*EhN}TM{}7lNQ;5*b-RjZ~ct^=GChu zG+Dz|e`PYi+OyP^a<3U#%?3L-;C2@pi_+#kC>VFl_+<>`%4<19^docN%iY;cK1^TTnCSW8RGIL2C6T76#^ z{{#1ID8G-zS|tMK>5^c$MaF#^%T1GQTZQ)Snrb3eg<5Tqjnfe_f1y(zt+5!Nnz%LD z-wU>T!?Vs^pQpNFQ8|5wd2C%t51Jd0M{jB?8DLie%(sS)l|OG^g=%6E%+uLTxV>w5 za&*C)@~4j5)ysfR7Jp)DN0uxBOr8Pw*Vs3A?mEPp6zUDaww(~80p7}N1NISoY-L0g<3(JLD+FXQ& zYxBo$o0}M(Wtr#@%j>SI%lf_w37M->7`FrCA*A9;Bj7lkd4K!ZSRea5Uv~gYiBL&M zSQwK2HCoEXhAq25r+aFSp;>D2b@5Rabm%u=l-L}5ZHB68o)TK5ooj5S+-eaSAC z%rx4X$g#a~VuDUsvK4u}V|$5%1;?K|Ytdb;Q6y!4{N#y0H!6kQW$G3!g@(}tsg#&9 z2`&7>Zn#*#_h%S;$@v?O$B%xhoQHH9#o6>k7yG8McMnO4%7_7d9K=NN=efrUk9C0?SW_z3kUl9s1#& zlVnX-r4HPnINczN^?$GaZf^!)m)In8c+ilD3sgvwMKt`A;ha0bGxLR+Y|ru}s{ z%id*|{t+bdUS@}+O;7U18s`=o<()1Tyd=+1rJRaeFY||Dw4Ci~I&iDHo}pe3)(o;L zop0tfMAn@C5>+l!7(A@$*j$HJ>DGF-1$UNiRdZe}74OF#^qKDzNbECmuk9MCW-F!k zjD@6^TMk6AiinltAiBrokk7NOJ}{$78xe?%)%A%^_q}8Mcph79nsgVDz8i6%(xaYQv$oalRZth}2x2v05%v+wtddy#6 z4Nh1uNexkG+L{6b@DYZv38GlA%J zfBs8~;`%Fr?{;*t)iz@-8^yvNM``efUnqxa<4%bebQJFYVuVPbPZq9omUk4r!}I3r6V#M||ho1XJfs6P4Pmel$ui=J%fkSlNw zefFaARf0%uLBk4^tZwNj+RMyQB+fxz?HEp7?^C36H6wYzov6yRSaA!LMGX}n-ef%) zbc;(|;TFwjb#n-k1)NyEZ_IN&FLa#t zx$lCvwofFX?;S^mS<@CSbF9i_l$M$QWHL%I2XJZHcV?1MaQmJ*uk)RQgKx^2(v=~0 zg$1T!O36Y2()qtDpuG0ov|T4=?CZ!&qmj~(frfHo>rCme?Cdpf&0XQgTZs~)ddAZi zr%9q0q)y_P>4&*nt1NeUvk)w@%oMkIy?q||5~}2DK#H!Nlh=8RCT#qBdwN>Uxa^lY zN!fIN`lqJSfhTV2MPjbk33tar6-oK-8XNQEKhZ}$%M^dx*|Y=TuN^UF<6*j>-W< zEx35OVt@k?rMQ?zR4ie}uzd>;Cj|G{kG0)hicu{%-@@ayiDviNG9A;f$5X^semOT$ zA|zZcG>)Lv6}G4|9;t0gpA965258)`X=S? zY$@FYZkF1OY6f&Be;5>Bp0$tfC$TuTUHvN{OD8oVMuw7R9;|(I$EKGIAgwdd!Ah$j zSejb?5|w1s#&VZlvW4OTU#hf=7&g8)W5n)H)PsP044Carf6}f)s^HT5bFzRl?_mNhdsX^C=f4Xm+vs^wQh2d>6F|my)WGe5>$Di!=7pD>o3=9FE!<`m4 zev}<&U6f{y8&tK3L7a;Poeva@&<$L%3UY>cqy*)cbyrxj5bEUTg}wfcAbR< zQ?_))bH)o;BdjM!U%Z!tus(Yh3K04pHHpr{+1C>qU~p_g!r~}<7KT|LdxpXaW2eRT zdzkptlH1d@{N5LQy5iNN%Y7CQC3Qkv+=T!#J%f{-IiS)Q08`^M?fIQ9frUo9enM`l zn96LYYeAtT!<=8R+?|+7;xL?*0ax}XI$HQ*8jUm`2#ks%0hSRTUz~2Wb3|0quf}ac z4%;gsG=zG-^eYsRNl%ijq~vY1n-!g@r}L@xI3}j1*0DO3&WsqyQHs?LD(z%poAf6t z%IepKxkxCJfG@VTgpg_NG~UX{%-r4EYck^^zJLFHVsS6Zi=2`_YHc6~<2k(1lTjh* z2He0Ro#HN&F;|bs)vg{Ivj241)-&)lFnGAo8uor`^2ZXJ9Ei`22e5!%SjuTfKZDg| z)e9u1jKIVtX)Jai3@!-bkgpml5&7gbe!6IHvm;YhFPAC{&OZYY-gDtBCZouC>; zaFfa>v;IUja<>%!KM$$x%e;*DdykWT%s)Y0eiK)dWut>#T?IZu*Erc-YUzIL4}-H! zNkN#aa759c@bh;Jce3VJfEqwYVBJXST`x9w%o~+muAybep4LHUFa8nHNRMucU+M4f zZefpO8hIXX1rg_1U)u=M69!E>je*2A9`PxwoZbsctQaz($x-HtQ|G)o zyhIHJbDmHI-=0{Eu(nz#5Um!S2rTCH3ezi&O#{9eY*lOU!nWvVEb=WWnavwdIUDIo z!UNZIEZzZI`}x&R)q1f+O@~z*PT;*U)qEnX(M}xnaus^00tLll;X1C{u=)G*{B{Ta z<%|9>2LgOPb@dQOWmL1f^g-{bwngNgxP1KK%AH?lREELaD>@TajkbI@BMIBIGQYYmSlC{o zth&gU4i(qe)&C>J7flHQpoQ;ET~%(1gxR6XSYRvJ5N`a z;8mqn2SfRS{D;xUAhUQ^nC?fbvf(APLc722dtU6e zMeB()0OVn*&;h7cx*n3s3$LZ{0fkIJWH@53IY{$Npj9$F-FBufTCWI%ts38KhO|_) zfUvWjmG3)s^&g(69EX?d7_hxX*=+fg4+w;jsVS$!u)H?Xrn@u?HCplxLqtU6TTafv z{%J}mH9xUmz3;chCqB1Q(I2$2VH*7LPzBZ7!uOE!0{>TN_*^2~TLKjW(W)||2g3V> z{?(=2pTRr{cXt6Lk;5kd3rf1LTN7<}QsLJ@4JN*;wFlIK&Y=$=+C+!aYTupMwngrV zM?pkH>Y51mbE6*Un1{=E>Wf+O5^vqsKUg(0Bx@rkA^8QU=|@V^mSJmXys!t)jORH% zD9XTc&?wT;G7*-R3Nu{pikE8YX8A8P>1vX~m6esHceZ<02t_Ur7ef8Z@xI@oZfNku zpb&QF66^jjiiFc~TMj?rdm5MOeU>*W5Nis@rtj3y>WwQXXR~noIy^ouV84j%he?p( zvOP^L>Yc=vu4}aqq&AvHp`MhE4z+onxtY`WqbWso_3fXZyAye3lu0Ib0HN$@gP)V@ z>+6$*sTf@a;!{01|M5)#+VS|CKa9Xx7}InpTY*YNMFrsb?5sfyyT0N;L-rFUrpUNB z?1mT!G>+4hfR>h4rwZn~HT83UU@R5wIc1nmjq7gFNTTQ@S|C16>y~i!jqO-}b;imX zQ~XqupJ7M~drpU%7#5uIrcj$3nCtBy2pR@JdTifw99+4Z%~V6PB|L2go@#OV*e@+ z6|H7U@9&^2;IdWlnf%3vw6upuTNAyBwvwcLF#VWZW#wr5=Wnp-3$_?EK@b<|R%13) zZeBk+YL>E3FD7d8`iD6G-wq|Vj9^@D<3U89-)$$}LKrpp3hhdKM7;c&D~^r)i@Op7 zM)!}0#>YOO+K-laOZdK{_phR(?*DLp9t&q;VrsjW&nB)+BH+By{ytn-dVje)UKH+~ z6|0|c!9KujIb9tc8F>@StQGR~I-ewp{BUt`-!}*1AFK_u@oah5HWdpUZH!?wM6+sQ zZF6g^>dmavH-qE%j z);uZHMaHm?cy?q2gy1~mgw4Jjwtd^%icjTcISI8It@8Evznvi?!?}K`RRFH!hsR4C ztgd<>A`yt2V8FzuM1yUNz5ql)5ot4pjgP;yGuMnJbiPqW&2N9(r?~Dcn0LlA^78z6 z;QM=-pU#`F+dk9qgJB}}_K`gWsViOa7zVg%wzk_UC>4?b3Qm*XMY@7|9-9>^$d#p7 z{pBD!@2VUxdjD$JE8L!efk-la&xjKzmo3IB{o)waQHJttTptfqUMS#2kC$PgPIE+3*Zp-Z-P1th2 zYx2J}H9w*cuN^D}IM^Nc;{DFy;nIMTDCGNw#~7h_6;;p_g7n_KMxQGTtLD$10jY;H z`B((hX{Nm?c;wH0029AYOl+9gMoA8c+43i*6a%m#lQnLU;1%NTGb#QC?LIVd35nC) zHae7!rfermzIwh!w0D6bw#!lpN>WHj2&blY{0ygF^m0wfljJyJlhoVzdtDRz{1P@u zFzHLI^%;lc@e0c}u;L(7zkDH5Oce6K1c8n= z3dZ#{=wg5TICF4^RY{B3Mm#EY3JN>bmmNKht~>B**=s$MjbtK?vmHM$Z(&oNTnS6$ z(Re*YB9-ob_$Nseo}wgj>fh*xwXn1#B`u8!xF)ij7p&pg!CEsGohMpDFe$6+LKyGP z?rx(QSE->?->_-D_a%r1hG)+T8cqP)<#b$q6T_yfy;bT@w4`dB%4n!wg^G)b!F;Rt zu-0Lv$1wJ^neNIUkuXgnh+t!?8acREe=?6dQ3WDmRAfaIWuA;IC=Jeck?j;rCE9ug z^6;I<(T13E)T8UA`U~lgh=NY!td16luB-q?N#<{N04;#3bIdN9*NLm)tCxmY^qMx| z(o^TWt^~|e-S6K8)PTCv)OAK6C^MSSnUKPF>66q0FcfV(h{gF>0S^R&{By$p>oV{U zX8|jOQdh_M1fqZY_HERm!o|2df%|jO2cnFxqmWrOb>qvx!<&dwpyC~~tZ=cGKOmRU z6vI}QW$`TY`cE}>XBN2jw{PEm?s)=}4x?=O(oSFL21*;K?X9~DZL&&AZ6hPGpquvH zsDt?H*GQ}VsDslm-kDj^>nlRv?pu8xYy8d|R)&j_a>qEY>i5d^24tT<^_J#1-2H#Lx;e<33 zv5krPa6l@EsY$w&L@y-)GyU-41E13$66MT{(Vy1&){52%E@)_ECO3Nlew36v2QMuR zd-EKZ3}U1<_!Q`*jzM$PyA}_A@y>Wlym>-w=|Vx#we`(Y9EUmb5+FRZY~ z_4*^3-egMS16CC#?XW`qsyNoYZ@oni7}2$p>$?A>4^@{rfGZSA#rxT$J7L$ecV#z! zu5I&RLOzM>`{X*QI3HH^Z5{9vVRsrHpru4^HSsenZuf=I;h?J3c=;#kFe*}L>j|=r zOsn!+?~OdHRAhi49Yz!iFL-qUlaSEl z(NkvnUzhagns{#7ABnca{sL(T9}|NT{)4Stj+A~6-Y2t3aYFoWKL$szA#TVvZqWz4 zt3cwMC3p`Y-&ap&Svo?i=y33qXvbQ`xbKO-l_jhA0MhBzYsIfG?>F6*ZBW1ESD*e0 z7YJEbVi>6!-{dz2Cjb2s%Z5Be=bkajZF$Xf_1>_bX^MBCl7^?D$B4N()`nc7##cb~ zCLMH9nN_gJEd)_da}g7T#xwm!7ij(CcV4&Z>gv8_XA@IU+{MA86{;FE?!ETBDjMNs zbeH!fnPmNsz@*ZF%K?4Acmw?b8+}&=r^wWFH%^m$8&dlKJna`z7-R|>Z z*mG~4@vHQ`PXihn8g4CsWUO-B{c3&ELZ)W~YE_NkuC8G#si(37Ajl@Qq9GOQ!yGH@ z4j*Z0@Ef4-XAJunWeY;|+i=D#N5-374JEZC_2pUSnh9#&|^t z&=3UP@GoxrE9gYz0T-Dtt93C+DYC zs&`a`CB~=+0MTSDELa>?x*;VO|DDv5%aJ)x*SN_i@!bQ<0czsO^CO7{V$Z)Uln+a4 zQT~ZUMU6%1IZtsSBp!dFrqtRv_$m%2p411pW2JTjt&avKuIq$nypOFTb_HEF3tn1> zFwHUgufslhD5rXC@rzgc3zQSccF0!RAR1>L(lhzv!an&-R9MDl=A*r8zdL84^Jq5d z6ZhhiNq?BPJ^LTw5}B%w0ndP3KJ!L?X1B6fB2p&E-}7iKHBg!b$0r2COUdN|52`lW!PhL|_1e`%a~GtcE_>qqpN0bNseul|ts*|riW zHZhLMtWTNwKY%P>QGZEf>=ns2VjWzkR zVtsX{SX2Qc@fPf8LkmrB?HGrQO=q_Dcsf&dfYI^KU`J)w##q^@!5o%n#StqoYLrP@ zriUscVn9qZ7mYM7EiRV4YX(NUt_4*rQR>UC6LJ!%ca8^UVBiiy8QhczoeFnSJ3G5? zS=s4B=4%tkV&Q!2#~?Z^zgyzk{Dn5d!vPa@UV^*3ySa$hpfz4LliCfkC;r8IY2T$v ztFfjeeuuX|t(doK_6Z~&2aT7F``pB2dl96{X?^%!A8!*6bwA5(AQuT}`PzXHTN|%n z1+hxOZ~p{r$y$mxO+jxkc)s)BkfASSh)o<6r4fS>AJ(nK2B3}6&92XnT6#?Jzk;$q zxiTIdelv{3mJ}ohEGCq9Xx8@2m-|h3UNubJ0p_|+$n8np(!eBeQIFD=R4vvKHm_Sk z@!w*ViNW@WIAi`VTK5;@(j62B0rwxF>cjfP*{&cn|Dk{GlfOdhf5C~bD9Qf_$i~8! zwl>rzOx@=uAgQ*t34g>@|M}u`pG`^IFyjd^tO=sN81Loc;rjAtbq}yBt7!b{8;|z& zB-rTb({=Wj5*)VkJm1mTKTxkCwXBNf^5j)hhwO{aO#**&;wf_%3$cAu1^>5@pM1_Q z%1nEg&n0G5fl%^blbH^CxaZKi{Q+3+nc*VA2*hNKQ>2(5<_kdRWHj?TOFVFaioa1~ zKIj;u<#v&^n%kuWGy;+p7DHCeH+%|!v(UkBiJM>fRFNs)iu+k(7l$Tw(|g=hJXW*p z4p;N5f7F7KQH_}?iWzx%<{h4-xs>+5p)8ij95 zjbwf62SLx0EdV*v z-5&8cp5GxG!*bcR$X+24sFOO+__M1+->>z^;+j1iRYs+B^>vLKqTqFYwEHK&IOc?g z_k@a^$BLX)qaY2muue`+zNDlm_O5vJ1FyvX(x!^@zb98r%qy_x%W9yxsp;lxjbe?@ zbjrUVTkBe)j?Z; zi6jB|`w~XQJKmbg?+^&aegVJoOyDwa>WpS}+xXr_{Z_TDDmEm2lP35y99^3(SG)h1 zM@T3MD5QRb6YKoKLj3c0;_)-PrYT;5K!WZ!HW6au-~gY!6f^|wuWue5Q%6ye0IZ0? zT7Ooh-QC^0z^D3-&ucqPEv0PL3}(3ea^89MclxXNws5)}IWw|}5{>*?I(3&g-f36A z7w=ntgGIZwU^!BBlf|Dtew=M46g6u9LJyp)F0l&7XQuU--Qx>-o4AbFE|aj?LU)MRKY^o^UlyJ;&TY^=o9Lth{4)jJE7>kuK_neKZGW zfL&-5&kcO6b=1^IK%x2k7_p-ES`hjNkLlrfxw*va*Ek47%t>t_*bhn%k%;4WV7zzl z-pjEWyD;hI|KT`QUv5jgjdITd+e}7s273bbDxb*H%ZuN2_TeUcrf$@D`JXth>dyZ# zo8k;nc0=!BVBX8UG)P*UH`R@dp7>$nXUN5}QS-sT{+N&%xVo&0y~=m`6}&mj7pOFs7`DD~CG&DpZdzho7L&Q{LR7p{{5_}rK35g3Yl#ZaR=S|#@M)N&DkoB(wtbW>9NTn0QpHI@Auz-r-q^C5=4zb*b@q@Xq6`l8;ckrRqjvirw19qFEt3EH zez``L?kbcP6YeLhxl#%EJT+iEIv;c~2mt1L6!%+$7GmU=FK_+`fqu=V8rAWAT3W@8 z`B9aXh)a*{&N4V_;uHqKVr9{}!qN66!}*94-v+r(waj=&Z}kbYf0YM;Xa{WPx7evx zs}exAt+3`>J!iPjIvLMjfAm<`VM9Dk++YQ#%V%|b{`G-Ev{mE3RuI+LV`E!Yu;mAn z^P?@dx$qt`Fl31@@lA-hl!GvuhF^RAblPlnxIU%^&T0yr@JN-yl>SL;ZFrv(k$P|!~V_<`#KHbH=Je?L}gd}mqi z)hh$D#W$s;rPRs_RA7X^qmkZhw*@8~V_U&3e470*8#-b`4IX50SL1za=sO@y(F*ix z6M)Pfvwfe`Wt!^M3S=x$zvwSR9zaeOBbA;fc2~L)(22@$x745kdTGNj!4NG>PD28UiL^xEuZ&Al|&_K8nO7|f65wH;Kn=wZosiJ zbxKOgQIR2f4^UZ1XPV3N!<%Y{){`P^nRs+CpcGjm;_JdxhXPd@MNQ~-Jl+c3s?Y_F zBdBD~qc|%EDE9i_&(q%d+TA$uIn@Jel!7MDwrkD_*5^lFylcAM`k4l|;h*_nz-nJ# zmplA{^ZC6Qcvw}fx-wW~|sL$es$)apM8 zBydo0O4WIahDs>`lEZFKM?zZtqk@Z7E*9`}ie41yqbiihhX z>^oRw2Gf&nz)&=ujOR23poD=I?&R53DXRHbg8|S*4wEkO8&?RpOl!pBcR)X;NXcml zOz_bJITqq8q>5f5@VRj(Nq>Jo8qi|zJENHKDC}3r`!DY7y8%lU-1l=P!h9hVQUxO6 zccnG-FFkE|ezf_kt!+YaaAWHIn#C3nX@KF3#ju(S`2e#7z+cU2YvO@NR%&wPFaATi z->KkE;{@SJC%d=7hgsg2XO(V1n*y~fiso^=1sdt(J|HNcoAyx0ut7Tow`*=n_-!n# zGRqM*Fecy0rPy+JG369IDA~yD_?2ML<-9gwVEsYAoU6O**Z6o@$(fJ0usTSk-tDaW ztqtXqVG&Y))AeYp$e{jF{JPX;O5oAi^qP3!fBG%Y4nxDkO+lahTUOQ!mo1$MPlhn$ zAMm|=5on9UyWXkmFqk3O%fEc7wLMS^bpZ+3=eBw>(FQN0iNrwB&B@+pn%mqA>o79B z`f!Ry{;yz$_#fLRGS&&Y>K$dd!5KvSTwmMMBU%)ZB5zdkhxS0Lq&Y>MHKr_p>gC^@ z8Yt4b!b@+b@q=M3tGTC&J+VnyydM_f-h2o<=z+54WU#%?8F=B=X~d`$ue0H}?sBjW z(I<=NG5m!s9ZIfjbkV9n#ftpOmInOOPL)Y+>Cc|QMVwpt{YA|d{ogut!;soP9hu?h ztG2(Ge#HvttG^k)ie?gs)d!U!x@D~HWlvS{mNDI>?eX>NWD&q|0U7l!R<~#EIihh? zSKoVv$dB-1_*HASs--3)$}pntE$|+gDw=8kVjoNXvK^3 zTBwl#o|AQT4%BGurAPQpqj5cpvlI^M%aQGs8!C}i15}%lB3%rFi6i*E^SMXobbh#m zgveu-e3G&H9qcc#Jo!^3)M67OsGG$J4%> zAQwR-9;I(LXF{X+!{&+b63=37swUPBYRHk~4(;zw^~d7aE9%-+=sMNri)W;Ae)xMu ze%0<%?L(H*HrbRRF;D%86w}IKWwd_P5eXeb>l8Yt5R7)q#;GcE@jEsBwKQ+60c`8u zNMy{|gp`)UL`F1=2r^h}7d2XG>GslV0Q^<(&igjQa|IhZ&=lWE1cN`!(B-~OO9U|c z__C_+@=l<9_IgsZZ@O|xJyU^D+2ahBWI-2=$OE_}Iwj_i;oICKS>Pe0Kyrln-2{RX znUUx_yoKdSM!!AG&;klVt*&-eb-hO&DAcS*zK*_y!h@IKI4lU9@WE4d&TOTMUJY#e z$>~LARer}!S&}?Zwgf_io^ungGS3+V!tToQl$|{KtTpsmqORFW+;{Z<=j@8<7 zH;3`;>2yTeB2`5FqGu>F%aYYUS13lOv~#4tG>nBU5ho^HPG0^A7Z*t{qjHQn!kBI7 zfuUPoY(0f({5^&l9L_Az*vOT1SF+YC(n_>=Q*s(;?VrKoGH!}vbVV&^X!uCrWd|<* z5bvr2bPjO{kI_iaGVM(Ec?RR)!D3_5tz)NR_Rmcaa&%$adzvIzDPL+bm>mA?vi#$( zUy`W!Tii2FkJHoB@323*2ez%f$LICA#;Op)P@q+NN&)@}4^37|QL;$f;KTm`v|2~5 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/revolutionsn.png b/doc/salome/gui/GEOM/pics/revolutionsn.png new file mode 100755 index 0000000000000000000000000000000000000000..7242c671010b19fa8710a515516872ca3a62e614 GIT binary patch literal 8811 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 nmx&OdN%lX$VrAW!q5=1 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/solidsn.png b/doc/salome/gui/GEOM/pics/solidsn.png new file mode 100755 index 0000000000000000000000000000000000000000..297fc068c290b8c0c74e137a8dc76be4b349f000 GIT binary patch literal 4965 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 b)G=rE>^^0wa?pZaK4Z|iqpww|VH^1$JzRXO literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/sphere1.png b/doc/salome/gui/GEOM/pics/sphere1.png new file mode 100755 index 0000000000000000000000000000000000000000..377f1c9ce8c2015df0ff8aca64f65bc068e21565 GIT binary patch literal 12869 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 Oh`fx7bg|T%5C0GCWL|;* literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/sphere2.png b/doc/salome/gui/GEOM/pics/sphere2.png new file mode 100755 index 0000000000000000000000000000000000000000..dd2cadb1ffa8b281b721db56507fd76c3379f587 GIT binary patch literal 12115 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 n>K{1ZtF-g}|9k*~z literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/supp_int_wires2.png b/doc/salome/gui/GEOM/pics/supp_int_wires2.png new file mode 100755 index 0000000000000000000000000000000000000000..e6dc3142a5bd3c3d6857c79294504d8cd6484672 GIT binary patch literal 8364 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 YDRS36-Ab;L&JqCCG-l)SuIriP2(y)!J0b@F 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/suppress_faces2.png b/doc/salome/gui/GEOM/pics/suppress_faces2.png new file mode 100755 index 0000000000000000000000000000000000000000..d38a4add3194ae907c5bb08e5d88487cfaa7e7d8 GIT binary patch literal 6653 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 VH`e=*ajgR|x^Jpqd+)!P{|ETJi0%LY literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/torus1.png b/doc/salome/gui/GEOM/pics/torus1.png new file mode 100755 index 0000000000000000000000000000000000000000..28e18afa036cde6babcf0fe70205b125fd199ebb GIT binary patch literal 13801 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/toruses.png b/doc/salome/gui/GEOM/pics/toruses.png new file mode 100755 index 0000000000000000000000000000000000000000..721bae271b8b6001c7c7f991568398e27d20b5a8 GIT binary patch literal 22148 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 Fe*n=d77qXb literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation10.png b/doc/salome/gui/GEOM/pics/transformation10.png new file mode 100755 index 0000000000000000000000000000000000000000..0847a5e0359ddb890c6133b9d1124806e3e6ab3c GIT binary patch literal 13674 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation11.png b/doc/salome/gui/GEOM/pics/transformation11.png new file mode 100755 index 0000000000000000000000000000000000000000..b78acec2e4416a5ab1d6fda302d517ee5dad59aa GIT binary patch literal 12912 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation3.png b/doc/salome/gui/GEOM/pics/transformation3.png new file mode 100755 index 0000000000000000000000000000000000000000..96a1f1e36c8336df1c6c975b3e18fab731022984 GIT binary patch literal 14406 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation4.png b/doc/salome/gui/GEOM/pics/transformation4.png new file mode 100755 index 0000000000000000000000000000000000000000..5b177568672e13dc16db04d25baf8a291147416e GIT binary patch literal 14979 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation5.png b/doc/salome/gui/GEOM/pics/transformation5.png new file mode 100755 index 0000000000000000000000000000000000000000..8d1cf925423b5c265e48f51d23a949b2404c5642 GIT binary patch literal 14553 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation6.png b/doc/salome/gui/GEOM/pics/transformation6.png new file mode 100755 index 0000000000000000000000000000000000000000..3e3828bd8f4a43b77b55553a8f840ea9611a5257 GIT binary patch literal 15455 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 AdH?_b literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation7.png b/doc/salome/gui/GEOM/pics/transformation7.png new file mode 100755 index 0000000000000000000000000000000000000000..03a16fe0156568f616a7d57674498aca4dd35bca GIT binary patch literal 13562 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation8.png b/doc/salome/gui/GEOM/pics/transformation8.png new file mode 100755 index 0000000000000000000000000000000000000000..77d0303855232f3b1845ddfb9e427f31c6193be5 GIT binary patch literal 13701 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 R{=EuGUPf8EP}0c%{{Z8_AIty% literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transformation9.png b/doc/salome/gui/GEOM/pics/transformation9.png new file mode 100755 index 0000000000000000000000000000000000000000..c7f6194d3b0eee40b39a155608837ebf405b113f GIT binary patch literal 13736 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 bgOr(cw0Avrljb!5gRWh@VN!M3{n38`Lc6^1 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/transparencysn.png b/doc/salome/gui/GEOM/pics/transparencysn.png new file mode 100755 index 0000000000000000000000000000000000000000..0b3638ed1e9a3a6664624c71f83e6a53bacb8fe5 GIT binary patch literal 28364 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 P>Il@8b>70?*hKvw;{dS5 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/vector1.png b/doc/salome/gui/GEOM/pics/vector1.png new file mode 100755 index 0000000000000000000000000000000000000000..46e3b20f3fd00fc38ebaed0e22040c5167796e2b GIT binary patch literal 11853 zcmbt)byyT_AMOGI(k~?qvLHxzr@Ax?f`l|kNiDr}x0Fb?0)ljRmvjk8vvf#z!x`T1 zh zx2UM(84(pBYq=416g7UU=-^Nh7AnhDg$`A6)dJ(v2Ao4 z{qZa~bV5Qil=q{BNxr3eF2@4+_#rVeIYW`1y`8W%W1c2gs7R36lPfc#`k*maWjNZK z_ca`iw;1Qg6Gnnjn`?Hv5dAUi-~%eJq3{Vgc;hRhZyX@&;6(SBdO^Ac2q~)IZp#}= zL&Ki%h1Bq&)NmtL!2}AZk~e+44P|iu=b49%zAX` z(-0IH6UdVuhht7oPOf-cu(NIsN($d_o}4Z%JT>6<78#dD81ijOq1pYcY;KQ;h{$eh zlomuTV5#U-6>D~`dyJ)6fjh@^nqUB5okrf}7pbpzqZB&E(jPB^&)n}Gn`;55$L-`4 z%!u`ID3Pc353g_wwWnk(KXk5{+0PxdT4E}aK~ln0zLiu|q^y^IlQsBejeJwXef5*< z7O7;V>&M0EHdyr1^jJ2fkbB@WHto?0QX7+c5yk(!`K_PK4{m%pb*HDT#FAW45Vl^jyNg27V_EBk(bvyrS{U&suJu8zo92W zb}yrig%%wK#NoHD^`>*+6=uB}<#Oy3s!xJ1x!v24}Ur-(0*lq|k4*zI3gW-%JM*sw^iz4GWBLxYP?! zTa9Eidk9|4J6bGu{an05y>%^HJFEIW09$C_W7DbW;)Sv+Cil#u=D*lD5VOXxy3hC- zM#wnbY%YL9!7pkvBl)~>@B0T}d~B`@?wyQk&(c1_pjZ zN;`oN>BV~%&Nd@~-pd_n`0jmB&IyGB;;TVSs%GfiyS9lLt8GVTWDv?tm03@iqipM{ z=Gq1c0kP5M_gelko5WI{hp{v@Zi)FQi;kjJAJn!pvEj|(Z_y5id16jii2P}5Txzf7 zcfZ+uGW@a;ON$~RnKeZc9QO(P>3X}fE`blJCocpHQhWIlYrA4~WUI#8%?87Qp9Xn^JsYawk?pXGlb@dh#mbf(H5mP%aI3yD5rb$x-&K%~` z4UA@lgoJ$i&`Zx(uD=bSw40G04xeb2nU7E(A0IQb&b3BZJZmI>;?q`-1sb2S;ltr% zcA=hpBTypf!e`|TgBrmmUl)OCZp~>>t`UQX`!g{y;fs~?#*DnND>2ulk^xtfKO(m~ z3)@w;iM>`l87nS$UVVdMok_xuWImZEq_v2I;MGI>joUlb;2gc)>2l+l3LBD<=7xyc zO;M#0gl>0S4~@y_U8bWFoq_D2>os+asZ4;;=*BNUUNM2-k%u!)Vg0+m+^$+aFQ!w- zeYm)(djKvfY}{ut;BM9d8k|;`sk-LCraaYIOs!9QXm&)-^hxOxDnG0DcuQ{Ee8KnT z*W!oW>2ltKQ3_d{30j*IRdH{z$Tg7%w6>noJTAwnZw?Zftr7V7?78tLLJCvGdbP{1 z?i%Ixe*ZASj=_%sIOO{E3y$cHj@P1YL6j010i8xmXYPGNL!Eo@%7?c~hFUU^C;0d+ z10v*^JKgV?2|p$3y?;;oa?Z9d!o)rLJyP3zAIb4adnOllKxk+v<^US<%(~TAGEySc zG{#y>J=xZs*p_dOC&sKdw_;Hu?BdznO6J>)BFSgdL$}6PCb)MiM&k{5vhw$Ia+?D5 zC-Lov{e~dSW(J)HM>-pw`I*lZZVw_Y730Foad?nhR1xhuUnfS5iKS$wJd0xRfv3%?T z@<_A`avQ8x^F3TEiwU!CUKAlem^D$Tc(W&fp;K4dBf)hd#v67UL>Q7_zmi75TyC;% zLNjQjS(AEn@%_uyy|8smInnHgnexr2Oj8E!H8wgHV_B#G$#-~};5D98t!JIH<9644 zAF(Cq9TLfW(XFJqJMR%Vzz*wF<_dF?x9*A(lR2bZ2w@zl{nn(l{SRD({eq<=6YK{B6xYXQ{}{Ga(3KW zZZad|ccCza^qheqcw@60Z6kl{2c|4e%`-TV68Sl=ES4G3(%3*(vWv4l zIl$oz8|W7_11sx|t{d$p-V(P0UHpyyx3{l$Kl^L@hsOg@M;%a?GbZ&R~D!SbV}ovxi}2SJ&B3p9cCRw0^f_Mx9(FdWSbI;Z1~x znfxg%oIY7s*qyz2`FQdXlZ2wqFUs(W58asJ2nPopwNn6%^IjJVCWC3}+YRgJSGEk* zbH8b#?AJ@_K8}{rYR$~7xr;(%WKisSE=!dg(|T6h%__%Eo6OcW+^*o8F~B5N^uvYI zlXAm`d|SmQg+7a&4KXd z$f7HaL_VY%bdTuVe=>^hI^7umaYqH|u0~tBi4Gavn4Nj?+a^UH*C$bK*e`OLQVF|r zxPH%;k-3DgUZ%BFP3s;JeS3(+=zWcxN{43a7vi|mNH|qt{uLG}a$nNrfZpO3-$W>Z zKYj`JzVgPfDM{B`-aJWM{v+HX?@V}fa~1@3TaGCV4Yw~lAE;his}p*-J@J~#i*M(& zCJjCqm5I%T*54ivXx*Gei}Gx?dN$u}S|$SIUg5l>LCyzLtc5Ko>AxE@O))rLSL+1jj0>4vnheq;5?vV4G+ke(tYzyz`u{9bU8h` zwQ#Ir;Me>K!?{MWHdJ`yQvIwpB6Pw%*W!!w^ALc-N5z*#hs7>*aqm1s--O_y!U9J| zMtb((CqQc}2dHgjWo7GkF@=5knbu`H|Dt|Pbr%M=MCla$jUjGWG5Kgqap^9~4PKeg zgEuB7CMR})zdy2rgTv)^UgmVQ6-l{$xzoX7b4SGhfo9n&Bu4NHD)E#7pyDlNSQFqF zo6DB_$V*#e*{-6GBzov73V}dIbD9ymm>NpwHW~+$`atZ(p@^g3Z1Ht zQA1{{z;EgnV4~D`04GoH!3hWmwtjubg3Hh+)4&*4i*eQy^t5%`(VSJJa;!1fb{uyi z_vF|b3VRR^C%L_(s~*nNl1X1s;bfHB6k;IMFa41Z5g z`BiD9z%FYEc|CwO5gobKMk_D}rvl{U-R;iFf;D2D;`j&i$n9aG*ShIYeVrHKYz=ek zZh>lBSg0xAMN=5tMEqa)LOMit;161Pq9q#u@B*`_!Qe@a>kemh--U;QE&h#CY>jn$D{=lD9M{^sgO**w47jCgXEku zXPD~W>Zzrw@P4gt$Oo%>5RX*EBAIKJg~{$|iVhqzE&3DU=da6~C!@4&_z*=pDE)oD z4J^S_6{nR~jAW1JNH_HxgLt;*F{Fh~z`833T~-q?7;T%GOA>N43$vIyZ3?CmfveRQU7c*A7ixn)aDA^F zM6(-N$QM0Xdy{k4xKUKZ%f=Qd75)rW-xkr5-rFlX3sB5@#m@+8!oh;D&>+^72j=jN z*8WhVS|n3!Eq(QEy72)o31ewAIXO9qG^E02j(@h=s>kD?xrZ&k7F1?B@QguR7=N6% zZ)C*0KlWYSl0VkvpTbgC*ZEGMeZ4Ey7t`-|4XgJ_#%jyyVHi8u@Kz+1K*}2r>sd8= zJbvwq0tnHY(HV@>X;#T~R31kBTLsdgY-YwVBVndl7-5N?)(XyBE&bX`EC8DqOkmUb zsbkxW+P0;V-Io;e>ca=HPA%+(mx(Zq*Dd}i1FXy4PmKB0VT z^lNeAfB|-mNR@>`zpG?Rr@1V;fvjh%!U{{8m^m{S_9@i81`^nuwtu0%yy=7i6I!Cz zh-`O7oLK2KcTRBNvh%z6mop*0RY7@qKLwv95K2Uh=rQ;dlzOubMeCO*Bp z;h|);-eLsl^XJcP!8jD4%N-pbHhXNm=UiMd)mBr;WoAR)%4OO3=wftgUP6<0_`!-#ST0Q$y9%hye3~PUHEP?`DQa)X{1WAqk0$q9QhjY15NS z{{ugCYQx!63*ZU(ZEbx7>U}&{xv(!946c@pMAOX__u4vnlSwenUcW}Lc-PaIH#oOG zrFXg1iKmp@;xO6YcA${R#^xyIzWXiIH^Z6({4Cd(5P#tB0%cl)bXELanwWz4<*cY_ zq3;url_0DNK$}YV{vQtG6Hbx+0Td~@MNU*`v`dWMFv5LU1RbRnuch7|swVgPc@C21 zwH5{$5BKnFgYHpDn{tq@E9UR}zYI=m**VtG5c7h6ITUJ^{@k`(aT4BkRq5f;&I`=@ z{3OjshFwg))POT!xRp>jJ-jVxwh!uiI zoof^j?20M+N+%>RQ=KMnM!mb^>1h~M2VW}TeKhzSsXXYkZ10fMz^QDVSX~DSn zJCQS}9!Wa;yi;ArEUQ~`uZ7EoW7>5>NdOVdSyL8en0H8$h5dc8z}}#0+IdJru{6rC zPeZG#OO;cZ80046yJgYIk7I3cExRpF8EKvE3;bd175+x@osRSmqmF-i1Eh4g3PdrAGjVf7KxMPKK`Q&LjMBR)VN{sps0iOI=i z5$>U(PxPu$N*V%)K82>SJ@Vau1p7bLL_xW)V|SzMcI@lSMK6Gb(JRe{Fx{^}Cz~U9 zmh}LiOm4;QC9>)vxA~!<*R340)B$zv-x9@@-D9^?T#MGMi=XdRKxOye+O%}oRIWt@ zkX)p63!oSR%}LSI2@J@S%*>HE#yq=rR1(gc>KRu3rlh1K(kL1UC3ysqbOfm%%c2x8 zr;=d^Br}sikl`=m*re0T9D*I^?nc+cXuRWl2}ItT5ZtE26|BJ&zVOwayN;f-4Y0B6OY^@=&<&bO2i5K31!>YR{^Aa zmPBDTgjXN-NO-NMKj(DOx7_SEa_{IS@6m#Zv3`@rzS_ysV6eC=E(UJrc%6Y+=e7$M0Xc3CnQjawQ;N7_H+Fi<*N*cJF;A82HNr`Q@m&|1JzUJ1xx=TY z-(#oR_usNVo|CEKj)EhjQ32wSWQa1vqfNg>)S#I&>2stSq$$fIORS4NRI&v)E6G z@pt~u{6PFggzPmm+bc9s8j2u#%ZP%@yAmR+_m#ciKeGtXumR>^^)|N;n*xK)-^gm) z`FPye0x@{thshVB$Gvo-CxbjMa`l|Xq^uVjs{2jVH@*qR13{o<2riYsYJ#jD$rs<9 zg+_sJ5)O7Qo8LuRr?*h$>%6ngpAYphd70kAhZ!u3-S3pex^bouZHLR9WIXQJQ+gg$ zz}?PNm|~$^<9+qf_PJh|h=!)}t2a;wpy8|(*DhieQ6*rDLF?v}^RUM-K^lH~Q-4oMQchI&~uBZ^9dfQ+oK7U8Xsrjfr`c$gT%MRKENfK^8D%#&VL3e|K}i2#7!+@Znjk0XwM5BC~UI ze@TTkgbfBU9xw>%L?0H00%8jgO+c#OCGl{j+;$4sG1u-;EVi(y!~-A@^l zqPogfw-Qa?bXKENf5wj>++h?I{?_FgEpgzw)A-<8tL=QfXX`VN?y}f7XWL4Z zbpDgV)^1AA1s_-oQc}WI7Cm~hgjEfQ>qGz-kJ@=-I34TK-xe5M)BW|%Jg^6N=u7ZM zx4X0cYKRp5<)7V;;O_6axd|Vk$bb+Hif7Tx;I_TkU(fRuw->w4C0|^ocSe&AUxZNO<Fpox02*4m zgm~}GgJ&i#mGEIlI0q-4F&ZeAIu#QBjO~4sE08d8QA&8H#kDX+kaA_Io)N|z#w90f z?X`>g|MF+C?af&sK6Mc?Ha5N*kCQ;+gb%)Fc(C9Wb3Zj){}dlVC6cf{keI2e1Q>fV zerr;>Fu6yT{jXdHurNKr9K-QF`ax_`Qs~^?#*hG_NNoW^FN$gv(f8F^g(bF1Yep+i zajwNn1Ry2UrDGO$^P8GIQ}($MJrO_>o;25=Y;ZenC<2Qa!3#zlV>Xj^N?>QrNa_F< z1%O_yrb@nhT^Go16hyB^Ap#ANWRmKR3aK2|Tvspip zON#cHBsYiCwHmA~>IaAnYAz30G>frs#XT<%4b|R3SRo|WpF&OlFMUMNtwymOA)u9| zf5)bzxc9$R1rz9E)^UG)LV$1emP8#e9&B}--(y0%KlyXX+p51@>PV8NdzMcPWEfo) z6aIy{$J92i4P1wi9J7~8{wBwRrSeVQPF>x!fDOLP57&kQvua{$&NK??_>9c{6!0JK zwC%tI?wEC!%v3PTzOcY(ay&uJrtmm%rqk_(kTvQ)R^7TX)qyzk``as1C61Rbm-^RO zMt)?(t7z2aH!>55zy9T~Q{jXGcqr3*#3s+tSQzo}!(GY2fS1qU7FV94hs#mpX+tiF z2z*y?)jeU;X_*1MOlP8}HqJX!Z_KD)O5zKw&wc*I7*sXEt9qSN2DI9?CL8TqB+qZ$ zUe`{rx_dO~1p!Q7GBO@e(&=;#!Ft{))aa@;Av3-~lL&TChzBOnrp0(1^+w4CHW|Zn zx*`w=_vz!i0NjCnJ}KC3(_F@GmoXt)N%fx}8##P;nmcjtktY|my8KbGK%~jy1io_7 z%FJAu3$UK$r}yfdmi1v1)U@@uB}J0c{{TY4!ZQ)7pj6pC0)BH9LPA2VMmQVD>UR+> z6I1@+6%h=qs%7NJ*jcqbp2X>mJT^84Bv`r7OpR?*LIMKUB|mi6^BMDz4>-!Ibzu{@ zeAIS%Si!^TB9%@vzZ?>oyq+U$*9+p+^%2RB`>Bn_{jpqt$L9wtU|IbBnJ^!f$WHw$ zu+;;$Yj{GyKrXRTD}PkWK?75zPl)rytCu?BGIn36dRevuS<~MToRDIB!N;fPZm%D`KX%E64xmU#JD2`J`M zHYh2E3k3iclv%|aV6LsXS`JWodHI^VLx9G`r;Z_?l~<70Ec8g5pIpY~C(~%(1an>~ z$0Cu6n6ctX9CKpvkZ=R((9b9;osEiSj|;Ogk?=~p z={KjmLP0;8HjYLu-hTuyF70+!0`b$iTH8FJ8G>}ZyVtD|HO+&jbJbQMMx?|gbP^Jo zAvE4eyG7P!gGsOQu!Pl1f4!WCSf-WOG$MXuZ8!^rRkr7Qb3Nz> zK6VbXj1Rc-dc-hr^_xia`ECDij+?`*dNoz^rt&ns7drKp>r4ZzgGHCeu{_`G2=m1{ za#2b4D=I3H7t}PH6lfV$v0g3}NCMkNVB1UM0F2_01gJf$*p#ONksBR|w&X1>EdgADUjgyx3u9^NfBpSWGWWu9MExOzxfs+~VdpHLVDmi`M4AX(gtFRL-B*-d~Is zuAQ&7+LeRSdXq7<+O8gu6uPU5A;XHjjXzYmY*=D=vY+X)eYJVvUf^2mZM$mU zn)u%2{8%=@ao%LWTs`^;FZYY(2CLH5$SK5A-9Sp1i*BGJ7EJmlwsy_OK0pK)s4Lak zoV;aWWnIh9%UDUtn6g`an3n~7U6Dbn_+d+p=6c}TYlEjYg^$kgWLbu$Vk=#$>*r4g zAkhrQCPPM>cb?LtEu7j8w89$Zg)VB{;y(I{2iFT4Y-(=73H6GIMDvzGfalxLX}l$Y z*JXe}b$!3_z^wZd@w7E>grNPOWX@qnvbw^A+n^x zNrg>by1BW1`(Y+oSF_Y|wLzg>W8EiqG5>C*&k{&#qM@DpU%+gT z6mVTAZB1?`uKV?ymiwK7$*s5R91$KLDe>{~L4beC5Lk3YDV?H7G6&M(oKrbkHoi!J zZLR0)@O@`WhZulv@@T^@BAb(i92sXfQ^%@6FXl z2L=Wbj1v$N&Qy9RFP+_9ooL0?hbD83&~tNFCy3 zSUsgbkmd61sP|Ila+T)c{j$@`hAIAWm(o4p1Z13sk~p594uOG+YgbvTe9&%$@7W0| z!5e-?kqvZ4iw<@S21QT^L;*Q7^5N;Y^2sgM$jJq&4{|| zzTM#@Cyj_ZT!792UGSs>W9bu26J$53u2~M`&zN~Az+zFl^MhVbE;KbXDk>KU8~6_8 zI^F>plf36LvgpOG3!z|Eswr8tZK#2zSZiXJi=>mz#Jm%a^y>9{22!uXV(^VFP zntE=;z=IU?8IJ|tAexvD!T2UT<4*y&IzmRJHNbg-C`I5Az*|Jzu7`cbvOunEywv8W zm@dqxHi`YT=h?h@rq@qESHA{gCV-k*4O-F$2M622Qus1&8d3^1inDCyYW&uf1gP48 zbt2uM-THbfSjTD|YCxh^;y>&q`9%^%(bmIEsXM-#Ei zV>>DOKv}MY+8y>6X(IQmwOzarHM)J0m7RU$Dyo<&j`MGMO@;zTbKF?A3?VUb5Fq{A z(P^+JWeQcCk68*SWkj78ZTH)g?3FiD->x*Q+^=y9mak z83qy$<>dQ)iA5aP3oAe1Q5VW;O_2sU5G~lvYpm;qOaf)h488E!tDbUQU)Su_jnmrq zbbjSFr%5NQsSkiyoqitv6*$(sBJ#fST4KG$XGHA64)~;5#IwGbKX0EcP|A=hw)wkj z%8q0OyT{GX9`jJ@*nzA4{yk|bRXq^|7I^@6h$qimBtGcig+^NV1pkuBt^7Ea<^b-fyDLiIk@%R%QvFi0mJpN!`=Iyd_aTPfvdd&dy0`ZBU@#wBijj+PusO5UJvW~c z)n#%mK;L|KtwYj9_;3!tMg&BgDN!7VpqWeaw^NKg(P=g_O$37p%sz#r`uz3eM(8LB zAIeFW0+M2@6O*7uA>2L7eyygCAJfl51-m!4L&vM{d+4T08bK<%=vg(CRQx9JM4cEv zzp0{Q=;0bzc(?Ps-gXat%k;$If7yTwd!QA# z!E3l$|8X-x04$73x-D-=pt)RrWWT{%KO7$sl2pOkKjffReE!GP>1hEQkmo#VHSGPZ zBT?Y(AfzSTPsqdRIv`2?`(#}VMzF)V8pHf;>B%t`iW^#kx&ox*y?RG6D=>{13hEfO zZJoZKhBK}KSwX+6#y79z!cp*u1T!I@XrwAx(L^K7KZ*sR6XF9kQWd5;NUfBDNRmyP zP=p+sc_0pF??B&X^FhktYbG0U>nGm^ zzu)gW_WQig-rs&X4)K_oJJ!8sUDtJOJHC9VX4pzwizruQ+x zI~P|$yAa3|$UAW{m5-lyXI(rWIxXEEj9c=M5DU;}-KWh8Syhoohf-(GVYxm*vHV~j zjQ0FX_LC>xboSUEUPq(G5jUc8hp^^DZ{Vm3F>hW;JkM6j!FWz<%xkrN)@_=Irex4- z{S2|boMmigCUP{{yV8_lo)IO66&f1)3<~`@ae1u|V{e=o%t=q7(V zA`9p5fGF!38H%0$;rMcRwD7q>R-tFIjmjGNRw#5k0B0O4*yq#p^|(s8;=(86X*%F- zEFp_hy_PwS2gJk!e+h2!h;3`PrCveHwI76VEN%uJ88nbP+ z83-_tA8G^}gs^J#Po;MFVK7S37(F5XMQ=&HBdC+o`)D!67(s|-P?$TdTR`NwS$v4MT&F z2I&LJ@L3LAdwU#txau!u+bkXiqEpJHFkQp^UEMF*81QWOhY#NV4HXs_7mqRHq8|~G zP5=AjH-)M9Rb@_`KS3p?c>fZim+?8$)g8`5emfG0gYK{}wL^Z5j`b zQ>)0%60+eQ9Qw)AZ^6A~dB|_T7#0yb{D8Q-*NLxgBRkA|I1jI_tt}}p)I3?AeB$vVE~}~Vt_X^wlW{#_ z(g&}RKcuF(n4fIhigY{ZkR*5sG32*bTD2*vvQ3wW2f-9JNH9~+C{sht$;tC)7~^Sl z(UOwb{2PmT&BqV<5^JpG{5Py8QqEczg~Z0%RIg7v1S*?F0|rc&$B|k;^jfIDz4ee^ zSyQHZW4+OeC5eJSUST4t^Qr5S*L5$x_7@Y6G8IWCCS0%kTowJq^&K$f*ofMN?f98K zd|1!O^itz=tafM4rFzQbqTYHnzT$dQ1UD^iF|6<%m6KS?{bX+3{2tYwik$9`qlF|T zTD5CKDQaqUGkwE?kGU71awfn!obKgFigtTvelx}X%d~r zo+`g+5H7yjQe|t@=VYBuGDbRwD~L}2u5GA#p&8YtR`yhM(h7|%VClN#g@mbrYE8*_ z^6j2Ue{{`vp$h@5#5wW44XMM!u=DAihPtJoVE!_(Fs4NA!?iGtx{p{Tf~TcwR2aG$ zuW~L8t~c{ycBU^LkvTT|swcAPpRWuS%(FCW{>Oa0Fm7*XyxEDsB|l0~*kW)}2+K17 zEAU`?@eTNoh>A+i+gq%_ZO54+Ffdo^{XjCe(d`Y=n5Hk!U^%baV$Tpcw!;*^YfnOC z%z2Jna2#VtV7^-V}|xdHRxO%Iemarc%(3%L2pEaWDoml@Ws7s$(JM78q}S6&3u#ij2^J`boFqtHiM6 zqq%Oq&#WOlb_e0G6Bm77;hrZaG+L8QXN*|uyel_?-jcfBMEGX3Rb)2b5!`kV+}-J* zSq3=WMa_JS`g`$@wuJ1B^?_-kFoLylmUmEOhfdNn7SCN~NGZZwq&CVm{7uVFPG5$Z zQPrf|4oqR9`cxw*(&t-6t)8Z}hL0YSb(Sq+H6OM6eEaLI-SE$Yz=gn0O?Q)8rk`wuHH(Du0!X7K4-e5D{yE)tj`$KGUrx%{c!i`|P3d|b%^cPQw zVLB=vfL9xSEtQ(h;tb7B|KAt zlZ-#oPr462Fn}&Aa;{}lN>edLVHt#CBjQ1Fb-GI@D%vtsDcqN28rmSXkCvK4$T1sS zl85qkv@}Ox^S5e*h*5`)731$B-4N9^|66MPo`sb2^={E21Gx+0zIQT2$FV%?5fOsAcJsI*A&|X|WinG&GVsT(TPt6}I z@f!atf^2%XJ630aM%zXk5D-xJ=Ba1~s41xz5-Te!hP4!TvwV1H$47bX&NtprEX<52M4a7zdti8#lC4`!)H_d z_msBq#x1JX?%Emqc!@Q9@?GnQXrq?%@ZXGs9=A821BY#vc7H0^p8troN)dTNdqDdD zZXwJBNG4<0ugjY9RUUpq;;@E)!AAx-6v4L;nhPA6%Wq)AQ>DU~h z=g;(||`-&ct;dzL45E>h5>5hVLMx+t!5Nbsl*f)1Sco-=|&c9+fhjbyg zGTc`GFjhP7EtCHV0a+NQx#>VYzm3wmaxxq`KjVmaKd0N^-`-x<=oGf+sZ}80%6BAx zb2$Ce;{DxZ{w+{uP-APZ`0ez`X;Vt?y1o;N{l)SwT|A(ab%xtf$}^NM5ni6uE{l&k z%y%t{SaS2TLm&ET=Z6|3qoJb{J$Nkb?c98Z$Sbal;-}(EmH&dRU^qzxxxNPhMVX1Ufo1U_rnYXg$5T_gE!AA)X>i@{%sf&r30*!ph;p@a5m!F-tec5N zgZo>s{l)X)wz#WUDIXu=nrNvnmN6jnhkK9f{eq_new?g)+T?N8WoJnvO4YNLjbA|- zX(>4`+8LARBZ5e%lRD_QG1B(7)A9}tS@%2d0;l4douZ^(?BT82!|q2~AiR)W!42oz z!wyOH`V0YFSzakY$4z;xoMv$2v$-N>mOd`I@bZs{`mzfz8S0E98hqsWgAzlE!^tV1 zL+h@`h^zcDlqXQAAL#&H(~-*Qg^-Emd~=hg(~&G03g7-G>h)U7@Bvd0xbw5Wneekh z2+1xkB$9k*sRImN*_K~@DAx^$(9>pXZ-4#5Z)fLr(rv0)wbC-UL$PpYni`3ng5u+| z^cq)xW5lM;P-(@U=<#DE>&f?r)Pyd6@%Q->*9)1}dYOw!G^^-7a|?FC z^a36#u1g))7S6-%mfdNiQTs={ue0sk3J5^^5F(rnMiH59L0b8u{_rw44NZ$A%EN3t>oepj`oLS^~oihd5UzY4J_t;%h+UAiXlWbOC;QhqR<3S!o zB%Xs``{40tP~#3wkxIh)x{-&-LMOYPewE|`lcT+^EN`~v$?;gpyZi=e*2I&6`5w^& z93nZkrHv@W(CO5#cyAGfM-}R_1!}Y6Lf$?Goar9bn2JQsJU2FUFc>~u^w#qXX>P)S zOA)jva`LxYgR`{pP@2aZ$*I78@wLna={#oApe?a8QQ_Yum;C4Fr*Zo}HW{4tp;iJu zq5^*Bh6v2P`Z%IDY>PcH9i9ij$UsW{Q}6T%F;GXHUX&?VgJ>l+{!^vS{zbb@s6rpr z#{1YSB0(pC6rPLr(|Xpu%kByR_wEakDltobhFN9*j;{rUYAJd6haw&Rt#eX`B)$ht z06QaN>!R&`AA3u=&Ado;fEUsFkC}zCOWF0r>Wj@&lDizRc8knsVUP zFZqF&F0GT6zl^fgtW+$BVqQ5~B)|sSCh=TcTJB71frj%T<;)`?Y+C38sk>9(sN~cs z=0_99Ocfa?!1gJ#r^1);2b_|apg+}nSp*;1iedAByGWaApgh&G1(%p9&@ja;cMHl^ zgojG8I)lrj!c8CQx&D#BAS!4A_qVZu?ky-2%Zppoe$`m>w(UbBR^H_$Dwvh;eJSXR zLp-edlW12${N5QCdPQzmlcqHT$)#6&n6 zKM!q+H7|JgDBN(~zfD{njTd?bYd=$7&;J@7{YuLAzM#wAcdx6{#v`~OuI%Ict*5)w z-%cmEWQV_JX8Oi4C~wTbIQ6_vNTOuDfgiQq8ZGL^DPS+(i8q1tCyDr@@Z#xj#T9_6 zyXYwJ&h2HO3>ys1_H2jWenkqHrJ z@nsHu-xbXiMc&S2eE&}WnAckNXl(#xqQ;6sxO8tZjh(S)w&)T({N_+D&im8gSumUG z+IHv=bzP^Y4bFQ^C*I?wIz`&NL=}0Dw~HF>mb*F`I*-o7yC3n{X1ch)etj>)`|>#^ zCqd}4-ViEZH!#b1Ro--V@ z`;g`WRB??fe*^Nl1d7xYGHRoVsX`03uU|2NFgh)|Q=U~FDyzG-AuG3mGULfC0=eZiQX zgm98u`H+o8fuM9y>M3f$3Cenw%~ri!aEcPC3|i`IIq~1w)Ls(*lSTS3YdJ$GEIBT2 zCCpG<+;giKl}%W9mh6O(=m1uQUstvJ{k`~#_Fw-0ZqfhC_3mOrEdpKJQkDgId75LB z(G0RsS|ASDWuvEWJhS>`wKk{?7LLYOF7qB_zQx5XrS*qQZzCSB9y!U9i+)bAX`WnP z{UWvNFm|_o|07E$xLYMZyE;QK2t0f2yE|RWxm#hLl=n_d4CT2(-XEBQ87aGFKS;`< zAt6r~7=pcdPnVmo_UL$?C4fmqkw)Tjh&qWtIP(VeyOuenOL)Nt?+E0UkUmWc03o{V zU95kov!!Lef%$CTFqd>Et-SdD{d+2@HMQ5}vB64D41FiV{>;%}Onkh=*0qX& z%U*wlQTN73MJ(?EWUp=+AJ9HY&j#1#iF0(2MCoZoJ|kLgoBIXSO*}%RRy{|%zYpRo z7JaQw9~&Dh(SjXC3WDVPWV*&Gr+ZYm@d$W6lyb|9mqSBCeCb}PPdxsZ2dCwkt2IP| ziS6dVMQmHo)>rKR3KW0))^H+xc+F}wT@$n@Idz}7hP`7EGM+!smgZ+WwQ}bwg+JUFP z5)$KidSQ0Qq%wSNz9l9!s^r@LE~*MaBL$hxfPAD#JqjHC5;5r(P9vKB=g)gee9YKq za`&F_@FY-N%}S{t8Rb_}^?#2%hv3$kLr^aXGF=dJCJ9tzWZnJ*B0ZdgLdxdCd(BtY zK?D@?vX;05Dct#1+FA)Ly6xqQ9ZcG#jRIj(`Y--r>^YLeG&F-j>^%0j6Dvv#d(5#Q zZ!$2TN{9==>D3L54EY^52q82j$fOan^zn#hsG-h(TL%7#i0eao|CWMU0;1a=o5AaM9Us}(OSg|Um|_>#m7U#z~J*RpAf&w3O5 zQoj{~sCM8E(322w+7g$Nx26+{G)76`g1s^5!jz6egQc_a-@Y90i z_Hw)ha^}m`m&l%P)E#L#T@wL@UFmjY8bm+?uNoBT;~v-UI9%Ca`sjFPG8P!GmzEP8HP*9RI`a{{b5eup!hOXuPTOoylB4My%{M`~i>K4p zXU(VMgx<9?_Bfz3gi9q5mnWA3)*NbU0;|@>NI|TNh{Cxi@?_j`dkoJP3?f}^&Sl<9 z($EkJ0W;4HCeEthtPHl6Y%!`J4o{u8CdR_YXXAGNX?DM*<$9H!MM`Uds=e%GI_-53 zE_Hhk5nZS?wN8oqU1UX42_Ckh61Wm5w0WJ^JFLsg4ja!md$DLNmC67nc>%sV$cIK( zyE|0|a?}d&V(9wF%ah#K4_Zx!)A*s>xm{YePlM?jFA`E<7o=w)C(1M_nikF7W+J+4 zFHMlwcX~=SZLjf2-ns?ptXBMCG3^wnQ?NeH2p>O|wzg&iI0kJdi^qBA!`672LX-Q+ zhZ@UA3;4}MbZ_^EWY}MT51>#ez^skON~46q#r-v7X@*X+WNjPiI2Kmr~Qau zk%797Q@rL!D7QE(C}70`k8HOF)W2K*hzlQe!>k$D?g$Ouqv;x~5-nY6`RMu?x zua+eMIOjNis+p3i7&^(jc(9jWAtZSuky2wNT~ce6QbXAYOkS8diu3^;s0JwU;4mTT0f&!TaH$a90Oy5%3;?oo_^lK zurb#pxIJEC26%I^PD9PiCiS?E57ixS1#Ti|pW z?ApQD#3Tkx3xJRgI}{ zPS@4UnLDI^>xfPXF8?&nR$8}&4JmEhl6KymL4UvJ7*(p%aELsck4;Lt{|aD_-#R`Z z7GL0YT-Ad$&f;lD8xs>l&Xdz`0&?)%s3H$nJoqsDW zjSbKU#Pe*|rSax+TU_#=f(CQ~$^^(@SXfw)Rrxcu8B;o1+RqB2$cMgzH&+_4ZT3gj z5IV{5l?wBym_uXi-d+y4ru6hk?X)@TYM(Ue0svre>yQu~eBL^y(HI8q#N({V#f^Pg7|;NW{NY}p zZkCUn?sCGXQdrR5Y{PJlB*E$4?DmmUh?M@(wiVR5Aq{*#cEi3YAE)zJ=Y4L4LF)d! z(GtE^+JMLga3puFMc}|v?$AN6jw}=u5A4iuJvM8;m z^$r|69lo6hx-gl?>Wcw+IE84Wx7XFd=(t{*6HGFSI#)60EriQ*BAQMzGS%rDDBRY^ zCE|*TM4*6BqQ+tmX|k?`_ouz&CF=1y1E+`(3JqUp!%N8 z`((^Dd0Z9WK<$;>)D=+|w=5!PvJ=j-y5~g4t{eb-`gWwUPB{apLmkLY8qJ>kAj(*D z>Z>(R9>x?30!OA2#!A?ZcW;4m1~vpBtH{l{k&pVD@9_Nq?aTm*jdvJC2U)MMdEbL| z5U6oVs45Ppn%&rD0A*-prij(YECHu(%JwKLWCZuWEFyh65~Dq*(9be-(^s#oV3LyG z*$QH*bb&!qq1fXe{b#Yg+E}Ti2gd6>;B5^Vk<1V{-tgVy$!4?&OLjxn&tttN;FYd8 z3$y;)n!(?{mlCwB7k@LC8DAW(UW0lqwBL%FyEcAz7cnYbwHPzwD*%Voa?6(P4g%E8 zB(gX+W>?~#|J#}}=wQ$3Y`v3FSNNkl;RIlq=1&VJwN(paj~Is{o|%p9abITs%BBI+ zyCgg#dg}c(cJRhc37iJp$_Tj0`g;j=8Kf5q6pRLwoI@XiiBGu@B*Gg9O9jKn5&{Dc zI25VwTQwZclRHMtXOx$hzg+)&H@tUr)9QwQvn3kq79@t$FY*`&!4oP~aaDSu0|)tQ zjWs1SEbPcdReS{(U8znC0_G&7485PWFl2}3z_ZD#kDs?1&;(U z{|nNS(D0@3?x7Rk)|`EwvX6?C(otd%YFb-(K zcW`{?S1=kZFx{P+_ex^>z$?I%)LO$W=P&%=b64X$)-yegX6py}qR4`gYj7Mr$B&La zrbBRm&nurxf{j5BM3bbeE8n=D57PYTZdzM2V|I&rI4gx)fktpM@0DTkapLEho}?1~ z^#4ve1qaerfi)e934|=rZd@HaR)juaHL28otRnQE7q$ zxQfyHp(mFoyWPNWD-!TwVS?b zEr*-_>C*$C+3m#EaikO!%nnz2SK-@svnS&fo)`A%UV9p#f`Uf-U5Xo86%s0`0|+EG zCZ-K&MNI=Lnxu0GXGYRHK!D#VD69h=X)Jq44m?%T!8z`ok|n-9Lz``IF+=;<&Cp*d;wP^9kh6xn|s6n}Il% zIIXY*&QWErky@w0*<|w2F^daGWx87;bPGx(vNHRY%P3qk{gPv$w2$(Uj zBdn*VNB?wZ5)Bg*pbl#Hvn`!XdulL>XCk!e-DW~?AX%G+`?N&Z*dl?Z-oKi^P4{WM zBxrB%kY*(VumNbZ&9M>+3LeWRw6u%WmtUmJz0KPIX>Al!``YKI+Q8Dm@k70g+T(1` zVhY2NltFo-~PPTYurYuirJp8-&izwlB|Y)8w$$ zZ}2OCFaA;ryK~(! z`*TCOvnaXJv5BBwqpw9?^U3Sjn+2cOu!Lq&8I)?%{tr=w$RJJ4AIhJ@&ekU;(mULi zz(7w9NtF@cWc~O2GkgqT;u54J7O4nt&*)uox}GUJnh8EXbPraJN7Uj+B{G zC8y8&RZXrgH6t)7H!4aU z#yD^;xjWG1G_ET-FX9E;o7#50$W3hGrNx{gCi^_&my#inp~k8O2qP%mXj43AwP3@| zUE(ZDZ>n2V;I%bsp_puRt2*CL(Ov4`rm5T-Pz7Z0Yg*a>*r3_w z>#+yxwmD%^$gEkA9bOq2wXwh2tvx!`vf;Em=kQVQeM$PARUg0+&;3QryKn*7Xs_u^ z7bLFWfwi-S28#%RNk6Sd*B1a4(7$~7!1u=wMrxmHJ5qLCZHs2Gx9^4F`TfJABc!5S z*(<9yucHCpYKze?Ksm-g)?fu7cXK$8b3gC%@z!J*U`VQbvqtR!Se6szD88$GiQuBC z$yXdGYrqB@9CpM4dV-PpCK$gF=pL}K2qC0ZW0|El?~N<{SiGefd6%6aVPvd%cW*rs z3J~Evre$S~xFgQS`-B(-kNbUZP(imWMNdRst|)eW0iTlZmA1BafjJ0~o#}?bD|aB5 zily}=ru?{GzkY2||0NgA0%tE`e14%u%O(d9NQg6HZr2Mj^{LEcG^NPZ@pq2U@t-&G z^1(}HR>QM{Q>EIlue5K1Mq2al%K~APX;PGsoA=XZp1J|KA~xQMMeMfnSJIUZiT6w) zy&r6HL~-3J$ag)3nYrzrj7#ao0}67N`x(rHd$(;G;X5sGQ-GqmFWs(l`}&GDx6+;wYT1JRe6em*a>HJI*hCTlHj_(u48BG6 zy6CT>sD&qfI;iIkqX7EQmB-Fo0V-a5M~C@np(>u|*VczrR61KYWcqMUhlyImO7(xv z!0xr{m8*TA>KS$J6UioVde-y36(2LixknVvnX!S+0yqtf=hFEG*ixaI?b(?ct#tWM9 zJS40f2HGb)+<5qQ=0q0M*l%X(i{}T+LP!0aa~Ho;_Fe$An$T1kPH{P7yC*6Rq2RTq ztV&OnKUMeLH}L|S{x*u*YwEam&bzNRz8D>(tJ0Syvqmd}x{j!JTB?pTYAHNch1|17 z|DVp!Rp-;wdH?rRH43h(&Y)!*k5x^@NLV}i%`)fK`*a?Ao`&1vVb0qKfng>M>C9dK zpQ>q%Uo@xxNsleM5+^R~u%D~*uK?>C!T8Ut;6M0)cFCF@P@15#UNoZM1?+g9d7;7; zXB=qRfb64seg)F_-&5f?cV&-jBfJLjt>E`5E5D7Z!>_vr6G$c~`+ujR-gzxvB#UAu z#>J@&7Zod4dkwN$%}?cap_Wz}AXaupj>|2bB5G`Qm2yz>ncqN_Vn+~P{(TquUm9u| zGaE(S>f)Ulppp7J)f%(M_4W;i==Tj=Y&L%F)DS7Tu+Yc@p31M?qOYRu4uu6@&7++8 z87!4geyF%cj528pGlzt<#NqP#ZetSA75515D^ATk-*d1vl~UGjldBjFV{3Rw6a!Iy zIU|(z1TBrs|Iy4t&bsICXZ)tmj_f#Se|Z1MC}e^vIpqhX05_b~fsY+2(0DY7a(bJJ ziXr|GcKu$JD5j8^c}A$L3SY3NR{-VL^3fCu{&ljy!7KkKv)oYV=b~&|R6fU%wne=e zJRZhog1zw$d~e~Eg^xAM#}B{;kXI6mYy6ll^ny`(1nY-=Hn3NAID0*c49^IYiT8pn z!a`JvD{YTb{rlj(>-&lfkO)S6K1p3#$OXEYJws|p4@^1U_NWog&Um=?XhV^e2upty ztG1GHL7e`HD#J{pKMIMS@CmTtQmqBnb@68`g)vDnh%Ll-UaWYd1BD|Wo`i&BL8*5X$nn(Js%lJ8b6S7rx6{^rE zTxp?RLej@7LiuO2v9iSB4~V4`wEdO?@U0{|U1ne_irKlVX)0-bJ%XfKHx=c$#a#>nJVh@It zwG(OPHjzuyqHN72{A_&rvhl3ndH#jp@0{1?eBSTZd7sz&ykF;h&iixcw43t=6&)1? z1%(YRCmqoW3W_H3W3K#%oT=rsL@6k&Gj(x1cJ^xCBp)7az}|ZOJ2t!Su6-lcp|Eq< zamVHXMWSM={Vj)7LP2j zKyM=yHMd}_sJ^V0q+n?d9n=1wK*->~qQR20T40U8VUar-mNbo7b9uwR-Go6xj;c7t zvPe7_`OacCvrw00CR2FZAsa;a!J}Le=AY?Tfwe`GhvsE9q7Rg7n(+A}hcz1iR{0rs zX|aw#XO+Uje6N5LRd7@HFw-YPJ(6($0`dE_yFcUVR#L&?lBy%rw;l7wNu#gj6;U42 zMu)?--@gzaSo)_+V{@m`NaLiFV+dr*8I}AcekN2EQz;fW-4rL(iy;4;)ayU@S}twa zr_rc-BAm6PMO~HJ4p`aFjKnr`W$5_mY5i@USHJ{F-RA7?tJ2h~AjCsZwKP66WL(5I zD%V@_{4wF6uL88qjnB}h=r^sT&#TM4uRXjc-9eU?@W4XR&=(_wvH@$tX2!taUr+qs zw`Md5)&^xQc(__NmtIhHUXd;b!`jp!RH)FKH~6eJH)gTh1@G*gh%QzCHZ5>YbHZ6< zb`s`Z$Mme~*Llti0dsMAit14%*}T5>H3Lz7#zjP)tC+UQ0Ts_Rv$xQ_9AY-sZu)h` zGj$iDF-u_ynaoWPq~h6oy0VJydlp);Jbyf!yrNE;h|m56+xpN*%hLBwRR zwQ^3Jc?`@#b#@Eb#BUVMz!{D@&-a!Ty`P7bM3^}N4bPZ{914L^XX$J4(GPjZHl+nd zI2vST?_A70x?b2nW#KcH3!YE2UrMuEb^@j{wc)HFJY7kwn+}@no9z@`r**Bl^-?u| z2&a_zwluFU1AUrB#2 z{CWWT>|}kz(Ra29FoJ(sOqXc4%z?B6xf1qN>O(!?g8;r&EnG|i-|S*3 z;piBepnpm^YQCi&_enZlKUTPfH!*nB*CMi#WBUix+w$D{_RdZjPp2bt``$Y3KUueM zggxT2+n`eq2`DFzdEL(-FLLSYc)A(++(2_n@+*ndgz9O6utQcasM6p9Er*0%(9JHr z1h@zz+C!I=C|Az*wJpC$?H!5z&Mr?zxoy1iPT~#A&?CgWU3eAo8WUsrnKmdLFNC|L z2YB;F$o7)5kSRSM@`-ImZDgXZCSPQ*-#Q(SE(2n8yJ-CW%|1P#V0#kY&eU zt1^XJ50k;i>`oENFK}2>5sJColj1_rjj35M`_u#mF$aS8J*g1;lEIea0H#N;el}xh zzbB4D{*~w!nvwBKV137hvT4yfF^dLQ84Cg1&@J*;Hs;EEfms<}9ucy6@K+f6N_8En zariLD;vUT-Qorxa`6J_@1m4KrdtCH~k0;;)%w+wS@sVPF)8U*&o5ED7N%4ONY8)Xy zmV(ys5D2}c!Y+>WDvnhVhoBBP-yHe^H4MLu=*B;<oZ234e%B%>-8yZAeY{}Bs5&@f<^5}U zBu;34&VK0QlbB^c)1$Zkf-&nEgDnhH#D6M*BSL2)? z!JUrf(R}hn#qbEP7{IzhP6`(r2Kg}Z({=Bw1McMNff)s0NdWU6_nN8udN&<30kFbR zYG*U3AkJ;Kyp5*klOfOD0FUO8`O`Wd#9;>Io>IVgLYhM;aX+7HG2Q)EzDMb@ zm1r3cr9`|$G#w#C<%{?)h3a;+0m@TSaCe? GuYUlioe`7( literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/wiresn.png b/doc/salome/gui/GEOM/pics/wiresn.png new file mode 100755 index 0000000000000000000000000000000000000000..623ae3b58549209c469c7ff0cb55784163010f27 GIT binary patch literal 1956 zcmb_d`!^d17Pjp)@u=!F)T3!t6eSf)si3VdsG9Kd@9ibAm zgOHHaD-numLfNx zEVP`yebC>s6eibpTO5Md+6{51i+?ZZ;>|wqP(b(XFKB%BE%r_!wq|hl zOMr^yAM_rTJPnqM&i{(ZHpv0o*3K}nL@_4)$~dwJ+zGih0BGA;c-eakwU`zz3eZOr z-lc|H_o>00ziJvvM)tCQwAx`^|96~KtL_wji9c=}qY%_|p-36Qq49C`gaPrk?3=Xv zOS%`Zv}R3c-yY^Rm)o0q(yZwOcd3YwjeU&mci8j-ws!_$z2b*ODc{TXb0cN7)ErI* zhy9Ela(?UMx+o=a4QlAEUx8U|Rcuum@;YVTJ=ea<8=HgO5b*^eeScbvr$I)(L zi1TNfrb4KEk+S~+o-DjZu8yeduwXTNeFm3;3aBajj9qD|m^}N|Gqx*9y@JRQ0u)S~ zOTN`m*%*J%i)kG*17^9P2l>oUOwDA`z4HQizve_u$4!>?{JX3rwJgDQ7IA|=Lt&fS z2b#jal4Hw9q?H)VKpG})5;BoVl=1l*ECFt`2zoeV%L%}UF;^e47QFbCzlm5k(me%d zP;_0=U0u*w+;{x)1?xAZaHXoCtKCMrW^m>Yn3-4OMaJ-Ybsg{kTz2U|R!dAAIz5AO zm(`5U&piqrvgkpp9ir?53wnb;2TwMZv0gT&2bb_)Sj1uC(1cz9 zkdO(O-mSao>P`kae!<>qFwk~@Yb#y1?7Zx3_zNFHNzz-K#+w&g3BHu&yXr;VZ@?o~2$M99b;n@#%0&{11g*>vUIsMWiFl+xO`^q`^>kj$J zN6`(W*@vHnE#DR`K*|MhR1RbB+z3PQ=x%g%nev=$T)ah(YkMAqnJ6;6UL0mY?Ix+h z3S@P!>?Ap7{G7f=jSh7mTN+>%1xseE8OW%n+g|XeneO=0b@;^+>l z`aC0_=e`o`7XhMv;#}Y?FINS=!-`pWbXPRz;JK*H;zQZEAe-?L(dC+nBl(7R*gk{j zQ3h;W49Jv-`V0srC1xVmz=XAsLE0O#Ns6;!!P~!nFLJuC0iDEdW?1@Zj(&NcM9nj! zBQ_3}(&I<{Ka*f?Kqx)GS(DM|f-w$ntVUTzpB41aayfoT1ERo2E;I z>9SB;J)#Nyag8LvO6C+O57f_vYNcq$aa_3pFp6pUw(vf9+SY-9@gy4`&p=hRp5@}% zVu@I`mB1SzwQ4PVdbn`agL+_rHMq69JojHmOTVp83kgL*P*|Xd^xJ5HE3fl)a+*2B zdE-gfg{SR~rPBQQd(h+p8Nc{KU8mw=OZ&AwB TlY5@>`>J?e_D0YyMWp`+xxLIn literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/workplane4.png b/doc/salome/gui/GEOM/pics/workplane4.png new file mode 100755 index 0000000000000000000000000000000000000000..1f9dab5fbecea5c2f80adc27c0d515869bd9c4c4 GIT binary patch literal 11002 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/workplane5.png b/doc/salome/gui/GEOM/pics/workplane5.png new file mode 100755 index 0000000000000000000000000000000000000000..a20eb6021db6a60ebbca8e7e90629f7acdcd377b GIT binary patch literal 12268 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/workplane6.png b/doc/salome/gui/GEOM/pics/workplane6.png new file mode 100755 index 0000000000000000000000000000000000000000..5e5134821333e750f8ab0a3fddd5956f10e8f0ca GIT binary patch literal 11761 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pipe_creation.htm b/doc/salome/gui/GEOM/pipe_creation.htm new file mode 100755 index 000000000..76df0d948 --- /dev/null +++ b/doc/salome/gui/GEOM/pipe_creation.htm @@ -0,0 +1,140 @@ + + + + + +Pipe Creation + + + + + + + + + + + +

      Pipe Construction

      + +

      To generate + a Pipe + in the Main Menu select New Entity - > Generation  - + > Pipe

      + +

       

      + +

      To create an extruded Pipe shape, + you need to define the Base Object (vertex, edge, wire, face or shell), which will be extruded and the Path Object (edge, + face or shell) along which the Base Object will be extruded.

      + +

      The + Result of the operation will be a + GEOM_Object (edge, face, solid or compsolid).

      + +

       

      + +

      TUI Command: + geompy.MakePipe(baseShape, pathShape) +

      + +

      Arguments: + Name + 1 shape (vertex, edge, wire, face or shell) serving as base object + + 1 shape (edge, face or shell) for definition of the path.

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +
      + +

       

      + +

       

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/plane.htm b/doc/salome/gui/GEOM/plane.htm new file mode 100755 index 000000000..742dffc57 --- /dev/null +++ b/doc/salome/gui/GEOM/plane.htm @@ -0,0 +1,196 @@ + + + + + +Plane + + + + + + + + + + + +

      Plane

      + +

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

      + +

       

      + +

      There are three algorithms to create + a point in the 3D space.

      + +

      The Result of + each operation will be a GEOM_Object + (face).

      + +

       

      + +

      Firstly, you can define a Plane + by a Point through which  the + plane passes, a Vector giving + a normal of the plane and a Size of the + Plane (size of a side of quadrangle face, representing the plane).

      + +

      TUI + Command: geompy.MakePlane(Point, + Vector, TrimSize)

      + +

      Arguments: Name + + 1 vertex + 1 vector  + + 1 value (to define the size of the plane).

      + +

      + +

       

      + +

      Secondly, you can define a Plane + by three Points through which +  the plane + passes.

      + +

      TUI + Command: geompy.MakePlaneThreePnt(Point1, + Point2, Point3, TrimSize)

      + +

      Arguments: + Name + 1 vertex + 3 points (for + the direction) + 1 value (to define the size of the plane).

      + +

       

      + +

      + +

       

      + +

      Finally, you can define a Plane, + similar to the existing one, but with another size of representing face. +

      + +

      TUI + Command: geompy.MakePlaneFace(Face, TrimSize)

      + +

      Arguments: + Name + 1 selection + 1 value (to define the size of the plane).

      + + + +

       

      + +

      Examples:

      + +

       

      + +

      Planes +                                                             A + Plane created on a Plane of another size

      + +

       

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

      +

      +

       

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Basic + Geometric Objects.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/point.htm b/doc/salome/gui/GEOM/point.htm new file mode 100755 index 000000000..1618af626 --- /dev/null +++ b/doc/salome/gui/GEOM/point.htm @@ -0,0 +1,193 @@ + + + + + +Point + + + + + + + + + + + + +

      Point

      + +

      To create a Point in the Main Menu select New + Entity - > Basic - > Point

      + +

       

      + +

      There are three algorithms to create + a Point in the 3D space.

      + +

      Each + time the Result of the operation + will be a GEOM_Object (vertex).

      + +

       

      + +

      Firstly, + we can define a point by and + setting its X, Y and Z Coordinates. +

      + +

      TUI Command : +   geompy.MakeVertex(X, + Y, Z)

      + +

      Arguments: Name + (Vertex_n by default) + + X, Y and Z coordinates of the point.

      + +

       

      + +

      + +

       

      + +

      Secondly,  we + can define a point by a Reference + to another point and the shift of the coordinates of the new point regarding + the coordinates of the old one.

      + +

      TUI Command : +   geompy.MakeVertexWithRef(Reference, X, Y, Z)

      + +

      Arguments: + Name + 1 reference point + 3 coordinates defining the position of + this point regarding the reference one

      + +

       

      + +

      + +

       

      + +

      Finally, we can define a + point by an Edge and a Parameter +  indicating + its position on the Edge. For example, 0.5 means that the point is located + in the middle of the edge.

      + +

      TUI + Command :   geompy.MakeVertexOnCurve(Edge, + Parameter)

      + +

      Arguments: + Name + 1 edge  + + 1 Parameter defining the position of the point on the given edge.

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts + provide you with useful examples of creation of Basic + Geometric Objects.

      + + + + diff --git a/doc/salome/gui/GEOM/primitives.htm b/doc/salome/gui/GEOM/primitives.htm new file mode 100755 index 000000000..38218aa9c --- /dev/null +++ b/doc/salome/gui/GEOM/primitives.htm @@ -0,0 +1,362 @@ + + + + + +Primitives + + + + + + + + + + + +

      Primitives

      + +

      Creation of a Box

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices

      + +

      p0 = geompy.MakeVertex(15, + 25, 35)

      + +

      p70 = geompy.MakeVertex(70, + 70, 70)

      + +

       

      + +

      # create boxes

      + +

      box1 = geompy.MakeBoxDXDYDZ(10, + 20, 30)

      + +

      box2 = geompy.MakeBox(10,20,30, + 15,25,35)

      + +

      box3 = geompy.MakeBoxTwoPnt(p0, + p70)

      + +

       

      + +

      # add objects in study

      + +

      id_box1 = geompy.addToStudy(box1,"Box1")

      + +

      id_box2 = geompy.addToStudy(box2,"Box2")

      + +

      id_box3 = geompy.addToStudy(box3,"Box3")

      + +

       

      + +

      # display boxes

      + +

      gg.createAndDisplayGO(id_box1)

      + +

      gg.setDisplayMode(id_box1,1)

      + +

      gg.createAndDisplayGO(id_box2)

      + +

      gg.setDisplayMode(id_box2,1)

      + +

      gg.createAndDisplayGO(id_box3)

      + +

      gg.setDisplayMode(id_box3,1) +

      + +

       

      + +

      Creation of a Cylinder

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(35, + 35, 0)

      + +

      p2 = geompy.MakeVertex(35, + 35, 70)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cones

      + +

      cone1 = geompy.MakeCone(p1, + v, 17, 1, 20)

      + +

      cone2 = geompy.MakeConeR1R2H(30, + 10, 30)

      + +

       

      + +

      # add objects in study

      + +

      id_cone1 = geompy.addToStudy(cone1,"Cone1")

      + +

      id_cone2 = geompy.addToStudy(cone2,"Cone2")

      + +

       

      + +

      # display cones

      + +

      gg.createAndDisplayGO(id_cone1)

      + +

      gg.setDisplayMode(id_cone1,1)

      + +

      gg.createAndDisplayGO(id_cone2)

      + +

      gg.setDisplayMode(id_cone2,1) +

      + +

       

      + +

      Creation of a Sphere

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex

      + +

      p = geompy.MakeVertex(55, + 45, 25)

      + +

       

      + +

      # create spheres

      + +

      radius1 = 20

      + +

      sphere1 = geompy.MakeSpherePntR(p, + radius1)

      + +

      radius2 = 15

      + +

      sphere2 = geompy.MakeSphere(0, + 0, 45, radius2)

      + +

      radius3 = 30

      + +

      sphere3 = geompy.MakeSphereR(radius3)

      + +

       

      + +

      # add objects in study

      + +

      id_sphere1 = geompy.addToStudy(sphere1,"Sphere1")

      + +

      id_sphere2 = geompy.addToStudy(sphere2,"Sphere2")

      + +

      id_sphere3 = geompy.addToStudy(sphere3,"Sphere3")

      + +

       

      + +

      # display spheres

      + +

      gg.createAndDisplayGO(id_sphere1)

      + +

      gg.setDisplayMode(id_sphere1,1)

      + +

      gg.createAndDisplayGO(id_sphere2)

      + +

      gg.setDisplayMode(id_sphere2,1)

      + +

      gg.createAndDisplayGO(id_sphere3)

      + +

      gg.setDisplayMode(id_sphere3,1) +

      + +

       

      + +

      Creation of a Torus

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(35, + 40, 45)

      + +

      p2 = geompy.MakeVertex(35, + 45, 70)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create toruses

      + +

      torus1 = geompy.MakeTorus(p1, + v, 20, 10)

      + +

      torus2 = geompy.MakeTorusRR(30, + 15)

      + +

       

      + +

      # add objects in study

      + +

      id_torus1 = geompy.addToStudy(torus1,"Torus1")

      + +

      id_torus2 = geompy.addToStudy(torus2,"Torus2")

      + +

       

      + +

      # display toruses

      + +

      gg.createAndDisplayGO(id_torus1)

      + +

      gg.setDisplayMode(id_torus1,1)

      + +

      gg.createAndDisplayGO(id_torus2)

      + +

      gg.setDisplayMode(id_torus2,1) +

      + +

      Creation of a Cone

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(35, + 35, 0)

      + +

      p2 = geompy.MakeVertex(35, + 35, 70)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cones

      + +

      cone1 = geompy.MakeCone(p1, + v, 17, 1, 20)

      + +

      cone2 = geompy.MakeConeR1R2H(30, + 10, 30)

      + +

       

      + +

      # add objects in study

      + +

      id_cone1 = geompy.addToStudy(cone1,"Cone1")

      + +

      id_cone2 = geompy.addToStudy(cone2,"Cone2")

      + +

       

      + +

      # display cones

      + +

      gg.createAndDisplayGO(id_cone1)

      + +

      gg.setDisplayMode(id_cone1,1)

      + +

      gg.createAndDisplayGO(id_cone2)

      + +

      gg.setDisplayMode(id_cone2,1) +

      + + + + diff --git a/doc/salome/gui/GEOM/propagate.htm b/doc/salome/gui/GEOM/propagate.htm new file mode 100755 index 000000000..9fd1dd1be --- /dev/null +++ b/doc/salome/gui/GEOM/propagate.htm @@ -0,0 +1,149 @@ + + + + + +Propagate + + + + + + + + + + + + +

      Propagate

      + +

      To produce + a Propagate operation in the Main + Menu select Operations - > Blocks + - > Propagate

      + +

       

      + +

      This operation breaks a multitude of edges + of a shape into groups (builds all possible propagation groups).

      + +

      The + Result will be a List of + GEOM_Objects. Each Geom Object will contain a group of edges.

      + +

       

      + +

      TUI Command: + geompy.Propagate(Shape), + where Shape is a shape to build propagation groups on.

      + +

      Arguments: 1 Shape.

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

           

      + +

       

      + +

         Our TUI + Scripts provide you with useful examples + of the use of Blocks + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/repairing_operations.htm b/doc/salome/gui/GEOM/repairing_operations.htm new file mode 100755 index 000000000..2b48c2851 --- /dev/null +++ b/doc/salome/gui/GEOM/repairing_operations.htm @@ -0,0 +1,1069 @@ + + + + + +Repairing Operations + + + + + + + + + + + +

      Repairing Operations

      + +

      Shape Processing

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices, edge, arc, wire, face and prism

      + +

      p1 = geompy.MakeVertex(0,0,0)

      + +

      p2 = geompy.MakeVertex(200,0,0)

      + +

      p3 = geompy.MakeVertex(100,150,0)

      + +

      edge = geompy.MakeEdge(p1,p2)

      + +

      arc  = + geompy.MakeArc(p1,p3,p2)

      + +

      wire = geompy.MakeWire([edge,arc])

      + +

      face = geompy.MakeFace(wire, + 1)

      + +

      theShape = geompy.MakePrismVecH(face, + edge, 130)

      + +

       

      + +

      # check shape at the beginning

      + +

      print "Before + ProcessShape:"

      + +

      isValid = geompy.CheckShape(theShape)

      + +

      if isValid == 0:

      + +

          print + "The shape is not valid"

      + +

      else:

      + +

          print + "The shape seems to be valid"

      + +

       

      + +

      # process Shape

      + +

      Operators = ["FixShape"]

      + +

      Parameters = ["FixShape.Tolerance3d"]

      + +

      Values = ["1e-7"]

      + +

      PS = geompy.ProcessShape(theShape, + Operators, Parameters, Values)

      + +

       

      + +

      # check shape at the end

      + +

      print "After + ProcessShape:"

      + +

      isValid = geompy.CheckShape(PS)

      + +

      if isValid == 0:

      + +

          print + "The shape is not valid"

      + +

          raise + RuntimeError, "It seems, that the ProcessShape() has failed"

      + +

      else:

      + +

          print + "The shape seems to be valid"

      + +

       

      + +

      # add in study and display

      + +

      Id_Shape = geompy.addToStudy(theShape, + "Invalid Shape")

      + +

      Id_PS    = + geompy.addToStudy(PS, "Processed Shape")

      + +

      gg.createAndDisplayGO(Id_Shape)

      + +

      gg.setDisplayMode(Id_Shape,1)

      + +

      gg.createAndDisplayGO(Id_PS)

      + +

      gg.setDisplayMode(Id_PS,1) +

      + +

       

      + +

      Suppress Faces

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create box

      + +

      box = geompy.MakeBoxDXDYDZ(200, + 200, 200)

      + +

       

      + +

      # IDList for suppress faces

      + +

      sup_faces = []

      + +

      sup_faces = geompy.SubShapeAllSorted(box, + geompy.ShapeType["FACE"])

      + +

       

      + +

      # get sub-shape indexes

      + +

      f1_id = geompy.GetSubShapeID(box, + sup_faces[3])

      + +

       

      + +

      # remove faces from the given object (shape)

      + +

      result = geompy.SuppressFaces(box, + [f1_id])

      + +

       

      + +

      # add objects in study

      + +

      id_box = geompy.addToStudy(box, + "Box")

      + +

      id_result = geompy.addToStudy(result, + "Result")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_box)

      + +

      gg.setDisplayMode(id_box,1)

      + +

      gg.createAndDisplayGO(id_result)

      + +

      gg.setDisplayMode(id_result,1) +

      + +

       

      + +

      Close Contour

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices and vectors

      + +

      p0  = + geompy.MakeVertex(  0., +   0., +   0.)

      + +

      px  = + geompy.MakeVertex(100.,   0., +   0.)

      + +

      py  = + geompy.MakeVertex(  0., + 100.,   0.)

      + +

      py1 = geompy.MakeVertex( +  0., 140., +   0.)

      + +

      pz  = + geompy.MakeVertex(  0., +   0., + 100.)

      + +

      vxy = geompy.MakeVector(px, + py)

      + +

        

      + +

      # create arc

      + +

      arc = geompy.MakeArc(py1, + pz, px)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vxy, + arc])

      + +

       

      + +

      # close an open wire by creation of an edge between ends

      + +

      wire_close = geompy.CloseContour(wire, + [1], 0)

      + +

       

      + +

      # add objects in study

      + +

      id_wire = geompy.addToStudy(wire, + "Wire")

      + +

      id_wire_close = geompy.addToStudy(wire_close, + "Wire close")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_wire)

      + +

      gg.createAndDisplayGO(id_wire_close) +

      + +

       

      + +

      Suppress Internal Wires

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(55, + 65, 50)

      + +

      p2 = geompy.MakeVertex(55, +  0, 50)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cylinder

      + +

      height = 100

      + +

      radius1 = 40

      + +

      cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

      + +

       

      + +

      # create box

      + +

      box = geompy.MakeBoxDXDYDZ(100, + 100, 100)

      + +

       

      + +

      # make cut

      + +

      cut = geompy.MakeCut(box, + cylinder)

      + +

       

      + +

      # suppress all internal wires

      + +

      result = geompy.SuppressInternalWires(cut, + [])

      + +

       

      + +

      # add objects in study

      + +

      id_cut = geompy.addToStudy(cut, + "Cut")

      + +

      id_result = geompy.addToStudy(result, + "Result")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_cut)

      + +

      gg.setDisplayMode(id_cut,1)

      + +

      gg.createAndDisplayGO(id_result)

      + +

      gg.setDisplayMode(id_result,1) +

      + +

       

      + +

      Suppress Holes

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(35, + 35, 0)

      + +

      p2 = geompy.MakeVertex(35, + 35, 50)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cylinder

      + +

      height = 20

      + +

      radius1 = 20

      + +

      cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

      + +

       

      + +

      # create cone

      + +

      cone = geompy.MakeCone(p1, + v, 70, 0, 80)

      + +

       

      + +

      # make cut

      + +

      cut = geompy.MakeCut(cone, + cylinder)

      + +

       

      + +

      # get faces as sub-shapes

      + +

      faces = []

      + +

      faces = geompy.SubShapeAllSorted(cut, + geompy.ShapeType["FACE"])

      + +

      f_2 = geompy.GetSubShapeID(cut, + faces[2])

      + +

       

      + +

      # remove one face from the shape

      + +

      cut_without_f_2 = + geompy.SuppressFaces(cut, [f_2])

      + +

       

      + +

      # get wires as sub-shapes

      + +

      wires = []

      + +

      wires = geompy.SubShapeAllSorted(cut_without_f_2, + geompy.ShapeType["WIRE"])

      + +

      w_0 = geompy.GetSubShapeID(cut_without_f_2, + wires[0])

      + +

       

      + +

      # suppress the selected wire

      + +

      result = geompy.SuppressHoles(cut_without_f_2, + [w_0])

      + +

       

      + +

      # add objects in study

      + +

      id_cut = geompy.addToStudy(cut, + "Cut")

      + +

      id_cut_without_f_2 + = geompy.addToStudy(cut_without_f_2, "Cut without f_2")

      + +

      id_result = geompy.addToStudy(result, + "Result")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_cut)

      + +

      gg.setDisplayMode(id_cut,1)

      + +

      gg.createAndDisplayGO(id_cut_without_f_2)

      + +

      gg.setDisplayMode(id_cut_without_f_2,1)

      + +

      gg.createAndDisplayGO(id_result)

      + +

      gg.setDisplayMode(id_result,1) +

      + +

       

      + +

      Sewing

      + +

      import geompy

      + +

      import salome

      + +

      import math

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create base points

      + +

      px = geompy.MakeVertex(100., + 0., 0.)

      + +

      py = geompy.MakeVertex(0., + 100., 0.)

      + +

      pz = geompy.MakeVertex(0., + 0., 100.)

      + +

       

      + +

      # create base geometry 2D & 3D

      + +

      vector = geompy.MakeVector(px, + py)

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create base objects

      + +

      angle = 45. * math.pi + / 180

      + +

      WantPlanarFace = 1 + #True

      + +

      wire = geompy.MakeWire([vector, + arc])

      + +

      face = geompy.MakeFace(wire, + WantPlanarFace)

      + +

      face_rot = geompy.MakeRotation(face, + vector, angle)

      + +

       

      + +

      # make sewing

      + +

      precision = 0.00001

      + +

      sewing = geompy.MakeSewing([face, + face_rot], precision)

      + +

       

      + +

      # add objects in study

      + +

      id_face = geompy.addToStudy(face, + "Face")

      + +

      id_face_rot = geompy.addToStudy(face_rot, + "Face rotation")

      + +

      id_sewing = geompy.addToStudy(sewing, + "Sewing")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_face)

      + +

      gg.setDisplayMode(id_face,1)

      + +

      gg.createAndDisplayGO(id_face_rot)

      + +

      gg.setDisplayMode(id_face_rot,1)

      + +

      gg.createAndDisplayGO(id_sewing)

      + +

      gg.setDisplayMode(id_sewing,1) +

      + +

       

      + +

      Glue Faces

      + +

      import geompy

      + +

      import salome

      + +

      import math

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create base points

      + +

      px = geompy.MakeVertex(100., + 0., 0.)

      + +

      py = geompy.MakeVertex(0., + 100., 0.)

      + +

      pz = geompy.MakeVertex(0., + 0., 100.)

      + +

       

      + +

      # create base geometry + 2D & 3D

      + +

      vector = geompy.MakeVector(px, + py)

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create base objects

      + +

      angle = 45. * math.pi + / 180

      + +

      WantPlanarFace = 1 + #True

      + +

      wire = geompy.MakeWire([vector, + arc])

      + +

      face = geompy.MakeFace(wire, + WantPlanarFace)

      + +

      face_rot = geompy.MakeRotation(face, + vector, angle)

      + +

       

      + +

      # make sewing

      + +

      precision = 0.00001

      + +

      sewing = geompy.MakeSewing([face, + face_rot], precision)

      + +

       

      + +

      # add objects in study

      + +

      id_face = geompy.addToStudy(face, + "Face")

      + +

      id_face_rot = geompy.addToStudy(face_rot, + "Face rotation")

      + +

      id_sewing = geompy.addToStudy(sewing, + "Sewing")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_face)

      + +

      gg.setDisplayMode(id_face,1)

      + +

      gg.createAndDisplayGO(id_face_rot)

      + +

      gg.setDisplayMode(id_face_rot,1)

      + +

      gg.createAndDisplayGO(id_sewing)

      + +

      gg.setDisplayMode(id_sewing,1) +

      + +

       

      + +

      Add Point on Edge

      + +

      import + geompy

      + +

      import salome

      + +

       

      + +

      # create vertices

      + +

      p1 = geompy.MakeVertex(0,0,50)

      + +

      p2 = geompy.MakeVertex(60,0,50)

      + +

       

      + +

      # make edge

      + +

      edge = geompy.MakeEdge(p1, + p2) #geompy.GetSubShape(box, edge_ind)

      + +

       

      + +

      # divide edge

      + +

      divide = geompy.DivideEdge(edge, + -1, 0.5, 0)

      + +

       

      + +

      # add objects in study

      + +

      id_edge = geompy.addToStudy(edge, + "Edge")

      + +

      edge_points = geompy.SubShapeAllSorted(edge, + geompy.ShapeType["VERTEX"])

      + +

      for point in edge_points:

      + +

          geompy.addToStudyInFather(edge, + point, "Edge's point")

      + +

          

      + +

      id_divide = geompy.addToStudy(divide, + "Divided edge")

      + +

      edge_points = geompy.SubShapeAllSorted(divide, + geompy.ShapeType["VERTEX"])

      + +

      for point in edge_points:

      + +

          geompy.addToStudyInFather(divide, + point, "Edge's point after divide")

      + +

        

      + +

      salome.sg.updateObjBrowser(1) +

      + +

       

      + +

      Check Free Boundaries

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create boxes

      + +

      box1 = geompy.MakeBox(0,0,0,100,50,100)

      + +

      box2 = geompy.MakeBox(100,0,0,250,50,100)

      + +

       

      + +

      # make compound

      + +

      compound = geompy.MakeCompound([box1, + box2])

      + +

       

      + +

      # import from *.brep

      + +

      ImportBREP = geompy.ImportBREP("/tmp/flight_solid.brep")

      + +

       

      + +

      # get face

      + +

      faces = geompy.SubShapeAllSorted(ImportBREP, + geompy.ShapeType["FACE"])

      + +

       

      + +

      # get free boundary for + face 32

      + +

      Res = geompy.GetFreeBoundary(faces[32])

      + +

      isSuccess   = + Res[0]

      + +

      ClosedWires = Res[1]

      + +

      OpenWires   = + Res[2]

      + +

        

      + +

      if + isSuccess == 1 :

      + +

          print + "Checking free boudaries is OK."

      + +

      else :

      + +

          print + "Checking free boudaries is KO!"

      + +

      print "len(ClosedWires) + = ", len(ClosedWires)

      + +

      i = 0

      + +

      for wire in ClosedWires + :

      + +

          wire_name + = "Face 32 -> Close wires : WIRE %d"%(i+1)

      + +

          geompy.addToStudy(ClosedWires[i], + wire_name)

      + +

          if + i < len(ClosedWires) :

      + +

              i + = i+ 1

      + +

      print "len(OpenWires) + = ", len(OpenWires)

      + +

      i = 0

      + +

      for wire in OpenWires + :

      + +

          wire_name + = "Face 32 -> Open wires : WIRE %d"%(i+1)

      + +

          geompy.addToStudy(OpenWires[i], + wire_name)

      + +

          if + i < len(OpenWires) :

      + +

              i + = i+ 1

      + +

       

      + +

      # get free boundary for + face 41

      + +

      Res = geompy.GetFreeBoundary(faces[41])

      + +

      isSuccess   = + Res[0]

      + +

      ClosedWires = Res[1]

      + +

      OpenWires   = + Res[2]

      + +

        

      + +

      if isSuccess == 1 + :

      + +

          print + "Checking free boudaries is OK."

      + +

      else :

      + +

          print + "Checking free boudaries is KO!"

      + +

      print "len(ClosedWires) + = ", len(ClosedWires)

      + +

      i = 0

      + +

      for wire in ClosedWires + :

      + +

          wire_name + = "Face 41 -> Close wires : WIRE %d"%(i+1)

      + +

          geompy.addToStudy(ClosedWires[i], + wire_name)

      + +

          if + i < len(ClosedWires) :

      + +

              i + = i+ 1

      + +

      print "len(OpenWires) + = ", len(OpenWires)

      + +

      i = 0

      + +

      for wire in OpenWires + :

      + +

          wire_name + = "Face 41 -> Open wires : WIRE %d"%(i+1)

      + +

          geompy.addToStudy(OpenWires[i], + wire_name)

      + +

          if + i < len(OpenWires) :

      + +

              i + = i+ 1

      + +

              

      + +

      # add imported object + in study

      + +

      id_ImportBREP = geompy.addToStudy(ImportBREP, + "ImportBREP")

      + +

      salome.sg.updateObjBrowser(1) +

      + +

       

      + +

      Check Free Faces

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(35, + 35, 0)

      + +

      p2 = geompy.MakeVertex(35, + 35, 50)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cylinder

      + +

      cylinder = geompy.MakeCone(p1, + v, 30, 20, 20)

      + +

       

      + +

      # create cone

      + +

      cone = geompy.MakeCone(p1, + v, 70, 40, 60)

      + +

       

      + +

      # make cut

      + +

      cut = geompy.MakeCut(cone, + cylinder)

      + +

       

      + +

      # get faces as sub-shapes

      + +

      faces = []

      + +

      faces = geompy.SubShapeAllSorted(cut, + geompy.ShapeType["FACE"])

      + +

      f_2 = geompy.GetSubShapeID(cut, + faces[0])

      + +

       

      + +

      # remove one face from the shape

      + +

      cut_without_f_2 = + geompy.SuppressFaces(cut, [f_2])

      + +

       

      + +

      # suppress specified wire

      + +

      result = geompy.GetFreeFacesIDs(cut_without_f_2)

      + +

      print "A number + of free faces is ", len(result)

      + +

       

      + +

      # add objects in study

      + +

      all_faces = geompy.SubShapeAllSorted(cut_without_f_2, + geompy.ShapeType["FACE"])

      + +

      for face in all_faces + :

      + +

          sub_shape_id + = geompy.GetSubShapeID(cut_without_f_2, face)

      + +

          if + result.count(sub_shape_id) > 0 :

      + +

              face_name + = "Free face %d"%(sub_shape_id)

      + +

              geompy.addToStudy(face, + face_name)

      + +

       

      + +

      # in this example all faces from cut_without_f_2 are free

      + +

      id_cut_without_f_2 + = geompy.addToStudy(cut_without_f_2, "Cut without f_2")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_cut_without_f_2)

      + +

      gg.setDisplayMode(id_cut_without_f_2,1) +

      + + + + diff --git a/doc/salome/gui/GEOM/revolution.htm b/doc/salome/gui/GEOM/revolution.htm new file mode 100755 index 000000000..f19dcf81a --- /dev/null +++ b/doc/salome/gui/GEOM/revolution.htm @@ -0,0 +1,147 @@ + + + + + +Revolution + + + + + + + + + + + + +

      Revolution

      + +

      To create + an extruded shape by Revolution + in the Main Menu select New Entity - > Generation  - + > Revolution

      + +

       

      + +

      To create an extruded shape by Revolution + you need to define the source Object + to rotate, the Axis of revolution + and the Angle by which the Shape + has to be rotated around the Axis + (in degrees).

      + +

      The Result of + the operation will be a GEOM_Object (edge, face, solid or compsolid).

      + +

       

      + +

      TUI Command: + geompy.MakeRevolution(Shape, Axis, + Angle).

      + +

      Arguments: + Name + 1 shape (vertex, edge, wire, face or shell) serving as base object + + 1 vector (for direction) + 1 value (angle).

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

      Our TUI Scripts + provide you with useful examples of creation of Complex + Geometric Objects.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/rotation.htm b/doc/salome/gui/GEOM/rotation.htm new file mode 100755 index 000000000..cc5464188 --- /dev/null +++ b/doc/salome/gui/GEOM/rotation.htm @@ -0,0 +1,155 @@ + + + + + +Rotation + + + + + + + + + + + + +

      Rotation

      + +

      To produce + a Rotation in the Main Menu select + Operations - > Transformation - > + Rotation

      + +

       

      + +

      This operation rotates the initial shape. To + produce a Rotation you need to + define an Object  to + be rotated, an Axis of rotation + and an Angle of rotation.

      + +

      Reverse + checkbox allows to specify the direction of rotation.

      + +

      Create a copy + checkbox allows to keep the initial object, otherwise it will be + removed.

      + +

       

      + +

      The + Result will be any  GEOM_Object.

      + +

      TUI Command: + geompy.MakeRotation(Shape, Axis, + Angle)

      + +

      Arguments: + 1 shape + 1 vector for direction of rotation + 1 angle.

      + +

       

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

        

      + +

      Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/scale_transform.htm b/doc/salome/gui/GEOM/scale_transform.htm new file mode 100755 index 000000000..094686751 --- /dev/null +++ b/doc/salome/gui/GEOM/scale_transform.htm @@ -0,0 +1,147 @@ + + + + + +Scale Transform + + + + + + + + + + + + +

       Scale + Transform

      + +

      To produce + a Scale Transform in the Main + Menu select Operations - > Transformation + - > Scale Transform

      + +

       

      + +

      This operation creates a scaled shape basing + on the initial shape. For this, you need to define the Shape + to be scaled, the Central Point + of scale and the Scale Factor.

      + +

      The + Result will be a GEOM_Object.

      + +

      TUI Command: + geompy.MakeScaleTransform(Shape, + CenterOfScale, Factor),

      + +

      Arguments: + Name + 1 shape(s) + 1 vertex + 1 Scale Factor.

      + +

       

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

        Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/section.htm b/doc/salome/gui/GEOM/section.htm new file mode 100755 index 000000000..e5681eef6 --- /dev/null +++ b/doc/salome/gui/GEOM/section.htm @@ -0,0 +1,150 @@ + + + + + +Section + + + + + + + + + + + + +

      Section

      + +

      To produce + a Section in the Main Menu select + Operations - > Boolean - > Section

      + +

       

      + +

      This + operation creates the section between 2 shapes.

      + +

       

      + +

      The + Result will be a GEOM_Object + (COMPOUND).

      + +

      TUI Command: +  geompy.MakeSection(s1, + s2)

      + +

      Arguments: + Name + 2 shapes.

      + +

       

      + +

       

      + +

      + +

       

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

        Our TUI Scripts + provide you with useful examples of the use of Boolean + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/sewing.htm b/doc/salome/gui/GEOM/sewing.htm new file mode 100755 index 000000000..abac91a38 --- /dev/null +++ b/doc/salome/gui/GEOM/sewing.htm @@ -0,0 +1,143 @@ + + + + + +Sewing + + + + + + + + + + + +

      Sewing

      + +

      To produce + a Sewing operation in the Main + Menu select Repair - > Sewing.

      + +

       

      + +

      This + operation allows to sew several  shapes.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command : + geompy.MakeSewing(ListOfShape, Precision), + where ListOfShape is list of shapes to be sewed, Precision is a precision + for sewing.

      + +

       

      + +

      + +

       

      + +

      Arguments: + Name + 1 or more shapes + 1 value (sew precision).

      + +

      Detect + button allows to display the number of free boundaries in your + shape:

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

      Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/shape_processing.htm b/doc/salome/gui/GEOM/shape_processing.htm new file mode 100755 index 000000000..ba0c19f7f --- /dev/null +++ b/doc/salome/gui/GEOM/shape_processing.htm @@ -0,0 +1,302 @@ + + + + + +Shape Processing + + + + + + + + + + + +

      Shape Processing

      + +

      To produce + a Shape Processing operation in + the Main Menu select Repair - > + Shape Processing.

      + +

       

      + +

      This operation processes a shape using various + operators.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: + geompy.ProcessShape(Shape, Operators, + Parameters, Values), where Shape is a processed shape, Operators + is a list of names of operators ("FixShape", "SplitClosedFaces", + etc.), Parameters is a list of names of parameters (“FixShape.Tolerance3d”, + etc), Values is a list of values of parameters in the same order as the + Parameters list.

      + +

       

      + +

      Arguments: + 1 or more shapes.

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

      1

      +

      SplitAngle – + this operator is intended for splitting faces based on conical surfaces, + surfaces of revolution and cylindrical surfaces by angle

      +

      SplitAngle.Angle – angle (in radians) defining + size of result segments.

      +

      SplitAngle.MaxTolerance – maximal possible + tolerance on result shape

      +

      2

      +

      SplitClosedFaces + – this operator is intended for dividing all closed faces in the shape + according to the number of points.

      +

      SplitClosedFaces.NbSplitPoints – number of + points for cutting each closed faces.

      +

      3

      +

      FixFaceSize + – this operator is intended for removing small faces (case of the spot + face and strip face)

      +

      FixFaceSize.Tolerance – work tolerance defining + which faces will be removed.

      +

      4

      +

      DropSmallEdges + – this operator is intended for removing small edges or merging with neigbour. +  

      +

      DropSmallEdges.Tolerance3d – work tolerance + for detection and removing small edges.

      +

      5

      +

      BsplineRestriction + –this operator is intended for re-approximation BSplines curves and surfaces + or conversion of the curves and surfaces to BSplines with specified parameters. +

      +

      BSplineRestriction.SurfaceMode - mode of approximation + of surfaces if restriction is necessary

      +

      BSplineRestriction.Curve3dMode -mode of conversion + of any 3D curve to BSpline and approximation.

      +

      BSplineRestriction.Curve2dMode - mode of conversion + of any 2D curve to BSpline and approximation

      +

      BSplineRestriction.Tolerance3d – work tolerance + for definition of the possibility of the approximation of the surfaces + and 3D curves with specified parameters.

      +

      BSplineRestriction.Tolerance2d - work tolerance + for definition of the possibility of the approximation of the 2D curves + with specified parameters.

      +

      BSplineRestriction.Continuity3d – desired continuity + of the resultant surfaces and 3D curves.

      +

      BSplineRestriction.Continuity2d – desired continuity + of the resultant 2D curves.

      +

      BSplineRestriction.RequiredDegree - required + degree of the resultant BSplines

      +

      BSplineRestriction.RequiredNbSegments - required + maximum number of segments of resultant BSplines.

      +

      6

      +

      SplitContinuity + – this operator is intended for splitting shapes to achieve continuities + of curves and surfaces less than specified ones.

      +

      SplitContinuity.Tolerance3d - 3D tolerance + for correction of geometry.

      +

      SplitContinuity.SurfaceContinuity - required + continuity for surfaces.

      +

      SplitContinuity.CurveContinuity - required + continuity for curves.

      +

      7

      +

      ToBezier - this + operator is intended for conversion of the curves and surfaces of the + all types into Bezier curves and surfaces.

      +

      ToBezier.SurfaceMode - mode of conversion of + the surfaces.

      +

      ToBezier.Curve3dMode – mode for conversion + of the 3D curves.

      +

      ToBezier.Curve2dMode – mode for conversion + of the 2D curves.

      +

      ToBezier.MaxTolerance – max possible tolerance + on the resultant shape.

      +

      8

      +

      FixShape – this + operator is intended for correction of the invalid shapes

      +

      FixShape.Tolerance3d – work tolerance for detection + of the problems and correction of them.

      +

      FixShape.MaxTolerance3d - maximal possible + tolerance of the shape after correction.

      +

      9

      +

      SameParameter + – this operator is intended for fixing edges having not same parameter + 2D and 3D curves.

      +

      SameParameter.Tolerance3d – tolerance for detection + and fix problems.

      + +

       

      + +

       

      + +

      Dialog Box:

      + +

       

      + +

       

      + +

       

      + +

      Example:

      + +

       

      + +

      Shape before applying Shape Processing (FixShape + operator).

      + +

       

      + +

         

      + +

       

      + +

      The + same shape after applying Shape Processing.

      + +

       

      + +

      + +

       

      + +

      Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/shell.htm b/doc/salome/gui/GEOM/shell.htm new file mode 100755 index 000000000..df6d6ee37 --- /dev/null +++ b/doc/salome/gui/GEOM/shell.htm @@ -0,0 +1,132 @@ + + + + + +Shell + + + + + + + + + + + +

      Shell

      + +

      To create + a Shell in the Main Menu select + New Entity - > Build - > Shell

      + +

       

      + +

      You + can create a Shell from a list of faces and (or) + shells.

      + +

      The + Result will be a  GEOM_Object + (SHELL).

      + +

       

      + +

      TUI Command: + geompy.MakeShell(ListOfShape) +

      + +

      Arguments: + Name + List of faces having connected edges.

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

      + +

       

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/sketcher.htm b/doc/salome/gui/GEOM/sketcher.htm new file mode 100755 index 000000000..c90905659 --- /dev/null +++ b/doc/salome/gui/GEOM/sketcher.htm @@ -0,0 +1,215 @@ + + + + + +Sketcher + + + + + + + + + + + + +

      Sketcher

      + +

      Sketcher allows to create curves of 2 types: line + segment and arc.  The + curve is created from the current point (center of coordinates when the + sketcher is started).  The + end of the curve is defined by means of "destination", which + can be a destination point (for segment only) or destination direction + coupled with length of a segment or angle and radius of an arc.

      + +

       

      + +

      Sketcher is able to create planar curves only. Therefore, it is necessary + to select a working plane before starting a sketch (by default, XOY plane + is used). Sketcher creates curves lying in the current working plane (New + Entity -> Basic -> Working Plane).

      + +

       

      + +

      This functionality is available from the main menu via New + Entity / Sketch.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: + geompy.MakeSketcher(Command, WorkingPlane)

      + +

      This algorithm creates + a sketcher (wire or face), following the textual description, passed through + the Command argument. The edges of the resulting wire or face will be + arcs of circles and/or linear segments.

      + +

      Command is a string, defining the sketcher by the + coordinates of points in the local working plane.

      + +

      WorkingPlane + is a planar face of the working plane (a list of 9 doubles which are coordinates + of OZ and OX of the local working plane).

      + +

       

      + +

      Arguments: +

      + +

      1. Element type (segment or arc).

      + +

      2. Destination type (point or direction).

      + +

      3. Destination point by means of:

      + +
        + +
      • absolute coordinates + X,Y;

      • + +
      • relative coordinates + DX, DY (with respect to the current point);

      • + +
      • selection of an existing + point.

      • +
      + +

      4. Destination direction by means of:

      + +
        + +
      • angle between the new + segment and the previous one;

      • + +
      • perpendicular to the + previous segment (same as previous, but angle is predefined and is equal + to 90 degrees);

      • + +
      • tangent to the previous + segment;

      • + +
      • vector components VX, + DY.

      • +
      + +

      5. Parameters of an element (for segment : + length or target X or Y coordinate value, for arc : radius and angle).

      + +

       

      + +

      Dialog Box:

      + +

       

      + +

        

      + +

       

      + +

      Example:

      + +

       

      + +

        

      + +

       

      + +

      Our TUI Scripts + provide you with useful examples of the use of Sketcher. +

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/sketcher_tui.htm b/doc/salome/gui/GEOM/sketcher_tui.htm new file mode 100755 index 000000000..6ba4e5ff5 --- /dev/null +++ b/doc/salome/gui/GEOM/sketcher_tui.htm @@ -0,0 +1,176 @@ + + + + + +Sketcher + + + + + + + + + + + +

      Sketcher

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices

      + +

      p1 = geompy.MakeVertex(70., +  0.,  0.)

      + +

      p2 = geompy.MakeVertex(70., + 70., 80.)

      + +

      p3 = geompy.MakeVertex( + 0., 70.,  0.)

      + +

       

      + +

      #create vector with two points

      + +

      vector_arc = geompy.MakeVector(p1, + p3)

      + +

       

      + +

      # create arc with three points

      + +

      arc = geompy.MakeArc(p1, + p2, p3)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vector_arc, + arc])

      + +

       

      + +

      # create planar face

      + +

      isPlanarWanted = 1

      + +

      face = geompy.MakeFace(wire, + isPlanarWanted)

      + +

       

      + +

      # create sketcher (face), following the textual description

      + +

      sketcher1 = geompy.MakeSketcher("Sketcher:F + -100 -100:TT 250 -100:R 0:C 100 150:R 0:L 300:WF",

      + +

                                      [100,0,0, + 1,1,1, -1,1,0])

      + +

       

      + +

      # create sketcher (wire) on the given face

      + +

      sketcher2 = geompy.MakeSketcherOnPlane("Sketcher:F + 10 -30:R 10:C 20 180:R 15:L 50:WW",

      + +

                                             face)

      + +

       

      + +

      # add objects in study

      + +

      id_face = geompy.addToStudy(face,"Face")

      + +

      id_sketcher1 = geompy.addToStudy(sketcher1,"Sketcher1")

      + +

      id_sketcher2 = geompy.addToStudy(sketcher2,"Sketcher2")

      + +

       

      + +

      # display first sketcher and second sketcher with its planar face

      + +

      gg.createAndDisplayGO(id_face)

      + +

      gg.setDisplayMode(id_face,1)

      + +

      gg.setTransparency(id_face,0.5)

      + +

      gg.createAndDisplayGO(id_sketcher1)

      + +

      gg.createAndDisplayGO(id_sketcher2) +

      + + + + diff --git a/doc/salome/gui/GEOM/solid.htm b/doc/salome/gui/GEOM/solid.htm new file mode 100755 index 000000000..7e71bd580 --- /dev/null +++ b/doc/salome/gui/GEOM/solid.htm @@ -0,0 +1,133 @@ + + + + + +Solid + + + + + + + + + + + +

       Solid

      + +

      To create + a Solid in the Main Menu select + New Entity - > Build - > Solid.

      + +

       

      + +

      You + can create a Solid from a list + of shells.

      + +

       

      + +

      The + Result will be a +  GEOM_Object + (SOLID).

      + +

       

      + +

      TUI Command: + geompy.MakeSolid(ListOfShape), + where ListOfShape is a list of shells from which the solid is constructed.

      + +

      Arguments: + Name + A closed shell or a list of shells.

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/sphere.htm b/doc/salome/gui/GEOM/sphere.htm new file mode 100755 index 000000000..f2b200bde --- /dev/null +++ b/doc/salome/gui/GEOM/sphere.htm @@ -0,0 +1,160 @@ + + + + + +Sphere + + + + + + + + + + + +

       Sphere

      + +

      To create a Sphere + in the Main Menu select New Entity - > Primitives - > Sphere

      + +

       

      + +

      There are two algorithms for creation of a Sphere. +

      + +

      The + Result of each operation will be a + GEOM_Object (SOLID).

      + +

       

      + +

      Firstly, you can define a Sphere + by the Center Point and the Radius.

      + +

      TUI Command: geompy.MakeSphere(Point, + Radius)

      + +

      Arguments: Name + + 1 vertex + 1 value (Radius).

      + +

      + +

       

      + +

      Secondly, + you can define a Sphere with + the center at the origin of coordinate system by the Radius.

      + +

      TUI Command: geompy. + MakeSphereR(Radius)

      + +

      Arguments: Name + + 1  value + (Radius from the origin).

      + +

      + +

       

      + +

      NB! The + is another way to create a Sphere, + which is currently accessible only via TUI commands.

      + +

      You + can define the Sphere by the + coordinates of the Center Point + (in this way you don't need to create it in advance).

      + +

      TUI + Command: geompy.MakeSphere(X, + Y, Z, Radius)

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Primitives.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/suppress_faces.htm b/doc/salome/gui/GEOM/suppress_faces.htm new file mode 100755 index 000000000..a67a8a697 --- /dev/null +++ b/doc/salome/gui/GEOM/suppress_faces.htm @@ -0,0 +1,135 @@ + + + + + +Suppress Faces + + + + + + + + + + + +

      Suppress Faces

      + +

      To produce + a Suppress Faces operation in + the Main Menu select Repair - > Suppress + Faces.

      + +

       

      + +

      This operation suppresses a face of a shape. + This operation is available in OCC Viewer + only.

      + +

       

      + +

      Result: GEOM_Object + (ListOfGeomShapes).

      + +

      TUI Command: + geompy.SuppressFaces(Shape, ListOfID), + where Shape is a shape to be processed, ListOfID is a list of faces ID's + to be removed.

      + +

      Arguments: + Name + Faces which should be removed (you can select them in the 3D viewer).

      + +

       

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

      Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/suppress_holes.htm b/doc/salome/gui/GEOM/suppress_holes.htm new file mode 100755 index 000000000..3206a63ed --- /dev/null +++ b/doc/salome/gui/GEOM/suppress_holes.htm @@ -0,0 +1,149 @@ + + + + + +Suppress Holes + + + + + + + + + + + +

      Suppress Holes

      + +

      To Suppress Holes in the Main Menu select + Repair - > Suppress Holes.

      + +

       

      + +

      This operation removes holes on a selected shape. This + operation is available in OCC + Viewer only.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: + geompy.SuppressHoles(Shape, ListOfWireID), + where Shape is a shape where holes must be removed, ListOfWireID is a + list of wire sub shapes IDÂ’s. If it is empty, then all holes are removed.

      + +

       

      + +

      + +

       

      + +

      Arguments: Name + + 1 shape + Wires which should be removed.

      + +

      Remove all + holes checkbox allows to fill all holes of a definite shape.

      + +

      Detect button + allows to display the number of free boundaries in your shape:

      + +

       

      + +

      + +

       

      + +

        

      + +

      Example:

      + +

       

      + +

         

      + +

       

      + +

      Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

      + +

       

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/suppress_internal_wires.htm b/doc/salome/gui/GEOM/suppress_internal_wires.htm new file mode 100755 index 000000000..463cd206a --- /dev/null +++ b/doc/salome/gui/GEOM/suppress_internal_wires.htm @@ -0,0 +1,159 @@ + + + + + +Suppress Internal Wires + + + + + + + + + + + +

      Suppress Internal + Wires

      + +

      To Suppress Internal Wires in the Main + Menu select Repair - > Suppress Internal + Wires.

      + +

       

      + +

      This operation removes all internal wires or + specified internal wires from user specified faces. This operation is + available in OCC Viewer only. +

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: + geompy.SuppressInternalWires(Shape, + Wires), where Shape is a shape where wires are to be removed, Wires + is a list of wires IDÂ’s to be removed; if the list is empty then all internal + wires are removed.

      + +

       

      + +

       

      + +

      Arguments:

      + +
        + +
      • Name of the resulting + object

      • + +
      • User specified face

      • + +
      • User specified internal + wires (lying on this face except for its boundary), or, in case the Remove all internal wires box is checked, + all internal wires

      • +
      + +

       

      + +

      Dialog Box:

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

         

      + +

       

      + +

      Our + TUI Scripts provide you with useful + examples of the use of Repairing + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/transformation_operations.htm b/doc/salome/gui/GEOM/transformation_operations.htm new file mode 100755 index 000000000..5cf40c1c9 --- /dev/null +++ b/doc/salome/gui/GEOM/transformation_operations.htm @@ -0,0 +1,1069 @@ + + + + + +Transformation Operations + + + + + + + + + + + +

      Transformation Operations

      + +

      Translation

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(10, + 40, 0)

      + +

      p2 = geompy.MakeVertex( + 0,  0, 50)

      + +

      p3 = geompy.MakeVertex(50, + 80, 0)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

      vt = geompy.MakeVector(p1, + p3)

      + +

       

      + +

      # create cylinder

      + +

      height = 35

      + +

      radius1 = 20

      + +

      cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

      + +

       

      + +

      # translate the given object along the vector, specified by its end + points

      + +

      # (all three functions produce the same result)

      + +

      translation1 = geompy.MakeTranslationTwoPoints(cylinder, + p1, p3)

      + +

      translation2 = geompy.MakeTranslation(cylinder, + 40, 40, 0)

      + +

      translation3 = geompy.MakeTranslationVector(cylinder, + vt)

      + +

       

      + +

      # add objects in study

      + +

      id_cylinder = geompy.addToStudy(cylinder, + "Cylinder")

      + +

      id_translation1 = + geompy.addToStudy(translation1, "Translation1")

      + +

      id_translation2 = + geompy.addToStudy(translation2, "Translation2")

      + +

      id_translation3 = + geompy.addToStudy(translation3, "Translation3")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_cylinder)

      + +

      gg.setDisplayMode(id_cylinder,1)

      + +

      gg.createAndDisplayGO(id_translation1)

      + +

      gg.setDisplayMode(id_translation1,1)

      + +

      gg.createAndDisplayGO(id_translation2)

      + +

      gg.setDisplayMode(id_translation2,1)

      + +

      gg.createAndDisplayGO(id_translation3)

      + +

      gg.setDisplayMode(id_translation3,1) +

      + +

      Rotation

      + +

      import geompy

      + +

      import salome

      + +

      import math

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(10, + 40, 0)

      + +

      p2 = geompy.MakeVertex( + 0,  0, 50)

      + +

      p3 = geompy.MakeVertex(10, + 50,-20)

      + +

      p4 = geompy.MakeVertex(10, + 50, 60)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

      vr = geompy.MakeVector(p3, + p4)

      + +

       

      + +

      # create cylinder

      + +

      height = 35

      + +

      radius1 = 20

      + +

      cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

      + +

       

      + +

      # rotate the given object around the given axis on the given angle

      + +

      rotation = geompy.MakeRotation(cylinder, + vr, math.pi)

      + +

       

      + +

      # add objects in study

      + +

      id_vr = geompy.addToStudy(vr, + "Rotation axis")

      + +

      id_cylinder = geompy.addToStudy(cylinder, + "Cylinder")

      + +

      id_rotation = geompy.addToStudy(rotation, + "Rotation")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_vr)

      + +

      gg.createAndDisplayGO(id_cylinder)

      + +

      gg.setDisplayMode(id_cylinder,1)

      + +

      gg.createAndDisplayGO(id_rotation)

      + +

      gg.setDisplayMode(id_rotation,1) +

      + +

       

      + +

      Modify Location

      + +

      import geompy

      + +

      import salome

      + +

      import math

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertex and vector

      + +

      p1 = geompy.MakeVertex(10, + 40, 0)

      + +

      p2 = geompy.MakeVertex( + 0,  0, 50)

      + +

      v = geompy.MakeVector(p1, + p2)

      + +

       

      + +

      # create cylinder

      + +

      height = 35

      + +

      radius1 = 20

      + +

      cylinder = geompy.MakeCylinder(p1, + v, radius1, height)

      + +

       

      + +

      # create local coordinate systems

      + +

      cs1 = geompy.MakeMarker( + 0, 0, 0, 1,0,0, 0,1,0)

      + +

      cs2 = geompy.MakeMarker(30,40,40, + 1,0,0, 0,1,0)

      + +

       

      + +

      # modify the location of the given object

      + +

      position = geompy.MakePosition(cylinder, + cs1, cs2)

      + +

       

      + +

      # add objects in study

      + +

      id_cs1 = geompy.addToStudy(cs1, + "Coordinate system 1")

      + +

      id_cs2 = geompy.addToStudy(cs2, + "Coordinate system 2")

      + +

      id_cylinder = geompy.addToStudy(cylinder, + "Cylinder")

      + +

      id_position = geompy.addToStudy(position, + "Position")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_cylinder)

      + +

      gg.setDisplayMode(id_cylinder,1)

      + +

      gg.createAndDisplayGO(id_position)

      + +

      gg.setDisplayMode(id_position,1) +

      + +

       

      + +

      Mirror Image

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create box

      + +

      box = geompy.MakeBoxDXDYDZ(200, + 200, 200)

      + +

       

      + +

      # create an object, symmetrical to the given one relatively the given + plane

      + +

      p1 = geompy.MakeVertex( + 0, 25,  0)

      + +

      p2 = geompy.MakeVertex( + 5, 25,  0)

      + +

      p3 = geompy.MakeVertex( + 0,-30, 40)

      + +

      plane = geompy.MakePlaneThreePnt(p1, + p2, p3, 1000.)

      + +

      mirror1 = geompy.MakeMirrorByPlane(box, + plane)

      + +

       

      + +

      # create an object, symmetrical to the given one relatively the given + axis

      + +

      p4 = geompy.MakeVertex( + 210, 210, -20)

      + +

      p5 = geompy.MakeVertex( + 210, 210, 220)

      + +

      axis = geompy.MakeVector(p4, + p5)

      + +

      mirror2 = geompy.MakeMirrorByAxis(box, + axis)

      + +

       

      + +

      # create an object, symmetrical to the given one relatively the given + point

      + +

      mirror3 = geompy.MakeMirrorByPoint(box, + p4)

      + +

       

      + +

      # add objects in study

      + +

      id_box = geompy.addToStudy(box, + "Box")

      + +

      id_plane = geompy.addToStudy(plane, + "Plane")

      + +

      id_mirror1 = geompy.addToStudy(mirror1, + "Mirror plane")

      + +

      id_axis = geompy.addToStudy(axis, + "Axis")

      + +

      id_mirror2 = geompy.addToStudy(mirror2, + "Mirror axis")

      + +

      id_p4 = geompy.addToStudy(p4, + "Point")

      + +

      id_mirror3 = geompy.addToStudy(mirror3, + "Mirror point")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_box)

      + +

      gg.setDisplayMode(id_box,1)

      + +

      gg.createAndDisplayGO(id_plane)

      + +

      gg.createAndDisplayGO(id_mirror1)

      + +

      gg.setDisplayMode(id_mirror1,1)

      + +

      gg.createAndDisplayGO(id_axis)

      + +

      gg.createAndDisplayGO(id_mirror2)

      + +

      gg.setDisplayMode(id_mirror2,1)

      + +

      gg.createAndDisplayGO(id_p4)

      + +

      gg.createAndDisplayGO(id_mirror3)

      + +

      gg.setDisplayMode(id_mirror3,1) +

      + +

       

      + +

      Scale Transform

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create box and sphere

      + +

      box = geompy.MakeBoxDXDYDZ(200, + 200, 200)

      + +

       

      + +

      # scale the given object by the factor

      + +

      p0 = geompy.MakeVertex(100, + 100, 100)

      + +

      factor = 0.5

      + +

      scale = geompy.MakeScaleTransform(box, + p0, factor)

      + +

       

      + +

      # add objects in study

      + +

      id_box = geompy.addToStudy(box, + "Box")

      + +

      id_scale = geompy.addToStudy(scale, + "Scale")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_box)

      + +

      gg.setDisplayMode(id_box,1)

      + +

      gg.createAndDisplayGO(id_scale)

      + +

      gg.setDisplayMode(id_scale,1) +

      + +

       

      + +

      Offset Surface

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create box and sphere

      + +

      box = geompy.MakeBox(20, + 20, 20, 200, 200, 200)

      + +

       

      + +

      # create new object as offset of the given one

      + +

      offset = geompy.MakeOffset(box, + 70.)

      + +

       

      + +

      # add objects in study

      + +

      id_box = geompy.addToStudy(box, + "Box")

      + +

      id_offset = geompy.addToStudy(offset, + "Offset")

      + +

       

      + +

      # display results

      + +

      gg.createAndDisplayGO(id_box)

      + +

      gg.setDisplayMode(id_box,1)

      + +

      gg.createAndDisplayGO(id_offset) +

      + +

       

      + +

      Multi Translation

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices and vectors

      + +

      p0  = + geompy.MakeVertex( 0.,  0., +  0.)

      + +

      px  = + geompy.MakeVertex(20.,  0., +  0.)

      + +

      py  = + geompy.MakeVertex( 0., 20.,  0.)

      + +

      pz  = + geompy.MakeVertex( 0.,  0., + 20.)

      + +

      pxy = geompy.MakeVertex( + 50., 0., 0.)

      + +

      pxyz = geompy.MakeVertex( + 50., 50., 50.)

      + +

      vz  = + geompy.MakeVector(p0, pz)

      + +

      vxy = geompy.MakeVector(px, + py)

      + +

      vtr1d = geompy.MakeVector(p0, + pxyz)

      + +

      vtr2d = geompy.MakeVector(p0, + pxy)

      + +

        

      + +

      # create arc

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vxy, + arc])

      + +

       

      + +

      # create planar face

      + +

      face = geompy.MakeFace(wire, + 1)

      + +

       

      + +

      # create prism

      + +

      prism = geompy.MakePrismVecH(face, + vz, 20.0)

      + +

       

      + +

      # translate the given object along the given vector a given number times

      + +

      tr1d = geompy.MakeMultiTranslation1D(prism, + vtr1d, 20, 4)

      + +

       

      + +

      # consequently apply two specified translations to the object specified + number of times

      + +

      tr2d = geompy.MakeMultiTranslation2D(prism, + vtr1d, 20, 4, vtr2d, 80, 3)

      + +

       

      + +

      # add objects in study

      + +

      id_prism = geompy.addToStudy(prism,"Prism")

      + +

      id_tr1d = geompy.addToStudy(tr1d,"Translation + 1D")

      + +

      id_tr2d = geompy.addToStudy(tr2d,"Translation + 2D")

      + +

       

      + +

      # display prism and results of fillet operation

      + +

      gg.createAndDisplayGO(id_prism)

      + +

      gg.setDisplayMode(id_prism,1)

      + +

      gg.createAndDisplayGO(id_tr1d)

      + +

      gg.setDisplayMode(id_tr1d,1)

      + +

      gg.createAndDisplayGO(id_tr2d)

      + +

      gg.setDisplayMode(id_tr2d,1) +

      + +

       

      + +

      Multi Rotation

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

       

      + +

      # create vertices and vectors

      + +

      p0  = + geompy.MakeVertex( 0.,  0., +  0.)

      + +

      px  = + geompy.MakeVertex(20.,  0., +  0.)

      + +

      py  = + geompy.MakeVertex( 0., 20.,  0.)

      + +

      pz  = + geompy.MakeVertex( 0.,  0., + 20.)

      + +

      pxyz = geompy.MakeVertex( + 50., 50., 10.)

      + +

      vz  = + geompy.MakeVector(p0, pz)

      + +

      vxy = geompy.MakeVector(px, + py)

      + +

      vrot1d = geompy.MakeVector(p0, + pxyz)

      + +

        

      + +

      # create arc

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vxy, + arc])

      + +

       

      + +

      # create planar face

      + +

      face = geompy.MakeFace(wire, + 1)

      + +

       

      + +

      # create prism

      + +

      prism = geompy.MakePrismVecH(face, + vz, 20.0)

      + +

       

      + +

      # rotate the given object around the given axis on the given angle a + given number times

      + +

      rot1d = geompy.MultiRotate1D(prism, + vrot1d, 4)

      + +

       

      + +

      # rotate the given object around the given axis on the given angle a + given number times

      + +

      # and multi-translate each rotation result

      + +

      rot2d = geompy.MultiRotate2D(prism, + vrot1d, 60, 4, 50, 5)

      + +

       

      + +

      # add objects in study

      + +

      id_prism = geompy.addToStudy(prism,"Prism")

      + +

      id_rot1d = geompy.addToStudy(rot1d,"Rotation + 1D")

      + +

      id_rot2d = geompy.addToStudy(rot2d,"Rotation + 2D")

      + +

       

      + +

      # display prism and results of fillet operation

      + +

      gg.createAndDisplayGO(id_prism)

      + +

      gg.setDisplayMode(id_prism,1)

      + +

      gg.createAndDisplayGO(id_rot1d)

      + +

      gg.setDisplayMode(id_rot1d,1)

      + +

      gg.createAndDisplayGO(id_rot2d)

      + +

      gg.setDisplayMode(id_rot2d,1) +

      + +

       

      + +

      Fillet

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

      radius  = + 10.

      + +

      ShapeTypeEdge = geompy.ShapeType["EDGE"]

      + +

       

      + +

      # create vertices and vectors

      + +

      p0  = + geompy.MakeVertex(  0., +   0., +   0.)

      + +

      px  = + geompy.MakeVertex(100.,   0., +   0.)

      + +

      py  = + geompy.MakeVertex(  0., + 100.,   0.)

      + +

      pz  = + geompy.MakeVertex(  0., +   0., + 100.)

      + +

      vz  = + geompy.MakeVector(p0, pz)

      + +

      vxy = geompy.MakeVector(px, + py)

      + +

        

      + +

      # create arc

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vxy, + arc])

      + +

       

      + +

      # create planar face

      + +

      face = geompy.MakeFace(wire, + 1)

      + +

       

      + +

      # create prism

      + +

      prism = geompy.MakePrismVecH(face, + vz, 100.0)

      + +

       

      + +

      # get IDList for fillet

      + +

      prism_edges = geompy.SubShapeAllSorted(prism, + ShapeTypeEdge)

      + +

      IDlist_e = []

      + +

      IDlist_e.append(geompy.GetSubShapeID(prism, + prism_edges[0]))

      + +

      IDlist_e.append(geompy.GetSubShapeID(prism, + prism_edges[1]))

      + +

      IDlist_e.append(geompy.GetSubShapeID(prism, + prism_edges[2]))

      + +

       

      + +

      # make fillet on the specified edges of the given shape

      + +

      fillet = geompy.MakeFillet(prism, + radius, ShapeTypeEdge, IDlist_e)

      + +

       

      + +

      # make fillet on all edges of the given shape

      + +

      filletall = geompy.MakeFilletAll(prism, + radius)

      + +

       

      + +

      # add objects in study

      + +

      id_prism = geompy.addToStudy(prism,"Prism")

      + +

      id_fillet = geompy.addToStudy(fillet,"Fillet")

      + +

      id_filletall = geompy.addToStudy(filletall,"Fillet + all")

      + +

       

      + +

      # display prism and results of fillet operation

      + +

      gg.createAndDisplayGO(id_prism)

      + +

      gg.setDisplayMode(id_prism,1)

      + +

      gg.createAndDisplayGO(id_fillet)

      + +

      gg.setDisplayMode(id_fillet,1)

      + +

      gg.createAndDisplayGO(id_filletall)

      + +

      gg.setDisplayMode(id_filletall,1) +

      + +

       

      + +

      Chamfer

      + +

      import geompy

      + +

      import salome

      + +

      gg = salome.ImportComponentGUI("GEOM")

      + +

      d1 = 10.

      + +

      d2 = 10.

      + +

      ShapeTypeFace = geompy.ShapeType["FACE"]

      + +

       

      + +

      # create vertices and vectors

      + +

      p0  = + geompy.MakeVertex(  0., +   0., +   0.)

      + +

      px  = + geompy.MakeVertex(100.,   0., +   0.)

      + +

      py  = + geompy.MakeVertex(  0., + 100.,   0.)

      + +

      pz  = + geompy.MakeVertex(  0., +   0., + 100.)

      + +

      vz  = + geompy.MakeVector(p0, pz)

      + +

      vxy = geompy.MakeVector(px, + py)

      + +

        

      + +

      # create arc

      + +

      arc = geompy.MakeArc(py, + pz, px)

      + +

       

      + +

      # create wire

      + +

      wire = geompy.MakeWire([vxy, + arc])

      + +

       

      + +

      # create planar face

      + +

      face = geompy.MakeFace(wire, + 1)

      + +

       

      + +

      # create prism

      + +

      prism = geompy.MakePrismVecH(face, + vz, 100.0)

      + +

       

      + +

      # get IDList for chamfer

      + +

      prism_faces = geompy.SubShapeAllSorted(prism, + ShapeTypeFace)

      + +

      f_ind_1 = geompy.GetSubShapeID(prism, + prism_faces[0])

      + +

      f_ind_2 = geompy.GetSubShapeID(prism, + prism_faces[1])

      + +

      IDlist_f = [f_ind_1, + f_ind_2]

      + +

       

      + +

      # perform a chamfer on edges, common to the specified faces

      + +

      chamfer_e = geompy.MakeChamferEdge(prism, + d1, d2, f_ind_1, f_ind_2)

      + +

       

      + +

      # perform a chamfer on all edges of the specified faces

      + +

      chamfer_f = geompy.MakeChamferFaces(prism, + d1, d2, IDlist_f)

      + +

      chamfer_f1 = geompy.MakeChamfer(prism, + d1, d2, ShapeTypeFace, IDlist_f)

      + +

       

      + +

      # perform a symmetric chamfer on all edges of the given shape

      + +

      chamfer_all = geompy.MakeChamferAll(prism, + d1)

      + +

       

      + +

      # add objects in study

      + +

      id_prism = geompy.addToStudy(prism,"Prism")

      + +

      id_chamfer_e = geompy.addToStudy(chamfer_e,"Chamfer + edge")

      + +

      id_chamfer_f = geompy.addToStudy(chamfer_f,"Chamfer + faces")

      + +

      id_chamfer_f1 = geompy.addToStudy(chamfer_f1,"Chamfer + faces 1")

      + +

      id_chamfer_all = geompy.addToStudy(chamfer_all,"Chamfer + all")

      + +

       

      + +

      # display prism and results of chamfer operation

      + +

      gg.createAndDisplayGO(id_prism)

      + +

      gg.setDisplayMode(id_prism,1)

      + +

      gg.createAndDisplayGO(id_chamfer_e)

      + +

      gg.setDisplayMode(id_chamfer_e,1)

      + +

      gg.createAndDisplayGO(id_chamfer_f)

      + +

      gg.setDisplayMode(id_chamfer_f,1)

      + +

      gg.createAndDisplayGO(id_chamfer_f1)

      + +

      gg.setDisplayMode(id_chamfer_f1,1)

      + +

      gg.createAndDisplayGO(id_chamfer_all)

      + +

      gg.setDisplayMode(id_chamfer_all,1) +

      + +

       

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/translation.htm b/doc/salome/gui/GEOM/translation.htm new file mode 100755 index 000000000..83cc3bfff --- /dev/null +++ b/doc/salome/gui/GEOM/translation.htm @@ -0,0 +1,187 @@ + + + + + +Translation + + + + + + + + + + + + +

      Translation

      + +

      To produce + a Translation in the Main Menu + select Operations - > Transformation + - > Translation

      + +

       

      + +

      This Operation makes a translation of an Object. To translate a shape you need + to define the base shape and the coordinates of the vector of translation. + Create a copy checkbox allows + to keep the initial object, otherwise it will be removed.

      + +

      The + Result of all operations will be any + GEOM_Object.

      + +

       

      + +

      Firstly you can define an Object + and the vector coordinates along the axes.

      + +

      TUI Command: + geompy.MakeTranslation(Shape, DX, + DY, DZ), where Shape is a shape to be translated, DX, DY, DZ are + components of translation vector.

      + +

      Arguments: + Name + 1 shape + 3 values (coordinates).

      + +

       

      + +

      + +

       

      + +

      Secondly you can define an Object + and the start and the end points of the vector  

      + +

      TUI Command: + geompy.MakeTranslationTwoPoints(Object, + Point1, Point2)

      + +

      Arguments: + Name + 1 shape + 2 vertices

      + +

       

      + +

      + +

       

      + +

      Finally you can define an Object and + the vector  

      + +

      TUI Command: + geompy.MakeTranslationVector(Object, Vector)

      + +

      Arguments: + Name + 1 shape + 1 vector.

      + +

       

      + +

      + +

          

      + +

       

      + +

      Example:

      + +

       

      + +

       

      + +

       

      + +

        Our TUI Scripts + provide you with useful examples of the use of Transformation + Operations.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/turus.htm b/doc/salome/gui/GEOM/turus.htm new file mode 100755 index 000000000..4ee8a4f4b --- /dev/null +++ b/doc/salome/gui/GEOM/turus.htm @@ -0,0 +1,147 @@ + + + + + +Turus + + + + + + + + + + + +

      Torus

      + +

      To create a Torus + in the Main Menu select New Entity - > Primitives - > Torus

      + +

       

      + +

      There are two algorithms for creation of a Torus. +

      + +

      The + Result of each operation will be a + GEOM_Object (SOLID).

      + +

       

      + +

      Firstly, you can define a Torus + by the given Base Point, the normal + Vector and the Major and Minor + Radiuses.

      + +

      TUI Command: geompy.MakeTorus(Point, + Vector, RadiusMajor, RadiusMinor) ,

      + +

      Arguments: + Name + 1 vertex + + 1 vector (for direction) + 2 values (1 & 2 Radius).

      + +

      + +

       

      + +

      Secondly, you can define a Torus with the centre at the origin of coordinates + by its Major and Minor Radiuses. +

      + +

      TUI Command: geompy.MakeTorusRR(RadiusMajor, + RadiusMinor)

      + +

      Arguments: + Name + 2 values (1 & 2 Radius from the origin).

      + +

      + +

       

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Primitives.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/vector.htm b/doc/salome/gui/GEOM/vector.htm new file mode 100755 index 000000000..5a2000660 --- /dev/null +++ b/doc/salome/gui/GEOM/vector.htm @@ -0,0 +1,151 @@ + + + + + +Vector + + + + + + + + + + + +

      Vector

      + +

      To + create a Vector in the Main + Menu select New Entity - > + Basic - > Vector

      + +

       

      + +

      There + are 2 algorithms to create a Circle in + the 3D space.

      + +

      The + Result of each operation will be a + GEOM_Object (edge).

      + +

       

      + +

      Firstly, + you can define a Vector by its + Start and End Points

      + +

      TUI Command:  geompy.MakeVector(Point1, + Point2)

      + +

      Arguments + : Name + 2 vertices.

      + +

       

      + +

      + +

       

      + +

      Secondly, you can define a Vector + starting in the Origin of coordinates + by its End Point.

      + +

      TUI Command: +  geompy.MakeVectorDXDYDZ(DX, + DY, DZ)

      + +

      Arguments + : Name + 3 values

      + +

       

      + +

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Basic + Geometric Objects.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/whdata/whftdata0.htm b/doc/salome/gui/GEOM/whdata/whftdata0.htm new file mode 100755 index 000000000..78a9ccb88 --- /dev/null +++ b/doc/salome/gui/GEOM/whdata/whftdata0.htm @@ -0,0 +1,104 @@ + + + + + + + + + + + diff --git a/doc/salome/gui/GEOM/whdata/whfts.htm b/doc/salome/gui/GEOM/whdata/whfts.htm new file mode 100755 index 000000000..623fb674a --- /dev/null +++ b/doc/salome/gui/GEOM/whdata/whfts.htm @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/doc/salome/gui/GEOM/whdata/whfwdata0.htm b/doc/salome/gui/GEOM/whdata/whfwdata0.htm new file mode 100755 index 000000000..1314a91c3 --- /dev/null +++ b/doc/salome/gui/GEOM/whdata/whfwdata0.htm @@ -0,0 +1,1260 @@ + + + + + + + + + + + diff --git a/doc/salome/gui/GEOM/whdata/whtdata0.htm b/doc/salome/gui/GEOM/whdata/whtdata0.htm new file mode 100755 index 000000000..6da6be60a --- /dev/null +++ b/doc/salome/gui/GEOM/whdata/whtdata0.htm @@ -0,0 +1,110 @@ + + + + + + + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf0.htm b/doc/salome/gui/GEOM/whgdata/whlstf0.htm new file mode 100755 index 000000000..ca47d334b --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf0.htm @@ -0,0 +1,46 @@ + + +Search Words List + + + + + + + +

      + + +100x30x100
      1d 1 2 3 4
      1e 1 2
      1st 1 2 3 4 5 6
      2d 1 2 3 4 5 6 7 8 9 10 11
      2nd 1 2 3 4 5 6
      2st
      3d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      3rd 1 2 3
      3st
      +

      +able
      absolute
      accessible 1 2 3 4 5
      accordance 1 2 3
      according 1 2 3 4 5
      achieve 1 2
      add 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      added 1 2 3
      adding
      addobject 1 2
      addtostudy 1 2 3 4 5 6 7 8 9 10 11 12 13
      addtostudyinfather 1 2
      adjustment
      advance 1 2 3
      advanced 1 2 3 4 5 6 7 8 9
      aimed
      algorithm 1 2 3
      algorithms 1 2 3 4 5 6 7 8 9 10 11
      all_faces
      allowing 1 2
      allows 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      along 1 2 3 4 5 6 7 8 9 10
      alongside
      already
      angle 1 2 3 4 5 6 7 8 9 10
      another 1 2 3 4 5 6
      any 1 2 3 4 5 6
      append 1 2
      applicable 1 2
      applied 1 2
      apply 1 2 3 4
      applying 1 2
      approximation 1 2
      arc 1 2 3 4 5 6 7 8 9
      arc1
      arc2
      archimede 1 2 3
      arcs 1 2
      area
      argument 1 2 3
      arguments 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
      around 1 2 3 4
      associated
      attributes
      automatically 1 2 3
      available 1 2 3 4 5 6 7 8 9 10
      axes 1 2 3 4
      axis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      +

      +b 1 2
      background
      base 1 2 3 4 5 6 7 8 9 10
      based 1 2
      baseshape 1 2
      basic 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
      basicproperties 1 2
      basing 1 2 3
      basis 1 2
      bb


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf1.htm b/doc/salome/gui/GEOM/whgdata/whlstf1.htm new file mode 100755 index 000000000..be0246f51 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf1.htm @@ -0,0 +1,43 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +before 1 2 3 4
      beginning
      being
      below
      besier
      bezier 1 2 3 4 5
      block 1 2 3 4 5 6
      blocks 1 2 3 4 5 6 7 8 9 10
      boolean 1 2 3 4 5 6 7 8 9
      both 1 2 3 4
      boudaries
      boundaries 1 2 3 4 5
      boundary 1 2 3 4
      bounded 1 2
      bounding 1 2
      boundingbox 1 2
      box 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
      box_tr1
      box_tr2
      box1 1 2 3
      box2 1 2 3
      box3
      boxes 1 2 3
      breaks 1 2
      brep 1 2 3
      browser 1 2 3 4 5 6 7
      bspline 1 2
      bsplinerestriction 1 2
      bsplines 1 2
      build 1 2 3 4 5 6 7 8 9 10 11
      building 1 2 3 4 5
      builds 1 2 3 4
      button 1 2 3 4 5 6
      bypassing
      +

      +c 1 2
      cad
      camera 1 2
      case 1 2 3 4 5 6
      cases
      center 1 2 3 4 5 6 7 8 9 10 11
      centerofscale 1 2
      centers
      central 1 2 3 4
      centre 1 2
      chain
      chamfer 1 2 3
      chamfer_all
      chamfer_e
      chamfer_f
      chamfer_f1
      change
      changes
      changing 1 2
      check 1 2 3 4 5 6 7 8
      check_box
      checkandimprove
      checkbox 1 2 3 4 5 6 7 8
      checkcompoundofblocks 1 2
      checked 1 2 3 4 5
      checking 1 2 3 4 5
      checks
      checkshape 1 2 3
      choices
      choose 1 2 3 4
      circle 1 2 3 4
      circle1
      circle2
      circles 1 2
      click 1 2 3
      close 1 2 3
      closecontour 1 2 3
      closed 1 2 3 4 5 6
      closedwires 1 2 3
      closes 1 2
      closure 1 2
      cm
      coincident 1 2
      collinear 1 2
      color 1 2
      command 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
      commands 1 2 3 4 5 6 7 8 9
      common 1 2 3 4 5 6
      complex 1 2 3 4 5 6 7 8 9
      components 1 2 3 4 5 6 7 8
      composed
      composing
      compound 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
      compsolid 1 2 3 4
      compsolids
      compute 1 2
      computed
      concerning
      conditions
      cone 1 2 3 4
      cone1
      cone2
      cones
      confirm
      conical 1 2
      connected 1 2 3 4 5 6 7
      connection
      consequently
      considered 1 2 3 4
      console
      constraints
      construct
      constructed 1 2 3
      constructing
      construction 1 2 3 4
      constructor 1 2 3 4 5 6
      contain 1 2
      contained 1 2 3
      contains 1 2 3
      contents 1 2
      continuities 1 2
      continuity 1 2
      continuity2d 1 2
      continuity3d 1 2
      contour 1 2 3
      conversion 1 2
      coordinate 1 2 3 4 5 6 7 8 9 10 11
      coordinates 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      coords
      copy 1 2 3 4 5
      corners 1 2 3
      correction 1 2
      correspond 1 2 3
      corresponding 1 2 3 4 5
      correspondingly 1 2 3 4 5 6 7
      count
      coupled
      covering


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf10.htm b/doc/salome/gui/GEOM/whgdata/whlstf10.htm new file mode 100755 index 000000000..ef28b5370 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf10.htm @@ -0,0 +1,47 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +pz 1 2 3 4 5 6
      +

      +qface1
      qface2
      qface3
      qface4
      qface5
      qface6
      qface7
      qface8
      quadrangle 1 2 3 4 5
      +

      +r 1 2 3
      radians 1 2
      radius 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      radius1 1 2 3 4 5 6
      radius2 1 2 3
      radius3
      radiuses 1 2 3 4 5 6
      radiusmajor 1 2 3 4
      radiusminor 1 2 3 4
      raise 1 2
      range 1 2 3 4
      re 1 2
      reasonable
      reconstruction 1 2
      reference 1 2 3
      regarding 1 2
      relative
      relatively
      remove 1 2 3 4 5
      removed 1 2 3 4 5 6 7 8 9 10 11
      removeobject 1 2
      removes 1 2 3
      removewebs 1 2
      removing 1 2 3
      repair 1 2 3 4 5 6 7 8 9 10 11
      repairing 1 2 3 4 5 6 7 8 9 10 11 12 13
      repetition 1 2 3
      repetitions 1 2
      representing 1 2
      requested
      required 1 2 3 4
      requireddegree 1 2
      requirednbsegments 1 2
      res
      respect 1 2 3
      restriction 1 2
      result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
      resultant 1 2
      resulting 1 2 3 4 5 6 7
      results 1 2 3 4 5 6
      retrieved
      retrieves 1 2
      return
      returned 1 2 3
      returning
      returns 1 2 3 4 5 6 7 8
      reverse 1 2 3
      revolution 1 2 3 4 5
      right 1 2
      rot1d
      rot2d
      rotate 1 2 3
      rotated 1 2 3 4 5
      rotates 1 2 3
      rotation 1 2 3 4 5
      runtimeerror 1 2
      +

      +s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
      s1 1 2 3
      s2 1 2 3
      salome 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      same 1 2 3 4 5
      sameparameter 1 2
      satisfy
      scale 1 2 3
      scaled 1 2
      scripts 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf11.htm b/doc/salome/gui/GEOM/whgdata/whlstf11.htm new file mode 100755 index 000000000..aa8fe657c --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf11.htm @@ -0,0 +1,41 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +search
      second 1 2 3 4 5 6 7 8 9
      secondly 1 2 3 4 5 6 7 8 9 10 11 12
      section 1 2 3 4 5
      see 1 2
      seems
      segment
      segments 1 2 3
      select 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
      selected 1 2 3 4 5 6 7 8 9
      selecting
      selection 1 2 3 4 5 6
      sense 1 2
      separate
      serve 1 2
      serving 1 2 3 4
      set 1 2 3 4 5 6 7 8 9
      setcolor 1 2
      setdisplaymode 1 2 3 4 5 6 7 8 9 10 11 12 13
      sets
      setting 1 2 3 4 5
      settransparency 1 2 3 4 5
      sew 1 2
      sewed 1 2
      sewing 1 2 3
      sg 1 2 3 4
      shading
      shape 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
      shape1 1 2
      shape2 1 2
      shapelistcompound
      shapes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      shapes_of_given_type
      shapesto 1 2
      shapetype 1 2 3 4 5 6 7
      shapetypeedge
      shapetypeface
      shared 1 2
      shell 1 2 3 4 5 6 7 8 9 10 11
      shells 1 2 3 4 5 6 7 8 9
      shift 1 2
      short
      shortcut
      should 1 2 3 4 5 6
      show
      shown 1 2
      side 1 2
      signed 1 2
      similar
      simple 1 2 3
      single
      six 1 2
      size 1 2 3 4 5 6
      sketch
      sketcher 1 2 3
      sketcher1 1 2
      sketcher2 1 2
      sketcher3
      sketchers
      small 1 2 3 4
      so
      solid 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      solid1
      solid2
      solids 1 2 3 4
      soon 1 2
      sorted
      sorts
      source
      space 1 2 3 4 5 6 7
      specific
      specified 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      specifies 1 2
      specify 1 2
      specifying 1 2
      sphere 1 2 3 4 5 6 7
      sphere1
      sphere2
      sphere3
      spheres
      spline 1 2
      splitangle 1 2
      splitclosedfaces 1 2
      splitcontinuity 1 2
      splits 1 2
      splitting 1 2
      spot 1 2


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf12.htm b/doc/salome/gui/GEOM/whgdata/whlstf12.htm new file mode 100755 index 000000000..08b7291d9 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf12.htm @@ -0,0 +1,43 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +sqrt
      stage
      standard
      start 1 2 3
      started
      starting 1 2 3 4 5 6
      step 1 2 3 4 5
      step1 1 2
      step2 1 2
      string
      strip 1 2
      study 1 2 3 4 5 6 7 8 9 10 11 12
      sub 1 2 3 4 5 6
      sub_shape_id
      subfacelist
      submenu 1 2 3 4
      subshape 1 2 3 4
      subshapeall 1 2
      subshapeallids
      subshapeallsorted 1 2 3 4 5
      subshapeallsortedids
      subshapeid
      subshapes 1 2 3
      subshapesorted
      successfully
      sup_faces
      suppress 1 2 3 4 5
      suppresses 1 2
      suppressfaces 1 2 3
      suppressholes 1 2 3
      suppressinternalwires 1 2 3
      surface 1 2 3 4 5 6 7
      surfacecontinuity 1 2
      surfacemode 1 2
      surfaces 1 2
      symmetric
      symmetrical 1 2 3
      symmetry 1 2 3
      system 1 2 3 4 5 6 7 8 9
      systems
      +

      +t 1 2 3
      tangent
      target 1 2 3
      tetrahedral
      textual 1 2
      theendlcs 1 2
      them 1 2 3 4 5 6
      theobject 1 2
      therefore
      theshape 1 2 3
      thestartlcs 1 2
      thetolerance 1 2
      third
      three 1 2 3 4 5 6 7 8 9 10 11 12
      time 1 2
      times 1 2 3 4
      tmp
      tobezier 1 2
      toggle
      tol2d 1 2 3
      tol3d 1 2 3
      toler
      tolerance 1 2 3 4 5 6 7 8
      tolerance2d 1 2
      tolerance3d 1 2 3
      tolerances
      tool
      tools 1 2
      top_face
      top_face_ind
      torus 1 2 3 4
      torus1
      torus2
      toruses
      tr1d
      tr2d
      transform 1 2 3
      transformate
      transformation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      transformations 1 2 3
      transformed 1 2 3
      transforms
      translate 1 2
      translated 1 2 3
      translates 1 2
      translation 1 2 3 4 5 6
      translation1
      translation2
      translation3
      translations 1 2 3 4 5
      transparency 1 2
      trihedron 1 2
      trimsize 1 2 3 4
      true 1 2 3 4 5 6 7
      truncated
      try
      tt 1 2


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf13.htm b/doc/salome/gui/GEOM/whgdata/whlstf13.htm new file mode 100755 index 000000000..adef489a6 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf13.htm @@ -0,0 +1,45 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +tui 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
      tuple
      two 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
      type 1 2 3 4 5 6 7 8 9
      typeofshape
      types 1 2 3 4 5
      +

      +underlying 1 2
      unionlist
      up 1 2 3
      updated 1 2
      updateobjbrowser 1 2 3
      upper 1 2
      used 1 2 3 4 5
      useful 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
      user 1 2 3 4 5 6 7 8
      using 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      +

      +v 1 2 3 4
      v1
      v2
      v3
      v4
      val 1 2
      valid 1 2 3
      validity
      value 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      values 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      variety
      various 1 2
      vector 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
      vector_arc 1 2
      vector1 1 2
      vector1_arc1
      vector1_arc2
      vector2 1 2
      vector2_arc1
      vector2_arc2
      vector3
      vectors 1 2 3 4 5 6 7 8
      vertex 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
      vertex_n
      vertex1 1 2
      vertex2 1 2
      vertexmaxtol
      vertexmintol
      vertices 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
      via 1 2 3 4 5 6 7 8
      view
      viewer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      viewers
      visibility
      visualization 1 2


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf14.htm b/doc/salome/gui/GEOM/whgdata/whlstf14.htm new file mode 100755 index 000000000..8299f3652 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf14.htm @@ -0,0 +1,48 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +volume 1 2
      vr
      vrot1d
      vt
      vtk
      vtr1d
      vtr2d
      vx
      vxy 1 2 3 4 5
      vxyz
      vz
      +

      +w_0
      wantplanarface 1 2
      water 1 2
      waterdensity 1 2 3
      way 1 2 3 4 5
      ways 1 2
      weight 1 2 3
      wf
      what
      whatis 1 2
      whether
      while 1 2 3 4
      whose 1 2 3
      wide
      will 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
      wire 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      wire_close
      wire_name
      wire1
      wire2
      wireframe
      wires 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      wish 1 2
      within 1 2 3
      without
      work 1 2 3
      working 1 2 3 4
      workingplane
      works
      ww 1 2
      +

      +x 1 2 3 4 5 6 7 8 9
      x1 1 2
      x2 1 2
      xdx 1 2
      xdy 1 2
      xdz 1 2
      xmax 1 2
      xmin 1 2
      xoy
      xyz 1 2
      xz_face
      xz_face_ind
      +

      +y 1 2 3 4 5 6 7 8 9
      y1 1 2
      y2 1 2
      ydx 1 2
      ydy 1 2
      ydz 1 2
      ymax 1 2
      ymin 1 2
      your 1 2 3 4 5 6 7 8
      yz_face
      yz_face_ind
      +

      +z 1 2 3 4 5 6 7 8 9
      z1 1 2
      z2 1 2
      zero
      zmax 1 2
      zmin 1 2


      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf2.htm b/doc/salome/gui/GEOM/whgdata/whlstf2.htm new file mode 100755 index 000000000..3f41ccc7f --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf2.htm @@ -0,0 +1,43 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +create 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
      createanddisplaygo 1 2 3 4 5 6 7 8 9 10 11 12 13
      created 1 2 3 4 5 6 7 8 9 10 11
      creategroup 1 2
      creates 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      creating
      creation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
      cs1
      cs2
      current 1 2
      currently 1 2 3 4
      curve 1 2 3 4 5 6
      curve2dmode 1 2
      curve3dmode 1 2
      curvecontinuity 1 2
      curves 1 2 3 4 5 6 7
      curving 1 2
      cut 1 2 3 4
      cut_without_f_2
      cuts 1 2
      cutting 1 2 3 4
      cylinder 1 2 3 4 5 6 7
      cylinders
      cylindrical 1 2
      +

      +d 1 2
      d1 1 2 3
      d2 1 2 3
      data
      default 1 2 3
      define 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
      defined 1 2
      defines 1 2 3
      defining 1 2 3 4 5 6 7
      definite 1 2 3
      definition 1 2 3 4
      deflection 1 2
      degenerated
      degree 1 2 3 4
      degrees 1 2
      deleted 1 2
      density 1 2
      depending 1 2
      descr
      description 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      desired 1 2
      destination
      destined
      detect 1 2 3
      detection 1 2
      detects 1 2
      diagonal
      dialog 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
      differ
      differencelist
      different 1 2 3 4 5
      dimension 1 2 3 4 5
      dimensions 1 2 3 4 5 6
      dimentions
      dir 1 2 3
      dir1 1 2
      dir2 1 2
      direction 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      directions 1 2 3 4
      dirface1v 1 2
      dirfaceid1 1 2
      dirfaceid1u 1 2
      dirfaceid1v 1 2
      dirfaceid2 1 2
      dirfaceid2u 1 2
      dirfaceid2v 1 2
      display 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      displayall
      displayed 1 2 3 4 5
      displaying 1 2 3
      displayonly
      displays 1 2
      distance 1 2 3 4 5 6
      divide
      divided 1 2 3
      divideedge 1 2 3
      dividing 1 2


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf3.htm b/doc/salome/gui/GEOM/whgdata/whlstf3.htm new file mode 100755 index 000000000..1a72bd4a9 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf3.htm @@ -0,0 +1,45 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +don 1 2 3
      done 1 2 3 4
      double 1 2 3 4
      doubles
      dropsmalledges 1 2
      dx 1 2 3 4 5 6
      dy 1 2 3 4 5 6
      dz 1 2 3 4 5
      +

      +e
      e1
      e2
      e3
      e4
      easier
      edge 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
      edge_ind
      edge_points
      edge1
      edge2
      edge3
      edge4
      edgeid 1 2
      edges 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      edit
      editing
      egdemaxtol
      egdemintol
      either
      element 1 2 3 4 5 6
      elementary
      elements 1 2 3 4 5 6 7
      ellipse 1 2 3
      else 1 2
      empty 1 2 3
      encountered
      end 1 2 3 4 5 6 7 8 9 10
      ending 1 2
      ends 1 2 3
      enter 1 2 3
      entire
      entity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
      equal 1 2
      erase
      eraseall
      eraseonly
      erases
      error 1 2
      errors 1 2
      etc 1 2 3 4
      example 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
      examples 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
      except 1 2
      existing 1 2 3
      explode 1 2 3 4 5 6 7
      exploded 1 2 3 4
      explodes
      export 1 2
      exportation
      exported
      exporting
      extra
      extracted 1 2
      extruded 1 2 3
      extrusion 1 2
      +

      +f 1 2
      f_2
      f_ind_1
      f_ind_2
      f1
      f1_id
      f2
      f3
      f4
      f5
      f6


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf4.htm b/doc/salome/gui/GEOM/whgdata/whlstf4.htm new file mode 100755 index 000000000..586a5d2af --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf4.htm @@ -0,0 +1,43 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +face 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
      face_name
      face_rot
      face1 1 2 3 4
      face2 1 2 3 4
      face3
      faceid
      facemaxtol
      facemintol
      faces 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
      factor 1 2 3
      failed 1 2
      false 1 2
      fields 1 2
      file
      files
      fill 1 2 3
      filled 1 2
      fillet 1 2 3 4
      filletall
      fillets 1 2
      filling 1 2 3
      finally 1 2 3 4 5
      first 1 2 3 4 5 6 7 8 9 10 11 12
      firstly 1 2 3 4 5 6 7 8 9 10 11 12
      fix 1 2
      fixfacesize 1 2
      fixing 1 2
      fixshape 1 2 3
      flag
      flight_solid
      following 1 2 3 4 5 6
      format
      formats
      four 1 2
      free 1 2 3 4 5 6
      functionalities
      functionality 1 2
      functions 1 2 3
      fuse 1 2 3 4
      fuse_id
      +

      +gap 1 2
      general 1 2
      generate 1 2 3
      generating
      generation 1 2 3 4 5 6
      geom 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
      geom_object 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
      geom_objects 1 2 3 4 5 6
      geometric 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
      geometrical 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
      geometry 1 2 3
      geompy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
      get 1 2 3 4 5
      getfacenearpoint
      getfreeboundary 1 2 3
      getfreefacesids 1 2 3
      getobjectids
      getsubshape
      getsubshapeid 1 2 3 4
      getsubshapeindex
      getting


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf5.htm b/doc/salome/gui/GEOM/whgdata/whlstf5.htm new file mode 100755 index 000000000..efc03df5c --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf5.htm @@ -0,0 +1,45 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +gg 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      give
      given 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
      gives
      giving 1 2 3
      glue 1 2 3 4 5 6 7
      glued 1 2 3
      glues 1 2
      graphic
      gravity 1 2 3 4
      group 1 2 3 4
      group1
      groups 1 2 3 4 5
      gui
      +

      +half
      handling
      having 1 2 3 4
      height 1 2 3 4 5 6 7 8
      hexagonal
      hexahedral 1 2 3 4
      hexahedron
      hide
      hiding
      highlight
      highlights 1 2
      holding
      hole
      holes 1 2 3
      how
      +

      +i 1 2 3 4
      i11
      i12
      i13
      i21
      i22
      i23
      i31
      i32
      i33
      id 1 2 3 4 5 6 7 8 9 10 11 12
      id_arc
      id_archimede
      id_axis
      id_bezier
      id_box 1 2 3 4
      id_box_tr1
      id_box_tr2
      id_box1
      id_box2
      id_box3
      id_chamfer_all
      id_chamfer_e
      id_chamfer_f
      id_chamfer_f1
      id_circle1
      id_circle2
      id_common
      id_compound 1 2
      id_cone1
      id_cone2
      id_cs1
      id_cs2
      id_cut 1 2
      id_cut_without_f_2
      id_cylinder 1 2
      id_divide
      id_edge 1 2 3
      id_edge1
      id_edge2
      id_edge3
      id_edge4
      id_ellipse
      id_face 1 2 3
      id_face_rot
      id_face1 1 2
      id_face2 1 2
      id_face3
      id_fillet
      id_filletall
      id_filling
      id_fuse
      id_group1
      id_importbrep
      id_interpol
      id_line1
      id_line2
      id_make_block_explode
      id_mirror1
      id_mirror2
      id_mirror3
      id_offset
      id_p_on_arc
      id_p0
      id_p1 1 2
      id_p100
      id_p2 1 2
      id_p3 1 2
      id_p4 1 2 3
      id_partition1
      id_partition2
      id_partition3
      id_pipe
      id_plane 1 2
      id_plane1
      id_plane2
      id_plane3
      id_polyline
      id_position
      id_prism
      id_prism1
      id_prism2
      id_ps
      id_px
      id_py
      id_pz
      id_qface1
      id_qface2
      id_qface3
      id_result
      id_revolution
      id_rot1d
      id_rot2d
      id_rotation
      id_scale
      id_section
      id_sewing
      id_shape
      id_shell
      id_sketcher1
      id_sketcher2
      id_solid
      id_solid1
      id_solid2
      id_sphere
      id_sphere1
      id_sphere2
      id_sphere3
      id_torus1
      id_torus2
      id_tr1d
      id_tr2d
      id_translation1
      id_translation2
      id_translation3
      id_vector
      id_vector1
      id_vector2
      id_vector3
      id_vr
      id_vxy
      id_wire 1 2 3
      id_wire_close
      idlist 1 2
      idlist_e
      idlist_f
      ids 1 2 3 4 5 6


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf6.htm b/doc/salome/gui/GEOM/whgdata/whlstf6.htm new file mode 100755 index 000000000..0b91256d6 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf6.htm @@ -0,0 +1,49 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      iges 1 2
      image 1 2 3
      import 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      importation
      importbrep
      importcomponentgui 1 2 3 4 5 6 7 8 9 10 11 12 13 14
      imported 1 2 3 4
      importing
      impossible
      improve
      included
      increased 1 2
      independent
      independently
      index
      indexes
      indicate
      indicating
      indices 1 2 3 4
      inertia 1 2
      informs
      initial 1 2 3 4 5 6 7
      inner 1 2
      inquired
      inretia
      inserted 1 2
      inside 1 2
      instead
      integer 1 2 3
      integers 1 2
      intended 1 2
      interactively 1 2
      intermediate
      internal 1 2 3
      interpol
      interpolated
      interpolation
      intersect 1 2
      intersected 1 2
      intersection 1 2
      introduction 1 2
      invalid 1 2 3 4
      investigated
      ion
      isbyparameter 1 2
      iscommonvertex 1 2
      isolines
      isos
      isplanarface
      isplanarwanted 1 2 3 4
      issuccess
      isvalid 1 2
      iterations 1 2
      itself 1 2
      ix 1 2
      iy 1 2
      iz 1 2
      +

      +just
      +

      +keep 1 2 3 4 5
      ko
      +

      +l 1 2
      last 1 2 3
      lcs 1 2
      least 1 2
      len
      length 1 2 3 4 5
      less 1 2
      lie 1 2
      limit 1 2
      line 1 2 3 4 5 6
      line1
      line2
      linear
      lines
      list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
      listchains
      listoffaceid 1 2
      listofgeomshapes 1 2
      listofid 1 2 3
      listofind
      listofkeepinside 1 2
      listofmaterials 1 2
      listofremoveinside 1 2
      listofshape 1 2 3 4 5 6 7 8 9
      listofshapeid
      listofshapes 1 2 3 4
      listoftools 1 2
      listofwireid 1 2
      listshapes
      local 1 2 3 4 5 6
      localop
      located 1 2 3
      location 1 2 3 4 5 6
      lying 1 2 3
      +

      +main 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
      mainshape
      major 1 2 3 4
      make 1 2 3 4 5 6 7
      make_block_explode
      makearc 1 2 3 4 5 6 7 8
      makebezier 1 2 3
      makeblockexplode 1 2 3
      makeboolean 1 2
      makebox 1 2 3 4 5 6 7
      makeboxdxdydz 1 2 3 4 5 6
      makeboxtwopnt 1 2 3 4
      makecdg 1 2
      makechamfer
      makechamferall 1 2
      makechamferedge 1 2 3
      makechamferface 1 2
      makechamferfaces
      makecircle 1 2 3
      makecirclethreepnt 1 2
      makecommon 1 2
      makecompound 1 2 3 4 5 6
      makecone 1 2 3 4
      makeconer1r2h 1 2
      makecut 1 2
      makecylinder 1 2 3 4 5
      makecylinderrh
      makeedge 1 2 3 4 5 6
      makeellipse 1 2 3
      makeface 1 2 3 4 5 6 7 8
      makefaces 1 2
      makefacewires 1 2
      makefillet 1 2 3
      makefilletall 1 2
      makefilling 1 2 3
      makefuse 1 2
      makegluefaces 1 2 3
      makehalfpartition 1 2
      makehexa
      makehexa2faces
      makehexasolid
      makehexasolidtwofaces
      makeinterpol 1 2 3
      makeline 1 2 3
      makelinetwopnt
      makemarker 1 2 3
      makemirrorbyaxis 1 2
      makemirrorbyplane 1 2 3
      makemirrorbypoint 1 2
      makemultirotation1d 1 2
      makemultirotation2d 1 2
      makemultitransformation1d 1 2 3
      makemultitransformation2d 1 2 3
      makemultitranslation1d 1 2 3
      makemultitranslation2d 1 2 3
      makeoffset 1 2 3
      makepartition 1 2 3
      makepipe 1 2 3
      makeplane 1 2 3 4
      makeplaneface 1 2
      makeplanethreepnt 1 2 3
      makepolyline 1 2 3
      makeposition 1 2 3
      makeprism 1 2 3 4
      makeprismvech 1 2 3 4
      makequad
      makequad2edges
      makequad4vertices
      makequadface
      makequadfaceedges
      makequadfacevertices
      makerevolution 1 2 3
      makerotation 1 2 3 4
      makes 1 2 3 4 5 6 7
      makescaletransform 1 2 3
      makesection 1 2
      makesewing 1 2 3
      makeshell 1 2 3
      makesketcher 1 2 3
      makesketcheronplane
      makesolid 1 2 3
      makesphere 1 2 3 4
      makespherepntr
      makespherer 1 2 3 4
      maketorus 1 2 3
      maketorusrr 1 2
      maketranslation 1 2 3 4
      maketranslationtwopoints 1 2
      maketranslationvector 1 2
      makevector 1 2 3 4 5 6 7 8 9 10
      makevectordxdydz 1 2 3 4
      makevertex 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      makevertexoncurve 1 2 3
      makevertexwithref 1 2 3
      makewire 1 2 3 4 5 6 7 8
      manually
      mass
      masses
      materials 1 2
      math 1 2 3
      matrix 1 2
      max 1 2 3 4 5 6 7
      maxdeg
      maxdegree 1 2
      maximal 1 2 3 4 5 6
      maximum 1 2 3 4 5 6
      maxnbfaces 1 2
      maxtolerance 1 2
      maxtolerance3d 1 2


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf7.htm b/doc/salome/gui/GEOM/whgdata/whlstf7.htm new file mode 100755 index 000000000..5041cd26b --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf7.htm @@ -0,0 +1,43 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +meaning 1 2
      means 1 2
      measurement 1 2
      measures
      mentioned
      menu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
      merging 1 2
      mesh 1 2
      meshing 1 2 3
      meshingdeflection 1 2 3
      method
      middle 1 2 3
      min 1 2 3 4 5 6
      min_dist
      mindeg
      mindegree 1 2
      mindistance 1 2
      minimal 1 2 3 4 5 6
      minimum 1 2 3
      minnbfaces 1 2
      minor 1 2 3 4
      mirror 1 2 3
      mirror1
      mirror2
      mirror3
      mirrored 1 2
      mode 1 2 3 4 5 6
      modeled 1 2
      models
      modes 1 2
      modification 1 2
      modified 1 2
      modifies 1 2 3 4 5
      modify 1 2 3
      module 1 2
      moment
      moments 1 2
      move 1 2
      moved 1 2
      much
      multi 1 2 3 4 5 6 7 8
      multirotate1d
      multirotate2d
      multitude 1 2
      must 1 2 3 4 5 6 7
      +

      +name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
      names 1 2
      nb 1 2 3 4
      nb_sub
      nbiter 1 2 3
      nbounding
      nbox
      nbsplitpoints 1 2
      nbtimes 1 2 3 4 5
      nbtimes1 1 2 3
      nbtimes2 1 2 3
      nbtimesu 1 2
      nbtimesv 1 2
      ncentre
      ncompound
      necessary 1 2 3 4 5 6 7
      need 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      needed 1 2
      negative 1 2
      neigbour 1 2
      new 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
      ninertia
      nminimal
      nodes 1 2
      noerror 1 2
      none
      normal 1 2 3 4 5 6 7 8 9 10
      note
      nothing
      notions


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf8.htm b/doc/salome/gui/GEOM/whgdata/whlstf8.htm new file mode 100755 index 000000000..0c9caac68 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf8.htm @@ -0,0 +1,45 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +number 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      numbers 1 2
      numeber
      +

      +object 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
      objects 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
      obtain
      obtained
      occ 1 2 3 4 5 6 7 8 9
      occurred 1 2
      offers
      offset 1 2 3
      ok 1 2 3 4 5
      old
      one 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      ones 1 2
      open 1 2 3 4
      openwires 1 2 3
      operation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
      operations 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
      operator 1 2
      operators 1 2 3
      opposite 1 2
      optimization
      options
      order 1 2 3
      oriented 1 2 3
      origin 1 2 3 4 5 6 7 8 9
      otherwise 1 2 3 4 5 6 7 8
      our 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
      outside 1 2
      ox 1 2 3
      oy 1 2
      oz 1 2 3 4 5
      +

      +p
      p_25_25_50
      p_25_50_25
      p_50_25_25
      p_on_arc
      p0 1 2 3 4 5 6 7 8
      p1 1 2 3 4 5 6 7 8
      p10
      p100
      p11
      p12
      p13
      p2 1 2 3 4 5 6 7 8
      p200 1 2
      p3 1 2 3 4 5 6
      p4 1 2 3 4
      p5 1 2 3 4
      p50
      p6 1 2
      p7 1 2
      p70
      p8 1 2
      p9


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstf9.htm b/doc/salome/gui/GEOM/whgdata/whlstf9.htm new file mode 100755 index 000000000..326431a52 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstf9.htm @@ -0,0 +1,41 @@ + + +Search Words List + + + + + + + +

      <<

      +

      +parallel 1 2
      parameter 1 2 3 4 5 6 7 8
      parameters 1 2 3 4 5 6 7 8 9 10 11
      paramter 1 2
      part 1 2 3
      partition 1 2 3
      partition1
      partition2
      partition3
      passed
      passes 1 2 3 4 5
      passing
      path 1 2 3
      pathshape 1 2
      pattern
      perform 1 2 3 4 5
      performed 1 2
      perpendicular
      pi 1 2 3
      pipe 1 2 3
      planar 1 2 3 4 5 6 7
      plane 1 2 3 4 5 6 7 8 9 10 11 12
      plane1
      plane2
      plane3
      planes
      platform
      plunged 1 2
      point 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
      point1 1 2 3 4 5 6 7 8 9 10 11 12
      point2 1 2 3 4 5 6 7 8 9 10 11 12
      point3 1 2 3 4 5 6
      point4 1 2
      point5
      pointcoordinates 1 2
      points 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
      polyline 1 2 3
      pop 1 2
      position 1 2 3 4 5 6
      possibilities
      possibility 1 2
      possible 1 2 3 4 5 6 7 8
      precision 1 2 3
      predefined
      preferences
      presses 1 2
      preview 1 2
      previous
      primitive
      primitives 1 2 3 4 5 6 7 8
      print 1 2
      printed
      prism 1 2 3 4 5 6
      prism_edges
      prism_faces 1 2
      prism1
      prism2
      prisms 1 2
      problems 1 2
      process
      processed 1 2 3 4 5 6
      processes 1 2
      processing 1 2 3
      processshape 1 2 3
      produce 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
      project
      projection
      projections
      propagate 1 2 3
      propagation 1 2 3
      properties 1 2 3
      props
      provide 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
      ps
      put 1 2
      px 1 2 3 4 5
      pxy
      pxyz 1 2 3
      py 1 2 3 4 5
      py1
      python


      >> + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl0.htm b/doc/salome/gui/GEOM/whgdata/whlstfl0.htm new file mode 100755 index 000000000..db5af94cf --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl0.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ { {D {E {S {D {N {S {D {R {S ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl10.htm b/doc/salome/gui/GEOM/whgdata/whlstfl10.htm new file mode 100755 index 000000000..826e1f2fe --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl10.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ KE KO ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl11.htm b/doc/salome/gui/GEOM/whgdata/whlstfl11.htm new file mode 100755 index 000000000..b5a4de155 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl11.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ L LA LC LE LI LO LY ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl12.htm b/doc/salome/gui/GEOM/whgdata/whlstfl12.htm new file mode 100755 index 000000000..921dbda8d --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl12.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ MA ME MI MO MU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl13.htm b/doc/salome/gui/GEOM/whgdata/whlstfl13.htm new file mode 100755 index 000000000..266fc86f0 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl13.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ NA NB NC NE NI NM NO NU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl14.htm b/doc/salome/gui/GEOM/whgdata/whlstfl14.htm new file mode 100755 index 000000000..d573df409 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl14.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ OB OC OF OK OL ON OP OR OT OU OX OY OZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl15.htm b/doc/salome/gui/GEOM/whgdata/whlstfl15.htm new file mode 100755 index 000000000..72acab74e --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl15.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ P PA PE PI PL PO PR PS PU PX PY PZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl16.htm b/doc/salome/gui/GEOM/whgdata/whlstfl16.htm new file mode 100755 index 000000000..f3621cd7b --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl16.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ QF QU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl17.htm b/doc/salome/gui/GEOM/whgdata/whlstfl17.htm new file mode 100755 index 000000000..d2273c9ff --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl17.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ R RA RE RI RO RU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl18.htm b/doc/salome/gui/GEOM/whgdata/whlstfl18.htm new file mode 100755 index 000000000..c87aafa9f --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl18.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ S SA SC SE SG SH SI SK SM SO SP SQ ST SU SY ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl19.htm b/doc/salome/gui/GEOM/whgdata/whlstfl19.htm new file mode 100755 index 000000000..39b862d1f --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl19.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ T TA TE TH TI TM TO TR TT TU TW TY ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl2.htm b/doc/salome/gui/GEOM/whgdata/whlstfl2.htm new file mode 100755 index 000000000..576c9d705 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl2.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ B BA BB BE BL BO BR BS BU BY ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl20.htm b/doc/salome/gui/GEOM/whgdata/whlstfl20.htm new file mode 100755 index 000000000..e7ed85f1e --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl20.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ UN UP US ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl21.htm b/doc/salome/gui/GEOM/whgdata/whlstfl21.htm new file mode 100755 index 000000000..ebc9e5cdf --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl21.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ V VA VE VI VO VR VT VX VZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl22.htm b/doc/salome/gui/GEOM/whgdata/whlstfl22.htm new file mode 100755 index 000000000..644108be7 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl22.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ W WA WE WF WH WI WO WW ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl23.htm b/doc/salome/gui/GEOM/whgdata/whlstfl23.htm new file mode 100755 index 000000000..e911e965e --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl23.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ X XD XM XO XY XZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl24.htm b/doc/salome/gui/GEOM/whgdata/whlstfl24.htm new file mode 100755 index 000000000..a7d1b67b9 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl24.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ Y YD YM YO YZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl25.htm b/doc/salome/gui/GEOM/whgdata/whlstfl25.htm new file mode 100755 index 000000000..bb8bdb60c --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl25.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ Z ZE ZM ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl3.htm b/doc/salome/gui/GEOM/whgdata/whlstfl3.htm new file mode 100755 index 000000000..0eaa79900 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl3.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ C CA CE CH CI CL CM CO CR CS CU CY ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl4.htm b/doc/salome/gui/GEOM/whgdata/whlstfl4.htm new file mode 100755 index 000000000..14d3e4533 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl4.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ D DA DE DI DO DR DX DY DZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl5.htm b/doc/salome/gui/GEOM/whgdata/whlstfl5.htm new file mode 100755 index 000000000..c7b1ee66e --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl5.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ E EA ED EG EI EL EM EN EQ ER ET EX ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl6.htm b/doc/salome/gui/GEOM/whgdata/whlstfl6.htm new file mode 100755 index 000000000..9959aea31 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl6.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ F FA FI FL FO FR FU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl7.htm b/doc/salome/gui/GEOM/whgdata/whlstfl7.htm new file mode 100755 index 000000000..a7c64dea2 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl7.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ GA GE GG GI GL GR GU ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl8.htm b/doc/salome/gui/GEOM/whgdata/whlstfl8.htm new file mode 100755 index 000000000..ea456ba3c --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl8.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ HA HE HI HO ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstfl9.htm b/doc/salome/gui/GEOM/whgdata/whlstfl9.htm new file mode 100755 index 000000000..cb988a831 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstfl9.htm @@ -0,0 +1,45 @@ + + +Search Words letter + + + + + + + + + +

      ^ I ID IF IG IM IN IO IS IT IX IY IZ ^

      + + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt1.htm b/doc/salome/gui/GEOM/whgdata/whlstt1.htm new file mode 100755 index 000000000..347ab0afb --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt1.htm @@ -0,0 +1,58 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt10.htm b/doc/salome/gui/GEOM/whgdata/whlstt10.htm new file mode 100755 index 000000000..00c4532f8 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt10.htm @@ -0,0 +1,68 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +       Boolean Operations
      +          Using boolean operations
      +          Fuse
      +          Common
      +          Cut
      +          Section
      +       Transformation Operations
      +       Blocks Operations
      +       Repairing Operations
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt11.htm b/doc/salome/gui/GEOM/whgdata/whlstt11.htm new file mode 100755 index 000000000..884dcff6a --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt11.htm @@ -0,0 +1,73 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +       Boolean Operations
      +       Transformation Operations
      +          Translation
      +          Rotation
      +          Modify the Location
      +          Mirror Image
      +          Scale Transform
      +          Offset Surface
      +          Multi Translation
      +          Multi Rotation
      +          Fillet
      +          Chamfer
      +       Blocks Operations
      +       Repairing Operations
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt12.htm b/doc/salome/gui/GEOM/whgdata/whlstt12.htm new file mode 100755 index 000000000..9cc4acffd --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt12.htm @@ -0,0 +1,66 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +       Boolean Operations
      +       Transformation Operations
      +       Blocks Operations
      +          Multi Transformation
      +          Explode on Blocks
      +          Propagate
      +       Repairing Operations
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt13.htm b/doc/salome/gui/GEOM/whgdata/whlstt13.htm new file mode 100755 index 000000000..a35a64a97 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt13.htm @@ -0,0 +1,73 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +       Boolean Operations
      +       Transformation Operations
      +       Blocks Operations
      +       Repairing Operations
      +          Shape Processing
      +          Suppress Faces
      +          Close Contour
      +          Suppress Internal Wires
      +          Suppress Holes
      +          Sewing
      +          Glue Faces
      +          Add Point on Edge
      +          Check Free Boundaries
      +          Check Free Faces
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt14.htm b/doc/salome/gui/GEOM/whgdata/whlstt14.htm new file mode 100755 index 000000000..2d6bec4f5 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt14.htm @@ -0,0 +1,63 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +       Changing Displaying Parameters
      +       Creation of Geometric Objects
      +       Transformation
      +       Measurement Tools
      +       Module geompy
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt15.htm b/doc/salome/gui/GEOM/whgdata/whlstt15.htm new file mode 100755 index 000000000..e9610f41d --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt15.htm @@ -0,0 +1,69 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +       Changing Displaying Parameters
      +       Creation of Geometric Objects
      +          Basic Geometrical Objects
      +          Primitives
      +          Complex Objects
      +          Working with Groups
      +          Building by Blocks
      +          Sketcher
      +          Advanced Geometrical Objects
      +       Transformation
      +       Measurement Tools
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt16.htm b/doc/salome/gui/GEOM/whgdata/whlstt16.htm new file mode 100755 index 000000000..00a0a5d76 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt16.htm @@ -0,0 +1,67 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +       Changing Displaying Parameters
      +       Creation of Geometric Objects
      +       Transformation
      +          Basic Operations
      +          Boolean Operations
      +          Transformation Operations
      +          Blocks Operations
      +          Repairing Operations
      +       Measurement Tools
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt2.htm b/doc/salome/gui/GEOM/whgdata/whlstt2.htm new file mode 100755 index 000000000..b8cc3abcc --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt2.htm @@ -0,0 +1,60 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +       Changing displaying parameters
      +       Displaying\hiding objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt3.htm b/doc/salome/gui/GEOM/whgdata/whlstt3.htm new file mode 100755 index 000000000..a821036b5 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt3.htm @@ -0,0 +1,65 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +       Creation of Basic Geometric Objects
      +       Creation of Primitives
      +       Generation of Complex Objects
      +       Working with groups
      +       Building by blocks
      +       Sketcher
      +       Creation of Advanced Geometrical Objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt4.htm b/doc/salome/gui/GEOM/whgdata/whlstt4.htm new file mode 100755 index 000000000..c3ae759ad --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt4.htm @@ -0,0 +1,75 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +       Creation of Basic Geometric Objects
      +          Point
      +          Line
      +          Circle
      +          Ellipse
      +          Arc
      +          Curve
      +          Vector
      +          Plane
      +          Working Plane
      +          Local Coordinate System
      +       Creation of Primitives
      +       Generation of Complex Objects
      +       Working with groups
      +       Building by blocks
      +       Sketcher
      +       Creation of Advanced Geometrical Objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt5.htm b/doc/salome/gui/GEOM/whgdata/whlstt5.htm new file mode 100755 index 000000000..b4bb30f34 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt5.htm @@ -0,0 +1,70 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +       Creation of Basic Geometric Objects
      +       Creation of Primitives
      +          Box
      +          Cylinder
      +          Sphere
      +          Torus
      +          Cone
      +       Generation of Complex Objects
      +       Working with groups
      +       Building by blocks
      +       Sketcher
      +       Creation of Advanced Geometrical Objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt6.htm b/doc/salome/gui/GEOM/whgdata/whlstt6.htm new file mode 100755 index 000000000..378054ec4 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt6.htm @@ -0,0 +1,69 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +       Creation of Basic Geometric Objects
      +       Creation of Primitives
      +       Generation of Complex Objects
      +          Extrusion
      +          Revolution
      +          Filling
      +          Pipe
      +       Working with groups
      +       Building by blocks
      +       Sketcher
      +       Creation of Advanced Geometrical Objects
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt7.htm b/doc/salome/gui/GEOM/whgdata/whlstt7.htm new file mode 100755 index 000000000..f500692f0 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt7.htm @@ -0,0 +1,72 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +       Creation of Basic Geometric Objects
      +       Creation of Primitives
      +       Generation of Complex Objects
      +       Working with groups
      +       Building by blocks
      +       Sketcher
      +       Creation of Advanced Geometrical Objects
      +          Explode
      +          Edge
      +          Wire
      +          Face
      +          Shell
      +          Solid
      +          Compound
      +    Transforming geometrical objects
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt8.htm b/doc/salome/gui/GEOM/whgdata/whlstt8.htm new file mode 100755 index 000000000..15b0d086c --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt8.htm @@ -0,0 +1,63 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +       Boolean Operations
      +       Transformation Operations
      +       Blocks Operations
      +       Repairing Operations
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whlstt9.htm b/doc/salome/gui/GEOM/whgdata/whlstt9.htm new file mode 100755 index 000000000..020ca4200 --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whlstt9.htm @@ -0,0 +1,65 @@ + + + +Content + + + + + + + + + + +
      +

      + GEOM module
      +    Introduction to GEOM
      +    Importing\exporting geometrical objects
      +    Managing geometrical objects
      +    Creating geometrical objects
      +    Transforming geometrical objects
      +       Basic Operations
      +          Partition
      +          Archimede
      +       Boolean Operations
      +       Transformation Operations
      +       Blocks Operations
      +       Repairing Operations
      +    Using measurement tools
      +    TUI Scripts
      +

      + +
      +

      +

      + + + + diff --git a/doc/salome/gui/GEOM/whgdata/whnvl32.htm b/doc/salome/gui/GEOM/whgdata/whnvl32.htm new file mode 100755 index 000000000..5927c3d7f --- /dev/null +++ b/doc/salome/gui/GEOM/whgdata/whnvl32.htm @@ -0,0 +1,72 @@ + + + +Search Letters + + + + + + + + +

      + # + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z +

      + + + + diff --git a/doc/salome/gui/GEOM/whskin_info.htm b/doc/salome/gui/GEOM/whskin_info.htm new file mode 100755 index 000000000..ddaed6656 --- /dev/null +++ b/doc/salome/gui/GEOM/whskin_info.htm @@ -0,0 +1,20 @@ + + +WebHelp 5.50 + + + + +

      WebHelp 5.50 System Info

      + + + + + + + + + +
      Start Page geom.htm
      Skin Name Default
      Generating Time 18:44 10/18/2005
      Language ID 1033
      Compile Script webhelp5_compile_script.xml
      Compile Build Version 13.10.606
      Product Name WebHelp 5.50
      Authoring Tool Name RoboHelp X5
      + + \ No newline at end of file diff --git a/doc/salome/gui/GEOM/whxdata/whftdata0.xml b/doc/salome/gui/GEOM/whxdata/whftdata0.xml new file mode 100755 index 000000000..0bfb928b7 --- /dev/null +++ b/doc/salome/gui/GEOM/whxdata/whftdata0.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/salome/gui/GEOM/whxdata/whfts.xml b/doc/salome/gui/GEOM/whxdata/whfts.xml new file mode 100755 index 000000000..0ac71382b --- /dev/null +++ b/doc/salome/gui/GEOM/whxdata/whfts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/doc/salome/gui/GEOM/whxdata/whfwdata0.xml b/doc/salome/gui/GEOM/whxdata/whfwdata0.xml new file mode 100755 index 000000000..9025f2ef1 --- /dev/null +++ b/doc/salome/gui/GEOM/whxdata/whfwdata0.xml @@ -0,0 +1,1246 @@ + + + 0,3,4,6,7,9,11,12,18,45,47,50,61,62,64,73,40,79, + 64, + 18, + 4, + 0,2,3,4,6,7,9,10,11,12,15,16,18,20,23,25,26,27,28,29,42,43,45,46,47,49,50,51,52,53,54,55,58,59,60,61,62,63,64,65,66,67,69,70,72,73,75,77,33,35,37,38,39,40,41,32,31,79,80,81,84,85, + 3,18,50,62,73,79, + 3,4,6,9,18,45,50,64,73,79, + 3,79, + 4, + 50, + 50, + 50, + 37, + 9, + 64, + 64, + 9,18,50,62,73, + 3,9,45,64,73, + 11, + 62, + 3, + 64,73, + 50, + 6,38,31,79, + 50,64, + 49,38,39,40,41,31, + 56,6,8,12,15,17,18,21,22,23,24,44,45,47,48,50,53,54,55,58,64,68,70,72,33,37,38,39,40,41,32,31,79,80,81,82,84, + 3,7,9,18,45,62,64,73,79, + 3,4,6,47,50,64,79, + 79, + 11, + 79, + 50, + 3,6,7,62,79, + 45,50,64,73, + 6,43,64,70,33,35,38,40,32,31,79, + 49,38,39,40,41,31, + 41, + 1,2,6,8,11,15,18,20,45,47,50,54,60,61,64,70,72,38,39,40,41,32,31,79,80,82, + 3,9,11,18,50,62,64,73,79, + 45,73, + 50, + 11, + 64, + 50, + 7,62,64,79, + 15,21,43,49,58,60,61,64,70,76,33,34,35,37,38,39,40,32,31,82, + 49,38,31, + 41, + 56,45,47,50,54,70,72,38,40,32,79, + 7,9,18,45,62,64,79, + 64, + 9,62,64, + 0,3,11,18,43,45,47,50,61,64,70,72,73,35,40,79, + 3,6,9,11,18,45,50,64,73,79, + 4, + 7,62,64, + 56,50,70,37,40, + 18,64,79, + 64, + 45,50,64,70,40, + 3,9,45,62,64,73,79, + 50,70,40, + 50,64,73,79, + 45,50,70,72,40, + 72, + 72, + 72, + 8,28,48,75,41, + 0,49,70,40,31, + 0,16,40, + 70,40, + 16,47,40,85, + 0,3,4,6,7,9,18,45,47,62,64,73,40,79, + 47,85, + 3,4,6,7,9,11,18,45,47,62,64,73,79, + 6,64, + 40, + 8,19,24,28,29,45,71,74,75,33,35,83, + 38, + 8,15,20,21,23,58,60,61,72,75,38,81,82,84, + 64, + 56,10,26,51,52,53,66,69,72,77,36,40,41,80,85, + 8,10,55,57,59,35,38,41,79,80, + 32, + 47, + 53,64,65,66,70,72,35,40,41,79, + 22,28,48,60,61,75, + 2,58,66,70,40,80, + 49,40,31,79, + 18,79, + 10,38, + 57,41, + 70,40, + 70,40, + 1,3,18,45,64,72,73,31,79, + 18, + 18, + 2,4,38, + 50, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,35,37,38,39,40,41,32,31,80,81,82,83,84,85, + 53,65,35,79, + 34, + 34, + 56,49,31, + 0,56,16,72,76,77,78,34,40,85, + 8,49,31,80, + 18,20,23,49,51,53,55,65,66,35,37,39,41,31,79, + 21,31, + 85, + 20,23,28,53,59,64,65,67,70,35,39,40,41,80,81, + 59,35, + 28,35, + 1,2,3,4,15,21,25,30,48,49,50,58,60,61,72,33,37,38,31,82,84, + 50,37, + 50, + 24, + 64,70,72,40, + 64, + 56, + 21, + 3,21,70,40,31, + 56,6,9,5,27,50,54,63,37,38, + 7,17,22,44,30,68,33,37,32, + 8,20,54,34, + 64, + 9,45,50,37, + 13,64,69,77,40, + 13,64,78,40, + 50,37, + 0,4,56,6,8,11,12,13,16,22,27,47,49,50,62,64,70,72,78,33,35,36,37,38,39,40,41,31,79,83,85, + 6, + 6, + 50,62,64, + 50,62,64, + 62, + 63,38, + 30,64,36, + 10,42,49,34,36,31,83, + 70,40, + 70,40, + 56,6,9,5,19,24,29,30,58,63,71,74,33,38,83, + 49,69,77,40,31,83, + 56, + 45,73, + 30, + 31,84, + 56,49,54,70,78,40,31, + 8,15,25,50,53,72,75,37,39,41,31, + 26, + 67,41, + 20,81, + 20,23,67,39, + 6, + 10,38,79, + 79, + 79, + 79, + 79, + 11,12, + 6,13,14,27,29,50,64,78,37,38,40, + 6, + 6, + 51,52,53,66,77,40,41,80, + 50,37, + 50,64,37, + 21, + 27,34,36,38, + 3,15,72,31,82, + 3, + 3, + 12,34,36, + 13,16,64,70,74,33,40, + 16,64,40, + 13,64,40, + 16,40, + 50, + 46,40, + 20,23, + 11,12, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,23,24,25,26,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,34,35,37,38,39,40,41,32,31,80,81,82,83,85, + 7,16,17,40,32,79, + 18,28,43,30,59,65,35,38,32, + 3,18,43,49,72,41,31,80, + 56,37, + 56,6,17,18,19,22,26,27,44,45,46,50,53,55,57,64,68,33,37,38,40,41, + 26,28,59,65,35, + 2,37,38, + 20,62,64,39, + 37, + 37, + 62, + 62, + 36, + 70,40, + 10,29,71,33,37,38,83, + 37, + 79, + 16,46,37,40, + 37, + 56, + 56,74,33,39, + 21,30,59,32, + 49,38,39,40,41,31, + 0,6,14,16,63,38,40, + 47,36, + 70,40, + 70,40, + 70,40, + 70,40, + 16,64,40, + 70,40, + 50, + 8,20,23,26,49,50,52,61,72,75,37,39,41,31,79,80,81,82,84, + 51,52,66,41,80, + 8,9,39, + 70,40, + 2,13,21,24,27,49,33,35,38,39,40,31, + 64, + 72, + 32, + 1,2,3,4,56,6,7,8,9,10,15,16,18,19,20,21,23,24,25,26,28,29,42,43,44,45,47,48,49,50,51,52,53,59,60,61,62,64,65,66,67,68,71,72,73,74,75,33,34,35,37,38,39,40,41,31,79,80,81,82,83,84,85, + 3,4,6,7,9,11,18,45,47,62,64,73,79, + 47,85, + 1,3,8,15,16,18,19,20,21,23,24,25,28,29,43,45,47,30,48,59,60,61,62,64,65,71,74,75,35,38,40,81,82,83,85, + 79, + 79, + 8,28,48,72,75,34, + 3,21,43,70,72,35,40,31, + 70,40, + 70,40, + 70,40, + 7,17,22,58,64,70,38,40,32, + 64, + 7,20,23,62,64,39,79, + 18, + 70,40, + 10,64, + 10,38,79, + 10,38,79, + 37, + 61,72,85, + 1,8,10,15,20,21,23,25,26,27,28,42,43,48,53,54,55,59,60,61,65,66,67,70,72,75,38,39,40,41,31,80,81,82,84, + 77,37,40, + 59,70,35,40, + 2,38, + 37, + 43,65,70,72,35,40, + 58,38, + 2,38, + 54,38, + 50, + 56,12,50,72,73,33,34,35,37,38,39,40,41,31,85, + 70,40, + 30, + 72, + 13,69,77,40, + 70,40, + 39, + 0,56,12,13,16,22,49,70,72,78,33,35,36,37,38,39,40,41,31,83,85, + 34, + 47, + 12,51,34,37,39, + 8,10,23,28,53,35,37,38,39, + 53, + 53,55,41, + 55,41, + 55,41, + 2,15,20,25,28,49,53,54,55,60,65,66,72,35,38,39,41,31,81, + 54,38, + 54,38, + 54,38, + 54,38, + 54,38, + 54,38, + 54,38, + 3,4,6,7,9,11,12,18,45,47,49,62,64,69,73,77,34,36,37,40,31,79, + 34, + 34, + 46,50,57,37,40,41, + 0,64,70,40, + 0,64,40, + 8,16,28,55,75,40,41, + 12,53,54,55,72, + 70,40, + 8,50,72,41,80,82, + 8,50,72,41,80,82, + 8,50,41,80,82, + 34, + 56, + 56, + 56, + 56, + 85, + 0,1,56,8,9,10,13,15,16,18,21,24,25,26,28,42,43,45,48,50,59,61,63,64,65,70,71,72,33,35,37,38,40,31,79,82,83, + 64, + 64, + 9, + 9, + 9, + 9, + 0,40, + 85, + 37, + 37, + 56, + 16,29,72,33,34,35,37,39,40,32,31, + 56, + 3,25,31, + 50,64, + 77,78,40, + 37, + 1,16,28,52,64,72,40,41,31,79,80,82, + 49,36,31, + 37, + 1,56,8,15,19,20,21,23,24,25,26,28,29,43,48,49,59,60,61,65,71,72,74,75,33,35,39,31,81,82,83,84,85, + 20,72, + 34, + 34, + 34, + 13,47,37,40, + 26,70,33,40, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,33,35,38,39,40,41,32,31,80,81,82,83,85, + 78,40, + 60,72,85, + 6,5,26,27,45,33,38, + 30,36, + 36, + 37, + 27,38, + 59,65,35, + 28,35, + 45,73, + 64, + 79, + 79, + 56, + 64, + 56, + 56, + 56, + 56, + 56, + 3,56,9,10,14,16,18,26,27,28,29,42,43,45,46,47,50,54,57,58,59,60,64,65,70,71,72,73,76,78,33,35,37,38,40,41,31,79,84, + 64, + 64, + 10,18,45,38, + 10,18,45,38, + 45, + 47, + 37, + 37, + 67,41,79, + 50,64, + 13,40, + 49,31, + 18,43,49,35,36,31, + 77,35,40, + 10,42,38,79, + 79, + 51,60,61,80,84, + 8,15,20,23,24,51,54,55,58,60,61,73,75,33,38,39,41,32,31,80,81,82,84, + 70,40, + 70,40, + 64,70,40, + 37, + 64, + 72,73,33,34,37,32, + 30,36, + 56,9, + 13,14,64,69,77,40, + 30,33,79, + 56, + 72,85, + 7,11,44,32, + 11, + 16,40, + 56,32, + 28,43,59,35, + 28,43,30,59,65,35, + 3,4,6,7,9,11,12,18,45,47,30,50,62,63,64,73,33,34,35,36,37,38,39,41,32,31,79, + 0,1,2,56,8,10,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,35,37,38,39,40,41,31,80,81,82,83,85, + 1,56,15,19,21,24,25,28,29,43,48,59,60,61,65,71,74,82,83, + 3,12,17,45,30,53,33,34,35,36,37,38,39,40,41,32,31,85, + 64,70,40, + 0,1,2,3,4,56,6,7,8,9,10,11,13,15,16,17,18,19,20,21,23,24,25,26,27,28,29,42,43,44,45,46,47,48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,33,35,37,38,39,40,41,32,31,79,80,81,82,83,85, + 6,50,64,33,37,79, + 6, + 13,64,40, + 14,64,40, + 85, + 64, + 47,64,33,79, + 6, + 3,4,6,7,9,11,12,18,45,47,50,62,64,73,79, + 15,25,29,60,31, + 3,4,6,9,10,14,18,23,26,27,29,42,45,46,47,48,53,57,61,64,73,33,37,38,40,41,31,79,81, + 6,46,50,58,64,37,38,40, + 34, + 26,50,53,37, + 6,47,63,38,85, + 47, + 38, + 31, + 85, + 70,71,33,40, + 7,20,23,28,64,35,39,79, + 9, + 56,9,54,38, + 56, + 34, + 13,37,40, + 64,77,40, + 83, + 37, + 18,47,64,34, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 37, + 0,12,14,16,26,54,76,77,78,33,34,38,40,85, + 3, + 4, + 79, + 3, + 4,6,64,79, + 6, + 6, + 62, + 62, + 62, + 79, + 79, + 79, + 79, + 3, + 3, + 7, + 6,18, + 62, + 62, + 79, + 79, + 7,64, + 64, + 7,79, + 64, + 18,45,64, + 9, + 9, + 9, + 9, + 3, + 3,64,73, + 64, + 18,45, + 18,45, + 45, + 18, + 79, + 79, + 7, + 47, + 64, + 3, + 3, + 3, + 6, + 79, + 79, + 79, + 79, + 64, + 3, + 3, + 3,9, + 3, + 3,9, + 3,9, + 3,9,79, + 4, + 4, + 4, + 18, + 4,79, + 3, + 3, + 3, + 3, + 79, + 79, + 18, + 18, + 3, + 3, + 3, + 9, + 9, + 9, + 64, + 18, + 79, + 79, + 79, + 79, + 7, + 64, + 64, + 45, + 73, + 73, + 45, + 9, + 9, + 7, + 62, + 62, + 62, + 62, + 62, + 79, + 79, + 79, + 79, + 79, + 3, + 3, + 3, + 18, + 79, + 3, + 18,45,64, + 64, + 64,79, + 79, + 79, + 0,13,16,20,29,47,50,58,64,70,77,78,33,37,38,40,85, + 30,36, + 51,41,79, + 3,4,6,7,9,11,18,45,47,30,50,62,64,73,34,36,37,79, + 36, + 64, + 3,4,6,7,9,11,18,45,47,50,62,64,73,79, + 29, + 6, + 57,41, + 47, + 16,40, + 17,34, + 26,64, + 10,26,58,38, + 55,61, + 50,37, + 37, + 51,52,53,66,67,41,80, + 37, + 37, + 16,40, + 58,38, + 20, + 27,54,38, + 54,38, + 70,40, + 27,38, + 56, + 64,78,40, + 3, + 21, + 3, + 58,38, + 58,38, + 56,30, + 50,64,70,40, + 37, + 83, + 0,40, + 16,40, + 12, + 12, + 45, + 3,18,29,73, + 64, + 50,64, + 43,35, + 16,40, + 50,37, + 50,37, + 50,37, + 56, + 51,52,66,41,80, + 64, + 45,73, + 24,33,31, + 49,31, + 21,31, + 64, + 0,50,72,37,40, + 70,40, + 1,15, + 58,38, + 2,3,48,72,38,31, + 3, + 3, + 72, + 3,10,13,14,16,19,21,26,29,43,47,58,63,69,70,71,72,74,76,77,78,33,35,38,40,31,83,85, + 6, + 10,38, + 76,40, + 76,33,40, + 26, + 58,38, + 58,38, + 58,38, + 19,21,58,69,71,74,33,38,40,31,83, + 38, + 58,38, + 77,40, + 42, + 49,57,72,41,31,79, + 6, + 49,61,31, + 49,52,36,41,31,79, + 72,78,40, + 0,1,2,56,8,5,10,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,49,50,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,34,35,37,38,39,40,41,31,80,81,82,83,84,85, + 85, + 25,39,31,81, + 6,7,10,50,54,55,58,64,38,41,79,80,85, + 6, + 1,3,18,45,64,73,31,79, + 3,21,31, + 6,27,38, + 11,32, + 8,11,50,62,64,39,79, + 6,8,50,62,64,79, + 4,8,47,62, + 50,37, + 79, + 10,79, + 10,38,79, + 10,38,79, + 3,15,31, + 3,15, + 7,17, + 6,18,19,50,64,33, + 20,62,64,39, + 20,62, + 7,64, + 7,23,64,39,79, + 23, + 9,18,24,45,64,33, + 3,25,31, + 3,18,29,45,64,73,33,79, + 29,45, + 18,43,35, + 42,38,79, + 42,79, + 7,44, + 46,50,40, + 4,58, + 9, + 9, + 56, + 56, + 3,21,31, + 3,48,31, + 3, + 49,31,79, + 51,79, + 51,41,79, + 51,79, + 53,41, + 53,41, + 6,54,38, + 6,54,38, + 55,41,79, + 55,41,79, + 57,41,79, + 4,58,38, + 18,59,35, + 3,4,60,31, + 3,60, + 3,60,79, + 3,21,31, + 52,41,79, + 18,28,45,35, + 18,28,64,79, + 9, + 9, + 9, + 56, + 56, + 56, + 18,65,35, + 64,66,41,79, + 67,41,79, + 7,68, + 64,69,40, + 45,71,33, + 45,72,73, + 73, + 45,74,33, + 6,7,11,62,75,39, + 62, + 62,39,81, + 62,81, + 18,41,79,80, + 79,80, + 79,80, + 3,7,18,45,62,64,73,31,79,82, + 3,4,18,82, + 3,4,6,7,9,18,45,47,50,61,62,64,73,31,79, + 3,61,31, + 3,61,31, + 3,18,45,64,73,33,79,83, + 31, + 50,37, + 58,38, + 50,64,79, + 50,37, + 27,43,50,70,35,38,40, + 18, + 43,35, + 27,70,35,37,38,40, + 27,43,46,70,38,40, + 27,38, + 70,40, + 70,40, + 57,61,72,41, + 37, + 50,37, + 56, + 0,1,2,56,8,5,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,34,35,36,37,38,39,40,41,31,80,81,82,83,84,85, + 70,40, + 2,56,38, + 2,4,38, + 33, + 1,61,31, + 27,43,50,35,37,38, + 50, + 18, + 43,35, + 50,37, + 27,29,50,35,37,38, + 27,43,38, + 27,38, + 25,39,31,81, + 51,41,79, + 79, + 79, + 79, + 0,11,12,16,70,40, + 2,30,38, + 16,49,52,40,41,31, + 40,41, + 52,41,79, + 30,34, + 50,37, + 52,55,41, + 85, + 6,5,53,54,55,38,41,79, + 79, + 79, + 63,38, + 50,53,55,77,37,40,41, + 0,1,2,56,8,10,15,16,17,19,20,21,22,23,24,25,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,65,67,68,69,70,71,74,75,76,77,78,33,35,36,38,39,40,41,31,80,81,82,83,84, + 8,28,48,75, + 26, + 18,43,35, + 50, + 50, + 70,40, + 53,54,55,38,41, + 53,55,41, + 53,55,41, + 54,38, + 54,38, + 50, + 50, + 8,10,26,28,29,42,43,53,55,59,65,66,67,75,80, + 10,42,70,72,34,37,40, + 16,40, + 57,41, + 70,40, + 1,56,8,15,16,19,20,21,23,24,25,26,28,29,43,48,49,59,60,61,65,71,72,74,75,33,35,39,40,31,79,81,82,83,84,85, + 50, + 50, + 21,31, + 13,40, + 50, + 3,15,25,28,57,60,35,41,31,81, + 20, + 29, + 56, + 12,27,43,53,54,55,57,64,69,70,77,35,38,40,41,79, + 54,38, + 38, + 1,2,3,4,6,7,9,10,12,15,17,18,19,21,24,25,26,28,29,42,43,45,47,30,48,49,51,52,53,57,59,60,61,62,63,64,65,66,71,73,74,78,33,34,35,36,37,38,39,40,41,32,31,79,80,82,83,85, + 26,50, + 0,12,16,76,77,78,34,40,85, + 13,40, + 85, + 57,41,79, + 49,50,64,36,31, + 61, + 0,16,22,53,54,55,60,61,64,70,72,34,38,40,41,31,79,84, + 13,16,64,40, + 13,64,40, + 0,1,2,4,56,6,7,8,10,13,14,15,16,17,20,21,22,23,25,26,27,28,42,43,44,46,30,48,51,52,53,54,55,57,58,59,60,61,63,64,65,66,67,68,69,70,75,76,77,78,34,35,38,40,41,32,79,80,81,82,85, + 64,70,40, + 8,39, + 30, + 5, + 70,37,40, + 56,49,31, + 8,20,23,49,75,39,31,81,82, + 0,16,51,52,66,40,41,80, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,37,32,80,81,82,83,85, + 58,38, + 49,72,31, + 49,31, + 20,23,49,72,31, + 62, + 6, + 6, + 6, + 3, + 3,4,18,45,47,62,64,79, + 3,7,9,18,62,64,73,79, + 9, + 3, + 9, + 9, + 9, + 3,7,9,18,62,64,73,79, + 4,47, + 3,9,18,64,73,79, + 3,9,18,79, + 3,9,18,79, + 3, + 9,18, + 9,18, + 62, + 9,18, + 9, + 8,48, + 0,16,49,61,70,33,40,31, + 4,11,12,43,49,64,70,72,35,40,31, + 0,40, + 17,20,39, + 4,58,38, + 4, + 4, + 4, + 21,48,53,60,72,31, + 18,59,35, + 59,35, + 41, + 4,26,58,38,79,85, + 72, + 53,64,79, + 18,59,35, + 2,3,4,51,58,60,72,38,41,31,79,84, + 29,72,73,33,31,79,84, + 3, + 3, + 3, + 85, + 2,38, + 0,1,3,4,56,8,15,16,18,20,21,23,24,25,28,45,47,48,49,50,51,53,57,60,61,64,67,70,72,73,75,37,39,40,41,31,79,80,81,82, + 1,3,8,9,15,24,28,48,60,31,80,82, + 1,3,8,9,15,24,28,48,60,31,80,82, + 1,3,9,15,60,31, + 3,9, + 3, + 50,37, + 3,21,31, + 12,34, + 0,61,40,31,79,84, + 29, + 70,40, + 6,21,63,70,34,37,38,40, + 64,69,40, + 72, + 85, + 49,31, + 49,31, + 72, + 8,20,23,30,62,75,39,81, + 50,64,37, + 18,28,45,64,35,79, + 79, + 45,79, + 18, + 18, + 70,40, + 16,64,70,76,38,40, + 64,70,40, + 2,10,16,17,22,27,42,44,51,53,54,55,57,58,63,66,67,68,69,70,76,79,80, + 85, + 53,84, + 50, + 6,63,38, + 6,63,38, + 12,50,37, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,32,80,81,82,83,85, + 64, + 2,38, + 3,18,45,64,79, + 79, + 18,45,79, + 3,18,45,64,79, + 64, + 37, + 3,4,18,45,64,79, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 56,9,60,37,31, + 42,45,73, + 70,40, + 3,10,15,20,23,25,42,72,75,38,39,31,79,81, + 3,20,25,39,31,81, + 7,20,62,64,39,79, + 20,62,39, + 62, + 25,39,31,81, + 25,39,31,81, + 50,64, + 0,26,30,40, + 70,40, + 34, + 58,38, + 49,61,31, + 61,31, + 72, + 79, + 47,51,52,64,66,70,76,77,78,40,41,80,85, + 47,85, + 58,38, + 0,13,14,16,46,30,64,69,70,76,77,78,40, + 53,55,41, + 60,31, + 33, + 70,34,36,40, + 70,40, + 70,40, + 64, + 46,72,40, + 70,40, + 0,1,2,4,56,6,7,8,10,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,33,35,37,38,39,40,41,31,79,80,81,82,83,85, + 70,40, + 14,33,40, + 14,26,27,50,33,37,38,40,85, + 53,66,41, + 18,65,70,35,40, + 12,34, + 79, + 79, + 53,65,66,35,41,79, + 53,64,66,41,79, + 50,64, + 13,15,16,18,47,50,54,64,67,76,77,78,33,38,40,41,31,85, + 17,44,68, + 17,44,68, + 3,4,6,7,9,11,18,45,47,30,50,62,64,73,79,85, + 53,70,72,40,79, + 70,40, + 37, + 67,41,79, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,37,32,80,81,82,83,85, + 36,37, + 36, + 8,15,20,23,51,54,55,58,60,61,73,75,38,39,41,32,80,81,82,84, + 2,7,68,38,32, + 64, + 70,72,40, + 0,1,2,8,5,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,33,34,35,36,37,38,39,40,31,80,81,82,83,84,85, + 42,60,72,38,31,84, + 58,38, + 32, + 21,28,59,65,35,31, + 0,12,16,27,29,45,53,57,61,38,40,41,31,84, + 11,12, + 3,4,6,7,9,11,12,18,45,62,64,73,79, + 3,11,12,45,73, + 64,69,40, + 6,47,64,34, + 12, + 0,2,4,10,12,13,14,16,17,19,22,26,28,42,43,44,47,30,50,51,52,53,55,57,58,59,63,64,65,66,67,68,69,70,76,77,78,33,34,35,37,38,40,41,79,80,85, + 37,32, + 37,32, + 18, + 26, + 46,40, + 42,45,47,64,38,79,85, + 79, + 79, + 14,40, + 14,19,45,57,71,74,33,40,41, + 56,28,45,57,59,65,71,74,33,35,41, + 61,83, + 12, + 29, + 28,48,76,77,37,40, + 37, + 49,31, + 60,31, + 57,41, + 60, + 53,54,55, + 29, + 56,9, + 10,60,70,38,40,31, + 45,72,73, + 45, + 45,73, + 45,73, + 45, + 49,70,40,31, + 29, + 56,8,9,20,23,26,28,45,54,57,59,65,74,75,33,35,38,39,41,81, + 9, + 9, + 49,31, + 26, + 65, + 15,21,60,61,37,31,82, + 0,8,9,10,16,42,49,54,64,70,78,38,40,31,79, + 56, + 0,66,40,41, + 6,7,11,62,75,39,79, + 62, + 62, + 62, + 21,31, + 0,70,40, + 70,40, + 70,40, + 70,40, + 70,40, + 50, + 56, + 36, + 1,28,52,72,41,31,80,82, + 30,53,55,36,41, + 55,41, + 55,41, + 72, + 70,40, + 3,4,6,7,9,18,45,62,64,73,34,79, + 26,64,77,33,40,85, + 64, + 47, + 5,33,37,40, + 26,33,38,85, + 26,33, + 26, + 26,45,47,64,79, + 26, + 85, + 26, + 50, + 64, + 64,76,77,78,40, + 64,76,40, + 64,77,40, + 64,78,40, + 29,43,50,57,70,37,40,41,79, + 70,40, + 70,40, + 79, + 51,41,79, + 51,39,41, + 20,23,49,52,75,41,31,79,84, + 8,28,75, + 72, + 27,72,38, + 56, + 72,73, + 52,41, + 8,26,70,76,40,83, + 52,41, + 72, + 46,64,40, + 52,41, + 46,40, + 8, + 1,3,15,18,21,45,51,60,61,73,79,84, + 21,53,55,61,41,79, + 64, + 70,40, + 85, + 50, + 18,43,35, + 18,43,35, + 16,43,46,50,70,35,37,40, + 70,40, + 64,70,40, + 50,58,37, + 6, + 6, + 20,62,39,81, + 62, + 62, + 62, + 79, + 79, + 6,17,54,67,38,41,79, + 6, + 6,5,10,42,30,51,52,53,54,55,57,66,67,38,41,79,80, + 53,55,57,41,79,80, + 53,54,55,38,41,79,80, + 79, + 79, + 79, + 11,12, + 49,31, + 3,4,60,31, + 0,16,58,64,37,38,40, + 20, + 29, + 45,73, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,46,48,49,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,33,34,35,37,38,39,40,41,32,31,80,81,82,83,85, + 37, + 0,3,4,56,8,9,10,14,17,18,20,24,44,45,46,47,53,54,55,58,73,75,37,38,39,40,41,79,81,84, + 21,26,27,58,70,72,33,37,38,39,40,32,85, + 33, + 16,40, + 47, + 12,20,34,38,39, + 49,31, + 6,47,64, + 2,56,16,26,27,43,30,49,54,70,72,78,33,34,35,37,38,40,41,32,31,85, + 0,1,2,56,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,27,28,29,42,43,44,46,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,69,70,71,72,74,75,76,77,78,32,80,81,82,83,85, + 7,62,64,79, + 56, + 56, + 56, + 56, + 0,40, + 50,64,37, + 37, + 0,2,8,10,12,16,20,23,28,42,46,49,50,53,55,57,60,64,65,69,70,72,75,35,37,38,39,40,41,31,80,81,82, + 26, + 70,40, + 3,4,7,15,18,20,23,25,28,45,48,49,51,53,55,60,62,64,65,66,72,73,35,39,41,31,79,80,81,82,84, + 3,73, + 3,18, + 18, + 18, + 3,18, + 18, + 18, + 18, + 3,4,7,15,16,18,20,23,24,25,28,50,51,59,60,61,62,64,65,67,75,33,35,37,39,40,41,31,79,81, + 61, + 24,33, + 24,33, + 37, + 37, + 1,3,56,6,8,9,16,18,24,26,45,47,48,62,64,73,33,39,40,41,31,79,80,82, + 56,8,28,48,72,75,41,85, + 0,10,12,16,42,49,76,77,78,34,37,40,31,83,85, + 34, + 34, + 12,34, + 50,37, + 79, + 79, + 79, + 34, + 79, + 79, + 72, + 3,18,45,64,79, + 4, + 79, + 64, + 64,33, + 2,38, + 2,4,38, + 8,26,28,48,51,53,75, + 2,4,38, + 73, + 50, + 50,37, + 37, + 13,18,50,40, + 29,33,37, + 30, + 1,2,8,10,15,17,19,20,21,22,23,24,25,26,27,28,29,42,43,44,48,51,52,53,54,55,57,58,59,60,61,63,65,66,67,68,70,71,72,74,75,36,38,40,41,31,80,81,82,83, + 3,56,13,16,18,26,28,29,45,50,59,64,65,72,73,77,78,33,35,40,79,83, + 64, + 64, + 18, + 18, + 12, + 26,36, + 12,16,40, + 64, + 53,70,72,34,40,31,84,85, + 72, + 45,73, + 3,8,25,49,61,72,75,37,31, + 8,39, + 8,39, + 49,31, + 49,31, + 49,31, + 50,37, + 50,37, + 72, + 31,84, + 6, + 6, + 3,8,25,49,61,72,75,37,31, + 8,39, + 8,39, + 49,31, + 49,31, + 49,31, + 50,37, + 50,37, + 43,69,77,36,37,40,84,85, + 6, + 6, + 2,3,8,49,61,75,37,38,31, + 8,39, + 8,39, + 20, + 50,37, + 50,37, + + diff --git a/doc/salome/gui/GEOM/whxdata/whtdata0.xml b/doc/salome/gui/GEOM/whxdata/whtdata0.xml new file mode 100755 index 000000000..adf85eb28 --- /dev/null +++ b/doc/salome/gui/GEOM/whxdata/whtdata0.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/salome/gui/GEOM/wire.htm b/doc/salome/gui/GEOM/wire.htm new file mode 100755 index 000000000..f2afb8e0e --- /dev/null +++ b/doc/salome/gui/GEOM/wire.htm @@ -0,0 +1,134 @@ + + + + + +Wire + + + + + + + + + + + +

       Wire

      + +

      To create + a Wire in the Main Menu select + New Entity - > Build - > Wire

      + +

       

      + +

      You can create a Wire from several + connected edges and wires by selecting them in the object browser or ion + the viewer holding Shift button.  

      + +

      The + Result  will + be a GEOM_Object (WIRE).

      + +

       

      + +

      TUI Command : + geompy.MakeWire(ListOfShape).

      + +

       

      + +

      Arguments: + Name + List of connected wires or edges..

      + +

       

      + +

      Dialog Box:

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts provide you with useful examples + of creation of Advanced Geometric + Objects.

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/working_plane.htm b/doc/salome/gui/GEOM/working_plane.htm new file mode 100755 index 000000000..8b8c33f30 --- /dev/null +++ b/doc/salome/gui/GEOM/working_plane.htm @@ -0,0 +1,131 @@ + + + + + +Working Plane + + + + + + + + + + + +

      Working Plane

      + +

      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.

      + +

       

      + +

      Firstly, you can select a Plane + or a Planar Face to be your Working Plane

      + +

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

      + +

      + +

       

      + +

      Secondly, you can define a Working + Plane by two Vectors

      + +

      Arguments: + Name +  2 + vectors,

      + +

      + +

       

      + +

      Finally, you can select one of three basic + projections of XYZ coordinate system to be your Working + Plane

      + +

       

      + +

      + +

       

      + +

       

      + + + + diff --git a/doc/salome/gui/GEOM/working_with_groups.htm b/doc/salome/gui/GEOM/working_with_groups.htm new file mode 100755 index 000000000..401729081 --- /dev/null +++ b/doc/salome/gui/GEOM/working_with_groups.htm @@ -0,0 +1,211 @@ + + + + + +Working with groups + + + + + + + + + + + +

      Working with groups

      + +

      The Salome platform offers + such a useful functionality as creation and editing groups of subshapes + of a geometrical object which makes handling subshapes much easier. However + the functionality is available in the OCC viewer only. If other viewer + is used in your project by default, you can toggle the OCC viewer via + Preferences / Viewer background / OCC viewer.  

      + +

       

      + +

      To perform operations with groups:

      + +

       

      + +

      In the main menu select New + entity > Group.

      + +

       

      + +

      Create + a group

      + +

       

      + +

      Description: + Creates a group of subshapes of a geometrical object.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: + geompy.CreateGroup(MainShape, ShapeType), + where MainShape is a shape for which the group is created, ShapeType is + a type of shapes in the created group.

      + +

       

      + +

      Arguments: + 1 Shape + Type of subshape.

      + +

       

      + +

      Dialog Box:

      + +

       

      + +

      + +

       

      + +

      Example:

      + +

       

      + +

      + +

       

      + +

       

      + +

       

      + +

      Edit + a group

      + +

       

      + +

      Description: + Allows to edit the existing group.

      + +

       

      + +

      Result: GEOM_Object.

      + +

       

      + +

      TUI Command: +

      + +
        + +
      • geompy.AddObject(Group, + SubShapeID), where Group is a group to which a sub shape has to + be added, SubShapeID is an ID of the sub shape to be added to the group

      • + +
      • geompy.RemoveObject(Group, + SubShapeID), where Group is a group from which a sub shape has + to be removed, SubShapeID is an ID of the sub shape to be removed from + the group

      • + +
      • geompy.GetObjectIDs(Group), + where Group is a group for which its object IDÂ’s are returned.

      • +
      + +

      Returns: + List of IDs.

      + +

       

      + +

      Arguments: + 1 Shape + its subshapes.

      + +

       

      + +

      Dialog Box:

      + +

       

      + +

      + +

       

      + +

      Our TUI Scripts + provide you with useful examples of Working + with Groups.

      + +

       

      + + + + diff --git a/doc/salome/tui/GEOM/doxyfile b/doc/salome/tui/GEOM/doxyfile new file mode 100755 index 000000000..0ed451a70 --- /dev/null +++ b/doc/salome/tui/GEOM/doxyfile @@ -0,0 +1,200 @@ +# Doxyfile 1.3-rc1 + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "SALOME - GEOM - v.3.1.0" +PROJECT_NUMBER = id#1.1 +OUTPUT_DIRECTORY = ../ +OUTPUT_LANGUAGE = English +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = NO +ALWAYS_DETAILED_SEC = YES +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = YES +SHOW_INCLUDE_FILES = YES +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 5 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 25 +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = YES +SHOW_USED_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = log.txt +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = ../../../share/salome/idl/GEOM_Gen.idl +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = sources/ +INPUT_FILTER = +FILTER_SOURCE_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = GEOM +HTML_FILE_EXTENSION = .html +HTML_HEADER = sources/myheader.html +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_SCHEMA = +XML_DTD = +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = NO +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DOT_IMAGE_FORMAT = jpg +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1200 +GENERATE_LEGEND = NO +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = diff --git a/doc/salome/tui/GEOM/doxyfile_py b/doc/salome/tui/GEOM/doxyfile_py new file mode 100755 index 000000000..2d28cceaa --- /dev/null +++ b/doc/salome/tui/GEOM/doxyfile_py @@ -0,0 +1,200 @@ +# Doxyfile 1.3-rc1 + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "SALOME - GEOM - v.3.1.0" +PROJECT_NUMBER = id#1.1 +OUTPUT_DIRECTORY = ../ +OUTPUT_LANGUAGE = English +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = NO +ALWAYS_DETAILED_SEC = YES +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = YES +SHOW_INCLUDE_FILES = YES +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 5 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 25 +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = YES +SHOW_USED_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = log.txt +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = list_py_files_to_process +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = ../sources/ +INPUT_FILTER = +FILTER_SOURCE_FILES = YES +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = ../GEOM/geompy_doc +HTML_FILE_EXTENSION = .html +HTML_HEADER = ../sources/myheader_py2.html +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_SCHEMA = +XML_DTD = +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = NO +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DOT_IMAGE_FORMAT = jpg +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1200 +GENERATE_LEGEND = NO +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = diff --git a/doc/salome/tui/GEOM/sources/static/tree.js b/doc/salome/tui/GEOM/sources/static/tree.js new file mode 100755 index 000000000..d1ca30e7b --- /dev/null +++ b/doc/salome/tui/GEOM/sources/static/tree.js @@ -0,0 +1,59 @@ +foldersTree = gFld("SALOME v.3.1.0 ", "", "") + insDoc(foldersTree, gLnk("Main Page", "", "main.html")) + +aux1 = insFld(foldersTree, gFld("TUI Reference Guide", "")) + aux2 = insFld(aux1, gFld("Modules", "")) + aux3 = insFld(aux2, gFld("SALOME GEOMETRY module", "")) +/*! insDoc(aux3, gLnk("Overview", "", "overview_Geometry.html"))*/ + aux4 = insFld(aux3, gFld("Packages", "")) + insDoc(aux4, gLnk("GEOM", "", "namespaceGEOM.html")) +/*! insDoc(aux3, gLnk("Examples", "", "examples_GEOM.html")) +*/ + +/*! Data structures +*/ + insDoc(aux1, gLnk("Data Structures", "", "annotated.html")) + +/*! insDoc(aux1, gLnk("GEOM::GEOM_Gen", "", "interfaceGEOM_1_1GEOM__Gen.html")) + insDoc(aux1, gLnk("GEOM::GEOM_Shape", "", "interfaceGEOM_1_1GEOM__Shape.html")) +*/ + insDoc(aux1, gLnk("Class Hierarchy", "", "hierarchy.html")) + +/*! + aux3 = insFld(aux2, gFld("GEOM::GEOM_Gen", "", "interfaceGEOM_1_1GEOM__Gen.html")) + aux3 = insFld(aux2, gFld("GEOM::GEOM_Shape", "", "interfaceGEOM_1_1GEOM__Shape.html")) + aux3 = insFld(aux2, gFld("GEOM::AxisStruct", "", "structGEOM_1_1AxisStruct.html")) + aux3 = insFld(aux2, gFld("GEOM::DirStruct", "", "structGEOM_1_1DirStruct.html")) + aux3 = insFld(aux2, gFld("GEOM::PointStruct", "", "structGEOM_1_1PointStruct.html")) +*/ + insDoc(aux1, gLnk("Class methods list", "", "functions.html")) +/*! +aux1 = insFld(foldersTree, gFld("Namespace List", "", "namespaces.html")) + insDoc(aux1, gLnk("GEOM", "", "namespaceGEOM.html")) +*/ + insDoc(aux1, gLnk("Namespace Members", "", "namespacemembers.html")) + + insDoc(aux1, gLnk("File List", "", "files.html")) + +/*! + + insDoc(aux1, gLnk("GEOM_Gen.idl", "", "GEOM__Gen_8idl.html")) + insDoc(aux1, gLnk("GEOM_Shape.idl", "", "GEOM__Shape_8idl.html")) +*/ + +aux1 = insFld(foldersTree, gFld("IDL/Python mapping", "")) + insDoc(aux1, gLnk("Mapping of GEOMETRY IDL definitions to Python language", "", "page2.html")) + +/*!aux1 = insFld(foldersTree, gFld("Python Commands", "", "geompy_doc/main.html")) + insDoc(aux1, gLnk("Package geompy", "", "geompy_doc/namespacegeompy.html")) + insDoc(aux1, gLnk("Namespace Members", "", "geompy_doc/namespacemembers.html")) + insDoc(aux1, gLnk("File geompy.py", "", "geompy_doc/geompy_8py.html")) +*/ + +aux1 = insFld(foldersTree, gFld("Python Commands", "", "geompy_doc/main.html")) + insDoc(aux1, gLnk("Package List", "", "geompy_doc/namespaces.html")) + insDoc(aux1, gLnk("Namespace Members", "", "geompy_doc/namespacemembers.html")) + insDoc(aux1, gLnk("File List", "", "geompy_doc/files.html")) + +/*! insDoc(foldersTree, gLnk("Graphical Class Hierarchy", "", "inherits.html")) +*/ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl new file mode 100644 index 000000000..28c2ad4ae --- /dev/null +++ b/idl/GEOM_Gen.idl @@ -0,0 +1,2134 @@ +// 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/ +// +// File : GEOM_Gen.idl +// Author : Sergey RUIN + +#ifndef __GEOM_GEN__ +#define __GEOM_GEN__ + +#include "SALOME_Exception.idl" +#include "SALOME_Component.idl" +#include "SALOMEDS.idl" + +#include "SALOME_GenericObj.idl" + +module GEOM +{ + /*! + * Topological types of shapes (like Open Cascade types) + */ + enum shape_type { COMPOUND, COMPSOLID, SOLID, SHELL, + FACE, WIRE, EDGE, VERTEX, SHAPE }; + + + /*! + * State of shape relatively geometrical surface like plane, sphere or cylinder. + * Is used in functions GEOM_IShapesOperations.GetShapesOn() + */ + enum shape_state + { + /*! Shape is on surface */ + ST_ON, + + /*! + * Shape is in the direction defined by the normal and not on surface. + * For plane it means above the plane, + * For sphere and cylinder it means outside of volume, bounded by the surface. + */ + ST_OUT, + + /*! + * Shape is in the direction defined by the normal and on surface. + * ONOUT = ON || OUT + */ + ST_ONOUT, + + /*! + * Complementary to ONOUT. + * For plane it means below the plane, + * For sphere and cylinder it means inside the volume, bounded by the surface + * (beyond axis and surface for cylinder and beyond cented and surface for sphere). + */ + ST_IN, + + /*! + * Complementary to OUT. + * ONIN = ON || IN + */ + ST_ONIN + }; + + typedef sequence string_array; + typedef sequence short_array; + typedef sequence ListOfLong; + typedef sequence ListOfDouble; + + interface GEOM_Object; + + typedef sequence ListOfGO; + + /*! + * GEOM_Object: interface of geometric object + */ + interface GEOM_Object : SALOME::GenericObj + { + + /*! + * Get an entry of the object in GEOM component. + */ + string GetEntry(); + + /*! + * Get ID of study, where the object is created. + */ + long GetStudyID(); + + /*! + * Get internal type of the object (POINT, BOX, CYLINDER, EXTRUSION...). + */ + long GetType(); + + /*! + * Get a shape_type of the object value. + */ + shape_type GetShapeType(); + + /*! + * Set name of the object. + * \param theName is a name which will be associated with this object. + */ + void SetName (in string theName); + + /*! + * Get name of the object associated with this object. + */ + string GetName(); + + /*! + * Set a Study entry where this object was published. + */ + void SetStudyEntry (in string theEntry); + + /*! + * Get a Study entry where this object was published. + */ + string GetStudyEntry(); + + /*! + * Get a list of all GEOM objects on which were the arguments + * when this object was constructed and modified. + * \note This method is supposed to be used by GUI only. + */ + ListOfGO GetDependency(); + + /*! + * Get a list of GEOM objects on which the last function that created or modified the object depends. + * \note This method is supposed to be used by GUI only. + */ + ListOfGO GetLastDependency(); + + /*! + * Get the TopoDS_Shape, for colocated case only. + */ + long getShape(); + + /*! + ###################################################################### + * Internal methods (For sub shape identification) + ###################################################################### + */ + + /*! + * Get geometric shape of the object as a byte stream + */ + SALOMEDS::TMPFile GetShapeStream(); + + /* + * Returns True if this object is not a sub shape of another object. + */ + boolean IsMainShape(); + + /* + * Get a list of ID's of sub shapes in the main shape. + * \note Internal method, suppopsed to be used only by GEOM_Client + */ + ListOfLong GetSubShapeIndices(); + + /* + * Get a main shape object to which this object is a sub shape + * \note Internal method, suppopsed to be used only by GEOM_Client + */ + GEOM_Object GetMainShape(); + + /* + * Return true if geom object representes a shape. + * For example, method return false for GEOM_MARKER + */ + boolean IsShape(); + }; + + + /*! + * GEOM_IOperations: basic methods of all geometric operations + */ + interface GEOM_IOperations : SALOME::GenericObj + { + /*! + * To know, if the operation was successfully performed + */ + boolean IsDone(); + + /*! + * Set the operation error code + * \param theErrorID is a string describing the error occured + * \note This method is supposed to be used only by interfaces inheriting from IOperations. + */ + void SetErrorCode (in string theErrorID); + + /*! + * Get the operation error code + */ + string GetErrorCode(); + + /*! + * Get ID of study, where the operation is defined + */ + long GetStudyID(); + + /*! + * Opens a new transaction + */ + void StartOperation(); + + /*! + * Closes the previously opened trasaction + */ + void FinishOperation(); + + /*! + * Aborts the previously opened transaction + */ + void AbortOperation(); + }; + + /*! + * GEOM_IBasicOperations: interface for basic geometry creation + * (Point, Vector, Plane, Marker) + */ + interface GEOM_IBasicOperations : GEOM_IOperations + { + /*! + * Create point by three coordinates. + * \param theX The X coordinate of the point. + * \param theY The Y coordinate of the point. + * \param theZ The Z coordinate of the point. + * \return New GEOM_Object, containing the created point. + */ + GEOM_Object MakePointXYZ (in double theX, in double theY, in double theZ); + + /*! + * Create a point, distant from the referenced point + * on the given distances along the coordinate axes. + * \param theReference The referenced point. + * \param theX Displacement from the referenced point along OX axis. + * \param theY Displacement from the referenced point along OY axis. + * \param theZ Displacement from the referenced point along OZ axis. + * \return New GEOM_Object, containing the created point. + */ + GEOM_Object MakePointWithReference (in GEOM_Object theReference, + in double theX, in double theY, in double theZ); + + /*! + * Create a point, corresponding to the given parameter on the given curve. + * \param theRefCurve The referenced curve. + * \param theParameter Value of parameter on the referenced curve. + * \return New GEOM_Object, containing the created point. + */ + GEOM_Object MakePointOnCurve (in GEOM_Object theRefCurve, + in double theParameter); + + /*! + * Create a vector with the given components. + * \param theDX X component of the vector. + * \param theDY Y component of the vector. + * \param theDZ Z component of the vector. + * \return New GEOM_Object, containing the created vector. + */ + GEOM_Object MakeVectorDXDYDZ (in double theDX, + in double theDY, + in double theDZ); + + /*! + * Create a vector between two points. + * \param thePnt1 Start point for the vector. + * \param thePnt2 End point for the vector. + * \return New GEOM_Object, containing the created vector. + */ + GEOM_Object MakeVectorTwoPnt (in GEOM_Object thePnt1, in GEOM_Object thePnt2); + + /*! + * Create a line, passing through the given point + * and parrallel to the given direction + * \param thePnt Point. The resulting line will pass through it. + * \param theDir Direction. The resulting line will be parallel to it. + * \return New GEOM_Object, containing the created line. + */ + GEOM_Object MakeLine (in GEOM_Object thePnt, in GEOM_Object theDir); + + /*! + * Create a line, passing through the given points + * \param thePnt1 First of two points, defining the line. + * \param thePnt2 Second of two points, defining the line. + * \return New GEOM_Object, containing the created line. + */ + GEOM_Object MakeLineTwoPnt (in GEOM_Object thePnt1, in GEOM_Object thePnt2); + + /*! + * Create a plane, passing through the three given points + * \param thePnt1 First of three points, defining the plane. + * \param thePnt2 Second of three points, defining the plane. + * \param thePnt3 Fird of three points, defining the plane. + * \param theTrimSize Half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + */ + GEOM_Object MakePlaneThreePnt (in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in GEOM_Object thePnt3, + in double theTrimSize); + + /*! + * Create a plane, passing through the given point + * and normal to the given vector. + * \param thePnt Point, the plane has to pass through. + * \param theVec Vector, defining the plane normal direction. + * \param theTrimSize Half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + */ + GEOM_Object MakePlanePntVec (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theTrimSize); + + /*! + * Create a plane, similar to the existing one, but with another size of representing face. + * \param theFace Referenced plane. + * \param theTrimSize New half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + */ + GEOM_Object MakePlaneFace (in GEOM_Object theFace, + in double theTrimSize); + + /*! + * Create a local coordinate system. + * \param theOX,theOY,theOZ Three coordinates of coordinate system origin. + * \param theXDX,theXDY,theXDZ Three components of OX direction + * \param theYDX,theYDY,theYDZ Three components of OY direction + * \return New GEOM_Object, containing the created coordinate system. + */ + GEOM_Object MakeMarker (in double theOX , in double theOY , in double theOZ, + in double theXDX, in double theXDY, in double theXDZ, + in double theYDX, in double theYDY, in double theYDZ); + }; + + interface GEOM_ITransformOperations : GEOM_IOperations + { + /*! + * Translate the given object along the vector, specified by its end points. + * \param theObject The object to be translated. + * \param thePoint1 Start point of translation vector. + * \param thePoint2 End point of translation vector. + * \return theObject. + */ + GEOM_Object TranslateTwoPoints (in GEOM_Object theObject, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); + + /*! + * Translate the given object along the vector, specified + * by its end points, creating its copy before the translation. + * \param theObject The object to be translated. + * \param thePoint1 Start point of translation vector. + * \param thePoint2 End point of translation vector. + * \return New GEOM_Object, containing the translated object. + */ + GEOM_Object TranslateTwoPointsCopy (in GEOM_Object theObject, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); + + /*! + * Translate the given object along the vector, specified by its components. + * \param theObject The object to be translated. + * \param theDX,theDY,theDZ Components of translation vector. + * \return theObject. + */ + GEOM_Object TranslateDXDYDZ (in GEOM_Object theObject, + in double theDX, in double theDY, in double theDZ); + + /*! + * Translate the given object along the vector, specified + * by its components, creating its copy before the translation. + * \param theObject The object to be translated. + * \param theDX,theDY,theDZ Components of translation vector. + * \return New GEOM_Object, containing the translated object. + */ + GEOM_Object TranslateDXDYDZCopy (in GEOM_Object theObject, + in double theDX, in double theDY, in double theDZ); + + + /*! + * Translate the given object along the given vector. + * \param theObject The object to be translated. + * \param theVector Translation vector, giving both direction and distance. + * \return theObject. + */ + GEOM_Object TranslateVector (in GEOM_Object theObject, + in GEOM_Object theVector); + + /*! + * Translate the given object along the given vector, + * creating its copy before the translation. + * \param theObject The object to be translated. + * \param theVector Translation vector, giving both direction and distance. + * \return New GEOM_Object, containing the translated object. + */ + GEOM_Object TranslateVectorCopy (in GEOM_Object theObject, + in GEOM_Object theVector); + + /*! + * Translate the given object along the given vector a given number times + * \param theObject The object to be translated. + * \param theVector Direction of the translation. + * \param theStep Distance to translate on. + * \param theNbTimes Quantity of translations to be done. + * \return New GEOM_Object, containing compound of all + * the shapes, obtained after each translation. + */ + GEOM_Object MultiTranslate1D (in GEOM_Object theObject, + in GEOM_Object theVector, + in double theStep, + in long theNbTimes); + + /*! + * Conseqently apply two specified translations to theObject specified number of times. + * \param theObject The object to be translated. + * \param theVector1 Direction of the first translation. + * \param theStep1 Step of the first translation. + * \param theNbTimes1 Quantity of translations to be done along theVector1. + * \param theVector2 Direction of the second translation. + * \param theStep2 Step of the second translation. + * \param theNbTimes2 Quantity of translations to be done along theVector2. + * \return New GEOM_Object, containing compound of all + * the shapes, obtained after each translation. + */ + GEOM_Object MultiTranslate2D (in GEOM_Object theObject, + in GEOM_Object theVector1, + in double theStep1, + in long theNbTimes1, + in GEOM_Object theVector2, + in double theStep2, + in long theNbTimes2); + + /*! + * Rotate the given object around the given axis on the given angle. + * \param theObject The object to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in radians. + * \return theObject. + */ + GEOM_Object Rotate (in GEOM_Object theObject, + in GEOM_Object theAxis, + in double theAngle); + + /*! + * Rotate the given object around the given axis + * on the given angle, creating its copy before the rotatation. + * \param theObject The object to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in radians. + * \return New GEOM_Object, containing the rotated object. + */ + GEOM_Object RotateCopy (in GEOM_Object theObject, + in GEOM_Object theAxis, + in double theAngle); + + /*! + * Rotate the given object around the given axis a given number times. + * Rotation angle will be 2*PI/theNbTimes. + * \param theObject The object to be rotated. + * \param theAxis The rotation axis. + * \param theNbTimes Quantity of rotations to be done. + * \return New GEOM_Object, containing compound of all the + * shapes, obtained after each rotation. + */ + GEOM_Object MultiRotate1D (in GEOM_Object theObject, + in GEOM_Object theAxis, + in long theNbTimes); + + /*! + * Rotate the given object around the + * given axis on the given angle a given number + * times and multi-translate each rotation result. + * Translation direction passes through center of gravity + * of rotated shape and its projection on the rotation axis. + * \param theObject The object to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in graduces. + * \param theNbTimes1 Quantity of rotations to be done. + * \param theStep Translation distance. + * \param theNbTimes2 Quantity of translations to be done. + * \return New GEOM_Object, containing compound of all the + * shapes, obtained after each transformation. + */ + GEOM_Object MultiRotate2D (in GEOM_Object theObject, + in GEOM_Object theAxis, + in double theAngle, + in long theNbTimes1, + in double theStep, + in long theNbTimes2); + + /*! + * Replace the given object by an object, + * symmetrical to it relatively the given plane. + * \param theObject The object to be mirrored. + * \param thePlane Plane of symmetry. + */ + GEOM_Object MirrorPlane (in GEOM_Object theObject, in GEOM_Object thePlane); + + /*! + * Create an object, symmetrical + * to the given one relatively the given plane. + * \param theObject The object to be mirrored. + * \param thePlane Plane of symmetry. + * \return New GEOM_Object, containing the mirrored shape. + */ + GEOM_Object MirrorPlaneCopy (in GEOM_Object theObject, in GEOM_Object thePlane); + + /*! + * Replace the given object by an object, + * symmetrical to it relatively the given axis. + * \param theObject The object to be mirrored. + * \param theAxis Axis of symmetry. + * \return theObject. + */ + GEOM_Object MirrorAxis (in GEOM_Object theObject, in GEOM_Object theAxis); + + /*! + * Create an object, symmetrical + * to the given one relatively the given axis. + * \param theObject The object to be mirrored. + * \param theAxis Axis of symmetry. + * \return New GEOM_Object, containing the mirrored object. + */ + GEOM_Object MirrorAxisCopy (in GEOM_Object theObject, in GEOM_Object theAxis); + + /*! + * Replace the given object by an object, symmetrical to it relatively the given point. + * \param theObject The object to be mirrored. + * \param thePoint Point of symmetry. + * \return theObject. + */ + GEOM_Object MirrorPoint (in GEOM_Object theObject, in GEOM_Object thePoint); + + /*! + * Create an object, symmetrical to the given one relatively the given point. + * \param theObject The object to be mirrored. + * \param thePoint Point of symmetry. + * \return New GEOM_Object, containing the mirrored object. + */ + GEOM_Object MirrorPointCopy (in GEOM_Object theObject, in GEOM_Object thePoint); + + /*! + * Replace the given object by its offset. + * \param theObject The base object for the offset. + * \param theOffset Offset value. + * \return theObject. + */ + GEOM_Object OffsetShape (in GEOM_Object theObject, in double theOffset); + + /*! + * Create new object as offset of the given one. + * \param theObject The base object for the offset. + * \param theOffset Offset value. + * \return New GEOM_Object, containing the offset object. + */ + GEOM_Object OffsetShapeCopy (in GEOM_Object theObject, in double theOffset); + + /*! + * Scale the given object by the factor. + * \param theObject The object to be scaled. + * \param thePoint Center point for scaling. + * \param theFactor Scaling factor value. + * \return theObject. + */ + GEOM_Object ScaleShape (in GEOM_Object theObject, in GEOM_Object thePoint, + in double theFactor); + + /*! + * Scale the given object by the factor, creating its copy before the scaling. + * \param theObject The object to be scaled. + * \param thePoint Center point for scaling. + * \param theFactor Scaling factor value. + * \return New GEOM_Object, containing the scaled shape. + */ + GEOM_Object ScaleShapeCopy (in GEOM_Object theObject, in GEOM_Object thePoint, + in double theFactor); + + /*! + * Modify the Location of the given object by LCS + */ + GEOM_Object PositionShape (in GEOM_Object theObject, + in GEOM_Object theStartLCS, + in GEOM_Object theEndLCS); + + /*! + * Modify the Location of the given object by LCS + * creating its copy before the setting + */ + GEOM_Object PositionShapeCopy (in GEOM_Object theObject, + in GEOM_Object theStartLCS, + in GEOM_Object theEndLCS); + }; + + /*! + * GEOM_I3DPrimOperations: Interface for 3D primitives creation + * Box, Cylinder, Cone, Sphere, Prism (extrusion), + * Pipe (extrusion along contour), Revolution, Solid (from shell). + */ + interface GEOM_I3DPrimOperations : GEOM_IOperations + { + /*! + * Create a box with specified dimensions along the coordinate axes + * and with edges, parallel to the coordinate axes. + * Center of the box will be at point (DX/2, DY/2, DZ/2). + * \param theDX Length of Box edges, parallel to OX axis. + * \param theDY Length of Box edges, parallel to OY axis. + * \param theDZ Length of Box edges, parallel to OZ axis. + * \return New GEOM_Object, containing the created box. + */ + GEOM_Object MakeBoxDXDYDZ (in double theDX, in double theDY, in double theDZ); + + /*! + * Create a box with two specified opposite vertices, + * and with edges, parallel to the coordinate axes + * \param thePnt1 First of two opposite vertices. + * \param thePnt2 Second of two opposite vertices. + * \return New GEOM_Object, containing the created box. + */ + GEOM_Object MakeBoxTwoPnt (in GEOM_Object thePnt1, in GEOM_Object thePnt2); + + /*! + * Create a cylinder with given radius and height at + * the origin of coordinate system. Axis of the cylinder + * will be collinear to the OZ axis of the coordinate system. + * \param theR Cylinder radius. + * \param theH Cylinder height. + * \return New GEOM_Object, containing the created cylinder. + */ + GEOM_Object MakeCylinderRH (in double theR, in double theH); + + /*! + * Create a cylinder with given base point, axis, radius and height. + * \param thePnt Central point of cylinder base. + * \param theAxis Cylinder axis. + * \param theR Cylinder radius. + * \param theH Cylinder height. + * \return New GEOM_Object, containing the created cylinder. + */ + GEOM_Object MakeCylinderPntVecRH (in GEOM_Object thePnt, + in GEOM_Object theAxis, + in double theR, + in double theH); + + /*! + * Create a cone with given height and radiuses at + * the origin of coordinate system. Axis of the cone will + * be collinear to the OZ axis of the coordinate system. + * \param theR1 Radius of the first cone base. + * \param theR2 Radius of the second cone base. + * \note If both radiuses are non-zero, the cone will be truncated. + * \note If the radiuses are equal, a cylinder will be created instead. + * \param theH Cone height. + * \return New GEOM_Object, containing the created cone. + */ + GEOM_Object MakeConeR1R2H (in double theR1, in double theR2, in double theH); + + /*! + * Create a cone with given base point, axis, height and radiuses. + * \param thePnt Central point of the first cone base. + * \param theAxis Cone axis. + * \param theR1 Radius of the first cone base. + * \param theR2 Radius of the second cone base. + * \note If both radiuses are non-zero, the cone will be truncated. + * \note If the radiuses are equal, a cylinder will be created instead. + * \param theH Cone height. + * \return New GEOM_Object, containing the created cone. + */ + GEOM_Object MakeConePntVecR1R2H (in GEOM_Object thePnt, + in GEOM_Object theAxis, + in double theR1, + in double theR2, + in double theH); + + /*! + * Create a torus with given radiuses at the origin of coordinate system. + * \param theRMajor Torus major radius. + * \param theRMinor Torus minor radius. + * \return New GEOM_Object, containing the created torus. + */ + GEOM_Object MakeTorusRR (in double theRMajor, + in double theRMinor); + + /*! + * Create a torus with given center, normal vector and radiuses. + * \param thePnt Torus central point. + * \param theVec Torus axis of symmetry. + * \param theRMajor Torus major radius. + * \param theRMinor Torus minor radius. + * \return New GEOM_Object, containing the created torus. + */ + GEOM_Object MakeTorusPntVecRR (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theRMajor, + in double theRMinor); + + /*! + * Create a sphere with given radius at the origin of coordinate system. + * \param theR Sphere radius. + * \return New GEOM_Object, containing the created sphere. + */ + GEOM_Object MakeSphereR (in double theR); + + /*! + * Create a sphere with given center and radius. + * \param thePnt Sphere center. + * \param theR Sphere radius. + * \return New GEOM_Object, containing the created . + */ + GEOM_Object MakeSpherePntR (in GEOM_Object thePnt, in double theR); + + /*! + * Create a shape by extrusion of the base shape along the vector, + * i.e. all the space, transfixed by the base shape during its translation + * along the vector on the given distance. + * \param theBase Base shape to be extruded. + * \param theVec Direction of extrusion. + * \param theH Prism dimension along theVec. + * \return New GEOM_Object, containing the created prism. + */ + GEOM_Object MakePrismVecH (in GEOM_Object theBase, + in GEOM_Object theVec, + in double theH); + + /*! + * Create a shape by extrusion of the base shape along a vector, defined by two points. + * \param theBase Base shape to be extruded. + * \param thePoint1 First end of extrusion vector. + * \param thePoint2 Second end of extrusion vector. + * \return New GEOM_Object, containing the created prism. + */ + GEOM_Object MakePrismTwoPnt (in GEOM_Object theBase, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); + + /*! + * Create a shape by extrusion of the base shape along + * the path shape. The path shape can be a wire or an edge. + * \param theBase Base shape to be extruded. + * \param thePath Path shape to extrude the base shape along it. + * \return New GEOM_Object, containing the created pipe. + */ + GEOM_Object MakePipe (in GEOM_Object theBase, in GEOM_Object thePath); + + /*! + * Create a shape by revolution of the base shape around the axis + * on the given angle, i.e. all the space, transfixed by the base + * shape during its rotation around the axis on the given angle. + * \param theBase Base shape to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in radians. + * \return New GEOM_Object, containing the created revolution. + */ + GEOM_Object MakeRevolutionAxisAngle (in GEOM_Object theBase, + in GEOM_Object theAxis, + in double theAngle); + + /*! + * Create a filling from the given compound of contours. + * \param theMinDeg a minimal degree + * \param theMaxDeg a maximal degree + * \param theTol2D a 2d tolerance + * \param theTol3D a 3d tolerance + * \param theNbIter a number of iteration + * \return New GEOM_Object, containing the created filling surface. + */ + GEOM_Object MakeFilling (in GEOM_Object theShape, + in long theMinDeg, in long theMaxDeg, + in double theTol2D, in double theTol3D, + in long theNbIter); + }; + + /*! + * GEOM_IShapesOperations: Interface for Shapes creation: + * Edge from two points, Wire from edges, Face from wire, + * Shell from faces, Solid from shells, Compound from shapes + */ + interface GEOM_IShapesOperations : GEOM_IOperations + { + /*! + * Create a linear edge with specified ends. + * \param thePnt1 Point for the first end of edge. + * \param thePnt2 Point for the second end of edge. + * \return New GEOM_Object, containing the created edge. + */ + GEOM_Object MakeEdge (in GEOM_Object thePnt1, in GEOM_Object thePnt2); + + /*! + * Create a wire from the set of edges and wires. + * \param theEdgesAndWires List of edge and/or wires. + * \return New GEOM_Object, containing the created wire. + */ + GEOM_Object MakeWire (in ListOfGO theEdgesAndWires); + + /*! + * Create a face on the given wire. + * \param theWire Wire to build the face on. + * \param isPlanarWanted If TRUE, only planar face will be built. + * If impossible, NULL object will be returned. + * \return New GEOM_Object, containing the created face. + */ + GEOM_Object MakeFace (in GEOM_Object theWire, in boolean isPlanarWanted); + + /*! + * Create a face on the given wires set. + * \param theWires List of wires to build the face on. + * \param isPlanarWanted If TRUE, only planar face will be built. + * If impossible, NULL object will be returned. + * \return New GEOM_Object, containing the created face. + */ + GEOM_Object MakeFaceWires (in ListOfGO theWires, in boolean isPlanarWanted); + + /*! + * Create a shell from the set of faces and shells. + * \param theFacesAndShells List of faces and/or shells. + * \return New GEOM_Object, containing the created shell. + */ + GEOM_Object MakeShell (in ListOfGO theFacesAndShells); + + /*! + * Create a solid, bounded by the given shell. + * \param theShell Bounding shell. + * \return New GEOM_Object, containing the created solid. + */ + GEOM_Object MakeSolidShell (in GEOM_Object theShell); + + /*! + * Create a solid, bounded by the given shells. + * \param theShells Bounding shells. + * \return New GEOM_Object, containing the created solid. + */ + GEOM_Object MakeSolidShells (in ListOfGO theShells); + + /*! + * Create a compound of the given shapes. + * \param theShapes List of shapes to put in compound. + * \return New GEOM_Object, containing the created compound. + */ + GEOM_Object MakeCompound (in ListOfGO theShapes); + + /*! + * Replace coincident faces in theShape by one face. + * \param theShape Initial shape. + * \param theTolerance Maximum distance between faces, which can be considered as coincident. + * \return New GEOM_Object, containing a copy of theShape without coincident faces. + */ + GEOM_Object MakeGlueFaces (in GEOM_Object theShape, in double theTolerance); + + /*! + * Explode a shape on subshapes of a given type. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param isSorted If this parameter is TRUE, sub-shapes will be + * sorted by coordinates of their gravity centers. + * \return List of sub-shapes of type theShapeType, contained in theShape. + */ + ListOfGO MakeExplode (in GEOM_Object theShape, + in long theShapeType, + in boolean isSorted); + + /*! + * Explode a shape on subshapes of a given type. + * Does the same, as the above method, but returns IDs of sub-shapes, + * not GEOM_Objects. It works faster. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param isSorted If this parameter is TRUE, sub-shapes will be + * sorted by coordinates of their gravity centers. + * \return List of IDs of sub-shapes of type theShapeType, contained in theShape. + */ + ListOfLong SubShapeAllIDs (in GEOM_Object theShape, + in long theShapeType, + in boolean isSorted); + + /*! + * Get a sub shape defined by its unique ID inside \a theMainShape + * \note The sub shape GEOM_Objects can has ONLY ONE function. + * Don't try to apply modification operations on them. + */ + GEOM_Object GetSubShape (in GEOM_Object theMainShape, + in long theID); + + /*! + * Count number of faces in the given shape. + * \param theShape Shape to count faces in. + * \return Number of faces in the given shape. + */ + long NumberOfFaces (in GEOM_Object theShape); + + /*! + * Count number of edges in the given shape. + * \param theShape Shape to count edges in. + * \return Number of edges in theShape. + */ + long NumberOfEdges (in GEOM_Object theShape); + + /*! + * Reverses an orientation the given shape. + * \param theShape Shape to be reversed. + * \return The reversed copy of theShape. + */ + GEOM_Object ChangeOrientation (in GEOM_Object theShape); + + /*! + * Retrieve all free faces from the given shape. + * Free face is a face, which is not shared between two shells of the shape. + * \param theShape Shape to find free faces in. + * \return List of IDs of all free faces, contained in theShape. + */ + ListOfLong GetFreeFacesIDs (in GEOM_Object theShape); + + /*! + * Get all sub-shapes of theShape1 of the given type, shared with theShape2. + * \param theShape1 Shape to find sub-shapes in. + * \param theShape2 Shape to find shared sub-shapes with. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of sub-shapes of theShape1, shared with theShape2. + */ + ListOfGO GetSharedShapes (in GEOM_Object theShape1, + in GEOM_Object theShape2, + in long theShapeType); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified plane by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAx1 Vector (or line, or linear edge), specifying normal + * direction and location of the plane to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of all found sub-shapes. + */ + ListOfGO GetShapesOnPlane (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theAx1, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified cylinder by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAxis Vector (or line, or linear edge), specifying + * axis of the cylinder to find shapes on. + * \param theRadius Radius of the cylinder to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of all found sub-shapes. + */ + ListOfGO GetShapesOnCylinder (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theAxis, + in double theRadius, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified sphere by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theCenter Point, specifying center of the sphere to find shapes on. + * \param theRadius Radius of the sphere to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of all found sub-shapes. + */ + ListOfGO GetShapesOnSphere (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theCenter, + in double theRadius, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified quadrangle by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theTopLeftPoint Top left quadrangle corner + * \param theTopRigthPoint Top right quadrangle corner + * \param theBottomLeftPoint Bottom left quadrangle corner + * \param theBottomRigthPoint Bottom right quadrangle corner + * \param theState The state of the subshapes to find. + * \return List of all found sub-shapes. + */ + ListOfGO GetShapesOnQuadrangle (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theTopLeftPoint, + in GEOM_Object theTopRigthPoint, + in GEOM_Object theBottomLeftPoint, + in GEOM_Object theBottomRigthPoint, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified plane by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAx1 Vector (or line, or linear edge), specifying normal + * direction and location of the plane to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of IDs of all found sub-shapes. + */ + ListOfLong GetShapesOnPlaneIDs (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theAx1, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified cylinder by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAxis Vector (or line, or linear edge), specifying + * axis of the cylinder to find shapes on. + * \param theRadius Radius of the cylinder to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of IDs of all found sub-shapes. + */ + ListOfLong GetShapesOnCylinderIDs (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theAxis, + in double theRadius, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified sphere by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theCenter Point, specifying center of the sphere to find shapes on. + * \param theRadius Radius of the sphere to find shapes on. + * \param theState The state of the subshapes to find. + * \return List of IDs of all found sub-shapes. + */ + ListOfLong GetShapesOnSphereIDs (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theCenter, + in double theRadius, + in shape_state theState); + + /*! + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified quadrangle by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theTopLeftPoint Top left quadrangle corner + * \param theTopRigthPoint Top right quadrangle corner + * \param theBottomLeftPoint Bottom left quadrangle corner + * \param theBottomRigthPoint Bottom right quadrangle corner + * \param theState The state of the subshapes to find. + * \return List of IDs of all found sub-shapes. + */ + ListOfLong GetShapesOnQuadrangleIDs (in GEOM_Object theShape, + in long theShapeType, + in GEOM_Object theTopLeftPoint, + in GEOM_Object theTopRigthPoint, + in GEOM_Object theBottomLeftPoint, + in GEOM_Object theBottomRigthPoint, + in shape_state theState); + + /*! + * Get sub-shape(s) of theShapeWhere, which are + * coincident with \a theShapeWhat or could be a part of it. + * \param theShapeWhere Shape to find sub-shapes of. + * \param theShapeWhat Shape, specifying what to find. + * \return Group of all found sub-shapes or a single found sub-shape. + */ + GEOM_Object GetInPlace (in GEOM_Object theShapeWhere, + in GEOM_Object theShapeWhat); + }; + + /*! + * GEOM_IBlocksOperations: Interface for Blocks construction + * Face from points or edges, Block from faces, + * Blocks multi-translation and multi-rotation + */ + interface GEOM_IBlocksOperations : GEOM_IOperations + { + /*! + * Creation of blocks + */ + + /*! + * Create a quadrangle face from four edges. Order of Edges is not + * important. It is not necessary that edges share the same vertex. + * \param theEdge1,theEdge2,theEdge3,theEdge4 Edges for the face bound. + * \return New GEOM_Object, containing the created face. + */ + GEOM_Object MakeQuad (in GEOM_Object theEdge1, + in GEOM_Object theEdge2, + in GEOM_Object theEdge3, + in GEOM_Object theEdge4); + + /*! + * Create a quadrangle face on two edges. + * The missing edges will be built by creating the shortest ones. + * \param theEdge1,theEdge2 Two opposite edges for the face. + * \return New GEOM_Object, containing the created face. + */ + GEOM_Object MakeQuad2Edges (in GEOM_Object theEdge1, + in GEOM_Object theEdge2); + + /*! + * Create a quadrangle face with specified corners. + * The missing edges will be built by creating the shortest ones. + * \param thePnt1,thePnt2,thePnt3,thePnt4 Corner vertices for the face. + * \return New GEOM_Object, containing the created face. + */ + GEOM_Object MakeQuad4Vertices (in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in GEOM_Object thePnt3, + in GEOM_Object thePnt4); + + /*! + * Create a hexahedral solid, bounded by the six given faces. Order of + * faces is not important. It is not necessary that Faces share the same edge. + * \param theFace1-theFace6 Faces for the hexahedral solid. + * \return New GEOM_Object, containing the created solid. + */ + GEOM_Object MakeHexa (in GEOM_Object theFace1, + in GEOM_Object theFace2, + in GEOM_Object theFace3, + in GEOM_Object theFace4, + in GEOM_Object theFace5, + in GEOM_Object theFace6); + + /*! + * Create a hexahedral solid between two given faces. + * The missing faces will be built by creating the smallest ones. + * \param theFace1,theFace2 Two opposite faces for the hexahedral solid. + * \return New GEOM_Object, containing the created solid. + */ + GEOM_Object MakeHexa2Faces (in GEOM_Object theFace1, + in GEOM_Object theFace2); + + /*! + * Extract elements of blocks and blocks compounds + */ + + /*! + * Get a vertex, found in the given shape by its coordinates. + * \param theShape Block or a compound of blocks. + * \param theX,theY,theZ Coordinates of the sought vertex. + * \param theEpsilon Maximum allowed distance between the resulting + * vertex and point with the given coordinates. + * \return New GEOM_Object, containing the found vertex. + */ + GEOM_Object GetPoint (in GEOM_Object theShape, + in double theX, + in double theY, + in double theZ, + in double theEpsilon); + + /*! + * Get an edge, found in the given shape by two given vertices. + * \param theShape Block or a compound of blocks. + * \param thePoint1,thePoint2 Points, close to the ends of the desired edge. + * \return New GEOM_Object, containing the found edge. + */ + GEOM_Object GetEdge (in GEOM_Object theShape, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2); + + /*! + * Find an edge of the given shape, which has minimal distance to the given point. + * \param theShape Block or a compound of blocks. + * \param thePoint Point, close to the desired edge. + * \return New GEOM_Object, containing the found edge. + */ + GEOM_Object GetEdgeNearPoint (in GEOM_Object theShape, + in GEOM_Object thePoint); + + /*! + * Returns a face, found in the given shape by four given corner vertices. + * \param theShape Block or a compound of blocks. + * \param thePoint1-thePoint4 Points, close to the corners of the desired face. + * \return New GEOM_Object, containing the found face. + */ + GEOM_Object GetFaceByPoints (in GEOM_Object theShape, + in GEOM_Object thePoint1, + in GEOM_Object thePoint2, + in GEOM_Object thePoint3, + in GEOM_Object thePoint4); + + /*! + * Get a face of block, found in the given shape by two given edges. + * \param theShape Block or a compound of blocks. + * \param theEdge1,theEdge2 Edges, close to the edges of the desired face. + * \return New GEOM_Object, containing the found face. + */ + GEOM_Object GetFaceByEdges (in GEOM_Object theShape, + in GEOM_Object theEdge1, + in GEOM_Object theEdge2); + + /*! + * Find a face, opposite to the given one in the given block. + * \param theBlock Must be a hexahedral solid. + * \param theFace Face of \a theBlock, opposite to the desired face. + * \return New GEOM_Object, containing the found face. + */ + GEOM_Object GetOppositeFace (in GEOM_Object theBlock, + in GEOM_Object theFace); + + /*! + * Find a face of the given shape, which has minimal distance to the given point. + * \param theShape Block or a compound of blocks. + * \param thePoint Point, close to the desired face. + * \return New GEOM_Object, containing the found face. + */ + GEOM_Object GetFaceNearPoint (in GEOM_Object theShape, + in GEOM_Object thePoint); + + /*! + * Find a face of block, whose outside normale has minimal angle with the given vector. + * \param theShape Block or a compound of blocks. + * \param theVector Vector, close to the normale of the desired face. + * \return New GEOM_Object, containing the found face. + */ + GEOM_Object GetFaceByNormale (in GEOM_Object theBlock, + in GEOM_Object theVector); + + /*! + * Extract blocks from blocks compounds + */ + + /*! + * Check, if the compound contains only specified blocks. + * \param theCompound The compound to check. + * \param theMinNbFaces If solid has lower number of faces, it is not a block. + * \param theMaxNbFaces If solid has higher number of faces, it is not a block. + * \note If theMaxNbFaces = 0, the maximum number of faces is not restricted. + * \return TRUE, if the given compound contains only blocks. + * \return theNbBlocks Number of specified blocks in theCompound. + */ + boolean IsCompoundOfBlocks (in GEOM_Object theCompound, + in long theMinNbFaces, + in long theMaxNbFaces, + out long theNbBlocks); + + /*! + * Enumeration of Blocks Compound defects. + */ + enum BCErrorType + { + /* Each element of the compound should be a Block */ + NOT_BLOCK, + + /* An element is a potential block, but has degenerated and/or seam edge(s). */ + EXTRA_EDGE, + + /* A connection between two Blocks should be an entire face or an entire edge */ + INVALID_CONNECTION, + + /* The compound should be connexe */ + NOT_CONNECTED, + + /* The glue between two quadrangle faces should be applied */ + NOT_GLUED + }; + + /*! + * Description of Blocks Compound defect: type and incriminated sub-shapes. + */ + struct BCError + { + BCErrorType error; + ListOfLong incriminated; + }; + + /*! + * Sequence of all Blocks Compound defects. + */ + typedef sequence BCErrors; + + /*! + * Check, if the compound of blocks is given. + * To be considered as a compound of blocks, the + * given shape must satisfy the following conditions: + * - Each element of the compound should be a Block (6 faces and 12 edges). + * - A connection between two Blocks should be an entire quadrangle face or an entire edge. + * - The compound should be connexe. + * - The glue between two quadrangle faces should be applied. + * \note Single block is also accepted as a valid compound of blocks. + * \param theCompound The compound to check. + * \return TRUE, if the given shape is a compound of blocks. + * \return theErrors Structure, containing discovered errors and incriminated sub-shapes. + */ + boolean CheckCompoundOfBlocks (in GEOM_Object theCompound, + out BCErrors theErrors); + + /*! + * Convert sequence of Blocks Compound errors, returned by + * CheckCompoundOfBlocks(), into string. + * \param theCompound The bad compound. + * \param theErrors The sequence of \a theCompound errors. + * \return String, describing all the errors in form, suitable for printing. + */ + string PrintBCErrors (in GEOM_Object theCompound, + in BCErrors theErrors); + + /*! + * Remove all seam and degenerated edges from \a theShape. + * Unite faces and edges, sharing one surface. + * \param theShape The compound or single solid to remove irregular edges from. + * \return Improved shape. + */ + GEOM_Object RemoveExtraEdges (in GEOM_Object theShape); + + /*! + * Check, if the given shape is a blocks compound. + * Fix all detected errors. + * \note Single block can be also fixed by this method. + * \param theCompound The compound to check and improve. + * \return Improved compound. + */ + GEOM_Object CheckAndImprove (in GEOM_Object theCompound); + + /*! + * Get all the blocks, contained in the given compound. + * \param theCompound The compound to explode. + * \param theMinNbFaces If solid has lower number of faces, it is not a block. + * \param theMaxNbFaces If solid has higher number of faces, it is not a block. + * \note If theMaxNbFaces = 0, the maximum number of faces is not restricted. + * \return List of GEOM_Objects, containing the retrieved blocks. + */ + ListOfGO ExplodeCompoundOfBlocks (in GEOM_Object theCompound, + in long theMinNbFaces, + in long theMaxNbFaces); + + /*! + * Find block, containing the given point inside its volume or on boundary. + * \param theCompound Compound, to find block in. + * \param thePoint Point, close to the desired block. If the point lays on + * boundary between some blocks, we return block with nearest center. + * \return New GEOM_Object, containing the found block. + */ + GEOM_Object GetBlockNearPoint (in GEOM_Object theCompound, + in GEOM_Object thePoint); + + /*! + * Find block, containing all the elements, passed as the parts, or maximum quantity of them. + * \param theCompound Compound, to find block in. + * \param theParts List of faces and/or edges and/or vertices to be parts of the found block. + * \return New GEOM_Object, containing the found block. + */ + GEOM_Object GetBlockByParts (in GEOM_Object theCompound, + in ListOfGO theParts); + + /*! + * Return all blocks, containing all the elements, passed as the parts. + * \param theCompound Compound, to find blocks in. + * \param theParts List of faces and/or edges and/or vertices to be parts of the found blocks. + * \return List of GEOM_Objects, containing the found blocks. + */ + ListOfGO GetBlocksByParts (in GEOM_Object theCompound, + in ListOfGO theParts); + + /*! + * Operations on blocks with gluing of result + */ + + /*! + * Multi-transformate block and glue the result. + * Transformation is defined so, as to superpose theDirFace1 with theDirFace2. + * \param theBlock Hexahedral solid to be multi-transformed. + * \param theDirFace1 First direction face global index. + * \param theDirFace2 Second direction face global index. + * \param theNbTimes Quantity of transformations to be done. + * \note Global index of sub-shape can be obtained, using method + * GEOM_ILocalOperations.GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeMultiTransformation1D (in GEOM_Object theBlock, + in long theDirFace1, + in long theDirFace2, + in long theNbTimes); + + /*! + * Multi-transformate block and glue the result. + * \param theBlock Hexahedral solid to be multi-transformed. + * \param theDirFace1U,theDirFace2U Direction faces for the first transformation. + * \param theDirFace1V,theDirFace2V Direction faces for the second transformation. + * \param theNbTimesU,theNbTimesV Quantity of transformations to be done. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeMultiTransformation2D (in GEOM_Object theBlock, + in long theDirFace1U, + in long theDirFace2U, + in long theNbTimesU, + in long theDirFace1V, + in long theDirFace2V, + in long theNbTimesV); + + /*! + * Special operation - propagation + */ + + /*! + * Build all possible propagation groups. + * Propagation group is a set of all edges, opposite to one (main) + * edge of this group directly or through other opposite edges. + * Notion of Opposite Edge make sence only on quadrangle face. + * \param theShape Shape to build propagation groups on. + * \return List of GEOM_Objects, each of them is a propagation group. + */ + ListOfGO Propagate (in GEOM_Object theShape); + }; + + /*! + * GEOM_IBooleanOperations: Interface for boolean operations (Cut, Fuse, Common) + */ + interface GEOM_IBooleanOperations : GEOM_IOperations + { + /*! + * Perform one of boolean operations on two given shapes. + * \param theShape1 First argument for boolean operation. + * \param theShape2 Second argument for boolean operation. + * \param theOperation Indicates the operation to be done: + * 1 - Common, 2 - Cut, 3 - Fuse, 4 - Section. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeBoolean (in GEOM_Object theShape1, + in GEOM_Object theShape2, + in long theOperation); + + /*! + * Perform partition operation. + * \param theShapes Shapes to be intersected. + * \param theTools Shapes to intersect theShapes. + * \param theKeepInside Shapes, outside which the results will be deleted. + * Each shape from theKeepInside must belong to theShapes also. + * \param theRemoveInside Shapes, inside which the results will be deleted. + * Each shape from theRemoveInside must belong to theShapes also. + * \param theLimit Type of resulting shapes (corresponding to TopAbs_ShapeEnum). + * \param theRemoveWebs If TRUE, perform Glue 3D algorithm. + * \param theMaterials Material indices for each shape. Make sence, only if theRemoveWebs is TRUE. + * \return New GEOM_Object, containing the result shapes. + */ + GEOM_Object MakePartition (in ListOfGO theShapes, + in ListOfGO theTools, + in ListOfGO theKeepInside, + in ListOfGO theRemoveInside, + in short theLimit, + in boolean theRemoveWebs, + in ListOfLong theMaterials); + + /*! + * Perform partition of the Shape with the Plane + * \param theShape Shape to be intersected. + * \param thePlane Tool shape, to intersect theShape. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeHalfPartition (in GEOM_Object theShape, + in GEOM_Object thePlane); + }; + + /*! + * GEOM_ICurvesOperations: Interface for curves creation. + * Polyline, Circle, Spline (Bezier and Interpolation) + */ + interface GEOM_ICurvesOperations : GEOM_IOperations + { + /*! + * Create a circle with given center, normal vector and radius. + * \param thePnt Circle center. + * \param theVec Vector, normal to the plane of the circle. + * \param theR Circle radius. + * \return New GEOM_Object, containing the created circle. + */ + GEOM_Object MakeCirclePntVecR (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theR); + /*! + * Create a circle, passing through three given points + * \param thePnt1,thePnt2,thePnt3 Points, defining the circle. + * \return New GEOM_Object, containing the created circle. + */ + GEOM_Object MakeCircleThreePnt (in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in GEOM_Object thePnt3); + + /*! + * Create an ellipse with given center, normal vector and radiuses. + * \param thePnt Ellipse center. + * \param theVec Vector, normal to the plane of the ellipse. + * \param theRMajor Major ellipse radius. + * \param theRMinor Minor ellipse radius. + * \return New GEOM_Object, containing the created ellipse. + */ + GEOM_Object MakeEllipse (in GEOM_Object thePnt, + in GEOM_Object theVec, + in double theRMajor, + in double theRMinor); + + /*! + * Create an arc of circle, passing through three given points. + * \param thePnt1 Start point of the arc. + * \param thePnt2 Middle point of the arc. + * \param thePnt3 End point of the arc. + * \return New GEOM_Object, containing the created arc. + */ + GEOM_Object MakeArc (in GEOM_Object thePnt1, + in GEOM_Object thePnt2, + in GEOM_Object thePnt3); + + /*! + * Create a polyline on the set of points. + * \param thePoints Sequence of points for the polyline. + * \return New GEOM_Object, containing the created polyline. + */ + GEOM_Object MakePolyline (in ListOfGO thePoints); + + /*! + * Create bezier curve on the set of points. + * \param thePoints Sequence of points for the bezier curve. + * \return New GEOM_Object, containing the created bezier curve. + */ + GEOM_Object MakeSplineBezier (in ListOfGO thePoints); + + /*! + * Create B-Spline curve on the set of points. + * \param thePoints Sequence of points for the B-Spline curve. + * \return New GEOM_Object, containing the created B-Spline curve. + */ + GEOM_Object MakeSplineInterpolation (in ListOfGO thePoints); + + /*! + * Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. \n + * Edges of the resulting wire or face will be arcs of circles and/or linear segments. \n + * Format of the description string have to be the following: + * + * "Sketcher[:F x1 y1]:CMD[:CMD[:CMD...]]" + * + * Where: + * - x1, y1 are coordinates of the first sketcher point (zero by default), + * - CMD is one of + * - "R angle" : Set the direction by angle + * - "D dx dy" : Set the direction by DX & DY + * . + * \n + * - "TT x y" : Create segment by point at X & Y + * - "T dx dy" : Create segment by point with DX & DY + * - "L length" : Create segment by direction & Length + * - "IX x" : Create segment by direction & Intersect. X + * - "IY y" : Create segment by direction & Intersect. Y + * . + * \n + * - "C radius length" : Create arc by direction, radius and length(in degree) + * . + * \n + * - "WW" : Close Wire (to finish) + * - "WF" : Close Wire and build face (to finish) + * + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Nine double values, defining origin, + * OZ and OX directions of the working plane. + * \return New GEOM_Object, containing the created wire. + */ + GEOM_Object MakeSketcher (in string theCommand, in ListOfDouble theWorkingPlane); + + /*! + * Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. \n + * For format of the description string see the previous method.\n + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Planar Face of the working plane. + * \return New GEOM_Object, containing the created wire. + */ + GEOM_Object MakeSketcherOnPlane (in string theCommand, in GEOM_Object theWorkingPlane); + }; + + /*! + * GEOM_ILocalOperations: Interface for fillet and chamfer creation. + */ + interface GEOM_ILocalOperations : GEOM_IOperations + { + /*! + * Perform a fillet on all edges of the given shape. + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFilletAll (in GEOM_Object theShape, + in double theR); + + /*! + * Perform a fillet on the specified edges of the given shape + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \param theEdges Global indices of edges to perform fillet on. + * \note Global index of sub-shape can be obtained, using method GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFilletEdges (in GEOM_Object theShape, + in double theR, + in ListOfLong theEdges); + + /*! + * Perform a fillet on all edges of the specified faces of the given shape. + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \param theFaces Global indices of faces to perform fillet on. + * \note Global index of sub-shape can be obtained, using method GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeFilletFaces (in GEOM_Object theShape, + in double theR, + in ListOfLong theFaces); + + /*! + * Perform a symmetric chamfer on all edges of the given shape. + * \param theShape Shape, to perform chamfer on. + * \param theD Chamfer size along each face. + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeChamferAll (in GEOM_Object theShape, + in double theD); + + /*! + * Perform a chamfer on edges, common to the specified faces. + * with distance D1 on the Face1 + * \param theShape Shape, to perform chamfer on. + * \param theD1 Chamfer size along \a theFace1. + * \param theD2 Chamfer size along \a theFace2. + * \param theFace1,theFace2 Global indices of two faces of \a theShape. + * \note Global index of sub-shape can be obtained, using method GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeChamferEdge (in GEOM_Object theShape, + in double theD1, in double theD2, + in long theFace1, in long theFace2); + + /*! + * Perform a chamfer on all edges of the specified faces. + * with distance D1 on the first specified face (if several for one edge) + * \param theShape Shape, to perform chamfer on. + * \param theD1 Chamfer size along face from \a theFaces. If both faces, + * connected to the edge, are in \a theFaces, \a theD1 + * will be get along face, which is nearer to \a theFaces beginning. + * \param theD2 Chamfer size along another of two faces, connected to the edge. + * \param theFaces Sequence of global indices of faces of \a theShape. + * \note Global index of sub-shape can be obtained, using method GetSubShapeIndex(). + * \return New GEOM_Object, containing the result shape. + */ + GEOM_Object MakeChamferFaces (in GEOM_Object theShape, + in double theD1, in double theD2, + in ListOfLong theFaces); + + /*! + * Perform an Archimde operation on the given shape with given parameters. + * The object presenting the resulting face is returned + * \param theShape Shape to be put in water. + * \param theWeight Weight og the shape. + * \param theWaterDensity Density of the water. + * \param theMeshDeflection Deflection od the mesh, using to compute the section. + * \return New GEOM_Object, containing a section of \a theShape + * by a plane, corresponding to water level. + */ + GEOM_Object MakeArchimede (in GEOM_Object theShape, + in double theWeight, + in double theWaterDensity, + in double theMeshDeflection); + + /*! + * Get global index of \a theSubShape in \a theShape. + * \param theShape Main shape. + * \param theSubShape Sub-shape of the main shape. + * \return global index of \a theSubShape in \a theShape. + */ + long GetSubShapeIndex (in GEOM_Object theShape, in GEOM_Object theSubShape); + }; + + /*! + * GEOM_IHealingOperations: Interface for shape healing operations. + * Shape Processing, SuppressFaces, etc. + */ + interface GEOM_IHealingOperations : GEOM_IOperations + { + /*! + * Apply a sequence of Shape Healing operators to the given object. + * \param theShapes Shape to be processed. + * \param theOperators List of names of operators ("FixShape", "SplitClosedFaces", etc.). + * \param theParameters List of names of parameters + * ("FixShape.Tolerance3d", "SplitClosedFaces.NbSplitPoints", etc.). + * \param theValues List of values of parameters, in the same order + * as parameters are listed in \a theParameters list. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object ProcessShape (in GEOM_Object theShapes, + in string_array theOperators, + in string_array theParameters, + in string_array theValues); + + /*! + * Get default sequence of operators, their parameters and parameters' values + * of Shape Process operation. In the current implementation the defaults are + * read from the file pointed by CSF_ShHealingDefaults environmental variable. + * \param theOperators Output. Default list of names of operators. + * \param theParameters Output. Default list of names of parameters. + * \param theValues Output. List of default values of parameters, in the same order + * as parameters are listed in \a theParameters list. + */ + void GetShapeProcessParameters (out string_array theOperators, + out string_array theParameters, + out string_array theValues); + /*! + * Get parameters and parameters' values for the given Shape Process operation. + * In the current implementation the defaults are + * read from the file pointed by CSF_ShHealingDefaults environmental variable. + * \param theOperator Input. The operator's name. + * \param theParameters Output. Default list of names of parameters. + * \param theValues Output. List of default values of parameters, in the same order + * as parameters are listed in \a theParameters list. + */ + void GetOperatorParameters (in string theOperator, + out string_array theParameters, + out string_array theValues); + + /*! + * Remove faces from the given object (shape). + * \param theObject Shape to be processed. + * \param theFaces Indices of faces to be removed, if EMPTY then the method + * removes ALL faces of the given object. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object SuppressFaces (in GEOM_Object theObject, in short_array theFaces); + + /*! + * Close an open wire. + * \param theObject Shape to be processed. + * \param theWires Indexes of edge(s) and wire(s) to be closed within theObject's shape, + * if -1, then theObject itself is a wire. + * \param isCommonVertex If TRUE : closure by creation of a common vertex, + * If FALS : closure by creation of an edge between ends. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object CloseContour (in GEOM_Object theObject, in short_array theWires, + in boolean isCommonVertex); + + /*! + * Remove internal wires and edges from the given object (face). + * \param theObject Shape to be processed. + * \param theWires Indices of wires to be removed, if EMPTY then the method + * removes ALL internal wires of the given object. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object RemoveIntWires (in GEOM_Object theObject, in short_array theWires); + + /*! + * Remove internal closed contours (holes) from the given object. + * \param theObject Shape to be processed. + * \param theWires Indices of wires to be removed, if EMPTY then the method + * removes ALL internal holes of the given object + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object FillHoles (in GEOM_Object theObject, in short_array theWires); + + /*! + * Sewing of the given object. + * \param theObject Shape to be processed. + * \param theTolerance Required tolerance value. + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object Sew (in GEOM_Object theObject, in double theTolerance); + + /*! + * Addition of a point to a given edge object. + * \param theObject Shape to be processed. + * \param theEdgeIndex Index of edge to be divided within theObject's shape, + * if -1, then theObject itself is the edge. + * \param theValue Value of parameter on edge or length parameter, + * depending on \a isByParameter. + * \param isByParameter If TRUE : \a theValue is treated as a curve parameter [0..1], + * if FALSE : \a theValue is treated as a length parameter [0..1] + * \return New GEOM_Object, containing processed shape. + */ + GEOM_Object DivideEdge (in GEOM_Object theObject, in short theEdgeIndex, + in double theValue, in boolean isByParameter); + + /*! + * Get a list of wires (wrapped in GEOM_Object-s), + * that constitute a free boundary of the given shape. + * \param theObject Shape to get free boundary of. + * \param theClosedWires Output. Closed wires on the free boundary of the given shape. + * \param theOpenWires Output. Open wires on the free boundary of the given shape. + * \return FALSE, if an error(s) occured during the method execution. + */ + boolean GetFreeBoundary (in GEOM_Object theObject, + out ListOfGO theClosedWires, + out ListOfGO theOpenWires); + }; + + /*! + * GEOM_IInsertOperations: Interface for shape insert operations (like copy, import). + * + */ + interface GEOM_IInsertOperations : GEOM_IOperations + { + /*! + * Create a copy of the given object + */ + GEOM_Object MakeCopy (in GEOM_Object theOriginal); + + /*! + * Export the given shape into a file with given name. + * \param theObject Shape to be stored in the file. + * \param theFileName Name of the file to store the given shape in. + * \param theFormatName Specify format for the shape storage. + * Available formats can be obtained with ImportTranslators() method. + */ + void Export (in GEOM_Object theObject, in string theFileName, in string theFormatName); + + /*! + * Import a shape from the BRep or IGES or STEP file + * (depends on given format) with given name. + * \param theFileName The file, containing the shape. + * \param theFormatName Specify format for the file reading. + * Available formats can be obtained with ImportTranslators() method. + * \return New GEOM_Object, containing the imported shape. + */ + GEOM_Object Import (in string theFileName, in string theFormatName); + + /*! + * Get the supported import formats and corresponding patterns for File dialog. + * \param theFormats Output. List of formats, available for import. + * \param thePatterns Output. List of file patterns, corresponding to available formats. + * \return Returns available formats and patterns through the arguments. + */ + void ImportTranslators (out string_array theFormats, + out string_array thePatterns); + + /*! + * Get the supported export formats and corresponding patterns for File dialog. + * \param theFormats Output. List of formats, available for export. + * \param thePatterns Output. List of file patterns, corresponding to available formats. + * \return Returns available formats and patterns through the arguments. + */ + void ExportTranslators (out string_array theFormats, + out string_array thePatterns); + }; + + /*! + * GEOM_IMeasureOperations: Interface for measurement (distance, whatis) and + * properties calculation (like Centre of Mass, Inertia, etc.). + * + */ + interface GEOM_IMeasureOperations : GEOM_IOperations + { + /*! + * Get summarized length of all wires, + * area of surface and volume of the given shape. + * \param theShape Shape to define properties of. + * \param theLength Output. Summarized length of all wires of the given shape. + * \param theSurfArea Output. Area of surface of the given shape. + * \param theVolume Output. Volume of the given shape. + * \return Returns shape properties through the last three arguments. + */ + void GetBasicProperties (in GEOM_Object theShape, + out double theLength, + out double theSurfArea, + out double theVolume); + + /*! + * Get a point, situated at the centre of mass of theShape. + * \param theShape Shape to define centre of mass of. + * \return New GEOM_Object, containing the created point. + */ + GEOM_Object GetCentreOfMass (in GEOM_Object theShape); + + /*! + * Get inertia matrix and moments of inertia of theShape. + * \param theShape Shape to calculate inertia of. + * \param I(1-3)(1-3) Output. Components of the inertia matrix of the given shape. + * \param Ix,Iy,Iz Output. Moments of inertia of the given shape. + * \return Returns inertia through the last twelve arguments. + */ + void GetInertia (in GEOM_Object theShape, + out double I11, out double I12, out double I13, + out double I21, out double I22, out double I23, + out double I31, out double I32, out double I33, + out double Ix , out double Iy , out double Iz); + + /*! + * Get parameters of bounding box of the given shape + * \param theShape Shape to obtain bounding box of. + * \param Xmin,Xmax Output. Limits of shape along OX axis. + * \param Ymin,Ymax Output. Limits of shape along OY axis. + * \param Zmin,Zmax Output. Limits of shape along OZ axis. + * \return Returns parameters of bounding box through the last six arguments. + */ + void GetBoundingBox (in GEOM_Object theShape, + out double Xmin, out double Xmax, + out double Ymin, out double Ymax, + out double Zmin, out double Zmax); + + /*! + * Get min and max tolerances of sub-shapes of theShape + * \param theShape Shape, to get tolerances of. + * \param FaceMin,FaceMax Output. Min and max tolerances of the faces. + * \param EdgeMin,EdgeMax Output. Min and max tolerances of the edges. + * \param VertMin,VertMax Output. Min and max tolerances of the vertices. + * \return Returns shape tolerances through the last six arguments. + */ + void GetTolerance (in GEOM_Object theShape, + out double FaceMin, out double FaceMax, + out double EdgeMin, out double EdgeMax, + out double VertMin, out double VertMax); + + /*! + * Check a topology of the given shape. + * \param theShape Shape to check validity of. + * \param theDescription Output. Description of problems in the shape, if they are. + * \return TRUE, if the shape "seems to be valid" from the topological point of view. + */ + boolean CheckShape (in GEOM_Object theShape, + out string theDescription); + + /*! + * Obtain description of the given shape + * \param theShape Shape to be described. + * \return Description of the given shape. + */ + string WhatIs (in GEOM_Object theShape); + + /*! + * Get minimal distance between the given shapes. + * \param theShape1,theShape2 Shapes to find minimal distance between. + * \param X1,Y1,Z1 Output. Coordinates of point on theShape1, nearest to theShape2. + * \param X2,Y2,Z2 Output. Coordinates of point on theShape2, nearest to theShape1. + * \return Value of the minimal distance between the given shapes. + */ + double GetMinDistance (in GEOM_Object theShape1, in GEOM_Object theShape2, + out double X1, out double Y1, out double Z1, + out double X2, out double Y2, out double Z2); + + + /*! + * Get point coordinates + */ + void PointCoordinates (in GEOM_Object theShape, out double X, out double Y, out double Z); + }; + + + /*! + * GEOM_IGroupOperations: Interface for groups creation. + */ + interface GEOM_IGroupOperations : GEOM_IOperations + { + /*! + * Creates a new group which will store sub shapes of theMainShape + * \param theMainShape is a GEOM object on which the group is selected + * \param theShapeType defines a shape type of the group + * \return a newly created GEOM group + */ + GEOM_Object CreateGroup (in GEOM_Object theMainShape, in long theShapeType); + + /*! + * Adds a sub object with ID theSubShapeId to the group + * \param theGroup is a GEOM group to which the new sub shape is added + * \param theSubShapeId is a sub shape ID in the main object. + * \note Use method ILocalOperations.GetSubShapeIndex() to get an ID by the sub shape + */ + void AddObject (in GEOM_Object theGroup, in long theSubShapeId); + + /*! + * Removes a sub object with ID \a theSubShapeId from the group + * \param theGroup is a GEOM group from which the sub shape is removed. + * \param theSubShapeId is a sub shape ID in the main object. + * \note Use method ILocalOperations.GetSubShapeIndex() to get an ID by the sub shape + */ + void RemoveObject (in GEOM_Object theGroup, in long theSubShapeId); + + /*! + * Adds to the group all the given shapes. No errors, if some shapes are alredy included. + * \param theGroup is a GEOM group to which the new sub shapes are added. + * \param theSubShapes is a list of sub shapes to be added. + */ + void UnionList (in GEOM_Object theGroup, in ListOfGO theSubShapes); + + /*! + * Removes from the group all the given shapes. No errors, if some shapes are not included. + * \param theGroup is a GEOM group from which the sub-shapes are removed. + * \param theSubShapes is a list of sub-shapes to be removed. + */ + void DifferenceList (in GEOM_Object theGroup, in ListOfGO theSubShapes); + + /*! + * Adds to the group all the given shapes. No errors, if some shapes are alredy included. + * \param theGroup is a GEOM group to which the new sub shapes are added. + * \param theSubShapes is a list of IDs of sub shapes to be added. + */ + void UnionIDs (in GEOM_Object theGroup, in ListOfLong theSubShapes); + + /*! + * Removes from the group all the given shapes. No errors, if some shapes are not included. + * \param theGroup is a GEOM group from which the sub-shapes are removed. + * \param theSubShapes is a list of IDs of sub-shapes to be removed. + */ + void DifferenceIDs (in GEOM_Object theGroup, in ListOfLong theSubShapes); + + /*! + * Returns a type of sub objects stored in the group + * \param theGroup is a GEOM group which type is returned. + */ + long GetType (in GEOM_Object theGroup); + + /*! + * Returns a main shape associated with the group + * \param theGroup is a GEOM group for which a main shape object is requested + * \return a GEOM object which is a main shape for theGroup + */ + GEOM_Object GetMainShape (in GEOM_Object theGroup); + + /*! + * Returns a list of sub objects ID stored in the group + * \param theGroup is a GEOM group for which a list of IDs is requested + */ + ListOfLong GetObjects (in GEOM_Object theGroup); + }; + + + /*! + * GEOM_Gen: Interface to access other GEOM interfaces. + * Also contains some methods to access and manage GEOM objects. + */ + interface GEOM_Gen : Engines::Component,SALOMEDS::Driver + { + /*! + * Undo/Redo Management + */ + + void Undo (in long theStudyID); + + void Redo (in long theStudyID); + + /*! + * Publishing manangement + * Adds in theStudy a object theObject under with a name theName, + * if theFather is not NULL the object is placed under thFather's SObject. + * Returns a SObject where theObject is placed + */ + SALOMEDS::SObject AddInStudy (in SALOMEDS::Study theStudy, + in GEOM_Object theObject, + in string theName, + in GEOM_Object theFather); + + /*! + * Methods to access interfaces for objects creation and transformation + */ + GEOM_IBasicOperations GetIBasicOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_ITransformOperations GetITransformOperations(in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_I3DPrimOperations GetI3DPrimOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IShapesOperations GetIShapesOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IBooleanOperations GetIBooleanOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_ICurvesOperations GetICurvesOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_ILocalOperations GetILocalOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IHealingOperations GetIHealingOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IInsertOperations GetIInsertOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IMeasureOperations GetIMeasureOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IBlocksOperations GetIBlocksOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + GEOM_IGroupOperations GetIGroupOperations (in long theStudyID) raises (SALOME::SALOME_Exception); + + /*! + * Objects Management + */ + + /*! + * Removes the object from the GEOM component + * \param theObject is a GEOM object to be removed + */ + void RemoveObject (in GEOM_Object theObject); + + /*! + * Returns an object defined by the study and its entry in the GEOM component + * \param theStudyID is a SALOMEDS Study ID + * \param theEntry is an entry of the requested GEOM object in the GEOM component + * \note if the object has not previously been created a NULL GEOM object is returned + */ + GEOM_Object GetObject (in long theStudyID, in string theEntry); + + /*! + * Add a sub shape defined by indices in \a theIndices + * (contains unique IDs of sub shapes inside theMainShape) + * \note The sub shape GEOM_Objects can has ONLY ONE function. + * Don't try to apply modification operations on them. + * \note Internal method + */ + GEOM_Object AddSubShape (in GEOM_Object theMainShape, in ListOfLong theIndices); + + /*! + * GEOM object's IOR Management + */ + + /*! + * Returns a GEOM Object defined by its IOR + * \param theIOR a string containg an IOR of the requested GEOM object + */ + GEOM_Object GetIORFromString (in string theIOR); + + /*! + * Returns a string which contains an IOR of the GEOM object + * \param theObject is a GEOM object which IOR is requested + */ + string GetStringFromIOR (in GEOM_Object theObject); + + /*! + * Returns a name with which a GEOM object was dumped into python script + * \param theStudyEntry is an entry of the GEOM object in the study + */ + string GetDumpName (in string theStudyEntry); + + /*! + * Returns all names with which a GEOM objects was dumped + * into python script to avoid the same names in SMESH script + */ + string_array GetAllDumpNames(); + }; +}; + +#endif diff --git a/resources/GEOMCatalog.xml b/resources/GEOMCatalog.xml new file mode 100644 index 000000000..c6931a556 --- /dev/null +++ b/resources/GEOMCatalog.xml @@ -0,0 +1,4276 @@ + + + + + + + + + + + + + + + GEOM + Geometry + Geom + NRI + 3.1.0 + Geometry component + 1 + ModuleGeom.png + + + + + GEOM + No comment + + + + + + Undo + + + + 1 + + + + theStudyID + long + + + + + + + + + Redo + + + + 1 + + + + theStudyID + long + + + + + + + + + AddInStudy + + + + 1 + + + + theStudy + Study + + + + theObject + GEOM_Object + + + + theName + string + + + + theFather + GEOM_Object + + + + + + return + SObject + + + + + + + + GetIBasicOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IBasicOperations + + + + + + + + GetITransformOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_ITransformOperations + + + + + + + + GetI3DPrimOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_I3DPrimOperations + + + + + + + + GetIShapesOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IShapesOperations + + + + + + + + GetIBooleanOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IBooleanOperations + + + + + + + + GetICurvesOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_ICurvesOperations + + + + + + + + GetILocalOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_ILocalOperations + + + + + + + + GetIHealingOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IHealingOperations + + + + + + + + GetIInsertOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IInsertOperations + + + + + + + + GetIMeasureOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IMeasureOperations + + + + + + + + GetIBlocksOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IBlocksOperations + + + + + + + + GetIGroupOperations + + + + 1 + + + + theStudyID + long + + + + + + return + GEOM_IGroupOperations + + + + + + + + RemoveObject + + + + 1 + + + + theObject + GEOM_Object + + + + + + + + + GetObject + + + + 1 + + + + theStudyID + long + + + + theEntry + string + + + + + + return + GEOM_Object + + + + + + + + AddSubShape + + + + 1 + + + + theMainShape + GEOM_Object + + + + theIndices + ListOfLong + + + + + + return + GEOM_Object + + + + + + + + GetIORFromString + + + + 1 + + + + ior + string + + + + + + return + GEOM_Object + + + + + + + + GetStringFromIOR + + + + 1 + + + + theObject + GEOM_Object + + + + + + return + string + + + + + + + + hostname = localhost + + + + GEOM_Superv + GEOM_Superv + OTHER + mkr + 3.1.0 + Supervision wrapper for Geometry component + 1 + + + + GEOM_Superv + unknown + + + SetStudyID + mkr + 2.1.0 + unknown + 0 + + + theStudyID + long + unknown + + + + + + + CreateListOfGO + mkr + 2.1.0 + unknown + 0 + + + + return + GEOM_List + unknown + + + + + + AddItemToListOfGO + mkr + 2.1.0 + unknown + 0 + + + theList + GEOM_List + unknown + + + theObject + GEOM_Object + unknown + + + + + theList + GEOM_List + unknown + + + + + + CreateListOfLong + mkr + 2.1.0 + unknown + 0 + + + + return + GEOM_List + unknown + + + + + + AddItemToListOfLong + mkr + 2.1.0 + unknown + 0 + + + theList + GEOM_List + unknown + + + theObject + long + unknown + + + + + theList + GEOM_List + unknown + + + + + + CreateListOfDouble + mkr + 2.1.0 + unknown + 0 + + + + return + GEOM_List + unknown + + + + + + AddItemToListOfDouble + mkr + 2.1.0 + unknown + 0 + + + theList + GEOM_List + unknown + + + theObject + double + unknown + + + + + theList + GEOM_List + unknown + + + + + + MakePointXYZ + mkr + 2.1.0 + unknown + 0 + + + theX + double + unknown + + + theY + double + unknown + + + theZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePointWithReference + mkr + 2.1.0 + unknown + 0 + + + theReference + GEOM_Object + unknown + + + theX + double + unknown + + + theY + double + unknown + + + theZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePointOnCurve + mkr + 2.1.0 + unknown + 0 + + + theRefCurve + GEOM_Object + unknown + + + theParameter + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeVectorDXDYDZ + mkr + 2.1.0 + unknown + 0 + + + theDX + double + unknown + + + theDY + double + unknown + + + theDZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeVectorTwoPnt + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeLineTwoPnt + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePlaneThreePnt + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + thePnt3 + GEOM_Object + unknown + + + theTrimSize + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePlanePntVec + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theVec + GEOM_Object + unknown + + + theTrimSize + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePlaneFace + mkr + 2.1.0 + unknown + 0 + + + theFace + GEOM_Object + unknown + + + theTrimSize + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeMarker + mkr + 2.1.0 + unknown + 0 + + + theOX + double + unknown + + + theOY + double + unknown + + + theOZ + double + unknown + + + theXDX + double + unknown + + + theXDY + double + unknown + + + theXDZ + double + unknown + + + theYDX + double + unknown + + + theYDY + double + unknown + + + theYDZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeBox + mkr + 2.1.0 + unknown + 0 + + + theX1 + double + unknown + + + theY1 + double + unknown + + + theZ1 + double + unknown + + + theX2 + double + unknown + + + theY2 + double + unknown + + + theZ2 + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeBoxDXDYDZ + mkr + 2.1.0 + unknown + 0 + + + theDX + double + unknown + + + theDY + double + unknown + + + theDZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeBoxTwoPnt + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCylinderPntVecRH + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theRadius + double + unknown + + + theHeight + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCylinderRH + mkr + 2.1.0 + unknown + 0 + + + theR + double + unknown + + + theH + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSphere + mkr + 2.1.0 + unknown + 0 + + + theX + double + unknown + + + theY + double + unknown + + + theZ + double + unknown + + + theRadius + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSphereR + mkr + 2.1.0 + unknown + 0 + + + theR + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSpherePntR + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theR + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeTorusPntVecRR + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theVec + GEOM_Object + unknown + + + theRMajor + double + unknown + + + theRMinor + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeTorusRR + mkr + 2.1.0 + unknown + 0 + + + theRMajor + double + unknown + + + theRMinor + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeConePntVecR1R2H + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theR1 + double + unknown + + + theR2 + double + unknown + + + theHeight + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeConeR1R2H + mkr + 2.1.0 + unknown + 0 + + + theR1 + double + unknown + + + theR2 + double + unknown + + + theHeight + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePrismVecH + mkr + 2.1.0 + unknown + 0 + + + theBase + GEOM_Object + unknown + + + theVec + GEOM_Object + unknown + + + theH + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePrismTwoPnt + mkr + 2.1.0 + unknown + 0 + + + theBase + GEOM_Object + unknown + + + thePoint1 + GEOM_Object + unknown + + + thePoint2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePipe + mkr + 2.1.0 + unknown + 0 + + + theBase + GEOM_Object + unknown + + + thePath + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeRevolutionAxisAngle + mkr + 2.1.0 + unknown + 0 + + + theBase + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theAngle + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFilling + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theMinDeg + long + unknown + + + theMaxDeg + long + unknown + + + theTol2D + double + unknown + + + theTol3D + double + unknown + + + theNbIter + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeBoolean + mkr + 2.1.0 + unknown + 0 + + + theShape1 + GEOM_Object + unknown + + + theShape2 + GEOM_Object + unknown + + + theOperation + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFuse + mkr + 2.1.0 + unknown + 0 + + + theShape1 + GEOM_Object + unknown + + + theShape2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePartition + mkr + 2.1.0 + unknown + 0 + + + theShapes + GEOM_List + unknown + + + theTools + GEOM_List + unknown + + + theKeepInside + GEOM_List + unknown + + + theRemoveInside + GEOM_List + unknown + + + theLimit + short + unknown + + + theRemoveWebs + boolean + unknown + + + theMaterials + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeHalfPartition + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + thePlane + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCopy + mkr + 2.1.0 + unknown + 0 + + + theOriginal + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + Export + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theFileName + string + unknown + + + theFormatName + string + unknown + + + + + + + Import + mkr + 2.1.0 + unknown + 0 + + + theFileName + string + unknown + + + theFormatName + string + unknown + + + + + return + GEOM_Object + unknown + + + + + + ImportTranslators + mkr + 2.1.0 + unknown + 0 + + + + theFormats + string_array + unknown + + + thePatterns + string_array + unknown + + + + + + ExportTranslators + mkr + 2.1.0 + unknown + 0 + + + + theFormats + string_array + unknown + + + thePatterns + string_array + unknown + + + + + + TranslateTwoPoints + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint1 + GEOM_Object + unknown + + + thePoint2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + TranslateTwoPointsCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint1 + GEOM_Object + unknown + + + thePoint2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + TranslateDXDYDZ + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theDX + double + unknown + + + theDY + double + unknown + + + theDZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + TranslateDXDYDZCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theDX + double + unknown + + + theDY + double + unknown + + + theDZ + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + TranslateVector + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theVector + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + TranslateVectorCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theVector + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MultiTranslate1D + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theVector + GEOM_Object + unknown + + + theStep + double + unknown + + + theNbTimes + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MultiTranslate2D + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theVector1 + GEOM_Object + unknown + + + theStep1 + double + unknown + + + theNbTimes1 + long + unknown + + + theVector2 + GEOM_Object + unknown + + + theStep2 + double + unknown + + + theNbTimes2 + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + Rotate + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theAngle + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + RotateCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theAngle + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MultiRotate1D + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theNbTimes + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MultiRotate2D + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + theAngle + double + unknown + + + theNbTimes1 + long + unknown + + + theStep + double + unknown + + + theNbTimes2 + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorPlane + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePlane + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorPlaneCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePlane + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorAxis + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorAxisCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theAxis + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorPoint + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MirrorPointCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + OffsetShape + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theOffset + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + OffsetShapeCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theOffset + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + ScaleShape + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + theFactor + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + ScaleShapeCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + theFactor + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + PositionShape + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theStartLCS + GEOM_Object + unknown + + + theEndLCS + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + PositionShapeCopy + mkr + 2.1.0 + unknown + 0 + + + theObject + GEOM_Object + unknown + + + theStartLCS + GEOM_Object + unknown + + + theEndLCS + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeEdge + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeWire + mkr + 2.1.0 + unknown + 0 + + + theEdgesAndWires + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFace + mkr + 2.1.0 + unknown + 0 + + + theWire + GEOM_Object + unknown + + + isPlanarWanted + boolean + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFaceWires + mkr + 2.1.0 + unknown + 0 + + + theWires + GEOM_List + unknown + + + isPlanarWanted + boolean + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeShell + mkr + 2.1.0 + unknown + 0 + + + theFacesAndShells + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSolidShell + mkr + 2.1.0 + unknown + 0 + + + theShell + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSolidShells + mkr + 2.1.0 + unknown + 0 + + + theShells + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCompound + mkr + 2.1.0 + unknown + 0 + + + theShapes + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeGlueFaces + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theTolerance + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeExplode + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theShapeType + long + unknown + + + isSorted + boolean + unknown + + + + + return + GEOM_List + unknown + + + + + + NumberOfFaces + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + + + return + long + unknown + + + + + + NumberOfEdges + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + + + return + long + unknown + + + + + + ChangeOrientation + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeQuad4Vertices + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + thePnt3 + GEOM_Object + unknown + + + thePnt4 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeQuad + mkr + 2.1.0 + unknown + 0 + + + theEdge1 + GEOM_Object + unknown + + + theEdge2 + GEOM_Object + unknown + + + theEdge3 + GEOM_Object + unknown + + + theEdge4 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeQuad2Edges + mkr + 2.1.0 + unknown + 0 + + + theEdge1 + GEOM_Object + unknown + + + theEdge2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeHexa + mkr + 2.1.0 + unknown + 0 + + + theFace1 + GEOM_Object + unknown + + + theFace2 + GEOM_Object + unknown + + + theFace3 + GEOM_Object + unknown + + + theFace4 + GEOM_Object + unknown + + + theFace5 + GEOM_Object + unknown + + + theFace6 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeHexa2Faces + mkr + 2.1.0 + unknown + 0 + + + theFace1 + GEOM_Object + unknown + + + theFace2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetPoint + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theX + double + unknown + + + theY + double + unknown + + + theZ + double + unknown + + + theEpsilon + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetEdge + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + thePoint1 + GEOM_Object + unknown + + + thePoint2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetEdgeNearPoint + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetFaceByPoints + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + thePoint1 + GEOM_Object + unknown + + + thePoint2 + GEOM_Object + unknown + + + thePoint3 + GEOM_Object + unknown + + + thePoint4 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetFaceByEdges + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theEdge1 + GEOM_Object + unknown + + + theEdge2 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetOppositeFace + mkr + 2.1.0 + unknown + 0 + + + theBlock + GEOM_Object + unknown + + + theFace + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetFaceNearPoint + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetFaceByNormale + mkr + 2.1.0 + unknown + 0 + + + theBlock + GEOM_Object + unknown + + + theVector + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + IsCompoundOfBlocks + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + theMinNbFaces + long + unknown + + + theMaxNbFaces + long + unknown + + + + + return + long + unknown + + + theNbBlocks + long + unknown + + + + + + CheckCompoundOfBlocks + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + + + return + long + unknown + + + theErrors + BCErrors + unknown + + + + + + PrintBCErrors + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + theErrors + BCErrors + unknown + + + + + return + string + unknown + + + + + + ExplodeCompoundOfBlocks + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + theMinNbFaces + long + unknown + + + theMaxNbFaces + long + unknown + + + + + return + GEOM_List + unknown + + + + + + GetBlockNearPoint + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + thePoint + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetBlockByParts + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + theParts + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetBlocksByParts + mkr + 2.1.0 + unknown + 0 + + + theCompound + GEOM_Object + unknown + + + theParts + GEOM_List + unknown + + + + + return + GEOM_List + unknown + + + + + + MakeMultiTransformation1D + mkr + 2.1.0 + unknown + 0 + + + theBlock + GEOM_Object + unknown + + + theDirFace1 + long + unknown + + + theDirFace2 + long + unknown + + + theNbTimes + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeMultiTransformation2D + mkr + 2.1.0 + unknown + 0 + + + theBlock + GEOM_Object + unknown + + + theDirFace1U + long + unknown + + + theDirFace2U + long + unknown + + + theNbTimesU + long + unknown + + + theDirFace1V + long + unknown + + + theDirFace2V + long + unknown + + + theNbTimesV + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCirclePntVecR + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theVec + GEOM_Object + unknown + + + theR + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeCircleThreePnt + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + thePnt3 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeEllipse + mkr + 2.1.0 + unknown + 0 + + + thePnt + GEOM_Object + unknown + + + theVec + GEOM_Object + unknown + + + theRMajor + double + unknown + + + theRMinor + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeArc + mkr + 2.1.0 + unknown + 0 + + + thePnt1 + GEOM_Object + unknown + + + thePnt2 + GEOM_Object + unknown + + + thePnt3 + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakePolyline + mkr + 2.1.0 + unknown + 0 + + + thePoints + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSplineBezier + mkr + 2.1.0 + unknown + 0 + + + thePoints + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSplineInterpolation + mkr + 2.1.0 + unknown + 0 + + + thePoints + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeSketcher + mkr + 2.1.0 + unknown + 0 + + + theCommand + string + unknown + + + theWorkingPlane + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFilletAll + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theR + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFilletEdges + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theR + double + unknown + + + theEdges + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeFilletFaces + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theR + double + unknown + + + theFaces + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeChamferAll + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theD + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeChamferEdge + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theD1 + double + unknown + + + theD2 + double + unknown + + + theFace1 + long + unknown + + + theFace2 + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeChamferFaces + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theD1 + double + unknown + + + theD2 + double + unknown + + + theFaces + GEOM_List + unknown + + + + + return + GEOM_Object + unknown + + + + + + MakeArchimede + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theWeight + double + unknown + + + theWaterDensity + double + unknown + + + theMeshDeflection + double + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetSubShapeIndex + mkr + 2.1.0 + unknown + 0 + + + theShape + GEOM_Object + unknown + + + theSubShape + GEOM_Object + unknown + + + + + return + long + unknown + + + + + + CreateGroup + mkr + 2.1.0 + unknown + 0 + + + theMainShape + GEOM_Object + unknown + + + theShapeType + long + unknown + + + + + return + GEOM_Object + unknown + + + + + + AddObject + mkr + 2.1.0 + unknown + 0 + + + theGroup + GEOM_Object + unknown + + + theSubShapeId + long + unknown + + + + + + + RemoveObject + mkr + 2.1.0 + unknown + 0 + + + theGroup + GEOM_Object + unknown + + + theSubShapeId + long + unknown + + + + + + + GetType + mkr + 2.1.0 + unknown + 0 + + + theGroup + GEOM_Object + unknown + + + + + return + long + unknown + + + + + + GetMainShape + mkr + 2.1.0 + unknown + 0 + + + theGroup + GEOM_Object + unknown + + + + + return + GEOM_Object + unknown + + + + + + GetObjects + mkr + 2.1.0 + unknown + 0 + + + theGroup + GEOM_Object + unknown + + + + + return + GEOM_List + unknown + + + + + + + + + diff --git a/src/BREPExport/BREPExport.cxx b/src/BREPExport/BREPExport.cxx new file mode 100644 index 000000000..2580cfac0 --- /dev/null +++ b/src/BREPExport/BREPExport.cxx @@ -0,0 +1,56 @@ +// 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/ +// +// File: BREPExport.cxx +// Created: Wed May 19 13:10:05 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include + +#include +#include + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + int Export(const TopoDS_Shape& theShape, const TCollection_AsciiString& theFileName) + { + MESSAGE("Export BREP into file " << theFileName.ToCString()); + + if ( !BRepTools::Write( theShape, theFileName.ToCString() ) ) + return 0; + + return 1; + } +} diff --git a/src/BREPImport/BREPImport.cxx b/src/BREPImport/BREPImport.cxx new file mode 100644 index 000000000..5412fb3e8 --- /dev/null +++ b/src/BREPImport/BREPImport.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/ +// +// File: BREPImport.cxx +// Created: Wed May 19 14:29:52 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include +#include + +#include +#include + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + TopoDS_Shape Import (const TCollection_AsciiString& theFileName, + TCollection_AsciiString& theError) + { + MESSAGE("Import BREP from file " << theFileName); + TopoDS_Shape aShape; + BRep_Builder B; + BRepTools::Read(aShape, theFileName.ToCString(), B); + if (aShape.IsNull()) { + theError = "BREP Import failed"; + } + return aShape; + } +} diff --git a/src/BasicGUI/BasicGUI_ArcDlg.cxx b/src/BasicGUI/BasicGUI_ArcDlg.cxx new file mode 100644 index 000000000..07de548cd --- /dev/null +++ b/src/BasicGUI/BasicGUI_ArcDlg.cxx @@ -0,0 +1,337 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_ArcDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_ArcDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include +#include +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : BasicGUI_ArcDlg() +// purpose : Constructs a BasicGUI_ArcDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_ArcDlg::BasicGUI_ArcDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + const char* name, bool modal, WFlags fl) + : GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | + WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ARC"))); + QPixmap image1(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); + RadioButton3->close(TRUE); + + Group3Pnts = new DlgRef_3Sel_QTD(this, "Group3Pnts"); + Group3Pnts->GroupBox1->setTitle(tr("GEOM_POINTS")); + Group3Pnts->TextLabel1->setText(tr("GEOM_POINT_I").arg("1")); + Group3Pnts->TextLabel2->setText(tr("GEOM_POINT_I").arg("2")); + Group3Pnts->TextLabel3->setText(tr("GEOM_POINT_I").arg("3")); + + Group3Pnts->LineEdit1->setReadOnly( true ); + Group3Pnts->LineEdit2->setReadOnly( true ); + Group3Pnts->LineEdit3->setReadOnly( true ); + + Group3Pnts->PushButton1->setPixmap(image1); + Group3Pnts->PushButton2->setPixmap(image1); + Group3Pnts->PushButton3->setPixmap(image1); + + Layout1->addWidget( Group3Pnts, 2, 0 ); + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_ArcDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_ArcDlg::~BasicGUI_ArcDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::Init() +{ + /* init variables */ + // myGeometryGUI->SetState( 0 ); + globalSelection( GEOM_POINT ); + + myEditCurrentArgument = Group3Pnts->LineEdit1; + myEditCurrentArgument->setFocus(); + + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(Group3Pnts->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + 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(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_ARC" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_ArcDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + // reset + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + Group3Pnts->LineEdit1->setText( "" ); + Group3Pnts->LineEdit2->setText( "" ); + Group3Pnts->LineEdit3->setText( "" ); + myEditCurrentArgument = Group3Pnts->LineEdit1; + + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +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(); + return; + } + + // 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; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +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; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == Group3Pnts->LineEdit1 || + send == Group3Pnts->LineEdit2 || + send == Group3Pnts->LineEdit3 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + // myGeometryGUI->SetState( 0 ); + globalSelection( GEOM_POINT ); + + myEditCurrentArgument = Group3Pnts->LineEdit1; + myEditCurrentArgument->setFocus(); + + Group3Pnts->LineEdit1->setText( "" ); + Group3Pnts->LineEdit2->setText( "" ); + Group3Pnts->LineEdit3->setText( "" ); + myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_ArcDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_ArcDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isEqual +// purpose : it may also be needed to check for min distance between gp_Pnt-s... +//================================================================================= +static bool isEqual( const GEOM::GEOM_Object_var& thePnt1, const GEOM::GEOM_Object_var& thePnt2 ) +{ + return thePnt1->_is_equivalent( thePnt2 ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_ArcDlg::isValid( QString& msg ) +{ + return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() && + !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_ArcDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = + GEOM::GEOM_ICurvesOperations::_narrow(getOperation())->MakeArc(myPoint1, myPoint2, myPoint3); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + return true; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_ArcDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/BasicGUI/BasicGUI_CircleDlg.cxx b/src/BasicGUI/BasicGUI_CircleDlg.cxx new file mode 100644 index 000000000..8476ef36e --- /dev/null +++ b/src/BasicGUI/BasicGUI_CircleDlg.cxx @@ -0,0 +1,435 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_CircleDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_CircleDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +//================================================================================= +// class : BasicGUI_CircleDlg() +// purpose : Constructs a BasicGUI_CircleDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_CircleDlg::BasicGUI_CircleDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CIRCLE_PV"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CIRCLE_PNTS"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CIRCLE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_CIRCLE")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image2); + RadioButton3->close(TRUE); + + GroupPntVecR = new DlgRef_2Sel1Spin(this, "GroupPntVecR"); + GroupPntVecR->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + + GroupPntVecR->TextLabel1->setText(tr("GEOM_CENTER_POINT")); + GroupPntVecR->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPntVecR->TextLabel3->setText(tr("GEOM_RADIUS")); + GroupPntVecR->PushButton1->setPixmap(image1); + GroupPntVecR->PushButton2->setPixmap(image1); + + GroupPntVecR->LineEdit1->setReadOnly( true ); + GroupPntVecR->LineEdit2->setReadOnly( true ); + + Group3Pnts = new DlgRef_3Sel_QTD(this, "Group3Pnts"); + Group3Pnts->GroupBox1->setTitle(tr("GEOM_3_POINTS")); + Group3Pnts->TextLabel1->setText(tr("GEOM_POINT1")); + Group3Pnts->TextLabel2->setText(tr("GEOM_POINT2")); + Group3Pnts->TextLabel3->setText(tr("GEOM_POINT3")); + Group3Pnts->PushButton1->setPixmap(image1); + Group3Pnts->PushButton2->setPixmap(image1); + Group3Pnts->PushButton3->setPixmap(image1); + + Group3Pnts->LineEdit1->setReadOnly( true ); + Group3Pnts->LineEdit2->setReadOnly( true ); + Group3Pnts->LineEdit3->setReadOnly( true ); + + Layout1->addWidget( GroupPntVecR, 2, 0 ); + Layout1->addWidget( Group3Pnts, 2, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_CircleDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_CircleDlg::~BasicGUI_CircleDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPntVecR->LineEdit1; + + myPoint = myDir = myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + + // myGeometryGUI->SetState( 0 ); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double aStep = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPntVecR->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, aStep, 3); + GroupPntVecR->SpinBox_DX->SetValue( 100 ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(GroupPntVecR->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPntVecR->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPntVecR->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPntVecR->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPntVecR->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPntVecR->SpinBox_DX, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_CIRCLE" ) ); + + Group3Pnts->hide(); + ConstructorsClicked( 0 ); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_CircleDlg::ConstructorsClicked( int constructorId ) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + myPoint = myDir = myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil(); + + switch ( constructorId ) + { + case 0: + { + Group3Pnts->hide(); + resize(0, 0); + GroupPntVecR->show(); + + myEditCurrentArgument = GroupPntVecR->LineEdit1; + GroupPntVecR->LineEdit1->setText(""); + GroupPntVecR->LineEdit2->setText(""); + break; + } + case 1: + { + GroupPntVecR->hide(); + resize( 0, 0 ); + Group3Pnts->show(); + + myEditCurrentArgument = Group3Pnts->LineEdit1; + Group3Pnts->LineEdit1->setText(""); + Group3Pnts->LineEdit2->setText(""); + Group3Pnts->LineEdit3->setText(""); + break; + } + } + + myEditCurrentArgument->setFocus(); + globalSelection( GEOM_POINT ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_CircleDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_CircleDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_CircleDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == GroupPntVecR->LineEdit1 ) myPoint = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPntVecR->LineEdit2 ) myDir = GEOM::GEOM_Object::_nil(); + else 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; + } + + // 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 == GroupPntVecR->LineEdit1 ) myPoint = aSelectedObject; + else if ( myEditCurrentArgument == GroupPntVecR->LineEdit2 ) myDir = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = aSelectedObject; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == GroupPntVecR->PushButton1 ) myEditCurrentArgument = GroupPntVecR->LineEdit1; + else if ( send == GroupPntVecR->PushButton2 ) myEditCurrentArgument = GroupPntVecR->LineEdit2; + else if ( send == Group3Pnts->PushButton1 ) myEditCurrentArgument = Group3Pnts->LineEdit1; + else if ( send == Group3Pnts->PushButton2 ) myEditCurrentArgument = Group3Pnts->LineEdit2; + else if ( send == Group3Pnts->PushButton3 ) myEditCurrentArgument = Group3Pnts->LineEdit3; + + myEditCurrentArgument->setFocus(); + + if ( myEditCurrentArgument == GroupPntVecR->LineEdit2 ) + globalSelection( GEOM_LINE ); + else + globalSelection( GEOM_POINT ); + SelectionIntoArgument(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPntVecR->LineEdit1 || + send == GroupPntVecR->LineEdit2 || + send == Group3Pnts->LineEdit1 || + send == Group3Pnts->LineEdit2 || + send == Group3Pnts->LineEdit3 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_POINT ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + // myGeometryGUI->SetState( 0 ); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_CircleDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + +//================================================================================= +// function : getRadius() +// purpose : +//================================================================================= +double BasicGUI_CircleDlg::getRadius() const +{ + return GroupPntVecR->SpinBox_DX->GetValue(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_CircleDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isEqual +// purpose : it may also be needed to check for min distance between gp_Pnt-s... +//================================================================================= +static bool isEqual( const GEOM::GEOM_Object_var& thePnt1, const GEOM::GEOM_Object_var& thePnt2 ) +{ + return thePnt1->_is_equivalent( thePnt2 ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_CircleDlg::isValid( QString& msg ) +{ + const int id = getConstructorId(); + if ( id == 0 ) + return !myPoint->_is_nil() && !myDir->_is_nil() && getRadius() > 0; + else if ( id == 1 ) + return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() && + !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 ); + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_CircleDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeCirclePntVecR( myPoint, myDir, getRadius() ); + res = true; + break; + case 1 : + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeCircleThreePnt( myPoint1, myPoint2, myPoint3 ); + res = true; + break; + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_CircleDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + diff --git a/src/BasicGUI/BasicGUI_CurveDlg.cxx b/src/BasicGUI/BasicGUI_CurveDlg.cxx new file mode 100644 index 000000000..a558a22f0 --- /dev/null +++ b/src/BasicGUI/BasicGUI_CurveDlg.cxx @@ -0,0 +1,397 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_CurveDlg.cxx +// Author : Nicolas REJNERI +// Module : GEOM +// $Header$ + +#include "BasicGUI_CurveDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "utilities.h" + +#include "SALOME_ListIteratorOfListIO.hxx" +#include "SALOME_ListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +using namespace std; +#include + +//================================================================================= +// class : BasicGUI_CurveDlg() +// purpose : Constructs a BasicGUI_CurveDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_CurveDlg::BasicGUI_CurveDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POLYLINE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SPLINE"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BEZIER"))); + + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CURVE_TITLE")); + + /***************************************************************/ + RadioButton1->setPixmap( image0 ); + RadioButton2->setPixmap( image3 ); + RadioButton3->setPixmap( image2 ); + + GroupPoints = new DlgRef_1Sel_QTD( this, "GroupPoints" ); + GroupPoints->GroupBox1->setTitle( tr( "GEOM_NODES" ) ); + GroupPoints->TextLabel1->setText( tr("GEOM_POINTS") ); + GroupPoints->PushButton1->setPixmap(image1); + + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_CurveDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_CurveDlg::~BasicGUI_CurveDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myPoints = new GEOM::ListOfGO(); + myPoints->length( 0 ); + + globalSelection( GEOM_POINT ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + 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())) ; + + initName( tr( "GEOM_CURVE" ) ); + ConstructorsClicked( 0 ); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::ConstructorsClicked( int id ) +{ + QString aTitle = tr( id == 0 ? "GEOM_POLYLINE" : id == 1 ? "GEOM_BEZIER" : "GEOM_INTERPOL" ); + GroupConstructors->setTitle( aTitle ); + + myPoints = new GEOM::ListOfGO(); + myPoints->length( 0 ); + + myEditCurrentArgument->setText(""); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::SetEditCurrentArgument() +{ + if ( sender() == GroupPoints->PushButton1 ) + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::LineEditReturnPressed() +{ + if ( sender() == GroupPoints->LineEdit1 ) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_CurveDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_CurveDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +/*! function : isPointInList() + * purpose : Check is point (theObject) in the list \a thePoints. + * \author enk + * \retval -1, if point not in list, else 1 in list + */ +//================================================================================= +static int isPointInList(list& thePoints, + GEOM::GEOM_Object_var& theObject) +{ + int len = thePoints.size(); + + if(len<1){ + return -1; + } + + for(list::iterator i=thePoints.begin();i!=thePoints.end();i++) + if (string((*i)->GetEntry()) == string(theObject->GetEntry())){ + return 1; + } + + return -1; +} +//================================================================================= +/*! function : removeUnnecessaryPnt() + * purpose : Remove unnecessary points from list \a theOldPoints + * \author enk + * \li \a theOldPoints - ordered sequence with unnecessary point + * \li \a theNewPoints - not ordered sequence with necessary points + */ +//================================================================================= +static void removeUnnecessaryPnt(list& theOldPoints, + GEOM::ListOfGO_var& theNewPoints) +{ + list objs_to_remove; + for(list::iterator i=theOldPoints.begin();i!=theOldPoints.end();i++){ + bool found = false; + for (int j=0;jlength() && !found ; j++){ + if(string((*i)->GetEntry()) == string(theNewPoints[j]->GetEntry())){ + found = true; + } + } + if(!found){ + objs_to_remove.push_back(*i); + //cout << "removed: " << (*i)->GetEntry() << endl; + } + } + for(list::iterator i=objs_to_remove.begin();i!=objs_to_remove.end();i++){ + theOldPoints.remove(*i); + } +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_CurveDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + Standard_Boolean aRes = Standard_False; + int i = 0; + int IOC = IObjectCount(); + bool is_append = myPoints->length() < IOC; // if true - add point, else remove + myPoints->length( IOC ); // this length may be greater than number of objects, + // that will actually be put into myPoints + for ( SALOME_ListIteratorOfListIO anIt( selectedIO() ); anIt.More(); anIt.Next() ) + { + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIt.Value(), aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes ) + { + //TopoDS_Shape aPointShape; + //if ( myGeomBase->GetShape( aSelectedObject, aPointShape, TopAbs_VERTEX ) ) + int pos = isPointInList(myOrderedSel,aSelectedObject); + if(is_append && pos==-1) + myOrderedSel.push_back(aSelectedObject); + myPoints[i++] = aSelectedObject; + } + } + + myPoints->length( i ); // this is the right length, smaller of equal to the previously set + if(IOC == 0) + myOrderedSel.clear(); + else + removeUnnecessaryPnt(myOrderedSel,myPoints); + + if(myOrderedSel.size() == myPoints->length()){ + int k=0; + for (list::iterator j=myOrderedSel.begin();j!=myOrderedSel.end();j++) + myPoints[k++] = *j; + } else { + //cout << "ERROR: Ordered sequence size != selection sequence size! ("<length()<<")"<LineEdit1->setText( QString::number( i ) + "_" + tr( "GEOM_POINT" ) + tr( "_S_" ) ); + + displayPreview(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + // myGeometryGUI->SetState( 0 ); + + globalSelection( GEOM_POINT ); + ConstructorsClicked( getConstructorId() ); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_CurveDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_CurveDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_CurveDlg::isValid( QString& msg ) +{ + return myPoints->length() > 1; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_CurveDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakePolyline( myPoints ); + res = true; + break; + case 1 : + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeSplineBezier( myPoints ); + res = true; + break; + case 2 : + anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeSplineInterpolation( myPoints ); + res = true; + break; + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_CurveDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + diff --git a/src/BasicGUI/BasicGUI_EllipseDlg.cxx b/src/BasicGUI/BasicGUI_EllipseDlg.cxx new file mode 100644 index 000000000..273d3267a --- /dev/null +++ b/src/BasicGUI/BasicGUI_EllipseDlg.cxx @@ -0,0 +1,348 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 OPEN CASCADE +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_EllipseDlg.cxx +// Author : Nicolas REJNERI +// Module : GEOM +// $Header$ + +#include "BasicGUI_EllipseDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : BasicGUI_EllipseDlg() +// purpose : Constructs a BasicGUI_EllipseDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_EllipseDlg::BasicGUI_EllipseDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ELLIPSE_PV"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_ELLIPSE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_ELLIPSE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel2Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_CENTER")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_RADIUS_MAJOR")); + GroupPoints->TextLabel4->setText(tr("GEOM_RADIUS_MINOR")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_EllipseDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_EllipseDlg::~BasicGUI_EllipseDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + // myGeometryGUI->SetState( 0 ); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + double aMajorR( 200. ), aMinorR( 100. ); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator( 0.001, 999.999, step, 3 ); + GroupPoints->SpinBox_DY->RangeStepAndValidator( 0.001, 999.999, step, 3 ); + GroupPoints->SpinBox_DX->SetValue( aMajorR ); + GroupPoints->SpinBox_DY->SetValue( aMinorR ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_ELLIPSE" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_EllipseDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + // reset + myPoint = myDir = GEOM::GEOM_Object::_nil(); + GroupPoints->LineEdit1->setText( "" ); + GroupPoints->LineEdit2->setText( "" ); + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + + return true; +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_EllipseDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_EllipseDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myPoint = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myDir = GEOM::GEOM_Object::_nil(); + return; + } + + 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 == GroupPoints->LineEdit1 ) myPoint = aSelectedObject; + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myDir = aSelectedObject; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == GroupPoints->PushButton1 ) myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == GroupPoints->PushButton2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + + myEditCurrentArgument->setFocus(); + if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + globalSelection( GEOM_LINE ); + else + globalSelection( GEOM_POINT ); + SelectionIntoArgument(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + + GroupPoints->LineEdit1->setText( "" ); + GroupPoints->LineEdit2->setText( "" ); + + myPoint = myDir = GEOM::GEOM_Object::_nil(); + globalSelection( GEOM_POINT ); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_EllipseDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::ValueChangedInSpinBox(double newValue) +{ + displayPreview(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_EllipseDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_EllipseDlg::isValid( QString& msg ) +{ + double aMajorR = GroupPoints->SpinBox_DX->GetValue(); + double aMinorR = GroupPoints->SpinBox_DY->GetValue(); + if ( aMajorR < aMinorR ) + { + msg = tr( "GEOM_ELLIPSE_ERROR_1" ); + return false; + } + return !myPoint->_is_nil() && !myDir->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_EllipseDlg::execute( ObjectList& objects ) +{ + double aMajorR = GroupPoints->SpinBox_DX->GetValue(); + double aMinorR = GroupPoints->SpinBox_DY->GetValue(); + GEOM::GEOM_Object_var anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeEllipse( myPoint, myDir, aMajorR, aMinorR ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_EllipseDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + diff --git a/src/BasicGUI/BasicGUI_LineDlg.cxx b/src/BasicGUI/BasicGUI_LineDlg.cxx new file mode 100644 index 000000000..014f7e18c --- /dev/null +++ b/src/BasicGUI/BasicGUI_LineDlg.cxx @@ -0,0 +1,296 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_LineDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_LineDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : BasicGUI_LineDlg() +// purpose : Constructs a BasicGUI_LineDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_LineDlg::BasicGUI_LineDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr("ICON_DLG_LINE_2P"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_LINE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_LINE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_POINTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_POINT_I").arg("1")); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_I").arg("2")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_LineDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_LineDlg::~BasicGUI_LineDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); + + // myGeometryGUI->SetState( 0 ); + globalSelection( GEOM_POINT ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr("GEOM_LINE") ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_LineDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_LineDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_LineDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myPoint2 = GEOM::GEOM_Object::_nil(); + return; + } + + // 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 == GroupPoints->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myPoint2 = aSelectedObject; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if ( send == GroupPoints->PushButton1 ) myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == GroupPoints->PushButton2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPoints->LineEdit1 ) myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == GroupPoints->LineEdit2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + else return; + GEOMBase_Skeleton::LineEditReturnPressed(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + // myGeometryGUI->SetState( 0 ); + globalSelection( GEOM_POINT ); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setFocus(); + + GroupPoints->LineEdit1->setText( "" ); + GroupPoints->LineEdit2->setText( "" ); + myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_LineDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_LineDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_LineDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_LineDlg::isValid( QString& msg ) +{ + return !myPoint1->_is_nil() && !myPoint2->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_LineDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakeLineTwoPnt( myPoint1, myPoint2 ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + return true; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_LineDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + diff --git a/src/BasicGUI/BasicGUI_MarkerDlg.cxx b/src/BasicGUI/BasicGUI_MarkerDlg.cxx new file mode 100644 index 000000000..faf073950 --- /dev/null +++ b/src/BasicGUI/BasicGUI_MarkerDlg.cxx @@ -0,0 +1,748 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_MarkerDlg.cxx +// Author : Sergey LITONIN +// Module : GEOM +// $Header$ + +#include "BasicGUI_MarkerDlg.h" +#include "DlgRef_SpinBox.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" +#include "utilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//================================================================================= +// class : BasicGUI_MarkerDlg() +// purpose : Constructor +//================================================================================= +BasicGUI_MarkerDlg::BasicGUI_MarkerDlg( GeometryGUI* theGeometryGUI, QWidget* theParent ) +: GEOMBase_Skeleton( theParent, "BasicGUI_MarkerDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap iconCS1 ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER" ) ) ); + QPixmap iconCS2 ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER2" ) ) ); + QPixmap iconCS3 ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER3" ) ) ); + QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + + setCaption( tr( "CAPTION" ) ); + + GroupConstructors->setTitle( tr( "LOCALCS" ) ); + RadioButton1->setPixmap( iconCS1 ); + RadioButton2->setPixmap( iconCS2 ); + RadioButton3->setPixmap( iconCS3 ); + + Group1 = new DlgRef_1Sel_QTD(this, "Group1"); + Group1->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + Group1->TextLabel1->setText(tr("GEOM_OBJECT")); + Group1->PushButton1->setPixmap(iconSelect); + + Group2 = new DlgRef_3Sel_QTD(this, "Group2"); + Group2->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + Group2->TextLabel1->setText(tr("GEOM_POINT")); + Group2->TextLabel2->setText(tr("XDIR")); + Group2->TextLabel3->setText(tr("YDIR")); + Group2->PushButton1->setPixmap(iconSelect); + Group2->PushButton2->setPixmap(iconSelect); + Group2->PushButton3->setPixmap(iconSelect); + + aMainGrp = new QGroupBox( 1, Qt::Horizontal, this ); + aMainGrp->setFrameStyle( QFrame::NoFrame ); + aMainGrp->setInsideMargin( 0 ); + + QGroupBox* anOriGrp = new QGroupBox( 1, Qt::Vertical, tr( "ORIGIN" ), aMainGrp ); + new QLabel( tr( "GEOM_X" ), anOriGrp ); + myData[ X ] = new DlgRef_SpinBox( anOriGrp ); + new QLabel( tr( "GEOM_Y" ), anOriGrp ); + myData[ Y ] = new DlgRef_SpinBox( anOriGrp ); + new QLabel( tr( "GEOM_Z" ), anOriGrp ); + myData[ Z ] = new DlgRef_SpinBox( anOriGrp ); + + QGroupBox* aXAxisGrp = new QGroupBox( 1, Qt::Vertical, tr( "XDIR" ), aMainGrp ); + new QLabel( tr( "DX" ), aXAxisGrp ); + myData[ DX1 ] = new DlgRef_SpinBox( aXAxisGrp ); + new QLabel( tr( "DY" ), aXAxisGrp ); + myData[ DY1 ] = new DlgRef_SpinBox( aXAxisGrp ); + new QLabel( tr( "DZ" ), aXAxisGrp ); + myData[ DZ1 ] = new DlgRef_SpinBox( aXAxisGrp ); + + QGroupBox* anYAxisGrp = new QGroupBox( 1, Qt::Vertical, tr( "YDIR" ), aMainGrp ); + new QLabel( tr( "DX" ), anYAxisGrp ); + myData[ DX2 ] = new DlgRef_SpinBox( anYAxisGrp ); + new QLabel( tr( "DY" ), anYAxisGrp ); + myData[ DY2 ] = new DlgRef_SpinBox( anYAxisGrp ); + new QLabel( tr( "DZ" ), anYAxisGrp ); + myData[ DZ2 ] = new DlgRef_SpinBox( anYAxisGrp ); + + Layout1->addWidget( aMainGrp, 2, 0 ); + Layout1->addWidget( Group1, 2, 0 ); + Layout1->addWidget( Group2, 2, 0 ); + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_MarkerDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_MarkerDlg::~BasicGUI_MarkerDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::Init() +{ + myBlockPreview = false; + myConstructorId = -1; + myEditCurrentArgument = Group1->LineEdit1; + Group1->LineEdit1->setReadOnly( true ); + Group2->LineEdit1->setReadOnly( true ); + Group2->LineEdit2->setReadOnly( true ); + Group2->LineEdit3->setReadOnly( true ); + + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( onClose() ) ); + connect( myGeometryGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( onDeactivate() ) ); + connect( myGeometryGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( onClose() ) ); + + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( onOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( onApply() ) ); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionDone() ) ); + + initName( tr( "LCS_NAME" ) ); + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter ) + { + anIter.data()->RangeStepAndValidator( -999.999, 999.999, step, 3 ); + connect( anIter.data(), SIGNAL( valueChanged( double ) ), + this, SLOT( onValueChanged( double ) ) ); + } + + myBlockPreview = true; + for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter ) + anIter.data()->SetValue( 0 ); + myData[ DX1 ]->SetValue( 1 ); + myData[ DY2 ]->SetValue( 1 ); + myBlockPreview = false; + + ConstructorsClicked( 0 ); + + + //@ + /* + QAD_ViewFrame* aFrame = QAD_Application::getDesktop()->getActiveApp()-> + getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame(); + + VTKViewer_ViewFrame* aVTKFrame = dynamic_cast( aFrame ); + if ( aVTKFrame ) + { + aVTKFrame->AdjustTrihedrons( true ); + return; + } + + OCCViewer_ViewFrame* aOCCFrame = dynamic_cast( aFrame ); + if ( aOCCFrame ) + aOCCFrame->AdjustTrihedrons( true ); + */ +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_MarkerDlg::ConstructorsClicked( int constructorId ) +{ + if ( myConstructorId == constructorId && myConstructorId == 0 ) + { + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + activate( GEOM_MARKER ); + displayPreview(); + return; + } + + myConstructorId = constructorId; + + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch (constructorId) + { + case 0: + { + Group1->hide(); + Group2->hide(); + resize(0, 0); + aMainGrp->show(); + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + activate( GEOM_MARKER ); + break; + } + case 1: + { + Group2->hide(); + aMainGrp->hide(); + resize(0, 0); + Group1->show(); + + globalSelection( GEOM_ALLGEOM ); + myEditCurrentArgument = Group1->LineEdit1; + Group1->LineEdit1->setText(""); + break; + } + case 2: + { + aMainGrp->hide(); + Group1->show(); + resize(0, 0); + Group2->show(); + + globalSelection( GEOM_POINT ); + myEditCurrentArgument = Group2->LineEdit1; + Group2->LineEdit1->setText(""); + Group2->LineEdit2->setText(""); + Group2->LineEdit3->setText(""); + break; + } + } + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionDone())); + onSelectionDone(); +} + +//================================================================================= +// function : onOk() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::onOk() +{ + if ( onApply() ) + onClose(); +} + +//======================================================================= +// function : onClose() +// purpose : +//======================================================================= +void BasicGUI_MarkerDlg::onClose() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : onApply() +// purpose : +//================================================================================= +bool BasicGUI_MarkerDlg::onApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + + return true; +} + +//================================================================================= +// function : onSelectionDone0() +// purpose : Reaction on selection when first method of creation is current one +//================================================================================= +void BasicGUI_MarkerDlg::onSelectionDone0() +{ + if ( IObjectCount() == 1 ) + { + + Standard_Boolean aRes = Standard_False; + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + + if ( aRes && !aSelectedObj->_is_nil() ) + { + TopoDS_Shape aShape; + if ( myGeomBase->GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) + { + if ( aSelectedObj->GetType() == GEOM_MARKER && aShape.ShapeType() == TopAbs_FACE ) + { + TopoDS_Face aFace = TopoDS::Face( aShape ); + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast( BRep_Tool::Surface( aFace ) ); + + if ( !aPlane.IsNull() ) + { + gp_Ax3 anAx3 = aPlane->Pln().Position(); + gp_Pnt aLoc = anAx3.Location(); + gp_Dir aXDir = anAx3.XDirection(); + gp_Dir aYDir = anAx3.YDirection(); + + myData[ X ]->SetValue( aLoc.X() ); + myData[ Y ]->SetValue( aLoc.Y() ); + myData[ Z ]->SetValue( aLoc.Z() ); + + myData[ DX1 ]->SetValue( aXDir.X() ); + myData[ DY1 ]->SetValue( aXDir.Y() ); + myData[ DZ1 ]->SetValue( aXDir.Z() ); + + myData[ DX2 ]->SetValue( aYDir.X() ); + myData[ DY2 ]->SetValue( aYDir.Y() ); + myData[ DZ2 ]->SetValue( aYDir.Z() ); + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->clearSelected(); + } + } + else + { + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + if ( aMap.Extent() == 1 ) + { + int anIndex = aMap( 1 ); + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes( aShape, aShapes ); + aShape = aShapes.FindKey( anIndex ); + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->clearSelected(); + } + + + if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + { + gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + myData[ X ]->SetValue( aPnt.X() ); + myData[ Y ]->SetValue( aPnt.Y() ); + myData[ Z ]->SetValue( aPnt.Z() ); + } + } + } + } + } + + displayPreview(); +} + + +//================================================================================= +// function : onSelectionDone() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_MarkerDlg::onSelectionDone() +{ + if ( getConstructorId() == 0 ) + { + onSelectionDone0(); + return; + } + + + myEditCurrentArgument->setText(""); + QString aName; + + if ( IObjectCount() == 1 ) { + Standard_Boolean aRes = Standard_False; + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + + if ( !CORBA::is_nil( aSelectedObj ) && aRes ) { + aName = GEOMBase::GetName( aSelectedObj ); + TopoDS_Shape aShape; + if ( myGeomBase->GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) { + GEOM::short_array anIndexes; + + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + + if ( !aMap.IsEmpty() ) { + int anIndex = aMap( 1 ); + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes( aShape, aShapes ); + aShape = aShapes.FindKey( anIndex ); + } + + if ( getConstructorId() == 1 ) { + if ( !aShape.IsNull() ) { + gp_Pnt aPnt; + if (aShape.ShapeType() == TopAbs_VERTEX) { + aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); + } + else { + GProp_GProps aSystem; + if (aShape.ShapeType() == TopAbs_EDGE || aShape.ShapeType() == TopAbs_WIRE) + BRepGProp::LinearProperties(aShape, aSystem); + else if (aShape.ShapeType() == TopAbs_FACE || aShape.ShapeType() == TopAbs_SHELL) + BRepGProp::SurfaceProperties(aShape, aSystem); + else + BRepGProp::VolumeProperties(aShape, aSystem); + + aPnt = aSystem.CentreOfMass(); + } + + gp_Ax3 anAx3; + anAx3.Transform(aShape.Location().Transformation()); + if(aShape.ShapeType() == TopAbs_FACE) { + Handle(Geom_Surface) aGS = BRep_Tool::Surface( TopoDS::Face( aShape ) ); + if (!aGS.IsNull() && aGS->IsKind( STANDARD_TYPE( Geom_Plane ) ) ) { + Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast( aGS ); + gp_Pln aPln = aGPlane->Pln(); + anAx3 = aPln.Position(); + } + } + + gp_Dir aDirX = anAx3.XDirection(); + gp_Dir aDirY = anAx3.YDirection(); + + myData[ X ]->SetValue( aPnt.X() ); + myData[ Y ]->SetValue( aPnt.Y() ); + myData[ Z ]->SetValue( aPnt.Z() ); + + myData[ DX1 ]->SetValue( aDirX.X() ); + myData[ DY1 ]->SetValue( aDirX.Y() ); + myData[ DZ1 ]->SetValue( aDirX.Z() ); + + myData[ DX2 ]->SetValue( aDirY.X() ); + myData[ DY2 ]->SetValue( aDirY.Y() ); + myData[ DZ2 ]->SetValue( aDirY.Z() ); + + myEditCurrentArgument->setText( aName ); + } + else { + myData[ X ]->SetValue( 0 ); + myData[ Y ]->SetValue( 0 ); + myData[ Z ]->SetValue( 0 ); + + myData[ DX1 ]->SetValue( 0 ); + myData[ DY1 ]->SetValue( 0 ); + myData[ DZ1 ]->SetValue( 0 ); + + myData[ DX2 ]->SetValue( 0 ); + myData[ DY2 ]->SetValue( 0 ); + myData[ DZ2 ]->SetValue( 0 ); + } + } + else if ( getConstructorId() == 2 ) { + if (myEditCurrentArgument == Group2->LineEdit1) { + if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) { + gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + myData[ X ]->SetValue( aPnt.X() ); + myData[ Y ]->SetValue( aPnt.Y() ); + myData[ Z ]->SetValue( aPnt.Z() ); + myEditCurrentArgument->setText( aName ); + } + else { + myData[ X ]->SetValue( 0 ); + myData[ Y ]->SetValue( 0 ); + myData[ Z ]->SetValue( 0 ); + } + } + else if (myEditCurrentArgument == Group2->LineEdit2) { + if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_EDGE ) { + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(TopoDS::Edge(aShape))); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(aShape))); + gp_Dir aDir(gp_Vec(aP1, aP2)); + + myData[ DX1 ]->SetValue( aDir.X() ); + myData[ DY1 ]->SetValue( aDir.Y() ); + myData[ DZ1 ]->SetValue( aDir.Z() ); + myEditCurrentArgument->setText( aName ); + } + else { + myData[ DX1 ]->SetValue( 0 ); + myData[ DY1 ]->SetValue( 0 ); + myData[ DZ1 ]->SetValue( 0 ); + } + } + else if (myEditCurrentArgument == Group2->LineEdit3) { + if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_EDGE ) { + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(TopoDS::Edge(aShape))); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(TopoDS::Edge(aShape))); + gp_Dir aDir(gp_Vec(aP1, aP2)); + + myData[ DX2 ]->SetValue( aDir.X() ); + myData[ DY2 ]->SetValue( aDir.Y() ); + myData[ DZ2 ]->SetValue( aDir.Z() ); + myEditCurrentArgument->setText( aName ); + } + else { + myData[ DX2 ]->SetValue( 0 ); + myData[ DY2 ]->SetValue( 0 ); + myData[ DZ2 ]->SetValue( 0 ); + } + } + } + } + } + } + else { + if ( getConstructorId() == 1 ) { + myData[ X ]->SetValue( 0 ); + myData[ Y ]->SetValue( 0 ); + myData[ Z ]->SetValue( 0 ); + + myData[ DX1 ]->SetValue( 0 ); + myData[ DY1 ]->SetValue( 0 ); + myData[ DZ1 ]->SetValue( 0 ); + + myData[ DX2 ]->SetValue( 0 ); + myData[ DY2 ]->SetValue( 0 ); + myData[ DZ2 ]->SetValue( 0 ); + } + else if ( getConstructorId() == 2 ) { + if (myEditCurrentArgument == Group2->LineEdit1) { + myData[ X ]->SetValue( 0 ); + myData[ Y ]->SetValue( 0 ); + myData[ Z ]->SetValue( 0 ); + } + else if (myEditCurrentArgument == Group2->LineEdit2) { + myData[ DX1 ]->SetValue( 0 ); + myData[ DY1 ]->SetValue( 0 ); + myData[ DZ1 ]->SetValue( 0 ); + } + else if (myEditCurrentArgument == Group2->LineEdit3) { + myData[ DX2 ]->SetValue( 0 ); + myData[ DY2 ]->SetValue( 0 ); + myData[ DZ2 ]->SetValue( 0 ); + } + } + } + + displayPreview(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == Group1->PushButton1) { + myEditCurrentArgument = Group1->LineEdit1; + globalSelection( GEOM_ALLGEOM ); + } + else if(send == Group2->PushButton1) { + myEditCurrentArgument = Group2->LineEdit1; + globalSelection( GEOM_POINT ); + } + else if(send == Group2->PushButton2) { + myEditCurrentArgument = Group2->LineEdit2; + globalSelection( GEOM_LINE ); + } + else if(send == Group2->PushButton3) { + myEditCurrentArgument = Group2->LineEdit3; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + onSelectionDone(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); +} + +//================================================================================= +// function : onActivate() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::onActivate() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionDone() ) ); + + ConstructorsClicked( getConstructorId() ); +} + +//================================================================================= +// function : onDeactivate() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_MarkerDlg::onDeactivate() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + onActivate(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_MarkerDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_MarkerDlg::isValid( QString& msg ) +{ + const int id = getConstructorId(); + gp_Vec v1( myData[ DX1 ]->GetValue(), myData[ DY1 ]->GetValue(), myData[ DZ1 ]->GetValue() ), + v2( myData[ DX2 ]->GetValue(), myData[ DY2 ]->GetValue(), myData[ DZ2 ]->GetValue() ); + + bool isOk = false; + // we will got exception if the magnitude of any of the 2 vectors <= gp::Resolution() + // Vectors shouldn't be checked for being orthogonal here! + if ( v1.Magnitude() > gp::Resolution() && v2.Magnitude() > gp::Resolution() ) { + isOk = !v1.IsParallel( v2, Precision::Angular() ); + if ( !isOk ) + msg += tr( "VEC_PARALLEL" ); + } + + switch ( id ) + { + case 0: + return isOk; + case 1: + return !Group1->LineEdit1->text().isEmpty() && isOk; + case 2: + return !Group2->LineEdit1->text().isEmpty() && + !Group2->LineEdit2->text().isEmpty() && + !Group2->LineEdit3->text().isEmpty() && isOk; + } + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_MarkerDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IBasicOperations::_narrow( + getOperation() )->MakeMarker( myData[ X ]->GetValue(), myData[ Y ]->GetValue(), myData[ Z ]->GetValue(), + myData[ DX1 ]->GetValue(), myData[ DY1 ]->GetValue(), myData[ DZ1 ]->GetValue(), + myData[ DX2 ]->GetValue(), myData[ DY2 ]->GetValue(), myData[ DZ2 ]->GetValue() ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : onValueChanged +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::onValueChanged( double ) +{ + displayPreview(); +} + +//================================================================================= +// function : displayPreview +// purpose : +//================================================================================= +void BasicGUI_MarkerDlg::displayPreview ( const bool activate, + const bool update, + const bool toRemoveFromEngine, + const double lineWidth ) +{ + if ( !myBlockPreview ) + { + GEOMBase_Skeleton::displayPreview( activate, update, toRemoveFromEngine, lineWidth ); + if ( myConstructorId == 0 ) + { + GEOMBase_Skeleton::activate( GEOM_MARKER ); + } + } +} + + + + + + + + + + + + + + diff --git a/src/BasicGUI/BasicGUI_PlaneDlg.cxx b/src/BasicGUI/BasicGUI_PlaneDlg.cxx new file mode 100644 index 000000000..544f2611d --- /dev/null +++ b/src/BasicGUI/BasicGUI_PlaneDlg.cxx @@ -0,0 +1,507 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_PlaneDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_PlaneDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +using namespace std; + +//================================================================================= +// class : BasicGUI_PlaneDlg() +// purpose : Constructs a BasicGUI_PlaneDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_PlaneDlg::BasicGUI_PlaneDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PLANE_PV"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PLANE_3PNTS"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PLANE_FACE"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_PLANE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PLANE")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->setPixmap(image2); + + GroupPntDir = new DlgRef_2Sel1Spin(this, "GroupPointDirection"); + GroupPntDir->GroupBox1->setTitle(tr("GEOM_PLANE_PV")); + GroupPntDir->TextLabel1->setText(tr("GEOM_POINT")); + GroupPntDir->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPntDir->TextLabel3->setText(tr("GEOM_PLANE_SIZE")); + GroupPntDir->PushButton1->setPixmap(image3); + GroupPntDir->PushButton2->setPixmap(image3); + GroupPntDir->LineEdit1->setReadOnly( true ); + GroupPntDir->LineEdit2->setReadOnly( true ); + + Group3Pnts = new DlgRef_3Sel1Spin(this, "Group3Pnts"); + Group3Pnts->GroupBox1->setTitle(tr("GEOM_3_POINTS")); + Group3Pnts->TextLabel1->setText(tr("GEOM_POINT1")); + Group3Pnts->TextLabel2->setText(tr("GEOM_POINT2")); + Group3Pnts->TextLabel3->setText(tr("GEOM_POINT3")); + Group3Pnts->TextLabel4->setText(tr("GEOM_PLANE_SIZE")); + Group3Pnts->PushButton1->setPixmap(image3); + Group3Pnts->PushButton2->setPixmap(image3); + Group3Pnts->PushButton3->setPixmap(image3); + + Group3Pnts->LineEdit1->setReadOnly( true ); + Group3Pnts->LineEdit2->setReadOnly( true ); + Group3Pnts->LineEdit3->setReadOnly( true ); + + GroupFace = new DlgRef_1Sel1Spin(this, "GroupFace"); + GroupFace->GroupBox1->setTitle(tr("GEOM_FACE")); + GroupFace->TextLabel1->setText(tr("GEOM_SELECTION")); + GroupFace->TextLabel2->setText(tr("GEOM_PLANE_SIZE")); + GroupFace->PushButton1->setPixmap(image3); + + GroupFace->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPntDir, 2, 0); + Layout1->addWidget(Group3Pnts, 2, 0); + Layout1->addWidget(GroupFace, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_PlaneDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_PlaneDlg::~BasicGUI_PlaneDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPntDir->LineEdit1; + + myPoint = myDir = myPoint1 = myPoint2 = myPoint3 = myFace = GEOM::GEOM_Object::_nil(); + + // myGeometryGUI->SetState( 0 ); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double aStep = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + double aTrimSize = 2000.0; + + /* min, max, step and decimals for spin boxes */ + GroupPntDir->SpinBox_DX->RangeStepAndValidator( 0.001, 10000000.0, aStep, 3 ); + GroupPntDir->SpinBox_DX->SetValue( aTrimSize ); + Group3Pnts->SpinBox_DX->RangeStepAndValidator(0.001, 10000000.0, aStep, 3); + Group3Pnts->SpinBox_DX->SetValue( aTrimSize ); + GroupFace->SpinBox_DX->RangeStepAndValidator(0.001, 10000000.0, aStep, 3); + GroupFace->SpinBox_DX->SetValue( aTrimSize ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(GroupPntDir->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPntDir->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3Pnts->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupFace->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPntDir->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPntDir->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + 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(GroupFace->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPntDir->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group3Pnts->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupFace->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPntDir->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Pnts->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupFace->SpinBox_DX, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_PLANE" ) ); + + Group3Pnts->hide(); + GroupFace->hide(); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_PlaneDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + myPoint = myDir = myPoint1 = myPoint2 = myPoint3 = myFace = GEOM::GEOM_Object::_nil(); + + switch ( constructorId ) + { + case 0: /* plane from a point and a direction (vector, edge...) */ + { + Group3Pnts->hide(); + GroupFace->hide(); + resize(0, 0); + GroupPntDir->show(); + + myEditCurrentArgument = GroupPntDir->LineEdit1; + GroupPntDir->LineEdit1->setText(tr("")); + GroupPntDir->LineEdit2->setText(tr("")); + + /* for the first argument */ + globalSelection( GEOM_POINT ); + break; + } + case 1: /* plane from 3 points */ + { + GroupPntDir->hide(); + GroupFace->hide(); + resize(0, 0); + Group3Pnts->show(); + + myEditCurrentArgument = Group3Pnts->LineEdit1; + Group3Pnts->LineEdit1->setText(""); + Group3Pnts->LineEdit2->setText(""); + Group3Pnts->LineEdit3->setText(""); + + /* for the first argument */ + globalSelection( GEOM_POINT ); + break; + } + case 2: /* plane from a planar face selection */ + { + GroupPntDir->hide(); + Group3Pnts->hide(); + resize(0, 0); + GroupFace->show(); + + myEditCurrentArgument = GroupFace->LineEdit1; + GroupFace->LineEdit1->setText(tr("")); + + /* for the first argument */ + globalSelection( GEOM_PLANE ); + break; + } + } + + myEditCurrentArgument->setFocus(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_PlaneDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_PlaneDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void BasicGUI_PlaneDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == GroupPntDir->LineEdit1 ) myPoint = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPntDir->LineEdit2 ) myDir = GEOM::GEOM_Object::_nil(); + else 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(); + else if ( myEditCurrentArgument == GroupFace->LineEdit1 ) myFace = GEOM::GEOM_Object::_nil(); + return; + } + + // 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 == GroupPntDir->LineEdit1 ) myPoint = aSelectedObject; + else if ( myEditCurrentArgument == GroupPntDir->LineEdit2 ) myDir = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) myPoint2 = aSelectedObject; + else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) myPoint3 = aSelectedObject; + else if ( myEditCurrentArgument == GroupFace->LineEdit1 ) myFace = aSelectedObject; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == GroupPntDir->PushButton1 ) myEditCurrentArgument = GroupPntDir->LineEdit1; + else if ( send == GroupPntDir->PushButton2 ) myEditCurrentArgument = GroupPntDir->LineEdit2; + else if ( send == Group3Pnts->PushButton1 ) myEditCurrentArgument = Group3Pnts->LineEdit1; + else if ( send == Group3Pnts->PushButton2 ) myEditCurrentArgument = Group3Pnts->LineEdit2; + else if ( send == Group3Pnts->PushButton3 ) myEditCurrentArgument = Group3Pnts->LineEdit3; + else if ( send == GroupFace->PushButton1 ) myEditCurrentArgument = GroupFace->LineEdit1; + + myEditCurrentArgument->setFocus(); + + if ( myEditCurrentArgument == GroupPntDir->LineEdit2 ) + globalSelection( GEOM_LINE ); + else if ( myEditCurrentArgument == GroupFace->LineEdit1 ) + globalSelection( GEOM_PLANE ); + else + globalSelection( GEOM_POINT ); + + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPntDir->LineEdit1 || + send == GroupPntDir->LineEdit2 || + send == Group3Pnts->LineEdit1 || + send == Group3Pnts->LineEdit2 || + send == Group3Pnts->LineEdit3 || + send == GroupFace->LineEdit1 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + // myGeometryGUI->SetState( 0 ); + + ConstructorsClicked( getConstructorId() ); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_PlaneDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::ValueChangedInSpinBox(double newValue) +{ + displayPreview(); +} + +//================================================================================= +// function : getSize() +// purpose : +//================================================================================= +double BasicGUI_PlaneDlg::getSize() const +{ + switch ( getConstructorId() ) + { + case 0 : return GroupPntDir->SpinBox_DX->GetValue(); + case 1 : return Group3Pnts->SpinBox_DX->GetValue(); + case 2 : return GroupFace->SpinBox_DX->GetValue(); + } + return 0.; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_PlaneDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); +} + +//================================================================================= +// function : isEqual +// purpose : it may also be needed to check for min distance between gp_Pnt-s... +//================================================================================= +static bool isEqual( const GEOM::GEOM_Object_var& thePnt1, const GEOM::GEOM_Object_var& thePnt2 ) +{ + return thePnt1->_is_equivalent( thePnt2 ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_PlaneDlg::isValid( QString& msg ) +{ + const int id = getConstructorId(); + if ( getSize() <= 0 ) + { + msg = QString( "Please, enter size greater than 0." ); + return false; + } + if ( id == 0 ) + return !CORBA::is_nil( myPoint ) && !CORBA::is_nil( myDir ); + else if ( id == 1 ) + return !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) && + !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 ); + else if ( id == 2 ) + return !CORBA::is_nil( myFace ); + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_PlaneDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePlanePntVec( myPoint, myDir, getSize() ); + res = true; + break; + case 1 : + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePlaneThreePnt( myPoint1, myPoint2, myPoint3, getSize() ); + res = true; + break; + case 2 : + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePlaneFace( myFace, getSize() ); + res = true; + break; + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_PlaneDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + diff --git a/src/BasicGUI/BasicGUI_PointDlg.cxx b/src/BasicGUI/BasicGUI_PointDlg.cxx new file mode 100644 index 000000000..e21f745ec --- /dev/null +++ b/src/BasicGUI/BasicGUI_PointDlg.cxx @@ -0,0 +1,595 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_PointDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_PointDlg.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include "GEOMImpl_Types.hxx" + +#include + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +using namespace std; +//================================================================================= +// class : BasicGUI_PointDlg() +// purpose : Constructs a BasicGUI_PointDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_PointDlg::BasicGUI_PointDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, fl ), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POINT"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POINT_EDGE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POINT_REF"))); + + setCaption(tr("GEOM_POINT_TITLE")); + + QGroupBox* aFrame = new QGroupBox( 1, Qt::Horizontal, this ); + aFrame->setInsideMargin( 0 ); + aFrame->setFrameStyle( QFrame::NoFrame ); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_POINTS")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image3); + RadioButton3->setPixmap(image1); + + GroupXYZ = new DlgRef_3Spin( aFrame, "GroupXYZ" ); + GroupXYZ->GroupBox1->setTitle(tr("GEOM_COORDINATES")); + GroupXYZ->TextLabel1->setText(tr("GEOM_X")); + GroupXYZ->TextLabel2->setText(tr("GEOM_Y")); + GroupXYZ->TextLabel3->setText(tr("GEOM_Z")); + + GroupOnCurve = new DlgRef_1Sel1Spin( aFrame, "GroupOnCurve" ); + GroupOnCurve->GroupBox1->setTitle(tr("GEOM_PARAM_POINT")); + GroupOnCurve->TextLabel1->setText(tr("GEOM_EDGE")); + GroupOnCurve->TextLabel2->setText(tr("GEOM_PARAMETER")); + GroupOnCurve->PushButton1->setPixmap(image2); + + GroupRefPoint = new DlgRef_1Sel3Spin( aFrame, "GoupRefPoint" ); + GroupRefPoint->GroupBox1->setTitle(tr("GEOM_REF_POINT")); + GroupRefPoint->TextLabel1->setText(tr("GEOM_POINT")); + GroupRefPoint->PushButton1->setPixmap(image2); + GroupRefPoint->TextLabel2->setText(tr("GEOM_DX")); + GroupRefPoint->TextLabel3->setText(tr("GEOM_DY")); + GroupRefPoint->TextLabel4->setText(tr("GEOM_DZ")); + + Layout1->addWidget( aFrame, 2, 0 ); + /***************************************************************/ + + myCoordGrp = new QGroupBox( 2, Qt::Horizontal, tr( "GEOM_COORDINATES" ), aFrame ); + new QLabel( tr( "GEOM_X" ), myCoordGrp ); + myX = new QLineEdit( myCoordGrp ); + new QLabel( tr( "GEOM_Y" ), myCoordGrp ); + myY = new QLineEdit( myCoordGrp ); + new QLabel( tr( "GEOM_Z" ), myCoordGrp ); + myZ = new QLineEdit( myCoordGrp ); + + myX->setReadOnly( true ); + myY->setReadOnly( true ); + myZ->setReadOnly( true ); + + myX->setEnabled( false ); + myY->setEnabled( false ); + myZ->setEnabled( false ); + + QPalette aPal = myX->palette(); + aPal.setColor( QPalette::Disabled, QColorGroup::Text, QColor( 0, 0, 0 ) ) ; + myX->setPalette( aPal ); + myY->setPalette( aPal ); + myZ->setPalette( aPal ); + + Init(); +} + + +//======================================================================= +// function : ~BasicGUI_PointDlg() +// purpose : Destructor +//======================================================================= +BasicGUI_PointDlg::~BasicGUI_PointDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::Init() +{ + GroupOnCurve->LineEdit1->setReadOnly( true ); + GroupRefPoint->LineEdit1->setReadOnly( true ); + + myEdge = GEOM::GEOM_Object::_nil(); + myRefPoint = GEOM::GEOM_Object::_nil(); + + myEditCurrentArgument = 0; + + // myGeometryGUI->SetState( 0 ); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes */ + GroupXYZ->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupXYZ->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupXYZ->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupXYZ->SpinBox_DX->SetValue(0.0); + GroupXYZ->SpinBox_DY->SetValue(0.0); + GroupXYZ->SpinBox_DZ->SetValue(0.0); + + GroupRefPoint->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupRefPoint->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupRefPoint->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupRefPoint->SpinBox_DX->SetValue(0.0); + GroupRefPoint->SpinBox_DY->SetValue(0.0); + GroupRefPoint->SpinBox_DZ->SetValue(0.0); + + step = 0.1; + GroupOnCurve->SpinBox_DX->RangeStepAndValidator(0., 1., step, 3); + GroupOnCurve->SpinBox_DX->SetValue( 0.5 ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(ConstructorsClicked(int))); + + connect(GroupOnCurve->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupOnCurve->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupOnCurve->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupXYZ->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupRefPoint->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupOnCurve->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupXYZ->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupXYZ->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupXYZ->SpinBox_DZ, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupRefPoint->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupRefPoint->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupRefPoint->SpinBox_DZ, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr("GEOM_VERTEX") ); + + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_PointDlg::ConstructorsClicked(int constructorId) +{ + switch ( constructorId ) + { + case 0: + { + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); + + GroupRefPoint->hide(); + GroupOnCurve->hide(); + + GroupXYZ->show(); + + myCoordGrp->hide(); + break; + } + case 1: + { + myEditCurrentArgument = GroupRefPoint->LineEdit1; + myEditCurrentArgument->setText(""); + myRefPoint = GEOM::GEOM_Object::_nil(); + + globalSelection( GEOM_POINT ); + + GroupXYZ->hide(); + GroupOnCurve->hide(); + + GroupRefPoint->show(); + + myCoordGrp->show(); + break; + } + case 2: + { + myEditCurrentArgument = GroupOnCurve->LineEdit1; + myEditCurrentArgument->setText(""); + myEdge = GEOM::GEOM_Object::_nil(); + + globalSelection( GEOM_EDGE ); + + GroupXYZ->hide(); + GroupRefPoint->hide(); + + GroupOnCurve->show(); + + myCoordGrp->show(); + break; + } + } + + myX->setText( "" ); + myY->setText( "" ); + myZ->setText( "" ); + + qApp->processEvents(); + updateGeometry(); + resize( minimumSize() ); + + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::ClickOnOk() +{ + if ( onAccept() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_PointDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_PointDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed (for constructors not using local context) +//================================================================================= +void BasicGUI_PointDlg::SelectionIntoArgument() +{ + const int id = getConstructorId(); + + if ( ( id == 1 || id == 2 ) && myEditCurrentArgument != 0 ) + { + myEditCurrentArgument->setText(""); + myX->setText( "" ); + myY->setText( "" ); + myZ->setText( "" ); + myRefPoint = myEdge = GEOM::GEOM_Object::_nil(); + } + + if ( IObjectCount() == 1 ) + { + Standard_Boolean aRes = Standard_False; + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes ) + { + if ( id == 0 ) + { + // get CORBA reference to data object + TopoDS_Shape aShape = myGeometryGUI->GetShapeReader().GetShape( myGeometryGUI->GetGeomGen(), aSelectedObject ); + if ( aShape.IsNull() ) + return; + + if ( aShape.ShapeType() != TopAbs_VERTEX ) + { + TColStd_IndexedMapOfInteger aMap; + + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + + if ( aMap.Extent() == 1 ) + { + int anIndex = aMap( 1 ); + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes( aShape, aShapes ); + aShape = aShapes.FindKey( anIndex ); + + if ( aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX ) + return; + } + else + return; + } + + gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + GroupXYZ->SpinBox_DX->SetValue( aPnt.X() ); + GroupXYZ->SpinBox_DY->SetValue( aPnt.Y() ); + GroupXYZ->SpinBox_DZ->SetValue( aPnt.Z() ); + } + else if ( id == 1 ) + { + myRefPoint = aSelectedObject; + GroupRefPoint->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) ); + } + else if ( id == 2 ) + { + myEdge = aSelectedObject; + GroupOnCurve->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) ); + } + } + } + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupRefPoint->LineEdit1 || send == GroupOnCurve->LineEdit1 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == GroupRefPoint->PushButton1 ) + { + GroupRefPoint->LineEdit1->setFocus(); + myEditCurrentArgument = GroupRefPoint->LineEdit1; + + globalSelection( GEOM_POINT ); + } + else if ( send == GroupOnCurve->PushButton1 ) + { + GroupOnCurve->LineEdit1->setFocus(); + myEditCurrentArgument = GroupOnCurve->LineEdit1; + + globalSelection( GEOM_EDGE ); + } +} + + +//================================================================================= +// function : enterEvent() +// purpose : to reactivate this dialog box when mouse enter onto the window +//================================================================================= +void BasicGUI_PointDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::ActivateThisDialog( ) +{ + GEOMBase_Skeleton::ActivateThisDialog(); + // myGeometryGUI->SetState( 0 ); + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_PointDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BasicGUI_PointDlg::ValueChangedInSpinBox(double newValue) +{ + displayPreview(); +} + +//======================================================================= +// funcion : getParameter() +// purpose : +//======================================================================= +double BasicGUI_PointDlg::getParameter() const +{ + return GroupOnCurve->SpinBox_DX->GetValue(); +} + +//================================================================================= +// function : OnPointSelected +// purpose : +//================================================================================= +void BasicGUI_PointDlg::OnPointSelected( const gp_Pnt& thePnt ) +{ + if ( getConstructorId() == 0 ) + { + GroupXYZ->SpinBox_DX->SetValue( thePnt.X() ); + GroupXYZ->SpinBox_DY->SetValue( thePnt.Y() ); + GroupXYZ->SpinBox_DZ->SetValue( thePnt.Z() ); + + displayPreview(); + } +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_PointDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_PointDlg::isValid( QString& msg ) +{ + const int id = getConstructorId(); + if ( id == 0 ) + return true; + else if ( id == 1 ) + return !myRefPoint->_is_nil(); + else if ( id == 2 ) + return !myEdge->_is_nil(); + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_PointDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + double x = GroupXYZ->SpinBox_DX->GetValue(); + double y = GroupXYZ->SpinBox_DY->GetValue(); + double z = GroupXYZ->SpinBox_DZ->GetValue(); + + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePointXYZ( x,y,z ); + res = true; + break; + } + case 1 : + { + double dx = GroupRefPoint->SpinBox_DX->GetValue(); + double dy = GroupRefPoint->SpinBox_DY->GetValue(); + double dz = GroupRefPoint->SpinBox_DZ->GetValue(); + + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePointWithReference( myRefPoint, dx, dy, dz ); + res = true; + break; + } + case 2 : + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakePointOnCurve( myEdge, getParameter() ); + res = true; + break; + } + + if ( getConstructorId() == 1 || getConstructorId() == 2 ) + { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape( anObj, aShape ) && !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) + { + gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + myX->setText( QString( "%1" ).arg( aPnt.X() ) ); + myY->setText( QString( "%1" ).arg( aPnt.Y() ) ); + myZ->setText( QString( "%1" ).arg( aPnt.Z() ) ); + } + else + { + myX->setText( "" ); + myY->setText( "" ); + myZ->setText( "" ); + } + } + + if ( !anObj->_is_nil() ) + { + //printf( "--> a valid point is created\n" ); + objects.push_back( anObj._retn() ); + } + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_PointDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/BasicGUI/BasicGUI_VectorDlg.cxx b/src/BasicGUI/BasicGUI_VectorDlg.cxx new file mode 100644 index 000000000..8860b2e48 --- /dev/null +++ b/src/BasicGUI/BasicGUI_VectorDlg.cxx @@ -0,0 +1,416 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_VectorDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BasicGUI_VectorDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : BasicGUI_VectorDlg() +// purpose : Constructs a BasicGUI_VectorDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_VectorDlg::BasicGUI_VectorDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, fl ), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_VECTOR_2P"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_VECTOR_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_VECTOR_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_VECTOR")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_POINTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_POINT_I").arg("1")); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_I").arg("2")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + GroupDimensions = new DlgRef_3Spin1Check(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_COORDINATES")); + GroupDimensions->TextLabel1->setText(tr("GEOM_DX")); + GroupDimensions->TextLabel2->setText(tr("GEOM_DY")); + GroupDimensions->TextLabel3->setText(tr("GEOM_DZ")); + GroupDimensions->CheckBox1->setText(tr("GEOM_REVERSE_VECTOR")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BasicGUI_VectorDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_VectorDlg::~BasicGUI_VectorDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myPoint1 = GEOM::GEOM_Object::_nil(); + myPoint2 = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes */ + GroupDimensions->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + + double dx( 0. ), dy( 0. ), dz( 200. ); + GroupDimensions->SpinBox_DX->SetValue( dx ); + GroupDimensions->SpinBox_DY->SetValue( dy ); + GroupDimensions->SpinBox_DZ->SetValue( dz ); + + GroupDimensions->CheckBox1->setChecked(FALSE); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DZ, SLOT(SetStep(double))); + + connect(GroupDimensions->CheckBox1, SIGNAL(stateChanged(int)), this, SLOT(ReverseVector(int))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr("GEOM_VECTOR") ); + + GroupDimensions->hide(); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_VectorDlg::ConstructorsClicked( int constructorId ) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + myPoint1 = GEOM::GEOM_Object::_nil(); + myPoint2 = GEOM::GEOM_Object::_nil(); + + switch (constructorId) + { + case 0: + { + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(""); + GroupPoints->LineEdit2->setText(""); + + globalSelection( GEOM_POINT ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1: + { + GroupPoints->hide(); + resize( 0, 0 ); + GroupDimensions->show(); + + double dx( 0. ), dy( 0. ), dz( 0. ); + GroupDimensions->SpinBox_DX->SetValue( dx ); + GroupDimensions->SpinBox_DY->SetValue( dy ); + GroupDimensions->SpinBox_DZ->SetValue( dz ); + + GroupDimensions->CheckBox1->setChecked( FALSE ); + break; + } + } + + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_VectorDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_VectorDlg::ClickOnApply() +{ + buttonApply->setFocus(); + + if ( !onAccept() ) + return false; + + initName(); + if ( getConstructorId() != 1 ) + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_VectorDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + myPoint2 = GEOM::GEOM_Object::_nil(); + return; + } + + // 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 == GroupPoints->LineEdit1 ) myPoint1 = aSelectedObject; + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) myPoint2 = aSelectedObject; + } + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if ( send == GroupPoints->PushButton1 ) myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == GroupPoints->PushButton2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPoints->LineEdit1 ) myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == GroupPoints->LineEdit2 ) myEditCurrentArgument = GroupPoints->LineEdit2; + else return; + GEOMBase_Skeleton::LineEditReturnPressed(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_VectorDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BasicGUI_VectorDlg::ValueChangedInSpinBox( double newValue ) +{ + displayPreview(); +} + +//================================================================================= +// function : ReverseVector() +// purpose : 'state' not used here +//================================================================================= +void BasicGUI_VectorDlg::ReverseVector(int state) +{ + double dx = -GroupDimensions->SpinBox_DX->GetValue(); + double dy = -GroupDimensions->SpinBox_DY->GetValue(); + double dz = -GroupDimensions->SpinBox_DZ->GetValue(); + + GroupDimensions->SpinBox_DX->SetValue( dx ); + GroupDimensions->SpinBox_DY->SetValue( dy ); + GroupDimensions->SpinBox_DZ->SetValue( dz ); + + displayPreview(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BasicGUI_VectorDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetIBasicOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BasicGUI_VectorDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !myPoint1->_is_nil() && !myPoint2->_is_nil(): true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BasicGUI_VectorDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) { + case 0 : + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakeVectorTwoPnt( myPoint1, myPoint2 ); + res = true; + break; + + case 1 : + { + double dx = GroupDimensions->SpinBox_DX->GetValue(); + double dy = GroupDimensions->SpinBox_DY->GetValue(); + double dz = GroupDimensions->SpinBox_DZ->GetValue(); + anObj = GEOM::GEOM_IBasicOperations::_narrow( getOperation() )->MakeVectorDXDYDZ( dx,dy,dz ); + res = true; + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + diff --git a/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx new file mode 100644 index 000000000..168c8bc7b --- /dev/null +++ b/src/BasicGUI/BasicGUI_WorkingPlaneDlg.cxx @@ -0,0 +1,468 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGUI_WorkingPlaneDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM + +#include "BasicGUI_WorkingPlaneDlg.h" + +#include "GEOMBase.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include +#include + +using namespace std; + +//================================================================================= +// class : BasicGUI_WorkingPlaneDlg() +// purpose : Constructs a BasicGUI_WorkingPlaneDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BasicGUI_WorkingPlaneDlg::BasicGUI_WorkingPlaneDlg(GeometryGUI* theGeometryGUI , QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_FACE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_VECTOR"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_WPLANE_ORIGIN"))); + + setCaption(tr("GEOM_WPLANE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_WPLANE")); + RadioButton1->setPixmap(image1); + RadioButton2->setPixmap(image2); + RadioButton3->setPixmap(image3); + + Group1 = new DlgRef_1Sel_QTD(this, "Group1"); + Group1->GroupBox1->setTitle(tr("GEOM_WPLANE_FACE")); + Group1->TextLabel1->setText(tr("GEOM_SELECTION")); + Group1->PushButton1->setPixmap(image0); + Group1->LineEdit1->setReadOnly( true ); + + Group2 = new DlgRef_2Sel_QTD(this, "Group2"); + Group2->GroupBox1->setTitle(tr("GEOM_WPLANE_VECTOR")); + Group2->TextLabel1->setText(tr("GEOM_WPLANE_VX")); + Group2->TextLabel2->setText(tr("GEOM_WPLANE_VZ")); + Group2->PushButton1->setPixmap(image0); + Group2->PushButton2->setPixmap(image0); + Group2->LineEdit1->setReadOnly( true ); + Group2->LineEdit2->setReadOnly( true ); + + Group3 = new DlgRef_3Check_QTD(this, "Group3"); + Group3->GroupBox1->setTitle(tr("GEOM_WPLANE_ORIGIN")); + Group3->RadioButton1->setText(tr("GEOM_WPLANE_OXY")); + Group3->RadioButton2->setText(tr("GEOM_WPLANE_OYZ")); + Group3->RadioButton3->setText(tr("GEOM_WPLANE_OZX")); + + Layout1->addWidget(Group1, 1, 0); + Layout1->addWidget(Group2, 1, 0); + Layout1->addWidget(Group3, 1, 0); + /***************************************************************/ + + Init(); +} + +//================================================================================= +// function : ~BasicGUI_WorkingPlaneDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BasicGUI_WorkingPlaneDlg::~BasicGUI_WorkingPlaneDlg() +{ +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = Group1->LineEdit1; + myWPlane = myGeometryGUI->GetWorkingPlane(); + + // myGeometryGUI->SetState( 0 ); + + myFace = GEOM::GEOM_Object::_nil(); + myVectX = GEOM::GEOM_Object::_nil(); + myVectZ = GEOM::GEOM_Object::_nil(); + + aOriginType = 1; + + /* Filter definition */ + globalSelection( GEOM_PLANE ); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, 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())); + + connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group3->GroupBox1, SIGNAL(clicked(int)), this, SLOT(GroupClicked(int))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_WPLANE" ) ); + ConstructorsClicked(0); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_WorkingPlaneDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + // myGeometryGUI->SetState( 0 ); + + switch (constructorId) + { + case 0: + { + globalSelection( GEOM_PLANE ); + + Group2->hide(); + Group3->hide(); + resize(0, 0); + Group1->show(); + + myEditCurrentArgument = Group1->LineEdit1; + Group1->LineEdit1->setText(""); + myFace = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1: + { + globalSelection( GEOM_LINE ); + + Group1->hide(); + Group3->hide(); + resize(0, 0); + Group2->show(); + + myEditCurrentArgument = Group2->LineEdit1; + Group2->LineEdit1->setText(""); + Group2->LineEdit2->setText(""); + myVectX = GEOM::GEOM_Object::_nil(); + myVectZ = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 2: + { + Group1->hide(); + Group2->hide(); + resize(0, 0); + Group3->show(); + + Group3->RadioButton1->setChecked(true); + aOriginType = 1; + break; + } + } + displayPreview(); +} + +//================================================================================= +// function : GroupClicked() +// purpose : Radio button management +//================================================================================= +void BasicGUI_WorkingPlaneDlg::GroupClicked(int groupId) +{ + aOriginType = groupId; +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BasicGUI_WorkingPlaneDlg::ClickOnApply() +{ + buttonApply->setFocus(); + myGeometryGUI->application()->putInfo(tr("")); + const int id = getConstructorId(); + + if (id == 0) { + if ( !CORBA::is_nil( myFace ) ) { + TopoDS_Face aPlaneShape; + if ( GEOMBase::GetShape( myFace, aPlaneShape, TopAbs_FACE ) ) { + Handle(Geom_Surface) aGS = BRep_Tool::Surface( TopoDS::Face( aPlaneShape ) ); + if ( !aGS.IsNull() && aGS->IsKind( STANDARD_TYPE( Geom_Plane ) ) ) { + Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast( aGS ); + gp_Pln aPln = aGPlane->Pln(); + + myWPlane = aPln.Position(); + myGeometryGUI->SetWorkingPlane(myWPlane); + myGeometryGUI->ActiveWorkingPlane(); + return true; + } + } + } + } else if (id == 1) { + if ( CORBA::is_nil( myVectX ) || CORBA::is_nil( myVectZ ) ) { + showError( "Two vectors have to be selected" ); + return false; + } + + TopoDS_Edge aVectX, aVectZ; + TopoDS_Vertex V1, V2; + gp_Vec aVX, aVZ; + if (GEOMBase::GetShape( myVectX, aVectX, TopAbs_EDGE ) && + GEOMBase::GetShape( myVectZ, aVectZ, TopAbs_EDGE )) { + TopExp::Vertices(aVectZ, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) + aVZ = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + else { + showError( "Bad OZ vector" ); + return false; + } + + TopExp::Vertices(aVectX, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) + aVX = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + else { + showError( "Bad OX vector" ); + return false; + } + + gp_Dir aDirZ = gp_Dir(aVZ.X(), aVZ.Y(), aVZ.Z()); + gp_Dir aDirX = gp_Dir(aVX.X(), aVX.Y(), aVX.Z()); + + if (aDirX.IsParallel(aDirZ, Precision::Confusion())) { + showError( "Parallel vectors selected" ); + return false; + } + + myWPlane = gp_Ax3(BRep_Tool::Pnt(V1), aDirZ, aDirX); + + myGeometryGUI->SetWorkingPlane(myWPlane); + myGeometryGUI->ActiveWorkingPlane(); + return true; + } + } else if (id == 2) { + gp_Pnt P1 = gp_Pnt(0., 0., 0.); + gp_Dir aDirZ, aDirX; + + if (aOriginType == 1) { + aDirZ = gp_Dir(0., 0., 1.); + aDirX = gp_Dir(1., 0., 0.); + } + else if (aOriginType == 2) { + aDirZ = gp_Dir(1., 0., 0.); + aDirX = gp_Dir(0., 1., 0.); + } + else if (aOriginType == 0) { + aDirZ = gp_Dir(0., 1., 0.); + aDirX = gp_Dir(0., 0., 1.); + } + + myWPlane = gp_Ax3(P1, aDirZ, aDirX); + + myGeometryGUI->SetWorkingPlane(myWPlane); + myGeometryGUI->ActiveWorkingPlane(); + return true; + } + return false; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BasicGUI_WorkingPlaneDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + const int id = getConstructorId(); + if ( IObjectCount() != 1 ) { + if(id == 0) + myFace = GEOM::GEOM_Object::_nil(); + else if(id == 1) { + if (myEditCurrentArgument == Group2->LineEdit1) + myVectX = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group2->LineEdit2) + myVectZ = GEOM::GEOM_Object::_nil(); + } + return; + } + + // nbSel == 1 + Standard_Boolean aRes = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), aRes); + + if(!aRes || CORBA::is_nil( aSelectedObject )) + return; + + if(myEditCurrentArgument == Group1->LineEdit1) + myFace = aSelectedObject; + else if(myEditCurrentArgument == Group2->LineEdit1) + myVectX = aSelectedObject; + else if(myEditCurrentArgument == Group2->LineEdit2) + myVectZ = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == Group1->PushButton1) { + myEditCurrentArgument = Group1->LineEdit1; + globalSelection( GEOM_PLANE ); + } + else if(send == Group2->PushButton1) { + myEditCurrentArgument = Group2->LineEdit1; + globalSelection( GEOM_LINE ); + } + else if(send == Group2->PushButton2) { + myEditCurrentArgument = Group2->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == Group1->LineEdit1 || send == Group2->LineEdit1 || send == Group2->LineEdit2) { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::ActivateThisDialog( ) +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void BasicGUI_WorkingPlaneDlg::DeactivateActiveDialog() +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void BasicGUI_WorkingPlaneDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void BasicGUI_WorkingPlaneDlg::closeEvent( QCloseEvent* e ) +{ + // myGeometryGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/BlocksGUI/BlocksGUI_BlockDlg.cxx b/src/BlocksGUI/BlocksGUI_BlockDlg.cxx new file mode 100644 index 000000000..5d0444ea4 --- /dev/null +++ b/src/BlocksGUI/BlocksGUI_BlockDlg.cxx @@ -0,0 +1,400 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 CEA +// +// 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.org +// +// +// +// File : BlocksGUI_BlockDlg.cxx +// Author : Julia DOROVSKIKH +// Module : GEOM +// $Header$ + +#include "BlocksGUI_BlockDlg.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include "GEOMImpl_Types.hxx" + +using namespace std; + +#include + +//================================================================================= +// class : BlocksGUI_BlockDlg() +// purpose : Constructs a BlocksGUI_BlockDlg which is a child of 'parent'. +//================================================================================= +BlocksGUI_BlockDlg::BlocksGUI_BlockDlg (QWidget* parent, + bool modal) + : GEOMBase_Skeleton(parent, "BlockDlg", modal, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BLOCK_2F"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BLOCK_6F"))); + QPixmap imageS (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setCaption(tr("GEOM_BLOCK_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_BLOCK")); + + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + // Create first group + Group2F = new DlgRef_2Sel_QTD(this, "Group2F"); + Group2F->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + Group2F->TextLabel1->setText(tr("FACE_1")); + Group2F->TextLabel2->setText(tr("FACE_2")); + Group2F->PushButton1->setPixmap(imageS); + Group2F->PushButton2->setPixmap(imageS); + + // Create second group + Group6F = new DlgRef_6Sel_QTD(this, "Group2F"); + Group6F->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + Group6F->TextLabel1->setText(tr("FACE_1")); + Group6F->TextLabel2->setText(tr("FACE_2")); + Group6F->TextLabel3->setText(tr("FACE_3")); + Group6F->TextLabel4->setText(tr("FACE_4")); + Group6F->TextLabel5->setText(tr("FACE_5")); + Group6F->TextLabel6->setText(tr("FACE_6")); + Group6F->PushButton1->setPixmap(imageS); + Group6F->PushButton2->setPixmap(imageS); + Group6F->PushButton3->setPixmap(imageS); + Group6F->PushButton4->setPixmap(imageS); + Group6F->PushButton5->setPixmap(imageS); + Group6F->PushButton6->setPixmap(imageS); + + // Add groups to layout + Layout1->addWidget(Group2F, 2, 0); + Layout1->addWidget(Group6F, 2, 0); + /***************************************************************/ + + Init(); +} + +//================================================================================= +// function : ~BlocksGUI_BlockDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BlocksGUI_BlockDlg::~BlocksGUI_BlockDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BlocksGUI_BlockDlg::Init() +{ + // init variables + Group2F->LineEdit1->setReadOnly(true); + Group2F->LineEdit2->setReadOnly(true); + + Group6F->LineEdit1->setReadOnly(true); + Group6F->LineEdit2->setReadOnly(true); + Group6F->LineEdit3->setReadOnly(true); + Group6F->LineEdit4->setReadOnly(true); + Group6F->LineEdit5->setReadOnly(true); + Group6F->LineEdit6->setReadOnly(true); + + // 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(Group2F->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2F->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group6F->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group6F->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group6F->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group6F->PushButton4, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group6F->PushButton5, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group6F->PushButton6, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + // init controls and fields + initName(tr("GEOM_BLOCK")); + + myConstructorId = -1; + ConstructorsClicked(0); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BlocksGUI_BlockDlg::ConstructorsClicked (int constructorId) +{ + if (myConstructorId == constructorId) + return; + + myConstructorId = constructorId; + + switch (constructorId) { + case 0: + Group6F->hide(); + resize(0, 0); + Group2F->show(); + + myEditCurrentArgument = Group2F->LineEdit1; + Group2F->LineEdit1->setText(tr("")); + Group2F->LineEdit2->setText(tr("")); + break; + case 1: + Group2F->hide(); + resize(0, 0); + Group6F->show(); + + myEditCurrentArgument = Group6F->LineEdit1; + Group6F->LineEdit1->setText(tr("")); + Group6F->LineEdit2->setText(tr("")); + Group6F->LineEdit3->setText(tr("")); + Group6F->LineEdit4->setText(tr("")); + Group6F->LineEdit5->setText(tr("")); + Group6F->LineEdit6->setText(tr("")); + break; + default: + break; + } + + // init fields + myFace1 = myFace2 = GEOM::GEOM_Object::_nil(); + myFace3 = myFace4 = myFace5 = myFace6 = myFace1; + + globalSelection(GEOM_FACE); + SelectionIntoArgument(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BlocksGUI_BlockDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BlocksGUI_BlockDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BlocksGUI_BlockDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if (IObjectCount() != 1) + { + if (myEditCurrentArgument == Group2F->LineEdit1 || + myEditCurrentArgument == Group6F->LineEdit1) + myFace1 = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group2F->LineEdit2 || + myEditCurrentArgument == Group6F->LineEdit2) + myFace2 = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group6F->LineEdit3) + myFace3 = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group6F->LineEdit4) + myFace4 = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group6F->LineEdit5) + myFace5 = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == Group6F->LineEdit6) + myFace6 = GEOM::GEOM_Object::_nil(); + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if (!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if (myEditCurrentArgument == Group2F->LineEdit1 || + myEditCurrentArgument == Group6F->LineEdit1) + myFace1 = aSelectedObject; + else if (myEditCurrentArgument == Group2F->LineEdit2 || + myEditCurrentArgument == Group6F->LineEdit2) + myFace2 = aSelectedObject; + else if (myEditCurrentArgument == Group6F->LineEdit3) + myFace3 = aSelectedObject; + else if (myEditCurrentArgument == Group6F->LineEdit4) + myFace4 = aSelectedObject; + else if (myEditCurrentArgument == Group6F->LineEdit5) + myFace5 = aSelectedObject; + else if (myEditCurrentArgument == Group6F->LineEdit6) + myFace6 = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BlocksGUI_BlockDlg::SetEditCurrentArgument() +{ + QPushButton* aSender = (QPushButton*)sender(); + + if (aSender == Group2F->PushButton1) { + myEditCurrentArgument = Group2F->LineEdit1; + } else if (aSender == Group2F->PushButton2) { + myEditCurrentArgument = Group2F->LineEdit2; + + } else if (aSender == Group6F->PushButton1) { + myEditCurrentArgument = Group6F->LineEdit1; + } else if (aSender == Group6F->PushButton2) { + myEditCurrentArgument = Group6F->LineEdit2; + } else if (aSender == Group6F->PushButton3) { + myEditCurrentArgument = Group6F->LineEdit3; + } else if (aSender == Group6F->PushButton4) { + myEditCurrentArgument = Group6F->LineEdit4; + } else if (aSender == Group6F->PushButton5) { + myEditCurrentArgument = Group6F->LineEdit5; + } else if (aSender == Group6F->PushButton6) { + myEditCurrentArgument = Group6F->LineEdit6; + } + + globalSelection(GEOM_FACE); + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BlocksGUI_BlockDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + globalSelection(GEOM_FACE); + + SelectionIntoArgument(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BlocksGUI_BlockDlg::enterEvent (QEvent* e) +{ + if (!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +//void BlocksGUI_BlockDlg::DeactivateActiveDialog() +//{ +// GEOMBase_Skeleton::DeactivateActiveDialog(); +//} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BlocksGUI_BlockDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BlocksGUI_BlockDlg::isValid (QString&) +{ + switch (getConstructorId()) { + case 0: + return !(myFace1->_is_nil() || myFace2->_is_nil()); + case 1: + return !(myFace1->_is_nil() || myFace2->_is_nil() || + myFace3->_is_nil() || myFace4->_is_nil() || + myFace5->_is_nil() || myFace6->_is_nil()); + default: + return false; + } + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BlocksGUI_BlockDlg::execute (ObjectList& objects) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + if (!CORBA::is_nil(myFace1) && !CORBA::is_nil(myFace2)) { + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())-> + MakeHexa2Faces(myFace1, myFace2); + res = true; + } + break; + case 1: + if (!CORBA::is_nil(myFace1) && !CORBA::is_nil(myFace2) && + !CORBA::is_nil(myFace3) && !CORBA::is_nil(myFace4) && + !CORBA::is_nil(myFace5) && !CORBA::is_nil(myFace6)) { + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())-> + MakeHexa(myFace1, myFace2, myFace3, myFace4, myFace5, myFace6); + res = true; + } + break; + } + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return res; +} diff --git a/src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx b/src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx new file mode 100644 index 000000000..728082a4e --- /dev/null +++ b/src/BlocksGUI/BlocksGUI_ExplodeDlg.cxx @@ -0,0 +1,505 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 CEA +// +// 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.org +// +// +// +// File : BlocksGUI_ExplodeDlg.cxx +// Author : Julia DOROVSKIKH +// Module : GEOM +// $Header$ + +#include "BlocksGUI_ExplodeDlg.h" + +#include "DlgRef_SpinBox.h" + +#include "GEOM_Displayer.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "OCCViewer_ViewModel.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "utilities.h" + +#include + +#include +#include +#include +#include + +//================================================================================= +// class : BlocksGUI_ExplodeDlg() +// purpose : Constructs a BlocksGUI_ExplodeDlg which is a child of 'parent'. +//================================================================================= +BlocksGUI_ExplodeDlg::BlocksGUI_ExplodeDlg (QWidget* parent, + bool modal) + : GEOMBase_Skeleton(parent, "ExplodeDlg", modal, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BLOCK_EXPLODE"))); + QPixmap imageS (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_BLOCK_EXPLODE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_BLOCK_EXPLODE")); + + RadioButton1->setPixmap(image1); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + // Create first group + myGrp1 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_ARGUMENTS"), this); + + QGroupBox* aSelGrp = new QGroupBox(3, Qt::Horizontal, myGrp1); + aSelGrp->setFrameStyle(QFrame::NoFrame); + aSelGrp->setInsideMargin(0); + + new QLabel(tr("GEOM_MAIN_OBJECT"), aSelGrp); + mySelBtn = new QPushButton(aSelGrp); + mySelBtn->setPixmap(imageS); + mySelName = new QLineEdit(aSelGrp); + mySelName->setReadOnly(true); + + QGroupBox* aSpinGrp = new QGroupBox(2, Qt::Horizontal, myGrp1); + aSpinGrp->setFrameStyle(QFrame::NoFrame); + aSpinGrp->setInsideMargin(0); + + new QLabel(tr("NB_FACES_MIN"), aSpinGrp); + mySpinBoxMin = new DlgRef_SpinBox(aSpinGrp); + + new QLabel(tr("NB_FACES_MAX"), aSpinGrp); + mySpinBoxMax = new DlgRef_SpinBox(aSpinGrp); + + QGroupBox* anInfoGrp = new QGroupBox(2, Qt::Horizontal, myGrp1); + anInfoGrp->setFrameStyle(QFrame::NoFrame); + anInfoGrp->setInsideMargin(0); + + myBlocksNb = new QTextEdit(anInfoGrp); + myBlocksNb->setReadOnly(true); + + QGroupBox* aCheckGrp = new QGroupBox(3, Qt::Horizontal, myGrp1); + aCheckGrp->setFrameStyle(QFrame::NoFrame); + aCheckGrp->setInsideMargin(0); + + myCheckBtn = new QCheckBox(aCheckGrp, "CheckButton1"); + myCheckBtn->setText(tr("GEOM_SUBSHAPE_SELECT")); + + // Add groups to layout + Layout1->addWidget(myGrp1, 1, 0); + /***************************************************************/ + + Init(); +} + +//================================================================================= +// function : ~BlocksGUI_ExplodeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BlocksGUI_ExplodeDlg::~BlocksGUI_ExplodeDlg() +{ + // no need to delete child widgets, Qt does it all for us + clearTemporary(); +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::Init() +{ + // Set range of spinboxes + double SpecificStep = 1.0; + mySpinBoxMin->RangeStepAndValidator(0.0, 999.0, SpecificStep, 3); + mySpinBoxMax->RangeStepAndValidator(0.0, 999.0, SpecificStep, 3); + + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type()) + myCheckBtn->setEnabled(false); + + // signals and slots connections + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(mySelBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(mySpinBoxMin, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(mySpinBoxMax, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myCheckBtn, SIGNAL(stateChanged(int)), this, SLOT(SubShapeToggled())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + myConstructorId = -1; + ConstructorsClicked(0); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BlocksGUI_ExplodeDlg::ConstructorsClicked (int constructorId) +{ + if (myConstructorId == constructorId) + return; + + myConstructorId = constructorId; + + switch (constructorId) { + case 0: + myGrp1->show(); + mySpinBoxMin->SetValue(6.0); + mySpinBoxMax->SetValue(6.0); + myCheckBtn->setChecked(FALSE); + break; + default: + break; + } + + // init fields + myEditCurrentArgument = mySelName; + myObject = GEOM::GEOM_Object::_nil(); + + activateSelection(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BlocksGUI_ExplodeDlg::ClickOnApply() +{ + SUIT_Session::session()->activeApplication()->putInfo(tr("")); + + // Explode all sub shapes + if (isAllSubShapes()) { + // More than 30 subshapes : ask confirmation + if (myNbBlocks > 30) { + const QString caption = tr("GEOM_CONFIRM"); + const QString text = tr("GEOM_CONFIRM_INFO").arg(myNbBlocks); + const QString button0 = tr("GEOM_BUT_EXPLODE"); + const QString button1 = tr("GEOM_BUT_CANCEL"); + + if (QMessageBox::warning(this, caption, text, button0, button1) != 0) + return false; /* aborted */ + } + } + + if (!onAccept()) + return false; + + activateSelection(); + + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void BlocksGUI_ExplodeDlg::SelectionIntoArgument() +{ + if (!isAllSubShapes()) + return; + + myObject = GEOM::GEOM_Object::_nil(); + mySelName->setText(""); + + if (IObjectCount() == 1) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject(firstIObject(), aResult); + + if ( aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) { + myObject = anObj; + mySelName->setText(GEOMBase::GetName(anObj)); + } + } + + updateButtonState(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::SetEditCurrentArgument() +{ + QPushButton* aSender = (QPushButton*)sender(); + + if (mySelBtn == aSender) { + mySelName->setFocus(); + myEditCurrentArgument = mySelName; + myCheckBtn->setChecked(FALSE); + } + + activateSelection(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + activateSelection(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::enterEvent (QEvent* e) +{ + if (!GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::ValueChangedInSpinBox (double newValue) +{ + if (!isAllSubShapes()) + activateSelection(); + else + updateButtonState(); +} + +//================================================================================= +// function : SubShapeToggled() +// purpose : Allow user selection of all or only selected sub shapes +// : Called when 'myCheckBtn' state change +//================================================================================= +void BlocksGUI_ExplodeDlg::SubShapeToggled() +{ + activateSelection(); +} + +//================================================================================= +// function : activateSelection +// purpose : Redisplay preview and Activate selection +//================================================================================= +void BlocksGUI_ExplodeDlg::activateSelection() +{ + clearTemporary(); + erasePreview(true); + + if (isAllSubShapes()) { // Sub-shapes selection disabled + 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 { + displayPreview(true, true, false); + globalSelection(GEOM_PREVIEW); + } +} + +//================================================================================= +// function : updateButtonState +// purpose : +//================================================================================= +void BlocksGUI_ExplodeDlg::updateButtonState() +{ + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type() || myObject->_is_nil()) { + myCheckBtn->setChecked(FALSE); + myCheckBtn->setEnabled(FALSE); + } else { + myCheckBtn->setEnabled(TRUE); + } + + myNbBlocks = 0; + + if (myObject->_is_nil()) { + myBlocksNb->setText(""); + } else { + bool isOnlyBlocks = GEOM::GEOM_IBlocksOperations::_narrow + (getOperation())->IsCompoundOfBlocks(myObject, + (int)mySpinBoxMin->GetValue(), + (int)mySpinBoxMax->GetValue(), + myNbBlocks); + if (isOnlyBlocks) + myBlocksNb->setText(tr("GEOM_NB_BLOCKS_NO_OTHERS").arg(myNbBlocks)); + else + myBlocksNb->setText(tr("GEOM_NB_BLOCKS_SOME_OTHERS").arg(myNbBlocks)); + } +} + +//================================================================================= +// function : isAllSubShapes +// purpose : +//================================================================================= +bool BlocksGUI_ExplodeDlg::isAllSubShapes() const +{ + return !myCheckBtn->isChecked() || !myCheckBtn->isEnabled(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BlocksGUI_ExplodeDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations(getStudyId()); +} + +//================================================================================= +// function : isValid() +// purpose : Verify validity of input data +//================================================================================= +bool BlocksGUI_ExplodeDlg::isValid (QString&) +{ + switch (getConstructorId()) { + case 0: + if (IsPreview()) + return !myObject->_is_nil(); + else + return !myObject->_is_nil() && (isAllSubShapes() || IObjectCount()); + default: + return false; + } + + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BlocksGUI_ExplodeDlg::execute (ObjectList& objects) +{ + GEOM::ListOfGO_var aList; + + switch (getConstructorId()) { + case 0: + aList = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->ExplodeCompoundOfBlocks + (myObject, + (int)mySpinBoxMin->GetValue(), + (int)mySpinBoxMax->GetValue()); + break; + } + + if (!aList->length()) + return false; + + if (IsPreview()) { + clearTemporary(); + + // Store objects. They will be put in study when "Apply" is pressed + for (int i = 0, n = aList->length(); i < n; i++) { + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + myTmpObjs.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + return objects.size() ? true : false; + } + + // Throw away sub-shapes not selected by user if not in preview mode + // and manual selection is active + if (!isAllSubShapes()) + { + 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::iterator anIter; + for (anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter) { + if (selected.contains(myGeomGUI->getApp()->orb()->object_to_string(*anIter))) + objects.push_back(*anIter); + else + toRemoveFromEnggine.push_back(*anIter); + } + + // Remove from engine useless objects + ObjectList::iterator anIter2 = toRemoveFromEnggine.begin(); + for (; anIter2 != toRemoveFromEnggine.end(); ++anIter2) + getGeomEngine()->RemoveObject(*anIter2); + + myTmpObjs.clear(); + + } else { + for (int i = 0, n = aList->length(); i < n; i++) + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + return objects.size(); +} + +//================================================================================= +// function : clearTemporary +// purpose : Remove temporary objects from engine +//================================================================================= +void BlocksGUI_ExplodeDlg::clearTemporary() +{ + ObjectList::iterator anIter; + for (anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter) + getGeomEngine()->RemoveObject(*anIter); + + myTmpObjs.clear(); +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// ( called with addInStudy method ) +//================================================================ +GEOM::GEOM_Object_ptr BlocksGUI_ExplodeDlg::getFather (GEOM::GEOM_Object_ptr) +{ + return myObject; +} + +//================================================================ +// Function : getNewObjectName +// Purpose : Redefine this method to return proper name for a new object +//================================================================ +const char* BlocksGUI_ExplodeDlg::getNewObjectName() const +{ + return ""; +} diff --git a/src/BlocksGUI/BlocksGUI_PropagateDlg.cxx b/src/BlocksGUI/BlocksGUI_PropagateDlg.cxx new file mode 100644 index 000000000..0c4bdc44b --- /dev/null +++ b/src/BlocksGUI/BlocksGUI_PropagateDlg.cxx @@ -0,0 +1,319 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BlocksGUI_PropagateDlg.cxx +// Author : VKN +// Module : GEOM +// $Header$ + +#include "BlocksGUI_PropagateDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include + +using namespace std; + +//================================================================================= +// class : BlocksGUI_PropagateDlg() +// purpose : Constructs a BlocksGUI_PropagateDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BlocksGUI_PropagateDlg::BlocksGUI_PropagateDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PROPAGATE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_PROPAGATE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PROPAGATE_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_SELECTED_SHAPE" ), this ); + QGroupBox* aSelGrp = new QGroupBox(3, Qt::Horizontal, aMainGrp); + aSelGrp->setFrameStyle(QFrame::NoFrame); + aSelGrp->setInsideMargin(0); + + new QLabel(tr("GEOM_OBJECT"), aSelGrp); + mySelBtn = new QPushButton(aSelGrp); + mySelBtn->setPixmap(image1); + mySelName = new QLineEdit(aSelGrp); + mySelName->setReadOnly(true); + + Layout1->addWidget(aMainGrp, 1, 0); + + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~BlocksGUI_PropagateDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BlocksGUI_PropagateDlg::~BlocksGUI_PropagateDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::Init() +{ + /* init variables */ + + myObject = GEOM::GEOM_Object::_nil(); + ResultName->setText( "" ); + + //myGeomGUI->SetState( 0 ); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(mySelBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(mySelName, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + activateSelection(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void BlocksGUI_PropagateDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BlocksGUI_PropagateDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + mySelName->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + activateSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void BlocksGUI_PropagateDlg::SelectionIntoArgument() +{ + mySelName->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + if ( IObjectCount() == 1 ) { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes ) + mySelName->setText( GEOMBase::GetName( myObject ) ); + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == mySelBtn ) { + mySelName->setFocus(); + } + activateSelection(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == mySelName ) { + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + mySelName->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + //myGeomGUI->SetState( 0 ); + activateSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void BlocksGUI_PropagateDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void BlocksGUI_PropagateDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BlocksGUI_PropagateDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BlocksGUI_PropagateDlg::isValid( QString& msg ) +{ + return !myObject->_is_nil() ; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BlocksGUI_PropagateDlg::execute( ObjectList& objects ) +{ + + GEOM::ListOfGO_var aList = GEOM::GEOM_IBlocksOperations::_narrow( getOperation() )->Propagate( myObject ); + ResultName->setText( "" ); + + if ( !aList->length() ) + return false; + + for ( int i = 0, n = aList->length(); i < n; i++ ) + { + objects.push_back(aList[i]._retn()); + } + + return objects.size() ? true : false; +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection +//================================================================================= +void BlocksGUI_PropagateDlg::activateSelection() +{ + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SOLID ); + aMap.Add( GEOM_COMPOUND ); + globalSelection( aMap ); + if (myObject->_is_nil()) { + SelectionIntoArgument(); + } + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// ( called with addInStudy method ) +//================================================================ +GEOM::GEOM_Object_ptr BlocksGUI_PropagateDlg::getFather (GEOM::GEOM_Object_ptr) +{ + return myObject; +} + diff --git a/src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx b/src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx new file mode 100644 index 000000000..ebf979a2b --- /dev/null +++ b/src/BlocksGUI/BlocksGUI_QuadFaceDlg.cxx @@ -0,0 +1,413 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 CEA +// +// 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.org +// +// +// +// File : BlocksGUI_QuadFaceDlg.cxx +// Author : Julia DOROVSKIKH +// Module : GEOM +// $Header$ + +#include "BlocksGUI_QuadFaceDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +//using namespace std; + +#include + +//================================================================================= +// class : BlocksGUI_QuadFaceDlg() +// purpose : Constructs a BlocksGUI_QuadFaceDlg which is a child of 'parent'. +//================================================================================= +BlocksGUI_QuadFaceDlg::BlocksGUI_QuadFaceDlg (QWidget* parent, + bool modal) + : GEOMBase_Skeleton(parent, "QuadFaceDlg", modal, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_QUAD_FACE_4_VERT"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_QUAD_FACE_2_EDGE"))); + QPixmap image3 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_QUAD_FACE_4_EDGE"))); + QPixmap imageS (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_QUAD_FACE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_QUAD_FACE")); + + RadioButton1->setPixmap(image1); + RadioButton2->setPixmap(image2); + RadioButton3->setPixmap(image3); + + // Create first group + myGrp1 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_ARGUMENTS"), this); + + QGroupBox* aSelGrp1 = new QGroupBox(3, Qt::Horizontal, myGrp1); + aSelGrp1->setFrameStyle(QFrame::NoFrame); + aSelGrp1->setInsideMargin(0); + + createSelWg(tr("VERTEX_1"), imageS, aSelGrp1, Vertex1); + createSelWg(tr("VERTEX_2"), imageS, aSelGrp1, Vertex2); + createSelWg(tr("VERTEX_3"), imageS, aSelGrp1, Vertex3); + createSelWg(tr("VERTEX_4"), imageS, aSelGrp1, Vertex4); + + // Create second group + myGrp2 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_ARGUMENTS"), this); + + QGroupBox* aSelGrp2 = new QGroupBox(3, Qt::Horizontal, myGrp2); + aSelGrp2->setFrameStyle(QFrame::NoFrame); + aSelGrp2->setInsideMargin(0); + + createSelWg(tr("EDGE_1"), imageS, aSelGrp2, Edge12); + createSelWg(tr("EDGE_2"), imageS, aSelGrp2, Edge22); + + // Create fird group + myGrp3 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_ARGUMENTS"), this); + + QGroupBox* aSelGrp3 = new QGroupBox(3, Qt::Horizontal, myGrp3); + aSelGrp3->setFrameStyle(QFrame::NoFrame); + aSelGrp3->setInsideMargin(0); + + createSelWg(tr("EDGE_1"), imageS, aSelGrp3, Edge14); + createSelWg(tr("EDGE_2"), imageS, aSelGrp3, Edge24); + createSelWg(tr("EDGE_3"), imageS, aSelGrp3, Edge34); + createSelWg(tr("EDGE_4"), imageS, aSelGrp3, Edge44); + + (new QLabel(myGrp3))->setSizePolicy( + QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + // Add groups to layout + Layout1->addWidget(myGrp1, 2, 0); + Layout1->addWidget(myGrp2, 2, 0); + Layout1->addWidget(myGrp3, 2, 0); + /***************************************************************/ + + Init(); +} + +//================================================================================= +// function : ~BlocksGUI_QuadFaceDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BlocksGUI_QuadFaceDlg::~BlocksGUI_QuadFaceDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::Init() +{ + // 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))); + + QMap::iterator anIterBtn; + for (anIterBtn = mySelBtn.begin(); anIterBtn != mySelBtn.end(); ++anIterBtn) + connect(anIterBtn.data(), SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + // init controls and fields + initName(tr("GEOM_QUAD_FACE")); + + myConstructorId = -1; + ConstructorsClicked(0); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BlocksGUI_QuadFaceDlg::ConstructorsClicked (int constructorId) +{ + if (myConstructorId == constructorId) + return; + + myConstructorId = constructorId; + + switch (constructorId) { + case 0: + myGrp2->hide(); + myGrp3->hide(); + myGrp1->show(); + myEditCurrentArgument = mySelName[Vertex1]; + break; + case 1: + myGrp1->hide(); + myGrp3->hide(); + myGrp2->show(); + myEditCurrentArgument = mySelName[Edge12]; + break; + case 2: + myGrp1->hide(); + myGrp2->hide(); + myGrp3->show(); + myEditCurrentArgument = mySelName[Edge14]; + break; + default: + break; + } + + // clear line edits + QMap::iterator anIterLE; + for (anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE) + anIterLE.data()->setText(""); + + // init fields + myShape1 = myShape2 = GEOM::GEOM_Object::_nil(); + myShape3 = myShape4 = myShape1; + + activateSelection(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BlocksGUI_QuadFaceDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void BlocksGUI_QuadFaceDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + // Get index of current selection focus + int aCurrFocus = -1; + QMap::iterator anIter; + for (anIter = mySelName.begin(); anIter != mySelName.end(); ++anIter) { + if (myEditCurrentArgument == anIter.data()) { + aCurrFocus = anIter.key(); + break; + } + } + + GEOM::GEOM_Object_var anObj; + Standard_Boolean aResult = Standard_False; + if (IObjectCount() == 1) { + anObj = GEOMBase::ConvertIOinGEOMObject(firstIObject(), aResult); + if (aResult) { + if (anObj->_is_nil()) { + aResult = Standard_False; + } else { + mySelName[aCurrFocus]->setText(GEOMBase::GetName(anObj)); + } + } else { + anObj = GEOM::GEOM_Object::_nil(); + } + } + + if (aCurrFocus == Vertex1 || aCurrFocus == Edge12 || aCurrFocus == Edge14) { + myShape1 = anObj; + } else if (aCurrFocus == Vertex2 || aCurrFocus == Edge22 || aCurrFocus == Edge24) { + myShape2 = anObj; + } else if (aCurrFocus == Vertex3 || aCurrFocus == Edge34) { + myShape3 = anObj; + } else if (aCurrFocus == Vertex4 || aCurrFocus == Edge44) { + myShape4 = anObj; + } else { + return; + } + + displayPreview(); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::SetEditCurrentArgument() +{ + QPushButton* aSender = (QPushButton*)sender(); + + QMap::iterator anIter; + for (anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter) { + if (anIter.data() == aSender) { + mySelName[anIter.key()]->setFocus(); + myEditCurrentArgument = mySelName[anIter.key()]; + } + } + + activateSelection(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + activateSelection(); + displayPreview(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::enterEvent (QEvent* e) +{ + if (!GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +//void BlocksGUI_QuadFaceDlg::DeactivateActiveDialog() +//{ +// // disconnect selection +// GEOMBase_Skeleton::DeactivateActiveDialog(); +//} + +//================================================================================= +// function : createSelWg() +// purpose : +//================================================================================= +void BlocksGUI_QuadFaceDlg::createSelWg (const QString& theLbl, + QPixmap& thePix, + QWidget* theParent, + const int theId) +{ + new QLabel(theLbl, theParent); + mySelBtn[theId] = new QPushButton(theParent); + mySelBtn[theId]->setPixmap(thePix); + mySelName[theId] = new QLineEdit(theParent); + mySelName[theId]->setReadOnly(true); +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void BlocksGUI_QuadFaceDlg::activateSelection() +{ + if (myEditCurrentArgument == mySelName[Vertex1] || + myEditCurrentArgument == mySelName[Vertex2] || + myEditCurrentArgument == mySelName[Vertex3] || + myEditCurrentArgument == mySelName[Vertex4]) { + + globalSelection(GEOM_POINT); + + } else { + globalSelection(GEOM_EDGE); + } + + SelectionIntoArgument(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BlocksGUI_QuadFaceDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations(getStudyId()); +} + +//================================================================================= +// function : isValid +// purpose : Verify validity of input data +//================================================================================= +bool BlocksGUI_QuadFaceDlg::isValid (QString&) +{ + switch (getConstructorId()) { + case 0: + return (!myShape1->_is_nil() && !myShape2->_is_nil() && + !myShape3->_is_nil() && !myShape4->_is_nil()); + case 1: + return (!myShape1->_is_nil() && !myShape2->_is_nil()); + case 2: + return (!myShape1->_is_nil() && !myShape2->_is_nil() && + !myShape3->_is_nil() && !myShape4->_is_nil()); + default: + return false; + } + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BlocksGUI_QuadFaceDlg::execute (ObjectList& objects) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->MakeQuad4Vertices + (myShape1, myShape2, myShape3, myShape4); + res = true; + break; + case 1: + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->MakeQuad2Edges + (myShape1, myShape2); + res = true; + break; + case 2: + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->MakeQuad + (myShape1, myShape2, myShape3, myShape4); + res = true; + break; + default: + break; + } + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return res; +} diff --git a/src/BlocksGUI/BlocksGUI_TrsfDlg.cxx b/src/BlocksGUI/BlocksGUI_TrsfDlg.cxx new file mode 100644 index 000000000..b58b8c62d --- /dev/null +++ b/src/BlocksGUI/BlocksGUI_TrsfDlg.cxx @@ -0,0 +1,520 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 CEA +// +// 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.org +// +// +// +// File : BlocksGUI_TrsfDlg.cxx +// Author : Julia DOROVSKIKH +// Module : GEOM +// $Header$ + +#include "BlocksGUI_TrsfDlg.h" + +#include "DlgRef_SpinBox.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "OCCViewer_ViewModel.h" + +#include + +#include + +//================================================================================= +// class : BlocksGUI_TrsfDlg() +// purpose : Constructs a BlocksGUI_TrsfDlg which is a child of 'parent'. +//================================================================================= +BlocksGUI_TrsfDlg::BlocksGUI_TrsfDlg (QWidget* parent, + bool modal) + : GEOMBase_Skeleton(parent, "TrsfDlg", modal, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BLOCK_MULTITRSF_SIMPLE"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BLOCK_MULTITRSF_DOUBLE"))); + QPixmap imageS (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_BLOCK_MULTITRSF_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_BLOCK_MULTITRSF")); + + RadioButton1->setPixmap(image1); + RadioButton2->setPixmap(image2); + RadioButton3->close(TRUE); + + // Create first group + myGrp1 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_BLOCK_MULTITRSF_SIMPLE"), this); + + QGroupBox* aSelGrp1 = new QGroupBox(3, Qt::Horizontal, myGrp1); + aSelGrp1->setFrameStyle(QFrame::NoFrame); + aSelGrp1->setInsideMargin(0); + + createSelWg(tr("GEOM_MAIN_OBJECT"), imageS, aSelGrp1, MainObj1); + createSelWg(tr("FACE_1"), imageS, aSelGrp1, Face1); + createSelWg(tr("FACE_2"), imageS, aSelGrp1, Face2); + + QGroupBox* aSpinGrp1 = new QGroupBox(1, Qt::Vertical, myGrp1); + aSpinGrp1->setFrameStyle(QFrame::NoFrame); + aSpinGrp1->setInsideMargin(0); + + new QLabel(tr("GEOM_NB_TIMES"), aSpinGrp1); + mySpinBox[SpinBox1] = new DlgRef_SpinBox(aSpinGrp1); + + // Create second group + myGrp2 = new QGroupBox(1, Qt::Horizontal, tr("GEOM_BLOCK_MULTITRSF_DOUBLE"), this); + + // U trsf + QGroupBox* aSelGrp2U = new QGroupBox(3, Qt::Horizontal, myGrp2); + aSelGrp2U->setFrameStyle(QFrame::NoFrame); + aSelGrp2U->setInsideMargin(0); + + createSelWg(tr("GEOM_MAIN_OBJECT"), imageS, aSelGrp2U, MainObj2); + createSelWg(tr("FACE_1U"), imageS, aSelGrp2U, Face1U); + createSelWg(tr("FACE_2U"), imageS, aSelGrp2U, Face2U); + + QGroupBox* aSpinGrp2U = new QGroupBox(1, Qt::Vertical, myGrp2); + aSpinGrp2U->setFrameStyle(QFrame::NoFrame); + aSpinGrp2U->setInsideMargin(0); + + new QLabel(tr("GEOM_NB_TIMES_U"), aSpinGrp2U); + mySpinBox[SpinBox2U] = new DlgRef_SpinBox(aSpinGrp2U); + + // V trsf + QGroupBox* aSelGrp2V = new QGroupBox(3, Qt::Horizontal, myGrp2); + aSelGrp2V->setFrameStyle(QFrame::NoFrame); + aSelGrp2V->setInsideMargin(0); + + createSelWg(tr("FACE_1V"), imageS, aSelGrp2V, Face1V); + createSelWg(tr("FACE_2V"), imageS, aSelGrp2V, Face2V); + + QGroupBox* aSpinGrp2V = new QGroupBox(1, Qt::Vertical, myGrp2); + aSpinGrp2V->setFrameStyle(QFrame::NoFrame); + aSpinGrp2V->setInsideMargin(0); + + new QLabel(tr("GEOM_NB_TIMES_V"), aSpinGrp2V); + mySpinBox[SpinBox2V] = new DlgRef_SpinBox(aSpinGrp2V); + + (new QLabel(myGrp2))->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + // Add groups to layout + Layout1->addWidget( myGrp1, 2, 0 ); + Layout1->addWidget( myGrp2, 2, 0 ); + /***************************************************************/ + + Init(); +} + +//================================================================================= +// function : ~BlocksGUI_TrsfDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BlocksGUI_TrsfDlg::~BlocksGUI_TrsfDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::Init() +{ + // Set range of spinboxes + double SpecificStep = 1.0; + QMap::iterator anIter; + for (anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter) { + anIter.data()->RangeStepAndValidator(1.0, 999.999, SpecificStep, 3); + } + + // 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))); + + QMap::iterator anIterBtn; + for (anIterBtn = mySelBtn.begin(); anIterBtn != mySelBtn.end(); ++anIterBtn) + connect(anIterBtn.data(), SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + QMap::iterator anIterSpin; + for (anIterSpin = mySpinBox.begin(); anIterSpin != mySpinBox.end(); ++anIterSpin) + connect(anIterSpin.data(), SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + // init controls and fields + initName(tr("GEOM_BLOCK_MULTITRSF")); + + myConstructorId = -1; + ConstructorsClicked(0); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BlocksGUI_TrsfDlg::ConstructorsClicked (int constructorId) +{ + if (myConstructorId == constructorId) + return; + + myConstructorId = constructorId; + + switch (constructorId) { + case 0: + myGrp2->hide(); + myGrp1->show(); + mySpinBox[SpinBox1]->SetValue(2.0); + myEditCurrentArgument = mySelName[MainObj1]; + myFaces[Face1] = -1; + myFaces[Face2] = -1; + break; + case 1: + myGrp1->hide(); + myGrp2->show(); + mySpinBox[SpinBox2U]->SetValue(2.0); + mySpinBox[SpinBox2V]->SetValue(2.0); + myEditCurrentArgument = mySelName[MainObj2]; + myFaces[Face1U] = -1; + myFaces[Face2U] = -1; + myFaces[Face1V] = -1; + myFaces[Face2V] = -1; + break; + default: + break; + } + + // clear line edits + QMap::iterator anIterLE; + for (anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE) + anIterLE.data()->setText(""); + + // init fields + myShape = GEOM::GEOM_Object::_nil(); + + activateSelection(); +// enableWidgets(); +// displayPreview(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BlocksGUI_TrsfDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void BlocksGUI_TrsfDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + // Get index of current selection focus + int aCurrFocus = -1; + QMap::iterator anIter; + for (anIter = mySelName.begin(); anIter != mySelName.end(); ++anIter) { + if (myEditCurrentArgument == anIter.data()) { + aCurrFocus = anIter.key(); + break; + } + } + + // If selection of main object is activated + if (aCurrFocus == MainObj1 || aCurrFocus == MainObj2) { + if (IObjectCount() == 1) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject(firstIObject(), aResult); + + if (aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) { + myShape = anObj; + mySelName[aCurrFocus]->setText(GEOMBase::GetName(anObj)); + enableWidgets(); + return; + } + } + + myShape = GEOM::GEOM_Object::_nil(); + enableWidgets(); + } + // If face selection is activated + else if (aCurrFocus == Face1 || aCurrFocus == Face2 || + aCurrFocus == Face1U || aCurrFocus == Face2U || + aCurrFocus == Face1V || aCurrFocus == Face2V) { + if (IObjectCount() == 1) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject(firstIObject(), aResult); + + if ( aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) { + TColStd_IndexedMapOfInteger anIndexes; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), anIndexes ); + + if (anIndexes.Extent() == 1) { + int anIndex = anIndexes(1); + QString aFaceName = QString(GEOMBase::GetName(anObj)) + ":%1"; + myEditCurrentArgument->setText(aFaceName.arg(anIndex)); + myFaces[aCurrFocus] = anIndex; + displayPreview(); + return; + } + } + } + + myFaces[aCurrFocus] = -1; + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::SetEditCurrentArgument() +{ + QPushButton* aSender = (QPushButton*)sender(); + + QMap::iterator anIter; + for (anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter) { + if (anIter.data() == aSender) { + mySelName[anIter.key()]->setFocus(); + myEditCurrentArgument = mySelName[anIter.key()]; + break; + } + } + + activateSelection(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + activateSelection(); + displayPreview(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::enterEvent (QEvent* e) +{ + if (!GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +//void BlocksGUI_TrsfDlg::DeactivateActiveDialog() +//{ +// // disconnect selection +// GEOMBase_Skeleton::DeactivateActiveDialog(); +//} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::ValueChangedInSpinBox (double newValue) +{ + displayPreview(); +} + +//================================================================================= +// function : createSelWg() +// purpose : +//================================================================================= +void BlocksGUI_TrsfDlg::createSelWg (const QString& theLbl, + QPixmap& thePix, + QWidget* theParent, + const int theId) +{ + new QLabel(theLbl, theParent); + mySelBtn[theId] = new QPushButton(theParent); + mySelBtn[theId]->setPixmap(thePix); + mySelName[theId] = new QLineEdit(theParent); + mySelName[theId]->setReadOnly(true); +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void BlocksGUI_TrsfDlg::activateSelection() +{ + if (!myShape->_is_nil() && + (myEditCurrentArgument == mySelName[ Face1 ] || + myEditCurrentArgument == mySelName[ Face2 ] || + myEditCurrentArgument == mySelName[ Face1U ] || + myEditCurrentArgument == mySelName[ Face2U ] || + myEditCurrentArgument == mySelName[ Face1V ] || + myEditCurrentArgument == mySelName[ Face2V ])) { + + // Local selection is available only in the OCC Viewer + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + == OCCViewer_Viewer::Type()) { + localSelection(myShape, TopAbs_FACE); + } else { + return; + } + } else { + globalSelection( GEOM_ALLSHAPES ); + } + + SelectionIntoArgument(); +} + +//================================================================================= +// function : enableWidgets +// purpose : Enable widgets of faces in accordance with value of main object +//================================================================================= +void BlocksGUI_TrsfDlg::enableWidgets() +{ + int anId = getConstructorId(); + + bool toEnable = !myShape->_is_nil(); + + if (anId == 0) { + mySelName[Face1]->setEnabled(toEnable); + mySelName[Face2]->setEnabled(toEnable); + mySelBtn[Face1]->setEnabled(toEnable); + mySelBtn[Face2]->setEnabled(toEnable); + + if (!toEnable) { + mySelName[Face1]->setText(""); + mySelName[Face2]->setText(""); + myFaces[Face1] = -1; + myFaces[Face2] = -1; + } + } else if (anId == 1) { + mySelName[Face1U]->setEnabled(toEnable); + mySelName[Face2U]->setEnabled(toEnable); + mySelName[Face1V]->setEnabled(toEnable); + mySelName[Face2V]->setEnabled(toEnable); + mySelBtn[Face1U]->setEnabled(toEnable); + mySelBtn[Face2U]->setEnabled(toEnable); + mySelBtn[Face1V]->setEnabled(toEnable); + mySelBtn[Face2V]->setEnabled(toEnable); + + if (!toEnable) { + mySelName[Face1U]->setText(""); + mySelName[Face2U]->setText(""); + mySelName[Face1V]->setText(""); + mySelName[Face2V]->setText(""); + myFaces[Face1U] = -1; + myFaces[Face2U] = -1; + myFaces[Face1V] = -1; + myFaces[Face2V] = -1; + } + } +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BlocksGUI_TrsfDlg::createOperation() +{ + return getGeomEngine()->GetIBlocksOperations(getStudyId()); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : Verify validity of input data +//================================================================================= +bool BlocksGUI_TrsfDlg::isValid (QString&) +{ + switch (getConstructorId()) { + case 0: + return !myShape->_is_nil() && myFaces[Face1] > 0; + case 1: + return !myShape->_is_nil() && myFaces[Face1U] > 0 && myFaces[Face1V] > 0; + default: + return false; + } + return false; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BlocksGUI_TrsfDlg::execute (ObjectList& objects) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->MakeMultiTransformation1D + (myShape, + myFaces[Face1], + myFaces[Face2], + (int)mySpinBox[SpinBox1]->GetValue()); + res = true; + break; + case 1: + anObj = GEOM::GEOM_IBlocksOperations::_narrow(getOperation())->MakeMultiTransformation2D + (myShape, + myFaces[Face1U], + myFaces[Face2U], + (int)mySpinBox[SpinBox2U]->GetValue(), + myFaces[Face1V], + myFaces[Face2V], + (int)mySpinBox[SpinBox2V]->GetValue()); + res = true; + break; + } + + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); + + return res; +} diff --git a/src/BooleanGUI/BooleanGUI_Dialog.cxx b/src/BooleanGUI/BooleanGUI_Dialog.cxx new file mode 100644 index 000000000..c1e4e6d5d --- /dev/null +++ b/src/BooleanGUI/BooleanGUI_Dialog.cxx @@ -0,0 +1,289 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BooleanGUI_Dialog.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BooleanGUI_Dialog.h" +#include "BooleanGUI.h" +#include "DlgRef_2Sel_QTD.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +using namespace std; + +//================================================================================= +// class : BooleanGUI_Dialog() +// purpose : Constructs a BooleanGUI_Dialog which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BooleanGUI_Dialog::BooleanGUI_Dialog( const int theOperation, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, fl), + myOperation( theOperation ) +{ + QPixmap image0; + QString aTitle, aCaption; + switch ( myOperation ) + { + case BooleanGUI::COMMON: + image0 = QPixmap( SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_COMMON"))); + aTitle = tr("GEOM_COMMON"); + aCaption = tr("GEOM_COMMON_TITLE"); + break; + case BooleanGUI::CUT: + image0 = QPixmap( SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CUT"))); + aTitle = tr("GEOM_CUT"); + aCaption = tr("GEOM_CUT_TITLE"); + break; + case BooleanGUI::FUSE: + image0 = QPixmap( SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_FUSE"))); + aTitle = tr("GEOM_FUSE"); + aCaption = tr("GEOM_FUSE_TITLE"); + break; + case BooleanGUI::SECTION: + image0 = QPixmap( SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SECTION"))); + aTitle = tr("GEOM_SECTION"); + aCaption = tr("GEOM_SECTION_TITLE"); + break; + } + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption( aCaption ); + + /***************************************************************/ + GroupConstructors->setTitle( aTitle ); + RadioButton1->setPixmap( image0 ); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + myGroup = new DlgRef_2Sel_QTD(this, "GroupCommon"); + myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + if ( myOperation != BooleanGUI::CUT ) + { + myGroup->TextLabel1->setText(tr("GEOM_OBJECT_I").arg("1")); + myGroup->TextLabel2->setText(tr("GEOM_OBJECT_I").arg("2")); + } + else + { + myGroup->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + myGroup->TextLabel2->setText(tr("GEOM_TOOL_OBJECT")); + } + + myGroup->PushButton1->setPixmap(image1); + myGroup->PushButton2->setPixmap(image1); + myGroup->LineEdit1->setReadOnly( true ); + myGroup->LineEdit2->setReadOnly( true ); + + Layout1->addWidget(myGroup, 2, 0); + /***************************************************************/ + + /* Initialisation */ + Init(); +} + + +//================================================================================= +// function : ~BooleanGUI_Dialog() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BooleanGUI_Dialog::~BooleanGUI_Dialog() +{ +} + + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BooleanGUI_Dialog::Init() +{ + /* init variables */ + myEditCurrentArgument = myGroup->LineEdit1; + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(myGroup->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(myGroup->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( GroupConstructors->title() ); + + globalSelection( GEOM_ALLSHAPES ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BooleanGUI_Dialog::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BooleanGUI_Dialog::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void BooleanGUI_Dialog::SelectionIntoArgument() +{ + myEditCurrentArgument->setText( "" ); + + if ( IObjectCount() != 1 ) + { + if ( myEditCurrentArgument == myGroup->LineEdit1 ) myObject1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == myGroup->LineEdit2 ) myObject2 = GEOM::GEOM_Object::_nil(); + return; + } + + // nbSel == 1 + Standard_Boolean aRes = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes && GEOMBase::IsShape( aSelectedObject ) ) + { + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + if ( myEditCurrentArgument == myGroup->LineEdit1 ) myObject1 = aSelectedObject; + else if ( myEditCurrentArgument == myGroup->LineEdit2 ) myObject2 = aSelectedObject; + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BooleanGUI_Dialog::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == myGroup->PushButton1 ) myEditCurrentArgument = myGroup->LineEdit1; + else if ( send == myGroup->PushButton2 ) myEditCurrentArgument = myGroup->LineEdit2; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BooleanGUI_Dialog::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == myGroup->LineEdit1 || send == myGroup->LineEdit2 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BooleanGUI_Dialog::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; +} + + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void BooleanGUI_Dialog::enterEvent(QEvent * e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BooleanGUI_Dialog::createOperation() +{ + return getGeomEngine()->GetIBooleanOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BooleanGUI_Dialog::isValid( QString& msg ) +{ + return !CORBA::is_nil( myObject1 ) && !CORBA::is_nil( myObject2 ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BooleanGUI_Dialog::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IBooleanOperations::_narrow( getOperation() )->MakeBoolean( myObject1, myObject2, myOperation ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} diff --git a/src/BuildGUI/BuildGUI_CompoundDlg.cxx b/src/BuildGUI/BuildGUI_CompoundDlg.cxx new file mode 100644 index 000000000..d993cbbe0 --- /dev/null +++ b/src/BuildGUI/BuildGUI_CompoundDlg.cxx @@ -0,0 +1,227 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_CompoundDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BuildGUI_CompoundDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +//================================================================================= +// class : BuildGUI_CompoundDlg() +// purpose : Constructs a BuildGUI_CompoundDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_CompoundDlg::BuildGUI_CompoundDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BUILD_COMPOUND"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_COMPOUND_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_COMPOUND")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupShapes = new DlgRef_1Sel_QTD(this, "GroupShapes"); + GroupShapes->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupShapes->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupShapes->PushButton1->setPixmap(image1); + GroupShapes->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupShapes, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_CompoundDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_CompoundDlg::~BuildGUI_CompoundDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_CompoundDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupShapes->LineEdit1; + GroupShapes->LineEdit1->setReadOnly( true ); + + myOkShapes = false; + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupShapes->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + globalSelection( GEOM_ALLSHAPES ); + + initName( tr( "GEOM_COMPOUND" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_CompoundDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_CompoundDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_CompoundDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText( "" ); + QString aString = ""; /* name of selection */ + + myOkShapes = false; + int nbSel = GEOMBase::GetNameOfSelectedIObjects( selectedIO(), aString, true ); + if ( nbSel == 0 ) + return; + if ( nbSel != 1 ) + aString = QString( "%1_objects").arg( nbSel ); + + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myShapes, true ); + myEditCurrentArgument->setText( aString ); + myOkShapes = true; +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_CompoundDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if (send != GroupShapes->PushButton1) + return; + + myEditCurrentArgument = GroupShapes->LineEdit1; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_CompoundDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_CompoundDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_CompoundDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_CompoundDlg::isValid( QString& ) +{ + return myOkShapes; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_CompoundDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IShapesOperations::_narrow( getOperation() )->MakeCompound( myShapes ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} diff --git a/src/BuildGUI/BuildGUI_EdgeDlg.cxx b/src/BuildGUI/BuildGUI_EdgeDlg.cxx new file mode 100644 index 000000000..e43e9e6f9 --- /dev/null +++ b/src/BuildGUI/BuildGUI_EdgeDlg.cxx @@ -0,0 +1,283 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_EdgeDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BuildGUI_EdgeDlg.h" + +#include +#include + +#include "utilities.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +//================================================================================= +// class : BuildGUI_EdgeDlg() +// purpose : Constructs a BuildGUI_EdgeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_EdgeDlg::BuildGUI_EdgeDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BUILD_EDGE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_EDGE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_EDGE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_POINTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_POINT_I").arg("1")); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_I").arg("2")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_EdgeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_EdgeDlg::~BuildGUI_EdgeDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myOkPoint1 = myOkPoint2 = false; + + globalSelection( GEOM_POINT ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_EDGE") ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_EdgeDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_EdgeDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myOkPoint1 = false; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myOkPoint2 = false; + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if(!testResult) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + myPoint1 = aSelectedObject; + myOkPoint1 = true; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) { + myPoint2 = aSelectedObject; + myOkPoint2 = true; + } + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::SetEditCurrentArgument() +{ + + QPushButton* send = (QPushButton*)sender(); + globalSelection(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_POINT ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + globalSelection( GEOM_POINT ); + displayPreview(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_EdgeDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_EdgeDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_EdgeDlg::isValid( QString& ) +{ + return myOkPoint1 && myOkPoint2; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_EdgeDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IShapesOperations::_narrow( getOperation() )->MakeEdge( myPoint1, myPoint2 ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} diff --git a/src/BuildGUI/BuildGUI_FaceDlg.cxx b/src/BuildGUI/BuildGUI_FaceDlg.cxx new file mode 100644 index 000000000..f9a5891f2 --- /dev/null +++ b/src/BuildGUI/BuildGUI_FaceDlg.cxx @@ -0,0 +1,243 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_FaceDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BuildGUI_FaceDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +//Qt includes +#include +#include + +using namespace std; + +//================================================================================= +// class : BuildGUI_FaceDlg() +// purpose : Constructs a BuildGUI_FaceDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_FaceDlg::BuildGUI_FaceDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BUILD_FACE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_FACE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_FACE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupWire = new DlgRef_1Sel1Check_QTD(this, "GroupWire"); + GroupWire->GroupBox1->setTitle(tr("GEOM_FACE_FFW")); + GroupWire->TextLabel1->setText(tr("GEOM_WIRES")); + GroupWire->CheckButton1->setText(tr("GEOM_FACE_OPT")); + GroupWire->PushButton1->setPixmap(image1); + + Layout1->addWidget(GroupWire, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_FaceDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_FaceDlg::~BuildGUI_FaceDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_FaceDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupWire->LineEdit1; + GroupWire->LineEdit1->setReadOnly( true ); + + GroupWire->CheckButton1->setChecked(TRUE); + + globalSelection( GEOM_WIRE ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupWire->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupWire->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_FACE")); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_FaceDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_FaceDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_FaceDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + + if(aNbSel < 1) + { + myWires.length(0); + return; + } + + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myWires); + if (!myWires.length()) + return; + if(aNbSel != 1) + aName = tr("%1_wires").arg(aNbSel); + + myEditCurrentArgument->setText( aName ); + + myEditCurrentArgument->setText( aName ); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_FaceDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if (send != GroupWire->PushButton1) + return; + + globalSelection( GEOM_WIRE ); + myEditCurrentArgument = GroupWire->LineEdit1; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_FaceDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + globalSelection( GEOM_WIRE ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_FaceDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_FaceDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_FaceDlg::isValid( QString& ) +{ + return (myWires.length() != 0); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_FaceDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + bool isPlanarWanted = GroupWire->CheckButton1->isChecked(); + anObj = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeFaceWires( myWires, isPlanarWanted ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + diff --git a/src/BuildGUI/BuildGUI_ShellDlg.cxx b/src/BuildGUI/BuildGUI_ShellDlg.cxx new file mode 100644 index 000000000..54fd59132 --- /dev/null +++ b/src/BuildGUI/BuildGUI_ShellDlg.cxx @@ -0,0 +1,246 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_ShellDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header: + +#include "BuildGUI_ShellDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include "TColStd_MapOfInteger.hxx" + +#include + +//================================================================================= +// class : BuildGUI_ShellDlg() +// purpose : Constructs a BuildGUI_ShellDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_ShellDlg::BuildGUI_ShellDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BUILD_SHELL"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SHELL_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SHELL")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupShell = new DlgRef_1Sel_QTD(this, "GroupShell"); + GroupShell->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupShell->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupShell->PushButton1->setPixmap(image1); + GroupShell->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupShell, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_ShellDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_ShellDlg::~BuildGUI_ShellDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_ShellDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupShell->LineEdit1; + GroupShell->LineEdit1->setReadOnly( true ); + + myOkFacesAndShells = false; + + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_SHELL); + aMap.Add(GEOM_FACE); + globalSelection( aMap ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupShell->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_SHELL")); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_ShellDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_ShellDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_ShellDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText( "" ); + QString aString; + + myOkFacesAndShells = false; + int nbSel = GEOMBase::GetNameOfSelectedIObjects( selectedIO(), aString, true ); + if ( nbSel == 0 ) + return; + if ( nbSel != 1 ) + aString = QString( "%1_objects ").arg( nbSel ); + + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myFacesAndShells, true ); + if ( !myFacesAndShells.length() ) + return; + + myEditCurrentArgument->setText( aString ); + myOkFacesAndShells = true; +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_ShellDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if (send != GroupShell->PushButton1) + return; + + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_SHELL); + aMap.Add(GEOM_FACE); + globalSelection( aMap ); + myEditCurrentArgument = GroupShell->LineEdit1; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_ShellDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_SHELL); + aMap.Add(GEOM_FACE); + globalSelection( aMap ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_ShellDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_ShellDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_ShellDlg::isValid( QString& ) +{ + return myOkFacesAndShells; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_ShellDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeShell( myFacesAndShells ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + diff --git a/src/BuildGUI/BuildGUI_SolidDlg.cxx b/src/BuildGUI/BuildGUI_SolidDlg.cxx new file mode 100644 index 000000000..9dbdec0db --- /dev/null +++ b/src/BuildGUI/BuildGUI_SolidDlg.cxx @@ -0,0 +1,262 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_SolidDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header: + +#include "BuildGUI_SolidDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +//Qt includes +#include +#include + +//================================================================================= +// class : BuildGUI_SolidDlg() +// purpose : Constructs a BuildGUI_SolidDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_SolidDlg::BuildGUI_SolidDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BUILD_SOLID"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SOLID_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SOLID")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupSolid = new DlgRef_1Sel1Check_QTD(this, "GroupSolid"); + GroupSolid->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupSolid->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupSolid->CheckButton1->setText(tr("GEOM_CREATE_SINGLE_SOLID")); + GroupSolid->PushButton1->setPixmap(image1); + GroupSolid->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupSolid, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_SolidDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_SolidDlg::~BuildGUI_SolidDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupSolid->LineEdit1; + GroupSolid->LineEdit1->setReadOnly( true ); + GroupSolid->CheckButton1->setChecked( true ); + + myOkShells = false; + + globalSelection( GEOM_SHELL ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupSolid->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupSolid->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(EnableNameField(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_SOLID")); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_SolidDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_SolidDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aString = ""; + + myOkShells = false; + int nbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aString); + if (nbSel == 0) + return; + if(nbSel != 1) + aString = tr("%1_objects").arg(nbSel); + + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myShells); + if (!myShells.length()) + return; + + myEditCurrentArgument->setText(aString); + myOkShells = true; +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if(send != GroupSolid->PushButton1) + return; + + globalSelection( GEOM_SHELL ); + myEditCurrentArgument = GroupSolid->LineEdit1; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + globalSelection( GEOM_SHELL ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : EnableNameField() +// purpose : +//================================================================================= +void BuildGUI_SolidDlg::EnableNameField(bool toEnable) +{ + this->GroupBoxName->setEnabled(toEnable); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_SolidDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_SolidDlg::isValid( QString& ) +{ + return myOkShells; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_SolidDlg::execute( ObjectList& objects ) +{ + bool toCreateSingleSolid = GroupSolid->CheckButton1->isChecked(); + + if ( toCreateSingleSolid ) + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeSolidShells( myShells ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + { + for ( int i = 0, n = myShells.length(); i< n; i++ ) + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeSolidShell( myShells[ i ] ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + } + + return true; +} + diff --git a/src/BuildGUI/BuildGUI_WireDlg.cxx b/src/BuildGUI/BuildGUI_WireDlg.cxx new file mode 100644 index 000000000..9775a5cb1 --- /dev/null +++ b/src/BuildGUI/BuildGUI_WireDlg.cxx @@ -0,0 +1,245 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BuildGUI_WireDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "BuildGUI_WireDlg.h" +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include "TColStd_MapOfInteger.hxx" + +#include + +//================================================================================= +// class : BuildGUI_WireDlg() +// purpose : Constructs a BuildGUI_WireDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +BuildGUI_WireDlg::BuildGUI_WireDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_BUILD_WIRE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_WIRE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_WIRE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_WIRE_CONNECT")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~BuildGUI_WireDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +BuildGUI_WireDlg::~BuildGUI_WireDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void BuildGUI_WireDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + + myOkEdgesAndWires = false; + + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_WIRE); + aMap.Add(GEOM_EDGE); + globalSelection( aMap ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_WIRE")); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void BuildGUI_WireDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool BuildGUI_WireDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void BuildGUI_WireDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aString = ""; /* name of selection */ + + myOkEdgesAndWires = false; + int nbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aString); + + if(nbSel == 0) + return; + if(nbSel != 1) + aString = tr("%1_objects").arg(nbSel); + + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myEdgesAndWires); + if (!myEdgesAndWires.length()) + return; + + myEditCurrentArgument->setText(aString); + myOkEdgesAndWires = true; +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void BuildGUI_WireDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + if (send != GroupPoints->PushButton1) + return; + + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_WIRE); + aMap.Add(GEOM_EDGE); + globalSelection( aMap ); + myEditCurrentArgument = GroupPoints->LineEdit1; + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void BuildGUI_WireDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + TColStd_MapOfInteger aMap; + aMap.Add(GEOM_WIRE); + aMap.Add(GEOM_EDGE); + globalSelection( aMap ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void BuildGUI_WireDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr BuildGUI_WireDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool BuildGUI_WireDlg::isValid( QString& ) +{ + return myOkEdgesAndWires; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool BuildGUI_WireDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeWire( myEdgesAndWires ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + diff --git a/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx b/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx new file mode 100644 index 000000000..be2fc4683 --- /dev/null +++ b/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.cxx @@ -0,0 +1,92 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1List1Spin1Btn_QTD.ui' +** +** Created: Wed Mar 17 11:29:24 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1List1Spin1Btn_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1List1Spin1Btn_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1List1Spin1Btn_QTD::DlgRef_1List1Spin1Btn_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1List1Spin1Btn_QTD" ); + resize( 204, 148 ); + setCaption( trUtf8( "DlgRef_3Sel4Spin2Check_QTD" ) ); + DlgRef_1List1Spin1Btn_QTDLayout = new QGridLayout( this, 1, 1, 11, 6, "DlgRef_1List1Spin1Btn_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + QSpacerItem* spacer = new QSpacerItem( 0, 23, QSizePolicy::Minimum, QSizePolicy::Expanding ); + GroupBox1Layout->addItem( spacer, 3, 1 ); + + ListView1 = new QListView( GroupBox1, "ListView1" ); + + GroupBox1Layout->addMultiCellWidget( ListView1, 0, 3, 0, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + GroupBox1Layout->addWidget( TextLabel1, 0, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + + GroupBox1Layout->addWidget( SpinBox1, 1, 1 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setText( trUtf8( "" ) ); + + GroupBox1Layout->addWidget( PushButton1, 2, 1 ); + + DlgRef_1List1Spin1Btn_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1List1Spin1Btn_QTD::~DlgRef_1List1Spin1Btn_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h b/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h new file mode 100644 index 000000000..4ef73377f --- /dev/null +++ b/src/DlgRef/DlgRef_1List1Spin1Btn_QTD.h @@ -0,0 +1,69 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1List1Spin1Btn_QTD.ui' +** +** Created: Wed Mar 17 11:29:24 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1LIST1SPIN1BTN_QTD_H +#define DLGREF_1LIST1SPIN1BTN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QListView; +class QListViewItem; +class QPushButton; +class QSpinBox; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_1List1Spin1Btn_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1List1Spin1Btn_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1List1Spin1Btn_QTD(); + + QGroupBox* GroupBox1; + QListView* ListView1; + QLabel* TextLabel1; + QSpinBox* SpinBox1; + QPushButton* PushButton1; + + +protected: + QGridLayout* DlgRef_1List1Spin1Btn_QTDLayout; + QGridLayout* GroupBox1Layout; +}; + +#endif // DLGREF_1LIST1SPIN1BTN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx b/src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx new file mode 100644 index 000000000..a23049fb2 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Check1List_QTD.cxx @@ -0,0 +1,110 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel1Check1List_QTD.ui' +** +** Created: lun oct 27 16:18:55 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel1Check1List_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel1Check1List_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel1Check1List_QTD::DlgRef_1Sel1Check1List_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel1Check1List_QTD" ); + resize( 129, 104 ); + setCaption( trUtf8( "DlgRef_1Sel1Check1List_QTD" ) ); + DlgRef_1Sel1Check1List_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel1Check1List_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + QSpacerItem* spacer = new QSpacerItem( 0, 166, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + CheckButton1 = new QRadioButton( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckButton1, 2, 2, 0, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addMultiCellWidget( TextLabel2, 1, 1, 0, 1 ); + + ComboBox1 = new QComboBox( FALSE, GroupBox1, "ComboBox1" ); + ComboBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, ComboBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( ComboBox1, 1, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel1Check1List_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel1Check1List_QTD::~DlgRef_1Sel1Check1List_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel1Check1List_QTD.h b/src/DlgRef/DlgRef_1Sel1Check1List_QTD.h new file mode 100644 index 000000000..9daae866b --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Check1List_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel1Check1List_QTD.ui' +** +** Created: lun oct 27 16:18:55 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL1CHECK1LIST_QTD_H +#define DLGREF_1SEL1CHECK1LIST_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QComboBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QRadioButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_1Sel1Check1List_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check1List_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel1Check1List_QTD(); + + QGroupBox* GroupBox1; + QRadioButton* CheckButton1; + QLabel* TextLabel2; + QComboBox* ComboBox1; + QLineEdit* LineEdit1; + QLabel* TextLabel1; + QPushButton* PushButton1; + + +protected: + QGridLayout* DlgRef_1Sel1Check1List_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_1SEL1CHECK1LIST_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel1Check_QTD.cxx b/src/DlgRef/DlgRef_1Sel1Check_QTD.cxx new file mode 100644 index 000000000..eb0f2cdb3 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Check_QTD.cxx @@ -0,0 +1,102 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel1Check_QTD.ui' +** +** Created: Thu May 20 11:55:05 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel1Check_QTD::DlgRef_1Sel1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel1Check_QTD" ); + resize( 382, 219 ); + setCaption( trUtf8( "DlgRef_1Sel1Check_QTD" ) ); + DlgRef_1Sel1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout3->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout3->addWidget( PushButton1, 0, 1 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout3->addMultiCellWidget( CheckButton1, 1, 1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer, 2, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout3->addWidget( LineEdit1, 0, 2 ); + + GroupBox1Layout->addLayout( Layout3, 0, 0 ); + + DlgRef_1Sel1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, CheckButton1 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel1Check_QTD::~DlgRef_1Sel1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel1Check_QTD.h b/src/DlgRef/DlgRef_1Sel1Check_QTD.h new file mode 100644 index 000000000..70189f021 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Check_QTD.h @@ -0,0 +1,69 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel1Check_QTD.ui' +** +** Created: Thu May 20 11:55:05 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL1CHECK_QTD_H +#define DLGREF_1SEL1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_1Sel1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel1Check_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QPushButton* PushButton1; + QCheckBox* CheckButton1; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* DlgRef_1Sel1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout3; +}; + +#endif // DLGREF_1SEL1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx b/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx new file mode 100644 index 000000000..a92fc99e5 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.cxx @@ -0,0 +1,114 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel1Spin1Check_QTD.ui' +** +** Created: Mon May 24 15:59:03 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel1Spin1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel1Spin1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel1Spin1Check_QTD::DlgRef_1Sel1Spin1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel1Spin1Check_QTD" ); + resize( 163, 109 ); + setCaption( trUtf8( "DlgRef_1Sel1Spin1Check_QTD" ) ); + DlgRef_1Sel1Spin1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel1Spin1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout8 = new QGridLayout( 0, 1, 1, 0, 6, "Layout8"); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + Layout8->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout8->addWidget( TextLabel1, 0, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout8->addWidget( LineEdit1, 0, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout8->addWidget( PushButton1, 0, 1 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout8->addMultiCellWidget( CheckButton1, 2, 2, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout8->addItem( spacer, 3, 2 ); + + GroupBox1Layout->addLayout( Layout8, 0, 0 ); + + DlgRef_1Sel1Spin1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel1Spin1Check_QTD::~DlgRef_1Sel1Spin1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h b/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h new file mode 100644 index 000000000..1f943faa7 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Spin1Check_QTD.h @@ -0,0 +1,67 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel1Spin1Check_QTD.ui' +** +** Created: Mon May 24 15:59:03 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL1SPIN1CHECK_QTD_H +#define DLGREF_1SEL1SPIN1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_1Sel1Spin1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel1Spin1Check_QTD(); + + QGroupBox* GroupBox1; + QSpinBox* SpinBox1; + QLabel* TextLabel2; + QLabel* TextLabel1; + QLineEdit* LineEdit1; + QPushButton* PushButton1; + QCheckBox* CheckButton1; + + +protected: + QGridLayout* DlgRef_1Sel1Spin1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout8; + QGridLayout* Layout2; +}; + +#endif // DLGREF_1SEL1SPIN1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx b/src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx new file mode 100644 index 000000000..7eae9fbec --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Spin_QTD.cxx @@ -0,0 +1,108 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel1Spin_QTD.ui' +** +** Created: mar sep 23 16:05:08 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel1Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel1Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel1Spin_QTD::DlgRef_1Sel1Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel1Spin_QTD" ); + resize( 129, 87 ); + setCaption( trUtf8( "DlgRef_1Sel1Spin_QTD" ) ); + DlgRef_1Sel1Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel1Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel1Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel1Spin_QTD::~DlgRef_1Sel1Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel1Spin_QTD.h b/src/DlgRef/DlgRef_1Sel1Spin_QTD.h new file mode 100644 index 000000000..1aa7d9d5d --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel1Spin_QTD.h @@ -0,0 +1,69 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel1Spin_QTD.ui' +** +** Created: mar sep 23 16:05:08 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL1SPIN_QTD_H +#define DLGREF_1SEL1SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_1Sel1Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel1Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel1Spin_QTD(); + + QGroupBox* GroupBox1; + QPushButton* PushButton1; + QLabel* TextLabel1; + QLineEdit* LineEdit1; + QLabel* TextLabel2; + QSpinBox* SpinBox1; + + +protected: + QGridLayout* DlgRef_1Sel1Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_1SEL1SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx b/src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx new file mode 100644 index 000000000..38d5551f5 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel2Spin_QTD.cxx @@ -0,0 +1,119 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel2Spin_QTD.ui' +** +** Created: jeu oct 2 11:08:05 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel2Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel2Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel2Spin_QTD::DlgRef_1Sel2Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel2Spin_QTD" ); + resize( 129, 115 ); + setCaption( trUtf8( "DlgRef_1Sel2Spin_QTD" ) ); + DlgRef_1Sel2Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel2Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 1, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 30, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel2Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel2Spin_QTD::~DlgRef_1Sel2Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel2Spin_QTD.h b/src/DlgRef/DlgRef_1Sel2Spin_QTD.h new file mode 100644 index 000000000..9a5cbe961 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel2Spin_QTD.h @@ -0,0 +1,67 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel2Spin_QTD.ui' +** +** Created: jeu oct 2 11:08:05 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL2SPIN_QTD_H +#define DLGREF_1SEL2SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_1Sel2Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel2Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel2Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel3; + QSpinBox* SpinBox1; + QLabel* TextLabel2; + QSpinBox* SpinBox2; + QLineEdit* LineEdit1; + QPushButton* PushButton1; + QLabel* TextLabel1; + + +protected: + QGridLayout* DlgRef_1Sel2Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_1SEL2SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel3Check_QTD.cxx b/src/DlgRef/DlgRef_1Sel3Check_QTD.cxx new file mode 100644 index 000000000..854abd297 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel3Check_QTD.cxx @@ -0,0 +1,114 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel3Check_QTD.ui' +** +** Created: Thu May 20 10:15:08 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel3Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel3Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel3Check_QTD::DlgRef_1Sel3Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel3Check_QTD" ); + resize( 163, 116 ); + setCaption( trUtf8( "DlgRef_1Sel3Check_QTD" ) ); + DlgRef_1Sel3Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel3Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout6 = new QGridLayout( 0, 1, 1, 0, 6, "Layout6"); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout6->addItem( spacer, 4, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout6->addWidget( LineEdit1, 0, 2 ); + + CheckButton2 = new QCheckBox( GroupBox1, "CheckButton2" ); + CheckButton2->setText( trUtf8( "" ) ); + + Layout6->addMultiCellWidget( CheckButton2, 2, 2, 0, 2 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout6->addMultiCellWidget( CheckButton1, 1, 1, 0, 2 ); + + CheckButton3 = new QCheckBox( GroupBox1, "CheckButton3" ); + CheckButton3->setText( trUtf8( "" ) ); + + Layout6->addMultiCellWidget( CheckButton3, 3, 3, 0, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout6->addWidget( PushButton1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout6->addWidget( TextLabel1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout6, 0, 0 ); + + DlgRef_1Sel3Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, CheckButton1 ); + setTabOrder( CheckButton1, CheckButton2 ); + setTabOrder( CheckButton2, CheckButton3 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel3Check_QTD::~DlgRef_1Sel3Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel3Check_QTD.h b/src/DlgRef/DlgRef_1Sel3Check_QTD.h new file mode 100644 index 000000000..3ea5d09d2 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel3Check_QTD.h @@ -0,0 +1,65 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel3Check_QTD.ui' +** +** Created: Thu May 20 10:15:07 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL3CHECK_QTD_H +#define DLGREF_1SEL3CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class DlgRef_1Sel3Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel3Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel3Check_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit1; + QCheckBox* CheckButton2; + QCheckBox* CheckButton1; + QCheckBox* CheckButton3; + QPushButton* PushButton1; + QLabel* TextLabel1; + + +protected: + QGridLayout* DlgRef_1Sel3Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout6; +}; + +#endif // DLGREF_1SEL3CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx b/src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx new file mode 100644 index 000000000..d08f76765 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel3Spin_QTD.cxx @@ -0,0 +1,130 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel3Spin_QTD.ui' +** +** Created: ven oct 24 15:55:11 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel3Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel3Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel3Spin_QTD::DlgRef_1Sel3Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel3Spin_QTD" ); + resize( 129, 143 ); + setCaption( trUtf8( "DlgRef_1Sel3Spin_QTD" ) ); + DlgRef_1Sel3Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel3Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 150, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 1, 0 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox3, 2, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 2, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel3Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel3Spin_QTD::~DlgRef_1Sel3Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel3Spin_QTD.h b/src/DlgRef/DlgRef_1Sel3Spin_QTD.h new file mode 100644 index 000000000..a52e1e696 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel3Spin_QTD.h @@ -0,0 +1,73 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel3Spin_QTD.ui' +** +** Created: ven oct 24 15:55:10 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL3SPIN_QTD_H +#define DLGREF_1SEL3SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_1Sel3Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel3Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel3Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + QSpinBox* SpinBox2; + QLabel* TextLabel3; + QSpinBox* SpinBox3; + QSpinBox* SpinBox1; + QLabel* TextLabel4; + QLabel* TextLabel2; + + +protected: + QGridLayout* DlgRef_1Sel3Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_1SEL3SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx b/src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx new file mode 100644 index 000000000..735bc811e --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel4Spin_QTD.cxx @@ -0,0 +1,151 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel4Spin_QTD.ui' +** +** Created: mar sep 23 16:05:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel4Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel4Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel4Spin_QTD::DlgRef_1Sel4Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel4Spin_QTD" ); + resize( 284, 119 ); + setCaption( trUtf8( "DlgRef_1Sel4Spin_QTD" ) ); + DlgRef_1Sel4Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel4Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout3->addWidget( TextLabel5, 0, 5 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout3->addWidget( TextLabel3, 0, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout3->addWidget( TextLabel4, 0, 3 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox3, 0, 6 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox1, 0, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout3->addWidget( TextLabel2, 0, 0 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox2, 0, 4 ); + + Layout1->addLayout( Layout3, 1, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 0 ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout4->addWidget( TextLabel6, 0, 0 ); + + SpinBox4 = new QSpinBox( GroupBox1, "SpinBox4" ); + + Layout4->addWidget( SpinBox4, 0, 1 ); + + Layout1->addLayout( Layout4, 2, 0 ); + + Layout2 = new QHBoxLayout( 0, 0, 6, "Layout2"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + Layout2->addWidget( TextLabel1 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + Layout2->addWidget( PushButton1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + Layout2->addWidget( LineEdit1 ); + + Layout1->addLayout( Layout2, 0, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel4Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel4Spin_QTD::~DlgRef_1Sel4Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel4Spin_QTD.h b/src/DlgRef/DlgRef_1Sel4Spin_QTD.h new file mode 100644 index 000000000..60f2a44c2 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel4Spin_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel4Spin_QTD.ui' +** +** Created: mar sep 23 16:05:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL4SPIN_QTD_H +#define DLGREF_1SEL4SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_1Sel4Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel4Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel4Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel5; + QLabel* TextLabel3; + QLabel* TextLabel4; + QSpinBox* SpinBox3; + QSpinBox* SpinBox1; + QLabel* TextLabel2; + QSpinBox* SpinBox2; + QLabel* TextLabel6; + QSpinBox* SpinBox4; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* DlgRef_1Sel4Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout3; + QGridLayout* Layout4; + QHBoxLayout* Layout2; +}; + +#endif // DLGREF_1SEL4SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx b/src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx new file mode 100644 index 000000000..a37665f71 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel5Spin_QTD.cxx @@ -0,0 +1,152 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel5Spin_QTD.ui' +** +** Created: mar nov 18 11:19:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel5Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel5Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel5Spin_QTD::DlgRef_1Sel5Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel5Spin_QTD" ); + resize( 162, 143 ); + setCaption( trUtf8( "DlgRef_1Sel5Spin_QTD" ) ); + DlgRef_1Sel5Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel5Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 0, 3 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox3, 2, 1 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 1, 0 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 2 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 2, 0 ); + + SpinBox4 = new QSpinBox( GroupBox1, "SpinBox4" ); + SpinBox4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox4->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox4, 1, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout2->addWidget( TextLabel6, 1, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + SpinBox5 = new QSpinBox( GroupBox1, "SpinBox5" ); + SpinBox5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox5->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox5, 1, 3 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 120, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel5Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel5Spin_QTD::~DlgRef_1Sel5Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel5Spin_QTD.h b/src/DlgRef/DlgRef_1Sel5Spin_QTD.h new file mode 100644 index 000000000..a7a35a866 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel5Spin_QTD.h @@ -0,0 +1,73 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel5Spin_QTD.ui' +** +** Created: mar nov 18 11:19:13 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL5SPIN_QTD_H +#define DLGREF_1SEL5SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_1Sel5Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel5Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel5Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QPushButton* PushButton1; + QSpinBox* SpinBox2; + QSpinBox* SpinBox3; + QLabel* TextLabel5; + QLabel* TextLabel3; + QLabel* TextLabel4; + QSpinBox* SpinBox4; + QSpinBox* SpinBox1; + QLabel* TextLabel6; + QLabel* TextLabel2; + QSpinBox* SpinBox5; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* DlgRef_1Sel5Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_1SEL5SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_1Sel_Ext.h b/src/DlgRef/DlgRef_1Sel_Ext.h new file mode 100644 index 000000000..138227aa6 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel_Ext.h @@ -0,0 +1,53 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel_QTD.ui' +** +** Created: lun sep 22 17:38:05 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DlgRef_1Sel_Ext_H +#define DlgRef_1Sel_Ext_H + +#include "DlgRef_1Sel_QTD.h" + +class QGridLayout; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_1Sel_Ext : public DlgRef_1Sel_QTD +{ + Q_OBJECT + +public: + DlgRef_1Sel_Ext( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ) + : DlgRef_1Sel_QTD( parent, name, fl ) {}; + ~DlgRef_1Sel_Ext() {}; + + QGridLayout* getGroupBoxLayout() { return GroupBox1Layout; } +}; + +#endif // DlgRef_1Sel_Ext_H diff --git a/src/DlgRef/DlgRef_1Sel_QTD.cxx b/src/DlgRef/DlgRef_1Sel_QTD.cxx new file mode 100644 index 000000000..730efcc15 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel_QTD.cxx @@ -0,0 +1,93 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Sel_QTD.ui' +** +** Created: lun sep 22 17:38:06 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Sel_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Sel_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Sel_QTD::DlgRef_1Sel_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Sel_QTD" ); + resize( 129, 57 ); + setCaption( trUtf8( "DlgRef_1Sel_QTD" ) ); + DlgRef_1Sel_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Sel_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 1, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Sel_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Sel_QTD::~DlgRef_1Sel_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Sel_QTD.h b/src/DlgRef/DlgRef_1Sel_QTD.h new file mode 100644 index 000000000..55587c0a5 --- /dev/null +++ b/src/DlgRef/DlgRef_1Sel_QTD.h @@ -0,0 +1,67 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Sel_QTD.ui' +** +** Created: lun sep 22 17:38:05 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SEL_QTD_H +#define DLGREF_1SEL_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_1Sel_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Sel_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Sel_QTD(); + + QGroupBox* GroupBox1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + QLabel* TextLabel1; + + +protected: + QGridLayout* DlgRef_1Sel_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_1SEL_QTD_H diff --git a/src/DlgRef/DlgRef_1Spin_QTD.cxx b/src/DlgRef/DlgRef_1Spin_QTD.cxx new file mode 100644 index 000000000..e01489a12 --- /dev/null +++ b/src/DlgRef/DlgRef_1Spin_QTD.cxx @@ -0,0 +1,87 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_1Spin_QTD.ui' +** +** Created: jeu sep 25 12:22:29 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_1Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_1Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_1Spin_QTD::DlgRef_1Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_1Spin_QTD" ); + resize( 124, 55 ); + setCaption( trUtf8( "DlgRef_1Spin_QTD" ) ); + DlgRef_1Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_1Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_1Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_1Spin_QTD::~DlgRef_1Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_1Spin_QTD.h b/src/DlgRef/DlgRef_1Spin_QTD.h new file mode 100644 index 000000000..f50d92bc9 --- /dev/null +++ b/src/DlgRef/DlgRef_1Spin_QTD.h @@ -0,0 +1,63 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_1Spin_QTD.ui' +** +** Created: jeu sep 25 12:22:29 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_1SPIN_QTD_H +#define DLGREF_1SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QSpinBox; +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_1Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_1Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_1Spin_QTD(); + + QGroupBox* GroupBox1; + QSpinBox* SpinBox1; + QLabel* TextLabel1; + + +protected: + QGridLayout* DlgRef_1Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_1SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.cxx b/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.cxx new file mode 100644 index 000000000..f67e3e07f --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel1Spin2Check_QTD.ui' +** +** Created: Fri Aug 13 15:32:26 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel1Spin2Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel1Spin2Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel1Spin2Check_QTD::DlgRef_2Sel1Spin2Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel1Spin2Check_QTD" ); + resize( 256, 139 ); + setCaption( trUtf8( "DlgRef_2Sel1Spin2Check_QTD" ) ); + DlgRef_2Sel1Spin2Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel1Spin2Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 316, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 4, 2 ); + + CheckButton2 = new QCheckBox( GroupBox1, "CheckButton2" ); + CheckButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( CheckButton2, 2, 3 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addMultiCellWidget( LineEdit2, 1, 1, 2, 3 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addMultiCellWidget( LineEdit1, 0, 0, 2, 3 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckButton1, 3, 3, 0, 3 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 2, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel1Spin2Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, SpinBox1 ); + setTabOrder( SpinBox1, CheckButton2 ); + setTabOrder( CheckButton2, CheckButton1 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel1Spin2Check_QTD::~DlgRef_2Sel1Spin2Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h b/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h new file mode 100644 index 000000000..d57b10531 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel1Spin2Check_QTD.h @@ -0,0 +1,70 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel1Spin2Check_QTD.ui' +** +** Created: Fri Aug 13 15:32:26 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL1SPIN2CHECK_QTD_H +#define DLGREF_2SEL1SPIN2CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_2Sel1Spin2Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin2Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel1Spin2Check_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel2; + QPushButton* PushButton1; + QLabel* TextLabel3; + QLabel* TextLabel1; + QCheckBox* CheckButton2; + QLineEdit* LineEdit2; + QPushButton* PushButton2; + QLineEdit* LineEdit1; + QCheckBox* CheckButton1; + QSpinBox* SpinBox1; + + +protected: + QGridLayout* DlgRef_2Sel1Spin2Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_2SEL1SPIN2CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx b/src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx new file mode 100644 index 000000000..5e03c2747 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel1Spin_QTD.cxx @@ -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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel1Spin_QTD.ui' +** +** Created: Tue Jun 1 16:15:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel1Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel1Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel1Spin_QTD::DlgRef_2Sel1Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel1Spin_QTD" ); + resize( 163, 122 ); + setCaption( trUtf8( "DlgRef_2Sel1Spin_QTD" ) ); + DlgRef_2Sel1Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel1Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setFrameShape( QLabel::NoFrame ); + TextLabel2->setFrameShadow( QLabel::Plain ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 0 ); + + Layout1->addMultiCellLayout( Layout2, 2, 2, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel1Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, SpinBox1 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel1Spin_QTD::~DlgRef_2Sel1Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel1Spin_QTD.h b/src/DlgRef/DlgRef_2Sel1Spin_QTD.h new file mode 100644 index 000000000..df9ec8e3e --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel1Spin_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel1Spin_QTD.ui' +** +** Created: Tue Jun 1 16:14:59 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL1SPIN_QTD_H +#define DLGREF_2SEL1SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_2Sel1Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel1Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel1Spin_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit1; + QPushButton* PushButton2; + QLabel* TextLabel1; + QLineEdit* LineEdit2; + QPushButton* PushButton1; + QLabel* TextLabel2; + QSpinBox* SpinBox1; + QLabel* TextLabel3; + + +protected: + QGridLayout* DlgRef_2Sel1Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_2SEL1SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx b/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx new file mode 100644 index 000000000..3091cdf4b --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.cxx @@ -0,0 +1,149 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel2Spin1Check_QTD.ui' +** +** Created: Tue Jun 1 16:29:28 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel2Spin1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel2Spin1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel2Spin1Check_QTD::DlgRef_2Sel2Spin1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel2Spin1Check_QTD" ); + resize( 163, 170 ); + setCaption( trUtf8( "DlgRef_2Sel2Spin1Check_QTD" ) ); + DlgRef_2Sel2Spin1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel2Spin1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 1, 0 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + Layout1->addMultiCellLayout( Layout2, 2, 2, 0, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 4, 2 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckButton1, 3, 3, 0, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel2Spin1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, SpinBox1 ); + setTabOrder( SpinBox1, SpinBox2 ); + setTabOrder( SpinBox2, CheckButton1 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel2Spin1Check_QTD::~DlgRef_2Sel2Spin1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h b/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h new file mode 100644 index 000000000..2cf259170 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel2Spin1Check_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel2Spin1Check_QTD.ui' +** +** Created: Tue Jun 1 16:29:28 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL2SPIN1CHECK_QTD_H +#define DLGREF_2SEL2SPIN1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_2Sel2Spin1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel2Spin1Check_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel2; + QLabel* TextLabel1; + QSpinBox* SpinBox1; + QLabel* TextLabel3; + QLabel* TextLabel4; + QSpinBox* SpinBox2; + QLineEdit* LineEdit1; + QCheckBox* CheckButton1; + QLineEdit* LineEdit2; + QPushButton* PushButton2; + QPushButton* PushButton1; + + +protected: + QGridLayout* DlgRef_2Sel2Spin1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_2SEL2SPIN1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx b/src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx new file mode 100644 index 000000000..2e18f0411 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel2Spin_QTD.cxx @@ -0,0 +1,135 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel2Spin_QTD.ui' +** +** Created: jeu sep 25 12:10:29 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel2Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel2Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel2Spin_QTD::DlgRef_2Sel2Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel2Spin_QTD" ); + resize( 129, 145 ); + setCaption( trUtf8( "DlgRef_2Sel2Spin_QTD" ) ); + DlgRef_2Sel2Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel2Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 1, 0 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + Layout1->addMultiCellLayout( Layout2, 2, 2, 0, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel2Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel2Spin_QTD::~DlgRef_2Sel2Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel2Spin_QTD.h b/src/DlgRef/DlgRef_2Sel2Spin_QTD.h new file mode 100644 index 000000000..5dbea6b93 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel2Spin_QTD.h @@ -0,0 +1,76 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel2Spin_QTD.ui' +** +** Created: jeu sep 25 12:10:29 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL2SPIN_QTD_H +#define DLGREF_2SEL2SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_2Sel2Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel2Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel2Spin_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit1; + QSpinBox* SpinBox2; + QLabel* TextLabel4; + QLabel* TextLabel3; + QSpinBox* SpinBox1; + QPushButton* PushButton2; + QLabel* TextLabel2; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLineEdit* LineEdit2; + + +protected: + QGridLayout* DlgRef_2Sel2Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_2SEL2SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx b/src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx new file mode 100644 index 000000000..a931f602b --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel3Spin_QTD.cxx @@ -0,0 +1,146 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel3Spin_QTD.ui' +** +** Created: jeu sep 25 16:18:43 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel3Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel3Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel3Spin_QTD::DlgRef_2Sel3Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel3Spin_QTD" ); + resize( 129, 173 ); + setCaption( trUtf8( "DlgRef_2Sel3Spin_QTD" ) ); + DlgRef_2Sel3Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel3Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 0 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 1, 0 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel5, 2, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox3, 2, 1 ); + + Layout1->addMultiCellLayout( Layout2, 2, 2, 0, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel3Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel3Spin_QTD::~DlgRef_2Sel3Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel3Spin_QTD.h b/src/DlgRef/DlgRef_2Sel3Spin_QTD.h new file mode 100644 index 000000000..97f47417a --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel3Spin_QTD.h @@ -0,0 +1,76 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel3Spin_QTD.ui' +** +** Created: jeu sep 25 16:18:43 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL3SPIN_QTD_H +#define DLGREF_2SEL3SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_2Sel3Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel3Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel3Spin_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit1; + QLabel* TextLabel1; + QLabel* TextLabel2; + QLabel* TextLabel3; + QSpinBox* SpinBox2; + QLabel* TextLabel4; + QLabel* TextLabel5; + QSpinBox* SpinBox1; + QSpinBox* SpinBox3; + QPushButton* PushButton1; + QLineEdit* LineEdit2; + QPushButton* PushButton2; + + +protected: + QGridLayout* DlgRef_2Sel3Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_2SEL3SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx b/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx new file mode 100644 index 000000000..8449ee1bd --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.cxx @@ -0,0 +1,177 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel4Spin1Check_QTD.ui' +** +** Created: Tue Jun 1 12:38:04 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel4Spin1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel4Spin1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel4Spin1Check_QTD::DlgRef_2Sel4Spin1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel4Spin1Check_QTD" ); + resize( 262, 230 ); + setCaption( trUtf8( "DlgRef_2Sel4Spin1Check_QTD" ) ); + DlgRef_2Sel4Spin1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel4Spin1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout5 = new QGridLayout( 0, 1, 1, 0, 6, "Layout5"); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout5->addWidget( PushButton1, 0, 1 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout5->addMultiCellWidget( CheckButton1, 3, 3, 0, 3 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 1, 0 ); + + Layout5->addMultiCellLayout( Layout2, 2, 2, 0, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout5->addWidget( LineEdit2, 1, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout5->addWidget( TextLabel1, 0, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout5->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout5->addItem( spacer, 5, 3 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout5->addWidget( PushButton2, 1, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout5->addWidget( TextLabel2, 1, 0 ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + SpinBox4 = new QSpinBox( GroupBox1, "SpinBox4" ); + SpinBox4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox4->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox4, 1, 1 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout3->addWidget( TextLabel5, 0, 0 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox3, 0, 1 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout3->addWidget( TextLabel6, 1, 0 ); + + Layout5->addMultiCellLayout( Layout3, 4, 4, 0, 2 ); + + GroupBox1Layout->addLayout( Layout5, 0, 0 ); + + DlgRef_2Sel4Spin1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, SpinBox1 ); + setTabOrder( SpinBox1, SpinBox2 ); + setTabOrder( SpinBox2, CheckButton1 ); + setTabOrder( CheckButton1, SpinBox3 ); + setTabOrder( SpinBox3, SpinBox4 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel4Spin1Check_QTD::~DlgRef_2Sel4Spin1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h b/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h new file mode 100644 index 000000000..585708b58 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel4Spin1Check_QTD.h @@ -0,0 +1,77 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel4Spin1Check_QTD.ui' +** +** Created: Tue Jun 1 12:38:04 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL4SPIN1CHECK_QTD_H +#define DLGREF_2SEL4SPIN1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_2Sel4Spin1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel4Spin1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel4Spin1Check_QTD(); + + QGroupBox* GroupBox1; + QPushButton* PushButton1; + QCheckBox* CheckButton1; + QLabel* TextLabel3; + QSpinBox* SpinBox1; + QSpinBox* SpinBox2; + QLabel* TextLabel4; + QLineEdit* LineEdit2; + QLabel* TextLabel1; + QLineEdit* LineEdit1; + QPushButton* PushButton2; + QLabel* TextLabel2; + QSpinBox* SpinBox4; + QLabel* TextLabel5; + QSpinBox* SpinBox3; + QLabel* TextLabel6; + + +protected: + QGridLayout* DlgRef_2Sel4Spin1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout5; + QGridLayout* Layout2; + QGridLayout* Layout3; +}; + +#endif // DLGREF_2SEL4SPIN1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_2Sel_QTD.cxx b/src/DlgRef/DlgRef_2Sel_QTD.cxx new file mode 100644 index 000000000..62f352171 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel_QTD.cxx @@ -0,0 +1,109 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Sel_QTD.ui' +** +** Created: mar sep 23 16:05:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Sel_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Sel_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Sel_QTD::DlgRef_2Sel_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Sel_QTD" ); + resize( 129, 87 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "DlgRef_2Sel_QTD" ) ); + DlgRef_2Sel_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Sel_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Sel_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Sel_QTD::~DlgRef_2Sel_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Sel_QTD.h b/src/DlgRef/DlgRef_2Sel_QTD.h new file mode 100644 index 000000000..70ad2b2f9 --- /dev/null +++ b/src/DlgRef/DlgRef_2Sel_QTD.h @@ -0,0 +1,70 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Sel_QTD.ui' +** +** Created: mar sep 23 16:05:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SEL_QTD_H +#define DLGREF_2SEL_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_2Sel_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Sel_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Sel_QTD(); + + QGroupBox* GroupBox1; + QPushButton* PushButton1; + QLineEdit* LineEdit2; + QPushButton* PushButton2; + QLabel* TextLabel1; + QLabel* TextLabel2; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* DlgRef_2Sel_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_2SEL_QTD_H diff --git a/src/DlgRef/DlgRef_2Spin_QTD.cxx b/src/DlgRef/DlgRef_2Spin_QTD.cxx new file mode 100644 index 000000000..31f468010 --- /dev/null +++ b/src/DlgRef/DlgRef_2Spin_QTD.cxx @@ -0,0 +1,98 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_2Spin_QTD.ui' +** +** Created: jeu sep 25 12:10:30 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_2Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_2Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_2Spin_QTD::DlgRef_2Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_2Spin_QTD" ); + resize( 124, 83 ); + setCaption( trUtf8( "DlgRef_2Spin_QTD" ) ); + DlgRef_2Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_2Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_2Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_2Spin_QTD::~DlgRef_2Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_2Spin_QTD.h b/src/DlgRef/DlgRef_2Spin_QTD.h new file mode 100644 index 000000000..8c2acbab9 --- /dev/null +++ b/src/DlgRef/DlgRef_2Spin_QTD.h @@ -0,0 +1,65 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_2Spin_QTD.ui' +** +** Created: jeu sep 25 12:10:30 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_2SPIN_QTD_H +#define DLGREF_2SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QSpinBox; +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_2Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_2Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_2Spin_QTD(); + + QGroupBox* GroupBox1; + QSpinBox* SpinBox2; + QSpinBox* SpinBox1; + QLabel* TextLabel1; + QLabel* TextLabel2; + + +protected: + QGridLayout* DlgRef_2Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_2SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_3Check_QTD.cxx b/src/DlgRef/DlgRef_3Check_QTD.cxx new file mode 100644 index 000000000..30dc8c1e5 --- /dev/null +++ b/src/DlgRef/DlgRef_3Check_QTD.cxx @@ -0,0 +1,94 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Check_QTD.ui' +** +** Created: Tue Aug 24 11:27:47 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Check_QTD::DlgRef_3Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Check_QTD" ); + resize( 135, 108 ); + setCaption( trUtf8( "DlgRef_3Check_QTD" ) ); + DlgRef_3Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Check_QTDLayout"); + + GroupBox1 = new QButtonGroup( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + RadioButton3 = new QRadioButton( GroupBox1, "RadioButton3" ); + RadioButton3->setText( trUtf8( "RadioButton3" ) ); + + Layout1->addWidget( RadioButton3, 2, 0 ); + + RadioButton1 = new QRadioButton( GroupBox1, "RadioButton1" ); + RadioButton1->setText( trUtf8( "RadioButton1" ) ); + + Layout1->addWidget( RadioButton1, 0, 0 ); + + RadioButton2 = new QRadioButton( GroupBox1, "RadioButton2" ); + RadioButton2->setText( trUtf8( "RadioButton2" ) ); + + Layout1->addWidget( RadioButton2, 1, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 91, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( RadioButton1, RadioButton2 ); + setTabOrder( RadioButton2, RadioButton3 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Check_QTD::~DlgRef_3Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Check_QTD.h b/src/DlgRef/DlgRef_3Check_QTD.h new file mode 100644 index 000000000..d843073c6 --- /dev/null +++ b/src/DlgRef/DlgRef_3Check_QTD.h @@ -0,0 +1,65 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Check_QTD.ui' +** +** Created: Tue Aug 24 11:27:47 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3CHECK_QTD_H +#define DLGREF_3CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QRadioButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_3Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Check_QTD(); + + QButtonGroup* GroupBox1; + QRadioButton* RadioButton3; + QRadioButton* RadioButton1; + QRadioButton* RadioButton2; + + +protected: + QGridLayout* DlgRef_3Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_3CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx b/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx new file mode 100644 index 000000000..45d83b358 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.cxx @@ -0,0 +1,177 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Sel3Spin1Check_QTD.ui' +** +** Created: Mon Apr 19 16:36:48 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Sel3Spin1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel3Spin1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Sel3Spin1Check_QTD::DlgRef_3Sel3Spin1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Sel3Spin1Check_QTD" ); + resize( 380, 229 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "DlgRef_3Sel3Spin1Check_QTD" ) ); + DlgRef_3Sel3Spin1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Sel3Spin1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + SpinBox_2 = new QSpinBox( GroupBox1, "SpinBox_2" ); + SpinBox_2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox_2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox_2, 4, 2 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout1->addWidget( LineEdit3, 2, 2 ); + + SpinBox_3 = new QSpinBox( GroupBox1, "SpinBox_3" ); + SpinBox_3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox_3->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox_3, 5, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + CheckBox1 = new QCheckBox( GroupBox1, "CheckBox1" ); + CheckBox1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckBox1, 6, 6, 0, 1 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout1->addWidget( TextLabel4, 3, 0 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton3, 2, 1 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout1->addWidget( TextLabel6, 5, 0 ); + + SpinBox_1 = new QSpinBox( GroupBox1, "SpinBox_1" ); + SpinBox_1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox_1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox_1, 3, 2 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout1->addWidget( TextLabel5, 4, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 250, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 7, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Sel3Spin1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, PushButton3 ); + setTabOrder( PushButton3, LineEdit3 ); + setTabOrder( LineEdit3, SpinBox_1 ); + setTabOrder( SpinBox_1, SpinBox_2 ); + setTabOrder( SpinBox_2, SpinBox_3 ); + setTabOrder( SpinBox_3, CheckBox1 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel3Spin1Check_QTD::~DlgRef_3Sel3Spin1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h b/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h new file mode 100644 index 000000000..553f90840 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel3Spin1Check_QTD.h @@ -0,0 +1,76 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Sel3Spin1Check_QTD.ui' +** +** Created: Mon Apr 19 16:36:48 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3SEL3SPIN1CHECK_QTD_H +#define DLGREF_3SEL3SPIN1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_3Sel3Spin1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Sel3Spin1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Sel3Spin1Check_QTD(); + + QGroupBox* GroupBox1; + QSpinBox* SpinBox_2; + QLineEdit* LineEdit3; + QSpinBox* SpinBox_3; + QLabel* TextLabel1; + QLabel* TextLabel3; + QCheckBox* CheckBox1; + QPushButton* PushButton1; + QLabel* TextLabel4; + QLineEdit* LineEdit2; + QPushButton* PushButton3; + QLabel* TextLabel6; + QSpinBox* SpinBox_1; + QLabel* TextLabel5; + QLabel* TextLabel2; + QLineEdit* LineEdit1; + QPushButton* PushButton2; + + +protected: + QGridLayout* DlgRef_3Sel3Spin1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_3SEL3SPIN1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx b/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx new file mode 100644 index 000000000..e32b155cb --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.cxx @@ -0,0 +1,201 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Sel4Spin2Check_QTD.ui' +** +** Created: Tue Jun 1 16:29:29 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Sel4Spin2Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel4Spin2Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Sel4Spin2Check_QTD::DlgRef_3Sel4Spin2Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Sel4Spin2Check_QTD" ); + resize( 269, 281 ); + setCaption( trUtf8( "DlgRef_3Sel4Spin2Check_QTD" ) ); + DlgRef_3Sel4Spin2Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Sel4Spin2Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + CheckButton2 = new QCheckBox( GroupBox1, "CheckButton2" ); + CheckButton2->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckButton2, 6, 6, 0, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout1->addWidget( LineEdit3, 2, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + SpinBox4 = new QSpinBox( GroupBox1, "SpinBox4" ); + SpinBox4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox4->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox4, 1, 1 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout3->addWidget( SpinBox3, 0, 1 ); + + TextLabel7 = new QLabel( GroupBox1, "TextLabel7" ); + TextLabel7->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel7->sizePolicy().hasHeightForWidth() ) ); + TextLabel7->setText( trUtf8( "TL7" ) ); + + Layout3->addWidget( TextLabel7, 1, 0 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout3->addWidget( TextLabel6, 0, 0 ); + + Layout1->addMultiCellLayout( Layout3, 5, 5, 0, 2 ); + + CheckButton1 = new QCheckBox( GroupBox1, "CheckButton1" ); + CheckButton1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckButton1, 4, 4, 0, 2 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton3, 2, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 7, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 1, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox1, 0, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout2->addWidget( SpinBox2, 1, 1 ); + + Layout1->addMultiCellLayout( Layout2, 3, 3, 0, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Sel4Spin2Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + // tab order + setTabOrder( PushButton1, LineEdit1 ); + setTabOrder( LineEdit1, PushButton2 ); + setTabOrder( PushButton2, LineEdit2 ); + setTabOrder( LineEdit2, PushButton3 ); + setTabOrder( PushButton3, LineEdit3 ); + setTabOrder( LineEdit3, SpinBox1 ); + setTabOrder( SpinBox1, SpinBox2 ); + setTabOrder( SpinBox2, CheckButton1 ); + setTabOrder( CheckButton1, SpinBox3 ); + setTabOrder( SpinBox3, SpinBox4 ); + setTabOrder( SpinBox4, CheckButton2 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel4Spin2Check_QTD::~DlgRef_3Sel4Spin2Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h b/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h new file mode 100644 index 000000000..5bbc36d54 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel4Spin2Check_QTD.h @@ -0,0 +1,81 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Sel4Spin2Check_QTD.ui' +** +** Created: Tue Jun 1 16:29:29 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3SEL4SPIN2CHECK_QTD_H +#define DLGREF_3SEL4SPIN2CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QCheckBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QSpinBox; + +class DlgRef_3Sel4Spin2Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Sel4Spin2Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Sel4Spin2Check_QTD(); + + QGroupBox* GroupBox1; + QCheckBox* CheckButton2; + QLineEdit* LineEdit1; + QLabel* TextLabel3; + QPushButton* PushButton2; + QLineEdit* LineEdit3; + QPushButton* PushButton1; + QSpinBox* SpinBox4; + QSpinBox* SpinBox3; + QLabel* TextLabel7; + QLabel* TextLabel6; + QCheckBox* CheckButton1; + QPushButton* PushButton3; + QLabel* TextLabel1; + QLineEdit* LineEdit2; + QLabel* TextLabel5; + QLabel* TextLabel4; + QSpinBox* SpinBox1; + QSpinBox* SpinBox2; + QLabel* TextLabel2; + + +protected: + QGridLayout* DlgRef_3Sel4Spin2Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout3; + QGridLayout* Layout2; +}; + +#endif // DLGREF_3SEL4SPIN2CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_3Sel_QTD.cxx b/src/DlgRef/DlgRef_3Sel_QTD.cxx new file mode 100644 index 000000000..9381494f3 --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel_QTD.cxx @@ -0,0 +1,125 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Sel_QTD.ui' +** +** Created: lun sep 29 11:05:21 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Sel_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Sel_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Sel_QTD::DlgRef_3Sel_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Sel_QTD" ); + resize( 129, 117 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "DlgRef_3Sel_QTD" ) ); + DlgRef_3Sel_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Sel_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout1->addWidget( LineEdit3, 2, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 159, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton3, 2, 1 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Sel_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Sel_QTD::~DlgRef_3Sel_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Sel_QTD.h b/src/DlgRef/DlgRef_3Sel_QTD.h new file mode 100644 index 000000000..f1832c9ee --- /dev/null +++ b/src/DlgRef/DlgRef_3Sel_QTD.h @@ -0,0 +1,73 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Sel_QTD.ui' +** +** Created: lun sep 29 11:05:21 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3SEL_QTD_H +#define DLGREF_3SEL_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_3Sel_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Sel_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Sel_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit3; + QPushButton* PushButton1; + QLineEdit* LineEdit2; + QLabel* TextLabel1; + QLabel* TextLabel3; + QLineEdit* LineEdit1; + QLabel* TextLabel2; + QPushButton* PushButton3; + QPushButton* PushButton2; + + +protected: + QGridLayout* DlgRef_3Sel_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_3SEL_QTD_H diff --git a/src/DlgRef/DlgRef_3Spin1Check_QTD.cxx b/src/DlgRef/DlgRef_3Spin1Check_QTD.cxx new file mode 100644 index 000000000..12f779933 --- /dev/null +++ b/src/DlgRef/DlgRef_3Spin1Check_QTD.cxx @@ -0,0 +1,115 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Spin1Check_QTD.ui' +** +** Created: dim sep 28 18:11:19 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Spin1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Spin1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Spin1Check_QTD::DlgRef_3Spin1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Spin1Check_QTD" ); + resize( 124, 130 ); + setCaption( trUtf8( "DlgRef_3Spin1Check_QTD" ) ); + DlgRef_3Spin1Check_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Spin1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + CheckBox1 = new QRadioButton( GroupBox1, "CheckBox1" ); + CheckBox1->setText( trUtf8( "" ) ); + + Layout1->addMultiCellWidget( CheckBox1, 3, 3, 0, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 4, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox3, 2, 1 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Spin1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Spin1Check_QTD::~DlgRef_3Spin1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Spin1Check_QTD.h b/src/DlgRef/DlgRef_3Spin1Check_QTD.h new file mode 100644 index 000000000..a8b5a61dd --- /dev/null +++ b/src/DlgRef/DlgRef_3Spin1Check_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Spin1Check_QTD.ui' +** +** Created: dim sep 28 18:11:19 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3SPIN1CHECK_QTD_H +#define DLGREF_3SPIN1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QRadioButton; +class QSpinBox; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_3Spin1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Spin1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Spin1Check_QTD(); + + QGroupBox* GroupBox1; + QRadioButton* CheckBox1; + QSpinBox* SpinBox2; + QLabel* TextLabel3; + QSpinBox* SpinBox3; + QSpinBox* SpinBox1; + QLabel* TextLabel1; + QLabel* TextLabel2; + + +protected: + QGridLayout* DlgRef_3Spin1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_3SPIN1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_3Spin_QTD.cxx b/src/DlgRef/DlgRef_3Spin_QTD.cxx new file mode 100644 index 000000000..57823e5f5 --- /dev/null +++ b/src/DlgRef/DlgRef_3Spin_QTD.cxx @@ -0,0 +1,109 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_3Spin_QTD.ui' +** +** Created: mar sep 23 16:05:10 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_3Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_3Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_3Spin_QTD::DlgRef_3Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_3Spin_QTD" ); + resize( 124, 111 ); + setCaption( trUtf8( "DlgRef_3Spin_QTD" ) ); + DlgRef_3Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_3Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox3, 2, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_3Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_3Spin_QTD::~DlgRef_3Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_3Spin_QTD.h b/src/DlgRef/DlgRef_3Spin_QTD.h new file mode 100644 index 000000000..8d30c4e73 --- /dev/null +++ b/src/DlgRef/DlgRef_3Spin_QTD.h @@ -0,0 +1,68 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_3Spin_QTD.ui' +** +** Created: mar sep 23 16:05:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_3SPIN_QTD_H +#define DLGREF_3SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QSpinBox; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif +class DLGREF_WNT_EXPORT DlgRef_3Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_3Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_3Spin_QTD(); + + QGroupBox* GroupBox1; + QSpinBox* SpinBox2; + QLabel* TextLabel3; + QSpinBox* SpinBox1; + QSpinBox* SpinBox3; + QLabel* TextLabel1; + QLabel* TextLabel2; + + +protected: + QGridLayout* DlgRef_3Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_3SPIN_QTD_H diff --git a/src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx b/src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx new file mode 100644 index 000000000..14bf1ec8b --- /dev/null +++ b/src/DlgRef/DlgRef_4Sel1List1Check_QTD.cxx @@ -0,0 +1,195 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_4Sel1List1Check_QTD.ui' +** +** Created: lun oct 27 17:21:04 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_4Sel1List1Check_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_4Sel1List1Check_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_4Sel1List1Check_QTD::DlgRef_4Sel1List1Check_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_4Sel1List1Check_QTD" ); + resize( 129, 210 ); + setCaption( trUtf8( "DlgRef_4Sel1List1Check_QTD" ) ); + DlgRef_4Sel1List1Check_QTDLayout = + new QGridLayout( this, 1, 1, 0, 6, "DlgRef_4Sel1List1Check_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addMultiCellWidget( TextLabel3, 2, 2, 0, 1 ); + + ComboBox1 = new QComboBox( FALSE, GroupBox1, "ComboBox1" ); + ComboBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, ComboBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( ComboBox1, 2, 2 ); + + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_4Sel1List1Check_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + + GroupBox2 = new QGroupBox( this, "GroupBox2" ); + GroupBox2->setTitle( trUtf8( "" ) ); + GroupBox2->setColumnLayout(0, Qt::Vertical ); + GroupBox2->layout()->setSpacing( 6 ); + GroupBox2->layout()->setMargin( 11 ); + GroupBox2Layout = new QGridLayout( GroupBox2->layout() ); + GroupBox2Layout->setAlignment( Qt::AlignTop ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel4 = new QLabel( GroupBox2, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 0, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 80, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 5, 2 ); + + PushButton3 = new QPushButton( GroupBox2, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout2->addWidget( PushButton3, 0, 1 ); + + LineEdit3 = new QLineEdit( GroupBox2, "LineEdit3" ); + + Layout2->addWidget( LineEdit3, 0, 2 ); + + + TextLabel5 = new QLabel( GroupBox2, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 1, 0 ); + + PushButton4 = new QPushButton( GroupBox2, "PushButton4" ); + PushButton4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton4->sizePolicy().hasHeightForWidth() ) ); + PushButton4->setText( trUtf8( "" ) ); + + Layout2->addWidget( PushButton4, 1, 1 ); + + LineEdit4 = new QLineEdit( GroupBox2, "LineEdit4" ); + + Layout2->addWidget( LineEdit4, 1, 2 ); + + CheckBox1 = new QCheckBox( GroupBox1, "CheckBox1" ); + CheckBox1->setText( trUtf8( "" ) ); + Layout1->addMultiCellWidget( CheckBox1, 5, 5, 0, 1 ); + + PushButton5 = new QPushButton( GroupBox1, "PushButton5" ); + PushButton5->setText( trUtf8( "" ) ); + Layout1->addWidget( PushButton5, 5, 2 ); + + GroupBox2Layout->addLayout( Layout2, 0, 0 ); + + DlgRef_4Sel1List1Check_QTDLayout->addWidget( GroupBox2, 1, 0 ); + + // tab order + setTabOrder(PushButton1 , LineEdit1); + setTabOrder(LineEdit1 , PushButton2); + setTabOrder(PushButton2 , LineEdit2); + setTabOrder(LineEdit2, ComboBox1); + setTabOrder(ComboBox1, CheckBox1); + setTabOrder(CheckBox1, PushButton5); + setTabOrder(PushButton5, PushButton3); + setTabOrder(PushButton3 , LineEdit3); + setTabOrder(LineEdit3, PushButton4 ); + setTabOrder(PushButton4 , LineEdit4); + +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_4Sel1List1Check_QTD::~DlgRef_4Sel1List1Check_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_4Sel1List1Check_QTD.h b/src/DlgRef/DlgRef_4Sel1List1Check_QTD.h new file mode 100644 index 000000000..da2a5b98e --- /dev/null +++ b/src/DlgRef/DlgRef_4Sel1List1Check_QTD.h @@ -0,0 +1,85 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_4Sel1List1Check_QTD.ui' +** +** Created: lun oct 27 17:21:03 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_4SEL1LIST1CHECK_QTD_H +#define DLGREF_4SEL1LIST1CHECK_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QComboBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QCheckBox; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_4Sel1List1Check_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_4Sel1List1Check_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_4Sel1List1Check_QTD(); + + QGroupBox* GroupBox1; + QGroupBox* GroupBox2; + QLabel* TextLabel1; + QLabel* TextLabel2; + QLabel* TextLabel3; + QLabel* TextLabel4; + QLabel* TextLabel5; + QPushButton* PushButton1; + QPushButton* PushButton2; + QPushButton* PushButton3; + QPushButton* PushButton4; + QLineEdit* LineEdit1; + QLineEdit* LineEdit2; + QLineEdit* LineEdit3; + QLineEdit* LineEdit4; + QComboBox* ComboBox1; + QCheckBox* CheckBox1; + QPushButton* PushButton5; + +protected: + QGridLayout* DlgRef_4Sel1List1Check_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* GroupBox2Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_4SEL1LIST1CHECK_QTD_H diff --git a/src/DlgRef/DlgRef_4Sel1List_QTD.cxx b/src/DlgRef/DlgRef_4Sel1List_QTD.cxx new file mode 100644 index 000000000..d6e5b2086 --- /dev/null +++ b/src/DlgRef/DlgRef_4Sel1List_QTD.cxx @@ -0,0 +1,171 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_4Sel1List_QTD.ui' +** +** Created: lun oct 27 17:21:04 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_4Sel1List_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_4Sel1List_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_4Sel1List_QTD::DlgRef_4Sel1List_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_4Sel1List_QTD" ); + resize( 129, 175 ); + setCaption( trUtf8( "DlgRef_4Sel1List_QTD" ) ); + DlgRef_4Sel1List_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_4Sel1List_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addMultiCellWidget( TextLabel3, 2, 2, 0, 1 ); + + ComboBox1 = new QComboBox( FALSE, GroupBox1, "ComboBox1" ); + ComboBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, ComboBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( ComboBox1, 2, 2 ); + + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_4Sel1List_QTDLayout->addWidget( GroupBox1, 0, 0 ); + + + GroupBox2 = new QGroupBox( this, "GroupBox2" ); + GroupBox2->setTitle( trUtf8( "" ) ); + GroupBox2->setColumnLayout(0, Qt::Vertical ); + GroupBox2->layout()->setSpacing( 6 ); + GroupBox2->layout()->setMargin( 11 ); + GroupBox2Layout = new QGridLayout( GroupBox2->layout() ); + GroupBox2Layout->setAlignment( Qt::AlignTop ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel4 = new QLabel( GroupBox2, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 0, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 80, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 5, 2 ); + + PushButton3 = new QPushButton( GroupBox2, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout2->addWidget( PushButton3, 0, 1 ); + + LineEdit3 = new QLineEdit( GroupBox2, "LineEdit3" ); + + Layout2->addWidget( LineEdit3, 0, 2 ); + + + TextLabel5 = new QLabel( GroupBox2, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 1, 0 ); + + PushButton4 = new QPushButton( GroupBox2, "PushButton4" ); + PushButton4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton4->sizePolicy().hasHeightForWidth() ) ); + PushButton4->setText( trUtf8( "" ) ); + + Layout2->addWidget( PushButton4, 1, 1 ); + + LineEdit4 = new QLineEdit( GroupBox2, "LineEdit4" ); + + Layout2->addWidget( LineEdit4, 1, 2 ); + + GroupBox2Layout->addLayout( Layout2, 0, 0 ); + + DlgRef_4Sel1List_QTDLayout->addWidget( GroupBox2, 1, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_4Sel1List_QTD::~DlgRef_4Sel1List_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_4Sel1List_QTD.h b/src/DlgRef/DlgRef_4Sel1List_QTD.h new file mode 100644 index 000000000..278cbc3bf --- /dev/null +++ b/src/DlgRef/DlgRef_4Sel1List_QTD.h @@ -0,0 +1,76 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_4Sel1List_QTD.ui' +** +** Created: lun oct 27 17:21:03 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_4SEL1LIST_QTD_H +#define DLGREF_4SEL1LIST_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QComboBox; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class DlgRef_4Sel1List_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_4Sel1List_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_4Sel1List_QTD(); + + QGroupBox* GroupBox1; + QGroupBox* GroupBox2; + QLineEdit* LineEdit2; + QPushButton* PushButton4; + QPushButton* PushButton1; + QLineEdit* LineEdit4; + QPushButton* PushButton3; + QPushButton* PushButton2; + QLabel* TextLabel1; + QLabel* TextLabel4; + QLineEdit* LineEdit1; + QLabel* TextLabel5; + QLineEdit* LineEdit3; + QLabel* TextLabel2; + QComboBox* ComboBox1; + QLabel* TextLabel3; + + +protected: + QGridLayout* DlgRef_4Sel1List_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* GroupBox2Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // DLGREF_4SEL1LIST_QTD_H diff --git a/src/DlgRef/DlgRef_6Sel_QTD.cxx b/src/DlgRef/DlgRef_6Sel_QTD.cxx new file mode 100644 index 000000000..c3f541853 --- /dev/null +++ b/src/DlgRef/DlgRef_6Sel_QTD.cxx @@ -0,0 +1,171 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_6Sel_QTD.ui' +** +** Created: Tue Aug 24 18:18:57 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_6Sel_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_6Sel_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +DlgRef_6Sel_QTD::DlgRef_6Sel_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "DlgRef_6Sel_QTD" ); + resize( 235, 196 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "DlgRef_6Sel_QTD" ) ); + DlgRef_6Sel_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "DlgRef_6Sel_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout1->addWidget( TextLabel4, 3, 0 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout1->addWidget( TextLabel5, 4, 0 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout1->addWidget( TextLabel6, 5, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + PushButton3 = new QPushButton( GroupBox1, "PushButton3" ); + PushButton3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton3->sizePolicy().hasHeightForWidth() ) ); + PushButton3->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton3, 2, 1 ); + + PushButton4 = new QPushButton( GroupBox1, "PushButton4" ); + PushButton4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton4->sizePolicy().hasHeightForWidth() ) ); + PushButton4->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton4, 3, 1 ); + + PushButton5 = new QPushButton( GroupBox1, "PushButton5" ); + PushButton5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton5->sizePolicy().hasHeightForWidth() ) ); + PushButton5->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton5, 4, 1 ); + + PushButton6 = new QPushButton( GroupBox1, "PushButton6" ); + PushButton6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton6->sizePolicy().hasHeightForWidth() ) ); + PushButton6->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton6, 5, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout1->addWidget( LineEdit3, 2, 2 ); + + LineEdit4 = new QLineEdit( GroupBox1, "LineEdit4" ); + + Layout1->addWidget( LineEdit4, 3, 2 ); + + LineEdit5 = new QLineEdit( GroupBox1, "LineEdit5" ); + + Layout1->addWidget( LineEdit5, 4, 2 ); + + LineEdit6 = new QLineEdit( GroupBox1, "LineEdit6" ); + + Layout1->addWidget( LineEdit6, 5, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + DlgRef_6Sel_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_6Sel_QTD::~DlgRef_6Sel_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_6Sel_QTD.h b/src/DlgRef/DlgRef_6Sel_QTD.h new file mode 100644 index 000000000..52b0db336 --- /dev/null +++ b/src/DlgRef/DlgRef_6Sel_QTD.h @@ -0,0 +1,82 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_6Sel_QTD.ui' +** +** Created: Tue Aug 24 18:18:28 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_6SEL_QTD_H +#define DLGREF_6SEL_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_6Sel_QTD : public QWidget +{ + Q_OBJECT + +public: + DlgRef_6Sel_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~DlgRef_6Sel_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QLabel* TextLabel2; + QLabel* TextLabel3; + QLabel* TextLabel4; + QLabel* TextLabel5; + QLabel* TextLabel6; + QPushButton* PushButton1; + QPushButton* PushButton2; + QPushButton* PushButton3; + QPushButton* PushButton4; + QPushButton* PushButton5; + QPushButton* PushButton6; + QLineEdit* LineEdit1; + QLineEdit* LineEdit2; + QLineEdit* LineEdit3; + QLineEdit* LineEdit4; + QLineEdit* LineEdit5; + QLineEdit* LineEdit6; + + +protected: + QGridLayout* DlgRef_6Sel_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // DLGREF_6SEL_QTD_H diff --git a/src/DlgRef/DlgRef_Skeleton_QTD.cxx b/src/DlgRef/DlgRef_Skeleton_QTD.cxx new file mode 100644 index 000000000..f16b05e10 --- /dev/null +++ b/src/DlgRef/DlgRef_Skeleton_QTD.cxx @@ -0,0 +1,158 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'DlgRef_Skeleton_QTD.ui' +** +** Created: Wed Aug 11 18:42:51 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "DlgRef_Skeleton_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a DlgRef_Skeleton_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +DlgRef_Skeleton_QTD::DlgRef_Skeleton_QTD( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + if ( !name ) + setName( "DlgRef_Skeleton_QTD" ); + resize( 307, 378 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "DlgRef_Skeleton_QTD" ) ); + setSizeGripEnabled( TRUE ); + DlgRef_Skeleton_QTDLayout = new QGridLayout( this, 1, 1, 11, 6, "DlgRef_Skeleton_QTDLayout"); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + GroupMedium = new QGroupBox( this, "GroupMedium" ); + GroupMedium->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupMedium->sizePolicy().hasHeightForWidth() ) ); + GroupMedium->setTitle( trUtf8( "" ) ); + + Layout1->addWidget( GroupMedium, 2, 0 ); + + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupButtons->sizePolicy().hasHeightForWidth() ) ); + GroupButtons->setTitle( trUtf8( "" ) ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 6 ); + GroupButtons->layout()->setMargin( 11 ); + GroupButtonsLayout = new QHBoxLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + + Layout3 = new QHBoxLayout( 0, 0, 6, "Layout3"); + + buttonOk = new QPushButton( GroupButtons, "buttonOk" ); + buttonOk->setText( trUtf8( "&Ok" ) ); + Layout3->addWidget( buttonOk ); + + buttonApply = new QPushButton( GroupButtons, "buttonApply" ); + buttonApply->setText( trUtf8( "&Apply" ) ); + Layout3->addWidget( buttonApply ); + QSpacerItem* spacer = new QSpacerItem( 91, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); + Layout3->addItem( spacer ); + + buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); + buttonCancel->setText( trUtf8( "&Cancel" ) ); + Layout3->addWidget( buttonCancel ); + GroupButtonsLayout->addLayout( Layout3 ); + + Layout1->addWidget( GroupButtons, 3, 0 ); + + GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); + GroupConstructors->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, GroupConstructors->sizePolicy().hasHeightForWidth() ) ); + GroupConstructors->setTitle( trUtf8( "" ) ); + GroupConstructors->setColumnLayout(0, Qt::Vertical ); + GroupConstructors->layout()->setSpacing( 6 ); + GroupConstructors->layout()->setMargin( 11 ); + GroupConstructorsLayout = new QHBoxLayout( GroupConstructors->layout() ); + GroupConstructorsLayout->setAlignment( Qt::AlignTop ); + + Layout2 = new QHBoxLayout( 0, 0, 6, "Layout2"); + + RadioButton1 = new QRadioButton( GroupConstructors, "RadioButton1" ); + RadioButton1->setText( trUtf8( "" ) ); + Layout2->addWidget( RadioButton1 ); + + RadioButton2 = new QRadioButton( GroupConstructors, "RadioButton2" ); + RadioButton2->setText( trUtf8( "" ) ); + Layout2->addWidget( RadioButton2 ); + + RadioButton3 = new QRadioButton( GroupConstructors, "RadioButton3" ); + RadioButton3->setText( trUtf8( "" ) ); + Layout2->addWidget( RadioButton3 ); + + RadioButton4 = new QRadioButton( GroupConstructors, "RadioButton4" ); + RadioButton4->setText( trUtf8( "" ) ); + Layout2->addWidget( RadioButton4 ); + GroupConstructorsLayout->addLayout( Layout2 ); + + Layout1->addWidget( GroupConstructors, 0, 0 ); + + GroupBoxName = new QGroupBox( this, "GroupBoxName" ); + GroupBoxName->setTitle( trUtf8( "Result name" ) ); + GroupBoxName->setColumnLayout(0, Qt::Vertical ); + GroupBoxName->layout()->setSpacing( 6 ); + GroupBoxName->layout()->setMargin( 11 ); + GroupBoxNameLayout = new QGridLayout( GroupBoxName->layout() ); + GroupBoxNameLayout->setAlignment( Qt::AlignTop ); + + Layout66 = new QGridLayout( 0, 1, 1, 0, 6, "Layout66"); + + ResultName = new QLineEdit( GroupBoxName, "ResultName" ); + + Layout66->addWidget( ResultName, 0, 1 ); + + NameLabel = new QLabel( GroupBoxName, "NameLabel" ); + NameLabel->setText( trUtf8( "Name" ) ); + + Layout66->addWidget( NameLabel, 0, 0 ); + + GroupBoxNameLayout->addLayout( Layout66, 0, 0 ); + + Layout1->addWidget( GroupBoxName, 1, 0 ); + + DlgRef_Skeleton_QTDLayout->addLayout( Layout1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgRef_Skeleton_QTD::~DlgRef_Skeleton_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/DlgRef/DlgRef_Skeleton_QTD.h b/src/DlgRef/DlgRef_Skeleton_QTD.h new file mode 100644 index 000000000..fb4807f31 --- /dev/null +++ b/src/DlgRef/DlgRef_Skeleton_QTD.h @@ -0,0 +1,83 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'DlgRef_Skeleton_QTD.ui' +** +** Created: Wed Aug 11 18:42:51 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef DLGREF_SKELETON_QTD_H +#define DLGREF_SKELETON_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QRadioButton; + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define DLGREF_WNT_EXPORT __declspec( dllexport ) +#else +#define DLGREF_WNT_EXPORT +#endif + +class DLGREF_WNT_EXPORT DlgRef_Skeleton_QTD : public QDialog +{ + Q_OBJECT + +public: + DlgRef_Skeleton_QTD( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~DlgRef_Skeleton_QTD(); + + QGroupBox* GroupMedium; + QGroupBox* GroupButtons; + QPushButton* buttonOk; + QPushButton* buttonApply; + QPushButton* buttonCancel; + QButtonGroup* GroupConstructors; + QRadioButton* RadioButton1; + QRadioButton* RadioButton2; + QRadioButton* RadioButton3; + QRadioButton* RadioButton4; + QGroupBox* GroupBoxName; + QLineEdit* ResultName; + QLabel* NameLabel; + + +protected: + QGridLayout* DlgRef_Skeleton_QTDLayout; + QGridLayout* Layout1; + QHBoxLayout* GroupButtonsLayout; + QHBoxLayout* Layout3; + QHBoxLayout* GroupConstructorsLayout; + QHBoxLayout* Layout2; + QGridLayout* GroupBoxNameLayout; + QGridLayout* Layout66; +}; + +#endif // DLGREF_SKELETON_QTD_H diff --git a/src/DlgRef/UIFiles/ui_to_cxx b/src/DlgRef/UIFiles/ui_to_cxx new file mode 100755 index 000000000..4c4c512b8 --- /dev/null +++ b/src/DlgRef/UIFiles/ui_to_cxx @@ -0,0 +1,104 @@ +// 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/ +// +#!/bin/sh + +#uic -o DlgRef_Skeleton_QTD.h DlgRef_Skeleton_QTD.ui +#uic -o DlgRef_Skeleton_QTD.cxx -impl DlgRef_Skeleton_QTD.h DlgRef_Skeleton_QTD.ui + +#uic -o DlgRef_1Sel_QTD.h DlgRef_1Sel_QTD.ui +#uic -o DlgRef_1Sel_QTD.cxx -impl DlgRef_1Sel_QTD.h DlgRef_1Sel_QTD.ui + +#uic -o DlgRef_1Sel1Spin_QTD.h DlgRef_1Sel1Spin_QTD.ui +#uic -o DlgRef_1Sel1Spin_QTD.cxx -impl DlgRef_1Sel1Spin_QTD.h DlgRef_1Sel1Spin_QTD.ui + +#uic -o DlgRef_1Sel1Spin1Check_QTD.h DlgRef_1Sel1Spin1Check_QTD.ui +#uic -o DlgRef_1Sel1Spin1Check_QTD.cxx -impl DlgRef_1Sel1Spin1Check_QTD.h DlgRef_1Sel1Spin1Check_QTD.ui + +#uic -o DlgRef_1Sel2Spin_QTD.h DlgRef_1Sel2Spin_QTD.ui +#uic -o DlgRef_1Sel2Spin_QTD.cxx -impl DlgRef_1Sel2Spin_QTD.h DlgRef_1Sel2Spin_QTD.ui + +#uic -o DlgRef_1Sel3Spin_QTD.h DlgRef_1Sel3Spin_QTD.ui +#uic -o DlgRef_1Sel3Spin_QTD.cxx -impl DlgRef_1Sel3Spin_QTD.h DlgRef_1Sel3Spin_QTD.ui + +#uic -o DlgRef_1Sel4Spin_QTD.h DlgRef_1Sel4Spin_QTD.ui +#uic -o DlgRef_1Sel4Spin_QTD.cxx -impl DlgRef_1Sel4Spin_QTD.h DlgRef_1Sel4Spin_QTD.ui + +#uic -o DlgRef_1Sel5Spin_QTD.h DlgRef_1Sel5Spin_QTD.ui +#uic -o DlgRef_1Sel5Spin_QTD.cxx -impl DlgRef_1Sel5Spin_QTD.h DlgRef_1Sel5Spin_QTD.ui + +#uic -o DlgRef_1Sel1Check_QTD.h DlgRef_1Sel1Check_QTD.ui +#uic -o DlgRef_1Sel1Check_QTD.cxx -impl DlgRef_1Sel1Check_QTD.h DlgRef_1Sel1Check_QTD.ui + +#uic -o DlgRef_1Sel3Check_QTD.h DlgRef_1Sel3Check_QTD.ui +#uic -o DlgRef_1Sel3Check_QTD.cxx -impl DlgRef_1Sel3Check_QTD.h DlgRef_1Sel3Check_QTD.ui + +#uic -o DlgRef_1Sel1Check1List_QTD.h DlgRef_1Sel1Check1List_QTD.ui +#uic -o DlgRef_1Sel1Check1List_QTD.cxx -impl DlgRef_1Sel1Check1List_QTD.h DlgRef_1Sel1Check1List_QTD.ui + +#uic -o DlgRef_2Sel_QTD.h DlgRef_2Sel_QTD.ui +#uic -o DlgRef_2Sel_QTD.cxx -impl DlgRef_2Sel_QTD.h DlgRef_2Sel_QTD.ui + +#uic -o DlgRef_2Sel1Spin_QTD.h DlgRef_2Sel1Spin_QTD.ui +#uic -o DlgRef_2Sel1Spin_QTD.cxx -impl DlgRef_2Sel1Spin_QTD.h DlgRef_2Sel1Spin_QTD.ui + +#uic -o DlgRef_2Sel1Spin2Check_QTD.h DlgRef_2Sel1Spin2Check_QTD.ui +#uic -o DlgRef_2Sel1Spin2Check_QTD.cxx -impl DlgRef_2Sel1Spin2Check_QTD.h DlgRef_2Sel1Spin2Check_QTD.ui + +#uic -o DlgRef_2Sel2Spin_QTD.h DlgRef_2Sel2Spin_QTD.ui +#uic -o DlgRef_2Sel2Spin_QTD.cxx -impl DlgRef_2Sel2Spin_QTD.h DlgRef_2Sel2Spin_QTD.ui + +#uic -o DlgRef_2Sel2Spin1Check_QTD.h DlgRef_2Sel2Spin1Check_QTD.ui +#uic -o DlgRef_2Sel2Spin1Check_QTD.cxx -impl DlgRef_2Sel2Spin1Check_QTD.h DlgRef_2Sel2Spin1Check_QTD.ui + +#uic -o DlgRef_2Sel3Spin_QTD.h DlgRef_2Sel3Spin_QTD.ui +#uic -o DlgRef_2Sel3Spin_QTD.cxx -impl DlgRef_2Sel3Spin_QTD.h DlgRef_2Sel3Spin_QTD.ui + +#uic -o DlgRef_2Sel4Spin1Check_QTD.h DlgRef_2Sel4Spin1Check_QTD.ui +#uic -o DlgRef_2Sel4Spin1Check_QTD.cxx -impl DlgRef_2Sel4Spin1Check_QTD.h DlgRef_2Sel4Spin1Check_QTD.ui + +#uic -o DlgRef_4Sel1List_QTD.h DlgRef_4Sel1List_QTD.ui +#uic -o DlgRef_4Sel1List_QTD.cxx -impl DlgRef_4Sel1List_QTD.h DlgRef_4Sel1List_QTD.ui + +#uic -o DlgRef_3Sel_QTD.h DlgRef_3Sel_QTD.ui +#uic -o DlgRef_3Sel_QTD.cxx -impl DlgRef_3Sel_QTD.h DlgRef_3Sel_QTD.ui + +#uic -o DlgRef_3Sel4Spin2Check_QTD.h DlgRef_3Sel4Spin2Check_QTD.ui +#uic -o DlgRef_3Sel4Spin2Check_QTD.cxx -impl DlgRef_3Sel4Spin2Check_QTD.h DlgRef_3Sel4Spin2Check_QTD.ui + +#uic -o DlgRef_1Spin_QTD.h DlgRef_1Spin_QTD.ui +#uic -o DlgRef_1Spin_QTD.cxx -impl DlgRef_1Spin_QTD.h DlgRef_1Spin_QTD.ui + +#uic -o DlgRef_2Spin_QTD.h DlgRef_2Spin_QTD.ui +#uic -o DlgRef_2Spin_QTD.cxx -impl DlgRef_2Spin_QTD.h DlgRef_2Spin_QTD.ui + +#uic -o DlgRef_3Spin_QTD.h DlgRef_3Spin_QTD.ui +#uic -o DlgRef_3Spin_QTD.cxx -impl DlgRef_3Spin_QTD.h DlgRef_3Spin_QTD.ui + +#uic -o DlgRef_3Spin1Check_QTD.h DlgRef_3Spin1Check_QTD.ui +#uic -o DlgRef_3Spin1Check_QTD.cxx -impl DlgRef_3Spin1Check_QTD.h DlgRef_3Spin1Check_QTD.ui + +#uic -o DlgRef_3Sel3Spin1Check_QTD.h DlgRef_3Sel3Spin1Check_QTD.ui +#uic -o DlgRef_3Sel3Spin1Check_QTD.cxx -impl DlgRef_3Sel3Spin1Check_QTD.h DlgRef_3Sel3Spin1Check_QTD.ui + +#uic -o DlgRef_6Sel_QTD.h DlgRef_6Sel_QTD.ui +#uic -o DlgRef_6Sel_QTD.cxx -impl DlgRef_6Sel_QTD.h DlgRef_6Sel_QTD.ui + +uic -o DlgRef_3Check_QTD.h DlgRef_3Check_QTD.ui +uic -o DlgRef_3Check_QTD.cxx -impl DlgRef_3Check_QTD.h DlgRef_3Check_QTD.ui diff --git a/src/EntityGUI/EntityGUI.cxx b/src/EntityGUI/EntityGUI.cxx new file mode 100644 index 000000000..82fa8a094 --- /dev/null +++ b/src/EntityGUI/EntityGUI.cxx @@ -0,0 +1,679 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : EntityGUI.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "EntityGUI.h" +#include "GeometryGUI.h" +#include "GEOM_AssemblyBuilder.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SUIT_ViewWindow.h" +#include "OCCViewer_ViewModel.h" +#include "OCCViewer_ViewManager.h" +//#include "SVTK_ViewModel.h" +#include "SalomeApp_Study.h" +#include "SalomeApp_Tools.h" +//#include "SALOMEGUI_ImportOperation.h" + +#include +#include +#include + +#include "EntityGUI_SketcherDlg.h" // Sketcher +#include "EntityGUI_SubShapeDlg.h" // Method SUBSHAPE + +#include "utilities.h" + +using namespace boost; +using namespace std; + +EntityGUI* EntityGUI::myGUIObject = 0; + +//======================================================================= +// function : GetEntityGUI() +// purpose : Get the only EntityGUI object [ static ] +//======================================================================= +EntityGUI* EntityGUI::GetEntityGUI( GeometryGUI* parent ) +{ + if ( myGUIObject == 0 ) { + // init EntityGUI only once + myGUIObject = new EntityGUI( parent ); + } + return myGUIObject; +} + +//======================================================================= +// function : EntityGUI() +// purpose : Constructor +//======================================================================= +EntityGUI::EntityGUI( GeometryGUI* parent ) : GEOMGUI( parent ) +{ + myGeomBase = new GEOMBase(); + myGeom = GEOM::GEOM_Gen::_duplicate( GeometryGUI::GetGeomGen() ); + + mySimulationShape1 = new AIS_Shape(TopoDS_Shape()); + mySimulationShape2 = new AIS_Shape(TopoDS_Shape()); +} + + +//======================================================================= +// function : ~EntityGUI() +// purpose : Destructor +//======================================================================= +EntityGUI::~EntityGUI() +{ +} + + +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool EntityGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + QDialog* aDlg = NULL; + + switch (theCommandID) + { + case 404: // SKETCHER + getGeometryGUI()->ActiveWorkingPlane(); + aDlg = new EntityGUI_SketcherDlg(getGeometryGUI(), parent, ""); + break; + case 407: // EXPLODE : use ic + aDlg = new EntityGUI_SubShapeDlg(parent, ""); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } + if ( aDlg ) + aDlg->show(); + + return true; +} + + +//======================================================================= +// function : OnSketchEnd() +// purpose : +//======================================================================= +void EntityGUI::OnSketchEnd(const char *Cmd) +{ + /* QAD_Application::getDesktop()->putInfo("Create sketch functionality is NOT implemented in new GEOM kernel + (no such Corba interface method). Waiting for SRN to create it..."); + + try { + GEOM::GEOM_Shape_var result = myGeom->MakeSketcher(Cmd); + if(result->_is_nil()) { + QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_NULLSHAPE")); + return; + } + result->NameType(tr("GEOM_WIRE")); + if(myGeomBase->Display(result)) + QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_DONE")); + } + catch(const SALOME::SALOME_Exception& S_ex) { + SalomeApp_Tools::QtCatchCorbaException(S_ex); + } + */ + return; +} + + +//===================================================================================== +// function : DisplaySimulationShape() +// purpose : Displays 'this->mySimulationShape' a pure graphical shape from a TopoDS_Shape +//===================================================================================== +void EntityGUI::DisplaySimulationShape(const TopoDS_Shape& S1, const TopoDS_Shape& S2) +{ + //NRI DEBUG : 14/02/2002 + if( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type() ) + return; + + OCCViewer_Viewer* v3d = + ((OCCViewer_ViewManager*)(SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()))->getOCCViewer(); + Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); + try { + if(!S1.IsNull()) { + /* erase any previous */ + ic->Erase(mySimulationShape1, Standard_True, Standard_False); + ic->ClearPrs(mySimulationShape1); + + mySimulationShape1 = new AIS_Shape(TopoDS_Shape()); + mySimulationShape1->Set(S1); + mySimulationShape1->SetColor(Quantity_NOC_RED); + + ic->Deactivate(mySimulationShape1); + ic->Display(mySimulationShape1, Standard_False); + mySimulationShape1->UnsetColor(); + } + if(!S2.IsNull()) { + ic->Erase(mySimulationShape2, Standard_True, Standard_False); + ic->ClearPrs(mySimulationShape2); + + mySimulationShape2 = new AIS_Shape(TopoDS_Shape()); + mySimulationShape2->Set(S2); + mySimulationShape2->SetColor(Quantity_NOC_VIOLET); + + ic->Deactivate(mySimulationShape2); + ic->Display(mySimulationShape2, Standard_False); + mySimulationShape2->UnsetColor(); + } + ic->UpdateCurrentViewer(); + } + catch(Standard_Failure) { + MESSAGE("Exception catched in EntityGUI::DisplaySimulationShape "); + } + return; +} + + +//================================================================================== +// function : EraseSimulationShape() +// purpose : Clears the display of 'mySimulationShape' a pure graphical shape +//================================================================================== +void EntityGUI::EraseSimulationShape() +{ + // get all view windows at the desktop + QPtrList aWndLst = SUIT_Session::session()->activeApplication()->desktop()->windows(); + //get all view windows, which belong to the active study + QPtrList aWndLstAS; + SUIT_ViewWindow* vw; + for ( vw = aWndLst.first(); vw; vw = aWndLst.next() ) + if ( vw->getViewManager()->study() == SUIT_Session::session()->activeApplication()->activeStudy() ) + aWndLstAS.append( vw ); + + for ( vw = aWndLstAS.first(); vw; vw = aWndLstAS.next() ) { + if ( vw->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { + OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)(vw->getViewManager()))->getOCCViewer(); + Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); + ic->Erase(mySimulationShape1, Standard_True, Standard_False); + ic->ClearPrs(mySimulationShape1); + ic->Erase(mySimulationShape2, Standard_True, Standard_False); + ic->ClearPrs(mySimulationShape2); + ic->UpdateCurrentViewer(); + } + } +} + +//===================================================================================== +// function : SObjectExist() +// purpose : +//===================================================================================== +bool EntityGUI::SObjectExist(const _PTR(SObject)& theFatherObject, const char* IOR) +{ + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + _PTR(ChildIterator) it ( aStudy->NewChildIterator(theFatherObject) ); + _PTR(SObject) RefSO; + _PTR(GenericAttribute) anAttr; + for(; it->More();it->Next()) { + _PTR(SObject) SO ( it->Value() ); + if(SO->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR ( anAttr ); + if(strcmp( anIOR->Value().c_str(), IOR ) == 0) + return true; + } + if(SO->ReferencedObject(RefSO)) { + if(RefSO->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR ( anAttr ); + if(strcmp(anIOR->Value().c_str(), IOR) == 0) + return true; + } + } + } + return false; +} + + +//===================================================================================== +// function : OnSubShapeGetAll() +// purpose : Explode a shape in all sub shapes with a SubShapeType +//===================================================================================== +bool EntityGUI::OnSubShapeGetAll(const TopoDS_Shape& ShapeTopo, const char* ShapeTopoIOR, const int SubShapeType) +{ + SUIT_Session::session()->activeApplication()->putInfo("OnSubShapeGetAll method from EntityGUI should be reimplemented ..."); + /* + SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); + SALOMEDS::SObject_var theObj = aStudy->FindObjectIOR(ShapeTopoIOR); + if(theObj->_is_nil()) { + QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); + return false; + } + + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::SObject_var fatherSF = aStudy->FindObjectID(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->entry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributeIOR_var anIOR; + SALOMEDS::AttributePixMap_var aPixmap; + + // We create a sub object for each sub shape as attribute of the main object + // Each sub object contains list (length=1) containing its index in the main shape + GEOM::GEOM_Shape_var aShape = myGeom->GetIORFromString(ShapeTopoIOR); + GEOM::GEOM_Gen::ListOfGeomShapes_var listGeomShapes = new GEOM::GEOM_Gen::ListOfGeomShapes; + GEOM::GEOM_Shape_var aResult; + + try { + listGeomShapes = myGeom->SubShapeAll(aShape, SubShapeType); + if(listGeomShapes->length() < 1) { + QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_ABORT")); + return false; + } + } + catch(const SALOME::SALOME_Exception& S_ex) { + SalomeApp_Tools::QtCatchCorbaException(S_ex); + } + + // open transaction + QAD_Operation* op = new SALOMEGUI_ImportOperation(QAD_Application::getDesktop()->getActiveStudy()); + op->start(); + + TopoDS_Shape mainTopo = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape); + TopoDS_Shape mainShape; + bool main = false; + while(!main) { + if(aShape->IsMainShape()) { + mainShape = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape); + main = true; + } + else + aShape = myGeom->GetIORFromString(aShape->MainName()); + } + + // Loop on each sub shape created + // int i = 1 ; index for the nameType + for(int j=0; jlength(); j++) { + // Get each sub shape extracted CORBA and OCC + aResult = listGeomShapes[j] ; + TopoDS_Shape S = myGeomGUI->GetShapeReader().GetShape(myGeom, aResult); + + if (S.IsNull()) { + QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_ABORT")); + return false; + } + + // Set the nameType of sub shape + char* nameG = (char *)malloc(20); + Standard_CString Type; + if(myGeomBase->GetShapeTypeString(S, Type)) { + aResult->NameType(Type); + sprintf(nameG, "%s_%d", Type, myGeomBase->GetIndex(S, mainShape, SubShapeType)); + } + else { + aResult->NameType(tr("GEOM_SHAPE")); + sprintf(nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->myNbGeom++); + } + SALOMEDS::SObject_var SO = aStudy->FindObjectIOR(aResult->Name()); + + bool allreadyexist = false; + + if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { + OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); + Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); + + Handle(GEOM_AISShape) result = new GEOM_AISShape(S, nameG); + Handle(GEOM_InteractiveObject) IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM"); + + MESSAGE ("SO->_is_nil() " << SO->_is_nil()) + + if(SO->_is_nil()) { + SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj); + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName"); + aName = SALOMEDS::AttributeName::_narrow(anAttr); + aName->SetValue(nameG); + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"); + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR->SetValue(aResult->Name()); + + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap"); + aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); + MESSAGE(" Type " << S.ShapeType()) + if (S.ShapeType() == TopAbs_COMPOUND) + aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND"); + else if(S.ShapeType() == TopAbs_COMPSOLID) + aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID"); + else if(S.ShapeType() == TopAbs_SOLID) + aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID"); + else if(S.ShapeType() == TopAbs_SHELL) + aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL"); + else if(S.ShapeType() == TopAbs_FACE) + aPixmap->SetPixMap("ICON_OBJBROWSER_FACE"); + else if(S.ShapeType() == TopAbs_WIRE) + aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE"); + else if(S.ShapeType() == TopAbs_EDGE) + aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE"); + else if(S.ShapeType() == TopAbs_VERTEX) + aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX"); + + MESSAGE(" aPixmap->GetPixMap " << aPixmap->GetPixMap()) + + SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF); + aStudyBuilder->Addreference(newObj1, newObj); + IO->setEntry(newObj->GetID()); + + aResult->StudyShapeId(newObj->GetID()); + } + else { + allreadyexist = true; + if(!this->SObjectExist(theObj, aResult->Name())) { + SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj); + aStudyBuilder->Addreference(newObj1, SO); + IO->setEntry(SO->GetID()); + aResult->StudyShapeId(SO->GetID()); + } + } + + result->setIO(IO); + result->setName(nameG); + if(!allreadyexist) + ic->Display(result); + + } + else if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + SVTK_ViewFrame* vf = dynamic_cast( QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame() ); + SVTK_RenderWindowInteractor* myRenderInter= vf ? vf->getRWInteractor() : 0; + + int themode = myRenderInter->GetDisplayMode(); + vtkRenderer *theRenderer = vf->getRenderer(); + vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); + + Handle(GEOM_InteractiveObject) IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM"); + + if(SO->_is_nil()) { + SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj); + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"); + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR->SetValue(aResult->Name()); + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName"); + aName = SALOMEDS::AttributeName::_narrow(anAttr); + aName->SetValue(nameG); + + anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap"); + aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); + if(S.ShapeType() == TopAbs_COMPOUND) + aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND"); + else if(S.ShapeType() == TopAbs_COMPSOLID) + aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID"); + else if(S.ShapeType() == TopAbs_SOLID) + aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID"); + else if(S.ShapeType() == TopAbs_SHELL) + aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL"); + else if(S.ShapeType() == TopAbs_FACE) + aPixmap->SetPixMap("ICON_OBJBROWSER_FACE"); + else if(S.ShapeType() == TopAbs_WIRE) + aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE"); + else if(S.ShapeType() == TopAbs_EDGE) + aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE"); + else if(S.ShapeType() == TopAbs_VERTEX) + aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX"); + + SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF); + aStudyBuilder->Addreference(newObj1, newObj); + IO->setEntry(newObj->GetID()); + } + else { + allreadyexist = true; + if(!this->SObjectExist(theObj, aResult->Name())) { + SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj); + aStudyBuilder->Addreference(newObj1, SO); + IO->setEntry(SO->GetID()); + } + } + + if(!allreadyexist) { + vtkActorCollection* theActors = GEOM_AssemblyBuilder::BuildActors(S,0,themode,Standard_True); + theActors->InitTraversal(); + vtkActor* anActor = (vtkActor*)theActors->GetNextActor(); + while(!(anActor==NULL)) { + GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor); + GActor->setIO(IO); + GActor->setName(nameG); + theRenderer->AddActor(GActor); + renWin->Render(); + anActor = (vtkActor*)theActors->GetNextActor(); + } + } + } + } + + // commit transaction + op->finish(); + + QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser(); + QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_READY")); + */ + return true; +} + + +//===================================================================================== +// function : OnSubShapeGetSelected() +// purpose : +//===================================================================================== +bool EntityGUI::OnSubShapeGetSelected(const TopoDS_Shape& ShapeTopo, const char* ShapeTopoIOR, const int SubShapeType, Standard_Integer& aLocalContextId, bool& myUseLocalContext) +{ + SUIT_Session::session()->activeApplication()->putInfo("OnSubShapeGetSelected method from EntityGUI should be reimplemented ..."); + // //* Test the type of viewer */ +// if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC) +// return false; + +// SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); +// SALOMEDS::SObject_var theObj = aStudy->FindObjectIOR(ShapeTopoIOR); +// if(theObj->_is_nil()) { +// QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); +// return false; +// } + +// OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); +// Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); + +// if( myUseLocalContext == false ) { +// /* local context is from DialogBox */ +// MESSAGE("Error : No local context opened for sub shapes method" << endl ) ; +// return false ; +// } + +// GEOM::GEOM_Shape_var aShape = myGeom->GetIORFromString( ShapeTopoIOR ); +// TopoDS_Shape mainTopo = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape); + +// TopoDS_Shape mainShape; +// bool main = false; +// while(!main) { +// if(aShape->IsMainShape()) { +// mainShape = myGeomGUI->GetShapeReader().GetShape(myGeom, aShape); +// main = true; +// } +// else +// aShape = myGeom->GetIORFromString(aShape->MainName()); +// } + +// GEOM::GEOM_Shape::ListOfSubShapeID_var ListOfID = new GEOM::GEOM_Shape::ListOfSubShapeID; +// ic->InitSelected(); +// int nbSelected = ic->NbSelected(); +// ListOfID->length(nbSelected); + +// TopoDS_Compound compound; +// ic->InitSelected(); /* to init again */ +// BRep_Builder B; +// B.MakeCompound(compound); + +// int i = 0; +// /* We create a unique compound containing all the sub shapes selected by user as attribute of the main shape */ +// /* the compound is homogenous by selection */ +// while(ic->MoreSelected()) { +// int index = myGeomBase->GetIndex(ic->SelectedShape(), mainShape, SubShapeType); +// ListOfID[i] = index; +// B.Add(compound, ic->SelectedShape()); +// i++; +// ic->NextSelected(); +// } + +// /* Test if user has selected sub shapes */ +// if(ListOfID->length() < 1) +// return false; + +// GEOM::GEOM_Shape_var aResult; +// try { +// aResult = myGeom->SubShape(aShape, SubShapeType, ListOfID); +// } +// catch (const SALOME::SALOME_Exception& S_ex) { +// SalomeApp_Tools::QtCatchCorbaException(S_ex); +// } + +// /* local context from DialogBox */ +// ic->CloseLocalContext(aLocalContextId); +// myUseLocalContext = false ; + +// char* nameG = (char *)malloc(20); +// Standard_CString Type; + +// Handle(GEOM_AISShape) result; +// Handle(GEOM_InteractiveObject) IO; + +// if(nbSelected == 1) { +// TopExp_Explorer Exp (compound, TopAbs_ShapeEnum(SubShapeType)); +// if(Exp.More()) { +// if(myGeomBase->GetShapeTypeString(Exp.Current(),Type)) { +// aResult->NameType(Type); +// sprintf (nameG, "%s_%d", Type, myGeomBase->GetIndex( Exp.Current(), mainTopo, SubShapeType)); +// } +// else { +// aResult->NameType(tr("GEOM_SHAPE")); +// sprintf (nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->myNbGeom++); +// } +// result = new GEOM_AISShape(Exp.Current(), nameG); +// IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM"); +// } +// } +// else { +// if ( myGeomBase->GetShapeTypeString(compound,Type)) { +// aResult->NameType(Type); +// sprintf (nameG, "%s_%d", Type, myGeomGUI->myNbGeom++); +// } else { +// aResult->NameType(tr("GEOM_SHAPE")); +// sprintf (nameG, "%s_%d", tr("GEOM_SHAPE").latin1(), myGeomGUI->myNbGeom++); +// } +// result = new GEOM_AISShape(compound, nameG); +// IO = new GEOM_InteractiveObject(aResult->Name(), myGeomGUI->GetFatherior(), "GEOM"); +// } + +// SALOMEDS::SObject_var SO = aStudy->FindObjectIOR(aResult->Name()); + +// /* open transaction */ +// QAD_Operation* op = new SALOMEGUI_ImportOperation(QAD_Application::getDesktop()->getActiveStudy()); +// op->start(); + +// SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); +// SALOMEDS::SObject_var fatherSF = aStudy->FindObjectID(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->entry()); +// SALOMEDS::GenericAttribute_var anAttr; +// SALOMEDS::AttributeName_var aName; +// SALOMEDS::AttributeIOR_var anIOR; +// SALOMEDS::AttributePixMap_var aPixmap; + +// bool allreadyexist = false; + +// if(SO->_is_nil()) { +// SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(theObj); +// anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"); +// anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); +// anIOR->SetValue(aResult->Name()); +// anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName"); +// aName = SALOMEDS::AttributeName::_narrow(anAttr); +// aName->SetValue(result->getName()); + +// anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePixMap"); +// aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); +// if(result->Shape().ShapeType() == TopAbs_COMPOUND) +// aPixmap->SetPixMap("ICON_OBJBROWSER_COMPOUND"); +// else if(result->Shape().ShapeType() == TopAbs_COMPSOLID) +// aPixmap->SetPixMap("ICON_OBJBROWSER_COMPSOLID"); +// else if(result->Shape().ShapeType() == TopAbs_SOLID) +// aPixmap->SetPixMap("ICON_OBJBROWSER_SOLID"); +// else if(result->Shape().ShapeType() == TopAbs_SHELL) +// aPixmap->SetPixMap("ICON_OBJBROWSER_SHELL"); +// else if(result->Shape().ShapeType() == TopAbs_FACE) +// aPixmap->SetPixMap("ICON_OBJBROWSER_FACE"); +// else if(result->Shape().ShapeType() == TopAbs_WIRE) +// aPixmap->SetPixMap("ICON_OBJBROWSER_WIRE"); +// else if(result->Shape().ShapeType() == TopAbs_EDGE) +// aPixmap->SetPixMap("ICON_OBJBROWSER_EDGE"); +// else if(result->Shape().ShapeType() == TopAbs_VERTEX) +// aPixmap->SetPixMap("ICON_OBJBROWSER_VERTEX"); + +// SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(fatherSF); +// aStudyBuilder->Addreference(newObj1, newObj); + +// IO->setEntry(newObj->GetID()); +// aResult->StudyShapeId(newObj->GetID()); +// } +// else { +// allreadyexist = true; +// if(!this->SObjectExist(theObj, aResult->Name())) { +// SALOMEDS::SObject_var newObj1 = aStudyBuilder->NewObject(theObj); +// aStudyBuilder->Addreference(newObj1, SO); + +// IO->setEntry(SO->GetID()); +// aResult->StudyShapeId(SO->GetID()); +// } +// } + +// /* commit transaction */ +// op->finish(); + +// result->setIO(IO); +// result->setName(nameG); + +// if(!allreadyexist) +// ic->Display(result); + +// DisplayGUI* myDisplayGUI = new DisplayGUI(); +// myDisplayGUI->OnDisplayAll(true); + +// QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser(); +// QAD_Application::getDesktop()->putInfo (tr("GEOM_PRP_READY")); + return true; +} + + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ +#ifdef WNT + __declspec( dllexport ) +#endif + GEOMGUI* GetLibGUI( GeometryGUI* parent ) + { + return EntityGUI::GetEntityGUI( parent ); + } +} diff --git a/src/EntityGUI/EntityGUI_1Sel_QTD.cxx b/src/EntityGUI/EntityGUI_1Sel_QTD.cxx new file mode 100644 index 000000000..86fc4303d --- /dev/null +++ b/src/EntityGUI/EntityGUI_1Sel_QTD.cxx @@ -0,0 +1,122 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_1Sel_QTD.ui' +** +** Created: Thu Aug 12 19:03:19 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_1Sel_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_1Sel_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_1Sel_QTD::EntityGUI_1Sel_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_1Sel_QTD" ); + resize( 329, 112 ); + setCaption( trUtf8( "EntityGUI_1Sel_QTD" ) ); + EntityGUI_1Sel_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_1Sel_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "Values" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + QSpacerItem* spacer = new QSpacerItem( 0, 163, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer, 2, 0 ); + + buttonApply = new QPushButton( GroupBox1, "buttonApply" ); + buttonApply->setText( trUtf8( "Create" ) ); + + Layout3->addWidget( buttonApply, 0, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + buttonRedo = new QPushButton( GroupBox1, "buttonRedo" ); + buttonRedo->setText( trUtf8( "Redo" ) ); + + Layout2->addWidget( buttonRedo, 0, 1 ); + + buttonUndo = new QPushButton( GroupBox1, "buttonUndo" ); + buttonUndo->setText( trUtf8( "Undo" ) ); + + Layout2->addWidget( buttonUndo, 0, 0 ); + + Layout3->addLayout( Layout2, 1, 0 ); + + Layout4->addLayout( Layout3, 0, 1 ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + QSpacerItem* spacer_2 = new QSpacerItem( 0, 180, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer_2, 1, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + LineEdit1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, 0, 0, LineEdit1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + Layout4->addLayout( Layout1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout4, 0, 0 ); + + EntityGUI_1Sel_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_1Sel_QTD::~EntityGUI_1Sel_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_1Sel_QTD.h b/src/EntityGUI/EntityGUI_1Sel_QTD.h new file mode 100644 index 000000000..2888d93e4 --- /dev/null +++ b/src/EntityGUI/EntityGUI_1Sel_QTD.h @@ -0,0 +1,67 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_1Sel_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_1SEL_QTD_H +#define ENTITYGUI_1SEL_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class EntityGUI_1Sel_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_1Sel_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_1Sel_QTD(); + + QGroupBox* GroupBox1; + QPushButton* buttonApply; + QPushButton* buttonRedo; + QPushButton* buttonUndo; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* EntityGUI_1Sel_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout4; + QGridLayout* Layout3; + QGridLayout* Layout2; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_1SEL_QTD_H diff --git a/src/EntityGUI/EntityGUI_1Spin_QTD.cxx b/src/EntityGUI/EntityGUI_1Spin_QTD.cxx new file mode 100644 index 000000000..1fcef95bf --- /dev/null +++ b/src/EntityGUI/EntityGUI_1Spin_QTD.cxx @@ -0,0 +1,116 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_1Spin_QTD.ui' +** +** Created: Fri Jul 30 16:05:59 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_1Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_1Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_1Spin_QTD::EntityGUI_1Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_1Spin_QTD" ); + resize( 255, 112 ); + setCaption( trUtf8( "EntityGUI_1Spin_QTD" ) ); + EntityGUI_1Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_1Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "Values" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 82, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 1 ); + + Layout4->addLayout( Layout1, 0, 0 ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + buttonRedo = new QPushButton( GroupBox1, "buttonRedo" ); + buttonRedo->setText( trUtf8( "Redo" ) ); + + Layout2->addWidget( buttonRedo, 0, 1 ); + + buttonUndo = new QPushButton( GroupBox1, "buttonUndo" ); + buttonUndo->setText( trUtf8( "Undo" ) ); + + Layout2->addWidget( buttonUndo, 0, 0 ); + + Layout3->addLayout( Layout2, 1, 0 ); + + buttonApply = new QPushButton( GroupBox1, "buttonApply" ); + buttonApply->setText( trUtf8( "Create" ) ); + + Layout3->addWidget( buttonApply, 0, 0 ); + QSpacerItem* spacer_2 = new QSpacerItem( 0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer_2, 2, 0 ); + + Layout4->addLayout( Layout3, 0, 1 ); + + GroupBox1Layout->addLayout( Layout4, 0, 0 ); + + EntityGUI_1Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_1Spin_QTD::~EntityGUI_1Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_1Spin_QTD.h b/src/EntityGUI/EntityGUI_1Spin_QTD.h new file mode 100644 index 000000000..7b26931fb --- /dev/null +++ b/src/EntityGUI/EntityGUI_1Spin_QTD.h @@ -0,0 +1,66 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_1Spin_QTD.ui' +** +** Created: Fri Jul 30 16:05:59 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_1SPIN_QTD_H +#define ENTITYGUI_1SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QPushButton; +class QSpinBox; + +class EntityGUI_1Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_1Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_1Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QSpinBox* SpinBox1; + QPushButton* buttonRedo; + QPushButton* buttonUndo; + QPushButton* buttonApply; + + +protected: + QGridLayout* EntityGUI_1Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout4; + QGridLayout* Layout1; + QGridLayout* Layout3; + QGridLayout* Layout2; +}; + +#endif // ENTITYGUI_1SPIN_QTD_H diff --git a/src/EntityGUI/EntityGUI_2Spin_QTD.cxx b/src/EntityGUI/EntityGUI_2Spin_QTD.cxx new file mode 100644 index 000000000..ec8ed7648 --- /dev/null +++ b/src/EntityGUI/EntityGUI_2Spin_QTD.cxx @@ -0,0 +1,127 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_2Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_2Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_2Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_2Spin_QTD::EntityGUI_2Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_2Spin_QTD" ); + resize( 255, 112 ); + setCaption( trUtf8( "EntityGUI_2Spin_QTD" ) ); + EntityGUI_2Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_2Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "Values" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + QSpacerItem* spacer = new QSpacerItem( 0, 82, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 1 ); + + Layout4->addLayout( Layout1, 0, 0 ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + QSpacerItem* spacer_2 = new QSpacerItem( 0, 51, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer_2, 2, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + buttonUndo = new QPushButton( GroupBox1, "buttonUndo" ); + buttonUndo->setText( trUtf8( "Undo" ) ); + + Layout2->addWidget( buttonUndo, 0, 0 ); + + buttonRedo = new QPushButton( GroupBox1, "buttonRedo" ); + buttonRedo->setText( trUtf8( "Redo" ) ); + + Layout2->addWidget( buttonRedo, 0, 1 ); + + Layout3->addLayout( Layout2, 1, 0 ); + + buttonApply = new QPushButton( GroupBox1, "buttonApply" ); + buttonApply->setText( trUtf8( "Create" ) ); + + Layout3->addWidget( buttonApply, 0, 0 ); + + Layout4->addLayout( Layout3, 0, 1 ); + + GroupBox1Layout->addLayout( Layout4, 0, 0 ); + + EntityGUI_2Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_2Spin_QTD::~EntityGUI_2Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_2Spin_QTD.h b/src/EntityGUI/EntityGUI_2Spin_QTD.h new file mode 100644 index 000000000..bdd3c0737 --- /dev/null +++ b/src/EntityGUI/EntityGUI_2Spin_QTD.h @@ -0,0 +1,68 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_2Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_2SPIN_QTD_H +#define ENTITYGUI_2SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QPushButton; +class QSpinBox; + +class EntityGUI_2Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_2Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_2Spin_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel2; + QLabel* TextLabel1; + QSpinBox* SpinBox1; + QSpinBox* SpinBox2; + QPushButton* buttonUndo; + QPushButton* buttonRedo; + QPushButton* buttonApply; + + +protected: + QGridLayout* EntityGUI_2Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout4; + QGridLayout* Layout1; + QGridLayout* Layout3; + QGridLayout* Layout2; +}; + +#endif // ENTITYGUI_2SPIN_QTD_H diff --git a/src/EntityGUI/EntityGUI_3Spin_QTD.cxx b/src/EntityGUI/EntityGUI_3Spin_QTD.cxx new file mode 100644 index 000000000..9734557a1 --- /dev/null +++ b/src/EntityGUI/EntityGUI_3Spin_QTD.cxx @@ -0,0 +1,138 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_3Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_3Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_3Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_3Spin_QTD::EntityGUI_3Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_3Spin_QTD" ); + resize( 255, 125 ); + setCaption( trUtf8( "EntityGUI_3Spin_QTD" ) ); + EntityGUI_3Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_3Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "Values" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + buttonApply = new QPushButton( GroupBox1, "buttonApply" ); + buttonApply->setText( trUtf8( "Create" ) ); + + Layout3->addWidget( buttonApply, 0, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 121, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer, 2, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + buttonUndo = new QPushButton( GroupBox1, "buttonUndo" ); + buttonUndo->setText( trUtf8( "Undo" ) ); + + Layout2->addWidget( buttonUndo, 0, 0 ); + + buttonRedo = new QPushButton( GroupBox1, "buttonRedo" ); + buttonRedo->setText( trUtf8( "Redo" ) ); + + Layout2->addWidget( buttonRedo, 0, 1 ); + + Layout3->addLayout( Layout2, 1, 0 ); + + Layout4->addLayout( Layout3, 0, 1 ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + QSpacerItem* spacer_2 = new QSpacerItem( 0, 82, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer_2, 3, 1 ); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox3, 2, 1 ); + + Layout4->addLayout( Layout1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout4, 0, 0 ); + + EntityGUI_3Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_3Spin_QTD::~EntityGUI_3Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_3Spin_QTD.h b/src/EntityGUI/EntityGUI_3Spin_QTD.h new file mode 100644 index 000000000..8ddcb62b1 --- /dev/null +++ b/src/EntityGUI/EntityGUI_3Spin_QTD.h @@ -0,0 +1,70 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_3Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_3SPIN_QTD_H +#define ENTITYGUI_3SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QPushButton; +class QSpinBox; + +class EntityGUI_3Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_3Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_3Spin_QTD(); + + QGroupBox* GroupBox1; + QPushButton* buttonApply; + QPushButton* buttonUndo; + QPushButton* buttonRedo; + QLabel* TextLabel2; + QLabel* TextLabel1; + QSpinBox* SpinBox1; + QSpinBox* SpinBox2; + QLabel* TextLabel3; + QSpinBox* SpinBox3; + + +protected: + QGridLayout* EntityGUI_3Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout4; + QGridLayout* Layout3; + QGridLayout* Layout2; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_3SPIN_QTD_H diff --git a/src/EntityGUI/EntityGUI_4Spin_QTD.cxx b/src/EntityGUI/EntityGUI_4Spin_QTD.cxx new file mode 100644 index 000000000..762940e84 --- /dev/null +++ b/src/EntityGUI/EntityGUI_4Spin_QTD.cxx @@ -0,0 +1,149 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_4Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_4Spin_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_4Spin_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_4Spin_QTD::EntityGUI_4Spin_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_4Spin_QTD" ); + resize( 255, 154 ); + setCaption( trUtf8( "EntityGUI_4Spin_QTD" ) ); + EntityGUI_4Spin_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_4Spin_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setTitle( trUtf8( "Values" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + buttonRedo = new QPushButton( GroupBox1, "buttonRedo" ); + buttonRedo->setText( trUtf8( "Redo" ) ); + + Layout2->addWidget( buttonRedo, 0, 1 ); + + buttonUndo = new QPushButton( GroupBox1, "buttonUndo" ); + buttonUndo->setText( trUtf8( "Undo" ) ); + + Layout2->addWidget( buttonUndo, 0, 0 ); + + Layout3->addLayout( Layout2, 1, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 45, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout3->addItem( spacer, 2, 0 ); + + buttonApply = new QPushButton( GroupBox1, "buttonApply" ); + buttonApply->setText( trUtf8( "Create" ) ); + + Layout3->addWidget( buttonApply, 0, 0 ); + + Layout4->addLayout( Layout3, 0, 1 ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + SpinBox3 = new QSpinBox( GroupBox1, "SpinBox3" ); + SpinBox3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox3->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox3, 2, 1 ); + + SpinBox2 = new QSpinBox( GroupBox1, "SpinBox2" ); + SpinBox2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox2->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox2, 1, 1 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + QSpacerItem* spacer_2 = new QSpacerItem( 0, 70, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer_2, 4, 1 ); + + SpinBox4 = new QSpinBox( GroupBox1, "SpinBox4" ); + SpinBox4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox4->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox4, 3, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + SpinBox1 = new QSpinBox( GroupBox1, "SpinBox1" ); + SpinBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, SpinBox1->sizePolicy().hasHeightForWidth() ) ); + + Layout1->addWidget( SpinBox1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout1->addWidget( TextLabel4, 3, 0 ); + + Layout4->addLayout( Layout1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout4, 0, 0 ); + + EntityGUI_4Spin_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_4Spin_QTD::~EntityGUI_4Spin_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_4Spin_QTD.h b/src/EntityGUI/EntityGUI_4Spin_QTD.h new file mode 100644 index 000000000..2ac171b9b --- /dev/null +++ b/src/EntityGUI/EntityGUI_4Spin_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_4Spin_QTD.ui' +** +** Created: Fri Jul 30 16:06:00 2004 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_4SPIN_QTD_H +#define ENTITYGUI_4SPIN_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QPushButton; +class QSpinBox; + +class EntityGUI_4Spin_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_4Spin_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_4Spin_QTD(); + + QGroupBox* GroupBox1; + QPushButton* buttonRedo; + QPushButton* buttonUndo; + QPushButton* buttonApply; + QSpinBox* SpinBox3; + QSpinBox* SpinBox2; + QLabel* TextLabel2; + QSpinBox* SpinBox4; + QLabel* TextLabel3; + QSpinBox* SpinBox1; + QLabel* TextLabel1; + QLabel* TextLabel4; + + +protected: + QGridLayout* EntityGUI_4Spin_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout4; + QGridLayout* Layout3; + QGridLayout* Layout2; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_4SPIN_QTD_H diff --git a/src/EntityGUI/EntityGUI_Dir1_QTD.cxx b/src/EntityGUI/EntityGUI_Dir1_QTD.cxx new file mode 100644 index 000000000..55a724512 --- /dev/null +++ b/src/EntityGUI/EntityGUI_Dir1_QTD.cxx @@ -0,0 +1,99 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_Dir1_QTD.ui' +** +** Created: ven déc 12 11:17:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_Dir1_QTD.h" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_Dir1_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_Dir1_QTD::EntityGUI_Dir1_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_Dir1_QTD" ); + resize( 131, 123 ); + setCaption( trUtf8( "EntityGUI_Dir1_QTD" ) ); + EntityGUI_Dir1_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_Dir1_QTDLayout"); + + GroupDir1 = new QButtonGroup( this, "GroupDir1" ); + GroupDir1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupDir1->sizePolicy().hasHeightForWidth() ) ); + GroupDir1->setTitle( trUtf8( "Direction" ) ); + GroupDir1->setColumnLayout(0, Qt::Vertical ); + GroupDir1->layout()->setSpacing( 6 ); + GroupDir1->layout()->setMargin( 11 ); + GroupDir1Layout = new QGridLayout( GroupDir1->layout() ); + GroupDir1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + RB_Dir12 = new QRadioButton( GroupDir1, "RB_Dir12" ); + RB_Dir12->setText( trUtf8( "Perpendicular" ) ); + + Layout1->addWidget( RB_Dir12, 1, 0 ); + + RB_Dir13 = new QRadioButton( GroupDir1, "RB_Dir13" ); + RB_Dir13->setText( trUtf8( "Tangent" ) ); + + Layout1->addWidget( RB_Dir13, 2, 0 ); + + RB_Dir11 = new QRadioButton( GroupDir1, "RB_Dir11" ); + RB_Dir11->setText( trUtf8( "Angle" ) ); + + Layout1->addWidget( RB_Dir11, 0, 0 ); + + RB_Dir14 = new QRadioButton( GroupDir1, "RB_Dir14" ); + RB_Dir14->setText( trUtf8( "VX-VY" ) ); + + Layout1->addWidget( RB_Dir14, 3, 0 ); + + GroupDir1Layout->addLayout( Layout1, 0, 0 ); + + EntityGUI_Dir1_QTDLayout->addWidget( GroupDir1, 0, 0 ); + + // tab order + setTabOrder( RB_Dir11, RB_Dir12 ); + setTabOrder( RB_Dir12, RB_Dir13 ); + setTabOrder( RB_Dir13, RB_Dir14 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_Dir1_QTD::~EntityGUI_Dir1_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_Dir1_QTD.h b/src/EntityGUI/EntityGUI_Dir1_QTD.h new file mode 100644 index 000000000..8652c68e0 --- /dev/null +++ b/src/EntityGUI/EntityGUI_Dir1_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_Dir1_QTD.ui' +** +** Created: ven déc 12 11:17:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_DIR1_QTD_H +#define ENTITYGUI_DIR1_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QRadioButton; + +class EntityGUI_Dir1_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_Dir1_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_Dir1_QTD(); + + QButtonGroup* GroupDir1; + QRadioButton* RB_Dir12; + QRadioButton* RB_Dir13; + QRadioButton* RB_Dir11; + QRadioButton* RB_Dir14; + + +protected: + QGridLayout* EntityGUI_Dir1_QTDLayout; + QGridLayout* GroupDir1Layout; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_DIR1_QTD_H diff --git a/src/EntityGUI/EntityGUI_Dir2_QTD.cxx b/src/EntityGUI/EntityGUI_Dir2_QTD.cxx new file mode 100644 index 000000000..5db7d306f --- /dev/null +++ b/src/EntityGUI/EntityGUI_Dir2_QTD.cxx @@ -0,0 +1,95 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_Dir2_QTD.ui' +** +** Created: ven déc 12 11:17:10 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_Dir2_QTD.h" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_Dir2_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_Dir2_QTD::EntityGUI_Dir2_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_Dir2_QTD" ); + resize( 124, 106 ); + setCaption( trUtf8( "EntityGUI_Dir2_QTD" ) ); + EntityGUI_Dir2_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_Dir2_QTDLayout"); + + GroupDir2 = new QButtonGroup( this, "GroupDir2" ); + GroupDir2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupDir2->sizePolicy().hasHeightForWidth() ) ); + GroupDir2->setTitle( trUtf8( "Direction" ) ); + GroupDir2->setColumnLayout(0, Qt::Vertical ); + GroupDir2->layout()->setSpacing( 6 ); + GroupDir2->layout()->setMargin( 11 ); + GroupDir2Layout = new QGridLayout( GroupDir2->layout() ); + GroupDir2Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + RB_Dir22 = new QRadioButton( GroupDir2, "RB_Dir22" ); + RB_Dir22->setText( trUtf8( "X" ) ); + + Layout1->addWidget( RB_Dir22, 1, 0 ); + + RB_Dir23 = new QRadioButton( GroupDir2, "RB_Dir23" ); + RB_Dir23->setText( trUtf8( "Y" ) ); + + Layout1->addWidget( RB_Dir23, 2, 0 ); + QSpacerItem* spacer = new QSpacerItem( 0, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 0 ); + + RB_Dir21 = new QRadioButton( GroupDir2, "RB_Dir21" ); + RB_Dir21->setText( trUtf8( "Length" ) ); + + Layout1->addWidget( RB_Dir21, 0, 0 ); + + GroupDir2Layout->addLayout( Layout1, 0, 0 ); + + EntityGUI_Dir2_QTDLayout->addWidget( GroupDir2, 0, 0 ); + + // tab order + setTabOrder( RB_Dir21, RB_Dir22 ); + setTabOrder( RB_Dir22, RB_Dir23 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_Dir2_QTD::~EntityGUI_Dir2_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_Dir2_QTD.h b/src/EntityGUI/EntityGUI_Dir2_QTD.h new file mode 100644 index 000000000..55dae2004 --- /dev/null +++ b/src/EntityGUI/EntityGUI_Dir2_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_Dir2_QTD.ui' +** +** Created: ven déc 12 11:17:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_DIR2_QTD_H +#define ENTITYGUI_DIR2_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QRadioButton; + +class EntityGUI_Dir2_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_Dir2_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_Dir2_QTD(); + + QButtonGroup* GroupDir2; + QRadioButton* RB_Dir22; + QRadioButton* RB_Dir23; + QRadioButton* RB_Dir21; + + +protected: + QGridLayout* EntityGUI_Dir2_QTDLayout; + QGridLayout* GroupDir2Layout; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_DIR2_QTD_H diff --git a/src/EntityGUI/EntityGUI_Point_QTD.cxx b/src/EntityGUI/EntityGUI_Point_QTD.cxx new file mode 100644 index 000000000..0d2680e7a --- /dev/null +++ b/src/EntityGUI/EntityGUI_Point_QTD.cxx @@ -0,0 +1,93 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_Point_QTD.ui' +** +** Created: ven déc 12 11:17:08 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_Point_QTD.h" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_Point_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EntityGUI_Point_QTD::EntityGUI_Point_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "EntityGUI_Point_QTD" ); + resize( 124, 106 ); + setCaption( trUtf8( "EntityGUI_Point_QTD" ) ); + EntityGUI_Point_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "EntityGUI_Point_QTDLayout"); + + GroupPoint = new QButtonGroup( this, "GroupPoint" ); + GroupPoint->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupPoint->sizePolicy().hasHeightForWidth() ) ); + GroupPoint->setTitle( trUtf8( "Point" ) ); + GroupPoint->setColumnLayout(0, Qt::Vertical ); + GroupPoint->layout()->setSpacing( 6 ); + GroupPoint->layout()->setMargin( 11 ); + GroupPointLayout = new QGridLayout( GroupPoint->layout() ); + GroupPointLayout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + RB_Point2 = new QRadioButton( GroupPoint, "RB_Point2" ); + RB_Point2->setText( trUtf8( "Relative" ) ); + + Layout1->addWidget( RB_Point2, 1, 0 ); + + RB_Point1 = new QRadioButton( GroupPoint, "RB_Point1" ); + RB_Point1->setText( trUtf8( "Absolute" ) ); + + Layout1->addWidget( RB_Point1, 0, 0 ); + + RB_Point3 = new QRadioButton( GroupPoint, "RB_Point3" ); + RB_Point3->setText( trUtf8( "Selection" ) ); + + Layout1->addWidget( RB_Point3, 2, 0 ); + + GroupPointLayout->addLayout( Layout1, 0, 0 ); + + EntityGUI_Point_QTDLayout->addWidget( GroupPoint, 0, 0 ); + + // tab order + setTabOrder( RB_Point1, RB_Point2 ); + setTabOrder( RB_Point2, RB_Point3 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_Point_QTD::~EntityGUI_Point_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_Point_QTD.h b/src/EntityGUI/EntityGUI_Point_QTD.h new file mode 100644 index 000000000..14e7b37d6 --- /dev/null +++ b/src/EntityGUI/EntityGUI_Point_QTD.h @@ -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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_Point_QTD.ui' +** +** Created: ven déc 12 11:17:08 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_POINT_QTD_H +#define ENTITYGUI_POINT_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QRadioButton; + +class EntityGUI_Point_QTD : public QWidget +{ + Q_OBJECT + +public: + EntityGUI_Point_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~EntityGUI_Point_QTD(); + + QButtonGroup* GroupPoint; + QRadioButton* RB_Point2; + QRadioButton* RB_Point1; + QRadioButton* RB_Point3; + + +protected: + QGridLayout* EntityGUI_Point_QTDLayout; + QGridLayout* GroupPointLayout; + QGridLayout* Layout1; +}; + +#endif // ENTITYGUI_POINT_QTD_H diff --git a/src/EntityGUI/EntityGUI_Skeleton_QTD.cxx b/src/EntityGUI/EntityGUI_Skeleton_QTD.cxx new file mode 100644 index 000000000..65e0b2444 --- /dev/null +++ b/src/EntityGUI/EntityGUI_Skeleton_QTD.cxx @@ -0,0 +1,195 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'EntityGUI_Skeleton_QTD.ui' +** +** Created: ven déc 12 11:17:08 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "EntityGUI_Skeleton_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a EntityGUI_Skeleton_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +EntityGUI_Skeleton_QTD::EntityGUI_Skeleton_QTD( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + if ( !name ) + setName( "EntityGUI_Skeleton_QTD" ); + resize( 317, 276 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "EntityGUI_Skeleton_QTD" ) ); + EntityGUI_Skeleton_QTDLayout = new QGridLayout( this, 1, 1, 11, 6, "EntityGUI_Skeleton_QTDLayout"); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + GroupVal = new QGroupBox( this, "GroupVal" ); + GroupVal->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupVal->sizePolicy().hasHeightForWidth() ) ); + GroupVal->setTitle( trUtf8( "" ) ); + + Layout1->addWidget( GroupVal, 2, 0 ); + + GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); + GroupConstructors->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, GroupConstructors->sizePolicy().hasHeightForWidth() ) ); + GroupConstructors->setTitle( trUtf8( "Element Type" ) ); + GroupConstructors->setColumnLayout(0, Qt::Vertical ); + GroupConstructors->layout()->setSpacing( 6 ); + GroupConstructors->layout()->setMargin( 11 ); + GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() ); + GroupConstructorsLayout->setAlignment( Qt::AlignTop ); + + Layout2 = new QHBoxLayout( 0, 0, 6, "Layout2"); + + RadioButton1 = new QRadioButton( GroupConstructors, "RadioButton1" ); + RadioButton1->setText( trUtf8( "Segment" ) ); + Layout2->addWidget( RadioButton1 ); + + RadioButton2 = new QRadioButton( GroupConstructors, "RadioButton2" ); + RadioButton2->setText( trUtf8( "Arc" ) ); + Layout2->addWidget( RadioButton2 ); + + GroupConstructorsLayout->addLayout( Layout2, 0, 0 ); + + Layout1->addWidget( GroupConstructors, 0, 0 ); + + GroupDest = new QGroupBox( this, "GroupDest" ); + GroupDest->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupDest->sizePolicy().hasHeightForWidth() ) ); + GroupDest->setTitle( trUtf8( "Destination" ) ); + GroupDest->setColumnLayout(0, Qt::Vertical ); + GroupDest->layout()->setSpacing( 6 ); + GroupDest->layout()->setMargin( 11 ); + GroupDestLayout = new QGridLayout( GroupDest->layout() ); + GroupDestLayout->setAlignment( Qt::AlignTop ); + + Layout5 = new QGridLayout( 0, 1, 1, 0, 6, "Layout5"); + + GroupDest1 = new QButtonGroup( GroupDest, "GroupDest1" ); + GroupDest1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupDest1->sizePolicy().hasHeightForWidth() ) ); + GroupDest1->setTitle( trUtf8( "Type" ) ); + GroupDest1->setColumnLayout(0, Qt::Vertical ); + GroupDest1->layout()->setSpacing( 6 ); + GroupDest1->layout()->setMargin( 11 ); + GroupDest1Layout = new QGridLayout( GroupDest1->layout() ); + GroupDest1Layout->setAlignment( Qt::AlignTop ); + + Layout4 = new QGridLayout( 0, 1, 1, 0, 6, "Layout4"); + + RB_Dest2 = new QRadioButton( GroupDest1, "RB_Dest2" ); + RB_Dest2->setText( trUtf8( "Direction" ) ); + + Layout4->addWidget( RB_Dest2, 0, 1 ); + + RB_Dest1 = new QRadioButton( GroupDest1, "RB_Dest1" ); + RB_Dest1->setText( trUtf8( "Point" ) ); + + Layout4->addWidget( RB_Dest1, 0, 0 ); + + GroupDest1Layout->addLayout( Layout4, 0, 0 ); + + Layout5->addMultiCellWidget( GroupDest1, 0, 0, 0, 1 ); + + GroupDest2 = new QButtonGroup( GroupDest, "GroupDest2" ); + GroupDest2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupDest2->sizePolicy().hasHeightForWidth() ) ); + GroupDest2->setTitle( trUtf8( "" ) ); + GroupDest2->setColumnLayout(0, Qt::Vertical ); + GroupDest2->layout()->setSpacing( 6 ); + GroupDest2->layout()->setMargin( 11 ); + GroupDest2Layout = new QGridLayout( GroupDest2->layout() ); + GroupDest2Layout->setAlignment( Qt::AlignTop ); + + Layout5->addWidget( GroupDest2, 1, 0 ); + + GroupDest3 = new QButtonGroup( GroupDest, "GroupDest3" ); + GroupDest3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupDest3->sizePolicy().hasHeightForWidth() ) ); + GroupDest3->setTitle( trUtf8( "" ) ); + GroupDest3->setColumnLayout(0, Qt::Vertical ); + GroupDest3->layout()->setSpacing( 6 ); + GroupDest3->layout()->setMargin( 11 ); + GroupDest3Layout = new QGridLayout( GroupDest3->layout() ); + GroupDest3Layout->setAlignment( Qt::AlignTop ); + + Layout5->addWidget( GroupDest3, 1, 1 ); + + GroupDestLayout->addLayout( Layout5, 0, 0 ); + + Layout1->addWidget( GroupDest, 1, 0 ); + + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupButtons->sizePolicy().hasHeightForWidth() ) ); + GroupButtons->setTitle( trUtf8( "" ) ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 6 ); + GroupButtons->layout()->setMargin( 11 ); + GroupButtonsLayout = new QHBoxLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + + Layout3 = new QHBoxLayout( 0, 0, 6, "Layout3"); + + buttonEnd = new QPushButton( GroupButtons, "buttonEnd" ); + buttonEnd->setText( trUtf8( "End Sketch" ) ); + Layout3->addWidget( buttonEnd ); + + buttonClose = new QPushButton( GroupButtons, "buttonClose" ); + buttonClose->setText( trUtf8( "Close Sketch" ) ); + Layout3->addWidget( buttonClose ); + QSpacerItem* spacer = new QSpacerItem( 91, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); + Layout3->addItem( spacer ); + + buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); + buttonCancel->setText( trUtf8( "&Cancel" ) ); + Layout3->addWidget( buttonCancel ); + GroupButtonsLayout->addLayout( Layout3 ); + + Layout1->addWidget( GroupButtons, 3, 0 ); + + EntityGUI_Skeleton_QTDLayout->addLayout( Layout1, 0, 0 ); + + // tab order + setTabOrder( RadioButton1, RadioButton2 ); + setTabOrder( RadioButton2, RB_Dest1 ); + setTabOrder( RB_Dest1, RB_Dest2 ); + setTabOrder( RB_Dest2, buttonEnd ); + setTabOrder( buttonEnd, buttonClose ); + setTabOrder( buttonClose, buttonCancel ); +} + +/* + * Destroys the object and frees any allocated resources + */ +EntityGUI_Skeleton_QTD::~EntityGUI_Skeleton_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/EntityGUI/EntityGUI_Skeleton_QTD.h b/src/EntityGUI/EntityGUI_Skeleton_QTD.h new file mode 100644 index 000000000..df965cddc --- /dev/null +++ b/src/EntityGUI/EntityGUI_Skeleton_QTD.h @@ -0,0 +1,80 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'EntityGUI_Skeleton_QTD.ui' +** +** Created: ven déc 12 11:17:07 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef ENTITYGUI_SKELETON_QTD_H +#define ENTITYGUI_SKELETON_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QGroupBox; +class QPushButton; +class QRadioButton; + +class EntityGUI_Skeleton_QTD : public QDialog +{ + Q_OBJECT + +public: + EntityGUI_Skeleton_QTD( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~EntityGUI_Skeleton_QTD(); + + QGroupBox* GroupVal; + QButtonGroup* GroupConstructors; + QRadioButton* RadioButton1; + QRadioButton* RadioButton2; + QGroupBox* GroupDest; + QButtonGroup* GroupDest1; + QRadioButton* RB_Dest2; + QRadioButton* RB_Dest1; + QButtonGroup* GroupDest2; + QButtonGroup* GroupDest3; + QGroupBox* GroupButtons; + QPushButton* buttonEnd; + QPushButton* buttonClose; + QPushButton* buttonCancel; + + +protected: + QGridLayout* EntityGUI_Skeleton_QTDLayout; + QGridLayout* Layout1; + QGridLayout* GroupConstructorsLayout; + QHBoxLayout* Layout2; + QGridLayout* GroupDestLayout; + QGridLayout* Layout5; + QGridLayout* GroupDest1Layout; + QGridLayout* Layout4; + QGridLayout* GroupDest2Layout; + QGridLayout* GroupDest3Layout; + QHBoxLayout* GroupButtonsLayout; + QHBoxLayout* Layout3; +}; + +#endif // ENTITYGUI_SKELETON_QTD_H diff --git a/src/EntityGUI/EntityGUI_SketcherDlg.cxx b/src/EntityGUI/EntityGUI_SketcherDlg.cxx new file mode 100644 index 000000000..0e6a141d5 --- /dev/null +++ b/src/EntityGUI/EntityGUI_SketcherDlg.cxx @@ -0,0 +1,1406 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : EntityGUI_SketcherDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header: + +#include "EntityGUI_SketcherDlg.h" +#include "Sketcher_Profile.hxx" +#include "GEOM_Displayer.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SUIT_MessageBox.h" +#include "SUIT_ResourceMgr.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : EntityGUI_SketcherDlg() +// purpose : Constructs a EntityGUI_SketcherDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +EntityGUI_SketcherDlg::EntityGUI_SketcherDlg(GeometryGUI* GUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :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->SetActiveDialogBox(this); + + if ( !name ) setName("EntityGUI_SketcherDlg"); + + buttonCancel->setText(tr("GEOM_BUT_CANCEL")); + buttonEnd->setText(tr("GEOM_BUT_END_SKETCH")); + buttonClose->setText(tr("GEOM_BUT_CLOSE_SKETCH")); + + GroupVal->close(TRUE); + GroupDest2->close(TRUE); + GroupDest3->close(TRUE); + + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_UNDO"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_REDO"))); + + setCaption(tr("GEOM_SKETCHER_TITLE")); + + GroupConstructors->setTitle(tr("GEOM_SKETCHER_EL")); + RadioButton1->setText(tr("GEOM_SKETCHER_SEGMENT")); + RadioButton2->setText(tr("GEOM_SKETCHER_ARC")); + GroupDest->setTitle(tr("GEOM_SKETCHER_DEST")); + GroupDest1->setTitle(tr("GEOM_SKETCHER_TYPE")); + RB_Dest1->setText(tr("GEOM_SKETCHER_POINT")); + RB_Dest2->setText(tr("GEOM_SKETCHER_DIR")); + + /***************************************************************/ + GroupPt = new EntityGUI_Point_QTD(GroupDest, "GroupPt"); + GroupPt->GroupPoint->setTitle(tr("GEOM_SKETCHER_POINT")); + GroupPt->RB_Point1->setText(tr("GEOM_SKETCHER_ABS")); + GroupPt->RB_Point2->setText(tr("GEOM_SKETCHER_REL")); + GroupPt->RB_Point3->setText(tr("GEOM_SKETCHER_SEL")); + + GroupD1 = new EntityGUI_Dir1_QTD(GroupDest, "GroupD1"); + GroupD1->GroupDir1->setTitle(tr("GEOM_SKETCHER_DIR")); + GroupD1->RB_Dir11->setText(tr("GEOM_SKETCHER_ANGLE")); + GroupD1->RB_Dir12->setText(tr("GEOM_SKETCHER_PER")); + GroupD1->RB_Dir13->setText(tr("GEOM_SKETCHER_TAN")); + GroupD1->RB_Dir14->setText(tr("GEOM_SKETCHER_VXVY")); + + GroupD2 = new EntityGUI_Dir2_QTD(GroupDest, "GroupD2"); + GroupD2->GroupDir2->setTitle(tr("GEOM_SKETCHER_DIR")); + GroupD2->RB_Dir21->setText(tr("GEOM_SKETCHER_LENGTH")); + GroupD2->RB_Dir22->setText(tr("GEOM_SKETCHER_X")); + GroupD2->RB_Dir23->setText(tr("GEOM_SKETCHER_Y")); + + Group1Sel = new EntityGUI_1Sel_QTD(this, "Group1Sel"); + Group1Sel->TextLabel1->setText(tr("GEOM_SKETCHER_POINT2")); + Group1Sel->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES")); + Group1Sel->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + Group1Sel->PushButton1->setPixmap(image0); + Group1Sel->buttonUndo->setPixmap(image1); + Group1Sel->buttonRedo->setPixmap(image2); + Group1Sel->LineEdit1->setReadOnly( true ); + + Group1Spin = new EntityGUI_1Spin(this, "Group1Spin"); + Group1Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES")); + Group1Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + Group1Spin->buttonUndo->setPixmap(image1); + Group1Spin->buttonRedo->setPixmap(image2); + + Group2Spin = new EntityGUI_2Spin(this, "Group2Spin"); + Group2Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES")); + Group2Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + Group2Spin->buttonUndo->setPixmap(image1); + Group2Spin->buttonRedo->setPixmap(image2); + + Group3Spin = new EntityGUI_3Spin(this, "Group3Spin"); + Group3Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES")); + Group3Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + Group3Spin->buttonUndo->setPixmap(image1); + Group3Spin->buttonRedo->setPixmap(image2); + + Group4Spin = new EntityGUI_4Spin(this, "Group4Spin"); + Group4Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES")); + Group4Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY")); + Group4Spin->buttonUndo->setPixmap(image1); + Group4Spin->buttonRedo->setPixmap(image2); + + Layout5->addMultiCellWidget(GroupPt, 1, 1, 0, 1); + Layout5->addWidget(GroupD1, 1, 0); + Layout5->addWidget(GroupD2, 1, 1); + + Layout1->addWidget(Group1Sel, 2, 0); + Layout1->addWidget(Group1Spin, 2, 0); + Layout1->addWidget(Group2Spin, 2, 0); + Layout1->addWidget(Group3Spin, 2, 0); + Layout1->addWidget(Group4Spin, 2, 0); + /***************************************************************/ + + /* signals and slots connections */ + connect(buttonEnd, SIGNAL(clicked()), this, SLOT(ClickOnEnd())); + connect(buttonClose, SIGNAL(clicked()), this, SLOT(ClickOnEnd())); + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + + connect(Group1Sel->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(Group1Sel->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(Group1Sel->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())); + connect(Group1Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(Group1Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(Group1Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())); + connect(Group2Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(Group2Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(Group2Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())); + connect(Group3Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(Group3Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(Group3Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())); + connect(Group4Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(Group4Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo())); + connect(Group4Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo())); + + connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(TypeClicked(int))); + connect(GroupDest1, SIGNAL(clicked(int)), this, SLOT(DestClicked(int))); + connect(GroupPt->GroupPoint, SIGNAL(clicked(int)), this, SLOT(PointClicked(int))); + connect(GroupD1->GroupDir1, SIGNAL(clicked(int)), this, SLOT(Dir1Clicked(int))); + connect(GroupD2->GroupDir2, SIGNAL(clicked(int)), this, SLOT(Dir2Clicked(int))); + + connect(Group1Sel->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1Sel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group1Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group2Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group2Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group3Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group3Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group3Spin->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group4Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group4Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group4Spin->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group4Spin->SpinBox_DS, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group1Spin->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2Spin->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2Spin->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DZ, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DZ, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DS, SLOT(SetStep(double))); + + connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + + Init(); +} + + +//================================================================================= +// function : ~EntityGUI_SketcherDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +EntityGUI_SketcherDlg::~EntityGUI_SketcherDlg() +{ + myGeometryGUI->SetActiveDialogBox( 0 ); +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = Group1Sel->LineEdit1; + myCommand.append( "Sketcher" ); + myUndoCommand.append( "Sketcher" ); + + mySketchState = FIRST_POINT; + globalSelection( GEOM_POINT ); + + myLastX1 = 0.0; + myLastY1 = 0.0; + myLastX2 = 0.0; + myLastY2 = 0.0; + + /* Get setting of step value from file configuration */ + double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 ); + + /* min, max, step and decimals for spin boxes */ + Group1Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group2Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group3Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group3Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group3Spin->SpinBox_DZ->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group4Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 0.1, 3); + Group4Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 0.1, 3); + Group4Spin->SpinBox_DZ->RangeStepAndValidator(-999999.999, 999999.999, step, 3); + Group4Spin->SpinBox_DS->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + + /* displays Dialog */ + GroupConstructors->setEnabled(false); + GroupDest1->setEnabled(false); + setEnabledUndo(false); + setEnabledRedo(false); + + RadioButton1->setChecked(true); + + resize( 0, 0 ); + TypeClicked(0); + + GEOMBase_Helper::displayPreview(); +} + + +//================================================================================= +// function : InitClick() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::InitClick() +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + Group1Sel->hide(); + Group1Spin->hide(); + Group2Spin->hide(); + Group3Spin->hide(); + Group4Spin->hide(); + + resize(0, 0); +} + + +//================================================================================= +// function : TypeClicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_SketcherDlg::TypeClicked(int constructorId) +{ + myConstructorId = constructorId; + if ( myConstructorId == 0 ) // SEGMENT + { + GroupD2->setEnabled(true); + RB_Dest1->setEnabled(true); + RB_Dest1->setChecked(true); + DestClicked(1); + } + else if ( myConstructorId == 1 ) // ARC + { + GroupD2->setEnabled(false); + RB_Dest1->setEnabled(false); + RB_Dest2->setChecked(true); + DestClicked(0); + } +} + + +//================================================================================= +// function : DestClicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_SketcherDlg::DestClicked( int constructorId ) +{ + GroupPt->hide(); + GroupD1->hide(); + GroupD2->hide(); + + if ( constructorId == 1 ) + { // Point + GroupPt->RB_Point1->setChecked(true); + GroupPt->show(); + PointClicked(1); // XY + } + else if ( constructorId == 0 ) + { // Direction + GroupD1->RB_Dir11->setChecked(true); + GroupD1->show(); + GroupD2->show(); + Dir1Clicked(2); // Angle + } +} + + +//================================================================================= +// function : PointClicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_SketcherDlg::PointClicked(int constructorId) +{ + InitClick(); + + if ( myConstructorId == 0 ) + { // SEGMENT + if ( constructorId == 1 ) + { // XY + mySketchType = PT_ABS; + Group2Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X2")); + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y2")); + myX = 0.0; + Group2Spin->SpinBox_DX->SetValue(myX); + myY = 0.0; + Group2Spin->SpinBox_DY->SetValue(myY); + Group2Spin->show(); + Group2Spin->buttonApply->setFocus(); + + GEOMBase_Helper::displayPreview(); + } + else if ( constructorId == 0 ) + { // DXDY + mySketchType = PT_RELATIVE; + Group2Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_DX2")); + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_DY2")); + myDX = 0.0; + Group2Spin->SpinBox_DX->SetValue(myDX); + myDY = 0.0; + Group2Spin->SpinBox_DY->SetValue(myDY); + Group2Spin->show(); + Group2Spin->buttonApply->setFocus(); + + GEOMBase_Helper::displayPreview(); + } + else if ( constructorId == 2 ) + { // Selection + mySketchType = PT_SEL; + myEditCurrentArgument = Group1Sel->LineEdit1; + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + Group1Sel->show(); + Group1Sel->buttonApply->setFocus(); + SelectionIntoArgument(); + } + } +} + + +//================================================================================= +// function : Dir1Clicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_SketcherDlg::Dir1Clicked(int constructorId) +{ + myConstructorDirId = constructorId; + GroupD2->RB_Dir21->setChecked(true); + Dir2Clicked(2); +} + + +//================================================================================= +// function : Dir2Clicked() +// purpose : Radio button management +//================================================================================= +void EntityGUI_SketcherDlg::Dir2Clicked(int constructorId) +{ + InitClick(); + myAngle = 0.0; + + if ( myConstructorId == 0 ) + { // SEGMENT + myX = 0.0; + myY = 0.0; + myLength = 100.0; + if ( myConstructorDirId == 2 ) + { // Angle + Group2Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_ANGLE2")); + Group2Spin->SpinBox_DX->SetValue(myAngle); + Group2Spin->buttonApply->setFocus(); + Group2Spin->show(); + + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_ANGLE_LENGTH; + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_LENGTH2")); + Group2Spin->SpinBox_DY->SetValue(myLength); + } + else if ( constructorId == 0 ) + { // X + mySketchType = DIR_ANGLE_X; + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_X3")); + Group2Spin->SpinBox_DY->SetValue(myX); + } + else if ( constructorId == 1 ) + { // Y + mySketchType = DIR_ANGLE_Y; + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y3")); + Group2Spin->SpinBox_DY->SetValue(myY); + } + } + else if ( myConstructorDirId == 0 ) + { // Perpendicular + Group1Spin->show(); + Group1Spin->buttonApply->setFocus(); + + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_PER_LENGTH; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2")); + Group1Spin->SpinBox_DX->SetValue(myLength); + } + else if ( constructorId == 0 ) + { // X + mySketchType = DIR_PER_X; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3")); + Group1Spin->SpinBox_DX->SetValue(myX); + } + else if ( constructorId == 1 ) + { // Y + mySketchType = DIR_PER_Y; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3")); + Group1Spin->SpinBox_DX->SetValue(myY); + } + } + else if ( myConstructorDirId == 1 ) + { // Tangent + Group1Spin->show(); + Group1Spin->buttonApply->setFocus(); + + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_TAN_LENGTH; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2")); + Group1Spin->SpinBox_DX->SetValue(myLength); + } + else if ( constructorId == 0 ) + { // X + mySketchType = DIR_TAN_X; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3")); + Group1Spin->SpinBox_DX->SetValue(myX); + } + else if ( constructorId == 1 ) + { // Y + mySketchType = DIR_TAN_Y; + Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3")); + Group1Spin->SpinBox_DX->SetValue(myY); + } + } + else if ( myConstructorDirId == 3 ) + { // DXDY + Group3Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 0.1, 3); + Group3Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 0.1, 3); + Group3Spin->SpinBox_DZ->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_VX2")); + Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_VY2")); + myDX = 0.0; + Group3Spin->SpinBox_DX->SetValue(myDX); + myDY = 0.0; + Group3Spin->SpinBox_DY->SetValue(myDY); + Group3Spin->show(); + Group3Spin->buttonApply->setFocus(); + + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_DXDY_LENGTH; + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_LENGTH2")); + Group3Spin->SpinBox_DZ->SetValue(myLength); + } + else if ( constructorId == 0 ) + { // X + mySketchType = DIR_DXDY_X; + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_X3")); + Group3Spin->SpinBox_DZ->SetValue(myX); + } + else if ( constructorId == 1 ) + { // Y + mySketchType = DIR_DXDY_Y; + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_Y3")); + Group3Spin->SpinBox_DZ->SetValue(myY); + } + } + } + else if ( myConstructorId == 1 ) + { // ARC + if ( myConstructorDirId == 2 ) + { // Angle + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_ANGLE_LENGTH; + Group3Spin->SpinBox_DX->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + Group3Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group3Spin->SpinBox_DZ->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_ANGLE2")); + Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_RADIUS2")); + Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_ANGLE2")); + Group3Spin->SpinBox_DX->SetValue(myAngle); + myRadius = 100.0; + Group3Spin->SpinBox_DY->SetValue(myRadius); + myLength = 30.0; + Group3Spin->SpinBox_DZ->SetValue(myLength); + Group3Spin->show(); + Group3Spin->buttonApply->setFocus(); + } + } + else if ( myConstructorDirId == 0 ) + { // Perpendicular + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_PER_LENGTH; + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_RADIUS2")); + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_ANGLE2")); + myRadius = 100.0; + Group2Spin->SpinBox_DX->SetValue(myRadius); + myLength = 30.0; + Group2Spin->SpinBox_DY->SetValue(myLength); + Group2Spin->show(); + Group2Spin->buttonApply->setFocus(); + } + } + else if ( myConstructorDirId == 1 ) + { // Tangent + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_TAN_LENGTH; + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 100., 3); + Group2Spin->SpinBox_DY->RangeStepAndValidator(-999999.999, 999999.999, 5., 3); + Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_RADIUS2")); + Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_ANGLE2")); + myRadius = 100.0; + Group2Spin->SpinBox_DX->SetValue(myRadius); + myLength = 30.0; + Group2Spin->SpinBox_DY->SetValue(myLength); + Group2Spin->show(); + Group2Spin->buttonApply->setFocus(); + } + } + else if ( myConstructorDirId == 3 ) + { // DXDY + if ( constructorId == 2 ) + { // Length + mySketchType = DIR_DXDY_LENGTH; + Group4Spin->TextLabel1->setText(tr("GEOM_SKETCHER_VX2")); + Group4Spin->TextLabel2->setText(tr("GEOM_SKETCHER_VY2")); + Group4Spin->TextLabel3->setText(tr("GEOM_SKETCHER_RADIUS2")); + Group4Spin->TextLabel4->setText(tr("GEOM_SKETCHER_ANGLE2")); + myDX = 0.0; + Group4Spin->SpinBox_DX->SetValue(myDX); + myDY = 0.0; + Group4Spin->SpinBox_DY->SetValue(myDY); + myRadius = 100.0; + Group4Spin->SpinBox_DZ->SetValue(myRadius); + myLength = 30.0; + Group4Spin->SpinBox_DS->SetValue(myLength); + Group4Spin->show(); + Group4Spin->buttonApply->setFocus(); + } + } + } + + GEOMBase_Helper::displayPreview(); +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::ClickOnCancel() +{ + close(); +} + + +//================================================================================= +// function : ClickOnEnd() +// purpose : connected to buttonEnd AND buttonClose +//================================================================================= +void EntityGUI_SketcherDlg::ClickOnEnd() +{ + if ( sender() == buttonClose ) + { + // Verify validity of commands + if ( myCommand.count() <= 2 ) + { + SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(), + tr( "GEOM_ERROR_STATUS" ), tr( "CANNOT_CLOSE" ), tr( "BUT_OK" ) ); + return; + } + + QString Command = myCommand.join( "" ) + GetNewCommand(); + Sketcher_Profile aProfile (Command.ascii()); + + Command = myCommand.join( "" ); + aProfile = Sketcher_Profile(Command.ascii()); + TopoDS_Shape myShape; + if ( aProfile.IsDone() ) + myShape = aProfile.GetShape(); + + if(myShape.ShapeType() != TopAbs_VERTEX) + myCommand.append( ":WW" ); + } + else + myIsAllAdded = true; + + if( myCommand.size() > 2 ) + if( !onAccept() ) + return; + + close(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool EntityGUI_SketcherDlg::ClickOnApply() +{ + myCommand.append( GetNewCommand() ); + mySketchState = NEXT_POINT; + + myUndoCommand.clear(); + myUndoCommand.append( "Sketcher" ); + + GroupConstructors->setEnabled(true); + GroupDest1->setEnabled(true); + setEnabledUndo(true); + setEnabledRedo(false); + + GEOMBase_Helper::displayPreview(); + + return true; +} + +//================================================================================= +// function : ClickOnUndo() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::ClickOnUndo() +{ + myUndoCommand.append( myCommand.last() ); + myCommand.pop_back(); + + if(myCommand.count() == 1) { + mySketchState = FIRST_POINT; + + RadioButton1->setChecked(true); + TypeClicked(0); + + GroupConstructors->setEnabled(false); + GroupDest1->setEnabled(false); + setEnabledUndo(false); + } + + setEnabledRedo(true); + + GEOMBase_Helper::displayPreview(); +} + +//================================================================================= +// function : ClickOnRedo() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::ClickOnRedo() +{ + myCommand.append( myUndoCommand.last() ); + myUndoCommand.pop_back(); + + mySketchState = NEXT_POINT; + + GroupConstructors->setEnabled(true); + GroupDest1->setEnabled(true); + setEnabledUndo(true); + + if(myUndoCommand.count() == 1) + setEnabledRedo(false); + + GEOMBase_Helper::displayPreview(); +} + +//================================================================================= +// function : setEnabledUndo() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::setEnabledUndo(bool value) +{ + Group1Sel->buttonUndo->setEnabled(value); + Group1Spin->buttonUndo->setEnabled(value); + Group2Spin->buttonUndo->setEnabled(value); + Group3Spin->buttonUndo->setEnabled(value); + Group4Spin->buttonUndo->setEnabled(value); +} + +//================================================================================= +// function : setEnabledRedo() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::setEnabledRedo(bool value) +{ + Group1Sel->buttonRedo->setEnabled(value); + Group1Spin->buttonRedo->setEnabled(value); + Group2Spin->buttonRedo->setEnabled(value); + Group3Spin->buttonRedo->setEnabled(value); + Group4Spin->buttonRedo->setEnabled(value); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed +//================================================================================= +void EntityGUI_SketcherDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + myX = myLastX1; + myY = myLastY1; + + int nbSel = IObjectCount(); + if ( nbSel == 1 && myEditCurrentArgument == Group1Sel->LineEdit1 ) + { + Standard_Boolean aRes = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes ) { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_VERTEX ) ) { + gp_Trsf aTrans; + gp_Ax3 aWPlane = myGeometryGUI->GetWorkingPlane(); + + aTrans.SetTransformation(aWPlane); + BRepBuilderAPI_Transform aTransformation(aShape, aTrans, Standard_False); + aShape = aTransformation.Shape(); + + gp_Pnt aPnt; + if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) { + myX = aPnt.X(); + myY = aPnt.Y(); + Group1Sel->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) ); + } + } + } + } + + GEOMBase_Helper::displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::SetEditCurrentArgument() +{ + if ( sender() == Group1Sel->PushButton1 ) + { + myEditCurrentArgument = Group1Sel->LineEdit1; + myEditCurrentArgument->setFocus(); + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::LineEditReturnPressed() +{ + if ( sender() == Group1Sel->LineEdit1 ) + { + myEditCurrentArgument = Group1Sel->LineEdit1; + + /* User name of object input management */ + /* If successfull the selection is changed and signal emitted... */ + /* so SelectionIntoArgument() is automatically called. */ + const QString objectUserName = myEditCurrentArgument->text(); + QWidget* thisWidget = (QWidget*)this; + if(GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, selectedIO())) + myEditCurrentArgument->setText(objectUserName); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::DeactivateActiveDialog() +{ + //myGeometryGUI->SetState( -1 ); + + setEnabled( false ); + globalSelection(); + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + myGeometryGUI->SetActiveDialogBox(0); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::ActivateThisDialog() +{ + myGeometryGUI->EmitSignalDeactivateDialog(); + setEnabled(true); + myGeometryGUI->SetActiveDialogBox((QDialog*)this); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + //myGeometryGUI->SetState( 0 ); + globalSelection( GEOM_POINT ); + + myEditCurrentArgument = Group1Sel->LineEdit1; + myEditCurrentArgument->setFocus(); + + GEOMBase_Helper::displayPreview(); +} + + +//================================================================================= +// function : enterEvent [REDEFINED] +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::closeEvent(QCloseEvent* e) +{ + //myGeometryGUI->SetState( -1 ); + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + QDialog::closeEvent( e ); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void EntityGUI_SketcherDlg::ValueChangedInSpinBox(double newValue) +{ + QObject* send = (QObject*)sender(); + Standard_Real vx, vy, vz, vs; + vx = vy = vz = vs = 0.0; + + if ( send == Group1Spin->SpinBox_DX) + { + vx = newValue; + } + else if ( send == Group2Spin->SpinBox_DX ) + { + vx = newValue; + vy = Group2Spin->SpinBox_DY->GetValue(); + } + else if ( send == Group2Spin->SpinBox_DY) + { + vx = Group2Spin->SpinBox_DX->GetValue(); + vy = newValue; + } + else if ( send == Group3Spin->SpinBox_DX) + { + vx = newValue; + vy = Group3Spin->SpinBox_DY->GetValue(); + vz = Group3Spin->SpinBox_DZ->GetValue(); + } + else if ( send == Group3Spin->SpinBox_DY) + { + vx = Group3Spin->SpinBox_DX->GetValue(); + vy = newValue; + vz = Group3Spin->SpinBox_DZ->GetValue(); + } + else if ( send == Group3Spin->SpinBox_DZ) + { + vx = Group3Spin->SpinBox_DX->GetValue(); + vy = Group3Spin->SpinBox_DY->GetValue(); + vz = newValue; + } + else if ( send == Group4Spin->SpinBox_DX) + { + vx = newValue; + vy = Group4Spin->SpinBox_DY->GetValue(); + vz = Group4Spin->SpinBox_DZ->GetValue(); + vs = Group4Spin->SpinBox_DS->GetValue(); + } + else if ( send == Group4Spin->SpinBox_DY) + { + vx = Group4Spin->SpinBox_DX->GetValue(); + vy = newValue; + vz = Group4Spin->SpinBox_DZ->GetValue(); + vs = Group4Spin->SpinBox_DS->GetValue(); + } + else if ( send == Group4Spin->SpinBox_DZ) + { + vx = Group4Spin->SpinBox_DX->GetValue(); + vy = Group4Spin->SpinBox_DY->GetValue(); + vz = newValue; + vs = Group4Spin->SpinBox_DS->GetValue(); + } + else if ( send == Group4Spin->SpinBox_DS) + { + vx = Group4Spin->SpinBox_DX->GetValue(); + vy = Group4Spin->SpinBox_DY->GetValue(); + vz = Group4Spin->SpinBox_DZ->GetValue(); + vs = newValue; + } + + if ( myConstructorId == 0 ) + { // SEGMENT + if ( mySketchType == PT_ABS) + { + myX = vx; + myY = vy; + } + else if ( mySketchType == PT_RELATIVE) + { + myDX = vx; + myDY = vy; + } + else if ( mySketchType == DIR_ANGLE_LENGTH) + { + myAngle = vx; + myLength = vy; + } + else if ( mySketchType == DIR_ANGLE_X) + { + myAngle = vx; + myX = vy; + } + else if ( mySketchType == DIR_ANGLE_Y) + { + myAngle = vx; + myY = vy; + } + else if ( mySketchType == DIR_PER_LENGTH) + { + myLength = vx; + } + else if ( mySketchType == DIR_PER_X) + { + myX = vx; + } + else if ( mySketchType == DIR_PER_Y) + { + myY = vx; + } + else if ( mySketchType == DIR_TAN_LENGTH) + { + myLength = vx; + } + else if ( mySketchType == DIR_TAN_X) + { + myX = vx; + } + else if ( mySketchType == DIR_TAN_Y) + { + myY = vx; + } + else if ( mySketchType == DIR_DXDY_LENGTH) + { + myDX = vx; + myDY = vy; + myLength = vz; + } + else if ( mySketchType == DIR_DXDY_X) + { + myDX = vx; + myDY = vy; + myX = vz; + } + else if ( mySketchType == DIR_DXDY_Y) + { + myDX = vx; + myDY = vy; + myY = vz; + } + } + else if ( myConstructorId == 1 ) + { // ARC + if ( mySketchType == DIR_ANGLE_LENGTH) + { + myAngle = vx; + myRadius = vy; + myLength = vz; + } + else if ( mySketchType == DIR_PER_LENGTH) + { + myRadius = vx; + myLength = vy; + } + else if ( mySketchType == DIR_TAN_LENGTH) + { + myRadius = vx; + myLength = vy; + } + else if ( mySketchType == DIR_DXDY_LENGTH) + { + myDX = vx; + myDY = vy; + myRadius = vz; + myLength = vs; + } + } + + GEOMBase_Helper::displayPreview(); +} + + +//================================================================================= +// function : GetNewCommand() +// purpose : Build the new command with context +//================================================================================= +QString EntityGUI_SketcherDlg::GetNewCommand() +{ + QString myNewCommand = ":"; + if ( mySketchState == FIRST_POINT ) { + if ( mySketchType == PT_ABS || mySketchType == PT_SEL) + myNewCommand = myNewCommand + "F " + QString::number(myX) + " " + QString::number(myY); + if ( mySketchType == PT_RELATIVE) + myNewCommand = myNewCommand + "F " + QString::number(myDX) + " " + QString::number(myDY); + return myNewCommand; + } + + if ( myConstructorId == 0 ) + { // SEGMENT + if ( mySketchType == PT_ABS || mySketchType == PT_SEL) + myNewCommand = myNewCommand + "TT " + QString::number(myX) + " " + QString::number(myY); + if ( mySketchType == PT_RELATIVE) + myNewCommand = myNewCommand + "T " + QString::number(myDX) + " " + QString::number(myDY); + if ( mySketchType == DIR_ANGLE_LENGTH) + { + myNewCommand = myNewCommand + "R " + QString::number(myAngle); + myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength); + } + if ( mySketchType == DIR_ANGLE_X) + { + myNewCommand = myNewCommand + "R " + QString::number(myAngle); + myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX); + } + if ( mySketchType == DIR_ANGLE_Y) + { + myNewCommand = myNewCommand + "R " + QString::number(myAngle); + myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY); + } + if ( mySketchType == DIR_PER_LENGTH) + { + myNewCommand = myNewCommand + "R " + QString::number(90.0); + myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength); + } + if ( mySketchType == DIR_PER_X) + { + myNewCommand = myNewCommand + "R " + QString::number(90.0); + myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX); + } + if ( mySketchType == DIR_PER_Y) + { + myNewCommand = myNewCommand + "R " + QString::number(90.0); + myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY); + } + if ( mySketchType == DIR_TAN_LENGTH) + myNewCommand = myNewCommand + "L " + QString::number(myLength); + if ( mySketchType == DIR_TAN_X) + myNewCommand = myNewCommand + "IX " + QString::number(myX); + if ( mySketchType == DIR_TAN_Y) + myNewCommand = myNewCommand + "IY " + QString::number(myY); + if ( mySketchType == DIR_DXDY_LENGTH) + { + myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY); + myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength); + } + if ( mySketchType == DIR_DXDY_X) + { + myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY); + myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX); + } + if ( mySketchType == DIR_DXDY_Y) + { + myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY); + myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY); + } + } + else if ( myConstructorId == 1 ) + { // ARC + if ( mySketchType == DIR_ANGLE_LENGTH) + { + myNewCommand = myNewCommand + "R " + QString::number(myAngle); + myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength); + } + if ( mySketchType == DIR_PER_LENGTH) + { + myNewCommand = myNewCommand + "R " + QString::number(90.0); + myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength); + } + if ( mySketchType == DIR_TAN_LENGTH) + { + myNewCommand = myNewCommand + "C " + QString::number(myRadius) + " " + QString::number(myLength); + } + if ( mySketchType == DIR_DXDY_LENGTH) + { + myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY); + myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength); + } + } + return myNewCommand; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr EntityGUI_SketcherDlg::createOperation() +{ + return getGeomEngine()->GetICurvesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool EntityGUI_SketcherDlg::isValid( QString& msg ) +{ + return true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool EntityGUI_SketcherDlg::execute( ObjectList& objects ) +{ + if(mySketchState == FIRST_POINT) { + myLastX2 = myX; + myLastY2 = myY; + } + else { + //Test if the current point is the same as the last one + TopoDS_Shape myShape1, myShape2; + + //Last Shape + QString Command1 = myCommand.join( "" ); + Sketcher_Profile aProfile1 (Command1.ascii()); + if(aProfile1.IsDone()) + myShape1 = aProfile1.GetShape(); + + //Current Shape + QString Command2 = Command1 + GetNewCommand(); + Sketcher_Profile aProfile2 (Command2.ascii()); + if(aProfile2.IsDone()) + myShape2 = aProfile2.GetShape(); + + if(myShape2.IsNull()) { + //the current point is the same as the last one + myLastX2 = myLastX1; + myLastY2 = myLastY1; + } + else { + TopoDS_Vertex V1, V2; + gp_Pnt pt; + if(myShape1.ShapeType() == TopAbs_VERTEX) { + //the last shape is the first point + pt = BRep_Tool::Pnt(TopoDS::Vertex(myShape1)); + myLastX1 = pt.X(); + myLastY1 = pt.Y(); + } + else { + TopExp::Vertices(TopoDS::Wire(myShape1), V1, V2); + pt = BRep_Tool::Pnt(V2); + myLastX1 = pt.X(); + myLastY1 = pt.Y(); + } + TopExp::Vertices(TopoDS::Wire(myShape2), V1, V2); + pt = BRep_Tool::Pnt(V2); + myLastX2 = pt.X(); + myLastY2 = pt.Y(); + } + } + + QString cmd; + if( ( mySketchState != FIRST_POINT && myLastX1 == myLastX2 && myLastY1 == myLastY2 ) || myIsAllAdded ) { + cmd = myCommand.join( "" ); + + if ( Group1Sel->isVisible() ) { + Group1Sel->buttonApply->setEnabled(false); + Group1Sel->buttonApply->setFocus(); + } + if ( Group1Spin->isVisible() ) { + Group1Spin->buttonApply->setEnabled(false); + Group1Spin->buttonApply->setFocus(); + } + if ( Group2Spin->isVisible() ) { + Group2Spin->buttonApply->setEnabled(false); + Group2Spin->buttonApply->setFocus(); + } + if ( Group3Spin->isVisible() ) { + Group3Spin->buttonApply->setEnabled(false); + Group3Spin->buttonApply->setFocus(); + } + if ( Group4Spin->isVisible() ) { + Group4Spin->buttonApply->setEnabled(false); + Group4Spin->buttonApply->setFocus(); + } + } + else { + cmd = myCommand.join( "" ) + GetNewCommand(); + + if ( Group1Sel->isVisible() ) { + Group1Sel->buttonApply->setEnabled(true); + Group1Sel->buttonApply->setFocus(); + } + if ( Group1Spin->isVisible() ) { + Group1Spin->buttonApply->setEnabled(true); + Group1Spin->buttonApply->setFocus(); + } + if ( Group2Spin->isVisible() ) { + Group2Spin->buttonApply->setEnabled(true); + Group2Spin->buttonApply->setFocus(); + } + if ( Group3Spin->isVisible() ) { + Group3Spin->buttonApply->setEnabled(true); + Group3Spin->buttonApply->setFocus(); + } + if ( Group4Spin->isVisible() ) { + Group4Spin->buttonApply->setEnabled(true); + Group4Spin->buttonApply->setFocus(); + } + } + + gp_Ax3 myWPlane = myGeometryGUI->GetWorkingPlane(); + GEOM::ListOfDouble_var WPlane = new GEOM::ListOfDouble; + WPlane->length(9); + WPlane[0] = myWPlane.Location().X(); + WPlane[1] = myWPlane.Location().Y(); + WPlane[2] = myWPlane.Location().Z(); + + WPlane[3] = myWPlane.Direction().X(); + WPlane[4] = myWPlane.Direction().Y(); + WPlane[5] = myWPlane.Direction().Z(); + + WPlane[6] = myWPlane.XDirection().X(); + WPlane[7] = myWPlane.XDirection().Y(); + WPlane[8] = myWPlane.XDirection().Z(); + + GEOM::GEOM_Object_var anObj = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeSketcher( cmd.latin1(), WPlane ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview of resulting shape +// Redefined from GEOMBase_Helper. +//================================================================ +void EntityGUI_SketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object, + const bool append, + const bool activate, + const bool update, + const double lineWidth ) +{ + // Set color for preview shape + getDisplayer()->SetColor( Quantity_NOC_RED ); + + // set width of displayed shape + getDisplayer()->SetWidth( lineWidth ); + + // Disable activation of selection + getDisplayer()->SetToActivate( activate ); + + // Make a reference to GEOM_Object + getDisplayer()->SetName( myGeometryGUI->getApp()->orb()->object_to_string( object ) ); + + // Create wire from applayed object + TopoDS_Shape anApplyedWire, aLastSegment; + if ( !createShapes( object, anApplyedWire, aLastSegment ) ) + return; + + // Build prs + SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire ); + if ( aPrs != 0 && !aPrs->IsNull() ) + GEOMBase_Helper::displayPreview( aPrs, append, update ); + + getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + aPrs = getDisplayer()->BuildPrs( aLastSegment ); + if ( aPrs != 0 && !aPrs->IsNull() ) + GEOMBase_Helper::displayPreview( aPrs, append, update ); + + getDisplayer()->UnsetName(); + + // Enable activation of displayed objects + getDisplayer()->SetToActivate( true ); +} + +//================================================================ +// Function : createShapes +// Purpose : Create applyed wire, and last segment from entry object +//================================================================ +bool EntityGUI_SketcherDlg::createShapes( GEOM::GEOM_Object_ptr theObject, + TopoDS_Shape& theApplyedWire, + TopoDS_Shape& theLastSegment ) +{ + TopoDS_Shape aShape; + if ( !GEOMBase::GetShape( theObject, aShape ) || + aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX ) + return false; + + if ( Group1Sel->isVisible() && !Group1Sel->buttonApply->isEnabled() || + Group1Spin->isVisible() && !Group1Spin->buttonApply->isEnabled() || + Group2Spin->isVisible() && !Group2Spin->buttonApply->isEnabled() || + Group3Spin->isVisible() && !Group3Spin->buttonApply->isEnabled() || + Group4Spin->isVisible() && !Group4Spin->buttonApply->isEnabled() ) + { + theApplyedWire = aShape; + return true; + } + + BRepBuilderAPI_MakeWire aBuilder; + TopExp_Explorer anExp( aShape, TopAbs_EDGE ); + while( 1 ) + { + TopoDS_Shape anEdge = anExp.Current(); + anExp.Next(); + if ( anExp.More() ) // i.e. non-last edge + aBuilder.Add( TopoDS::Edge( anEdge ) ); + else + { + theLastSegment = anEdge; + break; + } + } + + if ( aBuilder.IsDone() ) + theApplyedWire = aBuilder.Shape(); + + return true; +} + + + + + + + + diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx new file mode 100644 index 000000000..27c0b6c87 --- /dev/null +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -0,0 +1,596 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : EntityGUI_SubShapeDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "EntityGUI_SubShapeDlg.h" +#include "GEOM_Displayer.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "OCCViewer_ViewModel.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include +#include +#include +#include + +#include +#include +#include + +//================================================================================= +// class : EntityGUI_SubShapeDlg +// purpose : Constructs a EntityGUI_SubShapeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, fl) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SUBSHAPE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SUBSHAPE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SUB_SHAPE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel1Check1List_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + GroupPoints->TextLabel2->setText(tr("GEOM_SUBSHAPE_TYPE")); + GroupPoints->CheckButton1->setText(tr("GEOM_SUBSHAPE_SELECT")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 1, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~EntityGUI_SubShapeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +EntityGUI_SubShapeDlg::~EntityGUI_SubShapeDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + myObject = GEOM::GEOM_Object::_nil(); + + myWithShape = true; + + /* type for sub shape selection */ + GroupPoints->ComboBox1->insertItem("Compound"); + GroupPoints->ComboBox1->insertItem("Compsolid"); + GroupPoints->ComboBox1->insertItem("Solid"); + GroupPoints->ComboBox1->insertItem("Shell"); + GroupPoints->ComboBox1->insertItem("Face"); + GroupPoints->ComboBox1->insertItem("Wire"); + GroupPoints->ComboBox1->insertItem("Edge"); + GroupPoints->ComboBox1->insertItem("Vertex"); + GroupPoints->ComboBox1->insertItem("Shape"); + + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type()) + GroupPoints->CheckButton1->setEnabled(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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged())); + connect(GroupPoints->CheckButton1, SIGNAL(stateChanged(int)), this, SLOT(SubShapeToggled())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + updateButtonState(); + + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::ClickOnApply() +{ + SUIT_Session::session()->activeApplication()->putInfo(tr("")); + + /* Explode all sub shapes */ + if( isAllSubShapes() ) { + /* More than 30 subshapes : ask confirmation */ + unsigned int nb = NumberOfSubShapes(myShape, shapeType()); + if(nb > 30) { + const QString caption = tr("GEOM_CONFIRM"); + const QString text = tr("GEOM_CONFIRM_INFO").arg(nb); + const QString button0 = tr("GEOM_BUT_EXPLODE"); + const QString button1 = tr("GEOM_BUT_CANCEL"); + + if(QMessageBox::warning(this, caption, text, button0, button1) != 0) + return false; /* aborted */ + } + } + + return onAccept(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void EntityGUI_SubShapeDlg::SelectionIntoArgument() +{ + if ( !isAllSubShapes() ) + return; + + ResetStateOfDialog(); + + QString aString = ""; /* name of selection */ + + int nbSel = GEOMBase::GetNameOfSelectedIObjects( selectedIO(), aString, true ); + if( nbSel != 1 ) + return; + + TopoDS_Shape S; + Handle(SALOME_InteractiveObject) IO = firstIObject(); + if ( !IO->hasEntry() ) + { + SUIT_Session::session()->activeApplication()->putInfo( tr( "GEOM_PRP_SHAPE_IN_STUDY" ) ); + updateButtonState(); + return; + } + + if ( !myGeomBase->GetTopoFromSelection( selectedIO(), S ) || + S.IsNull() || + S.ShapeType() == TopAbs_VERTEX ) + { + updateButtonState(); + return; + } + + + Standard_Boolean testResult; + myObject = GEOMBase::ConvertIOinGEOMObject( IO, testResult ); + if ( !testResult || myObject->_is_nil() ) + { + updateButtonState(); + return; + } + + myShape = S; + GroupPoints->LineEdit1->setText( aString ); + + + int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); + int count = GroupPoints->ComboBox1->count(); + + if ( myWithShape ) + count = count - 1; + + int i = 0; + // Solving PAL5590 + if ( myShape.ShapeType() == TopAbs_COMPOUND ) { + unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND); + if (nb > 0) + i++; + } + while ( i <= myShape.ShapeType()) + { + GroupPoints->ComboBox1->removeItem( 0 ); + i++; + } + + if ( myShape.ShapeType() == TopAbs_COMPOUND ) + { + if ( myWithShape == false ) + { + GroupPoints->ComboBox1->insertItem( "Shape" ); + myWithShape = true; + } + } + else + { + if ( myWithShape == true ) + { + GroupPoints->ComboBox1->removeItem( GroupPoints->ComboBox1->count() - 1 ); + myWithShape = false; + } + } + + int count1 = GroupPoints->ComboBox1->count(); + if ( myWithShape ) + count1 = count1 - 1; + + if ( SelectedShapeType > myShape.ShapeType() ) + { + if ( SelectedShapeType == 8 ) + { + if ( myShape.ShapeType() != TopAbs_COMPOUND ) + { + GroupPoints->ComboBox1->setCurrentItem( 0 ); + ComboTextChanged(); + } + } + else + GroupPoints->ComboBox1->setCurrentItem(count1 - count + SelectedShapeType); + } + else + { + GroupPoints->ComboBox1->setCurrentItem( 0 ); + ComboTextChanged(); + } + + updateButtonState(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::SetEditCurrentArgument() +{ + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + + GroupPoints->CheckButton1->setChecked( FALSE ); + SubShapeToggled(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1) + SetEditCurrentArgument(); + else + return; + + GEOMBase_Skeleton::LineEditReturnPressed(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::DeactivateActiveDialog() +{ + if(GroupConstructors->isEnabled()) { + GEOMBase_Skeleton::DeactivateActiveDialog(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + SubShapeToggled(); + updateButtonState(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::enterEvent(QEvent* e) +{ + if(GroupConstructors->isEnabled()) + return; + ActivateThisDialog(); +} + +//================================================================================= +// function : ResetStateOfDialog() +// purpose : Completely reset the state of method including local context +//================================================================================= +void EntityGUI_SubShapeDlg::ResetStateOfDialog() +{ + myObject = GEOM::GEOM_Object::_nil(); + myShape.Nullify(); + myEditCurrentArgument->setText(""); + + int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); + int count = GroupPoints->ComboBox1->count(); + if ( myWithShape ) + count = count - 1; + + /* type for sub shape selection */ + GroupPoints->ComboBox1->clear(); + GroupPoints->ComboBox1->insertItem("Compound"); + GroupPoints->ComboBox1->insertItem("Compsolid"); + GroupPoints->ComboBox1->insertItem("Solid"); + GroupPoints->ComboBox1->insertItem("Shell"); + GroupPoints->ComboBox1->insertItem("Face"); + GroupPoints->ComboBox1->insertItem("Wire"); + GroupPoints->ComboBox1->insertItem("Edge"); + GroupPoints->ComboBox1->insertItem("Vertex"); + GroupPoints->ComboBox1->insertItem("Shape"); + + myWithShape = true; + + GroupPoints->ComboBox1->setCurrentItem( 8 - count + SelectedShapeType ); + ComboTextChanged(); + + updateButtonState(); +} + + +//================================================================================= +// function : SubShapeToggled() +// purpose : Allow user selection of all or only selected sub shapes +// : Called when 'CheckButton1' state change +//================================================================================= +void EntityGUI_SubShapeDlg::SubShapeToggled() +{ + if ( isAllSubShapes() ) + globalSelection( GEOM_ALLSHAPES ); + else + localSelection( myObject, shapeType() ); +} + + +//================================================================================= +// function : ComboTextChanged() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::ComboTextChanged() +{ + /* Select sub shapes mode not checked */ + updateButtonState(); + SubShapeToggled(); +} + + +//================================================================================= +// function : NumberOfSubShapes() +// purpose : +//================================================================================= +unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes (const TopoDS_Shape& S, + const int shapeType) const +{ + if (S.IsNull()) + return 0; + + unsigned int index = 0; + TopTools_MapOfShape M; + + if (S.ShapeType() == TopAbs_COMPOUND && + (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(shapeType) == TopAbs_COMPSOLID || + TopAbs_ShapeEnum(shapeType) == TopAbs_COMPOUND)) { + TopoDS_Iterator It (S, Standard_True, Standard_True); + for (; It.More(); It.Next()) { + if (M.Add(It.Value())) { + if (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(shapeType) == It.Value().ShapeType()) { + index++; + } + } + } + } else { + TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType)); + for (; Exp.More(); Exp.Next()) { + if (M.Add(Exp.Current())) { + index++; + } + } + } + + M.Clear(); + return index; +} + +//================================================================================= +// function : updateButtonState +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::updateButtonState() +{ + if ( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() != OCCViewer_Viewer::Type() || + myObject->_is_nil() || shapeType() == TopAbs_SHAPE || shapeType() == TopAbs_COMPOUND ) { + GroupPoints->CheckButton1->setChecked( FALSE ); + GroupPoints->CheckButton1->setEnabled( FALSE ); + } + else + GroupPoints->CheckButton1->setEnabled( TRUE ); +} + +//================================================================================= +// function : isAllSubShapes +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::isAllSubShapes() const +{ + return !GroupPoints->CheckButton1->isChecked() || !GroupPoints->CheckButton1->isEnabled(); +} + +//================================================================================= +// function : shapeType +// purpose : +//================================================================================= +int EntityGUI_SubShapeDlg::shapeType() const +{ + int type = GroupPoints->ComboBox1->currentItem(); + + if (myObject->_is_nil()) + return type; + + // Solving PAL5590 + type += myShape.ShapeType() + 1; + if (myShape.ShapeType() == TopAbs_COMPOUND && + NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) { + type--; + } + + return type; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr EntityGUI_SubShapeDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::isValid( QString& msg ) +{ + bool isOk = false; + if ( !myObject->_is_nil() ) { + if ( isAllSubShapes() ) + isOk = true; + else if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) { + TColStd_IndexedMapOfInteger aMapIndex; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), aMapIndex ); + isOk = aMapIndex.Extent() > 0; + if ( !isOk ) + msg += tr( "NO_SUBSHAPES_SELECTED" ); + } + } + } + return isOk; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::execute( ObjectList& objects ) +{ + GEOM::ListOfGO_var aList = GEOM::GEOM_IShapesOperations::_narrow( + getOperation() )->MakeExplode( myObject, shapeType(), false ); + + if ( !aList->length() ) + return false; + + // Throw away sub-shapes not selected by user if not in preview mode + // and manual selection is active + if ( !isAllSubShapes() ) + { + if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) { + TColStd_IndexedMapOfInteger aMapIndex; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), aMapIndex ); + + GEOM::GEOM_ILocalOperations_var aLocOp = + getGeomEngine()->GetILocalOperations( getStudyId() ); + + for ( int i = 0, n = aList->length(); i < n; i++ ) + if ( aMapIndex.Contains( aLocOp->GetSubShapeIndex( myObject, aList[i] ) ) ) + objects.push_back( GEOM::GEOM_Object::_duplicate( aList[i] ) ); + } + } + } + else + for ( int i = 0, n = aList->length(); i < n; i++ ) + objects.push_back( GEOM::GEOM_Object::_duplicate( aList[i] ) ); + + return objects.size(); +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// ( called with addInStudy method ) +//================================================================ +GEOM::GEOM_Object_ptr EntityGUI_SubShapeDlg::getFather( GEOM::GEOM_Object_ptr ) +{ + return myObject; +} + +const char* EntityGUI_SubShapeDlg::getNewObjectName() const +{ + return ""; +} diff --git a/src/EntityGUI/UIFiles/ui_to_cxx b/src/EntityGUI/UIFiles/ui_to_cxx new file mode 100755 index 000000000..a430c4c4b --- /dev/null +++ b/src/EntityGUI/UIFiles/ui_to_cxx @@ -0,0 +1,47 @@ +// 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/ +// +#!/bin/sh + +uic -o EntityGUI_Skeleton_QTD.h EntityGUI_Skeleton_QTD.ui +uic -o EntityGUI_Skeleton_QTD.cxx -impl EntityGUI_Skeleton_QTD.h EntityGUI_Skeleton_QTD.ui + +uic -o EntityGUI_Point_QTD.h EntityGUI_Point_QTD.ui +uic -o EntityGUI_Point_QTD.cxx -impl EntityGUI_Point_QTD.h EntityGUI_Point_QTD.ui + +uic -o EntityGUI_Dir1_QTD.h EntityGUI_Dir1_QTD.ui +uic -o EntityGUI_Dir1_QTD.cxx -impl EntityGUI_Dir1_QTD.h EntityGUI_Dir1_QTD.ui + +uic -o EntityGUI_Dir2_QTD.h EntityGUI_Dir2_QTD.ui +uic -o EntityGUI_Dir2_QTD.cxx -impl EntityGUI_Dir2_QTD.h EntityGUI_Dir2_QTD.ui + +uic -o EntityGUI_1Spin_QTD.h EntityGUI_1Spin_QTD.ui +uic -o EntityGUI_1Spin_QTD.cxx -impl EntityGUI_1Spin_QTD.h EntityGUI_1Spin_QTD.ui + +uic -o EntityGUI_2Spin_QTD.h EntityGUI_2Spin_QTD.ui +uic -o EntityGUI_2Spin_QTD.cxx -impl EntityGUI_2Spin_QTD.h EntityGUI_2Spin_QTD.ui + +uic -o EntityGUI_3Spin_QTD.h EntityGUI_3Spin_QTD.ui +uic -o EntityGUI_3Spin_QTD.cxx -impl EntityGUI_3Spin_QTD.h EntityGUI_3Spin_QTD.ui + +uic -o EntityGUI_4Spin_QTD.h EntityGUI_4Spin_QTD.ui +uic -o EntityGUI_4Spin_QTD.cxx -impl EntityGUI_4Spin_QTD.h EntityGUI_4Spin_QTD.ui + +uic -o EntityGUI_1Sel_QTD.h EntityGUI_1Sel_QTD.ui +uic -o EntityGUI_1Sel_QTD.cxx -impl EntityGUI_1Sel_QTD.h EntityGUI_1Sel_QTD.ui diff --git a/src/GEOM/GEOM_Application.cxx b/src/GEOM/GEOM_Application.cxx new file mode 100644 index 000000000..3e8c0b222 --- /dev/null +++ b/src/GEOM/GEOM_Application.cxx @@ -0,0 +1,58 @@ +// 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/ +// + +#include +#include + +//======================================================================= +//function : GEOM_Application +//purpose : +//======================================================================= + +GEOM_Application::GEOM_Application() +{ +} + + +//======================================================================= +//function : Formats +//purpose : +//======================================================================= + +void GEOM_Application::Formats(TColStd_SequenceOfExtendedString& Formats) +{ + Formats.Append(TCollection_ExtendedString ("SALOME_GEOM")); +} + + +//======================================================================= +//function : ResourcesName +//purpose : +//======================================================================= + +Standard_CString GEOM_Application::ResourcesName() +{ + return Standard_CString ("GEOMDS_Resources"); +} + + + + + diff --git a/src/GEOM/GEOM_Application.hxx b/src/GEOM/GEOM_Application.hxx new file mode 100644 index 000000000..be419c3c2 --- /dev/null +++ b/src/GEOM/GEOM_Application.hxx @@ -0,0 +1,108 @@ +// 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/ +// +// File : GEOM_Application.hxx +// Module : GEOM + +#ifndef _GEOM_Application_HeaderFile +#define _GEOM_Application_HeaderFile + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_GEOM_Application_HeaderFile +#include +#endif + +#ifndef _TDocStd_Application_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif +class TColStd_SequenceOfExtendedString; + + +class GEOM_Application : public TDocStd_Application { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } +// inline void operator delete(void *anAddress, size_t size) +// { +// if (anAddress) Standard::Free((Standard_Address&)anAddress,size); +// } + // Methods PUBLIC + // +Standard_EXPORT GEOM_Application(); +Standard_EXPORT virtual void Formats(TColStd_SequenceOfExtendedString& Formats) ; +Standard_EXPORT Standard_CString ResourcesName() ; +Standard_EXPORT ~GEOM_Application(); + + + + + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& GEOM_Application_Type_(); + 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 + // + + +}; + + + + + +// other inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOM/GEOM_Application.ixx b/src/GEOM/GEOM_Application.ixx new file mode 100644 index 000000000..557602753 --- /dev/null +++ b/src/GEOM/GEOM_Application.ixx @@ -0,0 +1,82 @@ +// 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/ +// +// File : GEOM_Application.ixx +// Module : GEOM + +#include "GEOM_Application.jxx" + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +GEOM_Application::~GEOM_Application() {} + + + +Standard_EXPORT Handle_Standard_Type& GEOM_Application_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TDocStd_Application); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TDocStd_Application); + static Handle_Standard_Type aType2 = STANDARD_TYPE(CDF_Application); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(CDF_Application); + static Handle_Standard_Type aType3 = STANDARD_TYPE(CDM_Application); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(CDM_Application); + static Handle_Standard_Type aType4 = STANDARD_TYPE(Standard_Transient); + if ( aType4.IsNull()) aType4 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,aType4,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOM_Application", + sizeof(GEOM_Application), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +// DownCast method +// allow safe downcasting + + +const Handle(GEOM_Application) Handle(GEOM_Application)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOM_Application) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOM_Application))) { + _anOtherObject = Handle(GEOM_Application)((Handle(GEOM_Application)&)AnObject); + } + } + + return _anOtherObject ; +} + + +const Handle(Standard_Type)& GEOM_Application::DynamicType() const +{ + return STANDARD_TYPE(GEOM_Application) ; +} +Standard_Boolean GEOM_Application::IsKind(const Handle(Standard_Type)& AType) const +{ + return (STANDARD_TYPE(GEOM_Application) == AType || TDocStd_Application::IsKind(AType)); +} +Handle_GEOM_Application::~Handle_GEOM_Application() {} diff --git a/src/GEOM/GEOM_Application.jxx b/src/GEOM/GEOM_Application.jxx new file mode 100644 index 000000000..c7d06c2ef --- /dev/null +++ b/src/GEOM/GEOM_Application.jxx @@ -0,0 +1,28 @@ +// 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/ +// +// File : GEOM_Application.jxx +// Module : GEOM + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _GEOM_Application_HeaderFile +#include "GEOM_Application.hxx" +#endif diff --git a/src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx b/src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx new file mode 100644 index 000000000..b0d7ed87e --- /dev/null +++ b/src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx @@ -0,0 +1,105 @@ +// 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/ +// + +#ifndef _GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_HeaderFile +#define _GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_HeaderFile + +#ifndef _TCollection_BasicMapIterator_HeaderFile +#include +#endif +#ifndef _Handle_Standard_Transient_HeaderFile +#include +#endif +#ifndef _Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif +class Standard_NoSuchObject; +class TCollection_AsciiString; +class Standard_Transient; +class GEOM_DataMapOfAsciiStringTransient; +class GEOM_DataMapNodeOfDataMapOfAsciiStringTransient; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + +class GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient : 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 GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient(); +Standard_EXPORT GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient(const GEOM_DataMapOfAsciiStringTransient& aMap); +Standard_EXPORT void Initialize(const GEOM_DataMapOfAsciiStringTransient& aMap) ; +Standard_EXPORT const TCollection_AsciiString& Key() const; +Standard_EXPORT const Handle_Standard_Transient& 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/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx b/src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx new file mode 100644 index 000000000..c27bdb66c --- /dev/null +++ b/src/GEOM/GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx @@ -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/ +// + +#include + +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _TCollection_AsciiString_HeaderFile +#include +#endif +#ifndef _Standard_Transient_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapOfAsciiStringTransient_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif + + +#define TheKey TCollection_AsciiString +#define TheKey_hxx +#define TheItem Handle_Standard_Transient +#define TheItem_hxx +#define Hasher TCollection_AsciiString +#define Hasher_hxx +#define TCollection_DataMapNode GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_Type_() GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_() +#define TCollection_DataMap GEOM_DataMapOfAsciiStringTransient +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx b/src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx new file mode 100644 index 000000000..164c30048 --- /dev/null +++ b/src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx @@ -0,0 +1,142 @@ +// 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/ +// + +#ifndef _GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#define _GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif + +#ifndef _TCollection_AsciiString_HeaderFile +#include +#endif +#ifndef _Handle_Standard_Transient_HeaderFile +#include +#endif +#ifndef _TCollection_MapNode_HeaderFile +#include +#endif +#ifndef _TCollection_MapNodePtr_HeaderFile +#include +#endif +class Standard_Transient; +class TCollection_AsciiString; +class GEOM_DataMapOfAsciiStringTransient; +class GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient; + + +class GEOM_DataMapNodeOfDataMapOfAsciiStringTransient : public TCollection_MapNode { + +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 + // +GEOM_DataMapNodeOfDataMapOfAsciiStringTransient(const TCollection_AsciiString& K,const Handle(Standard_Transient)& I,const TCollection_MapNodePtr& n); + TCollection_AsciiString& Key() const; + Handle_Standard_Transient& Value() const; +Standard_EXPORT ~GEOM_DataMapNodeOfDataMapOfAsciiStringTransient(); + + + + + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_(); + 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 + // +TCollection_AsciiString myKey; +Handle_Standard_Transient myValue; + + +}; + +#define TheKey TCollection_AsciiString +#define TheKey_hxx +#define TheItem Handle_Standard_Transient +#define TheItem_hxx +#define Hasher TCollection_AsciiString +#define Hasher_hxx +#define TCollection_DataMapNode GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_Type_() GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_() +#define TCollection_DataMap GEOM_DataMapOfAsciiStringTransient +#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/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx b/src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx new file mode 100644 index 000000000..4494e4121 --- /dev/null +++ b/src/GEOM/GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx @@ -0,0 +1,104 @@ +// 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/ +// + +#include + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_Transient_HeaderFile +#include +#endif +#ifndef _TCollection_AsciiString_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapOfAsciiStringTransient_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif +GEOM_DataMapNodeOfDataMapOfAsciiStringTransient::~GEOM_DataMapNodeOfDataMapOfAsciiStringTransient() {} + + + +Standard_EXPORT Handle_Standard_Type& GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TCollection_MapNode); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TCollection_MapNode); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOM_DataMapNodeOfDataMapOfAsciiStringTransient", + sizeof(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + + +// DownCast method +// allow safe downcasting +// +const Handle(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient) Handle(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient))) { + _anOtherObject = Handle(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient)((Handle(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient)&)AnObject); + } + } + + return _anOtherObject ; +} +const Handle(Standard_Type)& GEOM_DataMapNodeOfDataMapOfAsciiStringTransient::DynamicType() const +{ + return STANDARD_TYPE(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient) ; +} +Standard_Boolean GEOM_DataMapNodeOfDataMapOfAsciiStringTransient::IsKind(const Handle(Standard_Type)& AType) const +{ + return (STANDARD_TYPE(GEOM_DataMapNodeOfDataMapOfAsciiStringTransient) == AType || TCollection_MapNode::IsKind(AType)); +} +Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient::~Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient() {} +#define TheKey TCollection_AsciiString +#define TheKey_hxx +#define TheItem Handle_Standard_Transient +#define TheItem_hxx +#define Hasher TCollection_AsciiString +#define Hasher_hxx +#define TCollection_DataMapNode GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_Type_() GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_() +#define TCollection_DataMap GEOM_DataMapOfAsciiStringTransient +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOM/GEOM_DataMapOfAsciiStringTransient.hxx b/src/GEOM/GEOM_DataMapOfAsciiStringTransient.hxx new file mode 100644 index 000000000..007e0c365 --- /dev/null +++ b/src/GEOM/GEOM_DataMapOfAsciiStringTransient.hxx @@ -0,0 +1,137 @@ +// 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/ +// + +#ifndef _GEOM_DataMapOfAsciiStringTransient_HeaderFile +#define _GEOM_DataMapOfAsciiStringTransient_HeaderFile + +#ifndef _TCollection_BasicMap_HeaderFile +#include +#endif +#ifndef _Handle_Standard_Transient_HeaderFile +#include +#endif +#ifndef _Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _Standard_Boolean_HeaderFile +#include +#endif +class Standard_DomainError; +class Standard_NoSuchObject; +class TCollection_AsciiString; +class Standard_Transient; +class GEOM_DataMapNodeOfDataMapOfAsciiStringTransient; +class GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + +class GEOM_DataMapOfAsciiStringTransient : 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 GEOM_DataMapOfAsciiStringTransient(const Standard_Integer NbBuckets = 1); +Standard_EXPORT GEOM_DataMapOfAsciiStringTransient& Assign(const GEOM_DataMapOfAsciiStringTransient& Other) ; + GEOM_DataMapOfAsciiStringTransient& operator =(const GEOM_DataMapOfAsciiStringTransient& Other) +{ + return Assign(Other); +} + +Standard_EXPORT void ReSize(const Standard_Integer NbBuckets) ; +Standard_EXPORT void Clear() ; +~GEOM_DataMapOfAsciiStringTransient() +{ + Clear(); +} + +Standard_EXPORT Standard_Boolean Bind(const TCollection_AsciiString& K,const Handle(Standard_Transient)& I) ; +Standard_EXPORT Standard_Boolean IsBound(const TCollection_AsciiString& K) const; +Standard_EXPORT Standard_Boolean UnBind(const TCollection_AsciiString& K) ; +Standard_EXPORT const Handle_Standard_Transient& Find(const TCollection_AsciiString& K) const; + const Handle_Standard_Transient& operator()(const TCollection_AsciiString& K) const +{ + return Find(K); +} + +Standard_EXPORT Handle_Standard_Transient& ChangeFind(const TCollection_AsciiString& K) ; + Handle_Standard_Transient& operator()(const TCollection_AsciiString& K) +{ + return ChangeFind(K); +} + + + + + + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // +Standard_EXPORT GEOM_DataMapOfAsciiStringTransient(const GEOM_DataMapOfAsciiStringTransient& Other); + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOM/GEOM_DataMapOfAsciiStringTransient_0.cxx b/src/GEOM/GEOM_DataMapOfAsciiStringTransient_0.cxx new file mode 100644 index 000000000..3512cdda9 --- /dev/null +++ b/src/GEOM/GEOM_DataMapOfAsciiStringTransient_0.cxx @@ -0,0 +1,58 @@ +// 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/ +// + +#include + +#ifndef _Standard_DomainError_HeaderFile +#include +#endif +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _TCollection_AsciiString_HeaderFile +#include +#endif +#ifndef _Standard_Transient_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif +#ifndef _GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_HeaderFile +#include +#endif + + +#define TheKey TCollection_AsciiString +#define TheKey_hxx +#define TheItem Handle_Standard_Transient +#define TheItem_hxx +#define Hasher TCollection_AsciiString +#define Hasher_hxx +#define TCollection_DataMapNode GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_hxx +#define TCollection_DataMapIterator GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient +#define TCollection_DataMapIterator_hxx +#define Handle_TCollection_DataMapNode Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient +#define TCollection_DataMapNode_Type_() GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_Type_() +#define TCollection_DataMap GEOM_DataMapOfAsciiStringTransient +#define TCollection_DataMap_hxx +#include + diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx new file mode 100644 index 000000000..c6ca2f493 --- /dev/null +++ b/src/GEOM/GEOM_Engine.cxx @@ -0,0 +1,651 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include "GEOM_Engine.hxx" + +#include "GEOM_Solver.hxx" +#include "GEOM_Function.hxx" +#include "GEOM_ISubShape.hxx" +#include "GEOM_SubShapeDriver.hxx" +#include "GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx" +#include "GEOM_PythonDump.hxx" + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +static GEOM_Engine* TheEngine = NULL; + +static TCollection_AsciiString BuildIDFromObject(Handle(GEOM_Object)& theObject) +{ + TCollection_AsciiString anID(theObject->GetDocID()), anEntry; + TDF_Tool::Entry(theObject->GetEntry(), anEntry); + anID+=(TCollection_AsciiString("_")+anEntry); + return anID; +} + +static TCollection_AsciiString BuildID(Standard_Integer theDocID, char* theEntry) +{ + TCollection_AsciiString anID(theDocID); + anID+=(TCollection_AsciiString("_")+theEntry); + return anID; +} + +static Standard_Integer ExtractDocID(TCollection_AsciiString& theID) +{ + TCollection_AsciiString aDocID = theID.Token("_"); + if(aDocID.Length() < 1) return -1; + return aDocID.IntegerValue(); +} + +void ProcessFunction(Handle(GEOM_Function)& theFunction, + TCollection_AsciiString& theScript, + TColStd_MapOfTransient& theProcessed); + +Handle(TColStd_HSequenceOfInteger) FindEntries(TCollection_AsciiString& theString); + +//============================================================================= +/*! + * GetEngine + */ +//============================================================================= +GEOM_Engine* GEOM_Engine::GetEngine() { return TheEngine; } + + +//============================================================================= +/*! + * SetEngine + */ +//============================================================================= +void GEOM_Engine::SetEngine(GEOM_Engine* theEngine) { TheEngine = theEngine; } + +//============================================================================= +/*! + * Constructor + */ +//============================================================================= +GEOM_Engine::GEOM_Engine() +{ + TFunction_DriverTable::Get()->AddDriver(GEOM_Object::GetSubShapeID(), new GEOM_SubShapeDriver()); + + _OCAFApp = new GEOM_Application(); + _UndoLimit = 10; +} + +//============================================================================= +/*! + * GetDocument + */ +//============================================================================= +Handle(TDocStd_Document) GEOM_Engine::GetDocument(int theDocID) +{ + Handle(TDocStd_Document) aDoc; + if(!_mapIDDocument.IsBound(theDocID)) { + _OCAFApp->NewDocument("SALOME_GEOM", aDoc); + aDoc->SetUndoLimit(_UndoLimit); + _mapIDDocument.Bind(theDocID, aDoc); + TDataStd_Integer::Set(aDoc->Main(), theDocID); + } + + return Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID)); +} + +//============================================================================= +/*! + * GetDocID + */ +//============================================================================= +int GEOM_Engine::GetDocID(Handle(TDocStd_Document) theDocument) +{ + if(theDocument.IsNull()) return -1; + for(Interface_DataMapIteratorOfDataMapOfIntegerTransient anItr(_mapIDDocument); anItr.More(); anItr.Next()) + if(anItr.Value() == theDocument) return anItr.Key(); + + return -1; + +} + +//============================================================================= +/*! + * GetObject + */ +//============================================================================= +Handle(GEOM_Object) GEOM_Engine::GetObject(int theDocID, char* theEntry) +{ + TCollection_AsciiString anID = BuildID(theDocID, theEntry); + if(_objects.IsBound(anID)) return Handle(GEOM_Object)::DownCast(_objects(anID)); + + TDF_Label aLabel; + Handle(TDocStd_Document) aDoc = GetDocument(theDocID); + TDF_Tool::Label(aDoc->Main().Data(), theEntry, aLabel, Standard_True); + Handle(GEOM_Object) anObject = new GEOM_Object(aLabel); + + _objects.Bind(anID, anObject); + + return anObject; +} + +//============================================================================= +/*! + * AddObject + */ +//============================================================================= +Handle(GEOM_Object) GEOM_Engine::AddObject(int theDocID, int theType) +{ + Handle(TDocStd_Document) aDoc = GetDocument(theDocID); + Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main()); + + TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main()); + Handle(GEOM_Object) anObject = new GEOM_Object(aChild, theType); + + //Put an object in the map of created objects + TCollection_AsciiString anID = BuildIDFromObject(anObject); + if(_objects.IsBound(anID)) _objects.UnBind(anID); + _objects.Bind(anID, anObject); + + return anObject; +} + +//============================================================================= +/*! + * AddSubShape + */ +//============================================================================= +Handle(GEOM_Object) GEOM_Engine::AddSubShape(Handle(GEOM_Object) theMainShape, + Handle(TColStd_HArray1OfInteger) theIndices, + bool isStandaloneOperation) +{ + if(theMainShape.IsNull() || theIndices.IsNull()) return NULL; + + Handle(TDocStd_Document) aDoc = GetDocument(theMainShape->GetDocID()); + Handle(TDataStd_TreeNode) aRoot = TDataStd_TreeNode::Set(aDoc->Main()); + + TDF_Label aChild = TDF_TagSource::NewChild(aDoc->Main()); + + Handle(GEOM_Function) aMainShape = theMainShape->GetLastFunction(); + Handle(GEOM_Object) anObject = new GEOM_Object(aChild, 28); //28 is SUBSHAPE type + Handle(GEOM_Function) aFunction = anObject->AddFunction(GEOM_Object::GetSubShapeID(), 1); + + GEOM_ISubShape aSSI(aFunction); + aSSI.SetMainShape(aMainShape); + aSSI.SetIndices(theIndices); + + try { + GEOM_Solver aSolver (GEOM_Engine::GetEngine()); + if (!aSolver.ComputeFunction(aFunction)) { + MESSAGE("GEOM_Engine::AddSubShape Error: Can't build a sub shape"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + MESSAGE("GEOM_Engine::AddSubShape Error: " << aFail->GetMessageString()); + return NULL; + } + + //Put an object in the map of created objects + TCollection_AsciiString anID = BuildIDFromObject(anObject); + if(_objects.IsBound(anID)) _objects.UnBind(anID); + _objects.Bind(anID, anObject); + + GEOM::TPythonDump pd (aFunction); + + if (isStandaloneOperation) { + pd << anObject << " = geompy.GetSubShape(" << theMainShape << ", ["; + Standard_Integer i = theIndices->Lower(), up = theIndices->Upper(); + for (; i <= up - 1; i++) { + pd << theIndices->Value(i) << ", "; + } + pd << theIndices->Value(up) << "])"; + } + else + pd << "None"; + + return anObject; +} + +//============================================================================= +/*! + * RemoveObject + */ +//============================================================================= +bool GEOM_Engine::RemoveObject(Handle(GEOM_Object) theObject) +{ + if(!theObject) return false; + + //Remove an object from the map of available objects + TCollection_AsciiString anID = BuildIDFromObject(theObject); + if(_objects.IsBound(anID)) _objects.UnBind(anID); + + int nb = theObject->GetNbFunctions(); + Handle(TDataStd_TreeNode) aNode; + for(int i = 1; i<=nb; i++) { + Handle(GEOM_Function) aFunction = theObject->GetFunction(i); + if(aFunction->GetEntry().FindAttribute(GEOM_Function::GetFunctionTreeID(), aNode)) + aNode->Remove(); + } + + TDF_Label aLabel = theObject->GetEntry(); + aLabel.ForgetAllAttributes(Standard_True); + + theObject.Nullify(); + + return true; +} + +//============================================================================= +/*! + * Undo + */ +//============================================================================= +void GEOM_Engine::Undo(int theDocID) +{ + GetDocument(theDocID)->Undo(); +} + +//============================================================================= +/*! + * Redo + */ +//============================================================================= +void GEOM_Engine::Redo(int theDocID) +{ + GetDocument(theDocID)->Redo(); +} + +//============================================================================= +/*! + * Save + */ +//============================================================================= +bool GEOM_Engine::Save(int theDocID, char* theFileName) +{ + if(!_mapIDDocument.IsBound(theDocID)) return false; + Handle(TDocStd_Document) aDoc = Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID)); + + _OCAFApp->SaveAs(aDoc, theFileName); + + return true; +} + +//============================================================================= +/*! + * Load + */ +//============================================================================= +bool GEOM_Engine::Load(int theDocID, char* theFileName) +{ + Handle(TDocStd_Document) aDoc; + if(_OCAFApp->Open(theFileName, aDoc) != CDF_RS_OK) { + return false; + } + + aDoc->SetUndoLimit(_UndoLimit); + + if(_mapIDDocument.IsBound(theDocID)) _mapIDDocument.UnBind(theDocID); + _mapIDDocument.Bind(theDocID, aDoc); + + TDataStd_Integer::Set(aDoc->Main(), theDocID); + + return true; +} + +//============================================================================= +/*! + * Close + */ +//============================================================================= +void GEOM_Engine::Close(int theDocID) +{ + if(_mapIDDocument.IsBound(theDocID)) { + Handle(TDocStd_Document) aDoc = Handle(TDocStd_Document)::DownCast(_mapIDDocument(theDocID)); + + //Remove all GEOM Objects associated to the given document + TColStd_SequenceOfAsciiString aSeq; + GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient It(_objects); + for(; It.More(); It.Next()) { + TCollection_AsciiString anObjID(It.Key()); + Standard_Integer anID = ExtractDocID(anObjID); + if(theDocID == anID) aSeq.Append(It.Key()); + } + for(Standard_Integer i=1; i<=aSeq.Length(); i++) _objects.UnBind(aSeq.Value(i)); + + _mapIDDocument.UnBind(theDocID); + _OCAFApp->Close(aDoc); + aDoc.Nullify(); + } +} + +//============================================================================= +/*! + * DumpPython + */ +//============================================================================= +TCollection_AsciiString GEOM_Engine::DumpPython(int theDocID, + Resource_DataMapOfAsciiStringAsciiString& theObjectNames, + bool isPublished, + bool& aValidScript) +{ + TCollection_AsciiString aScript; + Handle(TDocStd_Document) aDoc = GetDocument(theDocID); + + if(aDoc.IsNull()) return TCollection_AsciiString("def RebuildData(theStudy): pass\n"); + + aScript = "import geompy\n"; + aScript += "import math\n\n"; + aScript += "def RebuildData(theStudy):"; + aScript += "\n\tgeompy.init_geom(theStudy)"; + + Standard_Integer posToInertGlobalVars = aScript.Length() + 1; + + Handle(TDataStd_TreeNode) aNode, aRoot; + Handle(GEOM_Function) aFunction; + TColStd_MapOfTransient aMap; + + if(aDoc->Main().FindAttribute(GEOM_Function::GetFunctionTreeID(), aRoot)) { + TDataStd_ChildNodeIterator Itr(aRoot); + for(; Itr.More(); Itr.Next()) { + aNode = Itr.Value(); + aFunction = GEOM_Function::GetFunction(aNode->Label()); + if(aFunction.IsNull()) { + cout << "Null function !!!!" << endl; + continue; + } + ProcessFunction(aFunction, aScript, aMap); + } + } + + Resource_DataMapOfAsciiStringAsciiString aEntry2StEntry, aStEntry2Entry; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString anEntryToNameIt; + // build maps entry <-> studyEntry + for (anEntryToNameIt.Initialize( theObjectNames ); + anEntryToNameIt.More(); + anEntryToNameIt.Next()) + { + const TCollection_AsciiString& aEntry = anEntryToNameIt.Key(); + // look for an object by entry + TDF_Label L; + TDF_Tool::Label( aDoc->GetData(), aEntry, L ); + if ( L.IsNull() ) continue; + Handle(GEOM_Object) obj = GEOM_Object::GetObject( L ); + // fill maps + if ( !obj.IsNull() ) { + TCollection_AsciiString aStudyEntry (obj->GetAuxData()); + aEntry2StEntry.Bind( aEntry, aStudyEntry); + aStEntry2Entry.Bind( aStudyEntry, aEntry ); + } + } + + Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aScript); + Standard_Integer aLen = aSeq->Length(), objectCounter = 0, aStart = 1, aScriptLength = aScript.Length(); + Resource_DataMapOfAsciiStringAsciiString aNameToEntry, anEntryToBadName; + + //Replace entries by the names + TCollection_AsciiString anUpdatedScript, anEntry, aName, aBaseName("geomObj_"), + allowedChars ("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_"); + if(aLen == 0) anUpdatedScript = aScript; + + for(Standard_Integer i = 1; i <= aLen; i+=2) { + anUpdatedScript += aScript.SubString(aStart, aSeq->Value(i)-1); + anEntry = aScript.SubString(aSeq->Value(i), aSeq->Value(i+1)); + if(theObjectNames.IsBound(anEntry)) { + aName = theObjectNames.Find(anEntry); + // check validity of aName + bool isValidName = true; + if ( aName.IsIntegerValue() ) { // aName must not start with a digit + aName.Insert( 1, 'a' ); + isValidName = false; + } + int p, p2=1; // replace not allowed chars + while ((p = aName.FirstLocationNotInSet(allowedChars, p2, aName.Length()))) { + aName.SetValue(p, '_'); + p2=p; + isValidName = false; + } + if ( aNameToEntry.IsBound( aName ) && anEntry != aNameToEntry( aName )) + { // diff objects have same name - make a new name by appending a digit + TCollection_AsciiString aName2; + Standard_Integer i = 0; + do { + aName2 = aName + "_" + ++i; + } while ( aNameToEntry.IsBound( aName2 ) && anEntry != aNameToEntry( aName2 )); + aName = aName2; + isValidName = false; + } + if ( !isValidName ) { + if ( isPublished ) + anEntryToBadName.Bind( anEntry, theObjectNames.Find(anEntry) ); + theObjectNames( anEntry ) = aName; + } + } + else { + do { + aName = aBaseName + TCollection_AsciiString(++objectCounter); + } while(aNameToEntry.IsBound(aName)); + theObjectNames.Bind(anEntry, aName); + } + aNameToEntry.Bind(aName, anEntry); // to detect same name of diff objects + + anUpdatedScript += aName; + aStart = aSeq->Value(i+1) + 1; + } + + //Add final part of the script + if(aSeq->Value(aLen) < aScriptLength) anUpdatedScript += aScript.SubString(aSeq->Value(aLen)+1, aScriptLength); + + // Make script to publish in study + if ( isPublished ) + { + map< int, string > anEntryToCommandMap; // sort publishing commands by object entry + for (anEntryToNameIt.Initialize( theObjectNames ); + anEntryToNameIt.More(); + anEntryToNameIt.Next()) + { + const TCollection_AsciiString& aEntry = anEntryToNameIt.Key(); + const TCollection_AsciiString& aName = anEntryToNameIt.Value(); + if ( !aEntry2StEntry.IsBound( aEntry )) + continue; // was not published + TCollection_AsciiString aCommand("\n\tgeompy."), aFatherEntry; + + // find a father entry + const TCollection_AsciiString& aStudyEntry = aEntry2StEntry( aEntry ); + TCollection_AsciiString aFatherStudyEntry = + aStudyEntry.SubString( 1, aStudyEntry.SearchFromEnd(":") - 1 ); + if ( aStEntry2Entry.IsBound( aFatherStudyEntry )) + aFatherEntry = aStEntry2Entry( aFatherStudyEntry ); + + // make a command + if ( !aFatherEntry.IsEmpty() && theObjectNames.IsBound( aFatherEntry )) { + aCommand += "addToStudyInFather( "; + aCommand += theObjectNames( aFatherEntry ) + ", "; + } + else + aCommand += "addToStudy( "; + if ( anEntryToBadName.IsBound( aEntry )) + aCommand += aName + ", \"" + anEntryToBadName( aEntry ) + "\" )"; + else + aCommand += aName + ", \"" + aName + "\" )"; + + // bind a command to the last digit of the entry + int tag = + aEntry.SubString( aEntry.SearchFromEnd(":")+1, aEntry.Length() ).IntegerValue(); + anEntryToCommandMap.insert( make_pair( tag, aCommand.ToCString() )); + } + + // add publishing commands to the script + map< int, string >::iterator anEntryToCommand = anEntryToCommandMap.begin(); + for ( ; anEntryToCommand != anEntryToCommandMap.end(); ++anEntryToCommand ) { + anUpdatedScript += (char*)anEntryToCommand->second.c_str(); + } + } + + anUpdatedScript += "\n\tpass\n"; + aValidScript = true; + + // fill _studyEntry2NameMap and build globalVars + TCollection_AsciiString globalVars; + _studyEntry2NameMap.Clear(); + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString aStEntryToEntryIt; + for (aStEntryToEntryIt.Initialize( aStEntry2Entry ); + aStEntryToEntryIt.More(); + aStEntryToEntryIt.Next() ) + { + const TCollection_AsciiString & name = theObjectNames( aStEntryToEntryIt.Value() ); + _studyEntry2NameMap.Bind (aStEntryToEntryIt.Key(), name ); + if ( !globalVars.IsEmpty() ) + globalVars += ", "; + globalVars += name; + } + if ( !globalVars.IsEmpty() ) { + globalVars.Insert( 1, "\n\tglobal " ); + anUpdatedScript.Insert( posToInertGlobalVars, globalVars ); + } + + return anUpdatedScript; +} + +//======================================================================= +//function : GetDumpName +//purpose : +//======================================================================= + +const char* GEOM_Engine::GetDumpName (const char* theStudyEntry) const +{ + if ( _studyEntry2NameMap.IsBound( (char*)theStudyEntry )) + return _studyEntry2NameMap( (char*)theStudyEntry ).ToCString(); + + return NULL; +} + +//======================================================================= +//function : GetAllDumpNames +//purpose : +//======================================================================= + +Handle(TColStd_HSequenceOfAsciiString) GEOM_Engine::GetAllDumpNames() const +{ + Handle(TColStd_HSequenceOfAsciiString) aRetSeq = new TColStd_HSequenceOfAsciiString; + + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString it (_studyEntry2NameMap); + for (; it.More(); it.Next()) { + aRetSeq->Append(it.Value()); + } + + return aRetSeq; +} + + +//=========================================================================== +// Internal functions +//=========================================================================== +void ProcessFunction(Handle(GEOM_Function)& theFunction, + TCollection_AsciiString& theScript, + TColStd_MapOfTransient& theProcessed) +{ + if(theFunction.IsNull() || theProcessed.Contains(theFunction)) return; + +/* + TDF_LabelSequence aSeq; + theFunction->GetDependency(aSeq); + Standard_Integer aLen = aSeq.Length(); + for(Standard_Integer i = 1; i<= aLen; i++) { + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(aSeq.Value(i)); + if(aFunction.IsNull()) continue; + ProcessFunction(aFunction, theScript, theProcessed); + } +*/ + + TCollection_AsciiString aDescr = theFunction->GetDescription(); + if(aDescr.Length() == 0) { + //cout << "Warning: the function has no description" << endl; + return; + } + //Check if its internal function which doesn't requires dumping + if(aDescr == "None") return; + + theScript += "\n\t"; + theScript += aDescr; + + theProcessed.Add(theFunction); + return; +} + +//============================================================================= +/*! + * FindEntries: Returns a sequence of start/end positions of entries in the string + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) FindEntries(TCollection_AsciiString& theString) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + Standard_Integer aLen = theString.Length(); + Standard_Boolean isFound = Standard_False; + + char* arr = theString.ToCString(); + Standard_Integer i = 0, j; + + while(i < aLen) { + int c = (int)arr[i]; + j = i+1; + if(c >= 48 && c <= 57) { //Is digit? + + isFound = Standard_False; + while((j < aLen) && ((c >= 48 && c <= 57) || c == 58) ) { //Check if it is an entry + c = (int)arr[j++]; + if(c == 58) isFound = Standard_True; + } + + if(isFound && arr[j-2] != 58) { // last char should be a diggit + aSeq->Append(i+1); // +1 because AsciiString starts from 1 + aSeq->Append(j-1); + } + } + + i = j; + } + + return aSeq; +} diff --git a/src/GEOM/GEOM_Engine.hxx b/src/GEOM/GEOM_Engine.hxx new file mode 100644 index 000000000..c9cd626b9 --- /dev/null +++ b/src/GEOM/GEOM_Engine.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/ +// + +#ifndef _GEOM_Engine_HXX_ +#define _GEOM_Engine_HXX_ + +#include "GEOM_Application.hxx" +#include "GEOM_Object.hxx" +#include "GEOM_DataMapOfAsciiStringTransient.hxx" + +#include +#include +#include +#include +#include + +class GEOM_Engine +{ + public: + Standard_EXPORT GEOM_Engine(); + Standard_EXPORT ~GEOM_Engine() { _mapIDDocument.Clear(); _objects.Clear(); } + + //Retuns the engine + Standard_EXPORT static GEOM_Engine* GetEngine(); + + //Returns the OCAF document by its ID, if document doesn't exists it will be created + Standard_EXPORT Handle(TDocStd_Document) GetDocument(int theDocID); + + //Returns the ID of the given OCAF document + Standard_EXPORT int GetDocID(Handle(TDocStd_Document) theDocument); + + //Returns the OCAF appliaction + Standard_EXPORT Handle(TDocStd_Application) GetApplication() { return _OCAFApp; } + + //Returns a pointer to GEOM_Object defined by a document and the entry + Standard_EXPORT Handle(GEOM_Object) GetObject(int theDocID, char* theEntry); + + //Adds a new object of the type theType in the OCAF document + Standard_EXPORT Handle(GEOM_Object) AddObject(int theDocID, int theType); + + //Removes the object from the OCAF document + Standard_EXPORT bool RemoveObject(Handle(GEOM_Object) theObject); + + //Saves the OCAF document with ID = theDocID with file with name theFileName + Standard_EXPORT bool Save(int theDocID, char* theFileName); + + //Loads the OCAF document into the application and assigns to it an ID = theDocID + Standard_EXPORT bool Load(int theDocID, char* theFileName); + + //Closes the document with ID = theDocID + Standard_EXPORT void Close(int theDocID); + + //Sets the number of Undos (default value = 10) + Standard_EXPORT void SetUndoLimit(int theLimit) { _UndoLimit = theLimit; } + + //Applies an Undo to document with ID = theDocID + Standard_EXPORT void Undo(int theDocID); + + //Applies an Redo to document with ID = theDocID + Standard_EXPORT void Redo(int theDocID); + + //Adds a new sub shape object of the MainShape object + Standard_EXPORT Handle(GEOM_Object) AddSubShape(Handle(GEOM_Object) theMainShape, + Handle(TColStd_HArray1OfInteger) theIndices, + bool isStandaloneOperation = false); + + Standard_EXPORT TCollection_AsciiString DumpPython(int theDocID, + Resource_DataMapOfAsciiStringAsciiString& theObjectNames, + bool isPublished, + bool& aValidScript); + + Standard_EXPORT const char* GetDumpName (const char* theStudyEntry) const; + + Standard_EXPORT Handle(TColStd_HSequenceOfAsciiString) GetAllDumpNames() const; + + protected: + Standard_EXPORT static void SetEngine(GEOM_Engine* theEngine); + + private: + + Handle(GEOM_Application) _OCAFApp; + Interface_DataMapOfIntegerTransient _mapIDDocument; + int _UndoLimit; + GEOM_DataMapOfAsciiStringTransient _objects; + + Resource_DataMapOfAsciiStringAsciiString _studyEntry2NameMap; +}; + +#endif diff --git a/src/GEOM/GEOM_Function.cxx b/src/GEOM/GEOM_Function.cxx new file mode 100644 index 000000000..6069db298 --- /dev/null +++ b/src/GEOM/GEOM_Function.cxx @@ -0,0 +1,700 @@ +// 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/ +// + +#include + +#include +#include +#include + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +#define ARGUMENT_LABEL 1 +#define RESULT_LABEL 2 +#define DESCRIPTION_LABEL 3 +#define HISTORY_LABEL 4 + +#define ARGUMENTS _label.FindChild((ARGUMENT_LABEL)) +#define ARGUMENT(thePosition) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePosition)) +#define SUB_ARGUMENT(thePos1, thePos2) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePos1)).FindChild((thePos2)) + +//======================================================================= +//function : GetFunctionTreeID +//purpose : +//======================================================================= +const Standard_GUID& GEOM_Function::GetFunctionTreeID() +{ + static Standard_GUID aFunctionTreeID("FF1BBB00-5D14-4df2-980B-3A668264EA16"); + return aFunctionTreeID; +} + + +//======================================================================= +//function : GetDependencyID +//purpose : +//======================================================================= +const Standard_GUID& GEOM_Function::GetDependencyID() +{ + static Standard_GUID aDependencyID("E2620650-2354-41bd-8C2C-210CFCD00948"); + return aDependencyID; +} + +//============================================================================= +/*! + * GetFunction: + */ +//============================================================================= +Handle(GEOM_Function) GEOM_Function::GetFunction(const TDF_Label& theEntry) +{ + if(!theEntry.IsAttribute(TFunction_Function::GetID())) return NULL; + + return new GEOM_Function(theEntry); +} + +//============================================================================= +/*! + * Constructor: + */ +//============================================================================= +GEOM_Function::GEOM_Function(const TDF_Label& theEntry, const Standard_GUID& theGUID, int theType) +: _label(theEntry) +{ + TFunction_Function::Set(theEntry, theGUID); + TDataStd_Integer::Set(theEntry, theType); + + //Add function to a function tree + Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theEntry.Data()); + Handle(TDataStd_TreeNode) aRoot, aNode; + if(!aDoc->Main().FindAttribute(GetFunctionTreeID(), aRoot)) + aRoot = TDataStd_TreeNode::Set(aDoc->Main(), GetFunctionTreeID()); + + aNode = TDataStd_TreeNode::Set(theEntry, GetFunctionTreeID()); + aRoot->Append(aNode); +} + +//============================================================================= +/*! + * GetOwner + */ +//============================================================================= +TDF_Label GEOM_Function::GetOwnerEntry() +{ + TDF_Label aFather = _label.Father(); + while(!aFather.IsRoot()) { + if(aFather.IsAttribute(GEOM_Object::GetObjectID())) return aFather; + aFather = aFather.Father(); + } + + return TDF_Label(); +} + +//============================================================================= +/*! + * GetType + */ +//============================================================================= +int GEOM_Function::GetType() +{ + _isDone = false; + Handle(TDataStd_Integer) aType; + if(!_label.FindAttribute(TDataStd_Integer::GetID(), aType)) return 0; + _isDone = true; + return aType->Get(); +} + +//============================================================================= +/*! + * GetValue + */ +//============================================================================= +TopoDS_Shape GEOM_Function::GetValue() +{ + _isDone = false; + + TopoDS_Shape aShape; + TDF_Label aLabel = GetOwnerEntry(); + if(aLabel.IsRoot()) return aShape; + Handle(GEOM_Object) anObject = GEOM_Object::GetObject(aLabel); + if(anObject.IsNull()) return aShape; + if(!anObject->IsMainShape()) { + try { + GEOM_Solver aSolver(GEOM_Engine::GetEngine()); + if (!aSolver.ComputeFunction(this)) { + MESSAGE("GEOM_Object::GetValue Error : Can't build a sub shape"); + return aShape; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + MESSAGE("GEOM_Function::GetValue Error: " << aFail->GetMessageString()); + return aShape; + } + } + + TDF_Label aResultLabel = _label.FindChild(RESULT_LABEL); + Handle(TNaming_NamedShape) aNS; + if(!aResultLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) return aShape; + + aShape = aNS->Get(); + + _isDone = true; + return aShape; +} + +//============================================================================= +/*! + * GetValue + */ +//============================================================================= +void GEOM_Function::SetValue(TopoDS_Shape& theShape) +{ + _isDone = false; + TDF_Label aResultLabel = _label.FindChild(RESULT_LABEL); + TNaming_Builder aBuilder(aResultLabel); + + aBuilder.Generated(theShape); + + _isDone = true; +} + +//============================================================================= +/*! + * GetDriverGUID + */ +//============================================================================= +Standard_GUID GEOM_Function::GetDriverGUID() +{ + Handle(TFunction_Function) aFunction; + if(!_label.FindAttribute(TFunction_Function::GetID(), aFunction)) { + return TDF::LowestID(); + } + + return aFunction->GetDriverGUID(); +} + +//============================================================================= +/*! + * GetDescription + */ +//============================================================================= +TCollection_AsciiString GEOM_Function::GetDescription() +{ + Handle(TDataStd_Comment) aComment; + TDF_Label aChild = _label.FindChild(DESCRIPTION_LABEL); + if(!aChild.FindAttribute(TDataStd_Comment::GetID(), aComment)) return TCollection_AsciiString(); + TCollection_AsciiString aDescr(aComment->Get()); + return aDescr; +} + +//============================================================================= +/*! + * SetDescription + */ +//============================================================================= +void GEOM_Function::SetDescription(const TCollection_AsciiString& theDescription) +{ + TDF_Label aChild = _label.FindChild(DESCRIPTION_LABEL); + Handle(TDataStd_Comment) aComment = + TDataStd_Comment::Set(aChild, TCollection_ExtendedString(theDescription)); +} + +//============================================================================= +/*! + * SetReal + */ +//============================================================================= +void GEOM_Function::SetReal(int thePosition, double theValue) +{ + _isDone = false; + if(thePosition <= 0) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + TDataStd_Real::Set(anArgLabel, theValue); + _isDone = true; +} + +//============================================================================= +/*! + * SetRealArray + */ +//============================================================================= +void GEOM_Function::SetRealArray (int thePosition, + const Handle(TColStd_HArray1OfReal)& theArray) +{ + _isDone = false; + if(thePosition <= 0) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + Handle(TDataStd_RealArray) anAttr = + TDataStd_RealArray::Set(anArgLabel, theArray->Lower(), theArray->Upper()); + anAttr->ChangeArray(theArray); + _isDone = true; +} + +//============================================================================= +/*! + * GetReal + */ +//============================================================================= +double GEOM_Function::GetReal(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return 0.0; + Handle(TDataStd_Real) aReal; + TDF_Label anArgLabel = ARGUMENT(thePosition); + if(!anArgLabel.FindAttribute(TDataStd_Real::GetID(), aReal)) return 0.0; + + _isDone = true; + return aReal->Get(); +} + +//============================================================================= +/*! + * GetRealArray + */ +//============================================================================= +Handle(TColStd_HArray1OfReal) GEOM_Function::GetRealArray(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return NULL; + Handle(TDataStd_RealArray) aRealArray; + TDF_Label anArgLabel = ARGUMENT(thePosition); + if(!anArgLabel.FindAttribute(TDataStd_RealArray::GetID(), aRealArray)) return NULL; + + _isDone = true; + return aRealArray->Array(); +} + +//============================================================================= +/*! + * SetInteger + */ +//============================================================================= +void GEOM_Function::SetInteger(int thePosition, int theValue) +{ + _isDone = false; + if(thePosition <= 0) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + TDataStd_Integer::Set(anArgLabel, theValue); + _isDone = true; +} + +//============================================================================= +/*! + * SetIntegerArray + */ +//============================================================================= +void GEOM_Function::SetIntegerArray (int thePosition, + const Handle(TColStd_HArray1OfInteger)& theArray) +{ + _isDone = false; + if(thePosition <= 0) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + Handle(TDataStd_IntegerArray) anAttr = + TDataStd_IntegerArray::Set(anArgLabel, theArray->Lower(), theArray->Upper()); + anAttr->ChangeArray(theArray); + _isDone = true; +} + +//============================================================================= +/*! + * GetInteger + */ +//============================================================================= +int GEOM_Function::GetInteger(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return 0; + Handle(TDataStd_Integer) anInteger; + TDF_Label anArgLabel = ARGUMENT(thePosition); + if(!anArgLabel.FindAttribute(TDataStd_Integer::GetID(), anInteger)) return 0; + + _isDone = true; + return anInteger->Get(); +} + +//============================================================================= +/*! + * GetIntegerArray + */ +//============================================================================= +Handle(TColStd_HArray1OfInteger) GEOM_Function::GetIntegerArray(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return 0; + Handle(TDataStd_IntegerArray) anIntegerArray; + TDF_Label anArgLabel = ARGUMENT(thePosition); + if(!anArgLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) return 0; + + _isDone = true; + return anIntegerArray->Array(); +} + +//============================================================================= +/*! + * SetString + */ +//============================================================================= +void GEOM_Function::SetString(int thePosition, const TCollection_AsciiString& theValue) +{ + _isDone = false; + if(thePosition <= 0) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + TDataStd_Comment::Set(anArgLabel, theValue); + _isDone = true; +} + +//============================================================================= +/*! + * GetString + */ +//============================================================================= +TCollection_AsciiString GEOM_Function::GetString(int thePosition) +{ + _isDone = false; + TCollection_AsciiString aRes; + if(thePosition <= 0) return aRes; + Handle(TDataStd_Comment) aString; + TDF_Label anArgLabel = ARGUMENT(thePosition); + if(!anArgLabel.FindAttribute(TDataStd_Comment::GetID(), aString)) return aRes; + + _isDone = true; + aRes = TCollection_AsciiString(aString->Get()); + return aRes; +} + +//============================================================================= +/*! + * SetReference + */ +//============================================================================= +void GEOM_Function::SetReference(int thePosition, Handle(GEOM_Function) theReference) +{ + _isDone = false; + if(thePosition <= 0) return; + if(theReference.IsNull()) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + TDF_Reference::Set(anArgLabel, theReference->GetEntry()); + TDataStd_UAttribute::Set(anArgLabel, GetDependencyID()); + _isDone = true; + return; +} + +//============================================================================= +/*! + * GetReference + */ +//============================================================================= +Handle(GEOM_Function) GEOM_Function::GetReference(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return NULL; + TDF_Label anArgLabel = ARGUMENT(thePosition); + Handle(TDF_Reference) aRef; + if(!anArgLabel.FindAttribute(TDF_Reference::GetID(), aRef)) return NULL; + + _isDone = true; + return GetFunction(aRef->Get()); +} + + +//============================================================================= +/*! + * SetStringArray + */ +//============================================================================= +void GEOM_Function::SetStringArray(int thePosition, const Handle(TColStd_HArray1OfExtendedString)& theArray) +{ + _isDone = false; + if(thePosition <= 0 || theArray.IsNull()) return; + TDF_Label anArgLabel = ARGUMENT(thePosition); + + Handle(TDataStd_ExtStringArray) anArray = new TDataStd_ExtStringArray; + anArray->ChangeArray(theArray); + anArgLabel.AddAttribute(anArray); + + _isDone = true; +} + + +//============================================================================= +/*! + * GetStringArray + */ +//============================================================================= +Handle(TColStd_HArray1OfExtendedString) GEOM_Function::GetStringArray(int thePosition) +{ + _isDone = false; + if(thePosition <= 0) return NULL; + TDF_Label anArgLabel = ARGUMENT(thePosition); + Handle(TDataStd_ExtStringArray) anArray; + if(!anArgLabel.FindAttribute(TDataStd_ExtStringArray::GetID(), anArray)) return NULL; + + _isDone = true; + return anArray->Array(); +} + +//======================================================================= +//function : GetReferencesTreeID +//purpose : +//======================================================================= +const Standard_GUID& GEOM_Function::GetReferencesTreeID() +{ + static Standard_GUID aReferencesTreeID("FF1BBB10-5D14-4df2-980B-3A668264EA16"); + return aReferencesTreeID; +} + +//============================================================================= +/*! + * SetReferenceList + */ +//============================================================================= +void GEOM_Function::SetReferenceList (int thePosition, + const Handle(TColStd_HSequenceOfTransient)& theRefList) +{ + _isDone = false; + if(thePosition <= 0) return; + + // parent label for the list of references + TDF_Label anArgLabel = ARGUMENT(thePosition); + anArgLabel.ForgetAllAttributes(); + + // set TreeNode on the parent label + Handle(TDataStd_TreeNode) aRoot, aNode; + aRoot = TDataStd_TreeNode::Set(anArgLabel, GetReferencesTreeID()); + + // store references on sub-labels of the parent label + Handle(GEOM_Function) aFunc; + Standard_Integer ind, len = theRefList->Length(); + for (ind = 1; ind <= len; ind++) { + aFunc = Handle(GEOM_Function)::DownCast(theRefList->Value(ind)); + if (aFunc.IsNull()) continue; + TDF_Label anArgLabel_i = SUB_ARGUMENT(thePosition, ind); + TDF_Reference::Set(anArgLabel_i, aFunc->GetEntry()); + TDataStd_UAttribute::Set(anArgLabel_i, GetDependencyID()); + + // set TreeNode on the child label + aNode = TDataStd_TreeNode::Set(anArgLabel_i, GetReferencesTreeID()); + aRoot->Append(aNode); + } + + _isDone = true; + return; +} + +//============================================================================= +/*! + * GetReferenceList + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOM_Function::GetReferenceList(int thePosition) +{ + Handle(TColStd_HSequenceOfTransient) aResult = new TColStd_HSequenceOfTransient; + _isDone = false; + if(thePosition <= 0) return aResult; + + // parent label for the list of references + TDF_Label anArgLabel = ARGUMENT(thePosition); + Handle(TDF_Reference) aRef; + + // get TreeNode on the parent label + Handle(TDataStd_TreeNode) aRoot, aNode; + if(!anArgLabel.FindAttribute(GetReferencesTreeID(), aRoot)) + return aResult; + + // get references, stored on sub-labels of the parent label + TDF_Label aLabel_i; + TDataStd_ChildNodeIterator anIter (aRoot); + for (; anIter.More(); anIter.Next()) { + aNode = anIter.Value(); + aLabel_i = aNode->Label(); + if (!aLabel_i.FindAttribute(TDF_Reference::GetID(), aRef)) continue; + Handle(GEOM_Function) aFunc_i = GetFunction(aRef->Get()); + if (aFunc_i.IsNull()) continue; + aResult->Append(aFunc_i); + } + + _isDone = true; + return aResult; +} + +//============================================================================= +/*! + * SetShape + */ +//============================================================================= +//void GEOM_Function::SetShape(int thePosition, const TopoDS_Shape& theShape) +//{ +// _isDone = false; +// if(thePosition <= 0 || theShape.IsNull()) return; +// +// TDF_Label anArgLabel = ARGUMENT(thePosition); +// TNaming_Builder aBuilder(anArgLabel); +// aBuilder.Generated(theShape); +// +// _isDone = true; +// return; +//} +// +//============================================================================= +/*! + * GetShape + */ +//============================================================================= +//TopoDS_Shape GEOM_Function::GetShape(int thePosition) +//{ +// _isDone = false; +// TopoDS_Shape aShape; +// if(thePosition <= 0) return aShape; +// +// TDF_Label anArgLabel = ARGUMENT(thePosition); +// Handle(TNaming_NamedShape) aNS; +// if(!anArgLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) return aShape; +// +// aShape = aNS->Get(); +// _isDone = true; +// return aShape; +//} + + +//============================================================================= +/*! + * GetDependency + */ +//============================================================================= +void GEOM_Function::GetDependency(TDF_LabelSequence& theSeq) +{ + TDF_ChildIterator anIterator(ARGUMENTS, Standard_True); + for(; anIterator.More(); anIterator.Next()) { + if(anIterator.Value().IsAttribute(GetDependencyID())) theSeq.Append(anIterator.Value()); + } +} + +//============================================================================= +/*! + * GetHistoryEntry + */ +//============================================================================= +TDF_Label GEOM_Function::GetHistoryEntry (const Standard_Boolean create) +{ + return _label.FindChild(HISTORY_LABEL, create); +} + +//============================================================================= +/*! + * GetArgumentHistoryEntry + */ +//============================================================================= +TDF_Label GEOM_Function::GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry, + const Standard_Boolean create) +{ + TColStd_ListOfInteger anArgumentRefTags; + TDF_Tool::TagList(theArgumentRefEntry, anArgumentRefTags); + Standard_Integer anArgumentRefLabelPos = anArgumentRefTags.Extent(); + + TDF_Label aHistoryLabel = GetHistoryEntry(create); + if (aHistoryLabel.IsNull()) + return aHistoryLabel; + Standard_Integer aHistoryLabelPos = aHistoryLabel.Depth() + 1; + + Standard_Integer itag; + TDF_Label aHistoryCurLabel = aHistoryLabel; + TColStd_ListIteratorOfListOfInteger aListIter (anArgumentRefTags); + for (itag = 1; itag <= aHistoryLabelPos; itag++) { + aListIter.Next(); + } + for (; itag <= anArgumentRefLabelPos; itag++) { + aHistoryCurLabel = aHistoryCurLabel.FindChild(aListIter.Value(), create); + if (aHistoryCurLabel.IsNull()) + return aHistoryCurLabel; + aListIter.Next(); + } + + return aHistoryCurLabel; +} + +//======================================================================= +//function : GEOM_Function_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOM_Function_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOM_Function", + sizeof(GEOM_Function), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOM_Function) Handle(GEOM_Function)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOM_Function) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOM_Function))) { + _anOtherObject = Handle(GEOM_Function)((Handle(GEOM_Function)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOM/GEOM_Function.hxx b/src/GEOM/GEOM_Function.hxx new file mode 100644 index 000000000..4eb5b760e --- /dev/null +++ b/src/GEOM/GEOM_Function.hxx @@ -0,0 +1,270 @@ +// 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/ +// + +#ifndef _GEOM_Function_HeaderFile +#define _GEOM_Function_HeaderFile + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Handle_MMgt_TShared_HeaderFile +#include +#endif +#ifndef _MMgt_TShared_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TDF_Label_HeaderFile +#include +#endif +#ifndef _TDF_LabelSequence_HeaderFile +#include +#endif +#ifndef _TColStd_HArray1OfExtendedString_HeaderFile +#include +#endif + +class Handle_TColStd_HArray1OfReal; +class Handle_TColStd_HArray1OfInteger; +class Handle_TColStd_HSequenceOfTransient; +class Handle_TColStd_HArray1OfExtendedString; + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(MMgt_TShared); +class GEOM_Function; + +#include + + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_Function); + +class Handle(GEOM_Function) : public Handle(MMgt_TShared) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOM_Function)():Handle(MMgt_TShared)() {} + Handle(GEOM_Function)(const Handle(GEOM_Function)& aHandle) : Handle(MMgt_TShared)(aHandle) + { + } + + Handle(GEOM_Function)(const GEOM_Function* anItem) : Handle(MMgt_TShared)((MMgt_TShared *)anItem) + { + } + + Handle(GEOM_Function)& operator=(const Handle(GEOM_Function)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOM_Function)& operator=(const GEOM_Function* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOM_Function* operator->() + { + return (GEOM_Function *)ControlAccess(); + } + + GEOM_Function* operator->() const + { + return (GEOM_Function *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOM_Function)() {}; + + Standard_EXPORT static const Handle(GEOM_Function) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +class GEOM_Function : public MMgt_TShared +{ + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& GEOM_Function_Type_(); + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOM_Function) ; } + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOM_Function) == AType || MMgt_TShared::IsKind(AType)); } + + +private: + GEOM_Function(const TDF_Label& theEntry) { _label = theEntry; } + +public: + + //Returns a GUID for a function tree + Standard_EXPORT static const Standard_GUID& GetFunctionTreeID(); + + //Returns the ID which is associated with a reference to another function + Standard_EXPORT static const Standard_GUID& GetDependencyID(); + + //Finds and returns a function located on a label theEntry + Standard_EXPORT static Handle(GEOM_Function) GetFunction(const TDF_Label& theEntry); + + + Standard_EXPORT GEOM_Function(const TDF_Label& theEntry, const Standard_GUID& theGUID, int theType); + Standard_EXPORT ~GEOM_Function() {;} + + Standard_EXPORT TDF_Label GetOwnerEntry(); + + //Access to properties + + //Returns a result of the function built by the function Driver + Standard_EXPORT TopoDS_Shape GetValue(); + + //Sets the function result + Standard_EXPORT void SetValue(TopoDS_Shape& theShape); + + //Returns a function entry in the OCAF document + Standard_EXPORT TDF_Label& GetEntry() { return _label; } + + //Returns the type of the function + Standard_EXPORT int GetType(); + + //Returns a function Driver GUID + Standard_EXPORT Standard_GUID GetDriverGUID(); + + //Returns aPython description of the function + Standard_EXPORT TCollection_AsciiString GetDescription(); + + //Sets aPython description of the function + Standard_EXPORT void SetDescription(const TCollection_AsciiString& theDescription); + + //Access to arguments + + //Sets a real argument at position thePosition + Standard_EXPORT void SetReal(int thePosition, double theValue); + + //Returns a real argument at position thePosition + Standard_EXPORT double GetReal(int thePosition); + + //Sets a real array argument at position thePosition + Standard_EXPORT void SetRealArray(int thePosition, const Handle(TColStd_HArray1OfReal)& theArray); + + //Returns a real array argument at position thePosition + Standard_EXPORT Handle(TColStd_HArray1OfReal) GetRealArray(int thePosition); + + //Sets an integer argument at position thePosition + Standard_EXPORT void SetInteger(int thePosition, int theValue); + + //Returns an integer argument at position thePosition + Standard_EXPORT int GetInteger(int thePosition); + + //Sets an integer array argument at position thePosition + Standard_EXPORT void SetIntegerArray(int thePosition, const Handle(TColStd_HArray1OfInteger)& theArray); + + //Returns an integer array argument at position thePosition + Standard_EXPORT Handle(TColStd_HArray1OfInteger) GetIntegerArray(int thePosition); + + //Sets a reference to other function argument at position thePosition + Standard_EXPORT void SetReference(int thePosition, Handle(GEOM_Function) theReference); + + //Sets a string argument at position thePosition + Standard_EXPORT void SetString(int thePosition, const TCollection_AsciiString& theValue); + + //Returns a string argument at position thePosition + Standard_EXPORT TCollection_AsciiString GetString(int thePosition); + + //Returns a reference to other function argument at position thePosition + Standard_EXPORT Handle(GEOM_Function) GetReference(int thePosition); + + //Set an array of ExtendedString + Standard_EXPORT void SetStringArray(int thePosition, const Handle(TColStd_HArray1OfExtendedString)& theArray); + + //Returns the array of ExtendedString + Standard_EXPORT Handle(TColStd_HArray1OfExtendedString) GetStringArray(int thePosition); + + //Returns a GUID for a references tree + Standard_EXPORT static const Standard_GUID& GetReferencesTreeID(); + + //Sets a list of references to other function arguments at position thePosition + Standard_EXPORT void SetReferenceList (int thePosition, + const Handle(TColStd_HSequenceOfTransient)& theRefList); + + //Returns a list of references to other function arguments at position thePosition + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetReferenceList (int thePosition); + + //Sets a TopoDS_Shape argument at position thePosition + //void SetShape(int thePosition, const TopoDS_Shape& theShape); + + //Returns a TopoDS_Shape argument at position thePosition + //TopoDS_Shape GetShape(int thePosition); + + //Returns true if the last method succided + Standard_EXPORT bool IsDone() { return _isDone; } + + //Returns a sequence of the external dependencies of this function + Standard_EXPORT void GetDependency(TDF_LabelSequence& theSeq); + + //Returns top label of this function's history tree + Standard_EXPORT TDF_Label GetHistoryEntry (const Standard_Boolean create = Standard_True); + + //Returns history label, corresponding to the label, + //on which a reference on argument is stored + Standard_EXPORT TDF_Label GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry, + const Standard_Boolean create = Standard_True); + +private: + + + TDF_Label _label; + bool _isDone; +}; + +#endif diff --git a/src/GEOM/GEOM_IOperations.cxx b/src/GEOM/GEOM_IOperations.cxx new file mode 100644 index 000000000..f922ee164 --- /dev/null +++ b/src/GEOM/GEOM_IOperations.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/ +// +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include + +//============================================================================= +/*! + * default constructor: + */ +//============================================================================= + +GEOM_IOperations::GEOM_IOperations(GEOM_Engine* theEngine, int theDocID) +: _engine(theEngine), _docID(theDocID) +{ + _solver = new GEOM_Solver(theEngine); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOM_IOperations::~GEOM_IOperations() +{ + delete _solver; + MESSAGE("GEOM_IOperations::~GEOM_IOperations"); +} + + +//============================================================================= +/*! + * StartOperation + */ +//============================================================================= +void GEOM_IOperations::StartOperation() +{ + Handle(TDocStd_Document) aDoc = _engine->GetDocument(_docID); + if(aDoc->GetUndoLimit() > 0) + aDoc->NewCommand(); +} + + //============================================================================= + /*! + * FinishOperation + */ +//============================================================================= +void GEOM_IOperations::FinishOperation() +{ + Handle(TDocStd_Document) aDoc = _engine->GetDocument(_docID); + if(aDoc->GetUndoLimit() > 0) + aDoc->CommitCommand(); +} + +//============================================================================= +/*! + * AbortOperation + */ +//============================================================================= +void GEOM_IOperations::AbortOperation() +{ + Handle(TDocStd_Document) aDoc = _engine->GetDocument(_docID); + aDoc->AbortCommand(); +} + + +//============================================================================= +/*! + * IsDone + */ +//============================================================================= +bool GEOM_IOperations::IsDone() +{ + return (_errorCode == OK); +} + + diff --git a/src/GEOM/GEOM_IOperations.hxx b/src/GEOM/GEOM_IOperations.hxx new file mode 100644 index 000000000..5a14ae83a --- /dev/null +++ b/src/GEOM/GEOM_IOperations.hxx @@ -0,0 +1,85 @@ +// 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/ +// + +#ifndef _GEOM_IOperations_HXX_ +#define _GEOM_IOperations_HXX_ + +#include "GEOM_Engine.hxx" +#include +#include +#include "GEOM_Object.hxx" +#include "GEOM_Solver.hxx" + +#define OK "PAL_NO_ERROR" +#define KO "PAL_NOT_DONE_ERROR" +#define ALREADY_PRESENT "PAL_ELEMENT_ALREADY_PRESENT" +#define NOT_EXISTS "PAL_ELEMENT_DOES_NOT_EXISTS" +#define INVALID_TYPE "INVALID_TYPE_OF_ELEMENT" + +class GEOM_IOperations +{ + public: + Standard_EXPORT GEOM_IOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOM_IOperations(); + + //Starts a new operation (opens a tansaction) + Standard_EXPORT void StartOperation(); + + //Finishes the previously started operation (closes the transaction) + Standard_EXPORT void FinishOperation(); + + //Aborts the operation + Standard_EXPORT void AbortOperation(); + + //Returns true if the last operation succided + Standard_EXPORT bool IsDone(); + + //Sets Not done error code + Standard_EXPORT void SetNotDone() { _errorCode = KO; } + + //Sets an error code of the operation + Standard_EXPORT void SetErrorCode(const TCollection_AsciiString& theErrorCode) { + _errorCode = theErrorCode; + } + + //Returns an error code of the last operatioin + Standard_EXPORT char* GetErrorCode() { + return _errorCode.ToCString(); + } + + //Returns a pointer to GEOM_Engine which this operation interface is associated + Standard_EXPORT GEOM_Engine* GetEngine() { return _engine; } + + //Return a pointer to Solver associated with this operation interface + Standard_EXPORT GEOM_Solver* GetSolver() { return _solver; } + + //Returns an ID of the OCAF document where this operation stores the data + Standard_EXPORT int GetDocID() { return _docID; } + + private: + + TCollection_AsciiString _errorCode; + GEOM_Engine* _engine; + GEOM_Solver* _solver; + int _docID; + +}; + +#endif diff --git a/src/GEOM/GEOM_ISubShape.hxx b/src/GEOM/GEOM_ISubShape.hxx new file mode 100644 index 000000000..76113bb7b --- /dev/null +++ b/src/GEOM/GEOM_ISubShape.hxx @@ -0,0 +1,53 @@ +// 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/ +// +// NOTE: This is an intreface to a function for the Shapes +// (Wire, Face, Shell, Solid and Compound) creation. + + +#include "GEOM_Function.hxx" + +#include "TColStd_HSequenceOfTransient.hxx" +#include "TColStd_HArray1OfInteger.hxx" + +#define SHAPE_ARG_MAIN_SHAPE 1 +#define SHAPE_ARG_INDICES 2 +#define SHAPE_ARG_SORTED 3 + +class GEOM_ISubShape +{ + public: + + GEOM_ISubShape(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetMainShape(Handle(GEOM_Function) theRefBase) + { _func->SetReference(SHAPE_ARG_MAIN_SHAPE, theRefBase); } + + Handle(GEOM_Function) GetMainShape() { return _func->GetReference(SHAPE_ARG_MAIN_SHAPE); } + + void SetIndices(const Handle(TColStd_HArray1OfInteger)& theIndices) + { _func->SetIntegerArray(SHAPE_ARG_INDICES, theIndices); } + + Handle(TColStd_HArray1OfInteger) GetIndices() + { return _func->GetIntegerArray(SHAPE_ARG_INDICES); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOM/GEOM_Object.cxx b/src/GEOM/GEOM_Object.cxx new file mode 100644 index 000000000..f386840bb --- /dev/null +++ b/src/GEOM/GEOM_Object.cxx @@ -0,0 +1,425 @@ +// 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/ +// +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TYPE 2 +#define FUNCTION_LABEL(theNb) (_label.FindChild(1).FindChild((theNb))) +#define FREE_LABEL 3 + +//======================================================================= +//function : GetObjectID +//purpose : +//======================================================================= +const Standard_GUID& GEOM_Object::GetObjectID() +{ + static Standard_GUID anObjectID("FF1BBB01-5D14-4df2-980B-3A668264EA16"); + return anObjectID; +} + +//======================================================================= +//function : GetSubShapeID +//purpose : +//======================================================================= +const Standard_GUID& GEOM_Object::GetSubShapeID() +{ + static Standard_GUID anObjectID("FF1BBB68-5D14-4df2-980B-3A668264EA16"); + return anObjectID; +} + +//============================================================================= +/*! + * GetObject + */ +//============================================================================= +Handle(GEOM_Object) GEOM_Object::GetObject(TDF_Label& theLabel) +{ + if (!theLabel.IsAttribute(GetObjectID())) return NULL; + + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theLabel, anEntry); + + Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theLabel.Data()); + if(aDoc.IsNull()) return NULL; + + Handle(TDataStd_Integer) anID; + if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return NULL; + + + GEOM_Engine* anEngine= GEOM_Engine::GetEngine(); + if(anEngine == NULL) return NULL; + return anEngine->GetObject(anID->Get(), anEntry.ToCString()); +} + +//============================================================================= +/*! + * GetReferencedObject + */ +//============================================================================= +Handle(GEOM_Object) GEOM_Object::GetReferencedObject(TDF_Label& theLabel) +{ + Handle(TDF_Reference) aRef; + if (!theLabel.FindAttribute(TDF_Reference::GetID(), aRef)) return NULL; + + // Get TreeNode of a referenced function + Handle(TDataStd_TreeNode) aT, aFather; + if (!TDataStd_TreeNode::Find(aRef->Get(), aT)) return NULL; + + // Get TreeNode of Object of the referenced function + aFather = aT->Father(); + if (aFather.IsNull()) return NULL; + + // Get label of the referenced object + TDF_Label aLabel = aFather->Label(); + + + return GEOM_Object::GetObject(aLabel); +} + +//============================================================================= +/*! + * Constructor: private + */ +//============================================================================= +GEOM_Object::GEOM_Object(TDF_Label& theEntry) +: _label(theEntry), _ior("") +{ + if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root)) + _root = TDataStd_TreeNode::Set(theEntry); +} + +//============================================================================= +/*! + * Constructor: public + */ +//============================================================================= +GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType) +: _label(theEntry), _ior("") +{ + theEntry.ForgetAllAttributes(Standard_True); + + if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root)) + _root = TDataStd_TreeNode::Set(theEntry); + + TDataStd_Integer::Set(theEntry.FindChild(TYPE), theType); + + TDataStd_UAttribute::Set(theEntry, GetObjectID()); +} + +//============================================================================= +/*! + * GetType + */ +//============================================================================= +int GEOM_Object::GetType() +{ + Handle(TDataStd_Integer) aType; + if(!_label.FindChild(TYPE).FindAttribute(TDataStd_Integer::GetID(), aType)) return -1; + + return aType->Get(); +} + +//============================================================================= +/*! + * SetType + */ +//============================================================================= +void GEOM_Object::SetType(int theType) +{ + TDataStd_Integer::Set(_label.FindChild(TYPE), theType); + return; +} + + +//============================================================================= +/*! + * GetDocID + */ +//============================================================================= +int GEOM_Object::GetDocID() +{ + Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data()); + if(aDoc.IsNull()) return -1; + + Handle(TDataStd_Integer) anID; + if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return -1; + + return anID->Get(); +} + + +//============================================================================= +/*! + * GetValue + */ +//============================================================================= +TopoDS_Shape GEOM_Object::GetValue() +{ + TopoDS_Shape aShape; + + Handle(GEOM_Function) aFunction = GetLastFunction(); + + if (!aFunction.IsNull()) + aShape = aFunction->GetValue(); + + return aShape; +} + +//============================================================================= +/*! + * SetName + */ +//============================================================================= +void GEOM_Object::SetName(const char* theName) +{ + TDataStd_Name::Set(_label, (char*)theName); +} + +//============================================================================= +/*! + * GetName + */ +//============================================================================= +char* GEOM_Object::GetName() +{ + Handle(TDataStd_Name) aNameAttr; + if(!_label.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) return NULL; + + TCollection_AsciiString aName(aNameAttr->Get()); + return aName.ToCString(); +} + +//============================================================================= +/*! + * SetAuxData + */ +//============================================================================= +void GEOM_Object::SetAuxData(const char* theData) +{ + TDataStd_Comment::Set(_label, (char*)theData); +} + +//============================================================================= +/*! + * GetAuxData + */ +//============================================================================= +TCollection_AsciiString GEOM_Object::GetAuxData() +{ + TCollection_AsciiString aData; + + Handle(TDataStd_Comment) aCommentAttr; + if (_label.FindAttribute(TDataStd_Comment::GetID(), aCommentAttr)) + aData = aCommentAttr->Get(); + + return aData; +} + + +//============================================================================= +/*! + * IsSubShape + */ +//============================================================================= +bool GEOM_Object::IsMainShape() +{ + Handle(GEOM_Function) aFunction = GetFunction(1); + if(aFunction == NULL || aFunction->GetDriverGUID() != GetSubShapeID()) return true; + return false; +} + + +//============================================================================= +/*! + * AddFunction + */ +//============================================================================= +Handle(GEOM_Function) GEOM_Object::AddFunction(const Standard_GUID& theGUID, int theFunctionType) +{ + Standard_Integer nb = GetNbFunctions(); + if(nb == 1 && theGUID == GetSubShapeID()) return NULL; //It's impossible to add a function to sub shape + nb++; + TDF_Label aChild = FUNCTION_LABEL(nb); + + Handle(TDataStd_TreeNode) aNode = TDataStd_TreeNode::Set(aChild); + _root->Append(aNode); + + Handle(GEOM_Function) aFunction = new GEOM_Function(aChild, theGUID, theFunctionType); + + return aFunction; + +} + +//============================================================================= +/*! + * GetNbFunctions + */ +//============================================================================= +int GEOM_Object::GetNbFunctions() +{ + Standard_Integer nb = 0; + for(TDataStd_ChildNodeIterator CI(_root); CI.More(); CI.Next()) nb++; + return nb; +} + +//============================================================================= +/*! + * GetFunction + */ +//============================================================================= +Handle(GEOM_Function) GEOM_Object::GetFunction(int theFunctionNumber) +{ + TDF_Label aChild = FUNCTION_LABEL(theFunctionNumber); + return GEOM_Function::GetFunction(aChild); +} + +//============================================================================= +/*! + * GetlastFunction + */ +//============================================================================= +Handle(GEOM_Function) GEOM_Object::GetLastFunction() +{ + Standard_Integer nb = GetNbFunctions(); + if(nb) return GetFunction(nb); + + return NULL; +} + + +//============================================================================= +/*! + * GetAllDependency + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetAllDependency() +{ + Handle(TColStd_HSequenceOfTransient) anArray; + TDF_LabelSequence aSeq; + Standard_Integer nb = GetNbFunctions(); + if(nb == 0) return anArray; + for(Standard_Integer i=1; i<=nb; i++) { + Handle(GEOM_Function) aFunction = GetFunction(i); + if(aFunction.IsNull()) continue; + aFunction->GetDependency(aSeq); + } + + Standard_Integer aLength = aSeq.Length(); + if(aLength > 0) { + anArray = new TColStd_HSequenceOfTransient; + for(Standard_Integer j =1; j<=aLength; j++) + anArray->Append(GetReferencedObject(aSeq(j))); + } + + return anArray; +} + +//============================================================================= +/*! + * GetLastDependency + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetLastDependency() +{ + Handle(TColStd_HSequenceOfTransient) anArray; + Handle(GEOM_Function) aFunction = GetLastFunction(); + if (aFunction.IsNull()) return anArray; + + TDF_LabelSequence aSeq; + aFunction->GetDependency(aSeq); + Standard_Integer aLength = aSeq.Length(); + if (aLength > 0) { + anArray = new TColStd_HSequenceOfTransient; + for (Standard_Integer i = 1; i <= aLength; i++) + anArray->Append(GetReferencedObject(aSeq(i))); + } + + return anArray; +} + +//============================================================================= +/*! + * GetFreeLabel + */ +//============================================================================= +TDF_Label GEOM_Object::GetFreeLabel() +{ + return _label.FindChild(FREE_LABEL); +} + +//======================================================================= +//function : GEOM_Object_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOM_Object_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOM_Object", + sizeof(GEOM_Object), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOM_Object) Handle(GEOM_Object)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOM_Object) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOM_Object))) { + _anOtherObject = Handle(GEOM_Object)((Handle(GEOM_Object)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOM/GEOM_Object.hxx b/src/GEOM/GEOM_Object.hxx new file mode 100644 index 000000000..b512abfe9 --- /dev/null +++ b/src/GEOM/GEOM_Object.hxx @@ -0,0 +1,256 @@ +// 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/ +// +#ifndef _GEOM_Object_HeaderFile +#define _GEOM_Object_HeaderFile + +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Handle_MMgt_TShared_HeaderFile +#include +#endif +#ifndef _MMgt_TShared_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TDF_Label_HeaderFile +#include +#endif +#ifndef _TColStd_HSequenceOfTransient_HeaderFile +#include +#endif +#ifndef _TCollection_AsciiString_HeaderFile +#include +#endif + +class Handle_TColStd_HSequenceOfTransient; +class Standard_Transient; +class Handle_Standard_Type; +class Handle(MMgt_TShared); +class GEOM_Object; + + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_Object); + +class Handle(GEOM_Object) : public Handle(MMgt_TShared) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOM_Object)():Handle(MMgt_TShared)() {} + Handle(GEOM_Object)(const Handle(GEOM_Object)& aHandle) : Handle(MMgt_TShared)(aHandle) + { + } + + Handle(GEOM_Object)(const GEOM_Object* anItem) : Handle(MMgt_TShared)((MMgt_TShared *)anItem) + { + } + + Handle(GEOM_Object)& operator=(const Handle(GEOM_Object)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOM_Object)& operator=(const GEOM_Object* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOM_Object* operator->() + { + return (GEOM_Object *)ControlAccess(); + } + + GEOM_Object* operator->() const + { + return (GEOM_Object *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOM_Object)() {}; + + Standard_EXPORT static const Handle(GEOM_Object) DownCast(const Handle(Standard_Transient)& AnObject); +}; + + + +#include +#include +#include "GEOM_Function.hxx" +#include "GEOM_Engine.hxx" + + +class GEOM_Object : public MMgt_TShared +{ + friend class GEOM_Engine; + + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Type management + // + Standard_EXPORT friend Handle_Standard_Type& GEOM_Object_Type_(); + Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOM_Object) ; } + Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOM_Object) == AType || MMgt_TShared::IsKind(AType)); } + + private: + GEOM_Object(TDF_Label& theLabel); + + public: + Standard_EXPORT GEOM_Object(TDF_Label& theEntry, int theType); + Standard_EXPORT ~GEOM_Object() {;} + + //Finds a GEOM_Object on the label theLabel + Standard_EXPORT static Handle(GEOM_Object) GetObject(TDF_Label& theLabel); + + //Finds a GEOM_Object by a reference, stored on the label theLabel + Standard_EXPORT static Handle(GEOM_Object) GetReferencedObject(TDF_Label& theLabel); + + //Returns a GEOM_Object common GUID + Standard_EXPORT static const Standard_GUID& GetObjectID(); + + //Returns a GUID associated with a sub shape object + Standard_EXPORT static const Standard_GUID& GetSubShapeID(); + + //########################################################### + //Access to properties + //########################################################### + + //Returns a TreeNode that presents a root of a function tree for this GEOM_Object + Standard_EXPORT Handle(TDataStd_TreeNode) GetRootNode() { return _root; } + + //Returns a label of this GEOM_Object + Standard_EXPORT TDF_Label GetEntry() { return _label; } + + //Returns a type of this GEOM_Object (GEOM_POINT, GEOM_VECTOR...) + Standard_EXPORT int GetType(); + + //Sets the type of this GEOM_Object + Standard_EXPORT void SetType(int theType); + + //Returns an ID of the OCAF document where this GEOM_Object is stored + Standard_EXPORT int GetDocID(); + + //Returns a value (as TopoDS_Shape) of this GEOM_Object + Standard_EXPORT TopoDS_Shape GetValue(); + + //Sets a name of this GEOM_Object + Standard_EXPORT void SetName(const char* theName); + + //Returns a name of this GEOM_Object + Standard_EXPORT char* GetName(); + + //Sets an auxiliary data + Standard_EXPORT void SetAuxData(const char* theData); + + //Returns an auxiliary data + Standard_EXPORT TCollection_AsciiString GetAuxData(); + + //########################################################### + // Sub shape methods + //########################################################### + + //Returns false if the object is a sub shape of another object + Standard_EXPORT bool IsMainShape(); + + //########################################################### + // CORBA related methods + //########################################################### + + //Sets an IOR of CORBA GEOM_Object_i which refers to this object + Standard_EXPORT void SetIOR(TCollection_AsciiString& theIOR) { _ior = theIOR; } + + //Returns an IOR of CORBA GEOM_Object_i which refers to this object + Standard_EXPORT TCollection_AsciiString GetIOR() { return _ior; } + + //########################################################### + //Functions methods + //########################################################### + + //Adds a function with a driver GUID = theGUID and a type theFunctionType to the function tree of this GEOM_Object + Standard_EXPORT Handle(GEOM_Function) AddFunction(const Standard_GUID& theGUID, int theFunctionType); + + //Returns a number of functions of this GEOM_Object + Standard_EXPORT int GetNbFunctions(); + + //Returns a function with given number theFunctionNumber + Standard_EXPORT Handle(GEOM_Function) GetFunction(int theFunctionNumber); + + //Return the last function of this GEOM_Object + Standard_EXPORT Handle(GEOM_Function) GetLastFunction(); + + //Returns all dependencies of the object + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetAllDependency(); + + //Returns the dependencies of the last function + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetLastDependency(); + + //########################################################### + // Internal methods + //########################################################### + + //Returns a label which could be used to store some additional data + Standard_EXPORT TDF_Label GetFreeLabel(); + + + private: + + Handle(TDataStd_TreeNode) _root; + TDF_Label _label; + TCollection_AsciiString _ior; +}; + +#endif diff --git a/src/GEOM/GEOM_PythonDump.cxx b/src/GEOM/GEOM_PythonDump.cxx new file mode 100644 index 000000000..86c576c64 --- /dev/null +++ b/src/GEOM/GEOM_PythonDump.cxx @@ -0,0 +1,99 @@ +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org + +#include "GEOM_PythonDump.hxx" + +#include + +namespace GEOM +{ + size_t TPythonDump::myCounter = 0; + + TPythonDump::TPythonDump (Handle(GEOM_Function)& theFunction, bool theAppend) + { + myFunction = theFunction; + myCounter++; + myAppend = theAppend; + } + + TPythonDump::~TPythonDump() + { + if (--myCounter == 0) { + TCollection_AsciiString aDescr; + if ( myAppend ) + aDescr = myFunction->GetDescription() + "\n\t"; + aDescr += (char *)myStream.str().c_str(); + myFunction->SetDescription( aDescr ); + } + } + +// TPythonDump::operator TCollection_AsciiString () const +// { +// if (myCounter == 1) { +// return TCollection_AsciiString ((char *)myStream.str().c_str()); +// } +// return TCollection_AsciiString (); +// } + + TPythonDump& TPythonDump::operator<< (long int theArg) + { + myStream<GetEntry(), anEntry); + myStream << anEntry.ToCString(); + return *this; + } +} diff --git a/src/GEOM/GEOM_PythonDump.hxx b/src/GEOM/GEOM_PythonDump.hxx new file mode 100644 index 000000000..0288f4b1a --- /dev/null +++ b/src/GEOM/GEOM_PythonDump.hxx @@ -0,0 +1,56 @@ +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org + +#ifndef _GEOM_PYTHONDUMP_HXX_ +#define _GEOM_PYTHONDUMP_HXX_ + +#include + +#include "GEOM_Object.hxx" +#include "GEOM_Function.hxx" + +#include + +namespace GEOM +{ + class TPythonDump + { + std::ostringstream myStream; + static size_t myCounter; + bool myAppend; + + Handle(GEOM_Function) myFunction; + + public: + Standard_EXPORT TPythonDump (Handle(GEOM_Function)& theFunction, bool theAppend=false); + Standard_EXPORT virtual ~TPythonDump(); + +// operator TCollection_AsciiString () const; + + Standard_EXPORT TPythonDump& operator<< (long int theArg); + Standard_EXPORT TPythonDump& operator<< (int theArg); + Standard_EXPORT TPythonDump& operator<< (double theArg); + Standard_EXPORT TPythonDump& operator<< (float theArg); + Standard_EXPORT TPythonDump& operator<< (const void* theArg); + Standard_EXPORT TPythonDump& operator<< (const char* theArg); + Standard_EXPORT TPythonDump& operator<< (const Handle(GEOM_Object)& theObject); + }; +} + +#endif diff --git a/src/GEOM/GEOM_Solver.cxx b/src/GEOM/GEOM_Solver.cxx new file mode 100644 index 000000000..6b680f8cd --- /dev/null +++ b/src/GEOM/GEOM_Solver.cxx @@ -0,0 +1,69 @@ +// 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/ +// + +#include "GEOM_Solver.hxx" +#include +#include +#include +#include +#include +#include "GEOM_Function.hxx" +#include + +//============================================================================= +/*! + * Update + */ +//============================================================================= +bool GEOM_Solver::Update(int theDocID, TDF_LabelSequence& theSeq) +{ + return false; +} + +//============================================================================= +/*! + * UpdateObject + */ +//============================================================================= +bool GEOM_Solver::UpdateObject(Handle(GEOM_Object) theObject, TDF_LabelSequence& theSeq) +{ + return false; +} + +//============================================================================= +/*! + * ComputeFunction + */ +//============================================================================= +bool GEOM_Solver::ComputeFunction(Handle(GEOM_Function) theFunction) +{ + if(theFunction == NULL) return false; + Standard_GUID aGUID = theFunction->GetDriverGUID(); + + Handle(TFunction_Driver) aDriver; + if(!TFunction_DriverTable::Get()->FindDriver(aGUID, aDriver)) return false; + + aDriver->Init(theFunction->GetEntry()); + + TFunction_Logbook aLog; + if(aDriver->Execute(aLog) == 0) return false; + + return true; +} diff --git a/src/GEOM/GEOM_Solver.hxx b/src/GEOM/GEOM_Solver.hxx new file mode 100644 index 000000000..e0ea881f8 --- /dev/null +++ b/src/GEOM/GEOM_Solver.hxx @@ -0,0 +1,53 @@ +// 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/ +// + +#ifndef _GEOM_Solver_HXX_ +#define _GEOM_Solver_HXX_ + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include "GEOM_Function.hxx" + +#include + +class GEOM_Solver +{ + public: + Standard_EXPORT GEOM_Solver(GEOM_Engine* theEngine) :_engine(theEngine) {} + Standard_EXPORT ~GEOM_Solver() {} + + //Update the values of all GEOM_Object in the document theDocID, theSeq will contain a list of touched labels + //Note: not Implemented + Standard_EXPORT bool Update(int theDocID, TDF_LabelSequence& theSeq); + + //Updates a value of theObject, theSeq will contain a list of touched labels + //Note: not implemented + Standard_EXPORT bool UpdateObject(Handle(GEOM_Object) theObject, TDF_LabelSequence& theSeq); + + //Recomputes a function + Standard_EXPORT bool ComputeFunction(Handle(GEOM_Function) theFunction); + + private: + + GEOM_Engine* _engine; + +}; + +#endif diff --git a/src/GEOM/GEOM_SubShapeDriver.cxx b/src/GEOM/GEOM_SubShapeDriver.cxx new file mode 100644 index 000000000..f33df3046 --- /dev/null +++ b/src/GEOM/GEOM_SubShapeDriver.cxx @@ -0,0 +1,170 @@ +// 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/ +// + +#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 + + +//======================================================================= +//function : GEOM_SubShapeDriver +//purpose : +//======================================================================= +GEOM_SubShapeDriver::GEOM_SubShapeDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOM_SubShapeDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOM_ISubShape aCI (aFunction); + + TDF_Label aLabel = aCI.GetMainShape()->GetOwnerEntry(); + if (aLabel.IsRoot()) return 0; + Handle(GEOM_Object) anObj = GEOM_Object::GetObject(aLabel); + if (anObj.IsNull()) return 0; + TopoDS_Shape aMainShape = anObj->GetValue(); + if (aMainShape.IsNull()) return 0; + + Handle(TColStd_HArray1OfInteger) anIndices = aCI.GetIndices(); + if (anIndices.IsNull() || anIndices->Length() <= 0) return 0; + + BRep_Builder B; + TopoDS_Compound aCompound; + TopoDS_Shape aShape; + + if (anIndices->Length() == 1 && anIndices->Value(1) == -1) { //The empty subshape + B.MakeCompound(aCompound); + aShape = aCompound; + + } else { + + TopTools_IndexedMapOfShape aMapOfShapes; + TopExp::MapShapes(aMainShape, aMapOfShapes); + + if (anIndices->Length() > 1) { + + B.MakeCompound(aCompound); + + for (int i = anIndices->Lower(); i<= anIndices->Upper(); i++) { + if (aMapOfShapes.Extent() < anIndices->Value(i)) + Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); + TopoDS_Shape aSubShape = aMapOfShapes.FindKey(anIndices->Value(i)); + if (aSubShape.IsNull()) continue; + B.Add(aCompound,aSubShape); + } + + aShape = aCompound; + + } else { + + if (aMapOfShapes.Extent() < anIndices->Value(1)) + Standard_NullObject::Raise("GEOM_SubShapeDriver::Execute: Index is out of range"); + aShape = aMapOfShapes.FindKey(anIndices->Value(1)); + } + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOM_SubShapeDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOM_SubShapeDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOM_SubShapeDriver", + sizeof(GEOM_SubShapeDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOM_SubShapeDriver) Handle(GEOM_SubShapeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOM_SubShapeDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOM_SubShapeDriver))) { + _anOtherObject = Handle(GEOM_SubShapeDriver)((Handle(GEOM_SubShapeDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOM/GEOM_SubShapeDriver.hxx b/src/GEOM/GEOM_SubShapeDriver.hxx new file mode 100644 index 000000000..a32a96cdd --- /dev/null +++ b/src/GEOM/GEOM_SubShapeDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ShapeDriver.ixx +// Module : GEOM + +#ifndef _GEOM_SubShapeDriver_HeaderFile +#define _GEOM_SubShapeDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOM_SubShapeDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOM_SubShapeDriver); + +class Handle(GEOM_SubShapeDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOM_SubShapeDriver)():Handle(TFunction_Driver)() {} + Handle(GEOM_SubShapeDriver)(const Handle(GEOM_SubShapeDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOM_SubShapeDriver)(const GEOM_SubShapeDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOM_SubShapeDriver)& operator=(const Handle(GEOM_SubShapeDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOM_SubShapeDriver)& operator=(const GEOM_SubShapeDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOM_SubShapeDriver* operator->() + { + return (GEOM_SubShapeDriver *)ControlAccess(); + } + + GEOM_SubShapeDriver* operator->() const + { + return (GEOM_SubShapeDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOM_SubShapeDriver)() {}; + + Standard_EXPORT static const Handle(GEOM_SubShapeDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOM_SubShapeDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOM_SubShapeDriver(); +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 ~GEOM_SubShapeDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOM_SubShapeDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOM_SubShapeDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOM_SubShapeDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOM/Handle_GEOM_Application.hxx b/src/GEOM/Handle_GEOM_Application.hxx new file mode 100644 index 000000000..520dc194a --- /dev/null +++ b/src/GEOM/Handle_GEOM_Application.hxx @@ -0,0 +1,96 @@ +// 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/ +// +// File : Handle_GEOM_Application.hxx +// Module : GEOM + +#ifndef _Handle_GEOM_Application_HeaderFile +#define _Handle_GEOM_Application_HeaderFile + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Handle_TDocStd_Application_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TDocStd_Application); +class GEOM_Application; +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(SimpleOCAF_Application); + +class Handle(GEOM_Application) : public Handle(TDocStd_Application) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } +// inline void operator delete(void *anAddress, size_t size) +// { +// if (anAddress) Standard::Free((Standard_Address&)anAddress,size); +// } + Handle(GEOM_Application)():Handle(TDocStd_Application)() {} + Handle(GEOM_Application)(const Handle(GEOM_Application)& aHandle) : Handle(TDocStd_Application)(aHandle) + { + } + + Handle(GEOM_Application)(const GEOM_Application* anItem) : Handle(TDocStd_Application)((TDocStd_Application *)anItem) + { + } + + Handle(GEOM_Application)& operator=(const Handle(GEOM_Application)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOM_Application)& operator=(const GEOM_Application* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOM_Application* operator->() + { + return (GEOM_Application *)ControlAccess(); + } + + GEOM_Application* operator->() const + { + return (GEOM_Application *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOM_Application)(); + + Standard_EXPORT static const Handle(GEOM_Application) DownCast(const Handle(Standard_Transient)& AnObject); +}; +#endif diff --git a/src/GEOM/Makefile.in b/src/GEOM/Makefile.in new file mode 100644 index 000000000..ca263cd97 --- /dev/null +++ b/src/GEOM/Makefile.in @@ -0,0 +1,59 @@ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# Libraries targets + +LIB = libGEOMbasic.la +LIB_SRC = GEOM_Application.cxx \ + GEOM_Engine.cxx \ + GEOM_Function.cxx \ + GEOM_Object.cxx \ + GEOM_IOperations.cxx \ + GEOM_Solver.cxx \ + GEOM_SubShapeDriver.cxx \ + GEOM_PythonDump.cxx \ + GEOM_DataMapNodeOfDataMapOfAsciiStringTransient_0.cxx \ + GEOM_DataMapIteratorOfDataMapOfAsciiStringTransient_0.cxx \ + GEOM_DataMapOfAsciiStringTransient_0.cxx + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# Executables targets +BIN = +BIN_SRC = +BIN_CLIENT_IDL = +BIN_SERVER_IDL = + +# header files +EXPORT_HEADERS= GEOM_Application.hxx \ + Handle_GEOM_Application.hxx \ + GEOM_Engine.hxx \ + GEOM_Function.hxx \ + GEOM_Object.hxx \ + GEOM_IOperations.hxx \ + GEOM_ISubShape.hxx \ + GEOM_Solver.hxx \ + GEOM_PythonDump.hxx \ + GEOM_DataMapOfAsciiStringTransient.hxx \ + Handle_GEOM_DataMapNodeOfDataMapOfAsciiStringTransient.hxx + +# additionnal information to compil and link file +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += -L${KERNEL_ROOT_DIR}/lib/salome $(CAS_OCAF) $(CAS_OCAFVIS) + + +# additional file to be cleaned +MOSTLYCLEAN = +CLEAN = +DISTCLEAN = + +@CONCLUDE@ + diff --git a/src/GEOMAlgo/BlockFix.cdl b/src/GEOMAlgo/BlockFix.cdl new file mode 100644 index 000000000..3fab40f93 --- /dev/null +++ b/src/GEOMAlgo/BlockFix.cdl @@ -0,0 +1,69 @@ +// 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/ +// +-- File: BlockFix.cdl +-- Created: Tue Dec 7 11:59:05 2004 +-- Author: Pavel Durandin +-- +---Copyright: Open CASCADE SA 2004 + + + + +package BlockFix + +uses + + TColStd, + gp, + Geom, + Geom2d, + GeomAbs, + TopLoc, + TopoDS, + BRepTools, + TopTools, + ShapeBuild + +is + + class SphereSpaceModifier; + + class UnionFaces; + + class UnionEdges; + + class BlockFixAPI; + ---Purpose: API class to perform the fixing of the + -- block + + class PeriodicSurfaceModifier; + + class CheckTool; + + RotateSphereSpace (S: Shape from TopoDS; Tol: Real) + returns Shape from TopoDS; + + FixRanges (S: Shape from TopoDS; Tol: Real) + returns Shape from TopoDS; + ---Purpose: checking and fixing cases where parametric + -- boundaries of face based on periodic surface are not + -- contained in the range of this surface. + +end BlockFix; diff --git a/src/GEOMAlgo/BlockFix.cxx b/src/GEOMAlgo/BlockFix.cxx new file mode 100644 index 000000000..11c973a18 --- /dev/null +++ b/src/GEOMAlgo/BlockFix.cxx @@ -0,0 +1,215 @@ +// 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/ +// +// File: BlockFix.cxx +// Created: Tue Dec 7 11:59:05 2004 +// Author: Pavel DURANDIN +// Copyright: Open CASCADE SA 2004 + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + + +//======================================================================= +//function : FixResult +//purpose : auxilary +//======================================================================= +static void FixResult(const TopoDS_Shape& result, + Handle(ShapeBuild_ReShape)& Context, + const Standard_Real Tol) +{ + for (TopExp_Explorer ex_f(result,TopAbs_FACE); ex_f.More(); ex_f.Next()) { + TopoDS_Shape aShape = Context->Apply(ex_f.Current().Oriented(TopAbs_FORWARD)); + // face coud not be dropped or splitted on this step + TopoDS_Face aFace = TopoDS::Face(aShape); + TopLoc_Location L; + Handle(Geom_Surface) Surf = BRep_Tool::Surface(aFace,L); + + if( Surf->IsKind(STANDARD_TYPE(Geom_SphericalSurface)) || + Surf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface)) ) { + + Standard_Integer nbWires = 0; + for (TopExp_Explorer ex_w(aFace,TopAbs_WIRE); ex_w.More(); ex_w.Next()) { + nbWires++; + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(ex_w.Current()), + aFace, + Precision::Confusion()); + sfw->FixReorder(); + if(sfw->StatusReorder ( ShapeExtend_FAIL )) + continue; + + sfw->SetPrecision(2.*Tol); + sfw->FixShifted(); + + Standard_Boolean isDone = sfw->LastFixStatus ( ShapeExtend_DONE ); + isDone |= sfw->FixDegenerated(); + + // remove degenerated edges from not degenerated points + ShapeAnalysis_Edge sae; + Handle(ShapeExtend_WireData) sewd = sfw->WireData(); + Standard_Integer i; + for( i = 1; i<=sewd->NbEdges();i++) { + TopoDS_Edge E = sewd->Edge(i); + if(BRep_Tool::Degenerated(E)&&!sae.HasPCurve(E,aFace)) { + sewd->Remove(i); + isDone = Standard_True; + i--; + } + } + + //isDone |= sfw->FixLacking(); // commented by skl 22.03.2005 (PAL8395) + + // remove neighbour seam edges + if(isDone) { + for( i = 1; iNbEdges();i++) { + if(sewd->IsSeam(i) && sewd->IsSeam(i+1)) { + isDone = Standard_True; + sewd->Remove(i); + sewd->Remove(i); + i--; + } + } + if(sewd->IsSeam(1) && sewd->IsSeam(sewd->NbEdges())) { + sewd->Remove(1); + sewd->Remove(sewd->NbEdges()); + } + } + + + if(isDone) { + TopoDS_Wire ResWire = sfw->Wire(); + Context->Replace(ex_w.Current(), ResWire); + }; + } + // Implement fix orientation in case of several wires + if(nbWires > 1) { + TopoDS_Face aFixedFace = TopoDS::Face(Context->Apply(aFace)); + Handle(ShapeFix_Face) sff = new ShapeFix_Face(aFixedFace); + if(sff->FixOrientation()) + Context->Replace(aFixedFace,sff->Face()); + } + + } + } +} + + + + + +//======================================================================= +//function : ConvertToAnalytical +//purpose : +//======================================================================= + +TopoDS_Shape BlockFix::RotateSphereSpace (const TopoDS_Shape& S, + const Standard_Real Tol) +{ + + // Create a modification description + Handle(BlockFix_SphereSpaceModifier) SR = new BlockFix_SphereSpaceModifier; + SR->SetTolerance(Tol); + + TopTools_DataMapOfShapeShape context; + BRepTools_Modifier MD; + TopoDS_Shape result = ShapeCustom::ApplyModifier ( S, SR, context,MD ); + + Handle(ShapeBuild_ReShape) RS = new ShapeBuild_ReShape; + FixResult(result,RS,Tol); + result = RS->Apply(result); + + ShapeFix_Edge sfe; + for(TopExp_Explorer exp(result,TopAbs_EDGE); exp.More(); exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(exp.Current()); + sfe.FixVertexTolerance (E); + } + + ShapeFix::SameParameter(result,Standard_False); + return result; +} + + +//======================================================================= +//function : FixRanges +//purpose : +//======================================================================= + +TopoDS_Shape BlockFix::FixRanges (const TopoDS_Shape& S, + const Standard_Real Tol) +{ + // Create a modification description + Handle(BlockFix_PeriodicSurfaceModifier) SR = new BlockFix_PeriodicSurfaceModifier; + SR->SetTolerance(Tol); + + TopTools_DataMapOfShapeShape context; + BRepTools_Modifier MD; + TopoDS_Shape result = ShapeCustom::ApplyModifier ( S, SR, context,MD ); + + Handle(ShapeBuild_ReShape) RS = new ShapeBuild_ReShape; + FixResult(result,RS,Tol); + result = RS->Apply(result); + + ShapeFix_Edge sfe; + for(TopExp_Explorer exp(result,TopAbs_EDGE); exp.More(); exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(exp.Current()); + sfe.FixVertexTolerance (E); + } + + ShapeFix::SameParameter(result,Standard_False); + + return result; +} diff --git a/src/GEOMAlgo/BlockFix.jxx b/src/GEOMAlgo/BlockFix.jxx new file mode 100644 index 000000000..16e91bb0d --- /dev/null +++ b/src/GEOMAlgo/BlockFix.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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _BlockFix_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.cdl b/src/GEOMAlgo/BlockFix_BlockFixAPI.cdl new file mode 100644 index 000000000..fc1e28f62 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.cdl @@ -0,0 +1,67 @@ +// 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/ +// +-- File: BlockFix_BlockFixAPI.cdl +-- Created: Tue Dec 7 17:56:09 2004 +-- Author: Pavel Durandin +-- +---Copyright: Open CASCADE SA 2004 + +class BlockFixAPI from BlockFix inherits TShared from MMgt + + ---Purpose: + +uses + + Shape from TopoDS, + ReShape from ShapeBuild + +is + Create returns BlockFixAPI from BlockFix; + ---Purpose: Empty constructor + + SetShape(me: mutable; Shape: Shape from TopoDS); + ---Purpose: Sets the shape to be operated on + ---C++: inline + + Perform(me: mutable); + ---Purpose: + + Shape(me) returns Shape from TopoDS; + ---Purpose: Returns resulting shape. + ---C++: inline + + Context(me:mutable) returns ReShape from ShapeBuild; + ---Purpose: Returns modifiable context for storing the + -- mofifications + ---C++: inline + ---C++: return & + + Tolerance (me:mutable) returns Real; + ---Purpose: Returns modifiable tolerance of recognition + ---C++: inline + ---C++: return & + +fields + + myContext : ReShape from ShapeBuild; + myShape : Shape from TopoDS; + myTolerance : Real from Standard; + +end BlockFixAPI from BlockFix; diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx new file mode 100644 index 000000000..41677111c --- /dev/null +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.cxx @@ -0,0 +1,67 @@ +// 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/ +// +// File: BlockFix_BlockFixAPI.cxx +// Created: Tue Dec 7 11:59:05 2004 +// Author: Pavel DURANDIN +// Copyright: Open CASCADE SA 2004 + + +#include +#include +#include +#include +#include + +//======================================================================= +//function : ShapeConvert_CanonicAPI +//purpose : +//======================================================================= + +BlockFix_BlockFixAPI::BlockFix_BlockFixAPI() +{ + myTolerance = Precision::Confusion(); +} + +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + +void BlockFix_BlockFixAPI::Perform() +{ + + // processing spheres with degenerativities + TopoDS_Shape aShape = Shape(); + myShape = BlockFix::RotateSphereSpace(aShape,myTolerance); + + // faces unification + BlockFix_UnionFaces aFaceUnifier; + aFaceUnifier.GetTolerance() = myTolerance; + TopoDS_Shape aResult; + aResult = aFaceUnifier.Perform(myShape); + + + BlockFix_UnionEdges anEdgeUnifier; + myShape = anEdgeUnifier.Perform(aResult,myTolerance); + + TopoDS_Shape aRes = BlockFix::FixRanges(myShape,myTolerance); + myShape = aRes; + +} diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.jxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.jxx new file mode 100644 index 000000000..b1415ecd4 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _ShapeBuild_ReShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _BlockFix_BlockFixAPI_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx b/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx new file mode 100644 index 000000000..77841f932 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_BlockFixAPI.lxx @@ -0,0 +1,61 @@ +// 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/ +// +#include + +//======================================================================= +//function : Shape +//purpose : +//======================================================================= + +inline void BlockFix_BlockFixAPI::SetShape(const TopoDS_Shape& Shape) +{ + myShape = Shape; +} + +//======================================================================= +//function : Shape +//purpose : +//======================================================================= + +inline TopoDS_Shape BlockFix_BlockFixAPI::Shape() const +{ + return myShape; +} + +//======================================================================= +//function : Context +//purpose : +//======================================================================= + +inline Handle(ShapeBuild_ReShape)& BlockFix_BlockFixAPI::Context() +{ + return myContext; +} + +//======================================================================= +//function : Tolerance +//purpose : +//======================================================================= + +inline Standard_Real& BlockFix_BlockFixAPI::Tolerance() +{ + return myTolerance; +} + diff --git a/src/GEOMAlgo/BlockFix_CheckTool.cdl b/src/GEOMAlgo/BlockFix_CheckTool.cdl new file mode 100644 index 000000000..b4875d806 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_CheckTool.cdl @@ -0,0 +1,66 @@ +// 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/ +// +-- File: BlockFix_CheckTool.cdl +-- Created: Fri Dec 17 10:36:58 2004 +-- Author: Sergey KUUL +-- +---Copyright: Open CASCADE SA 2004 + +class CheckTool from BlockFix + + ---Purpose: + +uses + + Shape from TopoDS, + SequenceOfShape from TopTools + +is + + Create returns CheckTool from BlockFix; + ---Purpose: Empty constructor + + SetShape(me: in out; aShape: Shape from TopoDS); + + Perform(me: in out); + ---Purpose: + + NbPossibleBlocks(me) returns Integer; + + PossibleBlock(me; num: Integer) returns Shape from TopoDS; + + DumpCheckResult(me; S : in out OStream); + ---Purpose: Dumps results of checking + + +fields + + myShape : Shape from TopoDS; + myHasCheck : Boolean; + myNbSolids : Integer; + myNbBlocks : Integer; + myPossibleBlocks : SequenceOfShape from TopTools; + myNbDegen : Integer; + myNbUF : Integer; + myNbUE : Integer; + myNbUFUE : Integer; + myBadRanges : Integer; + +end CheckTool; diff --git a/src/GEOMAlgo/BlockFix_CheckTool.cxx b/src/GEOMAlgo/BlockFix_CheckTool.cxx new file mode 100644 index 000000000..6348ffc07 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_CheckTool.cxx @@ -0,0 +1,260 @@ +// 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/ +// +// File: BlockFix_CheckTool.cxx +// Created: 17.12.04 11:15:25 +// Author: Sergey KUUL +// Copyright: Open CASCADE SA 2004 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//======================================================================= +//function : BlockFix_CheckTool() +//purpose : Constructor +//======================================================================= + +BlockFix_CheckTool::BlockFix_CheckTool( ) +{ + myHasCheck = Standard_False; + myPossibleBlocks.Clear(); +} + + +//======================================================================= +//function : SetShape +//purpose : +//======================================================================= + +void BlockFix_CheckTool::SetShape(const TopoDS_Shape& aShape) +{ + myHasCheck = Standard_False; + myShape = aShape; + myPossibleBlocks.Clear(); +} + + +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + +void BlockFix_CheckTool::Perform() +{ + myNbSolids=0; + myNbBlocks=0; + myNbDegen=0; + myNbUF=0; + myNbUE=0; + myNbUFUE=0; + TopExp_Explorer exps; + for(exps.Init(myShape, TopAbs_SOLID); exps.More(); exps.Next()) { + TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + myNbSolids++; + Standard_Boolean IsBlock=Standard_True; + Standard_Boolean MayBeUF=Standard_False; + Standard_Boolean MayBeUE=Standard_False; + Standard_Integer nf=0; + TopExp_Explorer expf; + for(expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) nf++; + + if(nf<6) { + IsBlock=Standard_False; + } + else if(nf>6) { + IsBlock=Standard_False; + // check faces unification + TopTools_SequenceOfShape faces; + for( expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { + TopoDS_Face aFace = TopoDS::Face(expf.Current()); + faces.Append(aFace); + } + Standard_Boolean HasFacesForUnification = Standard_False; + for(Standard_Integer i=1; i0 ) { + IsBlock=Standard_False; + myNbDegen++; + myPossibleBlocks.Append(aSolid); + continue; + } + if(nbe<24) + IsBlock=Standard_False; + if(nbe>24) { + IsBlock=Standard_False; + // check edges unification + // creating map of edge faces + TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces; + TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces); + for(expf.Init(aSolid, TopAbs_FACE); expf.More(); expf.Next()) { + TopoDS_Face aFace = TopoDS::Face(expf.Current()); + TopTools_IndexedDataMapOfShapeListOfShape aMapFacesEdges; + for(expe.Init(aFace,TopAbs_EDGE); expe.More(); expe.Next()) { + TopoDS_Edge edge = TopoDS::Edge(expe.Current()); + if(!aMapEdgeFaces.Contains(edge)) continue; + const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); + TopTools_ListIteratorOfListOfShape anIter(aList); + for( ; anIter.More(); anIter.Next()) { + TopoDS_Face face = TopoDS::Face(anIter.Value()); + if(face.IsSame(aFace)) continue; + if(aMapFacesEdges.Contains(face)) { + aMapFacesEdges.ChangeFromKey(face).Append(edge); + } + else { + TopTools_ListOfShape ListEdges; + ListEdges.Append(edge); + aMapFacesEdges.Add(face,ListEdges); + } + } + } + Standard_Integer i=1; + for(; i<=aMapFacesEdges.Extent(); i++) { + const TopTools_ListOfShape& ListEdges = aMapFacesEdges.FindFromIndex(i); + if(ListEdges.Extent()>1) break; + } + if(i<=aMapFacesEdges.Extent()) { + MayBeUE=Standard_True; + break; + } + } + } + + if(IsBlock) + myNbBlocks++; + else { + if(MayBeUF) { + myPossibleBlocks.Append(aSolid); + if(MayBeUE) + myNbUFUE++; + else + myNbUF++; + } + else if(MayBeUE) { + myNbUE++; + myPossibleBlocks.Append(aSolid); + } + } + + } + + myHasCheck = Standard_True; +} + + +//======================================================================= +//function : NbPossibleBlocks +//purpose : +//======================================================================= + +Standard_Integer BlockFix_CheckTool::NbPossibleBlocks() const +{ + return myPossibleBlocks.Length(); +} + + +//======================================================================= +//function : PossibleBlock +//purpose : +//======================================================================= + +TopoDS_Shape BlockFix_CheckTool::PossibleBlock(const Standard_Integer num) const +{ + TopoDS_Shape res; + if( num>0 && num<=myPossibleBlocks.Length() ) + res = myPossibleBlocks.Value(num); + return res; +} + + +//======================================================================= +//function : DumpCheckResult +//purpose : +//======================================================================= + +void BlockFix_CheckTool::DumpCheckResult(Standard_OStream& S) const +{ + if(!myHasCheck) + S<<"Check not performed!"<IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) { + Handle(Geom_TrimmedCurve) tc = + Handle(Geom_TrimmedCurve)::DownCast(c3d1); + c3d1 = tc->BasisCurve(); + } + TopoDS_Edge edge2 = TopoDS::Edge(aChain.Value(j+1)); + Handle(Geom_Curve) c3d2 = BRep_Tool::Curve(edge2,Loc,fp2,lp2); + if(c3d2.IsNull()) break; + while(c3d2->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) { + Handle(Geom_TrimmedCurve) tc = + Handle(Geom_TrimmedCurve)::DownCast(c3d2); + c3d2 = tc->BasisCurve(); + } + if( c3d1->IsKind(STANDARD_TYPE(Geom_Line)) && c3d2->IsKind(STANDARD_TYPE(Geom_Line)) ) { + // union lines + Handle(Geom_Line) L1 = Handle(Geom_Line)::DownCast(c3d1); + Handle(Geom_Line) L2 = Handle(Geom_Line)::DownCast(c3d2); + gp_Dir Dir1 = L1->Position().Direction(); + gp_Dir Dir2 = L2->Position().Direction(); + if(!Dir1.IsEqual(Dir2,Precision::Angular())) continue; + // can union lines => create new edge + TopoDS_Vertex V1 = sae.FirstVertex(edge1); + gp_Pnt PV1 = BRep_Tool::Pnt(V1); + TopoDS_Vertex V2 = sae.LastVertex(edge2); + gp_Pnt PV2 = BRep_Tool::Pnt(V2); + gp_Vec Vec(PV1,PV2); + Handle(Geom_Line) L = new Geom_Line(gp_Ax1(PV1,Vec)); + Standard_Real dist = PV1.Distance(PV2); + Handle(Geom_TrimmedCurve) tc = new Geom_TrimmedCurve(L,0.0,dist); + TopoDS_Edge E; + B.MakeEdge (E,tc,Precision::Confusion()); + B.Add (E,V1); B.Add (E,V2); + B.UpdateVertex(V1, 0., E, 0.); + B.UpdateVertex(V2, dist, E, 0.); + ShapeFix_Edge sfe; + sfe.FixAddPCurve(E,aFace,Standard_False); + sfe.FixSameParameter(E); + aChain.Remove(j); + aChain.SetValue(j,E); + j--; + } + if( c3d1->IsKind(STANDARD_TYPE(Geom_Circle)) && c3d2->IsKind(STANDARD_TYPE(Geom_Circle)) ) { + // union circles + Handle(Geom_Circle) C1 = Handle(Geom_Circle)::DownCast(c3d1); + Handle(Geom_Circle) C2 = Handle(Geom_Circle)::DownCast(c3d2); + gp_Pnt P01 = C1->Location(); + gp_Pnt P02 = C2->Location(); + if(P01.Distance(P02)>Precision::Confusion()) continue; + // can union circles => create new edge + TopoDS_Vertex V1 = sae.FirstVertex(edge1); + gp_Pnt PV1 = BRep_Tool::Pnt(V1); + TopoDS_Vertex V2 = sae.LastVertex(edge2); + gp_Pnt PV2 = BRep_Tool::Pnt(V2); + TopoDS_Vertex VM = sae.LastVertex(edge1); + gp_Pnt PVM = BRep_Tool::Pnt(VM); + GC_MakeCircle MC(PV1,PVM,PV2); + Handle(Geom_Circle) C = MC.Value(); + gp_Pnt P0 = C->Location(); + gp_Dir D1(gp_Vec(P0,PV1)); + gp_Dir D2(gp_Vec(P0,PV2)); + Standard_Real fpar = C->XAxis().Direction().Angle(D1); + Standard_Real lpar = C->XAxis().Direction().Angle(D2); + Handle(Geom_TrimmedCurve) tc = new Geom_TrimmedCurve(C,fpar,lpar); + TopoDS_Edge E; + B.MakeEdge (E,tc,Precision::Confusion()); + B.Add (E,V1); B.Add (E,V2); + B.UpdateVertex(V1, fpar, E, 0.); + B.UpdateVertex(V2, lpar, E, 0.); + ShapeFix_Edge sfe; + sfe.FixAddPCurve(E,aFace,Standard_False); + sfe.FixSameParameter(E); + aChain.Remove(j); + aChain.SetValue(j,E); + j--; + } + } + if(j1) { + // second step: union edges with various curves + cout<<"can not make analitical union => make approximation"<Apply(Shape); + + // processing each solid + TopExp_Explorer exps; + for(exps.Init(Shape, TopAbs_SOLID); exps.More(); exps.Next()) { + TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + + TopTools_IndexedMapOfShape ChangedFaces; + + // creating map of edge faces + TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces; + TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces); + + Handle(ShapeBuild_ReShape) aContext = new ShapeBuild_ReShape; + TopoDS_Shape aRes = aSolid; + aRes = aContext->Apply(aSolid); + + // processing each face + TopExp_Explorer exp; + for(exp.Init(aRes, TopAbs_FACE); exp.More(); exp.Next()) { + TopoDS_Face aFace = + TopoDS::Face(aContext->Apply(exp.Current().Oriented(TopAbs_FORWARD))); + TopTools_IndexedDataMapOfShapeListOfShape aMapFacesEdges; + + for(TopExp_Explorer expe(aFace,TopAbs_EDGE); expe.More(); expe.Next()) { + TopoDS_Edge edge = TopoDS::Edge(expe.Current()); + if(!aMapEdgeFaces.Contains(edge)) continue; + const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); + TopTools_ListIteratorOfListOfShape anIter(aList); + for( ; anIter.More(); anIter.Next()) { + TopoDS_Face face = TopoDS::Face(anIter.Value()); + TopoDS_Face face1 = TopoDS::Face(aContext->Apply(anIter.Value())); + if(face1.IsSame(aFace)) continue; + if(aMapFacesEdges.Contains(face)) { + aMapFacesEdges.ChangeFromKey(face).Append(edge); + } + else { + TopTools_ListOfShape ListEdges; + ListEdges.Append(edge); + aMapFacesEdges.Add(face,ListEdges); + } + } + } + + for(Standard_Integer i=1; i<=aMapFacesEdges.Extent(); i++) { + const TopTools_ListOfShape& ListEdges = aMapFacesEdges.FindFromIndex(i); + TopTools_SequenceOfShape SeqEdges; + TopTools_ListIteratorOfListOfShape anIter(ListEdges); + for( ; anIter.More(); anIter.Next()) { + SeqEdges.Append(anIter.Value()); + } + if(SeqEdges.Length()==1) continue; + TopoDS_Edge E; + if( MergeEdges(SeqEdges,aFace,Tol,E) ) { + // now we have only one edge - aChain.Value(1) + // we have to replace old ListEdges with this new edge + aContext->Replace(SeqEdges(1),E); + for(Standard_Integer j=2; j<=SeqEdges.Length(); j++) { + aContext->Remove(SeqEdges(j)); + } + TopoDS_Face tmpF = TopoDS::Face(exp.Current()); + if( !ChangedFaces.Contains(tmpF) ) + ChangedFaces.Add(tmpF); + tmpF = TopoDS::Face(aMapFacesEdges.FindKey(i)); + if( !ChangedFaces.Contains(tmpF) ) + ChangedFaces.Add(tmpF); + } + } + + } // end processing each face + + // fix changed faces and replace them in the local context + for(Standard_Integer i=1; i<=ChangedFaces.Extent(); i++) { + TopoDS_Face aFace = TopoDS::Face(aContext->Apply(ChangedFaces.FindKey(i))); + Handle(ShapeFix_Face) sff = new ShapeFix_Face(aFace); + sff->SetContext(myContext); + sff->SetPrecision(myTolerance); + sff->SetMinTolerance(myTolerance); + sff->SetMaxTolerance(Max(1.,myTolerance*1000.)); + sff->Perform(); + aContext->Replace(aFace,sff->Face()); + } + + if(ChangedFaces.Extent()>0) { + // fix changed shell and replace it in the local context + TopoDS_Shape aRes1 = aContext->Apply(aRes); + TopExp_Explorer expsh; + for(expsh.Init(aRes1, TopAbs_SHELL); expsh.More(); expsh.Next()) { + TopoDS_Shell aShell = TopoDS::Shell(expsh.Current()); + Handle(ShapeFix_Shell) sfsh = new ShapeFix_Shell; + sfsh->FixFaceOrientation(aShell); + aContext->Replace(aShell,sfsh->Shell()); + } + TopoDS_Shape aRes2 = aContext->Apply(aRes1); + // put new solid into global context + myContext->Replace(aSolid,aRes2); + } + + } // end processing each solid + + aResult = myContext->Apply(Shape); + return aResult; +} diff --git a/src/GEOMAlgo/BlockFix_UnionEdges.jxx b/src/GEOMAlgo/BlockFix_UnionEdges.jxx new file mode 100644 index 000000000..073b6d865 --- /dev/null +++ b/src/GEOMAlgo/BlockFix_UnionEdges.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _ShapeBuild_ReShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _BlockFix_UnionEdges_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/BlockFix_UnionFaces.cdl b/src/GEOMAlgo/BlockFix_UnionFaces.cdl new file mode 100644 index 000000000..8ed27cdae --- /dev/null +++ b/src/GEOMAlgo/BlockFix_UnionFaces.cdl @@ -0,0 +1,65 @@ +// 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/ +// +-- File: BlockFix_UnionFaces.cdl +-- Created: Tue Dec 7 17:15:42 2004 +-- Author: Pavel Durandin +-- +---Copyright: Open CASCADE SA 2004 + + +class UnionFaces from BlockFix + +uses + + Face from TopoDS, + Shape from TopoDS + +is + + Create returns UnionFaces from BlockFix; + ---Purpose: Empty constructor + + GetTolerance(me: in out) returns Real; + ---Purpose: Returns modifiable tolerance + ---C++: return& + + Perform (me: in out; Shape: Shape from TopoDS) returns Shape from TopoDS; + ---Purpose: Performs the unification of the fsces + -- whith the same geometry + + IsSameDomain(me; aFace : Face from TopoDS; + aChekedFace: Face from TopoDS) + returns Boolean is virtual; + ---Purpose: Returns true is surfaces have same geometrically domain + -- with given tolerance + + MovePCurves(me; aTarget: in out Face from TopoDS; + aSource: Face from TopoDS) + is virtual; + ---Purpose: Creates pcurves on aTarget face for each edge from + -- aSource one. + +fields + + myTolerance: Real; + +end; + + diff --git a/src/GEOMAlgo/BlockFix_UnionFaces.cxx b/src/GEOMAlgo/BlockFix_UnionFaces.cxx new file mode 100644 index 000000000..3f6c5220b --- /dev/null +++ b/src/GEOMAlgo/BlockFix_UnionFaces.cxx @@ -0,0 +1,531 @@ +// 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/ +// +// File: BlockFix_UnionFaces.cxx +// Created: Tue Dec 7 17:15:42 2004 +// Author: Pavel DURANDIN +// Open CASCADE SA 2004 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +//======================================================================= +//function : BlockFix_UnionFaces +//purpose : +//======================================================================= + +BlockFix_UnionFaces::BlockFix_UnionFaces() + : myTolerance(Precision::Confusion()) +{ +} + + +//======================================================================= +//function : GetTolearnce +//purpose : +//======================================================================= + +Standard_Real& BlockFix_UnionFaces::GetTolerance() +{ + return myTolerance; +} + + +//======================================================================= +//function : AddOrdinaryEdges +//purpose : auxilary +//======================================================================= +// adds edges from the shape to the sequence +// seams and equal edges are dropped +// Returns true if one of original edges dropped +static Standard_Boolean AddOrdinaryEdges(TopTools_SequenceOfShape& edges, + const TopoDS_Shape aShape, + Standard_Integer& anIndex) +{ + //map of edges + TopTools_MapOfShape aNewEdges; + //add edges without seams + for(TopExp_Explorer exp(aShape,TopAbs_EDGE); exp.More(); exp.Next()) { + TopoDS_Shape edge = exp.Current(); + if(aNewEdges.Contains(edge)) + aNewEdges.Remove(edge); + else + aNewEdges.Add(edge); + } + + Standard_Boolean isDropped = Standard_False; + //merge edges and drop seams + for(Standard_Integer i = 1; i <= edges.Length(); i++) { + TopoDS_Shape current = edges(i); + if(aNewEdges.Contains(current)) { + + aNewEdges.Remove(current); + edges.Remove(i); + i--; + + if(!isDropped) { + isDropped = Standard_True; + anIndex = i; + } + } + } + + //add edges to the sequemce + for(TopTools_MapIteratorOfMapOfShape anIter(aNewEdges); anIter.More(); anIter.Next()) + edges.Append(anIter.Key()); + + return isDropped; +} + + +//======================================================================= +//function : ClearRts +//purpose : auxilary +//======================================================================= +static Handle(Geom_Surface) ClearRts(const Handle(Geom_Surface)& aSurface) +{ + if(aSurface->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { + Handle(Geom_RectangularTrimmedSurface) rts = + Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface); + return rts->BasisSurface(); + } + return aSurface; +} + + +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + +TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape) +{ + Handle(ShapeBuild_ReShape) myContext = new ShapeBuild_ReShape; + TopoDS_Shape aResShape = myContext->Apply(Shape); + + // processing each solid + TopExp_Explorer exps; + for(exps.Init(Shape, TopAbs_SOLID); exps.More(); exps.Next()) { + TopoDS_Solid aSolid = TopoDS::Solid(exps.Current()); + + // creating map of edge faces + TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces; + TopExp::MapShapesAndAncestors(aSolid, TopAbs_EDGE, TopAbs_FACE, aMapEdgeFaces); + + // map of processed shapes + TopTools_MapOfShape aProcessed; + + Handle(ShapeBuild_ReShape) aContext = new ShapeBuild_ReShape; + + Standard_Integer NbModif=0; + Standard_Boolean hasFailed = Standard_False; + Standard_Real tol = Min(Max(Precision::Confusion(), myTolerance/10.),0.1); + // processing each face + TopExp_Explorer exp; + //for( exp.Init(Shape, TopAbs_FACE); exp.More(); exp.Next()) { + for( exp.Init(aSolid, TopAbs_FACE); exp.More(); exp.Next()) { + TopoDS_Face aFace = TopoDS::Face(exp.Current().Oriented(TopAbs_FORWARD)); + + if(aProcessed.Contains(aFace)) + continue; + + Standard_Integer dummy; + TopTools_SequenceOfShape edges; + AddOrdinaryEdges(edges,aFace,dummy); + + TopTools_SequenceOfShape faces; + faces.Append(aFace); + + //surface and location to construct result + TopLoc_Location aBaseLocation; + Handle(Geom_Surface) aBaseSurface = BRep_Tool::Surface(aFace,aBaseLocation); + aBaseSurface = ClearRts(aBaseSurface); + + // find adjacent faces to union + Standard_Integer i; + for( i = 1; i <= edges.Length(); i++) { + TopoDS_Edge edge = TopoDS::Edge(edges(i)); + if(BRep_Tool::Degenerated(edge)) + continue; + + const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge); + TopTools_ListIteratorOfListOfShape anIter(aList); + for( ; anIter.More(); anIter.Next()) { + TopoDS_Face anCheckedFace = TopoDS::Face(anIter.Value().Oriented(TopAbs_FORWARD)); + if(anCheckedFace.IsSame(aFace)) + continue; + + if(aProcessed.Contains(anCheckedFace)) + continue; + + if(IsSameDomain(aFace,anCheckedFace)) { + + if(aList.Extent() != 2) { + // non mainfold case is not processed + continue; + } + + // replacing pcurves + TopoDS_Face aMockUpFace; + BRep_Builder B; + B.MakeFace(aMockUpFace,aBaseSurface,aBaseLocation,0.); + MovePCurves(aMockUpFace,anCheckedFace); + + if(AddOrdinaryEdges(edges,aMockUpFace,dummy)) { + // sequence edges is modified + i = dummy; + } + + faces.Append(anCheckedFace); + aProcessed.Add(anCheckedFace); + break; + } + } + } + + // all faces collected in the sequence. Perform union of faces + if(faces.Length() > 1) { + NbModif++; + TopoDS_Face aResult; + BRep_Builder B; + B.MakeFace(aResult,aBaseSurface,aBaseLocation,0); + Standard_Integer nbWires = 0; + + // connecting wires + while(edges.Length()>0) { + + Standard_Boolean isEdge3d = Standard_False; + nbWires++; + TopTools_MapOfShape aVertices; + TopoDS_Wire aWire; + B.MakeWire(aWire); + + TopoDS_Edge anEdge = TopoDS::Edge(edges(1)); + edges.Remove(1); + + isEdge3d |= !BRep_Tool::Degenerated(anEdge); + B.Add(aWire,anEdge); + TopoDS_Vertex V1,V2; + TopExp::Vertices(anEdge,V1,V2); + aVertices.Add(V1); + aVertices.Add(V2); + + Standard_Boolean isNewFound = Standard_False; + do { + isNewFound = Standard_False; + for(Standard_Integer j = 1; j <= edges.Length(); j++) { + anEdge = TopoDS::Edge(edges(j)); + TopExp::Vertices(anEdge,V1,V2); + if(aVertices.Contains(V1) || aVertices.Contains(V2)) { + isEdge3d |= !BRep_Tool::Degenerated(anEdge); + aVertices.Add(V1); + aVertices.Add(V2); + B.Add(aWire,anEdge); + edges.Remove(j); + j--; + isNewFound = Standard_True; + } + } + } while (isNewFound); + + // sorting eny type of edges + aWire = TopoDS::Wire(aContext->Apply(aWire)); + + TopoDS_Face tmpF = TopoDS::Face(aContext->Apply(faces(1).Oriented(TopAbs_FORWARD))); + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(aWire,tmpF,Precision::Confusion()); + sfw->FixReorder(); + Standard_Boolean isDegRemoved = Standard_False; + if(!sfw->StatusReorder ( ShapeExtend_FAIL )) { + // clear degenerated edges if at least one with 3d curve exist + if(isEdge3d) { + Handle(ShapeExtend_WireData) sewd = sfw->WireData(); + for(Standard_Integer j = 1; j<=sewd->NbEdges();j++) { + TopoDS_Edge E = sewd->Edge(j); + if(BRep_Tool::Degenerated(E)) { + sewd->Remove(j); + isDegRemoved = Standard_True; + j--; + } + } + } + sfw->FixShifted(); + if(isDegRemoved) + sfw->FixDegenerated(); + } + TopoDS_Wire aWireFixed = sfw->Wire(); + aContext->Replace(aWire,aWireFixed); + // add resulting wire + if(isEdge3d) { + B.Add(aResult,aWireFixed); + } + else { + // sorting edges + Handle(ShapeExtend_WireData) sbwd = sfw->WireData(); + Standard_Integer nbEdges = sbwd->NbEdges(); + // sort degenerated edges and create one edge instead of several ones + ShapeAnalysis_WireOrder sawo(Standard_False, 0); + ShapeAnalysis_Edge sae; + Standard_Integer aLastEdge = nbEdges; + for(Standard_Integer j = 1; j <= nbEdges; j++) { + Standard_Real f,l; + //smh protection on NULL pcurve + Handle(Geom2d_Curve) c2d; + if(!sae.PCurve(sbwd->Edge(j),tmpF,c2d,f,l)) { + aLastEdge--; + continue; + } + sawo.Add(c2d->Value(f).XY(),c2d->Value(l).XY()); + } + sawo.Perform(); + + // constructind one degenerative edge + gp_XY aStart, anEnd, tmp; + Standard_Integer nbFirst = sawo.Ordered(1); + TopoDS_Edge anOrigE = TopoDS::Edge(sbwd->Edge(nbFirst).Oriented(TopAbs_FORWARD)); + ShapeBuild_Edge sbe; + TopoDS_Vertex aDummyV; + TopoDS_Edge E = sbe.CopyReplaceVertices(anOrigE,aDummyV,aDummyV); + sawo.XY(nbFirst,aStart,tmp); + sawo.XY(sawo.Ordered(aLastEdge),tmp,anEnd); + + gp_XY aVec = anEnd-aStart; + Handle(Geom2d_Line) aLine = new Geom2d_Line(aStart,gp_Dir2d(anEnd-aStart)); + + B.UpdateEdge(E,aLine,tmpF,0.); + B.Range(E,tmpF,0.,aVec.Modulus()); + Handle(Geom_Curve) C3d; + B.UpdateEdge(E,C3d,0.); + B.Degenerated(E,Standard_True); + TopoDS_Wire aW; + B.MakeWire(aW); + B.Add(aW,E); + B.Add(aResult,aW); + } + + } + + // perform substitution of face + aContext->Replace(aContext->Apply(aFace),aResult); + + + ShapeFix_Face sff (aResult); + //Intializing by tolerances + sff.SetPrecision(myTolerance); + sff.SetMinTolerance(tol); + sff.SetMaxTolerance(Max(1.,myTolerance*1000.)); + //Setting modes + sff.FixOrientationMode() = 0; + //sff.FixWireMode() = 0; + sff.SetContext(aContext); + // Applying the fixes + sff.Perform(); + if(sff.Status(ShapeExtend_FAIL)) + hasFailed = Standard_True; + + // breaking down to several faces + TopoDS_Shape theResult = aContext->Apply(aResult); + for(TopExp_Explorer aFaceExp(theResult,TopAbs_FACE);aFaceExp.More();aFaceExp.Next()) { + TopoDS_Face aCurrent = TopoDS::Face(aFaceExp.Current().Oriented(TopAbs_FORWARD)); + Handle(TColGeom_HArray2OfSurface) grid = new TColGeom_HArray2OfSurface ( 1, 1, 1, 1 ); + grid->SetValue ( 1, 1, aBaseSurface ); + Handle(ShapeExtend_CompositeSurface) G = new ShapeExtend_CompositeSurface ( grid ); + ShapeFix_ComposeShell CompShell; + CompShell.Init ( G, aBaseLocation, aCurrent, ::Precision::Confusion() );//myPrecision + CompShell.SetContext( aContext ); + + TopTools_SequenceOfShape parts; + ShapeFix_SequenceOfWireSegment wires; + for(TopExp_Explorer W_Exp(aCurrent,TopAbs_WIRE);W_Exp.More();W_Exp.Next()) { + Handle(ShapeExtend_WireData) sbwd = + new ShapeExtend_WireData ( TopoDS::Wire(W_Exp.Current() )); + ShapeFix_WireSegment seg ( sbwd, TopAbs_REVERSED ); + wires.Append(seg); + } + + CompShell.DispatchWires ( parts,wires ); + for (Standard_Integer j=1; j <= parts.Length(); j++ ) { + ShapeFix_Face aFixOrient(TopoDS::Face(parts(j))); + aFixOrient.SetContext(aContext); + aFixOrient.FixOrientation(); + } + + TopoDS_Shape CompRes; + if ( faces.Length() !=1 ) { + TopoDS_Shell S; + B.MakeShell ( S ); + for ( i=1; i <= parts.Length(); i++ ) + B.Add ( S, parts(i) ); + CompRes = S; + } + else CompRes = parts(1); + + aContext->Replace(aCurrent,CompRes); + } + + // remove the remaining faces + for(i = 2; i <= faces.Length(); i++) + aContext->Remove(faces(i)); + } + } + + //TopoDS_Shape aResult = Shape; + if(NbModif>0) { + TopoDS_Shape aResult = aSolid; + if(!hasFailed) { + aResult = aContext->Apply(aSolid); + + ShapeFix_Edge sfe; + for(exp.Init(aResult,TopAbs_EDGE); exp.More(); exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(exp.Current()); + sfe.FixVertexTolerance (E); + // ptv add fix same parameter + sfe.FixSameParameter(E, myTolerance); + } + + myContext->Replace(aSolid,aResult); + } + } +// else { + for( exp.Init(aSolid, TopAbs_FACE); exp.More(); exp.Next()) { + TopoDS_Face aFace = TopoDS::Face(exp.Current().Oriented(TopAbs_FORWARD)); + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire; + sfw->SetContext(myContext); + sfw->SetPrecision(myTolerance); + sfw->SetMinTolerance(myTolerance); + sfw->SetMaxTolerance(Max(1.,myTolerance*1000.)); + sfw->SetFace(aFace); + for ( TopoDS_Iterator iter(aFace,Standard_False); iter.More(); iter.Next()) { + TopoDS_Wire wire = TopoDS::Wire ( iter.Value() ); + sfw->Load(wire); + sfw->FixReorder(); + sfw->FixShifted(); + } + } +// } + + } // end processing each solid + + aResShape = myContext->Apply(Shape); + return aResShape; +} + + +//======================================================================= +//function : IsSameDomain +//purpose : +//======================================================================= + +Standard_Boolean BlockFix_UnionFaces::IsSameDomain(const TopoDS_Face& aFace, + const TopoDS_Face& aCheckedFace) const +{ + //checking the same handless + TopLoc_Location L1, L2; + Handle(Geom_Surface) S1, S2; + + S1 = BRep_Tool::Surface(aFace,L1); + S2 = BRep_Tool::Surface(aCheckedFace,L2); + + return (S1 == S2 && L1 == L2); +} + + +//======================================================================= +//function : MovePCurves +//purpose : +//======================================================================= + +void BlockFix_UnionFaces::MovePCurves(TopoDS_Face& aTarget, + const TopoDS_Face& aSource) const +{ + BRep_Builder B; + for(TopExp_Explorer wexp(aSource,TopAbs_WIRE);wexp.More();wexp.Next()) { + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire(TopoDS::Wire(wexp.Current()), + aTarget, Precision::Confusion()); + sfw->FixReorder(); + Standard_Boolean isReoredFailed = sfw->StatusReorder ( ShapeExtend_FAIL ); + sfw->FixEdgeCurves(); + if(isReoredFailed) + continue; + + sfw->FixShifted(); + sfw->FixDegenerated(); + + // remove degenerated edges from not degenerated points + ShapeAnalysis_Edge sae; + Handle(ShapeExtend_WireData) sewd = sfw->WireData(); + for(Standard_Integer i = 1; i<=sewd->NbEdges();i++) { + TopoDS_Edge E = sewd->Edge(i); + if(BRep_Tool::Degenerated(E)&&!sae.HasPCurve(E,aTarget)) { + sewd->Remove(i); + i--; + } + } + + TopoDS_Wire ResWire = sfw->Wire(); + B.Add(aTarget,ResWire); + } +} + diff --git a/src/GEOMAlgo/BlockFix_UnionFaces.jxx b/src/GEOMAlgo/BlockFix_UnionFaces.jxx new file mode 100644 index 000000000..d8f13abda --- /dev/null +++ b/src/GEOMAlgo/BlockFix_UnionFaces.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _BlockFix_UnionFaces_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo.cdl b/src/GEOMAlgo/GEOMAlgo.cdl new file mode 100755 index 000000000..40a2084be --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo.cdl @@ -0,0 +1,124 @@ +// 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/ +// +-- File: GEOMAlgo.cdl +-- Created: Sat Dec 04 12:36:22 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +package GEOMAlgo + + ---Purpose: + +uses + TCollection, + TColStd, + Geom, + Bnd, + gp, + GeomAdaptor, + TopAbs, + TopoDS, + TopTools, + IntTools, + BOPTools, + BOP + +is + -- enumerations + -- + enumeration State is + ST_UNKNOWN, + ST_IN, + ST_OUT, + ST_ON, + ST_ONIN, + ST_ONOUT, + ST_INOUT + end State; + -- + -- classes + -- + deferred class Algo; + deferred class ShapeAlgo; + -- + -- gluer + class Gluer; + class GlueAnalyser; + class CoupleOfShapes; + class PassKey; + class PassKeyMapHasher; + class PassKeyShape; + class SurfaceTools; + class Tools; + + -- + -- finder on + deferred class ShapeSolid; + class WireSolid; + class ShellSolid; + class VertexSolid; + class SolidSolid; + class FinderShapeOn; + -- + class FinderShapeOn1; + class StateCollector; + -- + -- instantiations + class IndexedDataMapOfPassKeyShapeListOfShape + instantiates IndexedDataMap from TCollection (PassKeyShape from GEOMAlgo, + ListOfShape from TopTools, + PassKeyMapHasher from GEOMAlgo); + + class IndexedDataMapOfShapeBox + instantiates IndexedDataMap from TCollection (Shape from TopoDS, + Box from Bnd, + ShapeMapHasher from TopTools); + class IndexedDataMapOfIntegerShape + instantiates IndexedDataMap from TCollection (Integer from Standard, + Shape from TopoDS, + MapIntegerHasher from TColStd); + + class ListOfCoupleOfShapes + instantiates List from TCollection (CoupleOfShapes from GEOMAlgo); + + + class IndexedDataMapOfShapeState + instantiates IndexedDataMap from TCollection (Shape from TopoDS, + State from TopAbs, + ShapeMapHasher from TopTools); +-- + class ListOfPnt + instantiates List from TCollection (Pnt from gp); + +-- class IndexedDataMapOfPassKeyInteger +-- instantiates IndexedDataMap from TCollection (PassKeyRoot from GEOMAlgo, +-- Integer from Standard, +-- PassKeyMapHasher from GEOMAlgo); + + + class DataMapOfPassKeyInteger + instantiates DataMap from TCollection (PassKey from GEOMAlgo, + Integer from Standard, + PassKeyMapHasher from GEOMAlgo); + + +end GEOMAlgo; diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.cdl b/src/GEOMAlgo/GEOMAlgo_Algo.cdl new file mode 100755 index 000000000..d8cd5b175 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Algo.cdl @@ -0,0 +1,58 @@ +// 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/ +// +-- File: GEOMAlgo_Algo.cdl +-- Created: Sat Dec 04 12:37:56 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +deferred class Algo from GEOMAlgo + + ---Purpose: + +--uses +--raises + +is + Initialize + returns Algo from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_Algo();" + + Perform(me:out) + is deferred; + + CheckData(me:out) + is virtual protected; + + CheckResult(me:out) + is virtual protected; + + ErrorStatus (me) + returns Integer from Standard; + + WarningStatus (me) + returns Integer from Standard; + +fields + myErrorStatus : Integer from Standard is protected; + myWarningStatus : Integer from Standard is protected; + +end Algo; diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.cxx b/src/GEOMAlgo/GEOMAlgo_Algo.cxx new file mode 100755 index 000000000..8f4aecacb --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Algo.cxx @@ -0,0 +1,78 @@ +// 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/ +// +// File: GEOMAlgo_Algo.cxx +// Created: Sat Dec 04 12:39:47 2004 +// Author: Peter KURNEV +// + + +#include + +//======================================================================= +// function: +// purpose: +//======================================================================= + GEOMAlgo_Algo::GEOMAlgo_Algo() +: + myErrorStatus(1), + myWarningStatus(0) +{} +//======================================================================= +// function: ~ +// purpose: +//======================================================================= + GEOMAlgo_Algo::~GEOMAlgo_Algo() +{ +} +//======================================================================= +// function: CheckData +// purpose: +//======================================================================= + void GEOMAlgo_Algo::CheckData() +{ + myErrorStatus=0; +} +//======================================================================= +// function: CheckResult +// purpose: +//======================================================================= + void GEOMAlgo_Algo::CheckResult() +{ + myErrorStatus=0; +} +//======================================================================= +// function: ErrorStatus +// purpose: +//======================================================================= + Standard_Integer GEOMAlgo_Algo::ErrorStatus()const +{ + return myErrorStatus; +} +//======================================================================= +// function: WarningStatus +// purpose: +//======================================================================= + Standard_Integer GEOMAlgo_Algo::WarningStatus()const +{ + return myWarningStatus; +} +// myErrorStatus +// +// 1 - object is just initialized diff --git a/src/GEOMAlgo/GEOMAlgo_Algo.jxx b/src/GEOMAlgo/GEOMAlgo_Algo.jxx new file mode 100644 index 000000000..58dc7b7aa --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Algo.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _GEOMAlgo_Algo_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl new file mode 100644 index 000000000..d607e55c4 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cdl @@ -0,0 +1,67 @@ +// 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/ +// +-- File: GEOMAlgo_CoupleOfShapes.cdl +-- Created: Wed Dec 15 13:00:10 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class CoupleOfShapes from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS + +--raises + +is + Create + returns CoupleOfShapes from GEOMAlgo; + + SetShapes(me:out; + aS1: Shape from TopoDS; + aS2: Shape from TopoDS); + + SetShape1(me:out; + aS1: Shape from TopoDS); + + SetShape2(me:out; + aS2: Shape from TopoDS); + + Shapes(me; + aS1:out Shape from TopoDS; + aS2:out Shape from TopoDS); + + Shape1(me) + returns Shape from TopoDS; + ---C++:return const & + + Shape2(me) + returns Shape from TopoDS; + ---C++:return const & + +fields + + myShape1: Shape from TopoDS is protected; + myShape2: Shape from TopoDS is protected; + +end CoupleOfShapes; diff --git a/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx new file mode 100644 index 000000000..20b103c7d --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.cxx @@ -0,0 +1,84 @@ +// 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/ +// +// File: GEOMAlgo_CoupleOfShapes.cxx +// Created: Wed Dec 15 13:03:52 2004 +// Author: Peter KURNEV +// + + +#include +//======================================================================= +//function : GEOMAlgo_CoupleOfShapes +//purpose : +//======================================================================= +GEOMAlgo_CoupleOfShapes::GEOMAlgo_CoupleOfShapes() +{} +//======================================================================= +//function : SetShapes +//purpose : +//======================================================================= +void GEOMAlgo_CoupleOfShapes::SetShapes(const TopoDS_Shape& aS1, + const TopoDS_Shape& aS2) +{ + myShape1=aS1; + myShape2=aS2; +} +//======================================================================= +//function : Shapes +//purpose : +//======================================================================= +void GEOMAlgo_CoupleOfShapes::Shapes(TopoDS_Shape& aS1, + TopoDS_Shape& aS2)const +{ + aS1=myShape1; + aS2=myShape2; +} +//======================================================================= +//function : SetShape1 +//purpose : +//======================================================================= +void GEOMAlgo_CoupleOfShapes::SetShape1(const TopoDS_Shape& aS1) +{ + myShape1=aS1; +} +//======================================================================= +//function : SetShape2 +//purpose : +//======================================================================= +void GEOMAlgo_CoupleOfShapes::SetShape2(const TopoDS_Shape& aS2) +{ + myShape2=aS2; +} +//======================================================================= +//function : Shape1 +//purpose : +//======================================================================= +const TopoDS_Shape& GEOMAlgo_CoupleOfShapes::Shape1()const +{ + return myShape1; +} +//======================================================================= +//function : Shape2 +//purpose : +//======================================================================= +const TopoDS_Shape& GEOMAlgo_CoupleOfShapes::Shape2()const +{ + return myShape2; +} diff --git a/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.jxx b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.jxx new file mode 100644 index 000000000..9b4972d64 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_CoupleOfShapes.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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_CoupleOfShapes_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl new file mode 100644 index 000000000..7dff18472 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cdl @@ -0,0 +1,115 @@ +// 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/ +// +-- File: GEOMAlgo_FinderShapeOn.cdl +-- Created: Tue Jan 11 14:35:52 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class FinderShapeOn from GEOMAlgo + inherits ShapeAlgo from GEOMAlgo + + ---Purpose: + +uses + Surface from Geom, + ShapeEnum from TopAbs, + ListOfShape from TopTools, + DataMapOfShapeShape from TopTools, + Shape from TopoDS, + State from GEOMAlgo, + IndexedDataMapOfShapeState from GEOMAlgo + +--raises + +is + Create + returns FinderShapeOn from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_FinderShapeOn();" + + Perform(me:out) + is redefined; + + SetSurface(me:out; + aS:Surface from Geom); + + SetShapeType(me:out; + aST:ShapeEnum from TopAbs); + + SetState(me:out; + aSF:State from GEOMAlgo); + + Surface(me) + returns Surface from Geom; + ---C++: return const & + + ShapeType(me) + returns ShapeEnum from TopAbs; + + State(me) + returns State from GEOMAlgo; + + Shapes(me) + returns ListOfShape from TopTools; + ---C++: return const & + + -- + -- protected methods + -- + CheckData(me:out) + is redefined protected; + + MakeArgument1(me:out) + is protected; + + MakeArgument2(me:out) + is protected; + + Find(me:out) + is protected; + + Find(me:out; + aS:Shape from TopoDS) + is protected; + + FindVertices(me:out) + is protected; + + CopySource(myclass; + aS :Shape from TopoDS; + aImages : out DataMapOfShapeShape from TopTools; + aOriginals: out DataMapOfShapeShape from TopTools; + aSC : out Shape from TopoDS); + + + +fields + mySurface : Surface from Geom is protected; + myShapeType : ShapeEnum from TopAbs is protected; + myState : State from GEOMAlgo is protected; + myArg1 : Shape from TopoDS is protected; + myArg2 : Shape from TopoDS is protected; + myLS : ListOfShape from TopTools is protected; + myImages : DataMapOfShapeShape from TopTools is protected; + myMSS : IndexedDataMapOfShapeState from GEOMAlgo is protected; + myIsAnalytic : Boolean from Standard is protected; + +end FinderShapeOn; diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx new file mode 100644 index 000000000..50e94384a --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.cxx @@ -0,0 +1,547 @@ +// 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/ +// +// File: GEOMAlgo_FinderShapeOn.cxx +// Created: Tue Jan 11 14:44:31 2005 +// 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 + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GEOMAlgo_FinderShapeOn +//purpose : +//======================================================================= +GEOMAlgo_FinderShapeOn::GEOMAlgo_FinderShapeOn() +: + GEOMAlgo_ShapeAlgo() +{ + myTolerance=0.0001; + myShapeType=TopAbs_VERTEX; + myState=GEOMAlgo_ST_UNKNOWN; + myIsAnalytic=Standard_True; +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_FinderShapeOn::~GEOMAlgo_FinderShapeOn() +{ +} +//======================================================================= +//function : SetSurface +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::SetSurface(const Handle(Geom_Surface)& aS) +{ + mySurface=aS; +} +//======================================================================= +//function : Surface +//purpose : +//======================================================================= +const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn::Surface() const +{ + return mySurface; +} +//======================================================================= +//function : SetShapeType +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::SetShapeType(const TopAbs_ShapeEnum aType) +{ + myShapeType=aType; +} +//======================================================================= +//function : ShapeType +//purpose : +//======================================================================= +TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn::ShapeType()const +{ + return myShapeType; +} +//======================================================================= +//function : SetState +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::SetState(const GEOMAlgo_State aState) +{ + myState=aState; +} +//======================================================================= +//function : State +//purpose : +//======================================================================= +GEOMAlgo_State GEOMAlgo_FinderShapeOn::State() const +{ + return myState; +} +//======================================================================= +// function: Shapes +// purpose: +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn::Shapes() const +{ + Standard_Boolean bIsConformState; + Standard_Integer i, aNb; + TopAbs_State aSt; + TopTools_ListOfShape* pL; + // + pL=(TopTools_ListOfShape*) &myLS; + pL->Clear(); + // + aNb=myMSS.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myMSS.FindKey(i); + aSt=myMSS.FindFromIndex(i); + // + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + if (bIsConformState) { + pL->Append(aS); + } + } + return myLS; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::Perform() +{ + myErrorStatus=0; + myWarningStatus=0; + myLS.Clear(); + myMSS.Clear(); + // + if (!myResult.IsNull()){ + myResult.Nullify(); + } + // + CheckData(); + if(myErrorStatus) { + return; + } + // + myIsAnalytic=GEOMAlgo_SurfaceTools::IsAnalytic(mySurface); + // + MakeArgument1(); + if(myErrorStatus) { + return; + } + // + if (myIsAnalytic && myShapeType==TopAbs_VERTEX) { + FindVertices(); + return; + } + // + MakeArgument2(); + if(myErrorStatus) { + return; + } + // + Find(); + if(myErrorStatus || myWarningStatus) { + return; + } + // +} +//======================================================================= +//function : FindVertices +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::FindVertices() +{ + Standard_Integer i, aNb, iErr; + TopAbs_State aSt; + TopAbs_Orientation aOr; + gp_Pnt aP; + TopTools_IndexedMapOfShape aM; + // + TopExp::MapShapes(myArg1, TopAbs_FACE, aM); + const TopoDS_Face& aF=TopoDS::Face(aM(1)); + aOr=aF.Orientation(); + // + aM.Clear(); + TopExp::MapShapes(myShape, myShapeType, aM); + aNb=aM.Extent(); + if (!aNb) { + myWarningStatus=10; // No found subshapes of type myShapeType + return; + } + // + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + const TopoDS_Vertex& aV=TopoDS::Vertex(aS); + aP=BRep_Tool::Pnt(aV); + iErr=GEOMAlgo_SurfaceTools::GetState(aP, mySurface, myTolerance, aSt); + if (aOr==TopAbs_REVERSED) { + aSt=GEOMAlgo_SurfaceTools::ReverseState(aSt); + } + myMSS.Add(aS, aSt); + } +} +//======================================================================= +//function : Find +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::Find() +{ + Standard_Integer i, aNb; + Standard_Boolean bICS; + TopTools_IndexedMapOfShape aM; + // + TopExp::MapShapes(myArg2, myShapeType, aM); + // + aNb=aM.Extent(); + if (!aNb) { + myWarningStatus=10; // No found subshapes of type myShapeType + return; + } + // + bICS=GEOMAlgo_Tools::IsCompositeShape(myArg2); + if (!bICS || myIsAnalytic) { + TopoDS_Compound aCmp; + BRep_Builder aBB; + // + aBB.MakeCompound(aCmp); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aSi=aM(i); + aBB.Add(aCmp, aSi); + } + // + aM.Clear(); + aM.Add(aCmp); + aNb=1; + } + // + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + Find(aS); + if (myErrorStatus) { + return; + } + } +} +//======================================================================= +//function : Find +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::Find(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + // + Standard_Boolean bIsDone; + Standard_Integer i, iErr; + TopAbs_State aSts[]={TopAbs_IN, TopAbs_OUT, TopAbs_ON}; + TopTools_ListIteratorOfListOfShape aIt; + BOPTools_DSFiller aDF; + // + // 1. Prepare DSFiller + aDF.SetShapes (myArg1, aS); + bIsDone=aDF.IsDone(); + if (!bIsDone) { + myErrorStatus=30; // wrong args are used for DSFiller + return; + } + aDF.Perform(); + bIsDone=aDF.IsDone(); + if (!bIsDone) { + myErrorStatus=31; // DSFiller failed + return; + } + // + // 2. Find shapes + GEOMAlgo_ShapeSolid* pSS; + GEOMAlgo_VertexSolid aVXS; + GEOMAlgo_WireSolid aWRS; + GEOMAlgo_ShellSolid aSHS; + GEOMAlgo_SolidSolid aSLS; + // + pSS=NULL; + // + switch (myShapeType) { + case TopAbs_VERTEX: + pSS=&aVXS; + break; + case TopAbs_EDGE: + pSS=&aWRS; + break; + case TopAbs_FACE: + pSS=&aSHS; + break; + case TopAbs_SOLID: + aSLS.SetShape2(myArg2); + pSS=&aSLS; + break; + default: + myErrorStatus=12; // unallowed subshape type + return; + } + // + pSS->SetFiller(aDF); + pSS->Perform(); + iErr=pSS->ErrorStatus(); + if (iErr) { + myErrorStatus=32; // builder ShapeSolid failed + return; + } + // + for (i=0; i<3; ++i) { + const TopTools_ListOfShape& aLS=pSS->Shapes(aSts[i]); + aIt.Initialize(aLS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSImage=aIt.Value(); + if (myImages.IsBound(aSImage)) { + const TopoDS_Shape& aSx=myImages.Find(aSImage); + myMSS.Add(aSx, aSts[i]); + } + else { + myErrorStatus=33;// can not find original shape + return; + } + } + } +} +//======================================================================= +//function : MakeArgument1 +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::MakeArgument1() +{ + myErrorStatus=0; + // + Standard_Integer i, aNb; + TopAbs_ShapeEnum aType; + BRepLib_FaceError aFErr; + BRepLib_MakeFace aMF; + TopTools_IndexedMapOfShape aM; + BRep_Builder aBB; + TopoDS_Face aFace; + TopoDS_Shell aSh; + TopoDS_Solid aSd; + // + // Argument 1 + if (!myIsAnalytic) { + aMF.Init(mySurface, Standard_True); + aFErr=aMF.Error(); + if (aFErr!=BRepLib_FaceDone) { + myErrorStatus=20; // can not build the face + return; + } + // + const TopoDS_Shape& aF=aMF.Shape(); + aFace=TopoDS::Face(aF); + // + // update tolerances + aM.Add(aF); + TopExp::MapShapes(aF, TopAbs_VERTEX, aM); + TopExp::MapShapes(aF, TopAbs_EDGE, aM); + aNb=aM.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=aM(i); + aType=aS.ShapeType(); + switch (aType) { + case TopAbs_VERTEX: { + const TopoDS_Vertex& aVx=TopoDS::Vertex(aS); + aBB.UpdateVertex(aVx, myTolerance); + } + break; + case TopAbs_EDGE: { + const TopoDS_Edge& aEx=TopoDS::Edge(aS); + aBB.UpdateEdge(aEx, myTolerance); + } + break; + case TopAbs_FACE: { + const TopoDS_Face& aFx=TopoDS::Face(aS); + aBB.UpdateFace(aFx, myTolerance); + } + break; + default: + break; + } + } + } // + else { + aBB.MakeFace(aFace, mySurface, myTolerance); + } + // + // make solid + aBB.MakeShell(aSh); + aBB.Add(aSh, aFace); + aBB.MakeSolid(aSd); + aBB.Add(aSd, aSh); + myArg1=aSd; +} +//======================================================================= +//function : MakeArgument2 +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::MakeArgument2() +{ + myErrorStatus=0; + // + TopoDS_Shape aSC; + TopTools_DataMapOfShapeShape aOriginals; + // + myImages.Clear(); + // + GEOMAlgo_FinderShapeOn::CopySource(myShape, myImages, aOriginals, aSC); + // + myArg2=aSC; +} +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::CheckData() +{ + myErrorStatus=0; + // + if(mySurface.IsNull()) { + myErrorStatus=10; // mySurface=NULL + return; + } + // + if (myShape.IsNull()) { + myErrorStatus=11; // myShape=NULL + return; + } + // + if (!(myShapeType==TopAbs_VERTEX || + myShapeType==TopAbs_EDGE || + myShapeType==TopAbs_FACE || + myShapeType==TopAbs_SOLID)) { + myErrorStatus=12; // unallowed subshape type + return; + } + // + if (myState==GEOMAlgo_ST_UNKNOWN || + myState==GEOMAlgo_ST_INOUT) { + myErrorStatus=13; // unallowed state type + return; + } +} +// +//======================================================================= +//function : CopySource +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE, + TopTools_DataMapOfShapeShape& aImages, + TopTools_DataMapOfShapeShape& aOriginals, + TopoDS_Shape& aEx) +{ + Standard_Boolean bFree; + TopAbs_ShapeEnum aType; + Standard_Integer aR; + BRep_Builder BB; + TopoDS_Iterator aIt; + // + aType=aE.ShapeType(); + // + if (aOriginals.IsBound(aE)) { + aEx=aOriginals.ChangeFind(aE); + return; + } + else { + aEx=aE.EmptyCopied(); + aOriginals.Bind(aE, aEx); + aImages.Bind(aEx, aE); + } + // + aR=(Standard_Integer)aType+1; + if (aR>TopAbs_VERTEX) { + return; + } + // + bFree=aEx.Free(); + aEx.Free(Standard_True); + // + aType=(TopAbs_ShapeEnum) aR; + // + aIt.Initialize(aE);//, Standard_False); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aV=aIt.Value(); + TopoDS_Shape aVx; + // + CopySource (aV, aImages, aOriginals, aVx); + // + aVx.Orientation(aV.Orientation()); + BB.Add(aEx, aVx); + } + // + aEx.Free(bFree); +} + +// +// myErrorStatus : +// +// 10 -mySurface=NULL +// 11 -myShape=NULL +// 12 -unallowed type of subshapes +// 13 -unallowed state +// 20 -can not build the face +// 30 -wrong args are used for DSFiller +// 31 -DSFiller failed +// 32 -builder ShapeSolid failed +// 33 -can not find original shape +// +// myWarningStatus +// +// 10 -subshapes of type myShapeType can not be fond in myShape + diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx new file mode 100644 index 000000000..99b4e86f3 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn.jxx @@ -0,0 +1,34 @@ +// 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/ +// +#ifndef _Geom_Surface_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopTools_DataMapOfShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_FinderShapeOn_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl new file mode 100644 index 000000000..46ee5fad9 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cdl @@ -0,0 +1,143 @@ +// 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/ +// +-- File: GEOMAlgo_FinderShapeOn1.cdl +-- Created: Fri Mar 4 10:26:54 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class FinderShapeOn1 from GEOMAlgo + inherits ShapeAlgo from GEOMAlgo + + ---Purpose: + +uses + Surface from Geom, + Surface from GeomAdaptor, + + ShapeEnum from TopAbs, + State from TopAbs, + Face from TopoDS, + Edge from TopoDS, + ListOfShape from TopTools, + + State from GEOMAlgo, + ListOfPnt from GEOMAlgo, + IndexedDataMapOfShapeState from GEOMAlgo + +--raises + +is + Create + returns FinderShapeOn1 from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_FinderShapeOn1();" + + SetSurface(me:out; + aS:Surface from Geom); + + SetShapeType(me:out; + aST:ShapeEnum from TopAbs); + + SetState(me:out; + aSF:State from GEOMAlgo); + + SetNbPntsMin(me:out; + aNb:Integer from Standard); + + NbPntsMin(me) + returns Integer from Standard; + + SetNbPntsMax(me:out; + aNb:Integer from Standard); + + NbPntsMax(me) + returns Integer from Standard; + + Surface(me) + returns Surface from Geom; + ---C++: return const & + + ShapeType(me) + returns ShapeEnum from TopAbs; + + State(me) + returns State from GEOMAlgo; + + Perform(me:out) + is redefined; + + Shapes(me) + returns ListOfShape from TopTools; + ---C++: return const & + -- + -- protected methods + -- + CheckData(me:out) + is redefined protected; + + ProcessVertices(me:out) + is protected; + + ProcessEdges(me:out) + is protected; + + ProcessFaces(me:out) + is protected; + + ProcessSolids(me:out) + is protected; + + InnerPoints(me:out; + aF :Face from TopoDS; + aLP:out ListOfPnt from GEOMAlgo) + is protected; + + InnerPoints(me:out; + aE :Edge from TopoDS; + aLP:out ListOfPnt from GEOMAlgo) + is protected; + + InnerPoints(me:out; + aE :Edge from TopoDS; + aNbPnts: Integer from Standard; + aLP:out ListOfPnt from GEOMAlgo) + is protected; + + MSS (me) + returns IndexedDataMapOfShapeState from GEOMAlgo; + ---C++:return const & + + GetPointState(me:out; aP: Pnt from gp) + returns State from TopAbs is virtual protected; + +fields + mySurface : Surface from Geom is protected; + myShapeType : ShapeEnum from TopAbs is protected; + myState : State from GEOMAlgo is protected; + myNbPntsMin : Integer from Standard is protected; + myNbPntsMax : Integer from Standard is protected; + -- + myGAS : Surface from GeomAdaptor is protected; + myLS : ListOfShape from TopTools is protected; + -- + myMSS : IndexedDataMapOfShapeState from GEOMAlgo is protected; + +end FinderShapeOn1; diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx new file mode 100644 index 000000000..c58cccefb --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.cxx @@ -0,0 +1,854 @@ +// 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/ +// +// File: GEOMAlgo_FinderShapeOn1.cxx +// Created: Fri Mar 4 10:31:06 2005 +// 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 +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + + +//======================================================================= +//function : GEOMAlgo_FinderShapeOn1 +//purpose : +//======================================================================= +GEOMAlgo_FinderShapeOn1::GEOMAlgo_FinderShapeOn1() +: + GEOMAlgo_ShapeAlgo() +{ + myTolerance=0.0001; + myShapeType=TopAbs_VERTEX; + myState=GEOMAlgo_ST_UNKNOWN; + myNbPntsMin=3; + myNbPntsMax=0; +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_FinderShapeOn1::~GEOMAlgo_FinderShapeOn1() +{ +} +//======================================================================= +//function : SetSurface +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::SetSurface(const Handle(Geom_Surface)& aS) +{ + mySurface=aS; +} +//======================================================================= +//function : Surface +//purpose : +//======================================================================= +const Handle(Geom_Surface)& GEOMAlgo_FinderShapeOn1::Surface() const +{ + return mySurface; +} +//======================================================================= +//function : SetShapeType +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::SetShapeType(const TopAbs_ShapeEnum aType) +{ + myShapeType=aType; +} +//======================================================================= +//function : ShapeType +//purpose : +//======================================================================= +TopAbs_ShapeEnum GEOMAlgo_FinderShapeOn1::ShapeType()const +{ + return myShapeType; +} +//======================================================================= +//function : SetState +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::SetState(const GEOMAlgo_State aState) +{ + myState=aState; +} +//======================================================================= +//function : State +//purpose : +//======================================================================= +GEOMAlgo_State GEOMAlgo_FinderShapeOn1::State() const +{ + return myState; +} +//======================================================================= +//function : SetNbPntsMin +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::SetNbPntsMin(const Standard_Integer aNb) +{ + myNbPntsMin=aNb; +} +//======================================================================= +//function : NbPntsMin +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMin()const +{ + return myNbPntsMin; +} +//======================================================================= +//function : SetNbPntsMax +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::SetNbPntsMax(const Standard_Integer aNb) +{ + myNbPntsMax=aNb; +} +//======================================================================= +//function : NbPntsMax +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_FinderShapeOn1::NbPntsMax()const +{ + return myNbPntsMax; +} +//======================================================================= +// function: MSS +// purpose: +//======================================================================= +const GEOMAlgo_IndexedDataMapOfShapeState& GEOMAlgo_FinderShapeOn1::MSS() const +{ + return myMSS; +} +//======================================================================= +// function: Shapes +// purpose: +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_FinderShapeOn1::Shapes() const +{ + Standard_Integer i, aNb; + TopTools_ListOfShape* pL; + // + pL=(TopTools_ListOfShape*) &myLS; + pL->Clear(); + // + aNb=myMSS.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myMSS.FindKey(i); + if (aS.ShapeType()==myShapeType) { + pL->Append(aS); + } + } + return myLS; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::Perform() +{ + myErrorStatus=0; + myWarningStatus=0; + myLS.Clear(); + myMSS.Clear(); + // + CheckData(); + if(myErrorStatus) { + return; + } + // + // 1 + ProcessVertices(); + if(myErrorStatus) { + return; + } + if (myShapeType==TopAbs_VERTEX) { + return; + } + // + // 2 + ProcessEdges(); + if(myErrorStatus) { + return; + } + if (myShapeType==TopAbs_EDGE) { + return; + } + // + // 3 + ProcessFaces(); + if(myErrorStatus) { + return; + } + if (myShapeType==TopAbs_FACE) { + return; + } + // + // 4 + ProcessSolids(); + // +} +//======================================================================= +//function : ProcessVertices +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::ProcessVertices() +{ + myErrorStatus=0; + // + Standard_Boolean bIsConformState; + Standard_Integer i, aNb; + gp_Pnt aP; + TopTools_IndexedMapOfShape aM; + TopAbs_State aSt; + // + TopExp::MapShapes(myShape, TopAbs_VERTEX, aM); + aNb=aM.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Vertex& aV=TopoDS::Vertex(aM(i)); + aP=BRep_Tool::Pnt(aV); + // + aSt = GetPointState( aP ); + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + // + if (myShapeType==TopAbs_VERTEX){ + if (bIsConformState) { + myMSS.Add(aV, aSt); + } + } + else if (bIsConformState || aSt==TopAbs_ON) { + myMSS.Add(aV, aSt); + } + } +} +//======================================================================= +//function : ProcessEdges +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::ProcessEdges() +{ + myErrorStatus=0; + // + Standard_Boolean bIsConformState, bIsToBreak; + Standard_Integer i, aNb, iCnt; + TopAbs_State aSt; + TopTools_IndexedMapOfShape aM; + TopExp_Explorer aExp; + GEOMAlgo_ListIteratorOfListOfPnt aIt; + GeomAbs_SurfaceType aType1; + // + aType1=myGAS.GetType(); + // + TopExp::MapShapes(myShape, TopAbs_EDGE, aM); + aNb=aM.Extent(); + for (i=1; i<=aNb; ++i) { + GEOMAlgo_ListOfPnt aLP; + GEOMAlgo_StateCollector aSC; + // + const TopoDS_Edge& aE=TopoDS::Edge(aM(i)); + // + aExp.Init(aE, TopAbs_VERTEX); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aV=aExp.Current(); + // + bIsConformState=myMSS.Contains(aV); + if (!bIsConformState) { + break;// vertex has non-conformed state + } + else { + aSt=myMSS.FindFromKey(aV); + aSC.AppendState(aSt); + } + } + // + if (!bIsConformState) { + continue; // vertex has non-conformed state,skip edge + } + // + if (BRep_Tool::Degenerated(aE)) { + myMSS.Add(aE, aSt); + continue; + } + // + if (myState==GEOMAlgo_ST_ON && aType1==GeomAbs_Sphere) { + Standard_Real aT1, aT2; + Handle(Geom_Curve) aC; + GeomAdaptor_Curve aGAC; + GeomAbs_CurveType aType2; + // + aC=BRep_Tool::Curve(aE, aT1, aT2); + aGAC.Load(aC); + // + aType2=aGAC.GetType(); + if (aType2==GeomAbs_Line) { + continue; + } + } + // + InnerPoints(aE, aLP); + if (myErrorStatus) { + return; + } + // + bIsConformState=Standard_True; + aIt.Initialize(aLP); + for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) { + if (myNbPntsMax) { + if (iCnt > myNbPntsMax) { + break; + } + } + // + const gp_Pnt& aP=aIt.Value(); + aSt = GetPointState( aP ); + bIsToBreak=aSC.AppendState(aSt); + if (bIsToBreak) { + break; + } + } + // + aSt=aSC.State(); + // + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + if (myShapeType==TopAbs_EDGE) { + if (bIsConformState) { + myMSS.Add(aE, aSt); + } + } + else if (bIsConformState || aSt==TopAbs_ON) { + myMSS.Add(aE, aSt); + } + } // for (i=1; i<=aNb; ++i) next edge +} +//======================================================================= +//function : ProcessFaces +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::ProcessFaces() +{ + myErrorStatus=0; + // + Standard_Boolean bIsConformState, bIsToBreak; + Standard_Integer i, aNbF, iCnt; + TopAbs_State aSt; + TopTools_IndexedMapOfShape aM; + TopExp_Explorer aExp; + GEOMAlgo_ListIteratorOfListOfPnt aIt; + GeomAbs_SurfaceType aType1, aType2; + // + aType1=myGAS.GetType(); + // + TopExp::MapShapes(myShape, TopAbs_FACE, aM); + aNbF=aM.Extent(); + for (i=1; i<=aNbF; ++i) { + GEOMAlgo_StateCollector aSC; + GEOMAlgo_ListOfPnt aLP; + // + const TopoDS_Face& aF=TopoDS::Face(aM(i)); + // + if (myState==GEOMAlgo_ST_ON) { + Handle(Geom_Surface) aS; + GeomAdaptor_Surface aGAS; + // + aS=BRep_Tool::Surface(aF); + aGAS.Load(aS); + aType2=aGAS.GetType(); + if (aType2!=aType1) { + continue; + } + } + // + aExp.Init(aF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aE=aExp.Current(); + bIsConformState=myMSS.Contains(aE); + if (!bIsConformState) { + break;// edge has non-conformed state + } + else { + aSt=myMSS.FindFromKey(aE); + aSC.AppendState(aSt); + } + } + // + if (!bIsConformState) { + continue; // edge has non-conformed state,skip face + } + // + InnerPoints(aF, aLP); + if (myErrorStatus) { + return; + } + // + bIsConformState=Standard_True; + aIt.Initialize(aLP); + for (iCnt=0; aIt.More(); aIt.Next(), ++iCnt) { + if (myNbPntsMax) { + if (iCnt > myNbPntsMax) { + break; + } + } + // + const gp_Pnt& aP=aIt.Value(); + aSt = GetPointState( aP ); + bIsToBreak=aSC.AppendState(aSt); + if (bIsToBreak) { + break; + } + } + // + aSt=aSC.State(); + // + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + if (myShapeType==TopAbs_FACE) { + if (bIsConformState) { + myMSS.Add(aF, aSt); + } + } + else if (bIsConformState || aSt==TopAbs_ON) { + myMSS.Add(aF, aSt); + } + }// for (i=1; i<=aNb; ++i) next face +} +//======================================================================= +//function : ProcessSolids +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::ProcessSolids() +{ + myErrorStatus=0; + // + Standard_Boolean bIsConformState; + Standard_Integer i, aNbS, j, aNbF; + TopTools_IndexedMapOfShape aM, aMF; + TopAbs_State aSt; + // + TopExp::MapShapes(myShape, TopAbs_SOLID, aM); + aNbS=aM.Extent(); + for (i=1; i<=aNbS; ++i) { + GEOMAlgo_StateCollector aSC; + // + const TopoDS_Shape& aSd=aM(i); + aMF.Clear(); + TopExp::MapShapes(aSd, TopAbs_FACE, aMF); + aNbF=aMF.Extent(); + for (j=1; j<=aNbF; ++j) { + const TopoDS_Shape& aF=aMF(j); + bIsConformState=myMSS.Contains(aF); + if (!bIsConformState) { + break;// face has non-conformed state + } + else { + aSt=myMSS.FindFromKey(aF); + aSC.AppendState(aSt); + } + } + // + if (!bIsConformState) { + continue; // face has non-conformed state,skip solid + } + // + aSt=aSC.State(); + // + bIsConformState=GEOMAlgo_SurfaceTools::IsConformState(aSt, myState); + if (bIsConformState) { + myMSS.Add(aSd, aSt); + } + } +} +// +//======================================================================= +//function : InnerPoints +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF, + GEOMAlgo_ListOfPnt& aLP) +{ + myErrorStatus=0; + // + Standard_Integer j, j1, j2, k, n[4], aNbLinks, aNx, aNbMax, aNb; + Standard_Integer iCnt, *pIds; + TopLoc_Location aLoc; + Handle(Poly_Triangulation) aTRF; + TColStd_MapOfInteger aMBN; + GEOMAlgo_DataMapOfPassKeyInteger aMPKI; + GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger aIt; + gp_Pnt aP, aP1, aP2; + // + aLP.Clear(); + // + aTRF=BRep_Tool::Triangulation(aF, aLoc); + if (aTRF.IsNull()) { + myErrorStatus=20; // no triangulation found + return; + } + // + const gp_Trsf& aTrsf=aLoc.Transformation(); + const Poly_Array1OfTriangle& aTrs=aTRF->Triangles(); + const TColgp_Array1OfPnt& aNodes=aTRF->Nodes(); + // + // map link/nbtriangles + j1=aTrs.Lower(); + j2=aTrs.Upper(); + for (j=j1; j<=j2; ++j) { + const Poly_Triangle& aTr=aTrs(j); + aTr.Get(n[0], n[1], n[2]); + n[3]=n[0]; + for (k=0; k<3; ++k) { + GEOMAlgo_PassKey aPK; + // + aPK.SetIds(n[k], n[k+1]); + if (aMPKI.IsBound(aPK)) { + Standard_Integer& iCntX=aMPKI.ChangeFind(aPK); + ++iCntX; + } + else { + aMPKI.Bind(aPK, 1); + } + } + } + // + // boundary nodes aMBN + aNbLinks=aMPKI.Extent(); + aIt.Initialize(aMPKI); + for (; aIt.More(); aIt.Next()) { + iCnt=aIt.Value(); + if (iCnt==1) { + const GEOMAlgo_PassKey& aPK=aIt.Key(); + aNbMax=aPK.NbMax(); + pIds=(Standard_Integer*)aPK.Key(); + for (k=1; k<3; ++k) { + aNx=*(pIds+aNbMax-k); + aMBN.Add(aNx); + } + } + } + // + // inner nodes=all_nodes - boundary_nodes + j1=aNodes.Lower(); + j2=aNodes.Upper(); + for (j=j1; j<=j2; ++j) { + if (!aMBN.Contains(j)) { + aP=aNodes(j).Transformed(aTrsf); + aLP.Append(aP); + } + } + // + aNb=aLP.Extent(); + // + if (!aNb && myNbPntsMin) { + // try to fill it yourself + Standard_Boolean bIsDone; + Standard_Integer aN1, aN2; + Handle(Geom_Surface) aS; + GeomAdaptor_Surface aGAS; + GeomAbs_SurfaceType aType; + // + aS=BRep_Tool::Surface(aF); + aGAS.Load(aS); + aType=aGAS.GetType(); + if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder) { + // inner links + aNbLinks=aMPKI.Extent(); + aIt.Initialize(aMPKI); + for (; aIt.More(); aIt.Next()) { + iCnt=aIt.Value(); + if (iCnt>1) { + // take the first having occured inner link + // and discretize it + const GEOMAlgo_PassKey& aPK=aIt.Key(); + aNbMax=aPK.NbMax(); + pIds=(Standard_Integer*)aPK.Key(); + aN1=*(pIds+aNbMax-1); + aN2=*(pIds+aNbMax-2); + aP1=aNodes(aN1).Transformed(aTrsf); + aP2=aNodes(aN2).Transformed(aTrsf); + // + if (aType==GeomAbs_Cylinder) { + Standard_Real aTolSM; + gp_Cylinder aCyl; + // + aTolSM=1.523e-6;//~1.-cos(0.1 deg) + aCyl=aGAS.Cylinder(); + if (!GEOMAlgo_SurfaceTools::IsCoaxial(aP1, aP2, aCyl, aTolSM)) { + continue; + } + } + // + BRepLib_MakeEdge aBME(aP1, aP2); + bIsDone=aBME.IsDone(); + if (!bIsDone) { + myErrorStatus=30; //can not obtain the line fron the link + return; + } + // + const TopoDS_Shape& aSx=aBME.Shape(); + const TopoDS_Edge& aE=TopoDS::Edge(aSx); + // + InnerPoints(aE, myNbPntsMin, aLP); + break; + }// if (iCnt>1) + }// for (; aIt.More(); aIt.Next()) + }// if (aType==GeomAbs_Plane || aType==GeomAbs_Cylinder) + }// if (!aNb && myNbPntsMin) { +} +//======================================================================= +//function : InnerPoints +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE, + GEOMAlgo_ListOfPnt& aLP) +{ + myErrorStatus=0; + // + Standard_Integer j, aNbNodes, aIndex, aNb; + Handle(Poly_PolygonOnTriangulation) aPTE; + Handle(Poly_Triangulation) aTRE; + TopLoc_Location aLoc; + gp_Pnt aP; + // + aLP.Clear(); + BRep_Tool::PolygonOnTriangulation(aE, aPTE, aTRE, aLoc); + if (aTRE.IsNull() || aPTE.IsNull()) { + myErrorStatus=20; // no triangulation found + return; + } + // + const gp_Trsf& aTrsf=aLoc.Transformation(); + const TColgp_Array1OfPnt& aNodes=aTRE->Nodes(); + // + aNbNodes=aPTE->NbNodes(); + const TColStd_Array1OfInteger& aInds=aPTE->Nodes(); + for (j=2; jD0(aT, aP); + aLP.Append(aP); + } +} + +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= +void GEOMAlgo_FinderShapeOn1::CheckData() +{ + myErrorStatus=0; + // + if(mySurface.IsNull()) { + myErrorStatus=10; // mySurface=NULL + return; + } + // + if (myShape.IsNull()) { + myErrorStatus=11; // myShape=NULL + return; + } + // + if (!(myShapeType==TopAbs_VERTEX || + myShapeType==TopAbs_EDGE || + myShapeType==TopAbs_FACE || + myShapeType==TopAbs_SOLID)) { + myErrorStatus=12; // unallowed subshape type + return; + } + // + if (myState==GEOMAlgo_ST_UNKNOWN || + myState==GEOMAlgo_ST_INOUT) { + myErrorStatus=13; // unallowed state type + return; + } + // + GeomAbs_SurfaceType aType; + // + myGAS.Load(mySurface); + aType=myGAS.GetType(); + if (!(aType==GeomAbs_Plane || + aType==GeomAbs_Cylinder || + aType==GeomAbs_Sphere)) { + myErrorStatus=14; // unallowed surface type + } +} + +//======================================================================= +//function : GetPointState +//purpose : +//======================================================================= + +TopAbs_State GEOMAlgo_FinderShapeOn1::GetPointState(const gp_Pnt& aP) +{ + TopAbs_State aSt; + GEOMAlgo_SurfaceTools::GetState(aP, myGAS, myTolerance, aSt); + return aSt; +} + + +// +// myErrorStatus : +// +// 10 -mySurface=NULL +// 11 -myShape=NULL +// 12 -unallowed type of subshapes +// 13 -unallowed state +// 14 -unallowed surface type +// 15 -unallowed surface type +// 20- no triangulation found +// 30- can not obtain the line from the link + + +/* +// Chronometer +#include +#include + +Standard_STATIC(OSD_Chronometer, x_S_Chrono); +static void x_StartChrono(); +static void x_StopChrono(); +static Standard_Boolean x_IsToShow(); +// +//======================================================================= +//function : x_StartChrono +//purpose : +//======================================================================= +void x_StartChrono() +{ + if (x_IsToShow()){ + x_S_Chrono().Reset(); + x_S_Chrono().Start(); + } +} +//======================================================================= +//function : x_StopChrono +//purpose : +//======================================================================= +void x_StopChrono() +{ + if (x_IsToShow()){ + Standard_Real Chrono; + x_S_Chrono().Stop(); + x_S_Chrono().Show(Chrono); + printf(" Tps: %lf\n", Chrono); + //cout << "Tps: " << Chrono << endl; + } +} +//======================================================================= +//function : x_IsToShow +//purpose : +//======================================================================= +Standard_Boolean x_IsToShow() +{ + Standard_Boolean bFlag=Standard_False; + // + char *xr=getenv ("STDCHRONO"); + if (xr!=NULL){ + if (!strcmp (xr, "yes")) { + bFlag=!bFlag; + } + } + return bFlag; +} +*/ diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx new file mode 100644 index 000000000..7d0c6f819 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.hxx @@ -0,0 +1,149 @@ +// 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_FinderShapeOn1_HeaderFile +#define _GEOMAlgo_FinderShapeOn1_HeaderFile + +#ifndef _Handle_Geom_Surface_HeaderFile +#include +#endif +#ifndef _TopAbs_ShapeEnum_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_State_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _GeomAdaptor_Surface_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapOfShapeState_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeAlgo_HeaderFile +#include +#endif +class Geom_Surface; +class TopTools_ListOfShape; +class TopoDS_Face; +class GEOMAlgo_ListOfPnt; +class TopoDS_Edge; +class GEOMAlgo_IndexedDataMapOfShapeState; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + +class GEOMAlgo_FinderShapeOn1 : public GEOMAlgo_ShapeAlgo { + +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_FinderShapeOn1(); +Standard_EXPORT virtual ~GEOMAlgo_FinderShapeOn1(); +Standard_EXPORT void SetSurface(const Handle(Geom_Surface)& aS) ; +Standard_EXPORT void SetShapeType(const TopAbs_ShapeEnum aST) ; +Standard_EXPORT void SetState(const GEOMAlgo_State aSF) ; +Standard_EXPORT void SetNbPntsMin(const Standard_Integer aNb) ; +Standard_EXPORT Standard_Integer NbPntsMin() const; +Standard_EXPORT void SetNbPntsMax(const Standard_Integer aNb) ; +Standard_EXPORT Standard_Integer NbPntsMax() const; +Standard_EXPORT const Handle_Geom_Surface& Surface() const; +Standard_EXPORT TopAbs_ShapeEnum ShapeType() const; +Standard_EXPORT GEOMAlgo_State State() const; +Standard_EXPORT virtual void Perform() ; +Standard_EXPORT const TopTools_ListOfShape& Shapes() const; +Standard_EXPORT const GEOMAlgo_IndexedDataMapOfShapeState& MSS() const; + + + + + +protected: + + // Methods PROTECTED + // +Standard_EXPORT virtual void CheckData() ; +Standard_EXPORT void ProcessVertices() ; +Standard_EXPORT void ProcessEdges() ; +Standard_EXPORT void ProcessFaces() ; +Standard_EXPORT void ProcessSolids() ; +Standard_EXPORT void InnerPoints(const TopoDS_Face& aF,GEOMAlgo_ListOfPnt& aLP) ; +Standard_EXPORT void InnerPoints(const TopoDS_Edge& aE,GEOMAlgo_ListOfPnt& aLP) ; +Standard_EXPORT void InnerPoints(const TopoDS_Edge& aE,const Standard_Integer aNbPnts,GEOMAlgo_ListOfPnt& aLP) ; +Standard_EXPORT virtual TopAbs_State GetPointState(const gp_Pnt& aP) ; + + + // Fields PROTECTED + // +Handle_Geom_Surface mySurface; +TopAbs_ShapeEnum myShapeType; +GEOMAlgo_State myState; +Standard_Integer myNbPntsMin; +Standard_Integer myNbPntsMax; +GeomAdaptor_Surface myGAS; +TopTools_ListOfShape myLS; +GEOMAlgo_IndexedDataMapOfShapeState myMSS; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx new file mode 100644 index 000000000..f04afdb05 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOn1.jxx @@ -0,0 +1,40 @@ +// 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/ +// +#ifndef _Geom_Surface_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ListOfPnt_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapOfShapeState_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_FinderShapeOn1_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx new file mode 100644 index 000000000..9b1b67fda --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.cxx @@ -0,0 +1,143 @@ +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMAlgo_FinderShapeOnQuad.cxx +// Created : Mon Oct 17 17:31:45 2005 +// Author : Edward AGAPOV (eap) + +#include "GEOMAlgo_FinderShapeOnQuad.hxx" +#include "GEOMAlgo_SurfaceTools.hxx" + +#include +#include +#include + + +GEOMAlgo_FinderShapeOnQuad::GEOMAlgo_FinderShapeOnQuad(const gp_Pnt & theTopLeftPoint, + const gp_Pnt & theTopRigthPoint, + const gp_Pnt & theBottomLeftPoint, + const gp_Pnt & theBottomRigthPoint) +{ + myPoints.resize(6); + myPoints[0] = theTopLeftPoint ; + myPoints[1] = theTopRigthPoint ; + myPoints[2] = theBottomRigthPoint; + myPoints[3] = theBottomLeftPoint ; + myPoints[4] = myPoints[0]; + myPoints[5] = myPoints[1]; + + // Find plane normal defined by corner points, it will be used to define a plane + // for each quadrangle side. + myQuadNormal.SetCoord (0,0,0); + for ( int i = 1; i <= 4; ++i ) + myQuadNormal += gp_Vec( myPoints[i], myPoints[i+1] ) ^ gp_Vec( myPoints[i], myPoints[i-1] ); + //std::cout< point2 vector + gp_Vec aSideVec( myPoints[ i ], myPoints[ i + 1 ]); + //std::cout<<" Y Vec : "<Axis().Direction(); + gp_Vec aSideVec = myQuadNormal ^ aSideNorm; + gp_Vec c1p ( myPoints[i], aP ); + gp_Vec pc2 ( aP, myPoints[i+1] ); + if ( aSideVec * c1p >= 0. && aSideVec * pc2 >= 0. ) + return TopAbs_ON; + // consider to be IN (???????????) + //nbIn += myConcaveSide[i] ? 0.5 : 1.0; + } + } + Standard_Real inThreshold = myPlanes.size(); // usually 4.0 + if ( myConcaveQuad ) + inThreshold = 2.5; // 1.0 + 1.0 + 0.5 + + if ( nbIn >= inThreshold ) + return TopAbs_IN; + + return TopAbs_OUT; +} + diff --git a/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx b/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx new file mode 100644 index 000000000..6f00989de --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_FinderShapeOnQuad.hxx @@ -0,0 +1,59 @@ +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMAlgo_FinderShapeOnQuad.hxx +// Created : Mon Oct 17 17:15:59 2005 +// Author : Edward AGAPOV (eap) + +#ifndef GEOMAlgo_FinderShapeOnQuad_HeaderFile +#define GEOMAlgo_FinderShapeOnQuad_HeaderFile + +#include "GEOMAlgo_FinderShapeOn1.hxx" + +#include + +#include + + +class GEOMAlgo_FinderShapeOnQuad: public GEOMAlgo_FinderShapeOn1 +{ +public: + + GEOMAlgo_FinderShapeOnQuad(const gp_Pnt & theTopLeftPoint, + const gp_Pnt & theTopRigthPoint, + const gp_Pnt & theBottomLeftPoint, + const gp_Pnt & theBottomRigthPoint); + +protected: + + virtual void CheckData() ; + + virtual TopAbs_State GetPointState(const gp_Pnt& aP) ; + +private: + + bool myConcaveQuad; + vector myConcaveSide; + vector myPoints; + vector myPlanes; + gp_Vec myQuadNormal; +}; +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl new file mode 100644 index 000000000..47c563ffd --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cdl @@ -0,0 +1,82 @@ +// 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/ +// +-- File: GEOMAlgo_GlueAnalyser.cdl +-- Created: Wed Dec 15 11:03:03 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class GlueAnalyser from GEOMAlgo + inherits Gluer from GEOMAlgo + ---Purpose: + +uses + ShapeEnum from TopAbs, + ListOfShape from TopTools, + ListOfCoupleOfShapes from GEOMAlgo + +--raises + +is + Create + returns GlueAnalyser from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_GlueAnalyser();" + + Perform(me:out) + is redefined; + + HasSolidsToGlue(me) + returns Boolean from Standard; + + SolidsToGlue(me) + returns ListOfCoupleOfShapes from GEOMAlgo; + ---C++:return const & + + HasSolidsAlone(me) + returns Boolean from Standard; + + SolidsAlone(me) + returns ListOfShape from TopTools; + ---C++:return const & + + DetectVertices(me:out) + is protected; + + DetectEdges(me:out) + is protected; + + DetectFaces(me:out) + is protected; + + DetectShapes(me:out; + aType:ShapeEnum from TopAbs) + is protected; + + DetectSolids (me:out) + is protected; + + + +fields + mySolidsToGlue : ListOfCoupleOfShapes from GEOMAlgo is protected; + mySolidsAlone : ListOfShape from TopTools is protected; + +end GlueAnalyser; diff --git a/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx new file mode 100644 index 000000000..39e60a0d2 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.cxx @@ -0,0 +1,458 @@ +// 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/ +// +// File: GEOMAlgo_GlueDetector.cxx +// Created: Wed Dec 15 11:08:09 2004 +// 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 +#include +#include +#include +#include +#include + +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_GlueAnalyser::GEOMAlgo_GlueAnalyser() +: + GEOMAlgo_Gluer() +{} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= + GEOMAlgo_GlueAnalyser::~GEOMAlgo_GlueAnalyser() +{} +//======================================================================= +//function : HasSolidsToGlue +//purpose : +//======================================================================= + Standard_Boolean GEOMAlgo_GlueAnalyser::HasSolidsToGlue()const +{ + return !mySolidsToGlue.IsEmpty(); +} +//======================================================================= +//function : HasSolidsAlone +//purpose : +//======================================================================= + Standard_Boolean GEOMAlgo_GlueAnalyser::HasSolidsAlone()const +{ + return !mySolidsAlone.IsEmpty(); +} +//======================================================================= +//function : SolidsToGlue +//purpose : +//======================================================================= + const GEOMAlgo_ListOfCoupleOfShapes& GEOMAlgo_GlueAnalyser::SolidsToGlue()const +{ + return mySolidsToGlue; +} +//======================================================================= +//function : SolidsAlone +//purpose : +//======================================================================= + const TopTools_ListOfShape& GEOMAlgo_GlueAnalyser::SolidsAlone()const +{ + return mySolidsAlone; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::Perform() +{ + myErrorStatus=0; + myWarningStatus=0; + // + mySolidsToGlue.Clear(); + mySolidsAlone.Clear(); + // + CheckData(); + if (myErrorStatus) { + return; + } + // + InnerTolerance(); + if (myErrorStatus) { + return; + } + // + DetectVertices(); + if (myErrorStatus) { + return; + } + // + DetectEdges(); + if (myErrorStatus) { + return; + } + // + DetectFaces(); + if (myErrorStatus) { + return; + } + // + DetectSolids(); + if (myErrorStatus) { + return; + } +} +//======================================================================= +//function : DetectVertices +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::DetectVertices() +{ + myErrorStatus=0; + // + Standard_Integer j, i, aNbV, aIndex, aNbVSD; + TColStd_ListIteratorOfListOfInteger aIt; + Handle(Bnd_HArray1OfBox) aHAB; + Bnd_BoundSortBox aBSB; + TopoDS_Shape aSTmp, aVF; + TopoDS_Vertex aVnew; + TopTools_IndexedMapOfShape aMV, aMVProcessed; + TopTools_ListIteratorOfListOfShape aItS; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; + GEOMAlgo_IndexedDataMapOfShapeBox aMSB; + // + TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); + aNbV=aMV.Extent(); + if (!aNbV) { + myErrorStatus=2; // no vertices in source shape + 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); + aMIS.Add(i, aV); + aMSB.Add(aV, aBox); + } + // + aBSB.Initialize(aHAB); + // + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + // + if (aMVProcessed.Contains(aV)) { + 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 + TopTools_ListOfShape aLVSD; + // + 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; + } + aLVSD.Append(aVx); + aMVProcessed.Add(aVx); + } + myImages.Bind(aVF, aLVSD); + } + // Origins + aItIm.Initialize(myImages); + 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(); + if (!myOrigins.IsBound(aVSD)) { + myOrigins.Bind(aVSD, aV); + } + } + } +} +//======================================================================= +//function : DetectFaces +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::DetectFaces() +{ + DetectShapes(TopAbs_FACE); +} +//======================================================================= +//function : DetectEdges +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::DetectEdges() +{ + DetectShapes(TopAbs_EDGE); +} +//======================================================================= +//function : DetectShapes +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::DetectShapes(const TopAbs_ShapeEnum aType) +{ + myErrorStatus=0; + // + Standard_Integer i, aNbF, aNbSDF, iErr; + TopoDS_Shape aNewShape; + TopTools_IndexedMapOfShape aMF; + TopTools_ListIteratorOfListOfShape aItS; + GEOMAlgo_PassKeyShape aPKF; + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF; + // + TopExp::MapShapes(myShape, aType, aMF); + // + aNbF=aMF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aS=aMF(i); + // + aPKF.Clear(); + if (aType==TopAbs_FACE) { + const TopoDS_Face& aF=TopoDS::Face(aS); + FacePassKey(aF, aPKF); + } + else if (aType==TopAbs_EDGE) { + const TopoDS_Edge& aE=TopoDS::Edge(aS); + EdgePassKey(aE, aPKF); + } + // + if (myErrorStatus) { + return; + } + // + if (aMPKLF.Contains(aPKF)) { + TopTools_ListOfShape& aLSDF=aMPKLF.ChangeFromKey(aPKF); + aLSDF.Append(aS); + } + else { + TopTools_ListOfShape aLSDF; + // + aLSDF.Append(aS); + aMPKLF.Add(aPKF, aLSDF); + } + } + // check geometric coincidence + if (myCheckGeometry) { + iErr=GEOMAlgo_Tools::RefineSDShapes(aMPKLF, myTol, myContext); //XX + if (iErr) { + myErrorStatus=200; + return; + } + } + // + // Images/Origins + aNbF=aMPKLF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopTools_ListOfShape& aLSDF=aMPKLF(i); + aNbSDF=aLSDF.Extent(); + if (!aNbSDF) { + myErrorStatus=4; // it must not be + } + // + const TopoDS_Shape& aS1=aLSDF.First(); + aNewShape=aS1; + // + myImages.Bind(aNewShape, aLSDF); + // origins + aItS.Initialize(aLSDF); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aFSD=aItS.Value(); + if (!myOrigins.IsBound(aFSD)) { + myOrigins.Bind(aFSD, aNewShape); + } + } + } +} +//======================================================================= +//function : DetectSolids +//purpose : +//======================================================================= + void GEOMAlgo_GlueAnalyser::DetectSolids() +{ + myErrorStatus=0; + // + Standard_Integer i, aNbF, aNbS, aNbC, aNbX; + TopoDS_Compound aCmp; + BRep_Builder aBB; + TopTools_IndexedDataMapOfShapeListOfShape aMFS; + TopTools_IndexedMapOfShape aMx, aMS; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLS; + GEOMAlgo_PassKeyShape aPKSx; + GEOMAlgo_CoupleOfShapes aCS; + // + aBB.MakeCompound(aCmp); + // + TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS); + // + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aIm=aItIm.Key(); + if (aIm.ShapeType()!=TopAbs_FACE) { + continue; + } + // + const TopTools_ListOfShape& aLF=aItIm.Value(); + aNbF=aLF.Extent(); + if (aNbF!=2) { + continue; + } + // + TopoDS_Shape aSx[2], aFx[2]; + // + aFx[0]=aLF.First(); + aFx[1]=aLF.Last(); + for (i=0; i<2; ++i) { + if (!aMFS.Contains(aFx[i])) { + continue;// it must not be so + } + // + const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aFx[i]); + aNbS=aLS.Extent(); + if (aNbS!=1) { + continue; + } + aSx[i]=aLS.First(); + } + // + if (aSx[0].IsNull() || aSx[1].IsNull()) { + continue; + } + // + aPKSx.Clear(); + aPKSx.SetIds(aSx[0], aSx[1]); + // + if (!aMPKLS.Contains(aPKSx)) { + TopTools_ListOfShape aLSx; + // + aLSx.Append(aSx[0]); + aLSx.Append(aSx[1]); + // + aMPKLS.Add(aPKSx, aLSx); + } + } + // + mySolidsToGlue.Clear(); + mySolidsAlone.Clear(); + + // + aNbC=aMPKLS.Extent(); + if (!aNbC) { + return; + } + // + for (i=1; i<=aNbC; ++i) { + const TopTools_ListOfShape& aLSx=aMPKLS(i); + const TopoDS_Shape& aSx1=aLSx.First(); + const TopoDS_Shape& aSx2=aLSx.Last(); + aCS.SetShape1(aSx1); + aCS.SetShape2(aSx2); + mySolidsToGlue.Append(aCS); + // + if (!aMx.Contains(aSx1)) { + aBB.Add(aCmp, aSx1); + aMx.Add(aSx1); + } + if (!aMx.Contains(aSx2)) { + aBB.Add(aCmp, aSx2); + aMx.Add(aSx2); + } + } + myResult=aCmp; + // + // check alone solids + TopExp::MapShapes(myShape, TopAbs_SOLID, aMS); + // + aNbX=aMx.Extent(); + for (i=1; i<=aNbX; ++i) { + const TopoDS_Shape& aSx=aMx(i); + if (!aMS.Contains(aSx)) { + mySolidsAlone.Append(aSx); + } + } +} + +/* +// A + // Make vertices + aMV.Clear(); + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aV=aItIm.Key(); + aMV.Add(aV); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + MakeVertex(aLVSD, aVnew);//ZZ + myImages.Bind(aVnew, aLVSD); + } + // + aNbV=aMV.Extent(); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + myImages.UnBind(aV); + } + // + */ diff --git a/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx new file mode 100644 index 000000000..e1a2e8298 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_GlueAnalyser.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _GEOMAlgo_ListOfCoupleOfShapes_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_GlueAnalyser_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.cdl b/src/GEOMAlgo/GEOMAlgo_Gluer.cdl new file mode 100755 index 000000000..aa1be90b4 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.cdl @@ -0,0 +1,160 @@ +// 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/ +// +-- File: GEOMAlgo_Gluer.cdl +-- Created: Sat Dec 04 12:41:32 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Gluer from GEOMAlgo + inherits ShapeAlgo from GEOMAlgo + + ---Purpose: + +uses + ShapeEnum from TopAbs, + Shape from TopoDS, + Edge from TopoDS, + Face from TopoDS, + Vertex from TopoDS, + ListOfShape from TopTools, + DataMapOfShapeShape from TopTools, + DataMapOfShapeListOfShape from TopTools, + Context from IntTools, + PassKeyShape from GEOMAlgo + +--raises + +is + Create + returns Gluer from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_Gluer();" + + SetCheckGeometry (me:out; + aFlag:Boolean from Standard); + + CheckGeometry (me) + returns Boolean from Standard; + + Perform(me:out) + is redefined; + + AloneShapes(me) + returns Integer from Standard; + + --modified by NIZNHY-PKV Fri Jan 21 14:16:58 2005f- + Modified(me:out; + S : Shape from TopoDS) + returns ListOfShape from TopTools; + ---C++: return const & + + Generated(me:out; + S : Shape from TopoDS) + returns ListOfShape from TopTools; + ---C++: return const & + + IsDeleted (me:out; + S : Shape from TopoDS) + returns Boolean from Standard; + --modified by NIZNHY-PKV Fri Jan 21 14:17:04 2005t + + CheckData(me:out) + is redefined protected; + + CheckResult (me:out) + is redefined protected; + + MakeVertices(me:out) + is protected; + + MakeEdges(me:out) + is protected; + + MakeFaces(me:out) + is protected; + + MakeShapes(me:out; + aType:ShapeEnum from TopAbs) + is protected; + + MakeShells(me:out) + is protected; + + MakeSolids(me:out) + is protected; + + InnerTolerance(me:out) + is protected; + + EdgePassKey(me:out; + aE:Edge from TopoDS; + aPK:out PassKeyShape from GEOMAlgo) + is protected; + + FacePassKey(me:out; + aF:Face from TopoDS; + aPK:out PassKeyShape from GEOMAlgo) + is protected; + + MakeVertex(me:out; + aLV : ListOfShape from TopTools; + aNewV: out Vertex from TopoDS) + is protected; + MakeEdge(me:out; + aEdge : Edge from TopoDS; + aNewEdge: out Edge from TopoDS) + is protected; + + MakeFace(me:out; + aFace : Face from TopoDS; + aNewEdge: out Face from TopoDS) + is protected; + + IsToReverse(me:out; + aFR : Face from TopoDS; + aF : Face from TopoDS) + returns Boolean from Standard + is protected; + + HasNewSubShape(me; + aS : Shape from TopoDS) + returns Boolean from Standard + is protected; +-- + Images(me) + returns DataMapOfShapeListOfShape from TopTools; + ---C++:return const & + + Origins(me) + returns DataMapOfShapeShape from TopTools; + ---C++:return const & + +fields + myCheckGeometry : Boolean from Standard is protected; + myTol : Real from Standard is protected; + myImages : DataMapOfShapeListOfShape from TopTools is protected; + myOrigins : DataMapOfShapeShape from TopTools is protected; + myNbAlone : Integer from Standard is protected; +---- + myGenerated : ListOfShape from TopTools is protected; +---- + +end Gluer; diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx new file mode 100755 index 000000000..ab898a706 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx @@ -0,0 +1,1008 @@ +// 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/ +// +// File: GEOMAlgo_Gluer.cxx +// Created: Sat Dec 04 12:45:53 2004 +// 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 + +#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 GetSubShapes(const TopoDS_Shape& aS, + TopTools_IndexedMapOfShape& aMSS); + +//======================================================================= +//function : GEOMAlgo_Gluer +//purpose : +//======================================================================= +GEOMAlgo_Gluer::GEOMAlgo_Gluer() +: + GEOMAlgo_ShapeAlgo() +{ + myTolerance=0.0001; + myTol=myTolerance; + myCheckGeometry=Standard_True; + myNbAlone=0; +} +//======================================================================= +//function : ~GEOMAlgo_Gluer +//purpose : +//======================================================================= +GEOMAlgo_Gluer::~GEOMAlgo_Gluer() +{ +} +//======================================================================= +//function : SetCheckGeometry +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::SetCheckGeometry(const Standard_Boolean aFlag) +{ + myCheckGeometry=aFlag; +} +//======================================================================= +//function : CheckGeometry +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::CheckGeometry() const +{ + return myCheckGeometry; +} +//======================================================================= +//function : AloneShapes +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Gluer::AloneShapes()const +{ + return myNbAlone; +} +//======================================================================= +//function : Images +//purpose : +//======================================================================= +const TopTools_DataMapOfShapeListOfShape& GEOMAlgo_Gluer::Images()const +{ + return myImages; +} +//======================================================================= +//function : Origins +//purpose : +//======================================================================= +const TopTools_DataMapOfShapeShape& GEOMAlgo_Gluer::Origins()const +{ + return myOrigins; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::Perform() +{ + myErrorStatus=0; + myWarningStatus=0; + // + Standard_Integer i; + const Standard_Integer aNb=8; + void (GEOMAlgo_Gluer::* pF[aNb])()={ + &GEOMAlgo_Gluer::CheckData, &GEOMAlgo_Gluer::InnerTolerance, + &GEOMAlgo_Gluer::MakeVertices, &GEOMAlgo_Gluer::MakeEdges, + &GEOMAlgo_Gluer::MakeFaces, &GEOMAlgo_Gluer::MakeShells, + &GEOMAlgo_Gluer::MakeSolids, &GEOMAlgo_Gluer::CheckResult + }; + // + for (i=0; i*pF[i])(); + if (myErrorStatus) { + return; + } + } +} +//======================================================================= +//function : MakeVertices +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeVertices() +{ + myErrorStatus=0; + // + Standard_Integer j, i, aNbV, aIndex, aNbVSD; + TColStd_ListIteratorOfListOfInteger aIt; + Handle(Bnd_HArray1OfBox) aHAB; + Bnd_BoundSortBox aBSB; + TopoDS_Shape aSTmp, aVF; + TopoDS_Vertex aVnew; + TopTools_IndexedMapOfShape aMV, aMVProcessed; + TopTools_ListIteratorOfListOfShape aItS; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + TopTools_DataMapOfShapeListOfShape aMVV; + GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; + GEOMAlgo_IndexedDataMapOfShapeBox aMSB; + // + TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); + aNbV=aMV.Extent(); + if (!aNbV) { + myErrorStatus=2; // no vertices in source shape + 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); + aMIS.Add(i, aV); + aMSB.Add(aV, aBox); + } + // + aBSB.Initialize(aHAB); + // + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + // + if (aMVProcessed.Contains(aV)) { + 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 + // + TopTools_ListOfShape aLVSD; + // + 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; + } + aLVSD.Append(aVx); + aMVProcessed.Add(aVx); + } + // + myImages.Bind(aVF, aLVSD); + } + // + // Make new vertices + aMV.Clear(); + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aV=aItIm.Key(); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + aNbVSD=aLVSD.Extent(); + if (aNbVSD>1) { + aMV.Add(aV); + MakeVertex(aLVSD, aVnew); + aMVV.Bind(aVnew, aLVSD); + } + } + // + // UnBind old vertices + aNbV=aMV.Extent(); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + myImages.UnBind(aV); + } + // + // Bind new vertices + aItIm.Initialize(aMVV); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aV=aItIm.Key(); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + myImages.Bind(aV, aLVSD); + } + // + // Origins + aItIm.Initialize(myImages); + 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(); + if (!myOrigins.IsBound(aVSD)) { + myOrigins.Bind(aVSD, aV); + } + } + } +} +//======================================================================= +//function : MakeSolids +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeSolids() +{ + myErrorStatus=0; + // + Standard_Integer aNbS; + TopAbs_Orientation anOr; + TopoDS_Compound aCmp; + TopoDS_Solid aNewSolid; + TopTools_IndexedMapOfShape aMS; + TopExp_Explorer aExpS, aExp; + BRep_Builder aBB; + // + aBB.MakeCompound(aCmp); + // + aNbS=aMS.Extent(); + aExpS.Init(myShape, TopAbs_SOLID); + for (; aExpS.More(); aExpS.Next()) { + const TopoDS_Solid& aSolid=TopoDS::Solid(aExpS.Current()); + if (aMS.Contains(aSolid)) { + continue; + } + aMS.Add(aSolid); + // + anOr=aSolid.Orientation(); + // + aBB.MakeSolid(aNewSolid); + aNewSolid.Orientation(anOr); + // + aExp.Init(aSolid, TopAbs_SHELL); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aShell=aExp.Current(); + const TopoDS_Shape& aShellR=myOrigins.Find(aShell); + aBB.Add(aNewSolid, aShellR); + } + // + TopTools_ListOfShape aLS; + // + aLS.Append(aSolid); + myImages.Bind(aNewSolid, aLS); + myOrigins.Bind(aSolid, aNewSolid); + // + aBB.Add(aCmp, aNewSolid); + } + // + myResult=aCmp; + // + aNbS=aMS.Extent(); + if (aNbS) { + Standard_Real aTol=1.e-7; + BOP_CorrectTolerances::CorrectCurveOnSurface(myResult); + } +} +//======================================================================= +//function : MakeShells +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeShells() +{ + myErrorStatus=0; + // + Standard_Boolean bIsToReverse; + Standard_Integer i, aNbS; + TopAbs_Orientation anOr; + TopoDS_Shell aNewShell; + TopoDS_Face aFR; + TopTools_IndexedMapOfShape aMS; + TopExp_Explorer aExp; + BRep_Builder aBB; + // + TopExp::MapShapes(myShape, TopAbs_SHELL, aMS); + // + aNbS=aMS.Extent(); + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shell& aShell=TopoDS::Shell(aMS(i)); + anOr=aShell.Orientation(); + // + aBB.MakeShell(aNewShell); + aNewShell.Orientation(anOr); + aExp.Init(aShell, TopAbs_FACE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Face& aF=TopoDS::Face(aExp.Current()); + aFR=TopoDS::Face(myOrigins.Find(aF)); + if (aFR.IsSame(aF)) { + aBB.Add(aNewShell, aF); + continue; + } + bIsToReverse=IsToReverse(aFR, aF); + if (bIsToReverse) { + aFR.Reverse(); + } + aBB.Add(aNewShell, aFR); + } + // + TopTools_ListOfShape aLS; + // + aLS.Append(aShell); + myImages.Bind(aNewShell, aLS); + myOrigins.Bind(aShell, aNewShell); + } +} +//======================================================================= +//function : MakeFaces +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeFaces() +{ + MakeShapes(TopAbs_FACE); +} +//======================================================================= +//function : MakeEdges +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeEdges() +{ + MakeShapes(TopAbs_EDGE); +} +//======================================================================= +//function : MakeShapes +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) +{ + myErrorStatus=0; + // + Standard_Boolean bHasNewSubShape; + Standard_Integer i, aNbF, aNbSDF, iErr; + TopoDS_Shape aNewShape; + TopTools_IndexedMapOfShape aMF; + TopTools_ListIteratorOfListOfShape aItS; + GEOMAlgo_PassKeyShape aPKF; + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF; + // + TopExp::MapShapes(myShape, aType, aMF); + // + aNbF=aMF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aS=aMF(i); + // + aPKF.Clear(); + if (aType==TopAbs_FACE) { + const TopoDS_Face& aF=TopoDS::Face(aS); + FacePassKey(aF, aPKF); + } + else if (aType==TopAbs_EDGE) { + const TopoDS_Edge& aE=TopoDS::Edge(aS); + EdgePassKey(aE, aPKF); + } + // + if (myErrorStatus) { + return; + } + // + if (aMPKLF.Contains(aPKF)) { + TopTools_ListOfShape& aLSDF=aMPKLF.ChangeFromKey(aPKF); + aLSDF.Append(aS); + } + else { + TopTools_ListOfShape aLSDF; + // + aLSDF.Append(aS); + aMPKLF.Add(aPKF, aLSDF); + } + } + // check geometric coincidence + if (myCheckGeometry) { + iErr=GEOMAlgo_Tools::RefineSDShapes(aMPKLF, myTol, myContext); + if (iErr) { + myErrorStatus=200; + return; + } + } + // + // Images/Origins + // + aNbF=aMPKLF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopTools_ListOfShape& aLSDF=aMPKLF(i); + aNbSDF=aLSDF.Extent(); + if (!aNbSDF) { + myErrorStatus=4; // it must not be + } + // + const TopoDS_Shape& aS1=aLSDF.First(); + // + bHasNewSubShape=Standard_True; + // prevent creation of a new shape if there are not + // new subshapes of aSS among the originals + if (aNbSDF==1) { + bHasNewSubShape=HasNewSubShape(aS1); + if (!bHasNewSubShape) { + aNewShape=aS1; + aNewShape.Orientation(TopAbs_FORWARD); + } + } + // + if (bHasNewSubShape) { + if (aType==TopAbs_FACE) { + TopoDS_Face aNewFace; + // + const TopoDS_Face& aF1=TopoDS::Face(aS1); + MakeFace(aF1, aNewFace); + aNewShape=aNewFace; + } + else if (aType==TopAbs_EDGE) { + TopoDS_Edge aNewEdge; + // + const TopoDS_Edge& aE1=TopoDS::Edge(aS1); + MakeEdge(aE1, aNewEdge); + aNewShape=aNewEdge; + } + } + // + myImages.Bind(aNewShape, aLSDF); + // origins + aItS.Initialize(aLSDF); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aFSD=aItS.Value(); + if (!myOrigins.IsBound(aFSD)) { + myOrigins.Bind(aFSD, aNewShape); + } + } + } +} +//======================================================================= +//function : CheckResult +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::CheckResult() +{ + myErrorStatus=0; + // + if (myResult.IsNull()) { + myErrorStatus=6; + return; + } + // + Standard_Boolean bFound; + Standard_Integer i, j, aNbS, aNbFS, aNbSx; + TopTools_IndexedMapOfShape aMS, aMFS; + TopTools_IndexedDataMapOfShapeListOfShape aMFR; + // + TopExp::MapShapesAndAncestors(myResult, TopAbs_FACE, TopAbs_SOLID, aMFR); + TopExp::MapShapes(myResult, TopAbs_SOLID, aMS); + // + + myNbAlone=0; + aNbS=aMS.Extent(); + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aSolid=aMS(i); + // + aMFS.Clear(); + TopExp::MapShapes(aSolid, TopAbs_FACE, aMFS); + // + bFound=Standard_False; + aNbFS=aMFS.Extent(); + for (j=1; j<=aNbFS; ++j) { + const TopoDS_Shape& aFS=aMFS(j); + if (aMFR.Contains(aFS)) { + const TopTools_ListOfShape& aLSx=aMFR.FindFromKey(aFS); + aNbSx=aLSx.Extent(); + if (aNbSx==2) { + bFound=!bFound; + break; + } + } + } + // + if (!bFound) { + myWarningStatus=1; + ++myNbAlone; + //break; + } + } +} +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::CheckData() +{ + myErrorStatus=0; + // + if (myShape.IsNull()) { + myErrorStatus=5; + return; + } +} +//======================================================================= +//function : InnerTolerance +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::InnerTolerance() +{ + myErrorStatus=0; + // + /* + Standard_Integer i; + Standard_Real aX[3][2], dH, dHmin, aCoef, aTolTresh; + Bnd_Box aBox; + // + BRepBndLib::Add(myShape, aBox); + aBox.Get(aX[0][0], aX[1][0], aX[2][0], aX[0][1], aX[1][1], aX[2][1]); + // + dHmin=aX[0][1]-aX[0][0]; + for (i=1; i<3; ++i) { + dH=aX[i][1]-aX[i][0]; + if (dHaTolTresh) { + myTol=aTolTresh; + } + */ + myTol=myTolerance; +} +//======================================================================= +//function : FacePassKey +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF, + GEOMAlgo_PassKeyShape& aPK) +{ + Standard_Integer i, aNbE, aNbMax; + TopTools_ListOfShape aLE; + TopTools_IndexedMapOfShape aME; + // + TopExp::MapShapes(aF, TopAbs_EDGE, aME); + aNbE=aME.Extent(); + aNbMax=aPK.NbMax(); + if (!aNbE || aNbE>aNbMax) { + myErrorStatus=101; // temprorary + return; + } + // + for (i=1; i<=aNbE; ++i) { + const TopoDS_Shape& aE=aME(i); + if (!myOrigins.IsBound(aE)) { + myErrorStatus=102; + return; + } + const TopoDS_Shape& aER=myOrigins.Find(aE); + aLE.Append(aER); + } + aPK.SetIds(aLE); +} +//======================================================================= +//function : EdgePassKey +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::EdgePassKey(const TopoDS_Edge& aE, + GEOMAlgo_PassKeyShape& aPK) +{ + TopoDS_Vertex aV1, aV2; + // + TopExp::Vertices(aE, aV1, aV2); + // + if (!myOrigins.IsBound(aV1) || !myOrigins.IsBound(aV2) ) { + myErrorStatus=100; + return; + } + const TopoDS_Shape& aVR1=myOrigins.Find(aV1); + const TopoDS_Shape& aVR2=myOrigins.Find(aV2); + aPK.SetIds(aVR1, aVR2); +} +//======================================================================= +//function : MakeVertex +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeVertex(const TopTools_ListOfShape& aLV, + TopoDS_Vertex& aNewVertex) +{ + Standard_Integer aNbV; + Standard_Real aTolV, aD, aDmax; + gp_XYZ aGC; + gp_Pnt aP3D, aPGC; + TopoDS_Vertex aVx; + BRep_Builder aBB; + TopTools_ListIteratorOfListOfShape aIt; + // + aNbV=aLV.Extent(); + if (!aNbV) { + return; + } + // + // center of gravity + aGC.SetCoord(0.,0.,0.); + aIt.Initialize(aLV); + for (; aIt.More(); aIt.Next()) { + aVx=TopoDS::Vertex(aIt.Value()); + aP3D=BRep_Tool::Pnt(aVx); + aGC+=aP3D.XYZ(); + } + aGC/=(Standard_Real)aNbV; + aPGC.SetXYZ(aGC); + // + // tolerance value + aDmax=-1.; + aIt.Initialize(aLV); + for (; aIt.More(); aIt.Next()) { + aVx=TopoDS::Vertex(aIt.Value()); + aP3D=BRep_Tool::Pnt(aVx); + aTolV=BRep_Tool::Tolerance(aVx); + aD=aPGC.Distance(aP3D)+aTolV; + if (aD>aDmax) { + aDmax=aD; + } + } + // + aBB.MakeVertex (aNewVertex, aPGC, aDmax); +} +//======================================================================= +//function : MakeEdge +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeEdge(const TopoDS_Edge& aE, + TopoDS_Edge& aNewEdge) +{ + myErrorStatus=0; + // + Standard_Boolean bIsDE; + Standard_Real aT1, aT2; + TopoDS_Vertex aV1, aV2, aVR1, aVR2; + TopoDS_Edge aEx; + // + bIsDE=BRep_Tool::Degenerated(aE); + // + aEx=aE; + aEx.Orientation(TopAbs_FORWARD); + // + TopExp::Vertices(aEx, aV1, aV2); + // + aT1=BRep_Tool::Parameter(aV1, aEx); + aT2=BRep_Tool::Parameter(aV2, aEx); + // + aVR1=TopoDS::Vertex(myOrigins.Find(aV1)); + aVR1.Orientation(TopAbs_FORWARD); + aVR2=TopoDS::Vertex(myOrigins.Find(aV2)); + aVR2.Orientation(TopAbs_REVERSED); + // + if (bIsDE) { + Standard_Real aTol; + BRep_Builder aBB; + TopoDS_Edge E; + TopAbs_Orientation anOrE; + // + anOrE=aE.Orientation(); + aTol=BRep_Tool::Tolerance(aE); + // + E=aEx; + E.EmptyCopy(); + // + aBB.Add (E, aVR1); + aBB.Add (E, aVR2); + aBB.Range(E, aT1, aT2); + aBB.Degenerated(E, Standard_True); + aBB.UpdateEdge(E, aTol); + // + aNewEdge=E; + } + // + else { + BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge); + } +} +// +//======================================================================= +//function : MakeFace +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, + TopoDS_Face& aNewFace) +{ + myErrorStatus=0; + // + Standard_Boolean bIsToReverse, bIsUPeriodic; + Standard_Real aTol, aUMin, aUMax, aVMin, aVMax; + TopoDS_Edge aER; + TopoDS_Wire newWire; + TopoDS_Face aFFWD, newFace; + TopLoc_Location aLoc; + Handle(Geom_Surface) aS; + Handle(Geom2d_Curve) aC2D; + TopExp_Explorer aExpW, aExpE; + BRep_Builder aBB; + // + aFFWD=aF; + aFFWD.Orientation(TopAbs_FORWARD); + // + aS=BRep_Tool::Surface(aFFWD, aLoc); + bIsUPeriodic=GEOMAlgo_Tools::IsUPeriodic(aS); + aTol=BRep_Tool::Tolerance(aFFWD); + BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); + // + aBB.MakeFace (newFace, aS, aLoc, aTol); + // + aExpW.Init(aFFWD, TopAbs_WIRE); + for (; aExpW.More(); aExpW.Next()) { + aBB.MakeWire(newWire); + const TopoDS_Wire& aW=TopoDS::Wire(aExpW.Current()); + aExpE.Init(aW, TopAbs_EDGE); + for (; aExpE.More(); aExpE.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExpE.Current()); + aER=TopoDS::Edge(myOrigins.Find(aE)); + // + aER.Orientation(TopAbs_FORWARD); + if (!BRep_Tool::Degenerated(aER)) { + // build p-curve + if (bIsUPeriodic) { + GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(aER, aFFWD, aUMin, aUMax); + } + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aER, aFFWD); + + // orient image + bIsToReverse=BOPTools_Tools3D::IsSplitToReverse1(aER, aE, myContext); + if (bIsToReverse) { + aER.Reverse(); + } + } + else { + aER.Orientation(aE.Orientation()); + } + // + aBB.Add(newWire, aER); + } + //modified by NIZNHY-PKV Mon Jan 31 17:26:36 2005f + // + 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 + aBB.Add(newFace, newWire); + } + aNewFace=newFace; +} +//======================================================================= +//function : IsToReverse +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::IsToReverse(const TopoDS_Face& aFR, + const TopoDS_Face& aF) +{ + Standard_Boolean bRet; + Standard_Real aT, aT1, aT2, aTR, aScPr; + TopExp_Explorer aExp; + Handle(Geom_Curve)aC3D; + gp_Pnt aP; + gp_Dir aDNF, aDNFR; + // + bRet=Standard_False; + // + aExp.Init(aF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current()); + // + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + const TopoDS_Edge& aER=TopoDS::Edge(myOrigins.Find(aE)); + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); + aC3D->D0(aT, aP); + myContext.ProjectPointOnEdge(aP, aER, aTR); + // + BOPTools_Tools3D::GetNormalToFaceOnEdge (aE, aF, aT, aDNF); + if (aF.Orientation()==TopAbs_REVERSED) { + aDNF.Reverse(); + } + // + BOPTools_Tools3D::GetNormalToFaceOnEdge (aER, aFR, aTR, aDNFR); + if (aFR.Orientation()==TopAbs_REVERSED) { + aDNFR.Reverse(); + } + // + aScPr=aDNF*aDNFR; + return (aScPr<0.); + } + return bRet; +} +//======================================================================= +//function : HasNewSubShape +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::HasNewSubShape(const TopoDS_Shape& aS)const +{ + Standard_Boolean bRet; + Standard_Integer i, aNbSS; + TopTools_IndexedMapOfShape aMSS; + // + GetSubShapes(aS, aMSS); + // + bRet=Standard_False; + aNbSS=aMSS.Extent(); + for (i=1; i<=aNbSS; ++i) { + const TopoDS_Shape& aSS=aMSS(i); + if (aSS.ShapeType()==TopAbs_WIRE) { + continue; + } + // + bRet=!myOrigins.IsBound(aSS); + if (bRet) { + return bRet; + } + // + const TopoDS_Shape& aSSIm=myOrigins.Find(aSS); + bRet=!aSSIm.IsSame(aSS); + if (bRet) { + return bRet; + } + } + return bRet; +} +//======================================================================= +//function : GetSubShapes +//purpose : +//======================================================================= +void GetSubShapes(const TopoDS_Shape& aS, + TopTools_IndexedMapOfShape& aMSS) +{ + Standard_Integer aR; + TopAbs_ShapeEnum aType; + TopoDS_Iterator aIt; + // + aType=aS.ShapeType(); + aR=(Standard_Integer)aType+1; + if (aR>TopAbs_VERTEX) { + return; + } + // + aIt.Initialize(aS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSS=aIt.Value(); + aMSS.Add(aSS); + GetSubShapes(aSS, aMSS); + } +} +//======================================================================= +//function : Modified +//purpose : +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_Gluer::Modified (const TopoDS_Shape& aS) +{ + TopAbs_ShapeEnum aType; + // + myGenerated.Clear(); + // + 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_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 + if(myOrigins.IsBound(aS)) { + const TopoDS_Shape& aSnew=myOrigins.Find(aS); + if (!aSnew.IsSame(aS)) { + myGenerated.Append(aSnew); + } + } + } + // + return myGenerated; +} +//======================================================================= +//function : Generated +//purpose : +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_Gluer::Generated(const TopoDS_Shape& ) +{ + myGenerated.Clear(); + return myGenerated; +} +//======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::IsDeleted (const TopoDS_Shape& aS) +{ + Standard_Boolean bRet=Standard_False; + // + const TopTools_ListOfShape& aL=Modified(aS); + bRet=!aL.IsEmpty(); + // + return bRet; +} +// +// ErrorStatus +// +// 1 - the object is just initialized +// 2 - no vertices found in source shape +// 3 - nb same domain vertices for the vertex Vi =0 +// 4 - nb same domain edges(faces) for the edge Ei(face Fi) =0 +// 5 - source shape is Null +// 6 - result shape is Null +// 101 - nb edges > PassKey.NbMax() in FacesPassKey() +// 102 - the edge Ei can not be found in myOrigins Map +// 100 - the vertex Vi can not be found in myOrigins Map +// +// WarningStatus +// +// 1 - some shapes can not be glued by faces +// diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.jxx b/src/GEOMAlgo/GEOMAlgo_Gluer.jxx new file mode 100644 index 000000000..cb259d79b --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.jxx @@ -0,0 +1,46 @@ +// 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/ +// +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _TopoDS_Vertex_HeaderFile +#include +#endif +#ifndef _TopTools_DataMapOfShapeListOfShape_HeaderFile +#include +#endif +#ifndef _TopTools_DataMapOfShapeShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Gluer_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_PassKey.cdl b/src/GEOMAlgo/GEOMAlgo_PassKey.cdl new file mode 100755 index 000000000..f400e8638 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKey.cdl @@ -0,0 +1,100 @@ +// 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/ +// +-- File: GEOMAlgo_PassKey.cdl +-- Created: +-- Author: Peter KURNEV +-- +---Copyright: + + +class PassKey from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS, + ListOfInteger from TColStd + +--raises + +is + Create + returns PassKey from GEOMAlgo; + + Assign(me:out; + Other : PassKey from GEOMAlgo) + returns PassKey from GEOMAlgo; + ---C++: alias operator = + ---C++: return & +-- + SetIds(me:out; + aI1 :Integer from Standard); + + SetIds(me:out; + aI1 :Integer from Standard; + aI2 :Integer from Standard); + + SetIds(me:out; + aI1 :Integer from Standard; + aI2 :Integer from Standard; + aI3 :Integer from Standard); + + SetIds(me:out; + aI1 :Integer from Standard; + aI2 :Integer from Standard; + aI3 :Integer from Standard; + aI4 :Integer from Standard); + + SetIds(me:out; + aLS :ListOfInteger from TColStd); + + NbMax(me) + returns Integer from Standard; + + Clear(me:out); + + Compute(me:out); + + IsEqual(me; + aOther:PassKey from GEOMAlgo) + returns Boolean from Standard; + + Key(me) + returns Address from Standard; + + HashCode(me; + Upper : Integer from Standard) + returns Integer from Standard; + + Id(me; + aIndex: Integer from Standard) + returns Integer from Standard; + + + Dump(me); + +fields + + myNbIds: Integer from Standard is protected; + myNbMax: Integer from Standard is protected; + mySum : Integer from Standard is protected; + myIds : Integer from Standard [8] is protected; + +end PassKey; diff --git a/src/GEOMAlgo/GEOMAlgo_PassKey.cxx b/src/GEOMAlgo/GEOMAlgo_PassKey.cxx new file mode 100755 index 000000000..c072b7027 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKey.cxx @@ -0,0 +1,305 @@ +// 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/ +// +// File: GEOMAlgo_PassKey.cxx +// Created: +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include + +#ifdef WNT +#pragma warning( disable : 4101) +#endif + +static + void SortShell(const int n, int* a); +static + Standard_Integer NormalizedId(const Standard_Integer aId, + const Standard_Integer aDiv); + +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_PassKey::GEOMAlgo_PassKey() +{ + Clear(); +} +//======================================================================= +//function :Assign +//purpose : +//======================================================================= + GEOMAlgo_PassKey& GEOMAlgo_PassKey::Assign(const GEOMAlgo_PassKey& anOther) +{ + myNbIds=anOther.myNbIds; + myNbMax=anOther.myNbMax; + mySum=anOther.mySum; + memcpy(myIds, anOther.myIds, sizeof(myIds)); + return *this; +} +//======================================================================= +//function :Clear +//purpose : +//======================================================================= + void GEOMAlgo_PassKey::Clear() +{ + Standard_Integer i; + // + myNbIds=0; + myNbMax=8; + mySum=0; + for (i=0; i myNbMax) { + return; + } + // + myNbIds=aNb; + mySum=0; + i=myNbMax-myNbIds; + aIt.Initialize(aLI); + for (; aIt.More(); aIt.Next(), ++i) { + anId=aIt.Value(); + myIds[i]=anId; + aIdN=NormalizedId(anId, myNbIds); + mySum+=aIdN; + } + // + Compute(); +} +//======================================================================= +//function :Id +//purpose : +//======================================================================= + Standard_Integer GEOMAlgo_PassKey::Id(const Standard_Integer aIndex)const +{ + if (aIndex < 0 || aIndex >= myNbMax) { + return 0; + } + return myIds[aIndex]; +} +//======================================================================= +//function :NbMax +//purpose : +//======================================================================= + Standard_Integer GEOMAlgo_PassKey::NbMax()const +{ + return myNbMax; +} +//======================================================================= +//function :Compute +//purpose : +//======================================================================= + void GEOMAlgo_PassKey::Compute() +{ + SortShell(myNbIds, myIds+myNbMax-myNbIds); +} +//======================================================================= +//function :IsEqual +//purpose : +//======================================================================= + Standard_Boolean GEOMAlgo_PassKey::IsEqual(const GEOMAlgo_PassKey& anOther) const +{ + Standard_Integer iIsEqual; + Standard_Boolean bIsEqual; + // + iIsEqual=memcmp(myIds, anOther.myIds, sizeof(myIds)); + bIsEqual=Standard_False; + if (!iIsEqual) { + bIsEqual=!bIsEqual; + } + return bIsEqual; +} +//======================================================================= +//function :Key +//purpose : +//======================================================================= + Standard_Address GEOMAlgo_PassKey::Key()const +{ + return (Standard_Address)myIds; +} +//======================================================================= +//function : HashCode +//purpose : +//======================================================================= + Standard_Integer GEOMAlgo_PassKey::HashCode(const Standard_Integer Upper) const +{ + //return (mySum % Upper); + return ::HashCode(mySum, Upper); +} +//======================================================================= +//function : Dump +//purpose : +//======================================================================= + void GEOMAlgo_PassKey::Dump()const +{ + Standard_Integer i; + // + printf(" PassKey: {"); + for (i=0; iaTresh) { + aIdRet=aId%aTresh; + } + return aIdRet; +} +//======================================================================= +// function: SortShell +// purpose : +//======================================================================= +void SortShell(const int n, int* a) +{ + int x, nd, i, j, l, d=1; + // + 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_PassKey_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl new file mode 100755 index 000000000..7928f94c2 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cdl @@ -0,0 +1,48 @@ +// 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/ +// +-- File: GEOMAlgo_PassKeyMapHasher.cdl +-- Created: +-- Author: Peter KURNEV +-- +---Copyright: + + +class PassKeyMapHasher from GEOMAlgo + + ---Purpose: + +uses + PassKey from GEOMAlgo + +--raises + +is + HashCode(myclass; + aPKey : PassKey from GEOMAlgo; + Upper : Integer from Standard) + returns Integer from Standard; + + + IsEqual(myclass; + aPKey1 : PassKey from GEOMAlgo; + aPKey2 : PassKey from GEOMAlgo) + returns Boolean from Standard; + +end PassKeyMapHasher; diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx new file mode 100755 index 000000000..6f95f979a --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.cxx @@ -0,0 +1,45 @@ +// 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/ +// +// File: GEOMAlgo_PassKeyMapHasher.cxx +// Created: +// Author: Peter KURNEV +// + + +#include + +//======================================================================= +//function : HashCode +//purpose : +//======================================================================= + Standard_Integer GEOMAlgo_PassKeyMapHasher::HashCode(const GEOMAlgo_PassKey& aPKey, + const Standard_Integer Upper) +{ + return aPKey.HashCode(Upper); +} +//======================================================================= +//function :IsEqual +//purpose : +//======================================================================= + Standard_Boolean GEOMAlgo_PassKeyMapHasher::IsEqual(const GEOMAlgo_PassKey& aPKey1, + const GEOMAlgo_PassKey& aPKey2) +{ + return aPKey1.IsEqual(aPKey2); +} diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.jxx b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.jxx new file mode 100644 index 000000000..15e5c9eaf --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyMapHasher.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/ +// +#ifndef _GEOMAlgo_PassKey_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyMapHasher_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl new file mode 100755 index 000000000..8094fb6c2 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cdl @@ -0,0 +1,67 @@ +// 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/ +// +-- File: GEOMAlgo_PassKeyShape.cdl +-- Created: +-- Author: Peter KURNEV +-- +---Copyright: + + +class PassKeyShape from GEOMAlgo + inherits PassKey from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS, + ListOfShape from TopTools + +--raises + +is + Create + returns PassKeyShape from GEOMAlgo; + + SetIds(me:out; + aS :Shape from TopoDS); + + SetIds(me:out; + aS1 :Shape from TopoDS; + aS2 :Shape from TopoDS); + + SetIds(me:out; + aS1 :Shape from TopoDS; + aS2 :Shape from TopoDS; + aS3 :Shape from TopoDS); + + SetIds(me:out; + aS1 :Shape from TopoDS; + aS2 :Shape from TopoDS; + aS3 :Shape from TopoDS; + aS4 :Shape from TopoDS); + + SetIds(me:out; + aLS :ListOfShape from TopTools); + + +fields + myUpper : Integer from Standard is protected; + +end PassKeyShape; diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx new file mode 100755 index 000000000..b85dbd00d --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.cxx @@ -0,0 +1,131 @@ +// 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/ +// +// File: GEOMAlgo_PassKeyShape.cxx +// Created: +// Author: Peter KURNEV +// + + +#include + +#include +#include + +#include +#include + +//======================================================================= +//function : +//purpose : +//======================================================================= + GEOMAlgo_PassKeyShape::GEOMAlgo_PassKeyShape() +: + GEOMAlgo_PassKey() +{ + myUpper=432123; + GEOMAlgo_PassKey::Clear(); +} +//======================================================================= +//function :SetIds +//purpose : +//======================================================================= + void GEOMAlgo_PassKeyShape::SetIds(const TopoDS_Shape& aS1) + +{ + Standard_Integer anId1; + // + anId1=aS1.HashCode(myUpper); + GEOMAlgo_PassKey::SetIds(anId1); +} +//======================================================================= +//function :SetIds +//purpose : +//======================================================================= + void GEOMAlgo_PassKeyShape::SetIds(const TopoDS_Shape& aS1, + const TopoDS_Shape& aS2) +{ + Standard_Integer anId1, anId2; + // + anId1=aS1.HashCode(myUpper); + anId2=aS2.HashCode(myUpper); + // + GEOMAlgo_PassKey::SetIds(anId1, anId2); +} +//======================================================================= +//function :SetIds +//purpose : +//======================================================================= + void GEOMAlgo_PassKeyShape::SetIds(const TopoDS_Shape& aS1, + const TopoDS_Shape& aS2, + const TopoDS_Shape& aS3) +{ + Standard_Integer anId1, anId2, anId3; + // + anId1=aS1.HashCode(myUpper); + anId2=aS2.HashCode(myUpper); + anId3=aS3.HashCode(myUpper); + // + GEOMAlgo_PassKey::SetIds(anId1, anId2, anId3); +} +//======================================================================= +//function :SetIds +//purpose : +//======================================================================= + void GEOMAlgo_PassKeyShape::SetIds(const TopoDS_Shape& aS1, + const TopoDS_Shape& aS2, + const TopoDS_Shape& aS3, + const TopoDS_Shape& aS4) +{ + Standard_Integer anId1, anId2, anId3, anId4; + // + anId1=aS1.HashCode(myUpper); + anId2=aS2.HashCode(myUpper); + anId3=aS3.HashCode(myUpper); + anId4=aS4.HashCode(myUpper); + // + GEOMAlgo_PassKey::SetIds(anId1, anId2, anId3, anId4); +} +//======================================================================= +//function :SetIds +//purpose : +//======================================================================= + void GEOMAlgo_PassKeyShape::SetIds(const TopTools_ListOfShape& aLS) +{ + Standard_Integer anId; + TopTools_ListIteratorOfListOfShape aIt; + TColStd_ListOfInteger aLI; + // + //aNb=aLS.Extent(); + //if (aNb<1 || aNb > myNbMax) { + // return; + //} + // + //myNbIds=aNb; + //mySum=0; + //i=myNbMax-myNbIds; + + aIt.Initialize(aLS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + anId=aS.HashCode(myUpper); + aLI.Append(anId); + } + GEOMAlgo_PassKey::SetIds(aLI); +} diff --git a/src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx new file mode 100644 index 000000000..a29e7ff8f --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_PassKeyShape.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_PassKeyShape_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl new file mode 100644 index 000000000..0cb903d7d --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cdl @@ -0,0 +1,66 @@ +// 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/ +// +-- File: GEOMAlgo_ShapeAlgo.cdl +-- Created: Tue Dec 7 12:05:19 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +deferred class ShapeAlgo from GEOMAlgo + inherits Algo from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS, + Context from IntTools + +--raises + +is + Initialize + returns ShapeAlgo from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ShapeAlgo();" + + SetShape(me:out; + aS:Shape from TopoDS); + + SetTolerance(me:out; + aT:Real from Standard); + + Shape(me) + returns Shape from TopoDS; + ---C++:return const & + + Tolerance(me) + returns Real from Standard; + + Result(me) + returns Shape from TopoDS; + ---C++:return const & + +fields + myShape : Shape from TopoDS is protected; + myTolerance : Real from Standard is protected; + myResult : Shape from TopoDS is protected; + myContext : Context from IntTools is protected; + +end ShapeAlgo; diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx new file mode 100644 index 000000000..201b5cd30 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.cxx @@ -0,0 +1,85 @@ +// 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/ +// +// File: GEOMAlgo_ShapeAlgo.cxx +// Created: Tue Dec 7 12:06:54 2004 +// Author: Peter KURNEV +// + + +#include + +//======================================================================= +//function : GEOMAlgo_ShapeAlgo +//purpose : +//======================================================================= +GEOMAlgo_ShapeAlgo::GEOMAlgo_ShapeAlgo() +: + GEOMAlgo_Algo() +{ + myTolerance=0.0001; +} + +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_ShapeAlgo::~GEOMAlgo_ShapeAlgo() +{ +} +//======================================================================= +//function : SetShape +//purpose : +//======================================================================= +void GEOMAlgo_ShapeAlgo::SetShape(const TopoDS_Shape& aS) +{ + myShape=aS; +} +//======================================================================= +//function : Shape +//purpose : +//======================================================================= +const TopoDS_Shape& GEOMAlgo_ShapeAlgo::Shape()const +{ + return myShape; +} +//======================================================================= +//function : SetTolerance +//purpose : +//======================================================================= +void GEOMAlgo_ShapeAlgo::SetTolerance(const Standard_Real aT) +{ + myTolerance=aT; +} +//======================================================================= +//function : Tolerance +//purpose : +//======================================================================= +Standard_Real GEOMAlgo_ShapeAlgo::Tolerance()const +{ + return myTolerance; +} +//======================================================================= +//function : Result +//purpose : +//======================================================================= +const TopoDS_Shape& GEOMAlgo_ShapeAlgo::Result()const +{ + return myResult; +} diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.jxx b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.jxx new file mode 100644 index 000000000..e3304cad7 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeAlgo.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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeAlgo_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl new file mode 100644 index 000000000..45f86b4d1 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cdl @@ -0,0 +1,67 @@ +// 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/ +// +-- File: GEOMAlgo_ShapeSolid.cdl +-- Created: Thu Jan 13 12:44:07 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +deferred class ShapeSolid from GEOMAlgo + inherits Algo from GEOMAlgo + + ---Purpose: + +uses + State from TopAbs, + ListOfShape from TopTools, + PDSFiller from BOPTools, + DSFiller from BOPTools +--raises + +is + Initialize + returns ShapeSolid from GEOMAlgo; + + + SetFiller(me:out; + aDSF:DSFiller from BOPTools); + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ShapeSolid();" + + + Shapes(me; + aState:State from TopAbs) + returns ListOfShape from TopTools; + ---C++: return const & + + BuildResult (me:out) + is deferred protected; + + Prepare(me:out) + is deferred protected; + +fields + myLSIN : ListOfShape from TopTools is protected; + myLSOUT : ListOfShape from TopTools is protected; + myLSON : ListOfShape from TopTools is protected; + myRank : Integer from Standard is protected; + myDSFiller : PDSFiller from BOPTools is protected; + +end ShapeSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx new file mode 100644 index 000000000..87a0de87c --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.cxx @@ -0,0 +1,80 @@ +// 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/ +// +// File: GEOMAlgo_ShapeSolid.cxx +// Created: Thu Jan 13 12:54:48 2005 +// Author: Peter KURNEV +// + + +#include + +#include +#include + +//======================================================================= +//function : GEOMAlgo_ShapeSolid +//purpose : +//======================================================================= +GEOMAlgo_ShapeSolid::GEOMAlgo_ShapeSolid() +: + GEOMAlgo_Algo(), + myRank(0), + myDSFiller(NULL) +{ +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_ShapeSolid::~GEOMAlgo_ShapeSolid() +{ +} +//======================================================================= +//function : SetFiller +//purpose : +//======================================================================= +void GEOMAlgo_ShapeSolid::SetFiller(const BOPTools_DSFiller& aDSFiller) +{ + myDSFiller=(BOPTools_DSFiller*) &aDSFiller; +} +//======================================================================= +// function: Shapes +// purpose: +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_ShapeSolid::Shapes(const TopAbs_State aState) const +{ + const TopTools_ListOfShape *pL; + // + switch (aState) { + case TopAbs_IN: + pL=&myLSIN; + break; + case TopAbs_OUT: + pL=&myLSOUT; + break; + case TopAbs_ON: + pL=&myLSON; + break; + default: + pL=&myLSON; + break; + } + return *pL; +} diff --git a/src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx new file mode 100644 index 000000000..2b5222ad5 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShapeSolid.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _BOPTools_DSFiller_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_ShapeSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl new file mode 100644 index 000000000..01c1c1c1c --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cdl @@ -0,0 +1,53 @@ +// 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/ +// +-- File: GEOMAlgo_ShellSolid.cdl +-- Created: Wed Jan 12 12:45:20 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class ShellSolid from GEOMAlgo + inherits ShapeSolid from GEOMAlgo + ---Purpose: + +--uses +--raises + +is + Create + returns ShellSolid from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_ShellSolid();" + + Perform (me:out) + is redefined; + + Prepare(me:out) + is redefined protected; + + BuildResult (me:out) + is redefined protected; + + DetectSDFaces(me:out) + is protected; + +--fields + +end ShellSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx new file mode 100644 index 000000000..a92f8a776 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShellSolid.cxx @@ -0,0 +1,369 @@ +// 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/ +// +// File: GEOMAlgo_ShellSolid.cxx +// Created: Wed Jan 12 12:49:45 2005 +// 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GEOMAlgo_ShellSolid +//purpose : +//======================================================================= +GEOMAlgo_ShellSolid::GEOMAlgo_ShellSolid() +: + GEOMAlgo_ShapeSolid() +{ +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_ShellSolid::~GEOMAlgo_ShellSolid() +{ +} +//======================================================================= +// function: +// purpose: +//======================================================================= +void GEOMAlgo_ShellSolid::Perform() +{ + myErrorStatus=0; + // + try { + if (myDSFiller==NULL) { + myErrorStatus=10; + return; + } + if(!myDSFiller->IsDone()) { + myErrorStatus=11; + return; + } + // + Standard_Boolean bIsNewFiller; + // + bIsNewFiller=myDSFiller->IsNewFiller(); + if (bIsNewFiller) { + Prepare(); + myDSFiller->SetNewFiller(!bIsNewFiller); + } + // + myRank=(myDSFiller->DS().Object().ShapeType()==TopAbs_SHELL) ? 1 : 2; + BuildResult(); + } + catch (Standard_Failure) { + myErrorStatus=12; + } +} +//======================================================================= +// function: Prepare +// purpose: +//======================================================================= +void GEOMAlgo_ShellSolid::Prepare() +{ + const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); + // + // 1 States + BOPTools_SolidStateFiller aStateFiller(aPaveFiller); + aStateFiller.Do(); + // + // 2 Project section edges on corresp. faces -> P-Curves on edges. + BOPTools_PCurveMaker aPCurveMaker(aPaveFiller); + aPCurveMaker.Do(); + // + // 3. Degenerated Edges Processing + BOPTools_DEProcessor aDEProcessor(aPaveFiller); + aDEProcessor.Do(); + // + // 4. Detect Same Domain Faces + DetectSDFaces(); +} +//================================================================================= +// function: BuildResult +// purpose: +//================================================================================= +void GEOMAlgo_ShellSolid::BuildResult() +{ + Standard_Boolean bIsTouchCase; + Standard_Integer i, j, nF1, nF2, aNbFFs, aNbS, aNbCurves, nSp, iRank1; + Standard_Integer nE, nF, aNbPB, iBeg, iEnd; + BooleanOperations_StateOfShape aState; + TopExp_Explorer anExp; + TopAbs_ShapeEnum aType; + gp_Pnt2d aP2D; + gp_Pnt aP3D; + // + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + const BOPTools_InterferencePool& anInterfPool=myDSFiller->InterfPool(); + BOPTools_InterferencePool* pInterfPool=(BOPTools_InterferencePool*) &anInterfPool; + BOPTools_CArray1OfSSInterference& aFFs=pInterfPool->SSInterferences(); + const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); + const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool(); + // + // 1. process pf non-interferring faces + iBeg=1; + iEnd=aDS.NumberOfShapesOfTheObject(); + if (myRank==2) { + iBeg=iEnd+1; + iEnd=aDS.NumberOfSourceShapes(); + } + // + for (i=iBeg; i<=iEnd; ++i) { + aType=aDS.GetShapeType(i); + if (aType!=TopAbs_FACE) { + continue; + } + // + const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(i)); + aState=aDS.GetState(i); + if (aState==BooleanOperations_IN) { + myLSIN.Append(aF1); + } + else if (aState==BooleanOperations_OUT) { + myLSOUT.Append(aF1); + } + } + // + // 2. process pf interferred faces + aNbFFs=aFFs.Extent(); + for (i=1; i<=aNbFFs; ++i) { + BOPTools_SSInterference& aFFi=aFFs(i); + // + nF1=aFFi.Index1(); + nF2=aFFi.Index2(); + iRank1=aDS.Rank(nF1); + nF=(iRank1==myRank) ? nF1 : nF2; + const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF)); + // + bIsTouchCase=aFFi.IsTangentFaces(); + // + if (bIsTouchCase) { + myLSON.Append(aF1); + continue; + } + // + // Has section edges ? + aNbS=0; + BOPTools_SequenceOfCurves& aBCurves=aFFi.Curves(); + aNbCurves=aBCurves.Length(); + for (j=1; j<=aNbCurves; j++) { + BOPTools_Curve& aBC=aBCurves(j); + const BOPTools_ListOfPaveBlock& aSectEdges=aBC.NewPaveBlocks(); + aNbS=aSectEdges.Extent(); + if (aNbS) { + break; + } + } + // + if (aNbS) { // it has + continue; + } + // + anExp.Init(aF1, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(anExp.Current()); + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + nE=aDS.ShapeIndex(aE, myRank); + const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(nE)); + aNbPB=aLPB.Extent(); + // + if (aNbPB<2) { + nSp=nE; + if (aNbPB) { + const BOPTools_PaveBlock& aPB=aLPB.First(); + nSp=aPB.Edge(); + } + const TopoDS_Shape& aSp=aDS.Shape(nSp); + // + aState=aDS.GetState(nSp); + if (aState==BooleanOperations_IN) { + myLSIN.Append(aF1); + } + else if (aState==BooleanOperations_OUT) { + myLSOUT.Append(aF1); + } + else if (aState==BooleanOperations_ON) { + Standard_Real aTol; + TopAbs_State aSt; + // + //const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape((iRank1==myRank)? nF2 : nF1)); + //aTol=BRep_Tool::Tolerance(aF2); + aTol=1.e-7; + // + BOPTools_Tools3D::PointNearEdge(aE, aF1, aP2D, aP3D); + const TopoDS_Solid& aRefSolid=(myRank==1) ? + TopoDS::Solid(aDS.Tool()) : TopoDS::Solid(aDS.Object()); + // + BOPTools_PaveFiller* pPF=(BOPTools_PaveFiller*)& aPaveFiller; + IntTools_Context& aCtx=pPF->ChangeContext(); + // + BRepClass3d_SolidClassifier& aSC=aCtx.SolidClassifier(aRefSolid); + aSC.Perform(aP3D, aTol); + aSt=aSC.State(); + if (aSt==TopAbs_IN) { + myLSIN.Append(aF1); + } + else if (aSt==TopAbs_OUT) { + myLSOUT.Append(aF1); + } + } + break; + } // if (aNbPB<2) { + } //for (; anExp.More(); anExp.Next()) + } +} +//======================================================================= +// function: DetectSDFaces +// purpose: +//======================================================================= +void GEOMAlgo_ShellSolid::DetectSDFaces() +{ + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + BOPTools_InterferencePool* pIntrPool=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); + BOPTools_CArray1OfSSInterference& aFFs=pIntrPool->SSInterferences(); + // + Standard_Boolean bFlag; + Standard_Integer i, aNb, nF1, nF2, iZone, aNbSps, iSenseFlag; + gp_Dir aDNF1, aDNF2; + + aNb=aFFs.Extent(); + for (i=1; i<=aNb; i++) { + bFlag=Standard_False; + + BOPTools_SSInterference& aFF=aFFs(i); + + nF1=aFF.Index1(); + nF2=aFF.Index2(); + const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); + // + // iSenseFlag; + const BOPTools_ListOfPaveBlock& aLPB=aFF.PaveBlocks(); + aNbSps=aLPB.Extent(); + + if (!aNbSps) { + continue; + } + + const BOPTools_PaveBlock& aPB=aLPB.First(); + const TopoDS_Edge& aSpE=TopoDS::Edge(aDS.Shape(aPB.Edge())); + + BOPTools_Tools3D::GetNormalToFaceOnEdge (aSpE, aF1, aDNF1); + BOPTools_Tools3D::GetNormalToFaceOnEdge (aSpE, aF2, aDNF2); + iSenseFlag=BOPTools_Tools3D::SenseFlag (aDNF1, aDNF2); + // + if (iSenseFlag==1 || iSenseFlag==-1) { + // + // + TopoDS_Face aF1FWD=aF1; + aF1FWD.Orientation (TopAbs_FORWARD); + + BOP_WireEdgeSet aWES (aF1FWD); + BOP_SDFWESFiller aWESFiller(nF1, nF2, *myDSFiller); + aWESFiller.SetSenseFlag(iSenseFlag); + aWESFiller.SetOperation(BOP_COMMON); + aWESFiller.Do(aWES); + + BOP_FaceBuilder aFB; + aFB.Do(aWES); + const TopTools_ListOfShape& aLF=aFB.NewFaces(); + + iZone=0; + TopTools_ListIteratorOfListOfShape anIt(aLF); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape& aFR=anIt.Value(); + + if (aFR.ShapeType()==TopAbs_FACE) { + const TopoDS_Face& aFaceResult=TopoDS::Face(aFR); + // + Standard_Boolean bIsValidIn2D, bNegativeFlag; + bIsValidIn2D=BOPTools_Tools3D::IsValidArea (aFaceResult, bNegativeFlag); + if (bIsValidIn2D) { + //if(CheckSameDomainFaceInside(aFaceResult, aF2)) { + iZone=1; + break; + //} + } + // + } + } + + if (iZone) { + bFlag=Standard_True; + aFF.SetStatesMap(aWESFiller.StatesMap()); + } + + }// if (iSenseFlag) + + aFF.SetTangentFacesFlag(bFlag); + aFF.SetSenseFlag (iSenseFlag); + }// end of for (i=1; i<=aNb; i++) +} diff --git a/src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx b/src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx new file mode 100644 index 000000000..0e6c4944f --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_ShellSolid.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _GEOMAlgo_ShellSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl b/src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl new file mode 100644 index 000000000..693d4590e --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_SolidSolid.cdl @@ -0,0 +1,58 @@ +// 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/ +// +-- File: GEOMAlgo_SolidSolid.cdl +-- Created: Wed Jan 26 12:05:14 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class SolidSolid from GEOMAlgo + inherits ShellSolid from GEOMAlgo + + ---Purpose: + +uses + Shape from TopoDS + +--raises + +is + Create + returns SolidSolid from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_SolidSolid();" + + Perform (me:out) + is redefined; + + BuildResult (me:out) + is redefined protected; + + SetShape2 (me:out; + aS: Shape from TopoDS); + + Shape2 (me) + returns Shape from TopoDS; + ---C++: return const & + +fields + myS2: Shape from TopoDS is protected; + +end SolidSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx b/src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx new file mode 100644 index 000000000..c0e99a259 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_SolidSolid.cxx @@ -0,0 +1,201 @@ +// 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/ +// +// File: GEOMAlgo_SolidSolid.cxx +// Created: Wed Jan 26 12:06:26 2005 +// Author: Peter KURNEV +// + + +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +//======================================================================= +//function : GEOMAlgo_SolidSolid +//purpose : +//======================================================================= +GEOMAlgo_SolidSolid::GEOMAlgo_SolidSolid() +: + GEOMAlgo_ShellSolid() +{ +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_SolidSolid::~GEOMAlgo_SolidSolid() +{ +} +//======================================================================= +// function: SetShape2 +// purpose: +//======================================================================= +void GEOMAlgo_SolidSolid::SetShape2(const TopoDS_Shape& aS2) +{ + myS2=aS2; +} +//======================================================================= +// function: Shape2 +// purpose: +//======================================================================= +const TopoDS_Shape& GEOMAlgo_SolidSolid::Shape2()const +{ + return myS2; +} +//======================================================================= +// function: Perform +// purpose: +//======================================================================= +void GEOMAlgo_SolidSolid::Perform() +{ + myErrorStatus=0; + try { + if (myDSFiller==NULL) { + myErrorStatus=10; + return; + } + if(!myDSFiller->IsDone()) { + myErrorStatus=11; + return; + } + // + Standard_Boolean bIsNewFiller; + // + bIsNewFiller=myDSFiller->IsNewFiller(); + if (bIsNewFiller) { + Prepare(); + myDSFiller->SetNewFiller(!bIsNewFiller); + } + // + myRank=2; + BuildResult(); + } + catch (Standard_Failure) { + myErrorStatus=12; + } +} +//================================================================================= +// function: BuildResult +// purpose: +//================================================================================= +void GEOMAlgo_SolidSolid::BuildResult() +{ + myErrorStatus=0; + // + Standard_Integer i, j, aNbF, aNbS; + Standard_Integer aNbFIN, aNbFOUT, aNbFON, aNbFINTR; + TopAbs_State aState; + TopTools_ListIteratorOfListOfShape aIt; + TopTools_IndexedMapOfShape aMF, aMS; + GEOMAlgo_IndexedDataMapOfShapeState aMFS; + // + // 1. classify the faces + GEOMAlgo_ShellSolid::BuildResult(); + // + // 2. fill Shape-State map + aIt.Initialize(myLSIN); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aF=aIt.Value(); + aMFS.Add(aF, TopAbs_IN); + } + aIt.Initialize(myLSOUT); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aF=aIt.Value(); + aMFS.Add(aF, TopAbs_OUT); + } + aIt.Initialize(myLSON); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aF=aIt.Value(); + aMFS.Add(aF, TopAbs_ON); + } + myLSIN.Clear(); + myLSON.Clear(); + myLSOUT.Clear(); + // + // 3. fill states for solids + TopExp::MapShapes(myS2, TopAbs_SOLID, aMS); + // + aNbS=aMS.Extent(); + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aSolid=aMS(i); + // + aMF.Clear(); + TopExp::MapShapes(aSolid, TopAbs_FACE, aMF); + // + aNbFIN=0; + aNbFOUT=0; + aNbFON=0; + aNbFINTR=0; + // + aNbF=aMF.Extent(); + for(j=1; j +#endif +#ifndef _GEOMAlgo_SolidSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_StateCollector.cdl b/src/GEOMAlgo/GEOMAlgo_StateCollector.cdl new file mode 100644 index 000000000..70065fe5b --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_StateCollector.cdl @@ -0,0 +1,50 @@ +// 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/ +// +-- File: GEOMAlgo_StateCollector.cdl +-- Created: Thu Mar 10 09:39:25 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class StateCollector from GEOMAlgo + + ---Purpose: + +uses + State from TopAbs + +--raises + +is + Create + returns StateCollector from GEOMAlgo; + + AppendState(me:out; + aSt:State from TopAbs) + returns Boolean from Standard; + + State(me) + returns State from TopAbs; + +fields + myCounter:Integer from Standard[3]; + +end StateCollector; diff --git a/src/GEOMAlgo/GEOMAlgo_StateCollector.cxx b/src/GEOMAlgo/GEOMAlgo_StateCollector.cxx new file mode 100644 index 000000000..5281aced7 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_StateCollector.cxx @@ -0,0 +1,90 @@ +// 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/ +// +// File: GEOMAlgo_StateCollector.cxx +// Created: Thu Mar 10 09:42:11 2005 +// Author: Peter KURNEV +// + + +#include + +//======================================================================= +//function : GEOMAlgo_StateCollector +//purpose : +//======================================================================= +GEOMAlgo_StateCollector::GEOMAlgo_StateCollector() +{ + myCounter[0]=0; + myCounter[1]=0; + myCounter[2]=0; +} +//======================================================================= +//function : AppendState +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_StateCollector::AppendState(const TopAbs_State aSt) +{ + Standard_Boolean bIsToBreak; + // + switch(aSt) { + case TopAbs_IN: + ++myCounter[0]; + break; + case TopAbs_OUT: + ++myCounter[1]; + break; + case TopAbs_ON: + ++myCounter[2]; + break; + default: + break; + } + bIsToBreak=(myCounter[0] && myCounter[1]); + // + return bIsToBreak; +} +//======================================================================= +//function : State +//purpose : +//======================================================================= +TopAbs_State GEOMAlgo_StateCollector::State()const +{ + TopAbs_State aSt; + // + aSt=TopAbs_UNKNOWN; + // + if (myCounter[0] && myCounter[1]) { + return aSt; + } + // + else if (myCounter[0] && myCounter[2]>=0) { + aSt=TopAbs_IN; + } + // + else if (myCounter[1] && myCounter[2]>=0) { + aSt=TopAbs_OUT; + } + // + else if (!myCounter[0] && !myCounter[1] && myCounter[2]) { + aSt=TopAbs_ON; + } + // + return aSt; +} diff --git a/src/GEOMAlgo/GEOMAlgo_StateCollector.jxx b/src/GEOMAlgo/GEOMAlgo_StateCollector.jxx new file mode 100644 index 000000000..40d7d3ab6 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_StateCollector.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _GEOMAlgo_StateCollector_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl new file mode 100644 index 000000000..d812ff075 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cdl @@ -0,0 +1,97 @@ +// 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/ +// +-- File: GEOMAlgo_SurfaceTools.cdl +-- Created: Thu Jan 27 11:03:49 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class SurfaceTools from GEOMAlgo + + ---Purpose: + +uses + Pnt from gp, + Pln from gp, + Cylinder from gp, + Sphere from gp, + Surface from Geom, + Surface from GeomAdaptor, + State from TopAbs, + State from GEOMAlgo + +--raises + +is + + + IsAnalytic(myclass; + aS:Surface from Geom) + returns Boolean from Standard; + + IsCoaxial(myclass; + aP1 : Pnt from gp; + aP2 : Pnt from gp; + aCyl : Cylinder from gp; + aTol : Real from Standard) + returns Boolean from Standard; + + IsConformState(myclass; + aST1:State from TopAbs; + aST2:State from GEOMAlgo) + returns Boolean from Standard; + + GetState(myclass; + aP:Pnt from gp; + aS:Surface from GeomAdaptor; + aTol:Real from Standard; + aSt:out State from TopAbs) + returns Integer from Standard; + + GetState(myclass; + aP:Pnt from gp; + aS:Surface from Geom; + aTol:Real from Standard; + aSt:out State from TopAbs) + returns Integer from Standard; + + Distance(myclass; + aP:Pnt from gp; + aPln:Pln from gp) + returns Real from Standard; + + Distance(myclass; + aP:Pnt from gp; + aCyl:Cylinder from gp) + returns Real from Standard; + + Distance(myclass; + aP:Pnt from gp; + aSph:Sphere from gp) + returns Real from Standard; + + ReverseState(myclass; + aSt: State from TopAbs) + returns State from TopAbs; + +--fields + +end SurfaceTools; diff --git a/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx new file mode 100644 index 000000000..436d05f1d --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx @@ -0,0 +1,268 @@ +// 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/ +// +// File: GEOMAlgo_SurfaceTools.cxx +// Created: Thu Jan 27 11:05:16 2005 +// Author: Peter KURNEV +// + + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +//======================================================================= +//function : GetState +//purpose : +//======================================================================= + Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP, + const GeomAdaptor_Surface& aGAS, + const Standard_Real aTol, + TopAbs_State& aState) +{ + Standard_Integer iErr; + Standard_Real aDp, aR; + GeomAbs_SurfaceType aType; + gp_Sphere aSph; + gp_Cylinder aCyl; + gp_Pln aPln; + // + iErr=0; + aState=TopAbs_UNKNOWN; + // + aType=aGAS.GetType(); + switch (aType) { + case GeomAbs_Plane: + aPln=aGAS.Plane(); + aR=0.; + aDp=GEOMAlgo_SurfaceTools::Distance(aP, aPln); + break; + + case GeomAbs_Cylinder: + aCyl=aGAS.Cylinder(); + aR=aCyl.Radius(); + aDp=GEOMAlgo_SurfaceTools::Distance(aP, aCyl); + break; + + case GeomAbs_Sphere: + aSph=aGAS.Sphere(); + aR=aSph.Radius(); + aDp=GEOMAlgo_SurfaceTools::Distance(aP, aSph); + break; + + default: + iErr=1; // unprocessed surface type + break; + } + // + if (!iErr) { + aState=TopAbs_ON; + if (aDp>aR+aTol) { + aState=TopAbs_OUT; + } + else if (aDp aTol) { + return bRet; + } + // + return !bRet; +} +//======================================================================= +//function : IsAnalytic +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& aSurf) +{ + Standard_Boolean bRet; + GeomAbs_SurfaceType aType; + GeomAdaptor_Surface aGAS; + // + aGAS.Load(aSurf); + aType=aGAS.GetType(); + bRet=(aType==GeomAbs_Plane || + aType==GeomAbs_Cylinder || + aType==GeomAbs_Sphere); + return bRet; +} +//======================================================================= +//function : IsConformState +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState(const TopAbs_State aST1, + const GEOMAlgo_State aST2) +{ + Standard_Boolean bRet=Standard_False; + // + switch (aST2) { + case GEOMAlgo_ST_IN: + if (aST1==TopAbs_IN) { + bRet=!bRet; + } + break; + case GEOMAlgo_ST_OUT: + if (aST1==TopAbs_OUT) { + bRet=!bRet; + } + break; + case GEOMAlgo_ST_ON: + if (aST1==TopAbs_ON) { + bRet=!bRet; + } + break; + case GEOMAlgo_ST_ONIN: + if (aST1==TopAbs_ON || aST1==TopAbs_IN) { + bRet=!bRet; + } + break; + case GEOMAlgo_ST_ONOUT: + if (aST1==TopAbs_ON || aST1==TopAbs_OUT) { + bRet=!bRet; + } + break; + default: + break; + } + return bRet; +} diff --git a/src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx new file mode 100644 index 000000000..34238e42b --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_SurfaceTools.jxx @@ -0,0 +1,40 @@ +// 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/ +// +#ifndef _Geom_Surface_HeaderFile +#include +#endif +#ifndef _gp_Pnt_HeaderFile +#include +#endif +#ifndef _gp_Cylinder_HeaderFile +#include +#endif +#ifndef _GeomAdaptor_Surface_HeaderFile +#include +#endif +#ifndef _gp_Pln_HeaderFile +#include +#endif +#ifndef _gp_Sphere_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_SurfaceTools_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.cdl b/src/GEOMAlgo/GEOMAlgo_Tools.cdl new file mode 100644 index 000000000..4981d93bf --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Tools.cdl @@ -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/ +// +-- File: GEOMAlgo_Tools.cdl +-- Created: Mon Dec 6 11:26:02 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Tools from GEOMAlgo + + ---Purpose: + +uses + Pnt from gp, + Surface from Geom, + ShapeEnum from TopAbs, + Edge from TopoDS, + Face from TopoDS, + Shape from TopoDS, + ListOfShape from TopTools, + IndexedDataMapOfShapeListOfShape from TopTools, + Context from IntTools, + IndexedDataMapOfPassKeyShapeListOfShape from GEOMAlgo + +--raises + +is + IsCompositeShape(myclass; + aS :Shape from TopoDS) + returns Boolean from Standard; + + RefineSDShapes(myclass; + aMSD:out IndexedDataMapOfPassKeyShapeListOfShape from GEOMAlgo; + aTol:Real from Standard; + aCtx:out Context from IntTools) + returns Integer from Standard; + + FindSDShapes(myclass; + aLE :ListOfShape from TopTools; + aTol:Real from Standard; + aMEE:out IndexedDataMapOfShapeListOfShape from TopTools; + aCtx:out Context from IntTools) + returns Integer from Standard; + + FindSDShapes(myclass; + aE1 :Shape from TopoDS; + aLE :ListOfShape from TopTools; + aTol :Real from Standard; + aLESD :out ListOfShape from TopTools; + aCtx :out Context from IntTools) + returns Integer from Standard; + + ProjectPointOnShape(myclass; + aP1: Pnt from gp; + aS :Shape from TopoDS; + aP2:out Pnt from gp; + aCtx :out Context from IntTools) + returns Boolean from Standard; + + PointOnShape(myclass; + aS :Shape from TopoDS; + aP3D:out Pnt from gp); + + PointOnEdge(myclass; + aE :Edge from TopoDS; + aP3D:out Pnt from gp); + + PointOnEdge(myclass; + aE :Edge from TopoDS; + aT :Real from Standard; + aP3D:out Pnt from gp); + + PointOnFace(myclass; + aF :Face from TopoDS; + aP3D:out Pnt from gp); + + PointOnFace(myclass; + aF :Face from TopoDS; + aU :Real from Standard; + aV :Real from Standard; + aP3D:out Pnt from gp); + + RefinePCurveForEdgeOnFace (myclass; + aE : Edge from TopoDS; + aF : Face from TopoDS; + aU1 : Real from Standard; + aU2 : Real from Standard); + + IsUPeriodic(myclass; + aS:Surface from Geom) + returns Boolean from Standard; + +--fields + +end Tools; diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.cxx b/src/GEOMAlgo/GEOMAlgo_Tools.cxx new file mode 100644 index 000000000..6f4696463 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Tools.cxx @@ -0,0 +1,457 @@ +// 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/ +// +// File: GEOMAlgo_Tools.cxx +// Created: Mon Dec 6 11:35:29 2004 +// 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 + +static + void GetCount(const TopoDS_Shape& aS, + Standard_Integer& iCnt); + +//======================================================================= +//function : IsCompositeShape +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Tools::IsCompositeShape(const TopoDS_Shape& aS) +{ + Standard_Boolean bRet; + Standard_Integer iCnt; + TopoDS_Iterator aIt; + // + iCnt=0; + GetCount(aS, iCnt); + bRet=(iCnt>1); + // + return bRet; +} + +//======================================================================= +//function : GetCount +//purpose : +//======================================================================= +void GetCount(const TopoDS_Shape& aS, + Standard_Integer& iCnt) +{ + TopoDS_Iterator aIt; + TopAbs_ShapeEnum aTS; + // + aTS=aS.ShapeType(); + // + if (aTS==TopAbs_SHAPE) { + return; + } + if (aTS!=TopAbs_COMPOUND) { + ++iCnt; + return; + } + // + aIt.Initialize(aS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx=aIt.Value(); + GetCount(aSx, iCnt); + } +} + +//======================================================================= +//function : RefineSDShapes +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape &aMPKLE, + const Standard_Real aTol, + IntTools_Context& aCtx) +{ + Standard_Integer i, aNbE, iErr, j, aNbEE, aNbToAdd; + TopTools_IndexedDataMapOfShapeListOfShape aMEE, aMSDE, aMEToAdd; + // + iErr=1; + // + aNbE=aMPKLE.Extent(); + for (i=1; i<=aNbE; ++i) { + TopTools_ListOfShape& aLSDE=aMPKLE.ChangeFromIndex(i); + // + aMEE.Clear(); + iErr=GEOMAlgo_Tools::FindSDShapes(aLSDE, aTol, aMEE, aCtx); + if (iErr) { + return iErr; + } + // + aNbEE=aMEE.Extent(); + if (aNbEE==1) { + continue; // nothing to do + } + // + for (j=1; j<=aNbEE; ++j) { + TopTools_ListOfShape& aLEE=aMEE.ChangeFromIndex(j); + // + if (j==1) { + aLSDE.Clear(); + aLSDE.Append(aLEE); + } + else { + const TopoDS_Shape& aE1=aLEE.First(); + aMEToAdd.Add(aE1, aLEE); + } + } + } + // + aNbToAdd=aMEToAdd.Extent(); + if (!aNbToAdd) { + return aNbToAdd; + } + // + for (i=1; i<=aNbToAdd; ++i) { + GEOMAlgo_PassKeyShape aPKE1; + // + const TopoDS_Shape& aE1=aMEToAdd.FindKey(i); + const TopTools_ListOfShape& aLE=aMEToAdd(i); + // + aPKE1.SetIds(aE1); + aMPKLE.Add(aPKE1, aLE); + } + // + return 0; +} +//======================================================================= +//function : FindSDShapes +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE, + const Standard_Real aTol, + TopTools_IndexedDataMapOfShapeListOfShape& aMEE, + IntTools_Context& aCtx) +{ + Standard_Integer aNbE, aNbEProcessed, aNbESD, iErr; + TopTools_ListOfShape aLESD; + TopTools_ListIteratorOfListOfShape aIt, aIt1; + TopTools_IndexedMapOfShape aMProcessed; + TopAbs_ShapeEnum aType; + // + aNbE=aLE.Extent(); + if (!aNbE) { + return 3; // Err + } + //modified by NIZNHY-PKV Thu Dec 30 10:56:52 2004 f + if (aNbE==1) { + return 0; // Nothing to do + } + //modified by NIZNHY-PKV Thu Dec 30 10:56:56 2004 t + // + while(1) { + aNbEProcessed=aMProcessed.Extent(); + if (aNbEProcessed==aNbE) { + break; + } + // + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + // + if (aMProcessed.Contains(aS)) { + continue; + } + // + //modified by NIZNHY-PKV Thu Dec 30 10:57:01 2004 f + aType=aS.ShapeType(); + if (aType==TopAbs_EDGE) { + const TopoDS_Edge& aE=TopoDS::Edge(aS); + if (BRep_Tool::Degenerated(aE)) { + aMProcessed.Add(aE); + continue; + } + } + //modified by NIZNHY-PKV Thu Dec 30 10:57:03 2004 t + // + aLESD.Clear(); + iErr=GEOMAlgo_Tools::FindSDShapes(aS, aLE, aTol, aLESD, aCtx); + if (iErr) { + return 2; // Err + } + // + aNbESD=aLESD.Extent(); + if (!aNbESD) { + return 1; // Err + } + // + aMEE.Add(aS, aLESD); + // + aIt1.Initialize(aLESD); + for (; aIt1.More(); aIt1.Next()) { + const TopoDS_Shape& aE1=aIt1.Value(); + aMProcessed.Add(aE1); + } + } + } + return 0; +} +//======================================================================= +//function : FindSDShapes +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopoDS_Shape& aE1, + const TopTools_ListOfShape& aLE, + const Standard_Real aTol, + TopTools_ListOfShape& aLESD, + IntTools_Context& aCtx) +{ + Standard_Boolean bIsDone; + Standard_Real aTol2, aD2; + gp_Pnt aP1, aP2; + TopTools_ListIteratorOfListOfShape aIt; + // + aTol2=aTol*aTol; + GEOMAlgo_Tools::PointOnShape(aE1, aP1); + // + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aE2=aIt.Value(); + if (aE2.IsSame(aE1)) { + aLESD.Append(aE2); + } + else { + bIsDone=GEOMAlgo_Tools::ProjectPointOnShape(aP1, aE2, aP2, aCtx); + if (!bIsDone) { + return 1; + } + aD2=aP1.SquareDistance(aP2); + if(aD2D0(aU, aV, aP3D); +} +//======================================================================= +//function : PointOnEdge +//purpose : +//======================================================================= +void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, + gp_Pnt& aP3D) +{ + Standard_Real aTx, aT1, aT2; + // + BRep_Tool::Curve(aE, aT1, aT2); + aTx=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); + GEOMAlgo_Tools::PointOnEdge(aE, aTx, aP3D); +} +//======================================================================= +//function : PointOnEdge +//purpose : +//======================================================================= +void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE, + const Standard_Real aT, + gp_Pnt& aP3D) +{ + Standard_Real aT1, aT2; + Handle(Geom_Curve) aC3D; + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + aC3D->D0(aT, aP3D); +} +//======================================================================= +//function : RefinePCurveForEdgeOnFace +//purpose : +//======================================================================= +void GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(const TopoDS_Edge& aE, + const TopoDS_Face& aF, + const Standard_Real aUMin, + const Standard_Real aUMax) +{ + Standard_Real aT1, aT2, aTx, aUx, aTol, aTwoPI; + gp_Pnt2d aP2D; + Handle(Geom_Surface) aS; + Handle(Geom2d_Curve) aC2D; + BRep_Builder aBB; + // + aTwoPI=PI+PI; + // + aC2D=BRep_Tool::CurveOnSurface(aE, aF, aT1, aT2); + if (!aC2D.IsNull()) { + if (BRep_Tool::IsClosed(aE, aF)) { + return; + } + aTx=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); + aC2D->D0(aTx, aP2D); + aUx=aP2D.X(); + if (aUx < aUMin || aUx > aUMax) { + // need to rebuild + Handle(Geom2d_Curve) aC2Dx; + // + aTol=BRep_Tool::Tolerance(aE); + aBB.UpdateEdge(aE, aC2Dx, aF, aTol); + } + } +} +//======================================================================= +//function : IsUPeriodic +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Tools::IsUPeriodic(const Handle(Geom_Surface) &aS) +{ + Standard_Boolean bRet; + GeomAbs_SurfaceType aType; + GeomAdaptor_Surface aGAS; + // + aGAS.Load(aS); + aType=aGAS.GetType(); + bRet=(aType==GeomAbs_Cylinder|| + aType==GeomAbs_Cone || + aType==GeomAbs_Sphere); + // + return bRet; +} diff --git a/src/GEOMAlgo/GEOMAlgo_Tools.jxx b/src/GEOMAlgo/GEOMAlgo_Tools.jxx new file mode 100644 index 000000000..51a85dfd9 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_Tools.jxx @@ -0,0 +1,49 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape_HeaderFile +#include +#endif +#ifndef _IntTools_Context_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopTools_IndexedDataMapOfShapeListOfShape_HeaderFile +#include +#endif +#ifndef _gp_Pnt_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _Geom_Surface_HeaderFile +#include +#endif +#ifndef _GEOMAlgo_Tools_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl b/src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl new file mode 100644 index 000000000..588e8d851 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_VertexSolid.cdl @@ -0,0 +1,51 @@ +// 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/ +// +-- File: GEOMAlgo_VertexSolid.cdl +-- Created: Wed Jan 12 16:34:53 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class VertexSolid from GEOMAlgo + inherits ShapeSolid from GEOMAlgo + + ---Purpose: + +--uses +--raises + +is + Create + returns VertexSolid from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_VertexSolid();" + + Perform (me:out) + is redefined; + + Prepare(me:out) + is redefined protected; + + BuildResult (me:out) + is redefined protected; + +--fields + +end VertexSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx b/src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx new file mode 100644 index 000000000..349f1498c --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_VertexSolid.cxx @@ -0,0 +1,238 @@ +// 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/ +// +// File: GEOMAlgo_VertexSolid.cxx +// Created: Wed Jan 12 16:36:40 2005 +// 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 + +//======================================================================= +//function : GEOMAlgo_VertexSolid +//purpose : +//======================================================================= +GEOMAlgo_VertexSolid::GEOMAlgo_VertexSolid() +: + GEOMAlgo_ShapeSolid() +{ +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_VertexSolid::~GEOMAlgo_VertexSolid() +{ +} +//======================================================================= +// function: Perform +// purpose: +//======================================================================= +void GEOMAlgo_VertexSolid::Perform() +{ + myErrorStatus=0; + // + try { + if (myDSFiller==NULL) { + myErrorStatus=10; + return; + } + if(!myDSFiller->IsDone()) { + myErrorStatus=11; + return; + } + // + Standard_Boolean bIsNewFiller; + Standard_Integer aNbF; + TopTools_IndexedMapOfShape aM; + // + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + const TopoDS_Shape& aObj=aDS.Object(); + // + TopExp::MapShapes(aObj, TopAbs_FACE, aM); + aNbF=aM.Extent(); + myRank=(aNbF) ? 2 : 1; + // + bIsNewFiller=myDSFiller->IsNewFiller(); + + if (bIsNewFiller) { + Prepare(); + myDSFiller->SetNewFiller(!bIsNewFiller); + } + BuildResult(); + } + // + catch (Standard_Failure) { + myErrorStatus = 12; + } +} +//======================================================================= +// function: Prepare +// purpose: +//======================================================================= +void GEOMAlgo_VertexSolid::Prepare() +{ + Standard_Integer i, iBeg, iEnd, aNbVV, j, n1, n2, iFound; + Standard_Real aTol; + TopAbs_State aSt; + TopAbs_ShapeEnum aType; + BooleanOperations_StateOfShape aState; + gp_Pnt aP3D; + // + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + BooleanOperations_ShapesDataStructure* pDS=(BooleanOperations_ShapesDataStructure*)&aDS; + const BOPTools_InterferencePool& aIP=myDSFiller->InterfPool(); + BOPTools_InterferencePool* pIP=(BOPTools_InterferencePool*) &aIP; + BOPTools_CArray1OfVVInterference& aVVs=pIP->VVInterferences(); + const BOPTools_PaveFiller& aPF=myDSFiller->PaveFiller(); + BOPTools_PaveFiller* pPF=(BOPTools_PaveFiller*)&aPF; + IntTools_Context& aCtx=pPF->ChangeContext(); + // + const TopoDS_Shape& aObj=aDS.Object(); + const TopoDS_Shape& aTool=aDS.Tool(); + // + const TopoDS_Solid& aSolid=(myRank==1) ? TopoDS::Solid(aTool) : TopoDS::Solid(aObj); + const TopoDS_Shape& aSV =(myRank==1)? aObj : aTool; + // + BRepClass3d_SolidClassifier& aSC=aCtx.SolidClassifier(aSolid); + // + iBeg=1; + iEnd=aDS.NumberOfShapesOfTheObject(); + if (myRank==2) { + iBeg=iEnd+1; + iEnd=aDS.NumberOfSourceShapes(); + } + // + for (i=iBeg; i<=iEnd; ++i) { + aType=aDS.GetShapeType(i); + if (aType!=TopAbs_VERTEX) { + continue; + } + // + const TopoDS_Vertex& aV=TopoDS::Vertex(aDS.Shape(i)); + // + aState=aDS.GetState(i); + if (aState==BooleanOperations_ON || + aState==BooleanOperations_IN || + aState==BooleanOperations_OUT) { + continue; + } + // + iFound=0; + aNbVV=aVVs.Extent(); + for (j=1; j<=aNbVV; ++j) { + BOPTools_VVInterference& aVV=aVVs(j); + aVV.Indices(n1, n2); + if (n1==i || n2==i) { + pDS->SetState (n1, BooleanOperations_ON); + pDS->SetState (n2, BooleanOperations_ON); + iFound=1; + break; + } + } + if (iFound) { + continue; + } + // + aP3D=BRep_Tool::Pnt(aV); + aTol=1.E-7; + aSC.Perform(aP3D, aTol); + aSt=aSC.State(); + if (aSt==TopAbs_IN) { + pDS->SetState (i, BooleanOperations_IN); + } + else if (aSt==TopAbs_OUT) { + pDS->SetState (i, BooleanOperations_OUT); + } + } +} +//======================================================================= +// function: BuildResult +// purpose: +//======================================================================= +void GEOMAlgo_VertexSolid::BuildResult() +{ + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + // + Standard_Integer i, iBeg, iEnd; + TopAbs_ShapeEnum aType; + BooleanOperations_StateOfShape aState; + // + myLSIN.Clear(); + myLSOUT.Clear(); + myLSON.Clear(); + // + iBeg=1; + iEnd=aDS.NumberOfShapesOfTheObject(); + if (myRank==2) { + iBeg=iEnd+1; + iEnd=aDS.NumberOfSourceShapes(); + } + // + for (i=iBeg; i<=iEnd; ++i) { + aType=aDS.GetShapeType(i); + if (aType!=TopAbs_VERTEX) { + continue; + } + const TopoDS_Shape& aV=aDS.Shape(i); + aState=aDS.GetState(i); + // + if (aState==BooleanOperations_IN) { + myLSIN.Append(aV); + } + else if (aState==BooleanOperations_OUT) { + myLSOUT.Append(aV); + } + else if (aState==BooleanOperations_ON) { + myLSON.Append(aV); + } + } +} diff --git a/src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx b/src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx new file mode 100644 index 000000000..c9137f862 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_VertexSolid.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _GEOMAlgo_VertexSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/GEOMAlgo_WireSolid.cdl b/src/GEOMAlgo/GEOMAlgo_WireSolid.cdl new file mode 100644 index 000000000..f55158a97 --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_WireSolid.cdl @@ -0,0 +1,50 @@ +// 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/ +// +-- File: GEOMAlgo_WireSolid.cdl +-- Created: Wed Jan 12 10:17:00 2005 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2005 + + +class WireSolid from GEOMAlgo + inherits ShapeSolid from GEOMAlgo + ---Purpose: + +--uses +--raises + +is + Create + returns WireSolid from GEOMAlgo; + ---C++: alias "Standard_EXPORT virtual ~GEOMAlgo_WireSolid();" + + Perform (me:out) + is redefined; + + Prepare(me:out) + is redefined protected; + + BuildResult (me:out) + is redefined protected; + +--fields + +end WireSolid; diff --git a/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx new file mode 100644 index 000000000..306fe56be --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_WireSolid.cxx @@ -0,0 +1,171 @@ +// 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/ +// +// File: GEOMAlgo_WireSolid.cxx +// Created: Wed Jan 12 10:19:31 2005 +// Author: Peter KURNEV +// + + +#include + +#include + +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GEOMAlgo_WireSolid +//purpose : +//======================================================================= +GEOMAlgo_WireSolid::GEOMAlgo_WireSolid() +: + GEOMAlgo_ShapeSolid() +{ +} +//======================================================================= +//function : ~ +//purpose : +//======================================================================= +GEOMAlgo_WireSolid::~GEOMAlgo_WireSolid() +{ +} +//======================================================================= +// function: Perform +// purpose: +//======================================================================= +void GEOMAlgo_WireSolid::Perform() +{ + myErrorStatus=0; + // + try { + if (myDSFiller==NULL) { + myErrorStatus=10; + return; + } + if(!myDSFiller->IsDone()) { + myErrorStatus=11; + return; + } + // + Standard_Boolean bIsNewFiller; + // + bIsNewFiller=myDSFiller->IsNewFiller(); + + if (bIsNewFiller) { + Prepare(); + myDSFiller->SetNewFiller(!bIsNewFiller); + } + BuildResult(); + } + // + catch (Standard_Failure) { + myErrorStatus= 12; + } +} +//======================================================================= +// function: Prepare +// purpose: +//======================================================================= +void GEOMAlgo_WireSolid::Prepare() +{ + const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); + // + BOPTools_WireStateFiller aStateFiller(aPaveFiller); + aStateFiller.Do(); + // +} +//======================================================================= +// function: BuildResult +// purpose: +//======================================================================= +void GEOMAlgo_WireSolid::BuildResult() +{ + const BooleanOperations_ShapesDataStructure& aDS=myDSFiller->DS(); + const BOPTools_PaveFiller& aPaveFiller=myDSFiller->PaveFiller(); + const BOPTools_SplitShapesPool& aSplitShapesPool=aPaveFiller.SplitShapesPool(); + // + Standard_Integer i, aNbPB, nSp, iBeg, iEnd; + TopAbs_ShapeEnum aType; + BooleanOperations_StateOfShape aState; + // + myLSIN.Clear(); + myLSOUT.Clear(); + myLSON.Clear(); + // + iBeg=1; + iEnd=aDS.NumberOfShapesOfTheObject(); + if (aDS.Tool().ShapeType()==TopAbs_WIRE) { + iBeg=iEnd+1; + iEnd=aDS.NumberOfSourceShapes(); + } + // + for (i=iBeg; i<=iEnd; ++i) { + aType=aDS.GetShapeType(i); + if (aType==TopAbs_EDGE) { + const TopoDS_Shape& aE=aDS.Shape(i); + const BOPTools_ListOfPaveBlock& aLPB=aSplitShapesPool(aDS.RefEdge(i)); + aNbPB=aLPB.Extent(); + // + if (!aNbPB) { + aState=aDS.GetState(i); + // + if (aState==BooleanOperations_IN) { + myLSIN.Append(aE); + } + else if (aState==BooleanOperations_OUT) { + myLSOUT.Append(aE); + } + else if (aState==BooleanOperations_ON) { + myLSON.Append(aE); + } + } + // + else if (aNbPB==1) { + const BOPTools_PaveBlock& aPB=aLPB.First(); + nSp=aPB.Edge(); + const TopoDS_Shape& aSp=aDS.Shape(nSp); + aState=aDS.GetState(nSp); + // + if (aState==BooleanOperations_IN) { + myLSIN.Append(aE); + } + else if (aState==BooleanOperations_OUT) { + myLSOUT.Append(aE); + } + else if (aState==BooleanOperations_ON) { + myLSON.Append(aE); + } + } + } + } +} diff --git a/src/GEOMAlgo/GEOMAlgo_WireSolid.jxx b/src/GEOMAlgo/GEOMAlgo_WireSolid.jxx new file mode 100644 index 000000000..16961833e --- /dev/null +++ b/src/GEOMAlgo/GEOMAlgo_WireSolid.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _GEOMAlgo_WireSolid_HeaderFile +#include +#endif diff --git a/src/GEOMAlgo/Makefile.in b/src/GEOMAlgo/Makefile.in new file mode 100644 index 000000000..d250da21c --- /dev/null +++ b/src/GEOMAlgo/Makefile.in @@ -0,0 +1,111 @@ +# GEOM GEOMAlgo : tools for Glue Faces algorithm +# +# Copyright (C) 2004 CEA +# +# 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.org +# +# +# +# File : Makefile.in +# Author : Julia DOROVSKIKH +# Module : GEOM +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + + +@COMMENCE@ + +# Libraries targets +LIB = libGEOMAlgo.la +LIB_SRC = \ + BlockFix.cxx \ + BlockFix_BlockFixAPI.cxx \ + BlockFix_CheckTool.cxx \ + BlockFix_PeriodicSurfaceModifier.cxx \ + BlockFix_SphereSpaceModifier.cxx \ + BlockFix_UnionEdges.cxx \ + BlockFix_UnionFaces.cxx \ + GEOMAlgo_Algo.cxx \ + GEOMAlgo_CoupleOfShapes.cxx \ + GEOMAlgo_DataMapIteratorOfDataMapOfPassKeyInteger_0.cxx \ + GEOMAlgo_DataMapNodeOfDataMapOfPassKeyInteger_0.cxx \ + GEOMAlgo_DataMapOfPassKeyInteger_0.cxx \ + GEOMAlgo_FinderShapeOn1.cxx \ + GEOMAlgo_FinderShapeOnQuad.cxx \ + GEOMAlgo_GlueAnalyser.cxx \ + GEOMAlgo_Gluer.cxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfIntegerShape_0.cxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfPassKeyShapeListOfShape_0.cxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeBox_0.cxx \ + GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeState_0.cxx \ + GEOMAlgo_IndexedDataMapOfIntegerShape_0.cxx \ + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape_0.cxx \ + GEOMAlgo_IndexedDataMapOfShapeBox_0.cxx \ + GEOMAlgo_IndexedDataMapOfShapeState_0.cxx \ + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes_0.cxx \ + GEOMAlgo_ListIteratorOfListOfPnt_0.cxx \ + GEOMAlgo_ListNodeOfListOfCoupleOfShapes_0.cxx \ + GEOMAlgo_ListNodeOfListOfPnt_0.cxx \ + GEOMAlgo_ListOfCoupleOfShapes_0.cxx \ + GEOMAlgo_ListOfPnt_0.cxx \ + GEOMAlgo_PassKey.cxx \ + GEOMAlgo_PassKeyMapHasher.cxx \ + GEOMAlgo_PassKeyShape.cxx \ + GEOMAlgo_ShapeAlgo.cxx \ + GEOMAlgo_StateCollector.cxx \ + GEOMAlgo_SurfaceTools.cxx \ + GEOMAlgo_Tools.cxx + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# header files +EXPORT_HEADERS = \ + BlockFix_BlockFixAPI.hxx \ + BlockFix_BlockFixAPI.lxx \ + BlockFix_CheckTool.hxx \ + Handle_BlockFix_BlockFixAPI.hxx \ + GEOMAlgo_Algo.hxx \ + GEOMAlgo_CoupleOfShapes.hxx \ + GEOMAlgo_GlueAnalyser.hxx \ + GEOMAlgo_Gluer.hxx \ + GEOMAlgo_FinderShapeOn1.hxx \ + GEOMAlgo_FinderShapeOnQuad.hxx \ + GEOMAlgo_IndexedDataMapOfShapeState.hxx \ + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes.hxx \ + GEOMAlgo_ListOfCoupleOfShapes.hxx \ + GEOMAlgo_ShapeAlgo.hxx \ + GEOMAlgo_State.hxx \ + Handle_GEOMAlgo_IndexedDataMapNodeOfIndexedDataMapOfShapeState.hxx \ + Handle_GEOMAlgo_ListNodeOfListOfCoupleOfShapes.hxx + +# idl files +EXPORT_IDLS= + + +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += $(CAS_LDPATH) -lTKBO -L${KERNEL_ROOT_DIR}/lib/salome + +%_moc.cxx: %.h + $(MOC) $< -o $@ + +@CONCLUDE@ diff --git a/src/GEOMBase/GEOMBase.cxx b/src/GEOMBase/GEOMBase.cxx new file mode 100644 index 000000000..049432031 --- /dev/null +++ b/src/GEOMBase/GEOMBase.cxx @@ -0,0 +1,981 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMBase.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "GEOMBase.h" +#include "GeometryGUI.h" +#include "GEOMBase_aParameterDlg.h" + +#include "GEOM_Client.hxx" + +//// SALOME Includes +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +#include "SALOME_LifeCycleCORBA.hxx" + +#include "GEOM_AssemblyBuilder.h" +#include "GEOM_Actor.h" +#include "SVTK_RenderWindowInteractor.h" +#include "SVTK_ViewModel.h" +#include "SVTK_ViewWindow.h" +#include "OCCViewer_ViewPort3d.h" +#include "OCCViewer_ViewModel.h" +#include "OCCViewer_ViewWindow.h" + +#include "SALOME_ListIO.hxx" +#include "SALOME_ListIteratorOfListIO.hxx" +#include "GEOM_AISTrihedron.hxx" + +#include "SUIT_Session.h" +#include "SUIT_ViewWindow.h" +#include "SUIT_MessageBox.h" +#include "SalomeApp_Application.h" +#include "SalomeApp_Study.h" + +// // Open CASCADE Includes +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "GEOMImpl_Types.hxx" + +using namespace std; + +#include "SALOMEDSClient.hxx" + + +//======================================================================= +// function : GEOMBase() +// purpose : Constructor +//======================================================================= +GEOMBase::GEOMBase() +{ +} + + +//======================================================================= +// function : ~GEOMBase() +// purpose : Destructor +//======================================================================= +GEOMBase::~GEOMBase() +{ +} + +//===================================================================================== +// function : GetShapeFromIOR() +// purpose : exist also as static method ! +//===================================================================================== +TopoDS_Shape GEOMBase::GetShapeFromIOR(QString IOR) +{ + TopoDS_Shape result; + if(IOR.stripWhiteSpace().isEmpty()) + return result; + + CORBA::Object_var obj = SalomeApp_Application::orb()->string_to_object((char*)(IOR.latin1())); + if(CORBA::is_nil(obj)) + return result; + GEOM::GEOM_Object_var GeomObject = GEOM::GEOM_Object::_narrow( obj ); + if (GeomObject->_is_nil()) + return result; + + result = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), GeomObject); + return result; +} + + +//===================================================================================== +// function : GetIndex() +// purpose : Get the index of a sub shape in a main shape : index start at 1 +//===================================================================================== +int GEOMBase::GetIndex(const TopoDS_Shape& subshape, const TopoDS_Shape& shape, int /*ShapeType*/) +{ + if(shape.IsNull() || subshape.IsNull()) + return -1; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(shape, anIndices); + if(anIndices.Contains(subshape)) return anIndices.FindIndex(subshape); + + return -1; +} + + +//======================================================================= +// function : GetTopoFromSelection() +// purpose : Define tds from a single selection and retuen true +//======================================================================= +bool GEOMBase::GetTopoFromSelection(const SALOME_ListIO& aList, TopoDS_Shape& tds) +{ + if(aList.Extent() != 1) + return false; + + Handle(SALOME_InteractiveObject) IO = aList.First(); + /* case SObject */ + if(IO->hasEntry()) { + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) obj ( aStudy->FindObjectID(IO->getEntry()) ); + _PTR(GenericAttribute) anAttr; + if( obj ) { + if(obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR ( anAttr ); + tds = GetShapeFromIOR(anIOR->Value().c_str()); + if(tds.IsNull()) + return false; + else + return true; + } + } + } + + return false; +} + +//======================================================================= +// function : GetNameOfSelectedIObjects() +// purpose : Define the name geom++ or other name of mono or multi sel. +//======================================================================= +int GEOMBase::GetNameOfSelectedIObjects( const SALOME_ListIO& aList, + QString& theName, + const bool theShapesOnly ) +{ + if ( !theShapesOnly ) + { + int nbSel = aList.Extent(); + if ( nbSel == 1 ) + { + Handle(SALOME_InteractiveObject) anIObj = aList.First(); + if(anIObj->hasEntry()) { + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return nbSel; + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) obj ( aStudy->FindObjectID(anIObj->getEntry()) ); + + _PTR(GenericAttribute) anAttr; + + if ( obj && obj->FindAttribute( anAttr, "AttributeName") ) + { + _PTR(AttributeName) aNameAttr ( anAttr ); + theName = aNameAttr->Value().c_str(); + } + } + } + else + theName = QObject::tr("%1_objects").arg(nbSel); + + return nbSel; + } + else + { + GEOM::ListOfGO anObjs; + ConvertListOfIOInListOfGO( aList, anObjs, theShapesOnly ); + if ( anObjs.length() == 1 ) { + theName = GetName( anObjs[ 0 ] ); + } + else + theName = QString( "%1_objects" ).arg( anObjs.length() ); + + return anObjs.length(); + } +} + + +//================================================================================= +// function : GetShapeTypeString() +// purpose : for a single shape +//================================================================================= +bool GEOMBase::GetShapeTypeString(const TopoDS_Shape& aShape, Standard_CString& aTypeString) +{ + if(aShape.IsNull()) { + aTypeString = "aNullShape"; + return false; + } + switch(aShape.ShapeType()) + { + case TopAbs_COMPOUND: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_COMPOUND")); + return true; + } + case TopAbs_COMPSOLID: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_COMPOUNDSOLID")) ; + return true ; + } + case TopAbs_SOLID: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SOLID")) ; + return true ; + } + case TopAbs_SHELL: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SHELL")) ; + return true ; + } + case TopAbs_FACE: + { + BRepAdaptor_Surface surf(TopoDS::Face(aShape)); + if(surf.GetType() == GeomAbs_Plane) { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_PLANE")); + return true; + } + else if(surf.GetType() == GeomAbs_Cylinder) { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SURFCYLINDER")); + return true; + } + else if(surf.GetType() == GeomAbs_Sphere) { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SURFSPHERE")); + return true ; + } + else if(surf.GetType() == GeomAbs_Torus) { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SURFTORUS")); + return true ; + } + else if(surf.GetType() == GeomAbs_Cone) { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SURFCONE")); + return true ; + } + else { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_FACE")); + return true; + } + } + case TopAbs_WIRE: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_WIRE")); + return true; + } + case TopAbs_EDGE: + { + BRepAdaptor_Curve curv(TopoDS::Edge(aShape)); + if(curv.GetType() == GeomAbs_Line) { + if((Abs(curv.FirstParameter()) >= 1E6) || (Abs(curv.LastParameter()) >= 1E6)) + aTypeString = CORBA::string_dup(QObject::tr("GEOM_LINE")); + else + aTypeString = CORBA::string_dup(QObject::tr("GEOM_EDGE")); + return true; + } + else if(curv.GetType() == GeomAbs_Circle) { + if(curv.IsClosed()) + aTypeString = CORBA::string_dup(QObject::tr("GEOM_CIRCLE")); + else + aTypeString = CORBA::string_dup(QObject::tr("GEOM_ARC")); + return true; + } + else { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_EDGE")); + return true; + } + } + case TopAbs_VERTEX: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_VERTEX")); + return true; + } + case TopAbs_SHAPE: + { + aTypeString = CORBA::string_dup(QObject::tr("GEOM_SHAPE")); + return true; + } + } + return false; +} + + +//======================================================================= +// function : ConvertIORinGEOMAISShape() +// purpose : +//======================================================================= +Handle(GEOM_AISShape) GEOMBase::ConvertIORinGEOMAISShape(const char * IOR, Standard_Boolean& testResult, bool onlyInActiveView) +{ + Handle(GEOM_AISShape) resultShape; + testResult = false; + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return resultShape; + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) anObj ( aStudy->FindObjectIOR( IOR ) ); + if ( !anObj ) + return resultShape; + + QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + + for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) { + if (it.current()->getViewManager()->getType() == OCCViewer_Viewer::Type()) { + Handle (AIS_InteractiveContext) ic = ((OCCViewer_Viewer*)it.current()->getViewManager()->getViewModel())->getAISContext(); + + AIS_ListOfInteractive List; + ic->DisplayedObjects(List); + AIS_ListOfInteractive List1; + ic->ObjectsInCollector(List1); + List.Append(List1); + + AIS_ListIteratorOfListOfInteractive ite(List); + while(ite.More()) { + if(ite.Value()->IsInstance(STANDARD_TYPE(GEOM_AISShape))) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(ite.Value()); + if(aSh->hasIO()) { + Handle(SALOME_InteractiveObject) GIO = Handle(SALOME_InteractiveObject)::DownCast(aSh->getIO()); + if(GIO->hasEntry() && strcmp(GIO->getEntry(), anObj->GetID().c_str()) == 0) { + if(!onlyInActiveView || + it.current() == SUIT_Session::session()->activeApplication()->desktop()->activeWindow()) { + testResult = true; + resultShape = aSh; + return resultShape; + } + } + } + } + ite.Next(); + } + } + } + return resultShape; +} + + +//======================================================================= +// function : ConvertIORinGEOMActor() +// purpose : +//======================================================================= +GEOM_Actor* GEOMBase::ConvertIORinGEOMActor(const char* IOR, Standard_Boolean& testResult, bool onlyInActiveView) +{ + testResult = false; + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return GEOM_Actor::New(); + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) anObj ( aStudy->FindObjectIOR( IOR ) ); + if ( !anObj ) + return GEOM_Actor::New(); + + QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + + for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) { + if (it.current()->getViewManager()->getType() == SVTK_Viewer::Type()) { + SVTK_ViewWindow* aVTKViewWindow = dynamic_cast( it.current() ); + if( !aVTKViewWindow ) + continue; + vtkRenderer* Renderer = aVTKViewWindow->getRenderer(); + vtkActorCollection* theActors = Renderer->GetActors(); + theActors->InitTraversal(); + vtkActor *ac = theActors->GetNextActor(); + while(!(ac==NULL)) { + if( ac->IsA("GEOM_Actor")) { + GEOM_Actor* anActor = GEOM_Actor::SafeDownCast(ac); + if(anActor->hasIO()) { + Handle(SALOME_InteractiveObject) GIO = Handle(SALOME_InteractiveObject)::DownCast(anActor->getIO()); + if(GIO->hasEntry() && strcmp(GIO->getEntry(), anObj->GetID().c_str()) == 0) { + if(!onlyInActiveView || + it.current() == SUIT_Session::session()->activeApplication()->desktop()->activeWindow()) { + testResult = true; + return anActor; + } + } + } + } + ac = theActors->GetNextActor(); + } + } + } + testResult = false; + return GEOM_Actor::New(); +} + +//======================================================================= +// function : GetAIS() +// purpose : +//======================================================================= +Handle(AIS_InteractiveObject) GEOMBase::GetAIS( const Handle(SALOME_InteractiveObject)& theIO, + const bool isOnlyInActiveView ) +{ + if ( theIO.IsNull() || !theIO->hasEntry() ) + return Handle(AIS_InteractiveObject)(); + + QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + + for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) { + if (it.current()->getViewManager()->getType() != OCCViewer_Viewer::Type()) + continue; + Handle (AIS_InteractiveContext) anIC = ((OCCViewer_Viewer*)it.current()->getViewManager()->getViewModel())->getAISContext(); + + AIS_ListOfInteractive aList; + anIC->DisplayedObjects( aList ); + anIC->ObjectsInCollector( aList ); + + AIS_ListIteratorOfListOfInteractive anIter( aList ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(SALOME_InteractiveObject) anObj = + Handle(SALOME_InteractiveObject)::DownCast( anIter.Value()->GetOwner() ); + + if( !anObj.IsNull() && strcmp( anObj->getEntry(), theIO->getEntry() ) == 0 ) + { + if( isOnlyInActiveView ) + { + if ( it.current() == SUIT_Session::session()->activeApplication()->desktop()->activeWindow() ) + return anIter.Value(); + } + else + return anIter.Value(); + } + } + } + + return Handle(AIS_InteractiveObject)(); +} + + +//======================================================================= +// function : ConvertIOinGEOMAISShape() +// purpose : +//======================================================================= +Handle(GEOM_AISShape) GEOMBase::ConvertIOinGEOMAISShape(const Handle(SALOME_InteractiveObject)& IO, Standard_Boolean& testResult, bool onlyInActiveView) +{ + Handle(GEOM_AISShape) res; + + if ( !IO->hasEntry() ) + { + testResult = false; + return res; + } + + QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + + for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) { + if (it.current()->getViewManager()->getType() == OCCViewer_Viewer::Type()) { + Handle (AIS_InteractiveContext) ic = ((OCCViewer_Viewer*)it.current()->getViewManager()->getViewModel())->getAISContext(); + + AIS_ListOfInteractive List; + ic->DisplayedObjects(List); + AIS_ListOfInteractive List1; + ic->ObjectsInCollector(List1); + List.Append(List1); + + AIS_ListIteratorOfListOfInteractive ite(List); + while(ite.More()) + { + if(ite.Value()->IsInstance(STANDARD_TYPE(GEOM_AISShape))) + { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(ite.Value()); + if( aSh->hasIO() ) + { + if( strcmp( aSh->getIO()->getEntry(), IO->getEntry() ) == 0 ) + { + if(onlyInActiveView) + { + if(it.current() == SUIT_Session::session()->activeApplication()->desktop()->activeWindow()) + { + testResult = true; + return aSh; + } + } + else + { + testResult = true; + return aSh; + } + } + } + } + ite.Next(); + } + } + } + testResult = false; + return res; +} + + +//======================================================================= +// function : ConvertIOinGEOMShape() +// purpose : +//======================================================================= +GEOM::GEOM_Object_ptr GEOMBase::ConvertIOinGEOMShape(const Handle(SALOME_InteractiveObject)& IO, Standard_Boolean& testResult) +{ + GEOM::GEOM_Object_var aShape; + testResult = false; + + /* case SObject */ + if(IO->hasEntry()) { + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return GEOM::GEOM_Object::_nil(); + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) obj ( aStudy->FindObjectID(IO->getEntry()) ); + _PTR(GenericAttribute) anAttr; + if(obj) { + if(obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR ( anAttr ); + aShape = GeometryGUI::GetGeomGen()->GetIORFromString(anIOR->Value().c_str()); + if(!CORBA::is_nil(aShape)) + testResult = true; + return aShape._retn(); + } + } + } + return GEOM::GEOM_Object::_nil(); +} + + +//======================================================================= +// function : ConvertListOfIOInListOfIOR() +// purpose : +//======================================================================= +void GEOMBase::ConvertListOfIOInListOfIOR(const SALOME_ListIO& aList, GEOM::string_array& listIOR) +{ + int nbSel = aList.Extent(); + listIOR.length(nbSel); + int j=0; + SALOME_ListIteratorOfListIO It(aList); + SalomeApp_Study* appStudy = dynamic_cast + ( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return; + _PTR(Study) aStudy = appStudy->studyDS(); + + for (int i=0; It.More(); It.Next(), i++) { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if (IObject->hasEntry()) { + _PTR(SObject) obj ( aStudy->FindObjectID(IObject->getEntry()) ); + _PTR(GenericAttribute) anAttr; + if (obj && obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); + //CORBA::Object_var theObj = dynamic_cast + // (aStudy.get())->ConvertIORToObject(anIOR->Value()); + CORBA::Object_var theObj = GeometryGUI::ClientSObjectToObject(obj); + if (!CORBA::is_nil(theObj) && theObj->_is_a("IDL:GEOM/GEOM_Object:1.0")) { + listIOR[j] = CORBA::string_dup(anIOR->Value().c_str()); + j++; + } + } + } + } + listIOR.length(j); +} + + +//======================================================================= +// function : ConvertIOinGEOMObject() +// purpose : +//======================================================================= +GEOM::GEOM_Object_ptr GEOMBase::ConvertIOinGEOMObject( const Handle(SALOME_InteractiveObject)& theIO, + Standard_Boolean& theResult ) +{ + theResult = Standard_False; + GEOM::GEOM_Object_var aReturnObject; + if ( !theIO.IsNull() ) + { + const char* anEntry = theIO->getEntry(); + + SalomeApp_Study* appStudy = dynamic_cast + ( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return GEOM::GEOM_Object::_nil(); + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) aSObj ( aStudy->FindObjectID( anEntry ) ); + + if (aSObj) + { + aReturnObject = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObj)); + theResult = !CORBA::is_nil( aReturnObject ); + } + } + return aReturnObject._retn(); +} + + +//======================================================================= +// function : ConvertListOfIOInListOfGO() +// purpose : +//======================================================================= +void GEOMBase::ConvertListOfIOInListOfGO( const SALOME_ListIO& theList, + GEOM::ListOfGO& theListGO, + const bool theShapesOnly ) +{ + int nbSel = theList.Extent(); + theListGO.length( nbSel ); + SALOME_ListIteratorOfListIO anIter( theList ); + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return; + _PTR(Study) aStudy = appStudy->studyDS(); + + int j = 0; + for ( int i=0; anIter.More(); anIter.Next(), i++ ) + { + Handle(SALOME_InteractiveObject) anIObj = anIter.Value(); + _PTR(SObject) aSObj ( aStudy->FindObjectID( anIObj->getEntry() ) ); + + if ( aSObj ) + { + GEOM::GEOM_Object_var aGeomObj = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObj)); + if ( !CORBA::is_nil( aGeomObj ) && ( !theShapesOnly || IsShape( aGeomObj ) ) ) + theListGO[ j++ ] = aGeomObj; + } + } + + theListGO.length( j ); +} + +//================================================================================= +// function : CreateArrowForLinearEdge() +// purpose : Create a cone topology to be used to display an arrow in the middle +// : of an edge showing its orientation. (For simulation and Viewer OCC only) +//================================================================================= +bool GEOMBase::CreateArrowForLinearEdge(const TopoDS_Shape& tds, TopoDS_Shape& ArrowCone) +{ + if(SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type() || tds.ShapeType() != TopAbs_EDGE) + return false; + + OCCViewer_ViewPort3d* vp3d = ((OCCViewer_ViewWindow*)SUIT_Session::session()->activeApplication()->desktop()->activeWindow())->getViewPort(); + Handle( V3d_View) view3d = vp3d->getView(); + Standard_Real Width, Height; + view3d->Size(Width, Height); + const Standard_Real aHeight = (Width + Height) / 50.0; + + try { + Standard_Real first, last; + Handle(Geom_Curve) curv = BRep_Tool::Curve(TopoDS::Edge(tds), first, last); + if(!curv->IsCN(1)) + return false; + + const Standard_Real param = (first+last) / 2.0; + gp_Pnt middleParamPoint; + gp_Vec V1; + curv->D1( param, middleParamPoint, V1); + if(V1.Magnitude() < Precision::Confusion()) + return false; + + /* Topology orientation not geom orientation */ + if(tds.Orientation() == TopAbs_REVERSED) + V1 *= -1.0; + + gp_Ax2 anAxis( middleParamPoint, gp_Dir(V1)); + const Standard_Real radius1 = aHeight / 5.0; + if(radius1 > 10.0 * Precision::Confusion() && aHeight > 10.0 * Precision::Confusion()) { + ArrowCone = BRepPrimAPI_MakeCone( anAxis, radius1, 0.0, aHeight ).Shape(); + return true; + } + } + catch(Standard_Failure) { + // OCC failures are hard to catch in GUI. + // This because of the position for #include that is very critic to find + // in SALOME environment : compilation error ! + } + return false; +} + + +//================================================================================= +// function : VertexToPoint() +// purpose : If S can be converted in a gp_Pnt returns true and the result is P +//================================================================================= +bool GEOMBase::VertexToPoint(const TopoDS_Shape& S, gp_Pnt& P) +{ + if(S.IsNull() || S.ShapeType() != TopAbs_VERTEX) + return false; + P = BRep_Tool::Pnt(TopoDS::Vertex(S)); + return true; +} + + +//================================================================================= +// function : GetBipointDxDyDz() +// purpose : +//================================================================================= +void GEOMBase::GetBipointDxDyDz(gp_Pnt P1, gp_Pnt P2, double& dx, double& dy, double& dz) +{ + dx = P2.X() - P1.X(); + dy = P2.Y() - P1.Y(); + dz = P2.Z() - P1.Z(); + return; +} + + +//================================================================================= +// function : LinearEdgeExtremities() +// purpose : If S can be converted in a linear edge and if initial an final points +// : distance is sufficient, returns true else returns false. +// : Resulting points are respectively P1 and P2 +//================================================================================= +bool GEOMBase::LinearEdgeExtremities(const TopoDS_Shape& S, gp_Pnt& P1, gp_Pnt& P2) +{ + if(S.IsNull() || S.ShapeType() != TopAbs_EDGE) + return false; + BRepAdaptor_Curve curv(TopoDS::Edge(S)); + if(curv.GetType() != GeomAbs_Line) + return false; + + curv.D0(curv.FirstParameter(), P1); + curv.D0(curv.LastParameter(), P2); + + if(P1.Distance(P2) <= Precision::Confusion()) + return false; + + return true; +} + + +//======================================================================= +// function : Parameter() +// purpose : return a parameter (float) from a dialog box +// +// avalue1 : is a float or integer used as a default value displayed +// aTitle1 : is the title for aValue1 +// aTitle : is the main title +// bottom : maximum value to be entered +// top : minimum value to be entered +// decimals : number of decimals +//======================================================================= +double GEOMBase::Parameter(Standard_Boolean& res, const char* aValue1, const char* aTitle1, const char* aTitle, const double bottom, const double top, const int decimals) +{ + GEOMBase_aParameterDlg * Dialog = new GEOMBase_aParameterDlg(aValue1, aTitle1, SUIT_Session::session()->activeApplication()->desktop(), + aTitle, TRUE, 0, bottom, top, decimals); + int r = Dialog->exec(); + float X = 0.0; + if(r == QDialog::Accepted) { + res = Standard_True; + X = Dialog->getValue(); + } + else + res = Standard_False; + delete Dialog; + return X; +} + + +//======================================================================= +// function : SelectionByNameInDialogs() +// purpose : Called when user has entered a name of object in a LineEdit. +// : The selection is changed. Dialog box will receive the +// : corresponding signal to manage this event. +//======================================================================= +bool GEOMBase::SelectionByNameInDialogs(QWidget* aWidget, const QString& objectUserName, const SALOME_ListIO& aList) +{ + /* Find SObject with name in component GEOM */ + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) ST = appStudy->studyDS(); + + std::vector<_PTR(SObject)> listSO; + listSO = ST->FindObjectByName(objectUserName.latin1(), "GEOM"); + + if(listSO.size() < 1) { + const QString caption = QObject::tr("GEOM_WRN_WARNING"); + const QString text = QObject::tr("GEOM_NAME_INCORRECT"); + const QString button0 = QObject::tr("GEOM_BUT_OK"); + SUIT_MessageBox::error1(aWidget, caption, text, button0); + return false; + } + /* More than one object with same name */ + if(listSO.size() > 1) { + const QString caption = QObject::tr("GEOM_WRN_WARNING"); + const QString text = QObject::tr("GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE"); + const QString button0 = QObject::tr("GEOM_BUT_OK") ; + SUIT_MessageBox::error1(aWidget, caption, text, button0) ; + listSO.clear(); + return false; + } + + _PTR(SObject) theObj ( listSO[0] ); + /* Create a SALOME_InteractiveObject with a SALOME::SObject */ + char* aCopyobjectUserName = CORBA::string_dup(objectUserName); + Handle(SALOME_InteractiveObject) SI = new SALOME_InteractiveObject(theObj->GetID().c_str(), "GEOM", aCopyobjectUserName); + delete(aCopyobjectUserName); + + /* Add as a selected object */ + /* Clear any previous selection : */ + /* Warning the LineEdit is purged because of signal currentSelectionChanged ! */ + // Sel->ClearIObjects(); //mzn + // Sel->AddIObject(SI); //mzn + return true; +} + + +//======================================================================= +// function : DefineDlgPosition() +// purpose : Define x and y the default position for a dialog box +//======================================================================= +bool GEOMBase::DefineDlgPosition(QWidget* aDlg, int& x, int& y) +{ + /* Here the position is on the bottom right corner - 10 */ + SUIT_Desktop* PP = SUIT_Session::session()->activeApplication()->desktop(); + x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10); + y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10); + return true; +} + + +//======================================================================= +// function : GetDefaultName() +// purpose : Generates default names +//======================================================================= +QString GEOMBase::GetDefaultName(const QString& theOperation) +{ + QString aName = ""; + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return aName; + _PTR(Study) aStudy = appStudy->studyDS(); + + int aNumber = 0; + _PTR(SObject) obj; + do + { + aName = theOperation+"_"+QString::number(++aNumber); + obj = aStudy->FindObject(aName.latin1()); + } + while (obj); + + return aName; +} + + +//======================================================================= +// function : ShowErrorMessage() +// purpose : Shows message box with error code and comment +//======================================================================= +void GEOMBase::ShowErrorMessage(const char* theErrorCode, const char* theComment) +{ + QString anErrorCode(theErrorCode); + QString aComment(theComment); + + QString aText = ""; + if (!anErrorCode.isEmpty()) + aText.append("\n" + QObject::tr(anErrorCode)); + if (!aComment.isEmpty()) + aText.append("\n" + QString(theComment)); + + SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), + QObject::tr("GEOM_PRP_ABORT") + aText, "OK" ); +} + + +//======================================================================= +// function : GetObjectFromIOR() +// purpose : returns a GEOM_Object by given IOR (string) +//======================================================================= +GEOM::GEOM_Object_ptr GEOMBase::GetObjectFromIOR( const char* theIOR ) +{ + GEOM::GEOM_Object_var anObject; + if ( theIOR == NULL || strlen( theIOR ) == 0 ) + return anObject._retn(); // returning nil object + + anObject = GEOM::GEOM_Object::_narrow( SalomeApp_Application::orb()->string_to_object( theIOR ) ); + return anObject._retn(); +} + +//======================================================================= +// function : GetIORFromObject() +// purpose : returns IOR of a given GEOM_Object +//======================================================================= +char* GEOMBase::GetIORFromObject( const GEOM::GEOM_Object_ptr& theObject ) +{ + if ( CORBA::is_nil( theObject ) ) + return NULL; + + return SalomeApp_Application::orb()->object_to_string( theObject ); +} + +//======================================================================= +// function : GetShape() +// purpose : returns a TopoDS_Shape stored in GEOM_Object +//======================================================================= +bool GEOMBase::GetShape( const GEOM::GEOM_Object_ptr& theObject, TopoDS_Shape& theShape, const TopAbs_ShapeEnum theType ) +{ + if ( !CORBA::is_nil( theObject ) ) + { + TopoDS_Shape aTopoDSShape = GEOM_Client().GetShape( GeometryGUI::GetGeomGen(), theObject ); + if ( !aTopoDSShape.IsNull() && ( theType == TopAbs_SHAPE || theType == aTopoDSShape.ShapeType() ) ) + { + theShape = aTopoDSShape; + return true; + } + } + return false; +} + +//======================================================================= +// function : GetName() +// purpose : Get name of object +//======================================================================= +QString GEOMBase::GetName( GEOM::GEOM_Object_ptr theObj ) +{ + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + + if ( appStudy ) + { + string anIOR = SalomeApp_Application::orb()->object_to_string( theObj ); + if ( anIOR != "" ) + { + _PTR(SObject) aSObj ( appStudy->studyDS()->FindObjectIOR( anIOR ) ); + + _PTR(GenericAttribute) anAttr; + + if ( aSObj && aSObj->FindAttribute( anAttr, "AttributeName") ) + { + _PTR(AttributeName) aNameAttr ( anAttr ); + return QString( aNameAttr->Value().c_str() ); + } + } + } + + return QString(""); +} + +bool GEOMBase::IsShape( GEOM::GEOM_Object_ptr theObj ) +{ + return !theObj->_is_nil() && theObj->IsShape(); +} diff --git a/src/GEOMBase/GEOMBase_Helper.cxx b/src/GEOMBase/GEOMBase_Helper.cxx new file mode 100755 index 000000000..f48979a4e --- /dev/null +++ b/src/GEOMBase/GEOMBase_Helper.cxx @@ -0,0 +1,974 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2004 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.org +// +// +// +// File : GEOMBase_Helper.cxx +// Author : Sergey ANIKIN +// Module : GEOM +// $Header$ + +#include + +#include "GEOMBase_Helper.h" +#include "GEOMBase.h" +#include "GEOM_Operation.h" +#include "GeometryGUI.h" +#include "GEOM_Displayer.h" +#include "GEOMImpl_Types.hxx" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +using namespace std; + +#include + + +//================================================================ +// Function : getActiveView +// Purpose : Get active view window, returns 0 if no open study frame +//================================================================ +static SUIT_ViewWindow* getActiveView() +{ + SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); + if ( activeStudy ) + return SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + + return 0; +} + + +//================================================================ +// Function : getGeomEngine +// Purpose : Static method +//================================================================ +GEOM::GEOM_Gen_ptr GEOMBase_Helper::getGeomEngine() +{ + return GeometryGUI::GetGeomGen(); +} + +//================================================================ +// Function : GEOMBase_Helper +// Purpose : +//================================================================ +GEOMBase_Helper::GEOMBase_Helper( SUIT_Desktop* desktop ) + : myDesktop( desktop ), myViewWindow( 0 ), myDisplayer( 0 ), myCommand( 0 ), isPreview( false ) +{ +} + +//================================================================ +// Function : ~GEOMBase_Helper +// Purpose : +//================================================================ +GEOMBase_Helper::~GEOMBase_Helper() +{ + if ( !SUIT_Session::session()->activeApplication()->desktop() ) + return; + + if ( myPreview.size() ) + erasePreview(); + if ( hasCommand() ) + abortCommand(); + + globalSelection( GEOM_ALLOBJECTS, true ); + + delete myDisplayer; +} + +//================================================================ +// Function : display +// Purpose : +//================================================================ +void GEOMBase_Helper::display( const ObjectList& objList, const bool updateView ) +{ + ObjectList::const_iterator it; + for ( it = objList.begin(); it != objList.end(); it++ ) { + display( *it, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : display +// Purpose : Display object. +// Important : Object must be already in study +//================================================================ +void GEOMBase_Helper::display( GEOM::GEOM_Object_ptr object, const bool updateView ) +{ + // Unset color of shape ( this color may be set during preview displaying ) + // Default color will be used + getDisplayer()->UnsetColor(); + getDisplayer()->UnsetWidth(); + + // Enable activisation of selection + getDisplayer()->SetToActivate( true ); + + // Display object + getDisplayer()->Display( object, updateView ); +} + +//================================================================ +// Function : erase +// Purpose : +//================================================================ +void GEOMBase_Helper::erase( const ObjectList& objList, const bool updateView ) +{ + ObjectList::const_iterator it = objList.begin(); + for ( ; it != objList.end(); it++ ) { + erase( *it, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : erase +// Purpose : +//================================================================ +void GEOMBase_Helper::erase( GEOM::GEOM_Object_ptr object, const bool updateView ) +{ + if ( !object->_is_nil() ) { + string entry = getEntry( object ); + getDisplayer()->Erase( new SALOME_InteractiveObject( + entry.c_str(), "GEOM", strdup( GEOMBase::GetName( object ) ) ), true, updateView ); + } +} + +//================================================================ +// Function : redisplay +// Purpose : +//================================================================ +void GEOMBase_Helper::redisplay( const ObjectList& objList, + const bool withChildren, + const bool updateView ) +{ + ObjectList::const_iterator it = objList.begin(); + for ( ; it != objList.end(); it++ ) { + redisplay( *it, withChildren, false ); + } + if ( !objList.empty() && updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : redisplay +// Purpose : +//================================================================ +void GEOMBase_Helper::redisplay( GEOM::GEOM_Object_ptr object, + const bool withChildren, + const bool updateView ) +{ + if ( !object->_is_nil() ) { + // Unset color of shape ( this color may be set during preview displaying ) + // Default color will be used + getDisplayer()->UnsetColor(); + getDisplayer()->UnsetWidth(); + + // Enable activisation of selection + getDisplayer()->SetToActivate( true ); + + string entry = getEntry( object ); + getDisplayer()->Redisplay(new SALOME_InteractiveObject + (entry.c_str(), "GEOM", strdup(GEOMBase::GetName(object))), false); + } + + if ( withChildren ) { + SalomeApp_Study* aDoc = getStudy(); + if ( aDoc && aDoc->studyDS() ) { + _PTR(Study) aStudy = aDoc->studyDS(); + _PTR(SObject) aSObj (aStudy->FindObjectIOR(SalomeApp_Application::orb()->object_to_string(object))); + if ( aSObj ) { + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow + (GeometryGUI::ClientSObjectToObject(anIt->Value())); + if ( !CORBA::is_nil( aChild ) ) { + if ( !aChild->_is_nil() ) { + string entry = getEntry( aChild ); + getDisplayer()->Redisplay( new SALOME_InteractiveObject( + entry.c_str(), "GEOM", strdup( GEOMBase::GetName( aChild ) ) ), false ); + } + } + } + } + } + } + + if ( updateView ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview based on execute() results +//================================================================ +void GEOMBase_Helper::displayPreview( const bool activate, + const bool update, + const bool toRemoveFromEngine, + const double lineWidth ) +{ + isPreview = true; + QString msg; + if ( !isValid( msg ) ) + { + erasePreview( update ); + isPreview = false; + return; + } + + erasePreview( false ); + + try { + SUIT_OverrideCursor wc; + ObjectList objects; + if ( !execute( objects ) || !getOperation()->IsDone() ) { + wc.suspend(); + } + else { + for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) + { + displayPreview( *it, true, activate, false, lineWidth ); + if ( toRemoveFromEngine ) + getGeomEngine()->RemoveObject( *it ); + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + } + + isPreview = false; + + if ( update ) + updateViewer(); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying preview of resulting shape +//================================================================ +void GEOMBase_Helper::displayPreview( GEOM::GEOM_Object_ptr object, + const bool append, + const bool activate, + const bool update, + const double lineWidth ) +{ + // Set color for preview shape + getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + + // set width of displayed shape + getDisplayer()->SetWidth( lineWidth ); + + // Disable activation of selection + getDisplayer()->SetToActivate( activate ); + + // Make a reference to GEOM_Object + getDisplayer()->SetName( SalomeApp_Application::orb()->object_to_string( object ) ); + + // Build prs + SALOME_Prs* aPrs = getDisplayer()->BuildPrs( object ); + if ( aPrs == 0 || aPrs->IsNull() ) + return; + + // Display prs + displayPreview( aPrs, append, update ); + + getDisplayer()->UnsetName(); + + // Enable activation of displayed objects + getDisplayer()->SetToActivate( true ); +} + +//================================================================ +// Function : displayPreview +// Purpose : Method for displaying arbitrary preview objects (not limited to shapes) +//================================================================ +void GEOMBase_Helper::displayPreview( const SALOME_Prs* prs, + const bool append, + const bool update ) +{ + if ( !append ) + erasePreview( false ); + + // remember current view frame to make correct erase preview later + myViewWindow = getActiveView(); + + if ( myViewWindow == 0 ) + return; + + // Display prs + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Display( prs ); + } + + // Add prs to the preview list + myPreview.push_back( (SALOME_Prs*)prs ); + + // Update viewer + if ( update ) + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : erasePreview +// Purpose : +//================================================================ +void GEOMBase_Helper::erasePreview( const bool update ) +{ + // check view frame where the preview was displayed + bool vfOK = checkViewWindow() && myViewWindow; + // Iterate through presentations and delete them + for ( PrsList::iterator anIter = myPreview.begin(); anIter != myPreview.end(); ++anIter ) { + if ( vfOK ) + { + SUIT_ViewManager* aViewManager = myViewWindow->getViewManager(); + if ( aViewManager->getType() == OCCViewer_Viewer::Type() || + aViewManager->getType() == SVTK_Viewer::Type() ) + { + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView) + aView->Erase( *anIter, true ); + } + } + delete *anIter; + } + myPreview.clear(); + + // Update viewer + if ( update ) + updateViewer(); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of objects of a given type +// IMPORTANT : Works after localSelection( ... ) method call only +//================================================================ +void GEOMBase_Helper::activate( const int theType ) +{ + if (!getStudy()) return; + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SComponent) aGeom ( aStudy->FindComponent( "GEOM" ) ); + if ( !aGeom ) + return; + + SALOME_ListIO aList; + _PTR(ChildIterator) anIter ( aStudy->NewChildIterator( aGeom ) ); + for ( ; anIter->More(); anIter->Next() ) + { + _PTR(SObject) aSO ( anIter->Value() ); + if ( aSO ) + { + _PTR(SObject) aRefSO; + if ( !aSO->ReferencedObject( aRefSO ) ) + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow + (GeometryGUI::ClientSObjectToObject(aSO)); + if ( !anObj->_is_nil() && anObj->GetType() == theType ) + aList.Append( new SALOME_InteractiveObject( aSO->GetID().c_str(), "GEOM", aSO->GetName().c_str()) ); + } + } + } + + getDisplayer()->LocalSelection( aList, 0 ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of subshapes in accordance with mode +// theMode is from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( const ObjectList& theObjs, const int theMode ) +{ + SALOME_ListIO aListOfIO; + + ObjectList::const_iterator anIter = theObjs.begin(); + for ( ; anIter != theObjs.end(); ++anIter ) + { + GEOM::GEOM_Object_ptr anObj = *anIter; + if ( anObj->_is_nil() ) + continue; + string aEntry = getEntry( anObj ); + if ( aEntry != "" ) + aListOfIO.Append( new SALOME_InteractiveObject( + aEntry.c_str(), "GEOM", strdup( GEOMBase::GetName( anObj ) ) ) ); + } + + getDisplayer()->LocalSelection( aListOfIO, theMode ); +} + +//================================================================ +// Function : localSelection +// Purpose : Activate selection of subshapes in accordance with mode +// theMode is from TopAbs_ShapeEnum +//================================================================ +void GEOMBase_Helper::localSelection( GEOM::GEOM_Object_ptr obj, const int mode ) +{ + // If object is null local selection for all objects is activated + if ( obj->_is_nil() ) { + getDisplayer()->LocalSelection( Handle(SALOME_InteractiveObject)(), mode ); + return; + } + + ObjectList objList; + objList.push_back( obj ); + localSelection( objList, mode ); +} + + +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of subshapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void GEOMBase_Helper::globalSelection( const int theMode, const bool update ) +{ + getDisplayer()->GlobalSelection( theMode, update ); +} + +//================================================================ +// Function : globalSelection +// Purpose : Activate selection of subshapes. Set selection filters +// in accordance with mode. theMode is from GEOMImpl_Types +//================================================================ +void GEOMBase_Helper::globalSelection( const TColStd_MapOfInteger& theModes, + const bool update ) +{ + getDisplayer()->GlobalSelection( theModes, update ); +} + +//================================================================ +// Function : addInStudy +// Purpose : Add object in study +//================================================================ +void GEOMBase_Helper::addInStudy( GEOM::GEOM_Object_ptr theObj, const char* theName ) +{ + if ( !hasCommand() ) + return; + + _PTR(Study) aStudy = getStudy()->studyDS(); + if ( !aStudy || theObj->_is_nil() ) + return; + + GEOM::GEOM_Object_ptr aFatherObj = getFather( theObj ); + + getGeomEngine()->AddInStudy(GeometryGUI::ClientStudyToStudy(aStudy), + theObj, theName, aFatherObj); +} + +//================================================================ +// Function : updateObjBrowser +// Purpose : Update object browser +//================================================================ +void GEOMBase_Helper::updateObjBrowser() const +{ + SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); + if (app) { + CAM_Module* module = app->module( "Geometry" ); + SalomeApp_Module* appMod = dynamic_cast( module ); + if ( appMod ) { + appMod->updateObjBrowser( true ); + } + } +} + +//================================================================ +// Function : updateViewer +// Purpose : Update active 3D view +//================================================================ +void GEOMBase_Helper::updateViewer() +{ + getDisplayer()->UpdateViewer(); +} + +//================================================================ +// Function : getStudyId +// Purpose : Get study Id +//================================================================ +int GEOMBase_Helper::getStudyId() const +{ + int anId = -1; + if ( getStudy() ) + anId = getStudy()->id(); + return anId; +} + +//================================================================ +// Function : getStudy +// Purpose : Returns the active study. It is recommended to use +// this method instead of direct desktop->getActiveStudy() calls +//================================================================ +SalomeApp_Study* GEOMBase_Helper::getStudy() const +{ + SUIT_Desktop* aDesktop = getDesktop(); + if (!aDesktop) + return 0; + + QPtrList anAppList = SUIT_Session::session()->applications(); + + SUIT_Application* anApp = 0; + for ( QPtrListIterator it( anAppList ); it.current() ; ++it ) + { + anApp = it.current(); + if ( anApp->desktop() == aDesktop ) + break; + } + + return dynamic_cast(anApp->activeStudy()); +} + +//================================================================ +// Function : getEntry +// Purpose : +//================================================================ +char* GEOMBase_Helper::getEntry( GEOM::GEOM_Object_ptr object ) const +{ + SalomeApp_Study* study = getStudy(); + if ( study ) { + string IOR = GEOMBase::GetIORFromObject( object); + if ( IOR != "" ) { + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); + if ( SO ) { + return TCollection_AsciiString((char*)SO->GetID().c_str()).ToCString(); + } + } + } + return ""; +} + +//================================================================ +// Function : getDisplayer +// Purpose : +//================================================================ +GEOM_Displayer* GEOMBase_Helper::getDisplayer() +{ + if ( !myDisplayer ) + myDisplayer = new GEOM_Displayer( getStudy() ); + return myDisplayer; +} + +//================================================================ +// Function : clearShapeBuffer +// Purpose : +//================================================================ +void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj ) +{ + if ( CORBA::is_nil( theObj ) ) + return; + + string IOR = SalomeApp_Application::orb()->object_to_string( theObj ); + TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) ); + GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); + + if ( !getStudy() || !getStudy()->studyDS() ) + return; + + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SObject) aSObj ( aStudy->FindObjectIOR( IOR ) ); + if ( !aSObj ) + return; + + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + _PTR(GenericAttribute) anAttr; + if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { + _PTR(AttributeIOR) anIOR ( anAttr ); + TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); + GEOM_Client().RemoveShapeFromBuffer( asciiIOR ); + } + } +} + +//================================================================ +// Function : openCommand +// Purpose : +//================================================================ +bool GEOMBase_Helper::openCommand() +{ + bool res = false; + if ( !getStudy() || hasCommand() ) + return res; + + GEOM::GEOM_IOperations_var anOp = GEOM::GEOM_IOperations::_narrow( getOperation() ); + if ( !anOp->_is_nil() ) { + myCommand = new GEOM_Operation( SUIT_Session::session()->activeApplication(), anOp.in() ); + myCommand->start(); + res = true; + } + + return res; +} + +//================================================================ +// Function : abortCommand +// Purpose : +//================================================================ +bool GEOMBase_Helper::abortCommand() +{ + if ( !hasCommand() ) + return false; + + myCommand->abort(); + myCommand = 0; + + return true; +} + +//================================================================ +// Function : commitCommand +// Purpose : +//================================================================ +bool GEOMBase_Helper::commitCommand( const char* ) +{ + if ( !hasCommand() ) + return false; + + myCommand->commit(); + myCommand = 0; + + return true; +} + +//================================================================ +// Function : hasCommand +// Purpose : +//================================================================ +bool GEOMBase_Helper::hasCommand() const +{ + return (bool)myCommand; +} + +//================================================================ +// Function : getOperation +// Purpose : +//================================================================ +GEOM::GEOM_IOperations_ptr GEOMBase_Helper::getOperation() +{ + if ( myOperation->_is_nil() ) + myOperation = createOperation(); + + return myOperation; +} + + + +//================================================================ +// Function : checkViewWindow +// Purpose : +//================================================================ +bool GEOMBase_Helper::checkViewWindow() +{ + if ( myViewWindow ){ + QPtrList aViewWindowsList = SUIT_Session::session()->activeApplication()->desktop()->windows(); + for ( QPtrListIterator it( aViewWindowsList ); it.current(); ++it ) + { + if ( myViewWindow == it.current() ) + return true; + } + } + myViewWindow = 0; + return false; +} + +//================================================================ +// Function : onAccept +// Purpose : This method should be called from dialog's slots onOk() and onApply() +// It perfroms user input validation, then it +// performs a proper operation and manages transactions, etc. +//================================================================ +bool GEOMBase_Helper::onAccept( const bool publish, const bool useTransaction ) +{ + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + + bool aLocked = (_PTR(AttributeStudyProperties) (aStudy->GetProperties()))->IsLocked(); + 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") ); + return false; + } + + QString msg; + if ( !isValid( msg ) ) { + showError( msg ); + return false; + } + + erasePreview( false ); + + try { + if ( ( !publish && !useTransaction ) || openCommand() ) { + SUIT_OverrideCursor wc; + SUIT_Session::session()->activeApplication()->putInfo( "" ); + ObjectList objects; + if ( !execute( objects ) || !getOperation()->IsDone() ) { + wc.suspend(); + abortCommand(); + 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 + clearShapeBuffer( *it ); + withChildren = true; + redisplay( *it, withChildren, false ); + } + } + + if ( nbObjs ) { + commitCommand(); + updateObjBrowser(); + SUIT_Session::session()->activeApplication()->putInfo( QObject::tr("GEOM_PRP_DONE") ); + } + else + abortCommand(); + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + abortCommand(); + } + + updateViewer(); + + return true; +} + + +//================================================================ +// Function : showError +// Purpose : Shows a message box with infromation about an error taken from getOperation()->GetErrorCode() +//================================================================ +void GEOMBase_Helper::showError() +{ + QString msg; + if ( !getOperation()->_is_nil() ) + msg = QObject::tr( getOperation()->GetErrorCode() ); + + if ( msg.isEmpty() ) + msg = QObject::tr( "GEOM_PRP_ABORT" ); + + SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(), + QObject::tr( "GEOM_ERROR_STATUS" ), + msg, + QObject::tr( "BUT_OK" ) ); +} + +//================================================================ +// Function : showError +// Purpose : Shows a error message followed by +//================================================================ +void GEOMBase_Helper::showError( const QString& msg ) +{ + QString str( QObject::tr( "GEOM_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::error1(SUIT_Session::session()->activeApplication()->desktop(), QObject::tr( "GEOM_ERROR" ), str, QObject::tr( "BUT_OK" ) ); +} + +////////////////////////////////////////////////////////////////// +// Virtual methods to be redefined in dialogs +////////////////////////////////////////////////////////////////// + +//================================================================ +// Function : createOperation +// Purpose : Redefine this method to return proper IOperation reference +//================================================================ +GEOM::GEOM_IOperations_ptr GEOMBase_Helper::createOperation() +{ + GEOM::GEOM_IOperations_var aNilOp; + return aNilOp._retn(); +} + +//================================================================ +// Function : isValid +// Purpose : Called by onAccept(). Redefine this method to check validity of user input in dialog boxes. +//================================================================ +bool GEOMBase_Helper::isValid( QString& ) +{ + return true; +} + +//================================================================ +// Function : execute +// Purpose : This method is called by onAccept(). +// It should perform the required operation and put all new or modified objects into +// argument.Should return if some error occurs during its execution. +//================================================================ +bool GEOMBase_Helper::execute( ObjectList& objects ) +{ + return false; +} + +//================================================================ +// Function : getFather +// Purpose : This method is called by addInStudy(). It should return a father object +// for or a nil reference if should be published +// as a top-level object. +//================================================================ +GEOM::GEOM_Object_ptr GEOMBase_Helper::getFather( GEOM::GEOM_Object_ptr theObj ) +{ + return GEOM::GEOM_Object::_nil(); +} + +//================================================================ +// Function : getNewObjectName +// Purpose : Redefine this method to return proper name for a new object +//================================================================ +const char* GEOMBase_Helper::getNewObjectName() const +{ + return ""; +} + +//================================================================ +// Function : getPrefix +// Purpose : Get prefix for name of created object +//================================================================ +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(); + + 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" ); + default : return ""; + } +} + +//================================================================ +// Function : selectedIO +// Purpose : Return the list of selected SALOME_InteractiveObject's +//================================================================ +const SALOME_ListIO& GEOMBase_Helper::selectedIO() +{ + mySelected.Clear(); + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( aSelMgr ) + aSelMgr->selectedObjects( mySelected ); + } + + return mySelected; +} + +//================================================================ +// Function : IObjectCount +// Purpose : Return the number of selected objects +//================================================================ +int GEOMBase_Helper::IObjectCount() +{ + return selectedIO().Extent(); +} + +//================================================================ +// Function : firstIObject +// Purpose : Return the first selected object in the selected object list +//================================================================ +Handle(SALOME_InteractiveObject) GEOMBase_Helper::firstIObject() +{ + const SALOME_ListIO& aList = selectedIO(); + return aList.Extent() > 0 ? aList.First() : Handle(SALOME_InteractiveObject)(); +} + +//================================================================ +// Function : lastIObject +// Purpose : Return the last selected object in the selected object list +//================================================================ +Handle(SALOME_InteractiveObject) GEOMBase_Helper::lastIObject() +{ + const SALOME_ListIO& aList = selectedIO(); + return aList.Extent() > 0 ? aList.Last() : Handle(SALOME_InteractiveObject)(); +} + +//================================================================ +// Function : getDesktop +// Purpose : Returns myDesktop field. Initialized in constructor, usually as dynamic_cast(parentWidget()) +//================================================================ +SUIT_Desktop* GEOMBase_Helper::getDesktop() const +{ + return myDesktop; +} + diff --git a/src/GEOMBase/GEOMBase_Skeleton.cxx b/src/GEOMBase/GEOMBase_Skeleton.cxx new file mode 100644 index 000000000..84760134d --- /dev/null +++ b/src/GEOMBase/GEOMBase_Skeleton.cxx @@ -0,0 +1,219 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMBase_Skeleton.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "GEOMBase_Skeleton.h" +#include "GeometryGUI.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +using namespace std; + +//================================================================================= +// class : GEOMBase_Skeleton() +// purpose : Constructs a GEOMBase_Skeleton which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +GEOMBase_Skeleton::GEOMBase_Skeleton(QWidget* parent, const char* name, bool modal, WFlags fl) + :DlgRef_Skeleton_QTD( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ), + GEOMBase_Helper( dynamic_cast( parent ) ) +{ + if (!name) + setName("GEOMBase_Skeleton"); + + buttonCancel->setText(tr("GEOM_BUT_CLOSE")); + buttonOk->setText(tr("GEOM_BUT_OK")); + buttonApply->setText(tr("GEOM_BUT_APPLY")); + + GroupMedium->close(TRUE); + resize(0, 0); + + Init(); +} + + +//================================================================================= +// function : ~GEOMBase_Skeleton() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GEOMBase_Skeleton::~GEOMBase_Skeleton() +{ + if (myGeomGUI) + myGeomGUI->SetActiveDialogBox( 0 ); +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GEOMBase_Skeleton::Init() +{ + myGeomGUI = 0; + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) + { + SalomeApp_Module* module = dynamic_cast(app->loadModule("Geometry")); + if (module) + myGeomGUI = dynamic_cast(module); + } + + /* init variables */ + myGeomBase = new GEOMBase(); // SAN -- TO BE REMOVED !!! + myGeomGUI->SetActiveDialogBox(this); + + /* signals and slots connections */ + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); + if (myGeomGUI) + { + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); + } + + /* Move widget on the botton right corner of main widget */ +// int x, y; +// myGeomBase->DefineDlgPosition( this, x, y ); + + /* displays Dialog */ + RadioButton1->setChecked(TRUE); + RadioButton4->hide(); + + return; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void GEOMBase_Skeleton::ClickOnCancel() +{ + close(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GEOMBase_Skeleton::LineEditReturnPressed() +{ + if ( !myEditCurrentArgument ) + return; + + /* User name of object input management */ + /* If successfull the selection is changed and signal emitted... */ + /* so SelectionIntoArgument() is automatically called. */ + const QString objectUserName = myEditCurrentArgument->text(); + QWidget* thisWidget = (QWidget*)this; + + if(GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, selectedIO())) + myEditCurrentArgument->setText(objectUserName); + + return; +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void GEOMBase_Skeleton::DeactivateActiveDialog() +{ + this->setEnabled(false); + globalSelection(); + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + if (myGeomGUI) myGeomGUI->SetActiveDialogBox(0); + + return; +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GEOMBase_Skeleton::ActivateThisDialog() +{ + /* Emit a signal to deactivate the active dialog */ + if (myGeomGUI) myGeomGUI->EmitSignalDeactivateDialog(); + this->setEnabled(true); + if (myGeomGUI) myGeomGUI->SetActiveDialogBox((QDialog*)this); + return; +} + + +//================================================================================= +// function : closeEvent() +// purpose : same than click on cancel button +//================================================================================= +void GEOMBase_Skeleton::closeEvent(QCloseEvent* e) +{ + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if(app) { + disconnect( app->selectionMgr(), 0, this, 0); + app->updateActions(); + } + QDialog::closeEvent( e ); +} + +//================================================================================= +// function : initName() +// purpose : initialize the Name field with a string "thePrefix_X" (Vertex_3) +//================================================================================= +void GEOMBase_Skeleton::initName( const char* thePrefix ) +{ + if ( thePrefix ) + setPrefix( thePrefix ); + ResultName->setText( GEOMBase::GetDefaultName( getPrefix() ) ); +} + +//================================================================================= +// function : getNewObjectName() +// purpose : returns contents of Name field +//================================================================================= +const char* GEOMBase_Skeleton::getNewObjectName() const +{ + return ResultName->text(); +} + +//================================================================================= +// function : getConstructorId() +// purpose : +//================================================================================= +int GEOMBase_Skeleton::getConstructorId() const +{ + if ( GroupConstructors != NULL && GroupConstructors->selected() != NULL ) + return GroupConstructors->id( GroupConstructors->selected() ); + return -1; +} diff --git a/src/GEOMBase/Makefile.in b/src/GEOMBase/Makefile.in new file mode 100644 index 000000000..260845ed6 --- /dev/null +++ b/src/GEOMBase/Makefile.in @@ -0,0 +1,71 @@ +# GEOM GEOMBASE : +# +# 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Damien COQUERET (OCC) +# Module : GEOM +# $Header: + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# Libraries targets +LIB = libGEOMBase.la + +# header files +EXPORT_HEADERS= GEOMBase.h \ + GEOMBase_Skeleton.h \ + GEOMBase_Helper.h \ + GEOM_Operation.h + +LIB_SRC = GEOMBase.cxx \ + GEOMBase_Skeleton.cxx \ + GEOMBase_aParameterDlg.cxx \ + GEOMBase_Helper.cxx \ + GEOM_Operation.cxx + +LIB_MOC = \ + GEOMBase_Skeleton.h \ + GEOMBase_aParameterDlg.h + +LIB_CLIENT_IDL = SALOME_Exception.idl \ + SALOMEDS.idl \ + SALOMEDS_Attributes.idl \ + SALOME_GenericObj.idl \ + GEOM_Gen.idl + +LIB_SERVER_IDL = + +# additionnal information to compil and link file + +CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(BOOST_CPPFLAGS) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome +CXXFLAGS += $(BOOST_CPPFLAGS) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome + +LDFLAGS += -L$(KERNEL_ROOT_DIR)/lib/salome -L$(GUI_ROOT_DIR)/lib/salome -lDlgRef -lGEOM -lsuit -lOCCViewer -lVTKViewer $(CAS_LDPATH) -lTKPrim + +@CONCLUDE@ diff --git a/src/GEOMClient/Makefile.in b/src/GEOMClient/Makefile.in new file mode 100644 index 000000000..eb7281a67 --- /dev/null +++ b/src/GEOMClient/Makefile.in @@ -0,0 +1,62 @@ +# GEOM GEOMClient : tool to transfer BREP files from GEOM server to GEOM client +# +# 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Patrick GOLDBRONN (CEA) +# Module : GEOM +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS = \ + GEOM_Client.hxx + +# Libraries targets + +LIB = libGEOMClient.la +LIB_SRC = GEOM_Client.cxx +LIB_SERVER_IDL = \ + SALOME_Component.idl SALOMEDS.idl SALOME_Exception.idl SALOME_GenericObj.idl \ + GEOM_Gen.idl + +# Executables targets +BIN = +BIN_SRC = +BIN_CLIENT_IDL = +BIN_SERVER_IDL = + +# additionnal information to compil and link file +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += $(CAS_TKTopAlgo) -L${KERNEL_ROOT_DIR}/lib/salome + + +@CONCLUDE@ + diff --git a/src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx b/src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx new file mode 100644 index 000000000..2dc864ac5 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_EdgeFilter.cxx @@ -0,0 +1,66 @@ +// 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/ +// +#include "GEOM_EdgeFilter.h" + +#include +#include +#include +#include + +//======================================================================= +// function : GEOM_EdgeFilter +// purpose : +//======================================================================= +GEOM_EdgeFilter::GEOM_EdgeFilter( SalomeApp_Study* study, const int kind ) +: GEOM_SelectionFilter( study ), +myKind( kind ) +{ + add( TopAbs_EDGE ); +} + +//======================================================================= +// function : ~GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_EdgeFilter::~GEOM_EdgeFilter() +{ +} + +//======================================================================= +// function : isShapeOk +// purpose : +//======================================================================= +bool GEOM_EdgeFilter::isShapeOk( const TopoDS_Shape& theShape ) const +{ + if ( !theShape.IsNull() && theShape.ShapeType() == TopAbs_EDGE ) + { + BRepAdaptor_Curve aCurve( TopoDS::Edge( theShape ) ); + GeomAbs_CurveType aType = aCurve.GetType(); + + switch ( myKind ) + { + case StdSelect_AnyEdge: return Standard_True; + case StdSelect_Line: return ( aType == GeomAbs_Line ); + case StdSelect_Circle: return ( aType == GeomAbs_Circle ); + } + } + return false; +} + diff --git a/src/GEOMFiltersSelection/GEOM_EdgeFilter.h b/src/GEOMFiltersSelection/GEOM_EdgeFilter.h new file mode 100644 index 000000000..e59406349 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_EdgeFilter.h @@ -0,0 +1,39 @@ +// 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/ +// +#ifndef GEOM_EDGEFILTER_H +#define GEOM_EDGEFILTER_H + +#include "GEOM_SelectionFilter.h" + +class Standard_EXPORT GEOM_EdgeFilter : public GEOM_SelectionFilter +{ +public: + GEOM_EdgeFilter( SalomeApp_Study* study, const int kind ); + ~GEOM_EdgeFilter(); + +protected: + bool isShapeOk( const TopoDS_Shape& ) const; + +private: + int myKind; + +}; + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_FaceFilter.cxx b/src/GEOMFiltersSelection/GEOM_FaceFilter.cxx new file mode 100644 index 000000000..5d4ddb468 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_FaceFilter.cxx @@ -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/ +// +#include "GEOM_FaceFilter.h" + +#include +#include +#include +#include + +//======================================================================= +// function : GEOM_FaceFilter +// purpose : +//======================================================================= +GEOM_FaceFilter::GEOM_FaceFilter( SalomeApp_Study* study, const int kind ) +: GEOM_SelectionFilter( study ), +myKind( kind ) +{ + add( TopAbs_FACE ); +} + +//======================================================================= +// function : ~GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_FaceFilter::~GEOM_FaceFilter() +{ +} + +//======================================================================= +// function : isShapeOk +// purpose : +//======================================================================= +bool GEOM_FaceFilter::isShapeOk( const TopoDS_Shape& theShape ) const +{ + if ( !theShape.IsNull() && theShape.ShapeType() == TopAbs_FACE ) + { + BRepAdaptor_Surface aSurf( TopoDS::Face( theShape ) ); + GeomAbs_SurfaceType aType = aSurf.GetType(); + + switch ( myKind ) + { + case StdSelect_AnyFace: return Standard_True; + case StdSelect_Plane: return ( aType == GeomAbs_Plane ); + case StdSelect_Cylinder: return ( aType == GeomAbs_Cylinder); + case StdSelect_Sphere: return ( aType == GeomAbs_Sphere); + case StdSelect_Torus: return ( aType == GeomAbs_Torus); + case StdSelect_Revol: return ( aType == GeomAbs_Cylinder || + aType == GeomAbs_Cone || + aType == GeomAbs_Torus || + aType == GeomAbs_Sphere || + aType == GeomAbs_SurfaceOfRevolution ); + case StdSelect_Cone: return ( aType == GeomAbs_Cone); + } + } + return false; +} + diff --git a/src/GEOMFiltersSelection/GEOM_FaceFilter.h b/src/GEOMFiltersSelection/GEOM_FaceFilter.h new file mode 100644 index 000000000..affe68a3a --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_FaceFilter.h @@ -0,0 +1,39 @@ +// 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/ +// +#ifndef GEOM_FACEFILTER_H +#define GEOM_FACEFILTER_H + +#include "GEOM_SelectionFilter.h" + +class Standard_EXPORT GEOM_FaceFilter : public GEOM_SelectionFilter +{ +public: + GEOM_FaceFilter( SalomeApp_Study* study, const int kind ); + ~GEOM_FaceFilter(); + +protected: + bool isShapeOk( const TopoDS_Shape& ) const; + +private: + int myKind; + +}; + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_LogicalFilter.cxx b/src/GEOMFiltersSelection/GEOM_LogicalFilter.cxx new file mode 100644 index 000000000..d9045576b --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_LogicalFilter.cxx @@ -0,0 +1,95 @@ +// 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/ +// +#include "GEOM_LogicalFilter.h" + +//======================================================================= +// function : GEOM_LogicalFilter +// purpose : +//======================================================================= +GEOM_LogicalFilter::GEOM_LogicalFilter( const QPtrList& lst, const int op ) +: SUIT_SelectionFilter() +{ + setFilters( lst ); + setOperation( op ); +} + +//======================================================================= +// function : ~GEOM_LogicalFilter +// purpose : +//======================================================================= +GEOM_LogicalFilter::~GEOM_LogicalFilter() +{ +} + +//======================================================================= +// function : isOk +// purpose : +//======================================================================= +bool GEOM_LogicalFilter::isOk( const SUIT_DataOwner* owner ) const +{ + GEOM_LogicalFilter* non_const_this = (GEOM_LogicalFilter*)this; + for ( SUIT_SelectionFilter* filter = non_const_this->myFilters.first(); filter; filter = non_const_this->myFilters.next() ) + { + if ( myOperation == LO_OR && filter->isOk( owner ) ) + return true; + if ( myOperation == LO_AND && !filter->isOk( owner ) ) + return false; + if ( myOperation == LO_NOT ) + return !filter->isOk( owner ); + } + + return ( myOperation != LO_OR ); +} + +//======================================================================= +// function : setFilters +// purpose : +//======================================================================= +void GEOM_LogicalFilter::setFilters( const QPtrList& lst ) +{ + myFilters = lst; +} + +//======================================================================= +// function : setOperation +// purpose : +//======================================================================= +void GEOM_LogicalFilter::setOperation( const int op ) +{ + myOperation = op; +} + +//======================================================================= +// function : getFilters +// purpose : +//======================================================================= +QPtrList GEOM_LogicalFilter::getFilters() const +{ + return myFilters; +} + +//======================================================================= +// function : getOperation +// purpose : +//======================================================================= +int GEOM_LogicalFilter::getOperation() const +{ + return myOperation; +} diff --git a/src/GEOMFiltersSelection/GEOM_LogicalFilter.h b/src/GEOMFiltersSelection/GEOM_LogicalFilter.h new file mode 100644 index 000000000..3b23884f7 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_LogicalFilter.h @@ -0,0 +1,50 @@ +// 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/ +// +#ifndef GEOM_LOGICALFILTER_H +#define GEOM_LOGICALFILTER_H + +#include +#include + +#include + +class Standard_EXPORT GEOM_LogicalFilter : public SUIT_SelectionFilter +{ +public: + enum { LO_OR, LO_AND, LO_NOT, LO_UNDEFINED }; + +public: + GEOM_LogicalFilter( const QPtrList& lst, const int op ); + ~GEOM_LogicalFilter(); + + virtual bool isOk( const SUIT_DataOwner* ) const; + + void setFilters( const QPtrList& lst ); + void setOperation( const int ); + QPtrList getFilters() const; + int getOperation() const; + +private: + QPtrList myFilters; + int myOperation; + +}; + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_OCCFilter.cxx b/src/GEOMFiltersSelection/GEOM_OCCFilter.cxx new file mode 100644 index 000000000..5599a1524 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_OCCFilter.cxx @@ -0,0 +1,65 @@ +// 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/ +// +#include "GEOM_OCCFilter.h" + +#include +#include + +#include + +#include +#include + +IMPLEMENT_STANDARD_HANDLE(GEOM_OCCFilter, SelectMgr_Filter) +IMPLEMENT_STANDARD_RTTIEXT(GEOM_OCCFilter, SelectMgr_Filter) + +//======================================================================= +// function : GEOM_OCCFilter +// purpose : +//======================================================================= +GEOM_OCCFilter::GEOM_OCCFilter( LightApp_SelectionMgr* theSelMgr ) + : SelectMgr_Filter() +{ + mySelMgr = theSelMgr; +} + +//======================================================================= +// function : ~GEOM_OCCFilter +// purpose : +//======================================================================= +GEOM_OCCFilter::~GEOM_OCCFilter() +{ +} + +//======================================================================= +// function : IsOk +// purpose : +//======================================================================= +Standard_Boolean GEOM_OCCFilter::IsOk( const Handle(SelectMgr_EntityOwner)& anObj ) const +{ + Handle(AIS_InteractiveObject) anAIS = Handle(AIS_InteractiveObject)::DownCast( anObj->Selectable() ); + if ( anAIS.IsNull() || !anAIS->HasOwner() ) + return false; + + Handle(SALOME_InteractiveObject) anIO = Handle(SALOME_InteractiveObject)::DownCast(anAIS->GetOwner()); + if ( anIO.IsNull() ) return false; + + return mySelMgr->isOk( new LightApp_DataOwner( QString( anIO->getEntry() ) ) ); +} diff --git a/src/GEOMFiltersSelection/GEOM_OCCFilter.h b/src/GEOMFiltersSelection/GEOM_OCCFilter.h new file mode 100644 index 000000000..c9080f297 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_OCCFilter.h @@ -0,0 +1,48 @@ +// 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/ +// +#ifndef GEOM_OCCFILTER_H +#define GEOM_OCCFILTER_H + +#include + +#include + +class LightApp_SelectionMgr; + +class GEOM_OCCFilter : public SelectMgr_Filter +{ +public: + Standard_EXPORT GEOM_OCCFilter( LightApp_SelectionMgr* theSelMgr); + Standard_EXPORT ~GEOM_OCCFilter(); + + Standard_EXPORT virtual Standard_Boolean IsOk( const Handle(SelectMgr_EntityOwner)& anObj ) const; + +private: + LightApp_SelectionMgr* mySelMgr; + +public: + + DEFINE_STANDARD_RTTI(GEOM_OCCFilter); + +}; + +DEFINE_STANDARD_HANDLE(GEOM_OCCFilter, SelectMgr_Filter) + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_PreviewFilter.cxx b/src/GEOMFiltersSelection/GEOM_PreviewFilter.cxx new file mode 100644 index 000000000..a6d1b734b --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_PreviewFilter.cxx @@ -0,0 +1,50 @@ +// 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/ +// +#include "GEOM_PreviewFilter.h" + +#include + +//======================================================================= +// function : GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_PreviewFilter::GEOM_PreviewFilter( SalomeApp_Study* study ) +: SalomeApp_Filter( study ) +{ +} + +//======================================================================= +// function : ~GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_PreviewFilter::~GEOM_PreviewFilter() +{ +} + +//======================================================================= +// function : isOk +// purpose : +//======================================================================= +bool GEOM_PreviewFilter::isOk( const SUIT_DataOwner* sOwner ) const +{ + const LightApp_DataOwner* owner = dynamic_cast ( sOwner ); + return ( owner && strstr( owner->entry(), "TEMP" ) ); +} + diff --git a/src/GEOMFiltersSelection/GEOM_PreviewFilter.h b/src/GEOMFiltersSelection/GEOM_PreviewFilter.h new file mode 100644 index 000000000..d8e037bcc --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_PreviewFilter.h @@ -0,0 +1,35 @@ +// 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/ +// +#ifndef GEOM_PREVIEW_FILTER_H +#define GEOM_PREVIEW_FILTER_H + +#include +#include + +class Standard_EXPORT GEOM_PreviewFilter : public SalomeApp_Filter +{ +public: + GEOM_PreviewFilter( SalomeApp_Study* study ); + ~GEOM_PreviewFilter(); + + virtual bool isOk( const SUIT_DataOwner* ) const; +}; + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx b/src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx new file mode 100644 index 000000000..5066277c1 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx @@ -0,0 +1,195 @@ +// 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/ +// +#include "GEOM_SelectionFilter.h" + +#include "GEOM_Client.hxx" + +#include +#include +#include + +#include + +#include + +#include + + +//======================================================================= +// function : GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_SelectionFilter::GEOM_SelectionFilter( SalomeApp_Study* study, const bool theAll ) + : SalomeApp_Filter(study) +{ + myAll = theAll; +} + +//======================================================================= +// function : ~GEOM_SelectionFilter +// purpose : +//======================================================================= +GEOM_SelectionFilter::~GEOM_SelectionFilter() +{ +} + +//======================================================================= +// function : isOk +// purpose : +//======================================================================= +bool GEOM_SelectionFilter::isOk( const SUIT_DataOwner* sOwner ) const +{ + GEOM::GEOM_Object_var obj = getObject( sOwner ); + if ( !CORBA::is_nil( obj ) && obj->IsShape() ) + { + if ( isAll() ) + return true; + + TopoDS_Shape shape; + if ( getShape( obj, shape ) ) + return contains( shape.ShapeType() ) && isShapeOk( shape ); + } + return false; +} + +//======================================================================= +// function : getObject +// purpose : +//======================================================================= +GEOM::GEOM_Object_ptr GEOM_SelectionFilter::getObject( const SUIT_DataOwner* sOwner, const bool extractReference ) const +{ + GEOM::GEOM_Object_var anObj; + + const LightApp_DataOwner* owner = dynamic_cast(sOwner); + SalomeApp_Study* appStudy = getStudy(); + if (owner && appStudy) + { + _PTR(Study) study = appStudy->studyDS(); + QString entry = owner->entry(); + + _PTR(SObject) aSO (study->FindObjectID(entry.latin1())), aRefSO; + if( extractReference && aSO && aSO->ReferencedObject( aRefSO ) ) + aSO = aRefSO; + + if (aSO) { + std::string aValue = aSO->GetIOR(); + if (strcmp(aValue.c_str(), "") != 0) { + CORBA::ORB_ptr anORB = SalomeApp_Application::orb(); + CORBA::Object_var aCorbaObj = anORB->string_to_object(aValue.c_str()); + anObj = GEOM::GEOM_Object::_narrow(aCorbaObj); + } + } + } + + if (!CORBA::is_nil(anObj)) + return anObj._retn(); + + return GEOM::GEOM_Object::_nil(); +} + +//======================================================================= +// function : getShape +// purpose : +//======================================================================= +bool GEOM_SelectionFilter::getShape (const GEOM::GEOM_Object_ptr& theObject, + TopoDS_Shape& theShape) const +{ + if ( !CORBA::is_nil( theObject ) ) + { + SalomeApp_Application* app = dynamic_cast + ( SUIT_Session::session()->activeApplication() ); + if ( app ) + { + SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA( app->namingService() ); + static GEOM::GEOM_Gen_var geomGen; + if(CORBA::is_nil( geomGen )) { + Engines::Component_var comp = ls->FindOrLoad_Component( "FactoryServer", "GEOM" ); + geomGen = GEOM::GEOM_Gen::_narrow( comp ); + } + if ( !CORBA::is_nil( geomGen ) ) + { + TopoDS_Shape aTopoDSShape = GEOM_Client().GetShape( geomGen, theObject ); + + if ( !aTopoDSShape.IsNull() ) + { + theShape = aTopoDSShape; + return true; + } + } + } + } + return false; +} + +//======================================================================= +// function : contains +// purpose : +//======================================================================= +bool GEOM_SelectionFilter::contains( const int type ) const +{ + return myTypes.contains( type ); +} + +//======================================================================= +// function : add +// purpose : +//======================================================================= +void GEOM_SelectionFilter::add( const int type ) +{ + if ( !contains( type ) ) + myTypes.append( type ); +} + +//======================================================================= +// function : remove +// purpose : +//======================================================================= +void GEOM_SelectionFilter::remove( const int type ) +{ + if ( contains( type ) ) + myTypes.remove( type ); +} + +//======================================================================= +// function : setAll +// purpose : +//======================================================================= +void GEOM_SelectionFilter::setAll( const bool all ) +{ + myAll = all; +} + +//======================================================================= +// function : isAll +// purpose : +//======================================================================= +bool GEOM_SelectionFilter::isAll() const +{ + return myAll; +} + +//======================================================================= +// function : isShapeOk +// purpose : +//======================================================================= +bool GEOM_SelectionFilter::isShapeOk( const TopoDS_Shape& ) const +{ + return true; +} diff --git a/src/GEOMFiltersSelection/GEOM_SelectionFilter.h b/src/GEOMFiltersSelection/GEOM_SelectionFilter.h new file mode 100644 index 000000000..2682a4ec5 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_SelectionFilter.h @@ -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/ +// +#ifndef GEOM_SELECTIONFILTER_H +#define GEOM_SELECTIONFILTER_H + +#include + +#include + +#include + +// IDL Headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +class Standard_EXPORT GEOM_SelectionFilter : public SalomeApp_Filter +{ +public: + GEOM_SelectionFilter( SalomeApp_Study* study, const bool theAll = false ); + ~GEOM_SelectionFilter(); + + virtual bool isOk( const SUIT_DataOwner* ) const; + +protected: + GEOM::GEOM_Object_ptr getObject( const SUIT_DataOwner*, const bool = true ) const; + bool getShape( const GEOM::GEOM_Object_ptr&, TopoDS_Shape& ) const; + + bool contains( const int ) const; + void add( const int ); + void remove( const int ); + + void setAll( const bool ); + bool isAll() const; + + bool isShapeOk( const TopoDS_Shape& ) const; + +private: + QValueList myTypes; + bool myAll; + +}; + +#endif diff --git a/src/GEOMFiltersSelection/GEOM_ShapeTypeFilter.cxx b/src/GEOMFiltersSelection/GEOM_ShapeTypeFilter.cxx new file mode 100644 index 000000000..f074982a9 --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_ShapeTypeFilter.cxx @@ -0,0 +1,168 @@ +// GEOM GEOMFiltersSelection : filter selector for the viewer +// +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOM_ShapeTypeFilter.cxx +// Author : Nicolas REJNERI +// Module : GEOM +// $Header$ + +#include + +#include "GEOM_ShapeTypeFilter.ixx" +#include "SALOME_InteractiveObject.hxx" +#include "GEOM_Client.hxx" +#include "QAD_Application.h" +#include "QAD_Desktop.h" +#include "utilities.h" + +#include + +//======================================================================= +// function : getShape() +// purpose : returns a TopoDS_Shape stored in GEOM_Object +//======================================================================= +static bool getShape( const GEOM::GEOM_Object_ptr& theObject, TopoDS_Shape& theShape ) +{ + if ( !CORBA::is_nil( theObject ) ) + { + static GEOM::GEOM_Gen_var myGeom; + if(CORBA::is_nil(myGeom) { + Engines::Component_var comp = QAD_Application::getDesktop()->getEngine( "FactoryServer", "GEOM" ); + myGeom = GEOM::GEOM_Gen::_narrow( comp ); + } + TopoDS_Shape aTopoDSShape = GEOM_Client().GetShape( myGeom, theObject ); + + if ( !aTopoDSShape.IsNull() ) + { + theShape = aTopoDSShape; + return true; + } + } + return false; +} + +//======================================================================= +// function : ConvertIOinGEOMObject() +// purpose : +//======================================================================= +static GEOM::GEOM_Object_ptr convertIOinGEOMObject( + const Handle(SALOME_InteractiveObject)& theIO, Standard_Boolean& theResult ) +{ + theResult = Standard_False; + GEOM::GEOM_Object_var aReturnObject; + if ( !theIO.IsNull() ) + { + const char* anEntry = theIO->getEntry(); + SALOMEDS::SObject_var aSObj = + QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument()->FindObjectID( anEntry ); + if ( !CORBA::is_nil( aSObj ) ) + { + aReturnObject = GEOM::GEOM_Object::_narrow( aSObj->GetObject() ); + theResult = !CORBA::is_nil( aReturnObject ); + } + } + return aReturnObject._retn(); +} + +//======================================================================= +// function : ShapeTypeFilter +// purpose : +//======================================================================= +GEOM_ShapeTypeFilter::GEOM_ShapeTypeFilter( const TopAbs_ShapeEnum theShapeType, + const bool theIsAll ) +{ + myIsAll = theIsAll; + myShapeTypes.Add( theShapeType ); + myTypeFilter = new SALOME_TypeFilter( "GEOM" ); +} + +//======================================================================= +// function : ShapeTypeFilter +// purpose : +//======================================================================= +GEOM_ShapeTypeFilter::GEOM_ShapeTypeFilter( const TColStd_MapOfInteger& theShapeTypes, + const bool theIsAll ) +{ + myIsAll = theIsAll; + myShapeTypes = theShapeTypes; + myTypeFilter = new SALOME_TypeFilter( "GEOM" ); +} + +//======================================================================= +// function : IsOk +// purpose : +//======================================================================= +Standard_Boolean GEOM_ShapeTypeFilter::IsOk( + const Handle(SALOME_InteractiveObject)& anObj ) const +{ + if ( !myTypeFilter->IsOk(anObj) ) + return Standard_False; + + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_ptr aGeomObj = convertIOinGEOMObject( anObj, aResult ); + if ( !CORBA::is_nil( aGeomObj ) && aResult && aGeomObj->IsShape() ) + { + if ( myIsAll ) + return true; + TopoDS_Shape aShape; + if ( getShape( aGeomObj, aShape ) ) + { + if ( myShapeTypes.Contains( aShape.ShapeType() ) ) + return IsShapeOk( aShape ); + } + } + return Standard_False; +} + +//======================================================================= +// function : IsShapeOk +// purpose : +//======================================================================= +Standard_Boolean GEOM_ShapeTypeFilter::IsShapeOk( const TopoDS_Shape& ) const +{ + return Standard_True; +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/GEOMFiltersSelection/GEOM_TypeFilter.cxx b/src/GEOMFiltersSelection/GEOM_TypeFilter.cxx new file mode 100644 index 000000000..2379d012a --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_TypeFilter.cxx @@ -0,0 +1,66 @@ +// 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/ +// +#include "GEOM_TypeFilter.h" + +//======================================================================= +// function : GEOM_TypeFilter +// purpose : +//======================================================================= +GEOM_TypeFilter::GEOM_TypeFilter( SalomeApp_Study* study, const int type, const bool isShapeType ) +:GEOM_SelectionFilter( study ), + myType( type ), + myIsShapeType(isShapeType) +{ +} + +//======================================================================= +// function : ~GEOM_TypeFilter +// purpose : +//======================================================================= +GEOM_TypeFilter::~GEOM_TypeFilter() +{ +} + +//======================================================================= +// function : isOk +// purpose : +//======================================================================= +bool GEOM_TypeFilter::isOk( const SUIT_DataOwner* sOwner ) const +{ + GEOM::GEOM_Object_var obj = getObject( sOwner ); + if ( !CORBA::is_nil( obj ) ) + { + if (!myIsShapeType) + return obj->GetType() == type(); + else + return obj->GetShapeType() == type(); + } + + return false; +} + +//======================================================================= +// function : type +// purpose : +//======================================================================= +int GEOM_TypeFilter::type() const +{ + return myType; +} diff --git a/src/GEOMFiltersSelection/GEOM_TypeFilter.h b/src/GEOMFiltersSelection/GEOM_TypeFilter.h new file mode 100644 index 000000000..4b938547f --- /dev/null +++ b/src/GEOMFiltersSelection/GEOM_TypeFilter.h @@ -0,0 +1,44 @@ +// 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/ +// +#ifndef GEOM_TYPEFILTER_H +#define GEOM_TYPEFILTER_H + +#include "GEOM_SelectionFilter.h" + +// IDL Headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +class Standard_EXPORT GEOM_TypeFilter : public GEOM_SelectionFilter +{ +public: + GEOM_TypeFilter(SalomeApp_Study* study, const int type, const bool isShapeType = false ); + ~GEOM_TypeFilter(); + + virtual bool isOk( const SUIT_DataOwner* ) const; + + int type() const; + +private: + int myType; + bool myIsShapeType; +}; + +#endif diff --git a/src/GEOMGUI/GEOMGUI_OCCSelector.cxx b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx new file mode 100644 index 000000000..c0868ae60 --- /dev/null +++ b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx @@ -0,0 +1,286 @@ +// 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/ +// +#include "GEOMGUI_OCCSelector.h" + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//================================================================ +// Function : GEOMGUI_OCCSelector +// Purpose : +//================================================================ +GEOMGUI_OCCSelector::GEOMGUI_OCCSelector( OCCViewer_Viewer* viewer, SUIT_SelectionMgr* mgr ) +: LightApp_OCCSelector( viewer, mgr ) +{ +} + +//================================================================ +// Function : ~GEOMGUI_OCCSelector +// Purpose : +//================================================================ +GEOMGUI_OCCSelector::~GEOMGUI_OCCSelector() +{ +} + +//================================================================ +// Function : getSelection +// Purpose : +//================================================================ +void GEOMGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const +{ + OCCViewer_Viewer* vw = viewer(); + if ( !vw ) + return; + + Handle(AIS_InteractiveContext) ic = vw->getAISContext(); + + if ( ic->HasOpenedContext() ) + { + for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() ) + { + Handle(SelectMgr_EntityOwner) anOwner = ic->SelectedOwner(); + if ( anOwner.IsNull() ) + continue; + + Handle(AIS_InteractiveObject) io = Handle(AIS_InteractiveObject)::DownCast( anOwner->Selectable() ); + + QString entryStr = entry( io ); + int index = -1; + + if ( anOwner->ComesFromDecomposition() ) // == Local Selection + { + TopoDS_Shape subShape = anOwner->Shape(); + Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast( io ); + if ( !aisShape.IsNull() ) + { + TopoDS_Shape bigShape = aisShape->Shape(); + + TopTools_IndexedMapOfShape subShapes; + TopExp::MapShapes( bigShape, subShapes ); + index = subShapes.FindIndex( subShape ); + } + } + + if ( !entryStr.isEmpty() ) + { + LightApp_DataOwner* owner; + if ( index > -1 ) // Local Selection + owner = new LightApp_DataSubOwner( entryStr, index ); + else // Global Selection + owner = new LightApp_DataOwner( entryStr ); + + aList.append( SUIT_DataOwnerPtr( owner ) ); + } + } + } + else + { + for ( ic->InitCurrent(); ic->MoreCurrent(); ic->NextCurrent() ) + { + Handle(AIS_InteractiveObject) io = ic->Current(); + + QString entryStr = entry( io ); + + if ( !entryStr.isEmpty() ) + { + LightApp_DataOwner* owner = new LightApp_DataOwner( entryStr ); + aList.append( SUIT_DataOwnerPtr( owner ) ); + } + } + } +} + +//================================================================ +// Function : getEntityOwners +// Purpose : +//================================================================ +static void getEntityOwners( const Handle(AIS_InteractiveObject)& theObj, + const Handle(AIS_InteractiveContext)& theIC, + SelectMgr_IndexedMapOfOwner& theMap ) +{ + if ( theObj.IsNull() || theIC.IsNull() ) + return; + + TColStd_ListOfInteger modes; + theIC->ActivatedModes( theObj, modes ); + + TColStd_ListIteratorOfListOfInteger itr( modes ); + for (; itr.More(); itr.Next() ) { + int m = itr.Value(); + if ( !theObj->HasSelection( m ) ) + continue; + + Handle(SelectMgr_Selection) sel = theObj->Selection( m ); + + for ( sel->Init(); sel->More(); sel->Next() ) { + Handle(SelectBasics_SensitiveEntity) entity = sel->Sensitive(); + if ( entity.IsNull() ) + continue; + + Handle(SelectMgr_EntityOwner) owner = + Handle(SelectMgr_EntityOwner)::DownCast(entity->OwnerId()); + if ( !owner.IsNull() ) + theMap.Add( owner ); + } + } +} + +//================================================================ +// Function : setSelection +// Purpose : +//================================================================ +void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) +{ + OCCViewer_Viewer* vw = viewer(); + if ( !vw ) + return; + + Handle(AIS_InteractiveContext) ic = vw->getAISContext(); + +#ifndef WNT + NCollection_DataMap indexesMap; // "entry - list_of_int" map for LOCAL selection +#else + NCollection_DataMap indexesMap; // "entry - list_of_int" map for LOCAL selection +#endif + QMap globalSelMap; // only Key=entry from this map is used. value(int) is NOT used at all. + SelectMgr_IndexedMapOfOwner ownersmap; // map of owners to be selected + + AIS_ListOfInteractive aDispList; + ic->DisplayedObjects( aDispList ); + + // build a map of data owner indexes to be selected. + // "entry - to - list_of_ids" map + for ( SUIT_DataOwnerPtrList::const_iterator itr = aList.begin(); itr != aList.end(); ++itr ) + { + const LightApp_DataSubOwner* subOwner = dynamic_cast( (*itr).operator->() ); + if ( subOwner ) + { + QString entry = subOwner->entry(); +#ifndef WNT + if ( indexesMap.IsBound( TCollection_AsciiString((char*)entry.latin1()))) +#else + if ( indexesMap.IsBound( (char*)entry.latin1())) +#endif + { + TColStd_IndexedMapOfInteger& subIndexes = indexesMap.ChangeFind((char*)entry.latin1()); + subIndexes.Add( subOwner->index() ); + //indexesMap.replace( entry, subIndexes ); + } + else + { + TColStd_IndexedMapOfInteger subIndexes; + subIndexes.Add( subOwner->index() ); + indexesMap.Bind((char*)entry.latin1(), subIndexes); + } + } + else // the owner is NOT a sub owner, maybe it is a DataOwner == GLOBAL selection + { + const LightApp_DataOwner* owner = dynamic_cast( (*itr).operator->() ); + if ( owner ) + { + globalSelMap[owner->entry()] = 1; + } + } + } + + // get all owners. Fill "entry - list_of_owners" map. + for ( AIS_ListIteratorOfListOfInteractive it( aDispList ); it.More(); it.Next() ) + { + Handle(AIS_InteractiveObject) io = it.Value(); + QString entryStr = entry( io ); + if ( !entryStr.isEmpty() ) + { + //EntryToListOfOwnerMap entryOwnersMap; // "entry - list_of_owners" map. temporary use. + SelectMgr_IndexedMapOfOwner owners; + getEntityOwners( io, ic, owners ); // get all owners + + for ( int i = 1, n = owners.Extent(); i <= n; i++ ) + { + Handle(SelectMgr_EntityOwner) anOwner = owners( i ); + if ( anOwner.IsNull() || !anOwner->HasShape() ) + continue; + + // GLOBAL selection + if ( !anOwner->ComesFromDecomposition() && globalSelMap.contains( entryStr ) ) + { + ownersmap.Add( anOwner ); + } + // LOCAL selection + else + { + Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast( io ); + + if ( !aisShape.IsNull() && indexesMap.IsBound( (char*)entryStr.latin1() ) ) + { + TopoDS_Shape shape = aisShape->Shape(); + TopTools_IndexedMapOfShape aMapOfShapes; + TopExp::MapShapes( shape, aMapOfShapes ); + const TColStd_IndexedMapOfInteger& subIndexes = indexesMap.ChangeFind((char*)entryStr.latin1()); + + const TopoDS_Shape& aSubShape = anOwner->Shape(); + int aSubShapeId = aMapOfShapes.FindIndex( aSubShape ); + + // check if the "sub_shape_index" is found in the "map of indexes for this entry", + // which was passes in the parameter + if ( subIndexes.Contains( aSubShapeId ) ) + { + ownersmap.Add( anOwner ); + } + } + } // end of local selection + } // end of for(owners) + }// end of if(entry) + }// end of for(AIS_all_ios) + + vw->unHighlightAll( false ); + + // DO the selection + for ( int i = 1, n = ownersmap.Extent(); i <= n; i++ ) + { + Handle(SelectMgr_EntityOwner) owner = ownersmap( i ); + if ( owner->State() ) + continue; + + if ( ic->HasOpenedContext() ) + ic->AddOrRemoveSelected( owner, false ); + else + ic->AddOrRemoveSelected( Handle(AIS_InteractiveObject)::DownCast(owner->Selectable()), false ); + } + + vw->update(); +} diff --git a/src/GEOMGUI/GEOMGUI_OCCSelector.h b/src/GEOMGUI/GEOMGUI_OCCSelector.h new file mode 100644 index 000000000..e891c60ad --- /dev/null +++ b/src/GEOMGUI/GEOMGUI_OCCSelector.h @@ -0,0 +1,37 @@ +// 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/ +// +#ifndef GEOMGUI_OCCSELECTOR_H +#define GEOMGUI_OCCSELECTOR_H + +#include + +class GEOMGUI_OCCSelector : public LightApp_OCCSelector +{ +public: + GEOMGUI_OCCSelector( OCCViewer_Viewer*, SUIT_SelectionMgr* ); + virtual ~GEOMGUI_OCCSelector(); + +protected: + virtual void getSelection( SUIT_DataOwnerPtrList& ) const; + virtual void setSelection( const SUIT_DataOwnerPtrList& ); + +}; + +#endif diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx new file mode 100644 index 000000000..87cc9d630 --- /dev/null +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -0,0 +1,203 @@ +// 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/ +// +#include "GEOMGUI_Selection.h" + +#include "GeometryGUI.h" +#include "GEOM_Displayer.h" + +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include "GEOMImpl_Types.hxx" + +// OCCT Includes +#include +#include +#include + +// VTK Includes +#include + +GEOMGUI_Selection::GEOMGUI_Selection() +{ +} + +GEOMGUI_Selection::~GEOMGUI_Selection() +{ +} + +QtxValue GEOMGUI_Selection::globalParam( const QString& p ) const +{ + if ( p == "isOCC" ) return QtxValue( activeViewType() == OCCViewer_Viewer::Type() ); + + return LightApp_Selection::globalParam( p ); +} + +QtxValue GEOMGUI_Selection::param( const int ind, const QString& p ) const +{ +// if ( p == "isVisible" ) return QtxValue( isVisible( ind ) ); +// parameter isVisible is calculated in base SalomeApp_Selection +// else + if( p == "type" ) + return QtxValue( typeName( ind ) ); + else if ( p == "displaymode" ) + return QtxValue( displayMode( ind ) ); + else + return LightApp_Selection::param( ind, p ); +} + +QString GEOMGUI_Selection::typeName( const int index ) const +{ + if ( isComponent( index ) ) + return "Component"; + GEOM::GEOM_Object_var anObj = getObject( index ); + if ( !CORBA::is_nil( anObj ) ) { + const int aGeomType = anObj->GetType(); + if ( aGeomType == GEOM_GROUP ) + return "Group"; + else + return "Shape"; + } + return "Unknown"; +} + +bool GEOMGUI_Selection::isVisible( const int index ) const +{ + GEOM::GEOM_Object_var obj = getObject( index ); + SALOME_View* view = GEOM_Displayer::GetActiveView(); + if ( !CORBA::is_nil( obj ) && view ) { + Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( entry( index ).latin1(), "GEOM", "TEMP_IO" ); + return view->isVisible( io ); + } + return false; +} + +QString GEOMGUI_Selection::displayMode( const int index ) const +{ + SALOME_View* view = GEOM_Displayer::GetActiveView(); + QString viewType = activeViewType(); + if ( view /*fix for 9320==>*/&& ( viewType == OCCViewer_Viewer::Type() || viewType == SVTK_Viewer::Type() ) ) { + SALOME_Prs* prs = view->CreatePrs( entry( index ) ); + if ( prs ) { + if ( viewType == OCCViewer_Viewer::Type() ) { // assuming OCC + SOCC_Prs* occPrs = (SOCC_Prs*) prs; + AIS_ListOfInteractive lst; + occPrs->GetObjects( lst ); + if ( lst.Extent() ) { + Handle(AIS_InteractiveObject) io = lst.First(); + if ( !io.IsNull() ) { + int dm = io->DisplayMode(); + if ( dm == AIS_WireFrame ) + return "Wireframe"; + else if ( dm == AIS_Shaded ) + return "Shading"; + else { // return default display mode of AIS_InteractiveContext + OCCViewer_Viewer* occViewer = (OCCViewer_Viewer*) SUIT_Session::session()->activeApplication()->desktop( + )->activeWindow()->getViewManager()->getViewModel(); + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + dm = ic->DisplayMode(); + if ( dm == AIS_WireFrame ) + return "Wireframe"; + else if ( dm == AIS_Shaded ) + return "Shading"; + } + } + } + } + else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK + SVTK_Prs* vtkPrs = dynamic_cast( prs ); + vtkActorCollection* lst = vtkPrs ? vtkPrs->GetObjects() : 0; + if ( lst ) { + lst->InitTraversal(); + vtkActor* actor = lst->GetNextActor(); + if ( actor ) { + SALOME_Actor* salActor = dynamic_cast( actor ); + if ( salActor ) { + int dm = salActor->getDisplayMode(); + if ( dm == 0 ) + return "Wireframe"; + else if ( dm == 1 ) + return "Shading"; + } // if ( salome actor ) + } // if ( actor ) + } // if ( lst == vtkPrs->GetObjects() ) + } // if VTK + } + } + return ""; +} + +bool GEOMGUI_Selection::isComponent( const int index ) const +{ + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + + if ( appStudy && index >= 0 && index < count() ) { + _PTR(Study) study = appStudy->studyDS(); + QString anEntry = entry( index ); + + if ( study && !anEntry.isNull() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.latin1() ) ); + if ( aSO && aSO->GetFatherComponent() ) + return aSO->GetFatherComponent()->GetIOR() == aSO->GetIOR(); + } + } + return false; +} + +GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const +{ + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + + if (appStudy && index >= 0 && index < count()) { + _PTR(Study) study = appStudy->studyDS(); + QString anEntry = entry(index); + + if (study && !anEntry.isNull()) { + _PTR(SObject) aSO (study->FindObjectID(anEntry.latin1())); + if (aSO) { + CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSO); + return GEOM::GEOM_Object::_narrow(anObj); + } + } + } + return GEOM::GEOM_Object::_nil(); +} diff --git a/src/GEOMGUI/GEOMGUI_Selection.h b/src/GEOMGUI/GEOMGUI_Selection.h new file mode 100644 index 000000000..fe7a6bc9a --- /dev/null +++ b/src/GEOMGUI/GEOMGUI_Selection.h @@ -0,0 +1,55 @@ +// GEOMGUI_Selection +// +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMGUI_Selection.h +// Author : Alexander SOLOVYOV +// Module : GUI +// $Header$ + +#ifndef GEOMGUI_SELECTION_HeaderFile +#define GEOMGUI_SELECTION_HeaderFile + +#include + +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +class GEOMGUI_Selection : public LightApp_Selection +{ +public: + GEOMGUI_Selection(); + virtual ~GEOMGUI_Selection(); + + virtual QtxValue param( const int, const QString& ) const; + virtual QtxValue globalParam( const QString& ) const; + +private: + bool isVisible( const int ) const; + QString typeName( const int ) const; + QString displayMode( const int ) const; + + bool isComponent( const int ) const; + GEOM::GEOM_Object_ptr getObject( const int ) const; +}; + +#endif diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx new file mode 100644 index 000000000..def483eb2 --- /dev/null +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -0,0 +1,1101 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOM_Displayer.cxx +// Author : Vadim SANDLER +// Module : GEOM +// $Header$ + +#include "GEOM_Displayer.h" + +#include "GeometryGUI.h" + +#include "GEOM_TypeFilter.h" +#include "GEOM_EdgeFilter.h" +#include "GEOM_FaceFilter.h" +#include "GEOM_PreviewFilter.h" +#include "GEOM_LogicalFilter.h" +#include "GEOM_OCCFilter.h" + +#include "GEOM_Actor.h" +#include "GEOM_AssemblyBuilder.h" +#include "GEOM_AISShape.hxx" +#include "GEOM_AISTrihedron.hxx" +#include "GEOM_VTKTrihedron.hxx" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include + +// OCCT Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// VTK Includes +#include + +// STL Includes +#include + +// CORBA Headers +#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) + +#include "GEOMImpl_Types.hxx" + +using namespace std; + +//================================================================ +// Function : getActiveStudy +// Purpose : Get active study, returns 0 if no open study frame +//================================================================ +static inline SalomeApp_Study* getActiveStudy() +{ + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( app ) + return ( SalomeApp_Study* )app->activeStudy(); + return 0; +} + +//================================================================ +// Function : getTopAbsMode +// Purpose : Get TopAbs_ShapeEnum value corresponding to the +// one from GEOMImpl_Types.h +//================================================================ +static inline int getTopAbsMode( const int implType ) +{ + switch ( implType ) + { + case GEOM_COMPOUND : return TopAbs_COMPOUND; + case GEOM_SOLID : return TopAbs_SOLID; + case GEOM_SHELL : return TopAbs_SHELL; + case GEOM_FACE : return TopAbs_FACE; + case GEOM_WIRE : return TopAbs_WIRE; + case GEOM_EDGE : return TopAbs_EDGE; + case GEOM_POINT : return TopAbs_VERTEX; + default : return -1; + } +} + +//================================================================ +// Function : getFilter +// Purpose : Get filter corresponding to the type of object +// from GEOMImpl_Types.h +//================================================================ +SUIT_SelectionFilter* GEOM_Displayer::getFilter( const int theMode ) +{ + SUIT_SelectionFilter* aFilter; + + int aTopAbsMode = getTopAbsMode( theMode ); + if ( aTopAbsMode != -1 ) + aFilter = new GEOM_TypeFilter( getStudy(), aTopAbsMode, true ); //@ aFilter = new GEOM_TypeFilter( ( TopAbs_ShapeEnum )aTopAbsMode ); + else + switch ( theMode ) + { + case GEOM_LINE : aFilter = new GEOM_EdgeFilter( getStudy(), StdSelect_Line ); break; + case GEOM_CIRCLE : aFilter = new GEOM_EdgeFilter( getStudy(), StdSelect_Circle ); break; + + case GEOM_PLANE : aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Plane ); break; + case GEOM_CYLINDER : aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Cylinder ); break; + case GEOM_SPHERE : aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Sphere ); break; + case GEOM_TORUS : aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Torus ); break; + case GEOM_REVOLUTION: aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Revol ); break; + case GEOM_CONE : aFilter = new GEOM_FaceFilter( getStudy(), StdSelect_Cone ); break; + + case GEOM_PREVIEW : aFilter = new GEOM_PreviewFilter( getStudy() ); break; + + case GEOM_ALLSHAPES : aFilter = new GEOM_SelectionFilter(getStudy(), true ); break; + case GEOM_ALLGEOM : aFilter = new SalomeApp_TypeFilter( getStudy(), "GEOM" ); break; + + default : aFilter = new GEOM_TypeFilter( getStudy(), theMode ); break; + } + + return aFilter; +} + +//================================================================ +// 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 ""; +} + +//================================================================ +// Function : getName +// Purpose : +//================================================================ +static string getName( 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) aSObj ( study->studyDS()->FindObjectIOR( IOR ) ); + + _PTR(GenericAttribute) anAttr; + + if ( aSObj && aSObj->FindAttribute( anAttr, "AttributeName") ) + { + _PTR(AttributeName) aNameAttr( anAttr ); + return aNameAttr->Value(); + } + } + } + + return ""; +} + +//================================================================= +/*! + * GEOM_Displayer::GEOM_Displayer + * Constructor + */ +//================================================================= +GEOM_Displayer::GEOM_Displayer( SalomeApp_Study* st ) +{ + if( st ) + myApp = dynamic_cast( st->application() ); + else + myApp = 0; + + /* Shading Color */ + SUIT_Session* session = SUIT_Session::session(); + SUIT_ResourceMgr* resMgr = session->resourceMgr(); + + QColor col = resMgr->colorValue( "Geometry", "shading_color", QColor( 255, 0, 0 ) ); + myShadingColor = SalomeApp_Tools::color( col ); + + myDisplayMode = resMgr->integerValue("Geometry", "display_mode", 0); + + myColor = -1; + // This color is used for shape displaying. If it is equal -1 then + // default color is used. + + myWidth = -1; + myType = -1; + + myToActivate = true; + // This parameter is used for activisation/deactivisation of objects to be displayed + + myViewFrame = 0; +} + +//================================================================= +/*! + * GEOM_Displayer::~GEOM_Displayer + * Destructor + */ +//================================================================= +GEOM_Displayer::~GEOM_Displayer() +{ +} + +//================================================================= +/*! + * GEOM_Displayer::Display + * Display interactive object in the current viewer + */ +//================================================================= +void GEOM_Displayer::Display( const Handle(SALOME_InteractiveObject)& theIO, + const bool updateViewer, + SALOME_View* theViewFrame ) +{ + SALOME_View* vf = theViewFrame ? theViewFrame : GetActiveView(); + if ( vf ) + { + SALOME_Prs* prs = buildPresentation( theIO->getEntry(), vf ); + + if ( prs ) + { + vf->BeforeDisplay( this ); + vf->Display( prs ); + vf->AfterDisplay( this ); + + if ( updateViewer ) + vf->Repaint(); + + delete prs; // delete presentation because displayer is its owner + } + } +} + +//================================================================= +/*! + * GEOM_Displayer::Display + * This overloaded Display() method can be useful for operations + * not using dialog boxes. + */ +//================================================================= +void GEOM_Displayer::Display( GEOM::GEOM_Object_ptr theObj, const bool updateViewer ) +{ + if ( theObj->_is_nil() ) + return; + + string entry = getEntry( theObj ); + if ( entry != "" ) { + Display(new SALOME_InteractiveObject(entry.c_str(), "GEOM", getName(theObj).c_str()), + updateViewer); + } +} + +//================================================================= +/*! + * GEOM_Displayer::Erase + * Erase interactive object in the current viewer + */ +//================================================================= +void GEOM_Displayer::Erase( const Handle(SALOME_InteractiveObject)& theIO, + const bool forced, + const bool updateViewer, + SALOME_View* theViewFrame ) +{ + if ( theIO.IsNull() ) + return; + + SALOME_View* vf = theViewFrame ? theViewFrame : GetActiveView(); + + if ( vf ) { + SALOME_Prs* prs = vf->CreatePrs( theIO->getEntry() ); + if ( prs ) { + vf->Erase( prs, forced ); + if ( updateViewer ) + vf->Repaint(); + delete prs; // delete presentation because displayer is its owner + } + } +} + +//================================================================= +/*! + * GEOM_Displayer::Erase + * Erase geometry object in the current viewer + */ +//================================================================= +void GEOM_Displayer::Erase( GEOM::GEOM_Object_ptr theObj, + const bool forced, + const bool updateViewer ) +{ + string entry = getEntry( theObj ); + if ( entry != "" ) + { + Erase(new SALOME_InteractiveObject(entry.c_str(), "GEOM", getName(theObj).c_str()), + forced, updateViewer); + } +} + +//================================================================= +/*! + * GEOM_Displayer::Redisplay + * Redisplay (erase and then display again) interactive object + * in the current viewer + */ +//================================================================= +void GEOM_Displayer::Redisplay( const Handle(SALOME_InteractiveObject)& theIO, + const bool updateViewer ) +{ + // Remove the object permanently ( == true) + SUIT_Session* ses = SUIT_Session::session(); + SUIT_Application* app = ses->activeApplication(); + if ( app ) + { + SUIT_Desktop* desk = app->desktop(); + QPtrList wnds = desk->windows(); + SUIT_ViewWindow* wnd; + for ( wnd = wnds.first(); wnd; wnd = wnds.next() ) + { + SUIT_ViewManager* vman = wnd->getViewManager(); + if ( vman ) + { + SUIT_ViewModel* vmodel = vman->getViewModel(); + if ( vmodel ) + { + SALOME_View* view = dynamic_cast(vmodel); + if ( view ) + { + if ( view->isVisible( theIO ) || view == GetActiveView() ) + { + Erase( theIO, true, false, view ); + Display( theIO, updateViewer, view ); + } + } + } + } + } + } +} + +//================================================================= +/*! + * GEOM_Displayer::Display + * Calls Display() method for each object in the given list + */ +//================================================================= +void GEOM_Displayer::Display( const SALOME_ListIO& theIOList, const bool updateViewer ) +{ + SALOME_ListIteratorOfListIO Iter( theIOList ); + for ( ; Iter.More(); Iter.Next() ) { + Display( Iter.Value(), false ); + } + if ( updateViewer ) + UpdateViewer(); +} + +//================================================================= +/*! + * GEOM_Displayer::Erase + * Calls Erase() method for each object in the given list + */ +//================================================================= +void GEOM_Displayer::Erase( const SALOME_ListIO& theIOList, + const bool forced, + const bool updateViewer ) +{ + SALOME_ListIteratorOfListIO Iter( theIOList ); + for ( ; Iter.More(); Iter.Next() ) + Erase( Iter.Value(), forced, false ); + + if ( updateViewer ) + UpdateViewer(); +} + +//================================================================= +/*! + * GEOM_Displayer::Redisplay + * Calls Redisplay() method for each object in the given list + */ +//================================================================= +void GEOM_Displayer::Redisplay( const SALOME_ListIO& theIOList, const bool updateViewer ) +{ + SALOME_ListIteratorOfListIO Iter( theIOList ); + for ( ; Iter.More(); Iter.Next() ) + Redisplay( Iter.Value(), false ); + + if ( updateViewer ) + UpdateViewer(); +} + +//================================================================= +/*! + * GEOM_Displayer::Update + * Update OCC presentaion + * [ Reimplemented from SALOME_Displayer ] + */ +//================================================================= +void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) +{ + SOCC_Prs* occPrs = dynamic_cast( prs ); + if ( !occPrs ) + return; + + if ( myType == GEOM_MARKER && !myShape.IsNull() && myShape.ShapeType() == TopAbs_FACE ) + { + TopoDS_Face aFace = TopoDS::Face( myShape ); + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast( BRep_Tool::Surface( aFace ) ); + if ( !aPlane.IsNull() ) + { + gp_Ax3 aPos = aPlane->Pln().Position(); + Handle(Geom_Axis2Placement) aPlc = new Geom_Axis2Placement( aPos.Ax2() ); + + Handle(GEOM_AISTrihedron) aTrh; + + if ( occPrs->IsNull() ) + { + aTrh = new GEOM_AISTrihedron( aPlc ); + + if ( HasColor() ) + aTrh->SetColor( (Quantity_NameOfColor)GetColor() ); + + if ( HasWidth() ) + aTrh->SetWidth( GetWidth() ); + + if ( !myIO.IsNull() ) + { + aTrh->setIO( myIO ); + aTrh->SetOwner( myIO ); + } + + occPrs->AddObject( aTrh ); + } + else + { + AIS_ListOfInteractive aList; + occPrs->GetObjects( aList ); + AIS_ListIteratorOfListOfInteractive anIter( aList ); + for ( ; anIter.More(); anIter.Next() ) + { + aTrh = Handle(GEOM_AISTrihedron)::DownCast( anIter.Value() ); + if ( !aTrh.IsNull() ) + { + aTrh->SetComponent( aPlc ); + aTrh->SetToUpdate(); + } + } + } + + occPrs->SetToActivate( ToActivate() ); + } + } + else + { + // if presentation is empty we try to create new one + if ( occPrs->IsNull() ) + { + if ( !myShape.IsNull() ) + { + Handle(GEOM_AISShape) AISShape = new GEOM_AISShape( myShape, "" ); + // Temporary staff: vertex must be infinite for correct visualization + AISShape->SetInfiniteState( myShape.Infinite() || myShape.ShapeType() == TopAbs_VERTEX ); + + // Setup shape properties here ..., e.g. display mode, color, transparency, etc + AISShape->SetDisplayMode( myDisplayMode ); + AISShape->SetShadingColor( myShadingColor ); + + if ( HasColor() ) + { + AISShape->SetColor( (Quantity_NameOfColor)GetColor() ); + if ( myShape.ShapeType() == TopAbs_VERTEX ) + { + Handle(Prs3d_PointAspect) anAspect = AISShape->Attributes()->PointAspect(); + anAspect->SetColor( (Quantity_NameOfColor)GetColor() ); + AISShape->Attributes()->SetPointAspect( anAspect ); + } + } + + if ( HasWidth() ) + AISShape->SetWidth( GetWidth() ); + + if ( !myIO.IsNull() ) + { + AISShape->setIO( myIO ); + AISShape->SetOwner( myIO ); + } + else if ( !myName.empty() ) + { + // Workaround to allow selection of temporary objects + static int tempId = 0; + char buf[50]; + sprintf( buf, "TEMP_%d", tempId++ ); + Handle( SALOME_InteractiveObject ) anObj = + new SALOME_InteractiveObject( buf, "GEOM", myName.c_str() ); + AISShape->setIO( anObj ); + AISShape->SetOwner( anObj ); + } + // AISShape->SetName(???); ??? necessary to set name ??? + occPrs->AddObject( AISShape ); + + // In accordance with ToActivate() value object will be activated/deactivated + // when it will be displayed + occPrs->SetToActivate( ToActivate() ); + } + } + // if presentation is found -> set again shape for it + else + { + if ( !myShape.IsNull() ) + { + AIS_ListOfInteractive IOList; + occPrs->GetObjects( IOList ); + AIS_ListIteratorOfListOfInteractive Iter( IOList ); + for ( ; Iter.More(); Iter.Next() ) + { + Handle(GEOM_AISShape) AISShape = Handle(GEOM_AISShape)::DownCast( Iter.Value() ); + if ( AISShape.IsNull() ) + continue; + if ( AISShape->Shape() != myShape ) + { + AISShape->Set( myShape ); + AISShape->UpdateSelection(); + AISShape->SetToUpdate(); + } + if ( !myIO.IsNull() ) + { + AISShape->setIO( myIO ); + AISShape->SetOwner( myIO ); + } + } + } + } + } +} + +//================================================================= +/*! + * GEOM_Displayer::Update + * Update VTK presentaion + * [ Reimplemented from SALOME_Displayer ] + */ +//================================================================= +void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) +{ + SVTK_Prs* vtkPrs = dynamic_cast( prs ); + if ( !vtkPrs || myShape.IsNull() ) + return; + + vtkActorCollection* theActors = 0; + + if ( myType == GEOM_MARKER && !myShape.IsNull() && myShape.ShapeType() == TopAbs_FACE ) + { + myToActivate = false; + GEOM_VTKTrihedron* aTrh = GEOM_VTKTrihedron::New(); + + if ( HasColor() ) + { + Quantity_Color aColor( (Quantity_NameOfColor)GetColor() ); + aTrh->SetColor( aColor.Red(), aColor.Green(), aColor.Blue() ); + } + + Handle(Geom_Plane) aPlane = + Handle(Geom_Plane)::DownCast( BRep_Tool::Surface( TopoDS::Face( myShape ) ) ); + if ( aPlane.IsNull() ) + return; + + gp_Ax2 anAx2 = aPlane->Pln().Position().Ax2(); + aTrh->SetPlacement( new Geom_Axis2Placement( anAx2 ) ); + +// if ( SVTK_Viewer* vf = dynamic_cast( GetActiveView() ) ) +// aTrh->SetSize( 0.5 * vf->GetTrihedronSize() ); + + vtkPrs->AddObject( aTrh ); + + theActors = vtkActorCollection::New(); + theActors->AddItem( aTrh ); + } + else + theActors = GEOM_AssemblyBuilder::BuildActors( myShape, 0, 0, Standard_True ); + + theActors->InitTraversal(); + + vtkActor* anActor = (vtkActor*)theActors->GetNextActor(); + + vtkProperty* aProp = 0; + + if ( HasColor() || HasWidth() ) + { + aProp = vtkProperty::New(); + aProp->SetRepresentationToWireframe(); + } + + if ( HasColor() ) + { + Quantity_Color aColor( (Quantity_NameOfColor)GetColor() ); + aProp->SetColor( aColor.Red(), aColor.Green(), aColor.Blue() ); + } + + if ( HasWidth() ) + { + aProp->SetLineWidth( GetWidth() ); + } + + while ( anActor != NULL ) + { + SALOME_Actor* GActor = SALOME_Actor::SafeDownCast( anActor ); + + GActor->setIO( myIO ); + + if ( aProp ) + { + GActor->SetProperty( aProp ); + GActor->SetPreviewProperty( aProp ); + + GEOM_Actor* aGeomGActor = GEOM_Actor::SafeDownCast( anActor ); + if ( aGeomGActor != 0 ) + { + aGeomGActor->SetShadingProperty( aProp ); + aGeomGActor->SetWireframeProperty( aProp ); + } + } + + if ( myToActivate ) + GActor->PickableOn(); + else + GActor->PickableOff(); + + vtkPrs->AddObject( GActor ); + + anActor = (vtkActor*)theActors->GetNextActor(); + } + + if ( aProp ) + aProp->Delete(); + + theActors->Delete(); +} + +//================================================================= +/*! + * GEOM_Displayer::BuildPrs + * Build presentation accordint to the current viewer type + */ +//================================================================= +SALOME_Prs* GEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj ) +{ + if ( theObj->_is_nil() ) + return 0; + + myViewFrame = GetActiveView(); + if ( myViewFrame == 0 ) + return 0; + + SALOME_Prs* aPrs = myViewFrame->CreatePrs(); + if ( aPrs == 0 ) + return 0; + + internalReset(); + setShape( GEOM_Client().GetShape( GeometryGUI::GetGeomGen(), theObj ) ); + myType = theObj->GetType(); + + // Update presentation + UpdatePrs( aPrs ); + + return aPrs; +} + +//================================================================= +/*! + * GEOM_Displayer::BuildPrs + * Build presentation accordint to the current viewer type + */ +//================================================================= +SALOME_Prs* GEOM_Displayer::BuildPrs( const TopoDS_Shape& theShape ) +{ + myViewFrame = GetActiveView(); + if ( theShape.IsNull() || myViewFrame == 0 ) + return 0; + + SALOME_Prs* aPrs = myViewFrame->CreatePrs(); + if ( aPrs == 0 ) + return 0; + + internalReset(); + setShape( theShape ); + myType = -1; + + UpdatePrs( aPrs ); + + return aPrs; +} + +//================================================================= +/*! + * GEOM_Displayer::buildPresentation + * Builds/finds object's presentation for the current viewer + * Calls corresponding Update() method by means of double dispatch + * [ internal ] + */ +//================================================================= +SALOME_Prs* GEOM_Displayer::buildPresentation( const QString& entry, + SALOME_View* theViewFrame ) +{ + SALOME_Prs* prs = 0; + internalReset(); + + myViewFrame = theViewFrame ? theViewFrame : GetActiveView(); + + if ( myViewFrame ) + { + prs = LightApp_Displayer::buildPresentation( entry, theViewFrame ); + if ( prs ) + { + Handle( SALOME_InteractiveObject ) theIO = new SALOME_InteractiveObject(); + theIO->setEntry( entry.latin1() ); + if ( !theIO.IsNull() ) + { + // set interactive object + setIO( theIO ); + // Find SOBject (because shape should be published previously) + SUIT_Session* session = SUIT_Session::session(); + SUIT_Application* app = session->activeApplication(); + if ( app ) + { + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( study ) + { + _PTR(SObject) SO ( study->studyDS()->FindObjectID( theIO->getEntry() ) ); + if ( SO ) + { + // get CORBA reference to data object + CORBA::Object_var object = GeometryGUI::ClientSObjectToObject(SO); + if ( !CORBA::is_nil( object ) ) + { + // downcast to GEOM object + GEOM::GEOM_Object_var GeomObject = GEOM::GEOM_Object::_narrow( object ); + if ( !GeomObject->_is_nil() ) + { + // finally set shape + setShape( GEOM_Client().GetShape( GeometryGUI::GetGeomGen(), GeomObject ) ); + myType = GeomObject->GetType(); + } + } + } + } + } + } + UpdatePrs( prs ); // Update presentation by using of the double dispatch + } + } + return prs; +} + +//================================================================= +/*! + * GEOM_Displayer::internalReset + * Resets internal data + * [internal] + */ +//================================================================= +void GEOM_Displayer::internalReset() +{ + myIO.Nullify(); + myShape.Nullify(); +} + +//================================================================= +/*! + * GEOM_Displayer::LocalSelection + * Activate selection of CAD shapes with activisation of selection + * of their sub-shapes (with opened local context for OCC viewer) + */ +//================================================================= +void GEOM_Displayer::LocalSelection( const Handle(SALOME_InteractiveObject)& theIO, const int theMode ) +{ + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( !app ) + return; + + LightApp_SelectionMgr* sm = app->selectionMgr(); + + // remove all filters from selection + sm->clearFilters(); + + SALOME_View* vf = GetActiveView(); + if ( vf ) + { + SALOME_Prs* prs = vf->CreatePrs( theIO.IsNull() ? 0 : theIO->getEntry() ); + vf->LocalSelection( prs, theMode ); + delete prs; // delete presentation because displayer is its owner + } +} + +//================================================================= +/*! + * GEOM_Displayer::globalSelection + * Activate selection of CAD shapes without activisation of selection + * of their sub-shapes (without opened local context for OCC viewer) + */ +//================================================================= +void GEOM_Displayer::GlobalSelection( const int theMode, const bool update ) +{ + TColStd_MapOfInteger aModes; + aModes.Add( theMode ); + GlobalSelection( aModes, update ); +} + +//================================================================= +/*! + * GEOM_Displayer::globalSelection + * Activate selection of CAD shapes without activisation of selection + * of their sub-shapes (without opened local context for OCC viewer) + */ +//================================================================= +void GEOM_Displayer::GlobalSelection( const TColStd_MapOfInteger& theModes, + const bool update ) +{ + SUIT_Session* session = SUIT_Session::session(); + SalomeApp_Application* app = dynamic_cast( session->activeApplication() ); + if ( !app ) + return; + + SALOME_View* vf = GetActiveView(); + if ( vf == 0 ) + return; + + // Close local context + vf->GlobalSelection( update ); + + // Set selection filters in accordance with current mode + LightApp_SelectionMgr* sm = app->selectionMgr(); + if ( !sm ) + return; + + // Remove from selection temporary objects if necessary + if ( !theModes.Contains( GEOM_PREVIEW ) ) + clearTemporary( sm ); + + //@ aSel->ClearIndex(); + + sm->clearFilters(); + + // Remove filters from AIS_InteractiveContext + Handle(AIS_InteractiveContext) ic; + SOCC_Viewer* viewer = dynamic_cast( vf ); + if ( viewer ) + { + ic = viewer->getAISContext(); + if ( !ic.IsNull() ) + ic->RemoveFilters(); + } + + if ( theModes.Contains( GEOM_ALLOBJECTS ) ) + return; + + SUIT_SelectionFilter* aFilter; + if ( theModes.Extent() == 1 ) + { + int aMode = TColStd_MapIteratorOfMapOfInteger( theModes ).Key(); + aFilter = getFilter( aMode ); + } + else if ( theModes.Extent() > 1 ) + { + TColStd_MapOfInteger aTopAbsModes; + TColStd_MapIteratorOfMapOfInteger anIter( theModes ); + QPtrList aListOfFilters; + for ( ; anIter.More(); anIter.Next() ) + { + SUIT_SelectionFilter* aFilter = getFilter( anIter.Key() ); + if ( aFilter ) + aListOfFilters.append( aFilter ); + } + + aFilter = new GEOM_LogicalFilter( aListOfFilters, GEOM_LogicalFilter::LO_OR ); + } + else + return; + + if ( aFilter ) + { + sm->installFilter( aFilter ); + if ( !ic.IsNull() ) + { + Handle(GEOM_OCCFilter) anOCCFilter = new GEOM_OCCFilter( sm ); + ic->AddFilter( anOCCFilter ); + } + } +} + +//================================================================= +/*! + * GEOM_Displayer::LocalSelection + * Activate selection of CAD shapes with activisation of selection + * of their sub-shapes (with opened local context for OCC viewer) + */ +//================================================================= +void GEOM_Displayer::LocalSelection( const SALOME_ListIO& theIOList, const int theMode ) +{ + SALOME_ListIteratorOfListIO Iter( theIOList ); + for ( ; Iter.More(); Iter.Next() ) + LocalSelection( Iter.Value(), theMode ); +} + +//================================================================= +/*! + * GEOM_Displayer::BeforeDisplay + * Called before displaying of pars. Close local context + * [ Reimplemented from SALOME_Displayer ] + */ +//================================================================= +void GEOM_Displayer::BeforeDisplay( SALOME_View* v, const SALOME_OCCViewType& ) +{ + SOCC_Viewer* vf = dynamic_cast( v ); + if ( vf ) + { + Handle(AIS_InteractiveContext) ic = vf->getAISContext(); + if ( !ic.IsNull() ) + { + if ( ic->HasOpenedContext() ) + ic->CloseAllContexts(); + } + } +} + +void GEOM_Displayer::AfterDisplay( SALOME_View*, const SALOME_OCCViewType& ) +{ +} + + +//================================================================= +/*! + * GEOM_Displayer::SetColor + * Set color for shape displaying. If it is equal -1 then default color is used. + * Available values are from Quantity_NameOfColor enumeration + */ +//================================================================= +void GEOM_Displayer::SetColor( const int color ) +{ + myColor = color; +} + +int GEOM_Displayer::GetColor() const +{ + return myColor; +} + +bool GEOM_Displayer::HasColor() const +{ + return myColor != -1; +} + +void GEOM_Displayer::UnsetColor() +{ + myColor = -1; +} + +//================================================================= +/*! + * GEOM_Displayer::SetWidth + * Set width of shape displaying. If it is equal -1 then default width is used. + */ +//================================================================= +void GEOM_Displayer::SetWidth( const double width ) +{ + myWidth = width; +} + +double GEOM_Displayer::GetWidth() const +{ + return myWidth; +} + +bool GEOM_Displayer::HasWidth() const +{ + return myWidth != -1; +} + +void GEOM_Displayer::UnsetWidth() +{ + myWidth = -1; +} + +//================================================================= +/*! + * GEOM_Displayer::SetToActivate + * This method is used for activisation/deactivisation of objects to be displayed + */ +//================================================================= +void GEOM_Displayer::SetToActivate( const bool toActivate ) +{ + myToActivate = toActivate; +} +bool GEOM_Displayer::ToActivate() const +{ + return myToActivate; +} + +//================================================================= +/*! + * GEOM_Displayer::clearTemporary + * Removes from selection temporary objects + */ +//================================================================= +void GEOM_Displayer::clearTemporary( LightApp_SelectionMgr* theSelMgr ) +{ + SALOME_ListIO selected, toSelect; + theSelMgr->selectedObjects( selected ); + + for ( SALOME_ListIteratorOfListIO it( selected ) ; it.More(); it.Next() ) { + Handle(SALOME_InteractiveObject) io = it.Value(); + if ( !io.IsNull() && io->hasEntry() && strncmp( io->getEntry(), "TEMP_", 5 ) != 0 ) + toSelect.Append( it.Value() ); + } + + theSelMgr->setSelectedObjects( toSelect, true ); +} + +void GEOM_Displayer::SetName( const char* theName ) +{ + myName = theName; +} + +void GEOM_Displayer::UnsetName() +{ + myName = ""; +} + +SalomeApp_Study* GEOM_Displayer::getStudy() const +{ + return dynamic_cast( myApp->activeStudy() ); +} + +void GEOM_Displayer::setIO( const Handle(SALOME_InteractiveObject)& theIO ) +{ + myIO = theIO; +} + +void GEOM_Displayer::setShape( const TopoDS_Shape& theShape ) +{ + myShape = theShape; +} + +bool GEOM_Displayer::canBeDisplayed( const QString& /*entry*/, const QString& viewer_type ) const +{ + return viewer_type==SOCC_Viewer::Type() || viewer_type==SVTK_Viewer::Type(); +} diff --git a/src/GEOMGUI/GEOM_Displayer.h b/src/GEOMGUI/GEOM_Displayer.h new file mode 100644 index 000000000..d1af6d1f0 --- /dev/null +++ b/src/GEOMGUI/GEOM_Displayer.h @@ -0,0 +1,191 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOM_Displayer.h +// Author : Vadim SANDLER +// Module : GEOM +// $Header$ + +#if !defined (__GEOM_DISPLAYER_H) +#define __GEOM_DISPLAYER_H + +#include "SALOME_Prs.h" +#include "SALOME_InteractiveObject.hxx" +#include "SALOME_ListIO.hxx" +#include +#include +#include + +#include + +#include +#include CORBA_CLIENT_HEADER(GEOM_Gen) + +#define GEOM_ALLOBJECTS -1 // Selection of all objects is activated +#define GEOM_PREVIEW -2 // Definition for preview selection +#define GEOM_ALLSHAPES -3 // Selection of all shapes is activated +#define GEOM_ALLGEOM -4 // Selection of all geom objects is activated + +typedef std::list ObjectList; + +class TColStd_MapOfInteger; +class LightApp_SelectionMgr; +class SalomeApp_Study; +class SalomeApp_Application; +class SUIT_SelectionFilter; +//class SALOME_Selection; + +//#ifdef WNT +//#include +//#else +//#define SALOME_WNT_EXPORT +//#endif +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define GEOMGUI_WNT_EXPORT __declspec( dllexport ) +#else +#define GEOMGUI_WNT_EXPORT +#endif + +class GEOMGUI_WNT_EXPORT GEOM_Displayer : public LightApp_Displayer +{ + +public: + /* Constructor */ + GEOM_Displayer( SalomeApp_Study* app ); + /* Destructor */ + virtual ~GEOM_Displayer(); + + virtual bool canBeDisplayed( const QString& /*entry*/, const QString& /*viewer_type*/ ) const; + + /* Display/Erase object methods */ + void Display ( const Handle(SALOME_InteractiveObject)& theIO, + const bool updateViewer = true, + SALOME_View* theViewFrame = 0 ); + + // This overloaded Display() method can be useful for operations + // not using dialog boxes. + void Display ( GEOM::GEOM_Object_ptr theObj, + const bool updateViewer = true ); + + void Redisplay ( const Handle(SALOME_InteractiveObject)& theIO, + const bool updateViewer = true ); + + void Erase ( const Handle(SALOME_InteractiveObject)& theIO, + const bool forced = false, + const bool updateViewer = true, + SALOME_View* theViewFrame = 0 ); + + void Erase ( GEOM::GEOM_Object_ptr theObj, + const bool forced = false, + 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 ); + + /* build presentation accordint to the current viewer type*/ + SALOME_Prs* BuildPrs ( GEOM::GEOM_Object_ptr ); + SALOME_Prs* BuildPrs ( const TopoDS_Shape& ); + + /* Set color for shape displaying. If it is equal -1 then default color is used. + Available values are from Quantity_NameOfColor enumeration */ + void SetColor ( const int ); + void UnsetColor(); + int GetColor () const; + bool HasColor () const; + + /* Set width for shape displaying. If it is equal -1 then default width is used. */ + void SetWidth ( const double ); + void UnsetWidth(); + double GetWidth () const; + bool HasWidth () const; + + + /* Sets name - for temporary objects only */ + void SetName( const char* theName ); + void UnsetName(); + + /* Reimplemented from SALOME_Displayer */ + virtual void Update( SALOME_OCCPrs* ); + virtual void Update( SALOME_VTKPrs* ); + virtual void BeforeDisplay( SALOME_View*, const SALOME_OCCViewType& ); + virtual void AfterDisplay ( SALOME_View*, const SALOME_OCCViewType& ); + + /* This methos is used for activisation/deactivisation of objects to be displayed*/ + void SetToActivate( const bool ); + bool ToActivate() const; + + /* Activate/Deactivate selection*/ + void LocalSelection( const Handle(SALOME_InteractiveObject)&, const int ); + void LocalSelection( const SALOME_ListIO& theIOList, const int ); + void GlobalSelection( const int = GEOM_ALLOBJECTS, const bool = false ); + void GlobalSelection( const TColStd_MapOfInteger&, const bool = false ); + + SalomeApp_Study* getStudy() const; + +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; + string myName; + int myType; + SALOME_View* myViewFrame; + + // Attributes + Quantity_Color myShadingColor; + int myColor; + double myWidth; + bool myToActivate; + int myDisplayMode; + +private: + SalomeApp_Application* myApp; +}; + +#endif // __GEOM_DISPLAYER_H + diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po new file mode 100644 index 000000000..4dcf34b03 --- /dev/null +++ b/src/GEOMGUI/GEOM_msg_en.po @@ -0,0 +1,2898 @@ +# This is a Qt message file in .po format. Each msgid starts with +# a scope. This scope should *NOT* be translated - eg. translating +# from French to English, "Foo::Bar" would be translated to "Pub", +# not "Foo::Pub". +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2002-03-19 09:35:48 AM CET\n" +"PO-Revision-Date: 2003-10-27 17:32+0100\n" +"Last-Translator: FULLNAME \n" +"Content-Type: text/plain; charset=iso-8859-1\n" + +# +#============================================================================== +# + +#Button Apply +msgid "GEOM_BUT_APPLY" +msgstr "&Apply" + +#Button Close +msgid "GEOM_BUT_CLOSE" +msgstr "&Close" + +#Button Cancel +msgid "GEOM_BUT_CANCEL" +msgstr "&Cancel" + +#Button Ok +msgid "GEOM_BUT_OK" +msgstr "O&k" + +#Button Yes +msgid "GEOM_BUT_YES" +msgstr "&Yes" + +#Button No +msgid "GEOM_BUT_NO" +msgstr "&No" + +#Button Help +msgid "GEOM_BUT_HELP" +msgstr "&Help" + +#Button Explode +msgid "GEOM_BUT_EXPLODE" +msgstr "&Explode" + +# +#============================================================================== +# + +#: GeometryGUI.cxx:563 +msgid "GEOM_INF_LOADED" +msgstr "File %1 loaded." + +# +#============================================================================== +# + +#: GeometryGUI.cxx:3069 +msgid "GEOM_PRP_COMMAND" +msgstr "No command associated with this id = %1." + +#: GeometryGUI.cxx:4977 +msgid "GEOM_PRP_ABORT" +msgstr "Operation aborted" + +#: GeometryGUI.cxx:5058 +msgid "GEOM_PRP_DONE" +msgstr "Operation done" + +#: GeometryGUI.cxx:3717 +msgid "GEOM_PRP_LOADING" +msgstr "Loading %1 ..." + +#: GeometryGUI.cxx:1412 +msgid "GEOM_PRP_NULLSHAPE" +msgstr "Error, null or inappropriate shape !" + +#: GeometryGUI.cxx:5072 +msgid "GEOM_PRP_READY" +msgstr "Ready" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_SELECT_SUBSHAPES" +msgstr "Select Sub Shapes" + +msgid "GEOM_PRP_EXPORT" +msgstr "Exporting geometry to %1 ..." + +msgid "GEOM_CONFIRM" +msgstr "Confirm operation" + +msgid "GEOM_CONFIRM_INFO" +msgstr "Shape contains %1 sub shapes !" + + +msgid "GEOM_PRP_NOT_FOR_VTK_VIEWER" +msgstr "Not allowed in VTK viewer" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_SHAPE_IN_STUDY" +msgstr "Main shape must be in the study before" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_SELECT_EDGE" +msgstr "Select edges and click on Apply" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_SELECT_FACE" +msgstr "Select faces to suppress and click on Ok/Apply" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_SELECT_FIRST" +msgstr "Select main shape first" + +#: GeometryGUI.cxx:1690 +msgid "GEOM_PRP_MIN_DIST" +msgstr "Min Distance not computed" + +msgid "GEOM_STUDY_LOCKED" +msgstr "The active study is locked and therefore cannot be modified" + +# +#============================================================================== +# + +#: GeometryGUI.cxx:3698 +msgid "GEOM_MEN_ALL_FILES" +msgstr "All Files ( * )" + +#: GeometryGUI.cxx:4389 +msgid "GEOM_MEN_ANGLE" +msgstr "Angle :" + +#: GeometryGUI.cxx:3941 +msgid "GEOM_MEN_COMPONENT" +msgstr "Geometry" + +#: GeometryGUI.cxx:4389 +msgid "GEOM_MEN_ENTER_ANGLE" +msgstr "Enter An Angle In Degrees" + +#: GeometryGUI.cxx:3758 +msgid "GEOM_MEN_EXPORT" +msgstr "Export" + +#: GeometryGUI.cxx:3648 +msgid "GEOM_MEN_IMPORT" +msgstr "Import" + +#: GeometryGUI.cxx:2931 +msgid "GEOM_MEN_ISOS" +msgstr "Select Number Of Isos" + +#: GeometryGUI.cxx:4278 +msgid "GEOM_MEN_POPUP_NAME" +msgstr "%1 Objects" + +#: GeometryGUI.cxx:4414 +msgid "GEOM_MEN_SKETCHER_X" +msgstr "Enter a length to set X" + +#: GeometryGUI.cxx:4438 +msgid "GEOM_MEN_SKETCHER_Y" +msgstr "Enter a length to set Y" + +#: GeometryGUI.cxx:2898 +msgid "GEOM_MEN_TRANSPARENCY" +msgstr "Transparency" + +#: GeometryGUI.cxx:4413 +msgid "GEOM_MEN_X" +msgstr "X :" + +#: GeometryGUI.cxx:4437 +msgid "GEOM_MEN_Y" +msgstr "Y :" + +#: GeometryGUI_NbIsosDlg.cxx:36 +msgid "GEOM_MEN_ISOU" +msgstr "Isos u :" + +#: GeometryGUI_NbIsosDlg.cxx:53 +msgid "GEOM_MEN_ISOV" +msgstr "Isos v :" + +#: GeometryGUI_TransparencyDlg.cxx:31 +msgid "GEOM_MEN_TRANSPARENCY_LABEL" +msgstr "Transparency :" + +msgid "GEOM_MEN_STEP_LABEL" +msgstr "Step :" + +msgid "GEOM_IDENTICAL_NAMES_SELECT_BY_MOUSE" +msgstr "Identical names : select by mouse !" + +msgid "GEOM_NAME_INCORRECT" +msgstr "Object name not found" + +msgid "GEOM_INCORRECT_INPUT" +msgstr "Incorrect input data!" + +# +#============================================================================== +# + +#: GeometryGUI.cxx:892 +msgid "GEOM_WRN_RADIUS_NULL" +msgstr "Radius is null" + +#: GeometryGUI.cxx:3854 +msgid "GEOM_WRN_WARNING" +msgstr "Warning" + +#: GeometryGUI.cxx:3854 +msgid "GEOM_REALLY_DELETE" +msgstr "Do you really want to delete object(s) ?" + +# +#============================================================================== +# + +#Object +msgid "GEOM_OBJECT" +msgstr "Object" + +#Main object +msgid "GEOM_MAIN_OBJECT" +msgstr "Main Object" + +#Tool object +msgid "GEOM_TOOL_OBJECT" +msgstr "Tool Object" + +#Base Object +msgid "GEOM_BASE_OBJECT" +msgstr "Base Object" + +#Path Object +msgid "GEOM_PATH_OBJECT" +msgstr "Path Object" + +#Objects +msgid "GEOM_OBJECTS" +msgstr "Objects" + +#Object i +msgid "GEOM_OBJECT_I" +msgstr "Object %1" + +#Object and result +msgid "GEOM_OBJECT_RESULT" +msgstr "Object And Result" + +#Point +msgid "GEOM_POINT" +msgstr "Point" + +#Base point +msgid "GEOM_BASE_POINT" +msgstr "Base Point" + +#Center Point +msgid "GEOM_CENTER_POINT" +msgstr "Center Point" + +#Diagonal Points +msgid "GEOM_DIAGONAL_POINTS" +msgstr "Diagonal Points" + +#Central Point +msgid "GEOM_CENTRAL_POINT" +msgstr "Central Point" + +#Points +msgid "GEOM_POINTS" +msgstr "Points" + +#Point i +msgid "GEOM_POINT_I" +msgstr "Point %1" + +#Arguments +msgid "GEOM_ARGUMENTS" +msgstr "Arguments" + +#Center +msgid "GEOM_CENTER" +msgstr "Center" + +#Radius +msgid "GEOM_RADIUS" +msgstr "Radius :" + +#Radius i +msgid "GEOM_RADIUS_I" +msgstr "Radius %1 :" + +#Height +msgid "GEOM_HEIGHT" +msgstr "Height :" + +#Length +msgid "GEOM_LENGTH" +msgstr "Length is :" + +#Weight +msgid "GEOM_WEIGHT" +msgstr "Weight :" + +#Coordinates +msgid "GEOM_COORDINATES" +msgstr "Coordinates" + +#Coor. +msgid "GEOM_COOR" +msgstr "Coord. :" + +#Reverse +msgid "GEOM_REVERSE" +msgstr "Reverse" + +#Reverse U +msgid "GEOM_REVERSE_U" +msgstr "Reverse U" + +#Reverse V +msgid "GEOM_REVERSE_V" +msgstr "Reverse V" + +#Angle +msgid "GEOM_ANGLE" +msgstr "Angle :" + +#Axis +msgid "GEOM_AXIS" +msgstr "Axis" + +#Matrix +msgid "GEOM_MATRIX" +msgstr "Matrix :" + +#Vector Length +msgid "GEOM_VECTOR_LENGTH" +msgstr "Vector Length :" + +#Reverse Vector +msgid "GEOM_REVERSE_VECTOR" +msgstr "Reverse Vector" + +#Point Mirror +msgid "GEOM_POINT_MIRROR" +msgstr "Point Mirror" + +#Axe Mirror +msgid "GEOM_AXE_MIRROR" +msgstr "Axe Mirror" + +#Plane Mirror +msgid "GEOM_PLANE_MIRROR" +msgstr "Plane Mirror" + +#Face Selection +msgid "GEOM_FACE_SELECTION" +msgstr "Face Selection" + +#Base +msgid "GEOM_BASE" +msgstr "Base" + +#Water Density +msgid "GEOM_WATER_DENSITY" +msgstr "Water Density :" + +#Meshing Deflection +msgid "GEOM_MESHING_DEFLECTION" +msgstr "Meshing Deflect. :" + +#Dimensions +msgid "GEOM_DIMENSIONS" +msgstr "Dimensions" + +#Precision +msgid "GEOM_PRECISION" +msgstr "Precision :" + +#Selection +msgid "GEOM_SELECTION" +msgstr "Selection" + +#Nb. Times +msgid "GEOM_NB_TIMES" +msgstr "Nb. Times :" + +#Nb. Times U +msgid "GEOM_NB_TIMES_U" +msgstr "Nb. Times U :" + +#Nb. Times V +msgid "GEOM_NB_TIMES_V" +msgstr "Nb. Times V :" + +#Step +msgid "GEOM_STEP" +msgstr "Step :" + +#Step V +msgid "GEOM_STEP_V" +msgstr "Step V :" + +#Step U +msgid "GEOM_STEP_U" +msgstr "Step U :" + +# +#============================================================================== +# + +#Partition +msgid "GEOM_PARTITION" +msgstr "Partition" + +#Half-space partition +msgid "GEOM_PARTITION_HALFSPACE" +msgstr "Half-space partition" + +#Tolerance +msgid "GEOM_TOLERANCE" +msgstr "Tolerance" + +#Orientation +msgid "GEOM_ORIENTATION" +msgstr "Orientation" + +#Pipe +msgid "GEOM_PIPE" +msgstr "Pipe" + +#Revolution +msgid "GEOM_REVOLUTION" +msgstr "Revolution" + +#Rotation +msgid "GEOM_ROTATION" +msgstr "Rotation" + +#Archimede +msgid "GEOM_ARCHIMEDE" +msgstr "Archimede" + +#Common +msgid "GEOM_COMMON" +msgstr "Common" + +#Cut +msgid "GEOM_CUT" +msgstr "Cut" + +#Distance +msgid "GEOM_DISTANCE" +msgstr "Distance" + +#Filling +msgid "GEOM_FILLING" +msgstr "Filling" + +#Fuse +msgid "GEOM_FUSE" +msgstr "Fuse" + +#Scale +msgid "GEOM_SCALE" +msgstr "Scale" + +#Position +msgid "GEOM_POSITION" +msgstr "Location" + +#Offset +msgid "GEOM_OFFSET" +msgstr "Offset" + +#Section +msgid "GEOM_SECTION" +msgstr "Section" + +#Sewing +msgid "GEOM_SEWING" +msgstr "Sewing" + +#Translation +msgid "GEOM_TRANSLATION" +msgstr "Translation" + +#Working Plane +msgid "GEOM_WPLANE" +msgstr "Working Plane" + +#Mirror +msgid "GEOM_MIRROR" +msgstr "Mirror" + +#Prism +msgid "GEOM_PRISM" +msgstr "Prism" + +#Sub Shapes +msgid "GEOM_SUB_SHAPE" +msgstr "Sub Shapes" + +#Supress Face +msgid "GEOM_SUPRESSFACE" +msgstr "Supress Face" + +#Fillet +msgid "GEOM_FILLET" +msgstr "Fillet" + +#Chamfer +msgid "GEOM_CHAMFER" +msgstr "Chamfer" + +#Check Shape +msgid "GEOM_CHECK_SHAPE" +msgstr "Check Shape" + +#Check Blocks Compound +msgid "GEOM_CHECK_BLOCKS_COMPOUND" +msgstr "Check Blocks Compound" + +#Check Blocks Compound Errors +msgid "GEOM_CHECK_BLOCKS_COMPOUND_ERRORS" +msgstr "Errors" + +#Check Blocks Compound Errors +msgid "GEOM_CHECK_BLOCKS_COMPOUND_HAS_NO_ERRORS" +msgstr "The Compound of Blocks has no errors" + +msgid "GEOM_CHECK_BLOCKS_COMPOUND_HAS_ERRORS" +msgstr "The Compound of Blocks has errors" + +#Check Blocks Compound SubShapes +msgid "GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES" +msgstr "Incriminated Sub-Shapes" + +#Whatis +msgid "GEOM_WHATIS" +msgstr "Whatis" + +#Bounding Box +msgid "GEOM_BNDBOX" +msgstr "Bounding Box" + +#Center Of Mass +msgid "GEOM_CMASS" +msgstr "Center Of Mass" + +#Basic Properties +msgid "GEOM_PROPERTIES" +msgstr "Basic Properties" + +#Multi-Translation +msgid "GEOM_MULTITRANSLATION" +msgstr "Multi-Translation" + +#Multi-Rotation +msgid "GEOM_MULTIROTATION" +msgstr "Multi-Rotation" + +# +#============================================================================== +# + +#Arc +msgid "GEOM_ARC" +msgstr "Arc" + +#Box +msgid "GEOM_BOX" +msgstr "Box" + +#Circle +msgid "GEOM_CIRCLE" +msgstr "Circle" + +#Ellipse +msgid "GEOM_ELLIPSE" +msgstr "Ellipse" + +msgid "GEOM_ELLIPSE_TITLE" +msgstr "Ellipse Construction" + +#Radius major +msgid "GEOM_RADIUS_MAJOR" +msgstr "Major radius :" + +#Radius minor +msgid "GEOM_RADIUS_MINOR" +msgstr "Minor radius :" + +#Compound +msgid "GEOM_COMPOUND" +msgstr "Compound" + +#CompSolid +msgid "GEOM_COMPOUNDSOLID" +msgstr "CompSolid" + +#Cone +msgid "GEOM_CONE" +msgstr "Cone" + +#Cylinder +msgid "GEOM_CYLINDER" +msgstr "Cylinder" + +#Edge +msgid "GEOM_EDGE" +msgstr "Edge" + +#Face +msgid "GEOM_FACE" +msgstr "Face" + +#Faces +msgid "GEOM_FACES" +msgstr "Faces" + +#Line +msgid "GEOM_LINE" +msgstr "Line" + +#Plane +msgid "GEOM_PLANE" +msgstr "Plane" + +#Shape +msgid "GEOM_SHAPE" +msgstr "Shape" + +#Shell +msgid "GEOM_SHELL" +msgstr "Shell" + +#Shells +msgid "GEOM_SHELLS" +msgstr "Shells" + +#Solid +msgid "GEOM_SOLID" +msgstr "Solid" + +#Sphere +msgid "GEOM_SPHERE" +msgstr "Sphere" + +#Conical Face +msgid "GEOM_SURFCONE" +msgstr "Conical Face" + +#Cylindrical Face +msgid "GEOM_SURFCYLINDER" +msgstr "Cylindrical Face" + +#Spherical Face +msgid "GEOM_SURFSPHERE" +msgstr "Spherical Face" + +#Toroidal Face +msgid "GEOM_SURFTORUS" +msgstr "Toroidal Face" + +#Torus +msgid "GEOM_TORUS" +msgstr "Torus" + +#Vector +msgid "GEOM_VECTOR" +msgstr "Vector" + +#Vector U +msgid "GEOM_VECTOR_U" +msgstr "Vector U" + +#Vector V +msgid "GEOM_VECTOR_V" +msgstr "Vector V" + +#Vertex +msgid "GEOM_VERTEX" +msgstr "Vertex" + +#Wire +msgid "GEOM_WIRE" +msgstr "Wire" + +#Wire(s) +msgid "GEOM_WIRES" +msgstr "Wire(s)" + +#Wires +msgid "GEOM_WIREZ" +msgstr "Wires" + +msgid "GEOM_IMPORT" +msgstr "Imported_Shape" + +#Parameter +msgid "GEOM_PARAMETER" +msgstr "Parameter :" + +# +#============================================================================== +# + +#Min +msgid "GEOM_MIN" +msgstr "Min :" + +#Max +msgid "GEOM_MAX" +msgstr "Max :" + +#X +msgid "GEOM_X" +msgstr "X :" + +#Y +msgid "GEOM_Y" +msgstr "Y :" + +#Z +msgid "GEOM_Z" +msgstr "Z :" + +#DX +msgid "GEOM_DX" +msgstr "Dx :" + +#DY +msgid "GEOM_DY" +msgstr "Dy :" + +#DZ +msgid "GEOM_DZ" +msgstr "Dz :" + +#D1 +msgid "GEOM_D1" +msgstr "D1 :" + +#D2 +msgid "GEOM_D2" +msgstr "D2 :" + +# +#============================================================================== +# + +#: GeometryGUI.cxx +msgid "GEOM_STEP_TITLE" +msgstr "Step value for GUI constructions" + +#: GeometryGUI_ArcDlg.cxx:45 +msgid "GEOM_ARC_TITLE" +msgstr "Arc Construction" + +#: GeometryGUI_ArchimedeDlg.cxx:55 +msgid "GEOM_ARCHIMEDE_TITLE" +msgstr "Archimede Construction" + +#: GeometryGUI_BndBoxDlg.cxx:59 +msgid "GEOM_BNDBOX_TITLE" +msgstr "Bounding Box Informations" + +#: GeometryGUI_BndBoxDlg.cxx:82 +msgid "GEOM_BNDBOX_OBJDIM" +msgstr "Object And Its Dimensions" + +#: GeometryGUI_BoxDlg.cxx:50 +msgid "GEOM_BOX_TITLE" +msgstr "Box Construction" + +#: GeometryGUI_BoxDlg.cxx:50 +msgid "GEOM_BOX_OBJ" +msgstr "Dimensions At Origin" + +#: GeometryGUI_ChamferDlg.cxx:58 +msgid "GEOM_CHAMFER_TITLE" +msgstr "Chamfer Construction" + +#: GeometryGUI_ChamferDlg.cxx:58 +msgid "GEOM_CHAMFER_ALL" +msgstr "Chamfer On Whole Shape" + +#: GeometryGUI_ChamferDlg.cxx:58 +msgid "GEOM_CHAMFER_EDGES" +msgstr "Chamfer On Edges From Shape" + +#: GeometryGUI_ChamferDlg.cxx:58 +msgid "GEOM_CHAMFER_FACES" +msgstr "Chamfer On Faces From Shape" + +#: GeometryGUI_CircleDlg.cxx:48 +msgid "GEOM_CIRCLE_TITLE" +msgstr "Circle Construction" + +#: GeometryGUI_CenterMassDlg.cxx:77 +msgid "GEOM_CMASS_TITLE" +msgstr "Center Of Mass Construction" + +msgid "GEOM_PLANE_SIZE" +msgstr "Size of plane :" + +#: GeometryGUI_CommonDlg.cxx:47 +msgid "GEOM_COMMON_TITLE" +msgstr "BOOLEAN : Common Of Two Objects" + +#: GeometryGUI_CompoundDlg.cxx:44 +msgid "GEOM_COMPOUND_TITLE" +msgstr "Create A Compound" + +#: GeometryGUI_ConeDlg.cxx:49 +msgid "GEOM_CONE_TITLE" +msgstr "Cone Construction" + +#: GeometryGUI_CutDlg.cxx:48 +msgid "GEOM_CUT_TITLE" +msgstr "BOOLEAN : Cut Of Two Objects" +# +#: GeometryGUI_CylinderDlg.cxx:47 +msgid "GEOM_CYLINDER_TITLE" +msgstr "Cylinder Construction" + +#: GeometryGUI_CheckShape.cxx:60 +msgid "GEOM_CHECK_TITLE" +msgstr "Check Shape Informations" + +#: MeasureGUI_CheckCompoundOfBlocks.cxx:61 +msgid "GEOM_CHECK_COMPOUND_BLOCKS_TITLE" +msgstr "Check Blocks Compound" + +#: GeometryGUI_CheckShape.cxx:83 +msgid "GEOM_CHECK_INFOS" +msgstr "Object And Its Topological Informations" + +#: GeometryGUI_DistanceDlg.cxx:57 +msgid "GEOM_MINDIST_TITLE" +msgstr "Minimun Distance Between Two Objects" + +#: GeometryGUI_DistanceDlg.cxx:57 +msgid "GEOM_MINDIST_OBJ" +msgstr "Objects And Results" + +#: GeometryGUI_EdgeDlg.cxx:47 +msgid "GEOM_EDGE_TITLE" +msgstr "Create An Edge" + +#: GeometryGUI_FilletDlg.cxx:58 +msgid "GEOM_FILLET_TITLE" +msgstr "Fillet Construction" + +#: GeometryGUI_FilletDlg.cxx:58 +msgid "GEOM_FILLET_ALL" +msgstr "Fillet On Whole Shape" + +#: GeometryGUI_FilletDlg.cxx:58 +msgid "GEOM_FILLET_EDGES" +msgstr "Fillet On Edges From Shape" + +#: GeometryGUI_FilletDlg.cxx:58 +msgid "GEOM_FILLET_FACES" +msgstr "Fillet On Faces From Shape" + +#: GeometryGUI_FaceDlg.cxx:49 +msgid "GEOM_FACE_TITLE" +msgstr "Create A Face" + +#: GeometryGUI_FaceDlg.cxx:78 +msgid "GEOM_FACE_FFW" +msgstr "Face from a wire" + +#: GeometryGUI_FaceDlg.cxx:103 +msgid "GEOM_FACE_OPT" +msgstr "Try to create a planar face" + +#: GeometryGUI_FillingDlg.cxx:53 +msgid "GEOM_FILLING_TITLE" +msgstr "Filling Surface With Curves" + +#: GeometryGUI_FillingDlg.cxx:112 +msgid "GEOM_FILLING_ARG" +msgstr "Arguments And Parameters" + +#: GeometryGUI_FillingDlg.cxx:128 +msgid "GEOM_FILLING_MIN_DEG" +msgstr "Min deg" + +#: GeometryGUI_FillingDlg.cxx:142 +msgid "GEOM_FILLING_MAX_DEG" +msgstr "Max deg" + +#: GeometryGUI_FillingDlg.cxx:150 +msgid "GEOM_FILLING_TOL_2D" +msgstr "Tol. 2D :" + +#: GeometryGUI_FillingDlg.cxx:170 +msgid "GEOM_FILLING_COMPOUND" +msgstr "Curves Comp." + +#: GeometryGUI_FillingDlg.cxx:184 +msgid "GEOM_FILLING_TOL_3D" +msgstr "Tol. 3D :" + +#: GeometryGUI_FillingDlg.cxx:192 +msgid "GEOM_FILLING_NB_ITER" +msgstr "Nb. Iter :" + +#: GeometryGUI_FuseDlg.cxx:48 +msgid "GEOM_FUSE_TITLE" +msgstr "BOOLEAN : Fuse Two Objects" + +#: GeometryGUI_InertiaDlg.cxx:42 +msgid "GEOM_INERTIA_TITLE" +msgstr "Calculs Of Inertia" + +#: GeometryGUI_InertiaDlg.cxx:50 +msgid "GEOM_INERTIA_CONSTR" +msgstr "Matrix And Moments Of Inertia" + +#: GeometryGUI_InertiaDlg.cxx:100 +msgid "GEOM_INERTIA_I" +msgstr "%1:1 :" + +#: GeometryGUI_InertiaDlg.cxx:182 +msgid "GEOM_INERTIA_IXYZ" +msgstr "IX & IY & IZ :" + +#: GeometryGUI_LineDlg.cxx:50 +msgid "GEOM_LINE_TITLE" +msgstr "Line Construction" + +#: GeometryGUI_MaxToleranceDlg.cxx:53 +msgid "GEOM_TOLERANCE_TITLE" +msgstr "Maximum Tolerance" + +#: GeometryGUI_MaxToleranceDlg.cxx:84 +msgid "GEOM_TOLERANCE_CONSTR" +msgstr "Object And Its Tolerances" + +#: GeometryGUI_MaxToleranceDlg.cxx:121 +msgid "GEOM_TOLERANCE_FACE" +msgstr "Face :" + +#: GeometryGUI_MaxToleranceDlg.cxx:138 +msgid "GEOM_TOLERANCE_EDGE" +msgstr "Edge :" + +#: GeometryGUI_MaxToleranceDlg.cxx:155 +msgid "GEOM_TOLERANCE_VERTEX" +msgstr "Vertex :" + +#: GeometryGUI_MirrorDlg.cxx:52 +msgid "GEOM_MIRROR_TITLE" +msgstr "Mirror An Object" + +#: GeometryGUI_OrientationDlg.cxx:46 +msgid "GEOM_ORIENTATION_TITLE" +msgstr "Change Orientation" + +#: GeometryGUI_OrientationDlg.cxx:134 +msgid "GEOM_ORIENTATION_OPT" +msgstr "Reverse orientation with normal vectors simulation" + +#: GeometryGUI_PartitionDlg.cxx:45 +msgid "GEOM_PARTITION_TITLE" +msgstr "Partition Of Object With Tool" + +#: GeometryGUI_PartitionDlg.cxx:45 +msgid "GEOM_KEEP_OBJECT" +msgstr "Keep Object" + +#: GeometryGUI_PartitionDlg.cxx:45 +msgid "GEOM_PARTITION_ORIENTATION" +msgstr "Change Orientation" + +#: GeometryGUI_PartitionDlg.cxx:45 +msgid "SUPPRESS_RESULT" +msgstr "Suppress Result" + +msgid "GEOM_REMOVE_WEBS" +msgstr "Remove webs" + +msgid "GEOM_SET_MATERIALS" +msgstr "Set materials" + +#: OperationGUI_MaterialDlg.cxx:45 +msgid "GEOM_MATERIAL_TITLE" +msgstr "Define materials for Dominant Fuse" + +msgid "GEOM_MATERIAL_SHAPE" +msgstr "Shapes" + +msgid "GEOM_MATERIAL_MATERIAL" +msgstr "Material" + +msgid "GEOM_MATERIAL_ID" +msgstr "Material ID:" + +msgid "GEOM_MATERIAL_SET" +msgstr "<< Set" + +#: GeometryGUI_PipeDlg.cxx:47 +msgid "GEOM_PIPE_TITLE" +msgstr "Pipe Construction" + +#: GeometryGUI_PointDlg.cxx:52 +msgid "GEOM_POINT_TITLE" +msgstr "Point Construction" + +#: GeometryGUI_PlaneDlg.cxx:60 +msgid "GEOM_PLANE_TITLE" +msgstr "Plane Construction" + +#: GeometryGUI_PlaneDlg.cxx:172 +msgid "GEOM_PLANE_PVC" +msgstr "Point + Coordinate Vector" + +#: GeometryGUI_PlaneDlg.cxx:133 +msgid "GEOM_PLANE_PV" +msgstr "Point + Vector" + +#: GeometryGUI_PrismDlg.cxx:54 +msgid "GEOM_PRISM_TITLE" +msgstr "Prism Construction" + +#: GeometryGUI_PrismDlg.cxx:83 +msgid "GEOM_PRISM_BSV" +msgstr "Base Shape + Vector" + +#: GeometryGUI_PropertiesDlg.cxx:56 +msgid "GEOM_PROPERTIES_TITLE" +msgstr "Basic Properties Informations" + +#: GeometryGUI_PropertiesDlg.cxx:78 +msgid "GEOM_PROPERTIES_CONSTR" +msgstr "Object And Its Properties" + +#: GeometryGUI_PropertiesDlg.cxx:114 +msgid "GEOM_PROPERTIES_SURFACE" +msgstr "Surface is :" + +#: GeometryGUI_PropertiesDlg.cxx:120 +msgid "GEOM_PROPERTIES_VOLUME" +msgstr "Volume is :" + +#: GeometryGUI_RevolDlg.cxx:49 +msgid "GEOM_REVOLUTION_TITLE" +msgstr "Construction By Revolution" + +#: GeometryGUI_RotationDlg.cxx:51 +msgid "GEOM_ROTATION_TITLE" +msgstr "Rotation Of An Object" + +#: GeometryGUI_ScaleDlg.cxx:52 +msgid "GEOM_SCALE_TITLE" +msgstr "Scale An Object" + +#: GeometryGUI_PositionDlg.cxx:52 +msgid "GEOM_POSITION_TITLE" +msgstr "Modify the Location of an Object" + +#: GeometryGUI_PositionDlg.cxx:52 +msgid "GEOM_START_LCS" +msgstr "Start LCS" + +#: GeometryGUI_PositionDlg.cxx:52 +msgid "GEOM_END_LCS" +msgstr "End LCS" + +#: GeometryGUI_OffsetDlg.cxx:53 +msgid "GEOM_OFFSET_TITLE" +msgstr "Offset Surface" + +#: GeometryGUI_ScaleDlg.cxx:117 +msgid "GEOM_SCALE_FACTOR" +msgstr "Scale Factor :" + +#: GeometryGUI_SectionDlg.cxx:50 +msgid "GEOM_SECTION_TITLE" +msgstr "BOOLEAN : Section Of Two Objects" + +#: GeometryGUI_SewingDlg.cxx:48 +msgid "GEOM_SEWING_TITLE" +msgstr "Topological sewing" + +#: GeometryGUI_ShellDlg.cxx:53 +msgid "GEOM_SHELL_TITLE" +msgstr "Shell Construction" + +#: GeometryGUI_SolidDlg.cxx:74 +msgid "GEOM_SOLID_TITLE" +msgstr "Solid Construction" + +#: GeometryGUI_SphereDlg.cxx:50 +msgid "GEOM_SPHERE_TITLE" +msgstr "Sphere Construction" + +#: GeometryGUI_SphereDlg.cxx:113 +msgid "GEOM_SPHERE_CR" +msgstr "Center + Radius" + +#: GeometryGUI_SphereDlg.cxx:146 +msgid "GEOM_SPHERE_RO" +msgstr "Radius At Origin" + +#: GeometryGUI_SubShapeDlg.cxx:55 +msgid "GEOM_SUBSHAPE_TITLE" +msgstr "Sub Shapes Selection" + +#: GeometryGUI_SubShapeDlg.cxx:131 +msgid "GEOM_SUBSHAPE_TYPE" +msgstr "Sub Shapes Type :" + +#: GeometryGUI_SubShapeDlg.cxx:137 +msgid "GEOM_SUBSHAPE_SELECT" +msgstr "Select Sub Shapes" + +msgid "EntityGUI_SubShapeDlg::NO_SUBSHAPES_SELECTED" +msgstr "Please, select one or more sub-shapes" + +#: GeometryGUI_TorusDlg.cxx:51 +msgid "GEOM_TORUS_TITLE" +msgstr "Torus Construction" + +#: GeometryGUI_SuppressFacesDlg.cxx:103 +msgid "GEOM_SUPRESSFACE_TITLE" +msgstr "Suppress Faces In An Object" + +#: GeometryGUI_SuppressFacesDlg.cxx:164 +msgid "GEOM_SUPRESSFACE_SELECT" +msgstr "Select Faces To Suppress" + +#: GeometryGUI_TranslationDlg.cxx:78 +msgid "GEOM_TRANSLATION_COOR" +msgstr "Translation With Coordinates" + +msgid "GEOM_TRANSPARENCY_TITLE" +msgstr "Transparency" + +msgid "GEOM_TRANSPARENCY_OPAQUE" +msgstr "Opaque" + +msgid "GEOM_TRANSPARENCY_TRANSPARENT" +msgstr "Transparent" + +msgid "GEOM_SUPPRESSHOLE_TITLE" +msgstr "Suppress holes" + +msgid "GEOM_SUPPRESSHOLE_SELECTFACE" +msgstr "Select the face with hole" + +msgid "GEOM_SUPPRESSHOLE_SELECTWIRE" +msgstr "Select wire on face" + +msgid "GEOM_SUPPRESSHOLE_SELECTFACE_END" +msgstr "Select end face (if hole traversing)" + +msgid "GEOM_SUPPRESSHOLE_SELECTWIRE_END" +msgstr "Select end wire (if hole traversing)" + +msgid "GEOM_SUPPRESSHOLE_FACE_SHELL" +msgstr "Face or shell" + +msgid "GEOM_SUPPRESSHOLE_SELECT_HOLES_ON_FACE" +msgstr "Select hole(s) on the face" + +#: GeometryGUI_TranslationDlg.cxx:56 +msgid "GEOM_TRANSLATION_TITLE" +msgstr "Translation Of An Object" + +#: GeometryGUI_VectorDlg.cxx:54 +msgid "GEOM_VECTOR_TITLE" +msgstr "Vector Construction" + +#: GeometryGUI_WhatisDlg.cxx:63 +msgid "GEOM_WHATIS_TITLE" +msgstr "Whatis Informations" + +#: GeometryGUI_WhatisDlg.cxx:86 +msgid "GEOM_WHATIS_OBJECT" +msgstr "Object And Its Topological Informations" + +#: GeometryGUI_WireDlg.cxx:46 +msgid "GEOM_WIRE_TITLE" +msgstr "Create A Wire" + +#: GeometryGUI_WireDlg.cxx:103 +msgid "GEOM_WIRE_CONNECT" +msgstr "Wire creation from wires/edges connected" + +#: GeometryGUI_WorkingPlaneDlg.cxx:50 +msgid "GEOM_WPLANE_TITLE" +msgstr "Working Plane Selection" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_FACE" +msgstr "Plane Or Planar Face" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_VECTOR" +msgstr "Select 2 vectors" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_VX" +msgstr "Vector X" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_VZ" +msgstr "Vector Z" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_ORIGIN" +msgstr "Select a plane" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_OYZ" +msgstr "OYZ" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_OZX" +msgstr "OZX" + +#: GeometryGUI_WorkingPlaneDlg.cxx:107 +msgid "GEOM_WPLANE_OXY" +msgstr "OXY" + +#: GeometryGUI_multiTranslationDlg.cxx:107 +msgid "GEOM_MULTITRANSLATION_TITLE" +msgstr "Multi-Translation" + +#: GeometryGUI_multiTranslationDlg.cxx:107 +msgid "GEOM_MULTITRANSLATION_SIMPLE" +msgstr "Multi Translation Simple" + +#: GeometryGUI_multiTranslationDlg.cxx:107 +msgid "GEOM_MULTITRANSLATION_DOUBLE" +msgstr "Multi Translation Double" + +#: GeometryGUI_multiRotationDlg.cxx:107 +msgid "GEOM_MULTIROTATION_TITLE" +msgstr "Multi-Rotation" + +#: GeometryGUI_multiRotationDlg.cxx:107 +msgid "GEOM_MULTIROTATION_SIMPLE" +msgstr "Multi Rotation Simple" + +#: GeometryGUI_multiRotationDlg.cxx:107 +msgid "GEOM_MULTIROTATION_DOUBLE" +msgstr "Multi Rotation Double" + +msgid "GEOM_PARAM_POINT" +msgstr "Parametric point" + +msgid "GEOM_REF_POINT" +msgstr "Point with reference" + +# +#============================================================================== +# + +#: GeometryGUI.cxx:4613 +msgid "GEOM_MEN_WIREFRAME" +msgstr "Wireframe" + +#: GeometryGUI.cxx:4613 +msgid "GEOM_MEN_SHADING" +msgstr "\nShading" + +msgid "GEOM_RECONSTRUCTION_LIMIT" +msgstr "Reconstruction Limit" + +msgid "GEOM_SUPPRESS_RESULT" +msgstr "Suppress Result" + +msgid "GEOM_SUPPRESS_RESULT_INSIDE" +msgstr "Inside" + +msgid "GEOM_SUPPRESS_RESULT_OUTSIDE" +msgstr "Outside" + +msgid "GEOM_RECONSTRUCTION_LIMIT_SHAPE" +msgstr "Shape" +msgid "GEOM_RECONSTRUCTION_LIMIT_SOLID" +msgstr "Solid" +msgid "GEOM_RECONSTRUCTION_LIMIT_SHELL" +msgstr "Shell" +msgid "GEOM_RECONSTRUCTION_LIMIT_FACE" +msgstr "Face" +msgid "GEOM_RECONSTRUCTION_LIMIT_WIRE" +msgstr "Wire" +msgid "GEOM_RECONSTRUCTION_LIMIT_EDGE" +msgstr "Edge" +msgid "GEOM_RECONSTRUCTION_LIMIT_VERTEX" +msgstr "Vertex" + +msgid "GEOM_SPLINE_TITLE" +msgstr "Spline Construction" +msgid "GEOM_SPLINE" +msgstr "Spline" +msgid "GEOM_BEZIER" +msgstr "Bezier" +msgid "GEOM_INTERPOL" +msgstr "Interpolation" + +# +#============================================================================== +# + +msgid "GEOM_SKETCHER_EL" +msgstr "Element Type" + +msgid "GEOM_BUT_CLOSE_SKETCH" +msgstr "Sketch Closure" + +msgid "GEOM_BUT_END_SKETCH" +msgstr "Sketch Validation" + +msgid "GEOM_SKETCHER_TITLE" +msgstr "Sketch Construction" + +msgid "GEOM_SKETCHER_POINT" +msgstr "Point" + +msgid "GEOM_SKETCHER_SEGMENT" +msgstr "Segment" + +msgid "GEOM_SKETCHER_ARC" +msgstr "Arc" + +msgid "GEOM_SKETCHER_DIR" +msgstr "Direction" + +msgid "GEOM_SKETCHER_POINT2" +msgstr "Point :" + +msgid "GEOM_SKETCHER_DEST" +msgstr "Destination" + +msgid "GEOM_SKETCHER_ABS" +msgstr "Absolute" + +msgid "GEOM_SKETCHER_REL" +msgstr "Relative" + +msgid "GEOM_SKETCHER_SEL" +msgstr "Selection" + +msgid "GEOM_SKETCHER_ANGLE" +msgstr "Angle" + +msgid "GEOM_SKETCHER_PER" +msgstr "Perpendicular" + +msgid "GEOM_SKETCHER_TAN" +msgstr "Tangent" + +msgid "GEOM_SKETCHER_VXVY" +msgstr "VX-VY" + +msgid "GEOM_SKETCHER_LENGTH" +msgstr "Length" + +msgid "GEOM_SKETCHER_X" +msgstr "X" + +msgid "GEOM_SKETCHER_Y" +msgstr "Y" + +msgid "GEOM_SKETCHER_X2" +msgstr "X :" + +msgid "GEOM_SKETCHER_Y2" +msgstr "Y :" + +msgid "GEOM_SKETCHER_X3" +msgstr "Abs. X :" + +msgid "GEOM_SKETCHER_Y3" +msgstr "Abs. Y :" + +msgid "GEOM_SKETCHER_DX2" +msgstr "DX :" + +msgid "GEOM_SKETCHER_DY2" +msgstr "DY :" + +msgid "GEOM_SKETCHER_VX2" +msgstr "VX :" + +msgid "GEOM_SKETCHER_VY2" +msgstr "VY :" + +msgid "GEOM_SKETCHER_LENGTH2" +msgstr "Length :" + +msgid "GEOM_SKETCHER_ANGLE2" +msgstr "Angle :" + +msgid "GEOM_SKETCHER_RADIUS2" +msgstr "Radius :" + +msgid "GEOM_SKETCHER_UNDO" +msgstr "Undo" + +msgid "GEOM_SKETCHER_APPLY" +msgstr "Apply" + +msgid "GEOM_SKETCHER_VALUES" +msgstr "Values" + +msgid "GEOM_SKETCHER_TYPE" +msgstr "Type" + +msgid "EntityGUI_SketcherDlg::CANNOT_CLOSE" +msgstr "It is impossible to close sketch\nNumber of sketch points too small" + +msgid "GEOM_FILLET_ABORT" +msgstr "Fillet can't be computed with radius %1" + +msgid "GEOM_CHAMFER_ABORT" +msgstr "Chamfer can't be computed with %1 and %2" + +msgid "GEOM_3_POINTS" +msgstr "3 points" + +msgid "GEOM_POINT1" +msgstr "Point 1" + +msgid "GEOM_POINT2" +msgstr "Point 2" + +msgid "GEOM_POINT3" +msgstr "Point 3" + +msgid "GEOM_CREATE_COPY" +msgstr "Create a copy" + +msgid "GEOM_CREATE_SINGLE_SOLID" +msgstr "Create a single solid" + +msgid "GEOM_ERROR" +msgstr "Error" + +msgid "GEOM_ERROR_STATUS" +msgstr "Operation status" + +msgid "GEOM_ELLIPSE_ERROR_1" +msgstr "Error creating ellipse. Reason: minor radius is greater than major radius." + +msgid "GEOM_CURVE" +msgstr "Curve" + +msgid "GEOM_POLYLINE" +msgstr "Polyline" + +msgid "GEOM_NODES" +msgstr "Nodes" + +msgid "GEOM_CURVE_TITLE" +msgstr "Curve Construction" + +# ShapeProcessDlg.cxx +msgid "GEOM_SHAPEPROCESS_TITLE" +msgstr "Shape Processing" + +msgid "GEOM_SHAPES" +msgstr "Shapes" + +msgid "GEOM_SELECTED_OBJECTS" +msgstr "Selected objects" + +msgid "GEOM_OPERATIONS" +msgstr "Operations" + +msgid "GEOM_PARAMETERS" +msgstr "Parameters" + +msgid "GEOM_FixShape" +msgstr "FixShape" + +msgid "GEOM_FixFaceSize" +msgstr "FixFaceSize" + +msgid "GEOM_DropSmallEdges" +msgstr "DropSmallEdges" + +msgid "GEOM_SplitAngle" +msgstr "SplitAngle" + +msgid "GEOM_SplitClosedFaces" +msgstr "SplitClosedFaces" + +msgid "GEOM_SplitContinuity" +msgstr "SplitContinuity" + +msgid "GEOM_BSplineRestriction" +msgstr "BSplineRestriction" + +msgid "GEOM_ToBezier" +msgstr "ToBezier" + +msgid "GEOM_SameParameter" +msgstr "SameParameter" + +msgid "GEOM_3D_TOLERANCE" +msgstr "3D tolerance" + +msgid "GEOM_MAX_3D_TOLERANCE" +msgstr "Max 3D tolerance" + +msgid "GEOM_MAX_TOLERANCE" +msgstr "Max tolerance" + +msgid "GEOM_ANGLE_1" +msgstr "Angle" + +msgid "GEOM_NUM_SPLIT_POINTS" +msgstr "Number of splitting points" + +msgid "GEOM_SURFACE_CONTINUTY" +msgstr "Surface continuity" + +msgid "GEOM_CURVE_CONTINUTY" +msgstr "Curve continuity" + +msgid "GEOM_SURFACE_MODE" +msgstr "Surface mode" + +msgid "GEOM_3D_CURVE_MODE" +msgstr "3D curve mode" + +msgid "GEOM_2D_CURVE_MODE" +msgstr "2D curve mode" + +msgid "GEOM_2D_TOLERANCE" +msgstr "2D tolerance" + +msgid "GEOM_REQUIRED_DEGREE" +msgstr "Required degree" + +msgid "GEOM_REQUIRED_NUM_SEGMENTS" +msgstr "Required number of segments" + +msgid "GEOM_3D_CONTINUTY" +msgstr "3D continuity" + +msgid "GEOM_2D_CONTINUTY" +msgstr "2D continuity" + +msgid "GEOM_CLOSECONTOUR_TITLE" +msgstr "Close contour" + +msgid "GEOM_ERR_LIB_NOT_FOUND" +msgstr "GUI library corresponding to the user action can not be found or loaded" + +msgid "OperationGUI_ChamferDlg::FACE_1" +msgstr "Face 1" + +msgid "OperationGUI_ChamferDlg::FACE_2" +msgstr "Face 2" + +msgid "OperationGUI_ChamferDlg::SELECTED_FACES" +msgstr "Selected faces" + +msgid "OperationGUI_ChamferDlg::D" +msgstr "D" + +msgid "OperationGUI_FilletDlg::SELECTED_EDGES" +msgstr "Selected edges" + +msgid "OperationGUI_FilletDlg::SELECTED_FACES" +msgstr "Selected faces" + +msgid "GEOM_REMOVE_INTERNAL_WIRES_TITLE" +msgstr "Suppress internal wires" + +msgid "GEOM_INTERNAL_WIRES" +msgstr "Internal wires" + +msgid "GEOM_SELECTED_FACE" +msgstr "Selected face" + +msgid "GEOM_REMOVE_ALL_INT_WIRES" +msgstr "Remove all internal wires" + +msgid "GEOM_REMOVE_HOLES_TITLE" +msgstr "Suppress holes" + +msgid "GEOM_SELECTED_SHAPE" +msgstr "Selected shape" + +msgid "GEOM_REMOVE_ALL_HOLES" +msgstr "Remove all holes" + +msgid "GEOM_HOLES" +msgstr "Holes" + +msgid "GEOM_WIRES_TO_REMOVE" +msgstr "Wires to remove" + +msgid "GEOM_DETECT" +msgstr "Detect" + +msgid "GEOM_FREE_BOUNDARIES" +msgstr "Free boundaries" + +msgid "GEOM_FREE_FACES" +msgstr "Free faces" + +msgid "GEOM_BY_PARAMETER" +msgstr "By parameter" + +msgid "GEOM_BY_LENGTH" +msgstr "By length" + +msgid "GEOM_DIVIDE_EDGE_TITLE" +msgstr "Addition of point" + +msgid "GEOM_ADD_POINT" +msgstr "Add point" + +msgid "GEOM_VALUE" +msgstr "Value" + +msgid "GEOM_MARKER_TITLE" +msgstr "Create marker" + +msgid "GEOM_MARKER" +msgstr "Marker" + +msgid "GEOM_TRIHEDRON" +msgstr "Trihedron" + +msgid "GEOM_FREE_BOUNDS_MSG" +msgstr "Number of free boundaries detected: %1 (%2 closed, %3 open)" + +msgid "GEOM_FREE_BOUNDS_ERROR" +msgstr "Object is not selected" + +msgid "GEOM_FREE_BOUNDS_TLT" +msgstr "Free boundary detection" + +msgid "RepairGUI_FreeBoundDlg::CAPTION" +msgstr "Check free boundaries" + +msgid "RepairGUI_FreeBoundDlg::FREE_BOUND" +msgstr "Free boundaries" + +msgid "RepairGUI_FreeBoundDlg::NUMBER_CLOSED" +msgstr "Number of closed free boundaries: " + +msgid "RepairGUI_FreeBoundDlg::NUMBER_OPEN" +msgstr "Number of open free boundaries: " + +msgid "RepairGUI_ShapeProcessDlg::ERROR_NO_OPERATORS" +msgstr "Please, select at least one Shape Process operation to proceed." + +msgid "RepairGUI_ShapeProcessDlg::ERROR_NO_OBJECTS" +msgstr "Please, select a geometrical object for Shape Processing." + +msgid "RepairGUI_ShapeProcessDlg::TIME_CONSUMING" +msgstr "Enabling this option may result in a very time-consuming operation for some input shapes.\nWould you like to continue?" + +msgid "MeasureGUI_PointDlg::POINT" +msgstr "Point" + +msgid "MeasureGUI_PointDlg::X" +msgstr "X" + +msgid "MeasureGUI_PointDlg::Y" +msgstr "Y" + +msgid "MeasureGUI_PointDlg::Z" +msgstr "Z" + +msgid "MeasureGUI_PointDlg::CAPTION" +msgstr "Point Coordinates" + +msgid "MeasureGUI_PointDlg::COORDINATES" +msgstr "Point and its coordinates" + +msgid "GroupGUI_GroupDlg::CREATE_GROUP_TITLE" +msgstr "Create Group" + +msgid "GroupGUI_GroupDlg::EDIT_GROUP_TITLE" +msgstr "Edit Group" + +msgid "GroupGUI_GroupDlg::SHAPE_TYPE" +msgstr "Shape Type" + +msgid "GroupGUI_GroupDlg::GROUP_NAME" +msgstr "Group Name" + +msgid "GroupGUI_GroupDlg::MAIN_SUB_SHAPES" +msgstr "Main Shape And Sub-Shapes" + +msgid "GroupGUI_GroupDlg::MAIN_SHAPE" +msgstr "Main Shape" + +msgid "GroupGUI_GroupDlg::SELECT_SUB_SHAPES" +msgstr "Select Sub-Shapes" + +msgid "GroupGUI_GroupDlg::SELECT_ALL" +msgstr "Select All" + +msgid "GroupGUI_GroupDlg::ADD" +msgstr "Add" + +msgid "GroupGUI_GroupDlg::REMOVE" +msgstr "Remove" + +msgid "GroupGUI_GroupDlg::GROUP_PREFIX" +msgstr "Group" + +msgid "GroupGUI_GroupDlg::EMPTY_NAME" +msgstr "Please, specify a non-empty group name" + +msgid "GroupGUI_GroupDlg::NO_MAIN_OBJ" +msgstr "Please, select a main shape" + +msgid "GroupGUI_GroupDlg::NO_GROUP" +msgstr "Please, select a group to edit" + +msgid "GroupGUI_GroupDlg::EMPTY_LIST" +msgstr "Please, select one or more sub-shapes to put into the group" + +msgid "GroupGUI::NO_GROUP" +msgstr "Please, select a group to edit" + +msgid "_S_" +msgstr "(s)" + +### BlocksGUI ### + +msgid "WRN_NOT_IMPLEMENTED" +msgstr "Sorry, this functionality is not yet implemented" + +### BlocksGUI_TrsfDlg ### + +msgid "BlocksGUI_TrsfDlg::FACE_1" +msgstr "Face 1" + +msgid "BlocksGUI_TrsfDlg::FACE_2" +msgstr "Face 2" + +msgid "BlocksGUI_TrsfDlg::FACE_1U" +msgstr "Face 1 U" + +msgid "BlocksGUI_TrsfDlg::FACE_2U" +msgstr "Face 2 U" + +msgid "BlocksGUI_TrsfDlg::FACE_1V" +msgstr "Face 1 V" + +msgid "BlocksGUI_TrsfDlg::FACE_2V" +msgstr "Face 2 V" + +msgid "GEOM_BLOCK_MULTITRSF_TITLE" +msgstr "Block Multi-Transformation" + +msgid "GEOM_BLOCK_MULTITRSF" +msgstr "Block Multi-Transformation" + +msgid "GEOM_BLOCK_MULTITRSF_SIMPLE" +msgstr "Multi-Transformation Simple" + +msgid "GEOM_BLOCK_MULTITRSF_DOUBLE" +msgstr "Multi-Transformation Double" + +### BlocksGUI_QuadFaceDlg ### + +msgid "BlocksGUI_QuadFaceDlg::VERTEX_1" +msgstr "Vertex 1" + +msgid "BlocksGUI_QuadFaceDlg::VERTEX_2" +msgstr "Vertex 2" + +msgid "BlocksGUI_QuadFaceDlg::VERTEX_3" +msgstr "Vertex 3" + +msgid "BlocksGUI_QuadFaceDlg::VERTEX_4" +msgstr "Vertex 4" + +msgid "BlocksGUI_QuadFaceDlg::EDGE_1" +msgstr "Edge 1" + +msgid "BlocksGUI_QuadFaceDlg::EDGE_2" +msgstr "Edge 2" + +msgid "BlocksGUI_QuadFaceDlg::EDGE_3" +msgstr "Edge 3" + +msgid "BlocksGUI_QuadFaceDlg::EDGE_4" +msgstr "Edge 4" + +msgid "GEOM_QUAD_FACE_TITLE" +msgstr "Quadrangle Face Construction" + +msgid "GEOM_QUAD_FACE" +msgstr "Quadrangle Face" + +### BlocksGUI_BlockDlg ### + +msgid "BlocksGUI_BlockDlg::FACE_1" +msgstr "Face 1" + +msgid "BlocksGUI_BlockDlg::FACE_2" +msgstr "Face 2" + +msgid "BlocksGUI_BlockDlg::FACE_3" +msgstr "Face 3" + +msgid "BlocksGUI_BlockDlg::FACE_4" +msgstr "Face 4" + +msgid "BlocksGUI_BlockDlg::FACE_5" +msgstr "Face 5" + +msgid "BlocksGUI_BlockDlg::FACE_6" +msgstr "Face 6" + +msgid "GEOM_BLOCK_TITLE" +msgstr "Hexahedral Solid Construction" + +msgid "GEOM_BLOCK" +msgstr "Hexahedral Solid" + +#============================================================================== + +msgid "BasicGUI_MarkerDlg::CAPTION" +msgstr "Local CS Construction" + +msgid "BasicGUI_MarkerDlg::LOCALCS" +msgstr "Local coordinate system" + +msgid "BasicGUI_MarkerDlg::ORIGIN" +msgstr "Coordinates of origin" + +msgid "BasicGUI_MarkerDlg::XDIR" +msgstr "X axis direction" + +msgid "BasicGUI_MarkerDlg::YDIR" +msgstr "Y axis direction" + +msgid "BasicGUI_MarkerDlg::DX" +msgstr "Dx" + +msgid "BasicGUI_MarkerDlg::DY" +msgstr "Dy" + +msgid "BasicGUI_MarkerDlg::DZ" +msgstr "Dz" + +msgid "BasicGUI_MarkerDlg::LCS_NAME" +msgstr "LocalCS" + +msgid "BasicGUI_MarkerDlg::VEC_PARALLEL" +msgstr "Coordinate system axes cannot be parallel" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +======= + +### BlocksGUI_ExplodeDlg ### + +msgid "BlocksGUI_ExplodeDlg::NB_FACES_MIN" +msgstr "Min. nb. faces" + +msgid "BlocksGUI_ExplodeDlg::NB_FACES_MAX" +msgstr "Max. nb. faces" + +msgid "GEOM_BLOCK_EXPLODE_TITLE" +msgstr "Sub Blocks Selection" + +msgid "GEOM_BLOCK_EXPLODE" +msgstr "Sub Blocks" + +msgid "GEOM_NB_BLOCKS_NO_OTHERS" +msgstr "There are %1 specified blocks and NO other solids" + +msgid "GEOM_NB_BLOCKS_SOME_OTHERS" +msgstr "There are %1 specified blocks and some other solids" + +msgid "ShHealOper_NotError_msg" +msgstr "Shape Healing algorithm has done no modification of the original shape" + +msgid "ShHealOper_InvalidParameters_msg" +msgstr "Incorrect parameters for Shape Healing algorithm" + +msgid "ShHealOper_ErrorExecution_msg" +msgstr "Shape Healing algorithm failed" + +msgid "GEOM_GLUE_TITLE" +msgstr "Glue faces" + +msgid "GEOM_GLUE" +msgstr "Glue" + +msgid "GEOM_FREE_FACES_TITLE" +msgstr "Free faces" + +### New object names for RepairGUI ### +msgid "SEWING_NEW_OBJ_NAME" +msgstr "Sewing" + +msgid "DEVIDE_EDGE_NEW_OBJECT_NAME" +msgstr "NewObject" + +msgid "CLOSE_CONTOUR_NEW_OBJ_NAME" +msgstr "CloseContour" + +msgid "REMOVE_HOLES_NEW_OBJ_NAME" +msgstr "SupressHoles" + +msgid "GLUE_NEW_OBJ_NAME" +msgstr "Glue" + +msgid "REMOVE_INT_WIRES_NEW_OBJ_NAME" +msgstr "RemoveIntWires" + +msgid "PROCESS_SHAPE_NEW_OBJ_NAME" +msgstr "ProcessShape" + +msgid "SUPRESS_FACE_NEW_OBJ_NAME" +msgstr "SupressFaces" + +msgid "NON_GEOM_OBJECTS_SELECTED" +msgstr "There are objects selected which do not belong to %1 component." + +msgid "GEOM_PROPAGATE_TITLE" +msgstr "Propagate" + +msgid "GEOM_PROPAGATE" +msgstr "Propagate" + +### Menu of GEOM module ### +msgid "MEN_FILE" +msgstr "File" + +msgid "TOP_IMPORT" +msgstr "Import geometry from BREP file" + +msgid "MEN_IMPORT" +msgstr "Import..." + +msgid "STB_IMPORT" +msgstr "Import geometry from BREP file" + +msgid "TOP_EXPORT" +msgstr "Export geometry to BREP file" + +msgid "MEN_EXPORT" +msgstr "Export..." + +msgid "STB_EXPORT" +msgstr "Export geometry to BREP file" + +msgid "MEN_EDIT" +msgstr "Edit" + +msgid "TOP_DELETE" +msgstr "Delete object" + +msgid "MEN_DELETE" +msgstr "Delete" + +msgid "STB_DELETE" +msgstr "Delete object" + +msgid "MEN_NEW_ENTITY" +msgstr "New Entity" + +msgid "MEN_BASIC" +msgstr "Basic" + +msgid "TOP_POINT" +msgstr "Create a point" + +msgid "MEN_POINT" +msgstr "Point" + +msgid "STB_POINT" +msgstr "Create a point" + +msgid "TOP_LINE" +msgstr "Create a line" + +msgid "MEN_LINE" +msgstr "Line" + +msgid "STB_LINE" +msgstr "Create a line" + +msgid "TOP_CIRCLE" +msgstr "Create a circle" + +msgid "MEN_CIRCLE" +msgstr "Circle" + +msgid "STB_CIRCLE" +msgstr "Create a circle" + +msgid "TOP_ELLIPSE" +msgstr "Create an ellipse" + +msgid "MEN_ELLIPSE" +msgstr "Ellipse" + +msgid "STB_ELLIPSE" +msgstr "Create an ellipse" + +msgid "TOP_ARC" +msgstr "Create an arc" + +msgid "MEN_ARC" +msgstr "Arc" + +msgid "STB_ARC" +msgstr "Create an arc" + +msgid "TOP_CURVE" +msgstr "Create a curve" + +msgid "MEN_CURVE" +msgstr "Curve" + +msgid "STB_CURVE" +msgstr "Create a curve" + +msgid "TOP_VECTOR" +msgstr "Create a vector" + +msgid "MEN_VECTOR" +msgstr "Vector" + +msgid "STB_VECTOR" +msgstr "Create a vector" + +msgid "TOP_PLANE" +msgstr "Create a plane" + +msgid "MEN_PLANE" +msgstr "Plane" + +msgid "STB_PLANE" +msgstr "Create a plane" + +msgid "TOP_WORK_PLANE" +msgstr "Create a working plane" + +msgid "MEN_WORK_PLANE" +msgstr "Working plane" + +msgid "STB_WORK_PLANE" +msgstr "Create a working plane" + +msgid "TOP_LOCAL_CS" +msgstr "Create a local coordinate system" + +msgid "MEN_LOCAL_CS" +msgstr "Local coordinate system" + +msgid "STB_LOCAL_CS" +msgstr "Create a local coordinate system" + +msgid "MEN_PRIMITIVES" +msgstr "Primitives" + +msgid "TOP_BOX" +msgstr "Create a box" + +msgid "MEN_BOX" +msgstr "Box" + +msgid "STB_BOX" +msgstr "Create a box" + +msgid "TOP_CYLINDER" +msgstr "Create a cylinder" + +msgid "MEN_CYLINDER" +msgstr "Cylinder" + +msgid "STB_CYLINDER" +msgstr "Create a cylinder" + +msgid "TOP_SPHERE" +msgstr "Create a sphere" + +msgid "MEN_SPHERE" +msgstr "Sphere" + +msgid "STB_SPHERE" +msgstr "Create a sphere" + +msgid "TOP_TORUS" +msgstr "Create a torus" + +msgid "MEN_TORUS" +msgstr "Torus" + +msgid "STB_TORUS" +msgstr "Create a torus" + +msgid "TOP_CONE" +msgstr "Create a cone" + +msgid "MEN_CONE" +msgstr "Cone" + +msgid "STB_CONE" +msgstr "Create a cone" + +msgid "MEN_GENERATION" +msgstr "Generation" + +msgid "TOP_EXTRUSION" +msgstr "Create an extrusion" + +msgid "MEN_EXTRUSION" +msgstr "Extrusion" + +msgid "STB_EXTRUSION" +msgstr "Create an extrusion" + +msgid "TOP_REVOLUTION" +msgstr "Create a revolution" + +msgid "MEN_REVOLUTION" +msgstr "Revolution" + +msgid "STB_REVOLUTION" +msgstr "Create a revolution" + +msgid "TOP_FILLING" +msgstr "Create a filling" + +msgid "MEN_FILLING" +msgstr "Filling" + +msgid "STB_FILLING" +msgstr "Create a filling" + +msgid "TOP_PIPE" +msgstr "Create a pipe" + +msgid "MEN_PIPE" +msgstr "Pipe" + +msgid "STB_PIPE" +msgstr "Create a pipe" + +msgid "MEN_GROUP" +msgstr "Group" + +msgid "TOP_GROUP_CREATE" +msgstr "Create a group" + +msgid "MEN_GROUP_CREATE" +msgstr "Create" + +msgid "STB_GROUP_CREATE" +msgstr "Create a group" + +msgid "TOP_GROUP_EDIT" +msgstr "Edit a group" + +msgid "MEN_GROUP_EDIT" +msgstr "Edit" + +msgid "STB_GROUP_EDIT" +msgstr "Edit a group" + +msgid "MEN_BLOCKS" +msgstr "Blocks" + +msgid "TOP_Q_FACE" +msgstr "Quadrangle Face" + +msgid "MEN_Q_FACE" +msgstr "Quadrangle Face" + +msgid "STB_Q_FACE" +msgstr "Quadrangle Face" + +msgid "TOP_HEX_SOLID" +msgstr "Hexahedral Solid" + +msgid "MEN_HEX_SOLID" +msgstr "Hexahedral Solid" + +msgid "STB_HEX_SOLID" +msgstr "Hexahedral Solid" + +msgid "TOP_SKETCH" +msgstr "Sketch" + +msgid "MEN_SKETCH" +msgstr "Sketch" + +msgid "STB_SKETCH" +msgstr "Sketch" + +msgid "TOP_EXPLODE" +msgstr "Explode" + +msgid "MEN_EXPLODE" +msgstr "Explode" + +msgid "STB_EXPLODE" +msgstr "Explode" + +msgid "MEN_BUILD" +msgstr "Build" + +msgid "TOP_EDGE" +msgstr "Build an edge" + +msgid "MEN_EDGE" +msgstr "Edge" + +msgid "STB_EDGE" +msgstr "Build an edge" + +msgid "TOP_WIRE" +msgstr "Build a wire" + +msgid "MEN_WIRE" +msgstr "Wire" + +msgid "STB_WIRE" +msgstr "Build a wire" + +msgid "TOP_FACE" +msgstr "Build a face" + +msgid "MEN_FACE" +msgstr "Face" + +msgid "STB_FACE" +msgstr "Build a face" + +msgid "TOP_SHELL" +msgstr "Build a shell" + +msgid "MEN_SHELL" +msgstr "Shell" + +msgid "STB_SHELL" +msgstr "Build a shell" + +msgid "TOP_SOLID" +msgstr "Build a solid" + +msgid "MEN_SOLID" +msgstr "Solid" + +msgid "STB_SOLID" +msgstr "Build a solid" + +msgid "TOP_COMPOUND" +msgstr "Build a compound" + +msgid "MEN_COMPOUND" +msgstr "Compound" + +msgid "STB_COMPOUND" +msgstr "Build a compound" + +msgid "MEN_OPERATIONS" +msgstr "Operations" + +msgid "MEN_BOOLEAN" +msgstr "Boolean" + +msgid "TOP_FUSE" +msgstr "Fuse" + +msgid "MEN_FUSE" +msgstr "Fuse" + +msgid "STB_FUSE" +msgstr "Fuse" + +msgid "TOP_COMMON" +msgstr "Common" + +msgid "MEN_COMMON" +msgstr "Common" + +msgid "STB_COMMON" +msgstr "Common" + +msgid "TOP_CUT" +msgstr "Cut" + +msgid "MEN_CUT" +msgstr "Cut" + +msgid "STB_CUT" +msgstr "Cut" + +msgid "TOP_SECTION" +msgstr "Section" + +msgid "MEN_SECTION" +msgstr "Section" + +msgid "STB_SECTION" +msgstr "Section" + +msgid "MEN_TRANSFORMATION" +msgstr "Transformation" + +msgid "TOP_TRANSLATION" +msgstr "Translation" + +msgid "MEN_TRANSLATION" +msgstr "Translation" + +msgid "STB_TRANSLATION" +msgstr "Translation" + +msgid "TOP_ROTATION" +msgstr "Rotation" + +msgid "MEN_ROTATION" +msgstr "Rotation" + +msgid "STB_ROTATION" +msgstr "Rotation" + +msgid "TOP_MODIFY_LOCATION" +msgstr "Modify the Location" + +msgid "MEN_MODIFY_LOCATION" +msgstr "Modify the Location" + +msgid "STB_MODIFY_LOCATION" +msgstr "Modify the Location" + +msgid "TOP_MIRROR" +msgstr "Mirror image" + +msgid "MEN_MIRROR" +msgstr "Mirror image" + +msgid "STB_MIRROR" +msgstr "Mirror image" + +msgid "TOP_SCALE" +msgstr "Scale transform" + +msgid "MEN_SCALE" +msgstr "Scale transform" + +msgid "STB_SCALE" +msgstr "Scale transform" + +msgid "TOP_OFFSET" +msgstr "Offset surface" + +msgid "MEN_OFFSET" +msgstr "Offset surface" + +msgid "STB_OFFSET" +msgstr "Offset surface" + +msgid "TOP_MUL_TRANSLATION" +msgstr "Multi-Translation" + +msgid "MEN_MUL_TRANSLATION" +msgstr "Multi-Translation" + +msgid "STB_MUL_TRANSLATION" +msgstr "Multi-Translation" + +msgid "TOP_MUL_ROTATION" +msgstr "Multi-Rotation" + +msgid "MEN_MUL_ROTATION" +msgstr "Multi-Rotation" + +msgid "STB_MUL_ROTATION" +msgstr "Multi-Rotation" + +msgid "TOP_PARTITION" +msgstr "Partition" + +msgid "MEN_PARTITION" +msgstr "Partition" + +msgid "STB_PARTITION" +msgstr "Partition" + +msgid "TOP_ARCHIMEDE" +msgstr "Archimede" + +msgid "MEN_ARCHIMEDE" +msgstr "Archimede" + +msgid "STB_ARCHIMEDE" +msgstr "Archimede" + +msgid "TOP_FILLET" +msgstr "Fillet" + +msgid "MEN_FILLET" +msgstr "Fillet" + +msgid "STB_FILLET" +msgstr "Fillet" + +msgid "TOP_CHAMFER" +msgstr "Chamfer" + +msgid "MEN_CHAMFER" +msgstr "Chamfer" + +msgid "STB_CHAMFER" +msgstr "Chamfer" + +msgid "TOP_CLIPPING" +msgstr "Clipping range" + +msgid "MEN_CLIPPING" +msgstr "Clipping range" + +msgid "STB_CLIPPING" +msgstr "Clipping range" + +msgid "TOP_MUL_TRANSFORM" +msgstr "Multi-transformation" + +msgid "MEN_MUL_TRANSFORM" +msgstr "Multi-transformation" + +msgid "STB_MUL_TRANSFORM" +msgstr "Multi-transformation" + +msgid "TOP_EXPLODE_BLOCKS" +msgstr "Explode on Blocks" + +msgid "MEN_EXPLODE_BLOCKS" +msgstr "Explode on Blocks" + +msgid "STB_EXPLODE_BLOCKS" +msgstr "Explode on Blocks" + +msgid "TOP_PROPAGATE" +msgstr "Propagate" + +msgid "MEN_PROPAGATE" +msgstr "Propagate" + +msgid "STB_PROPAGATE" +msgstr "Propagate" + +msgid "MEN_REPAIR" +msgstr "Repair" + +msgid "TOP_SHAPE_PROCESS" +msgstr "Perform shape processing" + +msgid "MEN_SHAPE_PROCESS" +msgstr "Shape processing" + +msgid "STB_SHAPE_PROCESS" +msgstr "Perform shape processing " + +msgid "TOP_SUPPRESS_FACES" +msgstr "Perform suppress faces" + +msgid "MEN_SUPPRESS_FACES" +msgstr "Suppress faces" + +msgid "STB_SUPPRESS_FACES" +msgstr "Perform suppress faces" + +msgid "TOP_CLOSE_CONTOUR" +msgstr "Perform close contour" + +msgid "MEN_CLOSE_CONTOUR" +msgstr "Close contour" + +msgid "STB_CLOSE_CONTOUR" +msgstr "Perform close contour" + +msgid "TOP_SUPPRESS_INT_WIRES" +msgstr "Perform suppress internal wires" + +msgid "MEN_SUPPRESS_INT_WIRES" +msgstr "Suppress internal wires" + +msgid "STB_SUPPRESS_INT_WIRES" +msgstr "Perform suppress internal wires" + +msgid "TOP_SUPPERSS_HOLES" +msgstr "Perform suppress holes" + +msgid "MEN_SUPPERSS_HOLES" +msgstr "Suppress holes" + +msgid "STB_SUPPERSS_HOLES" +msgstr "Perform suppress holes" + +msgid "TOP_SEWING" +msgstr "Perform sewing" + +msgid "MEN_SEWING" +msgstr "Sewing" + +msgid "STB_SEWING" +msgstr "Perform sewing" + +msgid "TOP_GLUE_FACES" +msgstr "Perform glue faces" + +msgid "MEN_GLUE_FACES" +msgstr "Glue faces" + +msgid "STB_GLUE_FACES" +msgstr "Perform glue faces" + +msgid "TOP_POINT_ON_EDGE" +msgstr "Add point on edge" + +msgid "MEN_POINT_ON_EDGE" +msgstr "Add point on edge" + +msgid "STB_POINT_ON_EDGE" +msgstr "Add point on edge" + +msgid "TOP_CHECK_FREE_BNDS" +msgstr "Check free boundaries" + +msgid "MEN_CHECK_FREE_BNDS" +msgstr "Check free boundaries" + +msgid "STB_CHECK_FREE_BNDS" +msgstr "Check free boundaries" + +msgid "TOP_CHECK_FREE_FACES" +msgstr "Check free faces" + +msgid "MEN_CHECK_FREE_FACES" +msgstr "Check free faces" + +msgid "STB_CHECK_FREE_FACES" +msgstr "Check free faces" + +msgid "MEN_MEASURES" +msgstr "Measures" + +msgid "TOP_POINT_COORDS" +msgstr "Point coordinates" + +msgid "MEN_POINT_COORDS" +msgstr "Point coordinates" + +msgid "STB_POINT_COORDS" +msgstr "Point coordinates" + +msgid "TOP_BASIC_PROPS" +msgstr "Basic properties" + +msgid "MEN_BASIC_PROPS" +msgstr "Basic properties" + +msgid "STB_BASIC_PROPS" +msgstr "Basic properties" + +msgid "TOP_MASS_CENTER" +msgstr "Compute center of mass" + +msgid "MEN_MASS_CENTER" +msgstr "Center of mass" + +msgid "STB_MASS_CENTER" +msgstr "Compute center of mass" + +msgid "TOP_INERTIA" +msgstr "Compute intertia" + +msgid "MEN_INERTIA" +msgstr "Inertia" + +msgid "STB_INERTIA" +msgstr "Compute intertia" + +msgid "MEN_DIMENSIONS" +msgstr "Dimensions" + +msgid "TOP_BND_BOX" +msgstr "Compute bounding box" + +msgid "MEN_BND_BOX" +msgstr "Bounding box" + +msgid "STB_BND_BOX" +msgstr "Compute bounding box" + +msgid "TOP_MIN_DIST" +msgstr "Compute minimum distance" + +msgid "MEN_MIN_DIST" +msgstr "Min distance" + +msgid "STB_MIN_DIST" +msgstr "Compute minimum distance" + +msgid "TOP_TOLERANCE" +msgstr "Compute tolerance" + +msgid "MEN_TOLERANCE" +msgstr "Compute tolerance" + +msgid "STB_TOLERANCE" +msgstr "Compute tolerance" + +msgid "TOP_WHAT_IS" +msgstr "What is" + +msgid "MEN_WHAT_IS" +msgstr "What is" + +msgid "STB_WHAT_IS" +msgstr "What is" + +msgid "TOP_CHECK" +msgstr "Check" + +msgid "MEN_CHECK" +msgstr "Check" + +msgid "STB_CHECK" +msgstr "Check" + +msgid "TOP_CHECK_COMPOUND" +msgstr "Check compound of blocks" + +msgid "MEN_CHECK_COMPOUND" +msgstr "Check compound of blocks" + +msgid "STB_CHECK_COMPOUND" +msgstr "Check compound of blocks" + +msgid "MEN_TOOLS" +msgstr "Tools" + +msgid "TOP_CHECK_GEOMETRY" +msgstr "Check Geometry" + +msgid "MEN_CHECK_GEOMETRY" +msgstr "Check Geometry" + +msgid "STB_CHECK_GEOMETRY" +msgstr "Check Geometry" + +msgid "MEN_PREFERENCES" +msgstr "Preferences" + +msgid "MEN_PREFERENCES_GEOM" +msgstr "Geometry" + +msgid "TOP_SHADING_COLOR" +msgstr "Set shading color" + +msgid "MEN_SHADING_COLOR" +msgstr "Shading color" + +msgid "STB_SHADING_COLOR" +msgstr "Set shading color" + +msgid "TOP_ISOS" +msgstr "Set number of isolines" + +msgid "MEN_ISOS" +msgstr "Isos" + +msgid "STB_ISOS" +msgstr "Set number of isolines" + +msgid "TOP_STEP_VALUE" +msgstr "Set step value" + +msgid "MEN_STEP_VALUE" +msgstr "Step value" + +msgid "STB_STEP_VALUE" +msgstr "Set step value" + +msgid "MEN_VIEW" +msgstr "View" + +msgid "MEN_DISPLAY_MODE" +msgstr "Display mode" + +msgid "TOP_SHADING" +msgstr "Shading" + +msgid "MEN_SHADING" +msgstr "Shading" + +msgid "MEN_WIREFRAME" +msgstr "Wireframe" + +msgid "STB_SHADING" +msgstr "Shading" + +msgid "TOP_DISPLAY_ALL" +msgstr "Display all" + +msgid "MEN_DISPLAY_ALL" +msgstr "Display all" + +msgid "STB_DISPLAY_ALL" +msgstr "Display all" + +msgid "TOP_ERASE_ALL" +msgstr "Erase all" + +msgid "MEN_ERASE_ALL" +msgstr "Erase all" + +msgid "STB_ERASE_ALL" +msgstr "Erase all" + +msgid "TOP_DISPLAY" +msgstr "Display" + +msgid "MEN_DISPLAY" +msgstr "Display" + +msgid "STB_DISPLAY" +msgstr "Display" + +msgid "TOP_DISPLAY_ONLY" +msgstr "Display only" + +msgid "MEN_DISPLAY_ONLY" +msgstr "Display only" + +msgid "STB_DISPLAY_ONLY" +msgstr "Display only" + +msgid "TOP_ERASE" +msgstr "Erase" + +msgid "MEN_ERASE" +msgstr "Erase" + +msgid "STB_ERASE" +msgstr "Erase" + +msgid "TOP_POP_RENAME" +msgstr "Rename" + +msgid "MEN_POP_RENAME" +msgstr "Rename" + +msgid "STB_POP_RENAME" +msgstr "Rename" + +msgid "TOP_POP_WIREFRAME" +msgstr "Wireframe" + +msgid "MEN_POP_WIREFRAME" +msgstr "Wireframe" + +msgid "STB_POP_WIREFRAME" +msgstr "Wireframe" + +msgid "TOP_POP_SHADING" +msgstr "Shading" + +msgid "MEN_POP_SHADING" +msgstr "Shading" + +msgid "STB_POP_SHADING" +msgstr "Shading" + +msgid "TOP_POP_COLOR" +msgstr "Color" + +msgid "MEN_POP_COLOR" +msgstr "Color" + +msgid "STB_POP_COLOR" +msgstr "Color" + +msgid "TOP_POP_TRANSPARENCY" +msgstr "Transparency" + +msgid "MEN_POP_TRANSPARENCY" +msgstr "Transparency" + +msgid "STB_POP_TRANSPARENCY" +msgstr "Transparency" + +msgid "TOP_POP_ISOS" +msgstr "Isolines" + +msgid "MEN_POP_ISOS" +msgstr "Isos" + +msgid "STB_POP_ISOS" +msgstr "Isolines" + +msgid "TOP_POP_CREATE_GROUP" +msgstr "Create Group" + +msgid "MEN_POP_CREATE_GROUP" +msgstr "Create Group" + +msgid "STB_POP_CREATE_GROUP" +msgstr "Create Group" + +msgid "TOOL_BASIC" +msgstr "Basic" + +msgid "TOOL_PRIMITIVES" +msgstr "Primitives" + +msgid "TOOL_BOOLEAN" +msgstr "Boolean operations" + +msgid "TOOL_GENERATION" +msgstr "Generation" + +msgid "TOOL_TRANSFORMATION" +msgstr "Transformation" + +msgid "TLT_RENAME" +msgstr "Rename" + +msgid "NAME_LBL" +msgstr "Name: " + +msgid "GEOM_ERR_GET_ENGINE" +msgstr "Failed to obtain GEOM Engine component. Reload Geometry module and try again." + +msgid "PREF_GROUP_OCCVIEWER" +msgstr "OCC Viewer 3d" + +msgid "PREF_GROUP_GENERAL" +msgstr "General" + +msgid "PREF_SHADING_COLOR" +msgstr "Default shading color" + +msgid "PREF_STEP_VALUE" +msgstr "Step value for spin boxes" + +msgid "PREF_DISPLAY_MODE" +msgstr "Default display mode" + +msgid "PREF_TAB_SETTINGS" +msgstr "Settings" diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx new file mode 100644 index 000000000..04cf3d313 --- /dev/null +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -0,0 +1,1648 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GeometryGUI.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "GeometryGUI.h" +#include "GEOMGUI_OCCSelector.h" +#include "GEOMGUI_Selection.h" +#include "GEOM_Displayer.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +// External includes +#include +#include + +#include +#include +#include + +#include + +#include +#include + + +extern "C" { + Standard_EXPORT CAM_Module* createModule() { + return new GeometryGUI(); + } +} + + + +GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil(); + +GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen() { return GeometryGUI::myComponentGeom; } + +bool GeometryGUI::InitGeomGen() +{ + GeometryGUI aGG; + if( CORBA::is_nil( myComponentGeom ) ) return false; + return true; +} + +//======================================================================= +// function : ClientSObjectToObject +// purpose : +//======================================================================= +CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject) +{ + _PTR(GenericAttribute) anAttr; + CORBA::Object_var anObj; + try { + std::string aValue = theSObject->GetIOR(); + if (strcmp(aValue.c_str(), "") != 0) { + CORBA::ORB_ptr anORB = SalomeApp_Application::orb(); + anObj = anORB->string_to_object(aValue.c_str()); + } + } catch(...) { + INFOS("ClientSObjectToObject - Unknown exception was occured!!!"); + } + return anObj._retn(); +} + +//======================================================================= +// function : ClientStudyToStudy +// purpose : +//======================================================================= +SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy) +{ + SALOME_NamingService *aNamingService = SalomeApp_Application::namingService(); + CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager"); + SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject); + int aStudyID = theStudy->StudyId(); + SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID); + return aDSStudy._retn(); +} + +//================================================================================= +// class : CustomItem +// purpose : Set Font to a text. +//================================================================================= +class CustomItem : public QCustomMenuItem +{ +public: + CustomItem(const QString& s, const QFont& f) : myString(s), myFont(f) {} + ~CustomItem() {} + + void paint(QPainter* p, const QColorGroup& cg, bool act, bool /*enabled*/, int x, int y, int w, int h) + { + p->save(); + p->fillRect( x, y, w, h, act ? cg.highlight() : cg.mid() ); + p->setPen( act ? cg.highlightedText() : cg.buttonText() ); + p->setFont( myFont ); + p->drawText( x, y, w, h, AlignHCenter | AlignVCenter | ShowPrefix | DontClip | SingleLine, myString ); + p->restore(); + } + + QSize sizeHint() + { + return QFontMetrics( myFont ).size( AlignHCenter | AlignVCenter | ShowPrefix | DontClip | SingleLine, myString ); + } + + bool fullSpan() const + { + return true; + } + +private: + QString myString; + QFont myFont; +}; + +//======================================================================= +// function : GeometryGUI::GeometryGUI() +// purpose : Constructor +//======================================================================= +GeometryGUI::GeometryGUI() : + SalomeApp_Module( "GEOM" ) +{ + if ( CORBA::is_nil( myComponentGeom ) ) + { + SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA( getApp()->namingService() ); + Engines::Component_var comp = ls->FindOrLoad_Component( "FactoryServer", "GEOM" ); + myComponentGeom = GEOM::GEOM_Gen::_narrow( comp ); + } + + myState = -1; + myActiveDialogBox = 0; + myFatherior = ""; + + gp_Pnt origin = gp_Pnt(0., 0., 0.); + gp_Dir direction = gp_Dir(0., 0., 1.); + myWorkingPlane = gp_Ax3(origin, direction); + + myOCCSelectors.setAutoDelete( true ); + myVTKSelectors.setAutoDelete( true ); + + myDisplayer = 0; +} + +//======================================================================= +// function : GeometryGUI::~GeometryGUI() +// purpose : Destructor +//======================================================================= +GeometryGUI::~GeometryGUI() +{ +} + +//======================================================================= +// function : GeometryGUI::getLibrary() +// purpose : get or load GUI library by name [ internal ] +//======================================================================= +typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* ); +GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName ) +{ + if ( !myGUIMap.contains( libraryName ) ) { + // try to load library if it is not loaded yet + QCString libs; +#ifndef WNT + if( ( libs = getenv( "LD_LIBRARY_PATH" ) ) ) { + QStringList dirList = QStringList::split( ":", libs, false ); // skip empty entries +#else + if( ( libs = getenv( "PATH" ) ) ) { + QStringList dirList = QStringList::split( ";", libs, false ); // skip empty entries +#endif + for( int i = dirList.count()-1; i >= 0; i-- ) { + QString dir = dirList[ i ]; + QFileInfo fi( Qtx::addSlash( dirList[ i ] ) + libraryName ); + if( fi.exists() ) { + OSD_SharedLibrary aSharedLibrary( (char*)fi.fileName().latin1() ); + bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY ); + if( !res ) { + MESSAGE( "Can't open library : " << aSharedLibrary.DlError() ); + continue; // continue search further + } + OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" ); + if ( osdF != NULL ) { + LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF; + GEOMGUI* libGUI = (*func)(this); + if ( libGUI ) { + myGUIMap[ libraryName ] = libGUI; + break; // found and loaded! + } + } + } + } + } + } + if ( myGUIMap.contains( libraryName ) ) + // library is successfully loaded + return myGUIMap[ libraryName ]; + return 0; +} + +//======================================================================= +// function : GeometryGUI::ActiveWorkingPlane() +// purpose : Activate Working Plane View +//======================================================================= +void GeometryGUI::ActiveWorkingPlane() +{ + gp_Dir DZ = myWorkingPlane.Direction(); + gp_Dir DY = myWorkingPlane.YDirection(); + + SUIT_ViewWindow* window = application()->desktop()->activeWindow(); + bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + if( ViewOCC ) { + OCCViewer_ViewWindow* vw = dynamic_cast( window ); + if ( vw ) { + Handle(V3d_View) view3d = vw->getViewPort()->getView(); + + view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z()); + view3d->SetUp(DY.X(), DY.Y(), DY.Z()); + + vw->onViewFitAll(); + } + } + else if( ViewVTK ) { + SVTK_ViewWindow* vw = dynamic_cast( window ); + if ( vw ) { + vtkCamera* camera = vw->getRenderer()->GetActiveCamera(); + + camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z()); + camera->SetViewUp(DY.X(), DY.Y(), DY.Z()); + camera->SetFocalPoint(0,0,0); + + vw->onFitAll(); + } + } +} + +//======================================================================= +// function : GeometryGUI::SetActiveDialogBox() +// purpose : Set active dialog box +//======================================================================= +void GeometryGUI::SetActiveDialogBox( QDialog* aDlg ) +{ + myActiveDialogBox = (QDialog*)aDlg; +} + +//======================================================================= +// function : GeometryGUI::EmitSignalDeactivateDialog() +// purpose : Emit a signal to deactivate the active dialog Box +//======================================================================= +void GeometryGUI::EmitSignalDeactivateDialog() +{ + emit SignalDeactivateActiveDialog(); +} + +//======================================================================= +// function : GeometryGUI::EmitSignalCloseAllDialogs() +// purpose : Emit a signal to close all non modal dialogs box +//======================================================================= +void GeometryGUI::EmitSignalCloseAllDialogs() +{ + emit SignalCloseAllDialogs(); +} + +//======================================================================= +// function : GeometryGUI::EmitSignalDefaultStepValueChanged() +// purpose : Emit a signal to inform that default real spin box step has +// been changed +//======================================================================= +void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal) +{ + emit SignalDefaultStepValueChanged(newVal); +} + +//======================================================================= +// function : GeometryGUI::OnGUIEvent() +// purpose : common slot for all menu/toolbar actions +//======================================================================= +void GeometryGUI::OnGUIEvent() +{ + const QObject* obj = sender(); + if ( !obj || !obj->inherits( "QAction" ) ) + return; + int id = actionId((QAction*)obj); + if ( id != -1 ) + OnGUIEvent( id ); +} + +//======================================================================= +// function : GeometryGUI::OnGUIEvent() +// purpose : manage all events on GUI [static] +//======================================================================= +void GeometryGUI::OnGUIEvent( int id ) +{ + SUIT_Desktop* desk = application()->desktop(); + + // check type of the active viewframe + SUIT_ViewWindow* window = desk->activeWindow(); + bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + // if current viewframe is not of OCC and not of VTK type - return immediately + // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example) + bool NotViewerDependentCommand = ( id == 901 || id == 216 || id == 213 ); + if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommand ) + return; + + // fix for IPAL9103, point 2 + if ( CORBA::is_nil( GetGeomGen() ) ) { + SUIT_MessageBox::error1( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) ); + return; + } + + GEOMGUI* library = 0; + // try to get-or-load corresponding GUI library + if( id == 111 || // MENU FILE - IMPORT BREP + id == 112 || // MENU FILE - IMPORT IGES + id == 113 || // MENU FILE - IMPORT STEP + id == 121 || // MENU FILE - EXPORT BREP + id == 122 || // MENU FILE - EXPORT IGES + id == 123 || // MENU FILE - EXPORT STEP + id == 31 || // MENU EDIT - COPY + id == 33 || // MENU EDIT - DELETE + id == 411 || // MENU SETTINGS - ADD IN STUDY + id == 412 || // MENU SETTINGS - SHADING COLOR + id == 413 || // MENU SETTINGS - ISOS + id == 414 || // MENU SETTINGS - STEP VALUE FOR SPIN BOXES + id == 5103 || // MENU TOOLS - CHECK GEOMETRY + id == 8032 || // POPUP VIEWER - COLOR + id == 8033 || // POPUP VIEWER - TRANSPARENCY + id == 8034 || // POPUP VIEWER - ISOS + id == 804 || // POPUP VIEWER - ADD IN STUDY + id == 901 || // OBJECT BROWSER - RENAME + id == 9024 ) { // OBJECT BROWSER - OPEN + //cout << "id " << id << " received" << endl; +#ifndef WNT + library = getLibrary( "libGEOMToolsGUI.so" ); +#else + library = getLibrary( "GEOMToolsGUI.dll" ); +#endif + } + else if( id == 211 || // MENU VIEW - WIREFRAME/SHADING + id == 212 || // MENU VIEW - DISPLAY ALL + id == 213 || // MENU VIEW - DISPLAY ONLY + id == 214 || // MENU VIEW - ERASE ALL + id == 215 || // MENU VIEW - ERASE + id == 216 || // MENU VIEW - DISPLAY + id == 80311 || // POPUP VIEWER - WIREFRAME + id == 80312 ) { // POPUP VIEWER - SHADING +#ifndef WNT + library = getLibrary( "libDisplayGUI.so" ); +#else + library = getLibrary( "DisplayGUI.dll" ); +#endif + } + else if( id == 4011 || // MENU BASIC - POINT + id == 4012 || // MENU BASIC - LINE + id == 4013 || // MENU BASIC - CIRCLE + id == 4014 || // MENU BASIC - ELLIPSE + id == 4015 || // MENU BASIC - ARC + id == 4016 || // MENU BASIC - VECTOR + id == 4017 || // MENU BASIC - PLANE + id == 4018 || // MENU BASIC - WPLANE + id == 4019 || // MENU BASIC - CURVE + id == 4020 ) { // MENU BASIC - REPAIR +#ifndef WNT + library = getLibrary( "libBasicGUI.so" ); +#else + library = getLibrary( "BasicGUI.dll" ); +#endif + } + else if( id == 4021 || // MENU PRIMITIVE - BOX + id == 4022 || // MENU PRIMITIVE - CYLINDER + id == 4023 || // MENU PRIMITIVE - SPHERE + id == 4024 || // MENU PRIMITIVE - TORUS + id == 4025 ) { // MENU PRIMITIVE - CONE +#ifndef WNT + library = getLibrary( "libPrimitiveGUI.so" ); +#else + library = getLibrary( "PrimitiveGUI.dll" ); +#endif + } + else if( id == 4031 || // MENU GENERATION - PRISM + id == 4032 || // MENU GENERATION - REVOLUTION + id == 4033 || // MENU GENERATION - FILLING + id == 4034 ) { // MENU GENERATION - PIPE +#ifndef WNT + library = getLibrary( "libGenerationGUI.so" ); +#else + library = getLibrary( "GenerationGUI.dll" ); +#endif + } + else if( id == 404 || // MENU ENTITY - SKETCHER + id == 407 ) { // MENU ENTITY - EXPLODE +#ifndef WNT + library = getLibrary( "libEntityGUI.so" ); +#else + library = getLibrary( "EntityGUI.dll" ); +#endif + } + else if( id == 4081 || // MENU BUILD - EDGE + id == 4082 || // MENU BUILD - WIRE + id == 4083 || // MENU BUILD - FACE + id == 4084 || // MENU BUILD - SHELL + id == 4085 || // MENU BUILD - SOLID + id == 4086 ) { // MENU BUILD - COMPUND +#ifndef WNT + library = getLibrary( "libBuildGUI.so" ); +#else + library = getLibrary( "BuildGUI.dll" ); +#endif + } + else if( id == 5011 || // MENU BOOLEAN - FUSE + id == 5012 || // MENU BOOLEAN - COMMON + id == 5013 || // MENU BOOLEAN - CUT + id == 5014 ) { // MENU BOOLEAN - SECTION +#ifndef WNT + library = getLibrary( "libBooleanGUI.so" ); +#else + library = getLibrary( "BooleanGUI.dll" ); +#endif + } + else if( id == 5021 || // MENU TRANSFORMATION - TRANSLATION + id == 5022 || // MENU TRANSFORMATION - ROTATION + id == 5023 || // MENU TRANSFORMATION - LOCATION + id == 5024 || // MENU TRANSFORMATION - MIRROR + id == 5025 || // MENU TRANSFORMATION - SCALE + id == 5026 || // MENU TRANSFORMATION - OFFSET + id == 5027 || // MENU TRANSFORMATION - MULTI-TRANSLATION + id == 5028 ) { // MENU TRANSFORMATION - MULTI-ROTATION +#ifndef WNT + library = getLibrary( "libTransformationGUI.so" ); +#else + library = getLibrary( "TransformationGUI.dll" ); +#endif + } + else if( id == 503 || // MENU OPERATION - PARTITION + id == 504 || // MENU OPERATION - ARCHIMEDE + id == 505 || // MENU OPERATION - FILLET + id == 506 || // MENU OPERATION - CHAMFER + id == 507 ) { // MENU OPERATION - CLIPPING RANGE +#ifndef WNT + library = getLibrary( "libOperationGUI.so" ); +#else + library = getLibrary( "OperationGUI.dll" ); +#endif + } + else if( id == 601 || // MENU REPAIR - SEWING + id == 603 || // MENU REPAIR - SUPPRESS FACES + id == 604 || // MENU REPAIR - SUPPRESS HOLE + id == 605 || // MENU REPAIR - SHAPE PROCESSING + id == 606 || // MENU REPAIR - CLOSE CONTOUR + id == 607 || // MENU REPAIR - REMOVE INTERNAL WIRES + id == 608 || // MENU REPAIR - ADD POINT ON EDGE + id == 609 || // MENU REPAIR - FREE BOUNDARIES + id == 610 || // MENU REPAIR - FREE FACES + id == 602 ) { // MENU REPAIR - GLUE FACES +#ifndef WNT + library = getLibrary( "libRepairGUI.so" ); +#else + library = getLibrary( "RepairGUI.dll" ); +#endif + } + else if( id == 701 || // MENU MEASURE - PROPERTIES + id == 702 || // MENU MEASURE - CDG + id == 703 || // MENU MEASURE - INERTIA + id == 7041 || // MENU MEASURE - BOUNDING BOX + id == 7042 || // MENU MEASURE - MIN DISTANCE + id == 705 || // MENU MEASURE - TOLERANCE + id == 706 || // MENU MEASURE - WHATIS + id == 707 || // MENU MEASURE - CHECK + id == 7072 || // MENU MEASURE - CHECK COMPOUND OF BLOCKS + id == 708 ) { // MENU MEASURE - POINT COORDINATES +#ifndef WNT + library = getLibrary( "libMeasureGUI.so" ); +#else + library = getLibrary( "MeasureGUI.dll" ); +#endif + } + else if( id == 800 || // MENU GROUP - CREATE + id == 8001 || // POPUP MENU - CREATE GROUP + id == 801 ) { // MENU GROUP - EDIT +#ifndef WNT + library = getLibrary( "libGroupGUI.so" ); +#else + library = getLibrary( "GroupGUI.dll" ); +#endif + } + else if( id == 9999 || // MENU BLOCKS - HEXAHEDRAL SOLID + id == 9998 || // MENU BLOCKS - MULTI-TRANSFORMATION + id == 9997 || // MENU BLOCKS - QUADRANGLE FACE + id == 99991 || // MENU BLOCKS - PROPAGATE + id == 9995 ) { // MENU BLOCKS - EXPLODE ON BLOCKS +#ifndef WNT + library = getLibrary( "libBlocksGUI.so" ); +#else + library = getLibrary( "BlocksGUI.dll" ); +#endif + } + + // call method of corresponding GUI library + if ( library ) + library->OnGUIEvent( id, desk ); + else + SUIT_MessageBox::error1( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) ); +} + + +//================================================================================= +// function : GeometryGUI::OnKeyPress() +// purpose : Called when any key is pressed by user [static] +//================================================================================= +bool GeometryGUI::OnKeyPress( QKeyEvent* pe, SUIT_ViewWindow* win ) +{ + GUIMap::Iterator it; + bool bOk = true; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + bOk = bOk && it.data()->OnKeyPress( pe, application()->desktop(), win ); + return bOk; +} + + +//================================================================================= +// function : GeometryGUI::OnMouseMove() +// purpose : Manages mouse move events [static] +//================================================================================= +bool GeometryGUI::OnMouseMove( QMouseEvent* pe, SUIT_ViewWindow* win ) +{ + GUIMap::Iterator it; + bool bOk = true; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + bOk = bOk && it.data()->OnMouseMove( pe, application()->desktop(), win ); + return bOk; +} + + +//================================================================================= +// function : GeometryGUI::0nMousePress() +// purpose : Manage mouse press events [static] +//================================================================================= +bool GeometryGUI::OnMousePress( QMouseEvent* pe, SUIT_ViewWindow* win ) +{ + GUIMap::Iterator it; + // OnMousePress() should return false if this event should be processed further + // (see OCCViewer_Viewer3d::onMousePress() for explanation) + bool processed = false; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + processed = processed || it.data()->OnMousePress( pe, application()->desktop(), win ); + return processed; +} + +/* +static void UpdateVtkSelection() +{ + QPtrList winList = application()->desktop()->windows(); + SUIT_ViewWindow* win = 0; + for ( win = winList.first(); win; win = winList.next() ) { + if ( win->getViewManager()->getTypeView() == VIEW_VTK ) { + SVTK_ViewWindow* vw = dynamic_cast( window ); + if ( vw ) { + SVTK_RenderWindowInteractor* anInteractor = vw->getRWInteractor(); + anInteractor->SetSelectionProp(); + anInteractor->SetSelectionTolerance(); + SVTK_InteractorStyleSALOME* aStyle = anInteractor->GetInteractorStyleSALOME(); + if (aStyle) { + aStyle->setPreselectionProp(); + } + } + } + } +} + +//================================================================================= +// function : GeometryGUI::SetSettings() +// purpose : Called when GEOM module is activated [static] +//================================================================================= +bool GeometryGUI::SetSettings() +{ + QMenuBar* Mb = parent->getMainMenuBar(); + SUIT_Study* ActiveStudy = application()->activeStudy(); + +// Wireframe or Shading + int DisplayMode = 0; + SUIT_ViewWindow* window = application()->desktop()->activeWindow(); + bool ViewOCC = ( window && window->getViewManager()->getType() == VIEW_OCC ); + bool ViewVTK = ( window && window->getViewManager()->getType() == VIEW_VTK ); + if ( ViewOCC ) { + OCCViewer_ViewManager* vm = dynamic_cast( window->getViewManager() ); + if ( vm ) { + Handle(AIS_InteractiveContext) ic = vm->getOCCViewer()->getAISContext(); + DisplayMode = ic->DisplayMode(); + } + } + else if ( ViewVTK ) { + SVTK_ViewWindow* vw = dynamic_cast( window ); + if ( vw ) { + SVTK_RenderWindowInteractor* myRenderInter = vw->getRWInteractor(); + DisplayMode = myRenderInter->GetDisplayMode(); + } + } + + if( DisplayMode == 1 ) + getApp()-> + Mb->changeItem( 211, tr( "GEOM_MEN_WIREFRAME" ) ); + else + Mb->changeItem( 211, tr( "GEOM_MEN_SHADING" ) ); + + + // Add in Study - !!!ALWAYS TRUE!!! /////// VSR : TO BE REMOVED + QString AddInStudy = QAD_CONFIG->getSetting("Geometry:SettingsAddInStudy"); + int Settings_AddInStudy; + // if(!AddInStudy.isEmpty()) + // Settings_AddInStudy = AddInStudy.toInt(); + // else + + Settings_AddInStudy = 1; + Mb->setItemChecked(411, Settings_AddInStudy); + + // step value + QString S = QAD_CONFIG->getSetting("Geometry:SettingsGeomStep"); + if(S.isEmpty()) + QAD_CONFIG->addSetting("Geometry:SettingsGeomStep", "100"); + + // isos + int count = ActiveStudy->getStudyFramesCount(); + for(int i = 0; i < count; i++) { + if(ActiveStudy->getStudyFrame(i)->getTypeView() == VIEW_OCC) { + OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)ActiveStudy->getStudyFrame(i)->getRightFrame()->getViewFrame())->getViewer(); + Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); + + QString IsoU = QAD_CONFIG->getSetting("Geometry:SettingsIsoU"); + QString IsoV = QAD_CONFIG->getSetting("Geometry:SettingsIsoV"); + if(!IsoU.isEmpty()) + ic->DefaultDrawer()->UIsoAspect()->SetNumber(IsoU.toInt()); + if(!IsoV.isEmpty()) + ic->DefaultDrawer()->VIsoAspect()->SetNumber(IsoV.toInt()); + } + } + + setActionsEnabled(); + + // PAL5356: update VTK selection + ::UpdateVtkSelection(); + bool bOk = true; + GUIMap::Iterator it; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + bOk = bOk && it.data()->SetSettings( parent ); + + // MZN: Enable/disable "Clipping range" menu item(from GEOM_CLIPPING variable) + if (getenv( "GEOM_CLIPPING" ) == NULL) + { + QMenuItem* mi = Mb->findItem(50); + if (mi && mi->popup()) + mi->popup()->removeItem(507); + } + + return bOk; +} +*/ + +//======================================================================= +// function : createGeomAction +// purpose : +//======================================================================= +void GeometryGUI::createGeomAction( const int id, const QString& po_id, const QString& icon_id, const int key, const bool toggle ) +{ + QIconSet icon; + QWidget* parent = application()->desktop(); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + QPixmap pix; + if ( icon_id.length() ) + pix = resMgr->loadPixmap( "GEOM", tr( icon_id ) ); + else + pix = resMgr->loadPixmap( "GEOM", tr( QString( "ICO_" )+po_id ), false ); + if ( !pix.isNull() ) + icon = QIconSet( pix ); + + QString tooltip = tr( QString( "TOP_" )+po_id ), + menu = tr( QString( "MEN_" )+po_id ), + status_bar = tr( QString( "STB_" )+po_id ); + + createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() ) ); +} + + + +//======================================================================= +// function : GeometryGUI::Deactivate() +// purpose : Called when GEOM module is deactivated [ static ] +//======================================================================= +void GeometryGUI::initialize( CAM_Application* app ) +{ + SalomeApp_Module::initialize( app ); + + // ----- create actions -------------- + + createGeomAction( 111, "IMPORT", "", (CTRL + Key_I) ); + createGeomAction( 121, "EXPORT", "", (CTRL + Key_E) ); + + createGeomAction( 33, "DELETE" ); + + createGeomAction( 4011, "POINT" ); + createGeomAction( 4012, "LINE" ); + createGeomAction( 4013, "CIRCLE" ); + createGeomAction( 4014, "ELLIPSE" ); + createGeomAction( 4015, "ARC" ); + createGeomAction( 4019, "CURVE" ); + createGeomAction( 4016, "VECTOR" ); + createGeomAction( 4017, "PLANE" ); + createGeomAction( 4018, "WORK_PLANE" ); + createGeomAction( 4020, "LOCAL_CS" ); + + createGeomAction( 4021, "BOX" ); + createGeomAction( 4022, "CYLINDER" ); + createGeomAction( 4023, "SPHERE" ); + createGeomAction( 4024, "TORUS" ); + createGeomAction( 4025, "CONE" ); + + createGeomAction( 4031, "EXTRUSION" ); + createGeomAction( 4032, "REVOLUTION" ); + createGeomAction( 4033, "FILLING" ); + createGeomAction( 4034, "PIPE" ); + + createGeomAction( 800, "GROUP_CREATE" ); + createGeomAction( 801, "GROUP_EDIT" ); + + createGeomAction( 9997, "Q_FACE" ); + createGeomAction( 9999, "HEX_SOLID" ); + + createGeomAction( 404, "SKETCH" ); + createGeomAction( 407, "EXPLODE" ); + + createGeomAction( 4081, "EDGE" ); + createGeomAction( 4082, "WIRE" ); + createGeomAction( 4083, "FACE" ); + createGeomAction( 4084, "SHELL" ); + createGeomAction( 4085, "SOLID" ); + createGeomAction( 4086, "COMPOUND" ); + + createGeomAction( 5011, "FUSE" ); + createGeomAction( 5012, "COMMON" ); + createGeomAction( 5013, "CUT" ); + createGeomAction( 5014, "SECTION" ); + + createGeomAction( 5021, "TRANSLATION" ); + createGeomAction( 5022, "ROTATION" ); + createGeomAction( 5023, "MODIFY_LOCATION" ); + createGeomAction( 5024, "MIRROR" ); + createGeomAction( 5025, "SCALE" ); + createGeomAction( 5026, "OFFSET" ); + createGeomAction( 5027, "MUL_TRANSLATION" ); + createGeomAction( 5028, "MUL_ROTATION" ); + + createGeomAction( 503, "PARTITION" ); + createGeomAction( 504, "ARCHIMEDE" ); + createGeomAction( 505, "FILLET" ); + createGeomAction( 506, "CHAMFER" ); + //createGeomAction( 507, "CLIPPING" ); + + createGeomAction( 9998, "MUL_TRANSFORM" ); + createGeomAction( 9995, "EXPLODE_BLOCKS" ); + createGeomAction( 99991, "PROPAGATE" ); + + createGeomAction( 601, "SEWING" ); + createGeomAction( 602, "GLUE_FACES" ); + createGeomAction( 603, "SUPPRESS_FACES" ); + createGeomAction( 604, "SUPPERSS_HOLES" ); + createGeomAction( 605, "SHAPE_PROCESS" ); + createGeomAction( 606, "CLOSE_CONTOUR" ); + createGeomAction( 607, "SUPPRESS_INT_WIRES" ); + createGeomAction( 608, "POINT_ON_EDGE" ); + createGeomAction( 609, "CHECK_FREE_BNDS" ); + createGeomAction( 610, "CHECK_FREE_FACES" ); + + createGeomAction( 708, "POINT_COORDS" ); + createGeomAction( 701, "BASIC_PROPS" ); + createGeomAction( 702, "MASS_CENTER" ); + createGeomAction( 703, "INERTIA" ); + createGeomAction( 7041, "BND_BOX" ); + createGeomAction( 7042, "MIN_DIST" ); + + createGeomAction( 705, "TOLERANCE" ); + createGeomAction( 706, "WHAT_IS" ); + createGeomAction( 707, "CHECK" ); + createGeomAction( 7072, "CHECK_COMPOUND" ); + + createGeomAction( 5103, "CHECK_GEOMETRY" ); + + createGeomAction( 412, "SHADING_COLOR" ); + createGeomAction( 413, "ISOS" ); + createGeomAction( 414, "STEP_VALUE" ); + + createGeomAction( 211, "SHADING" ); + createGeomAction( 212, "DISPLAY_ALL" ); + createGeomAction( 214, "ERASE_ALL" ); + createGeomAction( 216, "DISPLAY" ); + createGeomAction( 213, "DISPLAY_ONLY" ); + createGeomAction( 215, "ERASE" ); + + createGeomAction( 901, "POP_RENAME" ); + createGeomAction( 80311, "POP_WIREFRAME", "", 0, true ); + createGeomAction( 80312, "POP_SHADING", "", 0, true ); + createGeomAction( 8032, "POP_COLOR" ); + createGeomAction( 8033, "POP_TRANSPARENCY" ); + createGeomAction( 8034, "POP_ISOS" ); + createGeomAction( 8001, "POP_CREATE_GROUP" ); + + // make wireframe-shading items to be exclusive (only one at a time is selected) + //QActionGroup* dispModeGr = new QActionGroup( this, "", true ); + //dispModeGr->add( action( 80311 ) ); + //dispModeGr->add( action( 80312 ) ); + // ---- create menu -------------------------- + + int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 ); + createMenu( separator(), fileId, 10 ); + createMenu( 111, fileId, 10 ); + createMenu( 121, fileId, 10 ); + createMenu( separator(), fileId, -1 ); + + int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 ); + createMenu( 33, editId, -1 ); + + int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 ); + + int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 ); + createMenu( 4011, basicId, -1 ); + createMenu( 4012, basicId, -1 ); + createMenu( 4013, basicId, -1 ); + createMenu( 4014, basicId, -1 ); + createMenu( 4015, basicId, -1 ); + createMenu( 4019, basicId, -1 ); + createMenu( separator(), basicId, -1 ); + createMenu( 4016, basicId, -1 ); + createMenu( 4017, basicId, -1 ); + createMenu( 4018, basicId, -1 ); + createMenu( 4020, basicId, -1 ); + + int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 ); + createMenu( 4021, primId, -1 ); + createMenu( 4022, primId, -1 ); + createMenu( 4023, primId, -1 ); + createMenu( 4024, primId, -1 ); + createMenu( 4025, primId, -1 ); + + int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 ); + createMenu( 4031, genId, -1 ); + createMenu( 4032, genId, -1 ); + createMenu( 4033, genId, -1 ); + createMenu( 4034, genId, -1 ); + createMenu( separator(), newEntId, -1 ); + + int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 ); + createMenu( 800, groupId, -1 ); + createMenu( 801, groupId, -1 ); + createMenu( separator(), newEntId, -1 ); + + int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 ); + createMenu( 9997, blocksId, -1 ); + createMenu( 9999, blocksId, -1 ); + + createMenu( separator(), newEntId, -1 ); + createMenu( 404, newEntId, -1 ); + createMenu( separator(), newEntId, -1 ); + createMenu( 407, newEntId, -1 ); + + int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 ); + createMenu( 4081, buildId, -1 ); + createMenu( 4082, buildId, -1 ); + createMenu( 4083, buildId, -1 ); + createMenu( 4084, buildId, -1 ); + createMenu( 4085, buildId, -1 ); + createMenu( 4086, buildId, -1 ); + + int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 ); + + int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 ); + createMenu( 5011, boolId, -1 ); + createMenu( 5012, boolId, -1 ); + createMenu( 5013, boolId, -1 ); + createMenu( 5014, boolId, -1 ); + + int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 ); + createMenu( 5021, transId, -1 ); + createMenu( 5022, transId, -1 ); + createMenu( 5023, transId, -1 ); + createMenu( 5024, transId, -1 ); + createMenu( 5025, transId, -1 ); + createMenu( 5026, transId, -1 ); + createMenu( separator(), transId, -1 ); + createMenu( 5027, transId, -1 ); + createMenu( 5028, transId, -1 ); + + createMenu( 503, operId, -1 ); + createMenu( 504, operId, -1 ); + createMenu( separator(), operId, -1 ); + createMenu( 505, transId, -1 ); + createMenu( 506, transId, -1 ); + //createMenu( 507, transId, -1 ); + + int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 ); + createMenu( 9998, blockId, -1 ); + createMenu( 9995, blockId, -1 ); + createMenu( 99991, blockId, -1 ); + + int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 ); + createMenu( 605, repairId, -1 ); + createMenu( 603, repairId, -1 ); + createMenu( 606, repairId, -1 ); + createMenu( 607, repairId, -1 ); + createMenu( 604, repairId, -1 ); + createMenu( 601, repairId, -1 ); + createMenu( 602, repairId, -1 ); + createMenu( 608, repairId, -1 ); + createMenu( 609, repairId, -1 ); + createMenu( 610, repairId, -1 ); + + int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 ); + createMenu( 708, measurId, -1 ); + createMenu( 701, measurId, -1 ); + createMenu( separator(), measurId, -1 ); + createMenu( 702, measurId, -1 ); + createMenu( 703, measurId, -1 ); + createMenu( separator(), measurId, -1 ); + + int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 ); + createMenu( 7041, dimId, -1 ); + createMenu( 7042, dimId, -1 ); + createMenu( separator(), measurId, -1 ); + + createMenu( 705, measurId, -1 ); + createMenu( separator(), measurId, -1 ); + createMenu( 706, measurId, -1 ); + createMenu( 707, measurId, -1 ); + createMenu( 7072, measurId, -1 ); + + int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 ); + createMenu( separator(), toolsId, -1 ); + createMenu( 5103, toolsId, -1 ); + + //int prefId = createMenu( tr( "MEN_PREFERENCES" ), -1, -1, 50 ); + //createMenu( separator(), prefId, -1 ); + //int geomId = createMenu( tr( "MEN_PREFERENCES_GEOM" ), prefId, -1 ); + //createMenu( 412, geomId, -1 ); + //createMenu( 413, geomId, -1 ); + //createMenu( 414, geomId, -1 ); + //createMenu( separator(), prefId, -1 ); + + int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 ); + createMenu( separator(), viewId, -1 ); + + int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 ); + createMenu( 211, dispmodeId, -1 ); + + createMenu( separator(), viewId, -1 ); + createMenu( 212, viewId, -1 ); + createMenu( 214, viewId, -1 ); + createMenu( separator(), viewId, -1 ); + +/* + PAL9111: + because of these items are accessible through object browser and viewers + we have removed they from main menu + + createMenu( 216, viewId, -1 ); + createMenu( 213, viewId, -1 ); + createMenu( 215, viewId, -1 ); +*/ + + // ---- create toolbars -------------------------- + + int basicTbId = createTool( tr( "TOOL_BASIC" ) ); + createTool( 4011, basicTbId ); + createTool( 4012, basicTbId ); + createTool( 4013, basicTbId ); + createTool( 4014, basicTbId ); + createTool( 4015, basicTbId ); + createTool( 4019, basicTbId ); + createTool( 4016, basicTbId ); + createTool( 4017, basicTbId ); + createTool( 4018, basicTbId ); + createTool( 4020, basicTbId ); + + int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) ); + createTool( 4021, primTbId ); + createTool( 4022, primTbId ); + createTool( 4023, primTbId ); + createTool( 4024, primTbId ); + createTool( 4025, primTbId ); + + int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) ); + createTool( 5011, boolTbId ); + createTool( 5012, boolTbId ); + createTool( 5013, boolTbId ); + createTool( 5014, boolTbId ); + + int genTbId = createTool( tr( "TOOL_GENERATION" ) ); + createTool( 4031, genTbId ); + createTool( 4032, genTbId ); + createTool( 4033, genTbId ); + createTool( 4034, genTbId ); + + int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) ); + createTool( 5021, transTbId ); + createTool( 5022, transTbId ); + createTool( 5023, transTbId ); + createTool( 5024, transTbId ); + createTool( 5025, transTbId ); + createTool( 5026, transTbId ); + createTool( separator(), transTbId ); + createTool( 5027, transTbId ); + createTool( 5028, transTbId ); + + QtxPopupMgr* mgr = popupMgr(); + mgr->insert( action( 901 ), -1, -1 ); // rename + mgr->setRule( action( 901 ), "$type in {'Shape' 'Group'} and selcount=1", true ); + mgr->insert( action( 8001 ), -1, -1 ); // create group + mgr->setRule( action( 8001 ), "client='ObjectBrowser' and type='Shape' and selcount=1 and isOCC=true", true ); + mgr->insert( action( 801 ), -1, -1 ); // edit group + mgr->setRule( action( 801 ), "client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true", true ); + mgr->insert( separator(), -1, -1 ); // ----------- + dispmodeId = mgr->insert( tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu + mgr->insert( action( 80311 ), dispmodeId, -1 ); // wireframe + mgr->setRule( action( 80311 ), "(client='OCCViewer' or client='VTKViewer') and selcount>0 and isVisible", true ); + mgr->setRule( action( 80311 ), "(client='OCCViewer' or client='VTKViewer') and displaymode='Wireframe'", false ); + mgr->insert( action( 80312 ), dispmodeId, -1 ); // shading + mgr->setRule( action( 80312 ), "(client='OCCViewer' or client='VTKViewer') and selcount>0 and isVisible", true ); + mgr->setRule( action( 80312 ), "(client='OCCViewer' or client='VTKViewer') and displaymode='Shading'", false ); + mgr->insert( separator(), -1, -1 ); // ----------- + mgr->insert( action( 8032 ), -1, -1 ); // color + mgr->setRule( action( 8032 ), "(client='OCCViewer' or client='VTKViewer') and selcount>0 and isVisible", true ); + mgr->insert( action( 8033 ), -1, -1 ); // transparency + mgr->setRule( action( 8033 ), "(client='OCCViewer' or client='VTKViewer') and selcount>0 and isVisible", true ); + mgr->insert( action( 8034 ), -1, -1 ); // isos + mgr->setRule( action( 8034 ), "client='OCCViewer' and selcount>0 and isVisible", true ); + mgr->insert( separator(), -1, -1 ); // ----------- + + + + QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ", + onlyComponent = "((type='Component') and selcount=1)", + rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")", + types = "'Shape' 'Group'"; + + mgr->insert( action( 216 ), -1, -1 ); // display + mgr->setRule( action( 216 ), rule.arg( types ).arg( "not isVisible" ), true ); + + mgr->insert( action( 215 ), -1, -1 ); // erase + mgr->setRule( action( 215 ), rule.arg( types ).arg( "isVisible" ), true ); + + mgr->insert( action( 214 ), -1, -1 ); // erase All + mgr->setRule( action( 214 ), "client='OCCViewer' or client='VTKViewer'", true ); + + mgr->insert( action( 213 ), -1, -1 ); // display only + mgr->setRule( action( 213 ), rule.arg( types ).arg( "true" ), true ); + mgr->insert( separator(), -1, -1 ); + + mgr->hide( mgr->actionId( action( myEraseAll ) ) ); +} + +//======================================================================= +// function : GeometryGUI::Deactivate() +// purpose : Called when GEOM module is deactivated [ static ] +//======================================================================= +bool GeometryGUI::activateModule( SUIT_Study* study ) +{ + if ( CORBA::is_nil( myComponentGeom ) ) + return false; + + bool res = SalomeApp_Module::activateModule( study ); + + if ( !res ) + return false; + + setMenuShown( true ); + setToolShown( true ); + + connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + connect( (STD_Application*)application(), SIGNAL( viewManagerAdded( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerAdded( SUIT_ViewManager* ) ) ); + connect( (STD_Application*)application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) ); + + GUIMap::Iterator it; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + it.data()->activate( application()->desktop() ); + + LightApp_SelectionMgr* sm = getApp()->selectionMgr(); + SUIT_ViewManager* vm; + ViewManagerList OCCViewManagers, VTKViewManagers; + application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers ); + for ( vm = OCCViewManagers.first(); vm; vm = OCCViewManagers.next() ) + myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) ); + application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers ); + for ( vm = VTKViewManagers.first(); vm; vm = VTKViewManagers.next() ) + myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast( vm->getViewModel() ), sm ) ); + + // disable OCC selectors + getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); + for ( GEOMGUI_OCCSelector* sr = myOCCSelectors.first(); sr; sr = myOCCSelectors.next() ) + sr->setEnabled(true); + + // disable VTK selectors + getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() ); + for ( LightApp_VTKSelector* sr = myVTKSelectors.first(); sr; sr = myVTKSelectors.next() ) + sr->setEnabled(true); + + return true; +} + + +//======================================================================= +// function : GeometryGUI::Deactivate() +// purpose : Called when GEOM module is deactivated [ static ] +//======================================================================= +bool GeometryGUI::deactivateModule( SUIT_Study* study ) +{ + setMenuShown( false ); + setToolShown( false ); + + disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) ); + disconnect( (STD_Application*)application(), SIGNAL( viewManagerAdded( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerAdded( SUIT_ViewManager* ) ) ); + disconnect( (STD_Application*)application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) ); + + EmitSignalCloseAllDialogs(); + + GUIMap::Iterator it; + for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it ) + it.data()->deactivate(); + + myOCCSelectors.clear(); + getApp()->selectionMgr()->setEnabled( true, OCCViewer_Viewer::Type() ); + + myVTKSelectors.clear(); + getApp()->selectionMgr()->setEnabled( true, SVTK_Viewer::Type() ); + + return SalomeApp_Module::deactivateModule( study ); +} + +//================================================================================= +// function : GeometryGUI::DefinePopup() +// purpose : Called from desktop to define popup menu [static] +//================================================================================= +/* +void GeometryGUI::DefinePopup(QString& theContext, QString& theParent, QString& theObject) +{ + QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy(); + SALOME_Selection* Sel = SALOME_Selection::Selection(ActiveStudy->getSelection()); + + theObject = ""; + theContext = ""; + + if ( theParent == "Viewer" ) { + if ( Sel->IObjectCount() == 0 ) + theContext = "NothingSelected"; + } + + if ( Sel->IObjectCount() == 1 ) { + Handle(SALOME_InteractiveObject) IO = Sel->firstIObject(); + if( IO->hasEntry() ) { + SALOMEDS::SObject_var sobj = ActiveStudy->getStudyDocument()->FindObjectID( IO->getEntry() ); + if ( !sobj->_is_nil() ) { + SALOMEDS::SComponent_var scomp = sobj->GetFatherComponent(); + if ( !strcmp(scomp->GetID(), IO->getEntry() ) ) { + // component is selected + theObject = "Component"; + } + else { + GEOM::GEOM_Object_var aGObj = GEOM::GEOM_Object::_narrow( sobj->GetObject() ); + if ( !CORBA::is_nil( aGObj ) ) { + switch( aGObj->GetType() ) { + case GEOM_GROUP: + theObject = "Group"; + break; + default: + theObject = "Shape"; + break; + } + } + } + } + } + } +} + +//================================================================================= +// function : GeometryGUI::CustomPopup() +// purpose : Called from desktop to create popup menu [static] +//================================================================================= +bool GeometryGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* popup, const QString& theContext, + const QString& theParent, const QString& theObject) +{ + GeometryGUI* geomGUI = GetGeomGUI(); + + // Deactivate any non modal dialog box to get the neutral point + geomGUI->EmitSignalDeactivateDialog(); + QAD_Study* anActiveStudy = parent->getActiveStudy(); + QAD_StudyFrame* aStudyFrame = anActiveStudy->getActiveStudyFrame(); + QAD_ViewFrame* aViewFrame = aStudyFrame->getRightFrame()->getViewFrame(); + SALOME_Selection* Sel = SALOME_Selection::Selection(anActiveStudy->getSelection()); + QString parentComponent = ((SALOMEGUI_Desktop*)parent)->getComponentFromSelection(); + bool isOCCViewer = aViewFrame->getTypeView() == VIEW_OCC; + bool isVTKViewer = aViewFrame->getTypeView() == VIEW_VTK; + int aDisplayMode = 0; + QString objectName; + + if ( aViewFrame->getTypeView() == VIEW_OCC ) + aDisplayMode = ((OCCViewer_ViewFrame*)aViewFrame)->getViewer()->getAISContext()->DisplayMode(); + else if ( aViewFrame->getTypeView() == VIEW_VTK ) + aDisplayMode = (dynamic_cast( aViewFrame )->getRWInteractor()->GetDisplayMode(); + + int nbSel = Sel->IObjectCount(); + + if( nbSel == 0 ) { + ////// NOTHING SELECTED + popup->clear(); + } + else if ( nbSel == 1 ) { + ////// SINGLE OBJECT SELECTION + if ( parentComponent != parent->getActiveComponent() ) { + ////// selected object does not belong to GEOM module: + // remove all commands except Display/Erase... + while ( 1 ) { + int id = popup->idAt( 0 ); + if ( id <= QAD_TopLabel_Popup_ID ) + popup->removeItemAt( 0 ); + else + break; + } + } + else { + ////// selected object belong to the GEOM module + // get interactive object + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + objectName = IObject->getName(); + // if object has entry get SObject + SALOMEDS::SObject_var SO; + if ( IObject->hasEntry() ) + SO = anActiveStudy->getStudyDocument()->FindObjectID( IObject->getEntry() ); + + if ( theObject == "Component" ) { + ////// menu for component + if ( !isOCCViewer && !isVTKViewer ) { + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + } + } + else { + ////// not component (should be shape) + if ( IObject->hasEntry() ) /////// VSR : TO BE REMOVED + popup->removeItem( 804 ); // "Add in Study" + + // Here could be analysis of the geom shape's type + // ... // + + SALOMEDS::GenericAttribute_var aTmpAttr; + if( SO->_is_nil() || SO->GetFatherComponent()->FindAttribute( aTmpAttr, "AttributeIOR") ) + popup->removeItem( 9024 ); // "Open" /////// VSR : TO BE REMOVED + + if ( !isOCCViewer && theParent == "ObjectBrowser" ) { + if ( theObject == "Shape" ) + popup->removeItem( 800 ); // Create Group + else if ( theObject == "Group" ) + popup->removeItem( 801 ); // Edit Group + } + + if ( isOCCViewer || isVTKViewer ) { + ////// current viewer is OCC or VTK + SALOME_Prs* prs = aViewFrame->CreatePrs( IObject->getEntry() ); + if ( aViewFrame->isVisible( IObject ) ) { + ////// object is already displayed in the viewer + popup->removeItem( QAD_Display_Popup_ID ); + if ( isOCCViewer ) { + ////// OCC viewer only + OCCViewer_Prs* occPrs = dynamic_cast( prs ); + if ( occPrs && !occPrs->IsNull() ) { + AIS_ListOfInteractive ioList; + occPrs->GetObjects( ioList ); + QMenuItem* mi = popup->findItem( 803 ); + if ( mi && mi->popup() ) { + if ( ioList.First()->DisplayMode() == 0 ) + mi->popup()->setItemChecked( 80311, true ); // "Wireframe" + else if ( ioList.First()->DisplayMode() == 1 ) + mi->popup()->setItemChecked( 80312, true ); // "Shading" + else if ( ioList.First()->DisplayMode() < 0 ) + mi->popup()->setItemChecked( aDisplayMode == 0 ? 80311 : 80312 , true ); // "Wireframe" or "Shading" + } + } + } + else { + ////// VTK viewer only + popup->removeItem( 8034 ); // "Isos" + SVTK_Prs* vtkPrs = dynamic_cast( prs ); + if ( vtkPrs && !vtkPrs->IsNull() ) { + vtkActorCollection* actorList = vtkPrs->GetObjects(); + actorList->InitTraversal(); + SALOME_Actor* ac = SALOME_Actor::SafeDownCast( actorList->GetNextActor() ); + QMenuItem* mi = popup->findItem( 803 ); + if ( ac && mi && mi->popup() ) { + if ( ac->getDisplayMode() == 0 ) + mi->popup()->setItemChecked( 80311, true ); // "Wireframe" + else if ( ac->getDisplayMode() == 1 ) + mi->popup()->setItemChecked( 80312, true ); // "Shading" + else + mi->popup()->setItemChecked( aDisplayMode == 0 ? 80311 : 80312 , true ); // "Wireframe" or "Shading" + } + } + } + } + else { + ////// object is not yet displayed in the viewer + popup->removeItem( 803 ); // "Display Mode" + popup->removeItem( 8032 ); // "Color" + popup->removeItem( 8033 ); // "Transparency" + popup->removeItem( 8034 ); // "Isos" + popup->removeItem( QAD_Erase_Popup_ID ); + } + delete prs; + } + else { + ////// other viewer type (neither OCC nor VTK) + popup->removeItem( 803 ); // "Display Mode" + popup->removeItem( 8032 ); // "Color" + popup->removeItem( 8033 ); // "Transparency" + popup->removeItem( 8034 ); // "Isos" + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + } + } + } + } + else { + ////// MULTIPLE SELECTION + if ( parentComponent != parent->getActiveComponent() ) { + ////// not GEOM module objects or objects belong to different modules + // remove all commands except Display/Erase... + while ( 1 ) { + int id = popup->idAt( 0 ); + if ( id <= QAD_TopLabel_Popup_ID ) + popup->removeItemAt( 0 ); + else + break; + } + if ( parentComponent.isNull() ) { + ////// objects belong to different modules + popup->removeItem(QAD_Display_Popup_ID); + popup->removeItem(QAD_DisplayOnly_Popup_ID); + popup->removeItem(QAD_Erase_Popup_ID); + } + else { + objectName = tr( "GEOM_MEN_POPUP_NAME" ).arg( nbSel ); + } + } + else { + ////// all selected objects belong to GEOM module + popup->removeItem( 901 ); // "Rename" + + SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); + bool isComponent = false; + bool needOpen = false; + bool needDisplay = false; + bool needErase = false; + int needToPublish = 0; + + for( ;It.More();It.Next() ) { + Handle(SALOME_InteractiveObject) anIObject = It.Value(); + + if ( aViewFrame->isVisible( anIObject ) ) + needErase = true; + else + needDisplay = true; + + if( anIObject->hasEntry() ) { + needToPublish = -1; /////// VSR : TO BE REMOVED + SALOMEDS::SObject_var obj = anActiveStudy->getStudyDocument()->FindObjectID( anIObject->getEntry() ); + SALOMEDS::GenericAttribute_var aTmpAttr; + if ( !obj->_is_nil() && !obj->GetFatherComponent()->FindAttribute( aTmpAttr, "AttributeIOR" ) ) + needOpen = true; /////// VSR : TO BE REMOVED + if ( !obj->_is_nil() && QString( obj->GetID() ) == QString( obj->GetFatherComponent()->GetID() ) ) + isComponent = true; + } + else { + if ( needToPublish != -1 ) needToPublish = 1; + } + } + if( needOpen || ( !isOCCViewer && !isVTKViewer ) ) { + ////// Data is not loaded yet or current viewer is neither OCC nor VTK + popup->removeItem( 803 ); // "Display Mode" + popup->removeItem( 8032 ); // "Color" + popup->removeItem( 8033 ); // "Transparency" + popup->removeItem( 8034 ); // "Isos" + popup->removeItem( 804 ); // "Add in Study" + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + } + else { + popup->removeItem( 9024 ); // "Open" + if ( needToPublish <= 0 ) + popup->removeItem( 804 ); // "Add in Study" + + if( isComponent ) { + popup->removeItem( 803 ); // "Display Mode" + popup->removeItem( 8032 ); // "Color" + popup->removeItem( 8033 ); // "Transparency" + popup->removeItem( 8034 ); // "Isos" + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + } + + if ( !needDisplay ) + popup->removeItem( QAD_Display_Popup_ID ); + if ( !needErase ) + popup->removeItem( QAD_Erase_Popup_ID ); + if ( !isOCCViewer ) + popup->removeItem( 8034 ); // "Isos" + } + } + } + + // check popup for unnecessary separators + QAD_Tools::checkPopup( popup ); + // find popup menu's TopLabel item (with title) + int topItem = popup->indexOf( QAD_TopLabel_Popup_ID ); + if ( topItem >= 0 ) { + // remove popup menu's title item + popup->removeItem( QAD_TopLabel_Popup_ID ); + if ( theParent == "Viewer" && !objectName.isEmpty() && popup->count() > 0 ) { + // set bold font for popup menu's title + QFont f = popup->font(); f.setBold( TRUE ); + popup->removeItem( QAD_TopLabel_Popup_ID ); + popup->insertItem( new CustomItem( objectName, f ), QAD_TopLabel_Popup_ID, topItem ); + } + } + + return false; +} + +*/ + +//======================================================================= +// function : GeometryGUI::BuildPresentation() +// purpose : +//======================================================================= +void GeometryGUI::BuildPresentation( const Handle(SALOME_InteractiveObject)& io, SUIT_ViewWindow* win ) +{ + //GEOM_Displayer().Display( io, false, win ); +} + +//======================================================================= +// function : setCommandsEnabled() +// purpose : update menu items' status - disable non-OCC-viewer-compatible actions +//======================================================================= +void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win ) +{ + if ( !win ) + return; + + const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() ); +// const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() ); + + // disable non-OCC viewframe menu commands +// action( 404 )->setEnabled( ViewOCC ); // SKETCHER + action( 603 )->setEnabled( ViewOCC ); // SuppressFace + action( 604 )->setEnabled( ViewOCC ); // SuppressHole + action( 606 )->setEnabled( ViewOCC ); // CloseContour + action( 607 )->setEnabled( ViewOCC ); // RemoveInternalWires + action( 608 )->setEnabled( ViewOCC ); // AddPointOnEdge +// action( 609 )->setEnabled( ViewOCC ); // Free boundaries + action( 413 )->setEnabled( ViewOCC ); // Isos Settings + + action( 800 )->setEnabled( ViewOCC ); // Create Group + action( 801 )->setEnabled( ViewOCC ); // Edit Group + + action( 9998 )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION +} + +void GeometryGUI::windows( QMap& mappa ) const +{ + mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::DockLeft ); + mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::DockBottom ); +} + +void GeometryGUI::viewManagers( QStringList& lst ) const +{ + lst.append( OCCViewer_Viewer::Type() ); +} + +void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm ) +{ + if ( vm->getType() == OCCViewer_Viewer::Type() ) + { + LightApp_SelectionMgr* sm = getApp()->selectionMgr(); + myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) ); + + // disable OCC selectors + getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() ); + for ( GEOMGUI_OCCSelector* sr = myOCCSelectors.first(); sr; sr = myOCCSelectors.next() ) + sr->setEnabled(true); + } + else if ( vm->getType() == SVTK_Viewer::Type() ) + { + LightApp_SelectionMgr* sm = getApp()->selectionMgr(); + myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast( vm->getViewModel() ), sm ) ); + + // disable VTK selectors + getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() ); + for ( LightApp_VTKSelector* sr = myVTKSelectors.first(); sr; sr = myVTKSelectors.next() ) + sr->setEnabled(true); + } +} + +void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm ) +{ + SUIT_ViewModel* viewer = vm->getViewModel(); + if ( vm->getType() == OCCViewer_Viewer::Type() ) + { + for ( GEOMGUI_OCCSelector* sr = myOCCSelectors.first(); sr; sr = myOCCSelectors.next() ) + if ( sr->viewer() == viewer ) + { + myOCCSelectors.remove( sr ); + break; + } + } + if ( vm->getType() == SVTK_Viewer::Type() ) + { + for ( LightApp_VTKSelector* sr = myVTKSelectors.first(); sr; sr = myVTKSelectors.next() ) + if ( sr->viewer() == viewer ) + { + myVTKSelectors.remove( sr ); + break; + } + } +} + +QString GeometryGUI::engineIOR() const +{ + if ( !CORBA::is_nil( GetGeomGen() ) ) + return QString( getApp()->orb()->object_to_string( GetGeomGen() ) ); + return QString( "" ); +} + +LightApp_Selection* GeometryGUI::createSelection() const +{ + return new GEOMGUI_Selection(); +} + +void GeometryGUI::contextMenuPopup( const QString& client, QPopupMenu* menu, QString& title ) +{ + SalomeApp_Module::contextMenuPopup( client, menu, title ); + SALOME_ListIO lst; + getApp()->selectionMgr()->selectedObjects( lst ); + if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) io = lst.First(); + SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); + _PTR(Study) study = appStudy->studyDS(); + _PTR(SObject) obj = study->FindObjectID( io->getEntry() ); + if ( obj ) + title = QString( obj->GetName().c_str() ); + } +} + +void GeometryGUI::createPreferences() +{ + int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) ); + + int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId ); + addPreference( tr( "PREF_SHADING_COLOR" ), genGroup, + LightApp_Preferences::Color, "Geometry", "shading_color" ); + int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup, + LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" ); + int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup, + LightApp_Preferences::Selector, "Geometry", "display_mode" ); + + setPreferenceProperty( genGroup, "columns", 1 ); + + setPreferenceProperty( step, "min", 0.001 ); + setPreferenceProperty( step, "max", 10000 ); + setPreferenceProperty( step, "precision", 3 ); + + // Set property for default display mode + QStringList aModesList; + aModesList.append( tr("MEN_WIREFRAME") ); + aModesList.append( tr("MEN_SHADING") ); + + QValueList anIndexesList; + anIndexesList.append(0); + anIndexesList.append(1); + + setPreferenceProperty( dispmode, "strings", aModesList ); + setPreferenceProperty( dispmode, "indexes", anIndexesList ); +} + +void GeometryGUI::preferencesChanged( const QString& section, const QString& param ) +{ +} + +LightApp_Displayer* GeometryGUI::displayer() +{ + if( !myDisplayer ) + myDisplayer = new GEOM_Displayer( dynamic_cast( getApp()->activeStudy() ) ); + return myDisplayer; +} diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h new file mode 100644 index 000000000..57f0d6542 --- /dev/null +++ b/src/GEOMGUI/GeometryGUI.h @@ -0,0 +1,192 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GeometryGUI.h +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#ifndef GEOMETRYGUI_H +#define GEOMETRYGUI_H + +#include "SalomeApp_Module.h" + +#include "GEOMGUI.h" +#include "GEOM_Client.hxx" +#include "SALOME_InteractiveObject.hxx" + +#include "SALOMEDSClient.hxx" + +// QT Includes +#include + +// OCCT Includes +#include + +// IDL headers +#include "SALOMEconfig.h" +#include CORBA_CLIENT_HEADER(SALOMEDS) + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//#if defined WNT +//#include +//#else +//#define SALOME_WNT_EXPORT +//#endif + +#if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS +#define GEOMGUI_WNT_EXPORT __declspec( dllexport ) +#else +#define GEOMGUI_WNT_EXPORT +#endif + +typedef QMap GUIMap; + +class QDialog; +class QPopupMenu; +class GEOMGUI_OCCSelector; +class LightApp_VTKSelector; +class LightApp_Selection; +class SUIT_ViewManager; + +//================================================================================= +// class : GeometryGUI +// purpose : +//================================================================================= +class GEOMGUI_WNT_EXPORT GeometryGUI : public SalomeApp_Module +{ + Q_OBJECT; + +public: + // Constructor + GeometryGUI(); + + // Destructor + ~GeometryGUI(); + + virtual LightApp_Displayer* displayer(); + virtual void initialize( CAM_Application* ); + virtual QString engineIOR() const; + + static bool InitGeomGen(); //BugID IPAL9186: SRN: To be called by Python scripts + + static GEOM::GEOM_Gen_var GetGeomGen();// { return GeometryGUI::myComponentGeom; } + + static CORBA::Object_var ClientSObjectToObject (_PTR(SObject) theSObject); + static SALOMEDS::Study_var ClientStudyToStudy (_PTR(Study) theStudy); + + GEOM_Client& GetShapeReader() { return myShapeReader; } + Standard_CString& GetFatherior() { return myFatherior; } + //void SetState( const int state ) { myState = state; } + //int GetState() const { return myState; } + + // Get active dialog box + QDialog* GetActiveDialogBox(){ return myActiveDialogBox; } + // Set active dialog box + void SetActiveDialogBox( QDialog* aDlg ); + + // Non modal dialog boxes management + void EmitSignalDeactivateDialog(); + void EmitSignalCloseAllDialogs(); + void EmitSignalDefaultStepValueChanged( double newVal ); + + void OnGUIEvent( int id ); + + virtual bool OnKeyPress( QKeyEvent*, SUIT_ViewWindow* ); + virtual bool OnMousePress( QMouseEvent*, SUIT_ViewWindow* ); + virtual bool OnMouseMove( QMouseEvent*, SUIT_ViewWindow* ); + +// virtual bool SetSettings(); +// virtual void SupportedViewType ( int* buffer, int bufferSize ); + virtual void BuildPresentation( const Handle(SALOME_InteractiveObject)&, SUIT_ViewWindow* = 0 ); + +// virtual void DefinePopup( QString & theContext, QString & theParent, QString & theObject); +// virtual bool CustomPopup( QAD_Desktop* parent, QPopupMenu* popup, const QString& theContext, +// const QString& theParent, const QString& theObject ); + + // The Working Plane management + void SetWorkingPlane( gp_Ax3 wp ) { myWorkingPlane = wp; } + gp_Ax3 GetWorkingPlane() { return myWorkingPlane; } + void ActiveWorkingPlane(); + + virtual void windows( QMap& ) const; + virtual void viewManagers( QStringList& ) const; + + virtual void contextMenuPopup( const QString&, QPopupMenu*, QString& ); + virtual void createPreferences(); + virtual void preferencesChanged( const QString&, const QString& ); + + +public slots: + virtual bool deactivateModule( SUIT_Study* ); + virtual bool activateModule( SUIT_Study* ); + +private slots: + void OnGUIEvent(); + void onViewManagerAdded( SUIT_ViewManager* ); + void onViewManagerRemoved( SUIT_ViewManager* ); + void onWindowActivated( SUIT_ViewWindow* ); + +signals : + void SignalDeactivateActiveDialog(); + void SignalCloseAllDialogs(); + void SignalDefaultStepValueChanged( double newVal ); + +protected: + virtual LightApp_Selection* createSelection() const; + +private: + GEOMGUI* getLibrary( const QString& libraryName ); + void createGeomAction( const int id, const QString& po_id, + const QString& icon_id = QString(""), + const int key = 0, const bool toggle = false ); + void createPopupItem( const int, const QString& clients, const QString& types, + const bool isSingle = false, const int isVisible = -1, + const bool isExpandAll = false, const bool isOCC = false, + const int parentId = -1 ); + +public: + static GEOM::GEOM_Gen_var myComponentGeom; // GEOM engine!!! +private: + GUIMap myGUIMap; // GUI libraries map + QDialog* myActiveDialogBox; // active dialog box + GEOM_Client myShapeReader; // geom shape reader + Standard_CString myFatherior; + int myState; // identify a method + gp_Ax3 myWorkingPlane; + QMap myRules; // popup rules + + QPtrList myOCCSelectors; + QPtrList myVTKSelectors; + + LightApp_Displayer* myDisplayer; + +friend class DisplayGUI; +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx new file mode 100644 index 000000000..4b249d296 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx @@ -0,0 +1,152 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ArcDriver::GetID() +{ + static Standard_GUID aArcDriver("FF1BBB35-5D14-4df2-980B-3A668264EA16"); + return aArcDriver; +} + + +//======================================================================= +//function : GEOMImpl_ArcDriver +//purpose : +//======================================================================= +GEOMImpl_ArcDriver::GEOMImpl_ArcDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IArc aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == CIRC_ARC_THREE_PNT) { + Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1(); + Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); + Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3(); + TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue(); + TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue(); + TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue(); + if (aShapePnt1.ShapeType() == TopAbs_VERTEX && + aShapePnt2.ShapeType() == TopAbs_VERTEX && + aShapePnt3.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2)); + gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3)); + if (aP1.Distance(aP2) < gp::Resolution() || + aP1.Distance(aP3) < gp::Resolution() || + aP2.Distance(aP3) < gp::Resolution()) + 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(); + } + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ArcDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ArcDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ArcDriver", + sizeof(GEOMImpl_ArcDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ArcDriver) Handle(GEOMImpl_ArcDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ArcDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ArcDriver))) { + _anOtherObject = Handle(GEOMImpl_ArcDriver)((Handle(GEOMImpl_ArcDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ArcDriver.hxx b/src/GEOMImpl/GEOMImpl_ArcDriver.hxx new file mode 100644 index 000000000..df27e163b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ArcDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ArcDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ArcDriver_HeaderFile +#define _GEOMImpl_ArcDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ArcDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ArcDriver); + +class Handle(GEOMImpl_ArcDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ArcDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ArcDriver)(const Handle(GEOMImpl_ArcDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ArcDriver)(const GEOMImpl_ArcDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ArcDriver)& operator=(const Handle(GEOMImpl_ArcDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ArcDriver)& operator=(const GEOMImpl_ArcDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ArcDriver* operator->() + { + return (GEOMImpl_ArcDriver *)ControlAccess(); + } + + GEOMImpl_ArcDriver* operator->() const + { + return (GEOMImpl_ArcDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ArcDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ArcDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ArcDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ArcDriver(); +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_ArcDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ArcDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ArcDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ArcDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx b/src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx new file mode 100644 index 000000000..ae6487e62 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ArchimedeDriver.cxx @@ -0,0 +1,187 @@ +// 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/ +// + +#include "GEOMImpl_ArchimedeDriver.hxx" +#include "GEOMImpl_IArchimede.hxx" +#include "GEOMImpl_Types.hxx" + +#include "Archimede_VolumeSection.hxx" + +#include + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include + +using namespace std; + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ArchimedeDriver::GetID() +{ + static Standard_GUID aArchimedeDriver("FF1BBB59-5D14-4df2-980B-3A668264EA16"); + return aArchimedeDriver; +} + + +//======================================================================= +//function : GEOMImpl_ArchimedeDriver +//purpose : +//======================================================================= + +GEOMImpl_ArchimedeDriver::GEOMImpl_ArchimedeDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ArchimedeDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + Standard_Integer aType = aFunction->GetType(); + if (aType != ARCHIMEDE_TYPE) return 0; + + GEOMImpl_IArchimede IA (aFunction); + + Handle(GEOM_Function) aShapeFunction = IA.GetBasicShape(); + if (aShapeFunction.IsNull()) return 0; + TopoDS_Shape shape = aShapeFunction->GetValue(); + if(shape.IsNull()) return 0; + + Standard_Real aWaterDensity = IA.GetDensity(); + Standard_Real aWeight = IA.GetWeight(); + Standard_Real aMeshingDeflection = IA.GetDeflection(); + + double cste = -1; + if (aWaterDensity != 0.) + cste = aWeight/aWaterDensity; + else + return 0; + + gp_Dir direct (0.0, 0.0, 1.0); + gp_Pnt PosPlan (0.0, 0.0, 0.0); + Geom_Plane PP (PosPlan, direct); + Handle(Geom_Plane) P = Handle(Geom_Plane)::DownCast(PP.Copy()); + + gp_Dir Zdirection (0.0, 0.0, 1.0); + VolumeSection VOL (shape, aMeshingDeflection); + VOL.SetPlane(P); + Handle(Geom_RectangularTrimmedSurface) SurfaceTrimmee; + + if (Zdirection.IsEqual(direct, Precision::Angular()) == Standard_False) { + VOL.MakeRotation(direct); + } + + VOL.CenterOfGravity(); + SurfaceTrimmee = VOL.TrimSurf(); + Standard_Real Cote = VOL.Archimede(cste, aMeshingDeflection); + + if (Cote == -1) { + double Zmin,Zmax; + VOL.getZ(Zmin,Zmax); + double volume = VOL.CalculateVolume(Zmax) * aWaterDensity; + + char msg[100] = ""; + sprintf(msg, "shape sinks to the bottom : Weigth max = %.1f", volume); + + StdFail_NotDone::Raise(msg); + } + + SurfaceTrimmee = VOL.AjustePlan(SurfaceTrimmee,Cote,PosPlan); + if (Zdirection.IsEqual(direct,Precision::Angular()) == Standard_False) { + SurfaceTrimmee = VOL.InvMakeRotation(direct,SurfaceTrimmee); + } + + Standard_Real u1,u2,v1,v2; + SurfaceTrimmee->Bounds(u1,u2,v1,v2); + TopoDS_Face tirant = BRepBuilderAPI_MakeFace(SurfaceTrimmee, u1, u2, v1, v2); + + if (tirant.IsNull()) { + StdFail_NotDone::Raise("Failed to build secant face"); + } + + aFunction->SetValue(tirant); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ArchimedeDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ArchimedeDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ArchimedeDriver", + sizeof(GEOMImpl_ArchimedeDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_ArchimedeDriver) Handle(GEOMImpl_ArchimedeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ArchimedeDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ArchimedeDriver))) { + _anOtherObject = Handle(GEOMImpl_ArchimedeDriver)((Handle(GEOMImpl_ArchimedeDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx b/src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx new file mode 100644 index 000000000..ab15bfe18 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ArchimedeDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ArchimedeDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ArchimedeDriver_HeaderFile +#define _GEOMImpl_ArchimedeDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ArchimedeDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ArchimedeDriver); + +class Handle(GEOMImpl_ArchimedeDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ArchimedeDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ArchimedeDriver)(const Handle(GEOMImpl_ArchimedeDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ArchimedeDriver)(const GEOMImpl_ArchimedeDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ArchimedeDriver)& operator=(const Handle(GEOMImpl_ArchimedeDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ArchimedeDriver)& operator=(const GEOMImpl_ArchimedeDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ArchimedeDriver* operator->() + { + return (GEOMImpl_ArchimedeDriver *)ControlAccess(); + } + + GEOMImpl_ArchimedeDriver* operator->() const + { + return (GEOMImpl_ArchimedeDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ArchimedeDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ArchimedeDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ArchimedeDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ArchimedeDriver(); +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_ArchimedeDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ArchimedeDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ArchimedeDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ArchimedeDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx b/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx new file mode 100644 index 000000000..a73609e60 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Block6Explorer.cxx @@ -0,0 +1,1287 @@ +// 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/ +// +#include + +#include + +#include + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#define NBFACES 6 +#define NBEDGES 12 +#define NBVERTS 8 + +static Standard_Integer mod4 (Standard_Integer nb) +{ + if (nb <= 0) return nb + 4; + if (nb > 4) return nb - 4; + return nb; +} + +static Standard_Integer edge_id (const Standard_Integer theFaceID, + const Standard_Integer theEdgeNB) +{ + static Standard_Integer edge_ids[NBFACES][4] = { + { 1, 2, 3, 4 }, // face 1 + { 5, 6, 7, 8 }, // face 2 + { 9, 5, 10, 1 }, // face 3 + { 12, 7, 11, 3 }, // face 4 + { 4, 12, 8, 9 }, // face 5 + { 2, 11, 6, 10 } }; // face 6 + + return edge_ids[theFaceID - 1][theEdgeNB - 1]; +} + +static Standard_Integer side_edge_id (const Standard_Integer theEdgeNB) +{ + static Standard_Integer side_edge_ids[4] = {9, 10, 11, 12}; + + return side_edge_ids[theEdgeNB - 1]; +} + +static Standard_Integer vertex_id (const Standard_Integer theFaceID, + const Standard_Integer theVertexNB) +{ + static Standard_Integer vertex_ids[NBFACES][4] = { + { 1, 2, 3, 4 }, // face 1 + { 5, 6, 7, 8 }, // face 2 + { 1, 5, 6, 2 }, // face 3 + { 4, 8, 7, 3 }, // face 4 + { 1, 4, 8, 5 }, // face 5 + { 2, 3, 7, 6 } }; // face 6 + + return vertex_ids[theFaceID - 1][theVertexNB - 1]; +} + +static Standard_Integer vertex_id_edge (const Standard_Integer theEdgeID, // [1,12] + const Standard_Integer theVertexNB) // [1,2] +{ + static Standard_Integer vertex_ids_edge[NBEDGES][2] = { + {1, 2}, // edge 1 + {2, 3}, // edge 2 + {3, 4}, // edge 3 + {4, 1}, // edge 4 + {5, 6}, // edge 5 + {6, 7}, // edge 6 + {7, 8}, // edge 7 + {8, 5}, // edge 8 + {1, 5}, // edge 9 + {2, 6}, // edge 10 + {3, 7}, // edge 11 + {4, 8} }; // edge 12 + + return vertex_ids_edge[theEdgeID - 1][theVertexNB - 1]; +} + +static Standard_Integer face_id_edges (const Standard_Integer theEdge1ID, // [1,12] + const Standard_Integer theEdge2ID) // [1,12] +{ + static Standard_Integer face_ids_edges[NBEDGES][NBEDGES] = { + // 1 2 3 4 5 6 7 8 9 10 11 12 + { 0, 1, 1, 1, 3, 0, 0, 0, 3, 3, 0, 0 }, // edge 1 + { 1, 0, 1, 1, 0, 6, 0, 0, 0, 6, 6, 0 }, // edge 2 + { 1, 1, 0, 1, 0, 0, 4, 0, 0, 0, 4, 4 }, // edge 3 + { 1, 1, 1, 0, 0, 0, 0, 5, 5, 0, 0, 5 }, // edge 4 + { 3, 0, 0, 0, 0, 2, 2, 2, 3, 3, 0, 0 }, // edge 5 + { 0, 6, 0, 0, 2, 0, 2, 2, 0, 6, 6, 0 }, // edge 6 + { 0, 0, 4, 0, 2, 2, 0, 2, 0, 0, 4, 4 }, // edge 7 + { 0, 0, 0, 5, 2, 2, 2, 0, 5, 0, 0, 5 }, // edge 8 + { 3, 0, 0, 5, 3, 0, 0, 5, 0, 3, 0, 5 }, // edge 9 + { 3, 6, 0, 0, 3, 6, 0, 0, 3, 0, 6, 0 }, // edge 10 + { 0, 6, 4, 0, 0, 6, 4, 0, 0, 6, 0, 4 }, // edge 11 + { 0, 0, 4, 5, 0, 0, 4, 5, 5, 0, 4, 0 } }; // edge 12 + + return face_ids_edges[theEdge1ID - 1][theEdge2ID - 1]; +} + +static Standard_Integer edge_id_vertices (const Standard_Integer theVertex1ID, // [1,8] + const Standard_Integer theVertex2ID) // [1,8] +{ + static Standard_Integer edge_ids_vertices[NBVERTS][NBVERTS] = { + // 1 2 3 4 5 6 7 8 + { 0, 1, 0, 4, 9, 0, 0, 0}, // vertex 1 + { 1, 0, 2, 0, 0, 10, 0, 0}, // vertex 2 + { 0, 2, 0, 3, 0, 0, 11, 0}, // vertex 3 + { 4, 0, 3, 0, 0, 0, 0, 12}, // vertex 4 + { 9, 0, 0, 0, 0, 5, 0, 8}, // vertex 5 + { 0, 10, 0, 0, 5, 0, 6, 0}, // vertex 6 + { 0, 0, 11, 0, 0, 6, 0, 7}, // vertex 7 + { 0, 0, 0, 12, 8, 0, 7, 0} }; // vertex 8 + + return edge_ids_vertices[theVertex1ID - 1][theVertex2ID - 1]; +} + +static Standard_Integer edge_id_faces (const Standard_Integer theFace1ID, // [1,6] + const Standard_Integer theFace2ID) // [1,6] +{ + static Standard_Integer edge_ids_faces[NBFACES][NBFACES] = { + // 1 2 3 4 5 6 + { 0, 0, 1, 3, 4, 2 }, // face 1 + { 0, 0, 5, 7, 8, 6 }, // face 2 + { 1, 5, 0, 0, 9, 10 }, // face 3 + { 3, 7, 0, 0, 12, 11 }, // face 4 + { 4, 8, 9, 12, 0, 0 }, // face 5 + { 2, 6, 10, 11, 0, 0 } }; // face 6 + + return edge_ids_faces[theFace1ID - 1][theFace2ID - 1]; +} + +//======================================================================= +//function : GEOMImpl_Block6Explorer +//purpose : Constructor +//======================================================================= +GEOMImpl_Block6Explorer::GEOMImpl_Block6Explorer () + : myFaces(1,NBFACES), myEdges(1,NBEDGES), myVertices(1,NBVERTS) +{ +} + +//======================================================================= +//function : GetVertex +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_Block6Explorer::GetVertex (const Standard_Integer theVertexID) +{ + TopoDS_Shape aNullShape; + if (theVertexID < 1 || theVertexID > NBVERTS) return aNullShape; + return myVertices(theVertexID); +} + +//======================================================================= +//function : GetVertexID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetVertexID (const TopoDS_Shape& theVertex) +{ + for (Standard_Integer id = 1; id <= NBVERTS; id++) { + if (theVertex.IsSame(myVertices(id))) return id; + } + Standard_NoSuchObject::Raise("The Vertex does not belong to the Block"); + return 0; +} + +//======================================================================= +//function : GetVertexID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetVertexID (const Standard_Integer theFaceID, + const Standard_Integer theVertexNB) +{ + return vertex_id(theFaceID, theVertexNB); +} + +//======================================================================= +//function : GetVertexOnEdgeID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetVertexOnEdgeID + (const Standard_Integer theEdgeID, + const Standard_Integer theVertexNB) +{ + return vertex_id_edge(theEdgeID, theVertexNB); +} + +//======================================================================= +//function : GetEdge +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_Block6Explorer::GetEdge (const Standard_Integer theEdgeID, + const Standard_Boolean doMake) +{ + TopoDS_Shape aNullShape; + if (theEdgeID < 1 || theEdgeID > NBEDGES) return aNullShape; + if (myEdges(theEdgeID).IsNull() && doMake) { + // Create the required edge as a linear segment between + // corresponding vertices and put it in the Block's edges + BRepBuilderAPI_MakeEdge ME (TopoDS::Vertex(myVertices(vertex_id_edge(theEdgeID, 1))), + TopoDS::Vertex(myVertices(vertex_id_edge(theEdgeID, 2)))); + if (!ME.IsDone()) { + Standard_ConstructionError::Raise("Edge construction failed"); + } + myEdges(theEdgeID) = ME.Shape(); + } + + return myEdges(theEdgeID); +} + +//======================================================================= +//function : GetEdgeID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetEdgeID (const TopoDS_Shape& theEdge) +{ + for (Standard_Integer id = 1; id <= NBEDGES; id++) { + if (theEdge.IsSame(myEdges(id))) return id; + } + Standard_NoSuchObject::Raise("The Edge does not belong to the Block"); + return 0; +} + +//======================================================================= +//function : GetEdgeID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetEdgeID (const Standard_Integer theFaceID, + const Standard_Integer theEdgeNB) +{ + return edge_id(theFaceID, theEdgeNB); +} + +//======================================================================= +//function : FindEdgeID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::FindEdgeID (const Standard_Integer theVertex1ID, + const Standard_Integer theVertex2ID) +{ + return edge_id_vertices(theVertex1ID, theVertex2ID); +} + +//======================================================================= +//function : FindCommonEdgeID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::FindCommonEdgeID + (const Standard_Integer theFace1ID, + const Standard_Integer theFace2ID) +{ + return edge_id_faces(theFace1ID, theFace2ID); +} + +//======================================================================= +//function : GetFace +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_Block6Explorer::GetFace (const Standard_Integer theFaceID, + const Standard_Boolean doMake) +{ + TopoDS_Shape aNullShape; + if (theFaceID < 1 || theFaceID > NBFACES) return aNullShape; + + if (myFaces(theFaceID).IsNull() && doMake) { + + // Create the required face between + // corresponding edges and put it in the Block's faces + + TopoDS_Shape E1 = GetEdge(edge_id(theFaceID, 1), doMake); + TopoDS_Shape E2 = GetEdge(edge_id(theFaceID, 2), doMake); + TopoDS_Shape E3 = GetEdge(edge_id(theFaceID, 3), doMake); + TopoDS_Shape E4 = GetEdge(edge_id(theFaceID, 4), doMake); + + BRepBuilderAPI_MakeWire MW (TopoDS::Edge(E1), + TopoDS::Edge(E2), + TopoDS::Edge(E3), + TopoDS::Edge(E4)); + if (!MW.IsDone()) { + Standard_ConstructionError::Raise("Wire construction failed"); + } + TopoDS_Shape aFace; + MakeFace(MW, Standard_False, aFace); + if (aFace.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + myFaces(theFaceID) = aFace; + } + + return myFaces(theFaceID); +} + +//======================================================================= +//function : GetFaceID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetFaceID (const TopoDS_Shape& theFace) +{ + for (Standard_Integer id = 1; id <= NBFACES; id++) { + if (theFace.IsSame(myFaces(id))) return id; + } + Standard_NoSuchObject::Raise("The Face does not belong to the Block"); + return 0; +} + +//======================================================================= +//function : FindFaceID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::FindFaceID (const Standard_Integer theEdge1ID, + const Standard_Integer theEdge2ID) +{ + return face_id_edges(theEdge1ID, theEdge2ID); +} + +//======================================================================= +//function : GetOppositeFaceID +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::GetOppositeFaceID (const Standard_Integer theFaceID) +{ + Standard_Integer opp_face_id[NBFACES + 1] = { + 0, + 2, // to 1 face + 1, // to 2 face + 4, // to 3 face + 3, // to 4 face + 6, // to 5 face + 5}; // to 6 face + + return opp_face_id[theFaceID]; +} + +//======================================================================= +//function : IsSimilarFaces +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_Block6Explorer::IsSimilarFaces (const Standard_Integer theFace1ID, + const Standard_Integer theFace2ID, + const gp_Trsf theTransformation) +{ + Standard_Integer common_edge_id = FindCommonEdgeID(theFace1ID, theFace2ID); + + if (common_edge_id == 0) { // opposite faces + for (Standard_Integer id = 1; id <= 4; id++) { + TopoDS_Shape E1 = GetEdge(edge_id(theFace1ID, id)); + TopoDS_Shape E2 = GetEdge(edge_id(theFace2ID, id)); + + BRepBuilderAPI_Transform aTrsf (E1, theTransformation, Standard_False); + if (!IsSimilarEdges(aTrsf.Shape(), E2)) + return Standard_False; + } + } else { // the faces have common edge + TopTools_Array1OfShape aVerts1 (1,4); + TopTools_Array1OfShape aVerts2 (1,4); + + Standard_Integer common_vertex1 = GetVertexOnEdgeID(common_edge_id, 1); + Standard_Integer common_vertex2 = GetVertexOnEdgeID(common_edge_id, 2); + aVerts1(1) = myVertices(common_vertex1); + aVerts1(2) = myVertices(common_vertex2); + aVerts2(1) = myVertices(common_vertex1); + aVerts2(2) = myVertices(common_vertex2); + + Standard_Integer not_common_v11 = 0, not_common_v12 = 0; + Standard_Integer vnb, vid; + for (vnb = 1; vnb <= 4; vnb++) { + vid = GetVertexID(theFace1ID, vnb); + if (vid != common_vertex1 && FindEdgeID(vid, common_vertex1) == 0) { + not_common_v12 = vid; + } else { + if (vid != common_vertex2 && FindEdgeID(vid, common_vertex2) == 0) { + not_common_v11 = vid; + } + } + } + + Standard_Integer not_common_v21 = 0, not_common_v22 = 0; + for (vnb = 1; vnb <= 4; vnb++) { + vid = GetVertexID(theFace2ID, vnb); + if (vid != common_vertex1 && FindEdgeID(vid, common_vertex1) == 0) { + not_common_v22 = vid; + } else { + if (vid != common_vertex2 && FindEdgeID(vid, common_vertex2) == 0) { + not_common_v21 = vid; + } + } + } + aVerts1(3) = myVertices(not_common_v11); + aVerts1(4) = myVertices(not_common_v12); + aVerts2(3) = myVertices(not_common_v21); + aVerts2(4) = myVertices(not_common_v22); + + for (Standard_Integer id = 1; id <= 4; id++) { + BRepBuilderAPI_Transform aTrsf (aVerts1(id), theTransformation, Standard_False); + TopoDS_Vertex V1 = TopoDS::Vertex(aTrsf.Shape()); + TopoDS_Vertex V2 = TopoDS::Vertex(aVerts2(id)); + if (!BRepTools::Compare(V1, V2)) { + return Standard_False; + } + } + } + + return Standard_True; +} + +//============ Initialization methods =================================== + +//======================================================================= +//function : InitByBlock +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::InitByBlock (const TopoDS_Shape& theBlock) +{ + // 1. Find any one face of the block + TopExp_Explorer faces (theBlock, TopAbs_FACE); + if (!faces.More()) { + Standard_ConstructionError::Raise("The block has no faces"); + } + TopoDS_Shape aFirstFace = faces.Current(); + + // 2. Store all elements of the block relatively aFirstFace + InitByBlockAndFace(theBlock, aFirstFace); +} + +//======================================================================= +//function : InitByBlockAndFace +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::InitByBlockAndFace (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace) +{ + myFaces(1) = theFace; + + // 2. Get wire of the first face + TopExp_Explorer wires (myFaces(1), TopAbs_WIRE); + if (!wires.More()) { + Standard_ConstructionError::Raise("A face of the block has no wires"); + } + TopoDS_Shape aWire = wires.Current(); + wires.Next(); + if (wires.More()) { + Standard_ConstructionError::Raise("A face of the block has more than one wires"); + } + + // 3. Explore wire to init edges and vertices of the first face + BRepTools_WireExplorer aWE (TopoDS::Wire(aWire), TopoDS::Face(myFaces(1))); + Standard_Integer nb = 1; + for (; aWE.More(); aWE.Next(), nb++) { + if (nb > 4) { + Standard_ConstructionError::Raise("A face of the block has more than four edges"); + } + myEdges(edge_id(1, nb)) = aWE.Current(); + myVertices(vertex_id(1, nb)) = aWE.CurrentVertex(); + } + if (nb < 5) { + Standard_ConstructionError::Raise("A face of the block has less than four edges"); + } + + // 2. Store all other elements of the block + InitByBlockAndVertices (theBlock, + myVertices(vertex_id(1,1)), + myVertices(vertex_id(1,2)), + myVertices(vertex_id(1,3))); +} + +//======================================================================= +//function : InitByBlockAndEdges +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::InitByBlockAndEdges (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theEdge1, + const TopoDS_Shape& theEdge3) +{ + // 1. Store vertices and edges of the first face + + // 1.1. Store two given edges + myEdges(edge_id(1, 1)) = theEdge1; + myEdges(edge_id(1, 3)) = theEdge3; + + // 1.2. Find and store the first face + TopTools_IndexedDataMapOfShapeListOfShape MEF; + MapShapesAndAncestors(theBlock, TopAbs_EDGE, TopAbs_FACE, MEF); + if (MEF.Extent() != NBEDGES) { + Standard_TypeMismatch::Raise("Block has wrong number of edges"); + } + const TopTools_ListOfShape& aFacesOfE1 = MEF.FindFromKey(theEdge1); + const TopTools_ListOfShape& aFacesOfE3 = MEF.FindFromKey(theEdge3); + + Standard_Boolean isFound = Standard_False; + TopTools_ListIteratorOfListOfShape anIterF1 (aFacesOfE1); + for (; anIterF1.More() && !isFound; anIterF1.Next()) { + + TopTools_ListIteratorOfListOfShape anIterF3 (aFacesOfE3); + for (; anIterF3.More() && !isFound; anIterF3.Next()) { + + if (anIterF1.Value().IsSame(anIterF3.Value())) { + isFound = Standard_True; + + // Store the face, defined by two opposite edges + myFaces(1) = anIterF1.Value(); + } + } + } + if (!isFound) { + Standard_ConstructionError::Raise + ("Edges 1 and 2 do not belong to one face of the block"); + } + + // 1.3. Make vertices of the first edge the first and the + // second vertices of the first face. Order is free. + TopoDS_Edge E = TopoDS::Edge(theEdge1); + TopoDS_Vertex V1, V2; + TopExp::Vertices(E, V1, V2, Standard_True); + myVertices(vertex_id(1,1)) = V1; + myVertices(vertex_id(1,2)) = V2; + + // Init maps vertex->list_of_edges for the face + TopTools_IndexedDataMapOfShapeListOfShape M1; + MapShapesAndAncestors(myFaces(1), TopAbs_VERTEX, TopAbs_EDGE, M1); + if (M1.Extent() != 4) { + Standard_TypeMismatch::Raise("The first face of block has wrong number of vertices"); + } + + // 1.4. Find and store others elements of the first face + + // edges of the first vertex + TopoDS_Shape E1_f = M1.FindFromKey(V1).First(); + TopoDS_Shape E1_l = M1.FindFromKey(V1).Last(); + + if (E1_f.IsSame(theEdge1)) { + myEdges(edge_id(1, 4)) = E1_l; + } else { + myEdges(edge_id(1, 4)) = E1_f; + } + + // fourth vertex + TopoDS_Edge E4 = TopoDS::Edge(myEdges(edge_id(1, 4))); + TopoDS_Vertex V41, V42; + TopExp::Vertices(E4, V41, V42, Standard_True); + if (V41.IsSame(V1)) { + myVertices(vertex_id(1,4)) = V42; + } else { + myVertices(vertex_id(1,4)) = V41; + } + + // edges of the second vertex + TopoDS_Shape E2_f = M1.FindFromKey(V2).First(); + TopoDS_Shape E2_l = M1.FindFromKey(V2).Last(); + + if (E2_f.IsSame(theEdge1)) { + myEdges(edge_id(1, 2)) = E2_l; + } else { + myEdges(edge_id(1, 2)) = E2_f; + } + + // fird vertex + TopoDS_Edge E2 = TopoDS::Edge(myEdges(edge_id(1, 2))); + TopoDS_Vertex V21, V22; + TopExp::Vertices(E2, V21, V22, Standard_True); + if (V21.IsSame(V2)) { + myVertices(vertex_id(1,3)) = V22; + } else { + myVertices(vertex_id(1,3)) = V21; + } + + // 2. Store all other elements of the block + InitByBlockAndVertices (theBlock, + myVertices(vertex_id(1,1)), + myVertices(vertex_id(1,2)), + myVertices(vertex_id(1,3))); +} + +//======================================================================= +//function : InitByBlockAndVertices +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::InitByBlockAndVertices (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theVertex1, + const TopoDS_Shape& theVertex2, + const TopoDS_Shape& theVertex3) +{ + // Here we suppose, that vertices are ordered, i.e. exists edge between + // theVertex1 and theVertex2 and edge between theVertex2 and theVertex3 + + // 1. Store vertices and edges of the first face. + // If the first face is initialized, it means, that this + // method is called from another initialization method, and all + // vertices and edges of the first face are also initialized + if (myFaces(1).IsNull()) { + + // 1.1. Store first three vertices + myVertices(vertex_id(1, 1)) = theVertex1; + myVertices(vertex_id(1, 2)) = theVertex2; + myVertices(vertex_id(1, 3)) = theVertex3; + + // 1.2. Find and store the first face + TopTools_IndexedDataMapOfShapeListOfShape MVF; + MapShapesAndAncestors(theBlock, TopAbs_VERTEX, TopAbs_FACE, MVF); + if (MVF.Extent() != NBVERTS) { + Standard_TypeMismatch::Raise("Block has wrong number of vertices"); + } + const TopTools_ListOfShape& aFacesOfV1 = MVF.FindFromKey(theVertex1); + const TopTools_ListOfShape& aFacesOfV3 = MVF.FindFromKey(theVertex3); + + Standard_Boolean isFound = Standard_False; + TopTools_ListIteratorOfListOfShape anIterF1 (aFacesOfV1); + for (; anIterF1.More() && !isFound; anIterF1.Next()) { + + TopTools_ListIteratorOfListOfShape anIterF3 (aFacesOfV3); + for (; anIterF3.More() && !isFound; anIterF3.Next()) { + + if (anIterF1.Value().IsSame(anIterF3.Value())) { + isFound = Standard_True; + + // Store the face, defined by two opposite vertices + myFaces(1) = anIterF1.Value(); + } + } + } + if (!isFound) { + Standard_ConstructionError::Raise + ("Vertices 1 and 3 do not belong to one face of the block"); + } + + // Init maps vertex->list_of_edges for the face + TopTools_IndexedDataMapOfShapeListOfShape M1; + MapShapesAndAncestors(myFaces(1), TopAbs_VERTEX, TopAbs_EDGE, M1); + if (M1.Extent() != 4) { + Standard_TypeMismatch::Raise("The first face of block has wrong number of vertices"); + } + + // 1.3. Find and store edges and last vertex of the first face + const TopTools_ListOfShape& anEdgesOfV1 = M1.FindFromKey(theVertex1); + const TopTools_ListOfShape& anEdgesOfV2 = M1.FindFromKey(theVertex2); + const TopTools_ListOfShape& anEdgesOfV3 = M1.FindFromKey(theVertex3); + + TopTools_ListIteratorOfListOfShape anIterE2 (anEdgesOfV2); + for (; anIterE2.More(); anIterE2.Next()) { + + TopTools_ListIteratorOfListOfShape anIterE1 (anEdgesOfV1); + for (; anIterE1.More(); anIterE1.Next()) { + + if (anIterE1.Value().IsSame(anIterE2.Value())) { + // Store the first edge, defined by two vertices + myEdges(edge_id(1,1)) = anIterE1.Value(); + + } else { + // Store the last edge + myEdges(edge_id(1,4)) = anIterE1.Value(); + + // Find and store the last vertex + TopoDS_Edge E = TopoDS::Edge(myEdges(4)); + TopoDS_Vertex V1, V2; + TopExp::Vertices(E, V1, V2, Standard_True); + + if (V1.IsSame(theVertex1)) { + myVertices(vertex_id(1,4)) = V2; + } else { + myVertices(vertex_id(1,4)) = V1; + } + } + } + + TopTools_ListIteratorOfListOfShape anIterE3 (anEdgesOfV3); + for (; anIterE3.More(); anIterE3.Next()) { + + if (anIterE3.Value().IsSame(anIterE2.Value())) { + // Store the second edge, defined by two vertices + myEdges(edge_id(1,2)) = anIterE3.Value(); + + } else { + // Store the fird edge + myEdges(edge_id(1,3)) = anIterE3.Value(); + } + } + } + } + + // Init map vertex->list_of_edges for the block + TopTools_IndexedDataMapOfShapeListOfShape MB; + MapShapesAndAncestors(theBlock, TopAbs_VERTEX, TopAbs_EDGE, MB); + if (MB.Extent() != NBVERTS) { + Standard_TypeMismatch::Raise("Block has wrong number of vertices"); + } + + // 2. Store edges, linking the first face with the second one + // and vertices of the second face + TopTools_IndexedMapOfShape aFaceEdges; + TopExp::MapShapes(myFaces(1), TopAbs_EDGE, aFaceEdges); + + Standard_Integer i = 1; + for (; i <= 4; i++) { + // Get i-th vertex of the face 1 + TopoDS_Shape Vi = myVertices(vertex_id(1, i)); + if (!MB.Contains(Vi)) { + Standard_ConstructionError::Raise("Face does not belong to the block"); + } + + // Get list of block's edges, sharing this Vertex + const TopTools_ListOfShape& anEdgesOfVi = MB.FindFromKey(Vi); + TopTools_ListIteratorOfListOfShape anEdgesIter (anEdgesOfVi); + + // Get Edge (from the List), not belonging to the face 1 + Standard_Boolean isFound = Standard_False; + for (; anEdgesIter.More() && !isFound; anEdgesIter.Next()) { + if (!aFaceEdges.Contains(anEdgesIter.Value())) { + isFound = Standard_True; + + // Store the linking edge + TopoDS_Shape aLinkEdge = anEdgesIter.Value(); + myEdges(side_edge_id(i)) = aLinkEdge; + + // Get another vertex of the linking edge + TopoDS_Edge E = TopoDS::Edge(aLinkEdge); + TopoDS_Vertex V1, V2; + TopExp::Vertices(E, V1, V2, Standard_True); + + // Store the i-th vertex of the second (opposite to the first) face + if (V1.IsSame(Vi)) { + myVertices(vertex_id(2, i)) = V2; + } else { + myVertices(vertex_id(2, i)) = V1; + } + } + } + } + + // 3. Store edges of the second (opposite to the first) face + for (i = 1; i <= 4; i++) { + // Get i-th and (i+1)-th vertices of the face 2 + TopoDS_Shape Vi = myVertices(vertex_id(2, i)); + TopoDS_Shape Vj = myVertices(vertex_id(2, mod4(i + 1))); + + // Get list of block's edges, sharing Vi + const TopTools_ListOfShape& anEdgesOfVi = MB.FindFromKey(Vi); + // Get list of block's edges, sharing Vj + const TopTools_ListOfShape& anEdgesOfVj = MB.FindFromKey(Vj); + + // Get Edge (from the List), linking this vertex with the next one + Standard_Boolean isFound = Standard_False; + TopTools_ListIteratorOfListOfShape anEdgesIteri (anEdgesOfVi); + for (; anEdgesIteri.More() && !isFound; anEdgesIteri.Next()) { + + TopTools_ListIteratorOfListOfShape anEdgesIterj (anEdgesOfVj); + for (; anEdgesIterj.More() && !isFound; anEdgesIterj.Next()) { + + if (anEdgesIteri.Value().IsSame(anEdgesIterj.Value())) { + isFound = Standard_True; + + // Store the linking edge + myEdges(edge_id(2, i)) = anEdgesIteri.Value(); + } + } + } + } + + // 4. Store faces of the block + TopTools_IndexedDataMapOfShapeListOfShape MBE; + MapShapesAndAncestors(theBlock, TopAbs_EDGE, TopAbs_FACE, MBE); + if (MBE.Extent() != NBEDGES) { + Standard_TypeMismatch::Raise("Block has wrong number of edges"); + } + + for (i = 2; i <= NBFACES; i++) { + TopoDS_Shape Ei1 = myEdges(edge_id(i, 1)); + TopoDS_Shape Ei2 = myEdges(edge_id(i, 2)); + const TopTools_ListOfShape& aFacesOfEi1 = MBE.FindFromKey(Ei1); + const TopTools_ListOfShape& aFacesOfEi2 = MBE.FindFromKey(Ei2); + + Standard_Boolean isFound = Standard_False; + TopTools_ListIteratorOfListOfShape anIterEi1 (aFacesOfEi1); + for (; anIterEi1.More() && !isFound; anIterEi1.Next()) { + + TopTools_ListIteratorOfListOfShape anIterEi2 (aFacesOfEi2); + for (; anIterEi2.More() && !isFound; anIterEi2.Next()) { + + if (anIterEi1.Value().IsSame(anIterEi2.Value())) { + isFound = Standard_True; + + // Store the face, defined by two edges + myFaces(i) = anIterEi1.Value(); + } + } + } + } +} + +//======================================================================= +//function : InitByTwoFaces +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::InitByTwoFaces (const TopoDS_Shape& theFace1, + const TopoDS_Shape& theFace2) +{ + if (theFace1.IsSame(theFace2)) { + Standard_ConstructionError::Raise("The faces must be different"); + } + + // Add two given faces in the structure + myFaces(1) = theFace1; + myFaces(2) = theFace2; + + // Step 1. Order vertices (and edges) + + // 1.1. Ordered vertices and edges of the first face we put in + + // Get wire of the first face + TopExp_Explorer wires1 (myFaces(1), TopAbs_WIRE); + if (!wires1.More()) { + Standard_ConstructionError::Raise("A face for the block has no wires"); + } + TopoDS_Shape aWire1 = wires1.Current(); + wires1.Next(); + if (wires1.More()) { + Standard_ConstructionError::Raise("A face for the block has more than one wire"); + } + + BRepTools_WireExplorer aWE1 (TopoDS::Wire(aWire1), TopoDS::Face(myFaces(1))); + Standard_Integer nb; + for (nb = 1; aWE1.More(); aWE1.Next(), nb++) { + if (nb > 4) { + Standard_ConstructionError::Raise("A face for the block has more than four edges"); + } + myEdges(edge_id(1, nb)) = aWE1.Current(); + myVertices(vertex_id(1, nb)) = aWE1.CurrentVertex(); + } + if (nb < 5) { + Standard_ConstructionError::Raise("A face for the block has less than four edges"); + } + + // 1.2. Ordered vertices and edges of the second face we temporarily store + // in arrays, to find for them rigth location in on the Step 2. + + // declare arrays + TopTools_Array1OfShape aVertis2(1,4); // ordered vertices of the second face + TopTools_Array1OfShape anEdges2(1,4); // anEdges2(i) links aVertis2(i) and aVertis2(i+1) + + // Get wire of the second face + TopExp_Explorer wires2 (myFaces(2), TopAbs_WIRE); + if (!wires2.More()) { + Standard_ConstructionError::Raise("A face for the block has no wires"); + } + TopoDS_Shape aWire2 = wires2.Current(); + wires2.Next(); + if (wires2.More()) { + Standard_ConstructionError::Raise("A face for the block has more than one wire"); + } + + BRepTools_WireExplorer aWE2 (TopoDS::Wire(aWire2), TopoDS::Face(myFaces(2))); + for (nb = 1; aWE2.More(); aWE2.Next(), nb++) { + if (nb > 4) { + Standard_ConstructionError::Raise("A face for the block has more than four edges"); + } + anEdges2(nb) = aWE2.Current(); + aVertis2(nb) = aWE2.CurrentVertex(); + } + if (nb < 5) { + Standard_ConstructionError::Raise("A face for the block has less than four edges"); + } + + // Step 2. Find right place in for the , + // so as to minimize common length of linking edges + // between face 1 and face 2. + // Each linking edge (of four) will link vertices of the + // faces 1 and 2 with equal local numbers. + // The right place is defined by: + // - vertex , which will become the first vertex + // of the second face + // - orientation of relatively their future location + // in (s_min = 1 if direct, s_min = -1 if reversed) + Standard_Integer i_min = 0, s_min = 0; + + TColgp_Array1OfPnt aPnts1 (1,4); // points of the first face + aPnts1(1) = BRep_Tool::Pnt(TopoDS::Vertex(myVertices(vertex_id(1, 1)))); + aPnts1(2) = BRep_Tool::Pnt(TopoDS::Vertex(myVertices(vertex_id(1, 2)))); + aPnts1(3) = BRep_Tool::Pnt(TopoDS::Vertex(myVertices(vertex_id(1, 3)))); + aPnts1(4) = BRep_Tool::Pnt(TopoDS::Vertex(myVertices(vertex_id(1, 4)))); + + TColgp_Array1OfPnt aPnts2 (1,4); // points of the second face + aPnts2(1) = BRep_Tool::Pnt(TopoDS::Vertex(aVertis2(1))); + aPnts2(2) = BRep_Tool::Pnt(TopoDS::Vertex(aVertis2(2))); + aPnts2(3) = BRep_Tool::Pnt(TopoDS::Vertex(aVertis2(3))); + aPnts2(4) = BRep_Tool::Pnt(TopoDS::Vertex(aVertis2(4))); + + Standard_Real Dist_min = RealLast(); + // try all possible locations to find the best (with minimum sum distance) + Standard_Integer i = 1; + for (; i <= 4; i++) { + // try direct orientation + Standard_Real Dist_plus = aPnts1(1).Distance(aPnts2(i)) + + aPnts1(2).Distance(aPnts2(mod4(i + 1))) + + aPnts1(3).Distance(aPnts2(mod4(i + 2))) + + aPnts1(4).Distance(aPnts2(mod4(i + 3))); + if (Dist_plus < Dist_min) { + Dist_min = Dist_plus; + i_min = i; + s_min = 1; + } + + // try reversed orientation + Standard_Real Dist_minus = aPnts1(1).Distance(aPnts2(i)) + + aPnts1(2).Distance(aPnts2(mod4(i - 1))) + + aPnts1(3).Distance(aPnts2(mod4(i - 2))) + + aPnts1(4).Distance(aPnts2(mod4(i - 3))); + if (Dist_minus < Dist_min) { + Dist_min = Dist_minus; + i_min = i; + s_min = - 1; + } + } + + // 3. Put vertices and edges of the second face to they + // permanent location in and + for (i = 1; i <= 4; i++) { + Standard_Integer nb = mod4(i_min + s_min*(i - 1)); + + if (aPnts1(i).Distance(aPnts2(nb)) < Precision::Confusion()) { + Standard_ConstructionError::Raise("The faces are too close"); + } + + myVertices(vertex_id(2, i)) = aVertis2(nb); + + if (s_min == -1) nb = mod4(nb - 1); + myEdges(edge_id(2, i)) = anEdges2(nb); + } + + // 4. Generate side surface + if (!aWire1.Closed() || !aWire2.Closed()) { + // BRepOffsetAPI_ThruSections is not applicable on not closed wires + GetFace(3, Standard_True); + GetFace(4, Standard_True); + GetFace(5, Standard_True); + GetFace(6, Standard_True); + } else { + // try to build faces on native surfaces of edges or planar + Standard_Boolean tryThru = Standard_False; + for (Standard_Integer i = 3; i <= 6 && !tryThru; i++) { + Standard_Boolean doMake = Standard_True; + TopoDS_Shape E1 = GetEdge(edge_id(i, 1), doMake); + TopoDS_Shape E2 = GetEdge(edge_id(i, 2), doMake); + TopoDS_Shape E3 = GetEdge(edge_id(i, 3), doMake); + TopoDS_Shape E4 = GetEdge(edge_id(i, 4), doMake); + + BRepBuilderAPI_MakeWire MW (TopoDS::Edge(E1), + TopoDS::Edge(E2), + TopoDS::Edge(E3), + TopoDS::Edge(E4)); + if (!MW.IsDone()) { + Standard_ConstructionError::Raise("Wire construction failed"); + } + + BRepBuilderAPI_MakeFace MF (MW, Standard_False); + if (MF.IsDone()) { + myFaces(i) = MF.Shape(); + } else { + tryThru = Standard_True; + } + } + + // Build side surface by ThruSections algorithm + if (tryThru) { + BRepOffsetAPI_ThruSections THS; + THS.AddWire(TopoDS::Wire(aWire1)); + THS.AddWire(TopoDS::Wire(aWire2)); + THS.Build(); + if (!THS.IsDone()) { + StdFail_NotDone::Raise("Side surface generation failed"); + } + for (Standard_Integer i = 1; i <= 4; i++) { + // fill face + myFaces(i+2) = THS.GeneratedFace(myEdges(i)); + + // fill edge + Standard_Integer ee = side_edge_id(i); + TopTools_IndexedDataMapOfShapeListOfShape MVE; + MapShapesAndAncestors(myFaces(i+2), TopAbs_VERTEX, TopAbs_EDGE, MVE); + FindEdge(myEdges(ee), + myVertices(vertex_id_edge(ee, 1)), + myVertices(vertex_id_edge(ee, 2)), + MVE); + } + } + } +} + +//======================================================================= +//function : MapShapesAndAncestors +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::MapShapesAndAncestors (const TopoDS_Shape& S, + const TopAbs_ShapeEnum TS, + const TopAbs_ShapeEnum TA, + TopTools_IndexedDataMapOfShapeListOfShape& M) +{ + TopTools_ListOfShape empty; + TopTools_MapOfShape mapA; + + // visit ancestors + TopExp_Explorer exa (S,TA); + for (; exa.More(); exa.Next()) { + // visit shapes + const TopoDS_Shape& anc = exa.Current(); + if (mapA.Add(anc)) { + TopExp_Explorer exs (anc,TS); + TopTools_MapOfShape mapS; + for (; exs.More(); exs.Next()) { + if (mapS.Add(exs.Current())) { + Standard_Integer index = M.FindIndex(exs.Current()); + if (index == 0) index = M.Add(exs.Current(),empty); + M(index).Append(anc); + } + } + } + } + + // visit shapes not under ancestors + TopExp_Explorer ex (S,TS,TA); + for (; ex.More(); ex.Next()) { + Standard_Integer index = M.FindIndex(ex.Current()); + if (index == 0) index = M.Add(ex.Current(),empty); + } +} + +//======================================================================= +//function : IsSimilarEdges +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_Block6Explorer::IsSimilarEdges (const TopoDS_Shape& E1, + const TopoDS_Shape& E2) +{ + TopoDS_Edge E1e = TopoDS::Edge(E1); + TopoDS_Edge E2e = TopoDS::Edge(E2); + TopoDS_Vertex V11, V12, V21, V22; + TopExp::Vertices(E1e, V11, V12, Standard_True); + TopExp::Vertices(E2e, V21, V22, Standard_True); + if (BRepTools::Compare(V11, V21) && BRepTools::Compare(V12, V22)) + return Standard_True; + if (BRepTools::Compare(V11, V22) && BRepTools::Compare(V12, V21)) + return Standard_True; + + return Standard_False; +} + +//======================================================================= +//function : FindEdge +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::FindEdge + (TopoDS_Shape& theResult, + const TopoDS_Shape& V1, + const TopoDS_Shape& V2, + const TopTools_IndexedDataMapOfShapeListOfShape& MVE, + const Standard_Boolean findAll) +{ + Standard_Integer isFound = 0; + + const TopTools_ListOfShape& anEdgesOfV1 = MVE.FindFromKey(V1); + const TopTools_ListOfShape& anEdgesOfV2 = MVE.FindFromKey(V2); + + TopTools_ListIteratorOfListOfShape it1 (anEdgesOfV1); + for (; it1.More(); it1.Next()) { + TopTools_ListIteratorOfListOfShape it2 (anEdgesOfV2); + for (; it2.More(); it2.Next()) { + if (it1.Value().IsSame(it2.Value())) { + isFound++; + theResult = it1.Value(); + if (!findAll) return isFound; + } + } + } + + return isFound; +} + +//======================================================================= +//function : FindFace +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Block6Explorer::FindFace + (TopoDS_Shape& theResult, + const TopoDS_Shape& V1, + const TopoDS_Shape& V2, + const TopoDS_Shape& V3, + const TopoDS_Shape& V4, + const TopTools_IndexedDataMapOfShapeListOfShape& MVF, + const Standard_Boolean findAll) +{ + Standard_Integer isFound = Standard_False; + + const TopTools_ListOfShape& aFacesOfV1 = MVF.FindFromKey(V1); + const TopTools_ListOfShape& aFacesOfV2 = MVF.FindFromKey(V2); + const TopTools_ListOfShape& aFacesOfV3 = MVF.FindFromKey(V3); + const TopTools_ListOfShape& aFacesOfV4 = MVF.FindFromKey(V4); + + TopTools_ListIteratorOfListOfShape it1 (aFacesOfV1); + for (; it1.More(); it1.Next()) { + TopTools_ListIteratorOfListOfShape it2 (aFacesOfV2); + for (; it2.More(); it2.Next()) { + if (it1.Value().IsSame(it2.Value())) { + TopTools_ListIteratorOfListOfShape it3 (aFacesOfV3); + for (; it3.More(); it3.Next()) { + if (it1.Value().IsSame(it3.Value())) { + TopTools_ListIteratorOfListOfShape it4 (aFacesOfV4); + for (; it4.More(); it4.Next()) { + if (it1.Value().IsSame(it4.Value())) { + isFound++; + theResult = it1.Value(); + if (!findAll) return isFound; + } + } + } + } + } + } + } + + return isFound; +} + +//======================================================================= +//function : MakeFace +//purpose : +//======================================================================= +void GEOMImpl_Block6Explorer::MakeFace (const TopoDS_Wire& theWire, + const Standard_Boolean isPlanarWanted, + TopoDS_Shape& theResult) +{ + // try to build face on plane or on any surface under the edges of the wire + BRepBuilderAPI_MakeFace MK (theWire, isPlanarWanted); + if (MK.IsDone()) { + theResult = MK.Shape(); + return; + } + + if (!isPlanarWanted) { + // try to construct filling surface + BRepOffsetAPI_MakeFilling MF; + + Standard_Integer nbEdges = 0; + BRepTools_WireExplorer aWE (theWire); + for (; aWE.More(); aWE.Next(), nbEdges++) { + MF.Add(TopoDS::Edge(aWE.Current()), GeomAbs_C0); + } + + MF.Build(); + if (MF.IsDone()) { + // Result of filling + TopoDS_Shape aFace = MF.Shape(); + + // Update tolerance + Standard_Real aTol = MF.G0Error(); + + TColgp_Array1OfPnt aPnts (1,nbEdges); // points of the given wire + BRepTools_WireExplorer aWE1 (theWire); + Standard_Integer vi = 1; + for (; aWE1.More() && vi <= nbEdges; aWE1.Next(), vi++) { + aPnts(vi) = BRep_Tool::Pnt(TopoDS::Vertex(aWE1.CurrentVertex())); + } + + // Find maximum deviation in vertices + TopExp_Explorer exp (aFace, TopAbs_VERTEX); + TopTools_MapOfShape mapShape; + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Vertex aV = TopoDS::Vertex(exp.Current()); + Standard_Real aTolV = BRep_Tool::Tolerance(aV); + gp_Pnt aP = BRep_Tool::Pnt(aV); + Standard_Real min_dist = aP.Distance(aPnts(1)); + for (vi = 2; vi <= nbEdges; vi++) { + min_dist = Min(min_dist, aP.Distance(aPnts(vi))); + } + aTol = Max(aTol, aTolV); + aTol = Max(aTol, min_dist); + } + } + + if ((*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance() < aTol) { + (*((Handle(BRep_TFace)*)&aFace.TShape()))->Tolerance(aTol); + } + theResult = aFace; + } + } else { + // try to update wire tolerances to build a planar face + + // With OCCT6.0 or lower + + // Find a deviation + Standard_Real aToleranceReached, aTol; + BRepLib_FindSurface aFS; + aFS.Init(theWire, -1., isPlanarWanted); + aToleranceReached = aFS.ToleranceReached(); + aTol = aFS.Tolerance(); + + if (!aFS.Found()) { + aFS.Init(theWire, aToleranceReached, isPlanarWanted); + if (!aFS.Found()) return; + aToleranceReached = aFS.ToleranceReached(); + aTol = aFS.Tolerance(); + } + aTol = Max(1.2 * aToleranceReached, aTol); + + // Copy the wire, bacause it can be updated with very-very big tolerance here + BRepBuilderAPI_Copy aMC (theWire); + if (!aMC.IsDone()) return; + TopoDS_Wire aWire = TopoDS::Wire(aMC.Shape()); + // Update tolerances to + BRep_Builder B; + for (TopExp_Explorer expE (aWire, TopAbs_EDGE); expE.More(); expE.Next()) { + TopoDS_Edge anE = TopoDS::Edge(expE.Current()); + B.UpdateEdge(anE, aTol); + } + for (TopExp_Explorer expV (aWire, TopAbs_VERTEX); expV.More(); expV.Next()) { + TopoDS_Vertex aV = TopoDS::Vertex(expV.Current()); + B.UpdateVertex(aV, aTol); + } + //BRepLib::UpdateTolerances(aWire); + // Build face + BRepBuilderAPI_MakeFace MK1 (aWire, isPlanarWanted); + if (MK1.IsDone()) { + theResult = MK1.Shape(); + return; + } + + // After migration on OCCT version higher than 6.0 + //BRepLib_MakeFace aBMF; + //aBMF.Init(theWire, isPlanarWanted, Standard_True); + //if (aBMF.Error() == BRepLib_FaceDone) { + // theResult = aBMF.Shape(); + // return; + //} + } +} diff --git a/src/GEOMImpl/GEOMImpl_Block6Explorer.hxx b/src/GEOMImpl/GEOMImpl_Block6Explorer.hxx new file mode 100644 index 000000000..1cedbe1f3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Block6Explorer.hxx @@ -0,0 +1,226 @@ +// 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/ +// +// File : GEOMImpl_Block6Explorer.hxx +// Module : GEOMImpl + +#ifndef GEOMImpl_Block6Explorer_HeaderFile +#define GEOMImpl_Block6Explorer_HeaderFile + +#include +#include +#include +#include +#include + + // Class GEOMImpl_Block6Explorer gives easy and fast access to a certain sub-elements of hexahedral solid + // Each face can be accessed by its global ID [1-6] + // Each edge can be accessed by its global ID [1-12] or by its local NB [1-4] inside certain face + // Each vertex can be accessed by its global ID [1-8] or by its local NB [1-4] inside certain face + // Numeration of the sub-shapes is defined in constructors, see they comments + // + // face 2 face 4 | 4 face 2 face | + // | / | \ | | + // \|/ |/_ | _\| \|/ | + // ' ' | ' ' | + // 8_______7__7 | 7__7_______8 | + // /| /| | |\ |\ | + // 8 12 6 11 | 11 6 12 8 | + // / | / | | | \ | \ | + // 5/______5__6/ | | | \6__5______\5 | + // face 5 ---> | | | | <--- 6 face | face 6 ---> | | | | <--- 5 face | + // | |__3__|____| | |____|__3__| | | + // | /4 | /3 | 3\ | 4\ | | + // | / | / | \ | \ | | + // 9 4 10 2 | 2 10 4 9 | + // |/__1______|/ | \|______1__\| | + // 1 2 | 2 1 | + // _. . | . ._ | + // /| /|\ | /|\ |\ | + // / | | | \ | + // 3 face 1 face | face 1 face 3 | + // | | + // Picture 1 (right orientation) | Picture 2 (left orientation) | + // | + // For the moment, the orientation of numbering is not controlled + + // Faces: 1 - bottom, 2 - top, 3 - front, 4 - back, 5 - left (right), 6 - right (left) + + // + // 4_______3__3 2 ______2__3 + // / / | | + // 4 2 1 3 + // / / | | + // 1/______1__2/ | | + // | | + // | __4______| + // face 2 face 4 1 4 + // | / + // \|/ |/_ + // ' ' + // 3 8_______7__7 3 + // /| /| /| /| + // 3 2 8 12 6 11 3 2 + // / | / | / | / | + // 4/ | 5/______5__6/ | 4/ | + // | | face 5 ---> | | | | <--- 6 face | | + // | | | |__3__|____| | | + // | /2 | /4 | /3 | /2 + // | / | / | / | / + // 4 1 9 4 10 2 4 1 + // |/ |/__1______|/ |/ + // 1 1 2 1 + // _. . + // /| /|\ + // / | + // 2 ______2__3 3 face 1 face + // | | + // | | __3_______ + // | | /4 /3 + // | | / / + // 1 3 4 2 + // | __4______| /__1______ / + // 1 4 1 2 + // + // Picture 3 (On periferal pictures the local + // numeration of edges and vertices is shown) + +class GEOMImpl_Block6Explorer +{ + public: + // ---------- PUBLIC METHODS ---------- + + GEOMImpl_Block6Explorer (); + // Constructor. + + // Initialization by existing solid, + // sub-elements regulate numeration + + void InitByBlock (const TopoDS_Shape& theBlock); + // Init by hexahedral solid. First face, edge and vertex is defined randomly + + void InitByBlockAndFace (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace); + // Constructor from hexahedral solid, making theFace the first face. + // First edge and vertex is defined randomly from theFace entities + + void InitByBlockAndEdges (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theEdge1, + const TopoDS_Shape& theEdge2); + // Init by hexahedral solid, making theEdge1 the first, theEdge2 the fird. + // First vertex is defined randomly from theEdge1 vertices + // (Picture 1 and Picture 2 shows two possible cases) + + void InitByBlockAndVertices (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theVertex1, + const TopoDS_Shape& theVertex2, + const TopoDS_Shape& theVertex3); + // Init by hexahedral solid, making theVertex1 the first, + // theVertex2 the second and theVertex3 the fird vertices. + + // Initialization by parts of solid to be built + + void InitByTwoFaces (const TopoDS_Shape& theFace1, + const TopoDS_Shape& theFace2); + // Init by two faces. TheFace1 will be the first, + // theFace2 will be the second. + // First edge and vertex is defined randomly from theFace1 entities. + + // Access to vertices + TopoDS_Shape GetVertex (const Standard_Integer theVertexID); // [1-8] + + Standard_Integer GetVertexID (const TopoDS_Shape& theVertex); + + Standard_Integer GetVertexID (const Standard_Integer theFaceID, // [1-6] + const Standard_Integer theVertexNB); // [1-4] + + Standard_Integer GetVertexOnEdgeID (const Standard_Integer theEdgeID, // [1-12] + const Standard_Integer theVertexNB); // [1-2] + + // Access to edges + TopoDS_Shape GetEdge (const Standard_Integer theEdgeID, // [1-12] + const Standard_Boolean doMake = Standard_False); + + Standard_Integer GetEdgeID (const TopoDS_Shape& theEdge); + + Standard_Integer GetEdgeID (const Standard_Integer theFaceID, // [1-6] + const Standard_Integer theEdgeNB); // [1-4] + + Standard_Integer FindEdgeID (const Standard_Integer theVertex1ID, + const Standard_Integer theVertex2ID); + + Standard_Integer FindCommonEdgeID (const Standard_Integer theFace1ID, + const Standard_Integer theFace2ID); + + // Access to faces + TopoDS_Shape GetFace (const Standard_Integer theFaceID, // [1-6] + const Standard_Boolean doMake = Standard_False); + + Standard_Integer GetFaceID (const TopoDS_Shape& theFace); + + Standard_Integer FindFaceID (const Standard_Integer theEdge1ID, + const Standard_Integer theEdge2ID); + + Standard_Integer GetOppositeFaceID (const Standard_Integer theFaceID); + + // Check Block + Standard_Boolean IsSimilarFaces (const Standard_Integer theFace1ID, + const Standard_Integer theFace2ID, + const gp_Trsf theTransformation); + // returns true, if theFace1, transformed + // by theTransformation, coincides with theFace2 + public: + // ---------- STATIC PUBLIC METHODS ---------- + static void MapShapesAndAncestors (const TopoDS_Shape& S, + const TopAbs_ShapeEnum TS, + const TopAbs_ShapeEnum TA, + TopTools_IndexedDataMapOfShapeListOfShape& M); + + static Standard_Boolean IsSimilarEdges (const TopoDS_Shape& E1, + const TopoDS_Shape& E2); + + static Standard_Integer FindEdge (TopoDS_Shape& theResult, + const TopoDS_Shape& V1, + const TopoDS_Shape& V2, + const TopTools_IndexedDataMapOfShapeListOfShape& MVE, + const Standard_Boolean findAll = Standard_False); + // returns number of found edges + + static Standard_Integer FindFace (TopoDS_Shape& theResult, + const TopoDS_Shape& V1, + const TopoDS_Shape& V2, + const TopoDS_Shape& V3, + const TopoDS_Shape& V4, + const TopTools_IndexedDataMapOfShapeListOfShape& MVF, + const Standard_Boolean findAll = Standard_False); + // returns number of found faces + + static void MakeFace (const TopoDS_Wire& theWire, + const Standard_Boolean isPlanarWanted, + TopoDS_Shape& theResult); + + private: + // ---------- PRIVATE FIELDS ---------- + + TopTools_Array1OfShape myFaces; + TopTools_Array1OfShape myEdges; + TopTools_Array1OfShape myVertices; +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_BlockDriver.cxx b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx new file mode 100644 index 000000000..e9ed601c2 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BlockDriver.cxx @@ -0,0 +1,1005 @@ +// 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/ +// + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "utilities.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_BlockDriver::GetID() +{ + static Standard_GUID aBlockDriver("FF1BBB67-5D14-4df2-980B-3A668264EA16"); + return aBlockDriver; +} + + +//======================================================================= +//function : GEOMImpl_BlockDriver +//purpose : +//======================================================================= +GEOMImpl_BlockDriver::GEOMImpl_BlockDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_BlockDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + BRep_Builder B; + + Standard_Real prec = Precision::Confusion(); + + Standard_Integer aNbSub = 0; + if (aType == BLOCK_COMPOUND_GLUE) { + + aNbSub = 1; + + } else if (aType == BLOCK_FACE_TWO_EDGES || + aType == BLOCK_TWO_FACES) { + + aNbSub = 2; + + } else if (aType == BLOCK_FACE_FOUR_PNT || + aType == BLOCK_FACE_FOUR_EDGES) { + + aNbSub = 4; + + } else if (aType == BLOCK_SIX_FACES) { + + aNbSub = 6; + + } else { + } + + if (aNbSub > 0) { + GEOMImpl_IBlocks aCI (aFunction); + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + Standard_Integer nbshapes = aShapes->Length(); + + if (nbshapes != aNbSub) { + Standard_TypeMismatch::Raise + ("Number of elements for object construction does not correspond to the used constructor"); + } + + TopTools_Array1OfShape anArgs (1, aNbSub); + Standard_Integer argi; + for (argi = 1; argi <= aNbSub; argi++) { + Handle(GEOM_Function) aRef = Handle(GEOM_Function)::DownCast(aShapes->Value(argi)); + TopoDS_Shape anArg = aRef->GetValue(); + if (anArg.IsNull()) { + Standard_NullObject::Raise("Null shape is given as argument"); + } + anArgs(argi) = anArg; + } + + if (aType == BLOCK_FACE_FOUR_EDGES) { + + // Make face from four edges + if (anArgs(1).ShapeType() != TopAbs_EDGE || anArgs(2).ShapeType() != TopAbs_EDGE || + anArgs(3).ShapeType() != TopAbs_EDGE || anArgs(4).ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise("Shape for face construction is not an edge"); + } + + // count corner vertices + TopTools_MapOfShape aVertMap; + for (Standard_Integer ii = 1; ii <= 4; ii++) { + TopoDS_Edge anEdge = TopoDS::Edge(anArgs(ii)); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_NullObject::Raise("Bad edge for face construction: vertex is not defined"); + } + if (BRepTools::Compare(V1,V2)) { + Standard_ConstructionError::Raise("Edge ends are too close"); + } + Standard_Boolean isCoin1 = Standard_False, isCoin2 = Standard_False; + TopTools_MapIteratorOfMapOfShape anIter (aVertMap); + for (; anIter.More(); anIter.Next()) { + TopoDS_Vertex V = TopoDS::Vertex(anIter.Key()); + if (BRepTools::Compare(V,V1)) isCoin1 = Standard_True; + if (BRepTools::Compare(V,V2)) isCoin2 = Standard_True; + } + if (!isCoin1) aVertMap.Add(V1); + if (!isCoin2) aVertMap.Add(V2); + } + if (aVertMap.Extent() != 4) { + Standard_ConstructionError::Raise("The edges must form a closed wire"); + } + + TopoDS_Edge anEdge1 = TopoDS::Edge(anArgs(1)); + TopoDS_Edge anEdge2 = TopoDS::Edge(anArgs(2)); + TopoDS_Edge anEdge3 = TopoDS::Edge(anArgs(3)); + TopoDS_Edge anEdge4 = TopoDS::Edge(anArgs(4)); + + // check, if anEdge1 has common/coincident vertex with anEdge2, + Standard_Boolean isConnected12 = Standard_False; + TopoDS_Vertex V11, V12, V21, V22; + TopExp::Vertices(anEdge1, V11, V12, Standard_True); + TopExp::Vertices(anEdge2, V21, V22, Standard_True); + if (BRepTools::Compare(V11,V21) || BRepTools::Compare(V11,V22) || + BRepTools::Compare(V12,V21) || BRepTools::Compare(V12,V22)) { + // the edges have common vertex + isConnected12 = Standard_True; + } + + // build wire in right order, corresponding to edges connexity + BRepBuilderAPI_MakeWire* MW; + if (isConnected12) + MW = new BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3, anEdge4); + else + MW = new BRepBuilderAPI_MakeWire(anEdge1, anEdge3, anEdge2, anEdge4); + + if (!MW->IsDone()) { + Standard_ConstructionError::Raise + ("Impossible to build a connected wire from the given edges"); + } + TopoDS_Wire aWire = *MW; + delete MW; + if (!aWire.Closed()) { + Standard_ConstructionError::Raise + ("Impossible to build a closed wire from the given edges"); + } + + // try to build face on the wire + GEOMImpl_Block6Explorer::MakeFace(aWire, Standard_False, aShape); + if (aShape.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + + } else if (aType == BLOCK_FACE_TWO_EDGES) { + + // Make face from two opposite edges + if (anArgs(1).ShapeType() != TopAbs_EDGE || + anArgs(2).ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise("Shape for face construction is not an edge"); + } + + TopoDS_Edge anEdge1 = TopoDS::Edge(anArgs(1)); + TopoDS_Edge anEdge2 = TopoDS::Edge(anArgs(2)); + + if (anEdge1.IsSame(anEdge2)) { + Standard_ConstructionError::Raise("The edges must be different"); + } + + // create two edges, linking ends of the given edges + TopoDS_Vertex V11, V12, V21, V22; + TopExp::Vertices(anEdge1, V11, V12, Standard_True); + TopExp::Vertices(anEdge2, V21, V22, Standard_True); + if (V11.IsNull() || V12.IsNull() || + V21.IsNull() || V22.IsNull()) { + Standard_NullObject::Raise("Bad edge for face construction: vertex is not defined"); + } + gp_Pnt P11 = BRep_Tool::Pnt(V11); + gp_Pnt P12 = BRep_Tool::Pnt(V12); + gp_Pnt P21 = BRep_Tool::Pnt(V21); + gp_Pnt P22 = BRep_Tool::Pnt(V22); + + if (P11.Distance(P21) < prec || P12.Distance(P22) < prec || + P11.Distance(P22) < prec || P12.Distance(P21) < prec) { + Standard_ConstructionError::Raise("Given edges have too close ends"); + } + + Standard_Real per11 = P11.Distance(P21) + P12.Distance(P22); + Standard_Real per12 = P11.Distance(P22) + P12.Distance(P21); + + TopoDS_Edge anEdge3; + TopoDS_Edge anEdge4; + if (per11 < per12) { + anEdge3 = BRepBuilderAPI_MakeEdge(V11, V21); + anEdge4 = BRepBuilderAPI_MakeEdge(V12, V22); + } else { + anEdge3 = BRepBuilderAPI_MakeEdge(V11, V22); + anEdge4 = BRepBuilderAPI_MakeEdge(V12, V21); + } + + // build a wire + BRepBuilderAPI_MakeWire MW (anEdge1, anEdge3, anEdge2, anEdge4); + if (!MW.IsDone()) { + Standard_ConstructionError::Raise("Wire construction failed"); + } + + // try to build face on the wire + GEOMImpl_Block6Explorer::MakeFace(MW, Standard_False, aShape); + if (aShape.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + + } else if (aType == BLOCK_FACE_FOUR_PNT) { + + // Make face from four corner vertices + if (anArgs(1).ShapeType() != TopAbs_VERTEX || + anArgs(2).ShapeType() != TopAbs_VERTEX || + anArgs(3).ShapeType() != TopAbs_VERTEX || + anArgs(4).ShapeType() != TopAbs_VERTEX) { + Standard_TypeMismatch::Raise("Shape for face construction is not a vertex"); + } + + TopoDS_Vertex V1 = TopoDS::Vertex(anArgs(1)); + TopoDS_Vertex V2 = TopoDS::Vertex(anArgs(2)); + TopoDS_Vertex V3 = TopoDS::Vertex(anArgs(3)); + TopoDS_Vertex V4 = TopoDS::Vertex(anArgs(4)); + + gp_Pnt P1 = BRep_Tool::Pnt(V1); + gp_Pnt P2 = BRep_Tool::Pnt(V2); + gp_Pnt P3 = BRep_Tool::Pnt(V3); + gp_Pnt P4 = BRep_Tool::Pnt(V4); + + if (P1.Distance(P2) < prec || P1.Distance(P3) < prec || + P1.Distance(P4) < prec || P2.Distance(P3) < prec || + P2.Distance(P4) < prec || P3.Distance(P4) < prec) { + Standard_ConstructionError::Raise("Four not coincident points must be given"); + } + + // calculate perimeters + Standard_Real per1234 = P1.Distance(P2) + P2.Distance(P3) + + P3.Distance(P4) + P4.Distance(P1); + Standard_Real per1243 = P1.Distance(P2) + P2.Distance(P4) + + P4.Distance(P3) + P3.Distance(P1); + Standard_Real per1324 = P1.Distance(P3) + P3.Distance(P2) + + P2.Distance(P4) + P4.Distance(P1); + + // order vertices + if (per1243 < per1234 && per1243 < per1324) { + TopoDS_Vertex Vtmp = V3; + V3 = V4; + V4 = Vtmp; + } else if (per1324 < per1234 && per1324 < per1243) { + TopoDS_Vertex Vtmp = V3; + V3 = V2; + V2 = Vtmp; + } else { + } + + // build wire + BRepBuilderAPI_MakePolygon aMkPoly (V1, V2, V3, V4, Standard_True); + if (!aMkPoly.IsDone()) { + Standard_ConstructionError::Raise("Polygon construction failed"); + } + + // try to build face on the wire + GEOMImpl_Block6Explorer::MakeFace(aMkPoly, Standard_False, aShape); + if (aShape.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + + } else if (aType == BLOCK_SIX_FACES || aType == BLOCK_TWO_FACES) { + + BRepTools_Quilt Glue; + + if (aType == BLOCK_SIX_FACES) { + + // Make block (hexahedral solid) from six faces + for (Standard_Integer ind = 1; ind <= nbshapes; ind++) { + if (anArgs(ind).ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Shape for block construction is not a face"); + } + Glue.Add(anArgs(ind)); + } + + } else { + + // Make block (hexahedral solid) from two opposite faces + if (anArgs(1).ShapeType() != TopAbs_FACE || + anArgs(2).ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Shape for block construction is not a face"); + } + + // Get wires of the given faces + TopExp_Explorer wires1 (anArgs(1), TopAbs_WIRE); + TopExp_Explorer wires2 (anArgs(2), TopAbs_WIRE); + if (!wires1.More() || !wires2.More()) { + Standard_ConstructionError::Raise("A face for the block has no wires"); + } + TopoDS_Shape aWire1 = wires1.Current(); + TopoDS_Shape aWire2 = wires2.Current(); + wires1.Next(); + wires2.Next(); + if (wires1.More() || wires2.More()) { + Standard_ConstructionError::Raise("A face for the block has more than one wire"); + } + + GEOMImpl_Block6Explorer aBlockTool; + aBlockTool.InitByTwoFaces(anArgs(1), anArgs(2)); + + // Construct the linking faces and add them in the gluing tool + Glue.Add(anArgs(1)); + Glue.Add(aBlockTool.GetFace(3, Standard_True)); + Glue.Add(aBlockTool.GetFace(4, Standard_True)); + Glue.Add(aBlockTool.GetFace(5, Standard_True)); + Glue.Add(aBlockTool.GetFace(6, Standard_True)); + Glue.Add(anArgs(2)); + } + + TopExp_Explorer exp (Glue.Shells(), TopAbs_SHELL); + Standard_Integer ish = 0; + TopTools_MapOfShape mapShape; + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + aShape = exp.Current(); + ish++; + } + } + + if (ish > 1) { + aShape = Glue.Shells(); + Standard_Real aTol = prec; // Precision::Confusion() + TopExp_Explorer expF (aShape, TopAbs_FACE); + TopTools_MapOfShape mapF; + TopoDS_Shell Shell; + B.MakeShell(Shell); + for (; expF.More(); expF.Next()) { + if (mapF.Add(expF.Current())) { + B.Add(Shell, expF.Current()); + Standard_Real aToler = BRep_Tool::Tolerance(TopoDS::Face(expF.Current())); + if (aToler > aTol) + aTol = aToler; + } + } + ShHealOper_Sewing aHealer (Shell, aTol); + if (aHealer.Perform()) + aShape = aHealer.GetResultShape(); + else + Standard_ConstructionError::Raise + ("Impossible to build a connected shell on the given faces"); + } + + if (aType == BLOCK_SIX_FACES) { + if (!aShape.Closed()) { + Standard_ConstructionError::Raise + ("Impossible to build a closed shell on the given faces"); + } + } + + TopoDS_Solid Sol; + B.MakeSolid(Sol); + B.Add(Sol, aShape); + BRepClass3d_SolidClassifier SC (Sol); + SC.PerformInfinitePoint(prec); + if (SC.State() == TopAbs_IN) { + B.MakeSolid(Sol); + B.Add(Sol, aShape.Reversed()); + } + aShape = Sol; + BRepLib::SameParameter(aShape, 1.E-5, Standard_True); + + } else if (aType == BLOCK_COMPOUND_GLUE) { + + // Make blocks compound from a compound + if (anArgs(1).ShapeType() != TopAbs_COMPOUND && + anArgs(2).ShapeType() != TopAbs_COMPSOLID) { + Standard_TypeMismatch::Raise("Not a compound given"); + } + + TopoDS_Shape aCompound = anArgs(1); + + // Glue coincident faces and edges (with Partition algorithm). + NMTAlgo_Splitter1 PS; + PS.AddShape(aCompound); + PS.Compute(); + PS.SetRemoveWebs(Standard_False); +// PS.Build(aCompound.ShapeType()); + PS.Build(TopAbs_SOLID); + + aShape = PS.Shape(); + } else { + } + + } else { // Multi-transformations and compound improving + + if (aType == BLOCK_REMOVE_EXTRA || + aType == BLOCK_COMPOUND_IMPROVE) { + + GEOMImpl_IBlockTrsf aCI (aFunction); + Handle(GEOM_Function) aRefShape = aCI.GetOriginal(); + TopoDS_Shape aBlockOrComp = aRefShape->GetValue(); + if (aBlockOrComp.IsNull()) { + Standard_NullObject::Raise("Null Shape given"); + } + + // 1. Improve solids with seam and/or degenerated edges + BlockFix_BlockFixAPI aTool; + //aTool.Tolerance() = toler; + aTool.SetShape(aBlockOrComp); + aTool.Perform(); + + if (aType == BLOCK_REMOVE_EXTRA) { + + aShape = aTool.Shape(); + if (aShape == aBlockOrComp) { + MESSAGE("No modifications have been done"); + } + + } else { // aType == BLOCK_COMPOUND_IMPROVE + + TopoDS_Shape aFixedExtra = aTool.Shape(); + + // 2. Separate non-blocks + TopTools_ListOfShape BLO; // All blocks from the given compound + TopTools_ListOfShape NOT; // Not blocks + TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges + GEOMImpl_IBlocksOperations::AddBlocksFrom(aFixedExtra, BLO, NOT, EXT); + + if (NOT.Extent() > 0) { + MESSAGE("Some non-blocks have been removed"); + } + + // 3. Warn about staying extra-edges + if (EXT.Extent() > 0) { + MESSAGE("Warning: Not all seam or degenerated edges was removed"); + } + + // ??? Throw away standalone blocks ??? + + // 4. Create compound of all blocks + TopoDS_Compound aComp; + BRep_Builder BB; + BB.MakeCompound(aComp); + TopTools_ListIteratorOfListOfShape BLOit (BLO); + for (; BLOit.More(); BLOit.Next()) { + BB.Add(aComp, BLOit.Value()); + } + + // 5. Glue Faces + aShape = GEOMImpl_GlueDriver::GlueFaces(aComp, Precision::Confusion()); + } + + } else if (aType == BLOCK_MULTI_TRANSFORM_1D || + aType == BLOCK_MULTI_TRANSFORM_2D) { + + TopoDS_Shape aMulti; + GEOMImpl_IBlockTrsf aCI (aFunction); + Handle(GEOM_Function) aRefShape = aCI.GetOriginal(); + TopoDS_Shape aBlockIni = aRefShape->GetValue(); + if (aBlockIni.IsNull()) { + Standard_NullObject::Raise("Null Block"); + } + + // Copy block to avoid problems (PAL6706) + TColStd_IndexedDataMapOfTransientTransient aMap; + TopoDS_Shape aBlock; + TNaming_CopyShape::CopyTool(aBlockIni, aMap, aBlock); + + // Block tolerance in vertices + Standard_Real aTol = prec; + TopExp_Explorer expV (aBlock, TopAbs_VERTEX); + TopTools_MapOfShape mapShape; + for (; expV.More(); expV.Next()) { + if (mapShape.Add(expV.Current())) { + TopoDS_Vertex aV = TopoDS::Vertex(expV.Current()); + aTol = Max(BRep_Tool::Tolerance(aV), aTol); + } + } + + if (aType == BLOCK_MULTI_TRANSFORM_1D) { + // Retrieve a faces by Ids + Standard_Integer aFace1Id = aCI.GetFace1U(); + Standard_Integer aFace2Id = aCI.GetFace2U(); + TopoDS_Shape aFace1, aFace2; + if (!GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace1Id, aFace1)) { + Standard_NullObject::Raise("Can not retrieve a sub-shape with given Id"); + } + if (aFace1.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Sub-shape with given Id is not a face"); + } + + if (aFace2Id > 0) { + if (!GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace2Id, aFace2)) { + Standard_NullObject::Raise("Can not retrieve a sub-shape with given Id"); + } + if (aFace2.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Sub-shape with given Id is not a face"); + } + } + + Standard_Integer aNbIter = aCI.GetNbIterU(); + + MultiTransformate1D(aBlock, aFace1, aFace2, aNbIter, aMulti); + + } else { // aType == BLOCK_MULTI_TRANSFORM_2D + // Retrieve a faces by Ids + Standard_Integer aFace1UId = aCI.GetFace1U(); + Standard_Integer aFace2UId = aCI.GetFace2U(); + Standard_Integer aFace1VId = aCI.GetFace1V(); + Standard_Integer aFace2VId = aCI.GetFace2V(); + + TopoDS_Shape aFace1U, aFace2U, aFace1V, aFace2V; + if (!GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace1UId, aFace1U) || + !GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace1VId, aFace1V)) { + Standard_NullObject::Raise("Can not retrieve a sub-shape with given Id"); + } + + if (aFace1U.ShapeType() != TopAbs_FACE || + aFace1V.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Sub-shape with given Id is not a face"); + } + + if (aFace2UId > 0) { + if (!GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace2UId, aFace2U)) { + Standard_NullObject::Raise("Can not retrieve a sub-shape with given Id"); + } + + if (aFace2U.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Sub-shape with given Id is not a face"); + } + } + + if (aFace2VId > 0) { + if (!GEOMImpl_ILocalOperations::GetSubShape(aBlock, aFace2VId, aFace2V)) { + Standard_NullObject::Raise("Can not retrieve a sub-shape with given Id"); + } + + if (aFace2V.ShapeType() != TopAbs_FACE) { + Standard_TypeMismatch::Raise("Sub-shape with given Id is not a face"); + } + } + + Standard_Integer aNbIterU = aCI.GetNbIterU(); + Standard_Integer aNbIterV = aCI.GetNbIterV(); + + MultiTransformate2D(aBlock, + aFace1U, aFace2U, aNbIterU, + aFace1V, aFace2V, aNbIterV, aMulti); + } + + if (aMulti.IsNull()) { + StdFail_NotDone::Raise("Multi-transformation failed"); + } + + // Glue faces of the multi-block + aShape = GEOMImpl_GlueDriver::GlueFaces(aMulti, aTol); + + } else { // unknown function type + return 0; + } + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + +//======================================================================= +//function : MultiTransformate1D +//purpose : +//======================================================================= +void GEOMImpl_BlockDriver::MultiTransformate1D (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace1, + const TopoDS_Shape& theFace2, + const Standard_Integer theNbIter, + TopoDS_Shape& theResult) const +{ + // Construct Tool, where will be the first face, + // and a face, opposite to , will be the second face + GEOMImpl_Block6Explorer aBlockTool; + aBlockTool.InitByBlockAndFace(theBlock, theFace1); + + // Find IDs of the faces + Standard_Integer dir_face1 = 1, dir_face2 = 2; + if (!theFace2.IsNull()) { + dir_face2 = aBlockTool.GetFaceID(theFace2); + } + + // Find three pairs of points + Standard_Integer v11_id = 0, v12_id = 0, v13_id = 0; // vertices of the first face + Standard_Integer v21_id = 0, v22_id = 0, v23_id = 0; // vertices of the second face + + if (dir_face2 == 2) { // is opposite to + + // We will take vertices with equal local numbers on the faces, + // as the Block6Explorer gives equal local numbers + // to the linked vertices on the opposite faces, + // i.e. v1* is linked with the v2* by an edge: + + // _________ + // /|v23 /| + // / | / | dir_face1 - bottom + // / | / | + // /________ / | dir_face2 - top + // |v21 | |v22 | + // | |____|____| + // | / v13 | / + // | / | / + // | / | / + // |/________|/ + // v11 v12 + + v11_id = aBlockTool.GetVertexID(dir_face1, 1); + v12_id = aBlockTool.GetVertexID(dir_face1, 2); + v13_id = aBlockTool.GetVertexID(dir_face1, 4); + + v21_id = aBlockTool.GetVertexID(dir_face2, 1); + v22_id = aBlockTool.GetVertexID(dir_face2, 2); + v23_id = aBlockTool.GetVertexID(dir_face2, 4); + + } else { + + // _________ + // /| /| + // / | / | dir_face1 - bottom + // / | / | + // /________ / | dir_face2 - right (for example) + // | | |v23 | + // | |____|____| + // | / | /v12 = v22 (common_vertex2) + // | / | / + // | / | / + // |/________|/ + // v13 v11 = v21 (common_vertex1) + + Standard_Integer common_edge_id = aBlockTool.FindCommonEdgeID(dir_face1, dir_face2); + Standard_Integer common_vertex1 = aBlockTool.GetVertexOnEdgeID(common_edge_id, 1); + Standard_Integer common_vertex2 = aBlockTool.GetVertexOnEdgeID(common_edge_id, 2); + + Standard_Integer not_common_v1 = 0; + Standard_Integer vid = 1; + Standard_Boolean isFound = Standard_False; + while (!isFound && vid <= 4) { + not_common_v1 = aBlockTool.GetVertexID(dir_face1, vid); + isFound = (not_common_v1 != common_vertex2 && + aBlockTool.FindEdgeID(not_common_v1, common_vertex1) != 0); + vid++; + } + + Standard_Integer not_common_v2 = 0; + vid = 1; + isFound = Standard_False; + while (!isFound && vid <= 4) { + not_common_v2 = aBlockTool.GetVertexID(dir_face2, vid); + isFound = (not_common_v2 != common_vertex2 && + aBlockTool.FindEdgeID(not_common_v2, common_vertex1) != 0); + vid++; + } + + v11_id = common_vertex1; + v12_id = common_vertex2; + v13_id = not_common_v1; + + v21_id = common_vertex1; + v22_id = common_vertex2; + v23_id = not_common_v2; + } + + // Construct a transformation operator + TopoDS_Vertex V11 = TopoDS::Vertex(aBlockTool.GetVertex(v11_id)); + TopoDS_Vertex V12 = TopoDS::Vertex(aBlockTool.GetVertex(v12_id)); + TopoDS_Vertex V13 = TopoDS::Vertex(aBlockTool.GetVertex(v13_id)); + + TopoDS_Vertex V21 = TopoDS::Vertex(aBlockTool.GetVertex(v21_id)); + TopoDS_Vertex V22 = TopoDS::Vertex(aBlockTool.GetVertex(v22_id)); + TopoDS_Vertex V23 = TopoDS::Vertex(aBlockTool.GetVertex(v23_id)); + + // Axes of the first direction face + gp_Pnt P1 = BRep_Tool::Pnt(V11); + gp_Vec VecN1 (P1, BRep_Tool::Pnt(V12)); + gp_Vec VecX1 (P1, BRep_Tool::Pnt(V13)); + gp_Ax3 Ax1 (P1, VecN1, VecX1); + + // Axes of the second direction face + gp_Pnt P2 = BRep_Tool::Pnt(V21); + gp_Vec VecN2 (P2, BRep_Tool::Pnt(V22)); + gp_Vec VecX2 (P2, BRep_Tool::Pnt(V23)); + gp_Ax3 Ax2 (P2, VecN2, VecX2); + + gp_Trsf aTrsf; + aTrsf.SetDisplacement(Ax1, Ax2); + + // Check, that is similar to . + // Actually, we need only to check right position of one + // vertex, not involved into the transformation construction. + if (!aBlockTool.IsSimilarFaces(dir_face1, dir_face2, aTrsf)) { + Standard_ConstructionError::Raise("The direction faces are not similar"); + } + + // Perform multi-transformation + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound(aCompound); + + TopoDS_Shape aPrevShape = theBlock; + for (Standard_Integer i = 0; i < theNbIter; i++) { + B.Add(aCompound, aPrevShape); + BRepBuilderAPI_Transform aTransformation (aPrevShape, aTrsf, Standard_False); + aPrevShape = aTransformation.Shape(); + } + theResult = aCompound; +} + +//======================================================================= +//function : MultiTransformate2D +//purpose : +//======================================================================= +void GEOMImpl_BlockDriver::MultiTransformate2D (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace1U, + const TopoDS_Shape& theFace2U, + const Standard_Integer theNbIterU, + const TopoDS_Shape& theFace1V, + const TopoDS_Shape& theFace2V, + const Standard_Integer theNbIterV, + TopoDS_Shape& theResult) const +{ + // Construct Tool, where will be the first face, + // and a face, opposite to , will be the second face + GEOMImpl_Block6Explorer aBlockTool; + aBlockTool.InitByBlockAndFace(theBlock, theFace1U); + + gp_Trsf aTrsfU, aTrsfV; + gp_Ax3 Ax1V, Ax2V; + for (Standard_Integer uv = 1; uv <= 2; uv++) { + // U transformation + TopoDS_Shape theFace1 = theFace1U; + TopoDS_Shape theFace2 = theFace2U; + if (uv == 2) { + // V transformation + theFace1 = theFace1V; + theFace2 = theFace2V; + } + + // Find IDs of the faces + Standard_Integer dir_face1 = aBlockTool.GetFaceID(theFace1); + Standard_Integer dir_face2 = 0; + Standard_Integer opp_face1 = aBlockTool.GetOppositeFaceID(dir_face1); + if (theFace2.IsNull()) { + dir_face2 = opp_face1; + } else { + dir_face2 = aBlockTool.GetFaceID(theFace2); + } + + // Find three pairs of points + Standard_Integer v11_id = 0, v12_id = 0, v13_id = 0; // vertices of the first face + Standard_Integer v21_id = 0, v22_id = 0, v23_id = 0; // vertices of the second face + + if (dir_face2 == opp_face1) { // is opposite to + + // We will take vertices with equal local numbers on the faces, + // as the Block6Explorer gives equal local numbers + // to the linked vertices on the opposite faces, + // i.e. v1* is linked with the v2* by an edge: + + v11_id = aBlockTool.GetVertexID(dir_face1, 1); + v12_id = aBlockTool.GetVertexID(dir_face1, 2); + v13_id = aBlockTool.GetVertexID(dir_face1, 4); + + v21_id = aBlockTool.GetVertexID(dir_face2, 1); + v22_id = aBlockTool.GetVertexID(dir_face2, 2); + v23_id = aBlockTool.GetVertexID(dir_face2, 4); + + } else { + + Standard_Integer common_edge_id = aBlockTool.FindCommonEdgeID(dir_face1, dir_face2); + Standard_Integer common_vertex1 = aBlockTool.GetVertexOnEdgeID(common_edge_id, 1); + Standard_Integer common_vertex2 = aBlockTool.GetVertexOnEdgeID(common_edge_id, 2); + + Standard_Integer not_common_v1 = 0; + Standard_Integer vid = 1; + Standard_Boolean isFound = Standard_False; + while (!isFound && vid <= 4) { + not_common_v1 = aBlockTool.GetVertexID(dir_face1, vid); + isFound = (not_common_v1 != common_vertex2 && + aBlockTool.FindEdgeID(not_common_v1, common_vertex1) != 0); + vid++; + } + + Standard_Integer not_common_v2 = 0; + vid = 1; + isFound = Standard_False; + while (!isFound && vid <= 4) { + not_common_v2 = aBlockTool.GetVertexID(dir_face2, vid); + isFound = (not_common_v2 != common_vertex2 && + aBlockTool.FindEdgeID(not_common_v2, common_vertex1) != 0); + vid++; + } + + v11_id = common_vertex1; + v12_id = common_vertex2; + v13_id = not_common_v1; + + v21_id = common_vertex1; + v22_id = common_vertex2; + v23_id = not_common_v2; + } + + // Construct a transformation operator + TopoDS_Vertex V11 = TopoDS::Vertex(aBlockTool.GetVertex(v11_id)); + TopoDS_Vertex V12 = TopoDS::Vertex(aBlockTool.GetVertex(v12_id)); + TopoDS_Vertex V13 = TopoDS::Vertex(aBlockTool.GetVertex(v13_id)); + + TopoDS_Vertex V21 = TopoDS::Vertex(aBlockTool.GetVertex(v21_id)); + TopoDS_Vertex V22 = TopoDS::Vertex(aBlockTool.GetVertex(v22_id)); + TopoDS_Vertex V23 = TopoDS::Vertex(aBlockTool.GetVertex(v23_id)); + + // Axes of the first direction face + gp_Pnt P1 = BRep_Tool::Pnt(V11); + gp_Vec VecN1 (P1, BRep_Tool::Pnt(V12)); + gp_Vec VecX1 (P1, BRep_Tool::Pnt(V13)); + gp_Ax3 Ax1 (P1, VecN1, VecX1); + + // Axes of the second direction face + gp_Pnt P2 = BRep_Tool::Pnt(V21); + gp_Vec VecN2 (P2, BRep_Tool::Pnt(V22)); + gp_Vec VecX2 (P2, BRep_Tool::Pnt(V23)); + gp_Ax3 Ax2 (P2, VecN2, VecX2); + + gp_Trsf aTrsf; + aTrsf.SetDisplacement(Ax1, Ax2); + if (uv == 1) { + aTrsfU = aTrsf; + } else { + aTrsfV = aTrsf; + Ax1V = Ax1; + Ax2V = Ax2; + } + + // Check, that is similar to . + // Actually, we need only to check right position of one + // vertex, not involved into the transformation construction. + if (!aBlockTool.IsSimilarFaces(dir_face1, dir_face2, aTrsf)) { + Standard_ConstructionError::Raise("The direction faces are not similar"); + } + } + + // Perform multi-transformation + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound(aCompound); + + TopoDS_Shape aPrevShapeU = theBlock; + for (int i = 0; i < theNbIterU; i++) { + TopoDS_Shape aPrevShapeV = aPrevShapeU; + for (int j = 0; j < theNbIterV; j++) { + B.Add(aCompound, aPrevShapeV); + BRepBuilderAPI_Transform aTransformationV (aPrevShapeV, aTrsfV, Standard_False); + aPrevShapeV = aTransformationV.Shape(); + } + BRepBuilderAPI_Transform aTransformationU (aPrevShapeU, aTrsfU, Standard_False); + aPrevShapeU = aTransformationU.Shape(); + // Correction of the second transformation according to the first transformation + Ax1V.Transform(aTrsfU); + Ax2V.Transform(aTrsfU); + aTrsfV.SetDisplacement(Ax1V, Ax2V); + // Correction done + } + theResult = aCompound; +} + +//======================================================================= +//function : GEOMImpl_BlockDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_BlockDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_BlockDriver", + sizeof(GEOMImpl_BlockDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_BlockDriver) Handle(GEOMImpl_BlockDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_BlockDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_BlockDriver))) { + _anOtherObject = Handle(GEOMImpl_BlockDriver)((Handle(GEOMImpl_BlockDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_BlockDriver.hxx b/src/GEOMImpl/GEOMImpl_BlockDriver.hxx new file mode 100644 index 000000000..ab3ea4dfe --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BlockDriver.hxx @@ -0,0 +1,174 @@ +// 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/ +// +// File : GEOMImpl_BlockDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_BlockDriver_HeaderFile +#define _GEOMImpl_BlockDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_BlockDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_BlockDriver); + +class Handle(GEOMImpl_BlockDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_BlockDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_BlockDriver)(const Handle(GEOMImpl_BlockDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_BlockDriver)(const GEOMImpl_BlockDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_BlockDriver)& operator=(const Handle(GEOMImpl_BlockDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_BlockDriver)& operator=(const GEOMImpl_BlockDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_BlockDriver* operator->() + { + return (GEOMImpl_BlockDriver *)ControlAccess(); + } + + GEOMImpl_BlockDriver* operator->() const + { + return (GEOMImpl_BlockDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_BlockDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_BlockDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif +#include + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_BlockDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_BlockDriver(); +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_BlockDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_BlockDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_BlockDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_BlockDriver) == AType || TFunction_Driver::IsKind(AType)); } + +private: + void MultiTransformate1D (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace1, + const TopoDS_Shape& theFace2, + const Standard_Integer theNbIter, + TopoDS_Shape& theResult) const; + + void MultiTransformate2D (const TopoDS_Shape& theBlock, + const TopoDS_Shape& theFace1U, + const TopoDS_Shape& theFace2U, + const Standard_Integer theNbIterU, + const TopoDS_Shape& theFace1V, + const TopoDS_Shape& theFace2V, + const Standard_Integer theNbIterV, + TopoDS_Shape& theResult) const; + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx new file mode 100644 index 000000000..f427e61e8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.cxx @@ -0,0 +1,158 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_BooleanDriver::GetID() +{ + static Standard_GUID aBooleanDriver("FF1BBB21-5D14-4df2-980B-3A668264EA16"); + return aBooleanDriver; +} + + +//======================================================================= +//function : GEOMImpl_BooleanDriver +//purpose : +//======================================================================= +GEOMImpl_BooleanDriver::GEOMImpl_BooleanDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_BooleanDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IBoolean aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + Handle(GEOM_Function) aRefShape1 = aCI.GetShape1(); + Handle(GEOM_Function) aRefShape2 = aCI.GetShape2(); + TopoDS_Shape aShape1 = aRefShape1->GetValue(); + TopoDS_Shape aShape2 = aRefShape2->GetValue(); + if (!aShape1.IsNull() && !aShape2.IsNull()) { + if (aType == BOOLEAN_COMMON) { + BRepAlgoAPI_Common BO (aShape1, aShape2); +// BO.Build(); + if (!BO.IsDone()) { + StdFail_NotDone::Raise("Requested boolean operation can not be performed on the given shapes"); + } + aShape = BO.Shape(); + } else if (aType == BOOLEAN_CUT) { + BRepAlgoAPI_Cut BO (aShape1, aShape2); + if (!BO.IsDone()) { + StdFail_NotDone::Raise("Requested boolean operation can not be performed on the given shapes"); + } + aShape = BO.Shape(); + } else if (aType == BOOLEAN_FUSE) { + BRepAlgoAPI_Fuse BO (aShape1, aShape2); + if (!BO.IsDone()) { + StdFail_NotDone::Raise("Requested boolean operation can not be performed on the given shapes"); + } + aShape = BO.Shape(); + } else if (aType == BOOLEAN_SECTION) { + BRepAlgoAPI_Section BO (aShape1, aShape2); + if (!BO.IsDone()) { + StdFail_NotDone::Raise("Requested boolean operation can not be performed on the given shapes"); + } + aShape = BO.Shape(); + } else { + } + } + + if (aShape.IsNull()) return 0; + if (!BRepAlgo::IsValid(aShape)) { + Standard_ConstructionError::Raise("Boolean aborted : non valid shape result"); + } + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_BooleanDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_BooleanDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_BooleanDriver", + sizeof(GEOMImpl_BooleanDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_BooleanDriver) Handle(GEOMImpl_BooleanDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_BooleanDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_BooleanDriver))) { + _anOtherObject = Handle(GEOMImpl_BooleanDriver)((Handle(GEOMImpl_BooleanDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx b/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx new file mode 100644 index 000000000..c65e964ee --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BooleanDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_BooleanDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_BooleanDriver_HeaderFile +#define _GEOMImpl_BooleanDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_BooleanDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_BooleanDriver); + +class Handle(GEOMImpl_BooleanDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_BooleanDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_BooleanDriver)(const Handle(GEOMImpl_BooleanDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_BooleanDriver)(const GEOMImpl_BooleanDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_BooleanDriver)& operator=(const Handle(GEOMImpl_BooleanDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_BooleanDriver)& operator=(const GEOMImpl_BooleanDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_BooleanDriver* operator->() + { + return (GEOMImpl_BooleanDriver *)ControlAccess(); + } + + GEOMImpl_BooleanDriver* operator->() const + { + return (GEOMImpl_BooleanDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_BooleanDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_BooleanDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_BooleanDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_BooleanDriver(); +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_BooleanDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_BooleanDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_BooleanDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_BooleanDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_BoxDriver.cxx b/src/GEOMImpl/GEOMImpl_BoxDriver.cxx new file mode 100644 index 000000000..99e1ff87d --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BoxDriver.cxx @@ -0,0 +1,151 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_BoxDriver::GetID() +{ + static Standard_GUID aBoxDriver("FF1BBB13-5D14-4df2-980B-3A668264EA16"); + return aBoxDriver; +} + + +//======================================================================= +//function : GEOMImpl_BoxDriver +//purpose : +//======================================================================= +GEOMImpl_BoxDriver::GEOMImpl_BoxDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_BoxDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IBox aBI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == BOX_DX_DY_DZ) { + BRepPrimAPI_MakeBox MB (aBI.GetDX(), aBI.GetDY(), aBI.GetDZ()); + MB.Build(); + + if (!MB.IsDone()) { + StdFail_NotDone::Raise("Box with the given dimensions can not be computed"); + } + aShape = MB.Shape(); + } + else if (aType == BOX_TWO_PNT) { + Handle(GEOM_Function) aRefPoint1 = aBI.GetRef1(); + Handle(GEOM_Function) aRefPoint2 = aBI.GetRef2(); + TopoDS_Shape aShape1 = aRefPoint1->GetValue(); + TopoDS_Shape aShape2 = aRefPoint2->GetValue(); + if (aShape1.ShapeType() == TopAbs_VERTEX && + aShape2.ShapeType() == TopAbs_VERTEX) { + gp_Pnt P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); + gp_Pnt P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape2)); + BRepPrimAPI_MakeBox MB (P1,P2); + MB.Build(); + + if (!MB.IsDone()) { + StdFail_NotDone::Raise("Box can not be computed from the given point"); + } + aShape = MB.Shape(); + } + } + else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_BoxDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_BoxDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_BoxDriver", + sizeof(GEOMImpl_BoxDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_BoxDriver) Handle(GEOMImpl_BoxDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_BoxDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_BoxDriver))) { + _anOtherObject = Handle(GEOMImpl_BoxDriver)((Handle(GEOMImpl_BoxDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_BoxDriver.hxx b/src/GEOMImpl/GEOMImpl_BoxDriver.hxx new file mode 100644 index 000000000..a7692f639 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_BoxDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_BoxDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_BoxDriver_HeaderFile +#define _GEOMImpl_BoxDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_BoxDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_BoxDriver); + +class Handle(GEOMImpl_BoxDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_BoxDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_BoxDriver)(const Handle(GEOMImpl_BoxDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_BoxDriver)(const GEOMImpl_BoxDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_BoxDriver)& operator=(const Handle(GEOMImpl_BoxDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_BoxDriver)& operator=(const GEOMImpl_BoxDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_BoxDriver* operator->() + { + return (GEOMImpl_BoxDriver *)ControlAccess(); + } + + GEOMImpl_BoxDriver* operator->() const + { + return (GEOMImpl_BoxDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_BoxDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_BoxDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_BoxDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_BoxDriver(); +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_BoxDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_BoxDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_BoxDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_BoxDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ChamferDriver.cxx b/src/GEOMImpl/GEOMImpl_ChamferDriver.cxx new file mode 100644 index 000000000..7cabd43cf --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ChamferDriver.cxx @@ -0,0 +1,248 @@ +// 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/ +// + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ChamferDriver::GetID() +{ + static Standard_GUID aChamferDriver("FF1BBB42-5D14-4df2-980B-3A668264EA16"); + return aChamferDriver; +} + + +//======================================================================= +//function : GEOMImpl_ChamferDriver +//purpose : +//======================================================================= +GEOMImpl_ChamferDriver::GEOMImpl_ChamferDriver() +{ +} + +//======================================================================= +//function : isGoodForChamfer +//purpose : +//======================================================================= +static Standard_Boolean isGoodForChamfer (const TopoDS_Shape& theShape) +{ + if (theShape.ShapeType() == TopAbs_SHELL || + theShape.ShapeType() == TopAbs_SOLID || + theShape.ShapeType() == TopAbs_COMPSOLID) { + return Standard_True; + } + + if (theShape.ShapeType() == TopAbs_COMPOUND) { + TopTools_MapOfShape mapShape; + TopoDS_Iterator It (theShape, Standard_False, Standard_False); + for (; It.More(); It.Next()) { + if (mapShape.Add(It.Value())) { + if (!isGoodForChamfer(It.Value())) { + return Standard_False; + } + } + } + return Standard_True; + } + + return Standard_False; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ChamferDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IChamfer aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + + // Check the shape type. It have to be shell + // or solid, or compsolid, or compound of these shapes. + if (!isGoodForChamfer(aShapeBase)) { + StdFail_NotDone::Raise + ("Wrong shape. Must be shell or solid, or compsolid or compound of these shapes"); + } + + BRepFilletAPI_MakeChamfer fill (aShapeBase); + + if (aType == CHAMFER_SHAPE_ALL) { + // symmetric chamfer on all edges + double aD = aCI.GetD(); + TopTools_IndexedDataMapOfShapeListOfShape M; + GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M); + for (int i = 1; i <= M.Extent(); i++) { + TopoDS_Edge E = TopoDS::Edge(M.FindKey(i)); + TopoDS_Face F = TopoDS::Face(M.FindFromIndex(i).First()); + if (!BRepTools::IsReallyClosed(E, F) && + !BRep_Tool::Degenerated(E) && + M.FindFromIndex(i).Extent() == 2) + fill.Add(aD, E, F); + } + } else if (aType == CHAMFER_SHAPE_EDGE) { + // chamfer on edges, common to two faces, with D1 on the first face + double aD1 = aCI.GetD1(); + double aD2 = aCI.GetD2(); + TopoDS_Shape aFace1, aFace2; + if (GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace1(), aFace1) && + GEOMImpl_ILocalOperations::GetSubShape(aShapeBase, aCI.GetFace2(), aFace2)) { + TopoDS_Face F = TopoDS::Face(aFace1); + + // fill map of edges of the second face + TopTools_MapOfShape aMap; + TopExp_Explorer Exp2 (aFace2, TopAbs_EDGE); + for (; Exp2.More(); Exp2.Next()) { + aMap.Add(Exp2.Current()); + } + + // find edges of the first face, common with the second face + TopExp_Explorer Exp (aFace1, TopAbs_EDGE); + for (; Exp.More(); Exp.Next()) { + if (aMap.Contains(Exp.Current())) { + TopoDS_Edge E = TopoDS::Edge(Exp.Current()); + if (!BRepTools::IsReallyClosed(E, F) && !BRep_Tool::Degenerated(E)) + fill.Add(aD1, aD2, E, F); + } + } + } + } else if (aType == CHAMFER_SHAPE_FACES) { + // chamfer on all edges of the selected faces, with D1 on the selected face + // (on first selected face, if the edge belongs to two selected faces) + double aD1 = aCI.GetD1(); + double aD2 = aCI.GetD2(); + int aLen = aCI.GetLength(); + int ind = 1; + TopTools_MapOfShape aMap; + TopTools_IndexedDataMapOfShapeListOfShape M; + GEOMImpl_Block6Explorer::MapShapesAndAncestors(aShapeBase, TopAbs_EDGE, TopAbs_FACE, M); + for (; ind <= aLen; ind++) + { + TopoDS_Shape aShapeFace; + if (GEOMImpl_ILocalOperations::GetSubShape + (aShapeBase, aCI.GetFace(ind), aShapeFace)) { + TopoDS_Face F = TopoDS::Face(aShapeFace); + TopExp_Explorer Exp (F, TopAbs_EDGE); + for (; Exp.More(); Exp.Next()) { + if (!aMap.Contains(Exp.Current())) { + TopoDS_Edge E = TopoDS::Edge(Exp.Current()); + if (!BRepTools::IsReallyClosed(E, F) && + !BRep_Tool::Degenerated(E) && + M.FindFromKey(E).Extent() == 2) + fill.Add(aD1, aD2, E, F); + } + } + } + } + } else { + } + + fill.Build(); + if (!fill.IsDone()) { + StdFail_NotDone::Raise("Chamfer can not be computed on the given shape with the given parameters"); + } + aShape = fill.Shape(); + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ChamferDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ChamferDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ChamferDriver", + sizeof(GEOMImpl_ChamferDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ChamferDriver) Handle(GEOMImpl_ChamferDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ChamferDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ChamferDriver))) { + _anOtherObject = Handle(GEOMImpl_ChamferDriver)((Handle(GEOMImpl_ChamferDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ChamferDriver.hxx b/src/GEOMImpl/GEOMImpl_ChamferDriver.hxx new file mode 100644 index 000000000..605683be8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ChamferDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ChamferDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ChamferDriver_HeaderFile +#define _GEOMImpl_ChamferDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ChamferDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ChamferDriver); + +class Handle(GEOMImpl_ChamferDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ChamferDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ChamferDriver)(const Handle(GEOMImpl_ChamferDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ChamferDriver)(const GEOMImpl_ChamferDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ChamferDriver)& operator=(const Handle(GEOMImpl_ChamferDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ChamferDriver)& operator=(const GEOMImpl_ChamferDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ChamferDriver* operator->() + { + return (GEOMImpl_ChamferDriver *)ControlAccess(); + } + + GEOMImpl_ChamferDriver* operator->() const + { + return (GEOMImpl_ChamferDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ChamferDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ChamferDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ChamferDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ChamferDriver(); +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_ChamferDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ChamferDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ChamferDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ChamferDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_CircleDriver.cxx b/src/GEOMImpl/GEOMImpl_CircleDriver.cxx new file mode 100644 index 000000000..61dedcccc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CircleDriver.cxx @@ -0,0 +1,174 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_CircleDriver::GetID() +{ + static Standard_GUID aCircleDriver("FF1BBB32-5D14-4df2-980B-3A668264EA16"); + return aCircleDriver; +} + + +//======================================================================= +//function : GEOMImpl_CircleDriver +//purpose : +//======================================================================= +GEOMImpl_CircleDriver::GEOMImpl_CircleDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_CircleDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ICircle aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == CIRCLE_PNT_VEC_R) { + Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX && + aShapeVec.ShapeType() == TopAbs_EDGE) { + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) { + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + gp_Ax2 anAxes (aP, aV); + gp_Circ aCirc (anAxes, aCI.GetRadius()); + aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge(); + } + } + } + else if (aType == CIRCLE_THREE_PNT) { + Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1(); + Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); + Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3(); + TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue(); + TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue(); + TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue(); + if (aShapePnt1.ShapeType() == TopAbs_VERTEX && + aShapePnt2.ShapeType() == TopAbs_VERTEX && + aShapePnt3.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2)); + gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3)); + if (aP1.Distance(aP2) < gp::Resolution() || + aP1.Distance(aP3) < gp::Resolution() || + aP2.Distance(aP3) < gp::Resolution()) + Standard_ConstructionError::Raise("Circle creation aborted: coincident points given"); + if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) + Standard_ConstructionError::Raise("Circle creation aborted: points lay on one line"); + Handle(Geom_Circle) aCirc = GC_MakeCircle(aP1, aP2, aP3).Value(); + aShape = BRepBuilderAPI_MakeEdge(aCirc).Edge(); + } + } + else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_CircleDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_CircleDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_CircleDriver", + sizeof(GEOMImpl_CircleDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_CircleDriver) Handle(GEOMImpl_CircleDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_CircleDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_CircleDriver))) { + _anOtherObject = Handle(GEOMImpl_CircleDriver)((Handle(GEOMImpl_CircleDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_CircleDriver.hxx b/src/GEOMImpl/GEOMImpl_CircleDriver.hxx new file mode 100644 index 000000000..c71752dbd --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CircleDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_CircleDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_CircleDriver_HeaderFile +#define _GEOMImpl_CircleDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_CircleDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_CircleDriver); + +class Handle(GEOMImpl_CircleDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_CircleDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_CircleDriver)(const Handle(GEOMImpl_CircleDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_CircleDriver)(const GEOMImpl_CircleDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_CircleDriver)& operator=(const Handle(GEOMImpl_CircleDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_CircleDriver)& operator=(const GEOMImpl_CircleDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_CircleDriver* operator->() + { + return (GEOMImpl_CircleDriver *)ControlAccess(); + } + + GEOMImpl_CircleDriver* operator->() const + { + return (GEOMImpl_CircleDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_CircleDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_CircleDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_CircleDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_CircleDriver(); +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_CircleDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_CircleDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_CircleDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_CircleDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ConeDriver.cxx b/src/GEOMImpl/GEOMImpl_ConeDriver.cxx new file mode 100644 index 000000000..fa89e2c03 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ConeDriver.cxx @@ -0,0 +1,185 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ConeDriver::GetID() +{ + static Standard_GUID aConeDriver("FF1BBB15-5D14-4df2-980B-3A668264EA16"); + return aConeDriver; +} + + +//======================================================================= +//function : GEOMImpl_ConeDriver +//purpose : +//======================================================================= +GEOMImpl_ConeDriver::GEOMImpl_ConeDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ConeDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ICone aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + gp_Pnt aP; + gp_Vec aV; + + Standard_Real aR1 = aCI.GetR1(); + Standard_Real aR2 = aCI.GetR2(); + + if (aType == CONE_R1_R2_H) { + aP = gp::Origin(); + aV = gp::DZ(); + + } else if (aType == CONE_PNT_VEC_R1_R2_H) { + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapePnt.IsNull() || aShapeVec.IsNull()) { + Standard_NullObject::Raise + ("Cone creation aborted: point or vector is not defined"); + } + if (aShapePnt.ShapeType() != TopAbs_VERTEX || + aShapeVec.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise + ("Cone creation aborted: point or vector shapes has wrong type"); + } + + aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_NullObject::Raise + ("Cylinder creation aborted: vector is not defined"); + } + aV = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + + } else { + return 0; + } + + if (aCI.GetH() < 0.0) aV.Reverse(); + gp_Ax2 anAxes (aP, aV); + + TopoDS_Shape aShape; + // Cone does not work if same radius + if (fabs(aR1 - aR2) <= Precision::Confusion()) { + BRepPrimAPI_MakeCylinder MC (anAxes, (aR1 + aR2)/2.0, Abs(aCI.GetH())); + MC.Build(); + if (!MC.IsDone()) { + StdFail_NotDone::Raise("Cylinder can't be computed from the given parameters"); + } + aShape = MC.Shape(); + } else { + BRepPrimAPI_MakeCone MC (anAxes, aCI.GetR1(), aCI.GetR2(), Abs(aCI.GetH())); + MC.Build(); + if (!MC.IsDone()) { + StdFail_NotDone::Raise("Cylinder can't be computed from the given parameters"); + } + aShape = MC.Shape(); + } + if (aShape.IsNull()) return 0; + + log.SetTouched(Label()); + + aFunction->SetValue(aShape); + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ConeDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ConeDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ConeDriver", + sizeof(GEOMImpl_ConeDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ConeDriver) Handle(GEOMImpl_ConeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ConeDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ConeDriver))) { + _anOtherObject = Handle(GEOMImpl_ConeDriver)((Handle(GEOMImpl_ConeDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ConeDriver.hxx b/src/GEOMImpl/GEOMImpl_ConeDriver.hxx new file mode 100644 index 000000000..02cf07d6f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ConeDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ConeDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ConeDriver_HeaderFile +#define _GEOMImpl_ConeDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ConeDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ConeDriver); + +class Handle(GEOMImpl_ConeDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ConeDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ConeDriver)(const Handle(GEOMImpl_ConeDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ConeDriver)(const GEOMImpl_ConeDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ConeDriver)& operator=(const Handle(GEOMImpl_ConeDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ConeDriver)& operator=(const GEOMImpl_ConeDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ConeDriver* operator->() + { + return (GEOMImpl_ConeDriver *)ControlAccess(); + } + + GEOMImpl_ConeDriver* operator->() const + { + return (GEOMImpl_ConeDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ConeDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ConeDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ConeDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ConeDriver(); +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_ConeDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ConeDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ConeDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ConeDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_CopyDriver.cxx b/src/GEOMImpl/GEOMImpl_CopyDriver.cxx new file mode 100644 index 000000000..f2abc002c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CopyDriver.cxx @@ -0,0 +1,134 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_CopyDriver::GetID() +{ + static Standard_GUID aCopyDriver("FF1BBB53-5D14-4df2-980B-3A668264EA16"); + return aCopyDriver; +} + + +//======================================================================= +//function : GEOMImpl_CopyDriver +//purpose : +//======================================================================= +GEOMImpl_CopyDriver::GEOMImpl_CopyDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_CopyDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + Standard_Integer aType = aFunction->GetType(); + + GEOMImpl_ICopy aCI (aFunction); + TopoDS_Shape aCopy; + + if(aType == COPY_WITH_REF) { + + Handle(GEOM_Function) aRefFunction = aCI.GetOriginal(); + if (aRefFunction.IsNull()) return 0; + TopoDS_Shape anOriginal = aRefFunction->GetValue(); + + TColStd_IndexedDataMapOfTransientTransient aMap; + + TNaming_CopyShape::CopyTool(anOriginal, aMap, aCopy); + } + else if(aType == COPY_WITHOUT_REF) { + aCopy = aFunction->GetValue(); + } + + if (aCopy.IsNull()) return 0; + + aFunction->SetValue(aCopy); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_CopyDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_CopyDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_CopyDriver", + sizeof(GEOMImpl_CopyDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_CopyDriver) Handle(GEOMImpl_CopyDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_CopyDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_CopyDriver))) { + _anOtherObject = Handle(GEOMImpl_CopyDriver)((Handle(GEOMImpl_CopyDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_CopyDriver.hxx b/src/GEOMImpl/GEOMImpl_CopyDriver.hxx new file mode 100644 index 000000000..53d58aa7a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CopyDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_CopyDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_CopyDriver_HeaderFile +#define _GEOMImpl_CopyDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_CopyDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_CopyDriver); + +class Handle(GEOMImpl_CopyDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_CopyDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_CopyDriver)(const Handle(GEOMImpl_CopyDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_CopyDriver)(const GEOMImpl_CopyDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_CopyDriver)& operator=(const Handle(GEOMImpl_CopyDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_CopyDriver)& operator=(const GEOMImpl_CopyDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_CopyDriver* operator->() + { + return (GEOMImpl_CopyDriver *)ControlAccess(); + } + + GEOMImpl_CopyDriver* operator->() const + { + return (GEOMImpl_CopyDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_CopyDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_CopyDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_CopyDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_CopyDriver(); +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_CopyDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_CopyDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_CopyDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_CopyDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_CylinderDriver.cxx b/src/GEOMImpl/GEOMImpl_CylinderDriver.cxx new file mode 100644 index 000000000..baff87eea --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CylinderDriver.cxx @@ -0,0 +1,168 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_CylinderDriver::GetID() +{ + static Standard_GUID aCylinderDriver("FF1BBB14-5D14-4df2-980B-3A668264EA16"); + return aCylinderDriver; +} + + +//======================================================================= +//function : GEOMImpl_CylinderDriver +//purpose : +//======================================================================= +GEOMImpl_CylinderDriver::GEOMImpl_CylinderDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_CylinderDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ICylinder aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + gp_Pnt aP; + gp_Vec aV; + + if (aType == CYLINDER_R_H) { + aP = gp::Origin(); + aV = gp::DZ(); + } + else if (aType == CYLINDER_PNT_VEC_R_H) { + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapePnt.IsNull() || aShapeVec.IsNull()) { + Standard_NullObject::Raise("Cylinder creation aborted: point or vector is not defined"); + } + if (aShapePnt.ShapeType() != TopAbs_VERTEX || + aShapeVec.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise("Cylinder creation aborted: point or vector shapes has wrong type"); + } + + aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_NullObject::Raise("Cylinder creation aborted: vector is not defined"); + } + aV = gp_Vec(BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + } + else { + return 0; + } + + if (aCI.GetH() < 0.0) aV.Reverse(); + gp_Ax2 anAxes (aP, aV); + + BRepPrimAPI_MakeCylinder MC (anAxes, aCI.GetR(), Abs(aCI.GetH())); + MC.Build(); + if (!MC.IsDone()) { + StdFail_NotDone::Raise("Cylinder can't be computed from the given parameters"); + } + + TopoDS_Shape aShape = MC.Shape(); + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_CylinderDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_CylinderDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_CylinderDriver", + sizeof(GEOMImpl_CylinderDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_CylinderDriver) Handle(GEOMImpl_CylinderDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_CylinderDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_CylinderDriver))) { + _anOtherObject = Handle(GEOMImpl_CylinderDriver)((Handle(GEOMImpl_CylinderDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_CylinderDriver.hxx b/src/GEOMImpl/GEOMImpl_CylinderDriver.hxx new file mode 100644 index 000000000..ba55aac2b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_CylinderDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_CylinderDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_CylinderDriver_HeaderFile +#define _GEOMImpl_CylinderDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_CylinderDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_CylinderDriver); + +class Handle(GEOMImpl_CylinderDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_CylinderDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_CylinderDriver)(const Handle(GEOMImpl_CylinderDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_CylinderDriver)(const GEOMImpl_CylinderDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_CylinderDriver)& operator=(const Handle(GEOMImpl_CylinderDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_CylinderDriver)& operator=(const GEOMImpl_CylinderDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_CylinderDriver* operator->() + { + return (GEOMImpl_CylinderDriver *)ControlAccess(); + } + + GEOMImpl_CylinderDriver* operator->() const + { + return (GEOMImpl_CylinderDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_CylinderDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_CylinderDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_CylinderDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_CylinderDriver(); +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_CylinderDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_CylinderDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_CylinderDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_CylinderDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx b/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx new file mode 100644 index 000000000..fe5ddfe59 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_EllipseDriver.cxx @@ -0,0 +1,144 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_EllipseDriver::GetID() +{ + static Standard_GUID aEllipseDriver("FF1BBB34-5D14-4df2-980B-3A668264EA16"); + return aEllipseDriver; +} + + +//======================================================================= +//function : GEOMImpl_EllipseDriver +//purpose : +//======================================================================= +GEOMImpl_EllipseDriver::GEOMImpl_EllipseDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_EllipseDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IEllipse aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == ELLIPSE_PNT_VEC_RR) { + Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX && + aShapeVec.ShapeType() == TopAbs_EDGE) { + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) { + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + gp_Ax2 anAxes (aP, aV); + gp_Elips anEll (anAxes, aCI.GetRMajor(), aCI.GetRMinor()); + aShape = BRepBuilderAPI_MakeEdge(anEll).Edge(); + } + } + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_EllipseDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_EllipseDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_EllipseDriver", + sizeof(GEOMImpl_EllipseDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_EllipseDriver) Handle(GEOMImpl_EllipseDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_EllipseDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_EllipseDriver))) { + _anOtherObject = Handle(GEOMImpl_EllipseDriver)((Handle(GEOMImpl_EllipseDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_EllipseDriver.hxx b/src/GEOMImpl/GEOMImpl_EllipseDriver.hxx new file mode 100644 index 000000000..c1d16b9a6 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_EllipseDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_EllipseDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_EllipseDriver_HeaderFile +#define _GEOMImpl_EllipseDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_EllipseDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_EllipseDriver); + +class Handle(GEOMImpl_EllipseDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_EllipseDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_EllipseDriver)(const Handle(GEOMImpl_EllipseDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_EllipseDriver)(const GEOMImpl_EllipseDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_EllipseDriver)& operator=(const Handle(GEOMImpl_EllipseDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_EllipseDriver)& operator=(const GEOMImpl_EllipseDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_EllipseDriver* operator->() + { + return (GEOMImpl_EllipseDriver *)ControlAccess(); + } + + GEOMImpl_EllipseDriver* operator->() const + { + return (GEOMImpl_EllipseDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_EllipseDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_EllipseDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_EllipseDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_EllipseDriver(); +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_EllipseDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_EllipseDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_EllipseDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_EllipseDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ExportDriver.cxx b/src/GEOMImpl/GEOMImpl_ExportDriver.cxx new file mode 100644 index 000000000..5898d9e1b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ExportDriver.cxx @@ -0,0 +1,159 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#ifdef WNT +#include +#else +#include +#endif + +#ifdef WNT +#define LibHandle HMODULE +#define LoadLib( name ) LoadLibrary( name ) +#define GetProc GetProcAddress +#define UnLoadLib( handle ) FreeLibrary( handle ); +#else +#define LibHandle void* +#define LoadLib( name ) dlopen( name, RTLD_LAZY ) +#define GetProc dlsym +#define UnLoadLib( handle ) dlclose( handle ); +#endif + +typedef int (*funcPoint)(const TopoDS_Shape&, const TCollection_AsciiString&); + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ExportDriver::GetID() +{ + static Standard_GUID aExportDriver("FF1BBB58-5D14-4df2-980B-3A668264EA16"); + return aExportDriver; +} + + +//======================================================================= +//function : GEOMImpl_ExportDriver +//purpose : +//======================================================================= +GEOMImpl_ExportDriver::GEOMImpl_ExportDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ExportDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IImportExport aCI (aFunction); + + // retrieve the being exported shape + TopoDS_Shape aShape; + Handle(GEOM_Function) aRefFunction = aCI.GetOriginal(); + if (aRefFunction.IsNull()) return 0; + aShape = aRefFunction->GetValue(); + if (aShape.IsNull()) return 0; + // !!! set the result of function to be used by next operations + aFunction->SetValue(aShape); + + // retrieve the file and format names + TCollection_AsciiString aFileName = aCI.GetFileName(); + TCollection_AsciiString aLibName = aCI.GetPluginName(); + if (aFileName.IsEmpty() || aLibName.IsEmpty()) + return 0; + + // load plugin library + LibHandle anExportLib = LoadLib( aLibName.ToCString() ); + funcPoint fp = 0; + if ( anExportLib ) + fp = (funcPoint)GetProc( anExportLib, "Export" ); + + if ( !fp ) + return 0; + + // perform the export + int res = fp( aShape, aFileName ); + + // unload plugin library + UnLoadLib( anExportLib ); + if ( res ) + log.SetTouched(Label()); + + return res; +} + + +//======================================================================= +//function : GEOMImpl_ExportDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ExportDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ExportDriver", + sizeof(GEOMImpl_ExportDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ExportDriver) Handle(GEOMImpl_ExportDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ExportDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ExportDriver))) { + _anOtherObject = Handle(GEOMImpl_ExportDriver)((Handle(GEOMImpl_ExportDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ExportDriver.hxx b/src/GEOMImpl/GEOMImpl_ExportDriver.hxx new file mode 100644 index 000000000..0d46a94ac --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ExportDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ExportDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ExportDriver_HeaderFile +#define _GEOMImpl_ExportDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ExportDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ExportDriver); + +class Handle(GEOMImpl_ExportDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ExportDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ExportDriver)(const Handle(GEOMImpl_ExportDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ExportDriver)(const GEOMImpl_ExportDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ExportDriver)& operator=(const Handle(GEOMImpl_ExportDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ExportDriver)& operator=(const GEOMImpl_ExportDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ExportDriver* operator->() + { + return (GEOMImpl_ExportDriver *)ControlAccess(); + } + + GEOMImpl_ExportDriver* operator->() const + { + return (GEOMImpl_ExportDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ExportDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ExportDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ExportDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ExportDriver(); +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_ExportDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ExportDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ExportDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ExportDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_FilletDriver.cxx b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx new file mode 100644 index 000000000..3dbe9a461 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_FilletDriver.cxx @@ -0,0 +1,177 @@ +// 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/ +// + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_FilletDriver::GetID() +{ + static Standard_GUID aFilletDriver("FF1BBB41-5D14-4df2-980B-3A668264EA16"); + return aFilletDriver; +} + + +//======================================================================= +//function : GEOMImpl_FilletDriver +//purpose : +//======================================================================= +GEOMImpl_FilletDriver::GEOMImpl_FilletDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_FilletDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IFillet aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + BRepFilletAPI_MakeFillet fill (aShapeBase); + + if (aType == FILLET_SHAPE_ALL) { + TopExp_Explorer Exp (aShapeBase, TopAbs_EDGE); + for (; Exp.More(); Exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(Exp.Current()); + fill.Add(E); + } + } else if (aType == FILLET_SHAPE_EDGES) { + int aLen = aCI.GetLength(); + int ind = 1; + for (; ind <= aLen; ind++) { + TopoDS_Shape aShapeEdge; + if (GEOMImpl_ILocalOperations::GetSubShape + (aShapeBase, aCI.GetEdge(ind), aShapeEdge)) { + fill.Add(TopoDS::Edge(aShapeEdge)); + } + } + } else if (aType == FILLET_SHAPE_FACES) { + int aLen = aCI.GetLength(); + int ind = 1; + for (; ind <= aLen; ind++) { + TopoDS_Shape aShapeFace; + if (GEOMImpl_ILocalOperations::GetSubShape + (aShapeBase, aCI.GetFace(ind), aShapeFace)) { + TopExp_Explorer Exp (aShapeFace, TopAbs_EDGE); + for (; Exp.More(); Exp.Next()) { + fill.Add(TopoDS::Edge(Exp.Current())); + } + } + } + } else { + } + + for (int i = 1; i <= fill.NbContours(); i++) { + fill.SetRadius(aCI.GetR(), i, i); + } + fill.Build(); + if (!fill.IsDone()) { + StdFail_NotDone::Raise("Fillet can't be computed on the given shape with the given radius"); + } + aShape = fill.Shape(); + + if (aShape.IsNull()) return 0; + + // Check shape validity + BRepCheck_Analyzer ana (aShape, false); + if (!ana.IsValid()) { + StdFail_NotDone::Raise("Fillet algorithm have produced an invalid shape result"); + } + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_FilletDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_FilletDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_FilletDriver", + sizeof(GEOMImpl_FilletDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_FilletDriver) Handle(GEOMImpl_FilletDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_FilletDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_FilletDriver))) { + _anOtherObject = Handle(GEOMImpl_FilletDriver)((Handle(GEOMImpl_FilletDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_FilletDriver.hxx b/src/GEOMImpl/GEOMImpl_FilletDriver.hxx new file mode 100644 index 000000000..5f9a6d2d1 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_FilletDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_FilletDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_FilletDriver_HeaderFile +#define _GEOMImpl_FilletDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_FilletDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_FilletDriver); + +class Handle(GEOMImpl_FilletDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_FilletDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_FilletDriver)(const Handle(GEOMImpl_FilletDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_FilletDriver)(const GEOMImpl_FilletDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_FilletDriver)& operator=(const Handle(GEOMImpl_FilletDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_FilletDriver)& operator=(const GEOMImpl_FilletDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_FilletDriver* operator->() + { + return (GEOMImpl_FilletDriver *)ControlAccess(); + } + + GEOMImpl_FilletDriver* operator->() const + { + return (GEOMImpl_FilletDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_FilletDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_FilletDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_FilletDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_FilletDriver(); +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_FilletDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_FilletDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_FilletDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_FilletDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_FillingDriver.cxx b/src/GEOMImpl/GEOMImpl_FillingDriver.cxx new file mode 100644 index 000000000..c9771babe --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_FillingDriver.cxx @@ -0,0 +1,186 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_FillingDriver::GetID() +{ + static Standard_GUID aFillingDriver ("FF1BBB62-5D14-4df2-980B-3A668264EA16"); + return aFillingDriver; +} + + +//======================================================================= +//function : GEOMImpl_FillingDriver +//purpose : +//======================================================================= + +GEOMImpl_FillingDriver::GEOMImpl_FillingDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_FillingDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + if (aFunction.IsNull()) return 0; + + if (aFunction->GetType() != BASIC_FILLING) return 0; + + GEOMImpl_IFilling IF (aFunction); + Handle(GEOM_Function) aShapeFunction = IF.GetShape(); + if (aShapeFunction.IsNull()) return 0; + TopoDS_Shape aShape = aShapeFunction->GetValue(); + if (aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND) return 0; + + Standard_Integer mindeg = IF.GetMinDeg(); + Standard_Integer maxdeg = IF.GetMaxDeg(); + Standard_Real tol3d = IF.GetTol2D(); + Standard_Real tol2d = IF.GetTol3D(); + Standard_Integer nbiter = IF.GetNbIter(); + + if (mindeg > maxdeg) { + Standard_RangeError::Raise("Minimal degree can not be more than maximal degree"); + } + + /* we verify the contents of the shape */ + TopExp_Explorer Ex; + TopoDS_Shape Scurrent; + Standard_Real First, Last; + Handle(Geom_Curve) C; + GeomFill_SectionGenerator Section; + + Standard_Integer i = 0; + for (Ex.Init(aShape, TopAbs_EDGE); Ex.More(); Ex.Next()) { + Scurrent = Ex.Current() ; + if (Scurrent.IsNull() || Scurrent.ShapeType() != TopAbs_EDGE) return 0; + C = BRep_Tool::Curve(TopoDS::Edge(Scurrent), First, Last); + C = new Geom_TrimmedCurve(C, First, Last); + Section.AddCurve(C); + i++; + } + + /* a 'tolerance' is used to compare 2 knots : see GeomFill_Generator.cdl */ + Section.Perform(Precision::Confusion()); + Handle(GeomFill_Line) Line = new GeomFill_Line(i); + + GeomFill_AppSurf App (mindeg, maxdeg, tol3d, tol2d, nbiter); /* user parameters */ + App.Perform(Line, Section); + + if (!App.IsDone()) return 0; + Standard_Integer UDegree, VDegree, NbUPoles, NbVPoles, NbUKnots, NbVKnots; + App.SurfShape(UDegree, VDegree, NbUPoles, NbVPoles, NbUKnots, NbVKnots); + Handle(Geom_BSplineSurface) GBS = new Geom_BSplineSurface + (App.SurfPoles(), App.SurfWeights(), App.SurfUKnots(), App.SurfVKnots(), + App.SurfUMults(), App.SurfVMults(), App.UDegree(), App.VDegree()); + + if (GBS.IsNull()) return 0; + aShape = BRepBuilderAPI_MakeFace(GBS); + + /* We test the validity of resulting shape */ + if (!BRepAlgo::IsValid((aShape))) { + Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); + return 0; + } + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + return 1; +} + + +//======================================================================= +//function : GEOMImpl_FillingDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_FillingDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_FillingDriver", + sizeof(GEOMImpl_FillingDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_FillingDriver) Handle(GEOMImpl_FillingDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_FillingDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_FillingDriver))) { + _anOtherObject = Handle(GEOMImpl_FillingDriver)((Handle(GEOMImpl_FillingDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_FillingDriver.hxx b/src/GEOMImpl/GEOMImpl_FillingDriver.hxx new file mode 100644 index 000000000..a4d46e283 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_FillingDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_FillingDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_FillingDriver_HeaderFile +#define _GEOMImpl_FillingDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_FillingDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_FillingDriver); + +class Handle(GEOMImpl_FillingDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_FillingDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_FillingDriver)(const Handle(GEOMImpl_FillingDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_FillingDriver)(const GEOMImpl_FillingDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_FillingDriver)& operator=(const Handle(GEOMImpl_FillingDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_FillingDriver)& operator=(const GEOMImpl_FillingDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_FillingDriver* operator->() + { + return (GEOMImpl_FillingDriver *)ControlAccess(); + } + + GEOMImpl_FillingDriver* operator->() const + { + return (GEOMImpl_FillingDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_FillingDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_FillingDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_FillingDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_FillingDriver(); +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_FillingDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_FillingDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_FillingDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_FillingDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Gen.cxx b/src/GEOMImpl/GEOMImpl_Gen.cxx new file mode 100644 index 000000000..74ebd75c3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Gen.cxx @@ -0,0 +1,375 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//============================================================================= +/*! + * default constructor: + */ +//============================================================================= + +GEOMImpl_Gen::GEOMImpl_Gen() +{ + MESSAGE("GEOMImpl_Gen::GEOMImpl_Gen"); + _mapOfBasicOperations.clear(); + + // Basic elements + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PointDriver::GetID(), new GEOMImpl_PointDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_VectorDriver::GetID(), new GEOMImpl_VectorDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_LineDriver::GetID(), new GEOMImpl_LineDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PlaneDriver::GetID(), new GEOMImpl_PlaneDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_MarkerDriver::GetID(), new GEOMImpl_MarkerDriver()); + + // Curves + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ArcDriver::GetID(), new GEOMImpl_ArcDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_CircleDriver::GetID(), new GEOMImpl_CircleDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_EllipseDriver::GetID(), new GEOMImpl_EllipseDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PolylineDriver::GetID(), new GEOMImpl_PolylineDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SplineDriver::GetID(), new GEOMImpl_SplineDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SketcherDriver::GetID(), new GEOMImpl_SketcherDriver()); + + // 3D Primitives + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_BoxDriver::GetID(), new GEOMImpl_BoxDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ConeDriver::GetID(), new GEOMImpl_ConeDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_CylinderDriver::GetID(), new GEOMImpl_CylinderDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PrismDriver::GetID(), new GEOMImpl_PrismDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PipeDriver::GetID(), new GEOMImpl_PipeDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_RevolutionDriver::GetID(), new GEOMImpl_RevolutionDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SphereDriver::GetID(), new GEOMImpl_SphereDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_TorusDriver::GetID(), new GEOMImpl_TorusDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_FillingDriver::GetID(), new GEOMImpl_FillingDriver()); + + // Shapes Operations + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ShapeDriver::GetID(), new GEOMImpl_ShapeDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_GlueDriver::GetID(), new GEOMImpl_GlueDriver()); + + // Blocks Operations + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_BlockDriver::GetID(), new GEOMImpl_BlockDriver()); + + // Boolean Operations, Partition + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_BooleanDriver::GetID(), new GEOMImpl_BooleanDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PartitionDriver::GetID(), new GEOMImpl_PartitionDriver()); + + // Local Operations + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ChamferDriver::GetID(), new GEOMImpl_ChamferDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_FilletDriver::GetID(), new GEOMImpl_FilletDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ArchimedeDriver::GetID(), new GEOMImpl_ArchimedeDriver()); + + // Geometrical Transformations, Offset, Scale + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_TranslateDriver::GetID(), new GEOMImpl_TranslateDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_RotateDriver::GetID(), new GEOMImpl_RotateDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_MirrorDriver::GetID(), new GEOMImpl_MirrorDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_OffsetDriver::GetID(), new GEOMImpl_OffsetDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ScaleDriver::GetID(), new GEOMImpl_ScaleDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PositionDriver::GetID(), new GEOMImpl_PositionDriver()); + + // Insert Operations (Copy, Import/Export) + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_CopyDriver::GetID(), new GEOMImpl_CopyDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ImportDriver::GetID(), new GEOMImpl_ImportDriver()); + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ExportDriver::GetID(), new GEOMImpl_ExportDriver()); + + // Shape Healing + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_HealingDriver::GetID(), new GEOMImpl_HealingDriver()); + + // Measurements + TFunction_DriverTable::Get()->AddDriver(GEOMImpl_MeasureDriver::GetID(), new GEOMImpl_MeasureDriver()); + + SetEngine(this); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +GEOMImpl_Gen::~GEOMImpl_Gen() +{ + MESSAGE("GEOMImpl_Gen::~GEOMImpl_Gen"); + + std::map::iterator aBasicIter = _mapOfBasicOperations.begin(); + for (; aBasicIter != _mapOfBasicOperations.end(); aBasicIter++) + delete (*aBasicIter).second; + + std::map::iterator aTransformIter = _mapOfTransformOperations.begin(); + for (; aTransformIter != _mapOfTransformOperations.end(); aTransformIter++) + delete (*aTransformIter).second; + + std::map::iterator a3DPrimIter = _mapOf3DPrimOperations.begin(); + for (; a3DPrimIter != _mapOf3DPrimOperations.end(); a3DPrimIter++) + delete (*a3DPrimIter).second; + + std::map::iterator aShapesIter = _mapOfShapesOperations.begin(); + for (; aShapesIter != _mapOfShapesOperations.end(); aShapesIter++) + delete (*aShapesIter).second; + + std::map::iterator aBlocksIter = _mapOfBlocksOperations.begin(); + for (; aBlocksIter != _mapOfBlocksOperations.end(); aBlocksIter++) + delete (*aBlocksIter).second; + + std::map::iterator aBooleanIter = _mapOfBooleanOperations.begin(); + for (; aBooleanIter != _mapOfBooleanOperations.end(); aBooleanIter++) + delete (*aBooleanIter).second; + + std::map::iterator aHealingIter = _mapOfHealingOperations.begin(); + for (; aHealingIter != _mapOfHealingOperations.end(); aHealingIter++) + delete (*aHealingIter).second; + + std::map::iterator aCurvesIter = _mapOfCurvesOperations.begin(); + for (; aCurvesIter != _mapOfCurvesOperations.end(); aCurvesIter++) + delete (*aCurvesIter).second; + + std::map::iterator aLocalIter = _mapOfLocalOperations.begin(); + for (; aLocalIter != _mapOfLocalOperations.end(); aLocalIter++) + delete (*aLocalIter).second; + + std::map::iterator aInsertIter = _mapOfInsertOperations.begin(); + for (; aInsertIter != _mapOfInsertOperations.end(); aInsertIter++) + delete (*aInsertIter).second; + + std::map::iterator aMeasureIter = _mapOfMeasureOperations.begin(); + for (; aMeasureIter != _mapOfMeasureOperations.end(); aMeasureIter++) + delete (*aMeasureIter).second; + + std::map::iterator aGroupIter = _mapOfGroupOperations.begin(); + for (; aGroupIter != _mapOfGroupOperations.end(); aGroupIter++) + delete (*aGroupIter).second; +} + +//============================================================================= +/*! + * GetIBasicOperations + */ +//============================================================================= +GEOMImpl_IBasicOperations* GEOMImpl_Gen::GetIBasicOperations(int theDocID) +{ + if(_mapOfBasicOperations.find(theDocID) == _mapOfBasicOperations.end()) { + _mapOfBasicOperations[theDocID] = new GEOMImpl_IBasicOperations(this, theDocID); + } + + return _mapOfBasicOperations[theDocID]; +} + +//============================================================================= +/*! + * GetITransformOperations + */ +//============================================================================= +GEOMImpl_ITransformOperations* GEOMImpl_Gen::GetITransformOperations(int theDocID) +{ + if(_mapOfTransformOperations.find(theDocID) == _mapOfTransformOperations.end()) { + _mapOfTransformOperations[theDocID] = new GEOMImpl_ITransformOperations(this, theDocID); + } + + return _mapOfTransformOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIBooleanOperations + */ +//============================================================================= +GEOMImpl_IBooleanOperations* GEOMImpl_Gen::GetIBooleanOperations(int theDocID) +{ + if(_mapOfBooleanOperations.find(theDocID) == _mapOfBooleanOperations.end()) { + _mapOfBooleanOperations[theDocID] = new GEOMImpl_IBooleanOperations(this, theDocID); + } + + return _mapOfBooleanOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIHealingOperations + */ +//============================================================================= +GEOMImpl_IHealingOperations* GEOMImpl_Gen::GetIHealingOperations(int theDocID) +{ + if(_mapOfHealingOperations.find(theDocID) == _mapOfHealingOperations.end()) { + _mapOfHealingOperations[theDocID] = new GEOMImpl_IHealingOperations(this, theDocID); + } + + return _mapOfHealingOperations[theDocID]; +} + +//============================================================================= +/*! + * GetI3DPrimOperations + */ +//============================================================================= +GEOMImpl_I3DPrimOperations* GEOMImpl_Gen::GetI3DPrimOperations(int theDocID) +{ + if(_mapOf3DPrimOperations.find(theDocID) == _mapOf3DPrimOperations.end()) { + _mapOf3DPrimOperations[theDocID] = new GEOMImpl_I3DPrimOperations(this, theDocID); + } + + return _mapOf3DPrimOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIShapesOperations + */ +//============================================================================= +GEOMImpl_IShapesOperations* GEOMImpl_Gen::GetIShapesOperations(int theDocID) +{ + if(_mapOfShapesOperations.find(theDocID) == _mapOfShapesOperations.end()) { + _mapOfShapesOperations[theDocID] = new GEOMImpl_IShapesOperations(this, theDocID); + } + + return _mapOfShapesOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIBlocksOperations + */ +//============================================================================= +GEOMImpl_IBlocksOperations* GEOMImpl_Gen::GetIBlocksOperations(int theDocID) +{ + if(_mapOfBlocksOperations.find(theDocID) == _mapOfBlocksOperations.end()) { + _mapOfBlocksOperations[theDocID] = new GEOMImpl_IBlocksOperations(this, theDocID); + } + + return _mapOfBlocksOperations[theDocID]; +} + +//============================================================================= +/*! + * GetICurvesOperations + */ +//============================================================================= +GEOMImpl_ICurvesOperations* GEOMImpl_Gen::GetICurvesOperations(int theDocID) +{ + if(_mapOfCurvesOperations.find(theDocID) == _mapOfCurvesOperations.end()) { + _mapOfCurvesOperations[theDocID] = new GEOMImpl_ICurvesOperations(this, theDocID); + } + + return _mapOfCurvesOperations[theDocID]; +} + +//============================================================================= +/*! + * GetILocalOperations + */ +//============================================================================= +GEOMImpl_ILocalOperations* GEOMImpl_Gen::GetILocalOperations(int theDocID) +{ + if(_mapOfLocalOperations.find(theDocID) == _mapOfLocalOperations.end()) { + _mapOfLocalOperations[theDocID] = new GEOMImpl_ILocalOperations(this, theDocID); + } + + return _mapOfLocalOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIInsertOperations + */ +//============================================================================= +GEOMImpl_IInsertOperations* GEOMImpl_Gen::GetIInsertOperations(int theDocID) +{ + if(_mapOfInsertOperations.find(theDocID) == _mapOfInsertOperations.end()) { + _mapOfInsertOperations[theDocID] = new GEOMImpl_IInsertOperations(this, theDocID); + } + + return _mapOfInsertOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIMeasureOperations + */ +//============================================================================= +GEOMImpl_IMeasureOperations* GEOMImpl_Gen::GetIMeasureOperations(int theDocID) +{ + if(_mapOfMeasureOperations.find(theDocID) == _mapOfMeasureOperations.end()) { + _mapOfMeasureOperations[theDocID] = new GEOMImpl_IMeasureOperations(this, theDocID); + } + + return _mapOfMeasureOperations[theDocID]; +} + +//============================================================================= +/*! + * GetIGroupOperations + */ +//============================================================================= +GEOMImpl_IGroupOperations* GEOMImpl_Gen::GetIGroupOperations(int theDocID) +{ + if(_mapOfGroupOperations.find(theDocID) == _mapOfGroupOperations.end()) { + _mapOfGroupOperations[theDocID] = new GEOMImpl_IGroupOperations(this, theDocID); + } + + return _mapOfGroupOperations[theDocID]; +} diff --git a/src/GEOMImpl/GEOMImpl_Gen.hxx b/src/GEOMImpl/GEOMImpl_Gen.hxx new file mode 100644 index 000000000..5a303d8b3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Gen.hxx @@ -0,0 +1,92 @@ +// 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/ +// + +#ifndef _GEOMImpl_GEN_HXX_ +#define _GEOMImpl_GEN_HXX_ + +#include + +#include "GEOMImpl_IBasicOperations.hxx" +#include "GEOMImpl_ITransformOperations.hxx" +#include "GEOMImpl_I3DPrimOperations.hxx" +#include "GEOMImpl_IShapesOperations.hxx" +#include "GEOMImpl_IBlocksOperations.hxx" +#include "GEOMImpl_IBooleanOperations.hxx" +#include "GEOMImpl_IHealingOperations.hxx" +#include "GEOMImpl_ICurvesOperations.hxx" +#include "GEOMImpl_ILocalOperations.hxx" +#include "GEOMImpl_IInsertOperations.hxx" +#include "GEOMImpl_IMeasureOperations.hxx" +#include "GEOMImpl_IGroupOperations.hxx" +#include "GEOM_Engine.hxx" + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +class SALOME_WNT_EXPORT GEOMImpl_Gen : public GEOM_Engine +{ + public: + GEOMImpl_Gen(); + ~GEOMImpl_Gen(); + + GEOMImpl_IBasicOperations* GetIBasicOperations(int theDocID); + + GEOMImpl_ITransformOperations* GetITransformOperations(int theDocID); + + GEOMImpl_I3DPrimOperations* GetI3DPrimOperations(int theDocID); + + GEOMImpl_IShapesOperations* GetIShapesOperations(int theDocID); + + GEOMImpl_IBlocksOperations* GetIBlocksOperations(int theDocID); + + GEOMImpl_IMeasureOperations* GetIMeasureOperations(int theDocID); + + GEOMImpl_IBooleanOperations* GetIBooleanOperations(int theDocID); + + GEOMImpl_ICurvesOperations* GetICurvesOperations(int theDocID); + + GEOMImpl_ILocalOperations* GetILocalOperations(int theDocID); + + GEOMImpl_IInsertOperations* GetIInsertOperations(int theDocID); + + GEOMImpl_IHealingOperations* GetIHealingOperations(int theDocID); + + GEOMImpl_IGroupOperations* GetIGroupOperations(int theDocID); + + private: + + std::map _mapOfBasicOperations; + std::map _mapOfTransformOperations; + std::map _mapOf3DPrimOperations; + std::map _mapOfShapesOperations; + std::map _mapOfBlocksOperations; + std::map _mapOfBooleanOperations; + std::map _mapOfHealingOperations; + std::map _mapOfCurvesOperations; + std::map _mapOfLocalOperations; + std::map _mapOfInsertOperations; + std::map _mapOfMeasureOperations; + std::map _mapOfGroupOperations; +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.cxx b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx new file mode 100644 index 000000000..d8697f8bc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.cxx @@ -0,0 +1,332 @@ +// 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/ +// + +#include + +#include +#include +#include + +#include +#include + +#include + +#include "utilities.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#define MSG_BAD_TOLERANCE "Tolerance is too big" +#define MSG_BAD_ARG_SHAPE "Argument shape is not a compound of hexahedral solids" + +//======================================================================= +//function : GEOMImpl_GlueDriver +//purpose : +//======================================================================= +GEOMImpl_GlueDriver::GEOMImpl_GlueDriver() +{ +} + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_GlueDriver::GetID() +{ + static Standard_GUID aGlueDriver("FF1BBB63-5D14-4df2-980B-3A668264EA16"); + return aGlueDriver; +} + +//======================================================================= +//function : GlueFacesWithWarnings +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_GlueDriver::GlueFacesWithWarnings (const TopoDS_Shape& theShape, + const Standard_Real theTolerance, + TCollection_AsciiString& theWarning) const +{ + Standard_Integer iErr, iWrn; + TopoDS_Shape aRes; + GEOMAlgo_Gluer aGluer; + + aGluer.SetShape(theShape); + aGluer.SetTolerance(theTolerance); + aGluer.SetCheckGeometry(Standard_True); + + aGluer.Perform(); + + iErr = aGluer.ErrorStatus(); + if (iErr) { + switch (iErr) { + case 2: + Standard_Failure::Raise("No vertices found in source shape"); + break; + case 3: + case 4: + Standard_Failure::Raise(MSG_BAD_TOLERANCE " or " MSG_BAD_ARG_SHAPE); + break; + case 5: + Standard_Failure::Raise("Source shape is Null"); + break; + case 6: + Standard_Failure::Raise("Result shape is Null"); + break; + case 100: + Standard_Failure::Raise(MSG_BAD_TOLERANCE); + break; + case 101: + case 102: + Standard_Failure::Raise(MSG_BAD_ARG_SHAPE); + break; + case 200: + Standard_Failure::Raise("Error occured during check of geometric coincidence"); + break; + default: + { + // description of all errors see in GEOMAlgo_Gluer.cxx + TCollection_AsciiString aMsg ("Error in GEOMAlgo_Gluer with code "); + aMsg += TCollection_AsciiString(iErr); + Standard_Failure::Raise(aMsg.ToCString()); + break; + } + } + return aRes; + } + + iWrn = aGluer.WarningStatus(); + if (iWrn) { + switch (iWrn) { + case 1: + { + Standard_Integer nbAlone = aGluer.AloneShapes(); + theWarning = TCollection_AsciiString(nbAlone); + theWarning += " solid(s) can not be glued by faces"; + } + break; + default: + // description of all warnings see in GEOMAlgo_Gluer.cxx + theWarning = "Warning in GEOMAlgo_Gluer with code "; + theWarning += TCollection_AsciiString(iWrn); + break; + } + } + + aRes = aGluer.Result(); + + // Fill history to be used by GetInPlace functionality + TopTools_IndexedMapOfShape aResIndices; + TopExp::MapShapes(aRes, aResIndices); + + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + // history for all argument shapes + TDF_LabelSequence aLabelSeq; + aFunction->GetDependency(aLabelSeq); + Standard_Integer nbArg = aLabelSeq.Length(); + + for (Standard_Integer iarg = 1; iarg <= nbArg; iarg++) { + + TDF_Label anArgumentRefLabel = aLabelSeq.Value(iarg); + + Handle(GEOM_Object) anArgumentObject = GEOM_Object::GetReferencedObject(anArgumentRefLabel); + TopoDS_Shape anArgumentShape = anArgumentObject->GetValue(); + + TopTools_IndexedMapOfShape anArgumentIndices; + TopExp::MapShapes(anArgumentShape, anArgumentIndices); + Standard_Integer nbArgumentEntities = anArgumentIndices.Extent(); + + // Find corresponding label in history + TDF_Label anArgumentHistoryLabel = + aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True); + + for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) { + TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie); + const TopTools_ListOfShape& aModified = aGluer.Modified(anEntity); + Standard_Integer nbModified = aModified.Extent(); + + if (nbModified > 0) { + TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(ie, Standard_True); + Handle(TDataStd_IntegerArray) anAttr = + TDataStd_IntegerArray::Set(aWhatHistoryLabel, 1, nbModified); + + TopTools_ListIteratorOfListOfShape itM (aModified); + for (int im = 1; itM.More(); itM.Next(), ++im) { + int id = aResIndices.FindIndex(itM.Value()); + anAttr->SetValue(im, id); + } + } + } + } + + return aRes; +} + +//======================================================================= +//function : GlueFaces +//purpose : +//======================================================================= +TopoDS_Shape GEOMImpl_GlueDriver::GlueFaces (const TopoDS_Shape& theShape, + const Standard_Real theTolerance) +{ + Standard_Integer iErr, iWrn; + TopoDS_Shape aRes; + GEOMAlgo_Gluer aGluer; + + aGluer.SetShape(theShape); + aGluer.SetTolerance(theTolerance); + aGluer.SetCheckGeometry(Standard_True); + + aGluer.Perform(); + + iErr = aGluer.ErrorStatus(); + if (iErr) { + switch (iErr) { + case 2: + Standard_Failure::Raise("No vertices found in source shape"); + break; + case 5: + Standard_Failure::Raise("Source shape is Null"); + break; + case 6: + Standard_Failure::Raise("Result shape is Null"); + break; + case 200: + Standard_Failure::Raise("Error occured during check of geometric coincidence"); + break; + default: + { + // description of all errors see in GEOMAlgo_Gluer.cxx + TCollection_AsciiString aMsg ("Error in GEOMAlgo_Gluer with code "); + aMsg += TCollection_AsciiString(iErr); + Standard_Failure::Raise(aMsg.ToCString()); + break; + } + } + return aRes; + } + + iWrn = aGluer.WarningStatus(); + if (iWrn) { + switch (iWrn) { + case 1: + MESSAGE("Some shapes can not be glued by faces"); + break; + default: + // description of all warnings see in GEOMAlgo_Gluer.cxx + MESSAGE("Warning in GEOMAlgo_Gluer with code " << iWrn); + break; + } + } + + aRes = aGluer.Result(); + + return aRes; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_GlueDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IGlue aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + 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"); + } + + Standard_Real tol3d = aCI.GetTolerance(); + aShape = GlueFacesWithWarnings(aShapeBase, tol3d, aWrn); + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + if (!aWrn.IsEmpty()) { + Standard_Failure::Raise(aWrn.ToCString()); + } + + return 1; +} + +//======================================================================= +//function : GEOMImpl_GlueDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_GlueDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_GlueDriver", + sizeof(GEOMImpl_GlueDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_GlueDriver) Handle(GEOMImpl_GlueDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_GlueDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_GlueDriver))) { + _anOtherObject = Handle(GEOMImpl_GlueDriver)((Handle(GEOMImpl_GlueDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_GlueDriver.hxx b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx new file mode 100644 index 000000000..aaf8fae49 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_GlueDriver.hxx @@ -0,0 +1,166 @@ +// 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/ +// +// File : GEOMImpl_GlueDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_GlueDriver_HeaderFile +#define _GEOMImpl_GlueDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_GlueDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_GlueDriver); + +class Handle(GEOMImpl_GlueDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_GlueDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_GlueDriver)(const Handle(GEOMImpl_GlueDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_GlueDriver)(const GEOMImpl_GlueDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_GlueDriver)& operator=(const Handle(GEOMImpl_GlueDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_GlueDriver)& operator=(const GEOMImpl_GlueDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_GlueDriver* operator->() + { + return (GEOMImpl_GlueDriver *)ControlAccess(); + } + + GEOMImpl_GlueDriver* operator->() const + { + return (GEOMImpl_GlueDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_GlueDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_GlueDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif +#include +#include + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_GlueDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_GlueDriver(); +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_GlueDriver() {}; + +Standard_EXPORT static TopoDS_Shape GlueFaces (const TopoDS_Shape& theShape, + const Standard_Real theTolerance); + +Standard_EXPORT TopoDS_Shape GlueFacesWithWarnings (const TopoDS_Shape& theShape, + const Standard_Real theTolerance, + TCollection_AsciiString& theWarning) const; + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_GlueDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_GlueDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_GlueDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx new file mode 100644 index 000000000..251a0a6c8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -0,0 +1,425 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +//======================================================================= +//function : raiseNotDoneExeption +//purpose : global function: forms error message and raises exeption +//======================================================================= +void raiseNotDoneExeption( const int theErrorStatus ) +{ + switch ( theErrorStatus ) + { + case ShHealOper_NotError: StdFail_NotDone::Raise( "ShHealOper_NotError_msg" ); + case ShHealOper_InvalidParameters: StdFail_NotDone::Raise( "ShHealOper_InvalidParameters_msg" ); + case ShHealOper_ErrorExecution: + default: StdFail_NotDone::Raise( "ShHealOper_ErrorExecution_msg" ); + } +} + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_HealingDriver::GetID() +{ + static Standard_GUID aHealingDriver("FF1BBB61-5D14-4df2-980B-3A668264EA16"); + return aHealingDriver; +} + + +//======================================================================= +//function : GEOMImpl_HealingDriver +//purpose : +//======================================================================= + +GEOMImpl_HealingDriver::GEOMImpl_HealingDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + if (aFunction.IsNull()) return 0; + + GEOMImpl_IHealing HI (aFunction); + Standard_Integer aType = aFunction->GetType(); + Handle(GEOM_Function) anOriginalFunction = HI.GetOriginal(); + if (anOriginalFunction.IsNull()) return 0; + TopoDS_Shape aShape, anOriginalShape = anOriginalFunction->GetValue(); + if (anOriginalShape.IsNull()) return 0; + + switch (aType) + { + case SHAPE_PROCESS: + ShapeProcess(&HI, anOriginalShape, aShape); + break; + case SUPPRESS_FACES: + SuppressFaces(&HI, anOriginalShape, aShape); + break; + case CLOSE_CONTOUR: + CloseContour(&HI, anOriginalShape, aShape); + break; + case REMOVE_INT_WIRES: + RemoveIntWires(&HI, anOriginalShape, aShape); + break; + case FILL_HOLES: + RemoveHoles(&HI, anOriginalShape, aShape); + break; + case SEWING: + Sew(&HI, anOriginalShape, aShape); + break; + case DIVIDE_EDGE: + AddPointOnEdge(&HI, anOriginalShape, aShape); + break; + default: + return 0; + } + + if (aShape.IsNull()) + raiseNotDoneExeption( ShHealOper_ErrorExecution ); + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + return 1; +} + +//======================================================================= +//function : ShapeProcess +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::ShapeProcess (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Handle(TColStd_HArray1OfExtendedString) anOperators = theHI->GetOperators(); + Handle(TColStd_HArray1OfExtendedString) aParams = theHI->GetParameters(); + Handle(TColStd_HArray1OfExtendedString) aValues = theHI->GetValues(); + + if (anOperators.IsNull() || anOperators->Length() <= 0) + return Standard_False; + + Standard_Integer nbParams = 0, nbValues = 0; + if (!aParams.IsNull()) { + nbParams = aParams->Length(); + } + if (!aValues.IsNull()) { + nbValues = aValues->Length(); + } + if (nbParams != nbValues) + return Standard_False; + + ShHealOper_ShapeProcess aHealer; + TColStd_SequenceOfAsciiString anOperatorsAS, aParamsAS, aValuesAS; + int i; + for (i = 1; i <= anOperators->Length(); i++) + anOperatorsAS.Append(TCollection_AsciiString(anOperators->Value(i))); + + aHealer.SetOperators(anOperatorsAS); + + for (i = 1; i <= nbParams; i++) { + aHealer.SetParameter(TCollection_AsciiString(aParams->Value(i)), + TCollection_AsciiString(aValues->Value(i))); + } + + aHealer.Perform(theOriginalShape, theOutShape); + + if (!aHealer.isDone()) + raiseNotDoneExeption( ShHealOper_NotError ); + + return Standard_True; +} + +//======================================================================= +//function : SupressFaces +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::SuppressFaces (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Handle(TColStd_HArray1OfInteger) aFaces = theHI->GetFaces(); + + ShHealOper_RemoveFace aHealer (theOriginalShape); + + Standard_Boolean aResult = Standard_False; + if (aFaces.IsNull()) // remove all faces + { + aResult = aHealer.Perform(); + } else { + TopTools_SequenceOfShape aShapesFaces; + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes(theOriginalShape, aShapes); + for (int i = 1; i <= aFaces->Length(); i++) { + int indexOfFace = aFaces->Value(i); + TopoDS_Shape aFace = aShapes.FindKey(indexOfFace); + aShapesFaces.Append(aFace); + } + + aResult = aHealer.Perform(aShapesFaces); + } + + if ( aResult ) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + +//======================================================================= +//function : CloseContour +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::CloseContour (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Standard_Boolean isByVertex = theHI->GetIsCommonVertex(); + Handle(TColStd_HArray1OfInteger) aWires = theHI->GetWires(); + + ShHealOper_CloseContour aHealer (theOriginalShape); + + Standard_Boolean aResult = Standard_False; + if ( aWires.IsNull() ) { + if ( theOriginalShape.ShapeType() == TopAbs_WIRE ) + aResult = aHealer.Perform(TopoDS::Wire(theOriginalShape), isByVertex, !isByVertex); + } + else { + TopTools_SequenceOfShape aShapesWires; + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes(theOriginalShape, aShapes); + for (int i = 1; i <= aWires->Length(); i++) { + int indexOfWire = aWires->Value(i); + TopoDS_Shape aWire = aShapes.FindKey(indexOfWire); + aShapesWires.Append(aWire); + } + + aResult = aHealer.Perform( aShapesWires, isByVertex, !isByVertex ); + } + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + +//======================================================================= +//function : RemoveIntWires +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::RemoveIntWires (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Handle(TColStd_HArray1OfInteger) aWires = theHI->GetWires(); + + ShHealOper_RemoveInternalWires aHealer(theOriginalShape); + + Standard_Boolean aResult = Standard_False; + if (aWires.IsNull()) { // remove all faces + aResult = aHealer.Remove(); + } else { + TopTools_SequenceOfShape aShapesWires; + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes(theOriginalShape, aShapes); + for (int i = 1; i <= aWires->Length(); i++) { + int indexOfWire = aWires->Value(i); + TopoDS_Shape aWire = aShapes.FindKey(indexOfWire); + aShapesWires.Append(aWire); + } + + aResult = aHealer.Remove(aShapesWires); + } + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + +//======================================================================= +//function : RemoveHoles +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::RemoveHoles (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Handle(TColStd_HArray1OfInteger) aWires = theHI->GetWires(); + + ShHealOper_FillHoles aHealer (theOriginalShape); + + Standard_Boolean aResult = Standard_False; + if (aWires.IsNull()) { // remove all faces + aResult = aHealer.Fill(); + } else { + TopTools_SequenceOfShape aShapesWires; + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes(theOriginalShape, aShapes); + for (int i = 1; i <= aWires->Length(); i++) { + int indexOfWire = aWires->Value(i); + TopoDS_Shape aWire = aShapes.FindKey(indexOfWire); + aShapesWires.Append(aWire); + } + + aResult = aHealer.Fill(aShapesWires); + } + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + +//======================================================================= +//function : Sew +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::Sew (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Standard_Real aTol = theHI->GetTolerance(); + + ShHealOper_Sewing aHealer (theOriginalShape, aTol); + + Standard_Boolean aResult = aHealer.Perform(); + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + +//======================================================================= +//function : AddPointOnEdge +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::AddPointOnEdge (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + Standard_Boolean isByParameter = theHI->GetIsByParameter(); + Standard_Integer anIndex = theHI->GetIndex(); + Standard_Real aValue = theHI->GetDevideEdgeValue(); + + ShHealOper_EdgeDivide aHealer (theOriginalShape); + + Standard_Boolean aResult = Standard_False; + if (anIndex == -1) { // apply algorythm for the whole shape which is EDGE + if (theOriginalShape.ShapeType() == TopAbs_EDGE) + aResult = aHealer.Perform(TopoDS::Edge(theOriginalShape), aValue, isByParameter); + } else { + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes(theOriginalShape, aShapes); + TopoDS_Shape aEdgeShape = aShapes.FindKey(anIndex); + if (aEdgeShape.ShapeType() == TopAbs_EDGE) + aResult = aHealer.Perform(TopoDS::Edge(aEdgeShape), aValue, isByParameter); + } + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + + +//======================================================================= +//function : GEOMImpl_HealingDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_HealingDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_HealingDriver", + sizeof(GEOMImpl_HealingDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_HealingDriver) Handle(GEOMImpl_HealingDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_HealingDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_HealingDriver))) { + _anOtherObject = Handle(GEOMImpl_HealingDriver)((Handle(GEOMImpl_HealingDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx new file mode 100644 index 000000000..eccf0acdc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx @@ -0,0 +1,171 @@ +// 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/ +// +// File : GEOMImpl_HealingDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_HealingDriver_HeaderFile +#define _GEOMImpl_HealingDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_HealingDriver; + +class GEOMImpl_IHealing; +#include + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_HealingDriver); + +class Handle(GEOMImpl_HealingDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_HealingDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_HealingDriver)(const Handle(GEOMImpl_HealingDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_HealingDriver)(const GEOMImpl_HealingDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_HealingDriver)& operator=(const Handle(GEOMImpl_HealingDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_HealingDriver)& operator=(const GEOMImpl_HealingDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_HealingDriver* operator->() + { + return (GEOMImpl_HealingDriver *)ControlAccess(); + } + + GEOMImpl_HealingDriver* operator->() const + { + return (GEOMImpl_HealingDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_HealingDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_HealingDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_HealingDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_HealingDriver(); +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_HealingDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_HealingDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_HealingDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_HealingDriver) == AType || TFunction_Driver::IsKind(AType)); } + +private: +Standard_Boolean ShapeProcess ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean SuppressFaces ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean CloseContour ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean RemoveIntWires( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; +Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; + + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx new file mode 100644 index 000000000..266e4de26 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -0,0 +1,935 @@ +// 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/ +// +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_I3DPrimOperations::GEOMImpl_I3DPrimOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations() +{ + MESSAGE("GEOMImpl_I3DPrimOperations::~GEOMImpl_I3DPrimOperations"); +} + + +//============================================================================= +/*! + * MakeBoxDXDYDZ + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxDXDYDZ (double theDX, double theDY, double theDZ) +{ + SetErrorCode(KO); + + //Add a new Box object + Handle(GEOM_Object) aBox = GetEngine()->AddObject(GetDocID(), GEOM_BOX); + + //Add a new Box function with DX_DY_DZ parameters + Handle(GEOM_Function) aFunction = aBox->AddFunction(GEOMImpl_BoxDriver::GetID(), BOX_DX_DY_DZ); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BoxDriver::GetID()) return NULL; + + GEOMImpl_IBox aBI (aFunction); + + aBI.SetDX(theDX); + aBI.SetDY(theDY); + aBI.SetDZ(theDZ); + + //Compute the box value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Box 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) << aBox << " = geompy.MakeBoxDXDYDZ(" + << theDX << ", " << theDY << ", " << theDZ << ")"; + + SetErrorCode(OK); + return aBox; +} + + +//============================================================================= +/*! + * MakeBoxTwoPnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeBoxTwoPnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL; + + //Add a new Box object + Handle(GEOM_Object) aBox = GetEngine()->AddObject(GetDocID(), GEOM_BOX); + + //Add a new Box function for creation a box relatively to two points + Handle(GEOM_Function) aFunction = aBox->AddFunction(GEOMImpl_BoxDriver::GetID(), BOX_TWO_PNT); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BoxDriver::GetID()) return aBox; + + GEOMImpl_IBox aBI (aFunction); + + Handle(GEOM_Function) aRefFunction1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRefFunction2 = thePnt2->GetLastFunction(); + + if (aRefFunction1.IsNull() || aRefFunction2.IsNull()) return aBox; + + aBI.SetRef1(aRefFunction1); + aBI.SetRef2(aRefFunction2); + + //Compute the Box value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Box 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) << aBox << " = geompy.MakeBoxTwoPnt(" + << thePnt1 << ", " << thePnt2 << ")"; + + SetErrorCode(OK); + return aBox; +} + + +//============================================================================= +/*! + * MakeCylinderRH + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderRH (double theR, double theH) +{ + SetErrorCode(KO); + + //Add a new Cylinder object + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GetDocID(), GEOM_CYLINDER); + + //Add a new Cylinder function with R and H parameters + Handle(GEOM_Function) aFunction = aCylinder->AddFunction(GEOMImpl_CylinderDriver::GetID(), CYLINDER_R_H); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CylinderDriver::GetID()) return NULL; + + GEOMImpl_ICylinder aCI (aFunction); + + aCI.SetR(theR); + aCI.SetH(theH); + + //Compute the Cylinder value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cylinder 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) << aCylinder + << " = geompy.MakeCylinderRH(" << theR << ", " << theH << ")"; + + SetErrorCode(OK); + return aCylinder; +} + + +//============================================================================= +/*! + * MakeCylinderPntVecRH + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeCylinderPntVecRH (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theR, double theH) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Cylinder object + Handle(GEOM_Object) aCylinder = GetEngine()->AddObject(GetDocID(), GEOM_CYLINDER); + + //Add a new Cylinder function for creation a cylinder relatively to point and vector + Handle(GEOM_Function) aFunction = + aCylinder->AddFunction(GEOMImpl_CylinderDriver::GetID(), CYLINDER_PNT_VEC_R_H); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CylinderDriver::GetID()) return NULL; + + GEOMImpl_ICylinder aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetPoint(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetR(theR); + aCI.SetH(theH); + + //Compute the Cylinder value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cylinder 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) << aCylinder << " = geompy.MakeCylinder(" + << thePnt << ", " << theVec << ", " << theR << ", " << theH << ")"; + + SetErrorCode(OK); + return aCylinder; +} + + +//============================================================================= +/*! + * MakeConeR1R2H + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConeR1R2H (double theR1, double theR2, + double theH) +{ + SetErrorCode(KO); + + //Add a new Cone object + Handle(GEOM_Object) aCone = GetEngine()->AddObject(GetDocID(), GEOM_CONE); + + //Add a new Cone function with R and H parameters + Handle(GEOM_Function) aFunction = + aCone->AddFunction(GEOMImpl_ConeDriver::GetID(), CONE_R1_R2_H); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ConeDriver::GetID()) return NULL; + + GEOMImpl_ICone aCI (aFunction); + + aCI.SetR1(theR1); + aCI.SetR2(theR2); + aCI.SetH(theH); + + //Compute the Cone value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cone 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) << aCone << " = geompy.MakeConeR1R2H(" + << theR1 << ", " << theR2 << ", " << theH << ")"; + + SetErrorCode(OK); + return aCone; +} + + +//============================================================================= +/*! + * MakeConePntVecR1R2H + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeConePntVecR1R2H (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theR1, double theR2, + double theH) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Cone object + Handle(GEOM_Object) aCone = GetEngine()->AddObject(GetDocID(), GEOM_CONE); + + //Add a new Cone function for creation a cone relatively to point and vector + Handle(GEOM_Function) aFunction = + aCone->AddFunction(GEOMImpl_ConeDriver::GetID(), CONE_PNT_VEC_R1_R2_H); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ConeDriver::GetID()) return NULL; + + GEOMImpl_ICone aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetPoint(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetR1(theR1); + aCI.SetR2(theR2); + aCI.SetH(theH); + + //Compute the Cone value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Cone 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) << aCone << " = geompy.MakeCone(" << thePnt + << ", " << theVec << ", " << theR1 << ", " << theR2 << ", " << theH << ")"; + + SetErrorCode(OK); + return aCone; +} + + +//============================================================================= +/*! + * MakeSphereR + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSphereR (double theR) +{ + SetErrorCode(KO); + + //Add a new Sphere object + Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GetDocID(), GEOM_SPHERE); + + //Add a new Sphere function with R parameter + Handle(GEOM_Function) aFunction = aSphere->AddFunction(GEOMImpl_SphereDriver::GetID(), SPHERE_R); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SphereDriver::GetID()) return NULL; + + GEOMImpl_ISphere aCI (aFunction); + + aCI.SetR(theR); + + //Compute the Sphere value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Sphere 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) << aSphere << " = geompy.MakeSphereR(" << theR << ")"; + + SetErrorCode(OK); + return aSphere; +} + + +//============================================================================= +/*! + * MakeSpherePntR + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSpherePntR (Handle(GEOM_Object) thePnt, + double theR) +{ + SetErrorCode(KO); + + if (thePnt.IsNull()) return NULL; + + //Add a new Point object + Handle(GEOM_Object) aSphere = GetEngine()->AddObject(GetDocID(), GEOM_SPHERE); + + //Add a new Sphere function for creation a sphere relatively to point + Handle(GEOM_Function) aFunction = aSphere->AddFunction(GEOMImpl_SphereDriver::GetID(), SPHERE_PNT_R); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SphereDriver::GetID()) return NULL; + + GEOMImpl_ISphere aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + + if (aRefPnt.IsNull()) return NULL; + + aCI.SetPoint(aRefPnt); + aCI.SetR(theR); + + //Compute the Sphere value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Sphere 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) << aSphere + << " = geompy.MakeSpherePntR(" << thePnt << ", " << theR << ")"; + + SetErrorCode(OK); + return aSphere; +} + + +//============================================================================= +/*! + * MakeTorusRR + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusRR + (double theRMajor, double theRMinor) +{ + SetErrorCode(KO); + + //Add a new Torus object + Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_TORUS); + + //Add a new Torus function + Handle(GEOM_Function) aFunction = + anEll->AddFunction(GEOMImpl_TorusDriver::GetID(), TORUS_RR); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TorusDriver::GetID()) return NULL; + + GEOMImpl_ITorus aCI (aFunction); + + aCI.SetRMajor(theRMajor); + aCI.SetRMinor(theRMinor); + + //Compute the Torus value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Torus 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) << anEll << " = geompy.MakeTorusRR(" + << theRMajor << ", " << theRMinor << ")"; + + SetErrorCode(OK); + return anEll; +} + +//============================================================================= +/*! + * MakeTorusPntVecRR + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeTorusPntVecRR + (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, + double theRMajor, double theRMinor) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Torus object + Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_TORUS); + + //Add a new Torus function + Handle(GEOM_Function) aFunction = + anEll->AddFunction(GEOMImpl_TorusDriver::GetID(), TORUS_PNT_VEC_RR); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TorusDriver::GetID()) return NULL; + + GEOMImpl_ITorus aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetCenter(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetRMajor(theRMajor); + aCI.SetRMinor(theRMinor); + + //Compute the Torus value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Torus 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) << anEll << " = geompy.MakeTorus(" << thePnt + << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")"; + + SetErrorCode(OK); + return anEll; +} + + +//============================================================================= +/*! + * MakePrismVecH + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismVecH (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) theVec, + double theH) +{ + SetErrorCode(KO); + + if (theBase.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Prism object + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + + //Add a new Prism function for creation a Prism relatively to vector + Handle(GEOM_Function) aFunction = + aPrism->AddFunction(GEOMImpl_PrismDriver::GetID(), PRISM_BASE_VEC_H); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PrismDriver::GetID()) return NULL; + + GEOMImpl_IPrism aCI (aFunction); + + Handle(GEOM_Function) aRefBase = theBase->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefBase.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetBase(aRefBase); + aCI.SetVector(aRefVec); + aCI.SetH(theH); + + //Compute the Prism value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Prism 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) << aPrism << " = geompy.MakePrismVecH(" + << theBase << ", " << theVec << ", " << theH << ")"; + + SetErrorCode(OK); + return aPrism; +} + +//============================================================================= +/*! + * MakePrismTwoPnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePrismTwoPnt + (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2) +{ + SetErrorCode(KO); + + if (theBase.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; + + //Add a new Prism object + Handle(GEOM_Object) aPrism = GetEngine()->AddObject(GetDocID(), GEOM_PRISM); + + //Add a new Prism function for creation a Prism relatively to two points + Handle(GEOM_Function) aFunction = + aPrism->AddFunction(GEOMImpl_PrismDriver::GetID(), PRISM_BASE_TWO_PNT); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PrismDriver::GetID()) return NULL; + + GEOMImpl_IPrism aCI (aFunction); + + Handle(GEOM_Function) aRefBase = theBase->GetLastFunction(); + Handle(GEOM_Function) aRefPnt1 = thePoint1->GetLastFunction(); + Handle(GEOM_Function) aRefPnt2 = thePoint2->GetLastFunction(); + + if (aRefBase.IsNull() || aRefPnt1.IsNull() || aRefPnt2.IsNull()) return NULL; + + aCI.SetBase(aRefBase); + aCI.SetFirstPoint(aRefPnt1); + aCI.SetLastPoint(aRefPnt2); + + //Compute the Prism value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Prism 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) << aPrism << " = geompy.MakePrism(" + << theBase << ", " << thePoint1 << ", " << thePoint2 << ")"; + + SetErrorCode(OK); + return aPrism; +} + + +//============================================================================= +/*! + * MakePipe + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipe (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePath) +{ + SetErrorCode(KO); + + if (theBase.IsNull() || thePath.IsNull()) return NULL; + + //Add a new Pipe object + Handle(GEOM_Object) aPipe = GetEngine()->AddObject(GetDocID(), GEOM_PIPE); + + //Add a new Pipe function + Handle(GEOM_Function) aFunction = + aPipe->AddFunction(GEOMImpl_PipeDriver::GetID(), PIPE_BASE_PATH); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PipeDriver::GetID()) return NULL; + + GEOMImpl_IPipe aCI (aFunction); + + Handle(GEOM_Function) aRefBase = theBase->GetLastFunction(); + Handle(GEOM_Function) aRefPath = thePath->GetLastFunction(); + + if (aRefBase.IsNull() || aRefPath.IsNull()) return NULL; + + aCI.SetBase(aRefBase); + aCI.SetPath(aRefPath); + + //Compute the Pipe value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Pipe 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) << aPipe << " = geompy.MakePipe(" + << theBase << ", " << thePath << ")"; + + SetErrorCode(OK); + return aPipe; +} + + +//============================================================================= +/*! + * MakeRevolutionAxisAngle + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) theAxis, + double theAngle) +{ + SetErrorCode(KO); + + if (theBase.IsNull() || theAxis.IsNull()) return NULL; + + //Add a new Revolution object + Handle(GEOM_Object) aRevolution = GetEngine()->AddObject(GetDocID(), GEOM_REVOLUTION); + + //Add a new Revolution function for creation a revolution relatively to axis + Handle(GEOM_Function) aFunction = + aRevolution->AddFunction(GEOMImpl_RevolutionDriver::GetID(), REVOLUTION_BASE_AXIS_ANGLE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RevolutionDriver::GetID()) return NULL; + + GEOMImpl_IRevolution aCI (aFunction); + + Handle(GEOM_Function) aRefBase = theBase->GetLastFunction(); + Handle(GEOM_Function) aRefAxis = theAxis->GetLastFunction(); + + if (aRefBase.IsNull() || aRefAxis.IsNull()) return NULL; + + aCI.SetBase(aRefBase); + aCI.SetAxis(aRefAxis); + aCI.SetAngle(theAngle); + + //Compute the Revolution value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Revolution 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) << aRevolution << " = geompy.MakeRevolution(" + << theBase << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)"; + + SetErrorCode(OK); + return aRevolution; +} + + +//============================================================================= +/*! + * MakeSolidShell + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSolidShell (Handle(GEOM_Object) theShell) +{ + SetErrorCode(KO); + + if (theShell.IsNull()) return NULL; + + //Add a new Solid object + Handle(GEOM_Object) aSolid = GetEngine()->AddObject(GetDocID(), GEOM_SOLID); + + //Add a new Solid function for creation a solid from a shell + Handle(GEOM_Function) aFunction = + aSolid->AddFunction(GEOMImpl_ShapeDriver::GetID(), SOLID_SHELL); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(GEOM_Function) aRefShell = theShell->GetLastFunction(); + + if (aRefShell.IsNull()) return NULL; + + aCI.SetBase(aRefShell); + + //Compute the Solid value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Solid 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) << aSolid << " = geompy.MakeSolid(" << theShell << ")"; + + SetErrorCode(OK); + return aSolid; +} + +//============================================================================= +/*! + * MakeFilling + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeFilling + (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, + double theTol2D, double theTol3D, int theNbIter) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + //Add a new Filling object + Handle(GEOM_Object) aFilling = GetEngine()->AddObject(GetDocID(), GEOM_FILLING); + + //Add a new Filling function for creation a filling from a compound + Handle(GEOM_Function) aFunction = aFilling->AddFunction(GEOMImpl_FillingDriver::GetID(), BASIC_FILLING); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_FillingDriver::GetID()) return NULL; + + GEOMImpl_IFilling aFI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + + if (aRefShape.IsNull()) return NULL; + + aFI.SetShape(aRefShape); + aFI.SetMinDeg(theMinDeg); + aFI.SetMaxDeg(theMaxDeg); + aFI.SetTol2D(theTol2D); + aFI.SetTol3D(theTol3D); + aFI.SetNbIter(theNbIter); + + //Compute the Solid value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Filling driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + if (strcmp(aFail->GetMessageString(), "Geom_BSplineSurface") == 0) + SetErrorCode("B-Spline surface construction failed"); + else + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aFilling << " = geompy.MakeFilling(" + << theShape << ", " << theMinDeg << ", " << theMaxDeg << ", " + << theTol2D << ", " << theTol3D << ", " << theNbIter << ")"; + + SetErrorCode(OK); + return aFilling; +} diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx new file mode 100644 index 000000000..2e3a5177b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -0,0 +1,78 @@ +// 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/ +// + +#ifndef _GEOMImpl_I3DPrimOperations_HXX_ +#define _GEOMImpl_I3DPrimOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include + +class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_I3DPrimOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_I3DPrimOperations(); + + Standard_EXPORT Handle(GEOM_Object) MakeBoxDXDYDZ (double theDX, double theDY, double theDZ); + Standard_EXPORT Handle(GEOM_Object) MakeBoxTwoPnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2); + + Standard_EXPORT Handle(GEOM_Object) MakeCylinderRH (double theR, double theH); + Standard_EXPORT Handle(GEOM_Object) MakeCylinderPntVecRH (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theR, double theH); + + Standard_EXPORT Handle(GEOM_Object) MakeConeR1R2H (double theR1, double theR2, double theH); + Standard_EXPORT Handle(GEOM_Object) MakeConePntVecR1R2H (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theR1, double theR2, double theH); + + Standard_EXPORT Handle(GEOM_Object) MakeSphereR (double theR); + Standard_EXPORT Handle(GEOM_Object) MakeSpherePntR (Handle(GEOM_Object) thePnt, double theR); + + Standard_EXPORT Handle(GEOM_Object) MakeTorusRR (double theRMajor, double theRMinor); + + Standard_EXPORT Handle(GEOM_Object) MakeTorusPntVecRR (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theRMajor, double theRMinor); + + Standard_EXPORT Handle(GEOM_Object) MakePrismVecH (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) theVec, double theH); + + Standard_EXPORT Handle(GEOM_Object) MakePrismTwoPnt (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) MakePipe (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) thePath); + + Standard_EXPORT Handle(GEOM_Object) MakeRevolutionAxisAngle (Handle(GEOM_Object) theBase, + Handle(GEOM_Object) theAxis, + double theAngle); + + Standard_EXPORT Handle(GEOM_Object) MakeSolidShell (Handle(GEOM_Object) theShell); + + Standard_EXPORT Handle(GEOM_Object) MakeFilling (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, double theTol2D, double theTol3D, int theNbIter); + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IArc.hxx b/src/GEOMImpl/GEOMImpl_IArc.hxx new file mode 100644 index 000000000..6ad13ca56 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IArc.hxx @@ -0,0 +1,46 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Arc creation. + + +#include "GEOM_Function.hxx" + +#define ARC_ARG_PI 1 +#define ARC_ARG_PC 2 +#define ARC_ARG_PE 3 + +class GEOMImpl_IArc +{ + public: + + GEOMImpl_IArc(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetPoint1(Handle(GEOM_Function) theP) { _func->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); } + + 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); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IArchimede.hxx b/src/GEOMImpl/GEOMImpl_IArchimede.hxx new file mode 100644 index 000000000..bf504973e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IArchimede.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/ +// +//NOTE: This is an intreface to a function for the Archimede operation. + + +#include "GEOM_Function.hxx" + +#define ARG_WEIGHT 1 +#define ARG_DENSITY 2 +#define ARG_DEFLECT 3 +#define ARG_SHAPE 4 + +class GEOMImpl_IArchimede +{ + public: + + GEOMImpl_IArchimede(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetWeight(Standard_Real theWeight) { _func->SetReal(ARG_WEIGHT, theWeight); } + + Standard_Real GetWeight() { return _func->GetReal(ARG_WEIGHT); } + + void SetDensity(Standard_Real theDensity) { _func->SetReal(ARG_DENSITY, theDensity); } + + Standard_Real GetDensity() { return _func->GetReal(ARG_DENSITY); } + + void SetDeflection(Standard_Real theDeflection) { _func->SetReal(ARG_DEFLECT, theDeflection); } + + Standard_Real GetDeflection() { return _func->GetReal(ARG_DEFLECT); } + + void SetBasicShape(Handle(GEOM_Function) theShape) { _func->SetReference(ARG_SHAPE, theShape); } + + Handle(GEOM_Function) GetBasicShape() { return _func->GetReference(ARG_SHAPE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx new file mode 100644 index 000000000..9a7ba439c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx @@ -0,0 +1,643 @@ +// 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/ +// +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IBasicOperations::GEOMImpl_IBasicOperations(GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IBasicOperations::GEOMImpl_IBasicOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IBasicOperations::~GEOMImpl_IBasicOperations() +{ + MESSAGE("GEOMImpl_IBasicOperations::~GEOMImpl_IBasicOperations"); +} + + +//============================================================================= +/*! + * MakePointXYZ + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointXYZ + (double theX, double theY, double theZ) +{ + SetErrorCode(KO); + + //Add a new Point object + Handle(GEOM_Object) aPoint = GetEngine()->AddObject(GetDocID(), GEOM_POINT); + + //Add a new Point function with XYZ parameters + Handle(GEOM_Function) aFunction = + aPoint->AddFunction(GEOMImpl_PointDriver::GetID(), POINT_XYZ); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PointDriver::GetID()) return NULL; + + GEOMImpl_IPoint aPI(aFunction); + + aPI.SetX(theX); + aPI.SetY(theY); + aPI.SetZ(theZ); + + //Compute the point value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Point 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) << aPoint << " = geompy.MakeVertex(" + << theX << ", " << theY << ", " << theZ << ")"; + + SetErrorCode(OK); + return aPoint; +} + +//============================================================================= +/*! + * MakePointWithReference + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointWithReference + (Handle(GEOM_Object) theReference, double theX, double theY, double theZ) +{ + SetErrorCode(KO); + + if (theReference.IsNull()) return NULL; + + //Add a new Point object + Handle(GEOM_Object) aPoint = GetEngine()->AddObject(GetDocID(), GEOM_POINT); + + //Add a new Point function for creation a point relativley another point + Handle(GEOM_Function) aFunction = aPoint->AddFunction(GEOMImpl_PointDriver::GetID(), POINT_XYZ_REF); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PointDriver::GetID()) return NULL; + + GEOMImpl_IPoint aPI(aFunction); + + Handle(GEOM_Function) aRefFunction = theReference->GetLastFunction(); + if (aRefFunction.IsNull()) return NULL; + + aPI.SetRef(aRefFunction); + aPI.SetX(theX); + aPI.SetY(theY); + aPI.SetZ(theZ); + + //Compute the point value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Point 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) << aPoint << " = geompy.MakeVertexWithRef(" + << theReference << ", " << theX << ", " << theY << ", " << theZ << ")"; + + SetErrorCode(OK); + return aPoint; +} + +//============================================================================= +/*! + * MakePointOnCurve + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePointOnCurve + (Handle(GEOM_Object) theCurve, double theParameter) +{ + SetErrorCode(KO); + + if (theCurve.IsNull()) return NULL; + + //Add a new Point object + Handle(GEOM_Object) aPoint = GetEngine()->AddObject(GetDocID(), GEOM_POINT); + + //Add a new Point function for creation a point relativley another point + Handle(GEOM_Function) aFunction = aPoint->AddFunction(GEOMImpl_PointDriver::GetID(), POINT_CURVE_PAR); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PointDriver::GetID()) return NULL; + + GEOMImpl_IPoint aPI (aFunction); + + Handle(GEOM_Function) aRefFunction = theCurve->GetLastFunction(); + if (aRefFunction.IsNull()) return NULL; + + aPI.SetCurve(aRefFunction); + aPI.SetParameter(theParameter); + + //Compute the point value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Point 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) << aPoint << " = geompy.MakeVertexOnCurve(" + << theCurve << ", " << theParameter << ")"; + + SetErrorCode(OK); + return aPoint; +} + + +//============================================================================= +/*! + * MakeVectorDXDYDZ + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeVectorDXDYDZ + (double theDX, double theDY, double theDZ) +{ + SetErrorCode(KO); + + //Add a new Vector object + Handle(GEOM_Object) aVector = GetEngine()->AddObject(GetDocID(), GEOM_VECTOR); + + //Add a new Vector function with DXDYDZ parameters + Handle(GEOM_Function) aFunction = + aVector->AddFunction(GEOMImpl_VectorDriver::GetID(), VECTOR_DX_DY_DZ); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_VectorDriver::GetID()) return NULL; + + GEOMImpl_IVector aPI (aFunction); + + aPI.SetDX(theDX); + aPI.SetDY(theDY); + aPI.SetDZ(theDZ); + + //Compute the Vector value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Vector 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) << aVector << " = geompy.MakeVectorDXDYDZ(" + << theDX << ", " << theDY << ", " << theDZ << ")"; + + SetErrorCode(OK); + return aVector; +} + +//============================================================================= +/*! + * MakeVectorTwoPnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeVectorTwoPnt + (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL; + + //Add a new Vector object + Handle(GEOM_Object) aVector = GetEngine()->AddObject(GetDocID(), GEOM_VECTOR); + + //Add a new Vector function + Handle(GEOM_Function) aFunction = + aVector->AddFunction(GEOMImpl_VectorDriver::GetID(), VECTOR_TWO_PNT); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_VectorDriver::GetID()) return NULL; + + GEOMImpl_IVector aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aPI.SetPoint1(aRef1); + aPI.SetPoint2(aRef2); + + //Compute the Vector value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Vector 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) << aVector << " = geompy.MakeVector(" + << thePnt1 << ", " << thePnt2 << ")"; + + SetErrorCode(OK); + return aVector; +} + + +//============================================================================= +/*! + * MakeLine + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeLine + (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theDir) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theDir.IsNull()) return NULL; + + //Add a new Line object + Handle(GEOM_Object) aLine = GetEngine()->AddObject(GetDocID(), GEOM_LINE); + + //Add a new Line function + Handle(GEOM_Function) aFunction = + aLine->AddFunction(GEOMImpl_LineDriver::GetID(), LINE_PNT_DIR); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_LineDriver::GetID()) return NULL; + + GEOMImpl_ILine aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theDir->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aPI.SetPoint1(aRef1); + aPI.SetPoint2(aRef2); + + //Compute the Line value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Line 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) << aLine << " = geompy.MakeLine(" + << thePnt << ", " << theDir << ")"; + + SetErrorCode(OK); + return aLine; +} + +//============================================================================= +/*! + * MakeLineTwoPnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeLineTwoPnt + (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL; + + //Add a new Line object + Handle(GEOM_Object) aLine = GetEngine()->AddObject(GetDocID(), GEOM_LINE); + + //Add a new Line function + Handle(GEOM_Function) aFunction = + aLine->AddFunction(GEOMImpl_LineDriver::GetID(), LINE_TWO_PNT); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_LineDriver::GetID()) return NULL; + + GEOMImpl_ILine aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aPI.SetPoint1(aRef1); + aPI.SetPoint2(aRef2); + + //Compute the Line value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Line 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) << aLine << " = geompy.MakeLineTwoPnt(" + << thePnt1 << ", " << thePnt2 << ")"; + + SetErrorCode(OK); + return aLine; +} + + +//============================================================================= +/*! + * MakePlaneThreePnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePlaneThreePnt + (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3, double theSize) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL; + + //Add a new Plane object + Handle(GEOM_Object) aPlane = GetEngine()->AddObject(GetDocID(), GEOM_PLANE); + + //Add a new Plane function + Handle(GEOM_Function) aFunction = + aPlane->AddFunction(GEOMImpl_PlaneDriver::GetID(), PLANE_THREE_PNT); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PlaneDriver::GetID()) return NULL; + + GEOMImpl_IPlane aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction(); + Handle(GEOM_Function) aRef3 = thePnt3->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull() || aRef3.IsNull()) return NULL; + + aPI.SetPoint1(aRef1); + aPI.SetPoint2(aRef2); + aPI.SetPoint3(aRef3); + aPI.SetSize(theSize); + + //Compute the Plane value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Plane 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) << aPlane << " = geompy.MakePlaneThreePnt(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ", " << theSize << ")"; + + SetErrorCode(OK); + return aPlane; +} + +//============================================================================= +/*! + * MakePlanePntVec + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePlanePntVec + (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, + double theSize) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Plane object + Handle(GEOM_Object) aPlane = GetEngine()->AddObject(GetDocID(), GEOM_PLANE); + + //Add a new Plane function + Handle(GEOM_Function) aFunction = + aPlane->AddFunction(GEOMImpl_PlaneDriver::GetID(), PLANE_PNT_VEC); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PlaneDriver::GetID()) return NULL; + + GEOMImpl_IPlane aPI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aPI.SetPoint(aRefPnt); + aPI.SetVector(aRefVec); + aPI.SetSize(theSize); + + //Compute the Plane value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Plane 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) << aPlane << " = geompy.MakePlane(" + << thePnt << ", " << theVec << ", " << theSize << ")"; + + SetErrorCode(OK); + return aPlane; +} + +//============================================================================= +/*! + * MakePlaneFace + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakePlaneFace + (Handle(GEOM_Object) theFace, double theSize) +{ + SetErrorCode(KO); + + if (theFace.IsNull()) return NULL; + + //Add a new Plane object + Handle(GEOM_Object) aPlane = GetEngine()->AddObject(GetDocID(), GEOM_PLANE); + + //Add a new Plane function + Handle(GEOM_Function) aFunction = + aPlane->AddFunction(GEOMImpl_PlaneDriver::GetID(), PLANE_FACE); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PlaneDriver::GetID()) return NULL; + + GEOMImpl_IPlane aPI (aFunction); + + Handle(GEOM_Function) aRef = theFace->GetLastFunction(); + if (aRef.IsNull()) return NULL; + + aPI.SetFace(aRef); + aPI.SetSize(theSize); + + //Compute the Plane value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Plane 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) << aPlane << " = geompy.MakePlaneFace(" + << theFace << ", " << theSize << ")"; + + SetErrorCode(OK); + return aPlane; +} + + +//============================================================================= +/*! + * MakeMarker + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeMarker + (double theOX, double theOY, double theOZ, + double theXDX, double theXDY, double theXDZ, + double theYDX, double theYDY, double theYDZ) +{ + SetErrorCode(KO); + + //Add a new Marker object + Handle(GEOM_Object) aMarker = GetEngine()->AddObject(GetDocID(), GEOM_MARKER); + + //Add a new Marker function + Handle(GEOM_Function) aFunction = + aMarker->AddFunction(GEOMImpl_MarkerDriver::GetID(), MARKER_CS); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MarkerDriver::GetID()) return NULL; + + GEOMImpl_IMarker aPI(aFunction); + + aPI.SetOrigin(theOX, theOY, theOZ); + aPI.SetXDir(theXDX, theXDY, theXDZ); + aPI.SetYDir(theYDX, theYDY, theYDZ); + + //Compute the marker value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Marker 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) << aMarker << " = geompy.MakeMarker(" + << theOX << ", " << theOY << ", " << theOZ << ", " + << theXDX << ", " << theXDY << ", " << theXDZ << ", " + << theYDX << ", " << theYDY << ", " << theYDZ << ")"; + + SetErrorCode(OK); + return aMarker; +} diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx new file mode 100644 index 000000000..7106f4cd9 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx @@ -0,0 +1,75 @@ +// 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/ +// + +#ifndef _GEOMImpl_IBasicOperations_HXX_ +#define _GEOMImpl_IBasicOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include + +class GEOMImpl_IBasicOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IBasicOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IBasicOperations(); + + // Point + Standard_EXPORT Handle(GEOM_Object) MakePointXYZ (double theX, double theY, double theZ); + + Standard_EXPORT Handle(GEOM_Object) MakePointWithReference (Handle(GEOM_Object) theReference, + double theX, double theY, double theZ); + + Standard_EXPORT Handle(GEOM_Object) MakePointOnCurve (Handle(GEOM_Object) theCurve, + double theParameter); + + // Vector + Standard_EXPORT Handle(GEOM_Object) MakeVectorDXDYDZ (double theDX, double theDY, double theDZ); + + Standard_EXPORT Handle(GEOM_Object) MakeVectorTwoPnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2); + + // Line + Standard_EXPORT Handle(GEOM_Object) MakeLineTwoPnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2); + + Standard_EXPORT Handle(GEOM_Object) MakeLine (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theDir); + + // Plane + Standard_EXPORT Handle(GEOM_Object) MakePlaneThreePnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3, + double theSize); + + Standard_EXPORT Handle(GEOM_Object) MakePlanePntVec (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theSize); + + Standard_EXPORT Handle(GEOM_Object) MakePlaneFace (Handle(GEOM_Object) theFace, double theSize); + + // Marker + Standard_EXPORT Handle(GEOM_Object) MakeMarker (double theOX, double theOY, double theOZ, + double theXDX, double theXDY, double theXDZ, + double theYDX, double theYDY, double theYDZ); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx b/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx new file mode 100644 index 000000000..19f60e2a7 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBlockTrsf.hxx @@ -0,0 +1,61 @@ +// 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/ +// +//NOTE: This is an interface to a function for the Blocks Multi-Transformations. + + +#include "GEOM_Function.hxx" + +#define TRSF_ORIGIN 1 + +#define TRSF_FACE_1_U 2 +#define TRSF_FACE_2_U 3 +#define TRSF_NBITER_U 4 +#define TRSF_FACE_1_V 5 +#define TRSF_FACE_2_V 6 +#define TRSF_NBITER_V 7 + +class GEOMImpl_IBlockTrsf +{ + public: + + GEOMImpl_IBlockTrsf (Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOriginal (Handle(GEOM_Function) theOriginal) { _func->SetReference(TRSF_ORIGIN, theOriginal); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(TRSF_ORIGIN); } + + void SetFace1U (int theFaceId) { _func->SetInteger(TRSF_FACE_1_U, theFaceId); } + void SetFace2U (int theFaceId) { _func->SetInteger(TRSF_FACE_2_U, theFaceId); } + void SetFace1V (int theFaceId) { _func->SetInteger(TRSF_FACE_1_V, theFaceId); } + void SetFace2V (int theFaceId) { _func->SetInteger(TRSF_FACE_2_V, theFaceId); } + void SetNbIterU (int theNbIter) { _func->SetInteger(TRSF_NBITER_U, theNbIter); } + void SetNbIterV (int theNbIter) { _func->SetInteger(TRSF_NBITER_V, theNbIter); } + + int GetFace1U () { return _func->GetInteger(TRSF_FACE_1_U); } + int GetFace2U () { return _func->GetInteger(TRSF_FACE_2_U); } + int GetFace1V () { return _func->GetInteger(TRSF_FACE_1_V); } + int GetFace2V () { return _func->GetInteger(TRSF_FACE_2_V); } + int GetNbIterU() { return _func->GetInteger(TRSF_NBITER_U); } + int GetNbIterV() { return _func->GetInteger(TRSF_NBITER_V); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IBlocks.hxx b/src/GEOMImpl/GEOMImpl_IBlocks.hxx new file mode 100644 index 000000000..a8174bf26 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBlocks.hxx @@ -0,0 +1,45 @@ +// 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/ +// +// NOTE: This is an interface to a function for the Blocks +// creation and transformation. + + +#include "GEOM_Function.hxx" + +#include "TColStd_HSequenceOfTransient.hxx" + +#define BLOCK_ARG_SHAPES 1 // Arguments for creation of block or face of block + +class GEOMImpl_IBlocks +{ + public: + + GEOMImpl_IBlocks(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(BLOCK_ARG_SHAPES, theShapes); } + + Handle(TColStd_HSequenceOfTransient) GetShapes() + { return _func->GetReferenceList(BLOCK_ARG_SHAPES); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx new file mode 100644 index 000000000..2cbca5805 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -0,0 +1,3129 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +//#include + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IBlocksOperations::GEOMImpl_IBlocksOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IBlocksOperations::GEOMImpl_IBlocksOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IBlocksOperations::~GEOMImpl_IBlocksOperations() +{ + MESSAGE("GEOMImpl_IBlocksOperations::~GEOMImpl_IBlocksOperations"); +} + + +//============================================================================= +/*! + * MakeQuad + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeQuad + (Handle(GEOM_Object) theEdge1, Handle(GEOM_Object) theEdge2, + Handle(GEOM_Object) theEdge3, Handle(GEOM_Object) theEdge4) +{ + SetErrorCode(KO); + + if (theEdge1.IsNull() || theEdge2.IsNull() || + theEdge3.IsNull() || theEdge4.IsNull()) return NULL; + + //Add a new Face object + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new Face function + Handle(GEOM_Function) aFunction = + aFace->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_FACE_FOUR_EDGES); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theEdge1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theEdge2->GetLastFunction(); + Handle(GEOM_Function) aRef3 = theEdge3->GetLastFunction(); + Handle(GEOM_Function) aRef4 = theEdge4->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull() || + aRef3.IsNull() || aRef4.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + aShapesSeq->Append(aRef2); + aShapesSeq->Append(aRef3); + aShapesSeq->Append(aRef4); + + aPI.SetShapes(aShapesSeq); + + //Compute the Face value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a face"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aFace << " = geompy.MakeQuad(" + << theEdge1 << ", " << theEdge2 << ", " << theEdge3 << ", " << theEdge4 << ")"; + + SetErrorCode(OK); + return aFace; +} + +//============================================================================= +/*! + * MakeQuad2Edges + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeQuad2Edges + (Handle(GEOM_Object) theEdge1, Handle(GEOM_Object) theEdge2) +{ + SetErrorCode(KO); + + if (theEdge1.IsNull() || theEdge2.IsNull()) return NULL; + + //Add a new Face object + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new Face function + Handle(GEOM_Function) aFunction = + aFace->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_FACE_TWO_EDGES); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theEdge1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theEdge2->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + aShapesSeq->Append(aRef2); + + aPI.SetShapes(aShapesSeq); + + //Compute the Face value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a face"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aFace << " = geompy.MakeQuad2Edges(" + << theEdge1 << ", " << theEdge2 << ")"; + + SetErrorCode(OK); + return aFace; +} + +//============================================================================= +/*! + * MakeQuad4Vertices + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeQuad4Vertices + (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3, Handle(GEOM_Object) thePnt4) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull() || + thePnt3.IsNull() || thePnt4.IsNull()) return NULL; + + //Add a new Face object + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new Face function + Handle(GEOM_Function) aFunction = + aFace->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_FACE_FOUR_PNT); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction(); + Handle(GEOM_Function) aRef3 = thePnt3->GetLastFunction(); + Handle(GEOM_Function) aRef4 = thePnt4->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull() || + aRef3.IsNull() || aRef4.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + aShapesSeq->Append(aRef2); + aShapesSeq->Append(aRef3); + aShapesSeq->Append(aRef4); + + aPI.SetShapes(aShapesSeq); + + //Compute the Face value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a face"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aFace << " = geompy.MakeQuad4Vertices(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ", " << thePnt4 << ")"; + + SetErrorCode(OK); + return aFace; +} + +//============================================================================= +/*! + * MakeHexa + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeHexa + (Handle(GEOM_Object) theFace1, Handle(GEOM_Object) theFace2, + Handle(GEOM_Object) theFace3, Handle(GEOM_Object) theFace4, + Handle(GEOM_Object) theFace5, Handle(GEOM_Object) theFace6) +{ + SetErrorCode(KO); + + if (theFace1.IsNull() || theFace2.IsNull() || + theFace3.IsNull() || theFace4.IsNull() || + theFace5.IsNull() || theFace6.IsNull()) return NULL; + + //Add a new Solid object + Handle(GEOM_Object) aBlock = GetEngine()->AddObject(GetDocID(), GEOM_BLOCK); + + //Add a new Block function + Handle(GEOM_Function) aFunction = + aBlock->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_SIX_FACES); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theFace1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theFace2->GetLastFunction(); + Handle(GEOM_Function) aRef3 = theFace3->GetLastFunction(); + Handle(GEOM_Function) aRef4 = theFace4->GetLastFunction(); + Handle(GEOM_Function) aRef5 = theFace5->GetLastFunction(); + Handle(GEOM_Function) aRef6 = theFace6->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull() || + aRef3.IsNull() || aRef4.IsNull() || + aRef5.IsNull() || aRef6.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + aShapesSeq->Append(aRef2); + aShapesSeq->Append(aRef3); + aShapesSeq->Append(aRef4); + aShapesSeq->Append(aRef5); + aShapesSeq->Append(aRef6); + + aPI.SetShapes(aShapesSeq); + + //Compute the Block value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a block"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aBlock << " = geompy.MakeHexa(" + << theFace1 << ", " << theFace2 << ", " << theFace3 << ", " + << theFace4 << ", " << theFace5 << ", " << theFace6 << ")"; + + SetErrorCode(OK); + return aBlock; +} + +//============================================================================= +/*! + * MakeHexa2Faces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeHexa2Faces + (Handle(GEOM_Object) theFace1, Handle(GEOM_Object) theFace2) +{ + SetErrorCode(KO); + + if (theFace1.IsNull() || theFace2.IsNull()) return NULL; + + //Add a new Solid object + Handle(GEOM_Object) aBlock = GetEngine()->AddObject(GetDocID(), GEOM_BLOCK); + + //Add a new Block function + Handle(GEOM_Function) aFunction = + aBlock->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_TWO_FACES); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theFace1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theFace2->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + aShapesSeq->Append(aRef2); + + aPI.SetShapes(aShapesSeq); + + //Compute the Block value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a block"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aBlock << " = geompy.MakeHexa2Faces(" + << theFace1 << ", " << theFace2 << ")"; + + SetErrorCode(OK); + return aBlock; +} + +//============================================================================= +/*! + * MakeBlockCompound + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeBlockCompound + (Handle(GEOM_Object) theCompound) +{ + SetErrorCode(KO); + + if (theCompound.IsNull()) return NULL; + + //Add a new object + Handle(GEOM_Object) aBlockComp = GetEngine()->AddObject(GetDocID(), GEOM_COMPOUND); + + //Add a new BlocksComp function + Handle(GEOM_Function) aFunction = + aBlockComp->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_COMPOUND_GLUE); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlocks aPI (aFunction); + + Handle(GEOM_Function) aRef1 = theCompound->GetLastFunction(); + if (aRef1.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + aShapesSeq->Append(aRef1); + + aPI.SetShapes(aShapesSeq); + + //Compute the Blocks Compound value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to compute a blocks compound"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aBlockComp + << " = geompy.MakeBlockCompound(" << theCompound << ")"; + + SetErrorCode(OK); + return aBlockComp; +} + +//============================================================================= +/*! + * GetPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetPoint + (Handle(GEOM_Object) theShape, + const Standard_Real theX, + const Standard_Real theY, + const Standard_Real theZ, + const Standard_Real theEpsilon) +{ + SetErrorCode(KO); + + //New Point object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Given shape is null"); + return NULL; + } + + //Compute the Vertex value + gp_Pnt P (theX, theY, theZ); + Standard_Real eps = Max(theEpsilon, Precision::Confusion()); + + TopoDS_Shape V; + Standard_Integer isFound = 0; + TopTools_MapOfShape mapShape; + TopExp_Explorer exp (aBlockOrComp, TopAbs_VERTEX); + + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Vertex aVi = TopoDS::Vertex(exp.Current()); + gp_Pnt aPi = BRep_Tool::Pnt(aVi); + if (aPi.Distance(P) < eps) { + V = aVi; + isFound++; + } + } + } + + if (isFound == 0) { + SetErrorCode("Vertex has not been found"); + return NULL; + } else if (isFound > 1) { + SetErrorCode("Multiple vertices found by the given coordinates and epsilon"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(V)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + + //The GetPoint() doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t" + << aResult << " = geompy.GetPoint(" << theShape << ", " + << theX << ", " << theY << ", " << theZ << ", " << theEpsilon << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetEdge + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetEdge + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2) +{ + SetErrorCode(KO); + + //New Edge object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Given shape is null"); + return NULL; + } + + TopoDS_Shape anArg1 = thePoint1->GetValue(); + TopoDS_Shape anArg2 = thePoint2->GetValue(); + if (anArg1.IsNull() || anArg2.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg1.ShapeType() != TopAbs_VERTEX || + anArg2.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for edge identification is not a vertex"); + return NULL; + } + + //Compute the Edge value + try { + TopTools_IndexedDataMapOfShapeListOfShape MVE; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (aBlockOrComp, TopAbs_VERTEX, TopAbs_EDGE, MVE); + + TopoDS_Shape V1,V2; + Standard_Integer ish, ext = MVE.Extent(); + + if (MVE.Contains(anArg1)) { + V1 = anArg1; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVE.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg1), TopoDS::Vertex(aShi))) { + V1 = aShi; + break; + } + } + } + + if (MVE.Contains(anArg2)) { + V2 = anArg2; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVE.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg2), TopoDS::Vertex(aShi))) { + V2 = aShi; + break; + } + } + } + + if (V1.IsNull() || V2.IsNull()) { + SetErrorCode("The given vertex does not belong to the shape"); + return NULL; + } + + TopoDS_Shape anEdge; + Standard_Integer isFound = + GEOMImpl_Block6Explorer::FindEdge(anEdge, V1, V2, MVE, Standard_True); + if (isFound == 0) { + SetErrorCode("The given vertices do not belong to one edge of the given shape"); + return NULL; + } else if (isFound > 1) { + SetErrorCode("Multiple edges found by the given vertices of the shape"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(anEdge)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetEdge(" + << theShape << ", " << thePoint1 << ", " << thePoint2 << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetEdgeNearPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetEdgeNearPoint + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || thePoint.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Given shape is null"); + return NULL; + } + + TopoDS_Shape anArg = thePoint->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for edge identification is not a vertex"); + return NULL; + } + + //Compute the Edge value + try { + TopoDS_Shape aShape; + + TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + + // 1. Explode blocks on edges + TopTools_MapOfShape mapShape; + Standard_Integer nbEdges = 0; + TopExp_Explorer exp (aBlockOrComp, TopAbs_EDGE); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbEdges++; + } + } + + if (nbEdges == 0) { + SetErrorCode("Given shape contains no edges"); + return NULL; + } + + mapShape.Clear(); + Standard_Integer ind = 1; + TopTools_Array1OfShape anEdges (1, nbEdges); + TColStd_Array1OfReal aDistances (1, nbEdges); + for (exp.Init(aBlockOrComp, TopAbs_EDGE); exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape anEdge = exp.Current(); + anEdges(ind) = anEdge; + + // 2. Classify the point relatively each edge + BRepExtrema_DistShapeShape aDistTool (aVert, anEdges(ind)); + if (!aDistTool.IsDone()) { + SetErrorCode("Can not find a distance from the given point to one of edges"); + return NULL; + } + aDistances(ind) = aDistTool.Value(); + ind++; + } + } + + // 3. Define edge, having minimum distance to the point + Standard_Real nearest = RealLast(), nbFound = 0; + Standard_Real prec = Precision::Confusion(); + for (ind = 1; ind <= nbEdges; ind++) { + if (Abs(aDistances(ind) - nearest) < prec) { + nbFound++; + } else if (aDistances(ind) < nearest) { + nearest = aDistances(ind); + aShape = anEdges(ind); + nbFound = 1; + } else { + } + } + if (nbFound > 1) { + SetErrorCode("Multiple edges near the given point are found"); + return NULL; + } else if (nbFound == 0) { + SetErrorCode("There are no edges near the given point"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetEdgeNearPoint(" + << theShape << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetFaceByPoints + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetFaceByPoints + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2, + Handle(GEOM_Object) thePoint3, + Handle(GEOM_Object) thePoint4) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || + thePoint1.IsNull() || thePoint2.IsNull() || + thePoint3.IsNull() || thePoint4.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block or compound is null"); + return NULL; + } + + TopoDS_Shape anArg1 = thePoint1->GetValue(); + TopoDS_Shape anArg2 = thePoint2->GetValue(); + TopoDS_Shape anArg3 = thePoint3->GetValue(); + TopoDS_Shape anArg4 = thePoint4->GetValue(); + if (anArg1.IsNull() || anArg2.IsNull() || + anArg3.IsNull() || anArg4.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg1.ShapeType() != TopAbs_VERTEX || + anArg2.ShapeType() != TopAbs_VERTEX || + anArg3.ShapeType() != TopAbs_VERTEX || + anArg4.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for face identification is not a vertex"); + return NULL; + } + + //Compute the Face value + try { + TopoDS_Shape aShape; + + TopTools_IndexedDataMapOfShapeListOfShape MVF; + GEOMImpl_Block6Explorer::MapShapesAndAncestors(aBlockOrComp, TopAbs_VERTEX, TopAbs_FACE, MVF); + + TopoDS_Shape V1,V2,V3,V4; + Standard_Integer ish, ext = MVF.Extent(); + + if (MVF.Contains(anArg1)) { + V1 = anArg1; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVF.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg1), TopoDS::Vertex(aShi))) { + V1 = aShi; + break; + } + } + } + + if (MVF.Contains(anArg2)) { + V2 = anArg2; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVF.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg2), TopoDS::Vertex(aShi))) { + V2 = aShi; + break; + } + } + } + + if (MVF.Contains(anArg3)) { + V3 = anArg3; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVF.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg3), TopoDS::Vertex(aShi))) { + V3 = aShi; + break; + } + } + } + + if (MVF.Contains(anArg4)) { + V4 = anArg4; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MVF.FindKey(ish); + if (BRepTools::Compare(TopoDS::Vertex(anArg4), TopoDS::Vertex(aShi))) { + V4 = aShi; + break; + } + } + } + + if (V1.IsNull() || V2.IsNull() || V3.IsNull() || V4.IsNull()) { + SetErrorCode("The given vertex does not belong to the shape"); + return NULL; + } + + Standard_Integer isFound = + GEOMImpl_Block6Explorer::FindFace(aShape, V1, V2, V3, V4, MVF, Standard_True); + if (isFound == 0) { + SetErrorCode("The given vertices do not belong to one face of the given shape"); + return NULL; + } else if (isFound > 1) { + SetErrorCode("The given vertices belong to several faces of the given shape"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetFaceByPoints(" + << theShape << ", " << thePoint1 << ", " << thePoint2 + << ", " << thePoint3 << ", " << thePoint4 << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetFaceByEdges + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetFaceByEdges + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theEdge1, + Handle(GEOM_Object) theEdge2) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || theEdge1.IsNull() || theEdge2.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block or compound is null"); + return NULL; + } + if (aBlockOrComp.ShapeType() != TopAbs_SOLID && + aBlockOrComp.ShapeType() != TopAbs_COMPOUND && + aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) { + SetErrorCode("Shape is neither a block, nor a compound of blocks"); + return NULL; + } + + TopoDS_Shape anArg1 = theEdge1->GetValue(); + TopoDS_Shape anArg2 = theEdge2->GetValue(); + if (anArg1.IsNull() || anArg2.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg1.ShapeType() != TopAbs_EDGE || + anArg2.ShapeType() != TopAbs_EDGE) { + SetErrorCode("Element for face identification is not an edge"); + return NULL; + } + + //Compute the Face value + try { + TopoDS_Shape aShape; + + TopTools_IndexedDataMapOfShapeListOfShape MEF; + GEOMImpl_Block6Explorer::MapShapesAndAncestors(aBlockOrComp, TopAbs_EDGE, TopAbs_FACE, MEF); + + TopoDS_Shape E1,E2; + Standard_Integer ish, ext = MEF.Extent(); + + if (MEF.Contains(anArg1)) { + E1 = anArg1; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MEF.FindKey(ish); + if (GEOMImpl_Block6Explorer::IsSimilarEdges(anArg1, aShi)) { + E1 = aShi; + } + } + } + + if (MEF.Contains(anArg2)) { + E2 = anArg2; + } else { + for (ish = 1; ish <= ext; ish++) { + TopoDS_Shape aShi = MEF.FindKey(ish); + if (GEOMImpl_Block6Explorer::IsSimilarEdges(anArg2, aShi)) { + E2 = aShi; + } + } + } + + if (E1.IsNull() || E2.IsNull()) { + SetErrorCode("The given edge does not belong to the shape"); + return NULL; + } + + const TopTools_ListOfShape& aFacesOfE1 = MEF.FindFromKey(E1); + const TopTools_ListOfShape& aFacesOfE2 = MEF.FindFromKey(E2); + + Standard_Integer isFound = 0; + TopTools_ListIteratorOfListOfShape anIterF1 (aFacesOfE1); + for (; anIterF1.More(); anIterF1.Next()) { + + TopTools_ListIteratorOfListOfShape anIterF2 (aFacesOfE2); + for (; anIterF2.More(); anIterF2.Next()) { + + if (anIterF1.Value().IsSame(anIterF2.Value())) { + isFound++; + + // Store the face, defined by two edges + aShape = anIterF1.Value(); + } + } + } + if (isFound == 0) { + SetErrorCode("The given edges do not belong to one face of the given shape"); + return NULL; + } else if (isFound > 1) { + SetErrorCode("The given edges belong to several faces of the given shape"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetFaceByEdges(" + << theShape << ", " << theEdge1 << ", " << theEdge2 << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetOppositeFace + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetOppositeFace + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theFace) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || theFace.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block is null"); + return NULL; + } + if (aBlockOrComp.ShapeType() != TopAbs_SOLID) { + SetErrorCode("Shape is not a block"); + return NULL; + } + + TopoDS_Shape anArg = theFace->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_FACE) { + SetErrorCode("Element for face identification is not a face"); + return NULL; + } + + //Compute the Face value + try { + TopoDS_Shape aShape; + + GEOMImpl_Block6Explorer aBlockTool; + aBlockTool.InitByBlockAndFace(aBlockOrComp, anArg); + aShape = aBlockTool.GetFace(2); + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetOppositeFace(" + << theShape << ", " << theFace << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetFaceNearPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetFaceNearPoint + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || thePoint.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block or compound is null"); + return NULL; + } + if (aBlockOrComp.ShapeType() != TopAbs_SOLID && + aBlockOrComp.ShapeType() != TopAbs_COMPOUND && + aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) { + SetErrorCode("Shape is neither a block, nor a compound of blocks"); + return NULL; + } + + TopoDS_Shape anArg = thePoint->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Element for face identification is not a vertex"); + return NULL; + } + + //Compute the Face value + try { + TopoDS_Shape aShape; + + TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + gp_Pnt aPnt = BRep_Tool::Pnt(aVert); + Standard_Real PX, PY, PZ; + aPnt.Coord(PX, PY, PZ); + + // 1. Classify the point relatively each face + Standard_Integer nearest = 2, nbFound = 0; + TopTools_DataMapOfShapeInteger mapShapeDist; + TopExp_Explorer exp (aBlockOrComp, TopAbs_FACE); + for (; exp.More(); exp.Next()) { + TopoDS_Shape aFace = exp.Current(); + + if (!mapShapeDist.IsBound(aFace)) { + Standard_Integer aDistance = 2; + + // 1.a. Classify relatively Surface + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aFace)); + Handle(ShapeAnalysis_Surface) aSurfAna = new ShapeAnalysis_Surface (aSurf); + gp_Pnt2d p2dOnSurf = aSurfAna->ValueOfUV(aPnt, Precision::Confusion()); + gp_Pnt p3dOnSurf = aSurfAna->Value(p2dOnSurf); + Standard_Real aDist = p3dOnSurf.Distance(aPnt); + if (aDist > Precision::Confusion()) { + // OUT of Surface + aDistance = 1; + } else { + // 1.b. Classify relatively the face itself + BRepClass_FaceClassifier FC (TopoDS::Face(aFace), p2dOnSurf, Precision::Confusion()); + if (FC.State() == TopAbs_IN) { + aDistance = -1; + } else if (FC.State() == TopAbs_ON) { + aDistance = 0; + } else { // OUT + aDistance = 1; + } + } + + if (aDistance < nearest) { + nearest = aDistance; + aShape = aFace; + nbFound = 1; + + // A first found face, containing the point inside, will be returned. + // It is the solution, if there are no + // coincident or intersecting faces in the compound. + if (nearest == -1) break; + + } else if (aDistance == nearest) { + nbFound++; + } else { + } + + mapShapeDist.Bind(aFace, aDistance); + } // if (!mapShapeDist.IsBound(aFace)) + } + + // 2. Define face, containing the point or having minimum distance to it + if (nbFound > 1) { + if (nearest == 0) { + // The point is on boundary of some faces and there are + // no faces, having the point inside + SetErrorCode("Multiple faces near the given point are found"); + return NULL; + + } else if (nearest == 1) { + // The point is outside some faces and there are + // no faces, having the point inside or on boundary. + // We will get a nearest face + Standard_Real bigReal = RealLast(); + Standard_Real minDist = bigReal; + TopTools_DataMapIteratorOfDataMapOfShapeInteger mapShapeDistIter (mapShapeDist); + for (; mapShapeDistIter.More(); mapShapeDistIter.Next()) { + if (mapShapeDistIter.Value() == 1) { + TopoDS_Shape aFace = mapShapeDistIter.Key(); + Standard_Real aDist = bigReal; + + // 2.a. Fast check of distance - if point projection on surface is on face + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aFace)); + Handle(ShapeAnalysis_Surface) aSurfAna = new ShapeAnalysis_Surface (aSurf); + gp_Pnt2d p2dOnSurf = aSurfAna->ValueOfUV(aPnt, Precision::Confusion()); + gp_Pnt p3dOnSurf = aSurfAna->Value(p2dOnSurf); + aDist = p3dOnSurf.Distance(aPnt); + + BRepClass_FaceClassifier FC (TopoDS::Face(aFace), p2dOnSurf, Precision::Confusion()); + if (FC.State() == TopAbs_OUT) { + if (aDist < minDist) { + // 2.b. Slow check - if point projection on surface is outside of face + BRepExtrema_DistShapeShape aDistTool (aVert, aFace); + if (!aDistTool.IsDone()) { + SetErrorCode("Can not find a distance from the given point to one of faces"); + return NULL; + } + aDist = aDistTool.Value(); + } else { + aDist = bigReal; + } + } + + if (aDist < minDist) { + minDist = aDist; + aShape = aFace; + } + } + } + } else { // nearest == -1 +// // The point is inside some faces. +// // We will get a face with nearest center +// Standard_Real minDist = RealLast(); +// TopTools_DataMapIteratorOfDataMapOfShapeInteger mapShapeDistIter (mapShapeDist); +// for (; mapShapeDistIter.More(); mapShapeDistIter.Next()) { +// if (mapShapeDistIter.Value() == -1) { +// TopoDS_Shape aFace = mapShapeDistIter.Key(); +// GProp_GProps aSystem; +// BRepGProp::SurfaceProperties(aFace, aSystem); +// gp_Pnt aCenterMass = aSystem.CentreOfMass(); +// +// Standard_Real aDist = aCenterMass.Distance(aPnt); +// if (aDist < minDist) { +// minDist = aDist; +// aShape = aFace; +// } +// } +// } + } + } // if (nbFound > 1) + + if (nbFound == 0) { + SetErrorCode("There are no faces near the given point"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetFaceNearPoint(" + << theShape << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetFaceByNormale + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetFaceByNormale + (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theVector) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theShape.IsNull() || theVector.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theShape->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Block or compound is null"); + return NULL; + } + if (aBlockOrComp.ShapeType() != TopAbs_SOLID && + aBlockOrComp.ShapeType() != TopAbs_COMPOUND && + aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) { + SetErrorCode("Shape is neither a block, nor a compound of blocks"); + return NULL; + } + + TopoDS_Shape anArg = theVector->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_EDGE) { + SetErrorCode("Element for normale identification is not an edge"); + return NULL; + } + + //Compute the Face value + try { + TopoDS_Shape aShape; + + TopoDS_Edge anEdge = TopoDS::Edge(anArg); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2, Standard_True); + gp_Pnt P1 = BRep_Tool::Pnt(V1); + gp_Pnt P2 = BRep_Tool::Pnt(V2); + gp_Vec aVec (P1, P2); + if (aVec.Magnitude() < Precision::Confusion()) { + SetErrorCode("Vector with null magnitude is given"); + return NULL; + } + + Standard_Real minAngle = RealLast(); + TopTools_MapOfShape mapShape; + TopExp_Explorer exp (aBlockOrComp, TopAbs_FACE); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Face aFace = TopoDS::Face(exp.Current()); + BRepAdaptor_Surface SF (aFace); + + Standard_Real u, v, x; + + // find a point on the surface to get normal direction in + u = SF.FirstUParameter(); + x = SF.LastUParameter(); + if (Precision::IsInfinite(u)) { + u = (Precision::IsInfinite(x)) ? 0. : x; + } else if (!Precision::IsInfinite(x)) { + u = (u+x) / 2.; + } + + v = SF.FirstVParameter(); + x = SF.LastVParameter(); + if (Precision::IsInfinite(v)) { + v = (Precision::IsInfinite(x)) ? 0. : x; + } else if (!Precision::IsInfinite(x)) { + v = (v+x) / 2.; + } + + // compute the normal direction + gp_Vec Vec1,Vec2; + SF.D1(u,v,P1,Vec1,Vec2); + gp_Vec V = Vec1.Crossed(Vec2); + x = V.Magnitude(); + if (V.Magnitude() < Precision::Confusion()) { + SetErrorCode("Normal vector of a face has null magnitude"); + return NULL; + } + + // consider the face orientation + if (aFace.Orientation() == TopAbs_REVERSED || + aFace.Orientation() == TopAbs_INTERNAL) { + V = - V; + } + + // compute the angle and compare with the minimal one + Standard_Real anAngle = aVec.Angle(V); + if (anAngle < minAngle) { + minAngle = anAngle; + aShape = aFace; + } + } + } + + if (aShape.IsNull()) { + SetErrorCode("Failed to find a face by the given normale"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theShape, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetFaceByNormale(" + << theShape << ", " << theVector << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * IsCompoundOfBlocks + */ +//============================================================================= +Standard_Boolean GEOMImpl_IBlocksOperations::IsCompoundOfBlocks + (Handle(GEOM_Object) theCompound, + const Standard_Integer theMinNbFaces, + const Standard_Integer theMaxNbFaces, + Standard_Integer& theNbBlocks) +{ + SetErrorCode(KO); + Standard_Boolean isCompOfBlocks = Standard_False; + theNbBlocks = 0; + + if (theCompound.IsNull()) return isCompOfBlocks; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + + //Check + isCompOfBlocks = Standard_True; + try { + TopTools_MapOfShape mapShape; + TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape aSolid = exp.Current(); + + TopTools_MapOfShape mapFaces; + TopExp_Explorer expF (aSolid, TopAbs_FACE); + Standard_Integer nbFaces = 0; + for (; expF.More(); expF.Next()) { + if (mapFaces.Add(expF.Current())) { + nbFaces++; + if (nbFaces > theMaxNbFaces) { + isCompOfBlocks = Standard_False; + break; + } + } + } + if (nbFaces < theMinNbFaces || theMaxNbFaces < nbFaces) { + isCompOfBlocks = Standard_False; + } else { + theNbBlocks++; + } + } + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return isCompOfBlocks; + } + + SetErrorCode(OK); + return isCompOfBlocks; +} + +//============================================================================= +/*! + * Set of functions, used by CheckCompoundOfBlocks() method + */ +//============================================================================= +void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, + TopTools_ListOfShape& BLO, + TopTools_ListOfShape& NOT, + TopTools_ListOfShape& EXT) +{ + TopAbs_ShapeEnum aType = theShape.ShapeType(); + switch (aType) { + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + { + TopoDS_Iterator It (theShape); + for (; It.More(); It.Next()) { + AddBlocksFrom(It.Value(), BLO, NOT, EXT); + } + } + break; + case TopAbs_SOLID: + { + // Check, if there are seam or degenerated edges + BlockFix_CheckTool aTool; + aTool.SetShape(theShape); + aTool.Perform(); + if (aTool.NbPossibleBlocks() > 0) { + EXT.Append(theShape); + } else { + // Count faces and edges in each face to recognize blocks + TopTools_MapOfShape mapFaces; + Standard_Integer nbFaces = 0; + Standard_Boolean hasNonQuadr = Standard_False; + TopExp_Explorer expF (theShape, TopAbs_FACE); + + for (; expF.More(); expF.Next()) { + if (mapFaces.Add(expF.Current())) { + nbFaces++; + if (nbFaces > 6) break; + + // get wire + TopoDS_Shape aF = expF.Current(); + TopExp_Explorer wires (aF, TopAbs_WIRE); + if (!wires.More()) { + // no wire in the face + hasNonQuadr = Standard_True; + break; + } + TopoDS_Shape aWire = wires.Current(); + wires.Next(); + if (wires.More()) { + // multiple wires in the face + hasNonQuadr = Standard_True; + break; + } + + // Check number of edges in the face + Standard_Integer nbEdges = 0; + TopTools_MapOfShape mapEdges; + TopExp_Explorer expW (aWire, TopAbs_EDGE); + for (; expW.More(); expW.Next()) { + if (mapEdges.Add(expW.Current())) { + nbEdges++; + if (nbEdges > 4) break; + } + } + if (nbEdges != 4) { + hasNonQuadr = Standard_True; + } + } + } + + if (nbFaces == 6 && !hasNonQuadr) { + BLO.Append(theShape); + } else { + NOT.Append(theShape); + } + } + } + break; + default: + NOT.Append(theShape); + } +} + +void AddBlocksFromOld (const TopoDS_Shape& theShape, + TopTools_ListOfShape& BLO, + TopTools_ListOfShape& NOT, + TopTools_ListOfShape& DEG, + TopTools_ListOfShape& SEA) +{ + TopAbs_ShapeEnum aType = theShape.ShapeType(); + switch (aType) { + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + { + TopoDS_Iterator It (theShape); + for (; It.More(); It.Next()) { + AddBlocksFromOld(It.Value(), BLO, NOT, DEG, SEA); + } + } + break; + case TopAbs_SOLID: + { + TopTools_MapOfShape mapFaces; + TopExp_Explorer expF (theShape, TopAbs_FACE); + Standard_Integer nbFaces = 0; + Standard_Boolean hasNonQuadr = Standard_False; + Standard_Boolean hasDegenerated = Standard_False; + Standard_Boolean hasSeam = Standard_False; + for (; expF.More(); expF.Next()) { + if (mapFaces.Add(expF.Current())) { + nbFaces++; + if (nbFaces > 6) break; + + // Check number of edges in the face + Standard_Integer nbEdges = 0; + TopTools_MapOfShape mapEdges; + + // get wire + TopoDS_Shape aF = expF.Current(); + TopExp_Explorer wires (aF, TopAbs_WIRE); + if (!wires.More()) { + // no wire in the face + hasNonQuadr = Standard_True; + break; + } + TopoDS_Shape aWire = wires.Current(); + wires.Next(); + if (wires.More()) { + // multiple wires in the face + hasNonQuadr = Standard_True; + break; + } + + // iterate on wire + BRepTools_WireExplorer aWE (TopoDS::Wire(aWire), TopoDS::Face(aF)); + for (; aWE.More(); aWE.Next(), nbEdges++) { + if (BRep_Tool::Degenerated(aWE.Current())) { + // degenerated edge found + hasDegenerated = Standard_True; +// break; + } + if (mapEdges.Contains(aWE.Current())) { + // seam edge found + hasSeam = Standard_True; +// break; + } + mapEdges.Add(aWE.Current()); + } + if (nbEdges != 4) { + hasNonQuadr = Standard_True; + } + } + } + if (nbFaces == 6) { + if (hasDegenerated || hasSeam) { + if (hasDegenerated) { + DEG.Append(theShape); + } + if (hasSeam) { + SEA.Append(theShape); + } + } else if (hasNonQuadr) { + NOT.Append(theShape); + } else { + BLO.Append(theShape); + } + } else { + NOT.Append(theShape); + } + } + break; + default: + NOT.Append(theShape); + } +} + +#define REL_NOT_CONNECTED 0 +#define REL_OK 1 +#define REL_NOT_GLUED 2 +#define REL_COLLISION_VV 3 +#define REL_COLLISION_FF 4 +#define REL_COLLISION_EE 5 +#define REL_UNKNOWN 6 + +Standard_Integer BlocksRelation (const TopoDS_Shape& theBlock1, + const TopoDS_Shape& theBlock2) +{ + // Compare bounding boxes before calling BRepExtrema_DistShapeShape + Standard_Real Xmin1, Ymin1, Zmin1, Xmax1, Ymax1, Zmax1; + Standard_Real Xmin2, Ymin2, Zmin2, Xmax2, Ymax2, Zmax2; + Bnd_Box B1, B2; + BRepBndLib::Add(theBlock1, B1); + BRepBndLib::Add(theBlock2, B2); + B1.Get(Xmin1, Ymin1, Zmin1, Xmax1, Ymax1, Zmax1); + B2.Get(Xmin2, Ymin2, Zmin2, Xmax2, Ymax2, Zmax2); + if (Xmax2 < Xmin1 || Xmax1 < Xmin2 || + Ymax2 < Ymin1 || Ymax1 < Ymin2 || + Zmax2 < Zmin1 || Zmax1 < Zmin2) { + return REL_NOT_CONNECTED; + } + + BRepExtrema_DistShapeShape dst (theBlock1, theBlock2); + if (!dst.IsDone()) { + return REL_UNKNOWN; + } + + if (dst.Value() > Precision::Confusion()) { + return REL_NOT_CONNECTED; + } + + if (dst.InnerSolution()) { + return REL_COLLISION_VV; + } + + Standard_Integer nbSol = dst.NbSolution(); + Standard_Integer relation = REL_OK; + Standard_Integer nbVerts = 0; + Standard_Integer nbEdges = 0; + Standard_Integer sol = 1; + for (; sol <= nbSol; sol++) { + BRepExtrema_SupportType supp1 = dst.SupportTypeShape1(sol); + BRepExtrema_SupportType supp2 = dst.SupportTypeShape2(sol); + if (supp1 == BRepExtrema_IsVertex && supp2 == BRepExtrema_IsVertex) { + nbVerts++; + } else if (supp1 == BRepExtrema_IsInFace || supp2 == BRepExtrema_IsInFace) { + return REL_COLLISION_FF; + } else if (supp1 == BRepExtrema_IsOnEdge && supp2 == BRepExtrema_IsOnEdge) { + nbEdges++; + } else if ((supp1 == BRepExtrema_IsOnEdge && supp2 == BRepExtrema_IsVertex) || + (supp2 == BRepExtrema_IsOnEdge && supp1 == BRepExtrema_IsVertex)) { + relation = REL_COLLISION_EE; + } else { + } + } + + if (relation != REL_OK) { + return relation; + } + + TColStd_Array1OfInteger vertSol (1, nbVerts); + TopTools_Array1OfShape V1 (1, nbVerts); + TopTools_Array1OfShape V2 (1, nbVerts); + Standard_Integer ivs = 0; + for (sol = 1; sol <= nbSol; sol++) { + if (dst.SupportTypeShape1(sol) == BRepExtrema_IsVertex && + dst.SupportTypeShape2(sol) == BRepExtrema_IsVertex) { + TopoDS_Vertex Vcur = TopoDS::Vertex(dst.SupportOnShape1(sol)); + // Check, that this vertex is far enough from other solution vertices. + Standard_Integer ii = 1; + for (; ii <= ivs; ii++) { + if (BRepTools::Compare(TopoDS::Vertex(V1(ii)), Vcur)) { + continue; + } + } + ivs++; + vertSol(ivs) = sol; + V1(ivs) = Vcur; + V2(ivs) = dst.SupportOnShape2(sol); + } + } + + // As we deal only with quadrangles, + // 2, 3 or 4 vertex solutions can be found. + if (ivs <= 1) { + if (nbEdges > 0) { + return REL_COLLISION_FF; + } + return REL_NOT_CONNECTED; + } + if (ivs > 4) { + return REL_UNKNOWN; + } + + // Check sharing of coincident entities. + if (ivs == 2 || ivs == 3) { + // Map vertices and edges of the blocks + TopTools_IndexedDataMapOfShapeListOfShape MVE1, MVE2; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (theBlock1, TopAbs_VERTEX, TopAbs_EDGE, MVE1); + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (theBlock2, TopAbs_VERTEX, TopAbs_EDGE, MVE2); + + if (ivs == 2) { + // Find common edge + TopoDS_Shape anEdge1, anEdge2; + GEOMImpl_Block6Explorer::FindEdge(anEdge1, V1(1), V1(2), MVE1); + if (anEdge1.IsNull()) return REL_UNKNOWN; + + GEOMImpl_Block6Explorer::FindEdge(anEdge2, V2(1), V2(2), MVE2); + if (anEdge2.IsNull()) return REL_UNKNOWN; + + if (!anEdge1.IsSame(anEdge2)) return REL_NOT_GLUED; + + } else { // ivs == 3 + // Find common edges + Standard_Integer e1_v1 = 1; + Standard_Integer e1_v2 = 2; + Standard_Integer e2_v1 = 3; + Standard_Integer e2_v2 = 1; + + TopoDS_Shape anEdge11, anEdge12; + GEOMImpl_Block6Explorer::FindEdge(anEdge11, V1(e1_v1), V1(e1_v2), MVE1); + if (anEdge11.IsNull()) { + e1_v2 = 3; + e2_v1 = 2; + GEOMImpl_Block6Explorer::FindEdge(anEdge11, V1(e1_v1), V1(e1_v2), MVE1); + if (anEdge11.IsNull()) return REL_UNKNOWN; + } + GEOMImpl_Block6Explorer::FindEdge(anEdge12, V1(e2_v1), V1(e2_v2), MVE1); + if (anEdge12.IsNull()) { + e2_v2 = 5 - e2_v1; + GEOMImpl_Block6Explorer::FindEdge(anEdge12, V1(e2_v1), V1(e2_v2), MVE1); + if (anEdge12.IsNull()) return REL_UNKNOWN; + } + + TopoDS_Shape anEdge21, anEdge22; + GEOMImpl_Block6Explorer::FindEdge(anEdge21, V2(e1_v1), V2(e1_v2), MVE2); + if (anEdge21.IsNull()) return REL_UNKNOWN; + GEOMImpl_Block6Explorer::FindEdge(anEdge22, V2(e2_v1), V2(e2_v2), MVE2); + if (anEdge22.IsNull()) return REL_UNKNOWN; + + // Check of edges coincidence (with some precision) have to be done here + // if (!anEdge11.IsEqual(anEdge21)) return REL_UNKNOWN; + // if (!anEdge12.IsEqual(anEdge22)) return REL_UNKNOWN; + + // Check of edges sharing + if (!anEdge11.IsSame(anEdge21)) return REL_NOT_GLUED; + if (!anEdge12.IsSame(anEdge22)) return REL_NOT_GLUED; + } + } + + if (ivs == 4) { + // Map vertices and faces of the blocks + TopTools_IndexedDataMapOfShapeListOfShape MVF1, MVF2; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (theBlock1, TopAbs_VERTEX, TopAbs_FACE, MVF1); + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (theBlock2, TopAbs_VERTEX, TopAbs_FACE, MVF2); + + TopoDS_Shape aFace1, aFace2; + GEOMImpl_Block6Explorer::FindFace(aFace1, V1(1), V1(2), V1(3), V1(4), MVF1); + if (aFace1.IsNull()) return REL_UNKNOWN; + GEOMImpl_Block6Explorer::FindFace(aFace2, V2(1), V2(2), V2(3), V2(4), MVF2); + if (aFace2.IsNull()) return REL_UNKNOWN; + + // Check of faces coincidence (with some precision) have to be done here + // if (!aFace1.IsEqual(aFace2)) return REL_UNKNOWN; + + // Check of faces sharing + if (!aFace1.IsSame(aFace2)) return REL_NOT_GLUED; + } + + return REL_OK; +} + +void FindConnected (const Standard_Integer theBlockIndex, + const TColStd_Array2OfInteger& theRelations, + TColStd_MapOfInteger& theProcessedMap, + TColStd_MapOfInteger& theConnectedMap) +{ + theConnectedMap.Add(theBlockIndex); + theProcessedMap.Add(theBlockIndex); + + Standard_Integer nbBlocks = theRelations.ColLength(); + Standard_Integer col = 1; + for (; col <= nbBlocks; col++) { + if (theRelations(theBlockIndex, col) == REL_OK || + theRelations(theBlockIndex, col) == REL_NOT_GLUED) { + if (!theProcessedMap.Contains(col)) { + FindConnected(col, theRelations, theProcessedMap, theConnectedMap); + } + } + } +} + +Standard_Boolean HasAnyConnection (const Standard_Integer theBlockIndex, + const TColStd_MapOfInteger& theWith, + const TColStd_Array2OfInteger& theRelations, + TColStd_MapOfInteger& theProcessedMap) +{ + theProcessedMap.Add(theBlockIndex); + + Standard_Integer nbBlocks = theRelations.ColLength(); + Standard_Integer col = 1; + for (; col <= nbBlocks; col++) { + if (theRelations(theBlockIndex, col) != REL_NOT_CONNECTED) { + if (!theProcessedMap.Contains(col)) { + if (theWith.Contains(col)) + return Standard_True; + if (HasAnyConnection(col, theWith, theRelations, theProcessedMap)) + return Standard_True; + } + } + } + + return Standard_False; +} + +//============================================================================= +/*! + * CheckCompoundOfBlocksOld + */ +//============================================================================= +Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocksOld + (Handle(GEOM_Object) theCompound, + list& theErrors) +{ + SetErrorCode(KO); + + if (theCompound.IsNull()) return Standard_False; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + + Standard_Boolean isCompOfBlocks = Standard_True; + + // Map sub-shapes and their indices + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + + // 1. Report non-blocks + TopTools_ListOfShape NOT; // Not blocks + TopTools_ListOfShape DEG; // Hexahedral solids, having degenerated edges + TopTools_ListOfShape SEA; // Hexahedral solids, having seam edges + TopTools_ListOfShape BLO; // All blocks from the given compound + AddBlocksFromOld(aBlockOrComp, BLO, NOT, DEG, SEA); + + if (NOT.Extent() > 0) { + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = NOT_BLOCK; + TopTools_ListIteratorOfListOfShape it (NOT); + for (; it.More(); it.Next()) { + anErr.incriminated.push_back(anIndices.FindIndex(it.Value())); + } + theErrors.push_back(anErr); + } + + if (DEG.Extent() > 0 || SEA.Extent() > 0) { + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = EXTRA_EDGE; + + TopTools_ListIteratorOfListOfShape itDEG (DEG); + for (; itDEG.More(); itDEG.Next()) { + anErr.incriminated.push_back(anIndices.FindIndex(itDEG.Value())); + } + + TopTools_ListIteratorOfListOfShape itSEA (SEA); + for (; itSEA.More(); itSEA.Next()) { + anErr.incriminated.push_back(anIndices.FindIndex(itSEA.Value())); + } + + theErrors.push_back(anErr); + } + + Standard_Integer nbBlocks = BLO.Extent(); + if (nbBlocks == 0) { + isCompOfBlocks = Standard_False; + SetErrorCode(OK); + return isCompOfBlocks; + } + if (nbBlocks == 1) { + SetErrorCode(OK); + return isCompOfBlocks; + } + + // Convert list of blocks into array for easy and fast access + Standard_Integer ibl = 1; + TopTools_Array1OfShape aBlocks (1, nbBlocks); + TopTools_ListIteratorOfListOfShape BLOit (BLO); + for (; BLOit.More(); BLOit.Next(), ibl++) { + aBlocks.SetValue(ibl, BLOit.Value()); + } + + // 2. Find relations between all blocks, + // report connection errors (NOT_GLUED and INVALID_CONNECTION) + TColStd_Array2OfInteger aRelations (1, nbBlocks, 1, nbBlocks); + aRelations.Init(REL_NOT_CONNECTED); + + Standard_Integer row = 1; + for (row = 1; row <= nbBlocks; row++) { + TopoDS_Shape aBlock = aBlocks.Value(row); + + Standard_Integer col = row + 1; + for (; col <= nbBlocks; col++) { + Standard_Integer aRel = BlocksRelation(aBlock, aBlocks.Value(col)); + if (aRel != REL_NOT_CONNECTED) { + aRelations.SetValue(row, col, aRel); + aRelations.SetValue(col, row, aRel); + if (aRel == REL_NOT_GLUED) { + // report connection error + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = NOT_GLUED; + anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); + anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); + theErrors.push_back(anErr); + } else if (aRel == REL_COLLISION_VV || + aRel == REL_COLLISION_FF || + aRel == REL_COLLISION_EE || + aRel == REL_UNKNOWN) { + // report connection error + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = INVALID_CONNECTION; + anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); + anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); + theErrors.push_back(anErr); + } else { + } + } + } + } + + // 3. Find largest set of connected (good connection or not glued) blocks + TColStd_MapOfInteger aProcessedMap; + TColStd_MapOfInteger aLargestSet; + TColStd_MapOfInteger aCurrentSet; + for (ibl = 1; ibl <= nbBlocks; ibl++) { + if (!aProcessedMap.Contains(ibl)) { + aCurrentSet.Clear(); + FindConnected(ibl, aRelations, aProcessedMap, aCurrentSet); + if (aCurrentSet.Extent() > aLargestSet.Extent()) { + aLargestSet = aCurrentSet; + } + } + } + + // 4. Report all blocks, isolated from + BCError anErr; + anErr.error = NOT_CONNECTED; + Standard_Boolean hasIsolated = Standard_False; + for (ibl = 1; ibl <= nbBlocks; ibl++) { + if (!aLargestSet.Contains(ibl)) { + aProcessedMap.Clear(); + if (!HasAnyConnection(ibl, aLargestSet, aRelations, aProcessedMap)) { + // report connection absence + hasIsolated = Standard_True; + anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(ibl))); + } + } + } + if (hasIsolated) { + isCompOfBlocks = Standard_False; + theErrors.push_back(anErr); + } + + SetErrorCode(OK); + return isCompOfBlocks; +} + +//============================================================================= +/*! + * PrintBCErrors + */ +//============================================================================= +TCollection_AsciiString GEOMImpl_IBlocksOperations::PrintBCErrors + (Handle(GEOM_Object) theCompound, + const list& theErrors) +{ + TCollection_AsciiString aDescr; + + list::const_iterator errIt = theErrors.begin(); + int i = 0; + for (; errIt != theErrors.end(); i++, errIt++) { + BCError errStruct = *errIt; + + switch (errStruct.error) { + case NOT_BLOCK: + aDescr += "\n\tNot a Blocks: "; + break; + case EXTRA_EDGE: + aDescr += "\n\tHexahedral solids with degenerated and/or seam edges: "; + break; + case INVALID_CONNECTION: + aDescr += "\n\tInvalid connection between two blocks: "; + break; + case NOT_CONNECTED: + aDescr += "\n\tBlocks, not connected with main body: "; + break; + case NOT_GLUED: + aDescr += "\n\tNot glued blocks: "; + break; + default: + break; + } + + list sshList = errStruct.incriminated; + list::iterator sshIt = sshList.begin(); + int jj = 0; + for (; sshIt != sshList.end(); jj++, sshIt++) { + if (jj > 0) + aDescr += ", "; + aDescr += TCollection_AsciiString(*sshIt); + } + } + + return aDescr; +} + +//============================================================================= +/*! + * CheckCompoundOfBlocks + */ +//============================================================================= +Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks + (Handle(GEOM_Object) theCompound, + list& theErrors) +{ + SetErrorCode(KO); + + if (theCompound.IsNull()) return Standard_False; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + + Standard_Boolean isCompOfBlocks = Standard_True; + + // Map sub-shapes and their indices + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + + // 1. Separate blocks from non-blocks + TopTools_ListOfShape NOT; // Not blocks + TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges + TopTools_ListOfShape BLO; // All blocks from the given compound + AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT); + + // Report non-blocks + if (NOT.Extent() > 0) { + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = NOT_BLOCK; + TopTools_ListIteratorOfListOfShape it (NOT); + for (; it.More(); it.Next()) { + anErr.incriminated.push_back(anIndices.FindIndex(it.Value())); + } + theErrors.push_back(anErr); + } + + // Report solids, having degenerated and/or seam edges + if (EXT.Extent() > 0) { + isCompOfBlocks = Standard_False; + BCError anErr; + anErr.error = EXTRA_EDGE; + TopTools_ListIteratorOfListOfShape it (EXT); + for (; it.More(); it.Next()) { + anErr.incriminated.push_back(anIndices.FindIndex(it.Value())); + } + theErrors.push_back(anErr); + } + + Standard_Integer nbBlocks = BLO.Extent(); + if (nbBlocks == 0) { + isCompOfBlocks = Standard_False; + SetErrorCode(OK); + return isCompOfBlocks; + } + if (nbBlocks == 1) { + SetErrorCode(OK); + return isCompOfBlocks; + } + + // Prepare data for 2. and 3. + TColStd_Array2OfInteger aRelations (1, nbBlocks, 1, nbBlocks); + aRelations.Init(REL_NOT_CONNECTED); + + TopTools_IndexedMapOfShape mapBlocks; + + BRep_Builder BB; + TopoDS_Compound aComp; + BB.MakeCompound(aComp); + + TopTools_ListIteratorOfListOfShape BLOit (BLO); + for (; BLOit.More(); BLOit.Next()) { + mapBlocks.Add(BLOit.Value()); + BB.Add(aComp, BLOit.Value()); + } + + // 2. Find glued blocks (having shared faces) + TopTools_IndexedDataMapOfShapeListOfShape mapFaceBlocks; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (aComp, TopAbs_FACE, TopAbs_SOLID, mapFaceBlocks); + + Standard_Integer prevInd = 0, curInd = 0; + Standard_Integer ind = 1, nbFaces = mapFaceBlocks.Extent(); + for (; ind <= nbFaces; ind++) { + const TopTools_ListOfShape& aGluedBlocks = mapFaceBlocks.FindFromIndex(ind); + if (aGluedBlocks.Extent() > 1) { // Shared face found + TopTools_ListIteratorOfListOfShape aGluedBlocksIt (aGluedBlocks); + TopoDS_Shape prevBlock, curBlock; + for (; aGluedBlocksIt.More(); aGluedBlocksIt.Next()) { + curBlock = aGluedBlocksIt.Value(); + if (!prevBlock.IsNull()) { + prevInd = mapBlocks.FindIndex(prevBlock); + curInd = mapBlocks.FindIndex(curBlock); + aRelations.SetValue(prevInd, curInd, REL_OK); + aRelations.SetValue(curInd, prevInd, REL_OK); + } + prevBlock = curBlock; + } + } + } + + // 3. Find not glued blocks + GEOMAlgo_GlueAnalyser aGD; + + aGD.SetShape(aComp); + aGD.SetTolerance(Precision::Confusion()); + aGD.SetCheckGeometry(Standard_True); + aGD.Perform(); + + Standard_Integer iErr, iWrn; + iErr = aGD.ErrorStatus(); + if (iErr) { + SetErrorCode("Error in GEOMAlgo_GlueAnalyser"); + return isCompOfBlocks; + } + iWrn = aGD.WarningStatus(); + if (iWrn) { + MESSAGE("Warning in GEOMAlgo_GlueAnalyser"); + } + + // Report not glued blocks + if (aGD.HasSolidsToGlue()) { + isCompOfBlocks = Standard_False; + Standard_Integer aSx1Ind, aSx2Ind; + + const GEOMAlgo_ListOfCoupleOfShapes& aLCS = aGD.SolidsToGlue(); + GEOMAlgo_ListIteratorOfListOfCoupleOfShapes aItCS (aLCS); + for (; aItCS.More(); aItCS.Next()) { + const GEOMAlgo_CoupleOfShapes& aCS = aItCS.Value(); + const TopoDS_Shape& aSx1 = aCS.Shape1(); + const TopoDS_Shape& aSx2 = aCS.Shape2(); + + aSx1Ind = mapBlocks.FindIndex(aSx1); + aSx2Ind = mapBlocks.FindIndex(aSx2); + aRelations.SetValue(aSx1Ind, aSx2Ind, NOT_GLUED); + aRelations.SetValue(aSx2Ind, aSx1Ind, NOT_GLUED); + + BCError anErr; + anErr.error = NOT_GLUED; + anErr.incriminated.push_back(anIndices.FindIndex(aSx1)); + anErr.incriminated.push_back(anIndices.FindIndex(aSx2)); + theErrors.push_back(anErr); + } + } + + // 4. Find largest set of connected (good connection or not glued) blocks + Standard_Integer ibl = 1; + TColStd_MapOfInteger aProcessedMap; + TColStd_MapOfInteger aLargestSet; + TColStd_MapOfInteger aCurrentSet; + for (ibl = 1; ibl <= nbBlocks; ibl++) { + if (!aProcessedMap.Contains(ibl)) { + aCurrentSet.Clear(); + FindConnected(ibl, aRelations, aProcessedMap, aCurrentSet); + if (aCurrentSet.Extent() > aLargestSet.Extent()) { + aLargestSet = aCurrentSet; + } + } + } + + // 5. Report all blocks, isolated from + BCError anErr; + anErr.error = NOT_CONNECTED; + Standard_Boolean hasIsolated = Standard_False; + for (ibl = 1; ibl <= nbBlocks; ibl++) { + if (!aLargestSet.Contains(ibl)) { + aProcessedMap.Clear(); + if (!HasAnyConnection(ibl, aLargestSet, aRelations, aProcessedMap)) { + // report connection absence + hasIsolated = Standard_True; + anErr.incriminated.push_back(anIndices.FindIndex(mapBlocks.FindKey(ibl))); + } + } + } + if (hasIsolated) { + isCompOfBlocks = Standard_False; + theErrors.push_back(anErr); + } + + SetErrorCode(OK); + return isCompOfBlocks; +} + +//============================================================================= +/*! + * RemoveExtraEdges + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::RemoveExtraEdges + (Handle(GEOM_Object) theObject) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be fixed + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_REMOVE_EXTRA); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlockTrsf aTI (aFunction); + aTI.SetOriginal(aLastFunction); + + //Compute the fixed shape + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to remove extra edges of the given shape"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy + << " = geompy.RemoveExtraEdges(" << theObject << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * CheckAndImprove + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::CheckAndImprove + (Handle(GEOM_Object) theObject) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be fixed + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_COMPOUND_IMPROVE); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlockTrsf aTI (aFunction); + aTI.SetOriginal(aLastFunction); + + //Compute the fixed shape + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to improve the given blocks compound"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy + << " = geompy.CheckAndImprove(" << theObject << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * ExplodeCompoundOfBlocks + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IBlocksOperations::ExplodeCompoundOfBlocks + (Handle(GEOM_Object) theCompound, + const Standard_Integer theMinNbFaces, + const Standard_Integer theMaxNbFaces) +{ + SetErrorCode(KO); + + if (theCompound.IsNull()) return NULL; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + if (aBlockOrComp.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aBlocks = new TColStd_HSequenceOfTransient; + Handle(GEOM_Object) anObj; + Handle(GEOM_Function) aFunction; + + TopTools_MapOfShape mapShape; + TCollection_AsciiString anAsciiList, anEntry; + + // Map shapes + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + + // Explode + try { + TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape aSolid = exp.Current(); + + TopTools_MapOfShape mapFaces; + TopExp_Explorer expF (aSolid, TopAbs_FACE); + Standard_Integer nbFaces = 0; + for (; expF.More(); expF.Next()) { + if (mapFaces.Add(expF.Current())) { + nbFaces++; + } + } + + if (theMinNbFaces <= nbFaces && nbFaces <= theMaxNbFaces) { + anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aSolid)); + anObj = GetEngine()->AddSubShape(theCompound, anArray); + aBlocks->Append(anObj); + + //Make a Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + anAsciiList += anEntry + ", "; + } + } + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return aBlocks; + } + + if (aBlocks->IsEmpty()) { + SetErrorCode("There are no specified blocks in the given shape"); + return aBlocks; + } + + anAsciiList.Trunc(anAsciiList.Length() - 2); + + //The explode doesn't change object so no new function is required. + aFunction = theCompound->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t[" + << anAsciiList.ToCString() << "] = geompy.MakeBlockExplode(" + << theCompound << ", " << theMinNbFaces << ", " << theMaxNbFaces << ")"; + + SetErrorCode(OK); + return aBlocks; +} + +//============================================================================= +/*! + * GetBlockNearPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetBlockNearPoint + (Handle(GEOM_Object) theCompound, + Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + //New object + Handle(GEOM_Object) aResult; + + // Arguments + if (theCompound.IsNull() || thePoint.IsNull()) return NULL; + + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + if (aBlockOrComp.IsNull()) { + SetErrorCode("Compound is null"); + return NULL; + } + if (aBlockOrComp.ShapeType() != TopAbs_COMPOUND && + aBlockOrComp.ShapeType() != TopAbs_COMPSOLID) { + SetErrorCode("Shape to find block in is not a compound"); + return NULL; + } + + TopoDS_Shape anArg = thePoint->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Point is null"); + return NULL; + } + if (anArg.ShapeType() != TopAbs_VERTEX) { + SetErrorCode("Shape for block identification is not a vertex"); + return NULL; + } + + //Compute the Block value + try { + TopoDS_Shape aShape; + + TopoDS_Vertex aVert = TopoDS::Vertex(anArg); + gp_Pnt aPnt = BRep_Tool::Pnt(aVert); + Standard_Real PX, PY, PZ; + aPnt.Coord(PX, PY, PZ); + + // 1. Classify the point relatively each block + Standard_Integer nearest = 2, nbFound = 0; + TopTools_DataMapOfShapeInteger mapShapeDist; + TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID); + for (; exp.More(); exp.Next()) { + TopoDS_Shape aSolid = exp.Current(); + + if (!mapShapeDist.IsBound(aSolid)) { + Standard_Integer aDistance = 2; + + // 1.a. Classify relatively Bounding box + Standard_Real Xmin, Ymin, Zmin, Xmax, Ymax, Zmax; + Bnd_Box BB; + BRepBndLib::Add(aSolid, BB); + BB.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); + if (PX < Xmin || Xmax < PX || + PY < Ymin || Ymax < PY || + PZ < Zmin || Zmax < PZ) { + // OUT of bounding box + aDistance = 1; + } else { + // 1.b. Classify relatively the solid itself + BRepClass3d_SolidClassifier SC (aSolid, aPnt, Precision::Confusion()); + if (SC.State() == TopAbs_IN) { + aDistance = -1; + } else if (SC.State() == TopAbs_ON) { + aDistance = 0; + } else { // OUT + aDistance = 1; + } + } + + if (aDistance < nearest) { + nearest = aDistance; + aShape = aSolid; + nbFound = 1; + + // A first found block, containing the point inside, will be returned. + // It is the solution, if there are no intersecting blocks in the compound. + if (nearest == -1) break; + + } else if (aDistance == nearest) { + nbFound++; + } else { + } + + mapShapeDist.Bind(aSolid, aDistance); + } // if (!mapShapeDist.IsBound(aSolid)) + } + + // 2. Define block, containing the point or having minimum distance to it + if (nbFound > 1) { + if (nearest == 0) { + // The point is on boundary of some blocks and there are + // no blocks, having the point inside their volume + SetErrorCode("Multiple blocks near the given point are found"); + return NULL; + + } else if (nearest == 1) { + // The point is outside some blocks and there are + // no blocks, having the point inside or on boundary. + // We will get a nearest block + Standard_Real minDist = RealLast(); + TopTools_DataMapIteratorOfDataMapOfShapeInteger mapShapeDistIter (mapShapeDist); + for (; mapShapeDistIter.More(); mapShapeDistIter.Next()) { + if (mapShapeDistIter.Value() == 1) { + TopoDS_Shape aSolid = mapShapeDistIter.Key(); + BRepExtrema_DistShapeShape aDistTool (aVert, aSolid); + if (!aDistTool.IsDone()) { + SetErrorCode("Can not find a distance from the given point to one of blocks"); + return NULL; + } + Standard_Real aDist = aDistTool.Value(); + if (aDist < minDist) { + minDist = aDist; + aShape = aSolid; + } + } + } + } else { // nearest == -1 +// // The point is inside some blocks. +// // We will get a block with nearest center +// Standard_Real minDist = RealLast(); +// TopTools_DataMapIteratorOfDataMapOfShapeInteger mapShapeDistIter (mapShapeDist); +// for (; mapShapeDistIter.More(); mapShapeDistIter.Next()) { +// if (mapShapeDistIter.Value() == -1) { +// TopoDS_Shape aSolid = mapShapeDistIter.Key(); +// GProp_GProps aSystem; +// BRepGProp::VolumeProperties(aSolid, aSystem); +// gp_Pnt aCenterMass = aSystem.CentreOfMass(); +// +// Standard_Real aDist = aCenterMass.Distance(aPnt); +// if (aDist < minDist) { +// minDist = aDist; +// aShape = aSolid; +// } +// } +// } + } + } // if (nbFound > 1) + + if (nbFound == 0) { + SetErrorCode("There are no blocks near the given point"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theCompound, anArray); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetBlockNearPoint(" + << theCompound << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetBlockByParts + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetBlockByParts + (Handle(GEOM_Object) theCompound, + const Handle(TColStd_HSequenceOfTransient)& theParts) +{ + SetErrorCode(KO); + + Handle(GEOM_Object) aResult; + + if (theCompound.IsNull() || theParts.IsNull()) return NULL; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + if (aBlockOrComp.IsNull()) return NULL; + + //Get the parts + Standard_Integer argi, aLen = theParts->Length(); + TopTools_Array1OfShape anArgs (1, aLen); + TCollection_AsciiString anEntry, aPartsDescr; + for (argi = 1; argi <= aLen; argi++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theParts->Value(argi)); + Handle(GEOM_Function) aRef = anObj->GetLastFunction(); + if (aRef.IsNull()) return NULL; + + TopoDS_Shape anArg = aRef->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + anArgs(argi) = anArg; + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if (argi > 1) aPartsDescr += ", "; + aPartsDescr += anEntry; + } + + //Compute the Block value + try { + // 1. Explode compound on solids + TopTools_MapOfShape mapShape; + Standard_Integer nbSolids = 0; + TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbSolids++; + } + } + + mapShape.Clear(); + Standard_Integer ind = 1; + TopTools_Array1OfShape aSolids (1, nbSolids); + TColStd_Array1OfInteger aNbParts (1, nbSolids); + for (exp.Init(aBlockOrComp, TopAbs_SOLID); exp.More(); exp.Next(), ind++) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape aSolid = exp.Current(); + aSolids(ind) = aSolid; + aNbParts(ind) = 0; + + // 2. Define quantity of parts, contained in each solid + TopTools_IndexedMapOfShape aSubShapes; + TopExp::MapShapes(aSolid, aSubShapes); + for (argi = 1; argi <= aLen; argi++) { + if (aSubShapes.Contains(anArgs(argi))) { + aNbParts(ind)++; + } + } + } + } + + // 3. Define solid, containing maximum quantity of parts + Standard_Integer maxNb = 0, nbFound = 0; + TopoDS_Shape aShape; + for (ind = 1; ind <= nbSolids; ind++) { + if (aNbParts(ind) > maxNb) { + maxNb = aNbParts(ind); + aShape = aSolids(ind); + nbFound = 1; + } else if (aNbParts(ind) == maxNb) { + nbFound++; + } else { + } + } + if (nbFound > 1) { + SetErrorCode("Multiple blocks, containing maximum quantity of the given parts, are found"); + return NULL; + } else if (nbFound == 0) { + SetErrorCode("There are no blocks, containing the given parts"); + return NULL; + } else { + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aShape)); + aResult = GetEngine()->AddSubShape(theCompound, anArray); + } + } catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + Handle(GEOM_Function) aFunction = aResult->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetBlockByParts(" + << theCompound << ", [" << aPartsDescr.ToCString() << "])"; + + SetErrorCode(OK); + return aResult; +} + +//============================================================================= +/*! + * GetBlocksByParts + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IBlocksOperations::GetBlocksByParts + (Handle(GEOM_Object) theCompound, + const Handle(TColStd_HSequenceOfTransient)& theParts) +{ + SetErrorCode(KO); + + if (theCompound.IsNull() || theParts.IsNull()) return NULL; + TopoDS_Shape aBlockOrComp = theCompound->GetValue(); + if (aBlockOrComp.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aBlocks = new TColStd_HSequenceOfTransient; + Handle(GEOM_Object) anObj; + Handle(GEOM_Function) aFunction; + + //Get the parts + Standard_Integer argi, aLen = theParts->Length(); + TopTools_Array1OfShape anArgs (1, aLen); + TCollection_AsciiString anEntry, aPartsDescr, anAsciiList; + + for (argi = 1; argi <= aLen; argi++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theParts->Value(argi)); + Handle(GEOM_Function) aRef = anObj->GetLastFunction(); + if (aRef.IsNull()) return NULL; + + TopoDS_Shape anArg = aRef->GetValue(); + if (anArg.IsNull()) { + SetErrorCode("Null shape is given as argument"); + return NULL; + } + anArgs(argi) = anArg; + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + aPartsDescr += anEntry + ", "; + } + + //Get the Blocks + try { + TopTools_MapOfShape mapShape; + Standard_Integer nbSolids = 0; + TopExp_Explorer exp (aBlockOrComp, TopAbs_SOLID); + for (; exp.More(); exp.Next()) { + if (mapShape.Add(exp.Current())) { + nbSolids++; + } + } + + mapShape.Clear(); + Standard_Integer ind = 1; + TopTools_Array1OfShape aSolids (1, nbSolids); + TColStd_Array1OfInteger aNbParts (1, nbSolids); + for (exp.Init(aBlockOrComp, TopAbs_SOLID); exp.More(); exp.Next(), ind++) { + if (mapShape.Add(exp.Current())) { + TopoDS_Shape aSolid = exp.Current(); + aSolids(ind) = aSolid; + aNbParts(ind) = 0; + + // 2. Define quantity of parts, contained in each solid + TopTools_IndexedMapOfShape aSubShapes; + TopExp::MapShapes(aSolid, aSubShapes); + for (argi = 1; argi <= aLen; argi++) { + if (aSubShapes.Contains(anArgs(argi))) { + aNbParts(ind)++; + } + } + } + } + + // 3. Define solid, containing maximum quantity of parts + Standard_Integer maxNb = 0, nbFound = 0; + for (ind = 1; ind <= nbSolids; ind++) { + if (aNbParts(ind) > maxNb) { + maxNb = aNbParts(ind); + nbFound = 1; + } else if (aNbParts(ind) == maxNb) { + nbFound++; + } else { + } + } + if (nbFound == 0) { + SetErrorCode("There are no blocks, containing the given parts"); + return NULL; + } + + // Map shapes + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aBlockOrComp, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + + for (ind = 1; ind <= nbSolids; ind++) { + if (aNbParts(ind) == maxNb) { + anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aSolids(ind))); + anObj = GetEngine()->AddSubShape(theCompound, anArray); + aBlocks->Append(anObj); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + anAsciiList += anEntry + ", "; + if (aFunction.IsNull()) + aFunction = anObj->GetLastFunction(); + } + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + aPartsDescr.Trunc(aPartsDescr.Length() - 2); + anAsciiList.Trunc(anAsciiList.Length() - 2); + + GEOM::TPythonDump(aFunction) << "[" << anAsciiList.ToCString() + << "] = geompy.GetBlocksByParts(" << theCompound + << ", [" << aPartsDescr.ToCString() << "])"; + + SetErrorCode(OK); + return aBlocks; +} + +//============================================================================= +/*! + * MakeMultiTransformation1D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeMultiTransformation1D + (Handle(GEOM_Object) theObject, + const Standard_Integer theDirFace1, + const Standard_Integer theDirFace2, + const Standard_Integer theNbTimes) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_MULTI_TRANSFORM_1D); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlockTrsf aTI (aFunction); + aTI.SetOriginal(aLastFunction); + aTI.SetFace1U(theDirFace1); + aTI.SetFace2U(theDirFace2); + aTI.SetNbIterU(theNbTimes); + + //Compute the transformation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to make multi-transformation"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeMultiTransformation1D(" + << theObject << ", " << theDirFace1 << ", " << theDirFace2 << ", " << theNbTimes << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * MakeMultiTransformation2D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBlocksOperations::MakeMultiTransformation2D + (Handle(GEOM_Object) theObject, + const Standard_Integer theDirFace1U, + const Standard_Integer theDirFace2U, + const Standard_Integer theNbTimesU, + const Standard_Integer theDirFace1V, + const Standard_Integer theDirFace2V, + const Standard_Integer theNbTimesV) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_BlockDriver::GetID(), BLOCK_MULTI_TRANSFORM_2D); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BlockDriver::GetID()) return NULL; + + GEOMImpl_IBlockTrsf aTI (aFunction); + aTI.SetOriginal(aLastFunction); + aTI.SetFace1U(theDirFace1U); + aTI.SetFace2U(theDirFace2U); + aTI.SetNbIterU(theNbTimesU); + aTI.SetFace1V(theDirFace1V); + aTI.SetFace2V(theDirFace2V); + aTI.SetNbIterV(theNbTimesV); + + //Compute the transformation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Block driver failed to make multi-transformation"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeMultiTransformation2D(" + << theObject << ", " << theDirFace1U << ", " << theDirFace2U << ", " << theNbTimesU + << ", " << theDirFace1V << ", " << theDirFace2V << ", " << theNbTimesV << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Propagate + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IBlocksOperations::Propagate + (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return NULL; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + + TopTools_IndexedDataMapOfShapeListOfShape MEW; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (aShape, TopAbs_EDGE, TopAbs_WIRE, MEW); + Standard_Integer ie, nbEdges = MEW.Extent(); + + // Result + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + TopTools_MapOfShape mapAcceptedEdges; + TCollection_AsciiString aListRes, anEntry; + + for (ie = 1; ie <= nbEdges; ie++) { + TopoDS_Shape curE = MEW.FindKey(ie); + + if (mapAcceptedEdges.Contains(curE)) continue; + + // Build the chain + TopTools_ListOfShape currentChain; + TopTools_ListOfShape listPrevEdges; + + currentChain.Append(curE); + listPrevEdges.Append(curE); + mapAcceptedEdges.Add(curE); + + // Collect all edges pass by pass + while (listPrevEdges.Extent() > 0) { + // List of edges, added to chain on this cycle pass + TopTools_ListOfShape listCurEdges; + + // Find the next portion of edges + TopTools_ListIteratorOfListOfShape itE (listPrevEdges); + for (; itE.More(); itE.Next()) { + TopoDS_Shape anE = itE.Value(); + + // Iterate on faces, having edge + TopTools_ListIteratorOfListOfShape itW (MEW.FindFromKey(anE)); + for (; itW.More(); itW.Next()) { + TopoDS_Shape aW = itW.Value(); + TopoDS_Shape anOppE; + + BRepTools_WireExplorer aWE (TopoDS::Wire(aW)); + Standard_Integer nb = 1, found = 0; + TopTools_Array1OfShape anEdges (1,4); + for (; aWE.More(); aWE.Next(), nb++) { + if (nb > 4) { + found = 0; + break; + } + anEdges(nb) = aWE.Current(); + if (anEdges(nb).IsSame(anE)) found = nb; + } + + if (nb == 5 && found > 0) { + // Quadrangle face found, get an opposite edge + Standard_Integer opp = found + 2; + if (opp > 4) opp -= 4; + anOppE = anEdges(opp); + + if (!mapAcceptedEdges.Contains(anOppE)) { + // Add found edge to the chain + currentChain.Append(anOppE); + listCurEdges.Append(anOppE); + mapAcceptedEdges.Add(anOppE); + } + } // if (nb == 5 && found > 0) + } // for (; itF.More(); itF.Next()) + } // for (; itE.More(); itE.Next()) + + listPrevEdges = listCurEdges; + } // while (listPrevEdges.Extent() > 0) + + // Store the chain in the document + Handle(TColStd_HArray1OfInteger) anArray = + new TColStd_HArray1OfInteger (1, currentChain.Extent()); + + // Fill array of sub-shape indices + TopTools_ListIteratorOfListOfShape itSub (currentChain); + for (int index = 1; itSub.More(); itSub.Next(), ++index) { + int id = anIndices.FindIndex(itSub.Value()); + anArray->SetValue(index, id); + } + + // Add a new group object + Handle(GEOM_Object) aChain = GetEngine()->AddSubShape(theShape, anArray); + + // Set a GROUP type + aChain->SetType(GEOM_GROUP); + + // Set a sub shape type + TDF_Label aFreeLabel = aChain->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_EDGE); + + // Add the chain to the result + aSeq->Append(aChain); + + //Make a Python command + TDF_Tool::Entry(aChain->GetEntry(), anEntry); + aListRes += anEntry + ", "; + } + + if (aSeq->IsEmpty()) { + SetErrorCode("There are no quadrangle faces in the shape"); + return aSeq; + } + + aListRes.Trunc(aListRes.Length() - 2); + + // The Propagation doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + // Make a Python command + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t[" + << aListRes.ToCString() << "] = geompy.Propagate(" << theShape << ")"; + + SetErrorCode(OK); + return aSeq; +} diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx new file mode 100644 index 000000000..4b43078dc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -0,0 +1,171 @@ +// 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/ +// + +#ifndef _GEOMImpl_IBlocksOperations_HXX_ +#define _GEOMImpl_IBlocksOperations_HXX_ + +#include "GEOM_IOperations.hxx" + +#include +#include + +#include + +class GEOM_Engine; +class Handle(GEOM_Object); +class Handle(TColStd_HArray1OfInteger); + +class GEOMImpl_IBlocksOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IBlocksOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IBlocksOperations(); + + // Creation of blocks and block faces + Standard_EXPORT Handle(GEOM_Object) MakeQuad (Handle(GEOM_Object) theEdge1, + Handle(GEOM_Object) theEdge2, + Handle(GEOM_Object) theEdge3, + Handle(GEOM_Object) theEdge4); + + Standard_EXPORT Handle(GEOM_Object) MakeQuad2Edges (Handle(GEOM_Object) theEdge1, + Handle(GEOM_Object) theEdge2); + + Standard_EXPORT Handle(GEOM_Object) MakeQuad4Vertices (Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2, + Handle(GEOM_Object) thePoint3, + Handle(GEOM_Object) thePoint4); + + Standard_EXPORT Handle(GEOM_Object) MakeHexa (Handle(GEOM_Object) theFace1, + Handle(GEOM_Object) theFace2, + Handle(GEOM_Object) theFace3, + Handle(GEOM_Object) theFace4, + Handle(GEOM_Object) theFace5, + Handle(GEOM_Object) theFace6); + + Standard_EXPORT Handle(GEOM_Object) MakeHexa2Faces (Handle(GEOM_Object) theFace1, + Handle(GEOM_Object) theFace2); + + Standard_EXPORT Handle(GEOM_Object) MakeBlockCompound (Handle(GEOM_Object) theCompound); + + // Extract elements of blocks and blocks compounds + Standard_EXPORT Handle(GEOM_Object) GetPoint (Handle(GEOM_Object) theShape, + const Standard_Real theX, + const Standard_Real theY, + const Standard_Real theZ, + const Standard_Real theEpsilon); + + Standard_EXPORT Handle(GEOM_Object) GetEdge (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) GetEdgeNearPoint (Handle(GEOM_Object) theBlock, + Handle(GEOM_Object) thePoint); + + Standard_EXPORT Handle(GEOM_Object) GetFaceByPoints (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2, + Handle(GEOM_Object) thePoint3, + Handle(GEOM_Object) thePoint4); + + Standard_EXPORT Handle(GEOM_Object) GetFaceByEdges (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theEdge1, + Handle(GEOM_Object) theEdge2); + + Standard_EXPORT Handle(GEOM_Object) GetOppositeFace (Handle(GEOM_Object) theBlock, + Handle(GEOM_Object) theFace); + + Standard_EXPORT Handle(GEOM_Object) GetFaceNearPoint (Handle(GEOM_Object) theBlock, + Handle(GEOM_Object) thePoint); + + Standard_EXPORT Handle(GEOM_Object) GetFaceByNormale (Handle(GEOM_Object) theBlock, + Handle(GEOM_Object) theVector); + + // Check blocks compounds + Standard_EXPORT Standard_Boolean IsCompoundOfBlocks (Handle(GEOM_Object) theCompound, + const Standard_Integer theMinNbFaces, + const Standard_Integer theMaxNbFaces, + Standard_Integer& theNbBlocks); + + enum BCErrorType { + NOT_BLOCK, + EXTRA_EDGE, + INVALID_CONNECTION, + NOT_CONNECTED, + NOT_GLUED + }; + + struct BCError { + BCErrorType error; + list incriminated; + }; + + Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound, + list& theErrors); + + Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, + list& theErrors); + + Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, + const list& theErrors); + + Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape); + + Standard_EXPORT Handle(GEOM_Object) CheckAndImprove (Handle(GEOM_Object) theCompound); + + Standard_EXPORT static void AddBlocksFrom (const TopoDS_Shape& theShape, + TopTools_ListOfShape& BLO, + TopTools_ListOfShape& NOT, + TopTools_ListOfShape& EXT); + + // Extract blocks from blocks compounds + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks + (Handle(GEOM_Object) theCompound, + const Standard_Integer theMinNbFaces, + const Standard_Integer theMaxNbFaces); + + Standard_EXPORT Handle(GEOM_Object) GetBlockNearPoint (Handle(GEOM_Object) theCompound, + Handle(GEOM_Object) thePoint); + + Standard_EXPORT Handle(GEOM_Object) GetBlockByParts + (Handle(GEOM_Object) theCompound, + const Handle(TColStd_HSequenceOfTransient)& theParts); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetBlocksByParts + (Handle(GEOM_Object) theCompound, + const Handle(TColStd_HSequenceOfTransient)& theParts); + + // Operations on blocks with gluing of result + Standard_EXPORT Handle(GEOM_Object) MakeMultiTransformation1D (Handle(GEOM_Object) theBlock, + const Standard_Integer theDirFace1, + const Standard_Integer theDirFace2, + const Standard_Integer theNbTimes); + + Standard_EXPORT Handle(GEOM_Object) MakeMultiTransformation2D (Handle(GEOM_Object) theBlock, + const Standard_Integer theDirFace1U, + const Standard_Integer theDirFace2U, + const Standard_Integer theNbTimesU, + const Standard_Integer theDirFace1V, + const Standard_Integer theDirFace2V, + const Standard_Integer theNbTimesV); + + // Build groups for Propagation of 1D hypotheses + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) Propagate (Handle(GEOM_Object) theShape); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IBoolean.hxx b/src/GEOMImpl/GEOMImpl_IBoolean.hxx new file mode 100644 index 000000000..62cb8ddb7 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBoolean.hxx @@ -0,0 +1,43 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Common, Cut and Fuse creation. + + +#include "GEOM_Function.hxx" + +#define BOOL_ARG_SHAPE1 1 +#define BOOL_ARG_SHAPE2 2 + +class GEOMImpl_IBoolean +{ + public: + + GEOMImpl_IBoolean(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape1(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE1, theRef); } + void SetShape2(Handle(GEOM_Function) theRef) { _func->SetReference(BOOL_ARG_SHAPE2, theRef); } + + Handle(GEOM_Function) GetShape1() { return _func->GetReference(BOOL_ARG_SHAPE1); } + Handle(GEOM_Function) GetShape2() { return _func->GetReference(BOOL_ARG_SHAPE2); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx new file mode 100644 index 000000000..65037c7d4 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.cxx @@ -0,0 +1,349 @@ +// 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/ +// +#include + +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include + +#include "utilities.h" + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IBooleanOperations::GEOMImpl_IBooleanOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IBooleanOperations::~GEOMImpl_IBooleanOperations() +{ + MESSAGE("GEOMImpl_IBooleanOperations::~GEOMImpl_IBooleanOperations"); +} + + +//============================================================================= +/*! + * MakeBoolean + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeBoolean (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + Standard_Integer theOp) +{ + SetErrorCode(KO); + + if (theShape1.IsNull() || theShape2.IsNull()) return NULL; + + //Add a new Boolean object + Handle(GEOM_Object) aBool = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + + //Add a new Boolean function + Handle(GEOM_Function) aFunction; + if (theOp == 1) { + aFunction = aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_COMMON); + } else if (theOp == 2) { + aFunction = aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_CUT); + } else if (theOp == 3) { + aFunction = aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_FUSE); + } else if (theOp == 4) { + aFunction = aBool->AddFunction(GEOMImpl_BooleanDriver::GetID(), BOOLEAN_SECTION); + } else { + } + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_BooleanDriver::GetID()) return NULL; + + GEOMImpl_IBoolean aCI (aFunction); + + Handle(GEOM_Function) aRef1 = theShape1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = theShape2->GetLastFunction(); + + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aCI.SetShape1(aRef1); + aCI.SetShape2(aRef2); + + //Compute the Boolean value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Boolean 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 pd (aFunction); + pd << aBool; + if (theOp == 1) pd << " = geompy.MakeCommon("; + else if (theOp == 2) pd << " = geompy.MakeCut("; + else if (theOp == 3) pd << " = geompy.MakeFuse("; + else if (theOp == 4) pd << " = geompy.MakeSection("; + else {} + pd << theShape1 << ", " << theShape2 << ")"; + + SetErrorCode(OK); + return aBool; +} + +//============================================================================= +/*! + * MakePartition + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakePartition + (const Handle(TColStd_HSequenceOfTransient)& theShapes, + const Handle(TColStd_HSequenceOfTransient)& theTools, + const Handle(TColStd_HSequenceOfTransient)& theKeepIns, + const Handle(TColStd_HSequenceOfTransient)& theRemoveIns, + const Standard_Integer theLimit, + const Standard_Boolean theRemoveWebs, + const Handle(TColStd_HArray1OfInteger)& theMaterials) +{ + SetErrorCode(KO); + + //Add a new Partition object + Handle(GEOM_Object) aPartition = GetEngine()->AddObject(GetDocID(), GEOM_PARTITION); + + //Add a new Partition function + Handle(GEOM_Function) aFunction = + aPartition->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_PARTITION); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; + + GEOMImpl_IPartition aCI (aFunction); + +// int aLen = theShapes.size(); +// aCI.SetLength(aLen); + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aToolsSeq = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aKeepInsSeq = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aRemInsSeq = new TColStd_HSequenceOfTransient; + + Standard_Integer ind, aLen; + TCollection_AsciiString anEntry; + TCollection_AsciiString aShapesDescr, aToolsDescr, aKeepInsDescr, aRemoveInsDescr; + + // Shapes + aLen = theShapes->Length(); + for (ind = 1; ind <= aLen; ind++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theShapes->Value(ind)); + Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; + } + aShapesSeq->Append(aRefSh); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if (ind > 1) aShapesDescr += ", "; + aShapesDescr += anEntry; + } + aCI.SetShapes(aShapesSeq); + + // Tools + aLen = theTools->Length(); + for (ind = 1; ind <= aLen; ind++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theTools->Value(ind)); + Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL tool shape for Partition"); + return NULL; + } + aToolsSeq->Append(aRefSh); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if (ind > 1) aToolsDescr += ", "; + aToolsDescr += anEntry; + } + aCI.SetTools(aToolsSeq); + + // Keep Inside + aLen = theKeepIns->Length(); + for (ind = 1; ind <= aLen; ind++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theKeepIns->Value(ind)); + Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; + } + aKeepInsSeq->Append(aRefSh); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if (ind > 1) aKeepInsDescr += ", "; + aKeepInsDescr += anEntry; + } + aCI.SetKeepIns(aKeepInsSeq); + + // Remove Inside + aLen = theRemoveIns->Length(); + for (ind = 1; ind <= aLen; ind++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theRemoveIns->Value(ind)); + Handle(GEOM_Function) aRefSh = anObj->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL shape for Partition"); + return NULL; + } + aRemInsSeq->Append(aRefSh); + + // For Python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if (ind > 1) aRemoveInsDescr += ", "; + aRemoveInsDescr += anEntry; + } + aCI.SetRemoveIns(aRemInsSeq); + + // Limit + aCI.SetLimit(theLimit); + + // Materials + if (theRemoveWebs) { + if (theMaterials.IsNull()) { + Handle(TColStd_HArray1OfInteger) aMaterials = + new TColStd_HArray1OfInteger (1, aShapesSeq->Length()); + aCI.SetMaterials(aMaterials); + } else { + aCI.SetMaterials(theMaterials); + } + } + + //Compute the Partition + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Partition 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 pd (aFunction); + pd << aPartition << " = geompy.MakePartition(["; + // Shapes, Tools + pd << aShapesDescr.ToCString() << "], [" << aToolsDescr.ToCString() << "], ["; + // Keep Ins, Remove Ins + pd << aKeepInsDescr.ToCString() << "], [" << aRemoveInsDescr.ToCString() << "], "; + // Limit, Remove Webs + pd << theLimit << ", " << (int)theRemoveWebs << ", ["; + // Materials + if (theMaterials->Length() > 0) { + int i = theMaterials->Lower(); + pd << theMaterials->Value(i); + i++; + for (; i <= theMaterials->Upper(); i++) { + pd << ", " << theMaterials->Value(i); + } + } + pd << "])"; + + SetErrorCode(OK); + return aPartition; +} + +//============================================================================= +/*! + * MakeHalfPartition + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBooleanOperations::MakeHalfPartition + (Handle(GEOM_Object) theShape, Handle(GEOM_Object) thePlane) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || thePlane.IsNull()) return NULL; + + //Add a new Boolean object + Handle(GEOM_Object) aPart = GetEngine()->AddObject(GetDocID(), GEOM_BOOLEAN); + + //Add a new Partition function + Handle(GEOM_Function) aFunction = + aPart->AddFunction(GEOMImpl_PartitionDriver::GetID(), PARTITION_HALF); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PartitionDriver::GetID()) return NULL; + + GEOMImpl_IPartition aCI (aFunction); + + Handle(GEOM_Function) aRef1 = theShape->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePlane->GetLastFunction(); + + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aCI.SetShape(aRef1); + aCI.SetPlane(aRef2); + + //Compute the Partition value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Partition 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) << aPart << " = geompy.MakeHalfPartition(" + << theShape << ", " << thePlane << ")"; + + SetErrorCode(OK); + return aPart; +} diff --git a/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx b/src/GEOMImpl/GEOMImpl_IBooleanOperations.hxx new file mode 100644 index 000000000..c0d264b45 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBooleanOperations.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/ +// + +#ifndef _GEOMImpl_IBooleanOperations_HXX_ +#define _GEOMImpl_IBooleanOperations_HXX_ + +#include "GEOM_IOperations.hxx" + +//#include "TColStd_HSequenceOfTransient.hxx" + +#include "list" + +class GEOM_Engine; +class Handle(GEOM_Object); +class Handle(TColStd_HArray1OfInteger); + +class GEOMImpl_IBooleanOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IBooleanOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IBooleanOperations(); + + Standard_EXPORT Handle(GEOM_Object) MakeBoolean (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + Standard_Integer theOp); + + Standard_EXPORT Handle(GEOM_Object) MakePartition (const Handle(TColStd_HSequenceOfTransient)& theShapes, + const Handle(TColStd_HSequenceOfTransient)& theTools, + const Handle(TColStd_HSequenceOfTransient)& theKeepInside, + const Handle(TColStd_HSequenceOfTransient)& theRemoveInside, + const Standard_Integer theLimit, + const Standard_Boolean theRemoveWebs, + const Handle(TColStd_HArray1OfInteger)& theMaterials); + + Standard_EXPORT Handle(GEOM_Object) MakeHalfPartition (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) thePlane); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IBox.hxx b/src/GEOMImpl/GEOMImpl_IBox.hxx new file mode 100644 index 000000000..2cffca44b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IBox.hxx @@ -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/ +// +//NOTE: This is an intreface to a function for the Box creation. + + +#include "GEOM_Function.hxx" + +#define BOX_ARG_DX 1 +#define BOX_ARG_DY 2 +#define BOX_ARG_DZ 3 +#define BOX_ARG_REF1 4 +#define BOX_ARG_REF2 5 + +class GEOMImpl_IBox +{ + public: + + GEOMImpl_IBox(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetDX(double theX) { _func->SetReal(BOX_ARG_DX, theX); } + + double GetDX() { return _func->GetReal(BOX_ARG_DX); } + + void SetDY(double theY) { _func->SetReal(BOX_ARG_DY, theY); } + + double GetDY() { return _func->GetReal(BOX_ARG_DY); } + + void SetDZ(double theZ) { _func->SetReal(BOX_ARG_DZ, theZ); } + + double GetDZ() { return _func->GetReal(BOX_ARG_DZ); } + + void SetRef1(Handle(GEOM_Function) theRefPoint1) { _func->SetReference(BOX_ARG_REF1, theRefPoint1); } + + Handle(GEOM_Function) GetRef1() { return _func->GetReference(BOX_ARG_REF1); } + + void SetRef2(Handle(GEOM_Function) theRefPoint2) { _func->SetReference(BOX_ARG_REF2, theRefPoint2); } + + Handle(GEOM_Function) GetRef2() { return _func->GetReference(BOX_ARG_REF2); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IChamfer.hxx b/src/GEOMImpl/GEOMImpl_IChamfer.hxx new file mode 100644 index 000000000..13c62df6f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IChamfer.hxx @@ -0,0 +1,67 @@ +// 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/ +// +//NOTE: This is an interface to a function for the Chamfer and creation. + + +#include "GEOM_Function.hxx" + +#define CHAM_ARG_SH 1 +#define CHAM_ARG_D1 2 +#define CHAM_ARG_D2 3 +#define CHAM_ARG_LENG 4 +#define CHAM_ARG_LAST 4 + +class GEOMImpl_IChamfer +{ + public: + + GEOMImpl_IChamfer(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theRef) { _func->SetReference(CHAM_ARG_SH, theRef); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(CHAM_ARG_SH); } + + void SetD (double theD) { _func->SetReal(CHAM_ARG_D1, theD); } + void SetD1(double theD) { _func->SetReal(CHAM_ARG_D1, theD); } + void SetD2(double theD) { _func->SetReal(CHAM_ARG_D2, theD); } + + double GetD () { return _func->GetReal(CHAM_ARG_D1); } + double GetD1() { return _func->GetReal(CHAM_ARG_D1); } + double GetD2() { return _func->GetReal(CHAM_ARG_D2); } + + void SetLength(int theLen) { _func->SetInteger(CHAM_ARG_LENG, theLen); } + + int GetLength() { return _func->GetInteger(CHAM_ARG_LENG); } + + void SetFace(int theInd, int theFace) + { _func->SetInteger(CHAM_ARG_LAST + theInd, theFace); } + void SetFace1(int theFace) + { _func->SetInteger(CHAM_ARG_LAST + 1, theFace); } + void SetFace2(int theFace) + { _func->SetInteger(CHAM_ARG_LAST + 2, theFace); } + + int GetFace(int theInd) { return _func->GetInteger(CHAM_ARG_LAST + theInd); } + int GetFace1() { return _func->GetInteger(CHAM_ARG_LAST + 1); } + int GetFace2() { return _func->GetInteger(CHAM_ARG_LAST + 2); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICircle.hxx b/src/GEOMImpl/GEOMImpl_ICircle.hxx new file mode 100644 index 000000000..892f534fb --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICircle.hxx @@ -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/ +// +//NOTE: This is an intreface to a function for the Circle creation. + + +#include "GEOM_Function.hxx" + +#define CIRC_ARG_P1 1 +#define CIRC_ARG_P2 2 +#define CIRC_ARG_P3 3 + +#define CIRC_ARG_CC 4 +#define CIRC_ARG_VV 5 +#define CIRC_ARG_RR 6 + +class GEOMImpl_ICircle +{ + public: + + GEOMImpl_ICircle(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetPoint1(Handle(GEOM_Function) theP) { _func->SetReference(CIRC_ARG_P1, theP); } + void SetPoint2(Handle(GEOM_Function) theP) { _func->SetReference(CIRC_ARG_P2, theP); } + void SetPoint3(Handle(GEOM_Function) theP) { _func->SetReference(CIRC_ARG_P3, theP); } + + void SetCenter(Handle(GEOM_Function) theP) { _func->SetReference(CIRC_ARG_CC, theP); } + void SetVector(Handle(GEOM_Function) theV) { _func->SetReference(CIRC_ARG_VV, theV); } + + void SetRadius(double theR) { _func->SetReal(CIRC_ARG_RR, theR); } + + Handle(GEOM_Function) GetPoint1() { return _func->GetReference(CIRC_ARG_P1); } + Handle(GEOM_Function) GetPoint2() { return _func->GetReference(CIRC_ARG_P2); } + Handle(GEOM_Function) GetPoint3() { return _func->GetReference(CIRC_ARG_P3); } + + Handle(GEOM_Function) GetCenter() { return _func->GetReference(CIRC_ARG_CC); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(CIRC_ARG_VV); } + + double GetRadius() { return _func->GetReal(CIRC_ARG_RR); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICone.hxx b/src/GEOMImpl/GEOMImpl_ICone.hxx new file mode 100644 index 000000000..2ed1c1cdc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICone.hxx @@ -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/ +// +//NOTE: This is an intreface to a function for the Cone creation. + + +#include "GEOM_Function.hxx" + +#define CONE_ARG_R1 1 +#define CONE_ARG_R2 2 +#define CONE_ARG_H 3 +#define CONE_ARG_PNT 4 +#define CONE_ARG_VEC 5 + +class GEOMImpl_ICone +{ + public: + + GEOMImpl_ICone(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetR1(double theR) { _func->SetReal(CONE_ARG_R1, theR); } + + double GetR1() { return _func->GetReal(CONE_ARG_R1); } + + void SetR2(double theR) { _func->SetReal(CONE_ARG_R2, theR); } + + double GetR2() { return _func->GetReal(CONE_ARG_R2); } + + void SetH(double theH) { _func->SetReal(CONE_ARG_H, theH); } + + double GetH() { return _func->GetReal(CONE_ARG_H); } + + void SetPoint(Handle(GEOM_Function) theRefPoint) { _func->SetReference(CONE_ARG_PNT, theRefPoint); } + + Handle(GEOM_Function) GetPoint() { return _func->GetReference(CONE_ARG_PNT); } + + void SetVector(Handle(GEOM_Function) theRefVector) { _func->SetReference(CONE_ARG_VEC, theRefVector); } + + Handle(GEOM_Function) GetVector() { return _func->GetReference(CONE_ARG_VEC); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICopy.hxx b/src/GEOMImpl/GEOMImpl_ICopy.hxx new file mode 100644 index 000000000..7f63bdf27 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICopy.hxx @@ -0,0 +1,40 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Copy operation. + + +#include "GEOM_Function.hxx" + +#define COPY_ARG_REF 1 + +class GEOMImpl_ICopy +{ + public: + + GEOMImpl_ICopy(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOriginal(Handle(GEOM_Function) theOriginal) { _func->SetReference(COPY_ARG_REF, theOriginal); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(COPY_ARG_REF); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx new file mode 100644 index 000000000..e6162262b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.cxx @@ -0,0 +1,600 @@ +// 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/ +// +#include + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "utilities.h" + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_ICurvesOperations::GEOMImpl_ICurvesOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations() +{ + MESSAGE("GEOMImpl_ICurvesOperations::~GEOMImpl_ICurvesOperations"); +} + + +//============================================================================= +/*! + * MakePolyline + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakePolyline (list thePoints) +{ + SetErrorCode(KO); + + //Add a new Polyline object + Handle(GEOM_Object) aPolyline = GetEngine()->AddObject(GetDocID(), GEOM_POLYLINE); + + //Add a new Polyline function for creation a polyline relatively to points set + Handle(GEOM_Function) aFunction = + aPolyline->AddFunction(GEOMImpl_PolylineDriver::GetID(), POLYLINE_POINTS); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PolylineDriver::GetID()) return NULL; + + GEOMImpl_IPolyline aCI (aFunction); + + int aLen = thePoints.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = thePoints.begin(); + for (; it != thePoints.end(); it++, ind++) { + Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction(); + if (aRefPnt.IsNull()) { + SetErrorCode("NULL point for Polyline"); + return NULL; + } + aCI.SetPoint(ind, aRefPnt); + } + + //Compute the Polyline value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Polyline 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 pd (aFunction); + pd << aPolyline << " = geompy.MakePolyline(["; + + it = thePoints.begin(); + pd << (*it++); + while (it != thePoints.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aPolyline; +} + +//============================================================================= +/*! + * MakeCircleThreePnt + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCircleThreePnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull() || thePnt3.IsNull()) return NULL; + + //Add a new Circle object + Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE); + + //Add a new Circle function for creation a circle relatively to three points + Handle(GEOM_Function) aFunction = + aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_THREE_PNT); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL; + + GEOMImpl_ICircle 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 Circle value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Circle 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) << aCircle << " = geompy.MakeCircleThreePnt(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")"; + + SetErrorCode(OK); + return aCircle; +} + +//============================================================================= +/*! + * MakeCirclePntVecR + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeCirclePntVecR + (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, double theR) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Circle object + Handle(GEOM_Object) aCircle = GetEngine()->AddObject(GetDocID(), GEOM_CIRCLE); + + //Add a new Circle function for creation a circle relatively to point and vector + Handle(GEOM_Function) aFunction = + aCircle->AddFunction(GEOMImpl_CircleDriver::GetID(), CIRCLE_PNT_VEC_R); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_CircleDriver::GetID()) return NULL; + + GEOMImpl_ICircle aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetCenter(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetRadius(theR); + + //Compute the Circle value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Circle 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) << aCircle << " = geompy.MakeCircle(" + << thePnt << ", " << theVec << ", " << theR << ")"; + + SetErrorCode(OK); + return aCircle; +} + +//============================================================================= +/*! + * MakeEllipse + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeEllipse + (Handle(GEOM_Object) thePnt, Handle(GEOM_Object) theVec, + double theRMajor, double theRMinor) +{ + SetErrorCode(KO); + + if (thePnt.IsNull() || theVec.IsNull()) return NULL; + + //Add a new Ellipse object + Handle(GEOM_Object) anEll = GetEngine()->AddObject(GetDocID(), GEOM_ELLIPSE); + + //Add a new Ellipse function + Handle(GEOM_Function) aFunction = + anEll->AddFunction(GEOMImpl_EllipseDriver::GetID(), ELLIPSE_PNT_VEC_RR); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_EllipseDriver::GetID()) return NULL; + + GEOMImpl_IEllipse aCI (aFunction); + + Handle(GEOM_Function) aRefPnt = thePnt->GetLastFunction(); + Handle(GEOM_Function) aRefVec = theVec->GetLastFunction(); + + if (aRefPnt.IsNull() || aRefVec.IsNull()) return NULL; + + aCI.SetCenter(aRefPnt); + aCI.SetVector(aRefVec); + aCI.SetRMajor(theRMajor); + aCI.SetRMinor(theRMinor); + + //Compute the Ellipse value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Ellipse 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) << anEll << " = geompy.MakeEllipse(" + << thePnt << ", " << theVec << ", " << theRMajor << ", " << theRMinor << ")"; + + SetErrorCode(OK); + return anEll; +} + +//============================================================================= +/*! + * MakeArc + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeArc (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3) +{ + 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_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 (!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.MakeArc(" + << thePnt1 << ", " << thePnt2 << ", " << thePnt3 << ")"; + + SetErrorCode(OK); + return anArc; +} + +//============================================================================= +/*! + * MakeSplineBezier + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineBezier + (list thePoints) +{ + SetErrorCode(KO); + + //Add a new Spline object + Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE); + + //Add a new Spline function for creation a bezier curve relatively to points set + Handle(GEOM_Function) aFunction = + aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_BEZIER); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL; + + GEOMImpl_ISpline aCI (aFunction); + + int aLen = thePoints.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = thePoints.begin(); + for (; it != thePoints.end(); it++, ind++) { + Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction(); + + if (aRefPnt.IsNull()) return NULL; + + aCI.SetPoint(ind, aRefPnt); + } + + //Compute the Spline value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Spline 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 pd (aFunction); + pd << aSpline << " = geompy.MakeBezier(["; + + it = thePoints.begin(); + pd << (*it++); + while (it != thePoints.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aSpline; +} + +//============================================================================= +/*! + * MakeSplineInterpolation + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSplineInterpolation + (list thePoints) +{ + SetErrorCode(KO); + + //Add a new Spline object + Handle(GEOM_Object) aSpline = GetEngine()->AddObject(GetDocID(), GEOM_SPLINE); + + //Add a new Spline function for creation a bezier curve relatively to points set + Handle(GEOM_Function) aFunction = + aSpline->AddFunction(GEOMImpl_SplineDriver::GetID(), SPLINE_INTERPOLATION); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SplineDriver::GetID()) return NULL; + + GEOMImpl_ISpline aCI (aFunction); + + int aLen = thePoints.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = thePoints.begin(); + for (; it != thePoints.end(); it++, ind++) { + Handle(GEOM_Function) aRefPnt = (*it)->GetLastFunction(); + + if (aRefPnt.IsNull()) return NULL; + + aCI.SetPoint(ind, aRefPnt); + } + + //Compute the Spline value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Spline 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 pd (aFunction); + pd << aSpline << " = geompy.MakeInterpol(["; + + it = thePoints.begin(); + pd << (*it++); + while (it != thePoints.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aSpline; +} + +//============================================================================= +/*! + * MakeSketcher + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher + (const TCollection_AsciiString& theCommand, + list theWorkingPlane) +{ + SetErrorCode(KO); + + if (theCommand.IsEmpty()) return NULL; + + //Add a new Sketcher object + Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER); + + //Add a new Sketcher function + Handle(GEOM_Function) aFunction = + aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_NINE_DOUBLS); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL; + + GEOMImpl_ISketcher aCI (aFunction); + + aCI.SetCommand(theCommand); + + int ind = 1; + list::iterator it = theWorkingPlane.begin(); + for (; it != theWorkingPlane.end(); it++, ind++) + aCI.SetWorkingPlane(ind, *it); + + //Compute the Sketcher value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Sketcher 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 pd (aFunction); + pd << aSketcher << " = geompy.MakeSketcher(\"" << theCommand.ToCString() << "\", ["; + + it = theWorkingPlane.begin(); + pd << (*it++); + while (it != theWorkingPlane.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aSketcher; +} + +//============================================================================= +/*! + * MakeSketcherOnPlane + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane + (const TCollection_AsciiString& theCommand, + Handle(GEOM_Object) theWorkingPlane) +{ + SetErrorCode(KO); + + if (theCommand.IsEmpty()) return NULL; + + //Add a new Sketcher object + Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_SKETCHER); + + //Add a new Sketcher function + Handle(GEOM_Function) aFunction = + aSketcher->AddFunction(GEOMImpl_SketcherDriver::GetID(), SKETCHER_PLANE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_SketcherDriver::GetID()) return NULL; + + GEOMImpl_ISketcher aCI (aFunction); + aCI.SetCommand(theCommand); + + Handle(GEOM_Function) aRefPlane = theWorkingPlane->GetLastFunction(); + if (aRefPlane.IsNull()) return NULL; + aCI.SetWorkingPlane( aRefPlane ); + + //Compute the Sketcher value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Sketcher 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) << aSketcher << " = geompy.MakeSketcherOnPlane(\"" + << theCommand.ToCString() << "\", " << theWorkingPlane << " )"; + + SetErrorCode(OK); + return aSketcher; +} diff --git a/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx new file mode 100644 index 000000000..9673f68cc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICurvesOperations.hxx @@ -0,0 +1,64 @@ +// 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/ +// +using namespace std; + +#ifndef _GEOMImpl_ICurvesOperations_HXX_ +#define _GEOMImpl_ICurvesOperations_HXX_ + +#include "GEOM_IOperations.hxx" + +#include + +#include + +class GEOM_Engine; +class Handle(GEOM_Object); + +class GEOMImpl_ICurvesOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_ICurvesOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_ICurvesOperations(); + + Standard_EXPORT Handle(GEOM_Object) MakePolyline (list thePoints); + + Standard_EXPORT Handle(GEOM_Object) MakeCircleThreePnt (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3); + Standard_EXPORT Handle(GEOM_Object) MakeCirclePntVecR (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, double theR); + + Standard_EXPORT Handle(GEOM_Object) MakeEllipse (Handle(GEOM_Object) thePnt, + Handle(GEOM_Object) theVec, + double theRMajor, double theRMinor); + + Standard_EXPORT Handle(GEOM_Object) MakeArc (Handle(GEOM_Object) thePnt1, + Handle(GEOM_Object) thePnt2, + Handle(GEOM_Object) thePnt3); + + Standard_EXPORT Handle(GEOM_Object) MakeSplineBezier (list thePoints); + Standard_EXPORT Handle(GEOM_Object) MakeSplineInterpolation (list thePoints); + + Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const TCollection_AsciiString& theCommand, + list theWorkingPlane); + Standard_EXPORT Handle(GEOM_Object) MakeSketcherOnPlane (const TCollection_AsciiString& theCommand, + Handle(GEOM_Object) theWorkingPlane); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ICylinder.hxx b/src/GEOMImpl/GEOMImpl_ICylinder.hxx new file mode 100644 index 000000000..91c3f0540 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ICylinder.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/ +// +//NOTE: This is an intreface to a function for the Cylinder creation. + + +#include "GEOM_Function.hxx" + +#define CYL_ARG_R 1 +#define CYL_ARG_H 2 +#define CYL_ARG_PNT 3 +#define CYL_ARG_VEC 4 + +class GEOMImpl_ICylinder +{ + public: + + GEOMImpl_ICylinder(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetR(double theR) { _func->SetReal(CYL_ARG_R, theR); } + + double GetR() { return _func->GetReal(CYL_ARG_R); } + + void SetH(double theH) { _func->SetReal(CYL_ARG_H, theH); } + + double GetH() { return _func->GetReal(CYL_ARG_H); } + + void SetPoint(Handle(GEOM_Function) theRefPoint) { _func->SetReference(CYL_ARG_PNT, theRefPoint); } + + Handle(GEOM_Function) GetPoint() { return _func->GetReference(CYL_ARG_PNT); } + + void SetVector(Handle(GEOM_Function) theRefVector) { _func->SetReference(CYL_ARG_VEC, theRefVector); } + + Handle(GEOM_Function) GetVector() { return _func->GetReference(CYL_ARG_VEC); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IEllipse.hxx b/src/GEOMImpl/GEOMImpl_IEllipse.hxx new file mode 100644 index 000000000..1c6060ed7 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IEllipse.hxx @@ -0,0 +1,51 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Ellipse creation. + + +#include "GEOM_Function.hxx" + +#define ELLIPS_ARG_CC 1 +#define ELLIPS_ARG_VV 2 +#define ELLIPS_ARG_RMAJ 3 +#define ELLIPS_ARG_RMIN 4 + +class GEOMImpl_IEllipse +{ + public: + + GEOMImpl_IEllipse(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetCenter(Handle(GEOM_Function) theP) { _func->SetReference(ELLIPS_ARG_CC, theP); } + void SetVector(Handle(GEOM_Function) theV) { _func->SetReference(ELLIPS_ARG_VV, theV); } + + void SetRMajor(double theR) { _func->SetReal(ELLIPS_ARG_RMAJ, theR); } + void SetRMinor(double theR) { _func->SetReal(ELLIPS_ARG_RMIN, theR); } + + Handle(GEOM_Function) GetCenter() { return _func->GetReference(ELLIPS_ARG_CC); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(ELLIPS_ARG_VV); } + + double GetRMajor() { return _func->GetReal(ELLIPS_ARG_RMAJ); } + double GetRMinor() { return _func->GetReal(ELLIPS_ARG_RMIN); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IFillet.hxx b/src/GEOMImpl/GEOMImpl_IFillet.hxx new file mode 100644 index 000000000..2bd5df2d3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IFillet.hxx @@ -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/ +// +//NOTE: This is an interface to a function for the Fillet and creation. + + +#include "GEOM_Function.hxx" + +#define FILLET_ARG_SH 1 +#define FILLET_ARG_R 2 +#define FILLET_ARG_LENG 3 +#define FILLET_ARG_LAST 3 + +class GEOMImpl_IFillet +{ + public: + + GEOMImpl_IFillet(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theRef) { _func->SetReference(FILLET_ARG_SH, theRef); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(FILLET_ARG_SH); } + + void SetR(double theR) { _func->SetReal(FILLET_ARG_R, theR); } + + double GetR() { return _func->GetReal(FILLET_ARG_R); } + + void SetLength(int theLen) { _func->SetInteger(FILLET_ARG_LENG, theLen); } + + int GetLength() { return _func->GetInteger(FILLET_ARG_LENG); } + + void SetEdge(int theInd, int theEdge) + { _func->SetInteger(FILLET_ARG_LAST + theInd, theEdge); } + void SetFace(int theInd, int theFace) + { _func->SetInteger(FILLET_ARG_LAST + theInd, theFace); } + + int GetEdge(int theInd) { return _func->GetInteger(FILLET_ARG_LAST + theInd); } + int GetFace(int theInd) { return _func->GetInteger(FILLET_ARG_LAST + theInd); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IFilling.hxx b/src/GEOMImpl/GEOMImpl_IFilling.hxx new file mode 100644 index 000000000..0da183deb --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IFilling.hxx @@ -0,0 +1,56 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Filling operation. + + +#include "GEOM_Function.hxx" + +#define FILL_ARG_MINDEG 1 +#define FILL_ARG_MAXDEG 2 +#define FILL_ARG_TOL2D 3 +#define FILL_ARG_TOL3D 4 +#define FILL_ARG_SHAPE 5 +#define FILL_ARG_NBITER 6 + +class GEOMImpl_IFilling +{ + public: + + GEOMImpl_IFilling(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetTol2D(double theTol2D) { _func->SetReal(FILL_ARG_TOL2D, theTol2D); } + void SetTol3D(double theTol3D) { _func->SetReal(FILL_ARG_TOL3D, theTol3D); } + double GetTol2D() { return _func->GetReal(FILL_ARG_TOL2D); } + double GetTol3D() { return _func->GetReal(FILL_ARG_TOL3D); } + + void SetMinDeg(int theMinDeg) { _func->SetInteger(FILL_ARG_MINDEG, theMinDeg); } + void SetMaxDeg(int theMaxDeg) { _func->SetInteger(FILL_ARG_MAXDEG, theMaxDeg); } + int GetMinDeg() { return _func->GetInteger(FILL_ARG_MINDEG); } + int GetMaxDeg() { return _func->GetInteger(FILL_ARG_MAXDEG); } + void SetNbIter(int theNbIter) { _func->SetInteger(FILL_ARG_NBITER, theNbIter); } + int GetNbIter() { return _func->GetInteger(FILL_ARG_NBITER); } + + void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(FILL_ARG_SHAPE, theShape); } + Handle(GEOM_Function) GetShape() { return _func->GetReference(FILL_ARG_SHAPE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IGlue.hxx b/src/GEOMImpl/GEOMImpl_IGlue.hxx new file mode 100644 index 000000000..9bd419bd0 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IGlue.hxx @@ -0,0 +1,47 @@ +// 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/ +// +// NOTE: This is an interface to a function for the Glueing of faces + + +#include "GEOM_Function.hxx" + +#define GLUE_ARG_BASE 1 +#define GLUE_ARG_TOLER 2 + +class GEOMImpl_IGlue +{ + public: + + GEOMImpl_IGlue(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetBase(Handle(GEOM_Function) theRefBase) + { _func->SetReference(GLUE_ARG_BASE, theRefBase); } + + Handle(GEOM_Function) GetBase() { return _func->GetReference(GLUE_ARG_BASE); } + + void SetTolerance(const Standard_Real theTolerance) + { _func->SetReal(GLUE_ARG_TOLER, theTolerance); } + + Standard_Real GetTolerance() { return _func->GetReal(GLUE_ARG_TOLER); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx new file mode 100644 index 000000000..c74ded4a8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.cxx @@ -0,0 +1,728 @@ +// 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/ +// +#include + +#include + +#include + +#include +#include +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IGroupOperations::GEOMImpl_IGroupOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IGroupOperations::GEOMImpl_IGroupOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IGroupOperations::~GEOMImpl_IGroupOperations() +{ + MESSAGE("GEOMImpl_IGroupOperations::~GEOMImpl_IGroupOperations"); +} + + +//============================================================================= +/*! + * CreateGroup + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::CreateGroup + (Handle(GEOM_Object) theMainShape, TopAbs_ShapeEnum theShapeType) +{ + SetErrorCode(KO); + + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, -1); + + //Add a new Fillet object + Handle(GEOM_Object) aGroup = GetEngine()->AddSubShape(theMainShape, anArray); + + //Set a GROUP type + aGroup->SetType(GEOM_GROUP); + + //Set a sub shape type + TDF_Label aFreeLabel = aGroup->GetFreeLabel(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)theShapeType); + + //Make a Python command + Handle(GEOM_Function) aFunction = aGroup->GetFunction(1); + //TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + //GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t" << aGroup + GEOM::TPythonDump(aFunction) << aGroup + << " = geompy.CreateGroup(" << theMainShape << ", " << (int)theShapeType << ")"; + + SetErrorCode(OK); + return aGroup; +} + +//============================================================================= +/*! + * AddObject + */ +//============================================================================= +void GEOMImpl_IGroupOperations::AddObject(Handle(GEOM_Object) theGroup, int theSubShapeID) +{ + SetErrorCode(KO); + if(theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if(aFunction.IsNull()) return; + + GEOM_ISubShape aSSI(aFunction); + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if(aSeq.IsNull()) return; + if(aSeq->Length() == 1 && aSeq->Value(1) == -1) { + aSeq->SetValue(1, theSubShapeID); + } + else { + Standard_Integer aLength = aSeq->Length(); + Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aLength+1); + for(Standard_Integer i = 1; i<=aLength; i++) { + aNewSeq->SetValue(i, aSeq->Value(i)); + if(aSeq->Value(i) == theSubShapeID) { + SetErrorCode(ALREADY_PRESENT); + return; // + } + } + aNewSeq->SetValue(aLength+1, theSubShapeID); + aSSI.SetIndices(aNewSeq); + } + + //Make a Python command + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t" + << "geompy.AddObject(" << theGroup << ", " << theSubShapeID << ")"; + + SetErrorCode(OK); + return; +} + +//============================================================================= +/*! + * RemoveObject + */ +//============================================================================= +void GEOMImpl_IGroupOperations::RemoveObject (Handle(GEOM_Object) theGroup, int theSubShapeID) +{ + SetErrorCode(KO); + if(theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if(aFunction.IsNull()) return; + + GEOM_ISubShape aSSI(aFunction); + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if(aSeq.IsNull()) return; + if(aSeq->Length() == 1 && aSeq->Value(1) == -1) { + SetErrorCode(NOT_EXISTS); + return; + } + else { + Handle(TColStd_HArray1OfInteger) aNewSeq; + Standard_Integer aLength = aSeq->Length(); + if(aLength == 1) { + if(aSeq->Value(1) != theSubShapeID) { + SetErrorCode(NOT_EXISTS); + return; + } + aNewSeq = new TColStd_HArray1OfInteger(1,1); + aNewSeq->SetValue(1, -1); + } + else { + aNewSeq = new TColStd_HArray1OfInteger(1, aLength-1); + Standard_Boolean isFound = Standard_False; + for(Standard_Integer i = 1, k=1; i<=aLength; i++) { + if(i == aLength && !isFound) { + SetErrorCode(NOT_EXISTS); + return; + } + if(aSeq->Value(i) == theSubShapeID) { + isFound = Standard_True; + continue; + } + aNewSeq->SetValue(k, aSeq->Value(i)); + k++; + } + + if(!isFound) { + SetErrorCode(NOT_EXISTS); + return; + } + } + + aSSI.SetIndices(aNewSeq); + } + + //Make a Python command + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() << "\n\t" + << "geompy.RemoveObject(" << theGroup << ", " << theSubShapeID << ")"; + + SetErrorCode(OK); + return; +} + +//============================================================================= +/*! + * UnionList + */ +//============================================================================= +void GEOMImpl_IGroupOperations::UnionList (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfTransient)& theSubShapes) +{ + SetErrorCode(KO); + if (theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if (aFunction.IsNull()) return; + + GEOM_ISubShape aSSI (aFunction); + + // New contents of the group + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + // Add current IDs to the list + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return; + Standard_Integer val_j, aLength = aSeq->Length(); + + for (Standard_Integer j = 1; j <= aLength; j++) { + val_j = aSeq->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + aNewIDs.Append(val_j); + } + } + + // Get Main Shape + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return; + TDF_Label aLabel = aMainShapeFunc->GetOwnerEntry(); + if (aLabel.IsRoot()) return; + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return; + TopoDS_Shape aMainShape = aMainObj->GetValue(); + if (aMainShape.IsNull()) return; + + TopTools_IndexedMapOfShape mapIndices; + TopExp::MapShapes(aMainShape, mapIndices); + + // Get IDs of sub-shapes to add + Standard_Integer i, new_id, aLen = theSubShapes->Length(); + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theSubShapes->Value(i)); + + if (anObj_i->IsMainShape()) { + TopoDS_Shape aShape_i = anObj_i->GetValue(); + if (mapIndices.Contains(aShape_i)) { + new_id = mapIndices.FindIndex(aShape_i); + if (mapIDs.Add(new_id)) { + aNewIDs.Append(new_id); + } + } else { + SetErrorCode("One of given objects can not be added to the group, because it is not a sub-shape of the group's main shape"); + return; + } + } else { + // Check main shape of sub-shape to add + Handle(GEOM_Function) aFunc_i = anObj_i->GetFunction(1); + if (aFunc_i.IsNull()) return; + + GEOM_ISubShape aSSI_i (aFunc_i); + + Handle(GEOM_Function) aMainShapeFunc_i = aSSI_i.GetMainShape(); + if (aMainShapeFunc_i.IsNull()) return; + TDF_Label aLabel_i = aMainShapeFunc_i->GetOwnerEntry(); + if (aLabel_i.IsRoot()) return; + Handle(GEOM_Object) aMainObj_i = GEOM_Object::GetObject(aLabel); + if (aMainObj_i.IsNull()) return; + TopoDS_Shape aMainShape_i = aMainObj_i->GetValue(); + if (aMainShape_i.IsNull()) return; + + if (aMainShape_i.IsSame(aMainShape)) { + // add all sub-shape IDs to the list + + // Get IDs + Handle(TColStd_HArray1OfInteger) aSeq_i = aSSI_i.GetIndices(); + if (aSeq_i.IsNull()) return; + Standard_Integer aLength_i = aSeq_i->Length(); + + for (Standard_Integer i_j = 1; i_j <= aLength_i; i_j++) { + new_id = aSeq_i->Value(i_j); + if (new_id > 0) { + if (mapIDs.Add(new_id)) { + aNewIDs.Append(new_id); + } + } + } + + } else if (mapIndices.Contains(aMainShape_i)) { + // compute new IDs and add them to the list + TopTools_IndexedMapOfShape mapIndices_i; + TopExp::MapShapes(aMainShape_i, mapIndices_i); + + // Get IDs + Handle(TColStd_HArray1OfInteger) aSeq_i = aSSI_i.GetIndices(); + if (aSeq_i.IsNull()) return; + Standard_Integer aLength_i = aSeq_i->Length(); + + for (Standard_Integer i_j = 1; i_j <= aLength_i; i_j++) { + if (aSeq_i->Value(i_j) > 0) { + TopoDS_Shape aShape_i_j = mapIndices_i.FindKey(i_j); + new_id = mapIndices.FindIndex(aShape_i_j); + if (mapIDs.Add(new_id)) { + aNewIDs.Append(new_id); + } + } + } + + } else { + SetErrorCode("One of given objects can not be added to the group, because it is not a sub-shape of the group's main shape"); + return; + } + } + } + + if (aNewIDs.Extent() > 0) { + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewSeq->SetValue(k, aNewIDsIter.Value()); + } + + aSSI.SetIndices(aNewSeq); + } + + //Make a Python command + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + GEOM::TPythonDump pd (aFunction); + pd << anOldDescr.ToCString() << "\n\t" << "geompy.UnionList(" << theGroup << ", ["; + + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theSubShapes->Value(i)); + pd << anObj_i << (( i < aLen ) ? ", " : "])"); + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * DifferenceList + */ +//============================================================================= +void GEOMImpl_IGroupOperations::DifferenceList (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfTransient)& theSubShapes) +{ + SetErrorCode(KO); + if (theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if (aFunction.IsNull()) return; + + GEOM_ISubShape aSSI (aFunction); + + // Map of IDs to be removed + TColStd_MapOfInteger mapIDsToRemove; + + // Map of current IDs + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return; + Standard_Integer aLength = aSeq->Length(); + + if (aLength == 1 && aSeq->Value(1) == -1) // empty group + return; + + TColStd_MapOfInteger mapIDsCurrent; + Standard_Integer j = 1; + for (; j <= aLength; j++) { + mapIDsCurrent.Add(aSeq->Value(j)); + } + + // Get Main Shape + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return; + TDF_Label aLabel = aMainShapeFunc->GetOwnerEntry(); + if (aLabel.IsRoot()) return; + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return; + TopoDS_Shape aMainShape = aMainObj->GetValue(); + if (aMainShape.IsNull()) return; + + TopTools_IndexedMapOfShape mapIndices; + TopExp::MapShapes(aMainShape, mapIndices); + + // Get IDs of sub-shapes to be removed + Standard_Integer i, rem_id, aLen = theSubShapes->Length(); + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theSubShapes->Value(i)); + + if (anObj_i->IsMainShape()) { + TopoDS_Shape aShape_i = anObj_i->GetValue(); + if (mapIndices.Contains(aShape_i)) { + rem_id = mapIndices.FindIndex(aShape_i); + if (mapIDsCurrent.Contains(rem_id)) { + mapIDsToRemove.Add(rem_id); + } + } else { + SetErrorCode("One of given objects can not be removed from the group, because it is not a sub-shape of the group's main shape"); + return; + } + } else { + // Check main shape of sub-shape to be removed + Handle(GEOM_Function) aFunc_i = anObj_i->GetFunction(1); + if (aFunc_i.IsNull()) return; + + GEOM_ISubShape aSSI_i (aFunc_i); + + Handle(GEOM_Function) aMainShapeFunc_i = aSSI_i.GetMainShape(); + if (aMainShapeFunc_i.IsNull()) return; + TDF_Label aLabel_i = aMainShapeFunc_i->GetOwnerEntry(); + if (aLabel_i.IsRoot()) return; + Handle(GEOM_Object) aMainObj_i = GEOM_Object::GetObject(aLabel); + if (aMainObj_i.IsNull()) return; + TopoDS_Shape aMainShape_i = aMainObj_i->GetValue(); + if (aMainShape_i.IsNull()) return; + + if (aMainShape_i.IsSame(aMainShape)) { + // remove all sub-shapes + + // Get IDs + Handle(TColStd_HArray1OfInteger) aSeq_i = aSSI_i.GetIndices(); + if (aSeq_i.IsNull()) return; + Standard_Integer aLength_i = aSeq_i->Length(); + + for (Standard_Integer i_j = 1; i_j <= aLength_i; i_j++) { + rem_id = aSeq_i->Value(i_j); + if (rem_id > 0) { + if (mapIDsCurrent.Contains(rem_id)) { + mapIDsToRemove.Add(rem_id); + } + } + } + + } else if (mapIndices.Contains(aMainShape_i)) { + // compute new IDs and add them to the map of ids to be removed + TopTools_IndexedMapOfShape mapIndices_i; + TopExp::MapShapes(aMainShape_i, mapIndices_i); + + // Get IDs + Handle(TColStd_HArray1OfInteger) aSeq_i = aSSI_i.GetIndices(); + if (aSeq_i.IsNull()) return; + Standard_Integer aLength_i = aSeq_i->Length(); + + for (Standard_Integer i_j = 1; i_j <= aLength_i; i_j++) { + if (aSeq_i->Value(i_j) > 0) { + TopoDS_Shape aShape_i_j = mapIndices_i.FindKey(i_j); + rem_id = mapIndices.FindIndex(aShape_i_j); + if (mapIDsCurrent.Contains(rem_id)) { + mapIDsToRemove.Add(rem_id); + } + } + } + + } else { + SetErrorCode("One of given objects can not be removed from the group, because it is not a sub-shape of the group's main shape"); + return; + } + } + } + + if (mapIDsToRemove.Extent() > 0) { + Standard_Integer k = 1, aRemLength = mapIDsToRemove.Extent(); + Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); + + for (j = 1; j <= aLength; j++) { + if (!mapIDsToRemove.Contains(aSeq->Value(j))) { + aNewSeq->SetValue(k, aSeq->Value(j)); + k++; + } + } + + aSSI.SetIndices(aNewSeq); + } + + //Make a Python command + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + GEOM::TPythonDump pd (aFunction); + pd << anOldDescr.ToCString() << "\n\t" << "geompy.DifferenceList(" << theGroup << ", ["; + + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theSubShapes->Value(i)); + pd << anObj_i << (( i < aLen ) ? ", " : "])"); + } + + SetErrorCode(OK); +} +//============================================================================= +/*! + * UnionIDs + */ +//============================================================================= +void GEOMImpl_IGroupOperations::UnionIDs (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfInteger)& theSubShapes) +{ + SetErrorCode(KO); + if (theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if (aFunction.IsNull()) return; + + GEOM_ISubShape aSSI (aFunction); + + // New contents of the group + TColStd_ListOfInteger aNewIDs; + TColStd_MapOfInteger mapIDs; + + // Add current IDs to the list + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return; + Standard_Integer val_j, aLength = aSeq->Length(); + + for (Standard_Integer j = 1; j <= aLength; j++) { + val_j = aSeq->Value(j); + if (val_j > 0 && mapIDs.Add(val_j)) { + aNewIDs.Append(val_j); + } + } + + // Get Main Shape + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return; + TDF_Label aLabel = aMainShapeFunc->GetOwnerEntry(); + if (aLabel.IsRoot()) return; + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return; + TopoDS_Shape aMainShape = aMainObj->GetValue(); + if (aMainShape.IsNull()) return; + + TopTools_IndexedMapOfShape mapIndices; + TopExp::MapShapes(aMainShape, mapIndices); + + // Get IDs of sub-shapes to add + Standard_Integer i, new_id, aLen = theSubShapes->Length(); + for (i = 1; i <= aLen; i++) { + new_id = theSubShapes->Value(i); + + if (0 < new_id && new_id <= mapIndices.Extent()) { + if (mapIDs.Add(new_id)) { + aNewIDs.Append(new_id); + } + } + } + + if (aNewIDs.Extent() > 0) { + Standard_Integer k = 1; + TColStd_ListIteratorOfListOfInteger aNewIDsIter (aNewIDs); + Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aNewIDs.Extent()); + for (; aNewIDsIter.More(); aNewIDsIter.Next(), k++) { + aNewSeq->SetValue(k, aNewIDsIter.Value()); + } + + aSSI.SetIndices(aNewSeq); + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * DifferenceIDs + */ +//============================================================================= +void GEOMImpl_IGroupOperations::DifferenceIDs (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfInteger)& theSubShapes) +{ + SetErrorCode(KO); + if (theGroup.IsNull()) return; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if (aFunction.IsNull()) return; + + GEOM_ISubShape aSSI (aFunction); + + // Map of IDs to be removed + TColStd_MapOfInteger mapIDsToRemove; + + // Map of current IDs + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if (aSeq.IsNull()) return; + Standard_Integer aLength = aSeq->Length(); + + if (aLength == 1 && aSeq->Value(1) == -1) // empty group + return; + + TColStd_MapOfInteger mapIDsCurrent; + Standard_Integer j = 1; + for (; j <= aLength; j++) { + mapIDsCurrent.Add(aSeq->Value(j)); + } + + // Get Main Shape + Handle(GEOM_Function) aMainShapeFunc = aSSI.GetMainShape(); + if (aMainShapeFunc.IsNull()) return; + TDF_Label aLabel = aMainShapeFunc->GetOwnerEntry(); + if (aLabel.IsRoot()) return; + Handle(GEOM_Object) aMainObj = GEOM_Object::GetObject(aLabel); + if (aMainObj.IsNull()) return; + TopoDS_Shape aMainShape = aMainObj->GetValue(); + if (aMainShape.IsNull()) return; + + TopTools_IndexedMapOfShape mapIndices; + TopExp::MapShapes(aMainShape, mapIndices); + + // Get IDs of sub-shapes to be removed + Standard_Integer i, rem_id, aLen = theSubShapes->Length(); + for (i = 1; i <= aLen; i++) { + rem_id = theSubShapes->Value(i); + if (mapIDsCurrent.Contains(rem_id)) { + mapIDsToRemove.Add(rem_id); + } + } + + if (mapIDsToRemove.Extent() > 0) { + Standard_Integer k = 1, aRemLength = mapIDsToRemove.Extent(); + Handle(TColStd_HArray1OfInteger) aNewSeq = new TColStd_HArray1OfInteger(1, aLength - aRemLength); + + for (j = 1; j <= aLength; j++) { + if (!mapIDsToRemove.Contains(aSeq->Value(j))) { + aNewSeq->SetValue(k, aSeq->Value(j)); + k++; + } + } + + aSSI.SetIndices(aNewSeq); + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * GetType + */ +//============================================================================= +TopAbs_ShapeEnum GEOMImpl_IGroupOperations::GetType(Handle(GEOM_Object) theGroup) +{ + SetErrorCode(KO); + + TDF_Label aFreeLabel = theGroup->GetFreeLabel(); + Handle(TDataStd_Integer) anAttrib; + if(!aFreeLabel.FindAttribute(TDataStd_Integer::GetID(), anAttrib)) return TopAbs_SHAPE; + + SetErrorCode(OK); + return (TopAbs_ShapeEnum) anAttrib->Get(); +} + +//============================================================================= +/*! + * GetMainShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IGroupOperations::GetMainShape (Handle(GEOM_Object) theGroup) +{ + SetErrorCode(KO); + + if(theGroup.IsNull()) return NULL; + + Handle(GEOM_Function) aGroupFunction = theGroup->GetFunction(1); + if (aGroupFunction.IsNull()) return NULL; + + GEOM_ISubShape aSSI (aGroupFunction); + Handle(GEOM_Function) aMainShapeFunction = aSSI.GetMainShape(); + if (aMainShapeFunction.IsNull()) return NULL; + + TDF_Label aLabel = aMainShapeFunction->GetOwnerEntry(); + Handle(GEOM_Object) aMainShape = GEOM_Object::GetObject(aLabel); + if (aMainShape.IsNull()) return NULL; + + //Make a Python command + TCollection_AsciiString anOldDescr = aGroupFunction->GetDescription(); + + GEOM::TPythonDump(aGroupFunction) << anOldDescr.ToCString() << "\n\t" + << aMainShape << " = geompy.GetMainShape(" << theGroup << ")"; + + SetErrorCode(OK); + return aMainShape; +} + +//============================================================================= +/*! + * GetObjects + */ +//============================================================================= +Handle(TColStd_HArray1OfInteger) GEOMImpl_IGroupOperations::GetObjects(Handle(GEOM_Object) theGroup) +{ + SetErrorCode(KO); + + if(theGroup.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction = theGroup->GetFunction(1); + if(aFunction.IsNull()) return NULL; + + GEOM_ISubShape aSSI(aFunction); + Handle(TColStd_HArray1OfInteger) aSeq = aSSI.GetIndices(); + if(aSeq.IsNull()) return NULL; + + if(aSeq->Length() == 1 && aSeq->Value(1) == -1) { + SetErrorCode(OK); + return NULL; + } + + SetErrorCode(OK); + return aSeq; +} diff --git a/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx b/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx new file mode 100644 index 000000000..48a1f2ebc --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IGroupOperations.hxx @@ -0,0 +1,64 @@ +// 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/ +// + +#ifndef _GEOMImpl_IGroupOperations_HXX_ +#define _GEOMImpl_IGroupOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include +#include +#include +#include + +class GEOMImpl_IGroupOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IGroupOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IGroupOperations(); + + Standard_EXPORT Handle(GEOM_Object) CreateGroup(Handle(GEOM_Object) theMainShape, TopAbs_ShapeEnum theShapeType); + + Standard_EXPORT void AddObject(Handle(GEOM_Object) theGroup, int theSubShapeID); + + Standard_EXPORT void RemoveObject(Handle(GEOM_Object) theGroup, int theSubShapeID); + + Standard_EXPORT void UnionList (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfTransient)& theSubShapes); + + Standard_EXPORT void DifferenceList (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfTransient)& theSubShapes); + + Standard_EXPORT void UnionIDs (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfInteger)& theSubShapes); + + Standard_EXPORT void DifferenceIDs (Handle(GEOM_Object) theGroup, + const Handle(TColStd_HSequenceOfInteger)& theSubShapes); + + Standard_EXPORT TopAbs_ShapeEnum GetType(Handle(GEOM_Object) theGroup); + + Standard_EXPORT Handle(GEOM_Object) GetMainShape(Handle(GEOM_Object) theGroup); + + Standard_EXPORT Handle(TColStd_HArray1OfInteger) GetObjects(Handle(GEOM_Object) theGroup); + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IHealing.hxx b/src/GEOMImpl/GEOMImpl_IHealing.hxx new file mode 100755 index 000000000..81d69281a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IHealing.hxx @@ -0,0 +1,80 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Healing creation. + + +#include "GEOM_Function.hxx" + +#include +#include + +#define ARG_SHAPE_PROCESS_OPERATORS 1 +#define ARG_SHAPE_PROCESS_PARAMS 2 +#define ARG_SHAPE_PROCESS_VALUES 3 +#define ARG_ORIGINAL 4 +#define ARG_LIST_ARGUMENTS 5 +#define ARG_IS_COMMON_VERTEX 6 +#define ARG_TOLERANCE 7 +#define ARG_DEV_EDGE_VALUE 8 +#define ARG_IS_BY_PARAMETER 9 +#define ARG_SUBSHAPE_INDEX 10 + + +class GEOMImpl_IHealing +{ +public: + GEOMImpl_IHealing(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOperators( const Handle(TColStd_HArray1OfExtendedString)& arr ) { if ( !arr.IsNull() ) _func->SetStringArray(ARG_SHAPE_PROCESS_OPERATORS, arr); } + Handle(TColStd_HArray1OfExtendedString) GetOperators() { return _func->GetStringArray(ARG_SHAPE_PROCESS_OPERATORS); } + + void SetParameters( const Handle(TColStd_HArray1OfExtendedString)& arr ) { if ( !arr.IsNull() ) _func->SetStringArray(ARG_SHAPE_PROCESS_PARAMS, arr); } + Handle(TColStd_HArray1OfExtendedString) GetParameters() { return _func->GetStringArray(ARG_SHAPE_PROCESS_PARAMS); } + + void SetValues( const Handle(TColStd_HArray1OfExtendedString)& arr ) { if ( !arr.IsNull() ) _func->SetStringArray(ARG_SHAPE_PROCESS_VALUES, arr); } + Handle(TColStd_HArray1OfExtendedString) GetValues() { return _func->GetStringArray(ARG_SHAPE_PROCESS_VALUES); } + + void SetOriginal( Handle(GEOM_Function)& f ) { _func->SetReference(ARG_ORIGINAL, f); } + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(ARG_ORIGINAL); } + + void SetFaces( const Handle(TColStd_HArray1OfInteger)& arr ) { if ( !arr.IsNull() ) _func->SetIntegerArray(ARG_LIST_ARGUMENTS, arr); } + Handle(TColStd_HArray1OfInteger) GetFaces() { return _func->GetIntegerArray(ARG_LIST_ARGUMENTS); } + + void SetWires( const Handle(TColStd_HArray1OfInteger)& arr ) { if ( !arr.IsNull() ) _func->SetIntegerArray(ARG_LIST_ARGUMENTS, arr); } + Handle(TColStd_HArray1OfInteger) GetWires() { return _func->GetIntegerArray(ARG_LIST_ARGUMENTS); } + + void SetIsCommonVertex( Standard_Boolean val ) { _func->SetInteger(ARG_IS_COMMON_VERTEX, val ? 1 : 0 ); } + Standard_Boolean GetIsCommonVertex() { return (_func->GetInteger(ARG_IS_COMMON_VERTEX) != 0 ); } + + void SetIsByParameter( Standard_Boolean val ) { _func->SetInteger(ARG_IS_BY_PARAMETER, val ? 1 : 0 ); } + Standard_Boolean GetIsByParameter() { return (_func->GetInteger(ARG_IS_BY_PARAMETER) != 0 ); } + + void SetTolerance( Standard_Real val ) { _func->SetReal(ARG_TOLERANCE, val); } + Standard_Real GetTolerance() { return _func->GetReal(ARG_TOLERANCE); } + + void SetDevideEdgeValue( Standard_Real val ) { _func->SetReal(ARG_DEV_EDGE_VALUE, val); } + Standard_Real GetDevideEdgeValue() { return _func->GetReal(ARG_DEV_EDGE_VALUE); } + + void SetIndex( Standard_Integer val ) { _func->SetInteger(ARG_SUBSHAPE_INDEX, val); } + Standard_Integer GetIndex() { return _func->GetInteger(ARG_SUBSHAPE_INDEX); } + +private: + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx new file mode 100644 index 000000000..3bd88274f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -0,0 +1,775 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include + +#include + +#include +#include +#include +#include + +#include + +#include "utilities.h" +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOMImpl_IHealingOperations::GEOMImpl_IHealingOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IHealingOperations::GEOMImpl_IHealingOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOMImpl_IHealingOperations::~GEOMImpl_IHealingOperations() +{ + MESSAGE("GEOMImpl_IHealingOperations::~GEOMImpl_IHealingOperations"); +} + + +//============================================================================= +/*! + * ShapeProcess + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::ShapeProcess (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfExtendedString)& theOperators, + const Handle(TColStd_HArray1OfExtendedString)& theParams, + const Handle(TColStd_HArray1OfExtendedString)& theValues) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + if (theOperators.IsNull() || theOperators->Length() <= 0) { + SetErrorCode("No operators requested"); + return NULL; + } + + Standard_Integer nbParams = 0, nbValues = 0; + if (!theParams.IsNull()) { + nbParams = theParams->Length(); + } + if (!theValues.IsNull()) { + nbValues = theValues->Length(); + } + + if (nbParams != nbValues) { + SetErrorCode("Number of parameter values must be equal to the number of parameters"); + return NULL; + } + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SHAPE_PROCESS); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetOriginal(aLastFunction); + HI.SetOperators( theOperators ); + if (nbParams > 0) { + HI.SetParameters( theParams ); + HI.SetValues( theValues ); + } + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Shape Healing algorithm failed"); + return NULL; + } + } + catch (Standard_Failure) + { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << aNewObject << " = geompy.ProcessShape(" << theObject << ", ["; + + // list of operators + int i = theOperators->Lower(), nb = theOperators->Upper(); + for ( ; i <= nb; i++) { + pd << "\"" << TCollection_AsciiString(theOperators->Value( i )).ToCString() + << (( i < nb ) ? "\", " : "\""); + } + pd << "], ["; + // list of parameters + i = theParams->Lower(); nb = theParams->Upper(); + for ( ; i <= nb; i++) { + pd << "\"" << TCollection_AsciiString(theParams->Value( i )).ToCString() + << (( i < nb ) ? "\", " : "\""); + } + pd << "], ["; + // list of values + i = theValues->Lower(); nb = theValues->Upper(); + for ( ; i <= nb; i++) { + pd << "\"" << TCollection_AsciiString(theValues->Value( i )).ToCString() + << (( i < nb ) ? "\", " : "\""); + } + pd << "])"; + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * ShapeProcess + */ +//============================================================================= +void GEOMImpl_IHealingOperations::GetShapeProcessParameters (list& theOperations, + list& theParams, + list& theValues) +{ + ShHealOper_ShapeProcess aHealer; + TColStd_SequenceOfAsciiString anOperators; + int nbOperatorErrors( 0 ); + if ( aHealer.GetOperators( anOperators ) ) + { + for ( Standard_Integer i = 1; i <= anOperators.Length(); i++ ) + { + string anOperation = anOperators.Value( i ).ToCString(); + if ( GetOperatorParameters( anOperation, theParams, theValues ) ) + theOperations.push_back( anOperation ); + else + nbOperatorErrors++; + } + } + else + { + SetErrorCode("ERROR retrieving operators (GEOMImpl_IHealingOperations)"); + } + + if ( nbOperatorErrors ) { + TCollection_AsciiString aMsg ("ERRORS retrieving ShapeProcess parameters (GEOMImpl_IHealingOperations): nbOperatorErrors = "); + aMsg += TCollection_AsciiString( nbOperatorErrors ); + MESSAGE(aMsg.ToCString()); + } +} + +//============================================================================= +/*! + * GetOperatorParameters + */ +//============================================================================= +bool GEOMImpl_IHealingOperations::GetOperatorParameters( const string theOperation, + list& theParams, + list& theValues ) +{ + ShHealOper_ShapeProcess aHealer; + int nbParamValueErrors( 0 ); + list aParams; + if ( GetParameters( theOperation, aParams ) ) { + for ( list::iterator it = aParams.begin(); it != aParams.end(); ++it ) { + TCollection_AsciiString aParam( (Standard_CString)(*it).c_str() ); + TCollection_AsciiString aValue; + if ( aHealer.GetParameter( aParam, aValue ) ) { + theParams.push_back( aParam.ToCString() ); + theValues.push_back( aValue.ToCString() ); + } + else + nbParamValueErrors++; + } + } + else + return false; + + if ( nbParamValueErrors ) { + TCollection_AsciiString aMsg ("ERRORS retrieving ShapeProcess parameter values (GEOMImpl_IHealingOperations): nbParamValueErrors = "); + aMsg += TCollection_AsciiString( nbParamValueErrors ); + MESSAGE(aMsg.ToCString()); + } + + return true; +} + +//============================================================================= +/*! + * GetParameters + */ +//============================================================================= +bool GEOMImpl_IHealingOperations::GetParameters (const string theOperation, + list& theParams) +{ + if ( theOperation == "SplitAngle" ) { + theParams.push_back( "SplitAngle.Angle" ); + theParams.push_back( "SplitAngle.MaxTolerance" ); + + } else if ( theOperation == "SplitClosedFaces" ) { + theParams.push_back( "SplitClosedFaces.NbSplitPoints" ); + + } else if ( theOperation == "FixFaceSize" ) { + theParams.push_back( "FixFaceSize.Tolerance" ); + + } else if( theOperation == "DropSmallEdges" ) { + theParams.push_back( "DropSmallEdges.Tolerance3d" ); + + } else if( theOperation == "BSplineRestriction" ) { + theParams.push_back( "BSplineRestriction.SurfaceMode" ); + theParams.push_back( "BSplineRestriction.Curve3dMode" ); + theParams.push_back( "BSplineRestriction.Curve2dMode" ); + theParams.push_back( "BSplineRestriction.Tolerance3d" ); + theParams.push_back( "BSplineRestriction.Tolerance2d" ); + theParams.push_back( "BSplineRestriction.RequiredDegree" ); + theParams.push_back( "BSplineRestriction.RequiredNbSegments" ); + theParams.push_back( "BSplineRestriction.Continuity3d" ); + theParams.push_back( "BSplineRestriction.Continuity2d" ); + + } else if( theOperation == "SplitContinuity" ) { + theParams.push_back( "SplitContinuity.Tolerance3d" ); + theParams.push_back( "SplitContinuity.SurfaceContinuity" ); + theParams.push_back( "SplitContinuity.CurveContinuity" ); + + } else if( theOperation == "ToBezier" ) { + theParams.push_back( "ToBezier.SurfaceMode" ); + theParams.push_back( "ToBezier.Curve3dMode" ); + theParams.push_back( "ToBezier.Curve2dMode" ); + theParams.push_back( "ToBezier.MaxTolerance" ); + + } else if( theOperation == "SameParameter" ) { + theParams.push_back( "SameParameter.Tolerance3d" ); + + } else if( theOperation == "FixShape" ) { + theParams.push_back( "FixShape.Tolerance3d" ); + theParams.push_back( "FixShape.MaxTolerance3d" ); + + } else { + return false; + } + + return true; +} + +//============================================================================= +/*! + * SuppressFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::SuppressFaces + (Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theFaces) +{ + // set error code, check parameters + SetErrorCode(KO); + + if ( theObject.IsNull() ) // if theFaces.IsNull() - it's OK, it means that ALL faces must be removed.. + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if(aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SUPPRESS_FACES); + + if(aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if(aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetFaces( theFaces ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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 pd (aFunction); + pd << aNewObject << " = geompy.SuppressFaces(" << theObject << ", ["; + + // list of face ids + int i = theFaces->Lower(), nb = theFaces->Upper(); + for ( ; i <= nb; i++) + pd << theFaces->Value( i ) << (( i < nb ) ? ", " : "])"); + + SetErrorCode(OK); + return aNewObject; +} + + +//============================================================================= +/*! + * CloseContour + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::CloseContour + (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theWires, + bool isCommonVertex) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + { + SetErrorCode("NULL object given"); + return NULL; + } + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CLOSE_CONTOUR); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if(aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetWires( theWires ); + HI.SetIsCommonVertex( isCommonVertex ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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 pd (aFunction); + pd << aNewObject << " = geompy.CloseContour(" << theObject << ", ["; + + // list of wire ids + if (!theWires.IsNull()) + { + int i = theWires->Lower(), nb = theWires->Upper(); + pd << theWires->Value(i++); + while (i <= nb) + pd << ", " << theWires->Value(i++); + } + pd << "], " << (int)isCommonVertex << ")"; + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * RemoveIntWires + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::RemoveIntWires + (Handle(GEOM_Object) theObject, const Handle(TColStd_HArray1OfInteger)& theWires) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) // if theWires is NULL it's OK, it means that ALL wires must be removed + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), REMOVE_INT_WIRES); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetWires( theWires ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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 pd (aFunction); + pd << aNewObject << " = geompy.SuppressInternalWires(" << theObject << ", ["; + + // list of wire ids + if (!theWires.IsNull()) { + int i = theWires->Lower(), nb = theWires->Upper(); + for ( ; i <= nb; i++) + pd << theWires->Value( i ) << (( i < nb ) ? ", " : "])"); + } else { + pd << "])"; + } + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * FillHoles + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::FillHoles (Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theWires) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) // if theWires is NULL it's OK, it means that ALL holes must be removed + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), FILL_HOLES); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetWires( theWires ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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 pd (aFunction); + pd << aNewObject << " = geompy.SuppressHoles(" << theObject << ", ["; + + // list of wire ids + if ( theWires.IsNull() ) + pd << "])"; + else { + int i = theWires->Lower(), nb = theWires->Upper(); + for ( ; i <= nb; i++) + pd << theWires->Value( i ) << (( i < nb ) ? ", " : "])"); + } + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * Sew + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::Sew (Handle(GEOM_Object) theObject, + double theTolerance) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), SEWING); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetTolerance( theTolerance ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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) << aNewObject << " = geompy.Sew(" + << theObject << ", " << theTolerance << ")"; + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * DivideEdge + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::DivideEdge (Handle(GEOM_Object) theObject, + int theIndex, + double theValue, + bool isByParameter) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), DIVIDE_EDGE); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetIndex( theIndex ); + HI.SetDevideEdgeValue( theValue ); + HI.SetIsByParameter( isByParameter ); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try + { + if (!GetSolver()->ComputeFunction(aFunction)) + { + SetErrorCode("Healing 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) << aNewObject << " = geompy.DivideEdge(" << theObject + << ", " << theIndex << ", " << theValue << ", " << (int)isByParameter << ")"; + + SetErrorCode(OK); + return aNewObject; +} + +//============================================================================= +/*! + * GetFreeBoundary + */ +//============================================================================= +bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(GEOM_Object) theObject, + Handle(TColStd_HSequenceOfTransient)& theClosed, + Handle(TColStd_HSequenceOfTransient)& theOpen ) +{ + // set error code, check parameters + SetErrorCode(KO); + + if ( theObject.IsNull() || theClosed.IsNull() || theOpen.IsNull() ) + return false; + + TopoDS_Shape aShape = theObject->GetValue(); + if ( aShape.IsNull() ) + return false; + + // get free boundary shapes + ShapeAnalysis_FreeBounds anAnalizer( aShape ); + TopoDS_Compound aClosed = anAnalizer.GetClosedWires(); + TopoDS_Compound anOpen = anAnalizer.GetOpenWires(); + + // iterate through shapes and append them to the return sequence + Handle(GEOM_Object) anObj; + Handle(GEOM_Function) aFunction; + TopExp_Explorer anExp; + for ( anExp.Init( aClosed, TopAbs_WIRE ); anExp.More(); anExp.Next() ) + { + anObj = GetEngine()->AddObject( GetDocID(), GEOM_FREE_BOUNDS ); + aFunction = anObj->AddFunction( GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF ); + TopoDS_Shape aValueShape = anExp.Current(); + aFunction->SetValue( aValueShape ); + theClosed->Append(anObj); + } + for ( anExp.Init( anOpen, TopAbs_WIRE ); anExp.More(); anExp.Next() ) + { + anObj = GetEngine()->AddObject( GetDocID(), GEOM_FREE_BOUNDS ); + aFunction = anObj->AddFunction( GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF ); + TopoDS_Shape aValueShape = anExp.Current(); + aFunction->SetValue( aValueShape ); + theOpen->Append(anObj); + } + + if(!aFunction.IsNull()) { + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + + Standard_Integer i, aLen = theClosed->Length(); + if (aLen > 0) { + pd << "(isDone, ["; + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theClosed->Value(i)); + pd << anObj_i << ((i < aLen) ? ", " : ""); + } + pd << "], "; + } else { + pd << "(isDone, empty_list, "; + } + + aLen = theOpen->Length(); + if (aLen > 0) { + pd << "["; + for (i = 1; i <= aLen; i++) { + Handle(GEOM_Object) anObj_i = Handle(GEOM_Object)::DownCast(theOpen->Value(i)); + pd << anObj_i << ((i < aLen) ? ", " : ""); + } + pd << "]"; + } else { + pd << "empty_list"; + } + + pd << ") = geompy.GetFreeBoundary(" << theObject << ")"; + } + + SetErrorCode(OK); + return true; +} diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx new file mode 100644 index 000000000..cdb1ceae6 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -0,0 +1,86 @@ +// 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/ +// + +#ifndef _GEOMImpl_IHealingOperations_HXX_ +#define _GEOMImpl_IHealingOperations_HXX_ + +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include +#include + +#include + +class GEOMImpl_IHealingOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IHealingOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IHealingOperations(); + + // Apply Shape Processing to the selected Object + Standard_EXPORT Handle(GEOM_Object) ShapeProcess( Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfExtendedString)& theOperations, + const Handle(TColStd_HArray1OfExtendedString)& theParams, + const Handle(TColStd_HArray1OfExtendedString)& theValues ); + + // Retrieve default Shape Process parameters (from resource file) + Standard_EXPORT void GetShapeProcessParameters( list& theOperations, + list& theParams, + list& theValues ); + + // Retrieve default Shape Process parameters for given operator + Standard_EXPORT bool GetOperatorParameters( const string theOperation, + list& theParams, + list& theValues ); + + // returns all parameters that are valid for the given operation (Shape Process operator) + Standard_EXPORT static bool GetParameters( const string theOperation, list& theParams ); + + Standard_EXPORT Handle(GEOM_Object) SuppressFaces( Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theFaces); + + Standard_EXPORT Handle(GEOM_Object) CloseContour( Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theWires, + bool isCommonVertex ); + + Standard_EXPORT Handle(GEOM_Object) RemoveIntWires( Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theWires); + + Standard_EXPORT Handle(GEOM_Object) FillHoles( Handle(GEOM_Object) theObject, + const Handle(TColStd_HArray1OfInteger)& theWires); + + Standard_EXPORT Handle(GEOM_Object) Sew( Handle(GEOM_Object) theObject, + double theTolerance ); + + Standard_EXPORT Handle(GEOM_Object) DivideEdge( Handle(GEOM_Object) theObject, + int theIndex, + double theValue, + bool isByParameter ); + + // this function does not use Function-Driver mechanism, it just computes the free + // boundary edges and returns them in the sequence. It is called just for information reasons + // and it's not intended for history/undo/redo/etc.. + Standard_EXPORT bool GetFreeBoundary ( Handle(GEOM_Object) theObject, + Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, + Handle(TColStd_HSequenceOfTransient)& theOutOpenWires ); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IImportExport.hxx b/src/GEOMImpl/GEOMImpl_IImportExport.hxx new file mode 100644 index 000000000..efa6b2bec --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IImportExport.hxx @@ -0,0 +1,51 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Import Export operation. + + +#include "GEOM_Function.hxx" + +#define EXP_ARG_REF 1 +#define EXP_ARG_FILE 2 +#define EXP_ARG_PLUG 3 + +class GEOMImpl_IImportExport +{ + public: + + GEOMImpl_IImportExport(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOriginal(Handle(GEOM_Function) theOriginal) { _func->SetReference(EXP_ARG_REF, theOriginal); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(EXP_ARG_REF); } + + void SetFileName(const TCollection_AsciiString& theFileName) { _func->SetString(EXP_ARG_FILE, theFileName); } + + TCollection_AsciiString GetFileName() { return _func->GetString(EXP_ARG_FILE); } + + void SetPluginName(const TCollection_AsciiString& theFormatName) + { _func->SetString(EXP_ARG_PLUG, theFormatName); } + + TCollection_AsciiString GetPluginName() { return _func->GetString(EXP_ARG_PLUG); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx new file mode 100644 index 000000000..6aee3f044 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.cxx @@ -0,0 +1,405 @@ +// 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/ +// +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOMImpl_IInsertOperations::GEOMImpl_IInsertOperations(GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IInsertOperations::GEOMImpl_IInsertOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOMImpl_IInsertOperations::~GEOMImpl_IInsertOperations() +{ + MESSAGE("GEOMImpl_IInsertOperations::~GEOMImpl_IInsertOperations"); +} + + + +//============================================================================= +/*! + * MakeCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IInsertOperations::MakeCopy(Handle(GEOM_Object) theOriginal) +{ + SetErrorCode(KO); + + if (theOriginal.IsNull()) return NULL; + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_COPY); + + //Add a Copy function for creation a copy object + Handle(GEOM_Function) aFunction = aCopy->AddFunction(GEOMImpl_CopyDriver::GetID(), COPY_WITH_REF); + + //Check if the function is set correctly + if(aFunction->GetDriverGUID() != GEOMImpl_CopyDriver::GetID()) return NULL; + + GEOMImpl_ICopy aCI(aFunction); + + Handle(GEOM_Function) aRefFunction = theOriginal->GetLastFunction(); + if (aRefFunction.IsNull()) return NULL; + + aCI.SetOriginal(aRefFunction); + + //Compute the Copy value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Copy 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) << aCopy << " = geompy.MakeCopy(" << theOriginal << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Export + */ +//============================================================================= +void GEOMImpl_IInsertOperations::Export + (const Handle(GEOM_Object) theOriginal, + const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatName) +{ + SetErrorCode(KO); + + if (theOriginal.IsNull()) return; + + Handle(GEOM_Function) aRefFunction = theOriginal->GetLastFunction(); + if (aRefFunction.IsNull()) return; //There is no function which creates an object to be exported + + //Add an Export function + Handle(GEOM_Function) aFunction = theOriginal->AddFunction(GEOMImpl_ExportDriver::GetID(), EXPORT_SHAPE); + if (aFunction.IsNull()) return; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ExportDriver::GetID()) return; + + //Set parameters + GEOMImpl_IImportExport aCI (aFunction); + aCI.SetOriginal(aRefFunction); + aCI.SetFileName(theFileName); + + Handle(TCollection_HAsciiString) aHLibName; + if (!IsSupported(Standard_False, theFormatName, aHLibName)) { + return; + } + TCollection_AsciiString aLibName = aHLibName->String(); + aCI.SetPluginName(aLibName); + + //Perform the Export + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Export driver failed"); + return; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << "geompy.Export(" << theOriginal << ", \"" + << theFileName.ToCString() << "\", \"" << theFormatName.ToCString() << "\")"; + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * Import + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IInsertOperations::Import + (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatName) +{ + SetErrorCode(KO); + + if (theFileName.IsEmpty() || theFormatName.IsEmpty()) return NULL; + + //Add a new result object + Handle(GEOM_Object) result = GetEngine()->AddObject(GetDocID(), GEOM_IMPORT); + + //Add an Import function + Handle(GEOM_Function) aFunction = result->AddFunction(GEOMImpl_ImportDriver::GetID(), IMPORT_SHAPE); + if (aFunction.IsNull()) return result; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ImportDriver::GetID()) return result; + + //Set parameters + GEOMImpl_IImportExport aCI (aFunction); + aCI.SetFileName(theFileName); + + Handle(TCollection_HAsciiString) aHLibName; + if (!IsSupported(Standard_True, theFormatName, aHLibName)) { + return result; + } + TCollection_AsciiString aLibName = aHLibName->String(); + aCI.SetPluginName(aLibName); + + //Perform the Import + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Import 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) << result << " = geompy.Import(\"" + << theFileName.ToCString() << "\", \"" << theFormatName.ToCString() << "\")"; + + SetErrorCode(OK); + return result; +} + +//============================================================================= +/*! + * ImportTranslators + */ +//============================================================================= +Standard_Boolean GEOMImpl_IInsertOperations::ImportTranslators + (Handle(TColStd_HSequenceOfAsciiString)& theFormats, + Handle(TColStd_HSequenceOfAsciiString)& thePatterns) +{ + if (theFormats.IsNull()) + theFormats = new TColStd_HSequenceOfAsciiString; + else + theFormats->Clear(); + + if (thePatterns.IsNull()) + thePatterns = new TColStd_HSequenceOfAsciiString; + else + thePatterns->Clear(); + + if (!InitResMgr()) return Standard_False; + + // Read Import formats list + if (myResMgr->Find("Import")) { + TCollection_AsciiString aFormats (myResMgr->Value("Import")); + TCollection_AsciiString aToken = aFormats.Token("| \t", 1); + int i = 1; + for (; !aToken.IsEmpty(); aToken = aFormats.Token("| \t", ++i)) { + theFormats->Append(aToken); + } + } + + // Read Patterns for each supported format + int j = 1, len = theFormats->Length(); + for (; j <= len; j++) { + TCollection_AsciiString aPattern; + TCollection_AsciiString aKey (theFormats->Value(j)); + aKey += ".Pattern"; + if (myResMgr->Find(aKey.ToCString())) + aPattern = myResMgr->Value(aKey.ToCString()); + else { + aPattern = theFormats->Value(j); + aPattern += " Files ( *.* )"; + } + thePatterns->Append(aPattern); + } + + return (!theFormats->IsEmpty()); +} + +//============================================================================= +/*! + * ExportTranslators + */ +//============================================================================= +Standard_Boolean GEOMImpl_IInsertOperations::ExportTranslators + (Handle(TColStd_HSequenceOfAsciiString)& theFormats, + Handle(TColStd_HSequenceOfAsciiString)& thePatterns) +{ + if (theFormats.IsNull()) + theFormats = new TColStd_HSequenceOfAsciiString; + else + theFormats->Clear(); + + if (thePatterns.IsNull()) + thePatterns = new TColStd_HSequenceOfAsciiString; + else + thePatterns->Clear(); + + if (!InitResMgr()) return Standard_False; + + // Read Export formats list + if (myResMgr->Find("Export")) { + TCollection_AsciiString aFormats (myResMgr->Value("Export")); + TCollection_AsciiString aToken = aFormats.Token("| \t", 1); + int i = 1; + for (; !aToken.IsEmpty(); aToken = aFormats.Token("| \t", ++i)) { + theFormats->Append(aToken); + } + } + + // Read Patterns for each supported format + int j = 1, len = theFormats->Length(); + for (; j <= len; j++) { + TCollection_AsciiString aPattern; + TCollection_AsciiString aKey (theFormats->Value(j)); + aKey += ".Pattern"; + if (myResMgr->Find(aKey.ToCString())) + aPattern = myResMgr->Value(aKey.ToCString()); + else { + aPattern = theFormats->Value(j); + aPattern += " Files ( *.* )"; + } + thePatterns->Append(aPattern); + } + + return (!theFormats->IsEmpty()); +} + +//============================================================================= +/*! + * IsSupported + */ +//============================================================================= +Standard_Boolean GEOMImpl_IInsertOperations::IsSupported + (const Standard_Boolean isImport, + const TCollection_AsciiString& theFormat, + Handle(TCollection_HAsciiString)& theLibName) +{ + if (!InitResMgr()) return Standard_False; + + // Import/Export mode + TCollection_AsciiString aMode; + //Standard_CString aMode; + if (isImport) aMode = "Import"; + else aMode = "Export"; + + // Read supported formats for the certain mode + if (myResMgr->Find(aMode.ToCString())) { + TCollection_AsciiString aFormats (myResMgr->Value(aMode.ToCString())); + if (aFormats.Search(theFormat) > -1) { + // Read library name for the supported format + TCollection_AsciiString aKey (theFormat); + aKey += "."; + aKey += aMode; + if (myResMgr->Find(aKey.ToCString())) { + TCollection_AsciiString aLibName (myResMgr->Value(aKey.ToCString())); + theLibName = new TCollection_HAsciiString (aLibName); + return Standard_True; + } + } + } + + return Standard_False; +} + +//============================================================================= +/*! + * InitResMgr + */ +//============================================================================= +Standard_Boolean GEOMImpl_IInsertOperations::InitResMgr() +{ + if (myResMgr.IsNull()) { + // Initialize the Resource Manager + TCollection_AsciiString aResDir (getenv("GEOM_ROOT_DIR")); +#ifdef WNT + aResDir += "\\share\\salome\\resources"; +#else + aResDir += "/share/salome/resources"; +#endif + char * dir = getenv("GEOM_ENGINE_RESOURCES_DIR"); + TCollection_AsciiString aUserResDir; + if ( dir ) + { + aUserResDir = dir; + } + else + { + aUserResDir = getenv("HOME"); +#ifdef WNT + aUserResDir += "\\.salome\\resources"; +#else + aUserResDir += "/.salome/resources"; +#endif + } + myResMgr = new Resource_Manager ("ImportExport", aResDir, aUserResDir, Standard_False); + + if (!myResMgr->Find("Import") && !myResMgr->Find("Export")) { + // instead of complains in Resource_Manager + INFOS("No valid file \"ImportExport\" found in " << aResDir.ToCString() << + " and in " << aUserResDir.ToCString() ); + } + } + + return ( myResMgr->Find("Import") || myResMgr->Find("Export") ); +} diff --git a/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx new file mode 100644 index 000000000..795b3ae93 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IInsertOperations.hxx @@ -0,0 +1,65 @@ +// 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/ +// + +#ifndef _GEOMImpl_IInsertOperations_HXX_ +#define _GEOMImpl_IInsertOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include +#include +#include +#include + +class GEOMImpl_IInsertOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IInsertOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IInsertOperations(); + + + Standard_EXPORT Handle(GEOM_Object) MakeCopy (Handle(GEOM_Object) theOriginal); + + Standard_EXPORT Handle(GEOM_Object) Import (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatType); + + Standard_EXPORT void Export (const Handle(GEOM_Object) theOriginal, + const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatType); + + Standard_EXPORT Standard_Boolean ImportTranslators (Handle(TColStd_HSequenceOfAsciiString)& theFormats, + Handle(TColStd_HSequenceOfAsciiString)& thePatterns); + + Standard_EXPORT Standard_Boolean ExportTranslators (Handle(TColStd_HSequenceOfAsciiString)& theFormats, + Handle(TColStd_HSequenceOfAsciiString)& thePatterns); + + Standard_EXPORT Standard_Boolean IsSupported (const Standard_Boolean isImport, + const TCollection_AsciiString& theFormat, + Handle(TCollection_HAsciiString)& theLibName); + + private: + Standard_Boolean InitResMgr (); + + private: + Handle(Resource_Manager) myResMgr; +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ILine.hxx b/src/GEOMImpl/GEOMImpl_ILine.hxx new file mode 100644 index 000000000..fd9f108f8 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ILine.hxx @@ -0,0 +1,43 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the vector creation. + + +#include "GEOM_Function.hxx" + +#define LINE_ARG_PNT1 1 +#define LINE_ARG_PNT2 2 + +class GEOMImpl_ILine +{ + public: + + GEOMImpl_ILine(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetPoint1(Handle(GEOM_Function) theRef) { _func->SetReference(LINE_ARG_PNT1, theRef); } + void SetPoint2(Handle(GEOM_Function) theRef) { _func->SetReference(LINE_ARG_PNT2, theRef); } + + Handle(GEOM_Function) GetPoint1() { return _func->GetReference(LINE_ARG_PNT1); } + Handle(GEOM_Function) GetPoint2() { return _func->GetReference(LINE_ARG_PNT2); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx b/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx new file mode 100644 index 000000000..c6f85f04a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ILocalOperations.cxx @@ -0,0 +1,525 @@ +// 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/ +// +#include + +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_ILocalOperations::GEOMImpl_ILocalOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_ILocalOperations::GEOMImpl_ILocalOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_ILocalOperations::~GEOMImpl_ILocalOperations() +{ + MESSAGE("GEOMImpl_ILocalOperations::~GEOMImpl_ILocalOperations"); +} + + +//============================================================================= +/*! + * MakeFilletAll + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletAll + (Handle(GEOM_Object) theShape, double theR) +{ + SetErrorCode(KO); + + //Add a new Fillet object + Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); + + //Add a new Fillet function + Handle(GEOM_Function) aFunction = + aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_ALL); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; + + GEOMImpl_IFillet aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetR(theR); + + //Compute the Fillet value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Fillet 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) << aFillet << " = geompy.MakeFilletAll(" + << theShape << ", " << theR << ")"; + + SetErrorCode(OK); + return aFillet; +} + +//============================================================================= +/*! + * MakeFilletEdges + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletEdges + (Handle(GEOM_Object) theShape, double theR, list theEdges) +{ + SetErrorCode(KO); + + //Add a new Fillet object + Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); + + //Add a new Fillet function + Handle(GEOM_Function) aFunction = + aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_EDGES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; + + GEOMImpl_IFillet aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetR(theR); + int aLen = theEdges.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = theEdges.begin(); + for (; it != theEdges.end(); it++, ind++) { + aCI.SetEdge(ind, (*it)); + } + + //Compute the Fillet value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Fillet 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 pd (aFunction); + pd << aFillet << " = geompy.MakeFillet(" << theShape + << ", " << theR << ", geompy.ShapeType[\"EDGE\"], ["; + + it = theEdges.begin(); + pd << (*it++); + while (it != theEdges.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aFillet; +} + +//============================================================================= +/*! + * MakeFilletFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeFilletFaces + (Handle(GEOM_Object) theShape, double theR, list theFaces) +{ + SetErrorCode(KO); + + //Add a new Fillet object + Handle(GEOM_Object) aFillet = GetEngine()->AddObject(GetDocID(), GEOM_FILLET); + + //Add a new Fillet function + Handle(GEOM_Function) aFunction = + aFillet->AddFunction(GEOMImpl_FilletDriver::GetID(), FILLET_SHAPE_FACES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_FilletDriver::GetID()) return NULL; + + GEOMImpl_IFillet aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetR(theR); + int aLen = theFaces.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = theFaces.begin(); + for (; it != theFaces.end(); it++, ind++) { + aCI.SetFace(ind, (*it)); + } + + //Compute the Fillet value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Fillet 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 pd (aFunction); + pd << aFillet << " = geompy.MakeFillet(" << theShape + << ", " << theR << ", geompy.ShapeType[\"FACE\"], ["; + + it = theFaces.begin(); + pd << (*it++); + while (it != theFaces.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aFillet; +} + +//============================================================================= +/*! + * MakeChamferAll + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferAll (Handle(GEOM_Object) theShape, double theD) +{ + SetErrorCode(KO); + + //Add a new Chamfer object + Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); + + //Add a new Chamfer function + Handle(GEOM_Function) aFunction = + aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_ALL); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; + + GEOMImpl_IChamfer aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetD(theD); + + //Compute the Chamfer value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Chamfer 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) << aChamfer << " = geompy.MakeChamferAll(" + << theShape << ", " << theD << ")"; + + SetErrorCode(OK); + return aChamfer; +} + +//============================================================================= +/*! + * MakeChamferEdge + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferEdge + (Handle(GEOM_Object) theShape, double theD1, double theD2, + int theFace1, int theFace2) +{ + SetErrorCode(KO); + + //Add a new Chamfer object + Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); + + //Add a new Chamfer function + Handle(GEOM_Function) aFunction = + aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_EDGE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; + + GEOMImpl_IChamfer aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetD1(theD1); + aCI.SetD2(theD2); + aCI.SetFace1(theFace1); + aCI.SetFace2(theFace2); + + //Compute the Chamfer value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Chamfer 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) << aChamfer + << " = geompy.MakeChamferEdge(" << theShape << ", " << theD1 + << ", " << theD2 << ", " << theFace1 << ", " << theFace2 << ")"; + + SetErrorCode(OK); + return aChamfer; +} + +//============================================================================= +/*! + * MakeChamferFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeChamferFaces + (Handle(GEOM_Object) theShape, double theD1, double theD2, + list theFaces) +{ + SetErrorCode(KO); + + //Add a new Chamfer object + Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_CHAMFER); + + //Add a new Chamfer function + Handle(GEOM_Function) aFunction = + aChamfer->AddFunction(GEOMImpl_ChamferDriver::GetID(), CHAMFER_SHAPE_FACES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ChamferDriver::GetID()) return NULL; + + GEOMImpl_IChamfer aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetShape(aRefShape); + aCI.SetD1(theD1); + aCI.SetD2(theD2); + int aLen = theFaces.size(); + aCI.SetLength(aLen); + + int ind = 1; + list::iterator it = theFaces.begin(); + for (; it != theFaces.end(); it++, ind++) { + aCI.SetFace(ind, (*it)); + } + + //Compute the Chamfer value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Chamfer 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 pd (aFunction); + pd << aChamfer << " = geompy.MakeChamferFaces(" << theShape + << ", " << theD1 << ", " << theD2 << ", ["; + + it = theFaces.begin(); + pd << (*it++); + while (it != theFaces.end()) { + pd << ", " << (*it++); + } + pd << "])"; + + SetErrorCode(OK); + return aChamfer; +} + +//============================================================================= +/*! + * Archimede + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ILocalOperations::MakeArchimede (Handle(GEOM_Object) theShape, + double theWeight, + double theWaterDensity, + double theMeshingDeflection) +{ + SetErrorCode(KO); + + //Add a new Archimede object + Handle(GEOM_Object) aChamfer = GetEngine()->AddObject(GetDocID(), GEOM_ARCHIMEDE); + + //Add a new Archimede function + Handle(GEOM_Function) aFunction = aChamfer->AddFunction(GEOMImpl_ArchimedeDriver::GetID(), ARCHIMEDE_TYPE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ArchimedeDriver::GetID()) return NULL; + + GEOMImpl_IArchimede aAI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aAI.SetBasicShape(aRefShape); + aAI.SetWeight(theWeight); + aAI.SetDensity(theWaterDensity); + aAI.SetDeflection(theMeshingDeflection); + + //Compute the Archimede value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Archimede 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) << aChamfer + << " = geompy.Archimede(" << theShape << ", " << theWeight << ", " + << theWaterDensity << ", " << theMeshingDeflection << ")"; + + SetErrorCode(OK); + return aChamfer; +} + +//============================================================================= +/*! + * GetSubShape + */ +//============================================================================= +bool GEOMImpl_ILocalOperations::GetSubShape (const TopoDS_Shape& theShape, const int theIndex, + TopoDS_Shape& theSubShape) +{ + if (theShape.IsNull() || theIndex < 1) + return false; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(theShape, anIndices); + if (theIndex > anIndices.Extent()) return false; + theSubShape = anIndices.FindKey(theIndex); + + return true; +} + +//============================================================================= +/*! + * GetSubShapeIndex + */ +//============================================================================= +Standard_Integer GEOMImpl_ILocalOperations::GetSubShapeIndex (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theSubShape) +{ + SetErrorCode(KO); + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape aSubShape = theSubShape->GetValue(); + + if (aShape.IsNull() || aSubShape.IsNull()) return -1; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + if (anIndices.Contains(aSubShape)) { + SetErrorCode(OK); + return anIndices.FindIndex(aSubShape); + } + + return -1; +} diff --git a/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx b/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx new file mode 100644 index 000000000..9050413e3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ILocalOperations.hxx @@ -0,0 +1,63 @@ +// 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/ +// + +#ifndef _GEOMImpl_ILocalOperations_HXX_ +#define _GEOMImpl_ILocalOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include + +#include + +class GEOMImpl_ILocalOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_ILocalOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_ILocalOperations(); + + Standard_EXPORT Handle(GEOM_Object) MakeFilletAll (Handle(GEOM_Object) theShape, double theR); + Standard_EXPORT Handle(GEOM_Object) MakeFilletEdges (Handle(GEOM_Object) theShape, double theR, + list theEdges); + Standard_EXPORT Handle(GEOM_Object) MakeFilletFaces (Handle(GEOM_Object) theShape, double theR, + list theFaces); + + Standard_EXPORT Handle(GEOM_Object) MakeChamferAll (Handle(GEOM_Object) theShape, double theD); + Standard_EXPORT Handle(GEOM_Object) MakeChamferEdge (Handle(GEOM_Object) theShape, + double theD1, double theD2, + int theFace1, int theFace2); + Standard_EXPORT Handle(GEOM_Object) MakeChamferFaces (Handle(GEOM_Object) theShape, + double theD1, double theD2, + list theFaces); + + Standard_EXPORT Handle(GEOM_Object) MakeArchimede (Handle(GEOM_Object) theShape, + double theWeight, double theWaterDensity, + double theMeshingDeflection); + + Standard_EXPORT Standard_Integer GetSubShapeIndex (Handle(GEOM_Object) theShape, + Handle(GEOM_Object) theSubShape); + + Standard_EXPORT static bool GetSubShape (const TopoDS_Shape& theShape, + const int theIndex, + TopoDS_Shape& theSubShape); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IMarker.hxx b/src/GEOMImpl/GEOMImpl_IMarker.hxx new file mode 100644 index 000000000..2e6b157ac --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IMarker.hxx @@ -0,0 +1,88 @@ +// 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/ +// +//NOTE: This is an interface to a function for the local coordinate system creation. + + +#include "GEOM_Function.hxx" + +#define CS_ARG_O_X 1 +#define CS_ARG_O_Y 2 +#define CS_ARG_O_Z 3 + +#define CS_ARG_X_DX 4 +#define CS_ARG_X_DY 5 +#define CS_ARG_X_DZ 6 + +#define CS_ARG_Y_DX 7 +#define CS_ARG_Y_DY 8 +#define CS_ARG_Y_DZ 9 + +class GEOMImpl_IMarker +{ + public: + + GEOMImpl_IMarker(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOrigin (const double theX, const double theY, const double theZ) + { + _func->SetReal(CS_ARG_O_X, theX); + _func->SetReal(CS_ARG_O_Y, theY); + _func->SetReal(CS_ARG_O_Z, theZ); + } + + void SetXDir (const double theDX, const double theDY, const double theDZ) + { + _func->SetReal(CS_ARG_X_DX, theDX); + _func->SetReal(CS_ARG_X_DY, theDY); + _func->SetReal(CS_ARG_X_DZ, theDZ); + } + + void SetYDir (const double theDX, const double theDY, const double theDZ) + { + _func->SetReal(CS_ARG_Y_DX, theDX); + _func->SetReal(CS_ARG_Y_DY, theDY); + _func->SetReal(CS_ARG_Y_DZ, theDZ); + } + + void GetOrigin (double& theX, double& theY, double& theZ) + { + theX = _func->GetReal(CS_ARG_O_X); + theY = _func->GetReal(CS_ARG_O_Y); + theZ = _func->GetReal(CS_ARG_O_Z); + } + + void GetXDir (double& theDX, double& theDY, double& theDZ) + { + theDX = _func->GetReal(CS_ARG_X_DX); + theDY = _func->GetReal(CS_ARG_X_DY); + theDZ = _func->GetReal(CS_ARG_X_DZ); + } + + void GetYDir (double& theDX, double& theDY, double& theDZ) + { + theDX = _func->GetReal(CS_ARG_Y_DX); + theDY = _func->GetReal(CS_ARG_Y_DY); + theDZ = _func->GetReal(CS_ARG_Y_DZ); + } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IMeasure.hxx b/src/GEOMImpl/GEOMImpl_IMeasure.hxx new file mode 100644 index 000000000..32ff00963 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IMeasure.hxx @@ -0,0 +1,41 @@ +// 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/ +// +// NOTE: This is an interface to a functions for the Measurement + + +#include "GEOM_Function.hxx" + +#define MEASURE_ARG_BASE 1 + +class GEOMImpl_IMeasure +{ + public: + + GEOMImpl_IMeasure(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetBase(Handle(GEOM_Function) theRefBase) + { _func->SetReference(MEASURE_ARG_BASE, theRefBase); } + + Handle(GEOM_Function) GetBase() { return _func->GetReference(MEASURE_ARG_BASE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx new file mode 100644 index 000000000..4cc2facc4 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -0,0 +1,926 @@ +// 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/ +// +#include + +#include + +#include +#include +#include + +#include +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IMeasureOperations::GEOMImpl_IMeasureOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IMeasureOperations::GEOMImpl_IMeasureOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IMeasureOperations::~GEOMImpl_IMeasureOperations() +{ + MESSAGE("GEOMImpl_IMeasureOperations::~GEOMImpl_IMeasureOperations"); +} + + +//============================================================================= +/*! + * GetCentreOfMass + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IMeasureOperations::GetCentreOfMass + (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + //Add a new CentreOfMass object + Handle(GEOM_Object) aCDG = GetEngine()->AddObject(GetDocID(), GEOM_CDG); + + //Add a new CentreOfMass function + Handle(GEOM_Function) aFunction = + aCDG->AddFunction(GEOMImpl_MeasureDriver::GetID(), CDG_MEASURE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MeasureDriver::GetID()) return NULL; + + GEOMImpl_IMeasure aCI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aCI.SetBase(aRefShape); + + //Compute the CentreOfMass value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Measure driver failed to compute centre of mass"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aCDG << " = geompy.MakeCDG(" << theShape << ")"; + + SetErrorCode(OK); + return aCDG; +} + +//============================================================================= +/*! + * GetBasicProperties + */ +//============================================================================= +void GEOMImpl_IMeasureOperations::GetBasicProperties (Handle(GEOM_Object) theShape, + Standard_Real& theLength, + Standard_Real& theSurfArea, + Standard_Real& theVolume) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return; + } + + //Compute the parameters + GProp_GProps LProps, SProps; + try { + BRepGProp::LinearProperties(aShape, LProps); + theLength = LProps.Mass(); + + BRepGProp::SurfaceProperties(aShape, SProps); + theSurfArea = SProps.Mass(); + + theVolume = 0.0; + if (aShape.ShapeType() < TopAbs_SHELL) { + for (TopExp_Explorer Exp (aShape, TopAbs_SOLID); Exp.More(); Exp.Next()) { + GProp_GProps VProps; + BRepGProp::VolumeProperties(Exp.Current(), VProps); + theVolume += VProps.Mass(); + } + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return; + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * GetInertia + */ +//============================================================================= +void GEOMImpl_IMeasureOperations::GetInertia + (Handle(GEOM_Object) theShape, + Standard_Real& I11, Standard_Real& I12, Standard_Real& I13, + Standard_Real& I21, Standard_Real& I22, Standard_Real& I23, + Standard_Real& I31, Standard_Real& I32, Standard_Real& I33, + Standard_Real& Ix , Standard_Real& Iy , Standard_Real& Iz) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return; + } + + //Compute the parameters + GProp_GProps System; + + try { + if (aShape.ShapeType() == TopAbs_VERTEX || + aShape.ShapeType() == TopAbs_EDGE || + aShape.ShapeType() == TopAbs_WIRE) { + BRepGProp::LinearProperties(aShape, System); + } else if (aShape.ShapeType() == TopAbs_FACE || + aShape.ShapeType() == TopAbs_SHELL) { + BRepGProp::SurfaceProperties(aShape, System); + } else { + BRepGProp::VolumeProperties(aShape, System); + } + gp_Mat I = System.MatrixOfInertia(); + + I11 = I(1,1); + I12 = I(1,2); + I13 = I(1,3); + + I21 = I(2,1); + I22 = I(2,2); + I23 = I(2,3); + + I31 = I(3,1); + I32 = I(3,2); + I33 = I(3,3); + + GProp_PrincipalProps Pr = System.PrincipalProperties(); + Pr.Moments(Ix,Iy,Iz); + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return; + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * GetBoundingBox + */ +//============================================================================= +void GEOMImpl_IMeasureOperations::GetBoundingBox + (Handle(GEOM_Object) theShape, + Standard_Real& Xmin, Standard_Real& Xmax, + Standard_Real& Ymin, Standard_Real& Ymax, + Standard_Real& Zmin, Standard_Real& Zmax) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return; + } + + //Compute the parameters + Bnd_Box B; + + try { + BRepBndLib::Add(aShape, B); + B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return; + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * GetTolerance + */ +//============================================================================= +void GEOMImpl_IMeasureOperations::GetTolerance + (Handle(GEOM_Object) theShape, + Standard_Real& FaceMin, Standard_Real& FaceMax, + Standard_Real& EdgeMin, Standard_Real& EdgeMax, + Standard_Real& VertMin, Standard_Real& VertMax) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return; + } + + //Compute the parameters + Standard_Real T; + FaceMin = EdgeMin = VertMin = RealLast(); + FaceMax = EdgeMax = VertMax = -RealLast(); + + try { + for (TopExp_Explorer ExF (aShape, TopAbs_FACE); ExF.More(); ExF.Next()) { + TopoDS_Face Face = TopoDS::Face(ExF.Current()); + T = BRep_Tool::Tolerance(Face); + if (T > FaceMax) + FaceMax = T; + if (T < FaceMin) + FaceMin = T; + } + for (TopExp_Explorer ExE (aShape, TopAbs_EDGE); ExE.More(); ExE.Next()) { + TopoDS_Edge Edge = TopoDS::Edge(ExE.Current()); + T = BRep_Tool::Tolerance(Edge); + if (T > EdgeMax) + EdgeMax = T; + if (T < EdgeMin) + EdgeMin = T; + } + for (TopExp_Explorer ExV (aShape, TopAbs_VERTEX); ExV.More(); ExV.Next()) { + TopoDS_Vertex Vertex = TopoDS::Vertex(ExV.Current()); + T = BRep_Tool::Tolerance(Vertex); + if (T > VertMax) + VertMax = T; + if (T < VertMin) + VertMin = T; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return; + } + + SetErrorCode(OK); +} + +//============================================================================= +/*! + * CheckShape + */ +//============================================================================= +bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, + TCollection_AsciiString& theDump) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return false; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return false; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return false; + } + + //Compute the parameters + bool isValid = false; + try { + BRepCheck_Analyzer ana (aShape, false); + if (ana.IsValid()) { + theDump.Clear(); + isValid = true; + } else { + StructuralDump(ana, aShape, theDump); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return false; + } + + SetErrorCode(OK); + return isValid; +} + +//============================================================================= +/*! + * WhatIs + */ +//============================================================================= +TCollection_AsciiString GEOMImpl_IMeasureOperations::WhatIs (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + TCollection_AsciiString Astr; + + if (theShape.IsNull()) return Astr; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return Astr; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return Astr; + } + + //Compute the parameters + if (aShape.ShapeType() == TopAbs_EDGE) { + if (BRep_Tool::Degenerated(TopoDS::Edge(aShape))) { + Astr = Astr + " It is a degenerated edge \n"; + } + } + + Astr = Astr + " Number of sub-shapes : \n"; + + try { + int iType, nbTypes [TopAbs_SHAPE]; + for (iType = 0; iType < TopAbs_SHAPE; ++iType) + nbTypes[iType] = 0; + nbTypes[aShape.ShapeType()]++; + + TopTools_MapOfShape aMapOfShape; + aMapOfShape.Add(aShape); + TopTools_ListOfShape aListOfShape; + aListOfShape.Append(aShape); + + TopTools_ListIteratorOfListOfShape itL (aListOfShape); + for (; itL.More(); itL.Next()) { + TopoDS_Iterator it (itL.Value()); + for (; it.More(); it.Next()) { + TopoDS_Shape s = it.Value(); + if (aMapOfShape.Add(s)) { + aListOfShape.Append(s); + nbTypes[s.ShapeType()]++; + } + } + } + + Astr = Astr + " VERTEX : " + TCollection_AsciiString(nbTypes[TopAbs_VERTEX]) + "\n"; + Astr = Astr + " EDGE : " + TCollection_AsciiString(nbTypes[TopAbs_EDGE]) + "\n"; + Astr = Astr + " WIRE : " + TCollection_AsciiString(nbTypes[TopAbs_WIRE]) + "\n"; + Astr = Astr + " FACE : " + TCollection_AsciiString(nbTypes[TopAbs_FACE]) + "\n"; + Astr = Astr + " SHELL : " + TCollection_AsciiString(nbTypes[TopAbs_SHELL]) + "\n"; + Astr = Astr + " SOLID : " + TCollection_AsciiString(nbTypes[TopAbs_SOLID]) + "\n"; + Astr = Astr + " COMPSOLID : " + TCollection_AsciiString(nbTypes[TopAbs_COMPSOLID]) + "\n"; + Astr = Astr + " COMPOUND : " + TCollection_AsciiString(nbTypes[TopAbs_COMPOUND]) + "\n"; + Astr = Astr + " SHAPE : " + TCollection_AsciiString(aMapOfShape.Extent()); + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return Astr; + } + + SetErrorCode(OK); + return Astr; +} + +//============================================================================= +/*! + * GetMinDistance + */ +//============================================================================= +Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance + (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, + Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1, + Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2) +{ + SetErrorCode(KO); + Standard_Real MinDist = 1.e9; + + if (theShape1.IsNull() || theShape2.IsNull()) return MinDist; + + Handle(GEOM_Function) aRefShape1 = theShape1->GetLastFunction(); + Handle(GEOM_Function) aRefShape2 = theShape2->GetLastFunction(); + if (aRefShape1.IsNull() || aRefShape2.IsNull()) return MinDist; + + TopoDS_Shape aShape1 = aRefShape1->GetValue(); + TopoDS_Shape aShape2 = aRefShape2->GetValue(); + if (aShape1.IsNull() || aShape2.IsNull()) { + SetErrorCode("One of Objects has NULL Shape"); + return MinDist; + } + + //Compute the parameters + try { + BRepExtrema_DistShapeShape dst (aShape1, aShape2); + if (dst.IsDone()) { + gp_Pnt PMin1, PMin2, P1, P2; + + for (int i = 1; i <= dst.NbSolution(); i++) { + P1 = dst.PointOnShape1(i); + P2 = dst.PointOnShape2(i); + + Standard_Real Dist = P1.Distance(P2); + if (MinDist > Dist) { + MinDist = Dist; + PMin1 = P1; + PMin2 = P2; + } + } + + PMin1.Coord(X1, Y1, Z1); + PMin2.Coord(X2, Y2, Z2); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return MinDist; + } + + SetErrorCode(OK); + return MinDist; +} + +//======================================================================= +//function : PointCoordinates +//purpose : Get coordinates of point +//======================================================================= +void GEOMImpl_IMeasureOperations::PointCoordinates( Handle(GEOM_Object) theShape, + Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ ) +{ + SetErrorCode( KO ); + + if ( theShape.IsNull() ) + return; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if ( aRefShape.IsNull() ) + return; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if ( aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX ) + { + SetErrorCode( "Shape must be a vertex" ); + return; + } + + try + { + gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) ); + theX = aPnt.X(); + theY = aPnt.Y(); + theZ = aPnt.Z(); + SetErrorCode( OK ); + } + catch ( Standard_Failure ) + { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode( aFail->GetMessageString() ); + } +} + +//======================================================================= +//function : StructuralDump +//purpose : Structural (data exchange) style of output. +//======================================================================= +void GEOMImpl_IMeasureOperations::StructuralDump (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + TCollection_AsciiString& theDump) +{ + Standard_Integer i; + theDump.Clear(); + theDump += " -- The Shape has problems :\n"; + theDump += " Check Count\n"; + theDump += " ------------------------------------------------\n"; + + Standard_Integer last_stat = (Standard_Integer)BRepCheck_CheckFail; + Handle(TColStd_HArray1OfInteger) NbProblems = + new TColStd_HArray1OfInteger(1, last_stat); + for (i = 1; i <= last_stat; i++) + NbProblems->SetValue(i,0); + + Handle(TopTools_HSequenceOfShape) sl; + sl = new TopTools_HSequenceOfShape(); + TopTools_DataMapOfShapeListOfShape theMap; + theMap.Clear(); + GetProblemShapes(theAna, theShape, sl, NbProblems, theMap); + theMap.Clear(); + + Standard_Integer count = 0; + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnCurve); + if (count > 0) { + theDump += " Invalid Point on Curve ................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnCurveOnSurface); + if (count > 0) { + theDump += " Invalid Point on CurveOnSurface .......... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnSurface); + if (count > 0) { + theDump += " Invalid Point on Surface ................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_No3DCurve); + if (count > 0) { + theDump += " No 3D Curve .............................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_Multiple3DCurve); + if (count > 0) { + theDump += " Multiple 3D Curve ........................ "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_Invalid3DCurve); + if (count > 0) { + theDump += " Invalid 3D Curve ......................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_NoCurveOnSurface); + if (count > 0) { + theDump += " No Curve on Surface ...................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidCurveOnSurface); + if (count > 0) { + theDump += " Invalid Curve on Surface ................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidCurveOnClosedSurface); + if (count > 0) { + theDump += " Invalid Curve on closed Surface .......... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidSameRangeFlag); + if (count > 0) { + theDump += " Invalid SameRange Flag ................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidSameParameterFlag); + if (count > 0) { + theDump += " Invalid SameParameter Flag ............... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidDegeneratedFlag); + if (count > 0) { + theDump += " Invalid Degenerated Flag ................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_FreeEdge); + if (count > 0) { + theDump += " Free Edge ................................ "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidMultiConnexity); + if (count > 0) { + theDump += " Invalid MultiConnexity ................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidRange); + if (count > 0) { + theDump += " Invalid Range ............................ "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_EmptyWire); + if (count > 0) { + theDump += " Empty Wire ............................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantEdge); + if (count > 0) { + theDump += " Redundant Edge ........................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_SelfIntersectingWire); + if (count > 0) { + theDump += " Self Intersecting Wire ................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_NoSurface); + if (count > 0) { + theDump += " No Surface ............................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidWire); + if (count > 0) { + theDump += " Invalid Wire ............................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantWire); + if (count > 0) { + theDump += " Redundant Wire ........................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_IntersectingWires); + if (count > 0) { + theDump += " Intersecting Wires ....................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidImbricationOfWires); + if (count > 0) { + theDump += " Invalid Imbrication of Wires ............. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_EmptyShell); + if (count > 0) { + theDump += " Empty Shell .............................. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantFace); + if (count > 0) { + theDump += " Redundant Face ........................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_UnorientableShape); + if (count > 0) { + theDump += " Unorientable Shape ....................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_NotClosed); + if (count > 0) { + theDump += " Not Closed ............................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_NotConnected); + if (count > 0) { + theDump += " Not Connected ............................ "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_SubshapeNotInShape); + if (count > 0) { + theDump += " Subshape not in Shape .................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_BadOrientation); + if (count > 0) { + theDump += " Bad Orientation .......................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_BadOrientationOfSubshape); + if (count > 0) { + theDump += " Bad Orientation of Subshape .............. "; + theDump += TCollection_AsciiString(count) + "\n"; + } + count = NbProblems->Value((Standard_Integer)BRepCheck_CheckFail); + if (count > 0) { + theDump += " checkshape failure ....................... "; + theDump += TCollection_AsciiString(count) + "\n"; + } + + theDump += " ------------------------------------------------\n"; + theDump += "*** Shapes with problems : "; + theDump += TCollection_AsciiString(sl->Length()) + "\n"; + + Standard_Integer nbv, nbe, nbw, nbf, nbs, nbo; + nbv = nbe = nbw = nbf = nbs = nbo = 0; + + for (i = 1; i <= sl->Length(); i++) { + TopoDS_Shape shi = sl->Value(i); + TopAbs_ShapeEnum sti = shi.ShapeType(); + switch (sti) { + case TopAbs_VERTEX : nbv++; break; + case TopAbs_EDGE : nbe++; break; + case TopAbs_WIRE : nbw++; break; + case TopAbs_FACE : nbf++; break; + case TopAbs_SHELL : nbs++; break; + case TopAbs_SOLID : nbo++; break; + default : break; + } + } + + if (nbv > 0) { + theDump += "VERTEX : "; + if (nbv < 10) theDump += " "; + theDump += TCollection_AsciiString(nbv) + "\n"; + } + if (nbe > 0) { + theDump += "EDGE : "; + if (nbe < 10) theDump += " "; + theDump += TCollection_AsciiString(nbe) + "\n"; + } + if (nbw > 0) { + theDump += "WIRE : "; + if (nbw < 10) theDump += " "; + theDump += TCollection_AsciiString(nbw) + "\n"; + } + if (nbf > 0) { + theDump += "FACE : "; + if (nbf < 10) theDump += " "; + theDump += TCollection_AsciiString(nbf) + "\n"; + } + if (nbs > 0) { + theDump += "SHELL : "; + if (nbs < 10) theDump += " "; + theDump += TCollection_AsciiString(nbs) + "\n"; + } + if (nbo > 0) { + theDump += "SOLID : "; + if (nbo < 10) theDump += " "; + theDump += TCollection_AsciiString(nbo) + "\n"; + } +} + +//======================================================================= +//function : GetProblemShapes +// purpose : for StructuralDump +//======================================================================= +void GEOMImpl_IMeasureOperations::GetProblemShapes (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + Handle(TopTools_HSequenceOfShape)& sl, + Handle(TColStd_HArray1OfInteger)& NbProblems, + TopTools_DataMapOfShapeListOfShape& theMap) +{ + for (TopoDS_Iterator iter(theShape); iter.More(); iter.Next()) { + GetProblemShapes(theAna, iter.Value(), sl, NbProblems, theMap); + } + TopAbs_ShapeEnum styp = theShape.ShapeType(); + BRepCheck_ListIteratorOfListOfStatus itl; + TopTools_ListOfShape empty; + if (!theMap.IsBound(theShape)) { + theMap.Bind(theShape,empty); + + if (!theAna.Result(theShape).IsNull()) { + itl.Initialize(theAna.Result(theShape)->Status()); + // !!! May be, we have to print all the problems, not only the first one ? + if (itl.Value() != BRepCheck_NoError) { + sl->Append(theShape); + BRepCheck_Status stat = itl.Value(); + NbProblems->SetValue((Standard_Integer)stat, + NbProblems->Value((Standard_Integer)stat) + 1); + } + } + } + + switch (styp) { + case TopAbs_EDGE: + GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_VERTEX, theMap); + break; + case TopAbs_FACE: + GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_WIRE, theMap); + GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_EDGE, theMap); + GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_VERTEX, theMap); + break; + case TopAbs_SHELL: + break; + case TopAbs_SOLID: + GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_SHELL, theMap); + break; + default: + break; + } +} + +//======================================================================= +//function : Contains +//======================================================================= +static Standard_Boolean Contains (const TopTools_ListOfShape& L, + const TopoDS_Shape& S) +{ + TopTools_ListIteratorOfListOfShape it; + for (it.Initialize(L); it.More(); it.Next()) { + if (it.Value().IsSame(S)) { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : GetProblemSub +// purpose : for StructuralDump +//======================================================================= +void GEOMImpl_IMeasureOperations::GetProblemSub (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + Handle(TopTools_HSequenceOfShape)& sl, + Handle(TColStd_HArray1OfInteger)& NbProblems, + const TopAbs_ShapeEnum Subtype, + TopTools_DataMapOfShapeListOfShape& theMap) +{ + BRepCheck_ListIteratorOfListOfStatus itl; + TopExp_Explorer exp; + for (exp.Init(theShape, Subtype); exp.More(); exp.Next()) { + const TopoDS_Shape& sub = exp.Current(); + + const Handle(BRepCheck_Result)& res = theAna.Result(sub); + for (res->InitContextIterator(); + res->MoreShapeInContext(); + res->NextShapeInContext()) { + if (res->ContextualShape().IsSame(theShape) && !Contains(theMap(sub), theShape)) { + theMap(sub).Append(theShape); + itl.Initialize(res->StatusOnShape()); + + if (itl.Value() != BRepCheck_NoError) { + Standard_Integer ii = 0; + + for (ii = 1; ii <= sl->Length(); ii++) + if (sl->Value(ii).IsSame(sub)) break; + + if (ii > sl->Length()) { + sl->Append(sub); + BRepCheck_Status stat = itl.Value(); + NbProblems->SetValue((Standard_Integer)stat, + NbProblems->Value((Standard_Integer)stat) + 1); + } + for (ii = 1; ii <= sl->Length(); ii++) + if (sl->Value(ii).IsSame(theShape)) break; + if (ii > sl->Length()) { + sl->Append(theShape); + BRepCheck_Status stat = itl.Value(); + NbProblems->SetValue((Standard_Integer)stat, + NbProblems->Value((Standard_Integer)stat) + 1); + } + } + break; + } + } + } +} diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx new file mode 100644 index 000000000..541364583 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -0,0 +1,93 @@ +// 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/ +// + +#ifndef _GEOMImpl_IMeasureOperations_HXX_ +#define _GEOMImpl_IMeasureOperations_HXX_ + +#include "GEOM_IOperations.hxx" + +#include +#include +#include +#include + +class GEOM_Engine; +class Handle(GEOM_Object); + +class GEOMImpl_IMeasureOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IMeasureOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IMeasureOperations(); + + Standard_EXPORT Handle(GEOM_Object) GetCentreOfMass (Handle(GEOM_Object) theShape); + + Standard_EXPORT void GetBasicProperties (Handle(GEOM_Object) theShape, + Standard_Real& theLength, + Standard_Real& theSurfArea, + Standard_Real& theVolume); + + Standard_EXPORT void GetInertia (Handle(GEOM_Object) theShape, + Standard_Real& I11, Standard_Real& I12, Standard_Real& I13, + Standard_Real& I21, Standard_Real& I22, Standard_Real& I23, + Standard_Real& I31, Standard_Real& I32, Standard_Real& I33, + Standard_Real& Ix , Standard_Real& Iy , Standard_Real& Iz); + + Standard_EXPORT void GetBoundingBox (Handle(GEOM_Object) theShape, + Standard_Real& Xmin, Standard_Real& Xmax, + Standard_Real& Ymin, Standard_Real& Ymax, + Standard_Real& Zmin, Standard_Real& Zmax); + + Standard_EXPORT void GetTolerance (Handle(GEOM_Object) theShape, + Standard_Real& FaceMin, Standard_Real& FaceMax, + Standard_Real& EdgeMin, Standard_Real& EdgeMax, + Standard_Real& VertMin, Standard_Real& VertMax); + + Standard_EXPORT bool CheckShape (Handle(GEOM_Object) theShape, + TCollection_AsciiString& theDump); + + Standard_EXPORT TCollection_AsciiString WhatIs (Handle(GEOM_Object) theShape); + + Standard_EXPORT Standard_Real GetMinDistance (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2, + Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1, + Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2); + + Standard_EXPORT void PointCoordinates( Handle(GEOM_Object) theShape, + Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ ); + + private: + void StructuralDump (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + TCollection_AsciiString& theDump); + + void GetProblemShapes (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + Handle(TopTools_HSequenceOfShape)& sl, + Handle(TColStd_HArray1OfInteger)& NbProblems, + TopTools_DataMapOfShapeListOfShape& theMap); + + void GetProblemSub (const BRepCheck_Analyzer& theAna, + const TopoDS_Shape& theShape, + Handle(TopTools_HSequenceOfShape)& sl, + Handle(TColStd_HArray1OfInteger)& NbProblems, + const TopAbs_ShapeEnum Subtype, + TopTools_DataMapOfShapeListOfShape& theMap); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_IMirror.hxx b/src/GEOMImpl/GEOMImpl_IMirror.hxx new file mode 100644 index 000000000..94a00b9fd --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IMirror.hxx @@ -0,0 +1,49 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Mirror creation. + + +#include "GEOM_Function.hxx" + +#define MIRROR_ARG_ORIGINAL 1 +#define MIRROR_ARG_PLANE 2 +#define MIRROR_ARG_AXIS 3 +#define MIRROR_ARG_POINT 4 + +class GEOMImpl_IMirror +{ + public: + + GEOMImpl_IMirror(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetOriginal(Handle(GEOM_Function) theShape) { _func->SetReference(MIRROR_ARG_ORIGINAL, theShape); } + void SetPlane (Handle(GEOM_Function) thePlane) { _func->SetReference(MIRROR_ARG_PLANE, thePlane); } + void SetAxis (Handle(GEOM_Function) theAxis ) { _func->SetReference(MIRROR_ARG_AXIS , theAxis ); } + void SetPoint (Handle(GEOM_Function) thePoint) { _func->SetReference(MIRROR_ARG_POINT, thePoint); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(MIRROR_ARG_ORIGINAL); } + Handle(GEOM_Function) GetPlane() { return _func->GetReference(MIRROR_ARG_PLANE); } + Handle(GEOM_Function) GetAxis () { return _func->GetReference(MIRROR_ARG_AXIS ); } + Handle(GEOM_Function) GetPoint() { return _func->GetReference(MIRROR_ARG_POINT); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IOffset.hxx b/src/GEOMImpl/GEOMImpl_IOffset.hxx new file mode 100644 index 000000000..5eb57cf28 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IOffset.hxx @@ -0,0 +1,45 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Offset creation. + + +#include "GEOM_Function.hxx" + +#define OFF_ARG_SHAPE 1 +#define OFF_ARG_VALUE 2 + +class GEOMImpl_IOffset +{ + public: + + GEOMImpl_IOffset(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(OFF_ARG_SHAPE, theShape); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(OFF_ARG_SHAPE); } + + void SetValue(double theValue) { _func->SetReal(OFF_ARG_VALUE, theValue); } + + double GetValue() { return _func->GetReal(OFF_ARG_VALUE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPartition.hxx b/src/GEOMImpl/GEOMImpl_IPartition.hxx new file mode 100644 index 000000000..575f6e6c4 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPartition.hxx @@ -0,0 +1,82 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Partition creation. + + +#include "GEOM_Function.hxx" + +#include "TColStd_HSequenceOfTransient.hxx" +#include "TColStd_HArray1OfInteger.hxx" + +#define PART_ARG_LIMIT 1 +#define PART_ARG_SHAPES 2 +#define PART_ARG_TOOLS 3 +#define PART_ARG_KEEP_IN 4 +#define PART_ARG_REM_IN 5 + +#define PART_ARG_MATERIALS 6 + +#define PART_ARG_SHAPE 7 +#define PART_ARG_PLANE 8 + +class GEOMImpl_IPartition +{ + public: + + GEOMImpl_IPartition(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetLimit(int theLimit) { _func->SetInteger(PART_ARG_LIMIT, theLimit); } + + void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(PART_ARG_SHAPES, theShapes); } + + void SetTools(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(PART_ARG_TOOLS, theShapes); } + + void SetKeepIns(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(PART_ARG_KEEP_IN, theShapes); } + + void SetRemoveIns(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(PART_ARG_REM_IN, theShapes); } + + void SetMaterials(const Handle(TColStd_HArray1OfInteger)& theMaterials) + { _func->SetIntegerArray(PART_ARG_MATERIALS, theMaterials); } + + + int GetLimit() { return _func->GetInteger(PART_ARG_LIMIT); } + + Handle(TColStd_HSequenceOfTransient) GetShapes() { return _func->GetReferenceList(PART_ARG_SHAPES); } + Handle(TColStd_HSequenceOfTransient) GetTools() { return _func->GetReferenceList(PART_ARG_TOOLS); } + Handle(TColStd_HSequenceOfTransient) GetKeepIns() { return _func->GetReferenceList(PART_ARG_KEEP_IN); } + Handle(TColStd_HSequenceOfTransient) GetRemoveIns() { return _func->GetReferenceList(PART_ARG_REM_IN); } + + Handle(TColStd_HArray1OfInteger) GetMaterials() { return _func->GetIntegerArray(PART_ARG_MATERIALS); } + + + void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(PART_ARG_SHAPE, theShape); } + void SetPlane(Handle(GEOM_Function) thePlane) { _func->SetReference(PART_ARG_PLANE, thePlane); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(PART_ARG_SHAPE); } + Handle(GEOM_Function) GetPlane() { return _func->GetReference(PART_ARG_PLANE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPipe.hxx b/src/GEOMImpl/GEOMImpl_IPipe.hxx new file mode 100644 index 000000000..5ed0050b9 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPipe.hxx @@ -0,0 +1,43 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Pipe creation. + + +#include "GEOM_Function.hxx" + +#define PIPE_ARG_BASE 1 +#define PIPE_ARG_PATH 2 + +class GEOMImpl_IPipe +{ + public: + + GEOMImpl_IPipe(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetBase (Handle(GEOM_Function) theBase) { _func->SetReference(PIPE_ARG_BASE, theBase); } + void SetPath (Handle(GEOM_Function) thePath) { _func->SetReference(PIPE_ARG_PATH, thePath); } + + Handle(GEOM_Function) GetBase() { return _func->GetReference(PIPE_ARG_BASE); } + Handle(GEOM_Function) GetPath() { return _func->GetReference(PIPE_ARG_PATH); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPlane.hxx b/src/GEOMImpl/GEOMImpl_IPlane.hxx new file mode 100644 index 000000000..5129d6a9d --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPlane.hxx @@ -0,0 +1,66 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the vector creation. + + +#include "GEOM_Function.hxx" + +#define PLN_ARG_SIZE 1 + +#define PLN_ARG_PNT1 2 +#define PLN_ARG_PNT2 3 +#define PLN_ARG_PNT3 4 + +#define PLN_ARG_VEC 5 + +#define PLN_ARG_REF 6 + +class GEOMImpl_IPlane +{ + public: + + GEOMImpl_IPlane(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetSize(double theSize) { _func->SetReal(PLN_ARG_SIZE, theSize); } + + double GetSize() { return _func->GetReal(PLN_ARG_SIZE); } + + void SetPoint (Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_PNT1, theRef); } + void SetVector(Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_VEC , theRef); } + + void SetFace (Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_REF , theRef); } + + void SetPoint1(Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_PNT1, theRef); } + void SetPoint2(Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_PNT2, theRef); } + void SetPoint3(Handle(GEOM_Function) theRef) { _func->SetReference(PLN_ARG_PNT3, theRef); } + + Handle(GEOM_Function) GetPoint () { return _func->GetReference(PLN_ARG_PNT1); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(PLN_ARG_VEC ); } + + Handle(GEOM_Function) GetFace () { return _func->GetReference(PLN_ARG_REF ); } + + Handle(GEOM_Function) GetPoint1() { return _func->GetReference(PLN_ARG_PNT1); } + Handle(GEOM_Function) GetPoint2() { return _func->GetReference(PLN_ARG_PNT2); } + Handle(GEOM_Function) GetPoint3() { return _func->GetReference(PLN_ARG_PNT3); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPoint.hxx b/src/GEOMImpl/GEOMImpl_IPoint.hxx new file mode 100755 index 000000000..2adb7cfc6 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPoint.hxx @@ -0,0 +1,63 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the point creation. + + +#include "GEOM_Function.hxx" + +#define ARG_X 1 +#define ARG_Y 2 +#define ARG_Z 3 + +#define ARG_REF 4 + +#define ARG_PARAM 5 +#define ARG_CURVE 6 + +class GEOMImpl_IPoint +{ + public: + + GEOMImpl_IPoint(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetX(double theX) { _func->SetReal(ARG_X, theX); } + void SetY(double theY) { _func->SetReal(ARG_Y, theY); } + void SetZ(double theZ) { _func->SetReal(ARG_Z, theZ); } + + double GetX() { return _func->GetReal(ARG_X); } + double GetY() { return _func->GetReal(ARG_Y); } + double GetZ() { return _func->GetReal(ARG_Z); } + + void SetRef(Handle(GEOM_Function) theRefPoint) { _func->SetReference(ARG_REF, theRefPoint); } + + Handle(GEOM_Function) GetRef() { return _func->GetReference(ARG_REF); } + + void SetCurve(Handle(GEOM_Function) theRef) { _func->SetReference(ARG_CURVE, theRef); } + + Handle(GEOM_Function) GetCurve() { return _func->GetReference(ARG_CURVE); } + + void SetParameter(double theParam) { _func->SetReal(ARG_PARAM, theParam); } + + double GetParameter() { return _func->GetReal(ARG_PARAM); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPolyline.hxx b/src/GEOMImpl/GEOMImpl_IPolyline.hxx new file mode 100644 index 000000000..c76c8a992 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPolyline.hxx @@ -0,0 +1,45 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Polyline creation. + + +#include "GEOM_Function.hxx" + +#define POLY_ARG_LENG 1 +#define POLY_ARG_LAST 1 + +class GEOMImpl_IPolyline +{ + public: + + GEOMImpl_IPolyline(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetLength(int theLen) { _func->SetInteger(POLY_ARG_LENG, theLen); } + + void SetPoint(int theId, Handle(GEOM_Function) theP) { _func->SetReference(POLY_ARG_LAST + theId, theP); } + + int GetLength() { return _func->GetInteger(POLY_ARG_LENG); } + + Handle(GEOM_Function) GetPoint(int theId) { return _func->GetReference(POLY_ARG_LAST + theId); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPosition.hxx b/src/GEOMImpl/GEOMImpl_IPosition.hxx new file mode 100644 index 000000000..194f6c7ea --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPosition.hxx @@ -0,0 +1,52 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Setting In Position. + + +#include "GEOM_Function.hxx" + +#define POSITION_ARG_SHAPE 1 +#define POSITION_ARG_START_LCS 2 +#define POSITION_ARG_END_LCS 3 + +class GEOMImpl_IPosition +{ + public: + + GEOMImpl_IPosition(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(POSITION_ARG_SHAPE, theShape); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(POSITION_ARG_SHAPE); } + + void SetStartLCS(Handle(GEOM_Function) theStartLCS) + { _func->SetReference(POSITION_ARG_START_LCS, theStartLCS); } + + Handle(GEOM_Function) GetStartLCS() { return _func->GetReference(POSITION_ARG_START_LCS); } + + void SetEndLCS(Handle(GEOM_Function) theEndLCS) + { _func->SetReference(POSITION_ARG_END_LCS, theEndLCS); } + + Handle(GEOM_Function) GetEndLCS() { return _func->GetReference(POSITION_ARG_END_LCS); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IPrism.hxx b/src/GEOMImpl/GEOMImpl_IPrism.hxx new file mode 100644 index 000000000..7d82753a3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IPrism.hxx @@ -0,0 +1,54 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Prism creation. + + +#include "GEOM_Function.hxx" + +#define PRISM_ARG_H 1 +#define PRISM_ARG_VEC 2 +#define PRISM_ARG_BASE 3 +#define PRISM_ARG_PNT_F 4 +#define PRISM_ARG_PNT_L 5 + +class GEOMImpl_IPrism +{ + public: + + GEOMImpl_IPrism(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetBase (Handle(GEOM_Function) theRefBase ) { _func->SetReference(PRISM_ARG_BASE, theRefBase); } + void SetVector(Handle(GEOM_Function) theRefVector) { _func->SetReference(PRISM_ARG_VEC , theRefVector); } + void SetFirstPoint(Handle(GEOM_Function) thePoint) { _func->SetReference(PRISM_ARG_PNT_F, thePoint); } + void SetLastPoint (Handle(GEOM_Function) thePoint) { _func->SetReference(PRISM_ARG_PNT_L, thePoint); } + + Handle(GEOM_Function) GetBase () { return _func->GetReference(PRISM_ARG_BASE); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(PRISM_ARG_VEC ); } + Handle(GEOM_Function) GetFirstPoint() { return _func->GetReference(PRISM_ARG_PNT_F ); } + Handle(GEOM_Function) GetLastPoint () { return _func->GetReference(PRISM_ARG_PNT_L ); } + + void SetH(double theH) { _func->SetReal(PRISM_ARG_H, theH); } + + double GetH() { return _func->GetReal(PRISM_ARG_H); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IRevolution.hxx b/src/GEOMImpl/GEOMImpl_IRevolution.hxx new file mode 100644 index 000000000..5857361bb --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IRevolution.hxx @@ -0,0 +1,50 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Revolution creation. + + +#include "GEOM_Function.hxx" + +#define REVOL_ARG_ANGLE 1 +#define REVOL_ARG_AXIS 2 +#define REVOL_ARG_BASE 3 + +class GEOMImpl_IRevolution +{ + public: + + GEOMImpl_IRevolution(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetAngle(double theAngle) { _func->SetReal(REVOL_ARG_ANGLE, theAngle); } + + double GetAngle() { return _func->GetReal(REVOL_ARG_ANGLE); } + + void SetAxis(Handle(GEOM_Function) theRefAxis) { _func->SetReference(REVOL_ARG_AXIS, theRefAxis); } + + Handle(GEOM_Function) GetAxis() { return _func->GetReference(REVOL_ARG_AXIS); } + + void SetBase(Handle(GEOM_Function) theRefBase) { _func->SetReference(REVOL_ARG_BASE, theRefBase); } + + Handle(GEOM_Function) GetBase() { return _func->GetReference(REVOL_ARG_BASE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IRotate.hxx b/src/GEOMImpl/GEOMImpl_IRotate.hxx new file mode 100644 index 000000000..44e7cccac --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IRotate.hxx @@ -0,0 +1,66 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Rotate operation. + + +#include "GEOM_Function.hxx" + +#define ROTATE_ANGLE 1 +#define ROTATE_AXIS 2 +#define ROTATE_ORGN 3 +#define ROTATE_STEP1 4 +#define ROTATE_NBITER1 5 +#define ROTATE_NBITER2 6 + +class GEOMImpl_IRotate +{ + public: + + GEOMImpl_IRotate(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetAngle(Standard_Real theAngle) { _func->SetReal(ROTATE_ANGLE, theAngle); } + + Standard_Real GetAngle() { return _func->GetReal(ROTATE_ANGLE); } + + void SetAxis(Handle(GEOM_Function) theVector) { _func->SetReference(ROTATE_AXIS, theVector); } + + Handle(GEOM_Function) GetAxis() { return _func->GetReference(ROTATE_AXIS); } + + void SetOriginal(Handle(GEOM_Function) theOriginal) { _func->SetReference(ROTATE_ORGN, theOriginal); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(ROTATE_ORGN); } + + void SetStep(double theStep) { return _func->SetReal(ROTATE_STEP1, theStep); } + + double GetStep() { return _func->GetReal(ROTATE_STEP1); } + + void SetNbIter1(int theNbIter) { _func->SetInteger(ROTATE_NBITER1, theNbIter); } + + int GetNbIter1() { return _func->GetInteger(ROTATE_NBITER1); } + + void SetNbIter2(int theNbIter) { _func->SetInteger(ROTATE_NBITER2, theNbIter); } + + int GetNbIter2() { return _func->GetInteger(ROTATE_NBITER2); } + + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IScale.hxx b/src/GEOMImpl/GEOMImpl_IScale.hxx new file mode 100644 index 000000000..75df3263b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IScale.hxx @@ -0,0 +1,50 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Scale creation. + + +#include "GEOM_Function.hxx" + +#define SCALE_ARG_SHAPE 1 +#define SCALE_ARG_VALUE 2 +#define SCALE_ARG_POINT 3 + +class GEOMImpl_IScale +{ + public: + + GEOMImpl_IScale(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShape(Handle(GEOM_Function) theShape) { _func->SetReference(SCALE_ARG_SHAPE, theShape); } + + Handle(GEOM_Function) GetShape() { return _func->GetReference(SCALE_ARG_SHAPE); } + + void SetFactor(double theValue) { _func->SetReal(SCALE_ARG_VALUE, theValue); } + + double GetFactor() { return _func->GetReal(SCALE_ARG_VALUE); } + + void SetPoint(Handle(GEOM_Function) thePoint) { _func->SetReference(SCALE_ARG_POINT, thePoint); } + + Handle(GEOM_Function) GetPoint() { return _func->GetReference(SCALE_ARG_POINT); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IShapes.hxx b/src/GEOMImpl/GEOMImpl_IShapes.hxx new file mode 100644 index 000000000..61d7fa6f3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IShapes.hxx @@ -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/ +// +// NOTE: This is an intreface to a function for the Shapes +// (Wire, Face, Shell, Solid and Compound) creation. + + +#include "GEOM_Function.hxx" + +#include "TColStd_HSequenceOfTransient.hxx" +#include "TColStd_HArray1OfInteger.hxx" + +#define SHAPE_ARG_SHAPES 1 // for Wire, Shell, Solid and Compound + +#define SHAPE_ARG_BASE 2 // for Face, Solid and Sub-shape + +#define SHAPE_ARG_PLANAR 3 // for Face + +#define SHAPE_ARG_SUBTYPE 4 // for Sub-shape +#define SHAPE_ARG_INDICES 5 // for Sub-shape + +class GEOMImpl_IShapes +{ + public: + + GEOMImpl_IShapes(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes) + { _func->SetReferenceList(SHAPE_ARG_SHAPES, theShapes); } + + Handle(TColStd_HSequenceOfTransient) GetShapes() + { return _func->GetReferenceList(SHAPE_ARG_SHAPES); } + + void SetBase(Handle(GEOM_Function) theRefBase) + { _func->SetReference(SHAPE_ARG_BASE, theRefBase); } + + Handle(GEOM_Function) GetBase() { return _func->GetReference(SHAPE_ARG_BASE); } + + void SetIsPlanar(const Standard_Boolean isPlanarWanted) + { _func->SetInteger(SHAPE_ARG_PLANAR, isPlanarWanted ? 1 : 0); } + + Standard_Boolean GetIsPlanar() { return (_func->GetInteger(SHAPE_ARG_PLANAR) == 1); } + + void SetSubShapeType(const Standard_Integer theType) + { _func->SetInteger(SHAPE_ARG_SUBTYPE, theType); } + + Standard_Integer GetSubShapeType() { return _func->GetInteger(SHAPE_ARG_SUBTYPE); } + + void SetIndices(const Handle(TColStd_HArray1OfInteger)& theIndices) + { _func->SetIntegerArray(SHAPE_ARG_INDICES, theIndices); } + + Handle(TColStd_HArray1OfInteger) GetIndices() + { return _func->GetIntegerArray(SHAPE_ARG_INDICES); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx new file mode 100644 index 000000000..39172e1a9 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -0,0 +1,2039 @@ +// 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/ +// +#include + +#include "GEOMImpl_IShapesOperations.hxx" + +#include "GEOMImpl_Types.hxx" + +#include "GEOMImpl_VectorDriver.hxx" +#include "GEOMImpl_ShapeDriver.hxx" +#include "GEOMImpl_CopyDriver.hxx" +#include "GEOMImpl_GlueDriver.hxx" + +#include "GEOMImpl_IVector.hxx" +#include "GEOMImpl_IShapes.hxx" +#include "GEOMImpl_IGlue.hxx" + +#include "GEOMImpl_Block6Explorer.hxx" + +#include "GEOM_Function.hxx" +#include "GEOM_PythonDump.hxx" + +#include "GEOMAlgo_FinderShapeOn1.hxx" +#include "GEOMAlgo_FinderShapeOnQuad.hxx" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +//#include + +//#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOMImpl_IShapesOperations::GEOMImpl_IShapesOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_IShapesOperations::GEOMImpl_IShapesOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOMImpl_IShapesOperations::~GEOMImpl_IShapesOperations() +{ + MESSAGE("GEOMImpl_IShapesOperations::~GEOMImpl_IShapesOperations"); +} + + +//============================================================================= +/*! + * MakeEdge + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeEdge + (Handle(GEOM_Object) thePnt1, Handle(GEOM_Object) thePnt2) +{ + SetErrorCode(KO); + + if (thePnt1.IsNull() || thePnt2.IsNull()) return NULL; + + //Add a new Edge object + Handle(GEOM_Object) anEdge = GetEngine()->AddObject(GetDocID(), GEOM_EDGE); + + //Add a new Vector function + Handle(GEOM_Function) aFunction = + anEdge->AddFunction(GEOMImpl_VectorDriver::GetID(), VECTOR_TWO_PNT); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_VectorDriver::GetID()) return NULL; + + GEOMImpl_IVector aPI (aFunction); + + Handle(GEOM_Function) aRef1 = thePnt1->GetLastFunction(); + Handle(GEOM_Function) aRef2 = thePnt2->GetLastFunction(); + if (aRef1.IsNull() || aRef2.IsNull()) return NULL; + + aPI.SetPoint1(aRef1); + aPI.SetPoint2(aRef2); + + //Compute the Edge value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Vector 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) << anEdge << " = geompy.MakeEdge(" + << thePnt1 << ", " << thePnt2 << ")"; + + SetErrorCode(OK); + return anEdge; +} + +//============================================================================= +/*! + * MakeWire + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeWire + (list theShapes) +{ + return MakeShape(theShapes, GEOM_WIRE, WIRE_EDGES, "MakeWire"); +} + +//============================================================================= +/*! + * MakeFace + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFace (Handle(GEOM_Object) theWire, + const bool isPlanarWanted) +{ + SetErrorCode(KO); + + if (theWire.IsNull()) return NULL; + + //Add a new Face object + Handle(GEOM_Object) aFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new Shape function for creation of a face from a wire + Handle(GEOM_Function) aFunction = + aFace->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_WIRE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(GEOM_Function) aRefWire = theWire->GetLastFunction(); + + if (aRefWire.IsNull()) return NULL; + + aCI.SetBase(aRefWire); + aCI.SetIsPlanar(isPlanarWanted); + + //Compute the Face value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape driver failed to compute a face"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aFace << " = geompy.MakeFace(" + << theWire << ", " << (int)isPlanarWanted << ")"; + + SetErrorCode(OK); + return aFace; +} + +//============================================================================= +/*! + * MakeFaceWires + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeFaceWires + (list theShapes, + const bool isPlanarWanted) +{ + SetErrorCode(KO); + + //Add a new object + Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), GEOM_FACE); + + //Add a new function + Handle(GEOM_Function) aFunction = + aShape->AddFunction(GEOMImpl_ShapeDriver::GetID(), FACE_WIRES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + + // Shapes + list::iterator it = theShapes.begin(); + for (; it != theShapes.end(); it++) { + Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL argument shape for the face construction"); + return NULL; + } + aShapesSeq->Append(aRefSh); + } + aCI.SetShapes(aShapesSeq); + + aCI.SetIsPlanar(isPlanarWanted); + + //Compute the shape + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape 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 pd (aFunction); + pd << aShape << " = geompy.MakeFaceWires(["; + + // Shapes + it = theShapes.begin(); + if (it != theShapes.end()) { + pd << (*it++); + while (it != theShapes.end()) { + pd << ", " << (*it++); + } + } + pd << "], " << (int)isPlanarWanted << ")"; + + SetErrorCode(OK); + return aShape; +} + +//============================================================================= +/*! + * MakeShell + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShell + (list theShapes) +{ + return MakeShape(theShapes, GEOM_SHELL, SHELL_FACES, "MakeShell"); +} + +//============================================================================= +/*! + * MakeSolidShells + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSolidShells + (list theShapes) +{ + return MakeShape(theShapes, GEOM_SOLID, SOLID_SHELLS, "MakeSolidShells"); +} + +//============================================================================= +/*! + * MakeSolidShell + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSolidShell (Handle(GEOM_Object) theShell) +{ + SetErrorCode(KO); + + if (theShell.IsNull()) return NULL; + + //Add a new Solid object + Handle(GEOM_Object) aSolid = GetEngine()->AddObject(GetDocID(), GEOM_SOLID); + + //Add a new Solid function for creation of a solid from a shell + Handle(GEOM_Function) aFunction = + aSolid->AddFunction(GEOMImpl_ShapeDriver::GetID(), SOLID_SHELL); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(GEOM_Function) aRefShell = theShell->GetLastFunction(); + + if (aRefShell.IsNull()) return NULL; + + aCI.SetBase(aRefShell); + + //Compute the Solid value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Solid 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) << aSolid + << " = geompy.MakeSolid(" << theShell << ")"; + + SetErrorCode(OK); + return aSolid; +} + +//============================================================================= +/*! + * MakeCompound + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeCompound + (list theShapes) +{ + return MakeShape(theShapes, GEOM_COMPOUND, COMPOUND_SHAPES, "MakeCompound"); +} + +//============================================================================= +/*! + * MakeShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShape + (list theShapes, + const Standard_Integer theObjectType, + const Standard_Integer theFunctionType, + const TCollection_AsciiString& theMethodName) +{ + SetErrorCode(KO); + + //Add a new object + Handle(GEOM_Object) aShape = GetEngine()->AddObject(GetDocID(), theObjectType); + + //Add a new function + Handle(GEOM_Function) aFunction = + aShape->AddFunction(GEOMImpl_ShapeDriver::GetID(), theFunctionType); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + + // Shapes + list::iterator it = theShapes.begin(); + for (; it != theShapes.end(); it++) { + Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL argument shape for the shape construction"); + return NULL; + } + aShapesSeq->Append(aRefSh); + } + aCI.SetShapes(aShapesSeq); + + //Compute the shape + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape 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 pd (aFunction); + pd << aShape << " = geompy." << theMethodName.ToCString() << "(["; + + // Shapes + it = theShapes.begin(); + if (it != theShapes.end()) { + pd << (*it++); + while (it != theShapes.end()) { + pd << ", " << (*it++); + } + } + pd << "])"; + + SetErrorCode(OK); + return aShape; +} + +//============================================================================= +/*! + * MakeGlueFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeGlueFaces + (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance) +{ + 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); + 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); + + //Compute the sub-shape value + Standard_Boolean isWarning = Standard_False; + try { + 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(aFunction) << aGlued << " = geompy.MakeGlueFaces(" + << theShape << ", " << theTolerance << ")"; + + // to provide warning + if (!isWarning) SetErrorCode(OK); + return aGlued; +} + +//============================================================================= +/*! + * MakeExplode + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode + (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + const Standard_Boolean isSorted) +{ +// OSD_Timer timer1, timer2, timer3, timer4; +// timer1.Start(); + + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + Handle(GEOM_Object) anObj; + Handle(GEOM_Function) aFunction; + TopTools_MapOfShape mapShape; + TopTools_ListOfShape listShape; + + if (aShape.ShapeType() == TopAbs_COMPOUND && + (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID || + TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND)) { + TopoDS_Iterator It (aShape, Standard_True, Standard_True); + for (; It.More(); It.Next()) { + if (mapShape.Add(It.Value())) { + if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) { + listShape.Append(It.Value()); + } + } + } + } else { + TopExp_Explorer exp (aShape, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) + if (mapShape.Add(exp.Current())) + listShape.Append(exp.Current()); + } + + if (listShape.IsEmpty()) { + SetErrorCode("The given shape has no sub-shapes of the requested type"); + return aSeq; + } + +// timer1.Stop(); +// timer2.Start(); + + if (isSorted) + SortShapes(listShape); + +// timer2.Stop(); +// timer3.Start(); + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + + TopTools_ListIteratorOfListOfShape itSub (listShape); + TCollection_AsciiString anAsciiList, anEntry; + 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); + aSeq->Append(anObj); + + // for python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + anAsciiList += anEntry; + anAsciiList += ","; + } + + //Make a Python command + anAsciiList.Trunc(anAsciiList.Length() - 1); + + aFunction = theShape->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + GEOM::TPythonDump pd (aFunction); + pd << anOldDescr.ToCString() << "\n\t[" << anAsciiList.ToCString(); + pd << "] = geompy.SubShapeAll" << (isSorted ? "Sorted(" : "("); + pd << theShape << ", " << theShapeType << ")"; + + SetErrorCode(OK); + +// timer4.Stop(); + +// cout << "Explosure takes:" << endl; +// timer1.Show(); +// cout << "Sorting takes:" << endl; +// timer2.Show(); +// cout << "Sub-shapes addition takes:" << endl; +// timer3.Show(); +// cout << "Update Description takes:" << endl; +// timer4.Show(); + + return aSeq; +} + +//============================================================================= +/*! + * GetSubShapeAllIDs + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::SubShapeAllIDs + (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + const Standard_Boolean isSorted) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + TopTools_MapOfShape mapShape; + TopTools_ListOfShape listShape; + + if (aShape.ShapeType() == TopAbs_COMPOUND && + (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID || + TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND)) { + TopoDS_Iterator It (aShape, Standard_True, Standard_True); + for (; It.More(); It.Next()) { + if (mapShape.Add(It.Value())) { + if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) { + listShape.Append(It.Value()); + } + } + } + } else { + TopExp_Explorer exp (aShape, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) + if (mapShape.Add(exp.Current())) + listShape.Append(exp.Current()); + } + + if (listShape.IsEmpty()) { + SetErrorCode("The given shape has no sub-shapes of the requested type"); + return aSeq; + } + + if (isSorted) + SortShapes(listShape); + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + + TopTools_ListIteratorOfListOfShape itSub (listShape); + for (int index = 1; itSub.More(); itSub.Next(), ++index) { + TopoDS_Shape aValue = itSub.Value(); + aSeq->Append(anIndices.FindIndex(aValue)); + } + + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << anOldDescr.ToCString() << "\n\tlistSubShapeIDs = geompy.SubShapeAll"; + pd << (isSorted ? "SortedIDs(" : "IDs("); + pd << theShape << ", " << theShapeType << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * GetSubShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSubShape + (Handle(GEOM_Object) theMainShape, + const Standard_Integer theID) +{ + SetErrorCode(KO); + + if (theMainShape.IsNull()) return NULL; + + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, theID); + Handle(GEOM_Object) anObj = GetEngine()->AddSubShape(theMainShape, anArray,true); + if (anObj.IsNull()) { + SetErrorCode("Can not get a sub-shape with the given ID"); + return NULL; + } + + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << anObj << " = geompy.GetSubShape(" + << theMainShape << ", [" << theID << "])"; + + SetErrorCode(OK); + return anObj; +} + + +//============================================================================= +/*! + * NumberOfFaces + */ +//============================================================================= +Standard_Integer GEOMImpl_IShapesOperations::NumberOfFaces (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + Standard_Integer nb = 0; + + if (theShape.IsNull()) return -1; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return -1; + + TopTools_MapOfShape mapShape; + + TopExp_Explorer exp (aShape, TopAbs_FACE); + for (; exp.More(); exp.Next()) + if (mapShape.Add(exp.Current())) + nb++; + + SetErrorCode(OK); + return nb; +} + +//============================================================================= +/*! + * NumberOfEdges + */ +//============================================================================= +Standard_Integer GEOMImpl_IShapesOperations::NumberOfEdges (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + Standard_Integer nb = 0; + + if (theShape.IsNull()) return -1; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return -1; + + TopTools_MapOfShape mapShape; + + TopExp_Explorer exp (aShape, TopAbs_EDGE); + for (; exp.More(); exp.Next()) + if (mapShape.Add(exp.Current())) + nb++; + + SetErrorCode(OK); + return nb; +} + +//============================================================================= +/*! + * ReverseShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::ReverseShape(Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + + //Add a new reversed object + Handle(GEOM_Object) aReversed = GetEngine()->AddObject(GetDocID(), theShape->GetType()); + + //Add a new Revese function + Handle(GEOM_Function) aFunction; + aFunction = aReversed->AddFunction(GEOMImpl_ShapeDriver::GetID(), REVERSE_ORIENTATION); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aSI (aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aSI.SetBase(aRefShape); + + //Compute the sub-shape value + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape driver failed to reverse shape"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump(aFunction) << aReversed + << " = geompy.ChangeOrientation(" << theShape << ")"; + + SetErrorCode(OK); + return aReversed; +} + +//============================================================================= +/*! + * GetFreeFacesIDs + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetFreeFacesIDs + (Handle(GEOM_Object) theShape) +{ + SetErrorCode(KO); + + if (theShape.IsNull()) return NULL; + TopoDS_Shape aShape = theShape->GetValue(); + if (aShape.IsNull()) return NULL; + + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + TopTools_IndexedDataMapOfShapeListOfShape mapFaceBlocks; + GEOMImpl_Block6Explorer::MapShapesAndAncestors + (aShape, TopAbs_FACE, TopAbs_SOLID, mapFaceBlocks); + + Standard_Integer ind = 1, nbFaces = mapFaceBlocks.Extent(); + + if (nbFaces == 0) { + SetErrorCode("The given shape has no faces"); + return aSeq; + } + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + + Standard_Integer id; + for (; ind <= nbFaces; ind++) { + if (mapFaceBlocks.FindFromIndex(ind).Extent() != 2) { + id = anIndices.FindIndex(mapFaceBlocks.FindKey(ind)); + aSeq->Append(id); + } + } + + //The explode doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = theShape->GetLastFunction(); + TCollection_AsciiString anOldDescr = aFunction->GetDescription(); + + //Make a Python command + GEOM::TPythonDump(aFunction) << anOldDescr.ToCString() + << "\n\tlistFreeFacesIDs = geompy.GetFreeFacesIDs(" << theShape << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//======================================================================= +//function : GetSharedShapes +//purpose : +//======================================================================= + +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetSharedShapes + (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + const Standard_Integer theShapeType) +{ + SetErrorCode(KO); + + if (theShape1.IsNull() || theShape2.IsNull()) return NULL; + + TopoDS_Shape aShape1 = theShape1->GetValue(); + TopoDS_Shape aShape2 = theShape2->GetValue(); + + if (aShape1.IsNull() || aShape2.IsNull()) return NULL; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape1, anIndices); + Handle(TColStd_HArray1OfInteger) anArray; + + TopTools_IndexedMapOfShape mapShape1; + TopExp::MapShapes(aShape1, TopAbs_ShapeEnum(theShapeType), mapShape1); + + Handle(GEOM_Object) anObj; + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + TCollection_AsciiString anAsciiList, anEntry; + + TopTools_MapOfShape mapShape2; + TopExp_Explorer exp (aShape2, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) { + TopoDS_Shape aSS = exp.Current(); + if (mapShape2.Add(aSS) && mapShape1.Contains(aSS)) { + anArray = new TColStd_HArray1OfInteger(1,1); + anArray->SetValue(1, anIndices.FindIndex(aSS)); + anObj = GetEngine()->AddSubShape(theShape1, anArray); + aSeq->Append(anObj); + + // for python command + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + anAsciiList += anEntry; + anAsciiList += ","; + } + } + + if (aSeq->IsEmpty()) { + SetErrorCode("The given shapes have no shared sub-shapes of the requested type"); + return aSeq; + } + + //Make a Python command + anAsciiList.Trunc(anAsciiList.Length() - 1); + + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + GEOM::TPythonDump(aFunction) << "[" << anAsciiList.ToCString() + << "] = geompy.GetSharedShapes(" << theShape1 << ", " + << theShape2 << ", " << theShapeType << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * + */ +//============================================================================= +static GEOM::TPythonDump& operator<< (GEOM::TPythonDump& theDump, + const GEOMAlgo_State theState) +{ + switch (theState) { + case GEOMAlgo_ST_IN: + theDump << "geompy.GEOM.ST_IN"; + break; + case GEOMAlgo_ST_OUT: + theDump << "geompy.GEOM.ST_OUT"; + break; + case GEOMAlgo_ST_ON: + theDump << "geompy.GEOM.ST_ON"; + break; + case GEOMAlgo_ST_ONIN: + theDump << "geompy.GEOM.ST_ONIN"; + break; + case GEOMAlgo_ST_ONOUT: + theDump << "geompy.GEOM.ST_ONOUT"; + break; + default: + theDump << "geompy.GEOM.ST_UNKNOWN"; + break; + } + return theDump; +} + +//======================================================================= +//function : checkTypeShapesOn +/*! + * \brief Checks if theShapeType parameter of GetShapesOnXXX() is OK + * \param theShapeType - the shape type to check + * \retval bool - result of the check + */ +//======================================================================= + +bool GEOMImpl_IShapesOperations::checkTypeShapesOn(const Standard_Integer theShapeType) +{ + if (theShapeType != TopAbs_VERTEX && + theShapeType != TopAbs_EDGE && + theShapeType != TopAbs_FACE && + theShapeType != TopAbs_SOLID) { + SetErrorCode("Only solids, vertices, edges or faces can be found by this method"); + return false; + } + return true; +} + +//======================================================================= +//function : makePlane + /*! + * \brief Creates Geom_Plane + * \param theAx1 - shape object defining plane parameters + * \retval Handle(Geom_Surface) - resulting surface + */ +//======================================================================= + +Handle(Geom_Surface) GEOMImpl_IShapesOperations::makePlane(const TopoDS_Shape& anAx1) +{ + if (anAx1.ShapeType() != TopAbs_EDGE) return NULL; + TopoDS_Edge anEdge = TopoDS::Edge(anAx1); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + SetErrorCode("Bad edge given for the plane normal vector"); + return NULL; + } + gp_Pnt aLoc = BRep_Tool::Pnt(V1); + gp_Vec aVec (aLoc, BRep_Tool::Pnt(V2)); + if (aVec.Magnitude() < Precision::Confusion()) { + SetErrorCode("Vector with null magnitude given"); + return NULL; + } + return new Geom_Plane(aLoc, aVec); +} + +//======================================================================= +//function : makeCylinder + /*! + * \brief Creates Geom_CylindricalSurface + * \param theAx1 - edge defining cylinder axis + * \param theRadius - cylinder radius + * \retval Handle(Geom_Surface) - resulting surface + */ +//======================================================================= + +Handle(Geom_Surface) GEOMImpl_IShapesOperations::makeCylinder(const TopoDS_Shape& anAxis, + const Standard_Real theRadius) +{ + //Axis of the cylinder + if (anAxis.ShapeType() != TopAbs_EDGE) { + SetErrorCode("Not an edge given for the axis"); + return NULL; + } + TopoDS_Edge anEdge = TopoDS::Edge(anAxis); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + SetErrorCode("Bad edge given for the axis"); + return NULL; + } + gp_Pnt aLoc = BRep_Tool::Pnt(V1); + gp_Vec aVec (aLoc, BRep_Tool::Pnt(V2)); + if (aVec.Magnitude() < Precision::Confusion()) { + SetErrorCode("Vector with null magnitude given"); + return NULL; + } + + gp_Ax3 anAx3 (aLoc, aVec); + return new Geom_CylindricalSurface(anAx3, theRadius); +} + + +//======================================================================= +//function : getShapesOnSurfaceIDs + /*! + * \brief Find IDs of subshapes complying with given status about surface + * \param theSurface - the surface to check state of subshapes against + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ +//======================================================================= + +Handle(TColStd_HSequenceOfInteger) + GEOMImpl_IShapesOperations::getShapesOnSurfaceIDs(const Handle(Geom_Surface)& theSurface, + const TopoDS_Shape& theShape, + TopAbs_ShapeEnum theShapeType, + GEOMAlgo_State theState) +{ + Handle(TColStd_HSequenceOfInteger) aSeqOfIDs; +// MESSAGE("--------------------------- GetShapesOnPlane phase 1 takes:"); +// OSD_Timer timer1; +// timer1.Start(); + + // Check presence of triangulation, build if need + if (!CheckTriangulation(theShape)) + return aSeqOfIDs; + + // Call algo + GEOMAlgo_FinderShapeOn1 aFinder; + Standard_Real aTol = 0.0001; // default value + + aFinder.SetShape(theShape); + aFinder.SetTolerance(aTol); + aFinder.SetSurface(theSurface); + aFinder.SetShapeType(theShapeType); + aFinder.SetState(theState); + + // Sets the minimal number of inner points for the faces that do not have own + // inner points at all (for e.g. rectangular planar faces have just 2 triangles). + // Default value=3 + aFinder.SetNbPntsMin(3); + // Sets the maximal number of inner points for edges or faces. + // It is usefull for the cases when this number is very big (e.g =2000) to improve + // the performance. If this value =0, all inner points will be taken into account. + // Default value=0 + aFinder.SetNbPntsMax(100); + +// timer1.Stop(); +// timer1.Show(); + +// MESSAGE("--------------------------- Perform on Plane takes:"); +// timer1.Reset(); +// timer1.Start(); + aFinder.Perform(); +// timer1.Stop(); +// timer1.Show(); + +// MESSAGE("--------------------------- GetShapesOnPlane phase 3 takes:"); +// timer1.Reset(); +// timer1.Start(); + + // Interprete results + Standard_Integer iErr = aFinder.ErrorStatus(); + // the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx + if (iErr) { + MESSAGE(" iErr : " << iErr); + TCollection_AsciiString aMsg (" iErr : "); + aMsg += TCollection_AsciiString(iErr); + SetErrorCode(aMsg); + return aSeqOfIDs; + } + Standard_Integer iWrn = aFinder.WarningStatus(); + // the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx + if (iWrn) { + MESSAGE(" *** iWrn : " << iWrn); + } + + const TopTools_ListOfShape& listSS = aFinder.Shapes(); // the result + + if (listSS.Extent() < 1) { + SetErrorCode("Not a single sub-shape of the requested type found on the given surface"); + return aSeqOfIDs; + } + +// timer1.Stop(); +// timer1.Show(); + +// MESSAGE("--------------------------- GetShapesOnPlane phase 4 takes:"); +// timer1.Reset(); +// timer1.Start(); + + // Fill sequence of object IDs + aSeqOfIDs = new TColStd_HSequenceOfInteger; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(theShape, anIndices); + + TopTools_ListIteratorOfListOfShape itSub (listSS); + for (int index = 1; itSub.More(); itSub.Next(), ++index) { + int id = anIndices.FindIndex(itSub.Value()); + aSeqOfIDs->Append(id); + } +// timer1.Stop(); +// timer1.Show(); + return aSeqOfIDs; +} + +//======================================================================= +//function : getObjectsShapesOn +/*! + * \brief Find shape objects and their entries by their ids + * \param theShapeIDs - incoming shape ids + * \param theShapeEntries - outgoing entries like "entry1, entry2, ..." + * \retval Handle(TColStd_HSequenceOfTransient) - found shape objects + */ +//======================================================================= + +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations:: + getObjectsShapesOn(const Handle(GEOM_Object)& theShape, + const Handle(TColStd_HSequenceOfInteger)& theShapeIDs, + TCollection_AsciiString & theShapeEntries) +{ + Handle(TColStd_HSequenceOfTransient) aSeq; + + if ( !theShapeIDs.IsNull() && theShapeIDs->Length() > 0 ) + { + aSeq = new TColStd_HSequenceOfTransient; + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1,1); + TCollection_AsciiString anEntry; + for ( int i = 1; i <= theShapeIDs->Length(); ++i ) + { + anArray->SetValue(1, theShapeIDs->Value( i )); + Handle(GEOM_Object) anObj = GetEngine()->AddSubShape(theShape, anArray); + aSeq->Append( anObj ); + + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + if ( i != 1 ) theShapeEntries += ","; + theShapeEntries += anEntry; + } + } + return aSeq; +} + +//======================================================================= +//function : getShapesOnSurface +/*! + * \brief Find subshapes complying with given status about surface + * \param theSurface - the surface to check state of subshapes against + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theState - required state + * \param theShapeEntries - outgoing entries like "entry1, entry2, ..." + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ +//======================================================================= + +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_IShapesOperations::getShapesOnSurface(const Handle(Geom_Surface)& theSurface, + const Handle(GEOM_Object)& theShape, + TopAbs_ShapeEnum theShapeType, + GEOMAlgo_State theState, + TCollection_AsciiString & theShapeEntries) +{ + // Find subshapes ids + Handle(TColStd_HSequenceOfInteger) aSeqOfIDs = + getShapesOnSurfaceIDs (theSurface, theShape->GetValue(), theShapeType, theState); + if ( aSeqOfIDs.IsNull() || aSeqOfIDs->Length() == 0 ) + return NULL; + + return getObjectsShapesOn( theShape, aSeqOfIDs, theShapeEntries ); +} + +//============================================================================= +/*! + * GetShapesOnPlane + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnPlane + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + +// MESSAGE("--------------------------- GetShapesOnPlane phase 1 takes:"); +// OSD_Timer timer1; +// timer1.Start(); + + if (theShape.IsNull() || theAx1.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape anAx1 = theAx1->GetValue(); + + if (aShape.IsNull() || anAx1.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( theShapeType )) + return NULL; + + // Create plane + Handle(Geom_Surface) aPlane = makePlane( anAx1 ); + if ( aPlane.IsNull() ) + return NULL; + + // Find objects + TCollection_AsciiString anAsciiList; + Handle(TColStd_HSequenceOfTransient) aSeq; + aSeq = getShapesOnSurface( aPlane, theShape, aShapeType, theState, anAsciiList ); + if ( aSeq.IsNull() || aSeq->Length() == 0 ) + return NULL; + +// timer1.Stop(); +// timer1.Show(); + +// MESSAGE("--------------------------- GetShapesOnPlane phase 5 takes:"); +// timer1.Reset(); +// timer1.Start(); + + // Make a Python command + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast( aSeq->Value( 1 )); + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + GEOM::TPythonDump(aFunction) << "[" << anAsciiList.ToCString() + << "] = geompy.GetShapesOnPlane(" << theShape << ", " + << theShapeType << ", " << theAx1 << ", " << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * GetShapesOnCylinder + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnCylinder + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAxis, + const Standard_Real theRadius, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || theAxis.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape anAxis = theAxis->GetValue(); + + if (aShape.IsNull() || anAxis.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + // Create a cylinder surface + Handle(Geom_Surface) aCylinder = makeCylinder( anAxis, theRadius ); + if ( aCylinder.IsNull() ) + return NULL; + + // Find objects + TCollection_AsciiString anAsciiList; + Handle(TColStd_HSequenceOfTransient) aSeq; + aSeq = getShapesOnSurface( aCylinder, theShape, aShapeType, theState, anAsciiList ); + if ( aSeq.IsNull() || aSeq->Length() == 0 ) + return NULL; + + // Make a Python command + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast( aSeq->Value( 1 )); + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + GEOM::TPythonDump(aFunction) << "[" << anAsciiList.ToCString() + << "] = geompy.GetShapesOnCylinder(" << theShape << ", " << theShapeType + << ", " << theAxis << ", " << theRadius << ", " << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * GetShapesOnSphere + */ +//============================================================================= +Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::GetShapesOnSphere + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theCenter, + const Standard_Real theRadius, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || theCenter.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape aCenter = theCenter->GetValue(); + + if (aShape.IsNull() || aCenter.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + // Center of the sphere + if (aCenter.ShapeType() != TopAbs_VERTEX) return NULL; + gp_Pnt aLoc = BRep_Tool::Pnt(TopoDS::Vertex(aCenter)); + + gp_Ax3 anAx3 (aLoc, gp::DZ()); + Handle(Geom_SphericalSurface) aSphere = + new Geom_SphericalSurface(anAx3, theRadius); + + // Find objects + TCollection_AsciiString anAsciiList; + Handle(TColStd_HSequenceOfTransient) aSeq; + aSeq = getShapesOnSurface( aSphere, theShape, aShapeType, theState, anAsciiList ); + if ( aSeq.IsNull() || aSeq->Length() == 0 ) + return NULL; + + // Make a Python command + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast( aSeq->Value( 1 )); + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + GEOM::TPythonDump(aFunction) << "[" << anAsciiList.ToCString() + << "] = geompy.GetShapesOnSphere(" << theShape << ", " << theShapeType + << ", " << theCenter << ", " << theRadius << ", " << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//======================================================================= +//function : getCreatedLast + /*! + * \brief Select the object created last + * \param theObj1 - Object 1 + * \param theObj2 - Object 2 + * \retval Handle(GEOM_Object) - selected object + */ +//======================================================================= + +Handle(GEOM_Object) GEOMImpl_IShapesOperations::getCreatedLast(const Handle(GEOM_Object)& theObj1, + const Handle(GEOM_Object)& theObj2) +{ + if ( theObj1.IsNull() ) return theObj2; + if ( theObj2.IsNull() ) return theObj1; + return ( theObj1->GetEntry().Tag() > theObj2->GetEntry().Tag() ) ? theObj1 : theObj2; +} + +//============================================================================= +/*! + * GetShapesOnPlaneIDs + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetShapesOnPlaneIDs + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || theAx1.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape anAx1 = theAx1->GetValue(); + + if (aShape.IsNull() || anAx1.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + // Create plane + Handle(Geom_Surface) aPlane = makePlane( anAx1 ); + if ( aPlane.IsNull() ) + return NULL; + + // Find object IDs + Handle(TColStd_HSequenceOfInteger) aSeq; + aSeq = getShapesOnSurfaceIDs( aPlane, aShape, aShapeType, theState ); + + // The GetShapesOnPlaneIDs() doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = getCreatedLast(theShape,theAx1)->GetLastFunction(); + + // Make a Python command + const bool append = true; + GEOM::TPythonDump(aFunction,append) + << "listShapesOnPlane = geompy.GetShapesOnPlaneIDs" + << "(" << theShape << "," << theShapeType << "," << theAx1 << "," << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * GetShapesOnCylinderIDs + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetShapesOnCylinderIDs + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAxis, + const Standard_Real theRadius, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || theAxis.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape anAxis = theAxis->GetValue(); + + if (aShape.IsNull() || anAxis.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + // Create a cylinder surface + Handle(Geom_Surface) aCylinder = makeCylinder( anAxis, theRadius ); + if ( aCylinder.IsNull() ) + return NULL; + + // Find object IDs + Handle(TColStd_HSequenceOfInteger) aSeq; + aSeq = getShapesOnSurfaceIDs( aCylinder, aShape, aShapeType, theState ); + + // The GetShapesOnCylinder() doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = getCreatedLast(theShape,theAxis)->GetLastFunction(); + + // Make a Python command + const bool append = true; + GEOM::TPythonDump(aFunction,append) + << "listShapesOnCylinder = geompy.GetShapesOnCylinderIDs" + << "(" << theShape << ", " << theShapeType << ", " << theAxis << ", " + << theRadius << ", " << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//============================================================================= +/*! + * GetShapesOnSphereIDs + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::GetShapesOnSphereIDs + (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theCenter, + const Standard_Real theRadius, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if (theShape.IsNull() || theCenter.IsNull()) return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape aCenter = theCenter->GetValue(); + + if (aShape.IsNull() || aCenter.IsNull()) return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + // Center of the sphere + if (aCenter.ShapeType() != TopAbs_VERTEX) return NULL; + gp_Pnt aLoc = BRep_Tool::Pnt(TopoDS::Vertex(aCenter)); + + gp_Ax3 anAx3 (aLoc, gp::DZ()); + Handle(Geom_SphericalSurface) aSphere = + new Geom_SphericalSurface(anAx3, theRadius); + + // Find object IDs + Handle(TColStd_HSequenceOfInteger) aSeq; + aSeq = getShapesOnSurfaceIDs( aSphere, aShape, aShapeType, theState ); + + // The GetShapesOnSphere() doesn't change object so no new function is required. + Handle(GEOM_Function) aFunction = getCreatedLast(theShape,theCenter)->GetLastFunction(); + + // Make a Python command + const bool append = true; + GEOM::TPythonDump(aFunction,append) + << "listShapesOnCylinder = geompy.GetShapesOnCylinderIDs" + << "(" << theShape << ", " << theShapeType << ", " << theCenter << ", " + << theRadius << ", " << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//======================================================================= +//function : getShapesOnQuadrangleIDs + /*! + * \brief Find IDs of subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ +//======================================================================= + +Handle(TColStd_HSequenceOfInteger) + GEOMImpl_IShapesOperations::getShapesOnQuadrangleIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState) +{ + SetErrorCode(KO); + + if ( theShape.IsNull() || + theTopLeftPoint.IsNull() || + theTopRigthPoint.IsNull() || + theBottomLeftPoint.IsNull() || + theBottomRigthPoint.IsNull() ) + return NULL; + + TopoDS_Shape aShape = theShape->GetValue(); + TopoDS_Shape aTL = theTopLeftPoint->GetValue(); + TopoDS_Shape aTR = theTopRigthPoint->GetValue(); + TopoDS_Shape aBL = theBottomLeftPoint->GetValue(); + TopoDS_Shape aBR = theBottomRigthPoint->GetValue(); + + if (aShape.IsNull() || + aTL.IsNull() || + aTR.IsNull() || + aBL.IsNull() || + aBR.IsNull() || + aTL.ShapeType() != TopAbs_VERTEX || + aTR.ShapeType() != TopAbs_VERTEX || + aBL.ShapeType() != TopAbs_VERTEX || + aBR.ShapeType() != TopAbs_VERTEX ) + return NULL; + + TopAbs_ShapeEnum aShapeType = TopAbs_ShapeEnum(theShapeType); + if ( !checkTypeShapesOn( aShapeType )) + return NULL; + + Handle(TColStd_HSequenceOfInteger) aSeqOfIDs; + + // Check presence of triangulation, build if need + if (!CheckTriangulation(aShape)) + return aSeqOfIDs; + + // Call algo + gp_Pnt aPntTL = BRep_Tool::Pnt(TopoDS::Vertex(aTL)); + gp_Pnt aPntTR = BRep_Tool::Pnt(TopoDS::Vertex(aTR)); + gp_Pnt aPntBL = BRep_Tool::Pnt(TopoDS::Vertex(aBL)); + gp_Pnt aPntBR = BRep_Tool::Pnt(TopoDS::Vertex(aBR)); + + GEOMAlgo_FinderShapeOnQuad aFinder( aPntTL, aPntTR, aPntBL, aPntBR ); + Standard_Real aTol = 0.0001; // default value + + aFinder.SetShape(aShape); + aFinder.SetTolerance(aTol); + //aFinder.SetSurface(theSurface); + aFinder.SetShapeType(aShapeType); + aFinder.SetState(theState); + + // Sets the minimal number of inner points for the faces that do not have own + // inner points at all (for e.g. rectangular planar faces have just 2 triangles). + // Default value=3 + aFinder.SetNbPntsMin(3); + // Sets the maximal number of inner points for edges or faces. + // It is usefull for the cases when this number is very big (e.g =2000) to improve + // the performance. If this value =0, all inner points will be taken into account. + // Default value=0 + aFinder.SetNbPntsMax(100); + + aFinder.Perform(); + + // Interprete results + Standard_Integer iErr = aFinder.ErrorStatus(); + // the detailed description of error codes is in GEOMAlgo_FinderShapeOn1.cxx + if (iErr) { + MESSAGE(" iErr : " << iErr); + TCollection_AsciiString aMsg (" iErr : "); + aMsg += TCollection_AsciiString(iErr); + SetErrorCode(aMsg); + return aSeqOfIDs; + } + Standard_Integer iWrn = aFinder.WarningStatus(); + // the detailed description of warning codes is in GEOMAlgo_FinderShapeOn1.cxx + if (iWrn) { + MESSAGE(" *** iWrn : " << iWrn); + } + + const TopTools_ListOfShape& listSS = aFinder.Shapes(); // the result + + if (listSS.Extent() < 1) { + SetErrorCode("Not a single sub-shape of the requested type found on the given surface"); + return aSeqOfIDs; + } + + // Fill sequence of object IDs + aSeqOfIDs = new TColStd_HSequenceOfInteger; + + TopTools_IndexedMapOfShape anIndices; + TopExp::MapShapes(aShape, anIndices); + + TopTools_ListIteratorOfListOfShape itSub (listSS); + for (int index = 1; itSub.More(); itSub.Next(), ++index) { + int id = anIndices.FindIndex(itSub.Value()); + aSeqOfIDs->Append(id); + } + return aSeqOfIDs; +} + +//======================================================================= +//function : GetShapesOnQuadrangle + /*! + * \brief Find subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ +//======================================================================= + +Handle(TColStd_HSequenceOfTransient) + GEOMImpl_IShapesOperations::GetShapesOnQuadrangle (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState) +{ + // Find indices + Handle(TColStd_HSequenceOfInteger) aSeqOfIDs = + getShapesOnQuadrangleIDs( theShape, + theShapeType, + theTopLeftPoint, + theTopRigthPoint, + theBottomLeftPoint, + theBottomRigthPoint, + theState); + if ( aSeqOfIDs.IsNull() || aSeqOfIDs->IsEmpty() ) + return NULL; + + // Find objects by indices + TCollection_AsciiString anAsciiList; + Handle(TColStd_HSequenceOfTransient) aSeq; + aSeq = getObjectsShapesOn( theShape, aSeqOfIDs, anAsciiList ); + if ( aSeq.IsNull() || aSeq->IsEmpty() ) + return NULL; + + // Make a Python command + + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast( aSeq->Value( 1 )); + Handle(GEOM_Function) aFunction = anObj->GetLastFunction(); + + GEOM::TPythonDump(aFunction) + << "[" << anAsciiList.ToCString() << "] = geompy.GetShapesOnQuadrangle(" + << theShape << ", " + << theShapeType << ", " + << theTopLeftPoint << ", " + << theTopRigthPoint << ", " + << theBottomLeftPoint << ", " + << theBottomRigthPoint << ", " + << theState << ")"; + + SetErrorCode(OK); + return aSeq; +} + +//======================================================================= +//function : GetShapesOnQuadrangleIDs + /*! + * \brief Find IDs of subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ +//======================================================================= + +Handle(TColStd_HSequenceOfInteger) + GEOMImpl_IShapesOperations::GetShapesOnQuadrangleIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState) +{ + // Find indices + Handle(TColStd_HSequenceOfInteger) aSeqOfIDs = + getShapesOnQuadrangleIDs( theShape, + theShapeType, + theTopLeftPoint, + theTopRigthPoint, + theBottomLeftPoint, + theBottomRigthPoint, + theState); + if ( aSeqOfIDs.IsNull() || aSeqOfIDs->IsEmpty() ) + return NULL; + + // Make a Python command + + // The GetShapesOnCylinder() doesn't change object so no new function is required. + Handle(GEOM_Object) lastObj = getCreatedLast(theShape,theTopLeftPoint); + lastObj = getCreatedLast(lastObj,theTopRigthPoint); + lastObj = getCreatedLast(lastObj,theBottomRigthPoint); + lastObj = getCreatedLast(lastObj,theBottomLeftPoint); + Handle(GEOM_Function) aFunction = lastObj->GetLastFunction(); + + const bool append = true; + GEOM::TPythonDump(aFunction,append) + << "listShapesOnQuadrangle = geompy.GetShapesOnQuadrangleIDs(" + << theShape << ", " + << theShapeType << ", " + << theTopLeftPoint << ", " + << theTopRigthPoint << ", " + << theBottomLeftPoint << ", " + << theBottomRigthPoint << ", " + << theState << ")"; + + SetErrorCode(OK); + return aSeqOfIDs; +} + + +//============================================================================= +/*! + * GetInPlace + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace + (Handle(GEOM_Object) theShapeWhere, + Handle(GEOM_Object) theShapeWhat) +{ + SetErrorCode(KO); + + if (theShapeWhere.IsNull() || theShapeWhat.IsNull()) return NULL; + + TopoDS_Shape aWhere = theShapeWhere->GetValue(); + TopoDS_Shape aWhat = theShapeWhat->GetValue(); + + if (aWhere.IsNull() || aWhat.IsNull()) return NULL; + + //Fill array of indices + Handle(TColStd_HArray1OfInteger) aModifiedArray; + + Handle(GEOM_Function) aWhereFunction = theShapeWhere->GetLastFunction(); + + TopTools_IndexedMapOfShape aWhereIndices; + TopExp::MapShapes(aWhere, aWhereIndices); + + if (aWhereIndices.Contains(aWhat)) { + + // entity was not changed by the operation + Standard_Integer aWhatIndex = aWhereIndices.FindIndex(aWhat); + aModifiedArray = new TColStd_HArray1OfInteger(1,1); + aModifiedArray->SetValue(1, aWhatIndex); + + } else { + + TDF_Label aHistoryLabel = aWhereFunction->GetHistoryEntry(Standard_False); + if (aHistoryLabel.IsNull()) { + SetErrorCode("Modifications history does not exist for the shape under consideration."); + return NULL; + } + + // search in history for all argument shapes + Standard_Boolean isFound = Standard_False; + + TDF_LabelSequence aLabelSeq; + aWhereFunction->GetDependency(aLabelSeq); + Standard_Integer nbArg = aLabelSeq.Length(); + + for (Standard_Integer iarg = 1; iarg <= nbArg && !isFound; iarg++) { + + TDF_Label anArgumentRefLabel = aLabelSeq.Value(iarg); + + Handle(GEOM_Object) anArgumentObject = GEOM_Object::GetReferencedObject(anArgumentRefLabel); + TopoDS_Shape anArgumentShape = anArgumentObject->GetValue(); + + TopTools_IndexedMapOfShape anArgumentIndices; + TopExp::MapShapes(anArgumentShape, anArgumentIndices); + + if (anArgumentIndices.Contains(aWhat)) { + isFound = Standard_True; + Standard_Integer aWhatIndex = anArgumentIndices.FindIndex(aWhat); + + // Find corresponding label in history + TDF_Label anArgumentHistoryLabel = + aWhereFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_False); + if (anArgumentHistoryLabel.IsNull()) { + // Lost History of operation argument. Possibly, all its entities was removed. + SetErrorCode(OK); + return NULL; + } + + TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(aWhatIndex, Standard_False); + if (aWhatHistoryLabel.IsNull()) { + // Removed entity + SetErrorCode(OK); + return NULL; + } + + Handle(TDataStd_IntegerArray) anIntegerArray; + if (!aWhatHistoryLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) { + SetErrorCode("Error: Empty modifications history for the sought shape."); + return NULL; + } + + aModifiedArray = anIntegerArray->Array(); + if (aModifiedArray->Length() == 0) { + SetErrorCode("Error: Empty modifications history for the sought shape."); + return NULL; + } + } + } + + if (!isFound) { + SetErrorCode("The sought shape does not belong to any operation argument."); + return NULL; + } + } + + //Add a new object + Handle(GEOM_Object) aResult = GetEngine()->AddSubShape(theShapeWhere, aModifiedArray); + + if (aModifiedArray->Length() > 1) { + //Set a GROUP type + aResult->SetType(GEOM_GROUP); + + //Set a sub shape type + TDF_Label aFreeLabel = aResult->GetFreeLabel(); + TopAbs_ShapeEnum aShapeType = aWhat.ShapeType(); + TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)aShapeType); + } + + //Make a Python command + Handle(GEOM_Function) aFunction = aResult->GetFunction(1); + + GEOM::TPythonDump(aFunction) << aResult << " = geompy.GetInPlace(" + << theShapeWhere << ", " << theShapeWhat << ")"; + + SetErrorCode(OK); + return aResult; +} + +//======================================================================= +//function : SortShapes +//purpose : +//======================================================================= +void GEOMImpl_IShapesOperations::SortShapes(TopTools_ListOfShape& SL) +{ + Standard_Integer MaxShapes = SL.Extent(); + TopTools_Array1OfShape aShapes (1,MaxShapes); + TColStd_Array1OfInteger OrderInd(1,MaxShapes); + TColStd_Array1OfReal MidXYZ (1,MaxShapes); //X,Y,Z; + TColStd_Array1OfReal Length (1,MaxShapes); //X,Y,Z; + + // Computing of CentreOfMass + Standard_Integer Index; + GProp_GProps GPr; + gp_Pnt GPoint; + TopTools_ListIteratorOfListOfShape it(SL); + for (Index=1; it.More(); Index++) + { + TopoDS_Shape S = it.Value(); + SL.Remove( it ); // == it.Next() + aShapes(Index) = S; + OrderInd.SetValue (Index, Index); + if (S.ShapeType() == TopAbs_VERTEX) + { + GPoint = BRep_Tool::Pnt( TopoDS::Vertex( S )); + Length.SetValue( Index, (Standard_Real) S.Orientation()); + } + else + { + BRepGProp::LinearProperties (S, GPr); + GPoint = GPr.CentreOfMass(); + Length.SetValue( Index, GPr.Mass() ); + } + MidXYZ.SetValue(Index, + GPoint.X()*999 + GPoint.Y()*99 + GPoint.Z()*0.9); + } + // Sorting + Standard_Integer aTemp; + Standard_Boolean exchange, Sort = Standard_True; + while (Sort) + { + Sort = Standard_False; + for (Index=1; Index < MaxShapes; Index++) + { + if (MidXYZ(OrderInd(Index)) > MidXYZ(OrderInd(Index+1))) + exchange = Standard_True; + else if (MidXYZ(OrderInd(Index)) == MidXYZ(OrderInd(Index+1)) && + Length(OrderInd(Index)) > Length(OrderInd(Index+1)) ) + exchange = Standard_True; + else + exchange = Standard_False; + if (exchange) + { + aTemp = OrderInd(Index); + OrderInd(Index) = OrderInd(Index+1); + OrderInd(Index+1) = aTemp; + Sort = Standard_True; + } + } + } + for (Index=1; Index <= MaxShapes; Index++) + SL.Append( aShapes( OrderInd(Index) )); +} + +//======================================================================= +//function : CheckTriangulation +//purpose : +//======================================================================= +bool GEOMImpl_IShapesOperations::CheckTriangulation (const TopoDS_Shape& aShape) +{ +// MESSAGE("CheckTriangulation"); +// +// OSD_Timer timer1; +// timer1.Start(); + + TopExp_Explorer exp (aShape, TopAbs_FACE); + if (!exp.More()) { + SetErrorCode("Shape without faces given"); + return false; + } + + TopLoc_Location aTopLoc; + Handle(Poly_Triangulation) aTRF; + aTRF = BRep_Tool::Triangulation(TopoDS::Face(exp.Current()), aTopLoc); + if (aTRF.IsNull()) { + // calculate deflection + Standard_Real aDeviationCoefficient = 0.001; + + Bnd_Box B; + BRepBndLib::Add(aShape, B); + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + Standard_Real dx = aXmax - aXmin, dy = aYmax - aYmin, dz = aZmax - aZmin; + Standard_Real aDeflection = Max(Max(dx, dy), dz) * aDeviationCoefficient * 4; + +// MESSAGE("Deflection = " << aDeflection); + + Standard_Real aHLRAngle = 0.349066; + + BRepMesh_IncrementalMesh Inc (aShape, aDeflection, Standard_False, aHLRAngle); + } +// timer1.Stop(); +// timer1.Show(); + + return true; +} diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx new file mode 100644 index 000000000..82a7d37e0 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -0,0 +1,284 @@ +// 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/ +// + +#ifndef _GEOMImpl_IShapesOperations_HXX_ +#define _GEOMImpl_IShapesOperations_HXX_ + +#include "GEOM_IOperations.hxx" + +#include "GEOMAlgo_State.hxx" + +#include +#include +#include + +#include +#include + +class GEOM_Engine; +class Handle(GEOM_Object); +class Handle(TColStd_HArray1OfInteger); + +class GEOMImpl_IShapesOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_IShapesOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_IShapesOperations(); + + Standard_EXPORT Handle(GEOM_Object) MakeEdge (Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) MakeWire (list theEdgesAndWires); + + Standard_EXPORT Handle(GEOM_Object) MakeFace (Handle(GEOM_Object) theWire, const bool isPlanarWanted); + + Standard_EXPORT Handle(GEOM_Object) MakeFaceWires (list theWires, + const bool isPlanarWanted); + + Standard_EXPORT Handle(GEOM_Object) MakeShell (list theShapes); + + Standard_EXPORT Handle(GEOM_Object) MakeSolidShell (Handle(GEOM_Object) theShell); + + Standard_EXPORT Handle(GEOM_Object) MakeSolidShells (list theShells); + + Standard_EXPORT Handle(GEOM_Object) MakeCompound (list theShapes); + + Standard_EXPORT Handle(GEOM_Object) MakeGlueFaces (Handle(GEOM_Object) theShape, + const Standard_Real theTolerance); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakeExplode (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + const Standard_Boolean isSorted); + + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) SubShapeAllIDs (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + const Standard_Boolean isSorted); + + Standard_EXPORT Handle(GEOM_Object) GetSubShape (Handle(GEOM_Object) theMainShape, + const Standard_Integer theID); + + Standard_EXPORT Standard_Integer NumberOfFaces (Handle(GEOM_Object) theShape); + Standard_EXPORT Standard_Integer NumberOfEdges (Handle(GEOM_Object) theShape); + + Standard_EXPORT Handle(GEOM_Object) ReverseShape(Handle(GEOM_Object) theShapes); + + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetFreeFacesIDs (Handle(GEOM_Object) theShape); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetSharedShapes (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + const Standard_Integer theShapeType); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnPlane (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnCylinder (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAxis, + const Standard_Real theRadius, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) GetShapesOnSphere (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theCenter, + const Standard_Real theRadius, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetShapesOnPlaneIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAx1, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetShapesOnCylinderIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theAxis, + const Standard_Real theRadius, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) GetShapesOnSphereIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theCenter, + const Standard_Real theRadius, + const GEOMAlgo_State theState); + + /*! + * \brief Find subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ + Standard_EXPORT Handle(TColStd_HSequenceOfTransient) + GetShapesOnQuadrangle (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState); + + /*! + * \brief Find IDs of subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ + Standard_EXPORT Handle(TColStd_HSequenceOfInteger) + GetShapesOnQuadrangleIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState); + + Standard_EXPORT Handle(GEOM_Object) GetShapesOnCylinderOld (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + Handle(GEOM_Object) theAxis, + const Standard_Real theRadius); + + Standard_EXPORT Handle(GEOM_Object) GetShapesOnSphereOld (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType, + Handle(GEOM_Object) theCenter, + const Standard_Real theRadius); + + Standard_EXPORT Handle(GEOM_Object) GetInPlace (Handle(GEOM_Object) theShapeWhere, + Handle(GEOM_Object) theShapeWhat); + + Standard_EXPORT static void SortShapes (TopTools_ListOfShape& SL); + + private: + Handle(GEOM_Object) MakeShape (list theShapes, + const Standard_Integer theObjectType, + const Standard_Integer theFunctionType, + const TCollection_AsciiString& theMethodName); + +// ---------------------------------------------------- + // methods common for all GetShapesOnXXX() functions +// ---------------------------------------------------- + + bool CheckTriangulation (const TopoDS_Shape& aShape); + + /*! + * \brief Checks if theShapeType parameter of GetShapesOnXXX() is OK + * \param theShapeType - the shape type to check + * \retval bool - result of the check + */ + bool checkTypeShapesOn(const Standard_Integer theShapeType); + + /*! + * \brief Creates Geom_Plane + * \param theAx1 - edge defining plane normal + * \retval Handle(Geom_Surface) - resulting surface + */ + Handle(Geom_Surface) makePlane(const TopoDS_Shape& theAx1); + + /*! + * \brief Creates Geom_CylindricalSurface + * \param theAx1 - edge defining cylinder axis + * \param theRadius - cylinder radius + * \retval Handle(Geom_Surface) - resulting surface + */ + Handle(Geom_Surface) makeCylinder(const TopoDS_Shape& theAx1, + const Standard_Real theRadius); + + /*! + * \brief Find IDs of subshapes complying with given status about surface + * \param theSurface - the surface to check state of subshapes against + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ + Handle(TColStd_HSequenceOfInteger) + getShapesOnSurfaceIDs(const Handle(Geom_Surface)& theSurface, + const TopoDS_Shape& theShape, + TopAbs_ShapeEnum theShapeType, + GEOMAlgo_State theState); + + /*! + * \brief Find subshapes complying with given status about surface + * \param theSurface - the surface to check state of subshapes against + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theState - required state + * \param theShapeEntries - outgoing entries like "entry1, entry2, ..." + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ + Handle(TColStd_HSequenceOfTransient) + getShapesOnSurface(const Handle(Geom_Surface)& theSurface, + const Handle(GEOM_Object)& theShape, + TopAbs_ShapeEnum theShapeType, + GEOMAlgo_State theState, + TCollection_AsciiString & theShapeEntries + ); + + /*! + * \brief Find IDs of subshapes complying with given status about quadrangle + * \param theShape - the shape to explore + * \param theShapeType - type of subshape of theShape + * \param theTopLeftPoint - top left quadrangle corner + * \param theTopRigthPoint - top right quadrangle corner + * \param theBottomLeftPoint - bottom left quadrangle corner + * \param theBottomRigthPoint - bottom right quadrangle corner + * \param theState - required state + * \retval Handle(TColStd_HSequenceOfInteger) - IDs of found subshapes + */ + Handle(TColStd_HSequenceOfInteger) + getShapesOnQuadrangleIDs (const Handle(GEOM_Object)& theShape, + const Standard_Integer theShapeType, + const Handle(GEOM_Object)& theTopLeftPoint, + const Handle(GEOM_Object)& theTopRigthPoint, + const Handle(GEOM_Object)& theBottomLeftPoint, + const Handle(GEOM_Object)& theBottomRigthPoint, + const GEOMAlgo_State theState); + + /*! + * \brief Find shape objects and their entries by their ids + * \param theShape - the main shape + * \param theShapeIDs - theShapeIDs - incoming shape ids + * \param theShapeEntries - outgoing entries like "entry1, entry2, ..." + * \retval Handle(TColStd_HSequenceOfTransient) - found shape objects + */ + Handle(TColStd_HSequenceOfTransient) + getObjectsShapesOn(const Handle(GEOM_Object)& theShape, + const Handle(TColStd_HSequenceOfInteger)& theShapeIDs, + TCollection_AsciiString & theShapeEntries); + + /*! + * \brief Select the object created last + * \param theObj1 - Object 1 + * \param theObj2 - Object 2 + * \retval Handle(GEOM_Object) - selected object + */ + static Handle(GEOM_Object) getCreatedLast(const Handle(GEOM_Object)& theObj1, + const Handle(GEOM_Object)& theObj2); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ISketcher.hxx b/src/GEOMImpl/GEOMImpl_ISketcher.hxx new file mode 100644 index 000000000..e2149c82f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ISketcher.hxx @@ -0,0 +1,53 @@ +// 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/ +// +//NOTE: This is an interface to a function for the Sketcher creation. + + +#include "GEOM_Function.hxx" + +#define SKETCH_ARG_CMD 1 +#define SKETCH_ARG_DOUBLE 2 +#define SKETCH_ARG_WPLANE 12 + +class GEOMImpl_ISketcher +{ + public: + + GEOMImpl_ISketcher(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetCommand(const TCollection_AsciiString& theCommand) + { _func->SetString(SKETCH_ARG_CMD, theCommand); } + + TCollection_AsciiString GetCommand() { return _func->GetString(SKETCH_ARG_CMD); } + + void SetWorkingPlane(int theInd, double theValue) + { _func->SetReal(SKETCH_ARG_DOUBLE + theInd, theValue); } + + double GetWorkingPlane(int theInd) { return _func->GetReal(SKETCH_ARG_DOUBLE + theInd); } + + void SetWorkingPlane(Handle(GEOM_Function) thePlane) + { _func->SetReference(SKETCH_ARG_WPLANE, thePlane); } + + Handle(GEOM_Function) GetWorkingPlane() { return _func->GetReference(SKETCH_ARG_WPLANE); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ISphere.hxx b/src/GEOMImpl/GEOMImpl_ISphere.hxx new file mode 100644 index 000000000..ce426bfdf --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ISphere.hxx @@ -0,0 +1,45 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Sphere creation. + + +#include "GEOM_Function.hxx" + +#define SPH_ARG_R 1 +#define SPH_ARG_PNT 4 + +class GEOMImpl_ISphere +{ + public: + + GEOMImpl_ISphere(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetR(double theR) { _func->SetReal(SPH_ARG_R, theR); } + + double GetR() { return _func->GetReal(SPH_ARG_R); } + + void SetPoint(Handle(GEOM_Function) theRefPoint) { _func->SetReference(SPH_ARG_PNT, theRefPoint); } + + Handle(GEOM_Function) GetPoint() { return _func->GetReference(SPH_ARG_PNT); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ISpline.hxx b/src/GEOMImpl/GEOMImpl_ISpline.hxx new file mode 100644 index 000000000..fcb9b462d --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ISpline.hxx @@ -0,0 +1,45 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Spline creation. + + +#include "GEOM_Function.hxx" + +#define SPL_ARG_LENG 1 +#define SPL_ARG_LAST 1 + +class GEOMImpl_ISpline +{ + public: + + GEOMImpl_ISpline(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetLength(int theLen) { _func->SetInteger(SPL_ARG_LENG, theLen); } + + void SetPoint(int theId, Handle(GEOM_Function) theP) { _func->SetReference(SPL_ARG_LAST + theId, theP); } + + int GetLength() { return _func->GetInteger(SPL_ARG_LENG); } + + Handle(GEOM_Function) GetPoint(int theId) { return _func->GetReference(SPL_ARG_LAST + theId); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ITorus.hxx b/src/GEOMImpl/GEOMImpl_ITorus.hxx new file mode 100644 index 000000000..39b417f7e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITorus.hxx @@ -0,0 +1,51 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Torus creation. + + +#include "GEOM_Function.hxx" + +#define TORUS_ARG_CC 1 +#define TORUS_ARG_VV 2 +#define TORUS_ARG_RMAJ 3 +#define TORUS_ARG_RMIN 4 + +class GEOMImpl_ITorus +{ + public: + + GEOMImpl_ITorus(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetCenter(Handle(GEOM_Function) theP) { _func->SetReference(TORUS_ARG_CC, theP); } + void SetVector(Handle(GEOM_Function) theV) { _func->SetReference(TORUS_ARG_VV, theV); } + + void SetRMajor(double theR) { _func->SetReal(TORUS_ARG_RMAJ, theR); } + void SetRMinor(double theR) { _func->SetReal(TORUS_ARG_RMIN, theR); } + + Handle(GEOM_Function) GetCenter() { return _func->GetReference(TORUS_ARG_CC); } + Handle(GEOM_Function) GetVector() { return _func->GetReference(TORUS_ARG_VV); } + + double GetRMajor() { return _func->GetReal(TORUS_ARG_RMAJ); } + double GetRMinor() { return _func->GetReal(TORUS_ARG_RMIN); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx new file mode 100644 index 000000000..16885bcc3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.cxx @@ -0,0 +1,1329 @@ +// 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/ +// +#include + +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOMImpl_ITransformOperations::GEOMImpl_ITransformOperations (GEOM_Engine* theEngine, int theDocID) +: GEOM_IOperations(theEngine, theDocID) +{ + MESSAGE("GEOMImpl_ITransformOperations::GEOMImpl_ITransformOperations"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOMImpl_ITransformOperations::~GEOMImpl_ITransformOperations() +{ + MESSAGE("GEOMImpl_ITransformOperations::~GEOMImpl_ITransformOperations"); +} + + +//============================================================================= +/*! + * TranslateTwoPoints + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateTwoPoints + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + // Get last functions of the arguments + Handle(GEOM_Function) aP1F = thePoint1->GetLastFunction(); + Handle(GEOM_Function) aP2F = thePoint2->GetLastFunction(); + + //Add a translate function + aFunction = theObject->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_TWO_POINTS); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI (aFunction); + aTI.SetPoint1(aP1F); + aTI.SetPoint2(aP2F); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << "geompy.TrsfOp.TranslateTwoPoints(" + << theObject << ", " << thePoint1 << ", " << thePoint2 << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * TranslateDXDYDZ + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateDXDYDZ + (Handle(GEOM_Object) theObject, double theX, double theY, double theZ) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a translate function + aFunction = theObject->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_XYZ); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetDX(theX); + aTI.SetDY(theY); + aTI.SetDZ(theZ); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << "geompy.TrsfOp.TranslateDXDYDZ(" + << theObject << ", " << theX << ", " << theY << ", " << theZ << ")"; + + SetErrorCode(OK); + return theObject; +} + + +//============================================================================= +/*! + * TranslateTwoPointsCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateTwoPointsCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint1.IsNull() || thePoint2.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_TWO_POINTS_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetPoint1(thePoint1->GetLastFunction()); + aTI.SetPoint2(thePoint2->GetLastFunction()); + //aTI.SetShape(theObject->GetValue()); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << aCopy << " = geompy.MakeTranslationTwoPoints(" + << theObject << ", " << thePoint1 << ", " << thePoint2 << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * TranslateDXDYDZCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateDXDYDZCopy + (Handle(GEOM_Object) theObject, double theX, double theY, double theZ) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_XYZ_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetDX(theX); + aTI.SetDY(theY); + aTI.SetDZ(theZ); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << aCopy << " = geompy.MakeTranslation(" + << theObject << ", " << theX << ", " << theY << ", " << theZ << ")"; + + SetErrorCode(OK); + return aCopy; +} + + +//============================================================================= +/*! + * TranslateVector + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVector + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theVector.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + // Get last functions of the arguments + Handle(GEOM_Function) aVF = theVector->GetLastFunction(); + + //Add a translate function + aFunction = theObject->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_VECTOR); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI (aFunction); + aTI.SetVector(aVF); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << "geompy.TrsfOp.TranslateVector(" + << theObject << ", " << theVector << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * TranslateVectorCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::TranslateVectorCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theVector.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_VECTOR_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetVector(theVector->GetLastFunction()); +// aTI.SetShape(theObject->GetValue()); + aTI.SetOriginal(aLastFunction); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << aCopy << " = geompy.MakeTranslationVector(" + << theObject << ", " << theVector << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Translate1D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate1D + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector, + double theStep, Standard_Integer theNbTimes) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theVector.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_1D); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetVector(theVector->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + aTI.SetStep1(theStep); + aTI.SetNbIter1(theNbTimes); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << aCopy << " = geompy.MakeMultiTranslation1D(" + << theObject << ", " << theVector << ", " << theStep << ", " << theNbTimes << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Translate2D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Translate2D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theVector, + double theStep1, + Standard_Integer theNbTimes1, + Handle(GEOM_Object) theVector2, + double theStep2, + Standard_Integer theNbTimes2) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theVector.IsNull() || theVector2.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be moved + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a translate function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_TranslateDriver::GetID(), TRANSLATE_2D); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_TranslateDriver::GetID()) return NULL; + + GEOMImpl_ITranslate aTI(aFunction); + aTI.SetVector(theVector->GetLastFunction()); + aTI.SetVector2(theVector2->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + aTI.SetStep1(theStep1); + aTI.SetNbIter1(theNbTimes1); + aTI.SetStep2(theStep2); + aTI.SetNbIter2(theNbTimes2); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Translation 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) << aCopy << " = geompy.MakeMultiTranslation2D(" + << theObject << ", " << theVector << ", " << theStep1 << ", " << theNbTimes1 + << ", " << theVector2 << ", " << theStep2 << ", " << theNbTimes2 << ")"; + + SetErrorCode(OK); + return aCopy; +} + + +//============================================================================= +/*! + * MirrorPlane + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPlane + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePlane) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePlane.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + // Get last functions of the arguments + Handle(GEOM_Function) aPF = thePlane->GetLastFunction(); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_PLANE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetPlane(aPF); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << "geompy.TrsfOp.MirrorPlane(" + << theObject << ", " << thePlane << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * MirrorPlaneCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPlaneCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePlane) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePlane.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_PLANE_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetPlane(thePlane->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << aCopy << " = geompy.MakeMirrorByPlane(" + << theObject << ", " << thePlane << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * MirrorPoint + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPoint + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + // Get last functions of the arguments + Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_POINT); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetPoint(aPF); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << "geompy.TrsfOp.MirrorPoint(" + << theObject << ", " << thePoint << ")"; + + SetErrorCode(OK); + return NULL; +} + +//============================================================================= +/*! + * MirrorPointCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorPointCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_POINT_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetPoint(thePoint->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << aCopy << " = geompy.MakeMirrorByPoint(" + << theObject << ", " << thePoint << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * MirrorAxis + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxis + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + // Get last functions of the arguments + Handle(GEOM_Function) anAF = theAxis->GetLastFunction(); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_AXIS); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetAxis(anAF); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << "geompy.TrsfOp.MirrorAxis(" + << theObject << ", " << theAxis << ")"; + + SetErrorCode(OK); + return NULL; +} + +//============================================================================= +/*! + * MirrorAxisCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::MirrorAxisCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be mirrored + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a mirror function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_MirrorDriver::GetID(), MIRROR_AXIS_COPY); + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL; + + GEOMImpl_IMirror aTI (aFunction); + aTI.SetAxis(theAxis->GetLastFunction()); + aTI.SetOriginal(aLastFunction); + + //Compute the mirror + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Mirror 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) << aCopy << " = geompy.MakeMirrorByAxis(" + << theObject << ", " << theAxis << ")"; + + SetErrorCode(OK); + return aCopy; +} + + +//============================================================================= +/*! + * OffsetShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShape + (Handle(GEOM_Object) theObject, double theOffset) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be offset + + //Add a new Offset function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_OffsetDriver::GetID(), OFFSET_SHAPE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; + + GEOMImpl_IOffset aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetValue(theOffset); + + //Compute the offset + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Offset 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) << "geompy.TrsfOp.OffsetShape(" + << theObject << ", " << theOffset << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * OffsetShapeCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy + (Handle(GEOM_Object) theObject, double theOffset) +{ + SetErrorCode(KO); + + if (theObject.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be offset + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a new Offset function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_OffsetDriver::GetID(), OFFSET_SHAPE_COPY); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_OffsetDriver::GetID()) return NULL; + + GEOMImpl_IOffset aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetValue(theOffset); + + //Compute the offset + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Offset 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) << aCopy << " = geompy.MakeOffset(" + << theObject << ", " << theOffset << ")"; + + SetErrorCode(OK); + return aCopy; +} + + +//============================================================================= +/*! + * ScaleShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShape + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint, double theFactor) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be scaled + + // Get last functions of the arguments + Handle(GEOM_Function) aPF = thePoint->GetLastFunction(); + + //Add a scale function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_ScaleDriver::GetID(), SCALE_SHAPE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ScaleDriver::GetID()) return NULL; + + GEOMImpl_IScale aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetPoint(aPF); + aTI.SetFactor(theFactor); + + //Compute the scale + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Scale 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) << "geompy.TrsfOp.ScaleShape(" + << theObject << ", " << thePoint << ", " << theFactor << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * ScaleShapeCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::ScaleShapeCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) thePoint, double theFactor) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || thePoint.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be scaled + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a scale function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_ScaleDriver::GetID(), SCALE_SHAPE_COPY); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ScaleDriver::GetID()) return NULL; + + GEOMImpl_IScale aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetPoint(thePoint->GetLastFunction()); + aTI.SetFactor(theFactor); + + //Compute the scale + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Scale 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) << aCopy << " = geompy.MakeScaleTransform(" + << theObject << ", " << thePoint << ", " << theFactor << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * PositionShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShape + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theStartLCS, Handle(GEOM_Object) theEndLCS) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theStartLCS.IsNull() || theEndLCS.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position + + // Get last functions of the arguments + Handle(GEOM_Function) aStartLCS = theStartLCS->GetLastFunction(); + Handle(GEOM_Function) aEndLCS = theEndLCS->GetLastFunction(); + + //Add a Position function + Handle(GEOM_Function) aFunction = + theObject->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_SHAPE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PositionDriver::GetID()) return NULL; + + GEOMImpl_IPosition aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetStartLCS(aStartLCS); + aTI.SetEndLCS(aEndLCS); + + //Compute the Position + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Position 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) << "geompy.TrsfOp.PositionShape(" + << theObject << ", " << theStartLCS << ", " << theEndLCS << ")"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * PositionShapeCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::PositionShapeCopy + (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theStartLCS, Handle(GEOM_Object) theEndLCS) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theStartLCS.IsNull() || theEndLCS.IsNull()) return NULL; + + Handle(GEOM_Function) anOriginal = theObject->GetLastFunction(); + if (anOriginal.IsNull()) return NULL; //There is no function which creates an object to be set in position + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a position function + Handle(GEOM_Function) aFunction = + aCopy->AddFunction(GEOMImpl_PositionDriver::GetID(), POSITION_SHAPE_COPY); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_PositionDriver::GetID()) return NULL; + + GEOMImpl_IPosition aTI (aFunction); + aTI.SetShape(anOriginal); + aTI.SetStartLCS(theStartLCS->GetLastFunction()); + aTI.SetEndLCS(theEndLCS->GetLastFunction()); + + //Compute the position + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Position 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) << aCopy << " = geompy.MakePosition(" + << theObject << ", " << theStartLCS << ", " << theEndLCS << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Rotate + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngle) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + // Get last functions of the arguments + Handle(GEOM_Function) anAF = theAxis->GetLastFunction(); + + //Add a rotate function + aFunction = theObject->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE); + + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetAxis(anAF); + aRI.SetOriginal(aLastFunction); + aRI.SetAngle(theAngle); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate 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) << "geompy.TrsfOp.Rotate(" << theObject + << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)"; + + SetErrorCode(OK); + return theObject; +} + +//============================================================================= +/*! + * Rotate + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::RotateCopy (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_COPY); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetOriginal(aLastFunction); + aRI.SetAngle(theAngle); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate 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) << aCopy << " = geompy.MakeRotation(" << theObject + << ", " << theAxis << ", " << theAngle * 180.0 / PI << "*math.pi/180.0)"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Rotate1D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate1D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + Standard_Integer theNbTimes) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_1D); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetOriginal(aLastFunction); + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetNbIter1(theNbTimes); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate 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) << aCopy << " = geompy.MultiRotate1D(" + << theObject << ", " << theAxis << ", " << theNbTimes << ")"; + + SetErrorCode(OK); + return aCopy; +} + +//============================================================================= +/*! + * Rotate2D + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_ITransformOperations::Rotate2D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngle, + Standard_Integer theNbTimes1, + double theStep, + Standard_Integer theNbTimes2) +{ + SetErrorCode(KO); + + if (theObject.IsNull() || theAxis.IsNull()) return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be rotated + + //Add a new Copy object + Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), theObject->GetType()); + + //Add a rotate function + aFunction = aCopy->AddFunction(GEOMImpl_RotateDriver::GetID(), ROTATE_2D); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_RotateDriver::GetID()) return NULL; + + GEOMImpl_IRotate aRI(aFunction); + aRI.SetAxis(theAxis->GetLastFunction()); + aRI.SetOriginal(aLastFunction); + aRI.SetNbIter1(theNbTimes1); + aRI.SetNbIter2(theNbTimes2); + aRI.SetAngle(theAngle); + aRI.SetStep(theStep); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Rotate 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) << aCopy << " = geompy.MultiRotate2D(" + << theObject << ", " << theAxis << ", " << theAngle << ", " + << theNbTimes1 << ", " << theStep << ", " << theNbTimes2 << ")"; + + SetErrorCode(OK); + return aCopy; +} diff --git a/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx new file mode 100644 index 000000000..701e65690 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITransformOperations.hxx @@ -0,0 +1,112 @@ +// 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/ +// + +#ifndef _GEOMImpl_ITransformOperations_HXX_ +#define _GEOMImpl_ITransformOperations_HXX_ + +#include "Utils_SALOME_Exception.hxx" +#include "GEOM_IOperations.hxx" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" +#include + +class GEOMImpl_ITransformOperations : public GEOM_IOperations { + public: + Standard_EXPORT GEOMImpl_ITransformOperations(GEOM_Engine* theEngine, int theDocID); + Standard_EXPORT ~GEOMImpl_ITransformOperations(); + + Standard_EXPORT Handle(GEOM_Object) TranslateTwoPoints (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) TranslateTwoPointsCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint1, + Handle(GEOM_Object) thePoint2); + + Standard_EXPORT Handle(GEOM_Object) TranslateDXDYDZ (Handle(GEOM_Object) theObject, double theX, double theY, double theZ); + + Standard_EXPORT Handle(GEOM_Object) TranslateDXDYDZCopy (Handle(GEOM_Object) theObject, double theX, double theY, double theZ); + + Standard_EXPORT Handle(GEOM_Object) TranslateVector (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theVector); + + Standard_EXPORT Handle(GEOM_Object) TranslateVectorCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theVector); + + Standard_EXPORT Handle(GEOM_Object) Translate1D (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector, double theStep, Standard_Integer theNbTimes); + + Standard_EXPORT Handle(GEOM_Object) Translate2D (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theVector, double theStep1, Standard_Integer theNbTimes1, + Handle(GEOM_Object) theVector2, double theStep2, Standard_Integer theNbTimes2); + + Standard_EXPORT Handle(GEOM_Object) MirrorPlane (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePlane); + + Standard_EXPORT Handle(GEOM_Object) MirrorPlaneCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePlane); + + Standard_EXPORT Handle(GEOM_Object) MirrorAxis (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis); + + Standard_EXPORT Handle(GEOM_Object) MirrorAxisCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis); + + Standard_EXPORT Handle(GEOM_Object) MirrorPoint (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint); + + Standard_EXPORT Handle(GEOM_Object) MirrorPointCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint); + + Standard_EXPORT Handle(GEOM_Object) OffsetShape (Handle(GEOM_Object) theObject, + double theOffset); + + Standard_EXPORT Handle(GEOM_Object) OffsetShapeCopy (Handle(GEOM_Object) theObject, + double theOffset); + + Standard_EXPORT Handle(GEOM_Object) ScaleShape (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint, + double theFactor); + + Standard_EXPORT Handle(GEOM_Object) ScaleShapeCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) thePoint, + double theFactor); + + Standard_EXPORT Handle(GEOM_Object) PositionShape (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theStartLCS, + Handle(GEOM_Object) theEndLCS); + + Standard_EXPORT Handle(GEOM_Object) PositionShapeCopy (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theStartLCS, + Handle(GEOM_Object) theEndLCS); + + Standard_EXPORT Handle(GEOM_Object) Rotate (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle); + + Standard_EXPORT Handle(GEOM_Object) RotateCopy (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, double theAngle); + + Standard_EXPORT Handle(GEOM_Object) Rotate1D (Handle(GEOM_Object) theObject, Handle(GEOM_Object) theAxis, Standard_Integer theNbTimes); + + Standard_EXPORT Handle(GEOM_Object) Rotate2D (Handle(GEOM_Object) theObject, + Handle(GEOM_Object) theAxis, + double theAngle, + Standard_Integer theNbTimes1, + double theStep, + Standard_Integer theNbTimes2); +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ITranslate.hxx b/src/GEOMImpl/GEOMImpl_ITranslate.hxx new file mode 100755 index 000000000..054b8530c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITranslate.hxx @@ -0,0 +1,95 @@ +// 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/ +// +//NOTE: This is an intreface to a function for the Translate creation. + + +#include "GEOM_Function.hxx" + +#define TRANSLATE_ARG_POINT1 1 +#define TRANSLATE_ARG_POINT2 2 +#define TRANSLATE_ARG_VECTOR 3 +#define TRANSLATE_ARG_ORIGINAL 6 +#define TRANSLATE_ARG_STEP1 7 +#define TRANSLATE_ARG_NBITER1 8 +#define TRANSLATE_ARG_STEP2 9 +#define TRANSLATE_ARG_NBITER2 10 +#define TRANSLATE_ARG_VECTOR2 11 +#define TRANSLATE_ARG_DX 12 +#define TRANSLATE_ARG_DY 13 +#define TRANSLATE_ARG_DZ 14 + +class GEOMImpl_ITranslate +{ + public: + + GEOMImpl_ITranslate(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetPoint1(Handle(GEOM_Function) thePoint1) { _func->SetReference(TRANSLATE_ARG_POINT1, thePoint1); } + + Handle(GEOM_Function) GetPoint1() { return _func->GetReference(TRANSLATE_ARG_POINT1); } + + void SetPoint2(Handle(GEOM_Function) thePoint2) { _func->SetReference(TRANSLATE_ARG_POINT2, thePoint2); } + + Handle(GEOM_Function) GetPoint2() { return _func->GetReference(TRANSLATE_ARG_POINT2); } + + void SetVector(Handle(GEOM_Function) theVector) { _func->SetReference(TRANSLATE_ARG_VECTOR, theVector); } + + Handle(GEOM_Function) GetVector() { return _func->GetReference(TRANSLATE_ARG_VECTOR); } + + void SetOriginal(Handle(GEOM_Function) theOriginal) { _func->SetReference(TRANSLATE_ARG_ORIGINAL, theOriginal); } + + Handle(GEOM_Function) GetOriginal() { return _func->GetReference(TRANSLATE_ARG_ORIGINAL); } + + void SetStep1(double theStep) { return _func->SetReal(TRANSLATE_ARG_STEP1, theStep); } + + double GetStep1() { return _func->GetReal(TRANSLATE_ARG_STEP1); } + + void SetNbIter1(int theNbIter) { _func->SetInteger(TRANSLATE_ARG_NBITER1, theNbIter); } + + int GetNbIter1() { return _func->GetInteger(TRANSLATE_ARG_NBITER1); } + + void SetStep2(double theStep) { return _func->SetReal(TRANSLATE_ARG_STEP2, theStep); } + + double GetStep2() { return _func->GetReal(TRANSLATE_ARG_STEP2); } + + void SetNbIter2(int theNbIter) { _func->SetInteger(TRANSLATE_ARG_NBITER2, theNbIter); } + + int GetNbIter2() { return _func->GetInteger(TRANSLATE_ARG_NBITER2); } + + void SetVector2(Handle(GEOM_Function) theVector) { _func->SetReference(TRANSLATE_ARG_VECTOR2, theVector); } + + Handle(GEOM_Function) GetVector2() { return _func->GetReference(TRANSLATE_ARG_VECTOR2); } + + void SetDX(double theDX) { return _func->SetReal(TRANSLATE_ARG_DX, theDX); } + + double GetDX() { return _func->GetReal(TRANSLATE_ARG_DX); } + + void SetDY(double theDY) { return _func->SetReal(TRANSLATE_ARG_DY, theDY); } + + double GetDY() { return _func->GetReal(TRANSLATE_ARG_DY); } + + void SetDZ(double theDZ) { return _func->SetReal(TRANSLATE_ARG_DZ, theDZ); } + + double GetDZ() { return _func->GetReal(TRANSLATE_ARG_DZ); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_IVector.hxx b/src/GEOMImpl/GEOMImpl_IVector.hxx new file mode 100644 index 000000000..2214d7dfa --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_IVector.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/ +// +//NOTE: This is an intreface to a function for the vector creation. + + +#include "GEOM_Function.hxx" + +#define VEC_ARG_DX 1 +#define VEC_ARG_DY 2 +#define VEC_ARG_DZ 3 + +#define VEC_ARG_PNT1 4 +#define VEC_ARG_PNT2 5 + +class GEOMImpl_IVector +{ + public: + + GEOMImpl_IVector(Handle(GEOM_Function) theFunction): _func(theFunction) {} + + void SetDX(double theDX) { _func->SetReal(VEC_ARG_DX, theDX); } + void SetDY(double theDY) { _func->SetReal(VEC_ARG_DY, theDY); } + void SetDZ(double theDZ) { _func->SetReal(VEC_ARG_DZ, theDZ); } + + double GetDX() { return _func->GetReal(VEC_ARG_DX); } + double GetDY() { return _func->GetReal(VEC_ARG_DY); } + double GetDZ() { return _func->GetReal(VEC_ARG_DZ); } + + void SetPoint1(Handle(GEOM_Function) theRef) { _func->SetReference(VEC_ARG_PNT1, theRef); } + void SetPoint2(Handle(GEOM_Function) theRef) { _func->SetReference(VEC_ARG_PNT2, theRef); } + + Handle(GEOM_Function) GetPoint1() { return _func->GetReference(VEC_ARG_PNT1); } + Handle(GEOM_Function) GetPoint2() { return _func->GetReference(VEC_ARG_PNT2); } + + private: + + Handle(GEOM_Function) _func; +}; diff --git a/src/GEOMImpl/GEOMImpl_ImportDriver.cxx b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx new file mode 100644 index 000000000..e7c263c72 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ImportDriver.cxx @@ -0,0 +1,162 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include "utilities.h" + +#include + +#include +#include + +#ifdef WNT +#include +#else +#include +#endif + +#ifdef WNT +#define LibHandle HMODULE +#define LoadLib( name ) LoadLibrary( name ) +#define GetProc GetProcAddress +#define UnLoadLib( handle ) FreeLibrary( handle ); +#else +#define LibHandle void* +#define LoadLib( name ) dlopen( name, RTLD_LAZY ) +#define GetProc dlsym +#define UnLoadLib( handle ) dlclose( handle ); +#endif + +typedef TopoDS_Shape (*funcPoint)(const TCollection_AsciiString&, TCollection_AsciiString&); + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ImportDriver::GetID() +{ + static Standard_GUID aImportDriver("FF1BBB60-5D14-4df2-980B-3A668264EA16"); + return aImportDriver; +} + + +//======================================================================= +//function : GEOMImpl_ImportDriver +//purpose : +//======================================================================= +GEOMImpl_ImportDriver::GEOMImpl_ImportDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ImportDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IImportExport aCI (aFunction); + //Standard_Integer aType = aFunction->GetType(); + + // retrieve the file and plugin library names + TCollection_AsciiString aFileName = aCI.GetFileName(); + TCollection_AsciiString aLibName = aCI.GetPluginName(); + if (aFileName.IsEmpty() || aLibName.IsEmpty()) + return 0; + + // load plugin library + LibHandle anImportLib = LoadLib( aLibName.ToCString() ); + funcPoint fp = 0; + if ( anImportLib ) + fp = (funcPoint)GetProc( anImportLib, "Import" ); + + if ( !fp ) + return 0; + + // perform the import + TCollection_AsciiString anError; + TopoDS_Shape aShape = fp( aFileName, anError ); + + // unload plugin library + UnLoadLib( anImportLib ); + + if ( aShape.IsNull() ) { + StdFail_NotDone::Raise(anError.ToCString()); + return 0; + } + + // set the function result + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ImportDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ImportDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ImportDriver", + sizeof(GEOMImpl_ImportDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ImportDriver) Handle(GEOMImpl_ImportDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ImportDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ImportDriver))) { + _anOtherObject = Handle(GEOMImpl_ImportDriver)((Handle(GEOMImpl_ImportDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ImportDriver.hxx b/src/GEOMImpl/GEOMImpl_ImportDriver.hxx new file mode 100644 index 000000000..0d07a34fa --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ImportDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ImportDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ImportDriver_HeaderFile +#define _GEOMImpl_ImportDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ImportDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ImportDriver); + +class Handle(GEOMImpl_ImportDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ImportDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ImportDriver)(const Handle(GEOMImpl_ImportDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ImportDriver)(const GEOMImpl_ImportDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ImportDriver)& operator=(const Handle(GEOMImpl_ImportDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ImportDriver)& operator=(const GEOMImpl_ImportDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ImportDriver* operator->() + { + return (GEOMImpl_ImportDriver *)ControlAccess(); + } + + GEOMImpl_ImportDriver* operator->() const + { + return (GEOMImpl_ImportDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ImportDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ImportDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ImportDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ImportDriver(); +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_ImportDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ImportDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ImportDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ImportDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_LineDriver.cxx b/src/GEOMImpl/GEOMImpl_LineDriver.cxx new file mode 100644 index 000000000..10cfec55c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_LineDriver.cxx @@ -0,0 +1,174 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_LineDriver::GetID() +{ + static Standard_GUID aLineDriver("FF1BBB06-5D14-4df2-980B-3A668264EA16"); + return aLineDriver; +} + + +//======================================================================= +//function : GEOMImpl_LineDriver +//purpose : +//======================================================================= +GEOMImpl_LineDriver::GEOMImpl_LineDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_LineDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ILine aPI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == LINE_TWO_PNT) { + Handle(GEOM_Function) aRefPnt1 = aPI.GetPoint1(); + Handle(GEOM_Function) aRefPnt2 = aPI.GetPoint2(); + TopoDS_Shape aShape1 = aRefPnt1->GetValue(); + TopoDS_Shape aShape2 = aRefPnt2->GetValue(); + if (aShape1.ShapeType() != TopAbs_VERTEX || + aShape2.ShapeType() != TopAbs_VERTEX) return 0; + if (aShape1.IsSame(aShape2)) { + Standard_ConstructionError::Raise("The end points must be different"); + } + gp_Pnt P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); + gp_Pnt P2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape2)); + if (P1.Distance(P2) < Precision::Confusion()) { + Standard_ConstructionError::Raise("The end points are too close"); + } + aShape = BRepBuilderAPI_MakeEdge(P1, P2).Shape(); + + } else if (aType == LINE_PNT_DIR) { + Handle(GEOM_Function) aRefPnt = aPI.GetPoint1(); + Handle(GEOM_Function) aRefDir = aPI.GetPoint2(); + TopoDS_Shape aShape1 = aRefPnt->GetValue(); + TopoDS_Shape aShape2 = aRefDir->GetValue(); + if (aShape1.ShapeType() != TopAbs_VERTEX || + aShape2.ShapeType() != TopAbs_EDGE) return 0; + if (aShape1.IsSame(aShape2)) { + Standard_ConstructionError::Raise("The end points must be different"); + } + gp_Pnt P1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); + + TopoDS_Edge anE = TopoDS::Edge(aShape2); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_NullObject::Raise("Line creation aborted: vector is not defined"); + } + gp_Pnt PV1 = BRep_Tool::Pnt(V1); + gp_Pnt PV2 = BRep_Tool::Pnt(V2); + if (PV1.Distance(PV2) < Precision::Confusion()) { + Standard_ConstructionError::Raise("Vector with null magnitude"); + } + + gp_Pnt P2 (P1.XYZ() + PV2.XYZ() - PV1.XYZ()); + aShape = BRepBuilderAPI_MakeEdge(P1, P2).Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + aShape.Infinite(true); + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_LineDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_LineDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_LineDriver", + sizeof(GEOMImpl_LineDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_LineDriver) Handle(GEOMImpl_LineDriver)::DownCast + (const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_LineDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_LineDriver))) { + _anOtherObject = Handle(GEOMImpl_LineDriver)((Handle(GEOMImpl_LineDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_LineDriver.hxx b/src/GEOMImpl/GEOMImpl_LineDriver.hxx new file mode 100644 index 000000000..58480a781 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_LineDriver.hxx @@ -0,0 +1,157 @@ +// 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/ +// +// File : GEOMImpl_LineDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_LineDriver_HeaderFile +#define _GEOMImpl_LineDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_LineDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_LineDriver); + +class Handle(GEOMImpl_LineDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_LineDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_LineDriver)(const Handle(GEOMImpl_LineDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_LineDriver)(const GEOMImpl_LineDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_LineDriver)& operator=(const Handle(GEOMImpl_LineDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_LineDriver)& operator=(const GEOMImpl_LineDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_LineDriver* operator->() + { + return (GEOMImpl_LineDriver *)ControlAccess(); + } + + GEOMImpl_LineDriver* operator->() const + { + return (GEOMImpl_LineDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_LineDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_LineDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_LineDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_LineDriver(); +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_LineDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_LineDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_LineDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_LineDriver) == AType || TFunction_Driver::IsKind(AType)); } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx b/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx new file mode 100644 index 000000000..041510ca7 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx @@ -0,0 +1,160 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_MarkerDriver::GetID() +{ + static Standard_GUID aMarkerDriver("FF1BBB07-5D14-4df2-980B-3A668264EA16"); + return aMarkerDriver; +} + + +//======================================================================= +//function : GEOMImpl_MarkerDriver +//purpose : +//======================================================================= +GEOMImpl_MarkerDriver::GEOMImpl_MarkerDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_MarkerDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IMarker aPI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == MARKER_CS) { + double OX, OY, OZ; + double XDX, XDY, XDZ; + double YDX, YDY, YDZ; + aPI.GetOrigin(OX, OY, OZ); + aPI.GetXDir(XDX, XDY, XDZ); + aPI.GetYDir(YDX, YDY, YDZ); + + gp_Pnt aPO (OX, OY, OZ); + gp_Vec aVX (XDX, XDY, XDZ); + gp_Vec aVY (YDX, YDY, YDZ); + Standard_Real aTol = Precision::Confusion(); + if (aVX.Magnitude() < aTol || + aVY.Magnitude() < aTol || + aVX.IsParallel(aVY, Precision::Angular())) { + Standard_ConstructionError::Raise("Degenerated or parallel directions given"); + } + + gp_Vec aN = aVX ^ aVY; + gp_Ax3 anA (aPO, aN, aVX); + gp_Pln aPln (anA); + + double aTrimSize = 100.0; + aShape = BRepBuilderAPI_MakeFace(aPln, -aTrimSize, +aTrimSize, -aTrimSize, +aTrimSize).Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_MarkerDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_MarkerDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_MarkerDriver", + sizeof(GEOMImpl_MarkerDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_MarkerDriver) Handle(GEOMImpl_MarkerDriver)::DownCast + (const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_MarkerDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_MarkerDriver))) { + _anOtherObject = Handle(GEOMImpl_MarkerDriver)((Handle(GEOMImpl_MarkerDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_MarkerDriver.hxx b/src/GEOMImpl/GEOMImpl_MarkerDriver.hxx new file mode 100644 index 000000000..822c996a1 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MarkerDriver.hxx @@ -0,0 +1,157 @@ +// 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/ +// +// File : GEOMImpl_MarkerDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_MarkerDriver_HeaderFile +#define _GEOMImpl_MarkerDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_MarkerDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_MarkerDriver); + +class Handle(GEOMImpl_MarkerDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_MarkerDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_MarkerDriver)(const Handle(GEOMImpl_MarkerDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_MarkerDriver)(const GEOMImpl_MarkerDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_MarkerDriver)& operator=(const Handle(GEOMImpl_MarkerDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_MarkerDriver)& operator=(const GEOMImpl_MarkerDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_MarkerDriver* operator->() + { + return (GEOMImpl_MarkerDriver *)ControlAccess(); + } + + GEOMImpl_MarkerDriver* operator->() const + { + return (GEOMImpl_MarkerDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_MarkerDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_MarkerDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_MarkerDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_MarkerDriver(); +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_MarkerDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_MarkerDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_MarkerDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_MarkerDriver) == AType || TFunction_Driver::IsKind(AType)); } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx b/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx new file mode 100644 index 000000000..d92516814 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MeasureDriver.cxx @@ -0,0 +1,154 @@ +// 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/ +// + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_MeasureDriver::GetID() +{ + static Standard_GUID aMeasureDriver("FF1BBB65-5D14-4df2-980B-3A668264EA16"); + return aMeasureDriver; +} + + +//======================================================================= +//function : GEOMImpl_MeasureDriver +//purpose : +//======================================================================= +GEOMImpl_MeasureDriver::GEOMImpl_MeasureDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_MeasureDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IMeasure aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == CDG_MEASURE) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + if (aShapeBase.IsNull()) { + Standard_NullObject::Raise("Shape for centre of mass calculation is null"); + } + + GProp_GProps aSystem; + gp_Pnt aCenterMass; + + if (aShapeBase.ShapeType() == TopAbs_VERTEX) { + aCenterMass = BRep_Tool::Pnt(TopoDS::Vertex(aShapeBase)); + } else if (aShapeBase.ShapeType() == TopAbs_EDGE || aShapeBase.ShapeType() == TopAbs_WIRE) { + BRepGProp::LinearProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else if (aShapeBase.ShapeType() == TopAbs_FACE || aShapeBase.ShapeType() == TopAbs_SHELL) { + BRepGProp::SurfaceProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } else { + BRepGProp::VolumeProperties(aShapeBase, aSystem); + aCenterMass = aSystem.CentreOfMass(); + } + + aShape = BRepBuilderAPI_MakeVertex(aCenterMass).Shape(); + + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_MeasureDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_MeasureDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_MeasureDriver", + sizeof(GEOMImpl_MeasureDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_MeasureDriver) Handle(GEOMImpl_MeasureDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_MeasureDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_MeasureDriver))) { + _anOtherObject = Handle(GEOMImpl_MeasureDriver)((Handle(GEOMImpl_MeasureDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_MeasureDriver.hxx b/src/GEOMImpl/GEOMImpl_MeasureDriver.hxx new file mode 100644 index 000000000..d708d1736 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MeasureDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_MeasureDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_MeasureDriver_HeaderFile +#define _GEOMImpl_MeasureDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_MeasureDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_MeasureDriver); + +class Handle(GEOMImpl_MeasureDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_MeasureDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_MeasureDriver)(const Handle(GEOMImpl_MeasureDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_MeasureDriver)(const GEOMImpl_MeasureDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_MeasureDriver)& operator=(const Handle(GEOMImpl_MeasureDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_MeasureDriver)& operator=(const GEOMImpl_MeasureDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_MeasureDriver* operator->() + { + return (GEOMImpl_MeasureDriver *)ControlAccess(); + } + + GEOMImpl_MeasureDriver* operator->() const + { + return (GEOMImpl_MeasureDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_MeasureDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_MeasureDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_MeasureDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_MeasureDriver(); +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_MeasureDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_MeasureDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_MeasureDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_MeasureDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_MirrorDriver.cxx b/src/GEOMImpl/GEOMImpl_MirrorDriver.cxx new file mode 100644 index 000000000..cde05e64e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MirrorDriver.cxx @@ -0,0 +1,186 @@ +// 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/ +// + +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_MirrorDriver::GetID() +{ + static Standard_GUID aMirrorDriver("FF1BBB57-5D14-4df2-980B-3A668264EA16"); + return aMirrorDriver; +} + + +//======================================================================= +//function : GEOMImpl_MirrorDriver +//purpose : +//======================================================================= + +GEOMImpl_MirrorDriver::GEOMImpl_MirrorDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_MirrorDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + if (aFunction.IsNull()) return 0; + + TopoDS_Shape aShape; + gp_Trsf aTrsf; + + GEOMImpl_IMirror TI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + Handle(GEOM_Function) anOriginalFunction = TI.GetOriginal(); + if (anOriginalFunction.IsNull()) return 0; + + TopoDS_Shape anOriginal = anOriginalFunction->GetValue(); + if (anOriginal.IsNull()) return 0; + + if (aType == MIRROR_PLANE || aType == MIRROR_PLANE_COPY) { + Handle(GEOM_Function) aPlane = TI.GetPlane(); + if (aPlane.IsNull()) return 0; + TopoDS_Shape aFaceShape = aPlane->GetValue(); + if (aFaceShape.IsNull() || aFaceShape.ShapeType() != TopAbs_FACE) return 0; + TopoDS_Face aFace = TopoDS::Face(aFaceShape); + + Handle(Geom_Surface) surf = BRep_Tool::Surface(aFace); + Handle(Geom_Plane) myPlane = Handle(Geom_Plane)::DownCast(surf); + const gp_Ax3 pos = myPlane->Position(); + const gp_Pnt loc = pos.Location(); /* location of the plane */ + const gp_Dir dir = pos.Direction(); /* Main direction of the plane (Z axis) */ + gp_Ax2 aPln (loc, dir); + aTrsf.SetMirror(aPln); + + } else if (aType == MIRROR_AXIS || aType == MIRROR_AXIS_COPY) { + Handle(GEOM_Function) anAxis = TI.GetAxis(); + if (anAxis.IsNull()) return 0; + TopoDS_Shape anAxisShape = anAxis->GetValue(); + if (anAxisShape.IsNull() || anAxisShape.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(anAxisShape); + + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex (anEdge)); + gp_Vec aV (aP1, aP2); + gp_Ax1 anAx1 (aP1, aV); + aTrsf.SetMirror(anAx1); + + } else if (aType == MIRROR_POINT || aType == MIRROR_POINT_COPY) { + Handle(GEOM_Function) aPoint = TI.GetPoint(); + if (aPoint.IsNull()) return 0; + TopoDS_Shape aVertexShape = aPoint->GetValue(); + if (aVertexShape.IsNull() || aVertexShape.ShapeType() != TopAbs_VERTEX) return 0; + TopoDS_Vertex aVertex = TopoDS::Vertex(aVertexShape); + + gp_Pnt aP = BRep_Tool::Pnt(aVertex); + aTrsf.SetMirror(aP); + } else { + return 0; + } + + BRepBuilderAPI_Transform aTransformation (anOriginal, aTrsf, Standard_False); + aShape = aTransformation.Shape(); + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_MirrorDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_MirrorDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_MirrorDriver", + sizeof(GEOMImpl_MirrorDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_MirrorDriver) Handle(GEOMImpl_MirrorDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_MirrorDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_MirrorDriver))) { + _anOtherObject = Handle(GEOMImpl_MirrorDriver)((Handle(GEOMImpl_MirrorDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_MirrorDriver.hxx b/src/GEOMImpl/GEOMImpl_MirrorDriver.hxx new file mode 100644 index 000000000..430e6199b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_MirrorDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_MirrorDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_MirrorDriver_HeaderFile +#define _GEOMImpl_MirrorDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_MirrorDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_MirrorDriver); + +class Handle(GEOMImpl_MirrorDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_MirrorDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_MirrorDriver)(const Handle(GEOMImpl_MirrorDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_MirrorDriver)(const GEOMImpl_MirrorDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_MirrorDriver)& operator=(const Handle(GEOMImpl_MirrorDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_MirrorDriver)& operator=(const GEOMImpl_MirrorDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_MirrorDriver* operator->() + { + return (GEOMImpl_MirrorDriver *)ControlAccess(); + } + + GEOMImpl_MirrorDriver* operator->() const + { + return (GEOMImpl_MirrorDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_MirrorDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_MirrorDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_MirrorDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_MirrorDriver(); +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_MirrorDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_MirrorDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_MirrorDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_MirrorDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx new file mode 100644 index 000000000..d0994f5df --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_OffsetDriver.cxx @@ -0,0 +1,148 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_OffsetDriver::GetID() +{ + static Standard_GUID aOffsetDriver("FF1BBB51-5D14-4df2-980B-3A668264EA16"); + return aOffsetDriver; +} + + +//======================================================================= +//function : GEOMImpl_OffsetDriver +//purpose : +//======================================================================= +GEOMImpl_OffsetDriver::GEOMImpl_OffsetDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_OffsetDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IOffset aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == OFFSET_SHAPE || aType == OFFSET_SHAPE_COPY) { + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + Standard_Real anOffset = aCI.GetValue(); + Standard_Real aTol = Precision::Confusion(); + + if (Abs(anOffset) < aTol) { + TCollection_AsciiString aMsg ("Absolute value of offset can not be less than the tolerance value ("); + aMsg += TCollection_AsciiString(aTol); + aMsg += ")"; + StdFail_NotDone::Raise(aMsg.ToCString()); + } + + BRepOffsetAPI_MakeOffsetShape MO (aShapeBase, + aCI.GetValue(), + aTol); + if (MO.IsDone()) { + aShape = MO.Shape(); + } else { + StdFail_NotDone::Raise("Offset construction failed"); + } + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_OffsetDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_OffsetDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_OffsetDriver", + sizeof(GEOMImpl_OffsetDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_OffsetDriver) Handle(GEOMImpl_OffsetDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_OffsetDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_OffsetDriver))) { + _anOtherObject = Handle(GEOMImpl_OffsetDriver)((Handle(GEOMImpl_OffsetDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_OffsetDriver.hxx b/src/GEOMImpl/GEOMImpl_OffsetDriver.hxx new file mode 100644 index 000000000..04213c437 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_OffsetDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_OffsetDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_OffsetDriver_HeaderFile +#define _GEOMImpl_OffsetDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_OffsetDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_OffsetDriver); + +class Handle(GEOMImpl_OffsetDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_OffsetDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_OffsetDriver)(const Handle(GEOMImpl_OffsetDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_OffsetDriver)(const GEOMImpl_OffsetDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_OffsetDriver)& operator=(const Handle(GEOMImpl_OffsetDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_OffsetDriver)& operator=(const GEOMImpl_OffsetDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_OffsetDriver* operator->() + { + return (GEOMImpl_OffsetDriver *)ControlAccess(); + } + + GEOMImpl_OffsetDriver* operator->() const + { + return (GEOMImpl_OffsetDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_OffsetDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_OffsetDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_OffsetDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_OffsetDriver(); +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_OffsetDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_OffsetDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_OffsetDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_OffsetDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx new file mode 100644 index 000000000..f0ea483b2 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PartitionDriver.cxx @@ -0,0 +1,288 @@ +// 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/ +// + +#include + +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PartitionDriver::GetID() +{ + static Standard_GUID aPartitionDriver("FF1BBB22-5D14-4df2-980B-3A668264EA16"); + return aPartitionDriver; +} + + +//======================================================================= +//function : GEOMImpl_PartitionDriver +//purpose : +//======================================================================= +GEOMImpl_PartitionDriver::GEOMImpl_PartitionDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PartitionDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPartition aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + NMTAlgo_Splitter1 PS; + + if (aType == PARTITION_PARTITION) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + Handle(TColStd_HSequenceOfTransient) aTools = aCI.GetTools(); + Handle(TColStd_HSequenceOfTransient) aKeepIns = aCI.GetKeepIns(); + Handle(TColStd_HSequenceOfTransient) aRemIns = aCI.GetRemoveIns(); + Handle(TColStd_HArray1OfInteger) aMaterials = aCI.GetMaterials(); + Standard_Boolean DoRemoveWebs = !aMaterials.IsNull(); + + unsigned int ind, nbshapes = 0; + nbshapes += aShapes->Length() + aTools->Length(); + nbshapes += aKeepIns->Length() + aRemIns->Length(); + + TopTools_MapOfShape ShapesMap(nbshapes), ToolsMap(nbshapes); + + // add object shapes that are in ListShapes; + for (ind = 1; ind <= aShapes->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("In Partition a shape is null"); + } + if (ShapesMap.Add(aShape_i)) { + PS.AddShape(aShape_i); + if (DoRemoveWebs) { + if (aMaterials->Length() >= ind) + PS.SetMaterial(aShape_i, aMaterials->Value(ind)); + } + } + } + + // add tool shapes that are in ListTools and not in ListShapes; + for (ind = 1; ind <= aTools->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aTools->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("In Partition a tool shape is null"); + } + if (!ShapesMap.Contains(aShape_i) && ToolsMap.Add(aShape_i)) + PS.AddTool(aShape_i); + } + + // add shapes that are in ListKeepInside, as object shapes; + for (ind = 1; ind <= aKeepIns->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aKeepIns->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("In Partition a Keep Inside shape is null"); + } + if (!ToolsMap.Contains(aShape_i) && ShapesMap.Add(aShape_i)) + PS.AddShape(aShape_i); + } + + // add shapes that are in ListRemoveInside, as object shapes; + for (ind = 1; ind <= aRemIns->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aRemIns->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("In Partition a Remove Inside shape is null"); + } + if (!ToolsMap.Contains(aShape_i) && ShapesMap.Add(aShape_i)) + PS.AddShape(aShape_i); + } + + PS.Compute(); + PS.SetRemoveWebs(DoRemoveWebs); + PS.Build((TopAbs_ShapeEnum) aCI.GetLimit()); + + // suppress result outside of shapes in KInsideMap + for (ind = 1; ind <= aKeepIns->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aKeepIns->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + PS.KeepShapesInside(aShape_i); + } + + // suppress result inside of shapes in RInsideMap + for (ind = 1; ind <= aRemIns->Length(); ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aRemIns->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + PS.RemoveShapesInside(aShape_i); + } + + } else if (aType == PARTITION_HALF) { + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + Handle(GEOM_Function) aRefPlane = aCI.GetPlane(); + TopoDS_Shape aShapeArg = aRefShape->GetValue(); + TopoDS_Shape aPlaneArg = aRefPlane->GetValue(); + + if (aShapeArg.IsNull() || aPlaneArg.IsNull()) { + Standard_NullObject::Raise("In Half Partition a shape or a plane is null"); + } + + // add object shapes that are in ListShapes; + PS.AddShape(aShapeArg); + + // add tool shapes that are in ListTools and not in ListShapes; + PS.AddTool(aPlaneArg); + + PS.Compute(); + PS.SetRemoveWebs(Standard_False); + PS.Build(aShapeArg.ShapeType()); + + } else { + } + + aShape = PS.Shape(); + if (aShape.IsNull()) return 0; + + if (!BRepAlgo::IsValid(aShape)) { + Standard_ConstructionError::Raise("Partition aborted : non valid shape result"); + } + + aFunction->SetValue(aShape); + + // Fill history to be used by GetInPlace functionality + TopTools_IndexedMapOfShape aResIndices; + TopExp::MapShapes(aShape, aResIndices); + + // history for all argument shapes + TDF_LabelSequence aLabelSeq; + aFunction->GetDependency(aLabelSeq); + Standard_Integer nbArg = aLabelSeq.Length(); + + for (Standard_Integer iarg = 1; iarg <= nbArg; iarg++) { + + TDF_Label anArgumentRefLabel = aLabelSeq.Value(iarg); + + Handle(GEOM_Object) anArgumentObject = GEOM_Object::GetReferencedObject(anArgumentRefLabel); + TopoDS_Shape anArgumentShape = anArgumentObject->GetValue(); + + TopTools_IndexedMapOfShape anArgumentIndices; + TopExp::MapShapes(anArgumentShape, anArgumentIndices); + Standard_Integer nbArgumentEntities = anArgumentIndices.Extent(); + + // Find corresponding label in history + TDF_Label anArgumentHistoryLabel = + aFunction->GetArgumentHistoryEntry(anArgumentRefLabel, Standard_True); + + for (Standard_Integer ie = 1; ie <= nbArgumentEntities; ie++) { + TopoDS_Shape anEntity = anArgumentIndices.FindKey(ie); + const TopTools_ListOfShape& aModified = PS.Modified(anEntity); + Standard_Integer nbModified = aModified.Extent(); + + if (nbModified > 0) { + TDF_Label aWhatHistoryLabel = anArgumentHistoryLabel.FindChild(ie, Standard_True); + Handle(TDataStd_IntegerArray) anAttr = + TDataStd_IntegerArray::Set(aWhatHistoryLabel, 1, nbModified); + + TopTools_ListIteratorOfListOfShape itM (aModified); + for (int im = 1; itM.More(); itM.Next(), ++im) { + int id = aResIndices.FindIndex(itM.Value()); + anAttr->SetValue(im, id); + } + } + } + } + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PartitionDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PartitionDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PartitionDriver", + sizeof(GEOMImpl_PartitionDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PartitionDriver) Handle(GEOMImpl_PartitionDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PartitionDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PartitionDriver))) { + _anOtherObject = Handle(GEOMImpl_PartitionDriver)((Handle(GEOMImpl_PartitionDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PartitionDriver.hxx b/src/GEOMImpl/GEOMImpl_PartitionDriver.hxx new file mode 100644 index 000000000..fb8236af5 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PartitionDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_PartitionDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PartitionDriver_HeaderFile +#define _GEOMImpl_PartitionDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PartitionDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PartitionDriver); + +class Handle(GEOMImpl_PartitionDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PartitionDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PartitionDriver)(const Handle(GEOMImpl_PartitionDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PartitionDriver)(const GEOMImpl_PartitionDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PartitionDriver)& operator=(const Handle(GEOMImpl_PartitionDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PartitionDriver)& operator=(const GEOMImpl_PartitionDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PartitionDriver* operator->() + { + return (GEOMImpl_PartitionDriver *)ControlAccess(); + } + + GEOMImpl_PartitionDriver* operator->() const + { + return (GEOMImpl_PartitionDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PartitionDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PartitionDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PartitionDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PartitionDriver(); +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_PartitionDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PartitionDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PartitionDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PartitionDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.cxx b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx new file mode 100644 index 000000000..7ab584415 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.cxx @@ -0,0 +1,159 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PipeDriver::GetID() +{ + static Standard_GUID aPipeDriver("FF1BBB19-5D14-4df2-980B-3A668264EA16"); + return aPipeDriver; +} + + +//======================================================================= +//function : GEOMImpl_PipeDriver +//purpose : +//======================================================================= +GEOMImpl_PipeDriver::GEOMImpl_PipeDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPipe aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == PIPE_BASE_PATH) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + Handle(GEOM_Function) aRefPath = aCI.GetPath(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + TopoDS_Shape aShapePath = aRefPath->GetValue(); + if (aShapeBase.IsNull() || aShapePath.IsNull()) { + Standard_NullObject::Raise("MakePipe aborted : null shape argument"); + } + + // Get path contour + TopoDS_Wire aWire; + if (aShapePath.ShapeType() == TopAbs_WIRE) { + aWire = TopoDS::Wire(aShapePath); + } else { + if (aShapePath.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge anEdge = TopoDS::Edge(aShapePath); + aWire = BRepBuilderAPI_MakeWire(anEdge); + } else { + Standard_TypeMismatch::Raise("MakePipe aborted : path shape is neither a wire nor an edge"); + } + } + + // Make pipe + aShape = BRepOffsetAPI_MakePipe(aWire, aShapeBase); + } + else { + } + + if (aShape.IsNull()) return 0; + + BRepCheck_Analyzer ana (aShape, Standard_False); + if (!ana.IsValid()) { + Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); + } + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PipeDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PipeDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PipeDriver", + sizeof(GEOMImpl_PipeDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PipeDriver) Handle(GEOMImpl_PipeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PipeDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PipeDriver))) { + _anOtherObject = Handle(GEOMImpl_PipeDriver)((Handle(GEOMImpl_PipeDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PipeDriver.hxx b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx new file mode 100644 index 000000000..5c9897ac4 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PipeDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_PipeDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PipeDriver_HeaderFile +#define _GEOMImpl_PipeDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PipeDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PipeDriver); + +class Handle(GEOMImpl_PipeDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PipeDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PipeDriver)(const Handle(GEOMImpl_PipeDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PipeDriver)(const GEOMImpl_PipeDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PipeDriver)& operator=(const Handle(GEOMImpl_PipeDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PipeDriver)& operator=(const GEOMImpl_PipeDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PipeDriver* operator->() + { + return (GEOMImpl_PipeDriver *)ControlAccess(); + } + + GEOMImpl_PipeDriver* operator->() const + { + return (GEOMImpl_PipeDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PipeDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PipeDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PipeDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + 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() {}; + + + // 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)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx b/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx new file mode 100644 index 000000000..8941ba280 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PlaneDriver.cxx @@ -0,0 +1,183 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PlaneDriver::GetID() +{ + static Standard_GUID aPlaneDriver("FF1BBB05-5D14-4df2-980B-3A668264EA16"); + return aPlaneDriver; +} + + +//======================================================================= +//function : GEOMImpl_PlaneDriver +//purpose : +//======================================================================= +GEOMImpl_PlaneDriver::GEOMImpl_PlaneDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PlaneDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPlane aPI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + double aSize = aPI.GetSize() / 2.0; + if (aType == PLANE_PNT_VEC) { + Handle(GEOM_Function) aRefPnt = aPI.GetPoint(); + Handle(GEOM_Function) aRefVec = aPI.GetVector(); + TopoDS_Shape aShape1 = aRefPnt->GetValue(); + TopoDS_Shape aShape2 = aRefVec->GetValue(); + if (aShape1.ShapeType() != TopAbs_VERTEX || + aShape2.ShapeType() != TopAbs_EDGE) return 0; + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); + TopoDS_Edge anE = TopoDS::Edge(aShape2); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) { + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + gp_Pln aPln (aP, aV); + aShape = BRepBuilderAPI_MakeFace(aPln, -aSize, +aSize, -aSize, +aSize).Shape(); + } + } else if (aType == PLANE_THREE_PNT) { + Handle(GEOM_Function) aRefPnt1 = aPI.GetPoint1(); + Handle(GEOM_Function) aRefPnt2 = aPI.GetPoint2(); + Handle(GEOM_Function) aRefPnt3 = aPI.GetPoint3(); + TopoDS_Shape aShape1 = aRefPnt1->GetValue(); + TopoDS_Shape aShape2 = aRefPnt2->GetValue(); + TopoDS_Shape aShape3 = aRefPnt3->GetValue(); + if (aShape1.ShapeType() != TopAbs_VERTEX || + aShape2.ShapeType() != TopAbs_VERTEX || + aShape3.ShapeType() != TopAbs_VERTEX) return 0; + gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShape1)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShape2)); + gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShape3)); + if (aP1.Distance(aP2) < gp::Resolution() || + aP1.Distance(aP3) < gp::Resolution() || + aP2.Distance(aP3) < gp::Resolution()) + Standard_ConstructionError::Raise("Plane creation aborted: coincident points given"); + if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) + Standard_ConstructionError::Raise("Plane creation aborted: points lay on one line"); + GC_MakePlane aMakePlane (aP1, aP2, aP3); + aShape = BRepBuilderAPI_MakeFace(aMakePlane, -aSize, +aSize, -aSize, +aSize).Shape(); + } else if (aType == PLANE_FACE) { + Handle(GEOM_Function) aRef = aPI.GetFace(); + TopoDS_Shape aRefShape = aRef->GetValue(); + if (aRefShape.ShapeType() != TopAbs_FACE) return 0; + Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aRefShape)); + if (!aGS->IsKind(STANDARD_TYPE(Geom_Plane))) { + Standard_TypeMismatch::Raise("Plane creation aborted: non-planar face given as argument"); + } + aShape = BRepBuilderAPI_MakeFace(aGS, -aSize, +aSize, -aSize, +aSize).Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PlaneDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PlaneDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PlaneDriver", + sizeof(GEOMImpl_PlaneDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PlaneDriver) Handle(GEOMImpl_PlaneDriver)::DownCast + (const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PlaneDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PlaneDriver))) { + _anOtherObject = Handle(GEOMImpl_PlaneDriver)((Handle(GEOMImpl_PlaneDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PlaneDriver.hxx b/src/GEOMImpl/GEOMImpl_PlaneDriver.hxx new file mode 100644 index 000000000..c772fe1b2 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PlaneDriver.hxx @@ -0,0 +1,157 @@ +// 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/ +// +// File : GEOMImpl_PlaneDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PlaneDriver_HeaderFile +#define _GEOMImpl_PlaneDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PlaneDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PlaneDriver); + +class Handle(GEOMImpl_PlaneDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PlaneDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PlaneDriver)(const Handle(GEOMImpl_PlaneDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PlaneDriver)(const GEOMImpl_PlaneDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PlaneDriver)& operator=(const Handle(GEOMImpl_PlaneDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PlaneDriver)& operator=(const GEOMImpl_PlaneDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PlaneDriver* operator->() + { + return (GEOMImpl_PlaneDriver *)ControlAccess(); + } + + GEOMImpl_PlaneDriver* operator->() const + { + return (GEOMImpl_PlaneDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PlaneDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PlaneDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PlaneDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PlaneDriver(); +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_PlaneDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PlaneDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PlaneDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PlaneDriver) == AType || TFunction_Driver::IsKind(AType)); } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PointDriver.cxx b/src/GEOMImpl/GEOMImpl_PointDriver.cxx new file mode 100644 index 000000000..99bf329be --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PointDriver.cxx @@ -0,0 +1,158 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PointDriver::GetID() +{ + static Standard_GUID aPointDriver("FF1BBB02-5D14-4df2-980B-3A668264EA16"); + return aPointDriver; +} + + +//======================================================================= +//function : GEOMImpl_PointDriver +//purpose : +//======================================================================= +GEOMImpl_PointDriver::GEOMImpl_PointDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PointDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPoint aPI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + gp_Pnt aPnt; + + if (aType == POINT_XYZ) { + aPnt = gp_Pnt(aPI.GetX(), aPI.GetY(), aPI.GetZ()); + + } else if (aType == POINT_XYZ_REF) { + + Handle(GEOM_Function) aRefPoint = aPI.GetRef(); + TopoDS_Shape aRefShape = aRefPoint->GetValue(); + if (aRefShape.ShapeType() != TopAbs_VERTEX) { + Standard_TypeMismatch::Raise + ("Point creation aborted : referenced shape is not a vertex"); + } + gp_Pnt P = BRep_Tool::Pnt(TopoDS::Vertex(aRefShape)); + aPnt = gp_Pnt(P.X() + aPI.GetX(), P.Y() + aPI.GetY(), P.Z() + aPI.GetZ()); + + } else if (aType == POINT_CURVE_PAR) { + + Handle(GEOM_Function) aRefCurve = aPI.GetCurve(); + TopoDS_Shape aRefShape = aRefCurve->GetValue(); + if (aRefShape.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise + ("Point On Curve creation aborted : curve shape is not an edge"); + } + Standard_Real aFP, aLP, aP; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aRefShape), aFP, aLP); + aP = aFP + (aLP - aFP) * aPI.GetParameter(); + aPnt = aCurve->Value(aP); + + } else { + return 0; + } + + BRepBuilderAPI_MakeVertex mkVertex (aPnt); + TopoDS_Shape aShape = mkVertex.Shape(); + aShape.Infinite(Standard_True); + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PointDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PointDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PointDriver", + sizeof(GEOMImpl_PointDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_PointDriver) Handle(GEOMImpl_PointDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PointDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PointDriver))) { + _anOtherObject = Handle(GEOMImpl_PointDriver)((Handle(GEOMImpl_PointDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_PointDriver.hxx b/src/GEOMImpl/GEOMImpl_PointDriver.hxx new file mode 100644 index 000000000..3a0ae554f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PointDriver.hxx @@ -0,0 +1,157 @@ +// 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/ +// +// File : GEOMImpl_PointDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PointDriver_HeaderFile +#define _GEOMImpl_PointDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PointDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PointDriver); + +class Handle(GEOMImpl_PointDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PointDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PointDriver)(const Handle(GEOMImpl_PointDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PointDriver)(const GEOMImpl_PointDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PointDriver)& operator=(const Handle(GEOMImpl_PointDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PointDriver)& operator=(const GEOMImpl_PointDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PointDriver* operator->() + { + return (GEOMImpl_PointDriver *)ControlAccess(); + } + + GEOMImpl_PointDriver* operator->() const + { + return (GEOMImpl_PointDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PointDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PointDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PointDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PointDriver(); +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_PointDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PointDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PointDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PointDriver) == AType || TFunction_Driver::IsKind(AType)); } + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx b/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx new file mode 100644 index 000000000..3399b5715 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PolylineDriver.cxx @@ -0,0 +1,144 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PolylineDriver::GetID() +{ + static Standard_GUID aPolylineDriver("FF1BBB31-5D14-4df2-980B-3A668264EA16"); + return aPolylineDriver; +} + + +//======================================================================= +//function : GEOMImpl_PolylineDriver +//purpose : +//======================================================================= +GEOMImpl_PolylineDriver::GEOMImpl_PolylineDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PolylineDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPolyline aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == POLYLINE_POINTS) { + int aLen = aCI.GetLength(); + int ind = 1; + BRepBuilderAPI_MakePolygon aMakePoly; + for (; ind <= aLen; ind++) + { + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(ind); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX) { + aMakePoly.Add(TopoDS::Vertex(aShapePnt)); +// if (!aMakePoly.Added()) return 0; + } + } + if (false) aMakePoly.Close(); + if (aMakePoly.IsDone()) { + aShape = aMakePoly.Wire(); + } + } + else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PolylineDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PolylineDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PolylineDriver", + sizeof(GEOMImpl_PolylineDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PolylineDriver) Handle(GEOMImpl_PolylineDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PolylineDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PolylineDriver))) { + _anOtherObject = Handle(GEOMImpl_PolylineDriver)((Handle(GEOMImpl_PolylineDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PolylineDriver.hxx b/src/GEOMImpl/GEOMImpl_PolylineDriver.hxx new file mode 100644 index 000000000..fa3de0a28 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PolylineDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_PolylineDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PolylineDriver_HeaderFile +#define _GEOMImpl_PolylineDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PolylineDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PolylineDriver); + +class Handle(GEOMImpl_PolylineDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PolylineDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PolylineDriver)(const Handle(GEOMImpl_PolylineDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PolylineDriver)(const GEOMImpl_PolylineDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PolylineDriver)& operator=(const Handle(GEOMImpl_PolylineDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PolylineDriver)& operator=(const GEOMImpl_PolylineDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PolylineDriver* operator->() + { + return (GEOMImpl_PolylineDriver *)ControlAccess(); + } + + GEOMImpl_PolylineDriver* operator->() const + { + return (GEOMImpl_PolylineDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PolylineDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PolylineDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PolylineDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PolylineDriver(); +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_PolylineDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PolylineDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PolylineDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PolylineDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PositionDriver.cxx b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx new file mode 100644 index 000000000..deb251d0a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PositionDriver.cxx @@ -0,0 +1,193 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PositionDriver::GetID() +{ + static Standard_GUID aPositionDriver("FF1BBB69-5D14-4df2-980B-3A668264EA16"); + return aPositionDriver; +} + + +//======================================================================= +//function : GEOMImpl_PositionDriver +//purpose : +//======================================================================= +GEOMImpl_PositionDriver::GEOMImpl_PositionDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PositionDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPosition aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == POSITION_SHAPE || aType == POSITION_SHAPE_COPY) { + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + Handle(GEOM_Function) aRefStartLCS = aCI.GetStartLCS(); + Handle(GEOM_Function) aRefEndLCS = aCI.GetEndLCS(); + + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + TopoDS_Shape aShapeStartLCS = aRefStartLCS->GetValue(); + TopoDS_Shape aShapeEndLCS = aRefEndLCS->GetValue(); + + if (aShapeBase.IsNull() || aShapeStartLCS.IsNull() || + aShapeEndLCS.IsNull() || aShapeEndLCS.ShapeType() != TopAbs_FACE) + return 0; + + gp_Trsf aTrsf; + gp_Ax3 aStartAx3, aDestAx3; + aStartAx3.Transform(aShapeStartLCS.Location().Transformation()); + aDestAx3.Transform(aShapeEndLCS.Location().Transformation()); + + Handle(Geom_Surface) aGS2 = BRep_Tool::Surface( TopoDS::Face( aShapeEndLCS ) ); + if (!aGS2.IsNull() && aGS2->IsKind( STANDARD_TYPE( Geom_Plane ) ) ) { + Handle(Geom_Plane) aGPlane2 = Handle(Geom_Plane)::DownCast( aGS2 ); + gp_Pln aPln2 = aGPlane2->Pln(); + aDestAx3 = aPln2.Position(); + } + + if(aShapeStartLCS.ShapeType() == TopAbs_FACE) { + Handle(Geom_Surface) aGS = BRep_Tool::Surface( TopoDS::Face( aShapeStartLCS ) ); + if (!aGS.IsNull() && aGS->IsKind( STANDARD_TYPE( Geom_Plane ) ) ) { + Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast( aGS ); + gp_Pln aPln = aGPlane->Pln(); + aStartAx3 = aPln.Position(); + } + aTrsf.SetDisplacement(aStartAx3, aDestAx3); + } + else { + gp_Trsf aTrsf1, aTrsf2; + aTrsf1.SetDisplacement(aStartAx3, aDestAx3); + BRepBuilderAPI_Transform aBT (aShapeBase, aTrsf1, Standard_False); + TopoDS_Shape aNewShape = aBT.Shape(); + + gp_Pnt aPnt; + if (aNewShape.ShapeType() == TopAbs_VERTEX) { + aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aNewShape)); + } + else { + GProp_GProps aSystem; + if (aNewShape.ShapeType() == TopAbs_EDGE || aNewShape.ShapeType() == TopAbs_WIRE) + BRepGProp::LinearProperties(aNewShape, aSystem); + else if (aNewShape.ShapeType() == TopAbs_FACE || aNewShape.ShapeType() == TopAbs_SHELL) + BRepGProp::SurfaceProperties(aNewShape, aSystem); + else + BRepGProp::VolumeProperties(aNewShape, aSystem); + + aPnt = aSystem.CentreOfMass(); + } + + gp_Vec aVec(aPnt, aDestAx3.Location()); + aTrsf2.SetTranslation(aVec); + aTrsf = aTrsf2 * aTrsf1; + } + + BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); + aShape = aBRepTrsf.Shape(); + } + else + return 0; + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PositionDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PositionDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PositionDriver", + sizeof(GEOMImpl_PositionDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PositionDriver) Handle(GEOMImpl_PositionDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PositionDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PositionDriver))) { + _anOtherObject = Handle(GEOMImpl_PositionDriver)((Handle(GEOMImpl_PositionDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PositionDriver.hxx b/src/GEOMImpl/GEOMImpl_PositionDriver.hxx new file mode 100644 index 000000000..a7b833e6c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PositionDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_PositionDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PositionDriver_HeaderFile +#define _GEOMImpl_PositionDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PositionDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PositionDriver); + +class Handle(GEOMImpl_PositionDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PositionDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PositionDriver)(const Handle(GEOMImpl_PositionDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PositionDriver)(const GEOMImpl_PositionDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PositionDriver)& operator=(const Handle(GEOMImpl_PositionDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PositionDriver)& operator=(const GEOMImpl_PositionDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PositionDriver* operator->() + { + return (GEOMImpl_PositionDriver *)ControlAccess(); + } + + GEOMImpl_PositionDriver* operator->() const + { + return (GEOMImpl_PositionDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PositionDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PositionDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PositionDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PositionDriver(); +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_PositionDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PositionDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PositionDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PositionDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_PrismDriver.cxx b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx new file mode 100644 index 000000000..6be39bc15 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PrismDriver.cxx @@ -0,0 +1,165 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_PrismDriver::GetID() +{ + static Standard_GUID aPrismDriver("FF1BBB17-5D14-4df2-980B-3A668264EA16"); + return aPrismDriver; +} + + +//======================================================================= +//function : GEOMImpl_PrismDriver +//purpose : +//======================================================================= +GEOMImpl_PrismDriver::GEOMImpl_PrismDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_PrismDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IPrism aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == PRISM_BASE_VEC_H) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapeVec.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (!V1.IsNull() && !V2.IsNull()) { + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (Abs(aCI.GetH()) < Precision::Confusion()) { + Standard_ConstructionError::Raise("Absolute value of prism height is too small"); + } + if (aV.Magnitude() > Precision::Confusion()) { + aV.Normalize(); + aShape = BRepPrimAPI_MakePrism(aShapeBase, aV * aCI.GetH(), Standard_False).Shape(); + } + } + } + } else if (aType == PRISM_BASE_TWO_PNT) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + Handle(GEOM_Function) aRefPnt1 = aCI.GetFirstPoint(); + Handle(GEOM_Function) aRefPnt2 = aCI.GetLastPoint(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + TopoDS_Shape aShapePnt1 = aRefPnt1->GetValue(); + TopoDS_Shape aShapePnt2 = aRefPnt2->GetValue(); + if (aShapePnt1.ShapeType() == TopAbs_VERTEX && + aShapePnt2.ShapeType() == TopAbs_VERTEX) { + TopoDS_Vertex V1 = TopoDS::Vertex(aShapePnt1); + TopoDS_Vertex V2 = TopoDS::Vertex(aShapePnt2); + if (!V1.IsNull() && !V2.IsNull()) { + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (aV.Magnitude() > gp::Resolution()) { + aShape = BRepPrimAPI_MakePrism(aShapeBase, aV, Standard_False).Shape(); + } + } + } + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_PrismDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_PrismDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PrismDriver", + sizeof(GEOMImpl_PrismDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_PrismDriver) Handle(GEOMImpl_PrismDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_PrismDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PrismDriver))) { + _anOtherObject = Handle(GEOMImpl_PrismDriver)((Handle(GEOMImpl_PrismDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_PrismDriver.hxx b/src/GEOMImpl/GEOMImpl_PrismDriver.hxx new file mode 100644 index 000000000..5129bcbc7 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_PrismDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_PrismDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_PrismDriver_HeaderFile +#define _GEOMImpl_PrismDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_PrismDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PrismDriver); + +class Handle(GEOMImpl_PrismDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_PrismDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_PrismDriver)(const Handle(GEOMImpl_PrismDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_PrismDriver)(const GEOMImpl_PrismDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_PrismDriver)& operator=(const Handle(GEOMImpl_PrismDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_PrismDriver)& operator=(const GEOMImpl_PrismDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_PrismDriver* operator->() + { + return (GEOMImpl_PrismDriver *)ControlAccess(); + } + + GEOMImpl_PrismDriver* operator->() const + { + return (GEOMImpl_PrismDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_PrismDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_PrismDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_PrismDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_PrismDriver(); +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_PrismDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PrismDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_PrismDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_PrismDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx b/src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx new file mode 100644 index 000000000..9208b717b --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_RevolutionDriver.cxx @@ -0,0 +1,165 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_RevolutionDriver::GetID() +{ + static Standard_GUID aRevolutionDriver("FF1BBB18-5D14-4df2-980B-3A668264EA16"); + return aRevolutionDriver; +} + + +//======================================================================= +//function : GEOMImpl_RevolutionDriver +//purpose : +//======================================================================= +GEOMImpl_RevolutionDriver::GEOMImpl_RevolutionDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_RevolutionDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IRevolution aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == REVOLUTION_BASE_AXIS_ANGLE) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + Handle(GEOM_Function) aRefAxis = aCI.GetAxis(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + TopoDS_Shape aShapeAxis = aRefAxis->GetValue(); + if (aShapeAxis.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise("Revolution Axis must be an edge"); + } + + TopoDS_Edge anE = TopoDS::Edge(aShapeAxis); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_ConstructionError::Raise("Bad edge for the Revolution Axis given"); + } + + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (aV.Magnitude() < Precision::Confusion()) { + Standard_ConstructionError::Raise + ("End vertices of edge, defining the Revolution Axis, are too close"); + } + + if (aShapeBase.ShapeType() == TopAbs_VERTEX) { + gp_Lin aL(BRep_Tool::Pnt(V1), gp_Dir(aV)); + Standard_Real d = aL.Distance(BRep_Tool::Pnt(TopoDS::Vertex(aShapeBase))); + if (d < Precision::Confusion()) { + Standard_ConstructionError::Raise("Vertex to be rotated is too close to Revolution Axis"); + } + } + + gp_Ax1 anAxis (BRep_Tool::Pnt(V1), aV); + BRepPrimAPI_MakeRevol MR (aShapeBase, anAxis, aCI.GetAngle(), Standard_False); + if (!MR.IsDone()) MR.Build(); + if (!MR.IsDone()) StdFail_NotDone::Raise("Revolution algorithm has failed"); + aShape = MR.Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_RevolutionDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_RevolutionDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_RevolutionDriver", + sizeof(GEOMImpl_RevolutionDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_RevolutionDriver) Handle(GEOMImpl_RevolutionDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_RevolutionDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_RevolutionDriver))) { + _anOtherObject = Handle(GEOMImpl_RevolutionDriver)((Handle(GEOMImpl_RevolutionDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx b/src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx new file mode 100644 index 000000000..c063c435e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_RevolutionDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_RevolutionDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_RevolutionDriver_HeaderFile +#define _GEOMImpl_RevolutionDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_RevolutionDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_RevolutionDriver); + +class Handle(GEOMImpl_RevolutionDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_RevolutionDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_RevolutionDriver)(const Handle(GEOMImpl_RevolutionDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_RevolutionDriver)(const GEOMImpl_RevolutionDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_RevolutionDriver)& operator=(const Handle(GEOMImpl_RevolutionDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_RevolutionDriver)& operator=(const GEOMImpl_RevolutionDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_RevolutionDriver* operator->() + { + return (GEOMImpl_RevolutionDriver *)ControlAccess(); + } + + GEOMImpl_RevolutionDriver* operator->() const + { + return (GEOMImpl_RevolutionDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_RevolutionDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_RevolutionDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_RevolutionDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_RevolutionDriver(); +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_RevolutionDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_RevolutionDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_RevolutionDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_RevolutionDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_RotateDriver.cxx b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx new file mode 100644 index 000000000..8c76d1862 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_RotateDriver.cxx @@ -0,0 +1,264 @@ +// 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/ +// + +#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 + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_RotateDriver::GetID() +{ + static Standard_GUID aRotateDriver("FF1BBB56-5D14-4df2-980B-3A668264EA16"); + return aRotateDriver; +} + + +//======================================================================= +//function : GEOMImpl_RotateDriver +//purpose : +//======================================================================= + +GEOMImpl_RotateDriver::GEOMImpl_RotateDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const +{ + if(Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + if(aFunction.IsNull()) return 0; + + GEOMImpl_IRotate RI(aFunction); + gp_Trsf aTrsf; + Standard_Integer aType = aFunction->GetType(); + Handle(GEOM_Function) anOriginalFunction = RI.GetOriginal(); + if(anOriginalFunction.IsNull()) return 0; + TopoDS_Shape aShape, anOriginal = anOriginalFunction->GetValue(); + if(anOriginal.IsNull()) return 0; + + if(aType == ROTATE || aType == ROTATE_COPY) { + Handle(GEOM_Function) anAxis = RI.GetAxis(); + if(anAxis.IsNull()) return 0; + TopoDS_Shape A = anAxis->GetValue(); + if(A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(A); + + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge)); + gp_Dir aDir(gp_Vec(aP1, aP2)); + gp_Ax1 anAx1(aP1, aDir); + Standard_Real anAngle = RI.GetAngle(); + aTrsf.SetRotation(anAx1, anAngle); + + BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False); + aShape = aTransformation.Shape(); + } + else if(aType == ROTATE_1D) { + //Get direction + Handle(GEOM_Function) anAxis = RI.GetAxis(); + if(anAxis.IsNull()) return 0; + TopoDS_Shape A = anAxis->GetValue(); + if(A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(A); + + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge)); + gp_Dir D(gp_Vec(aP1, aP2)) ; + + gp_Ax1 AX1(aP1, D) ; + + Standard_Integer nbtimes = RI.GetNbIter1(); + Standard_Real angle = 360.0/nbtimes ; + + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound( aCompound ); + + for (int i = 0; i < nbtimes; i++ ) { + aTrsf.SetRotation(AX1, i*angle*PI180) ; + BRepBuilderAPI_Transform myBRepTransformation(anOriginal, aTrsf, Standard_False) ; + B.Add( aCompound, myBRepTransformation.Shape() ); + } + + aShape = aCompound ; + } + else if(aType == ROTATE_2D) { + Standard_Real DX, DY, DZ ; + + //Get direction + Handle(GEOM_Function) anAxis = RI.GetAxis(); + if(anAxis.IsNull()) return 0; + TopoDS_Shape A = anAxis->GetValue(); + if(A.IsNull() || A.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(A); + gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + gp_Pnt aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge)); + gp_Dir D(gp_Vec(aP1, aP2)) ; + + gp_Ax1 AX1(aP1, D) ; + + + gp_Trsf theTransformation1 ; + gp_Trsf theTransformation2 ; + gp_Pnt P1 ; + GProp_GProps System ; + + if ( anOriginal.ShapeType() == TopAbs_VERTEX) { + P1 = BRep_Tool::Pnt(TopoDS::Vertex( anOriginal )); + } + else if ( anOriginal.ShapeType() == TopAbs_EDGE || anOriginal.ShapeType() == TopAbs_WIRE ) { + BRepGProp::LinearProperties(anOriginal, System); + P1 = System.CentreOfMass() ; + } + else if ( anOriginal.ShapeType() == TopAbs_FACE || anOriginal.ShapeType() == TopAbs_SHELL ) { + BRepGProp::SurfaceProperties(anOriginal, System); + P1 = System.CentreOfMass() ; + } + else { + BRepGProp::VolumeProperties(anOriginal, System); + P1 = System.CentreOfMass() ; + } + + Handle(Geom_Line) Line = new Geom_Line(AX1); + GeomAPI_ProjectPointOnCurve aPrjTool( P1, Line ) ; + gp_Pnt P2 = aPrjTool.NearestPoint(); + + if ( P1.IsEqual(P2, Precision::Confusion() ) ) return 0; + + gp_Vec Vec(P1.X()-P2.X(), P1.Y()-P2.Y(), P1.Z()-P2.Z()) ; + Vec.Normalize(); + + Standard_Integer nbtimes2 = RI.GetNbIter2(); + Standard_Integer nbtimes1 = RI.GetNbIter1(); + Standard_Real step = RI.GetStep(); + Standard_Real ang = RI.GetAngle(); + + gp_Vec myVec ; + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound( aCompound ); + for (int i = 0; i < nbtimes2; i++ ) { + for (int j = 0; j < nbtimes1; j++ ) { + DX = i * step * Vec.X() ; + DY = i * step * Vec.Y() ; + DZ = i * step * Vec.Z() ; + myVec.SetCoord( DX, DY, DZ ) ; + theTransformation1.SetTranslation(myVec) ; + theTransformation2.SetRotation(AX1, j*ang*PI180) ; + BRepBuilderAPI_Transform myBRepTransformation1(anOriginal, theTransformation1, Standard_False) ; + BRepBuilderAPI_Transform myBRepTransformation2(myBRepTransformation1.Shape(), theTransformation2, Standard_False) ; + B.Add( aCompound, myBRepTransformation2.Shape() ); + } + } + + aShape = aCompound; + + } + else return 0; + + + + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_RotateDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_RotateDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_RotateDriver", + sizeof(GEOMImpl_RotateDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_RotateDriver) Handle(GEOMImpl_RotateDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_RotateDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_RotateDriver))) { + _anOtherObject = Handle(GEOMImpl_RotateDriver)((Handle(GEOMImpl_RotateDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_RotateDriver.hxx b/src/GEOMImpl/GEOMImpl_RotateDriver.hxx new file mode 100644 index 000000000..c9800cfb0 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_RotateDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_RotateDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_RotateDriver_HeaderFile +#define _GEOMImpl_RotateDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_RotateDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_RotateDriver); + +class Handle(GEOMImpl_RotateDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_RotateDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_RotateDriver)(const Handle(GEOMImpl_RotateDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_RotateDriver)(const GEOMImpl_RotateDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_RotateDriver)& operator=(const Handle(GEOMImpl_RotateDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_RotateDriver)& operator=(const GEOMImpl_RotateDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_RotateDriver* operator->() + { + return (GEOMImpl_RotateDriver *)ControlAccess(); + } + + GEOMImpl_RotateDriver* operator->() const + { + return (GEOMImpl_RotateDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_RotateDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_RotateDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_RotateDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_RotateDriver(); +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_RotateDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_RotateDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_RotateDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_RotateDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ScaleDriver.cxx b/src/GEOMImpl/GEOMImpl_ScaleDriver.cxx new file mode 100644 index 000000000..21824877f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ScaleDriver.cxx @@ -0,0 +1,138 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ScaleDriver::GetID() +{ + static Standard_GUID aScaleDriver("FF1BBB52-5D14-4df2-980B-3A668264EA16"); + return aScaleDriver; +} + + +//======================================================================= +//function : GEOMImpl_ScaleDriver +//purpose : +//======================================================================= +GEOMImpl_ScaleDriver::GEOMImpl_ScaleDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ScaleDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IScale aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == SCALE_SHAPE || aType == SCALE_SHAPE_COPY) { + Handle(GEOM_Function) aRefShape = aCI.GetShape(); + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); + TopoDS_Shape aShapeBase = aRefShape->GetValue(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapeBase.IsNull() || aShapePnt.IsNull()) return 0; + if (aShapePnt.ShapeType() != TopAbs_VERTEX) return 0; + + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + gp_Trsf aTrsf; + aTrsf.SetScale(aP, aCI.GetFactor()); + BRepBuilderAPI_Transform aBRepTrsf (aShapeBase, aTrsf, Standard_False); + aShape = aBRepTrsf.Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ScaleDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ScaleDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ScaleDriver", + sizeof(GEOMImpl_ScaleDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ScaleDriver) Handle(GEOMImpl_ScaleDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ScaleDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ScaleDriver))) { + _anOtherObject = Handle(GEOMImpl_ScaleDriver)((Handle(GEOMImpl_ScaleDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ScaleDriver.hxx b/src/GEOMImpl/GEOMImpl_ScaleDriver.hxx new file mode 100644 index 000000000..3f80b8311 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ScaleDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ScaleDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ScaleDriver_HeaderFile +#define _GEOMImpl_ScaleDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ScaleDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ScaleDriver); + +class Handle(GEOMImpl_ScaleDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ScaleDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ScaleDriver)(const Handle(GEOMImpl_ScaleDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ScaleDriver)(const GEOMImpl_ScaleDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ScaleDriver)& operator=(const Handle(GEOMImpl_ScaleDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ScaleDriver)& operator=(const GEOMImpl_ScaleDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ScaleDriver* operator->() + { + return (GEOMImpl_ScaleDriver *)ControlAccess(); + } + + GEOMImpl_ScaleDriver* operator->() const + { + return (GEOMImpl_ScaleDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ScaleDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ScaleDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ScaleDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ScaleDriver(); +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_ScaleDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ScaleDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ScaleDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ScaleDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx new file mode 100644 index 000000000..50ba2a682 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -0,0 +1,413 @@ +// 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/ +// + +#include + +#include +#include +#include +#include +#include + +#include + +// OCCT Includes +#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 + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_ShapeDriver::GetID() +{ + static Standard_GUID aShapeDriver("FF1BBB54-5D14-4df2-980B-3A668264EA16"); + return aShapeDriver; +} + + +//======================================================================= +//function : GEOMImpl_ShapeDriver +//purpose : +//======================================================================= +GEOMImpl_ShapeDriver::GEOMImpl_ShapeDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IShapes aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + BRep_Builder B; + + if (aType == WIRE_EDGES) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + + TopoDS_Wire aWire; + B.MakeWire(aWire); + BRepBuilderAPI_MakeWire MW; + bool isMWDone = true; + + // add edges + for (ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("Shape for wire construction is null"); + } + if (aShape_i.ShapeType() == TopAbs_EDGE) { + B.Add(aWire, TopoDS::Edge(aShape_i)); + MW.Add(TopoDS::Edge(aShape_i)); + } else if (aShape_i.ShapeType() == TopAbs_WIRE) { + B.Add(aWire, TopoDS::Wire(aShape_i)); + MW.Add(TopoDS::Wire(aShape_i)); + } else { + Standard_TypeMismatch::Raise + ("Shape for wire construction is neither an edge nor a wire"); + } + if (!MW.IsDone()) { + // check status after each edge/wire addition, because the final status + // can be OK even in case, when some edges/wires was not accepted. + isMWDone = false; + } + } + + if (isMWDone) { + aShape = MW; + } else { + // fix edges order + Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire; + aFW->Load(aWire); + aFW->FixReorder(); + + if (aFW->StatusReorder(ShapeExtend_FAIL1)) { + Standard_ConstructionError::Raise("Wire construction failed: several loops detected"); + } else if (aFW->StatusReorder(ShapeExtend_FAIL)) { + Standard_ConstructionError::Raise("Wire construction failed"); + } else if (aFW->StatusReorder(ShapeExtend_DONE2)) { + Standard_ConstructionError::Raise("Wire construction failed: some gaps detected"); + } else { + } + aShape = aFW->WireAPIMake(); + } + + } else if (aType == FACE_WIRE) { + Handle(GEOM_Function) aRefBase = aCI.GetBase(); + TopoDS_Shape aShapeBase = aRefBase->GetValue(); + if (aShapeBase.IsNull() || aShapeBase.ShapeType() != TopAbs_WIRE) { + Standard_NullObject::Raise + ("Shape for face construction is null or not a wire"); + } + TopoDS_Wire W = TopoDS::Wire(aShapeBase); + //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); + //if (!MF.IsDone()) { + // Standard_ConstructionError::Raise("Face construction failed"); + //} + //aShape = MF.Shape(); + GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), aShape); + if (aShape.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + + } else if (aType == FACE_WIRES) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + int nbshapes = aShapes->Length(); + if (nbshapes < 1) { + Standard_ConstructionError::Raise("No wires given"); + } + + // first wire + Handle(GEOM_Function) aRefWire = Handle(GEOM_Function)::DownCast(aShapes->Value(1)); + TopoDS_Shape aWire = aRefWire->GetValue(); + if (aWire.IsNull() || aWire.ShapeType() != TopAbs_WIRE) { + Standard_NullObject::Raise("Shape for face construction is null or not a wire"); + } + TopoDS_Wire W = TopoDS::Wire(aWire); + + // basic face + //BRepBuilderAPI_MakeFace MF (W, aCI.GetIsPlanar()); + //if (!MF.IsDone()) { + // Standard_ConstructionError::Raise("Face construction failed"); + //} + //TopoDS_Shape FFace = MF.Shape(); + TopoDS_Shape FFace; + GEOMImpl_Block6Explorer::MakeFace(W, aCI.GetIsPlanar(), FFace); + if (FFace.IsNull()) { + Standard_ConstructionError::Raise("Face construction failed"); + } + + if (nbshapes == 1) { + aShape = FFace; + + } else { + TopoDS_Compound C; + BRep_Builder aBuilder; + aBuilder.MakeCompound(C); + BRepAlgo_FaceRestrictor FR; + + TopAbs_Orientation OriF = FFace.Orientation(); + TopoDS_Shape aLocalS = FFace.Oriented(TopAbs_FORWARD); + FR.Init(TopoDS::Face(aLocalS), Standard_False, Standard_True); + + for (int ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefWire_i = + Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aWire_i = aRefWire_i->GetValue(); + if (aWire_i.IsNull() || aWire_i.ShapeType() != TopAbs_WIRE) { + Standard_NullObject::Raise("Shape for face construction is null or not a wire"); + } + + FR.Add(TopoDS::Wire(aWire_i)); + } + + FR.Perform(); + + if (FR.IsDone()) { + int k = 0; + TopoDS_Shape aFace; + for (; FR.More(); FR.Next()) { + aFace = FR.Current().Oriented(OriF); + aBuilder.Add(C, aFace); + k++; + } + if (k == 1) { + aShape = aFace; + } else { + aShape = C; + } + } + } + } else if (aType == SHELL_FACES) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + + // add faces + BRepBuilderAPI_Sewing aSewing(Precision::Confusion()*10.0); + for (ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("Face for shell construction is null"); + } + aSewing.Add(aShape_i); + } + + aSewing.Perform(); + + TopExp_Explorer exp (aSewing.SewedShape(), TopAbs_SHELL); + Standard_Integer ish = 0; + for (; exp.More(); exp.Next()) { + aShape = exp.Current(); + ish++; + } + + if (ish != 1) + aShape = aSewing.SewedShape(); + + } else if (aType == SOLID_SHELL) { + Handle(GEOM_Function) aRefShell = aCI.GetBase(); + TopoDS_Shape aShapeShell = aRefShell->GetValue(); + if (aShapeShell.IsNull() || aShapeShell.ShapeType() != TopAbs_SHELL) { + Standard_NullObject::Raise("Shape for solid construction is null or not a shell"); + } + + BRepCheck_Shell chkShell(TopoDS::Shell(aShapeShell)); + if(chkShell.Closed() == BRepCheck_NotClosed) return 0; + + TopoDS_Solid Sol; + B.MakeSolid(Sol); + B.Add(Sol, aShapeShell); + BRepClass3d_SolidClassifier SC (Sol); + SC.PerformInfinitePoint(Precision::Confusion()); + if (SC.State() == TopAbs_IN) { + B.MakeSolid(Sol); + B.Add(Sol, aShapeShell.Reversed()); + } + + aShape = Sol; + + } else if (aType == SOLID_SHELLS) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + Standard_Integer ish = 0; + TopoDS_Solid Sol; + B.MakeSolid(Sol); + + // add shapes + for (ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShapeShell = aRefShape->GetValue(); + if (aShapeShell.IsNull()) { + Standard_NullObject::Raise("Shell for solid construction is null"); + } + if (aShapeShell.ShapeType() == TopAbs_SHELL) { + B.Add(Sol, aShapeShell); + ish++; + } + } + if ( ish == 0 ) return 0; + BRepClass3d_SolidClassifier SC (Sol); + SC.PerformInfinitePoint(Precision::Confusion()); + switch (SC.State()) { + case TopAbs_IN: + aShape = Sol.Reversed(); break; + case TopAbs_OUT: + aShape = Sol; break; + default: // not closed shell? + return 0; + } + + } else if (aType == COMPOUND_SHAPES) { + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + + // add shapes + TopoDS_Compound C; + B.MakeCompound(C); + for (ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("Shape for compound construction is null"); + } + B.Add(C, aShape_i); + } + + aShape = C; + + } else if (aType == REVERSE_ORIENTATION) { + Handle(GEOM_Function) aRefShape = aCI.GetBase(); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("Shape for reverse is null"); + } + + BRepBuilderAPI_Copy Copy(aShape_i); + if( Copy.IsDone() ) { + TopoDS_Shape tds = Copy.Shape(); + if( tds.IsNull() ) { + Standard_ConstructionError::Raise("Orientation aborted : Can not reverse the shape"); + } + + if( tds.Orientation() == TopAbs_FORWARD) + tds.Orientation(TopAbs_REVERSED) ; + else + tds.Orientation(TopAbs_FORWARD) ; + + aShape = tds; + } + } + + if (aShape.IsNull()) return 0; + + // Check shape validity + BRepCheck_Analyzer ana (aShape, false); + if (!ana.IsValid()) { + Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); + } + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_ShapeDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_ShapeDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_ShapeDriver", + sizeof(GEOMImpl_ShapeDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_ShapeDriver) Handle(GEOMImpl_ShapeDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_ShapeDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_ShapeDriver))) { + _anOtherObject = Handle(GEOMImpl_ShapeDriver)((Handle(GEOMImpl_ShapeDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx new file mode 100644 index 000000000..32dab4150 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_ShapeDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_ShapeDriver_HeaderFile +#define _GEOMImpl_ShapeDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_ShapeDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_ShapeDriver); + +class Handle(GEOMImpl_ShapeDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_ShapeDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_ShapeDriver)(const Handle(GEOMImpl_ShapeDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_ShapeDriver)(const GEOMImpl_ShapeDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_ShapeDriver)& operator=(const Handle(GEOMImpl_ShapeDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_ShapeDriver)& operator=(const GEOMImpl_ShapeDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_ShapeDriver* operator->() + { + return (GEOMImpl_ShapeDriver *)ControlAccess(); + } + + GEOMImpl_ShapeDriver* operator->() const + { + return (GEOMImpl_ShapeDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_ShapeDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_ShapeDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_ShapeDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_ShapeDriver(); +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_ShapeDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_ShapeDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_ShapeDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_ShapeDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_SketcherDriver.cxx b/src/GEOMImpl/GEOMImpl_SketcherDriver.cxx new file mode 100644 index 000000000..b6075c0b4 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SketcherDriver.cxx @@ -0,0 +1,169 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_SketcherDriver::GetID() +{ + static Standard_GUID aSketcherDriver("FF1BBB64-5D14-4df2-980B-3A668264EA16"); + return aSketcherDriver; +} + + +//======================================================================= +//function : GEOMImpl_SketcherDriver +//purpose : +//======================================================================= +GEOMImpl_SketcherDriver::GEOMImpl_SketcherDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_SketcherDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ISketcher aCI (aFunction); + //Standard_Integer aType = aFunction->GetType(); + + // retrieve the command + TCollection_AsciiString aCommand = aCI.GetCommand(); + if (aCommand.IsEmpty()) + return 0; + + TopoDS_Shape aShape; + + // create sketcher + Sketcher_Profile aProfile (aCommand.ToCString()); + + if (!aProfile.IsDone()) { + Standard_ConstructionError::Raise("Sketcher creation failed"); + } + + aShape = aProfile.GetShape(); + if (aShape.IsNull()) + return 0; + + gp_Ax3 aWPlane; + if ( aFunction->GetType() == SKETCHER_NINE_DOUBLS ) + { + gp_Pnt aOrigin = + gp_Pnt(aCI.GetWorkingPlane(1), aCI.GetWorkingPlane(2), aCI.GetWorkingPlane(3)); + gp_Dir aDirZ = + gp_Dir(aCI.GetWorkingPlane(4), aCI.GetWorkingPlane(5), aCI.GetWorkingPlane(6)); + gp_Dir aDirX = + gp_Dir(aCI.GetWorkingPlane(7), aCI.GetWorkingPlane(8), aCI.GetWorkingPlane(9)); + aWPlane = gp_Ax3(aOrigin, aDirZ, aDirX); + } + else + { + Handle(GEOM_Function) aRefFace = aCI.GetWorkingPlane(); + TopoDS_Shape aShape = aRefFace->GetValue(); + if ( aShape.IsNull() || aShape.ShapeType() != TopAbs_FACE ) + return 0; + Handle(Geom_Surface) aGS = BRep_Tool::Surface( TopoDS::Face( aShape )); + if ( aGS.IsNull() || !aGS->IsKind( STANDARD_TYPE( Geom_Plane ))) + return 0; + Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast( aGS ); + aWPlane = aGPlane->Pln().Position(); + } + gp_Trsf aTrans; + aTrans.SetTransformation(aWPlane); + aTrans.Invert(); + BRepBuilderAPI_Transform aTransformation (aShape, aTrans, Standard_False); + aShape = aTransformation.Shape(); + + if (aShape.IsNull()) + return 0; + + // set the function result + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_SketcherDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_SketcherDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_SketcherDriver", + sizeof(GEOMImpl_SketcherDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_SketcherDriver) Handle(GEOMImpl_SketcherDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_SketcherDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_SketcherDriver))) { + _anOtherObject = Handle(GEOMImpl_SketcherDriver)((Handle(GEOMImpl_SketcherDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_SketcherDriver.hxx b/src/GEOMImpl/GEOMImpl_SketcherDriver.hxx new file mode 100644 index 000000000..04886ea7f --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SketcherDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_SketcherDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_SketcherDriver_HeaderFile +#define _GEOMImpl_SketcherDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_SketcherDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_SketcherDriver); + +class Handle(GEOMImpl_SketcherDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_SketcherDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_SketcherDriver)(const Handle(GEOMImpl_SketcherDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_SketcherDriver)(const GEOMImpl_SketcherDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_SketcherDriver)& operator=(const Handle(GEOMImpl_SketcherDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_SketcherDriver)& operator=(const GEOMImpl_SketcherDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_SketcherDriver* operator->() + { + return (GEOMImpl_SketcherDriver *)ControlAccess(); + } + + GEOMImpl_SketcherDriver* operator->() const + { + return (GEOMImpl_SketcherDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_SketcherDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_SketcherDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_SketcherDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_SketcherDriver(); +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_SketcherDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_SketcherDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_SketcherDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_SketcherDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_SphereDriver.cxx b/src/GEOMImpl/GEOMImpl_SphereDriver.cxx new file mode 100644 index 000000000..1cd98297e --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SphereDriver.cxx @@ -0,0 +1,133 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_SphereDriver::GetID() +{ + static Standard_GUID aSphereDriver("FF1BBB16-5D14-4df2-980B-3A668264EA16"); + return aSphereDriver; +} + + +//======================================================================= +//function : GEOMImpl_SphereDriver +//purpose : +//======================================================================= +GEOMImpl_SphereDriver::GEOMImpl_SphereDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_SphereDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ISphere aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == SPHERE_R) { + aShape = BRepPrimAPI_MakeSphere(aCI.GetR()).Shape(); + } + else if (aType == SPHERE_PNT_R) { + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + aShape = BRepPrimAPI_MakeSphere(aP, aCI.GetR()).Shape(); + } + } + else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_SphereDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_SphereDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_SphereDriver", + sizeof(GEOMImpl_SphereDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_SphereDriver) Handle(GEOMImpl_SphereDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_SphereDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_SphereDriver))) { + _anOtherObject = Handle(GEOMImpl_SphereDriver)((Handle(GEOMImpl_SphereDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_SphereDriver.hxx b/src/GEOMImpl/GEOMImpl_SphereDriver.hxx new file mode 100644 index 000000000..d770e7213 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SphereDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_SphereDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_SphereDriver_HeaderFile +#define _GEOMImpl_SphereDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_SphereDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_SphereDriver); + +class Handle(GEOMImpl_SphereDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_SphereDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_SphereDriver)(const Handle(GEOMImpl_SphereDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_SphereDriver)(const GEOMImpl_SphereDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_SphereDriver)& operator=(const Handle(GEOMImpl_SphereDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_SphereDriver)& operator=(const GEOMImpl_SphereDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_SphereDriver* operator->() + { + return (GEOMImpl_SphereDriver *)ControlAccess(); + } + + GEOMImpl_SphereDriver* operator->() const + { + return (GEOMImpl_SphereDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_SphereDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_SphereDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_SphereDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_SphereDriver(); +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_SphereDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_SphereDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_SphereDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_SphereDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_SplineDriver.cxx b/src/GEOMImpl/GEOMImpl_SplineDriver.cxx new file mode 100644 index 000000000..0e1bae59a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SplineDriver.cxx @@ -0,0 +1,176 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +//#include +#include + +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_SplineDriver::GetID() +{ + static Standard_GUID aSplineDriver("FF1BBB33-5D14-4df2-980B-3A668264EA16"); + return aSplineDriver; +} + + +//======================================================================= +//function : GEOMImpl_SplineDriver +//purpose : +//======================================================================= +GEOMImpl_SplineDriver::GEOMImpl_SplineDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ISpline aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == SPLINE_BEZIER || aType == SPLINE_INTERPOLATION) { + int ind, aLen = aCI.GetLength(); + if (aLen < 2) return 0; + Standard_Boolean isSeveral = Standard_False; + gp_Pnt aPrevP; + TColgp_Array1OfPnt CurvePoints (1, aLen); + for (ind = 1; ind <= aLen; ind++) { + Handle(GEOM_Function) aRefPoint = aCI.GetPoint(ind); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + if (aShapePnt.ShapeType() == TopAbs_VERTEX) { + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + if (!isSeveral && ind > 1) { + if (aP.Distance(aPrevP) > Precision::Confusion()) { + isSeveral = Standard_True; + } + } + CurvePoints.SetValue(ind, aP); + aPrevP = aP; + } + } + if (aType == SPLINE_BEZIER) { + if (!isSeveral) { + Standard_ConstructionError::Raise("Points for Bezier Curve are too close"); + } + Handle(Geom_BezierCurve) GBC = new Geom_BezierCurve(CurvePoints); + aShape = BRepBuilderAPI_MakeEdge(GBC).Edge(); + } else { +// GeomAPI_PointsToBSpline GBC (CurvePoints); +// aShape = BRepBuilderAPI_MakeEdge(GBC).Edge(); + Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt(1, aLen); + for (ind = 1; ind <= aLen; ind++) { + aHCurvePoints->SetValue(ind, CurvePoints.Value(ind)); + } + GeomAPI_Interpolate GBC (aHCurvePoints, Standard_False, gp::Resolution()); + GBC.Perform(); + if (GBC.IsDone()) + aShape = BRepBuilderAPI_MakeEdge(GBC.Curve()).Edge(); + else + return 0; + } + } + else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_SplineDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_SplineDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_SplineDriver", + sizeof(GEOMImpl_SplineDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_SplineDriver) Handle(GEOMImpl_SplineDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_SplineDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_SplineDriver))) { + _anOtherObject = Handle(GEOMImpl_SplineDriver)((Handle(GEOMImpl_SplineDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_SplineDriver.hxx b/src/GEOMImpl/GEOMImpl_SplineDriver.hxx new file mode 100644 index 000000000..3e809de8a --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_SplineDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_SplineDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_SplineDriver_HeaderFile +#define _GEOMImpl_SplineDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_SplineDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_SplineDriver); + +class Handle(GEOMImpl_SplineDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_SplineDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_SplineDriver)(const Handle(GEOMImpl_SplineDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_SplineDriver)(const GEOMImpl_SplineDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_SplineDriver)& operator=(const Handle(GEOMImpl_SplineDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_SplineDriver)& operator=(const GEOMImpl_SplineDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_SplineDriver* operator->() + { + return (GEOMImpl_SplineDriver *)ControlAccess(); + } + + GEOMImpl_SplineDriver* operator->() const + { + return (GEOMImpl_SplineDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_SplineDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_SplineDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_SplineDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_SplineDriver(); +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_SplineDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_SplineDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_SplineDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_SplineDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Template.cxx b/src/GEOMImpl/GEOMImpl_Template.cxx new file mode 100644 index 000000000..992faed5c --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Template.cxx @@ -0,0 +1,107 @@ +// 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/ +// + +#include + +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_Template::GetID() +{ + static Standard_GUID aTemplate("Insert the correct GUID here"); + return aTemplate; +} + + +//======================================================================= +//function : GEOMImpl_Template +//purpose : +//======================================================================= + +GEOMImpl_Template::GEOMImpl_Template() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_Template::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + if(aFunction.IsNull()) return 0; + + //Add implemetation here + + log.SetTouched(Label()); + return 1; +} + + +//======================================================================= +//function : GEOMImpl_Template_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_Template_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_Template", + sizeof(GEOMImpl_Template), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_Template) Handle(GEOMImpl_Template)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_Template) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_Template))) { + _anOtherObject = Handle(GEOMImpl_Template)((Handle(GEOMImpl_Template)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_Template.hxx b/src/GEOMImpl/GEOMImpl_Template.hxx new file mode 100644 index 000000000..916cf6ab9 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Template.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_Template.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_Template_HeaderFile +#define _GEOMImpl_Template_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_Template; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_Template); + +class Handle(GEOMImpl_Template) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_Template)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_Template)(const Handle(GEOMImpl_Template)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_Template)(const GEOMImpl_Template* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_Template)& operator=(const Handle(GEOMImpl_Template)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_Template)& operator=(const GEOMImpl_Template* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_Template* operator->() + { + return (GEOMImpl_Template *)ControlAccess(); + } + + GEOMImpl_Template* operator->() const + { + return (GEOMImpl_Template *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_Template)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_Template) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_Template : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_Template(); +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_Template() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_Template_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_Template) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_Template) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_TorusDriver.cxx b/src/GEOMImpl/GEOMImpl_TorusDriver.cxx new file mode 100644 index 000000000..023355213 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_TorusDriver.cxx @@ -0,0 +1,162 @@ +// 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/ +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_TorusDriver::GetID() +{ + static Standard_GUID aTorusDriver("FF1BBB12-5D14-4df2-980B-3A668264EA16"); + return aTorusDriver; +} + + +//======================================================================= +//function : GEOMImpl_TorusDriver +//purpose : +//======================================================================= +GEOMImpl_TorusDriver::GEOMImpl_TorusDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_TorusDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_ITorus aCI (aFunction); + Standard_Integer aType = aFunction->GetType(); + + TopoDS_Shape aShape; + + if (aType == TORUS_RR) { + aShape = BRepPrimAPI_MakeTorus(aCI.GetRMajor(), aCI.GetRMinor()).Shape(); + + } else if (aType == TORUS_PNT_VEC_RR) { + Handle(GEOM_Function) aRefPoint = aCI.GetCenter(); + Handle(GEOM_Function) aRefVector = aCI.GetVector(); + TopoDS_Shape aShapePnt = aRefPoint->GetValue(); + TopoDS_Shape aShapeVec = aRefVector->GetValue(); + if (aShapePnt.ShapeType() != TopAbs_VERTEX) { + Standard_TypeMismatch::Raise("Torus Center must be a vertex"); + } + if (aShapeVec.ShapeType() != TopAbs_EDGE) { + Standard_TypeMismatch::Raise("Torus Axis must be an edge"); + } + + gp_Pnt aP = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt)); + TopoDS_Edge anE = TopoDS::Edge(aShapeVec); + TopoDS_Vertex V1, V2; + TopExp::Vertices(anE, V1, V2, Standard_True); + if (V1.IsNull() || V2.IsNull()) { + Standard_ConstructionError::Raise("Bad edge for the Torus Axis given"); + } + + gp_Vec aV (BRep_Tool::Pnt(V1), BRep_Tool::Pnt(V2)); + if (aV.Magnitude() < Precision::Confusion()) { + Standard_ConstructionError::Raise + ("End vertices of edge, defining the Torus Axis, are too close"); + } + + gp_Ax2 anAxes (aP, aV); + BRepPrimAPI_MakeTorus MT (anAxes, aCI.GetRMajor(), aCI.GetRMinor()); + if (!MT.IsDone()) MT.Build(); + if (!MT.IsDone()) StdFail_NotDone::Raise("Torus construction algorithm has failed"); + aShape = MT.Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_TorusDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_TorusDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_TorusDriver", + sizeof(GEOMImpl_TorusDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_TorusDriver) Handle(GEOMImpl_TorusDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_TorusDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_TorusDriver))) { + _anOtherObject = Handle(GEOMImpl_TorusDriver)((Handle(GEOMImpl_TorusDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_TorusDriver.hxx b/src/GEOMImpl/GEOMImpl_TorusDriver.hxx new file mode 100644 index 000000000..cca5123ca --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_TorusDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_TorusDriver.ixx +// Module : GEOMImpl + +#ifndef _GEOMImpl_TorusDriver_HeaderFile +#define _GEOMImpl_TorusDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_TorusDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_TorusDriver); + +class Handle(GEOMImpl_TorusDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_TorusDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_TorusDriver)(const Handle(GEOMImpl_TorusDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_TorusDriver)(const GEOMImpl_TorusDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_TorusDriver)& operator=(const Handle(GEOMImpl_TorusDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_TorusDriver)& operator=(const GEOMImpl_TorusDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_TorusDriver* operator->() + { + return (GEOMImpl_TorusDriver *)ControlAccess(); + } + + GEOMImpl_TorusDriver* operator->() const + { + return (GEOMImpl_TorusDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_TorusDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_TorusDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_TorusDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_TorusDriver(); +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_TorusDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_TorusDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_TorusDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_TorusDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx new file mode 100644 index 000000000..33a6590df --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_TranslateDriver.cxx @@ -0,0 +1,243 @@ +// 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/ +// + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_TranslateDriver::GetID() +{ + static Standard_GUID aTranslateDriver("FF1BBB03-5D14-4df2-980B-3A668264EA16"); + return aTranslateDriver; +} + + +//======================================================================= +//function : GEOMImpl_TranslateDriver +//purpose : +//======================================================================= + +GEOMImpl_TranslateDriver::GEOMImpl_TranslateDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_TranslateDriver::Execute(TFunction_Logbook& log) const +{ + if(Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + if(aFunction.IsNull()) return 0; + + GEOMImpl_ITranslate TI(aFunction); + gp_Trsf aTrsf; + gp_Pnt aP1, aP2; + Standard_Integer aType = aFunction->GetType(); + + Handle(GEOM_Function) anOriginalFunction = TI.GetOriginal(); + if(anOriginalFunction.IsNull()) return 0; + TopoDS_Shape aShape, anOriginal = anOriginalFunction->GetValue(); + if(anOriginal.IsNull()) return 0; + + if(aType == TRANSLATE_TWO_POINTS || aType == TRANSLATE_TWO_POINTS_COPY) { + Handle(GEOM_Function) aPoint1 = TI.GetPoint1(); + Handle(GEOM_Function) aPoint2 = TI.GetPoint2(); + if(aPoint1.IsNull() || aPoint2.IsNull()) return 0; + TopoDS_Shape aV1 = aPoint1->GetValue(); + TopoDS_Shape aV2 = aPoint2->GetValue(); + if(aV1.IsNull() || aV1.ShapeType() != TopAbs_VERTEX) return 0; + if(aV2.IsNull() || aV2.ShapeType() != TopAbs_VERTEX) return 0; + + aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aV1)); + aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aV2)); + + aTrsf.SetTranslation(aP1, aP2); + BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False); + aShape = aTransformation.Shape(); + + } else if(aType == TRANSLATE_VECTOR || aType == TRANSLATE_VECTOR_COPY) { + Handle(GEOM_Function) aVector = TI.GetVector(); + if(aVector.IsNull()) return 0; + TopoDS_Shape aV = aVector->GetValue(); + if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(aV); + + aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)); + aP2 = BRep_Tool::Pnt(TopExp::LastVertex(anEdge)); + + aTrsf.SetTranslation(aP1, aP2); + BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False); + aShape = aTransformation.Shape(); + } + else if(aType == TRANSLATE_XYZ || aType == TRANSLATE_XYZ_COPY) { + gp_Vec aVec(TI.GetDX(), TI.GetDY(), TI.GetDZ()); + aTrsf.SetTranslation(aVec); + BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False); + aShape = aTransformation.Shape(); + } + else if(aType == TRANSLATE_1D) { + Standard_Real DX, DY, DZ, step = TI.GetStep1(); + Standard_Integer nbtimes = TI.GetNbIter1(); + gp_Vec myVec ; + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound( aCompound ); + + Handle(GEOM_Function) aVector = TI.GetVector(); + if(aVector.IsNull()) return 0; + TopoDS_Shape aV = aVector->GetValue(); + if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(aV); + + gp_Vec Vec(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec.Normalize(); + + for (int i = 0; i < nbtimes; i++ ) { + DX = i * step * Vec.X() ; + DY = i * step * Vec.Y() ; + DZ = i * step * Vec.Z() ; + myVec.SetCoord( DX, DY, DZ ) ; + aTrsf.SetTranslation(myVec) ; + BRepBuilderAPI_Transform aTransformation(anOriginal, aTrsf, Standard_False) ; + B.Add(aCompound , aTransformation.Shape() ); + } + aShape = aCompound; + } + else if(aType == TRANSLATE_2D) { + Standard_Integer nbtimes1 = TI.GetNbIter1(), nbtimes2 = TI.GetNbIter2(); + Standard_Real DX, DY, DZ, step1 = TI.GetStep1(), step2 = TI.GetStep2(); + gp_Vec myVec ; + Handle(GEOM_Function) aVector = TI.GetVector(); + if(aVector.IsNull()) return 0; + TopoDS_Shape aV = aVector->GetValue(); + if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; + TopoDS_Edge anEdge = TopoDS::Edge(aV); + + gp_Vec Vec1(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec1.Normalize(); + + Handle(GEOM_Function) aVector2 = TI.GetVector2(); + if(aVector2.IsNull()) return 0; + aV = aVector2->GetValue(); + if(aV.IsNull() || aV.ShapeType() != TopAbs_EDGE) return 0; + anEdge = TopoDS::Edge(aV); + + gp_Vec Vec2(BRep_Tool::Pnt(TopExp::FirstVertex(anEdge)), BRep_Tool::Pnt(TopExp::LastVertex(anEdge))); + Vec2.Normalize(); + + TopoDS_Compound aCompound; + BRep_Builder B; + B.MakeCompound( aCompound ); + + for (int i = 0; i < nbtimes1; i++ ) { + for (int j = 0; j < nbtimes2; j++ ) { + DX = i * step1 * Vec1.X() + j * step2 * Vec2.X() ; + DY = i * step1 * Vec1.Y() + j * step2 * Vec2.Y() ; + DZ = i * step1 * Vec1.Z() + j * step2 * Vec2.Z() ; + myVec.SetCoord( DX, DY, DZ ) ; + aTrsf.SetTranslation(myVec) ; + BRepBuilderAPI_Transform myBRepTransformation(anOriginal, aTrsf, Standard_False) ; + B.Add(aCompound , myBRepTransformation.Shape() ); + } + } + aShape = aCompound; + } + else return 0; + + + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_TranslateDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_TranslateDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_TranslateDriver", + sizeof(GEOMImpl_TranslateDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= + +const Handle(GEOMImpl_TranslateDriver) Handle(GEOMImpl_TranslateDriver)::DownCast(const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_TranslateDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_TranslateDriver))) { + _anOtherObject = Handle(GEOMImpl_TranslateDriver)((Handle(GEOMImpl_TranslateDriver)&)AnObject); + } + } + + return _anOtherObject ; +} + + diff --git a/src/GEOMImpl/GEOMImpl_TranslateDriver.hxx b/src/GEOMImpl/GEOMImpl_TranslateDriver.hxx new file mode 100644 index 000000000..48c05cff5 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_TranslateDriver.hxx @@ -0,0 +1,158 @@ +// 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/ +// +// File : GEOMImpl_TranslateDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_TranslateDriver_HeaderFile +#define _GEOMImpl_TranslateDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_TranslateDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_TranslateDriver); + +class Handle(GEOMImpl_TranslateDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_TranslateDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_TranslateDriver)(const Handle(GEOMImpl_TranslateDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_TranslateDriver)(const GEOMImpl_TranslateDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_TranslateDriver)& operator=(const Handle(GEOMImpl_TranslateDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_TranslateDriver)& operator=(const GEOMImpl_TranslateDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_TranslateDriver* operator->() + { + return (GEOMImpl_TranslateDriver *)ControlAccess(); + } + + GEOMImpl_TranslateDriver* operator->() const + { + return (GEOMImpl_TranslateDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_TranslateDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_TranslateDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_TranslateDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_TranslateDriver(); +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_TranslateDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_TranslateDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_TranslateDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_TranslateDriver) == AType || TFunction_Driver::IsKind(AType)); } + + +}; + +#endif diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx new file mode 100755 index 000000000..392163c0d --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -0,0 +1,230 @@ +// 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/ +// +//GEOM_Object types + +#define GEOM_COPY 0 +#define GEOM_IMPORT 1 + +#define GEOM_POINT 2 +#define GEOM_VECTOR 3 +#define GEOM_PLANE 4 +#define GEOM_LINE 5 + +#define GEOM_TORUS 6 +#define GEOM_BOX 7 +#define GEOM_CYLINDER 8 +#define GEOM_CONE 9 +#define GEOM_SPHERE 10 + +#define GEOM_PRISM 11 +#define GEOM_REVOLUTION 12 + +#define GEOM_BOOLEAN 13 +#define GEOM_PARTITION 14 + +#define GEOM_POLYLINE 15 +#define GEOM_CIRCLE 16 +#define GEOM_SPLINE 17 +#define GEOM_ELLIPSE 18 +#define GEOM_CIRC_ARC 19 + +#define GEOM_FILLET 20 +#define GEOM_CHAMFER 21 + +#define GEOM_EDGE 22 +#define GEOM_WIRE 23 +#define GEOM_FACE 24 +#define GEOM_SHELL 25 +#define GEOM_SOLID 26 +#define GEOM_COMPOUND 27 + +#define GEOM_SUBSHAPE 28 + +#define GEOM_PIPE 29 + +#define GEOM_ARCHIMEDE 30 + +#define GEOM_FILLING 31 + +#define GEOM_EXPLODE 32 + +#define GEOM_GLUED 33 + +#define GEOM_SKETCHER 34 + +#define GEOM_CDG 35 + +#define GEOM_FREE_BOUNDS 36 + +#define GEOM_GROUP 37 + +#define GEOM_BLOCK 38 + +#define GEOM_MARKER 39 + +//GEOM_Function types + +#define COPY_WITH_REF 1 +#define COPY_WITHOUT_REF 2 + +#define EXPORT_SHAPE 1 +#define IMPORT_SHAPE 1 + +#define POINT_XYZ 1 +#define POINT_XYZ_REF 2 +#define POINT_CURVE_PAR 3 + +#define VECTOR_TWO_PNT 1 +#define VECTOR_DX_DY_DZ 2 + +#define PLANE_PNT_VEC 1 +#define PLANE_FACE 2 +#define PLANE_THREE_PNT 3 + +#define LINE_TWO_PNT 1 +#define LINE_PNT_DIR 2 + +#define TRANSLATE_TWO_POINTS 1 +#define TRANSLATE_VECTOR 2 +#define TRANSLATE_TWO_POINTS_COPY 3 +#define TRANSLATE_VECTOR_COPY 4 +#define TRANSLATE_1D 5 +#define TRANSLATE_2D 6 +#define TRANSLATE_XYZ 7 +#define TRANSLATE_XYZ_COPY 8 + +#define ROTATE 1 +#define ROTATE_COPY 2 +#define ROTATE_1D 3 +#define ROTATE_2D 4 + +#define MIRROR_PLANE 1 +#define MIRROR_PLANE_COPY 2 +#define MIRROR_AXIS 3 +#define MIRROR_AXIS_COPY 4 +#define MIRROR_POINT 5 +#define MIRROR_POINT_COPY 6 + +#define OFFSET_SHAPE 1 +#define OFFSET_SHAPE_COPY 2 + +#define SCALE_SHAPE 1 +#define SCALE_SHAPE_COPY 2 + +#define POSITION_SHAPE 1 +#define POSITION_SHAPE_COPY 2 + +#define TORUS_RR 1 +#define TORUS_PNT_VEC_RR 2 + +#define BOX_DX_DY_DZ 1 +#define BOX_TWO_PNT 2 + +#define CYLINDER_R_H 1 +#define CYLINDER_PNT_VEC_R_H 2 + +#define CONE_R1_R2_H 1 +#define CONE_PNT_VEC_R1_R2_H 2 + +#define SPHERE_R 1 +#define SPHERE_PNT_R 2 + +#define PRISM_BASE_VEC_H 1 +#define PRISM_BASE_TWO_PNT 2 + +#define REVOLUTION_BASE_AXIS_ANGLE 1 + +#define PIPE_BASE_PATH 1 + +#define BOOLEAN_COMMON 1 +#define BOOLEAN_CUT 2 +#define BOOLEAN_FUSE 3 +#define BOOLEAN_SECTION 4 + +#define PARTITION_PARTITION 1 +#define PARTITION_HALF 2 + +#define POLYLINE_POINTS 1 + +#define CIRCLE_THREE_PNT 1 +#define CIRCLE_PNT_VEC_R 2 + +#define SPLINE_BEZIER 1 +#define SPLINE_INTERPOLATION 2 + +#define ELLIPSE_PNT_VEC_RR 1 + +#define CIRC_ARC_THREE_PNT 1 + +#define FILLET_SHAPE_ALL 1 +#define FILLET_SHAPE_EDGES 2 +#define FILLET_SHAPE_FACES 3 + +#define CHAMFER_SHAPE_ALL 1 +#define CHAMFER_SHAPE_EDGE 2 +#define CHAMFER_SHAPE_FACES 3 + +#define WIRE_EDGES 1 +#define FACE_WIRE 2 +#define SHELL_FACES 3 +#define SOLID_SHELL 4 +#define SOLID_SHELLS 5 +#define COMPOUND_SHAPES 6 +#define SUBSHAPE_SORTED 7 +#define SUBSHAPE_NOT_SORTED 8 +#define FACE_WIRES 9 +#define REVERSE_ORIENTATION 10 + +#define ARCHIMEDE_TYPE 1 + +// Shape Healing operators +#define SHAPE_PROCESS 1 +#define SUPPRESS_FACES 2 +#define CLOSE_CONTOUR 3 +#define REMOVE_INT_WIRES 4 +#define FILL_HOLES 5 +#define SEWING 6 +#define DIVIDE_EDGE 7 + +#define BASIC_FILLING 1 + +#define GLUE_FACES 1 + +#define SKETCHER_NINE_DOUBLS 1 +#define SKETCHER_PLANE 2 + +#define CDG_MEASURE 1 + +#define GROUP_FUNCTION 1 + +// Blocks +#define BLOCK_FACE_FOUR_PNT 1 +#define BLOCK_FACE_FOUR_EDGES 2 +#define BLOCK_FACE_TWO_EDGES 3 +#define BLOCK_SIX_FACES 4 +#define BLOCK_TWO_FACES 5 +#define BLOCK_MULTI_TRANSFORM_1D 6 +#define BLOCK_MULTI_TRANSFORM_2D 7 +#define BLOCK_COMPOUND_GLUE 8 +#define BLOCK_REMOVE_EXTRA 9 +#define BLOCK_COMPOUND_IMPROVE 10 + +// Marker +#define MARKER_CS 1 diff --git a/src/GEOMImpl/GEOMImpl_VectorDriver.cxx b/src/GEOMImpl/GEOMImpl_VectorDriver.cxx new file mode 100644 index 000000000..531077599 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_VectorDriver.cxx @@ -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/ +// +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& GEOMImpl_VectorDriver::GetID() +{ + static Standard_GUID aVectorDriver("FF1BBB04-5D14-4df2-980B-3A668264EA16"); + return aVectorDriver; +} + + +//======================================================================= +//function : GEOMImpl_VectorDriver +//purpose : +//======================================================================= +GEOMImpl_VectorDriver::GEOMImpl_VectorDriver() +{ +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer GEOMImpl_VectorDriver::Execute(TFunction_Logbook& log) const +{ + if (Label().IsNull()) return 0; + Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label()); + + GEOMImpl_IVector aPI (aFunction); + Standard_Integer aType = aFunction->GetType(); + if (aType != VECTOR_DX_DY_DZ && aType != VECTOR_TWO_PNT) return 0; + + TopoDS_Shape aShape; + + if (aType == VECTOR_DX_DY_DZ) { + gp_Pnt P1 = gp::Origin(); + gp_Pnt P2 (aPI.GetDX(), aPI.GetDY(), aPI.GetDZ()); + if (P1.Distance(P2) < Precision::Confusion()) { + TCollection_AsciiString aMsg ("Can not build vector with length, less than "); + aMsg += TCollection_AsciiString(Precision::Confusion()); + Standard_ConstructionError::Raise(aMsg.ToCString()); + } + aShape = BRepBuilderAPI_MakeEdge(P1, P2).Shape(); + } else if (aType == VECTOR_TWO_PNT) { + Handle(GEOM_Function) aRefPnt1 = aPI.GetPoint1(); + Handle(GEOM_Function) aRefPnt2 = aPI.GetPoint2(); + TopoDS_Shape aShape1 = aRefPnt1->GetValue(); + TopoDS_Shape aShape2 = aRefPnt2->GetValue(); + if (aShape1.ShapeType() != TopAbs_VERTEX || + aShape2.ShapeType() != TopAbs_VERTEX) return 0; + if (aShape1.IsSame(aShape2)) { + Standard_ConstructionError::Raise("The end points must be different"); + } + TopoDS_Vertex V1 = TopoDS::Vertex(aShape1); + TopoDS_Vertex V2 = TopoDS::Vertex(aShape2); + gp_Pnt P1 = BRep_Tool::Pnt(V1); + gp_Pnt P2 = BRep_Tool::Pnt(V2); + if (P1.Distance(P2) < Precision::Confusion()) { + Standard_ConstructionError::Raise("The end points are too close"); + } + aShape = BRepBuilderAPI_MakeEdge(V1, V2).Shape(); + } else { + } + + if (aShape.IsNull()) return 0; + + aFunction->SetValue(aShape); + + log.SetTouched(Label()); + + return 1; +} + + +//======================================================================= +//function : GEOMImpl_VectorDriver_Type_ +//purpose : +//======================================================================= +Standard_EXPORT Handle_Standard_Type& GEOMImpl_VectorDriver_Type_() +{ + + static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver); + if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver); + static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); + if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); + static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); + if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); + + + static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; + static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_VectorDriver", + sizeof(GEOMImpl_VectorDriver), + 1, + (Standard_Address)_Ancestors, + (Standard_Address)NULL); + + return _aType; +} + +//======================================================================= +//function : DownCast +//purpose : +//======================================================================= +const Handle(GEOMImpl_VectorDriver) Handle(GEOMImpl_VectorDriver)::DownCast + (const Handle(Standard_Transient)& AnObject) +{ + Handle(GEOMImpl_VectorDriver) _anOtherObject; + + if (!AnObject.IsNull()) { + if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_VectorDriver))) { + _anOtherObject = Handle(GEOMImpl_VectorDriver)((Handle(GEOMImpl_VectorDriver)&)AnObject); + } + } + + return _anOtherObject ; +} diff --git a/src/GEOMImpl/GEOMImpl_VectorDriver.hxx b/src/GEOMImpl/GEOMImpl_VectorDriver.hxx new file mode 100644 index 000000000..ed31f6dc9 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_VectorDriver.hxx @@ -0,0 +1,157 @@ +// 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/ +// +// File : GEOMImpl_VectorDriver.hxx +// Module : GEOMImpl + +#ifndef _GEOMImpl_VectorDriver_HeaderFile +#define _GEOMImpl_VectorDriver_HeaderFile + +#ifndef _TColStd_SequenceOfExtendedString_HeaderFile +#include +#endif +#ifndef _Standard_TypeMismatch_HeaderFile +#include +#endif + +#ifndef _Standard_HeaderFile +#include +#endif + +#ifndef _Standard_Macro_HeaderFile +#include +#endif +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_GUID_HeaderFile +#include +#endif + +#ifndef _Handle_TFunction_Driver_HeaderFile +#include +#endif + +class Standard_Transient; +class Handle_Standard_Type; +class Handle(TFunction_Driver); +class GEOMImpl_VectorDriver; + +Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_VectorDriver); + +class Handle(GEOMImpl_VectorDriver) : public Handle(TFunction_Driver) { + public: + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + Handle(GEOMImpl_VectorDriver)():Handle(TFunction_Driver)() {} + Handle(GEOMImpl_VectorDriver)(const Handle(GEOMImpl_VectorDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) + { + } + + Handle(GEOMImpl_VectorDriver)(const GEOMImpl_VectorDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) + { + } + + Handle(GEOMImpl_VectorDriver)& operator=(const Handle(GEOMImpl_VectorDriver)& aHandle) + { + Assign(aHandle.Access()); + return *this; + } + + Handle(GEOMImpl_VectorDriver)& operator=(const GEOMImpl_VectorDriver* anItem) + { + Assign((Standard_Transient *)anItem); + return *this; + } + + GEOMImpl_VectorDriver* operator->() + { + return (GEOMImpl_VectorDriver *)ControlAccess(); + } + + GEOMImpl_VectorDriver* operator->() const + { + return (GEOMImpl_VectorDriver *)ControlAccess(); + } + + Standard_EXPORT ~Handle(GEOMImpl_VectorDriver)() {}; + + Standard_EXPORT static const Handle(GEOMImpl_VectorDriver) DownCast(const Handle(Standard_Transient)& AnObject); +}; + +#ifndef _TFunction_Driver_HeaderFile +#include +#endif +#ifndef _TFunction_Logbook_HeaderFile +#include +#endif +#ifndef _Standard_CString_HeaderFile +#include +#endif + +class TColStd_SequenceOfExtendedString; + + +class GEOMImpl_VectorDriver : public TFunction_Driver { + +public: + + inline void* operator new(size_t,void* anAddress) + { + return anAddress; + } + inline void* operator new(size_t size) + { + return Standard::Allocate(size); + } + inline void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + + // Methods PUBLIC + // +Standard_EXPORT GEOMImpl_VectorDriver(); +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_VectorDriver() {}; + + + // Type management + // +Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_VectorDriver_Type_(); +Standard_EXPORT const Handle(Standard_Type)& DynamicType() const { return STANDARD_TYPE(GEOMImpl_VectorDriver) ; } +Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const { return (STANDARD_TYPE(GEOMImpl_VectorDriver) == AType || TFunction_Driver::IsKind(AType)); } + +}; + +#endif diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx new file mode 100644 index 000000000..03d857168 --- /dev/null +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -0,0 +1,653 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GEOMBase_Tools.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "GEOMToolsGUI.h" + +#include "GeometryGUI.h" +#include "GEOM_Actor.h" +#include "GEOMBase.h" +#include "GEOM_Operation.h" +#include "GEOM_Displayer.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "utilities.h" + +// QT Includes +#include +#include + +// OCCT Includes +#include + +using namespace std; + +typedef QMap FilterMap; + +//======================================================================= +// function : getFileName +// purpose : Selection of a file name for Import/Export. Returns also +// the selected file type code through argument. +//======================================================================= +static QString getFileName( QWidget* parent, + const QString& initial, + const FilterMap& filterMap, + const QString& caption, + bool open, + QString& format ) +{ + static QString lastUsedFilter; + QStringList filters; + for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it ) + filters.push_back( it.key() ); + + SUIT_FileDlg* fd = new SUIT_FileDlg( parent, open, true, true ); + if ( !caption.isEmpty() ) + fd->setCaption( caption ); + + if ( !initial.isEmpty() ) + fd->setSelection( initial ); + + if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) + fd->setSelectedFilter( lastUsedFilter ); + + fd->setFilters( filters ); + + fd->exec(); + QString filename = fd->selectedFile(); + format = filterMap[fd->selectedFilter()]; + lastUsedFilter = fd->selectedFilter(); + delete fd; + qApp->processEvents(); + return filename; +} + +//======================================================================= +// function : GEOMToolsGUI() +// purpose : Constructor +//======================================================================= +GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) +: GEOMGUI( parent ) +{ +} + + +//======================================================================= +// function : ~GEOMToolsGUI() +// purpose : Destructor +//======================================================================= +GEOMToolsGUI::~GEOMToolsGUI() +{ +} + + +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + + switch (theCommandID) + { + case 31: // COPY + { + OnEditCopy(); + break; + } + case 33: // DELETE + { + OnEditDelete(); + break; + } + case 111: // IMPORT BREP + case 112: // IMPORT IGES + case 113: // IMPORT STEP + { + Import(); + break; + } + case 121: // EXPORT BREP + case 122: // EXPORT IGES + case 123: // EXPORT STEP + { + Export(); + break; + } + case 411: // SETTINGS - ADD IN STUDY + { + // SAN -- TO BE REMOVED !!! + break; + } + case 412: // SETTINGS - SHADING COLOR + { + OnSettingsColor(); + break; + } + case 413: // SETTINGS - ISOS + { + OnSettingsIsos(); + break; + } + case 414: // SETTINGS : STEP VALUE FOR SPIN BOXES + { + OnSettingsStep(); + break; + } + case 804: // ADD IN STUDY - POPUP VIEWER + { + // SAN -- TO BE REMOVED !!!! + break; + } + case 901: // RENAME + { + OnRename(); + break; + } + case 5103: // CHECK GEOMETRY + { + OnCheckGeometry(); + break; + } + case 8032: // COLOR - POPUP VIEWER + { + OnColor(); + break; + } + case 8033: // TRANSPARENCY - POPUP VIEWER + { + OnTransparency(); + break; + } + case 8034: // ISOS - POPUP VIEWER + { + OnNbIsos(); + break; + } + case 9024 : // OPEN - OBJBROSER POPUP + { + OnOpen(); + break; + } + default: + { + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } + } + return true; +} + + + +//=============================================================================== +// function : OnEditDelete() +// purpose : +//=============================================================================== +void GEOMToolsGUI::OnEditDelete() +{ + SALOME_ListIO selected; + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( aSelMgr && appStudy ) { + aSelMgr->selectedObjects( selected, QString::null, false ); + if ( !selected.IsEmpty() ) { + _PTR(Study) aStudy = appStudy->studyDS(); + + bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked(); + if ( aLocked ) { + SUIT_MessageBox::warn1 ( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return; + } + + // VSR 17/11/04: check if all objects selected belong to GEOM component --> start + // modifications of ASV 01.06.05 + QString parentComp = getParentComponent( aStudy, selected ); + const char* geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() ); + QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR ) ); + + if ( parentComp != geomComp ) { + SUIT_MessageBox::warn1 ( app->desktop(), + QObject::tr("ERR_ERROR"), + QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ), + QObject::tr("BUT_OK") ); + return; + } + // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish + + if ( SUIT_MessageBox::warn2( app->desktop(), + QObject::tr( "GEOM_WRN_WARNING" ), + QObject::tr( "GEOM_REALLY_DELETE" ), + QObject::tr( "GEOM_BUT_YES" ), + QObject::tr( "GEOM_BUT_NO" ), 1, 0, 0 ) != 1 ) + return; + + // QAD_Operation* op = new SALOMEGUI_ImportOperation(.....); + // op->start(); + + // prepare list of SALOME_Views + QPtrList views; + SALOME_View* view; + // fill the list + ViewManagerList vmans = app->viewManagers(); + SUIT_ViewManager* vman; + for ( vman = vmans.first(); vman; vman = vmans.next() ) { + SUIT_ViewModel* vmod = vman->getViewModel(); + view = dynamic_cast ( vmod ); // must work for OCC and VTK views + if ( view ) + views.append( view ); + } + + _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); + _PTR(GenericAttribute) anAttr; + GEOM_Displayer* disp = new GEOM_Displayer( appStudy ); + + // MAIN LOOP OF SELECTED OBJECTS + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + + Handle(SALOME_InteractiveObject) io = It.Value(); + if ( !io->hasEntry() ) + continue; + + _PTR(SObject) obj ( aStudy->FindObjectID( io->getEntry() ) ); + + // disable removal of "Geometry" component object + if ( !strcmp( obj->GetIOR().c_str(), geomIOR ) ) + continue; + + // iterate through all children of obj, find IOR attributes on children + // and remove shapes that correspond to these IORs + for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) { + _PTR(SObject) child (it->Value()); + if (child->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); + + // Delete child( s ) shape in Client : + const TCollection_AsciiString ASCior ((char*)anIOR->Value().c_str()); + getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCior); + + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(child); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow(corbaObj); + if (!CORBA::is_nil(geomObj)) { + for (view = views.first(); view; view = views.next()) { + disp->Erase(geomObj, true, view); + } + } + } + } // for ( children of obj ) + + // Erase main graphical object + for ( view = views.first(); view; view = views.next() ) + disp->Erase( io, true, view ); + + // Delete main shape in Client : + if ( obj->FindAttribute( anAttr, "AttributeIOR" ) ) { + _PTR(AttributeIOR) anIOR( anAttr ); + const TCollection_AsciiString ASCIor( (char*)anIOR->Value().c_str() ); + getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCIor ); + } + + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if ( !CORBA::is_nil( geomObj ) ) + GeometryGUI::GetGeomGen()->RemoveObject( geomObj ); + + // Remove objects from Study + aStudyBuilder->RemoveObject( obj ); + + //deleted = true; + } // MAIN LOOP of selected + + selected.Clear(); + aSelMgr->setSelectedObjects( selected ); + getGeometryGUI()->updateObjBrowser(); + } // if ( selected not empty ) + } // if ( selMgr && appStudy ) + + app->updateActions(); //SRN: To update a Save button in the toolbar + + } // if ( app ) + + + // if ( deleted ) + // op->finish(); + // else + // op->abort(); +} + + +//============================================================================== +// function : OnEditCopy() +// purpose : +//============================================================================== +void GEOMToolsGUI::OnEditCopy() +{ +/* + SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() ); + GEOM::string_array_var listIOR = new GEOM::string_array; + + const SALOME_ListIO& List = Sel->StoredIObjects(); + + myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR); + + Sel->ClearIObjects(); + + SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); + int aStudyID = aStudy->StudyId(); + + for (unsigned int ind = 0; ind < listIOR->length();ind++) { + GEOM::GEOM_Object_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]); + try { + GEOM::GEOM_IInsertOperations_var IOp = myGeom->GetIInsertOperations(aStudyID); + GEOM::GEOM_Object_var result = IOp->MakeCopy(aShapeInit); + myGeomBase->Display(result); + } + catch (const SALOME::SALOME_Exception& S_ex) { + QtCatchCorbaException(S_ex); + } + } + + QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY")); +*/ +} + + +//===================================================================================== +// function : Import +// purpose : BRep, Iges, Step +//===================================================================================== +bool GEOMToolsGUI::Import() +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() ); + //SUIT_Application* app = getGeometryGUI()->getApp(); + if (! app) return false; + + SalomeApp_Study* stud = dynamic_cast ( app->activeStudy() ); + if ( !stud ) { + cout << "FAILED to cast active study to SalomeApp_Study" << endl; + return false; + } + _PTR(Study) aStudy = stud->studyDS(); + + bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked(); + if ( aLocked ) { + SUIT_MessageBox::warn1 ( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return false; + } + + GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( eng ) ) { + SUIT_MessageBox::error1( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr( "GEOM Engine is not started" ), + QObject::tr("BUT_OK") ); + return false; + } + + GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() ); + if ( aInsOp->_is_nil() ) + return false; + + GEOM::GEOM_Object_var anObj; + + // Obtain a list of available import formats + FilterMap aMap; + GEOM::string_array_var aFormats, aPatterns; + aInsOp->ImportTranslators( aFormats, aPatterns ); + + for ( int i = 0, n = aFormats->length(); i < n; i++ ) + aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); + + QString fileType; + + QString fileName = getFileName(app->desktop(), "", aMap, + tr("GEOM_MEN_IMPORT"), true, fileType); + if (fileName.isEmpty() || fileType.isEmpty()) + return false; + + GEOM_Operation* anOp = new GEOM_Operation (app, aInsOp.in()); + try { + SUIT_OverrideCursor wc; + + app->putInfo(tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file(fileName, /*withExten=*/true))); + + anOp->start(); + + CORBA::String_var fileN = fileName.latin1(); + CORBA::String_var fileT = fileType.latin1(); + 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)); + + SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy(aStudy); + GeometryGUI::GetGeomGen()->PublishInStudy(aDSStudy, + SALOMEDS::SObject::_nil(), + anObj, + aPublishObjName); + + GEOM_Displayer( stud ).Display( anObj.in() ); + + // update data model and object browser + getGeometryGUI()->updateObjBrowser( true ); + + anOp->commit(); + } + else { + anOp->abort(); + wc.suspend(); + SUIT_MessageBox::error1( app->desktop(), + QObject::tr( "GEOM_ERROR" ), + QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), + QObject::tr("BUT_OK") ); + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + //QtCatchCorbaException(S_ex); + anOp->abort(); + return false; + } + + app->updateActions(); //SRN: To update a Save button in the toolbar + + return true; +} + + +//===================================================================================== +// function : Export +// purpose : BRep, Iges, Step +//===================================================================================== +bool GEOMToolsGUI::Export() +{ + SalomeApp_Application* app = getGeometryGUI()->getApp(); + if (!app) return false; + + SalomeApp_Study* stud = dynamic_cast ( app->activeStudy() ); + if ( !stud ) { + cout << "FAILED to cast active study to SalomeApp_Study" << endl; + return false; + } + _PTR(Study) aStudy = stud->studyDS(); + + GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( eng ) ) { + SUIT_MessageBox::error1( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr( "GEOM Engine is not started" ), + QObject::tr("BUT_OK") ); + return false; + } + + GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() ); + if ( aInsOp->_is_nil() ) + return false; + + // Obtain a list of available export formats + FilterMap aMap; + GEOM::string_array_var aFormats, aPatterns; + aInsOp->ExportTranslators( aFormats, aPatterns ); + for ( int i = 0, n = aFormats->length(); i < n; i++ ) + aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); + + // Get selected objects + LightApp_SelectionMgr* sm = app->selectionMgr(); + if ( !sm ) + return false; + + SALOME_ListIO selectedObjects; + sm->selectedObjects( selectedObjects ); + + SALOME_ListIteratorOfListIO It( selectedObjects ); + for(;It.More();It.Next()) { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + Standard_Boolean found; + GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found); + + if ( !found || anObj->_is_nil() ) + continue; + + QString fileType; + QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap, + tr("GEOM_MEN_EXPORT"), false, fileType); + + // User has pressed "Cancel" --> stop the operation + if ( file.isEmpty() || fileType.isEmpty() ) + return false; + + GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() ); + try { + SUIT_OverrideCursor wc; + + app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) ); + + anOp->start(); + + + aInsOp->Export( anObj, file, fileType.latin1() ); + + if ( aInsOp->IsDone() ) + anOp->commit(); + else + { + anOp->abort(); + wc.suspend(); + SUIT_MessageBox::error1( app->desktop(), + QObject::tr( "GEOM_ERROR" ), + QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), + QObject::tr("BUT_OK") ); + return false; + } + } + catch (const SALOME::SALOME_Exception& S_ex) { + //QtCatchCorbaException(S_ex); + anOp->abort(); + return false; + } + } + + return true; +} + + +QString GEOMToolsGUI::getParentComponent( _PTR( Study ) study, const SALOME_ListIO& iobjs ) +{ + QString parentComp; + + for ( SALOME_ListIteratorOfListIO it( iobjs ); it.More(); it.Next() ) { + + Handle(SALOME_InteractiveObject) io = it.Value(); + if ( !io->hasEntry() ) + continue; + + QString compName = getParentComponent( study->FindObjectID( io->getEntry() ) ); + + if ( parentComp.isNull() ) + parentComp = compName; + else if ( parentComp.compare( compName) != 0 ) { // objects belonging to different components are selected + parentComp = QString::null; + break; + } + } + + return parentComp; +} + +QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj ) +{ + if ( obj ) { + _PTR(SComponent) comp = obj->GetFatherComponent(); + if ( comp ) { + _PTR(GenericAttribute) anAttr; + if ( comp->FindAttribute( anAttr, "AttributeName") ) { + _PTR(AttributeName) aName( anAttr ); + return QString( aName->Value().c_str() ); + } + } + } + return QString(); +} + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ +#ifdef WNT + __declspec( dllexport ) +#endif + GEOMGUI* GetLibGUI( GeometryGUI* parent ) + { + return new GEOMToolsGUI( parent ); + } +} diff --git a/src/GEOM_I/GEOM_DumpPython.cc b/src/GEOM_I/GEOM_DumpPython.cc new file mode 100644 index 000000000..19e6ed621 --- /dev/null +++ b/src/GEOM_I/GEOM_DumpPython.cc @@ -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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include "GEOM_Gen_i.hh" +#include +#include +#include +#include + +//======================================================================= +//function : DumpPython +//purpose : +//======================================================================= + +Engines::TMPFile* GEOM_Gen_i::DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean& isValidScript) +{ + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy); + if(CORBA::is_nil(aStudy)) + return new Engines::TMPFile(0); + + SALOMEDS::SObject_var aSO = aStudy->FindComponent(ComponentDataType()); + if(CORBA::is_nil(aSO)) + return new Engines::TMPFile(0); + + Resource_DataMapOfAsciiStringAsciiString aMap; + + SALOMEDS::ChildIterator_var Itr = aStudy->NewChildIterator(aSO); + for(Itr->InitEx(true); Itr->More(); Itr->Next()) { + SALOMEDS::SObject_var aValue = Itr->Value(); + CORBA::String_var IOR = aValue->GetIOR(); + if(strlen(IOR.in()) > 0) { + CORBA::Object_var obj = _orb->string_to_object(IOR); + GEOM::GEOM_Object_var GO = GEOM::GEOM_Object::_narrow(obj); + if(!CORBA::is_nil(GO)) { + CORBA::String_var aName = aValue->GetName(); + CORBA::String_var anEntry = GO->GetEntry(); + aMap.Bind( (char*)anEntry.in(), (char*)aName.in() ); + } + } + } + + TCollection_AsciiString aScript = + "### This file is generated by SALOME automatically by dump python funcitonality\n" + "### of GEOM component\n\n"; + aScript += _impl->DumpPython(aStudy->StudyId(), aMap, isPublished, isValidScript); + + int aLen = aScript.Length(); + unsigned char* aBuffer = new unsigned char[aLen+1]; + strcpy((char*)aBuffer, aScript.ToCString()); + + CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; + Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); + + return aStreamFile._retn(); +} + +//======================================================================= +//function : GetDumpName +//purpose : +//======================================================================= + +char* GEOM_Gen_i::GetDumpName (const char* theStudyEntry) +{ + const char* name = _impl->GetDumpName( theStudyEntry ); + if ( name && strlen( name ) > 0 ) + return strdup( name ); + + return NULL; +} + +//======================================================================= +//function : GetAllDumpNames +//purpose : +//======================================================================= + +GEOM::string_array* GEOM_Gen_i::GetAllDumpNames() +{ + Handle(TColStd_HSequenceOfAsciiString) aHSeq = _impl->GetAllDumpNames(); + int i = 0, aLen = aHSeq->Length(); + + GEOM::string_array_var seq = new GEOM::string_array(); + seq->length(aLen); + + for (; i < aLen; i++) { + seq[i] = CORBA::string_dup(aHSeq->Value(i + 1).ToCString()); + } + + return seq._retn(); +} diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc new file mode 100644 index 000000000..c7a7f73f4 --- /dev/null +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -0,0 +1,887 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include "GEOM_Gen_i.hh" +#include "GEOM_Object_i.hh" + +#include + +#include "Utils_CorbaException.hxx" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" +#include "utilities.h" + +#include "GEOM_Object_i.hh" +#include "GEOM_Object.hxx" +#include "GEOM_Function.hxx" +#include "GEOMImpl_Types.hxx" +#include "GEOMImpl_CopyDriver.hxx" + +// Cascade headers +#include +#include +#include +#include +#include +#include +#include + +#include "SALOMEDS_Tool.hxx" + +//============================================================================ +// function : GEOM_Gen_i() +// purpose : constructor to be called for servant creation. +//============================================================================ +GEOM_Gen_i::GEOM_Gen_i(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName) : + Engines_Component_i(orb, poa, contId, instanceName, interfaceName) +{ + _thisObj = this; + _id = _poa->activate_object(_thisObj); + name_service = new SALOME_NamingService(_orb); + + _impl = new ::GEOMImpl_Gen; + +} + + + +//============================================================================ +// function : ~GEOM_Gen_i() +// purpose : destructor +//============================================================================ +GEOM_Gen_i::~GEOM_Gen_i() { + delete name_service; + delete _impl; +} + + +//============================================================================ +// function : IORToLocalPersistentID() +// purpose : +//============================================================================ +char* GEOM_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(_orb->string_to_object(IORString)); + if (!CORBA::is_nil(anObject)) { + return strdup(anObject->GetEntry()); + } + return 0; +} + + +//============================================================================ +// function : LocalPersistentIDToIOR() +// purpose : Create/Load CORBA object from a persistent ref (an entry) +// : Used when a study is loaded +// : The IOR (IORName) of object created is returned +//============================================================================ +char* GEOM_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + SALOMEDS::Study_var aStudy = theSObject->GetStudy(); + + Handle(GEOM_Object) anObject = _impl->GetObject(aStudy->StudyId(), const_cast(aLocalPersistentID)); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(anObject->GetEntry(), anEntry); + GEOM::GEOM_Object_var obj = GetObject(anObject->GetDocID(), anEntry.ToCString()); + + CORBA::String_var aPersRefString = _orb->object_to_string(obj); + return strdup(aPersRefString); +} + +//============================================================================ +// function : CanPublishInStudy +// purpose : +//============================================================================ +bool GEOM_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) +{ + GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(theIOR); + return !(anObject->_is_nil()); +} + + +//============================================================================ +// function : PublishInStudy +// purpose : +//============================================================================ +SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + SALOMEDS::SObject_var aResultSO; + if(CORBA::is_nil(theObject) || theStudy->_is_nil()) return aResultSO; + + GEOM::GEOM_Object_var aShape = GEOM::GEOM_Object::_narrow(theObject); + if(aShape->_is_nil()) return aResultSO; + + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + + SALOMEDS::SComponent_var aFather = theStudy->FindComponent("GEOM"); + if (aFather->_is_nil()) { + aFather = aStudyBuilder->NewComponent("GEOM"); + anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributeName"); + SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); + aName->SetValue("Geometry"); + anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributePixMap"); + SALOMEDS::AttributePixMap::_narrow(anAttr)->SetPixMap("ICON_OBJBROWSER_Geometry"); + aStudyBuilder->DefineComponentInstance(aFather, GEOM_Gen::_this()); + } + if (aFather->_is_nil()) return aResultSO; + + if (CORBA::is_nil(theSObject)) { + aResultSO = aStudyBuilder->NewObject(aFather); + } else { + if (!theSObject->ReferencedObject(aResultSO)) + aResultSO = SALOMEDS::SObject::_duplicate(theSObject); //SRN: Added Aug 24,2004 : for the method AddInStudy with theFather argumenet != NULL + //THROW_SALOME_CORBA_EXCEPTION("Publish in study supervision graph error",SALOME::BAD_PARAM); + } + anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR"); + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + char *aGeomObjIOR = _orb->object_to_string(theObject); + anIOR->SetValue(strdup(aGeomObjIOR)); + + anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributePixMap"); + SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); + TCollection_AsciiString aShapeName("Shape_"); + + if ( aShape->GetType() == GEOM_GROUP ) { + GEOM::GEOM_IGroupOperations_var anOp = GetIGroupOperations( theStudy->StudyId() ); + switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape ) ) { + case TopAbs_VERTEX: + aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_PNT" ); + aShapeName = "Group_Of_Vertices_"; + break; + case TopAbs_EDGE: + aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_EDGE" ); + aShapeName = "Group_Of_Edges_"; + break; + case TopAbs_FACE: + aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_FACE" ); + aShapeName = "Group_Of_Faces_"; + break; + case TopAbs_SOLID: + aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_SOLID" ); + aShapeName = "Group_Of_Solids_"; + break; + } + } else if ( aShape->GetType() == GEOM_MARKER ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_LCS" ); + aShapeName = "LocalCS_"; + } else if ( aShape->GetShapeType() == GEOM::COMPOUND ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_COMPOUND" ); + aShapeName = "Compound_"; + } else if ( aShape->GetShapeType() == GEOM::COMPSOLID ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_COMPSOLID" ); + aShapeName = "Compsolid_"; + } else if ( aShape->GetShapeType() == GEOM::SOLID ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_SOLID" ); + aShapeName = "Solid_"; + } else if ( aShape->GetShapeType() == GEOM::SHELL ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_SHELL" ); + aShapeName = "Shell_"; + } else if ( aShape->GetShapeType() == GEOM::FACE ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_FACE" ); + aShapeName = "Face_"; + } else if ( aShape->GetShapeType() == GEOM::WIRE ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_WIRE" ); + aShapeName = "Wire_"; + } else if ( aShape->GetShapeType() == GEOM::EDGE ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_EDGE" ); + aShapeName = "Edge_"; + } else if ( aShape->GetShapeType() == GEOM::VERTEX ) { + aPixmap->SetPixMap( "ICON_OBJBROWSER_VERTEX" ); + aShapeName = "Vertex_"; + } + //if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag()); + //else aShapeName = TCollection_AsciiString(strdup(theName)); + + // asv : 11.11.04 Introducing a more sofisticated method of name creation, just as + // it is done in GUI in GEOMBase::GetDefaultName() - not just add a Tag() == number + // of objects in the study, but compute a number of objects with the same prefix + // and build a new name as Prefix_N+1 + if ( strlen( theName ) == 0 ) { // MOST PROBABLY CALLED FROM BATCHMODE OR SUPERVISOR + int i = 0; // (WITH EMPTY NEW NAME) + SALOMEDS::SObject_var obj; + TCollection_AsciiString aNewShapeName; + do { + aNewShapeName = aShapeName + TCollection_AsciiString(++i); + obj = theStudy->FindObject( aNewShapeName.ToCString() ); + } + while ( !obj->_is_nil() ); + aShapeName = aNewShapeName; + } + else // MOST PROBABLY CALLED FROM GEOM GUI (ALREADY WITH VALID NAME) + aShapeName = TCollection_AsciiString(strdup(theName)); + + //Set the study entry as a name of the published GEOM_Object + aShape->SetStudyEntry(aResultSO->GetID()); + + //Set a name of the added shape + anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeName"); + SALOMEDS::AttributeName_var aNameAttrib = SALOMEDS::AttributeName::_narrow(anAttr); + aNameAttrib->SetValue(aShapeName.ToCString()); + + return aResultSO._retn(); +} + + +//============================================================================ +// function : Save() +// purpose : save OCAF/Geom document +//============================================================================ +SALOMEDS::TMPFile* GEOM_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile) { + SALOMEDS::TMPFile_var aStreamFile; + // Get a temporary directory to store a file + std::string aTmpDir = (isMultiFile)?theURL:SALOMEDS_Tool::GetTmpDir(); + // Create a list to store names of created files + SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames; + aSeq->length(1); + // Prepare a file name to open + TCollection_AsciiString aNameWithExt(""); + if (isMultiFile) + aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL())).c_str()); + aNameWithExt += TCollection_AsciiString("_GEOM.sgd"); + aSeq[0] = CORBA::string_dup(aNameWithExt.ToCString()); + // Build a full file name of temporary file + TCollection_AsciiString aFullName = TCollection_AsciiString((char*)aTmpDir.c_str()) + aNameWithExt; + // Save GEOM component in this file + _impl->Save(theComponent->GetStudy()->StudyId(), aFullName.ToCString()); + // Conver a file to the byte stream + aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), isMultiFile); + // Remove the created file and tmp directory + if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true); + + // Return the created byte stream + return aStreamFile._retn(); +} + + +//============================================================================ +// function : SaveASCII() +// purpose : +//============================================================================ +SALOMEDS::TMPFile* GEOM_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile) { + SALOMEDS::TMPFile_var aStreamFile = Save(theComponent, theURL, isMultiFile); + return aStreamFile._retn(); +} + + +//============================================================================ +// function : Load() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) { + + if (theStream.length() <= 9) { + MESSAGE("The TMPFile is too short : " << theStream.length() << " bytes "); + return false; + } + + // Get a temporary directory for a file + std::string aTmpDir = isMultiFile?theURL:SALOMEDS_Tool::GetTmpDir(); + // 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); + + // Prepare a file name to open + TCollection_AsciiString aNameWithExt(""); + if (isMultiFile) + aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL())).c_str()); + aNameWithExt += TCollection_AsciiString("_GEOM.sgd"); + TCollection_AsciiString aFullName = (TCollection_AsciiString((char*)aTmpDir.c_str()) + aNameWithExt); + + // Open document + if (!_impl->Load(theComponent->GetStudy()->StudyId(), aFullName.ToCString())) return false; + + // Remove the created file and tmp directory + if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true); + + SALOMEDS::Study_var Study = theComponent->GetStudy(); + TCollection_AsciiString name( strdup(Study->Name()) ); + + return true; +} + + +//============================================================================ +// function : LoadASCII() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) { + return Load(theComponent, theStream, theURL, isMultiFile); +} + + +//============================================================================ +// function : Close() +// purpose : +//============================================================================ +void GEOM_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent) +{ + _impl->Close(theComponent->GetStudy()->StudyId()); +} + +//============================================================================ +// function : CanCopy() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) { + // Try to retrieve known by Geometry component GEOM_Object by given IOR + SALOMEDS::GenericAttribute_var anAttr; + if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return false; + + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + + GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(_orb->string_to_object(anIOR->Value())); + // If the object is null one it can't be copied: return false + if (anObject->_is_nil()) return false; + return true; +} + +//============================================================================ +// function : CopyFrom() +// purpose : +//============================================================================ +SALOMEDS::TMPFile* GEOM_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) { + // Declare a sequence of the byte to store the copied object + SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile; + + // Try to get GEOM_Object object by given SObject + SALOMEDS::GenericAttribute_var anAttr; + if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return aStreamFile._retn(); + GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(_orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value())); + if (anObject->_is_nil()) return aStreamFile._retn(); + + aStreamFile = anObject->GetShapeStream(); + + // Assign an ID the type of GEOM_Object + theObjectID = anObject->GetType(); + + // Return created TMPFile + return aStreamFile._retn(); +} + +//============================================================================ +// function : CanPaste() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) { + // The Geometry component can paste only objects copied by Geometry component + // and with the object type = 1 + if (strcmp(theComponentName, ComponentDataType()) != 0) return false; + return true; +} + +//============================================================================ +// function : PasteInto() +// purpose : +//============================================================================ +SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject) { + // Find the current Study and StudyBuilder + SALOMEDS::Study_var aStudy = theObject->GetStudy(); + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + + // Retrieve a TopoDS_Shape from byte stream + TopoDS_Shape aTopology; + istrstream aStreamedBrep((char*) &theStream[0], theStream.length()); + BRep_Builder aBuilder; + try { + BRepTools::Read(aTopology, aStreamedBrep, aBuilder); + } catch (Standard_Failure) { + return false; + } + + // SObject of the created shape is theObject or new Child of Component if theObject == geom component + SALOMEDS::SObject_var aNewSO; + if (strcmp(theObject->GetFatherComponent()->GetID(),theObject->GetID()) == 0) { + aNewSO = aStudyBuilder->NewObject(theObject); + } else aNewSO = SALOMEDS::SObject::_duplicate(theObject); + + + //Create a new GEOM_Object + Handle(GEOM_Object) anObj = _impl->AddObject(aNewSO->GetStudy()->StudyId(), theObjectID); + Handle(GEOM_Function) aFunction = anObj->AddFunction(GEOMImpl_CopyDriver::GetID(), COPY_WITHOUT_REF); + aFunction->SetValue(aTopology); + + TCollection_AsciiString anEntry; + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + GEOM::GEOM_Object_var obj = GetObject(anObj->GetDocID(), anEntry.ToCString()); + + // Add IORAttribute to the Study and set IOR of the created GEOM_Object to it + SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aNewSO, "AttributeIOR"); + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR->SetValue(_orb->object_to_string(obj)); + + // Return the created in the Study SObject + return aNewSO._retn(); +} + +//============================================================================ +// function : ComponentDataType() +// purpose : +//============================================================================ +char* GEOM_Gen_i::ComponentDataType() +{ + return strdup("GEOM"); +} + +//============================================================================ +// function : AddInStudy +// purpose : +//============================================================================ +SALOMEDS::SObject_ptr GEOM_Gen_i::AddInStudy(SALOMEDS::Study_ptr theStudy, GEOM::GEOM_Object_ptr theObject, const char* theName, GEOM::GEOM_Object_ptr theFather) +{ + SALOMEDS::SObject_var aResultSO; + if(theObject->_is_nil() || theStudy->_is_nil()) return aResultSO; + + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + char* IOR; + + if(!theFather->_is_nil()) { + IOR = _orb->object_to_string(theFather); + SALOMEDS::SObject_var aFatherSO = theStudy->FindObjectIOR(IOR); + if(aFatherSO->_is_nil()) return aResultSO._retn(); + aResultSO = aStudyBuilder->NewObject(aFatherSO); + //aStudyBuilder->Addreference(aResultSO, aResultSO); + } + + aResultSO = PublishInStudy(theStudy, aResultSO, theObject, theName); + if(aResultSO->_is_nil()) return aResultSO._retn(); + + GEOM::ListOfGO_var aList = theObject->GetDependency(); + Standard_Integer aLength = aList->length(); + if(aLength < 1) return aResultSO._retn(); + + //Publish the arguments + for(Standard_Integer i = 0; i< aLength; i++) { + GEOM::GEOM_Object_var anObject = aList[i]; + if(anObject->_is_nil()) continue; + IOR = _orb->object_to_string(anObject); + SALOMEDS::SObject_var aSO = theStudy->FindObjectIOR(IOR); + if(aSO->_is_nil()) continue; + SALOMEDS::SObject_var aSubSO = aStudyBuilder->NewObject(aResultSO); + aStudyBuilder->Addreference(aSubSO, aSO); + } + + return aResultSO._retn(); +} + +//============================================================================ +// function : register() +// purpose : register 'name' in 'name_service' +//============================================================================ +void GEOM_Gen_i::register_name(char * name) +{ + GEOM::GEOM_Gen_ptr g = GEOM::GEOM_Gen::_narrow(_this()); + name_service->Register(g, strdup(name)); +} + +//============================================================================ +// function : Undo +// purpose : +//============================================================================ +void GEOM_Gen_i::Undo(CORBA::Long theStudyID) +{ + _impl->Undo(theStudyID); +} + +//============================================================================ +// function : Redo +// purpose : +//============================================================================ +void GEOM_Gen_i::Redo(CORBA::Long theStudyID) +{ + _impl->Redo(theStudyID); +} + +//============================================================================ +// function : GetIBasicOperations +// purpose : +//============================================================================ +GEOM::GEOM_IBasicOperations_ptr GEOM_Gen_i::GetIBasicOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIBasicOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IBasicOperations_i* aServant = + new GEOM_IBasicOperations_i(_poa, engine, _impl->GetIBasicOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IBasicOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetITransformOperations +// purpose : +//============================================================================ +GEOM::GEOM_ITransformOperations_ptr GEOM_Gen_i::GetITransformOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetITransformOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_ITransformOperations_i* aServant = + new GEOM_ITransformOperations_i(_poa, engine, _impl->GetITransformOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_ITransformOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetI3DPrimOperations +// purpose : +//============================================================================ +GEOM::GEOM_I3DPrimOperations_ptr GEOM_Gen_i::GetI3DPrimOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetI3DPrimOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_I3DPrimOperations_i* aServant = + new GEOM_I3DPrimOperations_i(_poa, engine, _impl->GetI3DPrimOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_I3DPrimOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIShapesOperations +// purpose : +//============================================================================ +GEOM::GEOM_IShapesOperations_ptr GEOM_Gen_i::GetIShapesOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIShapesOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IShapesOperations_i* aServant = + new GEOM_IShapesOperations_i(_poa, engine, _impl->GetIShapesOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IShapesOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIBlocksOperations +// purpose : +//============================================================================ +GEOM::GEOM_IBlocksOperations_ptr GEOM_Gen_i::GetIBlocksOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIBlocksOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IBlocksOperations_i* aServant = + new GEOM_IBlocksOperations_i(_poa, engine, _impl->GetIBlocksOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IBlocksOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIBooleanOperations +// purpose : +//============================================================================ +GEOM::GEOM_IBooleanOperations_ptr GEOM_Gen_i::GetIBooleanOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIBooleanOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IBooleanOperations_i* aServant = + new GEOM_IBooleanOperations_i(_poa, engine, _impl->GetIBooleanOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IBooleanOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetICurvesOperations +// purpose : +//============================================================================ +GEOM::GEOM_ICurvesOperations_ptr GEOM_Gen_i::GetICurvesOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetICurvesOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_ICurvesOperations_i* aServant = + new GEOM_ICurvesOperations_i(_poa, engine, _impl->GetICurvesOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_ICurvesOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetILocalOperations +// purpose : +//============================================================================ +GEOM::GEOM_ILocalOperations_ptr GEOM_Gen_i::GetILocalOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetILocalOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_ILocalOperations_i* aServant = + new GEOM_ILocalOperations_i(_poa, engine, _impl->GetILocalOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_ILocalOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIHealingOperations +// purpose : +//============================================================================ +GEOM::GEOM_IHealingOperations_ptr GEOM_Gen_i::GetIHealingOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::IHealingOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IHealingOperations_i* aServant = + new GEOM_IHealingOperations_i(_poa, engine, _impl->GetIHealingOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IHealingOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIInsertOperations +// purpose : +//============================================================================ +GEOM::GEOM_IInsertOperations_ptr GEOM_Gen_i::GetIInsertOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIInsertOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IInsertOperations_i* aServant = + new GEOM_IInsertOperations_i(_poa, engine, _impl->GetIInsertOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IInsertOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIMeasureOperations +// purpose : +//============================================================================ +GEOM::GEOM_IMeasureOperations_ptr GEOM_Gen_i::GetIMeasureOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIMeasureOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IMeasureOperations_i* aServant = + new GEOM_IMeasureOperations_i(_poa, engine, _impl->GetIMeasureOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IMeasureOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================ +// function : GetIGroupOperations +// purpose : +//============================================================================ +GEOM::GEOM_IGroupOperations_ptr GEOM_Gen_i::GetIGroupOperations(CORBA::Long theStudyID) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "GEOM_Gen_i::GetIGroupOperations" ); + + GEOM::GEOM_Gen_ptr engine = _this(); + + GEOM_IGroupOperations_i* aServant = + new GEOM_IGroupOperations_i(_poa, engine, _impl->GetIGroupOperations(theStudyID)); + + // activate the CORBA servant + GEOM::GEOM_IGroupOperations_var operations = aServant->_this(); + return operations._retn(); +} + +//============================================================================= +/*! + * AddSubShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainShape, + const GEOM::ListOfLong& theIndices) +{ + if(theMainShape == NULL || theIndices.length() < 1) return GEOM::GEOM_Object::_nil(); + Handle(GEOM_Object) aMainsShape = _impl->GetObject(theMainShape->GetStudyID(), theMainShape->GetEntry()); + if (aMainsShape.IsNull()) return GEOM::GEOM_Object::_nil(); + + Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length()); + for(Standard_Integer i = 0; iSetValue(i+1, theIndices[i]); + + Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainsShape, anArray, true); + if(anObject.IsNull()) return GEOM::GEOM_Object::_nil(); + + TCollection_AsciiString anEntry; + TDF_Tool::Entry(anObject->GetEntry(), anEntry); + return GetObject(anObject->GetDocID(), anEntry.ToCString()); +} + +//============================================================================= +/*! + * RemoveObject + */ +//============================================================================= +void GEOM_Gen_i::RemoveObject(GEOM::GEOM_Object_ptr theObject) +{ + Handle(GEOM_Object) anObject = _impl->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return; + _impl->RemoveObject(anObject); + return; +} + + +//================================================================================= +// function : GetStringFromIOR() +// purpose : returns a string that represents a 'GEOM::GEOM_Object_var' +//================================================================================= +char* GEOM_Gen_i::GetStringFromIOR(GEOM::GEOM_Object_ptr theObject) { + return _orb->object_to_string(theObject); +} + + +//================================================================================= +// function : GetIORFromString() +// purpose : returns a 'GEOM::GEOM_Object_var' from a string representing it +//================================================================================= +GEOM::GEOM_Object_ptr GEOM_Gen_i::GetIORFromString(const char* stringIOR) { + GEOM::GEOM_Object_var aGeomObject; + if(strcmp(stringIOR,"") != 0){ + CORBA::Object_var anObject = _orb->string_to_object(stringIOR); + if(!CORBA::is_nil(anObject)) + aGeomObject = GEOM::GEOM_Object::_narrow(anObject.in()); + } + return aGeomObject._retn(); +} + +//================================================================================= +// function : GetObject() +// purpose : +//================================================================================= +GEOM::GEOM_Object_ptr GEOM_Gen_i::GetObject (CORBA::Long theStudyID, const char* theEntry) +{ + GEOM::GEOM_Object_var obj; + Handle(GEOM_Object) handle_object = _impl->GetObject(theStudyID, (char*)theEntry); + if (handle_object.IsNull()) return NULL; + + TCollection_AsciiString stringIOR = handle_object->GetIOR(); + if (stringIOR.Length() > 1) { + CORBA::Object_var corba_object = _orb->string_to_object(stringIOR.ToCString()); + if (!CORBA::is_nil(corba_object)) obj = GEOM::GEOM_Object::_narrow(corba_object); + return obj._retn(); + } + + GEOM::GEOM_Gen_ptr engine = _this(); + GEOM_Object_i* servant = new GEOM_Object_i (_poa, engine, handle_object); + + obj = servant->_this(); + stringIOR = _orb->object_to_string(obj); + handle_object->SetIOR(stringIOR); + return obj._retn(); +} + + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ +#ifdef WNT + __declspec( dllexport ) +#endif + PortableServer::ObjectId * GEOMEngine_factory(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char * interfaceName) + { + GEOM_Gen_i * myGEOM_Gen_i = new GEOM_Gen_i(orb, poa, contId, instanceName, interfaceName); + myGEOM_Gen_i->register_name("/myGEOM_Gen"); // NRI : 11/07/2002 : Add for Supervision example + return myGEOM_Gen_i->getId(); + } +} diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh new file mode 100644 index 000000000..4c31be326 --- /dev/null +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -0,0 +1,227 @@ +// 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/ +// +#ifndef __GEOM_GEN_I_H__ +#define __GEOM_GEN_I_H__ + +#include "GEOMImpl_Gen.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +#include CORBA_CLIENT_HEADER(SALOMEDS) +#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) + + +#include "SALOME_Component_i.hxx" +#include "SALOME_NamingService.hxx" + +#include "GEOM_IBasicOperations_i.hh" +#include "GEOM_ITransformOperations_i.hh" +#include "GEOM_I3DPrimOperations_i.hh" +#include "GEOM_IShapesOperations_i.hh" +#include "GEOM_IBlocksOperations_i.hh" +#include "GEOM_IBooleanOperations_i.hh" +#include "GEOM_ICurvesOperations_i.hh" +#include "GEOM_ILocalOperations_i.hh" +#include "GEOM_IHealingOperations_i.hh" +#include "GEOM_IInsertOperations_i.hh" +#include "GEOM_IMeasureOperations_i.hh" +#include "GEOM_IGroupOperations_i.hh" + +//#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + + +//===================================================================== +// GEOM_Gen_i : class definition +//===================================================================== +class GEOM_Gen_i: virtual public POA_GEOM::GEOM_Gen, virtual public Engines_Component_i +{ + public: + + //-----------------------------------------------------------------------// + // Constructor / Destructor // + //-----------------------------------------------------------------------// + + // constructor to be called for servant creation. + GEOM_Gen_i(); + GEOM_Gen_i(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName); + + // destructor, doing nothing (for now) + virtual ~GEOM_Gen_i(); + + // generic method to be put in a super class + void register_name(char * name); + + + //-----------------------------------------------------------------------// + // Inherited methods from SALOMEDS::Driver // + //-----------------------------------------------------------------------// + + SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean LoadASCII(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + void Close(SALOMEDS::SComponent_ptr theComponent); + char* ComponentDataType(); + + + char* IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + char* LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + + bool CanPublishInStudy(CORBA::Object_ptr theIOR); + SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) ; + + CORBA::Boolean CanCopy(SALOMEDS::SObject_ptr theObject); + SALOMEDS::TMPFile* CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID); + CORBA::Boolean CanPaste(const char* theComponentName, CORBA::Long theObjectID); + SALOMEDS::SObject_ptr PasteInto(const SALOMEDS::TMPFile& theStream, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject); + + /*! \brief Adds theObject in the study with a name = theName, if + * theFather is not null the object is placed under theFather + */ + SALOMEDS::SObject_ptr AddInStudy (SALOMEDS::Study_ptr theStudy, + GEOM::GEOM_Object_ptr theObject, + const char* theName, + GEOM::GEOM_Object_ptr theFather); + + //-----------------------------------------------------------------------// + // Transaction methods // + //-----------------------------------------------------------------------// + + //Undos one transaction in the document associated with theStudyID + virtual void Undo(CORBA::Long theStudyID); + + //Redos one transaction in the document associated with theStudyID + virtual void Redo(CORBA::Long theStudyID); + + //-----------------------------------------------------------------------// + // Operations methods // + //-----------------------------------------------------------------------// + + //Returns a pointer to BasicOperations interface + virtual GEOM::GEOM_IBasicOperations_ptr GetIBasicOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to TransformOperations interface + virtual GEOM::GEOM_ITransformOperations_ptr GetITransformOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to 3DPrimOperations interface + virtual GEOM::GEOM_I3DPrimOperations_ptr GetI3DPrimOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to ShapesOperations interface + virtual GEOM::GEOM_IShapesOperations_ptr GetIShapesOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to BlocksOperations interface + virtual GEOM::GEOM_IBlocksOperations_ptr GetIBlocksOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to BooleanOperations interface + virtual GEOM::GEOM_IBooleanOperations_ptr GetIBooleanOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to CurvesOperations interface + virtual GEOM::GEOM_ICurvesOperations_ptr GetICurvesOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to LocalOperations interface + virtual GEOM::GEOM_ILocalOperations_ptr GetILocalOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to HealingOperations interface + virtual GEOM::GEOM_IHealingOperations_ptr GetIHealingOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to InsertOperations interface + virtual GEOM::GEOM_IInsertOperations_ptr GetIInsertOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to MeasureOperations interface + virtual GEOM::GEOM_IMeasureOperations_ptr GetIMeasureOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Returns a pointer to GroupOperations interface + virtual GEOM::GEOM_IGroupOperations_ptr GetIGroupOperations (CORBA::Long theStudyID) + throw (SALOME::SALOME_Exception); + + //Adds a new sub shape + virtual GEOM::GEOM_Object_ptr AddSubShape (GEOM::GEOM_Object_ptr theMainShape, + const GEOM::ListOfLong& theIndices); + + virtual void RemoveObject(GEOM::GEOM_Object_ptr theObject); + + virtual char* GetStringFromIOR(GEOM::GEOM_Object_ptr theObject); + + virtual GEOM::GEOM_Object_ptr GetIORFromString(const char* stringIOR); + + virtual Engines::TMPFile* DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean& isValidScript); + + char* GetDumpName (const char* theStudyEntry); + + GEOM::string_array* GetAllDumpNames(); + + //-----------------------------------------------------------------------// + // Internal methods // + //-----------------------------------------------------------------------// + + virtual GEOM::GEOM_Object_ptr GetObject(CORBA::Long theStudyID, const char* theEntry); + + private: + + ::GEOMImpl_Gen* _impl; + SALOME_NamingService * name_service; + char * _name; +}; + +#endif diff --git a/src/GEOM_I/GEOM_I3DPrimOperations_i.cc b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc new file mode 100644 index 000000000..ac8d8fb6b --- /dev/null +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.cc @@ -0,0 +1,486 @@ +// 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/ +// +#include + +#include "GEOM_I3DPrimOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOMImpl_I3DPrimOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_I3DPrimOperations_i::GEOM_I3DPrimOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i() +{ + MESSAGE("GEOM_I3DPrimOperations_i::~GEOM_I3DPrimOperations_i"); +} + + +//============================================================================= +/*! + * MakeBoxDXDYDZ + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the Box + Handle(GEOM_Object) anObject = GetOperations()->MakeBoxDXDYDZ(theDX, theDY, theDZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeBoxTwoPnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeBoxTwoPnt + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == 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()); + + if (aPnt1.IsNull() || aPnt2.IsNull()) return aGEOMObject._retn(); + + //Create the Box + Handle(GEOM_Object) anObject = GetOperations()->MakeBoxTwoPnt(aPnt1, aPnt2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeCylinderRH + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderRH (CORBA::Double theR, + CORBA::Double theH) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the Cylinder + Handle(GEOM_Object) anObject = GetOperations()->MakeCylinderRH(theR, theH); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeCylinderPntVecRH + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeCylinderPntVecRH + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theR, CORBA::Double theH) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + //Create the Cylinder + Handle(GEOM_Object) anObject = GetOperations()->MakeCylinderPntVecRH(aPnt, aVec, theR, theH); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeConeR1R2H + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConeR1R2H (CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theH) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the Cone + Handle(GEOM_Object) anObject = GetOperations()->MakeConeR1R2H(theR1, theR2, theH); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeConePntVecR1R2H + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeConePntVecR1R2H + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theR1, CORBA::Double theR2, CORBA::Double theH) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + //Create the Cone + Handle(GEOM_Object) anObject = + GetOperations()->MakeConePntVecR1R2H(aPnt, aVec, theR1, theR2, theH); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSphereR + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSphereR (CORBA::Double theR) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the Cone + Handle(GEOM_Object) anObject = GetOperations()->MakeSphereR(theR); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSpherePntR + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeSpherePntR + (GEOM::GEOM_Object_ptr thePnt, CORBA::Double theR) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL) return aGEOMObject._retn(); + + //Get the reference point + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + + if (aPnt.IsNull()) return aGEOMObject._retn(); + + //Create the Sphere + Handle(GEOM_Object) anObject = + GetOperations()->MakeSpherePntR(aPnt, theR); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeTorusRR + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusRR + (CORBA::Double theRMajor, CORBA::Double theRMinor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + // Make Torus + Handle(GEOM_Object) anObject = + GetOperations()->MakeTorusRR(theRMajor, theRMinor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeTorusPntVecRR + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeTorusPntVecRR + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, CORBA::Double theRMinor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + // Make Torus + Handle(GEOM_Object) anObject = + GetOperations()->MakeTorusPntVecRR(aPnt, aVec, theRMajor, theRMinor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePrismVecH + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismVecH + (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBase == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject + (theBase->GetStudyID(), theBase->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aBase.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + //Create the Prism + Handle(GEOM_Object) anObject = + GetOperations()->MakePrismVecH(aBase, aVec, theH); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePrismTwoPnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePrismTwoPnt + (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBase == NULL || thePoint1 == NULL || thePoint2 == NULL) + return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject + (theBase->GetStudyID(), theBase->GetEntry()); + Handle(GEOM_Object) aPoint1 = GetOperations()->GetEngine()->GetObject + (thePoint1->GetStudyID(), thePoint1->GetEntry()); + Handle(GEOM_Object) aPoint2 = GetOperations()->GetEngine()->GetObject + (thePoint2->GetStudyID(), thePoint2->GetEntry()); + + if (aBase.IsNull() || aPoint1.IsNull() || aPoint2.IsNull()) + return aGEOMObject._retn(); + + //Create the Prism + Handle(GEOM_Object) anObject = + GetOperations()->MakePrismTwoPnt(aBase, aPoint1, aPoint2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePipe + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipe + (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr thePath) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBase == NULL || thePath == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject + (theBase->GetStudyID(), theBase->GetEntry()); + Handle(GEOM_Object) aPath = GetOperations()->GetEngine()->GetObject + (thePath->GetStudyID(), thePath->GetEntry()); + + if (aBase.IsNull() || aPath.IsNull()) return aGEOMObject._retn(); + + //Create the Pipe + Handle(GEOM_Object) anObject = + GetOperations()->MakePipe(aBase, aPath); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeRevolutionAxisAngle + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeRevolutionAxisAngle + (GEOM::GEOM_Object_ptr theBase, GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBase == NULL || theAxis == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aBase = GetOperations()->GetEngine()->GetObject + (theBase->GetStudyID(), theBase->GetEntry()); + Handle(GEOM_Object) anAxis = GetOperations()->GetEngine()->GetObject + (theAxis->GetStudyID(), theAxis->GetEntry()); + + if (aBase.IsNull() || anAxis.IsNull()) return aGEOMObject._retn(); + + //Create the Revolution + Handle(GEOM_Object) anObject = + GetOperations()->MakeRevolutionAxisAngle(aBase, anAxis, theAngle); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFilling + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakeFilling(GEOM::GEOM_Object_ptr theShape, + CORBA::Long theMinDeg, + CORBA::Long theMaxDeg, + CORBA::Double theTol2D, + CORBA::Double theTol3D, + CORBA::Long theNbIter) +{ + 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(); + + //Create the Solid + Handle(GEOM_Object) anObject = GetOperations()->MakeFilling(aShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter); + 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 new file mode 100644 index 000000000..acee1fdfc --- /dev/null +++ b/src/GEOM_I/GEOM_I3DPrimOperations_i.hh @@ -0,0 +1,101 @@ +// 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/ +// + +#ifndef _GEOM_I3DPrimOperations_i_HeaderFile +#define _GEOM_I3DPrimOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_I3DPrimOperations.hxx" + +class GEOM_I3DPrimOperations_i : + public virtual POA_GEOM::GEOM_I3DPrimOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_I3DPrimOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_I3DPrimOperations* theImpl); + ~GEOM_I3DPrimOperations_i(); + + GEOM::GEOM_Object_ptr MakeBoxDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + + GEOM::GEOM_Object_ptr MakeBoxTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + + GEOM::GEOM_Object_ptr MakeCylinderRH (CORBA::Double theR, + CORBA::Double theH); + + GEOM::GEOM_Object_ptr MakeCylinderPntVecRH (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theR, + CORBA::Double theH); + + GEOM::GEOM_Object_ptr MakeConeR1R2H (CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theH); + + GEOM::GEOM_Object_ptr MakeConePntVecR1R2H (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theH); + + GEOM::GEOM_Object_ptr MakeSphereR (CORBA::Double theR); + + GEOM::GEOM_Object_ptr MakeSpherePntR (GEOM::GEOM_Object_ptr thePnt, + CORBA::Double theR); + + GEOM::GEOM_Object_ptr MakeTorusRR (CORBA::Double theRMajor, + CORBA::Double theRMinor); + + GEOM::GEOM_Object_ptr MakeTorusPntVecRR (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, + CORBA::Double theRMinor); + + GEOM::GEOM_Object_ptr MakePrismVecH (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH); + + GEOM::GEOM_Object_ptr MakePrismTwoPnt (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + + GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath); + + GEOM::GEOM_Object_ptr MakeRevolutionAxisAngle (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + + GEOM::GEOM_Object_ptr MakeFilling(GEOM::GEOM_Object_ptr theShape, CORBA::Long theMinDeg, CORBA::Long theMaxDeg, CORBA::Double theTol2D, CORBA::Double theTol3D, CORBA::Long theNbIter); + + ::GEOMImpl_I3DPrimOperations* GetOperations() + { return (::GEOMImpl_I3DPrimOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.cc b/src/GEOM_I/GEOM_IBasicOperations_i.cc new file mode 100644 index 000000000..b24857da1 --- /dev/null +++ b/src/GEOM_I/GEOM_IBasicOperations_i.cc @@ -0,0 +1,390 @@ +// 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/ +// +#include + +#include "GEOM_IBasicOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IBasicOperations_i::GEOM_IBasicOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBasicOperations* theImpl) + :GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IBasicOperations_i::GEOM_IBasicOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IBasicOperations_i::~GEOM_IBasicOperations_i() +{ + MESSAGE("GEOM_IBasicOperations_i::~GEOM_IBasicOperations_i"); +} + + +//============================================================================= +/*! + * MakePointXYZ + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointXYZ + (CORBA::Double theX, CORBA::Double theY, CORBA::Double theZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the point + + Handle(GEOM_Object) anObject = GetOperations()->MakePointXYZ(theX, theY, theZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePointWithReference + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointWithReference + (GEOM::GEOM_Object_ptr theReference, CORBA::Double theX, CORBA::Double theY, CORBA::Double theZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if(theReference == NULL) return aGEOMObject._retn(); + + //Get the reference point + + Handle(GEOM_Object) aRefernce = GetOperations()->GetEngine()->GetObject + (theReference->GetStudyID(), theReference->GetEntry()); + if (aRefernce.IsNull()) return aGEOMObject._retn(); + + //Create the point + + Handle(GEOM_Object) anObject = + GetOperations()->MakePointWithReference(aRefernce, theX, theY, theZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePointOnCurve + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePointOnCurve + (GEOM::GEOM_Object_ptr theCurve, CORBA::Double theParameter) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCurve == NULL) return aGEOMObject._retn(); + + //Get the reference curve + + Handle(GEOM_Object) aRefernce = GetOperations()->GetEngine()->GetObject + (theCurve->GetStudyID(), theCurve->GetEntry()); + if (aRefernce.IsNull()) return aGEOMObject._retn(); + + //Create the point + + Handle(GEOM_Object) anObject = + GetOperations()->MakePointOnCurve(aRefernce, theParameter); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MakeVectorDXDYDZ + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeVectorDXDYDZ + (CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the Vector + + Handle(GEOM_Object) anObject = GetOperations()->MakeVectorDXDYDZ(theDX, theDY, theDZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeVectorTwoPnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeVectorTwoPnt + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == NULL) return aGEOMObject._retn(); + + //Get the reference points + + Handle(GEOM_Object) aRef1 = GetOperations()->GetEngine()->GetObject + (thePnt1->GetStudyID(), thePnt1->GetEntry()); + Handle(GEOM_Object) aRef2 = GetOperations()->GetEngine()->GetObject + (thePnt2->GetStudyID(), thePnt2->GetEntry()); + if (aRef1.IsNull() || aRef2.IsNull()) return aGEOMObject._retn(); + + //Create the vector + + Handle(GEOM_Object) anObject = + GetOperations()->MakeVectorTwoPnt(aRef1, aRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MakeLine + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeLine + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theDir) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theDir == NULL) return aGEOMObject._retn(); + + //Get the reference objects + + Handle(GEOM_Object) aRef1 = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aRef2 = GetOperations()->GetEngine()->GetObject + (theDir->GetStudyID(), theDir->GetEntry()); + if (aRef1.IsNull() || aRef2.IsNull()) return aGEOMObject._retn(); + + //Create the Line + + Handle(GEOM_Object) anObject = + GetOperations()->MakeLine(aRef1, aRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeLineTwoPnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeLineTwoPnt + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == NULL) return aGEOMObject._retn(); + + //Get the reference points + + Handle(GEOM_Object) aRef1 = GetOperations()->GetEngine()->GetObject + (thePnt1->GetStudyID(), thePnt1->GetEntry()); + Handle(GEOM_Object) aRef2 = GetOperations()->GetEngine()->GetObject + (thePnt2->GetStudyID(), thePnt2->GetEntry()); + if (aRef1.IsNull() || aRef2.IsNull()) return aGEOMObject._retn(); + + //Create the Line + + Handle(GEOM_Object) anObject = + GetOperations()->MakeLineTwoPnt(aRef1, aRef2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MakePlanePntVec + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePlanePntVec + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theTrimSize) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the references + + Handle(GEOM_Object) aRef1 = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aRef2 = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + if (aRef1.IsNull() || aRef2.IsNull()) return aGEOMObject._retn(); + + //Create the plane + + Handle(GEOM_Object) anObject = + GetOperations()->MakePlanePntVec(aRef1, aRef2, theTrimSize); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePlaneThreePnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePlaneThreePnt + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, CORBA::Double theTrimSize) +{ + 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) aRef1 = GetOperations()->GetEngine()->GetObject + (thePnt1->GetStudyID(), thePnt1->GetEntry()); + Handle(GEOM_Object) aRef2 = GetOperations()->GetEngine()->GetObject + (thePnt2->GetStudyID(), thePnt2->GetEntry()); + Handle(GEOM_Object) aRef3 = GetOperations()->GetEngine()->GetObject + (thePnt3->GetStudyID(), thePnt3->GetEntry()); + if (aRef1.IsNull() || aRef2.IsNull() || aRef3.IsNull()) + return aGEOMObject._retn(); + + //Create the plane + + Handle(GEOM_Object) anObject = + GetOperations()->MakePlaneThreePnt(aRef1, aRef2, aRef3, theTrimSize); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePlaneFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakePlaneFace + (GEOM::GEOM_Object_ptr theFace, CORBA::Double theTrimSize) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theFace == NULL) return aGEOMObject._retn(); + + //Get the reference face + + Handle(GEOM_Object) aRef = GetOperations()->GetEngine()->GetObject + (theFace->GetStudyID(), theFace->GetEntry()); + if (aRef.IsNull()) return aGEOMObject._retn(); + + //Create the plane + + Handle(GEOM_Object) anObject = + GetOperations()->MakePlaneFace(aRef, theTrimSize); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MakeMarker + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeMarker + (CORBA::Double theOX , CORBA::Double theOY , CORBA::Double theOZ, + CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, + CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Create the point + Handle(GEOM_Object) anObject = GetOperations()->MakeMarker(theOX , theOY , theOZ, + theXDX, theXDY, theXDZ, + theYDX, theYDY, theYDZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.hh b/src/GEOM_I/GEOM_IBasicOperations_i.hh new file mode 100644 index 000000000..e46f50431 --- /dev/null +++ b/src/GEOM_I/GEOM_IBasicOperations_i.hh @@ -0,0 +1,87 @@ +// 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/ +// + +#ifndef _GEOM_IBasicOperations_i_HeaderFile +#define _GEOM_IBasicOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IBasicOperations.hxx" + +class GEOM_IBasicOperations_i : + public virtual POA_GEOM::GEOM_IBasicOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IBasicOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBasicOperations* theImpl); + ~GEOM_IBasicOperations_i(); + + GEOM::GEOM_Object_ptr MakePointXYZ (CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ); + + GEOM::GEOM_Object_ptr MakePointWithReference (GEOM::GEOM_Object_ptr theReference, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ); + + GEOM::GEOM_Object_ptr MakePointOnCurve (GEOM::GEOM_Object_ptr theCurve, + CORBA::Double theParameter); + + GEOM::GEOM_Object_ptr MakeVectorDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + + GEOM::GEOM_Object_ptr MakeVectorTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + + GEOM::GEOM_Object_ptr MakeLine (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theDir); + + GEOM::GEOM_Object_ptr MakeLineTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + + GEOM::GEOM_Object_ptr MakePlaneThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + CORBA::Double theTrimSize); + + GEOM::GEOM_Object_ptr MakePlanePntVec (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theTrimSize); + + GEOM::GEOM_Object_ptr MakePlaneFace (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theTrimSize); + + GEOM::GEOM_Object_ptr MakeMarker (CORBA::Double theOX , CORBA::Double theOY , CORBA::Double theOZ, + CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, + CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); + + ::GEOMImpl_IBasicOperations* GetOperations() { return (::GEOMImpl_IBasicOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc new file mode 100644 index 000000000..97e693731 --- /dev/null +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -0,0 +1,1056 @@ +// 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/ +// +#include + +#include "GEOM_IBlocksOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IBlocksOperations_i::GEOM_IBlocksOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBlocksOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IBlocksOperations_i::GEOM_IBlocksOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IBlocksOperations_i::~GEOM_IBlocksOperations_i() +{ + MESSAGE("GEOM_IBlocksOperations_i::~GEOM_IBlocksOperations_i"); +} + + +//============================================================================= +/*! + * MakeQuad + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad + (GEOM::GEOM_Object_ptr theEdge1, GEOM::GEOM_Object_ptr theEdge2, + GEOM::GEOM_Object_ptr theEdge3, GEOM::GEOM_Object_ptr theEdge4) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theEdge1 == NULL || theEdge2 == NULL || + theEdge3 == NULL || theEdge4 == NULL) return aGEOMObject._retn(); + + //Get the reference edges + Handle(GEOM_Object) anEdge1 = GetOperations()->GetEngine()->GetObject + (theEdge1->GetStudyID(), theEdge1->GetEntry()); + Handle(GEOM_Object) anEdge2 = GetOperations()->GetEngine()->GetObject + (theEdge2->GetStudyID(), theEdge2->GetEntry()); + Handle(GEOM_Object) anEdge3 = GetOperations()->GetEngine()->GetObject + (theEdge3->GetStudyID(), theEdge3->GetEntry()); + Handle(GEOM_Object) anEdge4 = GetOperations()->GetEngine()->GetObject + (theEdge4->GetStudyID(), theEdge4->GetEntry()); + + if (anEdge1.IsNull() || anEdge2.IsNull() || + anEdge3.IsNull() || anEdge4.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->MakeQuad(anEdge1, anEdge2, anEdge3, anEdge4); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeQuad2Edges + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad2Edges + (GEOM::GEOM_Object_ptr theEdge1, GEOM::GEOM_Object_ptr theEdge2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theEdge1 == NULL || theEdge2 == NULL) return aGEOMObject._retn(); + + //Get the reference edges + Handle(GEOM_Object) anEdge1 = GetOperations()->GetEngine()->GetObject + (theEdge1->GetStudyID(), theEdge1->GetEntry()); + Handle(GEOM_Object) anEdge2 = GetOperations()->GetEngine()->GetObject + (theEdge2->GetStudyID(), theEdge2->GetEntry()); + + if (anEdge1.IsNull() || anEdge2.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->MakeQuad2Edges(anEdge1, anEdge2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeQuad4Vertices + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeQuad4Vertices + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, GEOM::GEOM_Object_ptr thePnt4) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == NULL || + thePnt3 == NULL || thePnt4 == 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()); + Handle(GEOM_Object) aPnt4 = GetOperations()->GetEngine()->GetObject + (thePnt4->GetStudyID(), thePnt4->GetEntry()); + + if (aPnt1.IsNull() || aPnt2.IsNull() || + aPnt3.IsNull() || aPnt4.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->MakeQuad4Vertices(aPnt1, aPnt2, aPnt3, aPnt4); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeHexa + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeHexa + (GEOM::GEOM_Object_ptr theFace1, GEOM::GEOM_Object_ptr theFace2, + GEOM::GEOM_Object_ptr theFace3, GEOM::GEOM_Object_ptr theFace4, + GEOM::GEOM_Object_ptr theFace5, GEOM::GEOM_Object_ptr theFace6) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theFace1 == NULL || theFace2 == NULL || + theFace3 == NULL || theFace4 == NULL || + theFace5 == NULL || theFace6 == NULL) return aGEOMObject._retn(); + + //Get the reference Faces + Handle(GEOM_Object) anFace1 = GetOperations()->GetEngine()->GetObject + (theFace1->GetStudyID(), theFace1->GetEntry()); + Handle(GEOM_Object) anFace2 = GetOperations()->GetEngine()->GetObject + (theFace2->GetStudyID(), theFace2->GetEntry()); + Handle(GEOM_Object) anFace3 = GetOperations()->GetEngine()->GetObject + (theFace3->GetStudyID(), theFace3->GetEntry()); + Handle(GEOM_Object) anFace4 = GetOperations()->GetEngine()->GetObject + (theFace4->GetStudyID(), theFace4->GetEntry()); + Handle(GEOM_Object) anFace5 = GetOperations()->GetEngine()->GetObject + (theFace5->GetStudyID(), theFace5->GetEntry()); + Handle(GEOM_Object) anFace6 = GetOperations()->GetEngine()->GetObject + (theFace6->GetStudyID(), theFace6->GetEntry()); + + if (anFace1.IsNull() || anFace2.IsNull() || + anFace3.IsNull() || anFace4.IsNull() || + anFace5.IsNull() || anFace6.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = GetOperations()->MakeHexa + (anFace1, anFace2, anFace3, anFace4, anFace5, anFace6); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeHexa2Faces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeHexa2Faces + (GEOM::GEOM_Object_ptr theFace1, GEOM::GEOM_Object_ptr theFace2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theFace1 == NULL || theFace2 == NULL) return aGEOMObject._retn(); + + //Get the reference Faces + Handle(GEOM_Object) anFace1 = GetOperations()->GetEngine()->GetObject + (theFace1->GetStudyID(), theFace1->GetEntry()); + Handle(GEOM_Object) anFace2 = GetOperations()->GetEngine()->GetObject + (theFace2->GetStudyID(), theFace2->GetEntry()); + + if (anFace1.IsNull() || anFace2.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->MakeHexa2Faces(anFace1, anFace2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeBlockCompound + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeBlockCompound + (GEOM::GEOM_Object_ptr theCompound) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return aGEOMObject._retn(); + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return aGEOMObject._retn(); + + //Create the Blocks Compound + Handle(GEOM_Object) anObject = + GetOperations()->MakeBlockCompound(aCompound); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetPoint (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theX, + const CORBA::Double theY, + const CORBA::Double theZ, + const CORBA::Double theEpsilon) +{ + 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(); + + //Create the Point + Handle(GEOM_Object) anObject = + GetOperations()->GetPoint(aShape, theX, theY, theZ, theEpsilon); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetEdge (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || + thePoint1 == NULL || thePoint2 == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aPoint1 = GetOperations()->GetEngine()->GetObject + (thePoint1->GetStudyID(), thePoint1->GetEntry()); + Handle(GEOM_Object) aPoint2 = GetOperations()->GetEngine()->GetObject + (thePoint2->GetStudyID(), thePoint2->GetEntry()); + + if (aShape.IsNull() || + aPoint1.IsNull() || aPoint2.IsNull()) return aGEOMObject._retn(); + + //Create the Point + Handle(GEOM_Object) anObject = + GetOperations()->GetEdge(aShape, aPoint1, aPoint2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetEdgeNearPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || thePoint == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aPoint = GetOperations()->GetEngine()->GetObject + (thePoint->GetStudyID(), thePoint->GetEntry()); + + if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn(); + + //Create the Edge + Handle(GEOM_Object) anObject = + GetOperations()->GetEdgeNearPoint(aShape, aPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetFaceByPoints + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByPoints + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + GEOM::GEOM_Object_ptr thePoint3, + GEOM::GEOM_Object_ptr thePoint4) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || + thePoint1 == NULL || thePoint2 == NULL || + thePoint3 == NULL || thePoint4 == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aPoint1 = GetOperations()->GetEngine()->GetObject + (thePoint1->GetStudyID(), thePoint1->GetEntry()); + Handle(GEOM_Object) aPoint2 = GetOperations()->GetEngine()->GetObject + (thePoint2->GetStudyID(), thePoint2->GetEntry()); + Handle(GEOM_Object) aPoint3 = GetOperations()->GetEngine()->GetObject + (thePoint3->GetStudyID(), thePoint3->GetEntry()); + Handle(GEOM_Object) aPoint4 = GetOperations()->GetEngine()->GetObject + (thePoint4->GetStudyID(), thePoint4->GetEntry()); + + if (aShape.IsNull() || + aPoint1.IsNull() || aPoint2.IsNull() || + aPoint3.IsNull() || aPoint4.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->GetFaceByPoints(aShape, aPoint1, aPoint2, aPoint3, aPoint4); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetFaceByEdges + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByEdges + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || + theEdge1 == NULL || theEdge2 == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) anEdge1 = GetOperations()->GetEngine()->GetObject + (theEdge1->GetStudyID(), theEdge1->GetEntry()); + Handle(GEOM_Object) anEdge2 = GetOperations()->GetEngine()->GetObject + (theEdge2->GetStudyID(), theEdge2->GetEntry()); + + if (aShape.IsNull() || + anEdge1.IsNull() || anEdge2.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->GetFaceByEdges(aShape, anEdge1, anEdge2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetOppositeFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetOppositeFace (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theFace) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theFace == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aFace = GetOperations()->GetEngine()->GetObject + (theFace->GetStudyID(), theFace->GetEntry()); + + if (aShape.IsNull() || aFace.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->GetOppositeFace(aShape, aFace); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetFaceNearPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || thePoint == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aPoint = GetOperations()->GetEngine()->GetObject + (thePoint->GetStudyID(), thePoint->GetEntry()); + + if (aShape.IsNull() || aPoint.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->GetFaceNearPoint(aShape, aPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetFaceByNormale + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetFaceByNormale (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theVector) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theVector == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aVector = GetOperations()->GetEngine()->GetObject + (theVector->GetStudyID(), theVector->GetEntry()); + + if (aShape.IsNull() || aVector.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = + GetOperations()->GetFaceByNormale(aShape, aVector); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * ExplodeCompoundOfBlocks + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IBlocksOperations_i::ExplodeCompoundOfBlocks + (GEOM::GEOM_Object_ptr theCompound, + const CORBA::Long theMinNbFaces, + const CORBA::Long theMaxNbFaces) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return aSeq._retn(); + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return aSeq._retn(); + + //Explode + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->ExplodeCompoundOfBlocks(aCompound, theMinNbFaces, theMaxNbFaces); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * IsCompoundOfBlocks + */ +//============================================================================= +CORBA::Boolean GEOM_IBlocksOperations_i::IsCompoundOfBlocks + (GEOM::GEOM_Object_ptr theCompound, + const CORBA::Long theMinNbFaces, + const CORBA::Long theMaxNbFaces, + CORBA::Long& theNbBlocks) +{ + theNbBlocks = 0; + CORBA::Boolean isComp = false; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return isComp; + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return isComp; + + //Check + Standard_Integer nbBlocks = 0; + isComp = GetOperations()->IsCompoundOfBlocks(aCompound, + theMinNbFaces, + theMaxNbFaces, + nbBlocks); + if (!GetOperations()->IsDone()) + return isComp; + + theNbBlocks = nbBlocks; + return isComp; +} + +//============================================================================= +/*! + * CheckCompoundOfBlocks + */ +//============================================================================= +CORBA::Boolean GEOM_IBlocksOperations_i::CheckCompoundOfBlocks + (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors) +{ + CORBA::Boolean isComp = false; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return isComp; + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return isComp; + + //Check + list errList; + isComp = GetOperations()->CheckCompoundOfBlocks(aCompound, errList); + if (!GetOperations()->IsDone()) + return isComp; + + const int nbErr = errList.size(); + GEOM::GEOM_IBlocksOperations::BCErrors_var anErrArray = + new GEOM::GEOM_IBlocksOperations::BCErrors(); + anErrArray->length(nbErr); + + // fill the local CORBA array with values from lists + list::iterator errIt = errList.begin(); + int i = 0; + for (; errIt != errList.end(); i++, errIt++) { + GEOM::GEOM_IBlocksOperations::BCError_var anError = + new GEOM::GEOM_IBlocksOperations::BCError(); + + GEOMImpl_IBlocksOperations::BCError errStruct = *errIt; + + switch (errStruct.error) { + case GEOMImpl_IBlocksOperations::NOT_BLOCK: + anError->error = GEOM::GEOM_IBlocksOperations::NOT_BLOCK; + break; + case GEOMImpl_IBlocksOperations::EXTRA_EDGE: + anError->error = GEOM::GEOM_IBlocksOperations::EXTRA_EDGE; + break; + case GEOMImpl_IBlocksOperations::INVALID_CONNECTION: + anError->error = GEOM::GEOM_IBlocksOperations::INVALID_CONNECTION; + break; + case GEOMImpl_IBlocksOperations::NOT_CONNECTED: + anError->error = GEOM::GEOM_IBlocksOperations::NOT_CONNECTED; + break; + case GEOMImpl_IBlocksOperations::NOT_GLUED: + anError->error = GEOM::GEOM_IBlocksOperations::NOT_GLUED; + break; + default: + break; + } + + list sshList = errStruct.incriminated; + GEOM::ListOfLong_var anIncrims = new GEOM::ListOfLong(); + anIncrims->length(sshList.size()); + + list::iterator sshIt = sshList.begin(); + int jj = 0; + for (; sshIt != sshList.end(); jj++, sshIt++) { + anIncrims[jj] = *sshIt; + } + + anError->incriminated = anIncrims; + + anErrArray[i] = anError; + } + + // initialize out-parameter with local array + theErrors = anErrArray._retn(); + + return isComp; +} + +//============================================================================= +/*! + * PrintBCErrors + */ +//============================================================================= +char* GEOM_IBlocksOperations_i::PrintBCErrors + (GEOM::GEOM_Object_ptr theCompound, + const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors) +{ + //Get the reference Compound + if (theCompound == NULL) return NULL; + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + if (aCompound.IsNull()) return NULL; + + // Convert the errors sequence + list anErrors; + int nbErr = theErrors.length(); + int ie = 0; + for (; ie < nbErr; ie++) { + const GEOM::GEOM_IBlocksOperations::BCError err = theErrors[ie]; + const GEOM::GEOM_IBlocksOperations::BCErrorType typ = err.error; + const GEOM::ListOfLong incrims = err.incriminated; + + GEOMImpl_IBlocksOperations::BCError errStruct; + switch (typ) { + case GEOM::GEOM_IBlocksOperations::NOT_BLOCK: + errStruct.error = GEOMImpl_IBlocksOperations::NOT_BLOCK; + break; + case GEOM::GEOM_IBlocksOperations::EXTRA_EDGE: + errStruct.error = GEOMImpl_IBlocksOperations::EXTRA_EDGE; + break; + case GEOM::GEOM_IBlocksOperations::INVALID_CONNECTION: + errStruct.error = GEOMImpl_IBlocksOperations::INVALID_CONNECTION; + break; + case GEOM::GEOM_IBlocksOperations::NOT_CONNECTED: + errStruct.error = GEOMImpl_IBlocksOperations::NOT_CONNECTED; + break; + case GEOM::GEOM_IBlocksOperations::NOT_GLUED: + errStruct.error = GEOMImpl_IBlocksOperations::NOT_GLUED; + break; + default: + break; + } + + int ii = 0; + int aLen = incrims.length(); + for (; ii < aLen; ii++) { + errStruct.incriminated.push_back(incrims[ii]); + } + + anErrors.push_back(errStruct); + } + + TCollection_AsciiString aDescr = GetOperations()->PrintBCErrors(aCompound, anErrors); + return CORBA::string_dup(aDescr.ToCString()); +} + +//============================================================================= +/*! + * RemoveExtraEdges + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape) +{ + 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(); + + //Get the result + Handle(GEOM_Object) anObject = + GetOperations()->RemoveExtraEdges(aShape); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * CheckAndImprove + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::CheckAndImprove (GEOM::GEOM_Object_ptr theCompound) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return aGEOMObject._retn(); + + //Get the result + Handle(GEOM_Object) anObject = + GetOperations()->CheckAndImprove(aCompound); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetBlockNearPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL || thePoint == NULL) return aGEOMObject._retn(); + + //Get the reference Objects + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + Handle(GEOM_Object) aPoint = GetOperations()->GetEngine()->GetObject + (thePoint->GetStudyID(), thePoint->GetEntry()); + + if (aCompound.IsNull() || aPoint.IsNull()) return aGEOMObject._retn(); + + //Get the block + Handle(GEOM_Object) anObject = + GetOperations()->GetBlockNearPoint(aCompound, aPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetBlockByParts + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetBlockByParts (GEOM::GEOM_Object_ptr theCompound, + const GEOM::ListOfGO& theParts) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return aGEOMObject._retn(); + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return aGEOMObject._retn(); + + //Get the parts + int ind, aLen; + Handle(TColStd_HSequenceOfTransient) aParts = new TColStd_HSequenceOfTransient; + + aLen = theParts.length(); + for (ind = 0; ind < aLen; ind++) { + if (theParts[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theParts[ind]->GetStudyID(), theParts[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aParts->Append(aSh); + } + + //Get the Block + Handle(GEOM_Object) anObject = + GetOperations()->GetBlockByParts(aCompound, aParts); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetBlocksByParts + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IBlocksOperations_i::GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound, + const GEOM::ListOfGO& theParts) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theCompound == NULL) return aSeq._retn(); + + //Get the reference Compound + Handle(GEOM_Object) aCompound = GetOperations()->GetEngine()->GetObject + (theCompound->GetStudyID(), theCompound->GetEntry()); + + if (aCompound.IsNull()) return aSeq._retn(); + + //Get the parts + int ind, aLen; + Handle(TColStd_HSequenceOfTransient) aParts = new TColStd_HSequenceOfTransient; + + aLen = theParts.length(); + for (ind = 0; ind < aLen; ind++) { + if (theParts[ind] == NULL) return aSeq._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theParts[ind]->GetStudyID(), theParts[ind]->GetEntry()); + if (aSh.IsNull()) return aSeq._retn(); + aParts->Append(aSh); + } + + //Get the Block + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetBlocksByParts(aCompound, aParts); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * MakeMultiTransformation1D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeMultiTransformation1D + (GEOM::GEOM_Object_ptr theBlock, + const CORBA::Long theDirFace1, + const CORBA::Long theDirFace2, + const CORBA::Long theNbTimes) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBlock == NULL) return aGEOMObject._retn(); + + //Get the object itself and the vector of translation + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theBlock->GetStudyID(), theBlock->GetEntry()); + + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Perform the transformation + Handle(GEOM_Object) anObject = GetOperations()->MakeMultiTransformation1D + (aBasicObject, theDirFace1, theDirFace2, theNbTimes); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeMultiTransformation2D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::MakeMultiTransformation2D + (GEOM::GEOM_Object_ptr theBlock, + const CORBA::Long theDirFace1U, + const CORBA::Long theDirFace2U, + const CORBA::Long theNbTimesU, + const CORBA::Long theDirFace1V, + const CORBA::Long theDirFace2V, + const CORBA::Long theNbTimesV) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theBlock == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theBlock->GetStudyID(), theBlock->GetEntry()); + + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Perform the transformation + Handle(GEOM_Object) anObject = GetOperations()->MakeMultiTransformation2D + (aBasicObject, + theDirFace1U, theDirFace2U, theNbTimesU, + theDirFace1V, theDirFace2V, theNbTimesV); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * Propagate + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IBlocksOperations_i::Propagate (GEOM::GEOM_Object_ptr theShape) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return aSeq._retn(); + + //Get the reference Shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return aSeq._retn(); + + //Get the Propagation chains + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->Propagate(aShape); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh new file mode 100644 index 000000000..b4ff44f8e --- /dev/null +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -0,0 +1,152 @@ +// 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/ +// + +#ifndef _GEOM_IBlocksOperations_i_HeaderFile +#define _GEOM_IBlocksOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IBlocksOperations.hxx" + +class GEOM_IBlocksOperations_i : + public virtual POA_GEOM::GEOM_IBlocksOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IBlocksOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBlocksOperations* theImpl); + ~GEOM_IBlocksOperations_i(); + + // Creation of blocks and block faces + GEOM::GEOM_Object_ptr MakeQuad (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2, + GEOM::GEOM_Object_ptr theEdge3, + GEOM::GEOM_Object_ptr theEdge4); + + GEOM::GEOM_Object_ptr MakeQuad2Edges (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2); + + GEOM::GEOM_Object_ptr MakeQuad4Vertices (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + GEOM::GEOM_Object_ptr thePnt4); + + GEOM::GEOM_Object_ptr MakeHexa (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2, + GEOM::GEOM_Object_ptr theFace3, + GEOM::GEOM_Object_ptr theFace4, + GEOM::GEOM_Object_ptr theFace5, + GEOM::GEOM_Object_ptr theFace6); + + GEOM::GEOM_Object_ptr MakeHexa2Faces (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2); + + GEOM::GEOM_Object_ptr MakeBlockCompound (GEOM::GEOM_Object_ptr theCompound); + + // Extract elements of blocks and blocks compounds + GEOM::GEOM_Object_ptr GetPoint (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theEpsilon); + + GEOM::GEOM_Object_ptr GetEdge (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + + GEOM::GEOM_Object_ptr GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint); + + GEOM::GEOM_Object_ptr GetFaceByPoints (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + GEOM::GEOM_Object_ptr thePoint3, + GEOM::GEOM_Object_ptr thePoint4); + + GEOM::GEOM_Object_ptr GetFaceByEdges (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2); + + GEOM::GEOM_Object_ptr GetOppositeFace (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theFace); + + GEOM::GEOM_Object_ptr GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint); + + GEOM::GEOM_Object_ptr GetFaceByNormale (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theVector); + + // Check blocks compound + CORBA::Boolean IsCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces, + CORBA::Long& theNbBlocks); + + CORBA::Boolean CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors); + + char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, + const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); + + GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape); + + GEOM::GEOM_Object_ptr CheckAndImprove (GEOM::GEOM_Object_ptr theCompound); + + // Extract blocks from blocks compounds + GEOM::ListOfGO* ExplodeCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces); + + GEOM::GEOM_Object_ptr GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_Object_ptr thePoint); + + GEOM::GEOM_Object_ptr GetBlockByParts (GEOM::GEOM_Object_ptr theCompound, + const GEOM::ListOfGO& theParts); + + GEOM::ListOfGO* GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound, + const GEOM::ListOfGO& theParts); + + // Operations on blocks with gluing of result + GEOM::GEOM_Object_ptr MakeMultiTransformation1D (GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1, + CORBA::Long theDirFace2, + CORBA::Long theNbTimes); + + GEOM::GEOM_Object_ptr MakeMultiTransformation2D (GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1U, + CORBA::Long theDirFace2U, + CORBA::Long theNbTimesU, + CORBA::Long theDirFace1V, + CORBA::Long theDirFace2V, + CORBA::Long theNbTimesV); + + // Build groups for Propagation of 1D hypotheses + GEOM::ListOfGO* Propagate (GEOM::GEOM_Object_ptr theShape); + + ::GEOMImpl_IBlocksOperations* GetOperations() + { return (::GEOMImpl_IBlocksOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IBooleanOperations_i.cc b/src/GEOM_I/GEOM_IBooleanOperations_i.cc new file mode 100644 index 000000000..f69cce675 --- /dev/null +++ b/src/GEOM_I/GEOM_IBooleanOperations_i.cc @@ -0,0 +1,202 @@ +// 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/ +// +#include + +#include "GEOM_IBooleanOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IBooleanOperations_i::GEOM_IBooleanOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBooleanOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IBooleanOperations_i::GEOM_IBooleanOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IBooleanOperations_i::~GEOM_IBooleanOperations_i() +{ + MESSAGE("GEOM_IBooleanOperations_i::~GEOM_IBooleanOperations_i"); +} + + +//============================================================================= +/*! + * MakeBoolean + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeBoolean + (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOp) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape1 == NULL || theShape2 == NULL) return aGEOMObject._retn(); + + //Get the reference shapes + Handle(GEOM_Object) aSh1 = GetOperations()->GetEngine()->GetObject + (theShape1->GetStudyID(), theShape1->GetEntry()); + Handle(GEOM_Object) aSh2 = GetOperations()->GetEngine()->GetObject + (theShape2->GetStudyID(), theShape2->GetEntry()); + + if (aSh1.IsNull() || aSh2.IsNull()) return aGEOMObject._retn(); + + // Make Boolean + Handle(GEOM_Object) anObject = GetOperations()->MakeBoolean(aSh1, aSh2, theOp); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePartition + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakePartition + (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepIns, + const GEOM::ListOfGO& theRemoveIns, + const CORBA::Short theLimit, + const CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + Handle(TColStd_HSequenceOfTransient) aShapes = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aTools = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aKeepIns = new TColStd_HSequenceOfTransient; + Handle(TColStd_HSequenceOfTransient) aRemIns = new TColStd_HSequenceOfTransient; + Handle(TColStd_HArray1OfInteger) aMaterials; + + //Get the shapes + aLen = theShapes.length(); + for (ind = 0; ind < aLen; ind++) { + if (theShapes[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theShapes[ind]->GetStudyID(), theShapes[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes->Append(aSh); + } + + //Get the tools + aLen = theTools.length(); + for (ind = 0; ind < aLen; ind++) { + if (theTools[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theTools[ind]->GetStudyID(), theTools[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aTools->Append(aSh); + } + + //Get the keep inside shapes + aLen = theKeepIns.length(); + for (ind = 0; ind < aLen; ind++) { + if (theKeepIns[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theKeepIns[ind]->GetStudyID(), theKeepIns[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aKeepIns->Append(aSh); + } + + //Get the remove inside shapes + aLen = theRemoveIns.length(); + for (ind = 0; ind < aLen; ind++) { + if (theRemoveIns[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theRemoveIns[ind]->GetStudyID(), theRemoveIns[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aRemIns->Append(aSh); + } + + //Get the materials + aLen = theMaterials.length(); + aMaterials = new TColStd_HArray1OfInteger (1, aLen); + for (ind = 0; ind < aLen; ind++) { + aMaterials->SetValue(ind+1, theMaterials[ind]); + } + + // Make Partition + Handle(GEOM_Object) anObject = + GetOperations()->MakePartition(aShapes, aTools, aKeepIns, aRemIns, + theLimit, theRemoveWebs, aMaterials); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeHalfPartition + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBooleanOperations_i::MakeHalfPartition + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || thePlane == NULL) return aGEOMObject._retn(); + + //Get the reference shapes + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aPl = GetOperations()->GetEngine()->GetObject + (thePlane->GetStudyID(), thePlane->GetEntry()); + + if (aSh.IsNull() || aPl.IsNull()) return aGEOMObject._retn(); + + // Make Half Partition + Handle(GEOM_Object) anObject = GetOperations()->MakeHalfPartition(aSh, aPl); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_IBooleanOperations_i.hh b/src/GEOM_I/GEOM_IBooleanOperations_i.hh new file mode 100644 index 000000000..d0afa8461 --- /dev/null +++ b/src/GEOM_I/GEOM_IBooleanOperations_i.hh @@ -0,0 +1,62 @@ +// 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/ +// + +#ifndef _GEOM_IBooleanOperations_i_HeaderFile +#define _GEOM_IBooleanOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IBooleanOperations.hxx" + +class GEOM_IBooleanOperations_i : + public virtual POA_GEOM::GEOM_IBooleanOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IBooleanOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IBooleanOperations* theImpl); + ~GEOM_IBooleanOperations_i(); + + GEOM::GEOM_Object_ptr MakeBoolean (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOp); + + GEOM::GEOM_Object_ptr MakePartition (const GEOM::ListOfGO& theShapes, + const GEOM::ListOfGO& theTools, + const GEOM::ListOfGO& theKeepInside, + const GEOM::ListOfGO& theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + const GEOM::ListOfLong& theMaterials); + + + GEOM::GEOM_Object_ptr MakeHalfPartition (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane); + + ::GEOMImpl_IBooleanOperations* GetOperations() + { return (::GEOMImpl_IBooleanOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.cc b/src/GEOM_I/GEOM_ICurvesOperations_i.cc new file mode 100644 index 000000000..05baaeca8 --- /dev/null +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.cc @@ -0,0 +1,347 @@ +// 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/ +// +#include + +#include "GEOM_ICurvesOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_ICurvesOperations_i::GEOM_ICurvesOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ICurvesOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_ICurvesOperations_i::GEOM_ICurvesOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_ICurvesOperations_i::~GEOM_ICurvesOperations_i() +{ + MESSAGE("GEOM_ICurvesOperations_i::~GEOM_ICurvesOperations_i"); +} + + +//============================================================================= +/*! + * MakeCirclePntVecR + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCirclePntVecR + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theR) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + // Make Circle + Handle(GEOM_Object) anObject = + GetOperations()->MakeCirclePntVecR(aPnt, aVec, theR); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeCircleThreePnt + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCircleThreePnt + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + 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 Circle + Handle(GEOM_Object) anObject = + GetOperations()->MakeCircleThreePnt(aPnt1, aPnt2, aPnt3); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeEllipse + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeEllipse + (GEOM::GEOM_Object_ptr thePnt, GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, double theRMinor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt == NULL || theVec == NULL) return aGEOMObject._retn(); + + //Get the reference points + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePnt->GetStudyID(), thePnt->GetEntry()); + Handle(GEOM_Object) aVec = GetOperations()->GetEngine()->GetObject + (theVec->GetStudyID(), theVec->GetEntry()); + + if (aPnt.IsNull() || aVec.IsNull()) return aGEOMObject._retn(); + + // Make Ellipse + Handle(GEOM_Object) anObject = + GetOperations()->MakeEllipse(aPnt, aVec, theRMajor, theRMinor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeArc + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeArc + (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + 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 Arc + Handle(GEOM_Object) anObject = + GetOperations()->MakeArc(aPnt1, aPnt2, aPnt3); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakePolyline + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakePolyline + (const GEOM::ListOfGO& thePoints) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference point + int ind = 0; + int aLen = thePoints.length(); + list aPoints; + for (; ind < aLen; ind++) { + if (thePoints[ind] == NULL) return aGEOMObject._retn(); + + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePoints[ind]->GetStudyID(), thePoints[ind]->GetEntry()); + + if (aPnt.IsNull()) return aGEOMObject._retn(); + aPoints.push_back(aPnt); + } + + // Make Polyline + Handle(GEOM_Object) anObject = + GetOperations()->MakePolyline(aPoints); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSplineBezier + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineBezier + (const GEOM::ListOfGO& thePoints) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference point + int ind = 0; + int aLen = thePoints.length(); + list aPoints; + for (; ind < aLen; ind++) { + if (thePoints[ind] == NULL) return aGEOMObject._retn(); + + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePoints[ind]->GetStudyID(), thePoints[ind]->GetEntry()); + + if (aPnt.IsNull()) return aGEOMObject._retn(); + aPoints.push_back(aPnt); + } + + // Make Bezier curve + Handle(GEOM_Object) anObject = + GetOperations()->MakeSplineBezier(aPoints); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSplineInterpolation + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation + (const GEOM::ListOfGO& thePoints) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the reference point + int ind = 0; + int aLen = thePoints.length(); + list aPoints; + for (; ind < aLen; ind++) { + if (thePoints[ind] == NULL) return aGEOMObject._retn(); + + Handle(GEOM_Object) aPnt = GetOperations()->GetEngine()->GetObject + (thePoints[ind]->GetStudyID(), thePoints[ind]->GetEntry()); + + if (aPnt.IsNull()) return aGEOMObject._retn(); + aPoints.push_back(aPnt); + } + + // Make Polyline + Handle(GEOM_Object) anObject = + GetOperations()->MakeSplineInterpolation(aPoints); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSketcher + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher + (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind = 0; + int aLen = theWorkingPlane.length(); + list aWorkingPlane; + for (; ind < aLen; ind++) + aWorkingPlane.push_back(theWorkingPlane[ind]); + + // Make Sketcher + Handle(GEOM_Object) anObject = + GetOperations()->MakeSketcher((char*)theCommand, aWorkingPlane); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return GEOM::GEOM_Object::_nil(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MakeSketcherOnPlane + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane + (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + Handle(GEOM_Object) aWorkingPlane = GetOperations()->GetEngine()->GetObject + (theWorkingPlane->GetStudyID(), theWorkingPlane->GetEntry()); + + // Make Sketcher + Handle(GEOM_Object) anObject = + GetOperations()->MakeSketcherOnPlane((char*)theCommand, aWorkingPlane); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return GEOM::GEOM_Object::_nil(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_ICurvesOperations_i.hh b/src/GEOM_I/GEOM_ICurvesOperations_i.hh new file mode 100644 index 000000000..692422980 --- /dev/null +++ b/src/GEOM_I/GEOM_ICurvesOperations_i.hh @@ -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/ +// + +#ifndef _GEOM_ICurvesOperations_i_HeaderFile +#define _GEOM_ICurvesOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_ICurvesOperations.hxx" + +class GEOM_ICurvesOperations_i : + public virtual POA_GEOM::GEOM_ICurvesOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_ICurvesOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ICurvesOperations* theImpl); + ~GEOM_ICurvesOperations_i(); + + GEOM::GEOM_Object_ptr MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + double theR); + + GEOM::GEOM_Object_ptr MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + + GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + double theRMajor, double theRMinor); + + GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + + GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints); + + GEOM::GEOM_Object_ptr MakeSplineBezier (const GEOM::ListOfGO& thePoints); + + GEOM::GEOM_Object_ptr MakeSplineInterpolation (const GEOM::ListOfGO& thePoints); + + GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane); + + GEOM::GEOM_Object_ptr MakeSketcherOnPlane (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane); + + ::GEOMImpl_ICurvesOperations* GetOperations() + { return (::GEOMImpl_ICurvesOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IGroupOperations_i.cc b/src/GEOM_I/GEOM_IGroupOperations_i.cc new file mode 100644 index 000000000..e64e1b26d --- /dev/null +++ b/src/GEOM_I/GEOM_IGroupOperations_i.cc @@ -0,0 +1,330 @@ +// 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/ +// +#include + +#include "GEOM_IGroupOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IGroupOperations_i::GEOM_IGroupOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IGroupOperations* theImpl) + :GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IGroupOperations_i::GEOM_IGroupOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IGroupOperations_i::~GEOM_IGroupOperations_i() +{ + MESSAGE("GEOM_IGroupOperations_i::~GEOM_IGroupOperations_i"); +} + + +//============================================================================= +/*! + * CreateGroup + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::CreateGroup(GEOM::GEOM_Object_ptr theMainShape, CORBA::Long theShapeType) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theMainShape == NULL || theShapeType < 0) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject(theMainShape->GetStudyID(), theMainShape->GetEntry()); + + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Create the Fillet + Handle(GEOM_Object) anObject = GetOperations()->CreateGroup(aShapeRef, (TopAbs_ShapeEnum)theShapeType); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * AddObject + */ +//============================================================================= +void GEOM_IGroupOperations_i::AddObject(GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject(theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + GetOperations()->AddObject(aGroupRef, theSubShapeId); + return; +} + +//============================================================================= +/*! + * RemoveObject + */ +//============================================================================= +void GEOM_IGroupOperations_i::RemoveObject(GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject(theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + GetOperations()->RemoveObject(aGroupRef, theSubShapeId); + + return; +} + +//============================================================================= +/*! + * UnionList + */ +//============================================================================= +void GEOM_IGroupOperations_i::UnionList (GEOM::GEOM_Object_ptr theGroup, + const GEOM::ListOfGO& theSubShapes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject + (theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + //Get sub-shape to add + Handle(TColStd_HSequenceOfTransient) aSubShapes = new TColStd_HSequenceOfTransient; + + int ind, aLen = theSubShapes.length(); + for (ind = 0; ind < aLen; ind++) { + if (theSubShapes[ind] == NULL) return; + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theSubShapes[ind]->GetStudyID(), theSubShapes[ind]->GetEntry()); + if (aSh.IsNull()) return; + aSubShapes->Append(aSh); + } + + //Perform the operation + GetOperations()->UnionList(aGroupRef, aSubShapes); + return; +} + +//============================================================================= +/*! + * DifferenceList + */ +//============================================================================= +void GEOM_IGroupOperations_i::DifferenceList (GEOM::GEOM_Object_ptr theGroup, + const GEOM::ListOfGO& theSubShapes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject + (theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + //Get sub-shape to remove + Handle(TColStd_HSequenceOfTransient) aSubShapes = new TColStd_HSequenceOfTransient; + + int ind, aLen = theSubShapes.length(); + for (ind = 0; ind < aLen; ind++) { + if (theSubShapes[ind] == NULL) return; + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theSubShapes[ind]->GetStudyID(), theSubShapes[ind]->GetEntry()); + if (aSh.IsNull()) return; + aSubShapes->Append(aSh); + } + + //Perform the operation + GetOperations()->DifferenceList(aGroupRef, aSubShapes); + return; +} + +//============================================================================= +/*! + * UnionIDs + */ +//============================================================================= +void GEOM_IGroupOperations_i::UnionIDs (GEOM::GEOM_Object_ptr theGroup, + const GEOM::ListOfLong& theSubShapes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject + (theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + //Get sub-shape to add + Handle(TColStd_HSequenceOfInteger) aSubShapes = new TColStd_HSequenceOfInteger; + + int ind, aLen = theSubShapes.length(); + for (ind = 0; ind < aLen; ind++) { + aSubShapes->Append(theSubShapes[ind]); + } + + //Perform the operation + GetOperations()->UnionIDs(aGroupRef, aSubShapes); + return; +} + +//============================================================================= +/*! + * DifferenceIDs + */ +//============================================================================= +void GEOM_IGroupOperations_i::DifferenceIDs (GEOM::GEOM_Object_ptr theGroup, + const GEOM::ListOfLong& theSubShapes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject + (theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return; + + //Get sub-shape to remove + Handle(TColStd_HSequenceOfInteger) aSubShapes = new TColStd_HSequenceOfInteger; + + int ind, aLen = theSubShapes.length(); + for (ind = 0; ind < aLen; ind++) { + aSubShapes->Append(theSubShapes[ind]); + } + + //Perform the operation + GetOperations()->DifferenceIDs(aGroupRef, aSubShapes); + return; +} + +//============================================================================= +/*! + * GetType + */ +//============================================================================= +CORBA::Long GEOM_IGroupOperations_i::GetType(GEOM::GEOM_Object_ptr theGroup) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return -1; + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject(theGroup->GetStudyID(), theGroup->GetEntry()); + + if (aGroupRef.IsNull()) return -1; + + return GetOperations()->GetType(aGroupRef); +} + +//============================================================================= +/*! + * GetMainShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IGroupOperations_i::GetMainShape(GEOM::GEOM_Object_ptr theGroup) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return aGEOMObject._retn(); + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject(theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return aGEOMObject._retn(); + + Handle(GEOM_Object) anObject = GetOperations()->GetMainShape(aGroupRef); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetObjects + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IGroupOperations_i::GetObjects(GEOM::GEOM_Object_ptr theGroup) +{ + GEOM::ListOfLong_var aList; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theGroup == NULL) return aList._retn(); + + //Get the reference group + Handle(GEOM_Object) aGroupRef = GetOperations()->GetEngine()->GetObject(theGroup->GetStudyID(), theGroup->GetEntry()); + if (aGroupRef.IsNull()) return aList._retn(); + + aList = new GEOM::ListOfLong; + + Handle(TColStd_HArray1OfInteger) aSeq = GetOperations()->GetObjects(aGroupRef); + if (!GetOperations()->IsDone() || aSeq.IsNull()) return aList._retn(); + + aList->length(aSeq->Length()); + for(int i = 1; i<=aSeq->Length(); i++) aList[i-1] = aSeq->Value(i); + + return aList._retn(); +} + diff --git a/src/GEOM_I/GEOM_IGroupOperations_i.hh b/src/GEOM_I/GEOM_IGroupOperations_i.hh new file mode 100644 index 000000000..4273c731d --- /dev/null +++ b/src/GEOM_I/GEOM_IGroupOperations_i.hh @@ -0,0 +1,66 @@ +// 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/ +// + +#ifndef _GEOM_IGroupOperations_i_HeaderFile +#define _GEOM_IGroupOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IGroupOperations.hxx" + +class GEOM_IGroupOperations_i : + public virtual POA_GEOM::GEOM_IGroupOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IGroupOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IGroupOperations* theImpl); + ~GEOM_IGroupOperations_i(); + + GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, CORBA::Long theShapeType); + + void AddObject (GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId); + + void RemoveObject (GEOM::GEOM_Object_ptr theGroup, CORBA::Long theSubShapeId); + + void UnionList (GEOM::GEOM_Object_ptr theGroup, const GEOM::ListOfGO& theSubShapes); + + void DifferenceList (GEOM::GEOM_Object_ptr theGroup, const GEOM::ListOfGO& theSubShapes); + + void UnionIDs (GEOM::GEOM_Object_ptr theGroup, const GEOM::ListOfLong& theSubShapes); + + void DifferenceIDs (GEOM::GEOM_Object_ptr theGroup, const GEOM::ListOfLong& theSubShapes); + + CORBA::Long GetType (GEOM::GEOM_Object_ptr theGroup); + + GEOM::GEOM_Object_ptr GetMainShape (GEOM::GEOM_Object_ptr theGroup); + + GEOM::ListOfLong* GetObjects (GEOM::GEOM_Object_ptr theGroup); + + ::GEOMImpl_IGroupOperations* GetOperations() + { return (::GEOMImpl_IGroupOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.cc b/src/GEOM_I/GEOM_IHealingOperations_i.cc new file mode 100644 index 000000000..30f823a51 --- /dev/null +++ b/src/GEOM_I/GEOM_IHealingOperations_i.cc @@ -0,0 +1,456 @@ +// 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/ +// +#include + +#include + +#include "GEOM_IHealingOperations_i.hh" +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOM_IHealingOperations_i::GEOM_IHealingOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IHealingOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IHealingOperations_i::GEOM_IHealingOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOM_IHealingOperations_i::~GEOM_IHealingOperations_i() +{ + MESSAGE("GEOM_IHealingOperations_i::~GEOM_IHealingOperations_i"); +} + +//============================================================================= +/*! + * Convert + */ +//============================================================================= +Handle(TColStd_HArray1OfInteger) GEOM_IHealingOperations_i::Convert + (const GEOM::short_array& theInArray) +{ + Handle(TColStd_HArray1OfInteger) anOutArray; + int n = theInArray.length(); + if ( n <= 0 ) + return anOutArray; + anOutArray = new TColStd_HArray1OfInteger( 1, n ); + for (int i = 0; i < n; i++) + anOutArray->SetValue( i+1, theInArray[i] ); + return anOutArray; +} + +//============================================================================= +/*! + * Convert + */ +//============================================================================= +Handle(TColStd_HArray1OfExtendedString) GEOM_IHealingOperations_i::Convert + (const GEOM::string_array& theInArray) +{ + Handle(TColStd_HArray1OfExtendedString) anOutArray; + int n = theInArray.length(); + if ( n <= 0 ) + return anOutArray; + anOutArray = new TColStd_HArray1OfExtendedString( 1, n ); + char* str; + for ( int i = 0; i < n; i++ ) + { + str = CORBA::string_dup( theInArray[i] ); + anOutArray->SetValue( i+1, TCollection_ExtendedString( str ) ); + } + return anOutArray; +} + +//============================================================================= +/*! + * ProcessShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::ProcessShape (GEOM::GEOM_Object_ptr theObject, + const GEOM::string_array& theOperations, + const GEOM::string_array& theParams, + const GEOM::string_array& theValues) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) + return aGEOMObject._retn(); + + // Check if theOperations has more than 0 elements and theParams and theValues have the same length +// if ( theOperations.length() <= 0 || theParams.length() != theValues.length() ) +// return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if ( anObject.IsNull() ) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = GetOperations()->ShapeProcess( anObject, + Convert( theOperations ), Convert( theParams ), Convert( theValues ) ); + if ( !GetOperations()->IsDone() || aNewObject.IsNull() ) + return aGEOMObject._retn(); + + return GetObject( aNewObject ); +} + +//============================================================================= +/*! + * GetShapeProcessParameters + */ +//============================================================================= +void GEOM_IHealingOperations_i::GetShapeProcessParameters(GEOM::string_array_out theOperations, + GEOM::string_array_out theParams, + GEOM::string_array_out theValues) +{ + GEOM::string_array_var anOpArray = new GEOM::string_array(); + GEOM::string_array_var aParArray = new GEOM::string_array(); + GEOM::string_array_var aValArray = new GEOM::string_array(); + + // retrieve the values as stl-lists + list operationsList, paramsList, valuesList; + GetOperations()->GetShapeProcessParameters( operationsList, paramsList, valuesList ); + const int opSize = operationsList.size(), + parSize = paramsList.size(), + valSize = valuesList.size(); + + if ( opSize >= 0 && parSize >= 0 && parSize == valSize ) { + // allocate the CORBA arrays, sizes == returned lists' sizes + anOpArray->length(opSize); + aParArray->length(parSize); + aValArray->length(valSize); + + // fill the local CORBA arrays with values from lists + list::iterator opIt, parIt, valIt; + int i = 0; + for ( opIt = operationsList.begin(); opIt != operationsList.end(); i++,++opIt ) + anOpArray[i] = CORBA::string_dup( (*opIt).c_str() ); + + for ( i = 0, parIt = paramsList.begin(), valIt = valuesList.begin(); + parIt != paramsList.end(); i++, ++parIt,++valIt ) { + aParArray[i] = CORBA::string_dup( (*parIt).c_str() ); + aValArray[i] = CORBA::string_dup( (*valIt).c_str() ); + } + } + + // initialize out-parameters with local arrays + theOperations = anOpArray._retn(); + theParams = aParArray._retn(); + theValues = aValArray._retn(); +} + +//============================================================================= +/*! + * GetOperatorParameters + */ +//============================================================================= +void GEOM_IHealingOperations_i::GetOperatorParameters (const char* theOperator, + GEOM::string_array_out theParams, + GEOM::string_array_out theValues) +{ + GEOM::string_array_var aParArray = new GEOM::string_array(); + GEOM::string_array_var aValArray = new GEOM::string_array(); + + // retrieve the values as stl-lists + list paramsList, valuesList; + if ( GetOperations()->GetOperatorParameters( theOperator, paramsList, valuesList ) ) { + const int parSize = paramsList.size(), valSize = valuesList.size(); + + if ( parSize == valSize ) { + aParArray->length(parSize); + aValArray->length(valSize); + + // fill the local CORBA arrays with values from lists + list::iterator parIt, valIt; + int i; + for ( i = 0, parIt = paramsList.begin(), valIt = valuesList.begin(); + parIt != paramsList.end(); i++, ++parIt,++valIt ) { + aParArray[i] = CORBA::string_dup( (*parIt).c_str() ); + aValArray[i] = CORBA::string_dup( (*valIt).c_str() ); + } + } + } + + // initialize out-parameters with local arrays + theParams = aParArray._retn(); + theValues = aValArray._retn(); +} + +//============================================================================= +/*! + * SuppressFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::SuppressFaces (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theFaces) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) // if theFaces is empty - it's OK, it means that ALL faces must be removed + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->SuppressFaces( anObject, Convert( theFaces ) ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject( aNewObject ); +} + +//============================================================================= +/*! + * CloseContour + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::CloseContour (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires, + CORBA::Boolean isCommonVertex) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->CloseContour( anObject, Convert( theWires ), isCommonVertex ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * RemoveIntWires + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::RemoveIntWires (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) // if theWires is empty - it's OK, it means that ALL wires should be removed + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->RemoveIntWires( anObject, Convert( theWires ) ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * FillHoles + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::FillHoles (GEOM::GEOM_Object_ptr theObject, + const GEOM::short_array& theWires) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) ) // if theWires is empty - it's OK, it means that ALL wires should be removed + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->FillHoles( anObject, Convert( theWires ) ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * Sew + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::Sew (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theTolerance) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) || theTolerance < 0 ) + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->Sew( anObject, theTolerance ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * DivideEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IHealingOperations_i::DivideEdge (GEOM::GEOM_Object_ptr theObject, + CORBA::Short theIndex, + CORBA::Double theValue, + CORBA::Boolean isByParameter) +{ + GEOM::GEOM_Object_var aGEOMObject; + + // Set a not done flag + GetOperations()->SetNotDone(); + + // Check parameters + if ( CORBA::is_nil(theObject) || theValue < 0 || theValue > 1 ) + return aGEOMObject._retn(); + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return aGEOMObject._retn(); + + // Perform + Handle(GEOM_Object) aNewObject = + GetOperations()->DivideEdge( anObject, theIndex, theValue, isByParameter ); + if (!GetOperations()->IsDone() || aNewObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(aNewObject); +} + +//============================================================================= +/*! + * GetFreeBoundary + */ +//============================================================================= +CORBA::Boolean GEOM_IHealingOperations_i::GetFreeBoundary ( GEOM::GEOM_Object_ptr theObject, + GEOM::ListOfGO_out theClosedWires, + GEOM::ListOfGO_out theOpenWires ) +{ + theClosedWires = new GEOM::ListOfGO; + theOpenWires = new GEOM::ListOfGO; + + // Set a not done flag + GetOperations()->SetNotDone(); + + if ( CORBA::is_nil(theObject) ) + return false; + + // Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) + return false; + + Handle(TColStd_HSequenceOfTransient) aClosed = new TColStd_HSequenceOfTransient(); + Handle(TColStd_HSequenceOfTransient) anOpen = new TColStd_HSequenceOfTransient(); + bool res = GetOperations()->GetFreeBoundary( anObject, aClosed, anOpen ); + + if ( !GetOperations()->IsDone() || !res ) + return false; + + int i, n = aClosed->Length(); + theClosedWires->length( n ); + for ( i = 1; i <= n; i++ ) + (*theClosedWires)[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aClosed->Value(i))); + + n = anOpen->Length(); + theOpenWires->length( n ); + for ( i = 1, n = anOpen->Length(); i <= n; i++ ) + (*theOpenWires)[i-1] = GetObject(Handle(GEOM_Object)::DownCast(anOpen->Value(i))); + + return true; +} diff --git a/src/GEOM_I/GEOM_IHealingOperations_i.hh b/src/GEOM_I/GEOM_IHealingOperations_i.hh new file mode 100644 index 000000000..855059540 --- /dev/null +++ b/src/GEOM_I/GEOM_IHealingOperations_i.hh @@ -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/ +// + +#ifndef _GEOM_IHealingOperations_i_HeaderFile +#define _GEOM_IHealingOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IHealingOperations.hxx" + +#include +#include + +class GEOM_IHealingOperations_i : + public virtual POA_GEOM::GEOM_IHealingOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IHealingOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOMImpl_IHealingOperations* theImpl); + ~GEOM_IHealingOperations_i(); + + GEOM::GEOM_Object_ptr ProcessShape(GEOM::GEOM_Object_ptr theObject, const GEOM::string_array& theOperations, const GEOM::string_array& theParams, const GEOM::string_array& theValues); + + void GetShapeProcessParameters(GEOM::string_array_out theOperations, GEOM::string_array_out theParams, GEOM::string_array_out theValues); + + void GetOperatorParameters (const char* theOperator, GEOM::string_array_out theParams, GEOM::string_array_out theValues); + + GEOM::GEOM_Object_ptr SuppressFaces(GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theFaces); + + GEOM::GEOM_Object_ptr CloseContour (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires, CORBA::Boolean isCommonVertex); + + GEOM::GEOM_Object_ptr RemoveIntWires (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires); + + GEOM::GEOM_Object_ptr FillHoles (GEOM::GEOM_Object_ptr theObject, const GEOM::short_array& theWires); + + GEOM::GEOM_Object_ptr Sew (GEOM::GEOM_Object_ptr theObject, CORBA::Double theTolerance); + + GEOM::GEOM_Object_ptr DivideEdge (GEOM::GEOM_Object_ptr theObject, CORBA::Short theIndex, CORBA::Double theValue, CORBA::Boolean isByParameter); + + CORBA::Boolean GetFreeBoundary(GEOM::GEOM_Object_ptr theObject, GEOM::ListOfGO_out theClosedWires, GEOM::ListOfGO_out theOpenWires ); + + ::GEOMImpl_IHealingOperations* GetOperations() { return (::GEOMImpl_IHealingOperations*)GetImpl(); } + +private: + Handle(TColStd_HArray1OfExtendedString) Convert( const GEOM::string_array& ); + Handle(TColStd_HArray1OfInteger) Convert( const GEOM::short_array& ); + +}; + +#endif diff --git a/src/GEOM_I/GEOM_IInsertOperations_i.cc b/src/GEOM_I/GEOM_IInsertOperations_i.cc new file mode 100644 index 000000000..7388c8269 --- /dev/null +++ b/src/GEOM_I/GEOM_IInsertOperations_i.cc @@ -0,0 +1,219 @@ +// 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/ +// +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +#include + +#include "GEOM_IInsertOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IInsertOperations_i::GEOM_IInsertOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IInsertOperations* theImpl) + :GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IInsertOperations_i::GEOM_IInsertOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IInsertOperations_i::~GEOM_IInsertOperations_i() +{ + MESSAGE("GEOM_IInsertOperations_i::~GEOM_IInsertOperations_i"); +} + + +//============================================================================= +/*! + * MakeCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IInsertOperations_i::MakeCopy(GEOM::GEOM_Object_ptr theOriginal) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theOriginal == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) anOriginal = + GetOperations()->GetEngine()->GetObject(theOriginal->GetStudyID(), + theOriginal->GetEntry()); + + if (anOriginal.IsNull()) return aGEOMObject._retn(); + + //Create the copy + Handle(GEOM_Object) anObject = GetOperations()->MakeCopy(anOriginal); + + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * Export + */ +//============================================================================= +void GEOM_IInsertOperations_i::Export + (GEOM::GEOM_Object_ptr theOriginal, + const char* theFileName, + const char* theFormatName) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theOriginal); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theOriginal == NULL) return; + + //Get the reference shape + Handle(GEOM_Object) anOriginal = + GetOperations()->GetEngine()->GetObject(theOriginal->GetStudyID(), + theOriginal->GetEntry()); + + if (anOriginal.IsNull()) return; + + //Export the shape to the file + char* aFileName = strdup(theFileName); + char* aFormatName = strdup(theFormatName); + GetOperations()->Export(anOriginal, aFileName, aFormatName); + free(aFileName); + free(aFormatName); + + return; +} + +//============================================================================= +/*! + * Import + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IInsertOperations_i::Import + (const char* theFileName, + const char* theFormatName) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Import the shape from the file + char* aFileName = strdup(theFileName); + char* aFormatName = strdup(theFormatName); + Handle(GEOM_Object) anObject = GetOperations()->Import(aFileName, aFormatName); + free(aFileName); + free(aFormatName); + + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * ImportTranslators + */ +//============================================================================= +void GEOM_IInsertOperations_i::ImportTranslators + (GEOM::string_array_out theFormats, GEOM::string_array_out thePatterns) +{ + // allocate the CORBA arrays + GEOM::string_array_var aFormatsArray = new GEOM::string_array(); + GEOM::string_array_var aPatternsArray = new GEOM::string_array(); + + // Get sequences of available formats + Handle(TColStd_HSequenceOfAsciiString) aFormats = new TColStd_HSequenceOfAsciiString; + Handle(TColStd_HSequenceOfAsciiString) aPatterns = new TColStd_HSequenceOfAsciiString; + if (GetOperations()->ImportTranslators(aFormats, aPatterns)) { + const int formSize = aFormats->Length(); + if (formSize == aPatterns->Length()) { + aFormatsArray->length(formSize); + aPatternsArray->length(formSize); + + // fill the local CORBA arrays with values from sequences + CORBA::Long i = 1; + for (; i <= formSize; i++) { + aFormatsArray[i-1] = CORBA::string_dup(aFormats->Value(i).ToCString()); + aPatternsArray[i-1] = CORBA::string_dup(aPatterns->Value(i).ToCString()); + } + } + } + + // initialize out-parameters with local arrays + theFormats = aFormatsArray._retn(); + thePatterns = aPatternsArray._retn(); +} + +//============================================================================= +/*! + * ExportTranslators + */ +//============================================================================= +void GEOM_IInsertOperations_i::ExportTranslators + (GEOM::string_array_out theFormats, GEOM::string_array_out thePatterns) +{ + // allocate the CORBA arrays + GEOM::string_array_var aFormatsArray = new GEOM::string_array(); + GEOM::string_array_var aPatternsArray = new GEOM::string_array(); + + // Get sequences of available formats + Handle(TColStd_HSequenceOfAsciiString) aFormats = new TColStd_HSequenceOfAsciiString; + Handle(TColStd_HSequenceOfAsciiString) aPatterns = new TColStd_HSequenceOfAsciiString; + if (GetOperations()->ExportTranslators(aFormats, aPatterns)) { + const int formSize = aFormats->Length(); + if (formSize == aPatterns->Length()) { + aFormatsArray->length(formSize); + aPatternsArray->length(formSize); + + // fill the local CORBA arrays with values from sequences + CORBA::Long i = 1; + for (; i <= formSize; i++) { + aFormatsArray[i-1] = CORBA::string_dup(aFormats->Value(i).ToCString()); + aPatternsArray[i-1] = CORBA::string_dup(aPatterns->Value(i).ToCString()); + } + } + } + + // initialize out-parameters with local arrays + theFormats = aFormatsArray._retn(); + thePatterns = aPatternsArray._retn(); +} diff --git a/src/GEOM_I/GEOM_IInsertOperations_i.hh b/src/GEOM_I/GEOM_IInsertOperations_i.hh new file mode 100644 index 000000000..ad98c51de --- /dev/null +++ b/src/GEOM_I/GEOM_IInsertOperations_i.hh @@ -0,0 +1,61 @@ +// 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/ +// + +#ifndef _GEOM_IInsertOperations_i_HeaderFile +#define _GEOM_IInsertOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IInsertOperations.hxx" + +class GEOM_IInsertOperations_i : + public virtual POA_GEOM::GEOM_IInsertOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IInsertOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IInsertOperations* theImpl); + ~GEOM_IInsertOperations_i(); + + GEOM::GEOM_Object_ptr MakeCopy (GEOM::GEOM_Object_ptr theOriginal); + + void Export (GEOM::GEOM_Object_ptr theOriginal, + const char* theFileName, + const char* theFormatName); + + GEOM::GEOM_Object_ptr Import (const char* theFileName, + const char* theFormatName); + + void ImportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns); + + void ExportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns); + + ::GEOMImpl_IInsertOperations* GetOperations() + { return (::GEOMImpl_IInsertOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_ILocalOperations_i.cc b/src/GEOM_I/GEOM_ILocalOperations_i.cc new file mode 100644 index 000000000..f91cb437f --- /dev/null +++ b/src/GEOM_I/GEOM_ILocalOperations_i.cc @@ -0,0 +1,294 @@ +// 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/ +// +#include + +#include "GEOM_ILocalOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_ILocalOperations_i::GEOM_ILocalOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ILocalOperations* theImpl) + :GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_ILocalOperations_i::GEOM_ILocalOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_ILocalOperations_i::~GEOM_ILocalOperations_i() +{ + MESSAGE("GEOM_ILocalOperations_i::~GEOM_ILocalOperations_i"); +} + + +//============================================================================= +/*! + * MakeFilletAll + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeFilletAll + (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Create the Fillet + Handle(GEOM_Object) anObject = + GetOperations()->MakeFilletAll(aShapeRef, theR); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFilletEdges + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeFilletEdges + (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theEdges) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Get the reference edges + int ind = 0; + int aLen = theEdges.length(); + list anEdges; + for (; ind < aLen; ind++) { + anEdges.push_back(theEdges[ind]); + } + + //Create the Fillet + Handle(GEOM_Object) anObject = + GetOperations()->MakeFilletEdges(aShapeRef, theR, anEdges); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFilletFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeFilletFaces + (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theFaces) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Get the reference faces + int ind = 0; + int aLen = theFaces.length(); + list aFaces; + for (; ind < aLen; ind++) { + aFaces.push_back(theFaces[ind]); + } + + //Create the Fillet + Handle(GEOM_Object) anObject = + GetOperations()->MakeFilletFaces(aShapeRef, theR, aFaces); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeChamferAll + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeChamferAll + (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Create the Chamfer + Handle(GEOM_Object) anObject = + GetOperations()->MakeChamferAll(aShapeRef, theD); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeChamferEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeChamferEdge + (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + CORBA::Long theFace1, CORBA::Long theFace2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Create the Chamfer + Handle(GEOM_Object) anObject = + GetOperations()->MakeChamferEdge(aShapeRef, theD1, theD2, theFace1, theFace2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeChamferFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeChamferFaces + (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + const GEOM::ListOfLong& theFaces) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Get the reference faces + int ind = 0; + int aLen = theFaces.length(); + list aFaces; + for (; ind < aLen; ind++) { + aFaces.push_back(theFaces[ind]); + } + + //Create the Chamfer + Handle(GEOM_Object) anObject = + GetOperations()->MakeChamferFaces(aShapeRef, theD1, theD2, aFaces); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeArchimede + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ILocalOperations_i::MakeArchimede (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theWeight, + CORBA::Double theWaterDensity, + CORBA::Double theMeshingDeflection) +{ + GEOM::GEOM_Object_var aGEOMObject; + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + if (aShapeRef.IsNull()) return aGEOMObject._retn(); + + //Create the Archimede + Handle(GEOM_Object) anObject = GetOperations()->MakeArchimede + (aShapeRef, theWeight, theWaterDensity, theMeshingDeflection); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetSubShapeIndex + */ +//============================================================================= +CORBA::Long GEOM_ILocalOperations_i::GetSubShapeIndex + (GEOM::GEOM_Object_ptr theShape, GEOM::GEOM_Object_ptr theSubShape) +{ + if (theShape == NULL || theSubShape == NULL) return -1; + + //Get the reference shapes + Handle(GEOM_Object) aShapeRef = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aSubShapeRef = GetOperations()->GetEngine()->GetObject + (theSubShape->GetStudyID(), theSubShape->GetEntry()); + if (aShapeRef.IsNull() || aSubShapeRef.IsNull()) return -1; + + //Get the unique ID of inside + CORBA::Long anID = GetOperations()->GetSubShapeIndex(aShapeRef, aSubShapeRef); + if (!GetOperations()->IsDone()) + return -1; + + return anID; +} diff --git a/src/GEOM_I/GEOM_ILocalOperations_i.hh b/src/GEOM_I/GEOM_ILocalOperations_i.hh new file mode 100644 index 000000000..35eab0de9 --- /dev/null +++ b/src/GEOM_I/GEOM_ILocalOperations_i.hh @@ -0,0 +1,69 @@ +// 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/ +// + +#ifndef _GEOM_ILocalOperations_i_HeaderFile +#define _GEOM_ILocalOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_ILocalOperations.hxx" + +class GEOM_ILocalOperations_i : + public virtual POA_GEOM::GEOM_ILocalOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_ILocalOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ILocalOperations* theImpl); + ~GEOM_ILocalOperations_i(); + + GEOM::GEOM_Object_ptr MakeFilletAll (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeFilletEdges (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theEdges); + GEOM::GEOM_Object_ptr MakeFilletFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + const GEOM::ListOfLong& theFaces); + + GEOM::GEOM_Object_ptr MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD); + GEOM::GEOM_Object_ptr MakeChamferEdge (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + CORBA::Long theFace1, CORBA::Long theFace2); + GEOM::GEOM_Object_ptr MakeChamferFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + const GEOM::ListOfLong& theFaces); + + GEOM::GEOM_Object_ptr MakeArchimede (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theWeight, + CORBA::Double theWaterDensity, + CORBA::Double theMeshingDeflection); + + CORBA::Long GetSubShapeIndex (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theSubShape); + + ::GEOMImpl_ILocalOperations* GetOperations() + { return (::GEOMImpl_ILocalOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc new file mode 100644 index 000000000..1564bd5b7 --- /dev/null +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -0,0 +1,305 @@ +// 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/ +// +#include + +#include "GEOM_IMeasureOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IMeasureOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IMeasureOperations_i::GEOM_IMeasureOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i() +{ + MESSAGE("GEOM_IMeasureOperations_i::~GEOM_IMeasureOperations_i"); +} + + +//============================================================================= +/*! + * GetCentreOfMass + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IMeasureOperations_i::GetCentreOfMass + (GEOM::GEOM_Object_ptr theShape) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return aGEOMObject._retn(); + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return aGEOMObject._retn(); + + // Make Point - centre of mass of theShape + Handle(GEOM_Object) anObject = GetOperations()->GetCentreOfMass(aShape); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetBasicProperties + */ +//============================================================================= +void GEOM_IMeasureOperations_i::GetBasicProperties (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& theLength, + CORBA::Double& theSurfArea, + CORBA::Double& theVolume) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return; + + // Get shape parameters + GetOperations()->GetBasicProperties(aShape, theLength, theSurfArea, theVolume); +} + +//============================================================================= +/*! + * GetInertia + */ +//============================================================================= +void GEOM_IMeasureOperations_i::GetInertia + (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13, + CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23, + CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33, + CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return; + + // Get shape parameters + GetOperations()->GetInertia(aShape, + I11, I12, I13, + I21, I22, I23, + I31, I32, I33, + Ix , Iy , Iz); +} + +//============================================================================= +/*! + * GetBoundingBox + */ +//============================================================================= +void GEOM_IMeasureOperations_i::GetBoundingBox (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& Xmin, CORBA::Double& Xmax, + CORBA::Double& Ymin, CORBA::Double& Ymax, + CORBA::Double& Zmin, CORBA::Double& Zmax) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return; + + // Get shape parameters + GetOperations()->GetBoundingBox(aShape, Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); +} + +//============================================================================= +/*! + * GetTolerance + */ +//============================================================================= +void GEOM_IMeasureOperations_i::GetTolerance + (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& FaceMin, CORBA::Double& FaceMax, + CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, + CORBA::Double& VertMin, CORBA::Double& VertMax) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return; + + // Get shape parameters + GetOperations()->GetTolerance(aShape, + FaceMin, FaceMax, + EdgeMin, EdgeMax, + VertMin, VertMax); +} + +//============================================================================= +/*! + * CheckShape + */ +//============================================================================= +CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape (GEOM::GEOM_Object_ptr theShape, + CORBA::String_out theDescription) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) + { + theDescription = CORBA::string_dup("null"); + return 0; + } + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) + { + theDescription = CORBA::string_dup("null2"); + return 0; + } + + // Get shape parameters + TCollection_AsciiString aDump; + if (GetOperations()->CheckShape(aShape, aDump)) + { + theDescription = CORBA::string_dup("OK"); + return 1; + } + theDescription = CORBA::string_dup(aDump.ToCString()); + return 0; +} + +//============================================================================= +/*! + * WhatIs + */ +//============================================================================= +char* GEOM_IMeasureOperations_i::WhatIs (GEOM::GEOM_Object_ptr theShape) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL) return NULL; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + if (aShape.IsNull()) return NULL; + + // Get shape parameters + TCollection_AsciiString aDescription = GetOperations()->WhatIs(aShape); + return strdup(aDescription.ToCString()); +} + +//============================================================================= +/*! + * GetMinDistance + */ +//============================================================================= +CORBA::Double GEOM_IMeasureOperations_i::GetMinDistance + (GEOM::GEOM_Object_ptr theShape1, GEOM::GEOM_Object_ptr theShape2, + CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1, + CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape1 == NULL || theShape2 == NULL) return -1.0; + + //Get the reference shape + Handle(GEOM_Object) aShape1 = GetOperations()->GetEngine()->GetObject + (theShape1->GetStudyID(), theShape1->GetEntry()); + Handle(GEOM_Object) aShape2 = GetOperations()->GetEngine()->GetObject + (theShape2->GetStudyID(), theShape2->GetEntry()); + + if (aShape1.IsNull() || aShape2.IsNull()) return -1.0; + + // Get shape parameters + return GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2); +} + +//============================================================================= +/*! + * PointCoordinates + */ +//============================================================================= +void GEOM_IMeasureOperations_i::PointCoordinates( + GEOM::GEOM_Object_ptr theShape, CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z ) + +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + if ( theShape->_is_nil() ) + return; + + //Get the reference shape + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject( + theShape->GetStudyID(), theShape->GetEntry() ); + + if ( aShape.IsNull() ) + return; + + // Get shape parameters + GetOperations()->PointCoordinates( aShape, X, Y, Z ); +} diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh new file mode 100644 index 000000000..81639bfc0 --- /dev/null +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -0,0 +1,83 @@ +// 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/ +// + +#ifndef _GEOM_IMeasureOperations_i_HeaderFile +#define _GEOM_IMeasureOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IMeasureOperations.hxx" + +class GEOM_IMeasureOperations_i : + public virtual POA_GEOM::GEOM_IMeasureOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IMeasureOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IMeasureOperations* theImpl); + ~GEOM_IMeasureOperations_i(); + + void GetBasicProperties (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& theLength, + CORBA::Double& theSurfArea, + CORBA::Double& theVolume); + + GEOM::GEOM_Object_ptr GetCentreOfMass (GEOM::GEOM_Object_ptr theShape); + + void GetInertia (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& I11, CORBA::Double& I12, CORBA::Double& I13, + CORBA::Double& I21, CORBA::Double& I22, CORBA::Double& I23, + CORBA::Double& I31, CORBA::Double& I32, CORBA::Double& I33, + CORBA::Double& Ix , CORBA::Double& Iy , CORBA::Double& Iz); + + void GetBoundingBox (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& Xmin, CORBA::Double& Xmax, + CORBA::Double& Ymin, CORBA::Double& Ymax, + CORBA::Double& Zmin, CORBA::Double& Zmax); + + void GetTolerance (GEOM::GEOM_Object_ptr theShape, + CORBA::Double& FaceMin, CORBA::Double& FaceMax, + CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, + CORBA::Double& VertMin, CORBA::Double& VertMax); + + CORBA::Boolean CheckShape (GEOM::GEOM_Object_ptr theShape, + CORBA::String_out theDescription); + + char* WhatIs (GEOM::GEOM_Object_ptr theShape); + + CORBA::Double GetMinDistance (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Double& X1, CORBA::Double& Y1, CORBA::Double& Z1, + CORBA::Double& X2, CORBA::Double& Y2, CORBA::Double& Z2); + + + void PointCoordinates( GEOM::GEOM_Object_ptr theShape, + CORBA::Double& X, CORBA::Double& Y, CORBA::Double& Z ); + + ::GEOMImpl_IMeasureOperations* GetOperations() + { return (::GEOMImpl_IMeasureOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_IOperations_i.cc b/src/GEOM_I/GEOM_IOperations_i.cc new file mode 100644 index 000000000..8170be2f7 --- /dev/null +++ b/src/GEOM_I/GEOM_IOperations_i.cc @@ -0,0 +1,138 @@ +// 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/ +// +#include "GEOM_IOperations_i.hh" + +#include "GEOM_Engine.hxx" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include +#include +#include + +//============================================================================= +/*! + * default constructor: + */ +//============================================================================= + +GEOM_IOperations_i::GEOM_IOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOM_IOperations* theImpl) +:SALOME::GenericObj_i( thePOA ), _impl(theImpl), _engine(theEngine) +{ + thePOA->activate_object(this); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOM_IOperations_i::~GEOM_IOperations_i() +{} + + +//============================================================================= +/*! + * IsDone + */ +//============================================================================= +CORBA::Boolean GEOM_IOperations_i::IsDone() +{ + return _impl->IsDone(); +} + + +//============================================================================= +/*! + * SetErrorCode + */ +//============================================================================= +void GEOM_IOperations_i::SetErrorCode(const char* theErrorCode) +{ + _impl->SetErrorCode((char*)theErrorCode); +} + +//============================================================================= +/*! + * GetErrorCode + */ +//============================================================================= +char* GEOM_IOperations_i::GetErrorCode() +{ + return CORBA::string_dup(_impl->GetErrorCode()); +} + +//============================================================================= +/*! + * GetStudyID + */ +//============================================================================= +CORBA::Long GEOM_IOperations_i::GetStudyID() +{ + return _impl->GetDocID(); +} + +//============================================================================= +/*! + * StartOperation + */ +//============================================================================= +void GEOM_IOperations_i::StartOperation() +{ + _impl->StartOperation(); +} + +//============================================================================= +/*! + * FinishOperation + */ +//============================================================================= +void GEOM_IOperations_i::FinishOperation() +{ + _impl->FinishOperation(); +} + + +//============================================================================= +/*! + * AboutOperation + */ +//============================================================================= +void GEOM_IOperations_i::AbortOperation() +{ + _impl->AbortOperation(); +} + +//============================================================================= +/*! + * GetObject + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IOperations_i::GetObject(Handle(GEOM_Object) theObject) +{ + if(theObject.IsNull()) return NULL; + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theObject->GetEntry(), anEntry); + GEOM::GEOM_Object_var GO = GEOM::GEOM_Object::_duplicate(_engine->GetObject(theObject->GetDocID(), anEntry.ToCString())); + return GO._retn(); +} diff --git a/src/GEOM_I/GEOM_IOperations_i.hh b/src/GEOM_I/GEOM_IOperations_i.hh new file mode 100644 index 000000000..e73120afa --- /dev/null +++ b/src/GEOM_I/GEOM_IOperations_i.hh @@ -0,0 +1,64 @@ +// 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/ +// + +#ifndef _GEOM_IOperations_i_HeaderFile +#define _GEOM_IOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "SALOME_GenericObj_i.hh" +#include "GEOM_IOperations.hxx" +#include "GEOM_Object_i.hh" +#include "GEOM_Object.hxx" + +class GEOM_IOperations_i : public virtual POA_GEOM::GEOM_IOperations, public virtual SALOME::GenericObj_i +{ + public: + GEOM_IOperations_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, ::GEOM_IOperations* theImpl); + ~GEOM_IOperations_i(); + + virtual CORBA::Boolean IsDone(); + + virtual void SetErrorCode(const char* theErrorCode); + + virtual char* GetErrorCode(); + + virtual CORBA::Long GetStudyID(); + + virtual GEOM::GEOM_Object_ptr GetObject(Handle(GEOM_Object) theObject); + + virtual void StartOperation(); + + virtual void FinishOperation(); + + virtual void AbortOperation(); + + + ::GEOM_IOperations* GetImpl() { return _impl; } + + private: + + ::GEOM_IOperations* _impl; + GEOM::GEOM_Gen_ptr _engine; +}; + +#endif diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc new file mode 100644 index 000000000..4c452deae --- /dev/null +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -0,0 +1,998 @@ +// 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/ +// +#include + +#include "GEOM_IShapesOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#include +#include + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= +GEOM_IShapesOperations_i::GEOM_IShapesOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IShapesOperations* theImpl) +:GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_IShapesOperations_i::GEOM_IShapesOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= +GEOM_IShapesOperations_i::~GEOM_IShapesOperations_i() +{ + MESSAGE("GEOM_IShapesOperations_i::~GEOM_IShapesOperations_i"); +} + + +//============================================================================= +/*! + * MakeEdge + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdge + (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePnt1 == NULL || thePnt2 == 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()); + + if (aPnt1.IsNull() || aPnt2.IsNull()) return aGEOMObject._retn(); + + //Create the Edge + Handle(GEOM_Object) anObject = GetOperations()->MakeEdge(aPnt1, aPnt2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeWire + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeWire + (const GEOM::ListOfGO& theEdgesAndWires) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + list aShapes; + + //Get the shapes + aLen = theEdgesAndWires.length(); + for (ind = 0; ind < aLen; ind++) { + if (theEdgesAndWires[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theEdgesAndWires[ind]->GetStudyID(), theEdgesAndWires[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(GEOM_Object) anObject = + GetOperations()->MakeWire(aShapes); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFace + (GEOM::GEOM_Object_ptr theWire, + const CORBA::Boolean isPlanarWanted) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theWire == NULL) return aGEOMObject._retn(); + + //Get the reference wire + Handle(GEOM_Object) aWire = GetOperations()->GetEngine()->GetObject + (theWire->GetStudyID(), theWire->GetEntry()); + + if (aWire.IsNull()) return aGEOMObject._retn(); + + //Create the Face + Handle(GEOM_Object) anObject = GetOperations()->MakeFace(aWire, isPlanarWanted); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeFaceWires + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeFaceWires + (const GEOM::ListOfGO& theWires, + const CORBA::Boolean isPlanarWanted) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + list aShapes; + + //Get the shapes + aLen = theWires.length(); + for (ind = 0; ind < aLen; ind++) { + if (theWires[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theWires[ind]->GetStudyID(), theWires[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Face + Handle(GEOM_Object) anObject = + GetOperations()->MakeFaceWires(aShapes, isPlanarWanted); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeShell + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeShell + (const GEOM::ListOfGO& theFacesAndShells) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + list aShapes; + + //Get the shapes + aLen = theFacesAndShells.length(); + for (ind = 0; ind < aLen; ind++) { + if (theFacesAndShells[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theFacesAndShells[ind]->GetStudyID(), theFacesAndShells[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(GEOM_Object) anObject = + GetOperations()->MakeShell(aShapes); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSolidShell + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidShell + (GEOM::GEOM_Object_ptr theShell) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShell == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShell = GetOperations()->GetEngine()->GetObject + (theShell->GetStudyID(), theShell->GetEntry()); + + if (aShell.IsNull()) return aGEOMObject._retn(); + + //Create the Solid + Handle(GEOM_Object) anObject = GetOperations()->MakeSolidShell(aShell); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeSolidShells + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidShells + (const GEOM::ListOfGO& theShells) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + list aShapes; + + //Get the shapes + aLen = theShells.length(); + for (ind = 0; ind < aLen; ind++) { + if (theShells[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theShells[ind]->GetStudyID(), theShells[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(GEOM_Object) anObject = + GetOperations()->MakeSolidShells(aShapes); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeCompound + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeCompound + (const GEOM::ListOfGO& theShapes) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + list aShapes; + + //Get the shapes + aLen = theShapes.length(); + for (ind = 0; ind < aLen; ind++) { + if (theShapes[ind] == NULL) return aGEOMObject._retn(); + Handle(GEOM_Object) aSh = GetOperations()->GetEngine()->GetObject + (theShapes[ind]->GetStudyID(), theShapes[ind]->GetEntry()); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(GEOM_Object) anObject = + GetOperations()->MakeCompound(aShapes); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeGlueFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeGlueFaces + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theTolerance) +{ + 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(); + + //Perform the gluing + Handle(GEOM_Object) anObject = + GetOperations()->MakeGlueFaces(aShape, theTolerance); + //if (!GetOperations()->IsDone() || anObject.IsNull()) + // to allow warning + if (anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeExplode + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeExplode (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + const CORBA::Boolean isSorted) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + if (theShape == NULL) return aSeq._retn(); + + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->MakeExplode(aShape, theShapeType, isSorted); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * SubShapeAllIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::SubShapeAllIDs (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + const CORBA::Boolean isSorted) +{ + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + if (theShape == NULL) return aSeq._retn(); + + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + Handle(TColStd_HSequenceOfInteger) aHSeq = + GetOperations()->SubShapeAllIDs(aShape, theShapeType, isSorted); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetSubShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetSubShape + (GEOM::GEOM_Object_ptr theMainShape, + const CORBA::Long theID) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theMainShape == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theMainShape->GetStudyID(), theMainShape->GetEntry()); + + if (aShape.IsNull()) return aGEOMObject._retn(); + + Handle(GEOM_Object) anObject = GetOperations()->GetSubShape(aShape, theID); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * NumberOfFaces + */ +//============================================================================= +CORBA::Long GEOM_IShapesOperations_i::NumberOfFaces (GEOM::GEOM_Object_ptr theShape) +{ + if (theShape == NULL) return -1; + + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + CORBA::Long aNb = GetOperations()->NumberOfFaces(aShape); + if (!GetOperations()->IsDone()) return -1; + + return aNb; +} + +//============================================================================= +/*! + * NumberOfEdges + */ +//============================================================================= +CORBA::Long GEOM_IShapesOperations_i::NumberOfEdges (GEOM::GEOM_Object_ptr theShape) +{ + if (theShape == NULL) return -1; + + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + CORBA::Long aNb = GetOperations()->NumberOfEdges(aShape); + if (!GetOperations()->IsDone()) return -1; + + return aNb; +} + +//============================================================================= +/*! + * ChangeOrientation + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ChangeOrientation + (GEOM::GEOM_Object_ptr theShape) +{ + 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(); + + //Create the Solid + Handle(GEOM_Object) anObject = GetOperations()->ReverseShape(aShape); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * GetFreeFacesIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::GetFreeFacesIDs (GEOM::GEOM_Object_ptr theShape) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + if (theShape == NULL) return aSeq._retn(); + + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + + Handle(TColStd_HSequenceOfInteger) aHSeq = + GetOperations()->GetFreeFacesIDs(aShape); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetSharedShapes + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetSharedShapes + (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + const CORBA::Long theShapeType) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + if (theShape1 == NULL || + theShape2 == NULL) return aSeq._retn(); + + Handle(GEOM_Object) aShape1 = GetOperations()->GetEngine()->GetObject + (theShape1->GetStudyID(), theShape1->GetEntry()); + Handle(GEOM_Object) aShape2 = GetOperations()->GetEngine()->GetObject + (theShape2->GetStudyID(), theShape2->GetEntry()); + + if (aShape1.IsNull() || + aShape2.IsNull()) return aSeq._retn(); + + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetSharedShapes(aShape1, aShape2, theShapeType); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +static GEOMAlgo_State ShapeState (const GEOM::shape_state theState) +{ + GEOMAlgo_State aState = GEOMAlgo_ST_UNKNOWN; + + switch (theState) { + case GEOM::ST_ON: + aState = GEOMAlgo_ST_ON; + break; + case GEOM::ST_OUT: + aState = GEOMAlgo_ST_OUT; + break; + case GEOM::ST_ONOUT: + aState = GEOMAlgo_ST_ONOUT; + break; + case GEOM::ST_IN: + aState = GEOMAlgo_ST_IN; + break; + case GEOM::ST_ONIN: + aState = GEOMAlgo_ST_ONIN; + break; + default: + break; + } + + return aState; +} + +//============================================================================= +/*! + * GetShapesOnPlane + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnPlane + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + const GEOM::shape_state theState) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theAx1 == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) anAx1 = GetOperations()->GetEngine()->GetObject + (theAx1->GetStudyID(), theAx1->GetEntry()); + + if (aShape.IsNull() || anAx1.IsNull()) return aSeq._retn(); + + //Get Shapes On Plane + Handle(TColStd_HSequenceOfTransient) aHSeq = + GetOperations()->GetShapesOnPlane(aShape, theShapeType, anAx1, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnCylinder + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnCylinder + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + const CORBA::Double theRadius, + const GEOM::shape_state theState) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theAxis == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) anAxis = GetOperations()->GetEngine()->GetObject + (theAxis->GetStudyID(), theAxis->GetEntry()); + + if (aShape.IsNull() || anAxis.IsNull()) return aSeq._retn(); + + //Get Shapes On Cylinder + Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->GetShapesOnCylinder + (aShape, theShapeType, anAxis, theRadius, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnSphere + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnSphere + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + const CORBA::Double theRadius, + const GEOM::shape_state theState) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theCenter == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aCenter = GetOperations()->GetEngine()->GetObject + (theCenter->GetStudyID(), theCenter->GetEntry()); + + if (aShape.IsNull() || aCenter.IsNull()) return aSeq._retn(); + + //Get Shapes On Sphere + Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->GetShapesOnSphere + (aShape, theShapeType, aCenter, theRadius, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnQuadrangle + */ +//============================================================================= +GEOM::ListOfGO* GEOM_IShapesOperations_i::GetShapesOnQuadrangle + (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theTopLeftPoint, + GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theBottomLeftPoint, + GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::shape_state theState) +{ + GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || + theTopLeftPoint == NULL || + theTopRigthPoint == NULL || + theBottomLeftPoint == NULL || + theBottomRigthPoint == NULL ) + return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aTopLeftPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theTopLeftPoint->GetEntry()); + Handle(GEOM_Object) aTopRigthPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theTopRigthPoint->GetEntry()); + Handle(GEOM_Object) aBottomLeftPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theBottomLeftPoint->GetEntry()); + Handle(GEOM_Object) aBottomRigthPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theBottomRigthPoint->GetEntry()); + + if (aShape.IsNull() || + aTopLeftPoint.IsNull() || + aTopRigthPoint.IsNull() || + aBottomLeftPoint.IsNull() || + aBottomRigthPoint.IsNull() ) + return aSeq._retn(); + + //Get Shapes On Quadrangle + Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->GetShapesOnQuadrangle + (aShape, theShapeType, + aTopLeftPoint, aTopRigthPoint, aBottomLeftPoint, aBottomRigthPoint, + ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i))); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnPlaneIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnPlaneIDs + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + const GEOM::shape_state theState) +{ + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theAx1 == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) anAx1 = GetOperations()->GetEngine()->GetObject + (theAx1->GetStudyID(), theAx1->GetEntry()); + + if (aShape.IsNull() || anAx1.IsNull()) return aSeq._retn(); + + //Get Shapes On Plane + Handle(TColStd_HSequenceOfInteger) aHSeq = + GetOperations()->GetShapesOnPlaneIDs(aShape, theShapeType, anAx1, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnCylinderIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnCylinderIDs + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + const CORBA::Double theRadius, + const GEOM::shape_state theState) +{ + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theAxis == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) anAxis = GetOperations()->GetEngine()->GetObject + (theAxis->GetStudyID(), theAxis->GetEntry()); + + if (aShape.IsNull() || anAxis.IsNull()) return aSeq._retn(); + + //Get Shapes On Cylinder + Handle(TColStd_HSequenceOfInteger) aHSeq = GetOperations()->GetShapesOnCylinderIDs + (aShape, theShapeType, anAxis, theRadius, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnSphereIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnSphereIDs + (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + const CORBA::Double theRadius, + const GEOM::shape_state theState) +{ + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || theCenter == NULL) return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aCenter = GetOperations()->GetEngine()->GetObject + (theCenter->GetStudyID(), theCenter->GetEntry()); + + if (aShape.IsNull() || aCenter.IsNull()) return aSeq._retn(); + + //Get Shapes On Sphere + Handle(TColStd_HSequenceOfInteger) aHSeq = GetOperations()->GetShapesOnSphereIDs + (aShape, theShapeType, aCenter, theRadius, ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetShapesOnQuadrangleIDs + */ +//============================================================================= +GEOM::ListOfLong* GEOM_IShapesOperations_i::GetShapesOnQuadrangleIDs + (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theTopLeftPoint, + GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theBottomLeftPoint, + GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::shape_state theState) +{ + GEOM::ListOfLong_var aSeq = new GEOM::ListOfLong; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShape == NULL || + theTopLeftPoint == NULL || + theTopRigthPoint == NULL || + theBottomLeftPoint == NULL || + theBottomRigthPoint == NULL ) + return aSeq._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShape = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theShape->GetEntry()); + Handle(GEOM_Object) aTopLeftPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theTopLeftPoint->GetEntry()); + Handle(GEOM_Object) aTopRigthPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theTopRigthPoint->GetEntry()); + Handle(GEOM_Object) aBottomLeftPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theBottomLeftPoint->GetEntry()); + Handle(GEOM_Object) aBottomRigthPoint = GetOperations()->GetEngine()->GetObject + (theShape->GetStudyID(), theBottomRigthPoint->GetEntry()); + + if (aShape.IsNull() || + aTopLeftPoint.IsNull() || + aTopRigthPoint.IsNull() || + aBottomLeftPoint.IsNull() || + aBottomRigthPoint.IsNull() ) + return aSeq._retn(); + + //Get Shapes On Quadrangle + Handle(TColStd_HSequenceOfInteger) aHSeq = GetOperations()->GetShapesOnQuadrangleIDs + (aShape, theShapeType, + aTopLeftPoint, aTopRigthPoint, aBottomLeftPoint, aBottomRigthPoint, + ShapeState(theState)); + if (!GetOperations()->IsDone() || aHSeq.IsNull()) + return aSeq._retn(); + + Standard_Integer aLength = aHSeq->Length(); + aSeq->length(aLength); + for (Standard_Integer i = 1; i <= aLength; i++) + aSeq[i-1] = aHSeq->Value(i); + + return aSeq._retn(); +} + +//============================================================================= +/*! + * GetInPlace + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetInPlace + (GEOM::GEOM_Object_ptr theShapeWhere, + GEOM::GEOM_Object_ptr theShapeWhat) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theShapeWhere == NULL || + theShapeWhat == NULL) return aGEOMObject._retn(); + + //Get the reference objects + Handle(GEOM_Object) aShapeWhere = GetOperations()->GetEngine()->GetObject + (theShapeWhere->GetStudyID(), theShapeWhere->GetEntry()); + Handle(GEOM_Object) aShapeWhat = GetOperations()->GetEngine()->GetObject + (theShapeWhat->GetStudyID(), theShapeWhat->GetEntry()); + + if (aShapeWhere.IsNull() || + aShapeWhat.IsNull()) return aGEOMObject._retn(); + + //Get Shapes in place of aShapeWhat + Handle(GEOM_Object) anObject = + GetOperations()->GetInPlace(aShapeWhere, aShapeWhat); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh new file mode 100644 index 000000000..eb48a0f74 --- /dev/null +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -0,0 +1,144 @@ +// 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/ +// + +#ifndef _GEOM_IShapesOperations_i_HeaderFile +#define _GEOM_IShapesOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_IShapesOperations.hxx" + +class GEOM_IShapesOperations_i : + public virtual POA_GEOM::GEOM_IShapesOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_IShapesOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_IShapesOperations* theImpl); + ~GEOM_IShapesOperations_i(); + + GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + + GEOM::GEOM_Object_ptr MakeWire (const GEOM::ListOfGO& theEdgesAndWires); + + GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, + CORBA::Boolean isPlanarWanted); + + GEOM::GEOM_Object_ptr MakeFaceWires (const GEOM::ListOfGO& theWires, + CORBA::Boolean isPlanarWanted); + + GEOM::GEOM_Object_ptr MakeShell (const GEOM::ListOfGO& theFacesAndShells); + + GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell); + + GEOM::GEOM_Object_ptr MakeSolidShells (const GEOM::ListOfGO& theShells); + + GEOM::GEOM_Object_ptr MakeCompound (const GEOM::ListOfGO& theShapes); + + GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance); + + GEOM::ListOfGO* MakeExplode (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + CORBA::Boolean isSorted); + + GEOM::ListOfLong* SubShapeAllIDs (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + CORBA::Boolean isSorted); + + GEOM::GEOM_Object_ptr GetSubShape (GEOM::GEOM_Object_ptr theMainShape, + CORBA::Long theID); + + CORBA::Long NumberOfFaces (GEOM::GEOM_Object_ptr theShape); + CORBA::Long NumberOfEdges (GEOM::GEOM_Object_ptr theShape); + + GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theShape); + + GEOM::ListOfLong* GetFreeFacesIDs (GEOM::GEOM_Object_ptr theShape); + + GEOM::ListOfGO* GetSharedShapes (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theShapeType); + + GEOM::ListOfGO* GetShapesOnPlane (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::shape_state theState); + + GEOM::ListOfGO* GetShapesOnCylinder (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + GEOM::shape_state theState); + + GEOM::ListOfGO* GetShapesOnSphere (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + CORBA::Double theRadius, + GEOM::shape_state theState); + + GEOM::ListOfGO* GetShapesOnQuadrangle (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theTopLeftPoint, + GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theBottomLeftPoint, + GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::shape_state theState); + + GEOM::ListOfLong* GetShapesOnPlaneIDs (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAx1, + GEOM::shape_state theState); + + GEOM::ListOfLong* GetShapesOnCylinderIDs (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + GEOM::shape_state theState); + + GEOM::ListOfLong* GetShapesOnSphereIDs (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theCenter, + CORBA::Double theRadius, + GEOM::shape_state theState); + + GEOM::ListOfLong* GetShapesOnQuadrangleIDs (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + GEOM::GEOM_Object_ptr theTopLeftPoint, + GEOM::GEOM_Object_ptr theTopRigthPoint, + GEOM::GEOM_Object_ptr theBottomLeftPoint, + GEOM::GEOM_Object_ptr theBottomRigthPoint, + GEOM::shape_state theState); + + GEOM::GEOM_Object_ptr GetInPlace (GEOM::GEOM_Object_ptr theShapeWhere, + GEOM::GEOM_Object_ptr theShapeWhat); + + ::GEOMImpl_IShapesOperations* GetOperations() + { return (::GEOMImpl_IShapesOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc new file mode 100644 index 000000000..d68c74492 --- /dev/null +++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc @@ -0,0 +1,950 @@ +// 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/ +// +#include + +#include "GEOM_ITransformOperations_i.hh" + +#include "utilities.h" +#include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" + +#include +#include +#include +#include "GEOM_Engine.hxx" +#include "GEOM_Object.hxx" + +#define SUBSHAPE_ERROR "Sub shape cannot be transformed" + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOM_ITransformOperations_i::GEOM_ITransformOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ITransformOperations* theImpl) + :GEOM_IOperations_i(thePOA, theEngine, theImpl) +{ + MESSAGE("GEOM_ITransformOperations_i::GEOM_ITransformOperations_i"); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOM_ITransformOperations_i::~GEOM_ITransformOperations_i() +{ + MESSAGE("GEOM_ITransformOperations_i::~GEOM_ITransformOperations_i"); +} + + +//============================================================================= +/*! + * TranslateTwoPoints + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateTwoPoints + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + GEOM::GEOM_Object_var aGEOMObject; + + if (thePoint1 == NULL || thePoint2 == NULL || theObject == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the first point of translation + Handle(GEOM_Object) aPoint1 = + GetOperations()->GetEngine()->GetObject(thePoint1->GetStudyID(), thePoint1->GetEntry()); + if (aPoint1.IsNull()) return aGEOMObject._retn(); + + //Get the second point of translation + Handle(GEOM_Object) aPoint2 = + GetOperations()->GetEngine()->GetObject(thePoint2->GetStudyID(), thePoint2->GetEntry()); + if (aPoint2.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + GetOperations()->TranslateTwoPoints(anObject, aPoint1, aPoint2); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * TranslateTwoPointsCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateTwoPointsCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePoint1 == NULL || thePoint2 == NULL || theObject == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the first point of translation + Handle(GEOM_Object) aPoint1 = + GetOperations()->GetEngine()->GetObject(thePoint1->GetStudyID(), thePoint1->GetEntry()); + if (aPoint1.IsNull()) return aGEOMObject._retn(); + + //Get the second point of translation + Handle(GEOM_Object) aPoint2 = + GetOperations()->GetEngine()->GetObject(thePoint2->GetStudyID(), thePoint2->GetEntry()); + if (aPoint2.IsNull()) return aGEOMObject._retn(); + + //Create the translated shape + Handle(GEOM_Object) anObject = + GetOperations()->TranslateTwoPointsCopy(aBasicObject, aPoint1, aPoint2); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * TranslateDXDYDZ + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + GEOM::GEOM_Object_var aGEOMObject ; + + if (theObject == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + GetOperations()->TranslateDXDYDZ(anObject, theDX, theDY, theDZ); + + return aGEOMObject._retn(); +} + + +//============================================================================= +/*! + * TranslateDXDYDZCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateDXDYDZCopy + (GEOM::GEOM_Object_ptr theObject, CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + + + //Create the translated shape + Handle(GEOM_Object) anObject = + GetOperations()->TranslateDXDYDZCopy(aBasicObject, theDX, theDY, theDZ); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * TranslateVector + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateVector + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theVector == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aVector = + GetOperations()->GetEngine()->GetObject(theVector->GetStudyID(), theVector->GetEntry()); + if (aVector.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + GetOperations()->TranslateVector(anObject, aVector); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * TranslateVectorCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::TranslateVectorCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theVector == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aVector = + GetOperations()->GetEngine()->GetObject(theVector->GetStudyID(), theVector->GetEntry()); + if (aVector.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + Handle(GEOM_Object) anObject = GetOperations()->TranslateVectorCopy(aBasicObject, aVector); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * Rotate + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::Rotate (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theAxis == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Get the object itself + Handle(GEOM_Object) anObject = GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the axis of revolution + Handle(GEOM_Object) anAxis = + GetOperations()->GetEngine()->GetObject(theAxis->GetStudyID(), theAxis->GetEntry()); + if (anAxis.IsNull()) return aGEOMObject._retn(); + + //Perform the rotation + GetOperations()->Rotate(anObject, anAxis, theAngle); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * RotateCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theAxis == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the axis of rotation + Handle(GEOM_Object) anAxis = + GetOperations()->GetEngine()->GetObject(theAxis->GetStudyID(), theAxis->GetEntry()); + if (anAxis.IsNull()) return aGEOMObject._retn(); + + //Perform the rotation + Handle(GEOM_Object) anObject = GetOperations()->RotateCopy(aBasicObject, anAxis, theAngle); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * MirrorPlane + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPlane + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || thePlane == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the plane + Handle(GEOM_Object) aPlane = + GetOperations()->GetEngine()->GetObject(thePlane->GetStudyID(), thePlane->GetEntry()); + if (aPlane.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + GetOperations()->MirrorPlane(anObject, aPlane); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * MirrorPlaneCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPlaneCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || thePlane == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aPlane = + GetOperations()->GetEngine()->GetObject(thePlane->GetStudyID(), thePlane->GetEntry()); + if (aPlane.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + Handle(GEOM_Object) anObject = GetOperations()->MirrorPlaneCopy(aBasicObject, aPlane); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MirrorAxis + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorAxis + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theAxis == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the axis + Handle(GEOM_Object) aAxis = + GetOperations()->GetEngine()->GetObject(theAxis->GetStudyID(), theAxis->GetEntry()); + if (aAxis.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + GetOperations()->MirrorAxis(anObject, aAxis); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * MirrorAxisCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorAxisCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theAxis == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aAxis = + GetOperations()->GetEngine()->GetObject(theAxis->GetStudyID(), theAxis->GetEntry()); + if (aAxis.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + Handle(GEOM_Object) anObject = GetOperations()->MirrorAxisCopy(aBasicObject, aAxis); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MirrorPoint + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPoint + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || thePoint == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the point + Handle(GEOM_Object) aPoint = + GetOperations()->GetEngine()->GetObject(thePoint->GetStudyID(), thePoint->GetEntry()); + if (aPoint.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + GetOperations()->MirrorPoint(anObject, aPoint); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * MirrorPointCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MirrorPointCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || thePoint == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aPoint = + GetOperations()->GetEngine()->GetObject(thePoint->GetStudyID(), thePoint->GetEntry()); + if (aPoint.IsNull()) return aGEOMObject._retn(); + + //Perform the mirror + Handle(GEOM_Object) anObject = GetOperations()->MirrorPointCopy(aBasicObject, aPoint); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * OffsetShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShape + (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + + //Get the basic object + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Create the offset shape + GetOperations()->OffsetShape(aBasicObject, theOffset); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * OffsetShapeCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy + (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL) return aGEOMObject._retn(); + + //Get the basic object + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Create the offset shape + Handle(GEOM_Object) anObject = GetOperations()->OffsetShapeCopy(aBasicObject, theOffset); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + + +//============================================================================= +/*! + * ScaleShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShape + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePoint == NULL || theObject == NULL) return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + //Get the object itself + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the point + Handle(GEOM_Object) aPoint = + GetOperations()->GetEngine()->GetObject(thePoint->GetStudyID(), thePoint->GetEntry()); + if (aPoint.IsNull()) return aGEOMObject._retn(); + + //Perform the scale + GetOperations()->ScaleShape(anObject, aPoint, theFactor); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * ScaleShapeCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ScaleShapeCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (thePoint == NULL || theObject == NULL) return aGEOMObject._retn(); + + //Get the basic object + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the point + Handle(GEOM_Object) aPoint = + GetOperations()->GetEngine()->GetObject(thePoint->GetStudyID(), thePoint->GetEntry()); + if (aPoint.IsNull()) return aGEOMObject._retn(); + + //Perform the scale + Handle(GEOM_Object) anObject = + GetOperations()->ScaleShapeCopy(aBasicObject, aPoint, theFactor); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * PositionShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionShape + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS) +{ + GEOM::GEOM_Object_var aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject); + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theStartLCS == NULL || theEndLCS == NULL) + return aGEOMObject._retn(); + + //check if the object is a subshape + if(!theObject->IsMainShape()) { + GetOperations()->SetErrorCode(SUBSHAPE_ERROR); + return aGEOMObject._retn(); + } + + //Get the basic object + Handle(GEOM_Object) anObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (anObject.IsNull()) return aGEOMObject._retn(); + + //Get the Start LCS + Handle(GEOM_Object) aStartLCS = + GetOperations()->GetEngine()->GetObject(theStartLCS->GetStudyID(), theStartLCS->GetEntry()); + if (aStartLCS.IsNull()) return aGEOMObject._retn(); + + //Get the End LCS + Handle(GEOM_Object) aEndLCS = + GetOperations()->GetEngine()->GetObject(theEndLCS->GetStudyID(), theEndLCS->GetEntry()); + if (aEndLCS.IsNull()) return aGEOMObject._retn(); + + //Perform the Position + GetOperations()->PositionShape(anObject, aStartLCS, aEndLCS); + + return aGEOMObject._retn(); +} + +//============================================================================= +/*! + * PositionShapeCopy + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::PositionShapeCopy + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + if (theObject == NULL || theStartLCS == NULL || theEndLCS == NULL) + return aGEOMObject._retn(); + + //Get the basic object + Handle(GEOM_Object) aBasicObject = + GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the Start LCS + Handle(GEOM_Object) aStartLCS = + GetOperations()->GetEngine()->GetObject(theStartLCS->GetStudyID(), theStartLCS->GetEntry()); + if (aStartLCS.IsNull()) return aGEOMObject._retn(); + + //Get the End LCS + Handle(GEOM_Object) aEndLCS = + GetOperations()->GetEngine()->GetObject(theEndLCS->GetStudyID(), theEndLCS->GetEntry()); + if (aEndLCS.IsNull()) return aGEOMObject._retn(); + + //Perform the position + Handle(GEOM_Object) anObject = + GetOperations()->PositionShapeCopy(aBasicObject, aStartLCS, aEndLCS); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MultiTranslate1D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate1D + (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theStep, CORBA::Long theNbTimes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theVector == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector of translation + Handle(GEOM_Object) aVector = GetOperations()->GetEngine()->GetObject + (theVector->GetStudyID(), theVector->GetEntry()); + if (aVector.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + Handle(GEOM_Object) anObject = + GetOperations()->Translate1D(aBasicObject, aVector, theStep, theNbTimes); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MultiTranslate2D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector1, + CORBA::Double theStep1, + CORBA::Long theNbTimes1, + GEOM::GEOM_Object_ptr theVector2, + CORBA::Double theStep2, + CORBA::Long theNbTimes2) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theVector1 == NULL || theVector2 == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the vector1 of translation + Handle(GEOM_Object) aVector1 = GetOperations()->GetEngine()->GetObject + (theVector1->GetStudyID(), theVector1->GetEntry()); + if (aVector1.IsNull()) return aGEOMObject._retn(); + + //Get the vector2 of translation + Handle(GEOM_Object) aVector2 = GetOperations()->GetEngine()->GetObject + (theVector2->GetStudyID(), theVector2->GetEntry()); + if (aVector2.IsNull()) return aGEOMObject._retn(); + + //Perform the translation + Handle(GEOM_Object) anObject = GetOperations()->Translate2D + (aBasicObject, aVector1, theStep1, theNbTimes1, aVector2, theStep2, theNbTimes2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MultiRotate1D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Long theNbTimes) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theVector == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the a directon of rotation + Handle(GEOM_Object) aVector = GetOperations()->GetEngine()->GetObject + (theVector->GetStudyID(), theVector->GetEntry()); + if (aVector.IsNull()) return aGEOMObject._retn(); + + //Perform the rotation + Handle(GEOM_Object) anObject = GetOperations()->Rotate1D(aBasicObject, aVector, theNbTimes); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MultiRotate2D + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::MultiRotate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theAngle, + CORBA::Long theNbTimes1, + CORBA::Double theStep, + CORBA::Long theNbTimes2) +{ + //Set a not done flag + GetOperations()->SetNotDone(); + + GEOM::GEOM_Object_var aGEOMObject; + + if (theObject == NULL || theVector == NULL) return aGEOMObject._retn(); + + //Get the object itself + Handle(GEOM_Object) aBasicObject = GetOperations()->GetEngine()->GetObject + (theObject->GetStudyID(), theObject->GetEntry()); + if (aBasicObject.IsNull()) return aGEOMObject._retn(); + + //Get the a directon of rotation + Handle(GEOM_Object) aVector = GetOperations()->GetEngine()->GetObject + (theVector->GetStudyID(), theVector->GetEntry()); + if (aVector.IsNull()) return aGEOMObject._retn(); + + //Perform the rotation + Handle(GEOM_Object) anObject = GetOperations()->Rotate2D + (aBasicObject, aVector, theAngle, theNbTimes1, theStep, theNbTimes2); + if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); + + return GetObject(anObject); +} diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh new file mode 100644 index 000000000..7cb17e1be --- /dev/null +++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh @@ -0,0 +1,130 @@ +// 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/ +// + +#ifndef _GEOM_ITransformOperations_i_HeaderFile +#define _GEOM_ITransformOperations_i_HeaderFile + + +#include + +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include "GEOM_IOperations_i.hh" +#include "GEOM_Object_i.hh" + +#include "GEOMImpl_ITransformOperations.hxx" + +class GEOM_ITransformOperations_i : + public virtual POA_GEOM::GEOM_ITransformOperations, + public virtual GEOM_IOperations_i +{ + public: + GEOM_ITransformOperations_i (PortableServer::POA_ptr thePOA, + GEOM::GEOM_Gen_ptr theEngine, + ::GEOMImpl_ITransformOperations* theImpl); + ~GEOM_ITransformOperations_i(); + + GEOM::GEOM_Object_ptr TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + + GEOM::GEOM_Object_ptr TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + + GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ); + + + GEOM::GEOM_Object_ptr TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject, CORBA::Double theDX, CORBA::Double theDY, CORBA::Double theDZ); + + GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector); + + GEOM::GEOM_Object_ptr TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector); + + GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theVector, CORBA::Double theStep, CORBA::Long theNbTimes); + + GEOM::GEOM_Object_ptr MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, GEOM::GEOM_Object_ptr theVector1, CORBA::Double theStep1, CORBA::Long theNbTimes1, + GEOM::GEOM_Object_ptr theVector2, CORBA::Double theStep2, CORBA::Long theNbTimes2); + + GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + + GEOM::GEOM_Object_ptr MultiRotate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Long theNbTimes); + + + GEOM::GEOM_Object_ptr MultiRotate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theAngle, + CORBA::Long theNbTimes1, + CORBA::Double theStep, + CORBA::Long theNbTimes2); + + GEOM::GEOM_Object_ptr RotateCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + + GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + + GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + + GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + + GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + + GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + + GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + + GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + + GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + + GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); + + GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); + + GEOM::GEOM_Object_ptr PositionShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); + + GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); + + ::GEOMImpl_ITransformOperations* GetOperations() { return (::GEOMImpl_ITransformOperations*)GetImpl(); } +}; + +#endif diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc new file mode 100644 index 000000000..66e85cbf3 --- /dev/null +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -0,0 +1,315 @@ +// 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/ +// +#include + +#include +//#include +#include +#include + +#include "utilities.h" +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef WNT +#pragma warning( disable:4786 ) +#endif + +//============================================================================= +/*! + * constructor: + */ +//============================================================================= + +GEOM_Object_i::GEOM_Object_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, + Handle(GEOM_Object) theImpl) +: SALOME::GenericObj_i( thePOA ), _engine(theEngine), _impl(theImpl) +{ + thePOA->activate_object(this); +} + +//============================================================================= +/*! + * destructor + */ +//============================================================================= + +GEOM_Object_i::~GEOM_Object_i() +{} + + +//============================================================================= +/*! + * GetEntry + */ +//============================================================================= +char* GEOM_Object_i::GetEntry() +{ + const TDF_Label& aLabel = _impl->GetEntry(); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aLabel, anEntry); + return CORBA::string_dup(anEntry.ToCString()); +} + +//============================================================================= +/*! + * GetStudyID + */ +//============================================================================= +CORBA::Long GEOM_Object_i::GetStudyID() +{ + return _impl->GetDocID(); +} + + +//============================================================================= +/*! + * GetType + */ +//============================================================================= +CORBA::Long GEOM_Object_i::GetType() +{ + return _impl->GetType(); +} + +//============================================================================= +/*! + * GetShapeType + */ +//============================================================================= +GEOM::shape_type GEOM_Object_i::GetShapeType() +{ + TopoDS_Shape _geom = _impl->GetValue(); + if(_geom.IsNull()) return GEOM::SHAPE; + return (GEOM::shape_type)_geom.ShapeType(); +} + +//============================================================================= +/*! + * SetName + */ +//============================================================================= +void GEOM_Object_i::SetName(const char* theName) +{ + _impl->SetName(theName); +} + + +//============================================================================= +/*! + * GetName + */ +//============================================================================= +char* GEOM_Object_i::GetName() +{ + char* aName = _impl->GetName(); + if(aName) return strdup(aName); + return strdup(""); +} + +//============================================================================= +/*! + * SetStudyEntry + */ +//============================================================================= +void GEOM_Object_i::SetStudyEntry(const char* theEntry) +{ + _impl->SetAuxData(theEntry); +} + + +//============================================================================= +/*! + * GetStudyEntry + */ +//============================================================================= +char* GEOM_Object_i::GetStudyEntry() +{ + TCollection_AsciiString anEntry = _impl->GetAuxData(); + if(!anEntry.IsEmpty()) return CORBA::string_dup(anEntry.ToCString()); + return CORBA::string_dup(""); +} + + +//============================================================================= +/*! + * GetDependency + */ +//============================================================================= +GEOM::ListOfGO* GEOM_Object_i::GetDependency() +{ + GEOM::ListOfGO_var aList = new GEOM::ListOfGO(); + aList->length(0); + + Handle(TColStd_HSequenceOfTransient) aSeq = _impl->GetAllDependency(); + if (aSeq.IsNull()) return aList._retn(); + int aLength = aSeq->Length(); + if (aLength == 0) return aList._retn(); + + aList->length(aLength); + + TCollection_AsciiString anEntry; + + for (int i = 1; i<=aLength; i++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(aSeq->Value(i)); + if (anObj.IsNull()) continue; + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + GEOM::GEOM_Object_var obj = GEOM::GEOM_Object::_duplicate(_engine->GetObject(anObj->GetDocID(), anEntry.ToCString())); + aList[i-1] = obj; + } + + return aList._retn(); +} + +//============================================================================= +/*! + * GetLastDependency + */ +//============================================================================= +GEOM::ListOfGO* GEOM_Object_i::GetLastDependency() +{ + GEOM::ListOfGO_var aList = new GEOM::ListOfGO(); + aList->length(0); + + Handle(TColStd_HSequenceOfTransient) aSeq = _impl->GetLastDependency(); + if (aSeq.IsNull()) return aList._retn(); + int aLength = aSeq->Length(); + if (aLength == 0) return aList._retn(); + + aList->length(aLength); + + TCollection_AsciiString anEntry; + + for (int i = 1; i<=aLength; i++) { + Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(aSeq->Value(i)); + if (anObj.IsNull()) continue; + TDF_Tool::Entry(anObj->GetEntry(), anEntry); + GEOM::GEOM_Object_var obj = GEOM::GEOM_Object::_duplicate(_engine->GetObject(anObj->GetDocID(), anEntry.ToCString())); + aList[i-1] = obj; + } + + return aList._retn(); +} + +//================================================================================= +// function : GetShapeStream +// Transfer resulting shape to client as sequence of bytes +//client can extract shape from stream using BrepTools::Read function +//================================================================================= +SALOMEDS::TMPFile* GEOM_Object_i::GetShapeStream() +{ + TopoDS_Shape aShape = _impl->GetValue(); + + if(aShape.IsNull()) return NULL; + + ostrstream streamShape; + //Write TopoDS_Shape in ASCII format to the stream + BRepTools::Write(aShape, streamShape); + //Returns the number of bytes that have been stored in the stream's buffer. + int size = streamShape.pcount(); + char* buf = new char [size]; + //Get pointer on internal character array in ostrstream + char* valueOfStream = streamShape.str(); + //Create copy of ostrstream content + memcpy(buf, valueOfStream, size); + //Allow automatic deletion of ostrstream content + streamShape.rdbuf()->freeze(0); + + CORBA::Octet* OctetBuf = (CORBA::Octet*)buf; + SALOMEDS::TMPFile_var SeqFile = new SALOMEDS::TMPFile(size,size,OctetBuf,1); + return SeqFile._retn(); + +} + + +//======================================================================= +//function : getShape +//purpose : return the TopoDS_Shape when client and servant are colocated, be careful +//======================================================================= +long GEOM_Object_i::getShape() { + _geom = _impl->GetValue(); + return((long)(&_geom)); +} + +//============================================================================= +/*! + * GetSubShapeIndices + */ +//============================================================================= +GEOM::ListOfLong* GEOM_Object_i::GetSubShapeIndices() +{ + GEOM::ListOfLong_var anIndices = new GEOM::ListOfLong; + + if(!_impl->IsMainShape()) { + Handle(GEOM_Function) aFunction = _impl->GetFunction(1); //Get SubShape function (always the first (and last) one) + if(aFunction.IsNull()) return anIndices._retn(); + GEOM_ISubShape ISS(aFunction); + Handle(TColStd_HArray1OfInteger) anArray = ISS.GetIndices(); + if(anArray.IsNull() || anArray->Length() < 1) return anIndices._retn(); + anIndices->length(anArray->Length()); + for(int i=1; i<=anArray->Length(); i++) anIndices[i-1] = anArray->Value(i); + } + else { + anIndices->length(0); + } + + return anIndices._retn(); +} + + +//============================================================================= +/*! + * GetMainShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Object_i::GetMainShape() +{ + GEOM::GEOM_Object_var obj; + if(!_impl->IsMainShape()) { + Handle(GEOM_Function) aFunction = _impl->GetFunction(1); //Get SubShape function (always the first (and last) one) + if(aFunction.IsNull()) return obj._retn(); + GEOM_ISubShape ISS(aFunction); + + aFunction = ISS.GetMainShape(); + if(aFunction.IsNull()) return obj._retn(); + TDF_Label aLabel = aFunction->GetOwnerEntry(); + if(aLabel.IsNull()) return obj._retn(); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aLabel, anEntry); + return GEOM::GEOM_Object::_duplicate(_engine->GetObject(_impl->GetDocID(), anEntry.ToCString())); + } + + return obj._retn(); +} + +bool GEOM_Object_i::IsShape() +{ + return !_impl->GetValue().IsNull() && _impl->GetType() != GEOM_MARKER; +} diff --git a/src/GEOM_I/GEOM_Object_i.hh b/src/GEOM_I/GEOM_Object_i.hh new file mode 100644 index 000000000..ab5779589 --- /dev/null +++ b/src/GEOM_I/GEOM_Object_i.hh @@ -0,0 +1,82 @@ +// 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/ +// + +#ifndef _GEOM_Object_i_HeaderFile +#define _GEOM_Object_i_HeaderFile + + +#include +#include CORBA_CLIENT_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(GEOM_Gen) + +#include "SALOME_GenericObj_i.hh" + +#include "GEOM_Object.hxx" + +#include + +class GEOM_Object_i : public virtual POA_GEOM::GEOM_Object, public virtual SALOME::GenericObj_i +{ + public: + GEOM_Object_i(PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine, Handle(GEOM_Object) theImpl); + ~GEOM_Object_i(); + + virtual char* GetEntry(); + + virtual CORBA::Long GetStudyID(); + + virtual CORBA::Long GetType(); + + virtual GEOM::shape_type GetShapeType(); + + virtual void SetName(const char* theName); + + virtual char* GetName(); + + virtual void SetStudyEntry(const char* theEntry); + + virtual char* GetStudyEntry(); + + virtual GEOM::ListOfGO* GetDependency(); + + virtual GEOM::ListOfGO* GetLastDependency(); + + virtual SALOMEDS::TMPFile* GetShapeStream(); + + long getShape(); + + virtual bool IsMainShape() { return _impl->IsMainShape(); } + + virtual GEOM::ListOfLong* GetSubShapeIndices(); + + virtual GEOM::GEOM_Object_ptr GetMainShape(); + + virtual bool IsShape(); + + Handle(GEOM_Object) GetImpl() { return _impl; } + + private: + + GEOM::GEOM_Gen_ptr _engine; + Handle(GEOM_Object) _impl; + TopoDS_Shape _geom; +}; + +#endif diff --git a/src/GEOM_I/Makefile.in b/src/GEOM_I/Makefile.in new file mode 100644 index 000000000..6cf1d5df1 --- /dev/null +++ b/src/GEOM_I/Makefile.in @@ -0,0 +1,98 @@ +# GEOM GEOM : implementaion of GEOM_Gen.idl +# +# 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Patrick GOLDBRONN (CEA) +# Module : GEOM +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + +@COMMENCE@ + +# Libraries targets + +LIB = libGEOMEngine.la +LIB_SRC = \ + GEOM_Object_i.cc \ + GEOM_IOperations_i.cc \ + GEOM_IBasicOperations_i.cc \ + GEOM_IHealingOperations_i.cc \ + GEOM_I3DPrimOperations_i.cc \ + GEOM_IShapesOperations_i.cc \ + GEOM_IBlocksOperations_i.cc \ + GEOM_IBooleanOperations_i.cc \ + GEOM_ICurvesOperations_i.cc \ + GEOM_ILocalOperations_i.cc \ + GEOM_IInsertOperations_i.cc \ + GEOM_ITransformOperations_i.cc \ + GEOM_IMeasureOperations_i.cc \ + GEOM_IGroupOperations_i.cc \ + GEOM_Gen_i.cc \ + GEOM_DumpPython.cc + +# SALOME_Component.idl +LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Component.idl SALOME_Exception.idl + #SALOME_Exception.idl SALOME_GenericObj.idl + +LIB_SERVER_IDL = GEOM_Gen.idl + +# Executables targets +BIN = +BIN_SRC = +BIN_CLIENT_IDL = +BIN_SERVER_IDL = + +#This export required to compile GEOM_Superv_i.lo library +EXPORT_HEADERS = GEOM_Object_i.hh \ + GEOM_IOperations_i.hh \ + GEOM_IBasicOperations_i.hh \ + GEOM_IHealingOperations_i.hh \ + GEOM_I3DPrimOperations_i.hh \ + GEOM_IShapesOperations_i.hh \ + GEOM_IBlocksOperations_i.hh \ + GEOM_IBooleanOperations_i.hh \ + GEOM_ICurvesOperations_i.hh \ + GEOM_ILocalOperations_i.hh \ + GEOM_IInsertOperations_i.hh \ + GEOM_ITransformOperations_i.hh \ + GEOM_IMeasureOperations_i.hh \ + GEOM_IGroupOperations_i.hh \ + GEOM_Gen_i.hh + +# additionnal information to compil and link file +CPPFLAGS += $(OCC_INCLUDES) $(BOOST_CPPFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_INCLUDES) $(BOOST_CPPFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += -lGEOMArchimede -lGEOMbasic -lGEOMimpl -lGEOMSketcher \ + $(CAS_DATAEXCHANGE) $(CAS_LDPATH) -lTKFillet -lTKOffset \ + -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeNS -lSalomeContainer -lSalomeGenericObj -lTOOLSDS + +# additional file to be cleaned +MOSTLYCLEAN = +CLEAN = +DISTCLEAN = + +@CONCLUDE@ diff --git a/src/GEOM_I_Superv/GEOM_List_i.hh b/src/GEOM_I_Superv/GEOM_List_i.hh new file mode 100644 index 000000000..765e381e8 --- /dev/null +++ b/src/GEOM_I_Superv/GEOM_List_i.hh @@ -0,0 +1,104 @@ +// 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/ +// +#ifndef __GEOM_LIST_I_H__ +#define __GEOM_LIST_I_H__ + +// IDL headers +#include +#include CORBA_SERVER_HEADER(GEOM_Superv) + +#include "GEOM_Gen_i.hh" +#include "utilities.h" + +template +class GEOM_List_i : + public virtual POA_GEOM::GEOM_List, + public virtual PortableServer::RefCountServantBase +{ +public: + GEOM_List_i(); + GEOM_List_i(const Type& theListToCopy); + ~GEOM_List_i(); + + const Type& GetList(); + + template + void AddObject(ElemType theObject); + +private: + Type myGOList; +}; + +//============================================================================= +// constructor: +//============================================================================= +template +GEOM_List_i::GEOM_List_i() +{ + MESSAGE("GEOM_List_i::GEOM_List_i"); + //create an empty list + myGOList.length(0); +} + +//============================================================================= +// constructor: +//============================================================================= +template +GEOM_List_i::GEOM_List_i(const Type& theListToCopy) +{ + int aLength = theListToCopy.length(); + myGOList.length(aLength); + for (int i = 0; i < aLength; i++) + myGOList[i] = theListToCopy[i]; +} + +//============================================================================= +// destructor: +//============================================================================= +template +GEOM_List_i::~GEOM_List_i() +{ + MESSAGE("GEOM_List_i::~GEOM_List_i"); +} + +//============================================================================= +// GetList: +//============================================================================= +template +const Type& GEOM_List_i::GetList() +{ + MESSAGE("GEOM_List_i::GetList()"); + return myGOList; +} + +//============================================================================= +// AddObject: +//============================================================================= +template +template +void GEOM_List_i::AddObject(ElemType theObject) +{ + MESSAGE("GEOM_List_i::AddObject(...)"); + int aLength = myGOList.length(); + myGOList.length(aLength+1); + myGOList[aLength] = theObject; +} + +#endif diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc new file mode 100644 index 000000000..32b1589de --- /dev/null +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -0,0 +1,1937 @@ +// 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/ +// + +#include "GEOM_Superv_i.hh" +#include "SALOME_LifeCycleCORBA.hxx" +using namespace std; +//============================================================================= +// constructor: +//============================================================================= +GEOM_Superv_i::GEOM_Superv_i(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName) : + Engines_Component_i(orb, poa, contId, instanceName, interfaceName) +{ + MESSAGE("GEOM_Superv_i::GEOM_Superv_i"); + + _thisObj = this ; + _id = _poa->activate_object(_thisObj); + name_service = new SALOME_NamingService(_orb); + //get RootPOA (the default) + //myPOA = PortableServer::RefCountServantBase::_default_POA(); + CORBA::Object_var anObj = _orb->resolve_initial_references("RootPOA"); + myPOA = PortableServer::POA::_narrow(anObj); + + setGeomEngine(); + + myStudyID = -1; + + myBasicOp = GEOM::GEOM_IBasicOperations::_nil(); + my3DPrimOp = GEOM::GEOM_I3DPrimOperations::_nil(); + myBoolOp = GEOM::GEOM_IBooleanOperations::_nil(); + myInsOp = GEOM::GEOM_IInsertOperations::_nil(); + myTransfOp = GEOM::GEOM_ITransformOperations::_nil(); + myShapesOp = GEOM::GEOM_IShapesOperations::_nil(); + myBlocksOp = GEOM::GEOM_IBlocksOperations::_nil(); + myCurvesOp = GEOM::GEOM_ICurvesOperations::_nil(); + myLocalOp = GEOM::GEOM_ILocalOperations::_nil(); + myGroupOp = GEOM::GEOM_IGroupOperations::_nil(); +} + +//============================================================================= +// destructor +//============================================================================= +GEOM_Superv_i::~GEOM_Superv_i() +{ + MESSAGE("GEOM_Superv_i::~GEOM_Superv_i"); + delete name_service; +} + +//============================================================================ +// function : register() +// purpose : register 'name' in 'name_service' +//============================================================================ +void GEOM_Superv_i::register_name(char * name) +{ + GEOM::GEOM_Superv_ptr g = GEOM::GEOM_Superv::_narrow(POA_GEOM::GEOM_Superv::_this()); + name_service->Register(g, strdup(name)); +} + +//============================================================================= +// setGEOMEngine: +//============================================================================= +void GEOM_Superv_i::setGeomEngine() +{ + // get GEOM_Gen engine + SALOME_LifeCycleCORBA* lcc = new SALOME_LifeCycleCORBA( name_service ); + Engines::Component_var comp = lcc->FindOrLoad_Component( "FactoryServer", "GEOM" ); + + myGeomEngine = GEOM::GEOM_Gen::_narrow(comp); +} + +//============================================================================= +// SetStudyID: +//============================================================================= +void GEOM_Superv_i::SetStudyID( CORBA::Long theId ) +{ + myStudyID = theId; +} + +//============================================================================= +// CreateListOfGO: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::CreateListOfGO() +{ + MESSAGE("GEOM_Superv_i::CreateListOfGO()"); + GEOM_List_i* aListPtr = new GEOM_List_i(); + return aListPtr->_this(); +} + +//============================================================================= +// AddItemToListOfGO: +//============================================================================= +void GEOM_Superv_i::AddItemToListOfGO(GEOM::GEOM_List_ptr& theList, + GEOM::GEOM_Object_ptr theObject) +{ + MESSAGE("GEOM_Superv_i::AddItemToListOfGO(...)"); + if (GEOM_List_i* aList = + dynamic_cast*>(GetServant(theList, myPOA).in())) { + aList->AddObject(theObject); + MESSAGE(" NewLength = "<GetList().length()); + } +} + +//============================================================================= +// CreateListOfLong: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::CreateListOfLong() +{ + MESSAGE("GEOM_Superv_i::CreateListOfLong()"); + GEOM_List_i* aListPtr = new GEOM_List_i(); + return aListPtr->_this(); +} + +//============================================================================= +// AddItemToListOfLong: +//============================================================================= +void GEOM_Superv_i::AddItemToListOfLong(GEOM::GEOM_List_ptr& theList, + long theObject) +{ + MESSAGE("GEOM_Superv_i::AddItemToListOfLong(...)"); + if (GEOM_List_i* aList = + dynamic_cast*>(GetServant(theList, myPOA).in())) { + aList->AddObject(theObject); + MESSAGE(" NewLength = "<GetList().length()); + } +} + +//============================================================================= +// CreateListOfDouble: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::CreateListOfDouble() +{ + MESSAGE("GEOM_Superv_i::CreateListOfDouble()"); + GEOM_List_i* aListPtr = new GEOM_List_i(); + return aListPtr->_this(); +} + +//============================================================================= +// AddItemToListOfDouble: +//============================================================================= +void GEOM_Superv_i::AddItemToListOfDouble(GEOM::GEOM_List_ptr& theList, + double theObject) +{ + MESSAGE("GEOM_Superv_i::AddItemToListOfDouble(...)"); + if (GEOM_List_i* aList = + dynamic_cast*>(GetServant(theList, myPOA).in())) { + aList->AddObject(theObject); + MESSAGE(" NewLength = "<GetList().length()); + } +} + +//============================================================================= +// getBasicOp: +//============================================================================= +void GEOM_Superv_i::getBasicOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IBasicOperations interface + myBasicOp = myGeomEngine->GetIBasicOperations(myStudyID); +} + +//============================================================================= +// get3DPrimOp: +//============================================================================= +void GEOM_Superv_i::get3DPrimOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_I3DPrimOperations interface + my3DPrimOp = myGeomEngine->GetI3DPrimOperations(myStudyID); +} + +//============================================================================= +// getBoolOp: +//============================================================================= +void GEOM_Superv_i::getBoolOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IBooleanOperations interface + myBoolOp = myGeomEngine->GetIBooleanOperations(myStudyID); +} + +//============================================================================= +// getInsOp: +//============================================================================= +void GEOM_Superv_i::getInsOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IInsertOperations interface + myInsOp = myGeomEngine->GetIInsertOperations(myStudyID); +} + +//============================================================================= +// getTransfOp: +//============================================================================= +void GEOM_Superv_i::getTransfOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_ITransformOperations interface + myTransfOp = myGeomEngine->GetITransformOperations(myStudyID); +} + +//============================================================================= +// getShapesOp: +//============================================================================= +void GEOM_Superv_i::getShapesOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IShapesOperations interface + myShapesOp = myGeomEngine->GetIShapesOperations(myStudyID); +} + +//============================================================================= +// getBlocksOp: +//============================================================================= +void GEOM_Superv_i::getBlocksOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IBlocksOperations interface + myBlocksOp = myGeomEngine->GetIBlocksOperations(myStudyID); +} + +//============================================================================= +// getCurvesOp: +//============================================================================= +void GEOM_Superv_i::getCurvesOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_ICurvesOperations interface + myCurvesOp = myGeomEngine->GetICurvesOperations(myStudyID); +} + +//============================================================================= +// getLocalOp: +//============================================================================= +void GEOM_Superv_i::getLocalOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_ILocalOperations interface + myLocalOp = myGeomEngine->GetILocalOperations(myStudyID); +} + +//============================================================================= +// getGroupOp: +//============================================================================= +void GEOM_Superv_i::getGroupOp() +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + // get GEOM_IGroupOperations interface + myGroupOp = myGeomEngine->GetIGroupOperations(myStudyID); +} + +//============================================================================= +// GetServant: +//============================================================================= +PortableServer::ServantBase_var GEOM_Superv_i::GetServant(CORBA::Object_ptr theObject, + PortableServer::POA_ptr thePOA) +{ + if(CORBA::is_nil(theObject)) return NULL; + PortableServer::Servant aServant = thePOA->reference_to_servant(theObject); + return aServant; +} + +//============================================================================ +// function : Save() +// purpose : save OCAF/Geom document +//============================================================================ +SALOMEDS::TMPFile* GEOM_Superv_i::Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile) +{ + SALOMEDS::TMPFile_var aStreamFile; + return aStreamFile._retn(); +} + +//============================================================================ +// function : SaveASCII() +// purpose : +//============================================================================ +SALOMEDS::TMPFile* GEOM_Superv_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile) +{ + SALOMEDS::TMPFile_var aStreamFile; + return aStreamFile._retn(); +} + +//============================================================================ +// function : Load() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Superv_i::Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) +{ + return false; +} + +//============================================================================ +// function : LoadASCII() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Superv_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile) +{ + return false; +} + +//============================================================================ +// function : Close() +// purpose : +//============================================================================ +void GEOM_Superv_i::Close(SALOMEDS::SComponent_ptr theComponent) +{} + +//============================================================================ +// function : ComponentDataType() +// purpose : +//============================================================================ +char* GEOM_Superv_i::ComponentDataType() +{ + return 0; +} + +//============================================================================ +// function : IORToLocalPersistentID() +// purpose : +//============================================================================ +char* GEOM_Superv_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + return 0; +} + +//============================================================================ +// function : LocalPersistentIDToIOR() +// purpose : Create/Load CORBA object from a persistent ref (an entry) +// : Used when a study is loaded +// : The IOR (IORName) of object created is returned +//============================================================================ +char* GEOM_Superv_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII) +{ + return 0; +} + +//============================================================================ +// function : CanPublishInStudy +// purpose : +//============================================================================ +bool GEOM_Superv_i::CanPublishInStudy(CORBA::Object_ptr theIOR) +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + return myGeomEngine->CanPublishInStudy(theIOR); +} + +//============================================================================ +// function : PublishInStudy +// purpose : +//============================================================================ +SALOMEDS::SObject_ptr GEOM_Superv_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) +{ + if (CORBA::is_nil(myGeomEngine)) + setGeomEngine(); + return myGeomEngine->PublishInStudy(theStudy, theSObject, theObject, theName); +} + +//============================================================================ +// function : CanCopy() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Superv_i::CanCopy(SALOMEDS::SObject_ptr theObject) +{ + return false; +} + +//============================================================================ +// function : CopyFrom() +// purpose : +//============================================================================ +SALOMEDS::TMPFile* GEOM_Superv_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) +{ + SALOMEDS::TMPFile_var aStreamFile; + return aStreamFile._retn(); +} + +//============================================================================ +// function : CanPaste() +// purpose : +//============================================================================ +CORBA::Boolean GEOM_Superv_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) +{ + return false; +} + +//============================================================================ +// function : PasteInto() +// purpose : +//============================================================================ +SALOMEDS::SObject_ptr GEOM_Superv_i::PasteInto(const SALOMEDS::TMPFile& theStream, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject) +{ + SALOMEDS::SObject_var aNewSO; + return aNewSO._retn(); +} + +//================= Primitives Construction : BasicOperations ================= +//============================================================================= +// MakePointXYZ: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointXYZ(CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ) +{ + MESSAGE("GEOM_Superv_i::MakePointXYZ"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + // make vertex and return + return myBasicOp->MakePointXYZ(theX, theY, theZ); +} + +//============================================================================= +// MakePointWithReference: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointWithReference (GEOM::GEOM_Object_ptr theReference, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ) +{ + MESSAGE("GEOM_Superv_i::MakePointWithReference"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakePointWithReference(theReference, theX, theY, theZ); +} + +//============================================================================= +// MakePointOnCurve: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePointOnCurve (GEOM::GEOM_Object_ptr theRefCurve, + CORBA::Double theParameter) +{ + MESSAGE("GEOM_Superv_i::MakePointOnCurve"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakePointOnCurve(theRefCurve, theParameter); +} + +//============================================================================= +// MakeVectorDXDYDZ: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeVectorDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ) +{ + MESSAGE("GEOM_Superv_i::MakeVectorDXDYDZ"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakeVectorDXDYDZ(theDX, theDY, theDZ); +} + +//============================================================================= +// MakeVectorTwoPnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeVectorTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2) +{ + MESSAGE("GEOM_Superv_i::MakeVector"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakeVectorTwoPnt(thePnt1, thePnt2); +} + +//============================================================================= +// MakeLineTwoPnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeLineTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2) +{ + MESSAGE("GEOM_Superv_i::MakeLineTwoPnt"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakeLineTwoPnt(thePnt1, thePnt2); +} + +//============================================================================= +// MakePlaneThreePnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePlaneThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + CORBA::Double theTrimSize) +{ + MESSAGE("GEOM_Superv_i::MakePlaneThreePnt"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakePlaneThreePnt(thePnt1, thePnt2, thePnt3, theTrimSize); +} + +//============================================================================= +// MakePlanePntVec: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePlanePntVec (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theTrimSize) +{ + MESSAGE("GEOM_Superv_i::MakePlanePntVec"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakePlanePntVec(thePnt, theVec, theTrimSize); +} + +//============================================================================= +// MakePlaneFace: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePlaneFace (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theTrimSize) +{ + MESSAGE("GEOM_Superv_i::MakePlaneFace"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakePlaneFace(theFace, theTrimSize); +} + +//============================================================================= +// MakeMarker: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMarker +(CORBA::Double theOX , CORBA::Double theOY , CORBA::Double theOZ, + CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, + CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ) +{ + MESSAGE("GEOM_Superv_i::MakeMarker"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + return myBasicOp->MakeMarker(theOX, theOY, theOZ, theXDX, theXDY, theXDZ, theYDX, theYDY, theYDZ); +} + +//================= Primitives Construction : 3DPrimOperations ================ +//============================================================================= +// MakeBox: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeBox (CORBA::Double theX1, + CORBA::Double theY1, + CORBA::Double theZ1, + CORBA::Double theX2, + CORBA::Double theY2, + CORBA::Double theZ2) +{ + MESSAGE("GEOM_Superv_i::MakeBox"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeBoxTwoPnt(myBasicOp->MakePointXYZ(theX1, theY1, theZ1), + myBasicOp->MakePointXYZ(theX2, theY2, theZ2)); +} + +//============================================================================= +// MakeBoxDXDYDZ: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeBoxDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ) +{ + MESSAGE("GEOM_Superv_i::MakeBoxDXDYDZ"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeBoxDXDYDZ(theDX, theDY, theDZ); +} + +//============================================================================= +// MakeBoxTwoPnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeBoxTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2) +{ + MESSAGE("GEOM_Superv_i::MakeBoxTwoPnt"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeBoxTwoPnt(thePnt1, thePnt2); +} + +//============================================================================= +// MakeCylinderPntVecRH: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCylinderPntVecRH (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + CORBA::Double theHeight) +{ + MESSAGE("GEOM_Superv_i::MakeCylinderPntVecRH"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeCylinderPntVecRH(thePnt, theAxis, theRadius, theHeight); +} + +//============================================================================= +// MakeCylinderRH: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCylinderRH (CORBA::Double theR, + CORBA::Double theH) +{ + MESSAGE("GEOM_Superv_i::MakeCylinderRH"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeCylinderRH(theR, theH); +} + +//============================================================================= +// MakeSphere: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSphere (CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theRadius) +{ + MESSAGE("GEOM_Superv_i::MakeSphepe"); + if (CORBA::is_nil(myBasicOp)) getBasicOp(); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeSpherePntR(myBasicOp->MakePointXYZ(theX, theY, theZ), theRadius); +} + +//============================================================================= +// MakeSphereR: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSphereR (CORBA::Double theR) +{ + MESSAGE("GEOM_Superv_i::MakeSphereR"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeSphereR(theR); +} + +//============================================================================= +// MakeSpherePntR: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSpherePntR (GEOM::GEOM_Object_ptr thePnt, + CORBA::Double theR) +{ + MESSAGE("GEOM_Superv_i::MakeSpherePntR"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeSpherePntR(thePnt, theR); +} + +//============================================================================= +// MakeTorusPntVecRR: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeTorusPntVecRR (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, + CORBA::Double theRMinor) +{ + MESSAGE("GEOM_Superv_i::MakeTorusPntVecRR"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeTorusPntVecRR(thePnt, theVec, theRMajor, theRMinor); +} + +//============================================================================= +// MakeTorusRR: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeTorusRR (CORBA::Double theRMajor, + CORBA::Double theRMinor) +{ + MESSAGE("GEOM_Superv_i::MakeTorusRR"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeTorusRR(theRMajor, theRMinor); +} + +//============================================================================= +// MakeConePntVecR1R2H: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeConePntVecR1R2H (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight) +{ + MESSAGE("GEOM_Superv_i::MakeConePntVecR1R2H"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeConePntVecR1R2H(thePnt, theAxis, theR1, theR2, theHeight); +} + +//============================================================================= +// MakeConeR1R2H: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeConeR1R2H (CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight) +{ + MESSAGE("GEOM_Superv_i::MakeConeR1R2H"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeConeR1R2H(theR1, theR2, theHeight); +} + +//============================================================================= +// MakePrismVecH: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePrismVecH (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH) +{ + MESSAGE("GEOM_Superv_i::MakePrismVecH"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakePrismVecH(theBase, theVec, theH); +} + + +//============================================================================= +// MakePrismTwoPnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePrismTwoPnt (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + MESSAGE("GEOM_Superv_i::MakePrismTwoPnt"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakePrismTwoPnt(theBase, thePoint1, thePoint2); +} + +//============================================================================= +// MakePipe: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePipe (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath) +{ + MESSAGE("GEOM_Superv_i::MakePipe"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakePipe(theBase, thePath); +} + +//============================================================================= +// MakeRevolutionAxisAngle: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeRevolutionAxisAngle (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + MESSAGE("GEOM_Superv_i::MakeRevolutionAxisAngle"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeRevolutionAxisAngle(theBase, theAxis, theAngle); +} + +//============================================================================= +// MakeFilling: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilling (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theMinDeg, CORBA::Long theMaxDeg, + CORBA::Double theTol2D, CORBA::Double theTol3D, + CORBA::Long theNbIter) +{ + MESSAGE("GEOM_Superv_i::MakeFilling"); + if (CORBA::is_nil(my3DPrimOp)) get3DPrimOp(); + return my3DPrimOp->MakeFilling(theShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter); +} + +//============================= BooleanOperations ============================= +//============================================================================= +// MakeBoolean: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeBoolean (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOperation) +{ + // theOperation indicates the operation to be done: + // 1 - Common, 2 - Cut, 3 - Fuse, 4 - Section + MESSAGE("GEOM_Superv_i::MakeBoolean"); + if (CORBA::is_nil(myBoolOp)) getBoolOp(); + return myBoolOp->MakeBoolean(theShape1, theShape2, theOperation); +} + +//============================================================================= +// MakeFuse: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFuse (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2) +{ + MESSAGE("GEOM_Superv_i::MakeFuse"); + if (CORBA::is_nil(myBoolOp)) getBoolOp(); + return myBoolOp->MakeBoolean(theShape1, theShape2, 3); +} + +//============================================================================= +// MakePartition: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePartition (GEOM::GEOM_List_ptr theShapes, + GEOM::GEOM_List_ptr theTools, + GEOM::GEOM_List_ptr theKeepInside, + GEOM::GEOM_List_ptr theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + GEOM::GEOM_List_ptr theMaterials) +{ + MESSAGE("GEOM_Superv_i::MakePartition"); + GEOM_List_i* aListImplS = + dynamic_cast*>(GetServant(theShapes, myPOA).in()); + GEOM_List_i* aListImplT = + dynamic_cast*>(GetServant(theTools, myPOA).in()); + GEOM_List_i* aListImplKI = + dynamic_cast*>(GetServant(theKeepInside, myPOA).in()); + GEOM_List_i* aListImplRI = + dynamic_cast*>(GetServant(theRemoveInside, myPOA).in()); + GEOM_List_i* aListImplM = + dynamic_cast*>(GetServant(theMaterials, myPOA).in()); + if (aListImplS && aListImplT && aListImplKI && aListImplRI && aListImplM) { + if (CORBA::is_nil(myBoolOp)) getBoolOp(); + return myBoolOp->MakePartition(aListImplS->GetList(), aListImplT->GetList(), + aListImplKI->GetList(), aListImplRI->GetList(), + theLimit, theRemoveWebs, aListImplM->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeHalfPartition: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeHalfPartition (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane) +{ + MESSAGE("GEOM_Superv_i::MakeHalfPartition"); + if (CORBA::is_nil(myBoolOp)) getBoolOp(); + return myBoolOp->MakeHalfPartition(theShape, thePlane); +} + +//============================== InsertOperations ============================= +//============================================================================= +// MakeCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCopy (GEOM::GEOM_Object_ptr theOriginal) +{ + MESSAGE("GEOM_Superv_i::MakeCopy"); + if (CORBA::is_nil(myInsOp)) getInsOp(); + return myInsOp->MakeCopy(theOriginal); +} + +//============================================================================= +// Export: +//============================================================================= +void GEOM_Superv_i::Export (GEOM::GEOM_Object_ptr theObject, + const char* theFileName, + const char* theFormatName) +{ + MESSAGE("GEOM_Superv_i::Export"); + if (CORBA::is_nil(myInsOp)) getInsOp(); + myInsOp->Export(theObject, theFileName, theFormatName); +} + +//============================================================================= +// Import: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::Import (const char* theFileName, + const char* theFormatName) +{ + MESSAGE("GEOM_Superv_i::Import"); + if (CORBA::is_nil(myInsOp)) getInsOp(); + return myInsOp->Import(theFileName, theFormatName); +} + +//============================================================================= +// ImportTranslators: +//============================================================================= +void GEOM_Superv_i::ImportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns) +{ + MESSAGE("GEOM_Superv_i::ImportTranslators"); + if (CORBA::is_nil(myInsOp)) getInsOp(); + myInsOp->ImportTranslators(theFormats, thePatterns); +} + +//============================================================================= +// ExportTranslators: +//============================================================================= +void GEOM_Superv_i::ExportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns) +{ + MESSAGE("GEOM_Superv_i::ExportTranslators"); + if (CORBA::is_nil(myInsOp)) getInsOp(); + myInsOp->ExportTranslators(theFormats, thePatterns); +} + +//============================= TransformOperations =========================== +//============================================================================= +// TranslateTwoPoints: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + MESSAGE("GEOM_Superv_i::TranslateTwoPoints"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateTwoPoints(theObject, thePoint1, thePoint2); +} + +//============================================================================= +// TranslateTwoPointsCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + MESSAGE("GEOM_Superv_i::TranslateTwoPointsCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateTwoPointsCopy(theObject, thePoint1, thePoint2); +} + +//============================================================================= +// TranslateDXDYDZ: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ) +{ + MESSAGE("GEOM_Superv_i::TranslateDXDYDZ"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateDXDYDZ(theObject, theDX, theDY, theDZ); +} + +//============================================================================= +// TranslateDXDYDZCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ) +{ + MESSAGE("GEOM_Superv_i::TranslateDXDYDZCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateDXDYDZCopy(theObject, theDX, theDY, theDZ); +} + +//============================================================================= +// TranslateVector: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateVector (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector) +{ + MESSAGE("GEOM_Superv_i::TranslateVector"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateVector(theObject, theVector); +} + +//============================================================================= +// TranslateVectorCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector) +{ + MESSAGE("GEOM_Superv_i::TranslateVectorCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->TranslateVectorCopy(theObject, theVector); +} + +//============================================================================= +// MultiTranslate1D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MultiTranslate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theStep, + CORBA::Long theNbTimes) +{ + MESSAGE("GEOM_Superv_i::MultiTranslate1D"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MultiTranslate1D(theObject, theVector, theStep, theNbTimes); +} + +//============================================================================= +// MultiTranslate2D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector1, + CORBA::Double theStep1, + CORBA::Long theNbTimes1, + GEOM::GEOM_Object_ptr theVector2, + CORBA::Double theStep2, + CORBA::Long theNbTimes2) +{ + MESSAGE("GEOM_Superv_i::MultiTranslate2D"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MultiTranslate2D(theObject, theVector1, theStep1, theNbTimes1, + theVector2, theStep2, theNbTimes2); +} + +//============================================================================= +// Rotate: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::Rotate (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + MESSAGE("GEOM_Superv_i::Rotate"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->Rotate(theObject, theAxis, theAngle); +} + +//============================================================================= +// RotateCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::RotateCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle) +{ + MESSAGE("GEOM_Superv_i::RotateCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->RotateCopy(theObject, theAxis, theAngle); +} + +//============================================================================= +// MultiRotate1D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MultiRotate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Long theNbTimes) +{ + MESSAGE("GEOM_Superv_i::MultiRotate1D"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MultiRotate1D(theObject, theAxis, theNbTimes); +} + +//============================================================================= +// MultiRotate2D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MultiRotate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle, + CORBA::Long theNbTimes1, + CORBA::Double theStep, + CORBA::Long theNbTimes2) +{ + MESSAGE("GEOM_Superv_i::MultiRotate2D"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MultiRotate2D(theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2); +} + +//============================================================================= +// MirrorPlane: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorPlane (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane) +{ + MESSAGE("GEOM_Superv_i::MirrorPlane"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorPlane(theObject, thePlane); +} + +//============================================================================= +// MirrorPlaneCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane) +{ + MESSAGE("GEOM_Superv_i::MirrorPlaneCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorPlaneCopy(theObject, thePlane); +} + +//============================================================================= +// MirrorAxis: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorAxis (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis) +{ + MESSAGE("GEOM_Superv_i::MirrorAxis"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorAxis(theObject, theAxis); +} + +//============================================================================= +// MirrorAxisCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis) +{ + MESSAGE("GEOM_Superv_i::MirrorAxisCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorAxisCopy(theObject, theAxis); +} + +//============================================================================= +// MirrorPoint: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorPoint (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint) +{ + MESSAGE("GEOM_Superv_i::MirrorPoint"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorPoint(theObject, thePoint); +} + +//============================================================================= +// MirrorPointCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MirrorPointCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint) +{ + MESSAGE("GEOM_Superv_i::MirrorPointCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->MirrorPointCopy(theObject, thePoint); +} + +//============================================================================= +// OffsetShape: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset) +{ + MESSAGE("GEOM_Superv_i::OffsetShape"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->OffsetShape(theObject, theOffset); +} + +//============================================================================= +// OffsetShapeCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset) +{ + MESSAGE("GEOM_Superv_i::OffsetShapeCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->OffsetShapeCopy(theObject, theOffset); +} + +//============================================================================= +// ScaleShape: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::ScaleShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor) +{ + MESSAGE("GEOM_Superv_i::ScaleShape"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->ScaleShape(theObject, thePoint, theFactor); +} + +//============================================================================= +// ScaleShapeCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor) +{ + MESSAGE("GEOM_Superv_i::ScaleShapeCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->ScaleShapeCopy(theObject, thePoint, theFactor); +} + +//============================================================================= +// PositionShape: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS) +{ + MESSAGE("GEOM_Superv_i::PositionShape"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->PositionShape(theObject, theStartLCS, theEndLCS); +} + +//============================================================================= +// PositionShapeCopy: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::PositionShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS) +{ + MESSAGE("GEOM_Superv_i::PositionShapeCopy"); + if (CORBA::is_nil(myTransfOp)) getTransfOp(); + return myTransfOp->PositionShapeCopy(theObject, theStartLCS, theEndLCS); +} + +//=============================== ShapesOperations ============================ +//============================================================================= +// Make: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEdge (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2) +{ + MESSAGE("GEOM_Superv_i::MakeEdge"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeEdge(thePnt1, thePnt2); +} + +//============================================================================= +// MakeWire: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires) +{ + MESSAGE("GEOM_Superv_i::MakeWire"); + if (GEOM_List_i* aListImplEW = + dynamic_cast*>(GetServant(theEdgesAndWires, myPOA).in())) { + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeWire(aListImplEW->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeFace: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFace (GEOM::GEOM_Object_ptr theWire, + CORBA::Boolean isPlanarWanted) +{ + MESSAGE("GEOM_Superv_i::MakeFace"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeFace(theWire, isPlanarWanted); +} + +//============================================================================= +// MakeFaceWires: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFaceWires (GEOM::GEOM_List_ptr theWires, + CORBA::Boolean isPlanarWanted) +{ + MESSAGE("GEOM_Superv_i::MakeFaceWires"); + if (GEOM_List_i* aListImplW = + dynamic_cast*>(GetServant(theWires, myPOA).in())) { + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeFaceWires(aListImplW->GetList(), isPlanarWanted); + } + return NULL; +} + +//============================================================================= +// MakeShell: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeShell (GEOM::GEOM_List_ptr theFacesAndShells) +{ + MESSAGE("GEOM_Superv_i::MakeShell"); + if (GEOM_List_i* aListImplFS = + dynamic_cast*>(GetServant(theFacesAndShells, myPOA).in())) { + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeShell(aListImplFS->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeSolidShell: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSolidShell (GEOM::GEOM_Object_ptr theShell) +{ + MESSAGE("GEOM_Superv_i::MakeSolidShell"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeSolidShell(theShell); +} + +//============================================================================= +// MakeSolidShells: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSolidShells (GEOM::GEOM_List_ptr theShells) +{ + MESSAGE("GEOM_Superv_i::MakeSolidShells"); + if (GEOM_List_i* aListImplS = + dynamic_cast*>(GetServant(theShells, myPOA).in())) { + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeSolidShells(aListImplS->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeCompound: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCompound (GEOM::GEOM_List_ptr theShapes) +{ + MESSAGE("GEOM_Superv_i::MakeCompound"); + if (GEOM_List_i* aListImpl = + dynamic_cast*>(GetServant(theShapes, myPOA).in())) { + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeCompound(aListImpl->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeGlueFaces: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theTolerance) +{ + MESSAGE("GEOM_Superv_i::MakeGlueFaces"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->MakeGlueFaces(theShape, theTolerance); +} + +//============================================================================= +// MakeExplode: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::MakeExplode (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + CORBA::Boolean isSorted) +{ + MESSAGE("GEOM_Superv_i::MakeExplode"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + + GEOM::ListOfGO* aList = myShapesOp->MakeExplode(theShape, theShapeType, isSorted); + GEOM_List_i* aListPtr = new GEOM_List_i(*(aList)); + MESSAGE(" List of "<GetList().length()<<" element(s)"); + return aListPtr->_this(); +} + +//============================================================================= +// NumberOfFaces: +//============================================================================= +CORBA::Long GEOM_Superv_i::NumberOfFaces (GEOM::GEOM_Object_ptr theShape) +{ + MESSAGE("GEOM_Superv_i::NumberOfFaces"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->NumberOfFaces(theShape); +} + +//============================================================================= +// NumberOfEdges: +//============================================================================= +CORBA::Long GEOM_Superv_i::NumberOfEdges (GEOM::GEOM_Object_ptr theShape) +{ + MESSAGE("GEOM_Superv_i::NumberOfEdges"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->NumberOfEdges(theShape); +} + +//============================================================================= +// ChangeOrientation: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::ChangeOrientation (GEOM::GEOM_Object_ptr theShape) +{ + MESSAGE("GEOM_Superv_i::ChangeOrientation"); + if (CORBA::is_nil(myShapesOp)) getShapesOp(); + return myShapesOp->ChangeOrientation(theShape); +} + + +//=============================== BlocksOperations ============================ +//============================================================================= +// MakeQuad4Vertices: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeQuad4Vertices (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + GEOM::GEOM_Object_ptr thePnt4) +{ + MESSAGE("GEOM_Superv_i::MakeQuad4Vertices"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeQuad4Vertices(thePnt1, thePnt2, thePnt3, thePnt4); +} + +//============================================================================= +// MakeQuad: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeQuad (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2, + GEOM::GEOM_Object_ptr theEdge3, + GEOM::GEOM_Object_ptr theEdge4) +{ + MESSAGE("GEOM_Superv_i::MakeQuad"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeQuad(theEdge1, theEdge2, theEdge3, theEdge4); +} + +//============================================================================= +// MakeQuad2Edges: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeQuad2Edges (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2) +{ + MESSAGE("GEOM_Superv_i::MakeQuad2Edges"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeQuad2Edges(theEdge1, theEdge2); +} + +//============================================================================= +// MakeHexa: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeHexa (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2, + GEOM::GEOM_Object_ptr theFace3, + GEOM::GEOM_Object_ptr theFace4, + GEOM::GEOM_Object_ptr theFace5, + GEOM::GEOM_Object_ptr theFace6) +{ + MESSAGE("GEOM_Superv_i::MakeHexa"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeHexa(theFace1, theFace2, theFace3, theFace4, theFace5, theFace6); +} + +//============================================================================= +// MakeHexa2Faces: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeHexa2Faces (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2) +{ + MESSAGE("GEOM_Superv_i::MakeHexa2Faces"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeHexa2Faces(theFace1, theFace2); +} + +//============================================================================= +// GetPoint: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetPoint (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theEpsilon) +{ + MESSAGE("GEOM_Superv_i::GetPoint"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetPoint(theShape, theX, theY, theZ, theEpsilon); +} + +//============================================================================= +// GetEdge: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetEdge (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2) +{ + MESSAGE("GEOM_Superv_i::GetEdge"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetEdge(theShape, thePoint1, thePoint2); +} + +//============================================================================= +// GetEdgeNearPoint: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint) +{ + MESSAGE("GEOM_Superv_i::GetEdgeNearPoint"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetEdgeNearPoint(theShape, thePoint); +} + +//============================================================================= +// GetFaceByPoints: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetFaceByPoints (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + GEOM::GEOM_Object_ptr thePoint3, + GEOM::GEOM_Object_ptr thePoint4) +{ + MESSAGE("GEOM_Superv_i::GetFaceByPoints"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetFaceByPoints(theShape, thePoint1, thePoint2, thePoint3, thePoint4); +} + +//============================================================================= +// GetFaceByEdges: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetFaceByEdges (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2) +{ + MESSAGE("GEOM_Superv_i::GetFaceByEdges"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetFaceByEdges(theShape, theEdge1, theEdge2); +} + +//============================================================================= +// GetOppositeFace: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetOppositeFace (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theFace) +{ + MESSAGE("GEOM_Superv_i::GetOppositeFace"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetOppositeFace(theBlock, theFace); +} + +//============================================================================= +// GetFaceNearPoint: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint) +{ + MESSAGE("GEOM_Superv_i::GetFaceNearPoint"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetFaceNearPoint(theShape, thePoint); +} + +//============================================================================= +// GetFaceByNormale: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetFaceByNormale (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theVector) +{ + MESSAGE("GEOM_Superv_i::GetFaceByNormale"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetFaceByNormale(theBlock, theVector); +} + +//============================================================================= +// IsCompoundOfBlocks: +//============================================================================= +CORBA::Boolean GEOM_Superv_i::IsCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces, + CORBA::Long& theNbBlocks) +{ + MESSAGE("GEOM_Superv_i::IsCompoundOfBlocks"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->IsCompoundOfBlocks(theCompound, theMinNbFaces, theMaxNbFaces, theNbBlocks); +} + +//============================================================================= +// CheckCompoundOfBlocks: +//============================================================================= +CORBA::Boolean GEOM_Superv_i::CheckCompoundOfBlocks +(GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors) +{ + MESSAGE("GEOM_Superv_i::CheckCompoundOfBlocks"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->CheckCompoundOfBlocks(theCompound, theErrors); +} + +//============================================================================= +// PrintBCErrors: +//============================================================================= +char* GEOM_Superv_i::PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, + const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors) +{ + MESSAGE("GEOM_Superv_i::PrintBCErrors"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->PrintBCErrors(theCompound, theErrors); +} + +//============================================================================= +// ExplodeCompoundOfBlocks: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::ExplodeCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces) +{ + MESSAGE("GEOM_Superv_i::ExplodeCompoundOfBlocks"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + GEOM::ListOfGO* aBlocks = myBlocksOp->ExplodeCompoundOfBlocks(theCompound, theMinNbFaces, theMaxNbFaces); + GEOM_List_i* aListPtr = new GEOM_List_i(*(aBlocks)); + return aListPtr->_this(); +} + +//============================================================================= +// GetBlockNearPoint: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_Object_ptr thePoint) +{ + MESSAGE("GEOM_Superv_i::GetBlockNearPoint"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetBlockNearPoint(theCompound, thePoint); +} + +//============================================================================= +// GetBlockByParts: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetBlockByParts (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_List_ptr theParts) +{ + MESSAGE("GEOM_Superv_i::GetBlockByParts"); + if (GEOM_List_i* aListImplP = + dynamic_cast*>(GetServant(theParts, myPOA).in())) { + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->GetBlockByParts(theCompound, aListImplP->GetList()); + } + return NULL; +} + +//============================================================================= +// GetBlocksByParts: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_List_ptr theParts) +{ + MESSAGE("GEOM_Superv_i::GetBlocksByParts"); + if (GEOM_List_i* aListImplP = + dynamic_cast*>(GetServant(theParts, myPOA).in())) { + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + + GEOM::ListOfGO* aBlocks = myBlocksOp->GetBlocksByParts(theCompound, aListImplP->GetList()); + GEOM_List_i* aListPtr = new GEOM_List_i(*(aBlocks)); + return aListPtr->_this(); + } + return NULL; +} + +//============================================================================= +// MakeMultiTransformation1D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMultiTransformation1D (GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1, + CORBA::Long theDirFace2, + CORBA::Long theNbTimes) +{ + MESSAGE("GEOM_Superv_i::MakeMultiTransformation1D"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeMultiTransformation1D(theBlock, theDirFace1, theDirFace2, theNbTimes); +} + +//============================================================================= +// MakeMultiTransformation2D: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMultiTransformation2D +(GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1U, + CORBA::Long theDirFace2U, + CORBA::Long theNbTimesU, + CORBA::Long theDirFace1V, + CORBA::Long theDirFace2V, + CORBA::Long theNbTimesV) +{ + MESSAGE("GEOM_Superv_i::MakeMultiTransformation2D"); + if (CORBA::is_nil(myBlocksOp)) getBlocksOp(); + return myBlocksOp->MakeMultiTransformation2D(theBlock, + theDirFace1U, theDirFace2U, theNbTimesU, + theDirFace1V, theDirFace2V, theNbTimesV); +} + +//=============================== CurvesOperations ============================ +//============================================================================= +// MakeCirclePntVecR: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theR) +{ + MESSAGE("GEOM_Superv_i::MakeCirclePntVecR"); + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeCirclePntVecR(theCenter, theVector, theR); +} + +//============================================================================= +// MakeCircleThreePnt: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + MESSAGE("GEOM_Superv_i::MakeCircleThreePnt"); + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeCircleThreePnt(thePnt1, thePnt2, thePnt3); +} + +//============================================================================= +// MakeEllipse: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEllipse (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, + CORBA::Double theRMinor) +{ + MESSAGE("GEOM_Superv_i::MakeEllipse"); + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeEllipse(theCenter, theVector, theRMajor, theRMinor); +} + +//============================================================================= +// MakeArc: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArc (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3) +{ + MESSAGE("GEOM_Superv_i::MakeArc"); + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeArc(thePnt1, thePnt2, thePnt3); +} + +//============================================================================= +// MakePolyline: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakePolyline (GEOM::GEOM_List_ptr thePoints) +{ + MESSAGE("GEOM_Superv_i::MakePolyline"); + if (GEOM_List_i* aListImplP = + dynamic_cast*>(GetServant(thePoints, myPOA).in())) { + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakePolyline(aListImplP->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeSplineBezier: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineBezier (GEOM::GEOM_List_ptr thePoints) +{ + MESSAGE("GEOM_Superv_i::MakeSplineBezier"); + if (GEOM_List_i* aListImplP = + dynamic_cast*>(GetServant(thePoints, myPOA).in())) { + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeSplineBezier(aListImplP->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeSplineInterpolation: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSplineInterpolation (GEOM::GEOM_List_ptr thePoints) +{ + MESSAGE("GEOM_Superv_i::MakeSplineInterpolation"); + if (GEOM_List_i* aListImplP = + dynamic_cast*>(GetServant(thePoints, myPOA).in())) { + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeSplineInterpolation(aListImplP->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeSketcher: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSketcher (const char* theCommand, + GEOM::GEOM_List_ptr theWorkingPlane) +{ + MESSAGE("GEOM_Superv_i::MakeSketcher"); + if (GEOM_List_i* aListImplWP = + dynamic_cast*>(GetServant(theWorkingPlane, myPOA).in())) { + if (CORBA::is_nil(myCurvesOp)) getCurvesOp(); + return myCurvesOp->MakeSketcher(theCommand, aListImplWP->GetList()); + } + return NULL; +} + +//=============================== LocalOperations ============================= +//============================================================================= +// MakeFilletAll: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilletAll (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR) +{ + MESSAGE("GEOM_Superv_i::MakeFilletAllMakeSketcher"); + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeFilletAll(theShape, theR); +} + +//============================================================================= +// MakeFilletEdges: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilletEdges (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR, + GEOM::GEOM_List_ptr theEdges) +{ + MESSAGE("GEOM_Superv_i::MakeFilletEdges"); + if (GEOM_List_i* aListImplE = + dynamic_cast*>(GetServant(theEdges, myPOA).in())) { + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeFilletEdges(theShape, theR, aListImplE->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeFilletFaces: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeFilletFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR, + GEOM::GEOM_List_ptr theFaces) +{ + MESSAGE("GEOM_Superv_i::MakeFilletFaces"); + if (GEOM_List_i* aListImplF = + dynamic_cast*>(GetServant(theFaces, myPOA).in())) { + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeFilletFaces(theShape, theR, aListImplF->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeChamferAll: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD) +{ + MESSAGE("GEOM_Superv_i::MakeChamferAll"); + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeChamferAll(theShape, theD); +} + +//============================================================================= +// MakeChamferEdge: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeChamferEdge (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + CORBA::Long theFace1, CORBA::Long theFace2) +{ + MESSAGE("GEOM_Superv_i::MakeChamferEdge"); + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeChamferEdge(theShape, theD1, theD2, theFace1, theFace2); +} + +//============================================================================= +// MakeChamferFaces: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeChamferFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + GEOM::GEOM_List_ptr theFaces) +{ + MESSAGE("GEOM_Superv_i::MakeChamferFaces"); + if (GEOM_List_i* aListImplF = + dynamic_cast*>(GetServant(theFaces, myPOA).in())) { + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeChamferFaces(theShape, theD1, theD2, aListImplF->GetList()); + } + return NULL; +} + +//============================================================================= +// MakeArchimede: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeArchimede (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theWeight, + CORBA::Double theWaterDensity, + CORBA::Double theMeshingDeflection) +{ + MESSAGE("GEOM_Superv_i::MakeArchimede"); + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->MakeArchimede(theShape, theWeight, theWaterDensity, theMeshingDeflection); +} + +//============================================================================= +// GetSubShapeIndexMakeFilletAll: +//============================================================================= +CORBA::Long GEOM_Superv_i::GetSubShapeIndex (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theSubShape) +{ + MESSAGE("GEOM_Superv_i::GetSubShapeIndexMakeArchimede"); + if (CORBA::is_nil(myLocalOp)) getLocalOp(); + return myLocalOp->GetSubShapeIndex(theShape, theSubShape); +} + +//=============================== GroupOperations ============================= +//============================================================================= +// CreateGroup: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::CreateGroup (GEOM::GEOM_Object_ptr theMainShape, + CORBA::Long theShapeType) +{ + MESSAGE("GEOM_Superv_i::CreateGroup"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + return myGroupOp->CreateGroup(theMainShape, theShapeType); +} + +//============================================================================= +// AddObject: +//============================================================================= +void GEOM_Superv_i::AddObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId) +{ + MESSAGE("GEOM_Superv_i::AddObject"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + myGroupOp->AddObject(theGroup, theSubShapeId); +} + +//============================================================================= +// RemoveObject: +//============================================================================= +void GEOM_Superv_i::RemoveObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId) +{ + MESSAGE("GEOM_Superv_i::RemoveObject"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + myGroupOp->RemoveObject(theGroup, theSubShapeId); +} + +//============================================================================= +// GetType: +//============================================================================= +CORBA::Long GEOM_Superv_i::GetType (GEOM::GEOM_Object_ptr theGroup) +{ + MESSAGE("GEOM_Superv_i::GetType"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + return myGroupOp->GetType(theGroup); +} + +//============================================================================= +// GetMainShape: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::GetMainShape (GEOM::GEOM_Object_ptr theGroup) +{ + MESSAGE("GEOM_Superv_i::GetMainShape"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + return myGroupOp->GetMainShape(theGroup); +} + +//============================================================================= +// GetObjects: +//============================================================================= +GEOM::GEOM_List_ptr GEOM_Superv_i::GetObjects (GEOM::GEOM_Object_ptr theGroup) +{ + MESSAGE("GEOM_Superv_i::GetObjects"); + if (CORBA::is_nil(myGroupOp)) getGroupOp(); + + GEOM::ListOfLong* aList = myGroupOp->GetObjects(theGroup); + GEOM_List_i* aListPtr = new GEOM_List_i(*(aList)); + MESSAGE(" List of "<GetList().length()<<" element(s)"); + return aListPtr->_this(); +} + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ + PortableServer::ObjectId * GEOM_SupervEngine_factory(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char * interfaceName) + { + GEOM_Superv_i * myGEOM_Superv_i = new GEOM_Superv_i(orb, poa, contId, instanceName, interfaceName); + myGEOM_Superv_i->register_name("/myGEOM_Superv"); + return myGEOM_Superv_i->getId() ; + } +} diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh new file mode 100644 index 000000000..4abb6e257 --- /dev/null +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -0,0 +1,503 @@ +// 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/ +// +#ifndef __GEOM_SUPERV_I_H__ +#define __GEOM_SUPERV_I_H__ + +// IDL headers +#include +#include CORBA_SERVER_HEADER(GEOM_Superv) + +#include "GEOM_Gen_i.hh" +#include "GEOM_List_i.hh" + +class GEOM_Superv_i : public virtual POA_GEOM::GEOM_Superv, + public Engines_Component_i +{ +public: + GEOM_Superv_i(CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char *instanceName, + const char *interfaceName); + ~GEOM_Superv_i(); + + // generic method to be put in a super class + void register_name(char * name); + void setGeomEngine(); + + void getBasicOp(); + void get3DPrimOp(); + void getBoolOp(); + void getInsOp(); + void getTransfOp(); + void getShapesOp(); + void getBlocksOp(); + void getCurvesOp(); + void getLocalOp(); + void getGroupOp(); + + PortableServer::ServantBase_var GetServant(CORBA::Object_ptr theObject, + PortableServer::POA_ptr thePOA); + + //-----------------------------------------------------------------------// + // Set current stydy ID // + //-----------------------------------------------------------------------// + void SetStudyID( CORBA::Long theId ); + + //-----------------------------------------------------------// + // Create ListOfGO and add items to it // + //-----------------------------------------------------------// + GEOM::GEOM_List_ptr CreateListOfGO(); + void AddItemToListOfGO(GEOM::GEOM_List_ptr& theList, + GEOM::GEOM_Object_ptr theObject); + + //-----------------------------------------------------------// + // Create ListOfLong and add items to it // + //-----------------------------------------------------------// + GEOM::GEOM_List_ptr CreateListOfLong(); + void AddItemToListOfLong(GEOM::GEOM_List_ptr& theList, + long theObject); + + //-----------------------------------------------------------// + // Create ListOfDouble and add items to it // + //-----------------------------------------------------------// + GEOM::GEOM_List_ptr CreateListOfDouble(); + void AddItemToListOfDouble(GEOM::GEOM_List_ptr& theList, + double theObject); + + //-----------------------------------------------------------------------// + // Inherited methods from SALOMEDS::Driver // + //-----------------------------------------------------------------------// + + SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + CORBA::Boolean LoadASCII(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile); + + void Close(SALOMEDS::SComponent_ptr theComponent); + char* ComponentDataType(); + + + char* IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + char* LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII); + + bool CanPublishInStudy(CORBA::Object_ptr theIOR); + SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName) throw (SALOME::SALOME_Exception) ; + + CORBA::Boolean CanCopy(SALOMEDS::SObject_ptr theObject); + SALOMEDS::TMPFile* CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID); + CORBA::Boolean CanPaste(const char* theComponentName, CORBA::Long theObjectID); + SALOMEDS::SObject_ptr PasteInto(const SALOMEDS::TMPFile& theStream, + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject); + + //-----------------------------------------------------------// + // Primitives Construction : BasicOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakePointXYZ (CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ); + GEOM::GEOM_Object_ptr MakePointWithReference (GEOM::GEOM_Object_ptr theReference, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ); + GEOM::GEOM_Object_ptr MakePointOnCurve (GEOM::GEOM_Object_ptr theRefCurve, + CORBA::Double theParameter); + GEOM::GEOM_Object_ptr MakeVectorDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr MakeVectorTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr MakeLineTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr MakePlaneThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr MakePlanePntVec (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr MakePlaneFace (GEOM::GEOM_Object_ptr theFace, + CORBA::Double theTrimSize); + GEOM::GEOM_Object_ptr MakeMarker (CORBA::Double theOX , CORBA::Double theOY , CORBA::Double theOZ, + CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, + CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); + + //-----------------------------------------------------------// + // Primitives Construction : 3DPrimOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeBox (CORBA::Double theX1, + CORBA::Double theY1, + CORBA::Double theZ1, + CORBA::Double theX2, + CORBA::Double theY2, + CORBA::Double theZ2); + GEOM::GEOM_Object_ptr MakeBoxDXDYDZ (CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr MakeBoxTwoPnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr MakeCylinderPntVecRH (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theRadius, + CORBA::Double theHeight); + GEOM::GEOM_Object_ptr MakeCylinderRH (CORBA::Double theR, + CORBA::Double theH); + GEOM::GEOM_Object_ptr MakeSphere (CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theRadius); + GEOM::GEOM_Object_ptr MakeSphereR (CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeSpherePntR (GEOM::GEOM_Object_ptr thePnt, + CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeTorusPntVecRR (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theRMajor, + CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr MakeTorusRR (CORBA::Double theRMajor, + CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr MakeConePntVecR1R2H (GEOM::GEOM_Object_ptr thePnt, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight); + GEOM::GEOM_Object_ptr MakeConeR1R2H (CORBA::Double theR1, + CORBA::Double theR2, + CORBA::Double theHeight); + GEOM::GEOM_Object_ptr MakePrismVecH (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theVec, + CORBA::Double theH); + GEOM::GEOM_Object_ptr MakePrismTwoPnt (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr MakePipe (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr thePath); + GEOM::GEOM_Object_ptr MakeRevolutionAxisAngle (GEOM::GEOM_Object_ptr theBase, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + GEOM::GEOM_Object_ptr MakeFilling (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theMinDeg, CORBA::Long theMaxDeg, + CORBA::Double theTol2D, CORBA::Double theTol3D, + CORBA::Long theNbIter); + + //-----------------------------------------------------------// + // BooleanOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeBoolean (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2, + CORBA::Long theOperation); + GEOM::GEOM_Object_ptr MakeFuse (GEOM::GEOM_Object_ptr theShape1, + GEOM::GEOM_Object_ptr theShape2); + GEOM::GEOM_Object_ptr MakePartition (GEOM::GEOM_List_ptr theShapes, + GEOM::GEOM_List_ptr theTools, + GEOM::GEOM_List_ptr theKeepInside, + GEOM::GEOM_List_ptr theRemoveInside, + CORBA::Short theLimit, + CORBA::Boolean theRemoveWebs, + GEOM::GEOM_List_ptr theMaterials); + GEOM::GEOM_Object_ptr MakeHalfPartition (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePlane); + + //-----------------------------------------------------------// + // InsertOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeCopy (GEOM::GEOM_Object_ptr theOriginal); + void Export (GEOM::GEOM_Object_ptr theObject, + const char* theFileName, + const char* theFormatName); + GEOM::GEOM_Object_ptr Import (const char* theFileName, + const char* theFormatName); + void ImportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns); + void ExportTranslators (GEOM::string_array_out theFormats, + GEOM::string_array_out thePatterns); + + //-----------------------------------------------------------// + // TransformOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr TranslateTwoPoints (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr TranslateTwoPointsCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr TranslateDXDYDZ (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr TranslateDXDYDZCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theDX, + CORBA::Double theDY, + CORBA::Double theDZ); + GEOM::GEOM_Object_ptr TranslateVector (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr TranslateVectorCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector); + GEOM::GEOM_Object_ptr MultiTranslate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theStep, + CORBA::Long theNbTimes); + GEOM::GEOM_Object_ptr MultiTranslate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theVector1, + CORBA::Double theStep1, + CORBA::Long theNbTimes1, + GEOM::GEOM_Object_ptr theVector2, + CORBA::Double theStep2, + CORBA::Long theNbTimes2); + GEOM::GEOM_Object_ptr Rotate (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + GEOM::GEOM_Object_ptr RotateCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle); + GEOM::GEOM_Object_ptr MultiRotate1D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Long theNbTimes); + GEOM::GEOM_Object_ptr MultiRotate2D (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis, + CORBA::Double theAngle, + CORBA::Long theNbTimes1, + CORBA::Double theStep, + CORBA::Long theNbTimes2); + GEOM::GEOM_Object_ptr MirrorPlane (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr MirrorPlaneCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePlane); + GEOM::GEOM_Object_ptr MirrorAxis (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + GEOM::GEOM_Object_ptr MirrorAxisCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theAxis); + GEOM::GEOM_Object_ptr MirrorPoint (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr MirrorPointCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr OffsetShape (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject, + CORBA::Double theOffset); + GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); + GEOM::GEOM_Object_ptr ScaleShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr thePoint, + CORBA::Double theFactor); + GEOM::GEOM_Object_ptr PositionShape (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); + GEOM::GEOM_Object_ptr PositionShapeCopy (GEOM::GEOM_Object_ptr theObject, + GEOM::GEOM_Object_ptr theStartLCS, + GEOM::GEOM_Object_ptr theEndLCS); + + //-----------------------------------------------------------// + // ShapesOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2); + GEOM::GEOM_Object_ptr MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires); + GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, + CORBA::Boolean isPlanarWanted); + GEOM::GEOM_Object_ptr MakeFaceWires (GEOM::GEOM_List_ptr theWires, + CORBA::Boolean isPlanarWanted); + GEOM::GEOM_Object_ptr MakeShell (GEOM::GEOM_List_ptr theFacesAndShells); + GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell); + 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); + GEOM::GEOM_List_ptr MakeExplode (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theShapeType, + CORBA::Boolean isSorted); + CORBA::Long NumberOfFaces (GEOM::GEOM_Object_ptr theShape); + CORBA::Long NumberOfEdges (GEOM::GEOM_Object_ptr theShape); + GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theShape); + + //-----------------------------------------------------------// + // BlocksOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeQuad4Vertices (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3, + GEOM::GEOM_Object_ptr thePnt4); + GEOM::GEOM_Object_ptr MakeQuad (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2, + GEOM::GEOM_Object_ptr theEdge3, + GEOM::GEOM_Object_ptr theEdge4); + GEOM::GEOM_Object_ptr MakeQuad2Edges (GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2); + GEOM::GEOM_Object_ptr MakeHexa (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2, + GEOM::GEOM_Object_ptr theFace3, + GEOM::GEOM_Object_ptr theFace4, + GEOM::GEOM_Object_ptr theFace5, + GEOM::GEOM_Object_ptr theFace6); + GEOM::GEOM_Object_ptr MakeHexa2Faces (GEOM::GEOM_Object_ptr theFace1, + GEOM::GEOM_Object_ptr theFace2); + GEOM::GEOM_Object_ptr GetPoint (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theX, + CORBA::Double theY, + CORBA::Double theZ, + CORBA::Double theEpsilon); + GEOM::GEOM_Object_ptr GetEdge (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2); + GEOM::GEOM_Object_ptr GetEdgeNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr GetFaceByPoints (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint1, + GEOM::GEOM_Object_ptr thePoint2, + GEOM::GEOM_Object_ptr thePoint3, + GEOM::GEOM_Object_ptr thePoint4); + GEOM::GEOM_Object_ptr GetFaceByEdges (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theEdge1, + GEOM::GEOM_Object_ptr theEdge2); + GEOM::GEOM_Object_ptr GetOppositeFace (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theFace); + GEOM::GEOM_Object_ptr GetFaceNearPoint (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr GetFaceByNormale (GEOM::GEOM_Object_ptr theBlock, + GEOM::GEOM_Object_ptr theVector); + CORBA::Boolean IsCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces, + CORBA::Long& theNbBlocks); + CORBA::Boolean CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors); + char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, + const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); + GEOM::GEOM_List_ptr ExplodeCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + CORBA::Long theMinNbFaces, + CORBA::Long theMaxNbFaces); + GEOM::GEOM_Object_ptr GetBlockNearPoint (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_Object_ptr thePoint); + GEOM::GEOM_Object_ptr GetBlockByParts (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_List_ptr theParts); + GEOM::GEOM_List_ptr GetBlocksByParts (GEOM::GEOM_Object_ptr theCompound, + GEOM::GEOM_List_ptr theParts); + GEOM::GEOM_Object_ptr MakeMultiTransformation1D (GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1, + CORBA::Long theDirFace2, + CORBA::Long theNbTimes); + GEOM::GEOM_Object_ptr MakeMultiTransformation2D (GEOM::GEOM_Object_ptr theBlock, + CORBA::Long theDirFace1U, + CORBA::Long theDirFace2U, + CORBA::Long theNbTimesU, + CORBA::Long theDirFace1V, + CORBA::Long theDirFace2V, + CORBA::Long theNbTimesV); + + //-----------------------------------------------------------// + // CurvesOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter, + GEOM::GEOM_Object_ptr theVector, + CORBA::Double theRMajor, CORBA::Double theRMinor); + GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1, + GEOM::GEOM_Object_ptr thePnt2, + GEOM::GEOM_Object_ptr thePnt3); + 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); + GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, + GEOM::GEOM_List_ptr theWorkingPlane); + + //-----------------------------------------------------------// + // LocalOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr MakeFilletAll (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theR); + GEOM::GEOM_Object_ptr MakeFilletEdges (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + GEOM::GEOM_List_ptr theEdges); + GEOM::GEOM_Object_ptr MakeFilletFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theR, + GEOM::GEOM_List_ptr theFaces); + GEOM::GEOM_Object_ptr MakeChamferAll (GEOM::GEOM_Object_ptr theShape, CORBA::Double theD); + GEOM::GEOM_Object_ptr MakeChamferEdge (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + CORBA::Long theFace1, CORBA::Long theFace2); + GEOM::GEOM_Object_ptr MakeChamferFaces (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theD1, CORBA::Double theD2, + GEOM::GEOM_List_ptr theFaces); + GEOM::GEOM_Object_ptr MakeArchimede (GEOM::GEOM_Object_ptr theShape, + CORBA::Double theWeight, + CORBA::Double theWaterDensity, + CORBA::Double theMeshingDeflection); + CORBA::Long GetSubShapeIndex (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_Object_ptr theSubShape); + + //-----------------------------------------------------------// + // GroupOperations // + //-----------------------------------------------------------// + GEOM::GEOM_Object_ptr CreateGroup (GEOM::GEOM_Object_ptr theMainShape, + CORBA::Long theShapeType); + void AddObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId); + void RemoveObject (GEOM::GEOM_Object_ptr theGroup, + CORBA::Long theSubShapeId); + CORBA::Long GetType (GEOM::GEOM_Object_ptr theGroup); + GEOM::GEOM_Object_ptr GetMainShape (GEOM::GEOM_Object_ptr theGroup); + GEOM::GEOM_List_ptr GetObjects (GEOM::GEOM_Object_ptr theGroup); + +private: + SALOME_NamingService * name_service; + GEOM::GEOM_Gen_ptr myGeomEngine; + CORBA::Long myStudyID; + PortableServer::POA_var myPOA; + + GEOM::GEOM_IBasicOperations_ptr myBasicOp; + GEOM::GEOM_I3DPrimOperations_ptr my3DPrimOp; + GEOM::GEOM_IBooleanOperations_ptr myBoolOp; + GEOM::GEOM_IInsertOperations_ptr myInsOp; + GEOM::GEOM_ITransformOperations_ptr myTransfOp; + GEOM::GEOM_IShapesOperations_ptr myShapesOp; + GEOM::GEOM_IBlocksOperations_ptr myBlocksOp; + GEOM::GEOM_ICurvesOperations_ptr myCurvesOp; + GEOM::GEOM_ILocalOperations_ptr myLocalOp; + GEOM::GEOM_IGroupOperations_ptr myGroupOp; + +}; + +#endif diff --git a/src/GEOM_SWIG/GEOM_Nut.py b/src/GEOM_SWIG/GEOM_Nut.py new file mode 100755 index 000000000..c3d2db429 --- /dev/null +++ b/src/GEOM_SWIG/GEOM_Nut.py @@ -0,0 +1,68 @@ +##################################################################### +#Created :17/02/2005 +#Auhtor :MASLOV Eugeny, KOVALTCHUK Alexey +##################################################################### + +import geompy +import salome +import os +import math + +#Sketcher_1 creation +Sketcher_1 = geompy.MakeSketcher("Sketcher:F 100 -57.7:TT 100 57.7:TT 0 115.47:TT -100 57.7:TT -100 -57.7:TT 0 -115.47:WW") +geompy.addToStudy(Sketcher_1, "Sketcher_1") +Face_1 = geompy.MakeFace(Sketcher_1, 1) +geompy.addToStudy(Face_1, "Face_1") + +#Line creation +Line_1 = geompy.MakeLineTwoPnt(geompy.MakeVertex(0,0,0), geompy.MakeVertex(0,0,100)) +geompy.addToStudy(Line_1, "Line_1") + +#Prism creation +Prism_1 = geompy.MakePrismVecH(Face_1, Line_1, 100) +geompy.addToStudy(Prism_1, "Prism_1") + +#Sketcher_2 creation +Sketcher_2 = geompy.MakeSketcher("Sketcher:F 50 0:TT 80 0:TT 112 13:TT 112 48:TT 80 63:TT 80 90:TT 50 90:WW", [0,0,0, 1,0,0, 0,1,0]) +geompy.addToStudy(Sketcher_2, "Sketcher_2") +Face_2 = geompy.MakeFace(Sketcher_2, 1) +geompy.addToStudy(Face_2, "Face_2") + +#Revolution creation +Revolution_1 = geompy.MakeRevolution(Face_2, Line_1, 2*math.pi) +geompy.addToStudy(Revolution_1, "Revolution_1") + +#Common applying +Common_1 = geompy.MakeBoolean(Revolution_1, Prism_1, 1) +geompy.addToStudy(Common_1, "Common_1") + +#Explode Common_1 on edges +CommonExplodedListEdges = geompy.SubShapeAll(Common_1, geompy.ShapeType["EDGE"]) +for i in range(0, len(CommonExplodedListEdges)): + name = "Edge_"+str(i+1) + geompy.addToStudyInFather(Common_1, CommonExplodedListEdges[i], name) + +#Fillet applying +#ID = geompy.GetSubShapeID(Common_1, CommonExplodedListEdges[0]) +Fillet_1 = geompy.MakeFillet(Common_1, 10, geompy.ShapeType["EDGE"], [6]) +geompy.addToStudy(Fillet_1, "Fillet_1") + +#Chamfer applying +Chamfer_1 = geompy.MakeChamferEdge(Fillet_1, 10, 10, 16, 50 ) +geompy.addToStudy(Chamfer_1, "Chamfer_1") + +Chamfer_2 = geompy.MakeChamferEdge(Chamfer_1, 10, 10, 21, 31 ) +geompy.addToStudy(Chamfer_2, "Chamfer_2") + +#Import of the shape from "slots.brep" +thePath = os.getenv("DATA_DIR") +theFileName = thePath + "/Shapes/Brep/slots.brep" +theShapeForCut = geompy.ImportBREP(theFileName) +geompy.addToStudy(theShapeForCut, "slot.brep_1") + +#Cut applying +Cut_1 = geompy.MakeBoolean(Chamfer_2, theShapeForCut, 2) +geompy.addToStudy(Cut_1, "Cut_1") + +salome.sg.updateObjBrowser(1) + diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py new file mode 100644 index 000000000..4389fbd14 --- /dev/null +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -0,0 +1,451 @@ +# GEOM GEOM_SWIG : binding of C++ implementaion with Python +# +# Copyright (C) 2003 CEA +# +# 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.org +# +# +# File : GEOM_TestOthers.py +# Author : Julia DOROVSKIKH +# Module : GEOM +# $Header$ + +import os + +def TestExportImport (geompy, shape): + + print "Test Export/Import ...", + + # Files for Export/Import testing + fileExportImport = "/tmp/testExportImport.brep" + fileExportImportBREP = "/tmp/testExportImportBREP.brep" + fileExportImportIGES = "/tmp/testExportImportIGES.iges" + fileExportImportSTEP = "/tmp/testExportImportSTEP.step" + + if os.access(fileExportImport, os.F_OK): + if os.access(fileExportImport, os.W_OK): + os.remove(fileExportImport) + else: + fileExportImport = "/tmp/testExportImport1.brep" + + if os.access(fileExportImportBREP, os.W_OK): + os.remove(fileExportImportBREP) + else: + fileExportImportBREP = "/tmp/testExportImportBREP1.brep" + + if os.access(fileExportImportIGES, os.W_OK): + os.remove(fileExportImportIGES) + else: + fileExportImportIGES = "/tmp/testExportImportIGES1.iges" + + if os.access(fileExportImportSTEP, os.W_OK): + os.remove(fileExportImportSTEP) + else: + fileExportImportSTEP = "/tmp/testExportImportSTEP1.step" + + # Export + geompy.Export(shape, fileExportImport, "BREP") + + # ExportBREP, ExportIGES, ExportSTEP + geompy.ExportBREP(shape, fileExportImportBREP) + geompy.ExportIGES(shape, fileExportImportIGES) + geompy.ExportSTEP(shape, fileExportImportSTEP) + + # Import + Import = geompy.Import(fileExportImport, "BREP") + + id_Import = geompy.addToStudy(Import, "Import") + + # ImportBREP, ImportIGES, ImportSTEP + ImportBREP = geompy.ImportBREP(fileExportImportBREP) + ImportIGES = geompy.ImportIGES(fileExportImportIGES) + ImportSTEP = geompy.ImportSTEP(fileExportImportSTEP) + + id_ImportBREP = geompy.addToStudy(ImportBREP, "ImportBREP") + id_ImportIGES = geompy.addToStudy(ImportIGES, "ImportIGES") + id_ImportSTEP = geompy.addToStudy(ImportSTEP, "ImportSTEP") + + # Remove files for Export/Import testing + os.remove(fileExportImport) + os.remove(fileExportImportBREP) + os.remove(fileExportImportIGES) + os.remove(fileExportImportSTEP) + + print "OK" + + +def TestOtherOperations (geompy, math): + + # MakeFaces + p11 = geompy.MakeVertex( 0, 0, 0) + p12 = geompy.MakeVertex(30, 0, 0) + p13 = geompy.MakeVertex(30, 30, 0) + p14 = geompy.MakeVertex( 0, 30, 0) + + p21 = geompy.MakeVertex(10, 10, 0) + p22 = geompy.MakeVertex(20, 10, 0) + p23 = geompy.MakeVertex(20, 20, 0) + p24 = geompy.MakeVertex(10, 20, 0) + + e11 = geompy.MakeEdge(p11, p12) + e12 = geompy.MakeEdge(p12, p13) + e13 = geompy.MakeEdge(p13, p14) + e14 = geompy.MakeEdge(p14, p11) + + e21 = geompy.MakeEdge(p21, p22) + e22 = geompy.MakeEdge(p22, p23) + e23 = geompy.MakeEdge(p23, p24) + e24 = geompy.MakeEdge(p24, p21) + + w1 = geompy.MakeWire([e11, e12, e13, e14]) + w2 = geompy.MakeWire([e21, e22, e23, e24]) + w3 = geompy.MakeTranslation(w2, 0, 0, 10) + + id_w1 = geompy.addToStudy(w1, "Outside Wire") + id_w2 = geompy.addToStudy(w2, "Inside Wire") + id_w3 = geompy.addToStudy(w3, "Inside Wire, translated along OZ") + + f12 = geompy.MakeFaces([w1, w2], 0) + id_f12 = geompy.addToStudy(f12, "MakeFaces WO + WI") + + # Export/Import + TestExportImport(geompy, f12) + + # OrientationChange + Box = geompy.MakeBoxDXDYDZ(200, 200, 200) + Orientation = geompy.OrientationChange(Box) + id_Orientation = geompy.addToStudy(Orientation, "OrientationChange") + + # MakeCommon, MakeCut, MakeFuse, MakeSection + Sphere = geompy.MakeSphereR(100) + + Common = geompy.MakeCommon (Box, Sphere) + Cut = geompy.MakeCut (Box, Sphere) + Fuse = geompy.MakeFuse (Box, Sphere) + Section = geompy.MakeSection(Box, Sphere) + + id_Common = geompy.addToStudy(Common, "Common") + id_Cut = geompy.addToStudy(Cut, "Cut") + id_Fuse = geompy.addToStudy(Fuse, "Fuse") + id_Section = geompy.addToStudy(Section, "Section") + + # Partition + p100 = geompy.MakeVertex(100, 100, 100) + p300 = geompy.MakeVertex(300, 300, 300) + Box1 = geompy.MakeBoxTwoPnt(p100, p300) + Partition = geompy.Partition([Box], [Box1], [], [Box]) + id_Partition = geompy.addToStudy(Partition, "Partition of Box by Box1") + + # MakeMultiRotation1D, MakeMultiRotation2D + pz = geompy.MakeVertex(0, 0, 100) + vy = geompy.MakeVectorDXDYDZ(0, 100, 0) + + MultiRot1D = geompy.MakeMultiRotation1D(f12, vy, pz, 6) + MultiRot2D = geompy.MakeMultiRotation2D(f12, vy, pz, 45, 6, 30, 3) + + id_MultiRot1D = geompy.addToStudy(MultiRot1D, "MakeMultiRotation1D") + id_MultiRot2D = geompy.addToStudy(MultiRot2D, "MakeMultiRotation2D") + + # MakeFilletAll + radius_fillet = 10. + face5 = geompy.SubShapeSorted(Box, geompy.ShapeType["FACE"], [5]) + f_glob_id = geompy.GetSubShapeID(Box, face5) + SuppFace = geompy.SuppressFaces(Box, [f_glob_id]) + + MakeFilletAll = geompy.MakeFilletAll(SuppFace, radius_fillet) + id_MakeFilletAll = geompy.addToStudy(MakeFilletAll, "MakeFilletAll") + + # MakeChamferAll + dimension_chamfer = 10. + MakeChamferAll = geompy.MakeChamferAll(SuppFace, dimension_chamfer) + id_MakeChamferAll = geompy.addToStudy(MakeChamferAll, "MakeChamferAll") + + # MakeChamfer + d1 = 13. + d2 = 7. + box_faces = geompy.SubShapeAllSorted(Box, geompy.ShapeType["FACE"]) + f_ind_1 = geompy.GetSubShapeID(Box, box_faces[0]) + f_ind_2 = geompy.GetSubShapeID(Box, box_faces[1]) + f_ind_3 = geompy.GetSubShapeID(Box, box_faces[2]) + + MakeChamfer = geompy.MakeChamfer(Box, d1, d2, geompy.ShapeType["FACE"], + [f_ind_1, f_ind_2, f_ind_3]) + id_MakeChamfer = geompy.addToStudy(MakeChamfer, "MakeChamfer") + + # NumberOfFaces + NumberOfFaces = geompy.NumberOfFaces(Box) + if NumberOfFaces != 6: + print "Bad number of faces in BOX!" + + # NumberOfEdges + NumberOfEdges = geompy.NumberOfEdges(Box) + if NumberOfEdges != 12: + print "Bad number of edges in BOX!" + + # MakeBlockExplode + Compound = geompy.MakeCompound([Box, Sphere]) + MakeBlockExplode = geompy.MakeBlockExplode(Compound, 6, 6) + + id_MakeBlockExplode = geompy.addToStudy(MakeBlockExplode[0], "MakeBlockExplode") + + # CheckCompoundOfBlocks + p1 = geompy.MakeVertex(200, 0, 0) + p2 = geompy.MakeVertex(400, 200, 200) + p3 = geompy.MakeVertex(400, 50, 50) + p4 = geompy.MakeVertex(600, 250, 250) + + Box2 = geompy.MakeBoxTwoPnt(p1, p2) + Box3 = geompy.MakeBoxTwoPnt(p3, p4) + Cyl = geompy.MakeCylinderRH(50, 300) + Cone = geompy.MakeConeR1R2H(150, 10, 400) + + Compound1 = geompy.MakeCompound([Box, Cyl, Cone, Box3, Box2]) + + IsValid = geompy.CheckCompoundOfBlocks(Compound1) + if IsValid == 0: + print "The Blocks Compound is NOT VALID" + else: + print "The Blocks Compound is VALID" + + IsValid = geompy.CheckCompoundOfBlocks(Box) + if IsValid == 0: + print "The Box is NOT VALID" + else: + print "The Box is VALID" + + # test geometrical groups + + # CreateGroup + CreateGroup = geompy.CreateGroup(Box, geompy.ShapeType["FACE"]) + + id_CreateGroup = geompy.addToStudy(CreateGroup, "CreateGroup") + + # AddObject + f_ind_4 = geompy.GetSubShapeID(Box, box_faces[3]) + f_ind_5 = geompy.GetSubShapeID(Box, box_faces[4]) + f_ind_6 = geompy.GetSubShapeID(Box, box_faces[5]) + + geompy.AddObject(CreateGroup, f_ind_6) # box_faces[5] + geompy.AddObject(CreateGroup, f_ind_1) # box_faces[0] + geompy.AddObject(CreateGroup, f_ind_4) # box_faces[3] + + # UnionList + geompy.UnionList(CreateGroup, [box_faces[2], box_faces[4], box_faces[5]]) + + # RemoveObject(theGroup, theSubShapeID) + geompy.RemoveObject(CreateGroup, f_ind_1) # box_faces[0] + + # DifferenceList + geompy.DifferenceList(CreateGroup, [box_faces[1], box_faces[0], box_faces[3]]) + + # GetObjectIDs + GetObjectIDs = geompy.GetObjectIDs(CreateGroup) + + print "Group of Box's faces includes the following IDs:" + print "(must be ", f_ind_6, ", ", f_ind_3, " and ", f_ind_5, ")" + for ObjectID in GetObjectIDs: + print " ", ObjectID + + BoxCopy = geompy.GetMainShape(CreateGroup) + + # ----------------------------------------------------------------------------- + # enumeration ShapeTypeString as a dictionary + # ----------------------------------------------------------------------------- + ShapeTypeString = {'0':"COMPOUND", '1':"COMPSOLID", '2':"SOLID", '3':"SHELL", '4':"FACE", '5':"WIRE", '6':"EDGE", '7':"VERTEX", '8':"SHAPE"} + + GroupType = geompy.GetType(CreateGroup) + print "Type of elements of the created group is ", ShapeTypeString[`GroupType`] + + # Prepare data for the following operations + p0 = geompy.MakeVertex(0, 0, 0) + b0 = geompy.MakeBox(-50, -50, -50, 50, 50, 50) + s0 = geompy.MakeSphereR(100) + + id_b0 = geompy.addToStudy(b0, "b0") + id_s0 = geompy.addToStudy(s0, "s0") + + v_0pp = geompy.MakeVectorDXDYDZ( 0, 1, 1) + v_0np = geompy.MakeVectorDXDYDZ( 0, -1, 1) + v_p0p = geompy.MakeVectorDXDYDZ( 1, 0, 1) + v_n0p = geompy.MakeVectorDXDYDZ(-1, 0, 1) + v_pp0 = geompy.MakeVectorDXDYDZ( 1, 1, 0) + v_np0 = geompy.MakeVectorDXDYDZ(-1, 1, 0) + + pln_0pp = geompy.MakePlane(p0, v_0pp, 300) + pln_0np = geompy.MakePlane(p0, v_0np, 300) + pln_p0p = geompy.MakePlane(p0, v_p0p, 300) + pln_n0p = geompy.MakePlane(p0, v_n0p, 300) + pln_pp0 = geompy.MakePlane(p0, v_pp0, 300) + pln_np0 = geompy.MakePlane(p0, v_np0, 300) + + part_tool_1 = geompy.MakePartition([b0, pln_0pp, pln_0np, pln_p0p, pln_n0p, pln_pp0, pln_np0], + [], + [], + [b0]) + + pt_pnt_1 = geompy.MakeVertex( 55, 0, 55) + pt_pnt_2 = geompy.MakeVertex( 0, 55, 55) + pt_pnt_3 = geompy.MakeVertex(-55, 0, 55) + pt_pnt_4 = geompy.MakeVertex( 0, -55, 55) + pt_pnt_5 = geompy.MakeVertex( 55, 55, 0) + pt_pnt_6 = geompy.MakeVertex( 55, -55, 0) + pt_pnt_7 = geompy.MakeVertex(-55, 55, 0) + pt_pnt_8 = geompy.MakeVertex(-55, -55, 0) + pt_pnt_9 = geompy.MakeVertex( 55, 0, -55) + pt_pnt_10 = geompy.MakeVertex( 0, 55, -55) + pt_pnt_11 = geompy.MakeVertex(-55, 0, -55) + pt_pnt_12 = geompy.MakeVertex( 0, -55, -55) + + pt_face_1 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_1) + pt_face_2 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_2) + pt_face_3 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_3) + pt_face_4 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_4) + pt_face_5 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_5) + pt_face_6 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_6) + pt_face_7 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_7) + pt_face_8 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_8) + pt_face_9 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_9) + pt_face_10 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_10) + pt_face_11 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_11) + pt_face_12 = geompy.GetFaceNearPoint(part_tool_1, pt_pnt_12) + + pt_box = geompy.GetBlockNearPoint(part_tool_1, p0) + + part_tool = geompy.MakeCompound([pt_face_1, pt_face_4, pt_face_7, pt_face_10, + pt_face_2, pt_face_5, pt_face_8, pt_face_11, + pt_face_3, pt_face_6, pt_face_9, pt_face_12, pt_box]) + id_part_tool = geompy.addToStudy(part_tool, "part_tool") + + part = geompy.MakePartition([s0], [part_tool]) + geompy.addToStudy(part, "part") + + # GetFreeFacesIDs + anIDs = geompy.GetFreeFacesIDs(part) + freeFaces = geompy.GetSubShape(part, anIDs) + + geompy.addToStudy(freeFaces, "freeFaces") + + # RemoveExtraEdges + freeFacesWithoutExtra = geompy.RemoveExtraEdges(freeFaces) + + geompy.addToStudy(freeFacesWithoutExtra, "freeFacesWithoutExtra") + + # GetSharedShapes + sharedFaces = geompy.GetSharedShapes(part, freeFacesWithoutExtra, geompy.ShapeType["FACE"]) + + for shFace in sharedFaces: + geompy.addToStudy(shFace, "sharedFace") + + # CheckAndImprove + blocksComp = geompy.CheckAndImprove(part) + + geompy.addToStudy(blocksComp, "blocksComp") + + # Propagate + listChains = geompy.Propagate(blocksComp) + + for chain in listChains: + geompy.addToStudyInFather(blocksComp, chain, "propagation chain") + + # GetPoint(theShape, theX, theY, theZ, theEpsilon) + # + # (-50, 50, 50) .-----. (50, 50, 50) + # pb0_top_1 | | + # | . pmidle + # | | + # (-50, -50, 50) '-----' (50, -50, 50) + # + pb0_top_1 = geompy.GetPoint(blocksComp, -50, 50, 50, 0.01) + pb0_bot_1 = geompy.GetPoint(blocksComp, -50, -50, -50, 0.01) + + geompy.addToStudyInFather(blocksComp, pb0_top_1, "point from blocksComp (-50, 50, 50)") + geompy.addToStudyInFather(blocksComp, pb0_bot_1, "point from blocksComp (-50, -50, -50)") + + # GetEdgeNearPoint(theShape, thePoint) + pmidle = geompy.MakeVertex(50, 0, 50) + edge1 = geompy.GetEdgeNearPoint(blocksComp, pmidle) + + geompy.addToStudyInFather(blocksComp, edge1, "edge near point (50, 0, 50)") + + # GetBlockByParts(theCompound, theParts) + b0_image = geompy.GetBlockByParts(blocksComp, [pb0_top_1, pb0_bot_1, edge1]) + + geompy.addToStudyInFather(blocksComp, b0_image, "b0 image") + + # GetShapesOnPlane + faces_on_pln = geompy.GetShapesOnPlane(blocksComp, geompy.ShapeType["FACE"], + v_0pp, geompy.GEOM.ST_ONIN) + for face_i in faces_on_pln: + geompy.addToStudy(face_i, "Face on Plane (N = (0, 1, 1)) or below it") + + # GetShapesOnCylinder + edges_on_cyl = geompy.GetShapesOnCylinder(blocksComp, geompy.ShapeType["EDGE"], + vy, 55, geompy.GEOM.ST_OUT) + for edge_i in edges_on_cyl: + geompy.addToStudy(edge_i, "Edge out of Cylinder (axis = (0, 1, 0), r = 55)") + + # GetShapesOnSphere + vertices_on_sph = geompy.GetShapesOnSphere(blocksComp, geompy.ShapeType["VERTEX"], + p0, 100, geompy.GEOM.ST_ON) + for vertex_i in vertices_on_sph: + geompy.addToStudy(vertex_i, "Vertex on Sphere (center = (0, 0, 0), r = 100)") + pass + + # GetShapesOnQuadrangle + + geompy.addToStudy(f12, "F12" ) + + bl = geompy.MakeVertex(10,-10, 0) + br = geompy.MakeVertex(40,-10, 0) + tr = geompy.MakeVertex(40, 20, 0) + tl = geompy.MakeVertex(10, 20, 0) + qe1 = geompy.MakeEdge(bl, br) + qe2 = geompy.MakeEdge(br, tr) + qe3 = geompy.MakeEdge(tr, tl) + qe4 = geompy.MakeEdge(tl, bl) + quadrangle = geompy.MakeWire([qe1, qe2, qe3, qe4]) + geompy.addToStudy(quadrangle, "Quadrangle") + + edges_onin_quad = geompy.GetShapesOnQuadrangle( f12, geompy.ShapeType["EDGE"], + tl, tr, bl, br, geompy.GEOM.ST_ONIN) + comp = geompy.MakeCompound(edges_onin_quad) + geompy.addToStudy(comp, "Edges of F12 ONIN Quadrangle") + if len( edges_onin_quad ) != 4: + print "Error in GetShapesOnQuadrangle()" + pass + + # GetInPlace(theShapeWhere, theShapeWhat) + box5 = geompy.MakeBoxDXDYDZ(100, 100, 100) + box6 = geompy.MakeTranslation(box5, 50, 50, 0) + + part = geompy.MakePartition([box5], [box6]) + geompy.addToStudy(part, "Partitioned") + + ibb = 5 + box_list = [box5, box6] + for abox in box_list: + geompy.addToStudy(abox, "Box " + `ibb`) + box_faces = geompy.SubShapeAll(abox, geompy.ShapeType["FACE"]) + ifa = 1 + for aface in box_faces: + geompy.addToStudyInFather(abox, aface, "Face" + `ifa`) + refl_box_face = geompy.GetInPlace(part, aface) + if refl_box_face is not None: + geompy.addToStudyInFather(part, refl_box_face, + "Reflection of Face " + `ifa` + " of box " + `ibb`) + ifa = ifa + 1 + ibb = ibb + 1 diff --git a/src/GEOM_SWIG/batchmode_geompy.py b/src/GEOM_SWIG/batchmode_geompy.py new file mode 100644 index 000000000..aa90a337f --- /dev/null +++ b/src/GEOM_SWIG/batchmode_geompy.py @@ -0,0 +1,1203 @@ +# GEOM GEOM_SWIG : binding of C++ omplementaion with Python +# +# 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : geompy.py +# Author : Paul RASCLE, EDF +# Module : GEOM +# $Header$ + +from batchmode_salome import * +import GEOM + +g=None +step = 0 +while step < 50 and g == None: + g = lcc.FindOrLoadComponent("FactoryServer", "GEOM") + step = step + 1 + time.sleep(4) +geom = g._narrow( GEOM.GEOM_Gen ) + +myBuilder = None +myStudyId = 0 +father = None + +BasicOp = None +CurvesOp = None +PrimOp = None +ShapesOp = None +HealOp = None +InsertOp = None +BoolOp = None +TrsfOp = None +LocalOp = None +MeasuOp = None +BlocksOp = None +GroupOp = None + +def init_geom(theStudy): + + global myStudy, myBuilder, myStudyId, BasicOp, CurvesOp, PrimOp, ShapesOp, HealOp + global InsertOp, BoolOp, TrsfOp, LocalOp, MeasuOp, BlocksOp, GroupOp, father + + myStudy = theStudy + myStudyId = myStudy._get_StudyId() + myBuilder = myStudy.NewBuilder() + father = myStudy.FindComponent("GEOM") + if father is None: + father = myBuilder.NewComponent("GEOM") + A1 = myBuilder.FindOrCreateAttribute(father, "AttributeName") + FName = A1._narrow(SALOMEDS.AttributeName) + FName.SetValue("Geometry") + A2 = myBuilder.FindOrCreateAttribute(father, "AttributePixMap") + aPixmap = A2._narrow(SALOMEDS.AttributePixMap) + aPixmap.SetPixMap("ICON_OBJBROWSER_Geometry") + myBuilder.DefineComponentInstance(father,geom) + pass + + # ----------------------------------------------------------------------------- + # Assign Operations Interfaces + # ----------------------------------------------------------------------------- + + BasicOp = geom.GetIBasicOperations (myStudyId) + CurvesOp = geom.GetICurvesOperations (myStudyId) + PrimOp = geom.GetI3DPrimOperations (myStudyId) + ShapesOp = geom.GetIShapesOperations (myStudyId) + HealOp = geom.GetIHealingOperations (myStudyId) + InsertOp = geom.GetIInsertOperations (myStudyId) + BoolOp = geom.GetIBooleanOperations (myStudyId) + TrsfOp = geom.GetITransformOperations(myStudyId) + LocalOp = geom.GetILocalOperations (myStudyId) + MeasuOp = geom.GetIMeasureOperations (myStudyId) + BlocksOp = geom.GetIBlocksOperations (myStudyId) + GroupOp = geom.GetIGroupOperations (myStudyId) + pass + +init_geom(myStudy) + +# * Get name for sub-shape aSubObj of shape aMainObj +# +def SubShapeName(aSubObj, aMainObj): + name = "SubShape" + print name + return name + +# * Publish in study aShape with name aName +# +def addToStudy(aShape, aName): + try: + aSObject = geom.AddInStudy(myStudy, aShape, aName, None) + except: + print "addToStudy() failed" + return "" + return aShape.GetStudyEntry() + +# * Publish in study aShape with name aName as sub-object of previously published aFather +# +def addToStudyInFather(aFather, aShape, aName): + try: + aSObject = geom.AddInStudy(myStudy, aShape, aName, aFather) + except: + print "addToStudyInFather() failed" + return "" + return aShape.GetStudyEntry() + +# ----------------------------------------------------------------------------- +# enumeration ShapeType as a dictionary +# ----------------------------------------------------------------------------- + +ShapeType = {"COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8} + +# ----------------------------------------------------------------------------- +# Basic primitives +# ----------------------------------------------------------------------------- + +def MakeVertex(theX, theY, theZ): + anObj = BasicOp.MakePointXYZ(theX, theY, theZ) + if BasicOp.IsDone() == 0: + print "MakePointXYZ : ", BasicOp.GetErrorCode() + return anObj + +def MakeVertexWithRef(vertex,x,y,z): + anObj = BasicOp.MakePointWithReference(vertex,x,y,z) + if BasicOp.IsDone() == 0: + print "MakePointWithReference : ", BasicOp.GetErrorCode() + return anObj + +def MakeVertexOnCurve(curve,par): + anObj = BasicOp.MakePointOnCurve(curve,par) + if BasicOp.IsDone() == 0: + print "MakePointOnCurve : ", BasicOp.GetErrorCode() + return anObj + +def MakeVectorDXDYDZ(dx,dy,dz): + anObj = BasicOp.MakeVectorDXDYDZ(dx,dy,dz) + if BasicOp.IsDone() == 0: + print "MakeVectorDXDYDZ : ", BasicOp.GetErrorCode() + return anObj + +def MakeVector(p1,p2): + anObj = BasicOp.MakeVectorTwoPnt(p1, p2) + if BasicOp.IsDone() == 0: + print "MakeVectorTwoPnt : ", BasicOp.GetErrorCode() + return anObj + +def MakeLine(p1, d1): + anObj = BasicOp.MakeLine(p1,d1) + if BasicOp.IsDone() == 0: + print "MakeLine : ", BasicOp.GetErrorCode() + return anObj + +def MakeLineTwoPnt(p1, p2): + anObj = BasicOp.MakeLineTwoPnt(p1,p2) + if BasicOp.IsDone() == 0: + print "MakeLineTwoPnt : ", BasicOp.GetErrorCode() + return anObj + +def MakePlane(p1,v1,trimsize): + anObj = BasicOp.MakePlanePntVec(p1,v1,trimsize) + if BasicOp.IsDone() == 0: + print "MakePlanePntVec : ", BasicOp.GetErrorCode() + return anObj + +def MakePlaneThreePnt(p1,p2,p3,trimsize): + anObj = BasicOp.MakePlaneThreePnt(p1,p2,p3,trimsize) + if BasicOp.IsDone() == 0: + print "MakePlaneThreePnt : ", BasicOp.GetErrorCode() + return anObj + +def MakePlaneFace(face,trimsize): + anObj = BasicOp.MakePlaneFace(face,trimsize) + if BasicOp.IsDone() == 0: + print "MakePlaneFace : ", BasicOp.GetErrorCode() + return anObj + +def MakeMarker(OX,OY,OZ, XDX,XDY,XDZ, YDX,YDY,YDZ): + anObj = BasicOp.MakeMarker(OX,OY,OZ, XDX,XDY,XDZ, YDX,YDY,YDZ) + if BasicOp.IsDone() == 0: + print "MakeMarker : ", BasicOp.GetErrorCode() + return anObj + +def MakeMarkerPntTwoVec(theOrigin, theXVec, theYVec): + """ + * Create a local coordinate system. + * \param theOrigin Point of coordinate system origin. + * \param theXVec Vector of X direction + * \param theYVec Vector of Y direction + * \return New GEOM_Object, containing the created coordinate system. + """ + O = PointCoordinates( theOrigin ) + OXOY = [] + for vec in [ theXVec, theYVec ]: + v1, v2 = SubShapeAll( vec, ShapeType["VERTEX"] ) + p1 = PointCoordinates( v1 ) + p2 = PointCoordinates( v2 ) + for i in range( 0, 3 ): + OXOY.append( p2[i] - p1[i] ) + # + anObj = BasicOp.MakeMarker( O[0], O[1], O[2], + OXOY[0], OXOY[1], OXOY[2], + OXOY[3], OXOY[4], OXOY[5], ) + if BasicOp.IsDone() == 0: + print "MakeMarker : ", BasicOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Curves +# ----------------------------------------------------------------------------- + +def MakeArc(p1,p2,p3): + anObj = CurvesOp.MakeArc(p1,p2,p3) + if CurvesOp.IsDone() == 0: + print "MakeArc : ", CurvesOp.GetErrorCode() + return anObj + +def MakeCircle(p1,v1,radius): + anObj = CurvesOp.MakeCirclePntVecR(p1,v1,radius) + if CurvesOp.IsDone() == 0: + print "MakeCirclePntVecR : ", CurvesOp.GetErrorCode() + return anObj + +def MakeCircleThreePnt(p1,p2,p3): + anObj = CurvesOp.MakeCircleThreePnt(p1,p2,p3) + if CurvesOp.IsDone() == 0: + print "MakeCircleThreePnt : ", CurvesOp.GetErrorCode() + return anObj + +def MakeEllipse(p1,v1,radiusMaj,radiusMin): + anObj = CurvesOp.MakeEllipse(p1,v1,radiusMaj, radiusMin) + if CurvesOp.IsDone() == 0: + print "MakeEllipse : ", CurvesOp.GetErrorCode() + return anObj + +def MakePolyline(ListShape): + anObj = CurvesOp.MakePolyline(ListShape) + if CurvesOp.IsDone() == 0: + print "MakePolyline : ", CurvesOp.GetErrorCode() + return anObj + +def MakeBezier(ListShape): + anObj = CurvesOp.MakeSplineBezier(ListShape) + if CurvesOp.IsDone() == 0: + print "MakeSplineBezier : ", CurvesOp.GetErrorCode() + return anObj + +def MakeInterpol(ListShape): + anObj = CurvesOp.MakeSplineInterpolation(ListShape) + if CurvesOp.IsDone() == 0: + print "MakeSplineInterpolation : ", CurvesOp.GetErrorCode() + return anObj + +# : Nine double values, defining origin, +# OZ and OX directions of the working plane. +def MakeSketcher(Cmd, WPL = [0,0,0, 0,0,1, 1,0,0]): + anObj = CurvesOp.MakeSketcher(Cmd, WPL) + if CurvesOp.IsDone() == 0: + print "MakeSketcher : ", CurvesOp.GetErrorCode() + return anObj + +def MakeSketcherOnPlane(theCommand, theWorkingPlane): + """ + * Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. \n + * For format of the description string see the previous method.\n + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Planar Face of the working plane. + * \return New GEOM_Object, containing the created wire. + """ + anObj = CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane) + if CurvesOp.IsDone() == 0: + print "MakeSketcher : ", CurvesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create 3D Primitives +# ----------------------------------------------------------------------------- + +def MakeBox(x1,y1,z1,x2,y2,z2): + pnt1 = MakeVertex(x1,y1,z1) + pnt2 = MakeVertex(x2,y2,z2) + return MakeBoxTwoPnt(pnt1,pnt2) + +def MakeBoxDXDYDZ(dx,dy,dz): + anObj = PrimOp.MakeBoxDXDYDZ(dx,dy,dz) + if PrimOp.IsDone() == 0: + print "MakeBoxDXDYDZ : ", PrimOp.GetErrorCode() + return anObj + +def MakeBoxTwoPnt(point1, point2): + anObj = PrimOp.MakeBoxTwoPnt(point1, point2) + if PrimOp.IsDone() == 0: + print "MakeBoxTwoPnt : ", PrimOp.GetErrorCode() + return anObj + +def MakeCylinder(p1,v1,radius,height): + anObj = PrimOp.MakeCylinderPntVecRH(p1,v1,radius,height) + if PrimOp.IsDone() == 0: + print "MakeCylinderPntVecRH : ", PrimOp.GetErrorCode() + return anObj + +def MakeCylinderRH(radius,height): + anObj = PrimOp.MakeCylinderRH(radius,height) + if PrimOp.IsDone() == 0: + print "MakeCylinderRH : ", PrimOp.GetErrorCode() + return anObj + +def MakeSpherePntR(point,radius): + anObj = PrimOp.MakeSpherePntR(point,radius) + if PrimOp.IsDone() == 0: + print "MakeSpherePntR : ", PrimOp.GetErrorCode() + return anObj + +def MakeSphere(x,y,z,radius): + point = MakeVertex(x,y,z) + anObj = MakeSpherePntR(point,radius) + return anObj + +def MakeSphereR(radius): + anObj = PrimOp.MakeSphereR(radius) + if PrimOp.IsDone() == 0: + print "MakeSphereR : ", PrimOp.GetErrorCode() + return anObj + +def MakeCone(p1,v1,radius1,radius2,height): + anObj = PrimOp.MakeConePntVecR1R2H(p1,v1,radius1,radius2,height) + if PrimOp.IsDone() == 0: + print "MakeConePntVecR1R2H : ", PrimOp.GetErrorCode() + return anObj + +def MakeConeR1R2H(radius1,radius2,height): + anObj = PrimOp.MakeConeR1R2H(radius1,radius2,height) + if PrimOp.IsDone() == 0: + print "MakeConeR1R2H : ", PrimOp.GetErrorCode() + return anObj + +def MakeTorus(p1,v1,major_radius,minor_radius): + anObj = PrimOp.MakeTorusPntVecRR(p1,v1,major_radius,minor_radius) + if PrimOp.IsDone() == 0: + print "MakeTorusPntVecRR : ", PrimOp.GetErrorCode() + return anObj + +def MakeTorusRR(major_radius,minor_radius): + anObj = PrimOp.MakeTorusRR(major_radius,minor_radius) + if PrimOp.IsDone() == 0: + print "MakeTorusRR : ", PrimOp.GetErrorCode() + return anObj + +def MakePrism(baseShape,point1,point2): + anObj = PrimOp.MakePrismTwoPnt(baseShape,point1,point2) + if PrimOp.IsDone() == 0: + print "MakePrismTwoPnt : ", PrimOp.GetErrorCode() + return anObj + +def MakePrismVecH(baseShape,vector,height): + anObj = PrimOp.MakePrismVecH(baseShape,vector,height) + if PrimOp.IsDone() == 0: + print "MakePrismVecH : ", PrimOp.GetErrorCode() + return anObj + +def MakePipe(baseShape,pathShape): + anObj = PrimOp.MakePipe(baseShape,pathShape) + if PrimOp.IsDone() == 0: + print "MakePipe : ", PrimOp.GetErrorCode() + return anObj + +def MakeRevolution(aShape,axis,angle): + anObj = PrimOp.MakeRevolutionAxisAngle(aShape,axis,angle) + if PrimOp.IsDone() == 0: + print "MakeRevolutionAxisAngle : ", PrimOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create base shapes +# ----------------------------------------------------------------------------- + +def MakeEdge(p1,p2): + anObj = ShapesOp.MakeEdge(p1,p2) + if ShapesOp.IsDone() == 0: + print "MakeEdge : ", ShapesOp.GetErrorCode() + return anObj + +def MakeWire(ListShape): + anObj = ShapesOp.MakeWire(ListShape) + if ShapesOp.IsDone() == 0: + print "MakeWire : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFace(aShapeWire,WantPlanarFace): + anObj = ShapesOp.MakeFace(aShapeWire,WantPlanarFace) + if ShapesOp.IsDone() == 0: + print "MakeFace : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFaceWires(ListWires,WantPlanarFace): + anObj = ShapesOp.MakeFaceWires(ListWires,WantPlanarFace) + if ShapesOp.IsDone() == 0: + print "MakeFaceWires : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFaces(ListWires,WantPlanarFace): + anObj = MakeFaceWires(ListWires,WantPlanarFace) + return anObj + +def MakeShell(ListOfShapes): + anObj = ShapesOp.MakeShell(ListOfShapes) + if ShapesOp.IsDone() == 0: + print "MakeShell : ", ShapesOp.GetErrorCode() + return anObj + +def MakeSolid(ListOfShells): + anObj = ShapesOp.MakeSolidShells(ListOfShells) + if ShapesOp.IsDone() == 0: + print "MakeSolid : ", ShapesOp.GetErrorCode() + return anObj + +def MakeCompound(ListShape): + anObj = ShapesOp.MakeCompound(ListShape) + if ShapesOp.IsDone() == 0: + print "MakeCompound : ", ShapesOp.GetErrorCode() + return anObj + +def NumberOfFaces(theShape): + nb_faces = ShapesOp.NumberOfFaces(theShape) + if ShapesOp.IsDone() == 0: + print "NumberOfFaces : ", ShapesOp.GetErrorCode() + return nb_faces + +def NumberOfEdges(theShape): + nb_edges = ShapesOp.NumberOfEdges(theShape) + if ShapesOp.IsDone() == 0: + print "NumberOfEdges : ", ShapesOp.GetErrorCode() + return nb_edges + +def ChangeOrientation(Shape): + anObj = ShapesOp.ChangeOrientation(Shape) + if ShapesOp.IsDone() == 0: + print "ChangeOrientation : ", ShapesOp.GetErrorCode() + return anObj + +def OrientationChange(Shape): + anObj = ChangeOrientation(Shape) + return anObj + +def GetFreeFacesIDs(theShape): + anIDs = ShapesOp.GetFreeFacesIDs(theShape) + if ShapesOp.IsDone() == 0: + print "GetFreeFacesIDs : ", ShapesOp.GetErrorCode() + return anIDs + +def GetSharedShapes(theShape1, theShape2, theShapeType): + aList = ShapesOp.GetSharedShapes(theShape1, theShape2, theShapeType) + if ShapesOp.IsDone() == 0: + print "GetSharedShapes : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnPlane(theShape, theShapeType, theAx1, theState): + aList = ShapesOp.GetShapesOnPlane(theShape, theShapeType, theAx1, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnPlane : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnPlaneIDs(theShape, theShapeType, theAx1, theState): + aList = ShapesOp.GetShapesOnPlaneIDs(theShape, theShapeType, theAx1, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnPlaneIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnCylinder(theShape, theShapeType, theAxis, theRadius, theState): + aList = ShapesOp.GetShapesOnCylinder(theShape, theShapeType, theAxis, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnCylinder : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnCylinderIDs(theShape, theShapeType, theAxis, theRadius, theState): + aList = ShapesOp.GetShapesOnCylinderIDs(theShape, theShapeType, theAxis, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnCylinderIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnSphere(theShape, theShapeType, theCenter, theRadius, theState): + aList = ShapesOp.GetShapesOnSphere(theShape, theShapeType, theCenter, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnSphere : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnSphereIDs(theShape, theShapeType, theCenter, theRadius, theState): + aList = ShapesOp.GetShapesOnSphereIDs(theShape, theShapeType, theCenter, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnSphereIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnQuadrangle(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState): + aList = ShapesOp.GetShapesOnQuadrangle(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnQuadrangle : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnQuadrangleIDs(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState): + aList = ShapesOp.GetShapesOnQuadrangleIDs(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnQuadrangleIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetInPlace(theShapeWhere, theShapeWhat): + anObj = ShapesOp.GetInPlace(theShapeWhere, theShapeWhat) + if ShapesOp.IsDone() == 0: + print "GetInPlace : ", ShapesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Access to sub-shapes by their unique IDs inside the main shape. +# ----------------------------------------------------------------------------- + +# Obtain a composite sub-shape of , composed from sub-shapes +# of , selected by their unique IDs inside +def GetSubShape(aShape, ListOfID): + anObj = geom.AddSubShape(aShape,ListOfID) + return anObj + +# Obtain unique ID of sub-shape inside +def GetSubShapeID(aShape, aSubShape): + anID = LocalOp.GetSubShapeIndex(aShape, aSubShape) + if LocalOp.IsDone() == 0: + print "GetSubShapeIndex : ", LocalOp.GetErrorCode() + return anID + +# ----------------------------------------------------------------------------- +# Decompose objects +# ----------------------------------------------------------------------------- + +def SubShapeAll(aShape, aType): + ListObj = ShapesOp.MakeExplode(aShape,aType,0) + if ShapesOp.IsDone() == 0: + print "MakeExplode : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllIDs(aShape, aType): + ListObj = ShapesOp.SubShapeAllIDs(aShape,aType,0) + if ShapesOp.IsDone() == 0: + print "SubShapeAllIDs : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllSorted(aShape, aType): + ListObj = ShapesOp.MakeExplode(aShape,aType,1) + if ShapesOp.IsDone() == 0: + print "MakeExplode : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllSortedIDs(aShape, aType): + ListIDs = ShapesOp.SubShapeAllIDs(aShape,aType,1) + if ShapesOp.IsDone() == 0: + print "SubShapeAllSortedIDs : ", ShapesOp.GetErrorCode() + return ListObj + +# Obtain a compound of sub-shapes of , +# selected by they indices in list of all sub-shapes of type +def SubShape(aShape, aType, ListOfInd): + ListOfIDs = [] + AllShapeList = SubShapeAll(aShape, aType) + for ind in ListOfInd: + ListOfIDs.append(GetSubShapeID(aShape, AllShapeList[ind - 1])) + anObj = GetSubShape(aShape, ListOfIDs) + return anObj + +# Obtain a compound of sub-shapes of , +# selected by they indices in sorted list of all sub-shapes of type +def SubShapeSorted(aShape, aType, ListOfInd): + ListOfIDs = [] + AllShapeList = SubShapeAllSorted(aShape, aType) + for ind in ListOfInd: + ListOfIDs.append(GetSubShapeID(aShape, AllShapeList[ind - 1])) + anObj = GetSubShape(aShape, ListOfIDs) + return anObj + +# ----------------------------------------------------------------------------- +# Healing operations +# ----------------------------------------------------------------------------- + +def ProcessShape(Shape, Operators, Parameters, Values): + anObj = HealOp.ProcessShape(Shape, Operators, Parameters, Values) + if HealOp.IsDone() == 0: + print "ProcessShape : ", HealOp.GetErrorCode() + return anObj + +def SuppressFaces(aShape,ListOfId): + anObj = HealOp.SuppressFaces(aShape,ListOfId) + if HealOp.IsDone() == 0: + print "SuppressFaces : ", HealOp.GetErrorCode() + return anObj + +def MakeSewing(ListShape,precision): + comp = MakeCompound(ListShape) + anObj = Sew(comp,precision) + return anObj + +def Sew(aShape,precision): + anObj = HealOp.Sew(aShape,precision) + if HealOp.IsDone() == 0: + print "Sew : ", HealOp.GetErrorCode() + return anObj + +def SuppressInternalWires(aShape, Wires): + anObj = HealOp.RemoveIntWires(aShape, Wires) + if HealOp.IsDone() == 0: + print "SuppressInternalWires : ", HealOp.GetErrorCode() + return anObj + +def SuppressHoles(aShape, ListOfId): + anObj = HealOp.FillHoles(aShape,ListOfId) + if HealOp.IsDone() == 0: + print "SuppressHoles : ", HealOp.GetErrorCode() + return anObj + +def CloseContour(aShape, Wires, IsCommonVertex): + anObj = HealOp.CloseContour(aShape, Wires, IsCommonVertex) + if HealOp.IsDone() == 0: + print "CloseContour : ", HealOp.GetErrorCode() + return anObj + +def DivideEdge(aShape, EdgeID, Value, IsByParameter): + anObj = HealOp.DivideEdge(aShape, EdgeID, Value, IsByParameter) + if HealOp.IsDone() == 0: + print "DivideEdge : ", HealOp.GetErrorCode() + return anObj + +def GetFreeBoundary(Shape): + anObj = HealOp.GetFreeBoundary(Shape) + if HealOp.IsDone() == 0: + print "GetFreeBoundaries : ", HealOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create advanced objects +# ----------------------------------------------------------------------------- + +def MakeCopy(aShape): + anObj = InsertOp.MakeCopy(aShape) + if InsertOp.IsDone() == 0: + print "MakeCopy : ", InsertOp.GetErrorCode() + return anObj + +def MakeFilling(aShape,mindeg,maxdeg,tol2d,tol3d,nbiter): + anObj = PrimOp.MakeFilling(aShape,mindeg,maxdeg,tol2d,tol3d,nbiter) + if PrimOp.IsDone() == 0: + print "MakeFilling : ", PrimOp.GetErrorCode() + return anObj + +def MakeGlueFaces(aShape,aTolerance): + anObj = ShapesOp.MakeGlueFaces(aShape,aTolerance) + if ShapesOp.IsDone() == 0: + print "MakeGlueFaces : ", ShapesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Boolean (Common, Cut, Fuse, Section) +# ----------------------------------------------------------------------------- + +def MakeBoolean(shape1,shape2,operation): + anObj = BoolOp.MakeBoolean(shape1,shape2,operation) + if BoolOp.IsDone() == 0: + print "MakeBoolean : ", BoolOp.GetErrorCode() + return anObj + +def MakeCommon(s1, s2): + return MakeBoolean(s1, s2, 1) + +def MakeCut(s1, s2): + return MakeBoolean(s1, s2, 2) + +def MakeFuse(s1, s2): + return MakeBoolean(s1, s2, 3) + +def MakeSection(s1, s2): + return MakeBoolean(s1, s2, 4) + +def MakePartition(ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], + Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[]): + anObj = BoolOp.MakePartition(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials); + if BoolOp.IsDone() == 0: + print "MakePartition : ", BoolOp.GetErrorCode() + return anObj + +def Partition(ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], + Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[]): + anObj = MakePartition(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials); + return anObj + +def MakeHalfPartition(theShape, thePlane): + anObj = BoolOp.MakeHalfPartition(theShape, thePlane) + if BoolOp.IsDone() == 0: + print "MakeHalfPartition : ", BoolOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Transform objects +# ----------------------------------------------------------------------------- + +def MakeTranslationTwoPoints(aShape,point1,point2): + anObj = TrsfOp.TranslateTwoPointsCopy(aShape,point1,point2) + if TrsfOp.IsDone() == 0: + print "TranslateTwoPointsCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeTranslation(aShape,dx,dy,dz): + anObj = TrsfOp.TranslateDXDYDZCopy(aShape,dx,dy,dz) + if TrsfOp.IsDone() == 0: + print "TranslateDXDYDZCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeTranslationVector(theObject, theVector): + anObj = TrsfOp.TranslateVectorCopy(theObject, theVector) + if TrsfOp.IsDone() == 0: + print "TranslateVectorCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeRotation(aShape,axis,angle): + anObj = TrsfOp.RotateCopy(aShape,axis,angle) + if TrsfOp.IsDone() == 0: + print "RotateCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeScaleTransform(aShape,theCenterofScale,factor): + anObj = TrsfOp.ScaleShapeCopy(aShape,theCenterofScale,factor) + if TrsfOp.IsDone() == 0: + print "ScaleShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByPlane(aShape,aPlane): + anObj = TrsfOp.MirrorPlaneCopy(aShape,aPlane) + if TrsfOp.IsDone() == 0: + print "MirrorPlaneCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByAxis(theObject, theAxis): + anObj = TrsfOp.MirrorAxisCopy(theObject, theAxis) + if TrsfOp.IsDone() == 0: + print "MirrorAxisCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByPoint(theObject, thePoint): + anObj = TrsfOp.MirrorPointCopy(theObject, thePoint) + if TrsfOp.IsDone() == 0: + print "MirrorPointCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakePosition(aShape,theStartLCS,theEndLCS): + anObj = TrsfOp.PositionShapeCopy(aShape,theStartLCS,theEndLCS) + if TrsfOp.IsDone() == 0: + print "PositionShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeOffset(aShape, anOffset): + anObj = TrsfOp.OffsetShapeCopy(aShape, anOffset) + if TrsfOp.IsDone() == 0: + print "OffsetShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Patterns +# ----------------------------------------------------------------------------- + +def MakeMultiTranslation1D(aShape,aDir,aStep,aNbTimes): + anObj = TrsfOp.MultiTranslate1D(aShape,aDir,aStep,aNbTimes) + if TrsfOp.IsDone() == 0: + print "MultiTranslate1D : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMultiTranslation2D(aShape,d1,step1,nbtimes1,d2,step2,nbtimes2): + anObj = TrsfOp.MultiTranslate2D(aShape,d1,step1,nbtimes1,d2,step2,nbtimes2) + if TrsfOp.IsDone() == 0: + print "MultiTranslate2D : ", TrsfOp.GetErrorCode() + return anObj + +def MultiRotate1D(aShape,aVec,aNbTimes): + anObj = TrsfOp.MultiRotate1D(aShape,aVec,aNbTimes) + if TrsfOp.IsDone() == 0: + print "MultiRotate1D : ", TrsfOp.GetErrorCode() + return anObj + +def MultiRotate2D(aShape,aVec,anAngle,nbtimes1,aStep,nbtimes2): + anObj = TrsfOp.MultiRotate2D(aShape,aVec,anAngle,nbtimes1,aStep,nbtimes2) + if TrsfOp.IsDone() == 0: + print "MultiRotate2D : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMultiRotation1D(aShape,aDir,aPoint,aNbTimes): + aVec = MakeLine(aPoint,aDir) + anObj = MultiRotate1D(aShape,aVec,aNbTimes) + return anObj + +def MakeMultiRotation2D(aShape,aDir,aPoint,anAngle,nbtimes1,aStep,nbtimes2): + aVec = MakeLine(aPoint,aDir) + anObj = MultiRotate2D(aShape,aVec,anAngle,nbtimes1,aStep,nbtimes2) + return anObj + +# ----------------------------------------------------------------------------- +# Local operations +# ----------------------------------------------------------------------------- + +def MakeFilletAll(aShape,radius): + anObj = LocalOp.MakeFilletAll(aShape,radius) + if LocalOp.IsDone() == 0: + print "MakeFilletAll : ", LocalOp.GetErrorCode() + return anObj + +def MakeFillet(aShape,radius,aShapeType,ListShape): + anObj = None + if aShapeType == ShapeType["EDGE"]: + anObj = LocalOp.MakeFilletEdges(aShape,radius,ListShape) + else: + anObj = LocalOp.MakeFilletFaces(aShape,radius,ListShape) + if LocalOp.IsDone() == 0: + print "MakeFillet : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferAll(aShape,d): + anObj = LocalOp.MakeChamferAll(aShape,d) + if LocalOp.IsDone() == 0: + print "MakeChamferAll : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferEdge(aShape,d1,d2,face1,face2): + anObj = LocalOp.MakeChamferEdge(aShape,d1,d2,face1,face2) + if LocalOp.IsDone() == 0: + print "MakeChamferEdge : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferFaces(aShape,d1,d2,ListShape): + anObj = LocalOp.MakeChamferFaces(aShape,d1,d2,ListShape) + if LocalOp.IsDone() == 0: + print "MakeChamferFaces : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamfer(aShape,d1,d2,aShapeType,ListShape): + anObj = None + if aShapeType == ShapeType["EDGE"]: + anObj = MakeChamferEdge(aShape,d1,d2,ListShape[0],ListShape[1]) + else: + anObj = MakeChamferFaces(aShape,d1,d2,ListShape) + return anObj + +def Archimede(aShape,weight,WaterDensity,MeshingDeflection): + anObj = LocalOp.MakeArchimede(aShape,weight,WaterDensity,MeshingDeflection) + if LocalOp.IsDone() == 0: + print "MakeArchimede : ", LocalOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Information objects +# ----------------------------------------------------------------------------- + +def PointCoordinates(Point): + aTuple = MeasuOp.PointCoordinates(Point) + if MeasuOp.IsDone() == 0: + print "PointCoordinates : ", MeasuOp.GetErrorCode() + return aTuple + +def BasicProperties(Shape): + aTuple = MeasuOp.GetBasicProperties(Shape) + if MeasuOp.IsDone() == 0: + print "BasicProperties : ", MeasuOp.GetErrorCode() + return aTuple + +def BoundingBox(Shape): + aTuple = MeasuOp.GetBoundingBox(Shape) + if MeasuOp.IsDone() == 0: + print "BoundingBox : ", MeasuOp.GetErrorCode() + return aTuple + +def Inertia(Shape): + aTuple = MeasuOp.GetInertia(Shape) + if MeasuOp.IsDone() == 0: + print "Inertia : ", MeasuOp.GetErrorCode() + return aTuple + +def MinDistance(Shape1, Shape2): + aTuple = MeasuOp.GetMinDistance(Shape1, Shape2) + if MeasuOp.IsDone() == 0: + print "MinDistance : ", MeasuOp.GetErrorCode() + return aTuple[0] + +def Tolerance(Shape): + aTuple = MeasuOp.GetTolerance(Shape) + if MeasuOp.IsDone() == 0: + print "Tolerance : ", MeasuOp.GetErrorCode() + return aTuple + +def WhatIs(Shape): + aDescr = MeasuOp.WhatIs(Shape) + if MeasuOp.IsDone() == 0: + print "WhatIs : ", MeasuOp.GetErrorCode() + return aDescr + +def MakeCDG(aShape): + anObj = MeasuOp.GetCentreOfMass(aShape) + if MeasuOp.IsDone() == 0: + print "GetCentreOfMass : ", MeasuOp.GetErrorCode() + return anObj + +def CheckShape(aShape): + (IsValid, Status) = MeasuOp.CheckShape(aShape) + if MeasuOp.IsDone() == 0: + print "CheckShape : ", MeasuOp.GetErrorCode() + else: + if IsValid == 0: + print Status + return IsValid + +# ----------------------------------------------------------------------------- +# Import/Export objects +# ----------------------------------------------------------------------------- + +def Import(filename, formatname): + anObj = InsertOp.Import(filename, formatname) + if InsertOp.IsDone() == 0: + print "Import : ", InsertOp.GetErrorCode() + return anObj + +def ImportBREP(theFileName): + return Import(theFileName, "BREP") + +def ImportIGES(theFileName): + return Import(theFileName, "IGES") + +def ImportSTEP(theFileName): + return Import(theFileName, "STEP") + +def Export(aShape, filename, formatname): + InsertOp.Export(aShape, filename, formatname) + if InsertOp.IsDone() == 0: + print "Export : ", InsertOp.GetErrorCode() + +def ExportBREP(theObject, theFileName): + return Export(theObject, theFileName, "BREP") + +def ExportIGES(theObject, theFileName): + return Export(theObject, theFileName, "IGES") + +def ExportSTEP(theObject, theFileName): + return Export(theObject, theFileName, "STEP") + +# ----------------------------------------------------------------------------- +# Block operations +# ----------------------------------------------------------------------------- + +def MakeQuad(E1, E2, E3, E4): + anObj = BlocksOp.MakeQuad(E1, E2, E3, E4) + if BlocksOp.IsDone() == 0: + print "MakeQuad : ", BlocksOp.GetErrorCode() + return anObj + +def MakeQuad2Edges(E1, E2): + anObj = BlocksOp.MakeQuad2Edges(E1, E2) + if BlocksOp.IsDone() == 0: + print "MakeQuad2Edges : ", BlocksOp.GetErrorCode() + return anObj + +def MakeQuad4Vertices(V1, V2, V3, V4): + anObj = BlocksOp.MakeQuad4Vertices(V1, V2, V3, V4) + if BlocksOp.IsDone() == 0: + print "MakeQuad4Vertices : ", BlocksOp.GetErrorCode() + return anObj + +def MakeHexa(F1, F2, F3, F4, F5, F6): + anObj = BlocksOp.MakeHexa(F1, F2, F3, F4, F5, F6) + if BlocksOp.IsDone() == 0: + print "MakeHexa : ", BlocksOp.GetErrorCode() + return anObj + +def MakeHexa2Faces(F1, F2): + anObj = BlocksOp.MakeHexa2Faces(F1, F2) + if BlocksOp.IsDone() == 0: + print "MakeHexa2Faces : ", BlocksOp.GetErrorCode() + return anObj + +def GetPoint(theShape, theX, theY, theZ, theEpsilon): + anObj = BlocksOp.GetPoint(theShape, theX, theY, theZ, theEpsilon) + if BlocksOp.IsDone() == 0: + print "GetPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetEdge(theShape, thePoint1, thePoint2): + anObj = BlocksOp.GetEdge(theShape, thePoint1, thePoint2) + if BlocksOp.IsDone() == 0: + print "GetEdge : ", BlocksOp.GetErrorCode() + return anObj + +def GetEdgeNearPoint(theShape, thePoint): + anObj = BlocksOp.GetEdgeNearPoint(theShape, thePoint) + if BlocksOp.IsDone() == 0: + print "GetEdgeNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByPoints(theShape, thePoint1, thePoint2, thePoint3, thePoint4): + anObj = BlocksOp.GetFaceByPoints(theShape, thePoint1, thePoint2, thePoint3, thePoint4) + if BlocksOp.IsDone() == 0: + print "GetFaceByPoints : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByEdges(theShape, theEdge1, theEdge2): + anObj = BlocksOp.GetFaceByEdges(theShape, theEdge1, theEdge2) + if BlocksOp.IsDone() == 0: + print "GetFaceByEdges : ", BlocksOp.GetErrorCode() + return anObj + +def GetOppositeFace(theBlock, theFace): + anObj = BlocksOp.GetOppositeFace(theBlock, theFace) + if BlocksOp.IsDone() == 0: + print "GetOppositeFace : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceNearPoint(theShape, thePoint): + anObj = BlocksOp.GetFaceNearPoint(theShape, thePoint) + if BlocksOp.IsDone() == 0: + print "GetFaceNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByNormale(theBlock, theVector): + anObj = BlocksOp.GetFaceByNormale(theBlock, theVector) + if BlocksOp.IsDone() == 0: + print "GetFaceByNormale : ", BlocksOp.GetErrorCode() + return anObj + +def CheckCompoundOfBlocks(theCompound): + (IsValid, BCErrors) = BlocksOp.CheckCompoundOfBlocks(theCompound) + if BlocksOp.IsDone() == 0: + print "CheckCompoundOfBlocks : ", BlocksOp.GetErrorCode() + else: + if IsValid == 0: + Descr = BlocksOp.PrintBCErrors(theCompound, BCErrors) + print Descr + return IsValid + +def RemoveExtraEdges(theShape): + anObj = BlocksOp.RemoveExtraEdges(theShape) + if BlocksOp.IsDone() == 0: + print "RemoveExtraEdges : ", BlocksOp.GetErrorCode() + return anObj + +def CheckAndImprove(theShape): + anObj = BlocksOp.CheckAndImprove(theShape) + if BlocksOp.IsDone() == 0: + print "CheckAndImprove : ", BlocksOp.GetErrorCode() + return anObj + +def MakeBlockExplode(theCompound, theMinNbFaces, theMaxNbFaces): + aList = BlocksOp.ExplodeCompoundOfBlocks(theCompound, theMinNbFaces, theMaxNbFaces) + if BlocksOp.IsDone() == 0: + print "MakeBlockExplode : ", BlocksOp.GetErrorCode() + return aList + +def GetBlockNearPoint(theCompound, thePoint): + anObj = BlocksOp.GetBlockNearPoint(theCompound, thePoint) + if BlocksOp.IsDone() == 0: + print "GetBlockNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetBlockByParts(theCompound, theParts): + anObj = BlocksOp.GetBlockByParts(theCompound, theParts) + if BlocksOp.IsDone() == 0: + print "GetBlockByParts : ", BlocksOp.GetErrorCode() + return anObj + +def GetBlocksByParts(theCompound, theParts): + aList = BlocksOp.GetBlocksByParts(theCompound, theParts) + if BlocksOp.IsDone() == 0: + print "GetBlocksByParts : ", BlocksOp.GetErrorCode() + return aList + +def MakeMultiTransformation1D(Block, DirFaceID1, DirFaceID2, NbTimes): + anObj = BlocksOp.MakeMultiTransformation1D(Block, DirFaceID1, DirFaceID2, NbTimes) + if BlocksOp.IsDone() == 0: + print "MakeMultiTransformation1D : ", BlocksOp.GetErrorCode() + return anObj + +def MakeMultiTransformation2D(Block, DirFaceID1U, DirFaceID2U, NbTimesU, + DirFaceID1V, DirFaceID2V, NbTimesV): + anObj = BlocksOp.MakeMultiTransformation2D(Block, DirFaceID1U, DirFaceID2U, NbTimesU, + DirFaceID1V, DirFaceID2V, NbTimesV) + if BlocksOp.IsDone() == 0: + print "MakeMultiTransformation2D : ", BlocksOp.GetErrorCode() + return anObj + +def Propagate(theShape): + listChains = BlocksOp.Propagate(theShape) + if BlocksOp.IsDone() == 0: + print "Propagate : ", BlocksOp.GetErrorCode() + return listChains + +# ----------------------------------------------------------------------------- +# Group operations +# ----------------------------------------------------------------------------- + +def CreateGroup(MainShape, ShapeType): + anObj = GroupOp.CreateGroup(MainShape, ShapeType) + if GroupOp.IsDone() == 0: + print "CreateGroup : ", GroupOp.GetErrorCode() + return anObj + +def AddObject(Group, SubShapeID): + GroupOp.AddObject(Group, SubShapeID) + if GroupOp.IsDone() == 0: + print "AddObject : ", GroupOp.GetErrorCode() + +def RemoveObject(Group, SubShapeID): + GroupOp.RemoveObject(Group, SubShapeID) + if GroupOp.IsDone() == 0: + print "RemoveObject : ", GroupOp.GetErrorCode() + +def UnionList (theGroup, theSubShapes): + GroupOp.UnionList(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "UnionList : ", GroupOp.GetErrorCode() + +def UnionIDs(theGroup, theSubShapes): + GroupOp.UnionIDs(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "UnionIDs : ", GroupOp.GetErrorCode() + +def DifferenceList (theGroup, theSubShapes): + GroupOp.DifferenceList(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "DifferenceList : ", GroupOp.GetErrorCode() + +def DifferenceIDs(theGroup, theSubShapes): + GroupOp.DifferenceIDs(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "DifferenceIDs : ", GroupOp.GetErrorCode() + +def GetObjectIDs(Group): + ListIDs = GroupOp.GetObjects(Group) + if GroupOp.IsDone() == 0: + print "GetObjectIDs : ", GroupOp.GetErrorCode() + return ListIDs + +def GetType(theGroup): + aType = GroupOp.GetType(theGroup) + if GroupOp.IsDone() == 0: + print "GetType : ", GroupOp.GetErrorCode() + return aType + +def GetMainShape(theGroup): + anObj = GroupOp.GetMainShape(theGroup) + if GroupOp.IsDone() == 0: + print "GetMainShape : ", GroupOp.GetErrorCode() + return anObj + +def GetEdgesByLength (theShape, min_length, max_length, include_min = 1, include_max = 1): + """ + Create group of edges of theShape, whose length is in range [min_length, max_length]. + If include_min/max == 0, edges with length == min/max_length will not be included in result. + """ + + edges = SubShapeAll(theShape, ShapeType["EDGE"]) + edges_in_range = [] + for edge in edges: + Props = BasicProperties(edge) + if min_length <= Props[0] and Props[0] <= max_length: + if (not include_min) and (min_length == Props[0]): + skip = 1 + else: + if (not include_max) and (Props[0] == max_length): + skip = 1 + else: + edges_in_range.append(edge) + + if len(edges_in_range) <= 0: + print "No edges found by given criteria" + return 0 + + group_edges = CreateGroup(theShape, ShapeType["EDGE"]) + UnionList(group_edges, edges_in_range) + + return group_edges + +# Add Path to the system path +# +def addPath(Path): + if (sys.path.count(Path) < 1): + sys.path.append(Path) diff --git a/src/GEOM_SWIG/geompy.py b/src/GEOM_SWIG/geompy.py new file mode 100644 index 000000000..6d47c038a --- /dev/null +++ b/src/GEOM_SWIG/geompy.py @@ -0,0 +1,2603 @@ +# GEOM GEOM_SWIG : binding of C++ omplementaion with Python +# +# 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : geompy.py +# Author : Paul RASCLE, EDF +# Module : GEOM +# $Header$ + +from salome import * +import GEOM + +""" + \namespace geompy + \brief Module geompy +""" + +g = lcc.FindOrLoadComponent("FactoryServer", "GEOM") +geom = g._narrow( GEOM.GEOM_Gen ) +gg = ImportComponentGUI("GEOM") +gg.initGeomGen() + +#SRN: modified on Mar 18, 2005 + +myBuilder = None +myStudyId = 0 +father = None + +BasicOp = None +CurvesOp = None +PrimOp = None +ShapesOp = None +HealOp = None +InsertOp = None +BoolOp = None +TrsfOp = None +LocalOp = None +MeasuOp = None +BlocksOp = None +GroupOp = None + +def init_geom(theStudy): + + global myStudy, myBuilder, myStudyId, BasicOp, CurvesOp, PrimOp, ShapesOp, HealOp + global InsertOp, BoolOp, TrsfOp, LocalOp, MeasuOp, BlocksOp, GroupOp, father + + myStudy = theStudy + myStudyId = myStudy._get_StudyId() + myBuilder = myStudy.NewBuilder() + father = myStudy.FindComponent("GEOM") + if father is None: + father = myBuilder.NewComponent("GEOM") + A1 = myBuilder.FindOrCreateAttribute(father, "AttributeName") + FName = A1._narrow(SALOMEDS.AttributeName) + FName.SetValue("Geometry") + A2 = myBuilder.FindOrCreateAttribute(father, "AttributePixMap") + aPixmap = A2._narrow(SALOMEDS.AttributePixMap) + aPixmap.SetPixMap("ICON_OBJBROWSER_Geometry") + myBuilder.DefineComponentInstance(father,geom) + pass + + # ----------------------------------------------------------------------------- + # Assign Operations Interfaces + # ----------------------------------------------------------------------------- + + BasicOp = geom.GetIBasicOperations (myStudyId) + CurvesOp = geom.GetICurvesOperations (myStudyId) + PrimOp = geom.GetI3DPrimOperations (myStudyId) + ShapesOp = geom.GetIShapesOperations (myStudyId) + HealOp = geom.GetIHealingOperations (myStudyId) + InsertOp = geom.GetIInsertOperations (myStudyId) + BoolOp = geom.GetIBooleanOperations (myStudyId) + TrsfOp = geom.GetITransformOperations(myStudyId) + LocalOp = geom.GetILocalOperations (myStudyId) + MeasuOp = geom.GetIMeasureOperations (myStudyId) + BlocksOp = geom.GetIBlocksOperations (myStudyId) + GroupOp = geom.GetIGroupOperations (myStudyId) + pass + +init_geom(myStudy) + +#SRN: end of modifications + +def SubShapeName(aSubObj, aMainObj): + """ + * Get name for sub-shape aSubObj of shape aMainObj + + * Example: see GEOM_TestAll.py + """ + aSubId = orb.object_to_string(aSubObj) + aMainId = orb.object_to_string(aMainObj) + index = gg.getIndexTopology(aSubId, aMainId) + name = gg.getShapeTypeString(aSubId) + "_%d"%(index) + return name + +def addToStudy(aShape, aName): + """ + * Publish in study aShape with name aName + + * Example: see GEOM_TestAll.py + """ + try: + aSObject = geom.AddInStudy(myStudy, aShape, aName, None) + except: + print "addToStudy() failed" + return "" + return aShape.GetStudyEntry() + +def addToStudyInFather(aFather, aShape, aName): + """ + * Publish in study aShape with name aName as sub-object of previously published aFather + + * Example: see GEOM_TestAll.py + """ + try: + aSObject = geom.AddInStudy(myStudy, aShape, aName, aFather) + except: + print "addToStudyInFather() failed" + return "" + return aShape.GetStudyEntry() + +# ----------------------------------------------------------------------------- +# enumeration ShapeType as a dictionary +# ----------------------------------------------------------------------------- + +ShapeType = {"COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8} + +# ----------------------------------------------------------------------------- +# Basic primitives +# ----------------------------------------------------------------------------- + +def MakeVertex(theX, theY, theZ): + """ + * Create point by three coordinates. + * \param theX The X coordinate of the point. + * \param theY The Y coordinate of the point. + * \param theZ The Z coordinate of the point. + * \return New GEOM_Object, containing the created point. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePointXYZ(theX, theY, theZ) + if BasicOp.IsDone() == 0: + print "MakePointXYZ : ", BasicOp.GetErrorCode() + return anObj + +def MakeVertexWithRef(theReference, theX, theY, theZ): + """ + * Create a point, distant from the referenced point + * on the given distances along the coordinate axes. + * \param theReference The referenced point. + * \param theX Displacement from the referenced point along OX axis. + * \param theY Displacement from the referenced point along OY axis. + * \param theZ Displacement from the referenced point along OZ axis. + * \return New GEOM_Object, containing the created point. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePointWithReference(theReference, theX, theY, theZ) + if BasicOp.IsDone() == 0: + print "MakePointWithReference : ", BasicOp.GetErrorCode() + return anObj + +def MakeVertexOnCurve(theRefCurve, theParameter): + """ + * Create a point, corresponding to the given parameter on the given curve. + * \param theRefCurve The referenced curve. + * \param theParameter Value of parameter on the referenced curve. + * \return New GEOM_Object, containing the created point. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePointOnCurve(theRefCurve, theParameter) + if BasicOp.IsDone() == 0: + print "MakePointOnCurve : ", BasicOp.GetErrorCode() + return anObj + +def MakeVectorDXDYDZ(theDX, theDY, theDZ): + """ + * Create a vector with the given components. + * \param theDX X component of the vector. + * \param theDY Y component of the vector. + * \param theDZ Z component of the vector. + * \return New GEOM_Object, containing the created vector. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakeVectorDXDYDZ(theDX, theDY, theDZ) + if BasicOp.IsDone() == 0: + print "MakeVectorDXDYDZ : ", BasicOp.GetErrorCode() + return anObj + +def MakeVector(thePnt1, thePnt2): + """ + * Create a vector between two points. + * \param thePnt1 Start point for the vector. + * \param thePnt2 End point for the vector. + * \return New GEOM_Object, containing the created vector. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakeVectorTwoPnt(thePnt1, thePnt2) + if BasicOp.IsDone() == 0: + print "MakeVectorTwoPnt : ", BasicOp.GetErrorCode() + return anObj + +def MakeLine(thePnt, theDir): + """ + * Create a line, passing through the given point + * and parrallel to the given direction + * \param thePnt Point. The resulting line will pass through it. + * \param theDir Direction. The resulting line will be parallel to it. + * \return New GEOM_Object, containing the created line. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakeLine(thePnt, theDir) + if BasicOp.IsDone() == 0: + print "MakeLine : ", BasicOp.GetErrorCode() + return anObj + +def MakeLineTwoPnt(thePnt1, thePnt2): + """ + * Create a line, passing through the given points + * \param thePnt1 First of two points, defining the line. + * \param thePnt2 Second of two points, defining the line. + * \return New GEOM_Object, containing the created line. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakeLineTwoPnt(thePnt1, thePnt2) + if BasicOp.IsDone() == 0: + print "MakeLineTwoPnt : ", BasicOp.GetErrorCode() + return anObj + +def MakePlane(thePnt, theVec, theTrimSize): + """ + * Create a plane, passing through the given point + * and normal to the given vector. + * \param thePnt Point, the plane has to pass through. + * \param theVec Vector, defining the plane normal direction. + * \param theTrimSize Half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePlanePntVec(thePnt, theVec, theTrimSize) + if BasicOp.IsDone() == 0: + print "MakePlanePntVec : ", BasicOp.GetErrorCode() + return anObj + +def MakePlaneThreePnt(thePnt1, thePnt2, thePnt3, theTrimSize): + """ + * Create a plane, passing through the three given points + * \param thePnt1 First of three points, defining the plane. + * \param thePnt2 Second of three points, defining the plane. + * \param thePnt3 Fird of three points, defining the plane. + * \param theTrimSize Half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePlaneThreePnt(thePnt1, thePnt2, thePnt3, theTrimSize) + if BasicOp.IsDone() == 0: + print "MakePlaneThreePnt : ", BasicOp.GetErrorCode() + return anObj + +def MakePlaneFace(theFace, theTrimSize): + """ + * Create a plane, similar to the existing one, but with another size of representing face. + * \param theFace Referenced plane. + * \param theTrimSize New half size of a side of quadrangle face, representing the plane. + * \return New GEOM_Object, containing the created plane. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakePlaneFace(theFace, theTrimSize) + if BasicOp.IsDone() == 0: + print "MakePlaneFace : ", BasicOp.GetErrorCode() + return anObj + +def MakeMarker(OX,OY,OZ, XDX,XDY,XDZ, YDX,YDY,YDZ): + """ + * Create a local coordinate system. + * \param OX,OY,OZ Three coordinates of coordinate system origin. + * \param XDX,XDY,XDZ Three components of OX direction + * \param YDX,YDY,YDZ Three components of OY direction + * \return New GEOM_Object, containing the created coordinate system. + + * Example: see GEOM_TestAll.py + """ + anObj = BasicOp.MakeMarker(OX,OY,OZ, XDX,XDY,XDZ, YDX,YDY,YDZ) + if BasicOp.IsDone() == 0: + print "MakeMarker : ", BasicOp.GetErrorCode() + return anObj + +def MakeMarkerPntTwoVec(theOrigin, theXVec, theYVec): + """ + * Create a local coordinate system. + * \param theOrigin Point of coordinate system origin. + * \param theXVec Vector of X direction + * \param theYVec Vector of Y direction + * \return New GEOM_Object, containing the created coordinate system. + """ + O = PointCoordinates( theOrigin ) + OXOY = [] + for vec in [ theXVec, theYVec ]: + v1, v2 = SubShapeAll( vec, ShapeType["VERTEX"] ) + p1 = PointCoordinates( v1 ) + p2 = PointCoordinates( v2 ) + for i in range( 0, 3 ): + OXOY.append( p2[i] - p1[i] ) + # + anObj = BasicOp.MakeMarker( O[0], O[1], O[2], + OXOY[0], OXOY[1], OXOY[2], + OXOY[3], OXOY[4], OXOY[5], ) + if BasicOp.IsDone() == 0: + print "MakeMarker : ", BasicOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Curves +# ----------------------------------------------------------------------------- + +def MakeArc(thePnt1, thePnt2, thePnt3): + """ + * Create an arc of circle, passing through three given points. + * \param thePnt1 Start point of the arc. + * \param thePnt2 Middle point of the arc. + * \param thePnt3 End point of the arc. + * \return New GEOM_Object, containing the created arc. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeArc(thePnt1, thePnt2, thePnt3) + if CurvesOp.IsDone() == 0: + print "MakeArc : ", CurvesOp.GetErrorCode() + return anObj + +def MakeCircle(thePnt, theVec, theR): + """ + * Create a circle with given center, normal vector and radius. + * \param thePnt Circle center. + * \param theVec Vector, normal to the plane of the circle. + * \param theR Circle radius. + * \return New GEOM_Object, containing the created circle. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeCirclePntVecR(thePnt, theVec, theR) + if CurvesOp.IsDone() == 0: + print "MakeCirclePntVecR : ", CurvesOp.GetErrorCode() + return anObj + +def MakeCircleThreePnt(thePnt1, thePnt2, thePnt3): + """ + * Create a circle, passing through three given points + * \param thePnt1,thePnt2,thePnt3 Points, defining the circle. + * \return New GEOM_Object, containing the created circle. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeCircleThreePnt(thePnt1, thePnt2, thePnt3) + if CurvesOp.IsDone() == 0: + print "MakeCircleThreePnt : ", CurvesOp.GetErrorCode() + return anObj + +def MakeEllipse(thePnt, theVec, theRMajor, theRMinor): + """ + * Create an ellipse with given center, normal vector and radiuses. + * \param thePnt Ellipse center. + * \param theVec Vector, normal to the plane of the ellipse. + * \param theRMajor Major ellipse radius. + * \param theRMinor Minor ellipse radius. + * \return New GEOM_Object, containing the created ellipse. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeEllipse(thePnt, theVec, theRMajor, theRMinor) + if CurvesOp.IsDone() == 0: + print "MakeEllipse : ", CurvesOp.GetErrorCode() + return anObj + +def MakePolyline(thePoints): + """ + * Create a polyline on the set of points. + * \param thePoints Sequence of points for the polyline. + * \return New GEOM_Object, containing the created polyline. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakePolyline(thePoints) + if CurvesOp.IsDone() == 0: + print "MakePolyline : ", CurvesOp.GetErrorCode() + return anObj + +def MakeBezier(thePoints): + """ + * Create bezier curve on the set of points. + * \param thePoints Sequence of points for the bezier curve. + * \return New GEOM_Object, containing the created bezier curve. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeSplineBezier(thePoints) + if CurvesOp.IsDone() == 0: + print "MakeSplineBezier : ", CurvesOp.GetErrorCode() + return anObj + +def MakeInterpol(thePoints): + """ + * Create B-Spline curve on the set of points. + * \param thePoints Sequence of points for the B-Spline curve. + * \return New GEOM_Object, containing the created B-Spline curve. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeSplineInterpolation(thePoints) + if CurvesOp.IsDone() == 0: + print "MakeSplineInterpolation : ", CurvesOp.GetErrorCode() + return anObj + +def MakeSketcher(theCommand, theWorkingPlane = [0,0,0, 0,0,1, 1,0,0]): + """ + * Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. \n + * Edges of the resulting wire or face will be arcs of circles and/or linear segments. \n + * Format of the description string have to be the following: + * + * "Sketcher[:F x1 y1]:CMD[:CMD[:CMD...]]" + * + * Where: + * - x1, y1 are coordinates of the first sketcher point (zero by default), + * - CMD is one of + * - "R angle" : Set the direction by angle + * - "D dx dy" : Set the direction by DX & DY + * . + * \n + * - "TT x y" : Create segment by point at X & Y + * - "T dx dy" : Create segment by point with DX & DY + * - "L length" : Create segment by direction & Length + * - "IX x" : Create segment by direction & Intersect. X + * - "IY y" : Create segment by direction & Intersect. Y + * . + * \n + * - "C radius length" : Create arc by direction, radius and length(in degree) + * . + * \n + * - "WW" : Close Wire (to finish) + * - "WF" : Close Wire and build face (to finish) + * + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Nine double values, defining origin, + * OZ and OX directions of the working plane. + * \return New GEOM_Object, containing the created wire. + + * Example: see GEOM_TestAll.py + """ + anObj = CurvesOp.MakeSketcher(theCommand, theWorkingPlane) + if CurvesOp.IsDone() == 0: + print "MakeSketcher : ", CurvesOp.GetErrorCode() + return anObj + +def MakeSketcherOnPlane(theCommand, theWorkingPlane): + """ + * Create a sketcher (wire or face), following the textual description, + * passed through \a theCommand argument. \n + * For format of the description string see the previous method.\n + * \param theCommand String, defining the sketcher in local + * coordinates of the working plane. + * \param theWorkingPlane Planar Face of the working plane. + * \return New GEOM_Object, containing the created wire. + """ + anObj = CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane) + if CurvesOp.IsDone() == 0: + print "MakeSketcher : ", CurvesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create 3D Primitives +# ----------------------------------------------------------------------------- + +def MakeBox(x1,y1,z1,x2,y2,z2): + """ + * Create a box by coordinates of two opposite vertices. + + * Example: see GEOM_TestAll.py + """ + pnt1 = MakeVertex(x1,y1,z1) + pnt2 = MakeVertex(x2,y2,z2) + return MakeBoxTwoPnt(pnt1,pnt2) + +def MakeBoxDXDYDZ(theDX, theDY, theDZ): + """ + * Create a box with specified dimensions along the coordinate axes + * and with edges, parallel to the coordinate axes. + * Center of the box will be at point (DX/2, DY/2, DZ/2). + * \param theDX Length of Box edges, parallel to OX axis. + * \param theDY Length of Box edges, parallel to OY axis. + * \param theDZ Length of Box edges, parallel to OZ axis. + * \return New GEOM_Object, containing the created box. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeBoxDXDYDZ(theDX, theDY, theDZ) + if PrimOp.IsDone() == 0: + print "MakeBoxDXDYDZ : ", PrimOp.GetErrorCode() + return anObj + +def MakeBoxTwoPnt(thePnt1, thePnt2): + """ + * Create a box with two specified opposite vertices, + * and with edges, parallel to the coordinate axes + * \param thePnt1 First of two opposite vertices. + * \param thePnt2 Second of two opposite vertices. + * \return New GEOM_Object, containing the created box. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeBoxTwoPnt(thePnt1, thePnt2) + if PrimOp.IsDone() == 0: + print "MakeBoxTwoPnt : ", PrimOp.GetErrorCode() + return anObj + +def MakeCylinder(thePnt, theAxis, theR, theH): + """ + * Create a cylinder with given base point, axis, radius and height. + * \param thePnt Central point of cylinder base. + * \param theAxis Cylinder axis. + * \param theR Cylinder radius. + * \param theH Cylinder height. + * \return New GEOM_Object, containing the created cylinder. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeCylinderPntVecRH(thePnt, theAxis, theR, theH) + if PrimOp.IsDone() == 0: + print "MakeCylinderPntVecRH : ", PrimOp.GetErrorCode() + return anObj + +def MakeCylinderRH(theR, theH): + """ + * Create a cylinder with given radius and height at + * the origin of coordinate system. Axis of the cylinder + * will be collinear to the OZ axis of the coordinate system. + * \param theR Cylinder radius. + * \param theH Cylinder height. + * \return New GEOM_Object, containing the created cylinder. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeCylinderRH(theR, theH) + if PrimOp.IsDone() == 0: + print "MakeCylinderRH : ", PrimOp.GetErrorCode() + return anObj + +def MakeSpherePntR(thePnt, theR): + """ + * Create a sphere with given center and radius. + * \param thePnt Sphere center. + * \param theR Sphere radius. + * \return New GEOM_Object, containing the created sphere. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeSpherePntR(thePnt, theR) + if PrimOp.IsDone() == 0: + print "MakeSpherePntR : ", PrimOp.GetErrorCode() + return anObj + +def MakeSphere(x, y, z, theR): + """ + * Create a sphere with given center and radius. + * \param x,y,z Coordinates of sphere center. + * \param theR Sphere radius. + * \return New GEOM_Object, containing the created sphere. + + * Example: see GEOM_TestAll.py + """ + point = MakeVertex(x, y, z) + anObj = MakeSpherePntR(point, theR) + return anObj + +def MakeSphereR(theR): + """ + * Create a sphere with given radius at the origin of coordinate system. + * \param theR Sphere radius. + * \return New GEOM_Object, containing the created sphere. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeSphereR(theR) + if PrimOp.IsDone() == 0: + print "MakeSphereR : ", PrimOp.GetErrorCode() + return anObj + +def MakeCone(thePnt, theAxis, theR1, theR2, theH): + """ + * Create a cone with given base point, axis, height and radiuses. + * \param thePnt Central point of the first cone base. + * \param theAxis Cone axis. + * \param theR1 Radius of the first cone base. + * \param theR2 Radius of the second cone base. + * \note If both radiuses are non-zero, the cone will be truncated. + * \note If the radiuses are equal, a cylinder will be created instead. + * \param theH Cone height. + * \return New GEOM_Object, containing the created cone. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeConePntVecR1R2H(thePnt, theAxis, theR1, theR2, theH) + if PrimOp.IsDone() == 0: + print "MakeConePntVecR1R2H : ", PrimOp.GetErrorCode() + return anObj + +def MakeConeR1R2H(theR1, theR2, theH): + """ + * Create a cone with given height and radiuses at + * the origin of coordinate system. Axis of the cone will + * be collinear to the OZ axis of the coordinate system. + * \param theR1 Radius of the first cone base. + * \param theR2 Radius of the second cone base. + * \note If both radiuses are non-zero, the cone will be truncated. + * \note If the radiuses are equal, a cylinder will be created instead. + * \param theH Cone height. + * \return New GEOM_Object, containing the created cone. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeConeR1R2H(theR1, theR2, theH) + if PrimOp.IsDone() == 0: + print "MakeConeR1R2H : ", PrimOp.GetErrorCode() + return anObj + +def MakeTorus(thePnt, theVec, theRMajor, theRMinor): + """ + * Create a torus with given center, normal vector and radiuses. + * \param thePnt Torus central point. + * \param theVec Torus axis of symmetry. + * \param theRMajor Torus major radius. + * \param theRMinor Torus minor radius. + * \return New GEOM_Object, containing the created torus. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeTorusPntVecRR(thePnt, theVec, theRMajor, theRMinor) + if PrimOp.IsDone() == 0: + print "MakeTorusPntVecRR : ", PrimOp.GetErrorCode() + return anObj + +def MakeTorusRR(theRMajor, theRMinor): + """ + * Create a torus with given radiuses at the origin of coordinate system. + * \param theRMajor Torus major radius. + * \param theRMinor Torus minor radius. + * \return New GEOM_Object, containing the created torus. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeTorusRR(theRMajor, theRMinor) + if PrimOp.IsDone() == 0: + print "MakeTorusRR : ", PrimOp.GetErrorCode() + return anObj + +def MakePrism(theBase, thePoint1, thePoint2): + """ + * Create a shape by extrusion of the base shape along a vector, defined by two points. + * \param theBase Base shape to be extruded. + * \param thePoint1 First end of extrusion vector. + * \param thePoint2 Second end of extrusion vector. + * \return New GEOM_Object, containing the created prism. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakePrismTwoPnt(theBase, thePoint1, thePoint2) + if PrimOp.IsDone() == 0: + print "MakePrismTwoPnt : ", PrimOp.GetErrorCode() + return anObj + +def MakePrismVecH(theBase, theVec, theH): + """ + * Create a shape by extrusion of the base shape along the vector, + * i.e. all the space, transfixed by the base shape during its translation + * along the vector on the given distance. + * \param theBase Base shape to be extruded. + * \param theVec Direction of extrusion. + * \param theH Prism dimension along theVec. + * \return New GEOM_Object, containing the created prism. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakePrismVecH(theBase, theVec, theH) + if PrimOp.IsDone() == 0: + print "MakePrismVecH : ", PrimOp.GetErrorCode() + return anObj + +def MakePipe(theBase, thePath): + """ + * Create a shape by extrusion of the base shape along + * the path shape. The path shape can be a wire or an edge. + * \param theBase Base shape to be extruded. + * \param thePath Path shape to extrude the base shape along it. + * \return New GEOM_Object, containing the created pipe. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakePipe(theBase, thePath) + if PrimOp.IsDone() == 0: + print "MakePipe : ", PrimOp.GetErrorCode() + return anObj + +def MakeRevolution(theBase, theAxis, theAngle): + """ + * Create a shape by revolution of the base shape around the axis + * on the given angle, i.e. all the space, transfixed by the base + * shape during its rotation around the axis on the given angle. + * \param theBase Base shape to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in radians. + * \return New GEOM_Object, containing the created revolution. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeRevolutionAxisAngle(theBase, theAxis, theAngle) + if PrimOp.IsDone() == 0: + print "MakeRevolutionAxisAngle : ", PrimOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create base shapes +# ----------------------------------------------------------------------------- + +def MakeEdge(thePnt1, thePnt2): + """ + * Create a linear edge with specified ends. + * \param thePnt1 Point for the first end of edge. + * \param thePnt2 Point for the second end of edge. + * \return New GEOM_Object, containing the created edge. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeEdge(thePnt1, thePnt2) + if ShapesOp.IsDone() == 0: + print "MakeEdge : ", ShapesOp.GetErrorCode() + return anObj + +def MakeWire(theEdgesAndWires): + """ + * Create a wire from the set of edges and wires. + * \param theEdgesAndWires List of edges and/or wires. + * \return New GEOM_Object, containing the created wire. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeWire(theEdgesAndWires) + if ShapesOp.IsDone() == 0: + print "MakeWire : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFace(theWire, isPlanarWanted): + """ + * Create a face on the given wire. + * \param theWire Wire to build the face on. + * \param isPlanarWanted If TRUE, only planar face will be built. + * If impossible, NULL object will be returned. + * \return New GEOM_Object, containing the created face. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeFace(theWire, isPlanarWanted) + if ShapesOp.IsDone() == 0: + print "MakeFace : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFaceWires(theWires, isPlanarWanted): + """ + * Create a face on the given wires set. + * \param theWires List of wires to build the face on. + * \param isPlanarWanted If TRUE, only planar face will be built. + * If impossible, NULL object will be returned. + * \return New GEOM_Object, containing the created face. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeFaceWires(theWires, isPlanarWanted) + if ShapesOp.IsDone() == 0: + print "MakeFaceWires : ", ShapesOp.GetErrorCode() + return anObj + +def MakeFaces(theWires, isPlanarWanted): + """ + * Shortcut to MakeFaceWires() + + * Example: see GEOM_TestOthers.py + """ + anObj = MakeFaceWires(theWires, isPlanarWanted) + return anObj + +def MakeShell(theFacesAndShells): + """ + * Create a shell from the set of faces and shells. + * \param theFacesAndShells List of faces and/or shells. + * \return New GEOM_Object, containing the created shell. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeShell(theFacesAndShells) + if ShapesOp.IsDone() == 0: + print "MakeShell : ", ShapesOp.GetErrorCode() + return anObj + +def MakeSolid(theShells): + """ + * Create a solid, bounded by the given shells. + * \param theShells Sequence of bounding shells. + * \return New GEOM_Object, containing the created solid. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeSolidShells(theShells) + if ShapesOp.IsDone() == 0: + print "MakeSolid : ", ShapesOp.GetErrorCode() + return anObj + +def MakeCompound(theShapes): + """ + * Create a compound of the given shapes. + * \param theShapes List of shapes to put in compound. + * \return New GEOM_Object, containing the created compound. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.MakeCompound(theShapes) + if ShapesOp.IsDone() == 0: + print "MakeCompound : ", ShapesOp.GetErrorCode() + return anObj + +def NumberOfFaces(theShape): + """ + * Gives quantity of faces in the given shape. + * \param theShape Shape to count faces of. + * \return Quantity of faces. + + * Example: see GEOM_TestOthers.py + """ + nb_faces = ShapesOp.NumberOfFaces(theShape) + if ShapesOp.IsDone() == 0: + print "NumberOfFaces : ", ShapesOp.GetErrorCode() + return nb_faces + +def NumberOfEdges(theShape): + """ + * Gives quantity of edges in the given shape. + * \param theShape Shape to count edges of. + * \return Quantity of edges. + + * Example: see GEOM_TestOthers.py + """ + nb_edges = ShapesOp.NumberOfEdges(theShape) + if ShapesOp.IsDone() == 0: + print "NumberOfEdges : ", ShapesOp.GetErrorCode() + return nb_edges + +def ChangeOrientation(theShape): + """ + * Reverses an orientation the given shape. + * \param theShape Shape to be reversed. + * \return The reversed copy of theShape. + + * Example: see GEOM_TestAll.py + """ + anObj = ShapesOp.ChangeOrientation(theShape) + if ShapesOp.IsDone() == 0: + print "ChangeOrientation : ", ShapesOp.GetErrorCode() + return anObj + +def OrientationChange(theShape): + """ + * Shortcut to ChangeOrientation() + + * Example: see GEOM_TestOthers.py + """ + anObj = ChangeOrientation(theShape) + return anObj + +def GetFreeFacesIDs(theShape): + """ + * Retrieve all free faces from the given shape. + * Free face is a face, which is not shared between two shells of the shape. + * \param theShape Shape to find free faces in. + * \return List of IDs of all free faces, contained in theShape. + + * Example: see GEOM_TestOthers.py + """ + anIDs = ShapesOp.GetFreeFacesIDs(theShape) + if ShapesOp.IsDone() == 0: + print "GetFreeFacesIDs : ", ShapesOp.GetErrorCode() + return anIDs + +def GetSharedShapes(theShape1, theShape2, theShapeType): + """ + * Get all sub-shapes of theShape1 of the given type, shared with theShape2. + * \param theShape1 Shape to find sub-shapes in. + * \param theShape2 Shape to find shared sub-shapes with. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of sub-shapes of theShape1, shared with theShape2. + + * Example: see GEOM_TestOthers.py + """ + aList = ShapesOp.GetSharedShapes(theShape1, theShape2, theShapeType) + if ShapesOp.IsDone() == 0: + print "GetSharedShapes : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnPlane(theShape, theShapeType, theAx1, theState): + """ + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified plane by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAx1 Vector (or line, or linear edge), specifying normal + * direction and location of the plane to find shapes on. + * \param theState The state of the subshapes to find. It can be one of + * ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN. + * \return List of all found sub-shapes. + + * Example: see GEOM_TestOthers.py + """ + aList = ShapesOp.GetShapesOnPlane(theShape, theShapeType, theAx1, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnPlane : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnPlaneIDs(theShape, theShapeType, theAx1, theState): + """ + * Works like the above method, but returns list of sub-shapes indices + """ + aList = ShapesOp.GetShapesOnPlaneIDs(theShape, theShapeType, theAx1, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnPlaneIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnCylinder(theShape, theShapeType, theAxis, theRadius, theState): + """ + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified cylinder by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theAxis Vector (or line, or linear edge), specifying + * axis of the cylinder to find shapes on. + * \param theRadius Radius of the cylinder to find shapes on. + * \param theState The state of the subshapes to find. It can be one of + * ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN. + * \return List of all found sub-shapes. + + * Example: see GEOM_TestOthers.py + """ + aList = ShapesOp.GetShapesOnCylinder(theShape, theShapeType, theAxis, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnCylinder : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnCylinderIDs(theShape, theShapeType, theAxis, theRadius, theState): + """ + * Works like the above method, but returns list of sub-shapes indices + """ + aList = ShapesOp.GetShapesOnCylinderIDs(theShape, theShapeType, theAxis, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnCylinderIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnSphere(theShape, theShapeType, theCenter, theRadius, theState): + """ + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified sphere by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theCenter Point, specifying center of the sphere to find shapes on. + * \param theRadius Radius of the sphere to find shapes on. + * \param theState The state of the subshapes to find. It can be one of + * ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN. + * \return List of all found sub-shapes. + + * Example: see GEOM_TestOthers.py + """ + aList = ShapesOp.GetShapesOnSphere(theShape, theShapeType, theCenter, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnSphere : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnSphereIDs(theShape, theShapeType, theCenter, theRadius, theState): + """ + * Works like the above method, but returns list of sub-shapes indices + """ + aList = ShapesOp.GetShapesOnSphereIDs(theShape, theShapeType, theCenter, theRadius, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnSphereIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnQuadrangle(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState): + """ + * Find in \a theShape all sub-shapes of type \a theShapeType, situated relatively + * the specified quadrangle by the certain way, defined through \a theState parameter. + * \param theShape Shape to find sub-shapes of. + * \param theShapeType Type of sub-shapes to be retrieved. + * \param theCenter Point, specifying center of the sphere to find shapes on. + * \param theRadius Radius of the sphere to find shapes on. + * \param theState The state of the subshapes to find. It can be one of + * ST_ON, ST_OUT, ST_ONOUT, ST_IN, ST_ONIN. + * \return List of all found sub-shapes. + + * Example: see GEOM_TestOthers.py + """ + aList = ShapesOp.GetShapesOnQuadrangle(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnQuadrangle : ", ShapesOp.GetErrorCode() + return aList + +def GetShapesOnQuadrangleIDs(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState): + """ + * Works like the above method, but returns list of sub-shapes indices + """ + aList = ShapesOp.GetShapesOnQuadrangleIDs(theShape, theShapeType, theTopLeftPoint, theTopRigthPoint, theBottomLeftPoint, theBottomRigthPoint, theState) + if ShapesOp.IsDone() == 0: + print "GetShapesOnQuadrangleIDs : ", ShapesOp.GetErrorCode() + return aList + +def GetInPlace(theShapeWhere, theShapeWhat): + """ + * Get sub-shape(s) of theShapeWhere, which are + * coincident with \a theShapeWhat or could be a part of it. + * \param theShapeWhere Shape to find sub-shapes of. + * \param theShapeWhat Shape, specifying what to find. + * \return Group of all found sub-shapes or a single found sub-shape. + + * Example: see GEOM_TestOthers.py + """ + anObj = ShapesOp.GetInPlace(theShapeWhere, theShapeWhat) + if ShapesOp.IsDone() == 0: + print "GetInPlace : ", ShapesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Access to sub-shapes by their unique IDs inside the main shape. +# ----------------------------------------------------------------------------- + +def GetSubShape(aShape, ListOfID): + """ + * Obtain a composite sub-shape of , composed from sub-shapes + * of , selected by their unique IDs inside + + * Example: see GEOM_TestAll.py + """ + anObj = geom.AddSubShape(aShape,ListOfID) + return anObj + +def GetSubShapeID(aShape, aSubShape): + """ + * Obtain unique ID of sub-shape inside + + * Example: see GEOM_TestAll.py + """ + anID = LocalOp.GetSubShapeIndex(aShape, aSubShape) + if LocalOp.IsDone() == 0: + print "GetSubShapeIndex : ", LocalOp.GetErrorCode() + return anID + +# ----------------------------------------------------------------------------- +# Decompose objects +# ----------------------------------------------------------------------------- + +def SubShapeAll(aShape, aType): + """ + * Explode a shape on subshapes of a given type. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of sub-shapes of type theShapeType, contained in theShape. + + * Example: see GEOM_TestAll.py + """ + ListObj = ShapesOp.MakeExplode(aShape,aType,0) + if ShapesOp.IsDone() == 0: + print "MakeExplode : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllIDs(aShape, aType): + """ + * Explode a shape on subshapes of a given type. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of IDs of sub-shapes. + """ + ListObj = ShapesOp.SubShapeAllIDs(aShape,aType,0) + if ShapesOp.IsDone() == 0: + print "SubShapeAllIDs : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllSorted(aShape, aType): + """ + * Explode a shape on subshapes of a given type. + * Sub-shapes will be sorted by coordinates of their gravity centers. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of sub-shapes of type theShapeType, contained in theShape. + + * Example: see GEOM_TestAll.py + """ + ListObj = ShapesOp.MakeExplode(aShape,aType,1) + if ShapesOp.IsDone() == 0: + print "MakeExplode : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShapeAllSortedIDs(aShape, aType): + """ + * Explode a shape on subshapes of a given type. + * Sub-shapes will be sorted by coordinates of their gravity centers. + * \param theShape Shape to be exploded. + * \param theShapeType Type of sub-shapes to be retrieved. + * \return List of IDs of sub-shapes. + """ + ListIDs = ShapesOp.SubShapeAllIDs(aShape,aType,1) + if ShapesOp.IsDone() == 0: + print "SubShapeAllSortedIDs : ", ShapesOp.GetErrorCode() + return ListObj + +def SubShape(aShape, aType, ListOfInd): + """ + * Obtain a compound of sub-shapes of , + * selected by they indices in list of all sub-shapes of type . + * Each index is in range [1, Nb_Sub-Shapes_Of_Given_Type] + + * Example: see GEOM_TestAll.py + """ + ListOfIDs = [] + AllShapeList = SubShapeAll(aShape, aType) + for ind in ListOfInd: + ListOfIDs.append(GetSubShapeID(aShape, AllShapeList[ind - 1])) + anObj = GetSubShape(aShape, ListOfIDs) + return anObj + +def SubShapeSorted(aShape, aType, ListOfInd): + """ + * Obtain a compound of sub-shapes of , + * selected by they indices in sorted list of all sub-shapes of type . + * Each index is in range [1, Nb_Sub-Shapes_Of_Given_Type] + + * Example: see GEOM_TestAll.py + """ + ListOfIDs = [] + AllShapeList = SubShapeAllSorted(aShape, aType) + for ind in ListOfInd: + ListOfIDs.append(GetSubShapeID(aShape, AllShapeList[ind - 1])) + anObj = GetSubShape(aShape, ListOfIDs) + return anObj + +# ----------------------------------------------------------------------------- +# Healing operations +# ----------------------------------------------------------------------------- + +def ProcessShape(theShape, theOperators, theParameters, theValues): + """ + * Apply a sequence of Shape Healing operators to the given object. + * \param theShape Shape to be processed. + * \param theOperators List of names of operators ("FixShape", "SplitClosedFaces", etc.). + * \param theParameters List of names of parameters + * ("FixShape.Tolerance3d", "SplitClosedFaces.NbSplitPoints", etc.). + * \param theValues List of values of parameters, in the same order + * as parameters are listed in \a theParameters list. + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.ProcessShape(theShape, theOperators, theParameters, theValues) + if HealOp.IsDone() == 0: + print "ProcessShape : ", HealOp.GetErrorCode() + return anObj + +def SuppressFaces(theObject, theFaces): + """ + * Remove faces from the given object (shape). + * \param theObject Shape to be processed. + * \param theFaces Indices of faces to be removed, if EMPTY then the method + * removes ALL faces of the given object. + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.SuppressFaces(theObject, theFaces) + if HealOp.IsDone() == 0: + print "SuppressFaces : ", HealOp.GetErrorCode() + return anObj + +def MakeSewing(ListShape, theTolerance): + """ + * Sewing of some shapes into single shape. + + * Example: see GEOM_TestHealing.py + """ + comp = MakeCompound(ListShape) + anObj = Sew(comp, theTolerance) + return anObj + +def Sew(theObject, theTolerance): + """ + * Sewing of the given object. + * \param theObject Shape to be processed. + * \param theTolerance Required tolerance value. + * \return New GEOM_Object, containing processed shape. + + * Example: see MakeSewing() above + """ + anObj = HealOp.Sew(theObject, theTolerance) + if HealOp.IsDone() == 0: + print "Sew : ", HealOp.GetErrorCode() + return anObj + +def SuppressInternalWires(theObject, theWires): + """ + * Remove internal wires and edges from the given object (face). + * \param theObject Shape to be processed. + * \param theWires Indices of wires to be removed, if EMPTY then the method + * removes ALL internal wires of the given object. + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.RemoveIntWires(theObject, theWires) + if HealOp.IsDone() == 0: + print "SuppressInternalWires : ", HealOp.GetErrorCode() + return anObj + +def SuppressHoles(theObject, theWires): + """ + * Remove internal closed contours (holes) from the given object. + * \param theObject Shape to be processed. + * \param theWires Indices of wires to be removed, if EMPTY then the method + * removes ALL internal holes of the given object + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.FillHoles(theObject, theWires) + if HealOp.IsDone() == 0: + print "SuppressHoles : ", HealOp.GetErrorCode() + return anObj + +def CloseContour(theObject, theWires, isCommonVertex): + """ + * Close an open wire. + * \param theObject Shape to be processed. + * \param theWires Indexes of edge(s) and wire(s) to be closed within theObject's shape, + * if -1, then theObject itself is a wire. + * \param isCommonVertex If TRUE : closure by creation of a common vertex, + * If FALS : closure by creation of an edge between ends. + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.CloseContour(theObject, theWires, isCommonVertex) + if HealOp.IsDone() == 0: + print "CloseContour : ", HealOp.GetErrorCode() + return anObj + +def DivideEdge(theObject, theEdgeIndex, theValue, isByParameter): + """ + * Addition of a point to a given edge object. + * \param theObject Shape to be processed. + * \param theEdgeIndex Index of edge to be divided within theObject's shape, + * if -1, then theObject itself is the edge. + * \param theValue Value of parameter on edge or length parameter, + * depending on \a isByParameter. + * \param isByParameter If TRUE : \a theValue is treated as a curve parameter [0..1], + * if FALSE : \a theValue is treated as a length parameter [0..1] + * \return New GEOM_Object, containing processed shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.DivideEdge(theObject, theEdgeIndex, theValue, isByParameter) + if HealOp.IsDone() == 0: + print "DivideEdge : ", HealOp.GetErrorCode() + return anObj + +def GetFreeBoundary(theObject): + """ + * Get a list of wires (wrapped in GEOM_Object-s), + * that constitute a free boundary of the given shape. + * \param theObject Shape to get free boundary of. + * \return [status, theClosedWires, theOpenWires] + * status: FALSE, if an error(s) occured during the method execution. + * theClosedWires: Closed wires on the free boundary of the given shape. + * theOpenWires: Open wires on the free boundary of the given shape. + + * Example: see GEOM_TestHealing.py + """ + anObj = HealOp.GetFreeBoundary(theObject) + if HealOp.IsDone() == 0: + print "GetFreeBoundaries : ", HealOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Create advanced objects +# ----------------------------------------------------------------------------- + +def MakeCopy(theOriginal): + """ + * Create a copy of the given object + + * Example: see GEOM_TestAll.py + """ + anObj = InsertOp.MakeCopy(theOriginal) + if InsertOp.IsDone() == 0: + print "MakeCopy : ", InsertOp.GetErrorCode() + return anObj + +def MakeFilling(theShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter): + """ + * Create a filling from the given compound of contours. + * \param theShape the compound of contours + * \param theMinDeg a minimal degree + * \param theMaxDeg a maximal degree + * \param theTol2D a 2d tolerance + * \param theTol3D a 3d tolerance + * \param theNbIter a number of iteration + * \return New GEOM_Object, containing the created filling surface. + + * Example: see GEOM_TestAll.py + """ + anObj = PrimOp.MakeFilling(theShape, theMinDeg, theMaxDeg, theTol2D, theTol3D, theNbIter) + if PrimOp.IsDone() == 0: + print "MakeFilling : ", PrimOp.GetErrorCode() + return anObj + +def MakeGlueFaces(theShape, theTolerance): + """ + * Replace coincident faces in theShape by one face. + * \param theShape Initial shape. + * \param theTolerance Maximum distance between faces, which can be considered as coincident. + * \return New GEOM_Object, containing a copy of theShape without coincident faces. + + * Example: see GEOM_Spanner.py + """ + anObj = ShapesOp.MakeGlueFaces(theShape, theTolerance) + if ShapesOp.IsDone() == 0: + print "MakeGlueFaces : ", ShapesOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Boolean (Common, Cut, Fuse, Section) +# ----------------------------------------------------------------------------- + +def MakeBoolean(theShape1, theShape2, theOperation): + """ + * Perform one of boolean operations on two given shapes. + * \param theShape1 First argument for boolean operation. + * \param theShape2 Second argument for boolean operation. + * \param theOperation Indicates the operation to be done: + * 1 - Common, 2 - Cut, 3 - Fuse, 4 - Section. + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestAll.py + """ + anObj = BoolOp.MakeBoolean(theShape1, theShape2, theOperation) + if BoolOp.IsDone() == 0: + print "MakeBoolean : ", BoolOp.GetErrorCode() + return anObj + +def MakeCommon(s1, s2): + """ + * Shortcut to MakeBoolean(s1, s2, 1) + + * Example: see GEOM_TestOthers.py + """ + return MakeBoolean(s1, s2, 1) + +def MakeCut(s1, s2): + """ + * Shortcut to MakeBoolean(s1, s2, 2) + + * Example: see GEOM_TestOthers.py + """ + return MakeBoolean(s1, s2, 2) + +def MakeFuse(s1, s2): + """ + * Shortcut to MakeBoolean(s1, s2, 3) + + * Example: see GEOM_TestOthers.py + """ + return MakeBoolean(s1, s2, 3) + +def MakeSection(s1, s2): + """ + * Shortcut to MakeBoolean(s1, s2, 4) + + * Example: see GEOM_TestOthers.py + """ + return MakeBoolean(s1, s2, 4) + +def MakePartition(ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], + Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[]): + """ + * Perform partition operation. + * \param ListShapes Shapes to be intersected. + * \param ListTools Shapes to intersect theShapes. + * \param ListKeepInside Shapes, outside which the results will be deleted. + * Each shape from theKeepInside must belong to theShapes also. + * \param ListRemoveInside Shapes, inside which the results will be deleted. + * Each shape from theRemoveInside must belong to theShapes also. + * \param Limit Type of resulting shapes (corresponding to TopAbs_ShapeEnum). + * \param RemoveWebs If TRUE, perform Glue 3D algorithm. + * \param ListMaterials Material indices for each shape. Make sence, only if theRemoveWebs is TRUE. + * \return New GEOM_Object, containing the result shapes. + + * Example: see GEOM_TestAll.py + """ + anObj = BoolOp.MakePartition(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials); + if BoolOp.IsDone() == 0: + print "MakePartition : ", BoolOp.GetErrorCode() + return anObj + +def Partition(ListShapes, ListTools=[], ListKeepInside=[], ListRemoveInside=[], + Limit=ShapeType["SHAPE"], RemoveWebs=0, ListMaterials=[]): + """ + * Shortcut to MakePartition() + + * Example: see GEOM_TestOthers.py + """ + anObj = MakePartition(ListShapes, ListTools, + ListKeepInside, ListRemoveInside, + Limit, RemoveWebs, ListMaterials); + return anObj + +def MakeHalfPartition(theShape, thePlane): + """ + * Perform partition of the Shape with the Plane + * \param theShape Shape to be intersected. + * \param thePlane Tool shape, to intersect theShape. + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestAll.py + """ + anObj = BoolOp.MakeHalfPartition(theShape, thePlane) + if BoolOp.IsDone() == 0: + print "MakeHalfPartition : ", BoolOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Transform objects +# ----------------------------------------------------------------------------- + +def MakeTranslationTwoPoints(theObject, thePoint1, thePoint2): + """ + * Translate the given object along the vector, specified + * by its end points, creating its copy before the translation. + * \param theObject The object to be translated. + * \param thePoint1 Start point of translation vector. + * \param thePoint2 End point of translation vector. + * \return New GEOM_Object, containing the translated object. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.TranslateTwoPointsCopy(theObject, thePoint1, thePoint2) + if TrsfOp.IsDone() == 0: + print "TranslateTwoPointsCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeTranslation(theObject, theDX, theDY, theDZ): + """ + * Translate the given object along the vector, specified + * by its components, creating its copy before the translation. + * \param theObject The object to be translated. + * \param theDX,theDY,theDZ Components of translation vector. + * \return New GEOM_Object, containing the translated object. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.TranslateDXDYDZCopy(theObject, theDX, theDY, theDZ) + if TrsfOp.IsDone() == 0: + print "TranslateDXDYDZCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeTranslationVector(theObject, theVector): + """ + * Translate the given object along the given vector, + * creating its copy before the translation. + * \param theObject The object to be translated. + * \param theVector The translation vector. + * \return New GEOM_Object, containing the translated object. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.TranslateVectorCopy(theObject, theVector) + if TrsfOp.IsDone() == 0: + print "TranslateVectorCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeRotation(theObject, theAxis, theAngle): + """ + * Rotate the given object around the given axis + * on the given angle, creating its copy before the rotatation. + * \param theObject The object to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in radians. + * \return New GEOM_Object, containing the rotated object. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.RotateCopy(theObject, theAxis, theAngle) + if TrsfOp.IsDone() == 0: + print "RotateCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeScaleTransform(theObject, thePoint, theFactor): + """ + * Scale the given object by the factor, creating its copy before the scaling. + * \param theObject The object to be scaled. + * \param thePoint Center point for scaling. + * \param theFactor Scaling factor value. + * \return New GEOM_Object, containing the scaled shape. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.ScaleShapeCopy(theObject, thePoint, theFactor) + if TrsfOp.IsDone() == 0: + print "ScaleShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByPlane(theObject, thePlane): + """ + * Create an object, symmetrical + * to the given one relatively the given plane. + * \param theObject The object to be mirrored. + * \param thePlane Plane of symmetry. + * \return New GEOM_Object, containing the mirrored shape. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MirrorPlaneCopy(theObject, thePlane) + if TrsfOp.IsDone() == 0: + print "MirrorPlaneCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByAxis(theObject, theAxis): + """ + * Create an object, symmetrical + * to the given one relatively the given axis. + * \param theObject The object to be mirrored. + * \param theAxis Axis of symmetry. + * \return New GEOM_Object, containing the mirrored shape. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MirrorAxisCopy(theObject, theAxis) + if TrsfOp.IsDone() == 0: + print "MirrorAxisCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMirrorByPoint(theObject, thePoint): + """ + * Create an object, symmetrical + * to the given one relatively the given point. + * \param theObject The object to be mirrored. + * \param thePoint Point of symmetry. + * \return New GEOM_Object, containing the mirrored shape. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MirrorPointCopy(theObject, thePoint) + if TrsfOp.IsDone() == 0: + print "MirrorPointCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakePosition(theObject, theStartLCS, theEndLCS): + """ + * Modify the Location of the given object by LCS + * creating its copy before the setting + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.PositionShapeCopy(theObject, theStartLCS, theEndLCS) + if TrsfOp.IsDone() == 0: + print "PositionShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +def MakeOffset(theObject, theOffset): + """ + * Create new object as offset of the given one. + * \param theObject The base object for the offset. + * \param theOffset Offset value. + * \return New GEOM_Object, containing the offset object. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.OffsetShapeCopy(theObject, theOffset) + if TrsfOp.IsDone() == 0: + print "OffsetShapeCopy : ", TrsfOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Patterns +# ----------------------------------------------------------------------------- + +def MakeMultiTranslation1D(theObject, theVector, theStep, theNbTimes): + """ + * Translate the given object along the given vector a given number times + * \param theObject The object to be translated. + * \param theVector Direction of the translation. + * \param theStep Distance to translate on. + * \param theNbTimes Quantity of translations to be done. + * \return New GEOM_Object, containing compound of all + * the shapes, obtained after each translation. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MultiTranslate1D(theObject, theVector, theStep, theNbTimes) + if TrsfOp.IsDone() == 0: + print "MultiTranslate1D : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMultiTranslation2D(theObject, theVector1, theStep1, theNbTimes1, + theVector2, theStep2, theNbTimes2): + """ + * Conseqently apply two specified translations to theObject specified number of times. + * \param theObject The object to be translated. + * \param theVector1 Direction of the first translation. + * \param theStep1 Step of the first translation. + * \param theNbTimes1 Quantity of translations to be done along theVector1. + * \param theVector2 Direction of the second translation. + * \param theStep2 Step of the second translation. + * \param theNbTimes2 Quantity of translations to be done along theVector2. + * \return New GEOM_Object, containing compound of all + * the shapes, obtained after each translation. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MultiTranslate2D(theObject, theVector1, theStep1, theNbTimes1, + theVector2, theStep2, theNbTimes2) + if TrsfOp.IsDone() == 0: + print "MultiTranslate2D : ", TrsfOp.GetErrorCode() + return anObj + +def MultiRotate1D(theObject, theAxis, theNbTimes): + """ + * Rotate the given object around the given axis a given number times. + * Rotation angle will be 2*PI/theNbTimes. + * \param theObject The object to be rotated. + * \param theAxis The rotation axis. + * \param theNbTimes Quantity of rotations to be done. + * \return New GEOM_Object, containing compound of all the + * shapes, obtained after each rotation. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MultiRotate1D(theObject, theAxis, theNbTimes) + if TrsfOp.IsDone() == 0: + print "MultiRotate1D : ", TrsfOp.GetErrorCode() + return anObj + +def MultiRotate2D(theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2): + """ + * Rotate the given object around the + * given axis on the given angle a given number + * times and multi-translate each rotation result. + * Translation direction passes through center of gravity + * of rotated shape and its projection on the rotation axis. + * \param theObject The object to be rotated. + * \param theAxis Rotation axis. + * \param theAngle Rotation angle in graduces. + * \param theNbTimes1 Quantity of rotations to be done. + * \param theStep Translation distance. + * \param theNbTimes2 Quantity of translations to be done. + * \return New GEOM_Object, containing compound of all the + * shapes, obtained after each transformation. + + * Example: see GEOM_TestAll.py + """ + anObj = TrsfOp.MultiRotate2D(theObject, theAxis, theAngle, theNbTimes1, theStep, theNbTimes2) + if TrsfOp.IsDone() == 0: + print "MultiRotate2D : ", TrsfOp.GetErrorCode() + return anObj + +def MakeMultiRotation1D(aShape,aDir,aPoint,aNbTimes): + """ + * The same, as MultiRotate1D(), but axis is given by direction and point + + * Example: see GEOM_TestOthers.py + """ + aVec = MakeLine(aPoint,aDir) + anObj = MultiRotate1D(aShape,aVec,aNbTimes) + return anObj + +def MakeMultiRotation2D(aShape,aDir,aPoint,anAngle,nbtimes1,aStep,nbtimes2): + """ + * The same, as MultiRotate2D(), but axis is given by direction and point + + * Example: see GEOM_TestOthers.py + """ + aVec = MakeLine(aPoint,aDir) + anObj = MultiRotate2D(aShape,aVec,anAngle,nbtimes1,aStep,nbtimes2) + return anObj + +# ----------------------------------------------------------------------------- +# Local operations +# ----------------------------------------------------------------------------- + +def MakeFilletAll(theShape, theR): + """ + * Perform a fillet on all edges of the given shape. + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestOthers.py + """ + anObj = LocalOp.MakeFilletAll(theShape, theR) + if LocalOp.IsDone() == 0: + print "MakeFilletAll : ", LocalOp.GetErrorCode() + return anObj + +def MakeFillet(theShape, theR, theShapeType, theListShapes): + """ + * Perform a fillet on the specified edges/faces of the given shape + * \param theShape Shape, to perform fillet on. + * \param theR Fillet radius. + * \param theShapeType Type of shapes in . + * \param theListShapes Global indices of edges/faces to perform fillet on. + * \note Global index of sub-shape can be obtained, using method geompy.GetSubShapeID(). + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestAll.py + """ + anObj = None + if theShapeType == ShapeType["EDGE"]: + anObj = LocalOp.MakeFilletEdges(theShape, theR, theListShapes) + else: + anObj = LocalOp.MakeFilletFaces(theShape, theR, theListShapes) + if LocalOp.IsDone() == 0: + print "MakeFillet : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferAll(theShape, theD): + """ + * Perform a symmetric chamfer on all edges of the given shape. + * \param theShape Shape, to perform chamfer on. + * \param theD Chamfer size along each face. + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestOthers.py + """ + anObj = LocalOp.MakeChamferAll(theShape, theD) + if LocalOp.IsDone() == 0: + print "MakeChamferAll : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferEdge(theShape, theD1, theD2, theFace1, theFace2): + """ + * Perform a chamfer on edges, common to the specified faces, + * with distance D1 on the Face1 + * \param theShape Shape, to perform chamfer on. + * \param theD1 Chamfer size along \a theFace1. + * \param theD2 Chamfer size along \a theFace2. + * \param theFace1,theFace2 Global indices of two faces of \a theShape. + * \note Global index of sub-shape can be obtained, using method geompy.GetSubShapeID(). + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestAll.py + """ + anObj = LocalOp.MakeChamferEdge(theShape, theD1, theD2, theFace1, theFace2) + if LocalOp.IsDone() == 0: + print "MakeChamferEdge : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamferFaces(theShape, theD1, theD2, theFaces): + """ + * Perform a chamfer on all edges of the specified faces, + * with distance D1 on the first specified face (if several for one edge) + * \param theShape Shape, to perform chamfer on. + * \param theD1 Chamfer size along face from \a theFaces. If both faces, + * connected to the edge, are in \a theFaces, \a theD1 + * will be get along face, which is nearer to \a theFaces beginning. + * \param theD2 Chamfer size along another of two faces, connected to the edge. + * \param theFaces Sequence of global indices of faces of \a theShape. + * \note Global index of sub-shape can be obtained, using method geompy.GetSubShapeID(). + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_TestAll.py + """ + anObj = LocalOp.MakeChamferFaces(theShape, theD1, theD2, theFaces) + if LocalOp.IsDone() == 0: + print "MakeChamferFaces : ", LocalOp.GetErrorCode() + return anObj + +def MakeChamfer(aShape,d1,d2,aShapeType,ListShape): + """ + * Shortcut to MakeChamferEdge() and MakeChamferFaces() + + * Example: see GEOM_TestOthers.py + """ + anObj = None + if aShapeType == ShapeType["EDGE"]: + anObj = MakeChamferEdge(aShape,d1,d2,ListShape[0],ListShape[1]) + else: + anObj = MakeChamferFaces(aShape,d1,d2,ListShape) + return anObj + +def Archimede(theShape, theWeight, theWaterDensity, theMeshDeflection): + """ + * Perform an Archimde operation on the given shape with given parameters. + * The object presenting the resulting face is returned + * \param theShape Shape to be put in water. + * \param theWeight Weight og the shape. + * \param theWaterDensity Density of the water. + * \param theMeshDeflection Deflection of the mesh, using to compute the section. + * \return New GEOM_Object, containing a section of \a theShape + * by a plane, corresponding to water level. + + * Example: see GEOM_TestAll.py + """ + anObj = LocalOp.MakeArchimede(theShape, theWeight, theWaterDensity, theMeshDeflection) + if LocalOp.IsDone() == 0: + print "MakeArchimede : ", LocalOp.GetErrorCode() + return anObj + +# ----------------------------------------------------------------------------- +# Information objects +# ----------------------------------------------------------------------------- + +def PointCoordinates(Point): + """ + * Get point coordinates + * \return [x, y, z] + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.PointCoordinates(Point) + if MeasuOp.IsDone() == 0: + print "PointCoordinates : ", MeasuOp.GetErrorCode() + return aTuple + +def BasicProperties(theShape): + """ + * Get summarized length of all wires, + * area of surface and volume of the given shape. + * \param theShape Shape to define properties of. + * \return [theLength, theSurfArea, theVolume] + * theLength: Summarized length of all wires of the given shape. + * theSurfArea: Area of surface of the given shape. + * theVolume: Volume of the given shape. + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.GetBasicProperties(theShape) + if MeasuOp.IsDone() == 0: + print "BasicProperties : ", MeasuOp.GetErrorCode() + return aTuple + +def BoundingBox(theShape): + """ + * Get parameters of bounding box of the given shape + * \param theShape Shape to obtain bounding box of. + * \return [Xmin,Xmax, Ymin,Ymax, Zmin,Zmax] + * Xmin,Xmax: Limits of shape along OX axis. + * Ymin,Ymax: Limits of shape along OY axis. + * Zmin,Zmax: Limits of shape along OZ axis. + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.GetBoundingBox(theShape) + if MeasuOp.IsDone() == 0: + print "BoundingBox : ", MeasuOp.GetErrorCode() + return aTuple + +def Inertia(theShape): + """ + * Get inertia matrix and moments of inertia of theShape. + * \param theShape Shape to calculate inertia of. + * \return [I11,I12,I13, I21,I22,I23, I31,I32,I33, Ix,Iy,Iz] + * I(1-3)(1-3): Components of the inertia matrix of the given shape. + * Ix,Iy,Iz: Moments of inertia of the given shape. + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.GetInertia(theShape) + if MeasuOp.IsDone() == 0: + print "Inertia : ", MeasuOp.GetErrorCode() + return aTuple + +def MinDistance(theShape1, theShape2): + """ + * Get minimal distance between the given shapes. + * \param theShape1,theShape2 Shapes to find minimal distance between. + * \return Value of the minimal distance between the given shapes. + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.GetMinDistance(theShape1, theShape2) + if MeasuOp.IsDone() == 0: + print "MinDistance : ", MeasuOp.GetErrorCode() + return aTuple[0] + +def Tolerance(theShape): + """ + * Get min and max tolerances of sub-shapes of theShape + * \param theShape Shape, to get tolerances of. + * \return [FaceMin,FaceMax, EdgeMin,EdgeMax, VertMin,VertMax] + * FaceMin,FaceMax: Min and max tolerances of the faces. + * EdgeMin,EdgeMax: Min and max tolerances of the edges. + * VertMin,VertMax: Min and max tolerances of the vertices. + + * Example: see GEOM_TestMeasures.py + """ + aTuple = MeasuOp.GetTolerance(theShape) + if MeasuOp.IsDone() == 0: + print "Tolerance : ", MeasuOp.GetErrorCode() + return aTuple + +def WhatIs(theShape): + """ + * Obtain description of the given shape (number of sub-shapes of each type) + * \param theShape Shape to be described. + * \return Description of the given shape. + + * Example: see GEOM_TestMeasures.py + """ + aDescr = MeasuOp.WhatIs(theShape) + if MeasuOp.IsDone() == 0: + print "WhatIs : ", MeasuOp.GetErrorCode() + return aDescr + +def MakeCDG(theShape): + """ + * Get a point, situated at the centre of mass of theShape. + * \param theShape Shape to define centre of mass of. + * \return New GEOM_Object, containing the created point. + + * Example: see GEOM_TestMeasures.py + """ + anObj = MeasuOp.GetCentreOfMass(theShape) + if MeasuOp.IsDone() == 0: + print "GetCentreOfMass : ", MeasuOp.GetErrorCode() + return anObj + +def CheckShape(theShape): + """ + * Check a topology of the given shape. + * \param theShape Shape to check validity of. + * \return TRUE, if the shape "seems to be valid" from the topological point of view. + * If theShape is invalid, prints a description of problem. + + * Example: see GEOM_TestMeasures.py + """ + (IsValid, Status) = MeasuOp.CheckShape(theShape) + if MeasuOp.IsDone() == 0: + print "CheckShape : ", MeasuOp.GetErrorCode() + else: + if IsValid == 0: + print Status + return IsValid + +# ----------------------------------------------------------------------------- +# Import/Export objects +# ----------------------------------------------------------------------------- + +def Import(theFileName, theFormatName): + """ + * Import a shape from the BREP or IGES or STEP file + * (depends on given format) with given name. + * \param theFileName The file, containing the shape. + * \param theFormatName Specify format for the file reading. + * Available formats can be obtained with InsertOp.ImportTranslators() method. + * \return New GEOM_Object, containing the imported shape. + + * Example: see GEOM_TestOthers.py + """ + anObj = InsertOp.Import(theFileName, theFormatName) + if InsertOp.IsDone() == 0: + print "Import : ", InsertOp.GetErrorCode() + return anObj + +def ImportBREP(theFileName): + """ + * Shortcut to Import() for BREP format + + * Example: see GEOM_TestOthers.py + """ + return Import(theFileName, "BREP") + +def ImportIGES(theFileName): + """ + * Shortcut to Import() for IGES format + + * Example: see GEOM_TestOthers.py + """ + return Import(theFileName, "IGES") + +def ImportSTEP(theFileName): + """ + * Shortcut to Import() for STEP format + + * Example: see GEOM_TestOthers.py + """ + return Import(theFileName, "STEP") + +def Export(theObject, theFileName, theFormatName): + """ + * Export the given shape into a file with given name. + * \param theObject Shape to be stored in the file. + * \param theFileName Name of the file to store the given shape in. + * \param theFormatName Specify format for the shape storage. + * Available formats can be obtained with InsertOp.ImportTranslators() method. + + * Example: see GEOM_TestOthers.py + """ + InsertOp.Export(theObject, theFileName, theFormatName) + if InsertOp.IsDone() == 0: + print "Export : ", InsertOp.GetErrorCode() + +def ExportBREP(theObject, theFileName): + """ + * Shortcut to Export() for BREP format + + * Example: see GEOM_TestOthers.py + """ + return Export(theObject, theFileName, "BREP") + +def ExportIGES(theObject, theFileName): + """ + * Shortcut to Export() for IGES format + + * Example: see GEOM_TestOthers.py + """ + return Export(theObject, theFileName, "IGES") + +def ExportSTEP(theObject, theFileName): + """ + * Shortcut to Export() for STEP format + + * Example: see GEOM_TestOthers.py + """ + return Export(theObject, theFileName, "STEP") + +# ----------------------------------------------------------------------------- +# Block operations +# ----------------------------------------------------------------------------- + +def MakeQuad(E1, E2, E3, E4): + """ + * Create a quadrangle face from four edges. Order of Edges is not + * important. It is not necessary that edges share the same vertex. + * \param E1,E2,E3,E4 Edges for the face bound. + * \return New GEOM_Object, containing the created face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeQuad(E1, E2, E3, E4) + if BlocksOp.IsDone() == 0: + print "MakeQuad : ", BlocksOp.GetErrorCode() + return anObj + +def MakeQuad2Edges(E1, E2): + """ + * Create a quadrangle face on two edges. + * The missing edges will be built by creating the shortest ones. + * \param E1,E2 Two opposite edges for the face. + * \return New GEOM_Object, containing the created face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeQuad2Edges(E1, E2) + if BlocksOp.IsDone() == 0: + print "MakeQuad2Edges : ", BlocksOp.GetErrorCode() + return anObj + +def MakeQuad4Vertices(V1, V2, V3, V4): + """ + * Create a quadrangle face with specified corners. + * The missing edges will be built by creating the shortest ones. + * \param V1,V2,V3,V4 Corner vertices for the face. + * \return New GEOM_Object, containing the created face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeQuad4Vertices(V1, V2, V3, V4) + if BlocksOp.IsDone() == 0: + print "MakeQuad4Vertices : ", BlocksOp.GetErrorCode() + return anObj + +def MakeHexa(F1, F2, F3, F4, F5, F6): + """ + * Create a hexahedral solid, bounded by the six given faces. Order of + * faces is not important. It is not necessary that Faces share the same edge. + * \param F1,F2,F3,F4,F5,F6 Faces for the hexahedral solid. + * \return New GEOM_Object, containing the created solid. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeHexa(F1, F2, F3, F4, F5, F6) + if BlocksOp.IsDone() == 0: + print "MakeHexa : ", BlocksOp.GetErrorCode() + return anObj + +def MakeHexa2Faces(F1, F2): + """ + * Create a hexahedral solid between two given faces. + * The missing faces will be built by creating the smallest ones. + * \param F1,F2 Two opposite faces for the hexahedral solid. + * \return New GEOM_Object, containing the created solid. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeHexa2Faces(F1, F2) + if BlocksOp.IsDone() == 0: + print "MakeHexa2Faces : ", BlocksOp.GetErrorCode() + return anObj + +def GetPoint(theShape, theX, theY, theZ, theEpsilon): + """ + * Get a vertex, found in the given shape by its coordinates. + * \param theShape Block or a compound of blocks. + * \param theX,theY,theZ Coordinates of the sought vertex. + * \param theEpsilon Maximum allowed distance between the resulting + * vertex and point with the given coordinates. + * \return New GEOM_Object, containing the found vertex. + + * Example: see GEOM_TestOthers.py + """ + anObj = BlocksOp.GetPoint(theShape, theX, theY, theZ, theEpsilon) + if BlocksOp.IsDone() == 0: + print "GetPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetEdge(theShape, thePoint1, thePoint2): + """ + * Get an edge, found in the given shape by two given vertices. + * \param theShape Block or a compound of blocks. + * \param thePoint1,thePoint2 Points, close to the ends of the desired edge. + * \return New GEOM_Object, containing the found edge. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetEdge(theShape, thePoint1, thePoint2) + if BlocksOp.IsDone() == 0: + print "GetEdge : ", BlocksOp.GetErrorCode() + return anObj + +def GetEdgeNearPoint(theShape, thePoint): + """ + * Find an edge of the given shape, which has minimal distance to the given point. + * \param theShape Block or a compound of blocks. + * \param thePoint Point, close to the desired edge. + * \return New GEOM_Object, containing the found edge. + + * Example: see GEOM_TestOthers.py + """ + anObj = BlocksOp.GetEdgeNearPoint(theShape, thePoint) + if BlocksOp.IsDone() == 0: + print "GetEdgeNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByPoints(theShape, thePoint1, thePoint2, thePoint3, thePoint4): + """ + * Returns a face, found in the given shape by four given corner vertices. + * \param theShape Block or a compound of blocks. + * \param thePoint1-thePoint4 Points, close to the corners of the desired face. + * \return New GEOM_Object, containing the found face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetFaceByPoints(theShape, thePoint1, thePoint2, thePoint3, thePoint4) + if BlocksOp.IsDone() == 0: + print "GetFaceByPoints : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByEdges(theShape, theEdge1, theEdge2): + """ + * Get a face of block, found in the given shape by two given edges. + * \param theShape Block or a compound of blocks. + * \param theEdge1,theEdge2 Edges, close to the edges of the desired face. + * \return New GEOM_Object, containing the found face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetFaceByEdges(theShape, theEdge1, theEdge2) + if BlocksOp.IsDone() == 0: + print "GetFaceByEdges : ", BlocksOp.GetErrorCode() + return anObj + +def GetOppositeFace(theBlock, theFace): + """ + * Find a face, opposite to the given one in the given block. + * \param theBlock Must be a hexahedral solid. + * \param theFace Face of \a theBlock, opposite to the desired face. + * \return New GEOM_Object, containing the found face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetOppositeFace(theBlock, theFace) + if BlocksOp.IsDone() == 0: + print "GetOppositeFace : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceNearPoint(theShape, thePoint): + """ + * Find a face of the given shape, which has minimal distance to the given point. + * \param theShape Block or a compound of blocks. + * \param thePoint Point, close to the desired face. + * \return New GEOM_Object, containing the found face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetFaceNearPoint(theShape, thePoint) + if BlocksOp.IsDone() == 0: + print "GetFaceNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetFaceByNormale(theBlock, theVector): + """ + * Find a face of block, whose outside normale has minimal angle with the given vector. + * \param theShape Block or a compound of blocks. + * \param theVector Vector, close to the normale of the desired face. + * \return New GEOM_Object, containing the found face. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetFaceByNormale(theBlock, theVector) + if BlocksOp.IsDone() == 0: + print "GetFaceByNormale : ", BlocksOp.GetErrorCode() + return anObj + +def CheckCompoundOfBlocks(theCompound): + """ + * Check, if the compound of blocks is given. + * To be considered as a compound of blocks, the + * given shape must satisfy the following conditions: + * - Each element of the compound should be a Block (6 faces and 12 edges). + * - A connection between two Blocks should be an entire quadrangle face or an entire edge. + * - The compound should be connexe. + * - The glue between two quadrangle faces should be applied. + * \param theCompound The compound to check. + * \return TRUE, if the given shape is a compound of blocks. + * If theCompound is not valid, prints all discovered errors. + + * Example: see GEOM_Spanner.py + """ + (IsValid, BCErrors) = BlocksOp.CheckCompoundOfBlocks(theCompound) + if BlocksOp.IsDone() == 0: + print "CheckCompoundOfBlocks : ", BlocksOp.GetErrorCode() + else: + if IsValid == 0: + Descr = BlocksOp.PrintBCErrors(theCompound, BCErrors) + print Descr + return IsValid + +def RemoveExtraEdges(theShape): + """ + * Remove all seam and degenerated edges from \a theShape. + * Unite faces and edges, sharing one surface. + * \param theShape The compound or single solid to remove irregular edges from. + * \return Improved shape. + + * Example: see GEOM_TestOthers.py + """ + anObj = BlocksOp.RemoveExtraEdges(theShape) + if BlocksOp.IsDone() == 0: + print "RemoveExtraEdges : ", BlocksOp.GetErrorCode() + return anObj + +def CheckAndImprove(theShape): + """ + * Check, if the given shape is a blocks compound. + * Fix all detected errors. + * \note Single block can be also fixed by this method. + * \param theCompound The compound to check and improve. + * \return Improved compound. + + * Example: see GEOM_TestOthers.py + """ + anObj = BlocksOp.CheckAndImprove(theShape) + if BlocksOp.IsDone() == 0: + print "CheckAndImprove : ", BlocksOp.GetErrorCode() + return anObj + +def MakeBlockExplode(theCompound, theMinNbFaces, theMaxNbFaces): + """ + * Get all the blocks, contained in the given compound. + * \param theCompound The compound to explode. + * \param theMinNbFaces If solid has lower number of faces, it is not a block. + * \param theMaxNbFaces If solid has higher number of faces, it is not a block. + * \note If theMaxNbFaces = 0, the maximum number of faces is not restricted. + * \return List of GEOM_Objects, containing the retrieved blocks. + + * Example: see GEOM_TestOthers.py + """ + aList = BlocksOp.ExplodeCompoundOfBlocks(theCompound, theMinNbFaces, theMaxNbFaces) + if BlocksOp.IsDone() == 0: + print "MakeBlockExplode : ", BlocksOp.GetErrorCode() + return aList + +def GetBlockNearPoint(theCompound, thePoint): + """ + * Find block, containing the given point inside its volume or on boundary. + * \param theCompound Compound, to find block in. + * \param thePoint Point, close to the desired block. If the point lays on + * boundary between some blocks, we return block with nearest center. + * \return New GEOM_Object, containing the found block. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.GetBlockNearPoint(theCompound, thePoint) + if BlocksOp.IsDone() == 0: + print "GetBlockNearPoint : ", BlocksOp.GetErrorCode() + return anObj + +def GetBlockByParts(theCompound, theParts): + """ + * Find block, containing all the elements, passed as the parts, or maximum quantity of them. + * \param theCompound Compound, to find block in. + * \param theParts List of faces and/or edges and/or vertices to be parts of the found block. + * \return New GEOM_Object, containing the found block. + + * Example: see GEOM_TestOthers.py + """ + anObj = BlocksOp.GetBlockByParts(theCompound, theParts) + if BlocksOp.IsDone() == 0: + print "GetBlockByParts : ", BlocksOp.GetErrorCode() + return anObj + +def GetBlocksByParts(theCompound, theParts): + """ + * Return all blocks, containing all the elements, passed as the parts. + * \param theCompound Compound, to find blocks in. + * \param theParts List of faces and/or edges and/or vertices to be parts of the found blocks. + * \return List of GEOM_Objects, containing the found blocks. + + * Example: see GEOM_Spanner.py + """ + aList = BlocksOp.GetBlocksByParts(theCompound, theParts) + if BlocksOp.IsDone() == 0: + print "GetBlocksByParts : ", BlocksOp.GetErrorCode() + return aList + +def MakeMultiTransformation1D(Block, DirFace1, DirFace2, NbTimes): + """ + * Multi-transformate block and glue the result. + * Transformation is defined so, as to superpose direction faces. + * \param Block Hexahedral solid to be multi-transformed. + * \param DirFace1 ID of First direction face. + * \param DirFace2 ID of Second direction face. + * \param NbTimes Quantity of transformations to be done. + * \note Unique ID of sub-shape can be obtained, using method GetSubShapeID(). + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeMultiTransformation1D(Block, DirFace1, DirFace2, NbTimes) + if BlocksOp.IsDone() == 0: + print "MakeMultiTransformation1D : ", BlocksOp.GetErrorCode() + return anObj + +def MakeMultiTransformation2D(Block, DirFace1U, DirFace2U, NbTimesU, + DirFace1V, DirFace2V, NbTimesV): + """ + * Multi-transformate block and glue the result. + * \param Block Hexahedral solid to be multi-transformed. + * \param DirFace1U,DirFace2U IDs of Direction faces for the first transformation. + * \param DirFace1V,DirFace2V IDs of Direction faces for the second transformation. + * \param NbTimesU,NbTimesV Quantity of transformations to be done. + * \return New GEOM_Object, containing the result shape. + + * Example: see GEOM_Spanner.py + """ + anObj = BlocksOp.MakeMultiTransformation2D(Block, DirFace1U, DirFace2U, NbTimesU, + DirFace1V, DirFace2V, NbTimesV) + if BlocksOp.IsDone() == 0: + print "MakeMultiTransformation2D : ", BlocksOp.GetErrorCode() + return anObj + +def Propagate(theShape): + """ + * Build all possible propagation groups. + * Propagation group is a set of all edges, opposite to one (main) + * edge of this group directly or through other opposite edges. + * Notion of Opposite Edge make sence only on quadrangle face. + * \param theShape Shape to build propagation groups on. + * \return List of GEOM_Objects, each of them is a propagation group. + + * Example: see GEOM_TestOthers.py + """ + listChains = BlocksOp.Propagate(theShape) + if BlocksOp.IsDone() == 0: + print "Propagate : ", BlocksOp.GetErrorCode() + return listChains + +# ----------------------------------------------------------------------------- +# Group operations +# ----------------------------------------------------------------------------- + +def CreateGroup(theMainShape, theShapeType): + """ + * Creates a new group which will store sub shapes of theMainShape + * \param theMainShape is a GEOM object on which the group is selected + * \param theShapeType defines a shape type of the group + * \return a newly created GEOM group + + * Example: see GEOM_TestOthers.py + """ + anObj = GroupOp.CreateGroup(theMainShape, theShapeType) + if GroupOp.IsDone() == 0: + print "CreateGroup : ", GroupOp.GetErrorCode() + return anObj + +def AddObject(theGroup, theSubShapeID): + """ + * Adds a sub object with ID theSubShapeId to the group + * \param theGroup is a GEOM group to which the new sub shape is added + * \param theSubShapeID is a sub shape ID in the main object. + * \note Use method GetSubShapeID() to get an unique ID of the sub shape + + * Example: see GEOM_TestOthers.py + """ + GroupOp.AddObject(theGroup, theSubShapeID) + if GroupOp.IsDone() == 0: + print "AddObject : ", GroupOp.GetErrorCode() + +def RemoveObject(theGroup, theSubShapeID): + """ + * Removes a sub object with ID \a theSubShapeId from the group + * \param theGroup is a GEOM group from which the new sub shape is removed + * \param theSubShapeID is a sub shape ID in the main object. + * \note Use method GetSubShapeID() to get an unique ID of the sub shape + + * Example: see GEOM_TestOthers.py + """ + GroupOp.RemoveObject(theGroup, theSubShapeID) + if GroupOp.IsDone() == 0: + print "RemoveObject : ", GroupOp.GetErrorCode() + +def UnionList (theGroup, theSubShapes): + """ + * Adds to the group all the given shapes. No errors, if some shapes are alredy included. + * \param theGroup is a GEOM group to which the new sub shapes are added. + * \param theSubShapes is a list of sub shapes to be added. + + * Example: see GEOM_TestOthers.py + """ + GroupOp.UnionList(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "UnionList : ", GroupOp.GetErrorCode() + +def UnionIDs(theGroup, theSubShapes): + """ + * Works like the above method, but argument + * theSubShapes here is a list of sub-shapes indices + """ + GroupOp.UnionIDs(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "UnionIDs : ", GroupOp.GetErrorCode() + +def DifferenceList (theGroup, theSubShapes): + """ + * Removes from the group all the given shapes. No errors, if some shapes are not included. + * \param theGroup is a GEOM group from which the sub-shapes are removed. + * \param theSubShapes is a list of sub-shapes to be removed. + + * Example: see GEOM_TestOthers.py + """ + GroupOp.DifferenceList(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "DifferenceList : ", GroupOp.GetErrorCode() + +def DifferenceIDs(theGroup, theSubShapes): + """ + * Works like the above method, but argument + * theSubShapes here is a list of sub-shapes indices + """ + GroupOp.DifferenceIDs(theGroup, theSubShapes) + if GroupOp.IsDone() == 0: + print "DifferenceIDs : ", GroupOp.GetErrorCode() + +def GetObjectIDs(theGroup): + """ + * Returns a list of sub objects ID stored in the group + * \param theGroup is a GEOM group for which a list of IDs is requested + + * Example: see GEOM_TestOthers.py + """ + ListIDs = GroupOp.GetObjects(theGroup) + if GroupOp.IsDone() == 0: + print "GetObjectIDs : ", GroupOp.GetErrorCode() + return ListIDs + +def GetType(theGroup): + """ + * Returns a type of sub objects stored in the group + * \param theGroup is a GEOM group which type is returned. + + * Example: see GEOM_TestOthers.py + """ + aType = GroupOp.GetType(theGroup) + if GroupOp.IsDone() == 0: + print "GetType : ", GroupOp.GetErrorCode() + return aType + +def GetMainShape(theGroup): + """ + * Returns a main shape associated with the group + * \param theGroup is a GEOM group for which a main shape object is requested + * \return a GEOM object which is a main shape for theGroup + + * Example: see GEOM_TestOthers.py + """ + anObj = GroupOp.GetMainShape(theGroup) + if GroupOp.IsDone() == 0: + print "GetMainShape : ", GroupOp.GetErrorCode() + return anObj + +def GetEdgesByLength (theShape, min_length, max_length, include_min = 1, include_max = 1): + """ + Create group of edges of theShape, whose length is in range [min_length, max_length]. + If include_min/max == 0, edges with length == min/max_length will not be included in result. + """ + + edges = SubShapeAll(theShape, ShapeType["EDGE"]) + edges_in_range = [] + for edge in edges: + Props = BasicProperties(edge) + if min_length <= Props[0] and Props[0] <= max_length: + if (not include_min) and (min_length == Props[0]): + skip = 1 + else: + if (not include_max) and (Props[0] == max_length): + skip = 1 + else: + edges_in_range.append(edge) + + if len(edges_in_range) <= 0: + print "No edges found by given criteria" + return 0 + + group_edges = CreateGroup(theShape, ShapeType["EDGE"]) + UnionList(group_edges, edges_in_range) + + return group_edges + +def SelectEdges (min_length, max_length, include_min = 1, include_max = 1): + """ + Create group of edges of selected shape, whose length is in range [min_length, max_length]. + If include_min/max == 0, edges with length == min/max_length will not be included in result. + """ + + nb_selected = sg.SelectedCount() + if nb_selected < 1: + print "Select a shape before calling this function, please." + return 0 + if nb_selected > 1: + print "Only one shape must be selected" + return 0 + + id_shape = sg.getSelected(0) + shape = IDToObject( id_shape ) + + group_edges = GetEdgesByLength(shape, min_length, max_length, include_min, include_max) + + left_str = " < " + right_str = " < " + if include_min: left_str = " <= " + if include_max: right_str = " <= " + + addToStudyInFather(shape, group_edges, "Group of edges with " + `min_length` + + left_str + "length" + right_str + `max_length`) + + sg.updateObjBrowser(1) + + return group_edges + +def addPath(Path): + """ + * Add Path to load python scripts from + """ + if (sys.path.count(Path) < 1): + sys.path.append(Path) diff --git a/src/GEOM_SWIG/libGEOM_Swig.i b/src/GEOM_SWIG/libGEOM_Swig.i new file mode 100644 index 000000000..f10a5baea --- /dev/null +++ b/src/GEOM_SWIG/libGEOM_Swig.i @@ -0,0 +1,31 @@ +// 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/ +// +// File : libGeometry_Swig.i +// Created : Tue Mar 26 15:04:48 2002 +// Author : Nicolas REJNERI, Paul RASCLE +// Project : SALOME +// Module : GEOM +// Copyright : Open CASCADE, EDF 2002 +// $Header$ + +%module libGEOM_Swig + +%include "GeometryGUI_Swig.i" + diff --git a/src/GenerationGUI/GenerationGUI_FillingDlg.cxx b/src/GenerationGUI/GenerationGUI_FillingDlg.cxx new file mode 100644 index 000000000..5dde019e0 --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_FillingDlg.cxx @@ -0,0 +1,345 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GenerationGUI_FillingDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "GenerationGUI_FillingDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "GEOMImpl_Types.hxx" + +#include + +#include "utilities.h" + +//================================================================================= +// class : GenerationGUI_FillingDlg() +// purpose : Constructs a GenerationGUI_FillingDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +GenerationGUI_FillingDlg::GenerationGUI_FillingDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myGeometryGUI(theGeometryGUI) +{ + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_FILLING"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setCaption(tr("GEOM_FILLING_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_FILLING")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel5Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_FILLING_COMPOUND")); + GroupPoints->TextLabel2->setText(tr("GEOM_FILLING_MIN_DEG")); + GroupPoints->TextLabel3->setText(tr("GEOM_FILLING_TOL_2D")); + GroupPoints->TextLabel4->setText(tr("GEOM_FILLING_NB_ITER")); + GroupPoints->TextLabel5->setText(tr("GEOM_FILLING_MAX_DEG")); + GroupPoints->TextLabel6->setText(tr("GEOM_FILLING_TOL_3D")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + +//================================================================================= +// function : ~GenerationGUI_FillingDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GenerationGUI_FillingDlg::~GenerationGUI_FillingDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + + myMinDeg = 2; + myMaxDeg = 5; + myTol3D = 0.0001; + myTol2D = 0.0001; + myNbIter = 5; + myOkCompound = false; + + globalSelection( GEOM_COMPOUND ); + + double SpecificStep1 = 1; + double SpecificStep2 = 0.0001; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_1->RangeStepAndValidator(2.0, 999.999, SpecificStep1, 3); + GroupPoints->SpinBox_2->RangeStepAndValidator(0.00001, 10000.0, SpecificStep2, 5); + GroupPoints->SpinBox_3->RangeStepAndValidator(1.0, 999.999, SpecificStep1, 3); + GroupPoints->SpinBox_4->RangeStepAndValidator(1.0, 999.999, SpecificStep1, 3); + GroupPoints->SpinBox_5->RangeStepAndValidator(0.00001, 10000.0, SpecificStep2, 5); + + GroupPoints->SpinBox_1->SetValue(myMinDeg); + GroupPoints->SpinBox_2->SetValue(myTol2D); + GroupPoints->SpinBox_3->SetValue(myNbIter); + GroupPoints->SpinBox_4->SetValue(myMaxDeg); + GroupPoints->SpinBox_5->SetValue(myTol3D); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_3, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_4, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_5, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_2, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_3, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_4, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_5, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_FILLING")); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool GenerationGUI_FillingDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void GenerationGUI_FillingDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myOkCompound = false; + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if (!testResult) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + TopoDS_Shape S; + myOkCompound = false; + + if ( GEOMBase::GetShape(aSelectedObject, S) && + S.ShapeType() == TopAbs_COMPOUND) + { + // myCompound should be a compound of edges + for ( TopoDS_Iterator it( S ); it.More(); it.Next() ) + if ( it.Value().ShapeType() != TopAbs_EDGE ) + return; + myCompound = aSelectedObject; + myOkCompound = true; + } + } + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + globalSelection( GEOM_ALLSHAPES ); + + if(send == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_COMPOUND ); + this->SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + globalSelection( GEOM_COMPOUND ); + displayPreview(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void GenerationGUI_FillingDlg::ValueChangedInSpinBox(double newValue) +{ + QObject* send = (QObject*)sender(); + + if(send == GroupPoints->SpinBox_1) + myMinDeg = int(newValue); + else if(send == GroupPoints->SpinBox_2) + myTol2D = newValue; + else if(send == GroupPoints->SpinBox_3) + myNbIter = int(newValue); + else if(send == GroupPoints->SpinBox_4) + myMaxDeg = int(newValue); + else if(send == GroupPoints->SpinBox_5) + myTol3D = newValue; + + displayPreview(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GenerationGUI_FillingDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool GenerationGUI_FillingDlg::isValid( QString& ) +{ + return myOkCompound > 0; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GenerationGUI_FillingDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation() )->MakeFilling( + myCompound, myMinDeg, myMaxDeg, myTol2D, myTol3D, myNbIter ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} diff --git a/src/GenerationGUI/GenerationGUI_PipeDlg.cxx b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx new file mode 100644 index 000000000..5cf2f1458 --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_PipeDlg.cxx @@ -0,0 +1,308 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GenerationGUI_PipeDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "GenerationGUI_PipeDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include +#include +#include +#if OCC_VERSION_MAJOR >= 5 +#include +#else +#include +#endif + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +//================================================================================= +// class : GenerationGUI_PipeDlg() +// purpose : Constructs a GenerationGUI_PipeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +GenerationGUI_PipeDlg::GenerationGUI_PipeDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PIPE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_PIPE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PIPE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_BASE_OBJECT")); + GroupPoints->TextLabel2->setText(tr("GEOM_PATH_OBJECT")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~GenerationGUI_PipeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GenerationGUI_PipeDlg::~GenerationGUI_PipeDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GenerationGUI_PipeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myOkBase = myOkPath = false; + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName(tr("GEOM_PIPE")); + + globalSelection( GEOM_ALLSHAPES ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GenerationGUI_PipeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnAply() +// purpose : +//================================================================================= +bool GenerationGUI_PipeDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void GenerationGUI_PipeDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myOkBase = false; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myOkPath = false; + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if (!testResult) + return; + + TopoDS_Shape S; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + myOkBase = false; + + if(!GEOMBase::GetShape(aSelectedObject, S) || + S.ShapeType() == TopAbs_COMPSOLID || + S.ShapeType() == TopAbs_COMPOUND || + S.ShapeType() == TopAbs_SOLID || + S.ShapeType() == TopAbs_SHAPE) + return; + + myBase = aSelectedObject; + myOkBase = true; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) { + myOkPath = false; + + if(!GEOMBase::GetShape(aSelectedObject, S) || + !(S.ShapeType() == TopAbs_WIRE || S.ShapeType() == TopAbs_EDGE) ) + return; + + myPath = aSelectedObject; + myOkPath = true; + } + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GenerationGUI_PipeDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + else if(send == GroupPoints->PushButton2) { + GroupPoints->LineEdit2->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit2; + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GenerationGUI_PipeDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void GenerationGUI_PipeDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GenerationGUI_PipeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GenerationGUI_PipeDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool GenerationGUI_PipeDlg::isValid( QString& ) +{ + return myOkBase && myOkPath; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GenerationGUI_PipeDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( + getOperation() )->MakePipe( myBase, myPath ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + + diff --git a/src/GenerationGUI/GenerationGUI_PrismDlg.cxx b/src/GenerationGUI/GenerationGUI_PrismDlg.cxx new file mode 100644 index 000000000..bc3aa51dc --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_PrismDlg.cxx @@ -0,0 +1,343 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GenerationGUI_PrismDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "GenerationGUI_PrismDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include +#include "GEOMImpl_Types.hxx" + +#include +#include + +#include "utilities.h" + +//================================================================================= +// class : GenerationGUI_PrismDlg() +// purpose : Constructs a GenerationGUI_PrismDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +GenerationGUI_PrismDlg::GenerationGUI_PrismDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PRISM"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_PRISM_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PRISM")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel1Spin2Check(this, "GroupPoints"); + GroupPoints->CheckButton1->hide(); + GroupPoints->GroupBox1->setTitle(tr("GEOM_PRISM_BSV")); + GroupPoints->TextLabel1->setText(tr("GEOM_BASE")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_HEIGHT")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + GroupPoints->CheckButton2->setText(tr("GEOM_REVERSE")); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~GenerationGUI_PrismDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GenerationGUI_PrismDlg::~GenerationGUI_PrismDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myOkBase = myOkVec = false; + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, +999.999, step, 3); + GroupPoints->SpinBox_DX->SetValue(100.0); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + + connect(GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_PRISM")); + + globalSelection( GEOM_ALLSHAPES ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool GenerationGUI_PrismDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void GenerationGUI_PrismDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) + { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myOkBase = false; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myOkVec = false; + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if (!testResult) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + myOkBase = false; + TopoDS_Shape S; + + if ( !GEOMBase::GetShape(aSelectedObject, S) || + S.ShapeType() <= 2) + return; + + myBase = aSelectedObject; + myOkBase = true; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) { + myVec = aSelectedObject; + myOkVec = true; + } + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + globalSelection( GEOM_ALLSHAPES ); + + if(send == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + else if(send == GroupPoints->PushButton2) { + GroupPoints->LineEdit2->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void GenerationGUI_PrismDlg::enterEvent(QEvent * e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + displayPreview(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + + +//================================================================================= +// function : getHeight() +// purpose : +//================================================================================= +double GenerationGUI_PrismDlg::getHeight() const +{ + return GroupPoints->SpinBox_DX->GetValue(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GenerationGUI_PrismDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool GenerationGUI_PrismDlg::isValid( QString& ) +{ + return myOkBase && myOkVec; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GenerationGUI_PrismDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation() )->MakePrismVecH ( myBase, myVec, getHeight() ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void GenerationGUI_PrismDlg::onReverse() +{ + double anOldValue = GroupPoints->SpinBox_DX->GetValue(); + GroupPoints->SpinBox_DX->SetValue( -anOldValue ); +} + + + diff --git a/src/GenerationGUI/GenerationGUI_RevolDlg.cxx b/src/GenerationGUI/GenerationGUI_RevolDlg.cxx new file mode 100644 index 000000000..14c0d011d --- /dev/null +++ b/src/GenerationGUI/GenerationGUI_RevolDlg.cxx @@ -0,0 +1,363 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : GenerationGUI_RevolDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "GenerationGUI_RevolDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include +#include +#include +#include "GEOMImpl_Types.hxx" + +#include +#include + +#include "utilities.h" + +//================================================================================= +// class : GenerationGUI_RevolDlg() +// purpose : Constructs a GenerationGUI_RevolDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +GenerationGUI_RevolDlg::GenerationGUI_RevolDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_REVOL"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_REVOLUTION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_REVOLUTION")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel1Spin2Check(this, "GroupPoints"); + GroupPoints->CheckButton1->hide(); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECT")); + GroupPoints->TextLabel2->setText(tr("GEOM_AXIS")); + GroupPoints->TextLabel3->setText(tr("GEOM_ANGLE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + GroupPoints->CheckButton2->setText(tr("GEOM_REVERSE")); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~GenerationGUI_RevolDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +GenerationGUI_RevolDlg::~GenerationGUI_RevolDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myOkBase = myOkAxis = false; + + double SpecificStep = 5; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, SpecificStep, 3); + GroupPoints->SpinBox_DX->SetValue(45.0); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName(tr("GEOM_REVOLUTION")); + + globalSelection( GEOM_ALLSHAPES ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool GenerationGUI_RevolDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + +//======================================================================= +//function : isAcceptableBase +//purpose : return true if theBase can be used as algo argument +//======================================================================= + +static bool isAcceptableBase(const TopoDS_Shape& theBase) +{ + switch ( theBase.ShapeType() ) { + case TopAbs_VERTEX: + case TopAbs_EDGE: + case TopAbs_WIRE: + case TopAbs_FACE: + case TopAbs_SHELL: + return true; + case TopAbs_SOLID: + case TopAbs_COMPSOLID: + return false; + case TopAbs_COMPOUND: { + TopExp_Explorer exp( theBase, TopAbs_SOLID); + return !exp.More(); + } + default: + return false; + } + return false; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void GenerationGUI_RevolDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myOkBase = false; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myOkAxis = false; + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if (!testResult) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + TopoDS_Shape S; + myOkBase = false; + + if ( !GEOMBase::GetShape(aSelectedObject, S) || !isAcceptableBase( S ) ) + return; + + myBase = aSelectedObject; + myOkBase = true; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) { + myAxis = aSelectedObject; + myOkAxis = true; + } + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + globalSelection( GEOM_ALLSHAPES ); + + if(send == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + else if(send == GroupPoints->PushButton2) { + GroupPoints->LineEdit2->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + displayPreview(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : getAngle() +// purpose : +//================================================================================= +double GenerationGUI_RevolDlg::getAngle() const +{ + return GroupPoints->SpinBox_DX->GetValue(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GenerationGUI_RevolDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool GenerationGUI_RevolDlg::isValid( QString& ) +{ + return myOkBase && myOkAxis; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GenerationGUI_RevolDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( + getOperation() )->MakeRevolutionAxisAngle( myBase, myAxis, getAngle() * PI180 ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void GenerationGUI_RevolDlg::onReverse() +{ + double anOldValue = GroupPoints->SpinBox_DX->GetValue(); + GroupPoints->SpinBox_DX->SetValue( -anOldValue ); +} diff --git a/src/GroupGUI/GroupGUI.cxx b/src/GroupGUI/GroupGUI.cxx new file mode 100644 index 000000000..5bfaf9fca --- /dev/null +++ b/src/GroupGUI/GroupGUI.cxx @@ -0,0 +1,152 @@ +// 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, +// 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.org +// +// +// +// File : GroupGUI.cxx +// Author : Sergey ANIKIN +// Module : GEOM +// $Header$ + +#include "GroupGUI.h" +#include "GroupGUI_GroupDlg.h" + +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Session.h" +#include "SUIT_Desktop.h" +#include "SUIT_MessageBox.h" +#include "SalomeApp_Application.h" +#include "SalomeApp_Study.h" +#include "LightApp_SelectionMgr.h" + +GroupGUI* GroupGUI::myGUIObject = 0; + +//======================================================================= +// function : GetGroupGUI() +// purpose : Get the only GroupGUI object [ static ] +//======================================================================= +GroupGUI* GroupGUI::GetGroupGUI(GeometryGUI* parent) +{ + if ( myGUIObject == 0 ) + myGUIObject = new GroupGUI(parent); + + return myGUIObject; +} + +//======================================================================= +// function : GroupGUI() +// purpose : Constructor +//======================================================================= +GroupGUI::GroupGUI(GeometryGUI* parent) +: GEOMGUI(parent) +{ +} + + +//======================================================================= +// function : ~GroupGUI() +// purpose : Destructor +//======================================================================= +GroupGUI::~GroupGUI() +{ +} + + +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool GroupGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent ) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + + QDialog* aDlg = NULL; + + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + if ( !appStudy ) return false; + _PTR(Study) aStudy = appStudy->studyDS(); + + if ( aStudy->GetProperties()->IsLocked() ) { + SUIT_MessageBox::warn1 ( parent, + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return false; + } + + switch ( theCommandID ) { + case 800: + case 8001: + aDlg = new GroupGUI_GroupDlg( GroupGUI_GroupDlg::CreateGroup, parent, ""); + break; + case 801: + { + SALOME_ListIO aList; + aList.Clear(); + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( aSelMgr ) + aSelMgr->selectedObjects( aList ); + } + + if ( aList.Extent() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( aList.First(), aResult ); + + if ( aResult && !CORBA::is_nil( anObj ) && anObj->GetType() == GEOM_GROUP ) { + aDlg = new GroupGUI_GroupDlg( GroupGUI_GroupDlg::EditGroup, parent, "" ); + break; + } + } + SUIT_MessageBox::warn1 ( parent, + tr("WRN_WARNING"), + tr("NO_GROUP"), + tr("BUT_OK") ); + break; + } + default: + SUIT_Session::session()->activeApplication()->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); + break; + } + + if ( aDlg != NULL ) + aDlg->show(); + + return true; +} + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ +#ifdef WNT + __declspec( dllexport ) +#endif + GEOMGUI* GetLibGUI(GeometryGUI* p) + { + return GroupGUI::GetGroupGUI(p); + } +} diff --git a/src/GroupGUI/GroupGUI_GroupDlg.cxx b/src/GroupGUI/GroupGUI_GroupDlg.cxx new file mode 100644 index 000000000..041774bf4 --- /dev/null +++ b/src/GroupGUI/GroupGUI_GroupDlg.cxx @@ -0,0 +1,729 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2004 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.org +// +// +// +// File : GroupGUI_GroupDlg.cxx +// Author : Sergey ANIKIN +// Module : GEOM +// $Header$ + +#include "GroupGUI_GroupDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "SalomeApp_Study.h" +#include "LightApp_SelectionMgr.h" + +#include "GEOMBase.h" + +#include "GEOMImpl_Types.hxx" + +#include +#include +#include +#include + +#include +#include + + + + +GroupGUI_GroupDlg::GroupGUI_GroupDlg(Mode mode, + QWidget* parent, + const char* name, + bool modal, + WFlags fl) + :GEOMBase_Skeleton( parent, "GroupGUI_GroupDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), + myMode( mode ), + myBusy( false ) +{ + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_VERTEX" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_EDGE" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_FACE" ) ) ); + QPixmap image3( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_SOLID" ) ) ); + + QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + + setCaption( myMode == CreateGroup ? tr( "CREATE_GROUP_TITLE" ) : tr( "EDIT_GROUP_TITLE" ) ); + + // Shape type button group + GroupConstructors->setEnabled( myMode == CreateGroup ); + GroupConstructors->setTitle( tr( "SHAPE_TYPE" ) ); + RadioButton1->setPixmap( image0 ); + RadioButton2->setPixmap( image1 ); + RadioButton3->setPixmap( image2 ); + RadioButton4->setPixmap( image3 ); + RadioButton4->show(); + + // Group name + GroupBoxName->setTitle( tr( "GROUP_NAME" ) ); + + // Main shape and sub-shapes + GroupMedium = new QGroupBox( 1, Qt::Vertical, tr( "MAIN_SUB_SHAPES" ), this ); + GroupMedium->setInsideMargin( 10 ); + Layout1->addWidget( GroupMedium, 2, 0 ); + + QWidget* aFrame = new QWidget( GroupMedium ); + QGridLayout* aMedLayout = new QGridLayout( aFrame, 4, 4, 0, 6 ); + + QLabel* aMainLabel = new QLabel( tr( "MAIN_SHAPE" ), aFrame ); + + mySelBtn = new QPushButton( aFrame ); + mySelBtn->setPixmap( iconSelect ); + mySelBtn->setEnabled( myMode == CreateGroup ); + + myMainName = new QLineEdit( aFrame ); + myMainName->setReadOnly( true ); + myMainName->setEnabled( myMode == CreateGroup ); + + mySelSubBtn = new QPushButton( tr( "SELECT_SUB_SHAPES" ), aFrame ); + mySelAllBtn = new QPushButton( tr( "SELECT_ALL" ), aFrame ); + myAddBtn = new QPushButton( tr( "ADD" ), aFrame ); + myRemBtn = new QPushButton( tr( "REMOVE" ), aFrame ); + myIdList = new QListBox( aFrame ); + + myIdList->setSelectionMode( QListBox::Extended ); + myIdList->setRowMode( QListBox::FitToWidth ); + + aMedLayout->addWidget( aMainLabel, 0, 0 ); + aMedLayout->addWidget( mySelBtn, 0, 1 ); + aMedLayout->addMultiCellWidget( myMainName, 0, 0, 2, 3 ); + aMedLayout->addMultiCellWidget( mySelSubBtn, 1, 1, 0, 2 ); + aMedLayout->addWidget( mySelAllBtn, 1, 3 ); + aMedLayout->addMultiCellWidget( myIdList, 2, 3, 0, 2 ); + aMedLayout->addWidget( myAddBtn, 2, 3 ); + aMedLayout->addWidget( myRemBtn, 3, 3 ); + + Init(); +} + +GroupGUI_GroupDlg::~GroupGUI_GroupDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::Init() +{ + // san -- TODO: clear selected sub-shapes... + + if ( myMode == CreateGroup ) { + initName( tr( "GROUP_PREFIX" ) ); + + // Get ready for main shape selection + myEditCurrentArgument = myMainName; + + connect( GroupConstructors, SIGNAL( clicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + connect( mySelBtn, SIGNAL( clicked() ), this, SLOT(SetEditCurrentArgument())); + } + else if ( myMode == EditGroup && IObjectCount() ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !CORBA::is_nil( anObj ) && anObj->GetType() == GEOM_GROUP ) { + myGroup = anObj; + + ResultName->setText( GEOMBase::GetName( myGroup ) ); + + GEOM::GEOM_IGroupOperations_var anOp = GEOM::GEOM_IGroupOperations::_narrow( getOperation() ); + myMainObj = anOp->GetMainShape( myGroup ); + if ( !CORBA::is_nil( myMainObj ) ) + myMainName->setText( GEOMBase::GetName( myMainObj ) ); + + setShapeType( (TopAbs_ShapeEnum)anOp->GetType( myGroup ) ); + + GEOM::ListOfLong_var aCurrList = anOp->GetObjects( myGroup ); + QListBoxItem* anItem; + for ( int i = 0, n = aCurrList->length(); i < n; i++ ) { + anItem = new QListBoxText( QString( "%1" ).arg(aCurrList[i] ) ); + myIdList->insertItem( anItem ); + } + + myEditCurrentArgument = 0; + } + } + + connect( buttonOk , SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( mySelSubBtn, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( mySelAllBtn, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect( mySelAllBtn, SIGNAL( clicked() ), this, SLOT( selectAllSubShapes() ) ); + connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( add() ) ); + connect( myRemBtn, SIGNAL( clicked() ), this, SLOT( remove() ) ); + connect( myIdList, SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ) ); + + activateSelection(); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::enterEvent( QEvent* e ) +{ + if ( !buttonCancel->isEnabled() ) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool GroupGUI_GroupDlg::ClickOnApply() +{ + if ( !onAccept( myMode == CreateGroup, true ) ) + return false; + + if ( myMode == CreateGroup ) + initName(); + return true; +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + activateSelection(); +} + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::LineEditReturnPressed() +{ + QLineEdit* send = ( QLineEdit* )sender(); + + if ( send == myMainName && !myEditCurrentArgument ) { + myEditCurrentArgument = myMainName; + activateSelection(); + } + else + GEOMBase_Skeleton::LineEditReturnPressed(); + + updateState(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == mySelBtn ) + myEditCurrentArgument = myMainName; + else if ( send == mySelSubBtn || send == mySelAllBtn ) + myEditCurrentArgument = 0; + + activateSelection(); + updateState(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void GroupGUI_GroupDlg::SelectionIntoArgument() +{ + if ( myEditCurrentArgument ) { // Selection of a main shape is active + myEditCurrentArgument->setText( "" ); + + if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) { + myMainObj = anObj; + myEditCurrentArgument->setText( GEOMBase::GetName( anObj ) ); + updateState(); + return; + } + } + + myMainObj = GEOM::GEOM_Object::_nil(); + } + else { // an attempt to synchronize list box selection with 3d viewer + if ( myBusy ) + return; + + bool isBlocked = myIdList->signalsBlocked(); + myIdList->blockSignals( true ); + myIdList->clearSelection(); + + TColStd_IndexedMapOfInteger aMapIndex; + + if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), aMapIndex ); + } + + if ( !aMapIndex.Extent() ) // try to find out and process the object browser selection + { + GEOM::ListOfGO anObjects; + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), anObjects); + GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() ); + for (int i = 0; i < anObjects.length(); i++) + { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape(anObjects[i], aShape, getShapeType()) ) + { + CORBA::Long anIndex = aLocOp->GetSubShapeIndex( myMainObj, anObjects[i] ); + if ( anIndex >= 0 ) + aMapIndex.Add( anIndex ); + } + } + } + + if ( aMapIndex.Extent()>=1 ) + { + QMap aMap; + for ( int i = 0, n = myIdList->count(); i < n; i++ ) + aMap.insert( myIdList->item( i )->text().toInt(), i ); + + for ( int ii = 1, nn = aMapIndex.Extent(); ii <= nn; ii++ ) + { + if ( aMap.contains( aMapIndex( ii ) ) ) + myIdList->setSelected( aMap[aMapIndex( ii )], true ); + } + } + myIdList->blockSignals( isBlocked ); + } + + updateState(); +} + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void GroupGUI_GroupDlg::ConstructorsClicked( int constructorId ) +{ + myIdList->clear(); + activateSelection(); + updateState(); +} + +//================================================================================= +// function : selectAllSubShapes +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::selectAllSubShapes() +{ + if ( CORBA::is_nil( myMainObj ) ) + return; + + GEOM::GEOM_IShapesOperations_var aShOp = getGeomEngine()->GetIShapesOperations( getStudyId() ); + GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() ); + + GEOM::ListOfGO_var aSubShapes = aShOp->MakeExplode( myMainObj, getShapeType(), false ); + if ( !aShOp->IsDone() ) + return; + + bool isBlocked = myIdList->signalsBlocked(); + myIdList->blockSignals( true ); + myIdList->clear(); + + QListBoxItem* anItem; + for ( int i = 0, n = aSubShapes->length(); i < n; i++ ) { + CORBA::Long anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubShapes[i] ); + if ( anIndex < 0 ) + continue; + + anItem = new QListBoxText( QString( "%1" ).arg( anIndex ) ); + myIdList->insertItem( anItem ); + myIdList->setSelected( anItem, true ); + } + + myIdList->blockSignals( isBlocked ); + highlightSubShapes(); + updateState(); +} + +//================================================================================= +// function : add +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::add() +{ + TColStd_MapOfInteger aMap; + for ( int i = 0, n = myIdList->count(); i < n; i++ ) + aMap.Add( myIdList->item( i )->text().toInt() ); + + TColStd_IndexedMapOfInteger aMapIndex; + + if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), aMapIndex ); + } + + if ( !aMapIndex.Extent() ) // try to find out and process the object browser selection + { + GEOM::ListOfGO anObjects; + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), anObjects); + GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() ); + for (int i = 0; i < anObjects.length(); i++) + { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape(anObjects[i], aShape, getShapeType()) ) + { + CORBA::Long anIndex = aLocOp->GetSubShapeIndex( myMainObj, anObjects[i] ); + if ( anIndex >= 0 ) + aMapIndex.Add( anIndex ); + } + } + } + + if ( aMapIndex.Extent()>=1 ) + { + QListBoxItem* anItem; + bool isBlocked = myIdList->signalsBlocked(); + myIdList->blockSignals( true ); + + for ( int i = 1, n = aMapIndex.Extent(); i <= n; i++ ) { + if ( aMap.Contains( aMapIndex( i ) ) ) + continue; + + anItem = new QListBoxText( QString( "%1" ).arg( aMapIndex( i ) ) ); + myIdList->insertItem( anItem ); + myIdList->setSelected( anItem, true ); + } + + myIdList->blockSignals( isBlocked ); + } + + updateState(); +} + +//================================================================================= +// function : remove +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::remove() +{ + for ( int i = myIdList->count() - 1; i >= 0; i-- ) { + if ( myIdList->isSelected( i ) ) + myIdList->removeItem( i ); + } + updateState(); +} + + +//================================================================================= +// function : getConstructorId() +// purpose : +//================================================================================= +int GroupGUI_GroupDlg::getConstructorId() const +{ + return GroupConstructors->id( GroupConstructors->selected() ); +} + +//================================================================================= +// function : getShapeType() +// purpose : +//================================================================================= +TopAbs_ShapeEnum GroupGUI_GroupDlg::getShapeType() const +{ + switch ( getConstructorId() ) { + case 0: return TopAbs_VERTEX; + case 1: return TopAbs_EDGE; + case 2: return TopAbs_FACE; + case 3: return TopAbs_SOLID; + default: return TopAbs_SHAPE; + } +} + +//================================================================================= +// function : setShapeType() +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::setShapeType( const TopAbs_ShapeEnum theType ) +{ + int anId = 0; + switch ( theType ) { + case TopAbs_VERTEX: anId = 0; break; + case TopAbs_EDGE: anId = 1; break; + case TopAbs_FACE: anId = 2; break; + case TopAbs_SOLID: anId = 3; break; + } + GroupConstructors->setButton( anId ); +} + + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void GroupGUI_GroupDlg::activateSelection() +{ + globalSelection( GEOM_ALLSHAPES ); + + if ( !myMainObj->_is_nil() && !myEditCurrentArgument ) { + localSelection( myMainObj, getShapeType() ); + } + + SelectionIntoArgument(); +} + +//================================================================================= +// function : updateState +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::updateState() +{ + bool isAdd = false; + + TColStd_IndexedMapOfInteger aMapIndex; + + if ( IObjectCount() == 1 ) { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), aMapIndex ); + } + + if ( !aMapIndex.Extent() ) // try to find out and process the object browser selection + { + isAdd = true; + GEOM::ListOfGO anObjects; + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), anObjects); + GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() ); + for (int i = 0; i < anObjects.length(); i++) + { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape(anObjects[i], aShape, getShapeType()) ) + { + CORBA::Long anIndex = aLocOp->GetSubShapeIndex( myMainObj, anObjects[i] ); + if ( anIndex >= 0 ) + aMapIndex.Add( anIndex ); + else + isAdd = false; + } + else + isAdd = false; + + if ( !isAdd ) + { + aMapIndex.Clear(); + break; + } + } + } + + isAdd = aMapIndex.Extent() > 0; + + myAddBtn->setEnabled( !myEditCurrentArgument && !CORBA::is_nil( myMainObj ) && isAdd ); + bool hasSel = false; + for ( int ii = 0, nn = myIdList->count(); !hasSel && ii < nn; ii++ ) + hasSel = myIdList->isSelected( ii ); + myRemBtn->setEnabled( hasSel ); + mySelSubBtn->setEnabled( !CORBA::is_nil( myMainObj ) ); + mySelAllBtn->setEnabled( !CORBA::is_nil( myMainObj ) ); +} + +//================================================================================= +// function : selectionChanged +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::selectionChanged() +{ + highlightSubShapes(); +} + +//================================================================================= +// function : highlightSubShapes +// purpose : +//================================================================================= +void GroupGUI_GroupDlg::highlightSubShapes() +{ + if ( CORBA::is_nil( myMainObj ) ) + return; + + Standard_Boolean isOk; + Handle(GEOM_AISShape) aSh = + GEOMBase::ConvertIORinGEOMAISShape( GEOMBase::GetIORFromObject( myMainObj ), isOk, true ); + if ( !isOk || aSh.IsNull() ) + return; + + TColStd_MapOfInteger anIds; + + myBusy = true; + + for ( int ii = 0, nn = myIdList->count(); ii < nn; ii++ ) + if ( myIdList->isSelected( ii ) ) + anIds.Add( myIdList->item( ii )->text().toInt() ); + + LightApp_SelectionMgr* aSelMgr = ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(); + aSelMgr->clearSelected(); + aSelMgr->AddOrRemoveIndex( aSh->getIO(), anIds, false ); + + myBusy = false; + + updateState(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr GroupGUI_GroupDlg::createOperation() +{ + return getGeomEngine()->GetIGroupOperations( getStudyId() ); +} + +#define RETURN_WITH_MSG(a, b) \ + if ( !(a) ) { \ + theMessage += (b); \ + return false; \ + } + +//================================================================================= +// function : isValid() +// purpose : Verify validity of input data +//================================================================================= +bool GroupGUI_GroupDlg::isValid( QString& theMessage ) +{ + SalomeApp_Study* study = getStudy(); + ASSERT(study); + RETURN_WITH_MSG ( !study->studyDS()->GetProperties()->IsLocked(), tr( "GEOM_STUDY_LOCKED" ) ) + + if ( myMode == CreateGroup ) { + RETURN_WITH_MSG( !CORBA::is_nil( myMainObj ), tr( "NO_MAIN_OBJ" ) ) + } + else { + RETURN_WITH_MSG( !CORBA::is_nil( myMainObj ), tr( "NO_GROUP" ) ) + } + + const char* aName = getNewObjectName(); + RETURN_WITH_MSG ( aName && strlen( aName ), tr( "EMPTY_NAME" ) ) + + RETURN_WITH_MSG ( myIdList->count(), tr( "EMPTY_LIST" ) ) + return true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool GroupGUI_GroupDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_IGroupOperations_var anOp = GEOM::GEOM_IGroupOperations::_narrow( getOperation() ); + + GEOM::GEOM_Object_var aGroup; + if ( myMode == CreateGroup ) + aGroup = anOp->CreateGroup( myMainObj, getShapeType() ); + else if ( myMode == EditGroup ) + aGroup = myGroup; + + if ( CORBA::is_nil( aGroup ) || ( myMode == CreateGroup && !anOp->IsDone() ) ) + return false; + + GEOM::ListOfLong_var aCurrList = anOp->GetObjects( aGroup ); + if ( !anOp->IsDone() ) + return false; + + for ( int i = 0, n = aCurrList->length(); i < n; i++ ) { + anOp->RemoveObject( aGroup, aCurrList[i] ); + if ( !anOp->IsDone() ) + return false; + } + + for ( int ii = 0, nn = myIdList->count(); ii < nn; ii++ ) { + anOp->AddObject( aGroup, myIdList->item( ii )->text().toInt() ); + if ( !anOp->IsDone() ) + return false; + } + + SalomeApp_Study* study = getStudy(); + if ( study ) { + string IOR = GEOMBase::GetIORFromObject( aGroup ); + if ( IOR != "" ) { + _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) ); + if ( SO ) { + _PTR(StudyBuilder) aBuilder (study->studyDS()->NewBuilder()); + aBuilder->SetName( SO, getNewObjectName() ); + } + } + } + + objects.push_back( aGroup._retn() ); + + return true; +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// ( called with addInStudy method ) +//================================================================ +GEOM::GEOM_Object_ptr GroupGUI_GroupDlg::getFather( GEOM::GEOM_Object_ptr theObj ) +{ + GEOM::GEOM_Object_var aFatherObj; + if ( theObj->GetType() == GEOM_GROUP ) { + GEOM::GEOM_IGroupOperations_var anOp = GEOM::GEOM_IGroupOperations::_narrow( getOperation() ); + aFatherObj = anOp->GetMainShape( theObj ); + } + return aFatherObj._retn(); +} diff --git a/src/IGESExport/IGESExport.cxx b/src/IGESExport/IGESExport.cxx new file mode 100644 index 000000000..591016460 --- /dev/null +++ b/src/IGESExport/IGESExport.cxx @@ -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/ +// +// File: IGESExport.cxx +// Created: Wed May 19 14:49:45 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include +#include +#include + +#include +#include + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + int Export(const TopoDS_Shape& theShape, const TCollection_AsciiString& theFileName) + { + MESSAGE("Export IGES into file " << theFileName.ToCString()); + try + { + //VRV: OCC 4.0 migration + IGESControl_Controller::Init(); + IGESControl_Writer ICW (Interface_Static::CVal("XSTEP.iges.unit"), + Interface_Static::IVal("XSTEP.iges.writebrep.mode")); + //VRV: OCC 4.0 migration + + ICW.AddShape( theShape ); + ICW.ComputeModel(); + if ( ICW.Write( theFileName.ToCString() ) ) + return 1; + } + catch(Standard_Failure) + { + //THROW_SALOME_CORBA_EXCEPTION("Exception catched in IGESExport", SALOME::BAD_PARAM); + } + return 0; + } +} diff --git a/src/IGESImport/IGESImport.cxx b/src/IGESImport/IGESImport.cxx new file mode 100644 index 000000000..3a59922c9 --- /dev/null +++ b/src/IGESImport/IGESImport.cxx @@ -0,0 +1,95 @@ +// 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/ +// +// File: IGESImport.cxx +// Created: Wed May 19 14:36:35 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include +#include + +#include +#include + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + TopoDS_Shape Import (const TCollection_AsciiString& theFileName, + TCollection_AsciiString& theError) + { + IGESControl_Reader aReader; + TopoDS_Shape aResShape; + try { + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); + + if (status == IFSelect_RetDone) { + MESSAGE("ImportIGES : all Geometry Transfer"); + //OCC 5.1.2 porting + // aReader.Clear(); + // aReader.TransferRoots(false); + aReader.ClearShapes(); + aReader.TransferRoots(); + + MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes()); + aResShape = aReader.OneShape(); + + } else { +// switch (status) { +// case IFSelect_RetVoid: +// theError = "Nothing created or No data to process"; +// break; +// case IFSelect_RetError: +// theError = "Error in command or input data"; +// break; +// case IFSelect_RetFail: +// theError = "Execution was run, but has failed"; +// break; +// case IFSelect_RetStop: +// theError = "Execution has been stopped. Quite possible, an exception was raised"; +// break; +// default: +// break; +// } + theError = "Wrong format of the imported file. Can't import file."; + aResShape.Nullify(); + } + } + catch(Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + theError = aFail->GetMessageString(); + aResShape.Nullify(); + } + return aResShape; + } +} diff --git a/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.cxx b/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.cxx new file mode 100644 index 000000000..f7b8cb5c5 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.cxx @@ -0,0 +1,169 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_1Sel12LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_1Sel12LineEdit_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_1Sel12LineEdit_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +MeasureGUI_1Sel12LineEdit_QTD::MeasureGUI_1Sel12LineEdit_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "MeasureGUI_1Sel12LineEdit_QTD" ); + resize( 131, 171 ); + setCaption( trUtf8( "MeasureGUI_1Sel12LineEdit_QTD" ) ); + MeasureGUI_1Sel12LineEdit_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "MeasureGUI_1Sel12LineEdit_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + LineEdit12 = new QLineEdit( GroupBox1, "LineEdit12" ); + + Layout2->addWidget( LineEdit12, 0, 2 ); + + LineEdit11 = new QLineEdit( GroupBox1, "LineEdit11" ); + + Layout2->addWidget( LineEdit11, 0, 1 ); + + LineEdit42 = new QLineEdit( GroupBox1, "LineEdit42" ); + + Layout2->addWidget( LineEdit42, 3, 2 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 3, 0 ); + + LineEdit31 = new QLineEdit( GroupBox1, "LineEdit31" ); + + Layout2->addWidget( LineEdit31, 2, 1 ); + + LineEdit41 = new QLineEdit( GroupBox1, "LineEdit41" ); + + Layout2->addWidget( LineEdit41, 3, 1 ); + + LineEdit23 = new QLineEdit( GroupBox1, "LineEdit23" ); + + Layout2->addWidget( LineEdit23, 1, 3 ); + + LineEdit33 = new QLineEdit( GroupBox1, "LineEdit33" ); + + Layout2->addWidget( LineEdit33, 2, 3 ); + + LineEdit43 = new QLineEdit( GroupBox1, "LineEdit43" ); + + Layout2->addWidget( LineEdit43, 3, 3 ); + + LineEdit22 = new QLineEdit( GroupBox1, "LineEdit22" ); + + Layout2->addWidget( LineEdit22, 1, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 0 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 2, 0 ); + + LineEdit13 = new QLineEdit( GroupBox1, "LineEdit13" ); + + Layout2->addWidget( LineEdit13, 0, 3 ); + + LineEdit32 = new QLineEdit( GroupBox1, "LineEdit32" ); + + Layout2->addWidget( LineEdit32, 2, 2 ); + + LineEdit21 = new QLineEdit( GroupBox1, "LineEdit21" ); + + Layout2->addWidget( LineEdit21, 1, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 1, 0 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + MeasureGUI_1Sel12LineEdit_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_1Sel12LineEdit_QTD::~MeasureGUI_1Sel12LineEdit_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.h b/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.h new file mode 100644 index 000000000..0c930fc2c --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel12LineEdit_QTD.h @@ -0,0 +1,78 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_1Sel12LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_1SEL12LINEEDIT_QTD_H +#define MEASUREGUI_1SEL12LINEEDIT_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class MeasureGUI_1Sel12LineEdit_QTD : public QWidget +{ + Q_OBJECT + +public: + MeasureGUI_1Sel12LineEdit_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~MeasureGUI_1Sel12LineEdit_QTD(); + + QGroupBox* GroupBox1; + QLineEdit* LineEdit12; + QLineEdit* LineEdit11; + QLineEdit* LineEdit42; + QLabel* TextLabel5; + QLineEdit* LineEdit31; + QLineEdit* LineEdit41; + QLineEdit* LineEdit23; + QLineEdit* LineEdit33; + QLineEdit* LineEdit43; + QLineEdit* LineEdit22; + QLabel* TextLabel2; + QLabel* TextLabel4; + QLineEdit* LineEdit13; + QLineEdit* LineEdit32; + QLineEdit* LineEdit21; + QLabel* TextLabel3; + QLineEdit* LineEdit1; + QPushButton* PushButton1; + QLabel* TextLabel1; + + +protected: + QGridLayout* MeasureGUI_1Sel12LineEdit_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // MEASUREGUI_1SEL12LINEEDIT_QTD_H diff --git a/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.cxx b/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.cxx new file mode 100644 index 000000000..42dc1451e --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.cxx @@ -0,0 +1,96 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_1Sel1TextView_QTD.ui' +** +** Created: mar oct 28 14:01:15 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_1Sel1TextView_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_1Sel1TextView_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +MeasureGUI_1Sel1TextView_QTD::MeasureGUI_1Sel1TextView_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "MeasureGUI_1Sel1TextView_QTD" ); + resize( 130, 160 ); + setCaption( trUtf8( "MeasureGUI_1Sel1TextView_QTD" ) ); + MeasureGUI_1Sel1TextView_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "MeasureGUI_1Sel1TextView_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + TextEdit1 = new QTextEdit( GroupBox1, "TextEdit1" ); + + Layout1->addMultiCellWidget( TextEdit1, 1, 1, 0, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + MeasureGUI_1Sel1TextView_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_1Sel1TextView_QTD::~MeasureGUI_1Sel1TextView_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h b/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h new file mode 100644 index 000000000..7d6ea600d --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel1TextView_QTD.h @@ -0,0 +1,63 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_1Sel1TextView_QTD.ui' +** +** Created: mar oct 28 14:01:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_1SEL1TEXTVIEW_QTD_H +#define MEASUREGUI_1SEL1TEXTVIEW_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QTextEdit; + +class MeasureGUI_1Sel1TextView_QTD : public QWidget +{ + Q_OBJECT + +public: + MeasureGUI_1Sel1TextView_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~MeasureGUI_1Sel1TextView_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QTextEdit* TextEdit1; + QLineEdit* LineEdit1; + QPushButton* PushButton1; + + +protected: + QGridLayout* MeasureGUI_1Sel1TextView_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // MEASUREGUI_1SEL1TEXTVIEW_QTD_H diff --git a/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.cxx b/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.cxx new file mode 100644 index 000000000..d7e31ec5c --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.cxx @@ -0,0 +1,123 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_1Sel3LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:13 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_1Sel3LineEdit_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_1Sel3LineEdit_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +MeasureGUI_1Sel3LineEdit_QTD::MeasureGUI_1Sel3LineEdit_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "MeasureGUI_1Sel3LineEdit_QTD" ); + resize( 129, 141 ); + setCaption( trUtf8( "MeasureGUI_1Sel3LineEdit_QTD" ) ); + MeasureGUI_1Sel3LineEdit_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "MeasureGUI_1Sel3LineEdit_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout2->addWidget( TextLabel1, 0, 0 ); + + LineEdit4 = new QLineEdit( GroupBox1, "LineEdit4" ); + + Layout2->addMultiCellWidget( LineEdit4, 3, 3, 1, 2 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 2, 0 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout2->addMultiCellWidget( LineEdit2, 1, 1, 1, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 80, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout2->addItem( spacer, 4, 2 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout2->addMultiCellWidget( LineEdit3, 2, 2, 1, 2 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout2->addWidget( LineEdit1, 0, 2 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 3, 0 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 1, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout2->addWidget( PushButton1, 0, 1 ); + + GroupBox1Layout->addLayout( Layout2, 0, 0 ); + + MeasureGUI_1Sel3LineEdit_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_1Sel3LineEdit_QTD::~MeasureGUI_1Sel3LineEdit_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h b/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h new file mode 100644 index 000000000..379b7da32 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel3LineEdit_QTD.h @@ -0,0 +1,67 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_1Sel3LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:13 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_1SEL3LINEEDIT_QTD_H +#define MEASUREGUI_1SEL3LINEEDIT_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class MeasureGUI_1Sel3LineEdit_QTD : public QWidget +{ + Q_OBJECT + +public: + MeasureGUI_1Sel3LineEdit_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~MeasureGUI_1Sel3LineEdit_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QLineEdit* LineEdit4; + QLabel* TextLabel3; + QLineEdit* LineEdit2; + QLineEdit* LineEdit3; + QLineEdit* LineEdit1; + QLabel* TextLabel4; + QLabel* TextLabel2; + QPushButton* PushButton1; + + +protected: + QGridLayout* MeasureGUI_1Sel3LineEdit_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout2; +}; + +#endif // MEASUREGUI_1SEL3LINEEDIT_QTD_H diff --git a/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.cxx b/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.cxx new file mode 100644 index 000000000..28968b72a --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.cxx @@ -0,0 +1,151 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_1Sel6LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_1Sel6LineEdit_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_1Sel6LineEdit_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +MeasureGUI_1Sel6LineEdit_QTD::MeasureGUI_1Sel6LineEdit_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "MeasureGUI_1Sel6LineEdit_QTD" ); + resize( 129, 163 ); + setCaption( trUtf8( "MeasureGUI_1Sel6LineEdit_QTD" ) ); + MeasureGUI_1Sel6LineEdit_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "MeasureGUI_1Sel6LineEdit_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + QSpacerItem* spacer = new QSpacerItem( 0, 50, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 2, 2 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + Layout2 = new QGridLayout( 0, 1, 1, 0, 6, "Layout2"); + + LineEdit22 = new QLineEdit( GroupBox1, "LineEdit22" ); + + Layout2->addWidget( LineEdit22, 2, 2 ); + + LineEdit32 = new QLineEdit( GroupBox1, "LineEdit32" ); + + Layout2->addWidget( LineEdit32, 3, 2 ); + + TextLabel4 = new QLabel( GroupBox1, "TextLabel4" ); + TextLabel4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel4->sizePolicy().hasHeightForWidth() ) ); + TextLabel4->setText( trUtf8( "TL4" ) ); + + Layout2->addWidget( TextLabel4, 1, 0 ); + + LineEdit31 = new QLineEdit( GroupBox1, "LineEdit31" ); + + Layout2->addWidget( LineEdit31, 3, 1 ); + + TextLabel5 = new QLabel( GroupBox1, "TextLabel5" ); + TextLabel5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel5->sizePolicy().hasHeightForWidth() ) ); + TextLabel5->setText( trUtf8( "TL5" ) ); + + Layout2->addWidget( TextLabel5, 2, 0 ); + + LineEdit11 = new QLineEdit( GroupBox1, "LineEdit11" ); + + Layout2->addWidget( LineEdit11, 1, 1 ); + + TextLabel6 = new QLabel( GroupBox1, "TextLabel6" ); + TextLabel6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel6->sizePolicy().hasHeightForWidth() ) ); + TextLabel6->setText( trUtf8( "TL6" ) ); + + Layout2->addWidget( TextLabel6, 3, 0 ); + + LineEdit12 = new QLineEdit( GroupBox1, "LineEdit12" ); + + Layout2->addWidget( LineEdit12, 1, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout2->addWidget( TextLabel2, 0, 1 ); + + LineEdit21 = new QLineEdit( GroupBox1, "LineEdit21" ); + + Layout2->addWidget( LineEdit21, 2, 1 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout2->addWidget( TextLabel3, 0, 2 ); + + Layout1->addMultiCellLayout( Layout2, 1, 1, 0, 2 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + MeasureGUI_1Sel6LineEdit_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_1Sel6LineEdit_QTD::~MeasureGUI_1Sel6LineEdit_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h b/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h new file mode 100644 index 000000000..f222e6380 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel6LineEdit_QTD.h @@ -0,0 +1,73 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_1Sel6LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:13 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_1SEL6LINEEDIT_QTD_H +#define MEASUREGUI_1SEL6LINEEDIT_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class MeasureGUI_1Sel6LineEdit_QTD : public QWidget +{ + Q_OBJECT + +public: + MeasureGUI_1Sel6LineEdit_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~MeasureGUI_1Sel6LineEdit_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel1; + QLineEdit* LineEdit22; + QLineEdit* LineEdit32; + QLabel* TextLabel4; + QLineEdit* LineEdit31; + QLabel* TextLabel5; + QLineEdit* LineEdit11; + QLabel* TextLabel6; + QLineEdit* LineEdit12; + QLabel* TextLabel2; + QLineEdit* LineEdit21; + QLabel* TextLabel3; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + + +protected: + QGridLayout* MeasureGUI_1Sel6LineEdit_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; + QGridLayout* Layout2; +}; + +#endif // MEASUREGUI_1SEL6LINEEDIT_QTD_H diff --git a/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.cxx b/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.cxx new file mode 100644 index 000000000..211b3bfe8 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.cxx @@ -0,0 +1,119 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_2Sel1LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_2Sel1LineEdit_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_2Sel1LineEdit_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +MeasureGUI_2Sel1LineEdit_QTD::MeasureGUI_2Sel1LineEdit_QTD( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + if ( !name ) + setName( "MeasureGUI_2Sel1LineEdit_QTD" ); + resize( 129, 115 ); + setCaption( trUtf8( "MeasureGUI_2Sel1LineEdit_QTD" ) ); + MeasureGUI_2Sel1LineEdit_QTDLayout = new QGridLayout( this, 1, 1, 0, 6, "MeasureGUI_2Sel1LineEdit_QTDLayout"); + + GroupBox1 = new QGroupBox( this, "GroupBox1" ); + GroupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupBox1->sizePolicy().hasHeightForWidth() ) ); + GroupBox1->setTitle( trUtf8( "" ) ); + GroupBox1->setColumnLayout(0, Qt::Vertical ); + GroupBox1->layout()->setSpacing( 6 ); + GroupBox1->layout()->setMargin( 11 ); + GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); + GroupBox1Layout->setAlignment( Qt::AlignTop ); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + QSpacerItem* spacer = new QSpacerItem( 0, 60, QSizePolicy::Minimum, QSizePolicy::Expanding ); + Layout1->addItem( spacer, 3, 2 ); + + TextLabel3 = new QLabel( GroupBox1, "TextLabel3" ); + TextLabel3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel3->sizePolicy().hasHeightForWidth() ) ); + TextLabel3->setText( trUtf8( "TL3" ) ); + + Layout1->addWidget( TextLabel3, 2, 0 ); + + LineEdit3 = new QLineEdit( GroupBox1, "LineEdit3" ); + + Layout1->addMultiCellWidget( LineEdit3, 2, 2, 1, 2 ); + + LineEdit2 = new QLineEdit( GroupBox1, "LineEdit2" ); + + Layout1->addWidget( LineEdit2, 1, 2 ); + + TextLabel2 = new QLabel( GroupBox1, "TextLabel2" ); + TextLabel2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel2->sizePolicy().hasHeightForWidth() ) ); + TextLabel2->setText( trUtf8( "TL2" ) ); + + Layout1->addWidget( TextLabel2, 1, 0 ); + + TextLabel1 = new QLabel( GroupBox1, "TextLabel1" ); + TextLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, TextLabel1->sizePolicy().hasHeightForWidth() ) ); + TextLabel1->setText( trUtf8( "TL1" ) ); + + Layout1->addWidget( TextLabel1, 0, 0 ); + + PushButton1 = new QPushButton( GroupBox1, "PushButton1" ); + PushButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton1->sizePolicy().hasHeightForWidth() ) ); + PushButton1->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton1, 0, 1 ); + + LineEdit1 = new QLineEdit( GroupBox1, "LineEdit1" ); + + Layout1->addWidget( LineEdit1, 0, 2 ); + + PushButton2 = new QPushButton( GroupBox1, "PushButton2" ); + PushButton2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, PushButton2->sizePolicy().hasHeightForWidth() ) ); + PushButton2->setText( trUtf8( "" ) ); + + Layout1->addWidget( PushButton2, 1, 1 ); + + GroupBox1Layout->addLayout( Layout1, 0, 0 ); + + MeasureGUI_2Sel1LineEdit_QTDLayout->addWidget( GroupBox1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_2Sel1LineEdit_QTD::~MeasureGUI_2Sel1LineEdit_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h b/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h new file mode 100644 index 000000000..eae9b2701 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_2Sel1LineEdit_QTD.h @@ -0,0 +1,66 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_2Sel1LineEdit_QTD.ui' +** +** Created: mar oct 28 16:11:14 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_2SEL1LINEEDIT_QTD_H +#define MEASUREGUI_2SEL1LINEEDIT_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QGroupBox; +class QLabel; +class QLineEdit; +class QPushButton; + +class MeasureGUI_2Sel1LineEdit_QTD : public QWidget +{ + Q_OBJECT + +public: + MeasureGUI_2Sel1LineEdit_QTD( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~MeasureGUI_2Sel1LineEdit_QTD(); + + QGroupBox* GroupBox1; + QLabel* TextLabel3; + QLineEdit* LineEdit3; + QLineEdit* LineEdit2; + QLabel* TextLabel2; + QLabel* TextLabel1; + QPushButton* PushButton1; + QLineEdit* LineEdit1; + QPushButton* PushButton2; + + +protected: + QGridLayout* MeasureGUI_2Sel1LineEdit_QTDLayout; + QGridLayout* GroupBox1Layout; + QGridLayout* Layout1; +}; + +#endif // MEASUREGUI_2SEL1LINEEDIT_QTD_H diff --git a/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx new file mode 100644 index 000000000..9191ebd34 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx @@ -0,0 +1,341 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : MeasureGUI_CenterMassDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "MeasureGUI_CenterMassDlg.h" +#include "MeasureGUI_1Sel3LineEdit_QTD.h" + +#include "utilities.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SalomeApp_Tools.h" + +#include +#include +#include +#include + +#include + +//================================================================================= +// class : MeasureGUI_CenterMassDlg() +// purpose : Constructs a MeasureGUI_CenterMassDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +MeasureGUI_CenterMassDlg::MeasureGUI_CenterMassDlg( QWidget* parent ) +: GEOMBase_Skeleton( parent, "MeasureGUI_CenterMassDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr( "ICON_DLG_CENTERMASS" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr( "ICON_SELECT" ) ) ); + + setCaption( tr( "GEOM_CMASS_TITLE" ) ); + + /***************************************************************/ + + GroupConstructors->setTitle( tr( "GEOM_CMASS" ) ); + RadioButton1->setPixmap( image0 ); + RadioButton2->close( TRUE ); + RadioButton3->close( TRUE ); + + myGrp = new MeasureGUI_1Sel3LineEdit_QTD( this, "myGrp" ); + myGrp->GroupBox1->setTitle( tr( "GEOM_CENTER" ) ); + myGrp->TextLabel1->setText( tr( "GEOM_OBJECT" ) ); + myGrp->TextLabel2->setText( tr( "GEOM_X" ) ); + myGrp->TextLabel3->setText( tr( "GEOM_Y" ) ); + myGrp->TextLabel4->setText( tr( "GEOM_Z" ) ); + myGrp->LineEdit2->setReadOnly( TRUE ); + myGrp->LineEdit3->setReadOnly( TRUE ); + myGrp->LineEdit4->setReadOnly( TRUE ); + myGrp->PushButton1->setPixmap( image1 ); + myGrp->LineEdit1->setReadOnly( true ); + + Layout1->addWidget( myGrp, 2, 0 ); + /***************************************************************/ + + /* Initialisation */ + Init(); +} + + +//================================================================================= +// function : ~MeasureGUI_CenterMassDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +MeasureGUI_CenterMassDlg::~MeasureGUI_CenterMassDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = myGrp->LineEdit1; + + /* signals and slots connections */ + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( myGrp->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect( myGrp->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_POINT") ); + globalSelection(); + SelectionIntoArgument(); + + /* displays Dialog */ + myGrp->show(); + this->show(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MeasureGUI_CenterMassDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; + +// myMeasureGUI->MakeCDGAndDisplay( myGeomShape ); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void MeasureGUI_CenterMassDlg::SelectionIntoArgument() +{ + erasePreview(); + myObj = GEOM::GEOM_Object::_nil(); + + if ( IObjectCount() != 1 ) + { + processObject(); + return; + } + + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if ( !testResult || aSelectedObject->_is_nil() ) + { + processObject(); + return; + } + + myObj = aSelectedObject; + processObject(); + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::SetEditCurrentArgument() +{ + myGrp->LineEdit1->setFocus(); + myEditCurrentArgument = myGrp->LineEdit1; + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::LineEditReturnPressed() +{ + QLineEdit* send = ( QLineEdit* )sender(); + if ( send == myGrp->LineEdit1 ) + { + myEditCurrentArgument = myGrp->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + globalSelection(); + displayPreview(); +} + +//================================================================================= +// function : processObject() +// purpose : Fill dialog fields in accordance with myObj +//================================================================================= +void MeasureGUI_CenterMassDlg::processObject() +{ + if ( myObj->_is_nil() ) + { + myGrp->LineEdit1->setText( "" ); + myGrp->LineEdit2->setText( "" ); + myGrp->LineEdit3->setText( "" ); + myGrp->LineEdit4->setText( "" ); + erasePreview(); + } + else + { + double x = 0, y = 0, z = 0; + + getParameters( x, y, z ); + + myGrp->LineEdit1->setText( GEOMBase::GetName( myObj ) ); + myGrp->LineEdit2->setText( QString( "%1" ).arg( x ) ); + myGrp->LineEdit3->setText( QString( "%1" ).arg( y ) ); + myGrp->LineEdit4->setText( QString( "%1" ).arg( z ) ); + + displayPreview(); + } +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void MeasureGUI_CenterMassDlg::enterEvent( QEvent* e ) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_CenterMassDlg::createOperation() +{ + return getGeomEngine()->GetIMeasureOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_CenterMassDlg::isValid( QString& ) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_CenterMassDlg::getParameters( double& theX, double& theY, double& theZ ) +{ + if ( myObj->_is_nil() ) + return false; + else + { + try + { + GEOM::GEOM_Object_var anObj; + anObj = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() )->GetCentreOfMass( myObj ); + if ( !getOperation()->IsDone() ) + return false; + + TopoDS_Shape aShape; + if ( !GEOMBase::GetShape( anObj, aShape ) || + aShape.IsNull() || + aShape.ShapeType() != TopAbs_VERTEX ) + return false; + + TopoDS_Vertex aVertex = TopoDS::Vertex( aShape ); + + gp_Pnt aPnt = BRep_Tool::Pnt( aVertex ); + + theX = aPnt.X(); + theY = aPnt.Y(); + theZ = aPnt.Z(); + + return true; + } + catch( const SALOME::SALOME_Exception& e ) + { + SalomeApp_Tools::QtCatchCorbaException( e ); + return false; + } + } +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_CenterMassDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + anObj = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() )->GetCentreOfMass( myObj ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + diff --git a/src/MeasureGUI/MeasureGUI_PointDlg.cxx b/src/MeasureGUI/MeasureGUI_PointDlg.cxx new file mode 100644 index 000000000..7db3bee11 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_PointDlg.cxx @@ -0,0 +1,223 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : MeasureGUI_PointDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "MeasureGUI_PointDlg.h" +#include "GEOMBase.h" + +#include "utilities.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//================================================================================= +// class : MeasureGUI_PointDlg() +// purpose : Constructs a MeasureGUI_PointDlg which is a child of 'parent' +// +//================================================================================= +MeasureGUI_PointDlg::MeasureGUI_PointDlg( GeometryGUI* GUI, QWidget* parent ) +: MeasureGUI_Skeleton( GUI, parent, "MeasureGUI_PointDlg" ) +{ + QPixmap iconPnt( SUIT_Session::session()->resourceMgr()->loadPixmap( + "GEOM",tr( "ICON_DLG_POINT" ) ) ); + + QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( + "GEOM",tr( "ICON_SELECT" ) ) ); + + setCaption( tr( "CAPTION" ) ); + + GroupConstructors->setTitle( tr( "CAPTION" ) ); + RadioButton1->setPixmap( iconPnt ); + + QGroupBox* aGrp = new QGroupBox( 2, Qt::Horizontal, tr( "COORDINATES" ), this ); + + new QLabel( tr( "POINT" ), aGrp ); + QFrame* aFrame = new QFrame( aGrp ); + mySelBtn = new QPushButton( aFrame ); + mySelBtn->setPixmap( iconSelect ); + mySelEdit = new QLineEdit( aFrame ); + QHBoxLayout* aLay = new QHBoxLayout( aFrame, 0, 10 ); + aLay->addWidget( mySelBtn ); + aLay->addWidget( mySelEdit ); + + new QLabel( tr( "X" ), aGrp ); + myX = new QLineEdit( aGrp ); + new QLabel( tr( "Y" ), aGrp ); + myY = new QLineEdit( aGrp ); + new QLabel( tr( "Z" ), aGrp ); + myZ = new QLineEdit( aGrp ); + + mySelEdit->setReadOnly( true ); + myX->setReadOnly( true ); + myY->setReadOnly( true ); + myZ->setReadOnly( true ); + + Layout1->addWidget( aGrp, 1, 0 ); + + Init(); +} + + +//================================================================================= +// function : ~MeasureGUI_PointDlg() +// purpose : Destroys the object and frees any allocated resources +//======================myX->setReadOnly( true );=========================================================== +MeasureGUI_PointDlg::~MeasureGUI_PointDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MeasureGUI_PointDlg::Init() +{ + QSize aSize( size() ); + resize( (int)(aSize.width() *0.75 ), aSize.height() ); + MeasureGUI_Skeleton::Init(); +} + +//================================================================================= +// function : activateSelection +// purpose : +//================================================================================= +void MeasureGUI_PointDlg::activateSelection() +{ + localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); +} + +//================================================================================= +// function : SelectionIntoArgument +// purpose : +//================================================================================= +void MeasureGUI_PointDlg::SelectionIntoArgument() +{ + try + { + myObj = GEOM::GEOM_Object::_nil(); + mySelEdit->setText( "" ); + myX->setText( "" ); + myY->setText( "" ); + myZ->setText( "" ); + + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if( !testResult || aSelectedObject->_is_nil() ) + return; + + myObj = aSelectedObject; + + TColStd_IndexedMapOfInteger anIndexes; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))-> + selectionMgr()->GetIndexes( firstIObject(), anIndexes ); + + TopoDS_Shape aShape; + if ( anIndexes.Extent() > 1 || !GEOMBase::GetShape( myObj, aShape ) || aShape.IsNull() ) + return; + + TopoDS_Vertex aPoint; + QString aName = GEOMBase::GetName( myObj ); + if ( anIndexes.Extent() == 0 ) + { + if ( aShape.ShapeType() == TopAbs_VERTEX ) + aPoint = TopoDS::Vertex( aShape ); + } + else + { + int i = anIndexes( 1 ); + + TopTools_IndexedMapOfShape aShapes; + TopExp::MapShapes( aShape, aShapes ); + + if ( aShape != aShapes( i ) ) + aName += QString( ":%1" ).arg( i ); + + aPoint = TopoDS::Vertex( aShapes( i ) ); + } + + if ( !aPoint.IsNull() ) + { + gp_Pnt aPnt = BRep_Tool::Pnt( aPoint ); + mySelEdit->setText( aName ); + myX->setText( QString( "%1" ).arg( aPnt.X() ) ); + myY->setText( QString( "%1" ).arg( aPnt.Y() ) ); + myZ->setText( QString( "%1" ).arg( aPnt.Z() ) ); + } + } + catch( ... ) + { + myObj = GEOM::GEOM_Object::_nil(); + mySelEdit->setText( "" ); + myX->setText( "" ); + myY->setText( "" ); + myZ->setText( "" ); + } +} + + + + + + + + + + + + + + + + + + + + diff --git a/src/MeasureGUI/MeasureGUI_Skeleton.cxx b/src/MeasureGUI/MeasureGUI_Skeleton.cxx new file mode 100644 index 000000000..bbfdb0741 --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_Skeleton.cxx @@ -0,0 +1,344 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : MeasureGUI_Skeleton.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "MeasureGUI_Skeleton.h" +#include "GEOMBase.h" +#include "GEOM_Displayer.h" +#include "GeometryGUI.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SalomeApp_Tools.h" +#include "SUIT_Session.h" +#include "SUIT_OverrideCursor.h" + +#include +#include +#include +#include +#include +#include + +//================================================================================= +// class : MeasureGUI_Skeleton() +// purpose : Constructs a MeasureGUI_Skeleton which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +MeasureGUI_Skeleton::MeasureGUI_Skeleton( GeometryGUI* GUI, + QWidget* parent, + const char* name ) +: MeasureGUI_Skeleton_QTD( parent, name, false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ), + GEOMBase_Helper( dynamic_cast( parent ) ), + myGeomGUI( GUI ) +{ + + mySelBtn = 0; + mySelEdit = 0; + myDisplayer = 0; + + if ( !name ) + setName( "MeasureGUI_Skeleton" ); + + buttonClose->setText( tr( "GEOM_BUT_CLOSE" ) ); + + buttonClose->setAutoDefault( false ); + + GroupMedium->close( TRUE ); + resize( 350, 0 ); +} + + +//================================================================================= +// function : ~MeasureGUI_Skeleton() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +MeasureGUI_Skeleton::~MeasureGUI_Skeleton() +{ + myGeomGUI->SetActiveDialogBox( 0 ); + delete myDisplayer; +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::Init() +{ + /* init variables */ + myGeomGUI->SetActiveDialogBox((QDialog*)this); + + /* signals and slots connections */ + + connect( buttonClose, SIGNAL( clicked() ), + this, SLOT( ClickOnCancel() ) ); + + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), + this, SLOT ( DeactivateActiveDialog() ) ); + + connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ), + this, SLOT ( ClickOnCancel() ) ); + + connect( mySelEdit, SIGNAL( returnPressed() ), + this, SLOT( LineEditReturnPressed() ) ); + + connect( mySelBtn, SIGNAL( clicked() ), + this, SLOT ( SetEditCurrentArgument() ) ); + + LightApp_SelectionMgr* aSel = ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(); + if ( aSel ) + connect( aSel, SIGNAL( currentSelectionChanged() ), + this, SLOT ( SelectionIntoArgument() ) ) ; + + /* displays Dialog */ + RadioButton1->setChecked( TRUE ); + + activateSelection(); + SelectionIntoArgument(); + show(); +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::ClickOnCancel() +{ + close(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::LineEditReturnPressed() +{ + /* User name of object input management */ + /* If successfull the selection is changed and signal emitted... */ + /* so SelectionIntoArgument() is automatically called. */ + + const QString objectUserName = mySelEdit->text(); + QWidget* thisWidget = ( QWidget* )this; + + if ( GEOMBase::SelectionByNameInDialogs( thisWidget, objectUserName, selectedIO() ) ) + mySelEdit->setText( objectUserName ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::DeactivateActiveDialog() +{ + setEnabled( false ); + + LightApp_SelectionMgr* aSel = ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(); + if ( aSel ) + disconnect( aSel, 0, this, 0 ); + + myGeomGUI->SetActiveDialogBox( 0 ); + + globalSelection(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::ActivateThisDialog() +{ + myGeomGUI->EmitSignalDeactivateDialog(); + + setEnabled( true ); + + myGeomGUI->SetActiveDialogBox( ( QDialog* )this ); + + LightApp_SelectionMgr* aSel = ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(); + if ( aSel ) + connect( aSel, SIGNAL( currentSelectionChanged() ), + this, SLOT ( SelectionIntoArgument() ) ) ; + + redisplayPreview(); + activateSelection(); +} + +//================================================================================= +// function : SetEditCurrentArgument +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::SetEditCurrentArgument() +{ + mySelEdit->setFocus(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : SelectionIntoArgument +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::SelectionIntoArgument() +{ + myObj = GEOM::GEOM_Object::_nil(); + + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if( !testResult || aSelectedObject->_is_nil() ) + { + mySelEdit->setText( "" ); + processObject(); + erasePreview(); + return; + } + + myObj = aSelectedObject; + mySelEdit->setText( GEOMBase::GetName( myObj ) ); + processObject(); + redisplayPreview(); +} + +//================================================================================= +// function : processObject +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::processObject() +{ +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::closeEvent( QCloseEvent* e ) +{ + LightApp_SelectionMgr* aSel = ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(); + if ( aSel ) + disconnect( aSel, 0, this, 0 ); + QDialog::closeEvent( e ); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::enterEvent(QEvent* e) +{ + if ( GroupConstructors->isEnabled() ) + return; + + ActivateThisDialog(); +} + +//================================================================================= +// function : buildPrs +// purpose : Build presentation for "preview" +//================================================================================= +SALOME_Prs* MeasureGUI_Skeleton::buildPrs() +{ + return 0; +} + +//================================================================================= +// function : closeEvent() +// purpose : Build presentation for "preview" +//================================================================================= +void MeasureGUI_Skeleton::redisplayPreview() +{ + QString aMess; + if ( !isValid( aMess ) ) + { + erasePreview( true ); + return; + } + + erasePreview( false ); + + try + { + SUIT_OverrideCursor(); + + getDisplayer()->SetColor( Quantity_NOC_VIOLET ); + getDisplayer()->SetToActivate( false ); + + if ( SALOME_Prs* aPrs = buildPrs() ) + displayPreview( aPrs ); + } + catch( const SALOME::SALOME_Exception& e ) + { + SalomeApp_Tools::QtCatchCorbaException( e ); + } + +} + +//================================================================================= +// function : activateSelection +// purpose : +//================================================================================= +void MeasureGUI_Skeleton::activateSelection() +{ + globalSelection( GEOM_ALLSHAPES ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_Skeleton::isValid( QString& ) +{ + return !myObj->_is_nil(); +} + +//================================================================ +// Function : getDisplayer +// Purpose : +//================================================================ +GEOM_Displayer* MeasureGUI_Skeleton::getDisplayer() +{ + if ( !myDisplayer ) + myDisplayer = new GEOM_Displayer( getStudy() ); + return myDisplayer; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_Skeleton::createOperation() +{ + return getGeomEngine()->GetIMeasureOperations( getStudyId() ); +} + diff --git a/src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx b/src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx new file mode 100644 index 000000000..343064b7e --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_Skeleton_QTD.cxx @@ -0,0 +1,118 @@ +// 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/ +// +/**************************************************************************** +** Form implementation generated from reading ui file 'MeasureGUI_Skeleton_QTD.ui' +** +** Created: lun oct 27 11:23:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#include "MeasureGUI_Skeleton_QTD.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Constructs a MeasureGUI_Skeleton_QTD which is a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +MeasureGUI_Skeleton_QTD::MeasureGUI_Skeleton_QTD( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + if ( !name ) + setName( "MeasureGUI_Skeleton_QTD" ); + resize( 228, 266 ); + setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)7, 0, 0, sizePolicy().hasHeightForWidth() ) ); + setCaption( trUtf8( "MeasureGUI_Skeleton_QTD" ) ); + setSizeGripEnabled( TRUE ); + MeasureGUI_Skeleton_QTDLayout = new QGridLayout( this, 1, 1, 11, 6, "MeasureGUI_Skeleton_QTDLayout"); + + Layout1 = new QGridLayout( 0, 1, 1, 0, 6, "Layout1"); + + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, GroupButtons->sizePolicy().hasHeightForWidth() ) ); + GroupButtons->setTitle( trUtf8( "" ) ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 6 ); + GroupButtons->layout()->setMargin( 11 ); + GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + + Layout3 = new QGridLayout( 0, 1, 1, 0, 6, "Layout3"); + QSpacerItem* spacer = new QSpacerItem( 120, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); + Layout3->addItem( spacer, 0, 2 ); + QSpacerItem* spacer_2 = new QSpacerItem( 120, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); + Layout3->addItem( spacer_2, 0, 0 ); + + buttonClose = new QPushButton( GroupButtons, "buttonClose" ); + buttonClose->setText( trUtf8( "&Close" ) ); + + Layout3->addWidget( buttonClose, 0, 1 ); + + GroupButtonsLayout->addLayout( Layout3, 0, 0 ); + + Layout1->addWidget( GroupButtons, 2, 0 ); + + GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); + GroupConstructors->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, GroupConstructors->sizePolicy().hasHeightForWidth() ) ); + GroupConstructors->setTitle( trUtf8( "" ) ); + GroupConstructors->setColumnLayout(0, Qt::Vertical ); + GroupConstructors->layout()->setSpacing( 6 ); + GroupConstructors->layout()->setMargin( 11 ); + GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() ); + GroupConstructorsLayout->setAlignment( Qt::AlignTop ); + + Layout2 = new QHBoxLayout( 0, 0, 6, "Layout2"); + + RadioButton1 = new QRadioButton( GroupConstructors, "RadioButton1" ); + RadioButton1->setText( trUtf8( "" ) ); + Layout2->addWidget( RadioButton1 ); + + GroupConstructorsLayout->addLayout( Layout2, 0, 0 ); + + Layout1->addWidget( GroupConstructors, 0, 0 ); + + GroupMedium = new QGroupBox( this, "GroupMedium" ); + GroupMedium->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, GroupMedium->sizePolicy().hasHeightForWidth() ) ); + GroupMedium->setTitle( trUtf8( "" ) ); + + Layout1->addWidget( GroupMedium, 1, 0 ); + + MeasureGUI_Skeleton_QTDLayout->addLayout( Layout1, 0, 0 ); +} + +/* + * Destroys the object and frees any allocated resources + */ +MeasureGUI_Skeleton_QTD::~MeasureGUI_Skeleton_QTD() +{ + // no need to delete child widgets, Qt does it all for us +} + diff --git a/src/MeasureGUI/MeasureGUI_Skeleton_QTD.h b/src/MeasureGUI/MeasureGUI_Skeleton_QTD.h new file mode 100644 index 000000000..90145bfaa --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_Skeleton_QTD.h @@ -0,0 +1,65 @@ +// 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/ +// +/**************************************************************************** +** Form interface generated from reading ui file 'MeasureGUI_Skeleton_QTD.ui' +** +** Created: lun oct 27 11:23:09 2003 +** by: The User Interface Compiler (uic) +** +** WARNING! All changes made in this file will be lost! +****************************************************************************/ +#ifndef MEASUREGUI_SKELETON_QTD_H +#define MEASUREGUI_SKELETON_QTD_H + +#include +#include +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QButtonGroup; +class QGroupBox; +class QPushButton; +class QRadioButton; + +class MeasureGUI_Skeleton_QTD : public QDialog +{ + Q_OBJECT + +public: + MeasureGUI_Skeleton_QTD( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~MeasureGUI_Skeleton_QTD(); + + QGroupBox* GroupButtons; + QPushButton* buttonClose; + QButtonGroup* GroupConstructors; + QRadioButton* RadioButton1; + QGroupBox* GroupMedium; + + +protected: + QGridLayout* MeasureGUI_Skeleton_QTDLayout; + QGridLayout* Layout1; + QGridLayout* GroupButtonsLayout; + QGridLayout* Layout3; + QGridLayout* GroupConstructorsLayout; + QHBoxLayout* Layout2; +}; + +#endif // MEASUREGUI_SKELETON_QTD_H diff --git a/src/MeasureGUI/UIFiles/ui_to_cxx b/src/MeasureGUI/UIFiles/ui_to_cxx new file mode 100755 index 000000000..07db6a8f4 --- /dev/null +++ b/src/MeasureGUI/UIFiles/ui_to_cxx @@ -0,0 +1,38 @@ +// 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/ +// +#!/bin/sh + +#uic -o MeasureGUI_Skeleton_QTD.h MeasureGUI_Skeleton_QTD.ui +#uic -o MeasureGUI_Skeleton_QTD.cxx -impl MeasureGUI_Skeleton_QTD.h MeasureGUI_Skeleton_QTD.ui + +uic -o MeasureGUI_1Sel3LineEdit_QTD.h MeasureGUI_1Sel3LineEdit_QTD.ui +uic -o MeasureGUI_1Sel3LineEdit_QTD.cxx -impl MeasureGUI_1Sel3LineEdit_QTD.h MeasureGUI_1Sel3LineEdit_QTD.ui + +uic -o MeasureGUI_1Sel6LineEdit_QTD.h MeasureGUI_1Sel6LineEdit_QTD.ui +uic -o MeasureGUI_1Sel6LineEdit_QTD.cxx -impl MeasureGUI_1Sel6LineEdit_QTD.h MeasureGUI_1Sel6LineEdit_QTD.ui + +uic -o MeasureGUI_1Sel12LineEdit_QTD.h MeasureGUI_1Sel12LineEdit_QTD.ui +uic -o MeasureGUI_1Sel12LineEdit_QTD.cxx -impl MeasureGUI_1Sel12LineEdit_QTD.h MeasureGUI_1Sel12LineEdit_QTD.ui + +uic -o MeasureGUI_2Sel1LineEdit_QTD.h MeasureGUI_2Sel1LineEdit_QTD.ui +uic -o MeasureGUI_2Sel1LineEdit_QTD.cxx -impl MeasureGUI_2Sel1LineEdit_QTD.h MeasureGUI_2Sel1LineEdit_QTD.ui + +#uic -o MeasureGUI_1Sel1TextView_QTD.h MeasureGUI_1Sel1TextView_QTD.ui +#uic -o MeasureGUI_1Sel1TextView_QTD.cxx -impl MeasureGUI_1Sel1TextView_QTD.h MeasureGUI_1Sel1TextView_QTD.ui diff --git a/src/NMTAlgo/Makefile.in b/src/NMTAlgo/Makefile.in new file mode 100644 index 000000000..a79769aac --- /dev/null +++ b/src/NMTAlgo/Makefile.in @@ -0,0 +1,70 @@ +# GEOM NMTAlgo : partition algorithm +# +# 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.org +# +# +# +# File : Makefile.in +# Author : Julia DOROVSKIKH +# Module : GEOM +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + + +@COMMENCE@ + +# Libraries targets +LIB = libNMTAlgo.la +LIB_SRC = \ + NMTAlgo_Algo.cxx \ + NMTAlgo_Builder.cxx \ + NMTAlgo_Loop3d.cxx \ + NMTAlgo_Splitter.cxx \ + NMTAlgo_Splitter1.cxx \ + NMTAlgo_Splitter_1.cxx \ + NMTAlgo_Splitter_2.cxx \ + NMTAlgo_Tools.cxx + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# header files +EXPORT_HEADERS = \ + NMTAlgo_Splitter1.hxx \ + NMTAlgo_Splitter.hxx \ + NMTAlgo_Builder.hxx \ + NMTAlgo_Algo.hxx + +# idl files +EXPORT_IDLS= + + +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += $(CAS_LDPATH) -lTKBool -lTKBO -lNMTTools -L${KERNEL_ROOT_DIR}/lib/salome + +%_moc.cxx: %.h + $(MOC) $< -o $@ + +@CONCLUDE@ diff --git a/src/NMTAlgo/NMTAlgo.cdl b/src/NMTAlgo/NMTAlgo.cdl new file mode 100644 index 000000000..7fce9ebb9 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo.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/ +// +-- File: NMTAlgo.cdl +-- Created: Tue Jan 27 14:39:05 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +package NMTAlgo + + ---Purpose: + +uses + TCollection, + TColStd, + gp, + TopAbs, + TopoDS, + TopTools, + + BooleanOperations, + BOPTColStd, + IntTools, + BOPTools, + BOP, + + NMTDS, + NMTTools, + + BRep, + BRepAlgo + +is + deferred class Algo; + class Splitter; + class Splitter1; --modified by NIZNHY-PKV Wed Feb 11 14:28:50 2004 + class Builder; + class Tools; + class Loop3d; + +end NMTAlgo; diff --git a/src/NMTAlgo/NMTAlgo_Algo.cdl b/src/NMTAlgo/NMTAlgo_Algo.cdl new file mode 100644 index 000000000..a27cf6463 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Algo.cdl @@ -0,0 +1,78 @@ +// 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/ +// +-- File: NMTAlgo_Algo.cdl +-- Created: Tue Jan 27 14:41:04 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +deferred class Algo from NMTAlgo + + ---Purpose: + +uses + Shape from TopoDS, + + DSFiller from NMTTools, + PDSFiller from NMTTools + +--raises + +is + Initialize + returns Algo from NMTAlgo; + ---C++: alias "Standard_EXPORT virtual ~NMTAlgo_Algo();" + + + SetFiller(me:out; + aDSF: DSFiller from NMTTools); + + Filler(me) + returns DSFiller from NMTTools; + ---C++: return const & + + ComputeWithFiller(me:out; + aDSF: DSFiller from NMTTools) + is virtual; + + Clear (me:out) + is virtual; + + Shape (me) + returns Shape from TopoDS; + ---C++: return const & + + IsDone(me) + returns Boolean from Standard; + + ErrorStatus (me) + returns Integer from Standard; + +fields + myDSFiller : PDSFiller from NMTTools is protected; + myShape : Shape from TopoDS is protected; + -- + myIsDone : Boolean from Standard is protected; + myIsComputed : Boolean from Standard is protected; + myErrorStatus : Integer from Standard is protected; + myDraw : Integer from Standard is protected; + +end Algo; diff --git a/src/NMTAlgo/NMTAlgo_Algo.cxx b/src/NMTAlgo/NMTAlgo_Algo.cxx new file mode 100644 index 000000000..82b04d14b --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Algo.cxx @@ -0,0 +1,138 @@ +// 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/ +// +// File: NMTAlgo_Algo.cxx +// Created: Tue Jan 27 14:58:21 2004 +// Author: Peter KURNEV +// + + +#include +#include +//======================================================================= +// function: NMTAlgo_Algo::NMTAlgo_Algo +// purpose: +//======================================================================= + NMTAlgo_Algo::NMTAlgo_Algo() +: + myDSFiller(NULL), + myIsDone(Standard_False), + myIsComputed(Standard_False), + myErrorStatus(1) +{ + myDraw=0; + // + char* xr=getenv("MDISP"); + if (xr!=NULL) { + if (!strcmp (xr, "yes")) { + myDraw=1; + } + } +} +//======================================================================= +// function: NMTAlgo_Algo +// purpose: +//======================================================================= + NMTAlgo_Algo::~NMTAlgo_Algo() +{ + Clear(); +} +//======================================================================= +// function: Clear +// purpose: +//======================================================================= + void NMTAlgo_Algo::Clear() +{ + myIsDone=Standard_False; + myIsComputed=Standard_False; + myErrorStatus=1; +} +//======================================================================= +// function: SetFiller +// purpose: +//======================================================================= + void NMTAlgo_Algo::SetFiller(const NMTTools_DSFiller& aDSF) +{ + myDSFiller=(NMTTools_DSFiller *)&aDSF; +} +//======================================================================= +// function: Filler +// purpose: +//======================================================================= + const NMTTools_DSFiller& NMTAlgo_Algo::Filler()const +{ + return *myDSFiller; +} +//======================================================================= +// function: ComputeWithFiller +// purpose: +//======================================================================= + void NMTAlgo_Algo::ComputeWithFiller(const NMTTools_DSFiller& aDSF) +{ + SetFiller(aDSF); +} +//======================================================================= +// function: Shape +// purpose: +//======================================================================= + const TopoDS_Shape& NMTAlgo_Algo::Shape()const +{ + return myShape; +} +//======================================================================= +// function: IsDone +// purpose: +//======================================================================= + Standard_Boolean NMTAlgo_Algo::IsDone()const +{ + return myIsDone; +} +//======================================================================= +// function: ErrorStatus +// purpose: +//======================================================================= + Standard_Integer NMTAlgo_Algo::ErrorStatus()const +{ + return myErrorStatus; +} +/* +//======================================================================= +// function: Compute +// purpose: +//======================================================================= + void NMTAlgo_Algo::Compute() +{ +} +//======================================================================= +// function: SetCompositeShape +// purpose: +//======================================================================= + void NMTAlgo_Algo::SetCompositeShape(const TopoDS_Shape& aS) +{ + myCompositeShape=aS; +} +//======================================================================= +// function: CompositeShape +// purpose: +//======================================================================= + const TopoDS_Shape& NMTAlgo_Algo::CompositeShape()const +{ + return myCompositeShape; +} +*/ diff --git a/src/NMTAlgo/NMTAlgo_Algo.jxx b/src/NMTAlgo/NMTAlgo_Algo.jxx new file mode 100644 index 000000000..919494580 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Algo.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _NMTTools_DSFiller_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Algo_HeaderFile +#include +#endif diff --git a/src/NMTAlgo/NMTAlgo_Builder.cdl b/src/NMTAlgo/NMTAlgo_Builder.cdl new file mode 100644 index 000000000..6f1aa3291 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Builder.cdl @@ -0,0 +1,98 @@ +// 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/ +// +-- File: NMTAlgo_Builder.cdl +-- Created: Tue Jan 27 15:09:45 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Builder from NMTAlgo + inherits Algo from NMTAlgo + + ---Purpose: + +uses + Shape from TopoDS, + Face from TopoDS, + Edge from TopoDS, + IndexedMapOfShape from TopTools, + IndexedDataMapOfShapeListOfShape from TopTools, + IndexedDataMapOfShapeShape from TopTools, + Image from BRepAlgo, + DSFiller from NMTTools +--raises + +is + Create + returns Builder from NMTAlgo; + ---C++: alias "Standard_EXPORT virtual ~NMTAlgo_Builder();" + + Clear (me:out) + is redefined; + + ComputeWithFiller(me:out; + aDSF: DSFiller from NMTTools) + is redefined; + + FillImagesEdges (me:out) + is protected; + + FillIn2DParts (me:out) + is protected; + + FillImagesFaces (me:out) + is protected; + + FillSDFaces (me:out) + is protected; + + --- Queries + SplitVertices (me:out) + is protected; + + IsSectionEdge (me; + E : Edge from TopoDS) + returns Boolean from Standard + is protected; + + HasSameDomainF(me; + F : Face from TopoDS) + returns Boolean from Standard + is protected; + + IsSameDomainF(me; + F1 : Face from TopoDS; + F2 : Face from TopoDS) + returns Boolean from Standard + is protected; + +fields + + myImagesEdges : Image from BRepAlgo is protected; + myImagesFaces : Image from BRepAlgo is protected; + + myQueryShapes : IndexedMapOfShape from TopTools is protected; + -- + myIn2DParts : IndexedDataMapOfShapeListOfShape from TopTools is protected; + mySectionParts : IndexedDataMapOfShapeListOfShape from TopTools is protected; + mySDFaces : IndexedDataMapOfShapeShape from TopTools is protected; + -- +end Builder; diff --git a/src/NMTAlgo/NMTAlgo_Builder.cxx b/src/NMTAlgo/NMTAlgo_Builder.cxx new file mode 100644 index 000000000..7be4895b3 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Builder.cxx @@ -0,0 +1,668 @@ +// 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/ +// +// File: NMTAlgo_Inter3d.cxx +// Created: Tue Jan 27 15:14:13 2004 +// 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 +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +// function: NMTAlgo_Inter3d::NMTAlgo_Inter3d() +// purpose: +//======================================================================= + NMTAlgo_Builder::NMTAlgo_Builder() +: + NMTAlgo_Algo() +{ +} +//======================================================================= +// function: ~NMTAlgo_Builder +// purpose: +//======================================================================= + NMTAlgo_Builder::~NMTAlgo_Builder() +{ + Clear(); +} +//======================================================================= +// function: Clear +// purpose: +//======================================================================= + void NMTAlgo_Builder::Clear() +{ + NMTAlgo_Algo::Clear(); + // + myImagesEdges.Clear(); + myImagesFaces.Clear(); + myIn2DParts.Clear(); + mySectionParts.Clear(); + mySDFaces.Clear(); +} +//======================================================================= +// function: ComputeWithFiller +// purpose: +//======================================================================= + void NMTAlgo_Builder::ComputeWithFiller(const NMTTools_DSFiller& aDSF) +{ + myErrorStatus=0; + myIsDone=Standard_False; + // + SetFiller(aDSF); + // edges + FillImagesEdges(); + // faces + FillIn2DParts(); + FillImagesFaces(); + FillSDFaces(); +} + +//======================================================================= +// function: FillSDFaces +// purpose: +//======================================================================= + void NMTAlgo_Builder::FillSDFaces() +{ + const NMTDS_ShapesDataStructure& aDS=myDSFiller->DS(); + NMTTools_PaveFiller* pPF=(NMTTools_PaveFiller*)&(myDSFiller->PaveFiller()); + BOPTools_InterferencePool* pIP=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); + BOPTools_CArray1OfSSInterference& aFFs=pIP->SSInterferences(); + IntTools_Context& aCtx= pPF->ChangeContext(); + // + Standard_Boolean bIsSDF; + Standard_Integer i, j, aNbFF, nF1, nF2, aNbPBInOn, aNbC; + TopTools_ListIteratorOfListOfShape aItF1, aItF2; + NMTTools_ListOfCoupleOfShape aLCS; + // + mySDFaces.Clear(); + // + // 1. For each FF find among images of faces + // all pairs of same domain faces (SDF) [=> aLCS] + aNbFF=aFFs.Extent(); + for (i=1; i<=aNbFF; ++i) { + BOPTools_SSInterference& aFF=aFFs(i); + aFF.Indices(nF1, nF2); + // + const TopoDS_Face& aF1=TopoDS::Face(aDS.Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(aDS.Shape(nF2)); + // + // if there are no in/on 2D split parts the faces nF1, nF2 + // can not be SDF + const BOPTools_ListOfPaveBlock& aLPBInOn=aFF.PaveBlocks(); + aNbPBInOn=aLPBInOn.Extent(); + if (!aNbPBInOn) { + continue; + } + // + // if there is at least one section edge between faces nF1, nF2 + // they can not be SDF + BOPTools_SequenceOfCurves& aSC=aFF.Curves(); + aNbC=aSC.Length(); + if (aNbC) { + continue; + } + // + // the faces are suspected to be SDF. + // Try to find SDF among images of nF1, nF2 + const TopTools_ListOfShape& aLF1=myImagesFaces.Image(aF1); + const TopTools_ListOfShape& aLF2=myImagesFaces.Image(aF2); + // + aItF1.Initialize(aLF1); + for (; aItF1.More(); aItF1.Next()) { + const TopoDS_Face& aF1x=TopoDS::Face(aItF1.Value()); + // + aItF2.Initialize(aLF2); + for (; aItF2.More(); aItF2.Next()) { + const TopoDS_Face& aF2y=TopoDS::Face(aItF2.Value()); + bIsSDF=NMTTools_Tools::AreFacesSameDomain(aF1x, aF2y, aCtx); + if (bIsSDF) { + NMTTools_CoupleOfShape aCS; + // + aCS.SetShape1(aF1x); + aCS.SetShape2(aF2y); + aLCS.Append(aCS); + } + } + } + }//for (i=1; i<=aNbFF; ++i) + // + aNbC=aLCS.Extent(); + if (!aNbC) { + return; + } + // + // 2. Find Chains + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape aMC; + // + NMTTools_Tools::FindChains(aLCS, aMC); + // + // 3. Fill the map of SDF mySDFaces + aNbC=aMC.Extent(); + for (i=1; i<=aNbC; ++i) { + const TopoDS_Shape& aF=aMC.FindKey(i); + const TopTools_IndexedMapOfShape& aMSDF=aMC(i); + // + aNbFF=aMSDF.Extent(); + for (j=1; j<=aNbFF; ++j) { + const TopoDS_Shape& aFSD=aMSDF(j); + mySDFaces.Add(aFSD, aF); + } + } + // +} +//======================================================================= +// function: FillImagesFaces +// purpose: +//======================================================================= + void NMTAlgo_Builder::FillImagesFaces() +{ + const NMTDS_ShapesDataStructure& aDS=myDSFiller->DS(); + NMTTools_PaveFiller* pPF=(NMTTools_PaveFiller*)&(myDSFiller->PaveFiller()); + IntTools_Context& aCtx= pPF->ChangeContext(); + // + Standard_Integer i, j, aNb, aNbE; + TopTools_IndexedMapOfShape aMFence, aME; + TColStd_IndexedMapOfInteger aMFP; + // + // 1. Select Faces to process (MFP) + aNb=aDS.NumberOfShapesOfTheObject(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aF=aDS.Shape(i); + if (aF.ShapeType()!=TopAbs_FACE) { + continue; + } + if (aMFence.Contains(aF)) { + continue; + } + aMFence.Add(aF); + // + if (myIn2DParts.Contains(aF)) { + aMFP.Add(i); + continue; + } + // + if (mySectionParts.Contains(aF)) { + aMFP.Add(i); + continue; + } + // + aME.Clear(); + TopExp::MapShapes(aF, TopAbs_EDGE, aME); + // + aNbE=aME.Extent(); + for(j=1; j<=aNbE; ++j) { + const TopoDS_Shape& aE=aME(j); + // + if (myImagesEdges.HasImage(aE)) { + aMFP.Add(i); + break; + } + } + }// for (i=1; i<=aNb; ++i) + // + // 2. ProcessFaces + Standard_Boolean bToReverse, bIsClosed, bIsDegenerated; + Standard_Integer aNbF, nF; + TopoDS_Face aFF; + TopoDS_Edge aSp; + TopExp_Explorer anExp; + TopTools_ListIteratorOfListOfShape aIt; + BRepAlgo_Image aImagesFaces; + TopAbs_Orientation anOriF; + // + aNbF=aMFP.Extent(); + for (i=1; i<=aNbF; ++i) { + nF=aMFP(i); + const TopoDS_Face& aF=TopoDS::Face(aDS.Shape(nF)); + anOriF=aF.Orientation(); + aFF=aF; + aFF.Orientation(TopAbs_FORWARD); + // + aMFence.Clear(); + // + // 2.1. Fill WES + BOP_WireEdgeSet aWES; + aWES.Initialize(aFF); + // + // 2.1.1. Add Split parts + anExp.Init(aFF, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(anExp.Current()); + // + if (!myImagesEdges.HasImage(aE)) { + aWES.AddStartElement(aE); + continue; + } + // + bIsDegenerated=BRep_Tool::Degenerated(aE); + bIsClosed=BRep_Tool::IsClosed(aE, aF); + // + const TopTools_ListOfShape& aLIE=myImagesEdges.Image(aE); + aIt.Initialize(aLIE); + for (; aIt.More(); aIt.Next()) { + aSp=TopoDS::Edge(aIt.Value()); + // + if (bIsDegenerated) { + aSp.Orientation(aE.Orientation()); + aWES.AddStartElement(aSp); + continue; + } + // + if (bIsClosed){ + if (!aMFence.Contains(aSp)){ + aMFence.Add(aSp); + // + if (!BRep_Tool::IsClosed(aSp, aF)){ + BOPTools_Tools3D::DoSplitSEAMOnFace(aSp, aF); + } + // + aSp.Orientation(TopAbs_FORWARD); + aWES.AddStartElement(aSp); + // + aSp.Orientation(TopAbs_REVERSED); + aWES.AddStartElement(aSp); + continue; + } + } + // + bToReverse=BOPTools_Tools3D::IsSplitToReverse1(aSp, aE, aCtx); + if (bToReverse) { + aSp.Reverse(); + } + aWES.AddStartElement(aSp); + } + } + // + // 2.1.2. Add In2D Parts + if (myIn2DParts.Contains(aF)) { + const TopTools_ListOfShape& aLE=myIn2DParts.FindFromKey(aF); + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + aSp=TopoDS::Edge(aIt.Value()); + // + aSp.Orientation(TopAbs_FORWARD); + aWES.AddStartElement(aSp); + // + aSp.Orientation(TopAbs_REVERSED); + aWES.AddStartElement(aSp); + } + } + // + // 2.1.3. Add Section Parts + if (mySectionParts.Contains(aF)) { + const TopTools_ListOfShape& aLE=mySectionParts.FindFromKey(aF); + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + aSp=TopoDS::Edge(aIt.Value()); + // + aSp.Orientation(TopAbs_FORWARD); + aWES.AddStartElement(aSp); + // + aSp.Orientation(TopAbs_REVERSED); + aWES.AddStartElement(aSp); + } + } + // + // 2.2. Build images Faces + BOP_FaceBuilder aFB; + // + aFB.SetTreatment(0); // 0-Do Internal Edges + aFB.SetTreatSDScales(0); // what is 0 ?? + // + aFB.Do(aWES); + // + TopTools_ListOfShape aLFR; + // + const TopTools_ListOfShape& aLF=aFB.NewFaces(); + + aIt.Initialize(aLF); + for (; aIt.More(); aIt.Next()) { + TopoDS_Shape& aFR=aIt.Value(); + if (anOriF==TopAbs_REVERSED) { + aFR.Orientation(TopAbs_REVERSED); + } + aLFR.Append(aFR); + } + + // + // 2.3. Collect images Faces + myImagesFaces.Bind(aF, aLFR); + }//for (i=1; i<=aNbF; ++i) +} +//======================================================================= +// function: FillIn2DParts +// purpose: +//======================================================================= + void NMTAlgo_Builder::FillIn2DParts() +{ + const NMTDS_ShapesDataStructure& aDS=myDSFiller->DS(); + NMTTools_PaveFiller* pPF=(NMTTools_PaveFiller*)&(myDSFiller->PaveFiller()); + BOPTools_InterferencePool* pIP=(BOPTools_InterferencePool*)&myDSFiller->InterfPool(); + BOPTools_CArray1OfSSInterference& aFFs=pIP->SSInterferences(); + // + Standard_Integer i, j, aNb, nF1, nF2, aNbFF, iFF, nSpIn, nSpSc, aNbCurves; + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aFFMap; + BOPTools_ListOfPaveBlock aLPBIn, aLPBSc; + BOPTools_ListIteratorOfListOfPaveBlock aItPBIn, aItPBSc; + TopTools_IndexedMapOfShape aMF, aMFence; + TopTools_ListOfShape aLSpIn, aLSpSc; + // + BOP_BuilderTools::DoMap(aFFs, aFFMap); + // + // 1. Collect Splits In 2D (myIn2DParts) and + // Section Edges (mySectionParts) + // for each source face that involved in FF + aNb=aFFMap.Extent(); + for (i=1; i<=aNb; ++i) { + nF1=aFFMap.FindKey(i); + const TopoDS_Shape& aF=aDS.Shape(nF1); + // + if (aMF.Contains(aF)) { + continue; + } + aMF.Add(aF); + // + aLPBIn.Clear(); + aLPBSc.Clear(); + // + const TColStd_IndexedMapOfInteger& aFFIndicesMap=aFFMap.FindFromIndex(i); + // + aNbFF=aFFIndicesMap.Extent(); + for (j=1; j<=aNbFF; ++j) { + iFF=aFFIndicesMap(j); + BOPTools_SSInterference& aFF=aFFs(iFF); + nF2=aFF.OppositeIndex(nF1); + // + // In 2D + pPF->RealSplitsInFace(0, nF2, nF1, aLPBIn); + // + // Sections + BOPTools_SequenceOfCurves& aSC=aFF.Curves(); + aNbCurves=aSC.Length(); + if (!aNbCurves) { + continue; + } + // + const BOPTools_Curve& aBC=aSC(1); + const BOPTools_ListOfPaveBlock& aLPB=aBC.NewPaveBlocks(); + // + aItPBSc.Initialize(aLPB); + for (; aItPBSc.More(); aItPBSc.Next()) { + const BOPTools_PaveBlock& aPBSc=aItPBSc.Value(); + aLPBSc.Append(aPBSc); + } + }// for (j=1; j<=aNbFF; ++j) + // + // In 2D Parts + aMFence.Clear(); + // + aLSpIn.Clear(); + aItPBIn.Initialize(aLPBIn); + for (; aItPBIn.More(); aItPBIn.Next()) { + const BOPTools_PaveBlock& aPBR=aItPBIn.Value(); + nSpIn=aPBR.Edge(); + const TopoDS_Shape& aSpIn=aDS.Shape(nSpIn); + if (!aMFence.Contains(aSpIn)){ + aMFence.Add(aSpIn); + aLSpIn.Append(aSpIn); + } + } + myIn2DParts.Add(aF, aLSpIn); + // + // Section Parts + aLSpSc.Clear(); + aItPBSc.Initialize(aLPBSc); + for (; aItPBSc.More(); aItPBSc.Next()) { + const BOPTools_PaveBlock& aPBSc=aItPBSc.Value(); + nSpSc=aPBSc.Edge(); + const TopoDS_Shape& aSpSc=aDS.Shape(nSpSc); + if (!aMFence.Contains(aSpSc)){ + aMFence.Add(aSpSc); + aLSpSc.Append(aSpSc); + } + } + mySectionParts.Add(aF, aLSpSc); + } //for (i=1; i<=aNb; ++i) +} + +//======================================================================= +// function: FillImagesEdges +// purpose: +//======================================================================= + void NMTAlgo_Builder::FillImagesEdges() +{ + const NMTDS_ShapesDataStructure& aDS=myDSFiller->DS(); + NMTTools_PaveFiller* pPF=(NMTTools_PaveFiller*)&(myDSFiller->PaveFiller()); + const BOPTools_SplitShapesPool& aSSP=pPF->SplitShapesPool(); + // + Standard_Integer nE, aNb, aNbSp, nSp; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + TopTools_IndexedMapOfShape aMFence; + TopTools_ListOfShape aLSp; + // + aNb=aDS.NumberOfShapesOfTheObject(); + for (nE=1; nE<=aNb; ++nE) { + const TopoDS_Shape& aE=aDS.Shape(nE); + if (aE.ShapeType()!=TopAbs_EDGE) { + continue; + } + if (aMFence.Contains(aE)) { + continue; + } + aMFence.Add(aE); + // + const BOPTools_ListOfPaveBlock& aLPB=aSSP(aDS.RefEdge(nE)); + aNbSp=aLPB.Extent(); + // + if (!aNbSp) {// no splits + //myImagesEdges.Bind(aE, aE); + continue; + } + // + //modified by NIZNHY-PKV Fri Jan 21 17:01:10 2005 f + if (aNbSp==1) { + const BOPTools_PaveBlock& aPB1=aLPB.First(); + const BOPTools_PaveBlock& aPBR1=pPF->RealPaveBlock(aPB1); + nSp=aPBR1.Edge(); + const TopoDS_Shape& aSp1=aDS.Shape(nSp); + if (aSp1.IsSame(aE)) { + continue; + } + } + //modified by NIZNHY-PKV Fri Jan 21 17:01:14 2005 t + // + aLSp.Clear(); + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB); + nSp=aPBR.Edge(); + const TopoDS_Shape& aSp=aDS.Shape(nSp); + aLSp.Append(aSp); + } + myImagesEdges.Bind(aE, aLSp); + } +} +//======================================================================= +// function: SplitVertices +// purpose: +//======================================================================= + void NMTAlgo_Builder::SplitVertices() +{ + const NMTDS_ShapesDataStructure& aDS=myDSFiller->DS(); + NMTTools_PaveFiller* pPF=(NMTTools_PaveFiller*)&(myDSFiller->PaveFiller()); + const BOPTools_SplitShapesPool& aSSP=pPF->SplitShapesPool(); + // + Standard_Integer nE, aNb, aNbSp, nV1, nV2; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + // + myQueryShapes.Clear(); + // + aNb=aDS.NumberOfShapesOfTheObject(); + for (nE=1; nE<=aNb; ++nE) { + const TopoDS_Shape& aE=aDS.Shape(nE); + if (aE.ShapeType()!=TopAbs_EDGE) { + continue; + } + // + const BOPTools_ListOfPaveBlock& aLPB=aSSP(aDS.RefEdge(nE)); + aNbSp=aLPB.Extent(); + // + if (!aNbSp) {// no splits + continue; + } + // + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + const BOPTools_PaveBlock& aPBR=pPF->RealPaveBlock(aPB); + // + nV1=aPBR.Pave1().Index(); + if (aDS.IsNewShape(nV1)) { + const TopoDS_Shape& aV1=aDS.Shape(nV1); + myQueryShapes.Add(aV1); + } + // + nV2=aPBR.Pave2().Index(); + if (aDS.IsNewShape(nV2)) { + const TopoDS_Shape& aV2=aDS.Shape(nV2); + myQueryShapes.Add(aV2); + } + } + } +} +//======================================================================= +// function: IsSectionEdge +// purpose: +//======================================================================= + Standard_Boolean NMTAlgo_Builder::IsSectionEdge(const TopoDS_Edge& aE)const +{ + return myImagesEdges.HasImage(aE); +} +//======================================================================= +// function: IsSameDomainF +// purpose: +//======================================================================= + Standard_Boolean NMTAlgo_Builder::HasSameDomainF(const TopoDS_Face& aF1)const +{ + Standard_Boolean bFlag=Standard_False; + TopTools_ListIteratorOfListOfShape aItF1; + // + const TopTools_ListOfShape& aLF1=myImagesFaces.Image(aF1); + aItF1.Initialize(aLF1); + for (; aItF1.More(); aItF1.Next()) { + const TopoDS_Shape& aF1x=aItF1.Value(); + // + if (mySDFaces.Contains(aF1x)){ + return !bFlag; + } + } + return bFlag; +} +//======================================================================= +// function: IsSameDomainF +// purpose: +//======================================================================= + Standard_Boolean NMTAlgo_Builder::IsSameDomainF(const TopoDS_Face& aF1, + const TopoDS_Face& aF2)const +{ + Standard_Boolean bFlag=Standard_False; + TopTools_ListIteratorOfListOfShape aItF1, aItF2; + // + const TopTools_ListOfShape& aLF1=myImagesFaces.Image(aF1); + const TopTools_ListOfShape& aLF2=myImagesFaces.Image(aF2); + // + aItF1.Initialize(aLF1); + for (; aItF1.More(); aItF1.Next()) { + const TopoDS_Shape& aF1x=aItF1.Value(); + // + if (!mySDFaces.Contains(aF1x)){ + continue; + } + const TopoDS_Shape& aFSD1x=mySDFaces.FindFromKey(aF1x); + // + aItF2.Initialize(aLF2); + for (; aItF2.More(); aItF2.Next()) { + const TopoDS_Shape& aF2y=aItF2.Value(); + if (!mySDFaces.Contains(aF2y)){ + continue; + } + const TopoDS_Shape& aFSD2y=mySDFaces.FindFromKey(aF2y); + if (aFSD1x.IsSame(aFSD2y)) { + return !bFlag; + } + } + } + return bFlag; +} diff --git a/src/NMTAlgo/NMTAlgo_Builder.jxx b/src/NMTAlgo/NMTAlgo_Builder.jxx new file mode 100644 index 000000000..06f18a20a --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Builder.jxx @@ -0,0 +1,31 @@ +// 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/ +// +#ifndef _NMTTools_DSFiller_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Builder_HeaderFile +#include +#endif diff --git a/src/NMTAlgo/NMTAlgo_Loop3d.cdl b/src/NMTAlgo/NMTAlgo_Loop3d.cdl new file mode 100644 index 000000000..096bd9b5c --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Loop3d.cdl @@ -0,0 +1,85 @@ +// 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/ +// + +class Loop3d from NMTAlgo + + ---Purpose: Builds the shells from a set of faces. + -- Provides methods for comparing faces mutual + -- location. + +uses + Vec from gp, + MapOfOrientedShape from TopTools, + IndexedDataMapOfShapeListOfShape from TopTools, + Face from TopoDS, + Edge from TopoDS, + ListOfShape from TopTools, + Shape from TopoDS + +is + + Create + returns Loop3d from NMTAlgo ; + + AddConstFaces (me:out; + S : Shape from TopoDS) + ---Purpose: Add faces of as unique faces in the result. + is static; + + AddSectionFaces (me:out; + S : Shape from TopoDS) + ---Purpose: Add faces of as double faces in the result. + is static; + + MakeShells (me:out; + AvoidFacesMap : MapOfOrientedShape from TopTools) + returns ListOfShape from TopTools is static; + ---Purpose: Make and return shells. + -- can contain faces that must not be + -- added to result shells. + ---C++: return const & + + + ---Category: class methods + + IsInside (myclass; E : Edge from TopoDS; + F1, F2 : Face from TopoDS; + CountDot : Boolean from Standard; + Dot : in out Real from Standard; + GoodOri : in out Boolean from Standard) + returns Boolean from Standard; + ---Purpose: check if is inside by edge . + -- if , compute : scalar production of + -- normalized vectors pointing inside faces, and + -- check if faces are oriented well for sewing + + Normal (myclass; E : Edge from TopoDS; + F : Face from TopoDS) + returns Vec from gp; + + +fields + + myNewShells : ListOfShape from TopTools; -- result + + myFaces : ListOfShape from TopTools; + myEFMap : IndexedDataMapOfShapeListOfShape from TopTools; + +end Loop3d; diff --git a/src/NMTAlgo/NMTAlgo_Loop3d.cxx b/src/NMTAlgo/NMTAlgo_Loop3d.cxx new file mode 100644 index 000000000..ae99c5d63 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Loop3d.cxx @@ -0,0 +1,349 @@ +// 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/ +// + +//using namespace std; + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static + TopoDS_Edge FindEinF(const TopoDS_Edge&, const TopoDS_Face&); +static + gp_Vec NextNormal(const TopoDS_Edge&, const TopoDS_Face&); + +//======================================================================= +//function : +//purpose : +//======================================================================= + NMTAlgo_Loop3d::NMTAlgo_Loop3d() +{ +} + +//======================================================================= +//function : AddConstFaces +//purpose : Add faces of as unique faces in the result. +//======================================================================= + void NMTAlgo_Loop3d::AddConstFaces(const TopoDS_Shape& S) +{ + TopExp_Explorer FaceExp(S, TopAbs_FACE); + for (; FaceExp.More(); FaceExp.Next()){ + myFaces.Append( FaceExp.Current() ); + } + TopExp::MapShapesAndAncestors(S, TopAbs_EDGE, TopAbs_FACE, myEFMap); +} + +//======================================================================= +//function : AddSectionFaces +//purpose : Add faces of as double faces in the result. +//======================================================================= + void NMTAlgo_Loop3d::AddSectionFaces(const TopoDS_Shape& S) +{ + AddConstFaces( S ); + AddConstFaces( S.Reversed() ); +} + +//======================================================================= +//function : MakeShells +//purpose : Make and return shells. +// can contain faces that must not be +// added to result shells. +//======================================================================= + const TopTools_ListOfShape& NMTAlgo_Loop3d::MakeShells + (const TopTools_MapOfOrientedShape& AvoidFacesMap) +{ + myNewShells.Clear(); + + BRep_Builder Builder; + TopTools_MapOfShape CheckedEdgesMap; + TopTools_MapOfOrientedShape AddedFacesMap; + + TopTools_ListIteratorOfListOfShape itF (myFaces); + for (; itF.More(); itF.Next()) { + const TopoDS_Shape& FF = itF.Value(); + if (AvoidFacesMap.Contains( FF ) || + ! AddedFacesMap.Add( FF ) ) + continue; + + // make a new shell + TopoDS_Shell Shell; + Builder.MakeShell(Shell); + Builder.Add(Shell,FF); + + // clear the maps from shapes added to previous Shell + TopTools_MapIteratorOfMapOfShape itEM (CheckedEdgesMap); + for (; itEM.More(); itEM.Next()) { + TopTools_ListOfShape& FL = myEFMap.ChangeFromKey( itEM.Key()); + TopTools_ListIteratorOfListOfShape it (FL); + while ( it.More()) { + if (AddedFacesMap.Contains( it.Value())) + FL.Remove( it ); + else + it.Next(); + } + } + CheckedEdgesMap.Clear(); + + + // loop on faces added to Shell; add their neighbor faces to Shell and so on + TopoDS_Iterator itAddedF (Shell); + for (; itAddedF.More(); itAddedF.Next()){ + const TopoDS_Face& F = TopoDS::Face (itAddedF.Value()); + + // loop on edges of F; find a good neighbor face of F by E + TopExp_Explorer EdgeExp(F, TopAbs_EDGE); + for (; EdgeExp.More(); EdgeExp.Next()){ + const TopoDS_Edge& E = TopoDS::Edge( EdgeExp.Current()); + if (! CheckedEdgesMap.Add( E )) + continue; + + // candidate faces list + const TopTools_ListOfShape& FL = myEFMap.ChangeFromKey(E); + if (FL.IsEmpty()) + continue; + // select one of neighbors + TopoDS_Face SelF; + if (FL.Extent() == 2) { + if (! F.IsSame( FL.First() )) + SelF = TopoDS::Face( FL.First() ); + else if (!F.IsSame( FL.Last() )) + SelF = TopoDS::Face( FL.Last() ); + } + else { + // check if a face already added to Shell shares E + TopTools_ListIteratorOfListOfShape it (FL); + Standard_Boolean found = Standard_False; + for (; !found && it.More(); it.Next()) + if (F != it.Value()) + found = AddedFacesMap.Contains( it.Value() ); + if (found) + continue; + // select basing on geometrical check + Standard_Boolean GoodOri, inside; + Standard_Real dot, MaxDot = -100; + TopTools_ListOfShape TangFL; // tangent faces + for ( it.Initialize( FL ) ; it.More(); it.Next()) { + const TopoDS_Face& NeighborF = TopoDS::Face( it.Value()); + if (NeighborF.IsSame( F )) + continue; + inside = NMTAlgo_Loop3d::IsInside( E, F, NeighborF, 1, dot, GoodOri); + if (!GoodOri) + continue; + if (!inside) + dot = -dot - 3; + if (dot < MaxDot) + continue; + if ( IsEqual( dot, MaxDot)) + TangFL.Append(SelF); + else + TangFL.Clear(); + MaxDot = dot; + SelF = NeighborF; + } + if (!TangFL.IsEmpty()) { + for (it.Initialize( TangFL ); it.More(); it.Next()) { + const TopoDS_Face& NeighborF = TopoDS::Face( it.Value()); + if (NMTAlgo_Loop3d:: IsInside( E, SelF , NeighborF, 0, dot, GoodOri)) + SelF = NeighborF; + } + } + } + if (!SelF.IsNull() && + AddedFacesMap.Add( SelF ) && + !AvoidFacesMap.Contains( SelF )) + Builder.Add( Shell, SelF); + + } // loop on edges of F + + } // loop on the faces added to Shell + + // Shell is complete + myNewShells.Append( Shell ); + + } // loop on myFaces + + + // prepare to the next call + myFaces.Clear(); + myEFMap.Clear(); + + return myNewShells; +} +//======================================================================= +//function : Normal +//purpose : +//======================================================================= + gp_Vec NMTAlgo_Loop3d::Normal(const TopoDS_Edge& E, + const TopoDS_Face& F) +{ + gp_Vec Norm, V1, V2; + Standard_Real First, Last; + gp_Pnt Ps; + + Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface (E, F, First, Last); + Handle(Geom_Surface) Sf = BRep_Tool::Surface(F); + + gp_Pnt2d p = C2d->Value( 0.5*(First+Last) ); + Sf->D1(p.X(), p.Y(), Ps, V1, V2); + Norm = V1.Crossed(V2); + + if (F.Orientation() == TopAbs_REVERSED ) + Norm.Reverse(); + + return Norm; +} +//======================================================================= +//function : IsInside +//purpose : check if is inside by edge . +// if , compute : scalar production of +// normalized vectors pointing inside faces, and +// check if faces are oriented well for sewing +//======================================================================= + Standard_Boolean NMTAlgo_Loop3d::IsInside(const TopoDS_Edge& E, + const TopoDS_Face& F1, + const TopoDS_Face& F2, + const Standard_Boolean CountDot, + Standard_Real& Dot, + Standard_Boolean& GoodOri) +{ + Standard_Real f, l; + gp_Pnt P; + gp_Vec Vc1, Vc2, Vin1, Vin2, Nf1, Nf2; + Handle(Geom_Curve) Curve = BRep_Tool::Curve(E,f,l); + Curve->D1( 0.5*(f + l), P, Vc2); + TopoDS_Edge E1, E2 = FindEinF (E, F2); + if (E2.Orientation() == TopAbs_REVERSED ) Vc2.Reverse(); + + Nf1 = Normal(E,F1); + Nf2 = Normal(E,F2); + + Standard_Real sin = + Nf1.CrossSquareMagnitude(Nf2) / Nf1.SquareMagnitude() / Nf2.SquareMagnitude(); + Standard_Boolean tangent = sin < 0.001; + + Standard_Boolean inside = 0; + if (tangent) { + E1 = FindEinF (E, F1); + gp_Vec NNf1 = NextNormal(E1,F1); + gp_Vec NNf2 = NextNormal(E2,F2); + Vin2 = NNf2.Crossed(Vc2); + inside = Vin2 * NNf1 < 0; + } + else { + Vin2 = Nf2.Crossed(Vc2); + inside = Vin2 * Nf1 < 0; + } + + if (!CountDot) return inside; + + if (tangent) + Vin2 = Nf2.Crossed(Vc2); + else + E1 = FindEinF (E, F1); + + Vc1 = Vc2; + if (E1.Orientation() != E2.Orientation()) + Vc1.Reverse(); + Vin1 = Nf1.Crossed(Vc1); + + if (tangent) { + Standard_Real N1N2 = Nf1 * Nf2; + GoodOri = (Vin2 * Vin1 < 0) ? N1N2 > 0 : N1N2 < 0; + } + else { + Standard_Real V1N2 = Vin1 * Nf2; + GoodOri = ( inside ? V1N2 <= 0 : V1N2 >= 0); + } + + Vin1.Normalize(); + Vin2.Normalize(); + + Dot = Vin2 * Vin1; + + return inside; +} +//======================================================================= +//function : NextNormal +//purpose : find normal to F at point a little inside F near the middle of E +//warning : E must be properly oriented in F. +//======================================================================= +gp_Vec NextNormal(const TopoDS_Edge& E, + const TopoDS_Face& F) +{ + Standard_Real First, Last; + + Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface (E, F, First, Last); + Handle(Geom_Surface) Sf = BRep_Tool::Surface(F); + + gp_Pnt2d p; + gp_Vec2d v; + C2d->D1( 0.5*(First+Last), p, v); + if (E.Orientation() != F.Orientation()) + v.Reverse(); + gp_Dir2d dir( -v.Y(), v.X() ); // dir inside F + + Standard_Real duv = 1e-6; // this is not Ok and may give incorrect result if + // resolutionUV of compared faces is very different. To have a good result, + //it is necessary to get normal to faces at points equidistant from E in 3D + + p.SetX( p.X() + dir.X()*duv ); + p.SetY( p.Y() + dir.Y()*duv ); + + gp_Pnt Ps; + gp_Vec Norm, V1, V2; + Sf->D1( p.X(), p.Y(), Ps, V1, V2); + Norm = V1.Crossed(V2); + + if (F.Orientation() == TopAbs_REVERSED ) + Norm.Reverse(); + + return Norm; +} +//======================================================================= +//function : FindEinF +//purpose : find E in F +//======================================================================= +TopoDS_Edge FindEinF(const TopoDS_Edge& E, + const TopoDS_Face& F) +{ + TopExp_Explorer expl (F, TopAbs_EDGE); + for (; expl.More(); expl.Next()) + if( E.IsSame( expl.Current() )) + return TopoDS::Edge(expl.Current()); + TopoDS_Edge nullE; + return nullE; +} diff --git a/src/NMTAlgo/NMTAlgo_Loop3d.jxx b/src/NMTAlgo/NMTAlgo_Loop3d.jxx new file mode 100644 index 000000000..f9d9b5b9c --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Loop3d.jxx @@ -0,0 +1,40 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopTools_MapOfOrientedShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _gp_Vec_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Loop3d_HeaderFile +#include +#endif diff --git a/src/NMTAlgo/NMTAlgo_Splitter.cdl b/src/NMTAlgo/NMTAlgo_Splitter.cdl new file mode 100644 index 000000000..96f8e1340 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter.cdl @@ -0,0 +1,200 @@ +// 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/ +// +-- File: NMTAlgo_Splitter.cdl +-- Created: Tue Jan 27 15:09:45 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Splitter from NMTAlgo + inherits Builder from NMTAlgo + + ---Purpose: + +uses + Builder from BRep, + ShapeEnum from TopAbs, + Compound from TopoDS, + Face from TopoDS, + Edge from TopoDS, + Shape from TopoDS, + MapOfOrientedShape from TopTools, + IndexedMapOfShape from TopTools, + DataMapOfShapeShape from TopTools, + DataMapOfShapeListOfShape from TopTools, + ListOfShape from TopTools, + MapOfShape from TopTools, + AsDes from BRepAlgo, + Image from BRepAlgo, + + DSFiller from NMTTools + +--raises + +is + Create + returns Splitter from NMTAlgo; + ---C++: alias "Standard_EXPORT virtual ~NMTAlgo_Splitter();" + + AddShape (me:out; + S : Shape from TopoDS) + is virtual; + + AddTool (me:out; + S : Shape from TopoDS) + is virtual; + + Compute(me:out) + is virtual; + + Build (me:out; + aLimit:ShapeEnum from TopAbs=TopAbs_SHAPE) + is virtual; + + ComputeWithFiller(me:out; + aDSF: DSFiller from NMTTools) + is redefined; + +----vv + KeepShapesInside (me:out; + S : Shape from TopoDS); + ---Purpose: remove shapes that are outside of S from result. + -- S should be an object shape. + ---Warning: call it after Build() + + RemoveShapesInside (me:out; + S : Shape from TopoDS); + ---Purpose: remove shapes that are inside S from result. + -- S should be an object shape. + ---Warning: call it after Build() + + Modified(me:out; + S : Shape from TopoDS) + returns ListOfShape from TopTools; + ---Purpose: Returns the list of shapes modified from the shape . + ---C++: return const & + ---Level: Public + + Generated(me:out; + S : Shape from TopoDS) + returns ListOfShape from TopTools; + ---Purpose: Returns the list of shapes generated from the shape . + ---C++: return const & + ---Level: Public + + IsDeleted (me:out; + S : Shape from TopoDS) + returns Boolean from Standard; +----^^ + + Clear (me:out) + is redefined; + + SourceShapes(me) + returns ListOfShape from TopTools; + ---C++: return const & + + FillResult(me:out) + is protected; + + FillImageShape(me:out) + is protected; + + SplittedFaces (me:out) + is protected; + + SplittedWires (me:out) + is protected; + + SplitsAndSections (me:out) + is protected; + + ShellsAndSolids(me:out) + is protected; + + MakeShells(me:out; + aS :Shape from TopoDS; + aLNS:out ListOfShape from TopTools) + is protected; + + MakeSolids (me:out; + Solid : Shape from TopoDS; + Shells: out ListOfShape from TopTools) + is protected; + + FindFacesInside (me:out; + S : Shape from TopoDS; + CheckClosed : Boolean from Standard= Standard_False; + All : Boolean from Standard= Standard_False) + returns Shape from TopoDS + is protected; + + IsInside (myclass; + S1,S2 : Shape from TopoDS) + returns Boolean from Standard is protected; + ---Purpose: Return True if the first vertex of S1 inside S2. + -- If S1.IsNull(), check infinite point against S2. + + GetOriginalShape(me; + aShape : Shape from TopoDS) + returns Shape from TopoDS + is protected; + +--modified by NIZNHY-PKV Tue Feb 1 10:24:39 2005f + FindImage(me:out; + aS : Shape from TopoDS; + aLIms: out ListOfShape from TopTools) + is protected; +--modified by NIZNHY-PKV Tue Feb 1 10:24:47 2005t + +fields + myDoneStep : ShapeEnum from TopAbs is protected; -- rebuilt level + myBuilder : Builder from BRep is protected; + + myListShapes : ListOfShape from TopTools is protected; -- object shapes + myMapFaces : MapOfShape from TopTools is protected; -- object faces + myMapTools : MapOfShape from TopTools is protected; -- tool faces + myEqualEdges : MapOfShape from TopTools is protected; -- equal splits + myNewSection : MapOfShape from TopTools is protected; -- new secton edges + myClosedShapes : MapOfShape from TopTools is protected; + myWrappingSolid: MapOfShape from TopTools is protected; -- solids having other shapes inside + myFaceShapeMap : DataMapOfShapeShape from TopTools is protected; -- to find a shape by face + + myInternalFaces: DataMapOfShapeShape from TopTools is protected; -- shape and its internal faces + myIntNotClFaces: DataMapOfShapeShape from TopTools is protected; -- internal but not closed + + myImageShape : Image from BRepAlgo is protected; + + -- avoid rebuilding twice commont part of solids + myAddedFacesMap: MapOfOrientedShape from TopTools is protected; + --***-- + mySourceShapes : ListOfShape from TopTools is protected; + myLimit : ShapeEnum from TopAbs is protected; + myToolShapes : MapOfShape from TopTools is protected; + myObjShapes : MapOfShape from TopTools is protected; + myMapSIFC : DataMapOfShapeShape from TopTools is protected; +----vv + myGenerated : ListOfShape from TopTools is protected; + --modified by NIZNHY-PKV Mon Jan 24 09:45:10 2005f + myModifiedFaces: DataMapOfShapeListOfShape from TopTools is protected; + --modified by NIZNHY-PKV Mon Jan 24 09:45:14 2005t +----^^ +end Splitter; diff --git a/src/NMTAlgo/NMTAlgo_Splitter.cxx b/src/NMTAlgo/NMTAlgo_Splitter.cxx new file mode 100644 index 000000000..5980d8319 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter.cxx @@ -0,0 +1,624 @@ +// 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/ +// +// File: NMTAlgo_Splitter.cxx +// Created: Thu Jan 29 17:13:03 2004 +// 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 +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +// +#include +#include +#include +#include + + +static + Standard_Boolean isClosed(const TopoDS_Shape& theShape); + +//======================================================================= +//function : NMTAlgo_Spliter::NMTAlgo_Splitter +//purpose : +//======================================================================= + NMTAlgo_Splitter::NMTAlgo_Splitter() +: + NMTAlgo_Builder() +{ + myErrorStatus=0; +} +//======================================================================= +// function: ~NMTAlgo_Splitter +// purpose: +//======================================================================= + NMTAlgo_Splitter::~NMTAlgo_Splitter() +{ + Clear(); + + if (myDSFiller){ + delete myDSFiller; + } +} +//======================================================================= +// function: SourceShapes +// purpose: +//======================================================================= + const TopTools_ListOfShape& NMTAlgo_Splitter::SourceShapes()const +{ + return mySourceShapes; +} +//======================================================================= +//function : Clear +//purpose : +//======================================================================= + void NMTAlgo_Splitter::Clear() +{ + NMTAlgo_Builder::Clear(); + // + myListShapes.Clear(); + myMapFaces.Clear(); + myMapTools.Clear(); + myClosedShapes.Clear(); + myEqualEdges.Clear(); + myNewSection.Clear(); + myWrappingSolid.Clear(); + myFaceShapeMap.Clear(); + myInternalFaces.Clear(); + myIntNotClFaces.Clear(); + // + myImageShape.Clear(); + myAddedFacesMap.Clear(); + // + myDoneStep = TopAbs_SHAPE; + myIsComputed=Standard_False; + mySourceShapes.Clear(); + myObjShapes.Clear(); + myToolShapes.Clear(); + myMapSIFC.Clear(); + //modified by NIZNHY-PKV Mon Jan 24 09:47:37 2005f + myModifiedFaces.Clear(); + //modified by NIZNHY-PKV Mon Jan 24 09:47:41 2005t + myErrorStatus=0; +} +//======================================================================= +//function : AddShape +//purpose : add object Shape to be splited +//======================================================================= + void NMTAlgo_Splitter::AddShape(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + if (myIsComputed) { + // DS is already computed + myErrorStatus=100; + return; + } + // + if (aS.IsNull()){ + // Null shape is not allowed here + myErrorStatus=101; + return; + } + // + TopAbs_ShapeEnum aType=aS.ShapeType(); + // + if (aType < TopAbs_SOLID) { + // compound or compsolid + TopoDS_Iterator it (aS); + for (; it.More(); it.Next()) { + const TopoDS_Shape& aSS=it.Value(); + AddShape(aSS); + // to know compound by shape + myFaceShapeMap.Bind(aSS, aS); + } + return; + } + //--- + myObjShapes.Add(aS); + mySourceShapes.Append(aS); + //--- + // + TopExp_Explorer exp(aS, TopAbs_FACE); + if (!exp.More()) { + // do not split edges and vertices + return; + } + // not to add twice the same S + Standard_Integer nbFacesBefore = myMapFaces.Extent(); + // + for (; exp.More(); exp.Next()) { + const TopoDS_Shape& aFace = exp.Current(); + if (!myFaceShapeMap.IsBound(aFace)) { + // keep shape of tool face added as object + myFaceShapeMap.Bind(aFace, aS); + } + if (myMapFaces.Add(aFace)){ + myImagesFaces.SetRoot(aFace); + } + } + // + if (nbFacesBefore == myMapFaces.Extent()){ + return; + } + // solids must be processed before all + if (aType==TopAbs_SOLID){ + myListShapes.Prepend(aS); + } + else{ + myListShapes.Append(aS); + } + if (isClosed(aS)){ + myClosedShapes.Add(aS); + } +} +//======================================================================= +//function : AddTool +//purpose : add cutting tool that will _NOT_ be in result +//======================================================================= + void NMTAlgo_Splitter::AddTool(const TopoDS_Shape& aS) +{ + myErrorStatus=0; + if (myIsComputed) { + // DS is already computed + myErrorStatus=100; + return; + } + // + if (aS.IsNull()){ + // Null shape is not allowed here + myErrorStatus=101; + return; + } + // + TopAbs_ShapeEnum aType=aS.ShapeType(); + + if (aType < TopAbs_SOLID) { // compound or compsolid + TopoDS_Iterator it (aS); + for (; it.More(); it.Next()) { + const TopoDS_Shape& aSS=it.Value(); + AddTool(aSS); + myFaceShapeMap.Bind(aSS, aS); // to know compound by shape + } + return; + } + //--- + myToolShapes.Add(aS); + mySourceShapes.Append(aS); + //--- + // + TopExp_Explorer exp(aS, TopAbs_FACE); + for (; exp.More(); exp.Next()) { + const TopoDS_Shape& aFace = exp.Current(); + myMapTools.Add(aFace); + myFaceShapeMap.Bind(aFace, aS); + } + // + // solids must be processed before all + if (aType==TopAbs_SOLID){ + myListShapes.Prepend(aS); + } + else{ + myListShapes.Append(aS); + } + // + if (isClosed(aS)) { + myClosedShapes.Add(aS); + } +} +//======================================================================= +// function: Compute +// purpose: +//======================================================================= + void NMTAlgo_Splitter::Compute() +{ + if (!mySourceShapes.Extent()){ + // No source shapes to treat + myErrorStatus=103; + return; + } + // + BRep_Builder aBB; + TopoDS_Compound aCS; + TopTools_ListIteratorOfListOfShape aIt; + // + aBB.MakeCompound(aCS); + // + aIt.Initialize(mySourceShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + aBB.Add(aCS, aS); + } + // + NMTTools_DSFiller* pDSF=new NMTTools_DSFiller; + // + pDSF->SetCompositeShape(aCS); + pDSF->Perform(); + // + myIsComputed=Standard_False; + // + NMTAlgo_Splitter::ComputeWithFiller(*pDSF); +} +//======================================================================= +// function: ComputeWithFiller +// purpose: +//======================================================================= + void NMTAlgo_Splitter::ComputeWithFiller(const NMTTools_DSFiller& aDSF) +{ + myErrorStatus=0; + // + if (myIsComputed) { + // DS is already computed + myErrorStatus=100; + return; + } + // + if (!mySourceShapes.Extent()){ + // No source shapes to treat + myErrorStatus=103; + return; + } + // + NMTAlgo_Builder::ComputeWithFiller(aDSF); + // + myIsComputed=Standard_True; +} +//======================================================================= +//function : Build +//purpose : +//======================================================================= + void NMTAlgo_Splitter::Build(const TopAbs_ShapeEnum aLimit) +{ + myErrorStatus=0; + myLimit=aLimit; + // + if (!myIsComputed){ + myErrorStatus=102;// DS is not computed + return; + } + // + TopoDS_Compound aCShape; + // + myBuilder.MakeCompound(aCShape); + myShape=aCShape; + // + // 1. VERTEX + // + if (myLimit==TopAbs_VERTEX) { + SplitVertices(); + FillResult(); + return; + } + // + // 2. EDGE + if (myLimit==TopAbs_EDGE) { + SplitsAndSections(); + FillResult(); + return; + } + // + // 3. WIRE + FillImageShape(); + // + if (myLimit==TopAbs_WIRE) { + SplittedWires(); + FillResult(); + return; + } + // + // 4. FACE + // + if (myLimit==TopAbs_FACE) { + SplittedFaces(); + FillResult(); + return; + } + // + // 5.6. SHELL / SOLID + ShellsAndSolids(); + BOP_CorrectTolerances::CorrectTolerances(myShape, 0.01); +} +//======================================================================= +// function: SplitsAndSections +// purpose: +//======================================================================= + void NMTAlgo_Splitter::SplitsAndSections() +{ + Standard_Integer i, aNbE, aNbF; + TopTools_ListIteratorOfListOfShape aItLS, aIt; + TopTools_IndexedMapOfShape aME, aMF; + // + myQueryShapes.Clear(); + // + // 1. Splits / no splits + aItLS.Initialize(myListShapes); + for ( ;aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aS=aItLS.Value(); + // + if (myToolShapes.Contains(aS)) { + continue; // skip tool Shapes + } + // + TopExp::MapShapes(aS, TopAbs_EDGE, aME); + TopExp::MapShapes(aS, TopAbs_FACE, aMF); + } + // + // 1. Splits / no splits + aNbE=aME.Extent(); + for (i=1; i<=aNbE; ++i) { + const TopoDS_Shape& aE=aME(i); + // + if (!myImagesEdges.HasImage(aE)) { + myQueryShapes.Add(aE); + } + else { + const TopTools_ListOfShape& aLSp=myImagesEdges.Image(aE); + // + aIt.Initialize(aLSp); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSp=aIt.Value(); + myQueryShapes.Add(aSp); + } + } + } + // + // 2. Sections + aNbF=aMF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aF=aMF(i); + if (mySectionParts.Contains(aF)) { + const TopTools_ListOfShape& aLSc=mySectionParts.FindFromKey(aF); + aIt.Initialize(aLSc); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSc=aIt.Value(); + myQueryShapes.Add(aSc); + } + } + } +} +//======================================================================= +// function: SplittedWires +// purpose: +//======================================================================= + void NMTAlgo_Splitter::SplittedWires() +{ + Standard_Integer i, aNbF; + TopoDS_Iterator aIt; + TopTools_IndexedMapOfShape aMF; + // + SplittedFaces(); + // + aMF=myQueryShapes; + myQueryShapes.Clear(); + // + aNbF=aMF.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aF=aMF(i); + aIt.Initialize(aF); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aW=aIt.Value(); + myQueryShapes.Add(aW); + } + } +} +//======================================================================= +// function: SplittedFaces +// purpose: +//======================================================================= + void NMTAlgo_Splitter::SplittedFaces() +{ + TopTools_ListIteratorOfListOfShape aIt; + TopoDS_Iterator aItF; + // + myQueryShapes.Clear(); + // + aIt.Initialize(myListShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + // + if (myToolShapes.Contains(aS)) { + continue; + } + // + const TopoDS_Shape& aFC = myImageShape.Image(aS).First(); + aItF.Initialize(aFC); + for (; aItF.More(); aItF.Next()) { + const TopoDS_Shape& aF=aItF.Value(); + myQueryShapes.Add(aF); + } + } +} +//======================================================================= +//function : FillImageShape +//purpose : +//======================================================================= + void NMTAlgo_Splitter::FillImageShape() +{ + Standard_Integer i, aNbF, iSense; + TopTools_ListIteratorOfListOfShape aItS, aItFI; + TopExp_Explorer aExp; + TopAbs_Orientation aOriFS; + TopoDS_Face aFIx, aFIy; + BRep_Builder aBB; + // + myImageShape.Clear(); + //modified by NIZNHY-PKV Mon Jan 24 09:48:15 2005f + myModifiedFaces.Clear(); + //modified by NIZNHY-PKV Mon Jan 24 09:48:18 2005t + // + aItS.Initialize(myListShapes); + for ( ;aItS.More(); aItS.Next()) { + const TopoDS_Shape& aS=aItS.Value(); + // + myQueryShapes.Clear(); + // + aExp.Init(aS, TopAbs_FACE); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Face& aFS=TopoDS::Face(aExp.Current()); + aOriFS= aFS.Orientation(); + // + if (!myImagesFaces.HasImage(aFS)) { + myQueryShapes.Add(aFS); + //modified by NIZNHY-PKV Mon Jan 24 09:50:42 2005 f + if (!myModifiedFaces.IsBound(aFS)) { + TopTools_ListOfShape aLS; + // + aLS.Append(aFS); + myModifiedFaces.Bind(aFS, aLS); + } + //modified by NIZNHY-PKV Mon Jan 24 09:50:44 2005 t + continue; + } + // + const TopTools_ListOfShape& aLFI=myImagesFaces.Image(aFS); + aItFI.Initialize(aLFI); + for (; aItFI.More(); aItFI.Next()) { + const TopoDS_Face& aFI=TopoDS::Face(aItFI.Value()); + aFIx=aFI; + aFIx.Orientation(aOriFS); + // + if (mySDFaces.Contains(aFIx)) { + const TopoDS_Face& aFSDI=TopoDS::Face(mySDFaces.FindFromKey(aFIx)); + TopoDS_Face aFSDIx=aFSDI; + // + iSense=NMTAlgo_Tools::Sense(aFIx, aFSDIx); + // + if (iSense < 0) { + aFSDIx.Reverse(); + } + myQueryShapes.Add(aFSDIx); + //modified by NIZNHY-PKV Mon Jan 24 09:56:06 2005f + aFIy=aFSDIx; + //modified by NIZNHY-PKV Mon Jan 24 09:56:09 2005t + } + else { + myQueryShapes.Add(aFIx); + //modified by NIZNHY-PKV Mon Jan 24 09:56:06 2005f + aFIy=aFIx; + //modified by NIZNHY-PKV Mon Jan 24 09:56:09 2005t + } + //modified by NIZNHY-PKV Mon Jan 24 09:53:38 2005f + if (!myModifiedFaces.IsBound(aFS)) { + TopTools_ListOfShape aLS; + // + aLS.Append(aFIy); + myModifiedFaces.Bind(aFS, aLS); + } + else { + TopTools_ListOfShape& aLS=myModifiedFaces.ChangeFind(aFS); + aLS.Append(aFIy); + } + //modified by NIZNHY-PKV Mon Jan 24 09:53:43 2005t + } + }//for (; aExp.More(); aExp.Next()) { + // + TopoDS_Compound aCompound; + // + aBB.MakeCompound(aCompound); + // + aNbF=myQueryShapes.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aF=myQueryShapes(i); + aBB.Add(aCompound, aF); + } + // + myImageShape.Bind(aS, aCompound); + }// for ( ;aItS.More(); aItS.Next()) + // + myQueryShapes.Clear(); +} +//======================================================================= +//function : FillResult +//purpose : +//======================================================================= + void NMTAlgo_Splitter::FillResult() +{ + Standard_Integer i, aNb; + // + aNb=myQueryShapes.Extent(); + for (i=1; i<=aNb; ++i) { + const TopoDS_Shape& aS=myQueryShapes(i); + myBuilder.Add (myShape, aS); + } + BOP_CorrectTolerances::CorrectTolerances(myShape, 0.01); +} +//======================================================================= +//function : isClosed +//purpose : check id a shape is closed, ie is a solid or a closed shell +//======================================================================= + Standard_Boolean isClosed(const TopoDS_Shape& theShape) +{ + Standard_Boolean isClosed = (theShape.ShapeType() == TopAbs_SOLID); + // + if (!isClosed && theShape.ShapeType() == TopAbs_SHELL) { + TopTools_IndexedDataMapOfShapeListOfShape MEF; + TopExp::MapShapesAndAncestors(theShape, TopAbs_EDGE, TopAbs_FACE, MEF); + for (Standard_Integer i=1; isClosed && i<=MEF.Extent(); ++i) + isClosed = ( MEF(i).Extent() != 1 ); + } + // + return isClosed; +} +// +// myErrorStatus +// +// 100 - DS is already computed +// 101 - Null shape is not allowed here +// 102 - DS is not computed +// 103 - No source shapes to treat diff --git a/src/NMTAlgo/NMTAlgo_Splitter.jxx b/src/NMTAlgo/NMTAlgo_Splitter.jxx new file mode 100644 index 000000000..4f708f4f1 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter.jxx @@ -0,0 +1,31 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTTools_DSFiller_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Splitter_HeaderFile +#include +#endif diff --git a/src/NMTAlgo/NMTAlgo_Splitter1.cdl b/src/NMTAlgo/NMTAlgo_Splitter1.cdl new file mode 100644 index 000000000..b8903281f --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter1.cdl @@ -0,0 +1,92 @@ +// 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/ +// +-- File: NMTAlgo_Splitter1.cdl +-- Created: Wed Feb 11 14:23:25 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Splitter1 from NMTAlgo + inherits Splitter from NMTAlgo + + ---Purpose: + +uses + ShapeEnum from TopAbs, + Shape from TopoDS, + DataMapOfShapeInteger from TopTools + +--raises + +is + Create + returns Splitter1 from NMTAlgo; + ---C++: alias "Standard_EXPORT virtual ~NMTAlgo_Splitter1();" + + Clear (me:out) + is redefined; + + AddShape (me:out; + aS : Shape from TopoDS) + is redefined; + + + AddTool(me:out; + aS : Shape from TopoDS) + is redefined; + + + SetMaterial (me:out; + aS : Shape from TopoDS; + aM : Integer from Standard=0); + + SetRemoveWebs(me:out; + bFlag:Boolean from Standard); + + RemoveWebs(me) + returns Boolean from Standard; + + GetMaterialTable(me) + returns DataMapOfShapeInteger from TopTools; + ---C++: return const & + + Build (me:out; + Limit:ShapeEnum from TopAbs=TopAbs_SHAPE) + is redefined; + + -- protected block + TreatSolids (me:out) + is protected; + + TreatWebs (me:out) + is protected; + + RestParts (me:out) + is protected; + + +fields + myRemoveWebs : Boolean from Standard is protected; + myMapSWM : DataMapOfShapeInteger from TopTools is protected; + myMapSWMOut : DataMapOfShapeInteger from TopTools is protected; + myRestParts : Shape from TopoDS is protected; + +end Splitter1; diff --git a/src/NMTAlgo/NMTAlgo_Splitter1.cxx b/src/NMTAlgo/NMTAlgo_Splitter1.cxx new file mode 100644 index 000000000..cb9f2861c --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter1.cxx @@ -0,0 +1,375 @@ +// 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/ +// +// File: NMTAlgo_Splitter1.cxx +// Created: Wed Feb 11 14:26:27 2004 +// 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 +#include +#include + +//======================================================================= +//function : NMTAlgo_Spliter1::NMTAlgo_Splitter1 +//purpose : +//======================================================================= + NMTAlgo_Splitter1::NMTAlgo_Splitter1() +: + NMTAlgo_Splitter() +{ + myRemoveWebs=Standard_False; +} +//======================================================================= +// function: ~NMTAlgo_Splitter1 +// purpose: +//======================================================================= + NMTAlgo_Splitter1::~NMTAlgo_Splitter1() +{ + Clear(); +} +//======================================================================= +//function : Clear +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::Clear() +{ + NMTAlgo_Splitter::Clear(); + // + myRemoveWebs=Standard_False; + myMapSWM.Clear(); + myMapSWMOut.Clear(); +} +//======================================================================= +//function : SetRemoveWebs +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::SetRemoveWebs(const Standard_Boolean bFlag) +{ + myRemoveWebs=bFlag; +} +//======================================================================= +//function : RemoveWebs +//purpose : +//======================================================================= + Standard_Boolean NMTAlgo_Splitter1::RemoveWebs()const +{ + return myRemoveWebs; +} +//======================================================================= +//function : GetMaterialTable +//purpose : +//======================================================================= + const TopTools_DataMapOfShapeInteger& NMTAlgo_Splitter1::GetMaterialTable()const +{ + return myMapSWMOut; +} +//======================================================================= +//function : SetMaterial +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::SetMaterial(const TopoDS_Shape& aS, + const Standard_Integer iMt) +{ + TopExp_Explorer aExp; + // + aExp.Init(aS, TopAbs_SOLID); + for(; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aSd=aExp.Current(); + myMapSWM.Bind(aSd, iMt); + } +} +//======================================================================= +//function : AddShape +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::AddShape(const TopoDS_Shape& aS) +{ + SetMaterial(aS, 0); + NMTAlgo_Splitter::AddShape(aS); +} +//======================================================================= +//function : AddToolWithMaterial +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::AddTool(const TopoDS_Shape& aS) + +{ + SetMaterial(aS, 0); + NMTAlgo_Splitter::AddTool(aS); +} +//======================================================================= +//function : Build +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::Build(const TopAbs_ShapeEnum aLimit) +{ + NMTAlgo_Splitter::Build(aLimit); + // + myMapSWMOut.Clear(); + // + TreatSolids(); + // + if (myRemoveWebs && myMapSWMOut.Extent()) { + RestParts(); + TreatWebs(); + } +} +//======================================================================= +//function : TreatWebs +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::TreatWebs() +{ + Standard_Integer nMt; + TopTools_DataMapOfIntegerListOfShape aMMLS; + TopoDS_Iterator aIt; + TopTools_DataMapIteratorOfDataMapOfShapeInteger aIt2; + TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape aIt1; + TopTools_ListIteratorOfListOfShape aItS; + TopoDS_Compound aCx; + TopoDS_Shape aCSR; + // + aIt2.Initialize(myMapSWMOut); + for (; aIt2.More(); aIt2.Next()) { + const TopoDS_Shape& aS=aIt2.Key(); + nMt=aIt2.Value(); + // + if (aMMLS.IsBound(nMt)){ + TopTools_ListOfShape& aLS=aMMLS.ChangeFind(nMt); + aLS.Append(aS); + } + else { + TopTools_ListOfShape aLS; + aLS.Append(aS); + aMMLS.Bind(nMt, aLS); + } + } + // + myMapSWMOut.Clear(); + myBuilder.MakeCompound(aCx); + // + aIt1.Initialize(aMMLS); + for (; aIt1.More(); aIt1.Next()) { + nMt=aIt1.Key(); + // + TopoDS_Compound aCS; + myBuilder.MakeCompound(aCS); + const TopTools_ListOfShape& aLS=aIt1.Value(); + aItS.Initialize(aLS); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aS=aItS.Value(); + myBuilder.Add(aCS, aS); + } + // + NMTAlgo_Tools::BreakWebs(aCS, aCSR); + // + aIt.Initialize(aCSR); + for(; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + myBuilder.Add(aCx, aS); + // + myMapSWMOut.Bind(aS, nMt); + } + } + // + aIt.Initialize(myRestParts); + for(; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + myBuilder.Add(aCx, aS); + } + // + myShape=aCx; +} + +//======================================================================= +//function : RestParts +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::RestParts() +{ + TopoDS_Iterator aIt; + TopoDS_Compound aR; + // + myBuilder.MakeCompound(aR); + // + aIt.Initialize(myShape); + for(; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aS=aIt.Value(); + if (aS.ShapeType()==TopAbs_SOLID){ + if (myMapSWMOut.IsBound(aS)) { + continue; + } + } + myBuilder.Add(aR, aS); + } + myRestParts=aR; +} +//======================================================================= +//function : TreatSolids +//purpose : +//======================================================================= + void NMTAlgo_Splitter1::TreatSolids() +{ + Standard_Integer i, j, aNbSd, aNbSdx, nMtMax, nMt; + TopAbs_ShapeEnum aType; + TopoDS_Iterator aIt; + TopTools_IndexedMapOfShape aMSo, aMSd; + TopTools_IndexedDataMapOfShapeListOfShape aMFS; + TopTools_ListIteratorOfListOfShape aItS, aItLS; + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape aMCS; + // + TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS); + TopExp::MapShapes(myShape, TopAbs_SOLID, aMSo); + // + aNbSd=aMSo.Extent(); + if (!aNbSd) { + return; + } + // + aItS.Initialize(myListShapes); + for ( ;aItS.More(); aItS.Next()) { + const TopoDS_Shape& aS=aItS.Value(); + // + aType=aS.ShapeType(); + if (aType != TopAbs_SOLID) { + continue; + } + // + if (myToolShapes.Contains(aS)) { + continue; + } + // + if (!myMapSIFC.IsBound(aS)){ + continue; + } + // + aMSd.Clear(); + // + const TopoDS_Shape& aIFC=myMapSIFC.Find(aS); + // + aIt.Initialize(aIFC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aIF=aIt.Value(); + if (aMFS.Contains(aIF)) { + const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aIF); + aItLS.Initialize(aLS); + for ( ;aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aSd=aItLS.Value(); + if (!aMSd.Contains(aSd)) { + aMSd.Add(aSd); + } + } + } + } + // + aNbSd=aMSd.Extent(); + if (!aNbSd) { + //modified by NIZNHY-PKV Thu Dec 23 15:07:46 2004 f + Standard_Boolean bFound; + //modified by NIZNHY-PKV Thu Dec 23 15:07:49 2004 t + TopoDS_Shape aSd; + // + const TopoDS_Shape& aFC=myImageShape.Image(aS).First(); + //modified by NIZNHY-PKV Thu Dec 23 15:08:17 2004 f + //NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + //aMSd.Add(aSd); + bFound=NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + if (!aSd.IsNull()) { + aMSd.Add(aSd); + } + //modified by NIZNHY-PKV Thu Dec 23 15:09:02 2004 t + } + aMCS.Add(aS, aMSd); + } //for ( ;aItS.More(); aItS.Next()) + // + aMFS.Clear(); + // + aNbSd=aMCS.Extent(); + for (i=1; i<=aNbSd; ++i) { + const TopoDS_Shape& aSd=aMCS.FindKey(i); + const TopTools_IndexedMapOfShape& aMSdx=aMCS(i); + aNbSdx=aMSdx.Extent(); + for (j=1; j<=aNbSdx; ++j) { + const TopoDS_Shape& aSdx=aMSdx(j); + // + if (aMFS.Contains(aSdx)) { + TopTools_ListOfShape& aLS=aMFS.ChangeFromKey(aSdx); + aLS.Append(aSd); + } + else { + TopTools_ListOfShape aLS; + aLS.Append(aSd); + aMFS.Add(aSdx, aLS); + } + } + } + // + // Assign materials values to subsolids + // + myMapSWMOut.Clear(); + // + aNbSdx=aMFS.Extent(); + for (i=1; i<=aNbSdx; ++i) { + const TopoDS_Shape& aSdx=aMFS.FindKey(i); + const TopTools_ListOfShape& aLS=aMFS(i); + aItLS.Initialize(aLS); + for (j=0; aItLS.More(); aItLS.Next(), ++j) { + const TopoDS_Shape& aSd=aItLS.Value(); + // + if (!myMapSWM.IsBound(aSd)){ + continue; + } + // + nMt=myMapSWM.Find(aSd); + if (!j) { + nMtMax=nMt; + continue; + } + if (nMt>nMtMax) { + nMtMax=nMt; + } + } + myMapSWMOut.Bind(aSdx, nMtMax); + } + // +} diff --git a/src/NMTAlgo/NMTAlgo_Splitter1.jxx b/src/NMTAlgo/NMTAlgo_Splitter1.jxx new file mode 100644 index 000000000..b593e438d --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter1.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopTools_DataMapOfShapeInteger_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Splitter1_HeaderFile +#include +#endif diff --git a/src/NMTAlgo/NMTAlgo_Splitter_1.cxx b/src/NMTAlgo/NMTAlgo_Splitter_1.cxx new file mode 100644 index 000000000..7d25ba4f2 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter_1.cxx @@ -0,0 +1,935 @@ +// 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/ +// +// File: NMTAlgo_Splitter_1.cxx +// Created: Mon Feb 2 14:58:54 2004 +// 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 +#include + +#include +// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +static + void RefineShells(const TopoDS_Shape& , + TopTools_ListOfShape&); +static + void RefineSolids(const TopoDS_Shape& , + TopTools_ListOfShape&); + +//modified by NIZNHY-PKV Fri Feb 25 17:19:39 2005f XX +static + void GetPlanes (const TopoDS_Edge& anEx, + const TopTools_IndexedDataMapOfShapeListOfShape& anEFMapx, + const TopoDS_Face& aF1, + TopAbs_State& aStPF1); +//modified by NIZNHY-PKV Fri Feb 25 17:19:44 2005t XX + +//======================================================================= +//function : ShellsAndSolids +//purpose : +//======================================================================= + void NMTAlgo_Splitter::ShellsAndSolids() +{ + Standard_Boolean bMakeSolids; + TopAbs_ShapeEnum aType; + TopTools_ListIteratorOfListOfShape aItS; + TopTools_ListOfShape aLNS; + // + myAddedFacesMap.Clear(); + bMakeSolids=(myLimit==TopAbs_SHAPE || myLimit TopAbs_SHELL) { + continue;//face,wire,... + } + // + aLNS.Clear(); + // + MakeShells (aS, aLNS); + // + if (bMakeSolids && aType==TopAbs_SOLID) { + MakeSolids(aS, aLNS); + } + // + TopTools_ListIteratorOfListOfShape it (aLNS); + for (; it.More(); it.Next()) { + myBuilder.Add (myShape, it.Value()); + } + } + // + // add split faces + aItS.Initialize(myListShapes); + for ( ;aItS.More(); aItS.Next()) { + const TopoDS_Shape& aS=aItS.Value(); + // + aType=aS.ShapeType(); + if (aType!=TopAbs_FACE || myMapTools.Contains(aS)) { + continue; + } + // + const TopoDS_Shape& aCSF=myImageShape.Image(aS).First(); + TopoDS_Iterator itS(aCSF); + for (; itS.More(); itS.Next()){ + const TopoDS_Shape& aF=itS.Value(); + if (!myAddedFacesMap.Contains(aF)){ + myBuilder.Add (myShape, aF); + } + } + } +} +//======================================================================= +//function : MakeShells +//purpose : split S into compound of shells +//======================================================================= +void NMTAlgo_Splitter::MakeShells(const TopoDS_Shape& aS, + TopTools_ListOfShape& aLNS) +{ + NMTAlgo_Loop3d aShellMaker; + // + // get compound of split faces of aS + const TopoDS_Shape& aFC=myImageShape.Image(aS).First(); + aShellMaker.AddConstFaces(aFC); + // + // add split faces inside aS + if (myClosedShapes.Contains(aS)) { + // + // internal faces compound + TopoDS_Shape aIFC=FindFacesInside(aS, Standard_True); + aShellMaker.AddSectionFaces(aIFC); + } + // + aLNS=aShellMaker.MakeShells(myAddedFacesMap); + // + RefineShells(aS, aLNS); + // + // Add faces added to new shell to myAddedFacesMap: + // avoid rebuilding twice common part of 2 solids. + + TopTools_ListIteratorOfListOfShape itS(aLNS); + TopExp_Explorer expF; + for (; itS.More(); itS.Next()) { + const TopoDS_Shape& aSh=itS.Value(); + expF.Init (aSh, TopAbs_FACE); + for (; expF.More(); expF.Next()){ + myAddedFacesMap.Add (expF.Current()); + } + } + +} +//======================================================================= +//function : MakeSolids +//purpose : make solids out of Shells +//======================================================================= +void NMTAlgo_Splitter::MakeSolids(const TopoDS_Shape& theSolid, + TopTools_ListOfShape& theShellList) +{ + // for a solid wrapping other shells or solids without intersection, + // it is necessary to find shells making holes in it + Standard_Boolean isWrapping; + TopTools_ListOfShape aNewSolids; // result + TopTools_ListOfShape aHoleShells; + TopoDS_Shape anInfinitePointShape; + TopTools_DataMapOfShapeShape aInOutMap; + TopTools_ListIteratorOfListOfShape aShellIt, aSolisIt; + // + isWrapping = myWrappingSolid.Contains(theSolid); + if (!isWrapping && !theShellList.IsEmpty()) { + // check if theSolid initially has internal shells + TopoDS_Iterator aShellExp (theSolid); + aShellExp.Next(); + isWrapping = aShellExp.More(); + } + // + aShellIt.Initialize(theShellList); + for ( ; aShellIt.More(); aShellIt.Next()) { + const TopoDS_Shape & aShell = aShellIt.Value(); + // check if a shell is a hole of theSolid + if (isWrapping && IsInside(anInfinitePointShape, aShell)){ + aHoleShells.Append(aShell); + } + else { + // make a solid from a shell + TopoDS_Solid Solid; + myBuilder.MakeSolid( Solid ); + myBuilder.Add (Solid, aShell); + + aNewSolids.Append (Solid); + } + } + // + // find outer a shell most close to each hole shell + aShellIt.Initialize(aHoleShells); + for (; aShellIt.More(); aShellIt.Next()){ + const TopoDS_Shape & aHole = aShellIt.Value(); + // + aSolisIt.Initialize(aNewSolids); + for ( ; aSolisIt.More(); aSolisIt.Next()) { + const TopoDS_Shape & aSolid = aSolisIt.Value(); + // + if (! IsInside(aHole, aSolid)){ + continue; + } + // + if ( aInOutMap.IsBound (aHole)){ + const TopoDS_Shape & aSolid2 = aInOutMap( aHole ); + if ( IsInside( aSolid, aSolid2 )) { + aInOutMap.UnBind( aHole ); + aInOutMap.Bind ( aHole, aSolid ); + } + } + else{ + aInOutMap.Bind (aHole, aSolid); + } + } + // + // add aHole to a solid + if (aInOutMap.IsBound( aHole )){ + TopoDS_Shape & aSolid=aInOutMap(aHole); + myBuilder.Add (aSolid, aHole); + } + } + // + theShellList.Clear(); + // + RefineSolids(theSolid, aNewSolids); + // + theShellList.Append(aNewSolids); +} + +//======================================================================= +//function : FindFacesInside +//purpose : return compound of faces of other shapes that are +// inside . +// is an object shape. +// makes avoid faces that do not form a +// closed shell +// makes return already added faces +//======================================================================= + TopoDS_Shape NMTAlgo_Splitter::FindFacesInside(const TopoDS_Shape& theShape, + const Standard_Boolean CheckClosed, + const Standard_Boolean All) +{ + TopExp_Explorer expl; + TopAbs_State aState; + // + // ================================================ + // check if internal faces have been already found + // ================================================ + if (myInternalFaces.IsBound(theShape)) { + TopoDS_Shape aIntFComp = myInternalFaces.Find (theShape); + TopoDS_Shape aIntRemFComp = myIntNotClFaces.Find (theShape); + + expl.Init( aIntRemFComp, TopAbs_FACE); + if (CheckClosed || !expl.More()){ + return aIntFComp; + } + // + TopoDS_Compound C; + myBuilder.MakeCompound( C ); + // add removed faces + for (; expl.More(); expl.Next()){ + myBuilder.Add( C, expl.Current() ); + } + // add good internal faces + expl.Init( aIntFComp, TopAbs_FACE); + for (; expl.More(); expl.Next()) { + myBuilder.Add( C, expl.Current() ); + } + // + return C; + } + + // =================================== + // get data for internal faces search + // =================================== + // + // compound of split faces of theShape + const TopoDS_Shape& CSF = myImageShape.Image(theShape).First(); + // + TopTools_MapOfShape MSE, MFP; + TopTools_DataMapOfShapeListOfShape DMSEFP; + TopTools_MapIteratorOfMapOfShape itm; + TopTools_ListOfShape EmptyL; + TopTools_ListIteratorOfListOfShape itl; + + // MSE filling: map of new section edges of CSF + expl.Init(CSF, TopAbs_EDGE); + for (; expl.More(); expl.Next()) { + const TopoDS_Shape& aE = expl.Current() ; + MSE.Add(aE); + } + // + // DMEF: map edge of CSF - faces of CSF + TopTools_IndexedDataMapOfShapeListOfShape DMEF; + TopExp::MapShapesAndAncestors(CSF, TopAbs_EDGE, TopAbs_FACE, DMEF); + // + // Fill + // 1. MFP - a map of faces to process: map of resulting faces except + // those of theShape; we`ll add to C those of them which are inside CSF + // 2. DMSEFP - edge of MSE => faces of MFP + // + itl.Initialize(myListShapes); + for (;itl.More(); itl.Next()) { + const TopoDS_Shape& aShape = itl.Value(); + // + if ( theShape.IsSame(aShape)) { + continue; + } + // fill maps + // iterate on split faces of aShape + const TopoDS_Shape& CSF1 = myImageShape.Image(aShape).First(); + TopoDS_Iterator itF (CSF1); + for ( ; itF.More(); itF.Next()) { + const TopoDS_Shape& aF1 = itF.Value(); + MFP.Add(aF1); + // iterate on edges of split faces of aShape, + // add to DMSEFP edges that are new + expl.Init(aF1, TopAbs_EDGE); + for (; expl.More(); expl.Next()) { + TopoDS_Shape aE1 = expl.Current(); + if ( MSE.Contains(aE1)) {// section edge + if (!DMSEFP.IsBound(aE1)) { + DMSEFP.Bind(aE1, EmptyL); + } + DMSEFP(aE1).Append(aF1); + } + } + } + }//for (;itl.More(); itl.Next()) + // + // add tool faces... (is absent) + // + // =========================== + // find faces inside theShape + // =========================== + Standard_Boolean sameDom1, sameDom2; + Standard_Boolean skipAlreadyAdded = Standard_False; + Standard_Boolean GoodOri, inside; + Standard_Real dot; + TopTools_ListOfShape KeepFaces; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit; + + // iterate on section edges, check faces of other shapes + // sharing section edges and put internal faces to KeepFaces + Mapit.Initialize(DMSEFP); + for (; Mapit.More() ; Mapit.Next()) { + // a new edge of theShape + const TopoDS_Edge& E = TopoDS::Edge (Mapit.Key()); + // + //Standard_Boolean isSectionE=IsSectionEdge(E);//(OrigE); + // + // split faces of other shapes sharing E + TopTools_ListOfShape& LSF = DMSEFP.ChangeFind(E); + // + itl.Initialize( LSF ); + while (itl.More()) { + // a split faces of other shape + TopoDS_Face aFace1 = TopoDS::Face(itl.Value()); + // remove aFace1 form DMSEFP and MFP + LSF.Remove( itl ); // == itl.Next(); + if (!MFP.Remove(aFace1)) + continue; // was not is MFP (i.e already checked) + // + // check if aFace1 was already added to 2 shells + if (!All && + myAddedFacesMap.Contains(aFace1) && + myAddedFacesMap.Contains(aFace1.Reversed())) { + skipAlreadyAdded = Standard_True; + } + // + TopoDS_Shape anOrigFace = aFace1; + if (myImagesFaces.IsImage(aFace1)){ + anOrigFace = myImagesFaces.Root(aFace1); + } + // + // <- A was here + // + // check that anOrigFace is not same domain with CSF faces it intersects + // + const TopTools_ListOfShape& FL = DMEF.FindFromKey(E); //faces of CSF sharing E + // + const TopoDS_Shape& origF1 = myImagesFaces.IsImage(FL.First()) ? + myImagesFaces.Root(FL.First()) : FL.First(); + // + const TopoDS_Shape& origF2 = myImagesFaces.IsImage(FL.Last()) ? + myImagesFaces.Root(FL.Last()) : FL.Last(); + // + sameDom1 = anOrigFace.IsSame( origF1 ); + sameDom2 = anOrigFace.IsSame( origF2 ); + // + if (!(sameDom1 || sameDom2) && HasSameDomainF( TopoDS::Face(anOrigFace) )) { + sameDom1 = IsSameDomainF( TopoDS::Face(anOrigFace), TopoDS::Face(origF1)); + if (origF1 == origF2) { + sameDom2 = sameDom1; + } + } + if (sameDom1 && sameDom2){ + continue; + } + // + if (sameDom1 || sameDom2) { + inside = NMTAlgo_Loop3d::IsInside (E, + TopoDS::Face(FL.First()), + TopoDS::Face(FL.Last()), + 1, dot, GoodOri); + if (inside || (dot + Precision::Angular() >= 1.0)) { + continue; // E is convex between origF1 and origF2 or they are tangent + } + } + // + GetPlanes(E, DMEF, aFace1, aState); + if (aState==TopAbs_IN) { + KeepFaces.Append(aFace1); + } + } //while (itl.More()) { + } //for (; Mapit.More() ; Mapit.Next() ) + + // =================================================== + // add not distributed faces connected with KeepFaces + // =================================================== + + // ultimate list of internal faces + TopTools_ListOfShape KeptFaces; + // + // add to MFP not split tool faces as well, they may be connected with + // tool faces interfering with theShape + /* + itm.Initialize(myMapTools); + for (; itm.More(); itm.Next() ) { + const TopoDS_Shape& aToolFace = itm.Key(); + if (!myImageShape.HasImage(aToolFace)){ + MFP.Add (aToolFace); + } + } + */ + // + if (MFP.IsEmpty()) + KeptFaces.Append (KeepFaces); + // + while (!KeepFaces.IsEmpty()) { + // KeepEdges : map of edges of faces kept last time + TopTools_IndexedMapOfShape KeepEdges; + for ( itl.Initialize(KeepFaces); itl.More(); itl.Next() ) { + TopExp::MapShapes( itl.Value(), TopAbs_EDGE, KeepEdges); + KeptFaces.Append( itl.Value() ); + } + // + KeepFaces.Clear(); + // + // keep faces connected with already kept faces by KeepEdges + for ( itm.Initialize(MFP); itm.More(); itm.Next() ) { + const TopoDS_Shape& FP = itm.Key(); + for (expl.Init(FP,TopAbs_EDGE); expl.More(); expl.Next()) { + const TopoDS_Shape& se = expl.Current(); + if (!MSE.Contains(se) && KeepEdges.Contains(se) ) { + KeepFaces.Append(FP); + MFP.Remove(FP); + break; + } + } + } + } + + // =============================================================== + // here MFP contains faces outer of theShape and those of shapes + // which do not interfere with theShape at all and between which + // there may be those wrapped by theShape and whose faces may be + // needed to be returned as well + // =============================================================== + + Standard_Boolean isSolid = (theShape.ShapeType() == TopAbs_SOLID); + if (All || isSolid) // All is for sub-result removal + { + for ( itm.Initialize( MFP ); itm.More(); itm.Next() ) { + TopoDS_Shape aFace = itm.Key(); + + // find a shape aFace originates from + TopoDS_Shape anOrigShape = GetOriginalShape( aFace ); + + // find out if all faces of anOrigShape are not in MFP + // and by the way remove them from MFP + Standard_Boolean isAllOut = Standard_True; + TopoDS_Shape aSplitFaces = anOrigShape; + if (myImageShape.HasImage(anOrigShape)) + aSplitFaces = myImageShape.Image(anOrigShape).First(); + + TopTools_ListOfShape aSplitFaceL; + for (expl.Init( aSplitFaces, TopAbs_FACE ); expl.More(); expl.Next()) + { + const TopoDS_Shape & aSpFace = expl.Current(); + // a tool face which become object has image but the whole tool shape has not + if (myImageShape.HasImage( aSpFace )) + { + TopExp_Explorer exF (myImageShape.Image( aSpFace ).First(), TopAbs_FACE ); + for ( ; exF.More(); exF.Next() ) + { + aSplitFaceL.Append( exF.Current() ); + if ( ! MFP.Remove( exF.Current() )) + isAllOut = Standard_False; + } + } + else + { + aSplitFaceL.Append( aSpFace ); + if ( ! MFP.Remove( aSpFace )) + isAllOut = Standard_False; + } + } + itm.Initialize( MFP ); + if ( !isAllOut ) + continue; + + // classify anOrigShape against theShape + if (IsInside (anOrigShape, theShape)) { + if (isSolid && myClosedShapes.Contains(anOrigShape)) { + // to make a special care at solid reconstruction + myWrappingSolid.Add ( theShape ); + } + // keep faces of an internal shape anOrigShape + KeptFaces.Append( aSplitFaceL ); + } + } + } + + // ==================================================== + // check if kept faces form a shell without free edges + // ==================================================== + + DMEF.Clear(); // edge - kept faces + MFP.Clear(); // reuse it for wrong faces + if (CheckClosed) { + for (itl.Initialize(KeptFaces); itl.More(); itl.Next() ) + TopExp::MapShapesAndAncestors(itl.Value(), TopAbs_EDGE, TopAbs_FACE, DMEF); + + Standard_Integer i, nb = DMEF.Extent(); + Standard_Boolean isClosed = Standard_False; + while (!isClosed) { + isClosed = Standard_True; + for (i=1; isClosed && i<=nb; ++i) { + const TopoDS_Shape& E = DMEF.FindKey( i ); + if (! BRep_Tool::Degenerated( TopoDS::Edge( E )) && + ! MSE.Contains( E )) + isClosed = ( DMEF(i).Extent() != 1 ); + } + if (!isClosed) { + const TopoDS_Shape& F = DMEF.FindFromIndex( i-1 ).First(); // bad face + MFP.Add( F ); + // remove bad face from DMEF + for (expl.Init( F, TopAbs_EDGE); expl.More(); expl.Next()) { + const TopoDS_Shape& E = expl.Current(); + TopTools_ListOfShape& FL = DMEF.ChangeFromKey( E ); + for (itl.Initialize( FL ); itl.More(); itl.Next() ) { + if ( F.IsSame( itl.Value() )) { + FL.Remove( itl ); + break; + } + } + } + } + } + } + + // ============== + // make a result + // ============== + + TopoDS_Compound C; + // compound of removed internal faces + TopoDS_Compound CNotCl; + + myBuilder.MakeCompound(C); + myBuilder.MakeCompound(CNotCl); + + // add to compounds + itl.Initialize(KeptFaces); + for (; itl.More(); itl.Next() ) { + TopoDS_Shape & aIntFace = itl.Value(); + // + if (!All && + myAddedFacesMap.Contains(aIntFace) && + myAddedFacesMap.Contains(aIntFace.Reversed())) { + continue; + } + // + if (! MFP.Contains( aIntFace )){ + myBuilder.Add(C, aIntFace); + } + else{ + myBuilder.Add(CNotCl, aIntFace); + } + } + // + if (!skipAlreadyAdded && CheckClosed) { + myInternalFaces.Bind(theShape, C); + myIntNotClFaces.Bind(theShape, CNotCl); + } + // + // + if (!myMapSIFC.IsBound(theShape)) { + TopoDS_Compound aCIF; + myBuilder.MakeCompound(aCIF); + // + itl.Initialize(KeptFaces); + for (; itl.More(); itl.Next() ) { + TopoDS_Shape & aIntFace = itl.Value(); + if (! MFP.Contains(aIntFace )){ + myBuilder.Add(aCIF, aIntFace); + } + } + myMapSIFC.Bind(theShape, aCIF); + } + // + return C; +} +//======================================================================= +//function : IsInside +//purpose : Return True if the first vertex of S1 inside S2. +// If S1.IsNull(), check infinite point against S2. +//======================================================================= +Standard_Boolean NMTAlgo_Splitter::IsInside (const TopoDS_Shape& theS1, + const TopoDS_Shape& theS2) +{ + BRepClass3d_SolidClassifier aClassifier( theS2 ); + // + TopExp_Explorer expl(theS1, TopAbs_VERTEX); + // + if (!expl.More()){ + aClassifier.PerformInfinitePoint( ::RealSmall()); + } + else { + const TopoDS_Vertex & aVertex = TopoDS::Vertex( expl.Current() ); + aClassifier.Perform (BRep_Tool::Pnt( aVertex ), + BRep_Tool::Tolerance( aVertex )); + } + // + return ( aClassifier.State() == TopAbs_IN ); +} +//======================================================================= +//function : GetOriginalShape +//purpose : Return the shape aShape originates from. aShape +// should be a face or more complex result shape +//======================================================================= +TopoDS_Shape NMTAlgo_Splitter::GetOriginalShape(const TopoDS_Shape& theShape) const +{ + TopoDS_Shape anOrigShape; + + TopExp_Explorer expl( theShape, TopAbs_FACE); + if (expl.More()) { + TopoDS_Shape aFace = expl.Current(); + if (myImagesFaces.IsImage( aFace )) + aFace = myImagesFaces.Root( aFace ); + anOrigShape = myFaceShapeMap.Find( aFace ); + } + return anOrigShape; +} +//======================================================================= +//function :RefineShells +//purpose : +//======================================================================= +void RefineShells(const TopoDS_Shape& aS, + TopTools_ListOfShape& aLNS) +{ + Standard_Boolean bFound; + Standard_Integer iS, jS, aNbSOrs, aNbSIms, aNbFOrs, aNbFIms, kFOrs, aNb; + TopTools_ListIteratorOfListOfShape aIt; + TopTools_IndexedMapOfShape aMSOrs, aMSIms, aMFOrs, aMFIms; + TopTools_IndexedDataMapOfShapeShape aMImOr; + TopTools_ListOfShape aLS; + // + TopExp::MapShapes(aS, TopAbs_SHELL, aMSOrs); + aIt.Initialize(aLNS); + for (;aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSh=aIt.Value(); + aMSIms.Add(aSh); + } + // + aNbSOrs=aMSOrs.Extent(); + aNbSIms=aMSIms.Extent(); + // + for (iS=1; iS<=aNbSOrs; ++iS) { + const TopoDS_Shape& aSOr=aMSOrs(iS); + aMFOrs.Clear(); + TopExp::MapShapes(aSOr, TopAbs_FACE, aMFOrs); + aNbFOrs=aMFOrs.Extent(); + // + for (jS=1; jS<=aNbSIms; ++jS) { + const TopoDS_Shape& aSIm=aMSIms(jS); + if (aMImOr.Contains(aSIm)) { + continue; + } + // + aMFIms.Clear(); + TopExp::MapShapes(aSIm, TopAbs_FACE, aMFIms); + aNbFIms=aMFIms.Extent(); + // + if (aNbFIms==aNbFOrs) { + bFound=Standard_True; + for (kFOrs=1; kFOrs<=aNbFOrs; ++kFOrs) { + const TopoDS_Shape& aFOr=aMFOrs(kFOrs); + if (!aMFIms.Contains(aFOr)) { + bFound=Standard_False; + break; //next aSIm + } + } + if (bFound){ + aMImOr.Add(aSIm, aSOr); + break; //next aSOr + } + } //if (aNbFIms==aNbFOrs) + } + } + // + aNb=aMImOr.Extent(); + aIt.Initialize(aLNS); + for (;aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSh=aIt.Value(); + if (aMImOr.Contains(aSh)) { + const TopoDS_Shape& aSOr=aMImOr.FindFromKey(aSh); + aLS.Append(aSOr); + } + else { + aLS.Append(aSh); + } + } + // + aLNS.Clear(); + aLNS.Append(aLS); +} + +//======================================================================= +//function :RefineSolids +//purpose : +//======================================================================= +void RefineSolids(const TopoDS_Shape& aSolidOr, + TopTools_ListOfShape& aLNS) +{ + Standard_Integer aNb, iS, aNbSOrs, aNbSIms; + TopoDS_Shape aSolidIm; + TopTools_IndexedMapOfShape aMSOrs, aMSIms; + // + aNb=aLNS.Extent(); + if (aNb!=1) { + return; + } + // + aSolidIm=aLNS.First(); + + TopExp::MapShapes(aSolidOr, TopAbs_SHELL, aMSOrs); + TopExp::MapShapes(aSolidIm, TopAbs_SHELL, aMSIms); + aNbSOrs=aMSOrs.Extent(); + aNbSIms=aMSIms.Extent(); + if (aNbSOrs!=aNbSIms) { + return; + } + // + for (iS=1; iS<=aNbSOrs; ++iS) { + const TopoDS_Shape& aSOr=aMSOrs(iS); + if (!aMSIms.Contains(aSOr)) { + return; + } + } + // + aLNS.Clear(); + aLNS.Append(aSolidOr); +} +//modified by NIZNHY-PKV Fri Feb 25 16:59:57 2005f XX +//======================================================================= +//function : GetPlanes +//purpose : +//======================================================================= +void GetPlanes (const TopoDS_Edge& anEx, + const TopTools_IndexedDataMapOfShapeListOfShape& anEFMapx, + const TopoDS_Face& aF1, + TopAbs_State& aStPF1) + +{ + Standard_Boolean bIsAdjExists; + Standard_Real aT, aT1, aT2; + TopAbs_Orientation anOrEx, anOr; + gp_Dir aDNFx1, aDNFx2, aDNF1; + gp_Pnt aPx, aPx1, aPx2, aPF1; + TopoDS_Edge aERight, aSpxSimm; + TopoDS_Face aFx1, aFx2, aFF1; + TopTools_ListIteratorOfListOfShape anIt; + // + // Point on Edge + Handle(Geom_Curve)aC3D =BRep_Tool::Curve(anEx, aT1, aT2); + aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); + + aC3D->D0(aT, aPx); + // + anOrEx=anEx.Orientation(); + + aSpxSimm=anEx; + if (anOrEx==TopAbs_FORWARD) { + aSpxSimm.Orientation(TopAbs_REVERSED); + } + else if (anOrEx==TopAbs_REVERSED){ + aSpxSimm.Orientation(TopAbs_FORWARD); + } + // + const TopTools_ListOfShape& aLF=anEFMapx.FindFromKey(anEx); + anIt.Initialize(aLF); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape& aFE=anIt.Value(); + aFx1=TopoDS::Face(aFE); + anOr=BOPTools_Tools3D::Orientation(anEx, aFx1); + if (anOr==anOrEx){ + break; + } + } + // + BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (anEx, aFx1, aT, aPx1, aDNFx1); + // + bIsAdjExists=BOPTools_Tools3D::GetAdjacentFace (aFx1, anEx, anEFMapx, aFx2); + if (!bIsAdjExists) { + BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (aSpxSimm, aFx1, aT, aPx2, aDNFx2); + } + else { + BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (aSpxSimm, aFx2, aT, aPx2, aDNFx2); + } + // + aFF1=aF1; + aFF1.Orientation(TopAbs_FORWARD); + BOPTools_Tools3D::OrientEdgeOnFace (anEx, aFF1, aERight); + BOPTools_Tools3D::GetApproxNormalToFaceOnEdge (aERight, aFF1, aT, aPF1, aDNF1); + // + { + Standard_Real d12, d1, anAlfa12, anAlfa1, aTwoPI; + + aTwoPI=Standard_PI+Standard_PI; + + gp_Vec aVx1(aPx, aPx1); + gp_Dir aDBx1 (aVx1); + gp_Pln aPlnToCompare (aPx, aDNFx1); + + gp_Vec aVx2(aPx, aPx2); + gp_Dir aDBx2 (aVx2); + + anAlfa12=aDBx1.Angle(aDBx2); + d12=BOPTools_Tools3D::SignDistance(aPx2, aPlnToCompare); + if (d12 < 0.) { + anAlfa12=aTwoPI-anAlfa12; + } + + gp_Vec aVF1(aPx, aPF1); + gp_Dir aDBF1 (aVF1); + anAlfa1=aDBx1.Angle(aDBF1); + d1=BOPTools_Tools3D::SignDistance(aPF1, aPlnToCompare); + if (d1 < 0.) { + anAlfa1=aTwoPI-anAlfa1; + } + + aStPF1=TopAbs_OUT; + if (anAlfa1 > anAlfa12) { + aStPF1=TopAbs_IN; + } + } +} +//modified by NIZNHY-PKV Fri Feb 25 17:00:03 2005t XX +/* + A + // + TopoDS_Shape aFace2; + if ( !isSectionE ) { + while (itl.More()) { + aFace2 = itl.Value(); + // + TopoDS_Shape anOrigFace2 = aFace2; + if (myImagesFaces.IsImage(aFace2)) { + anOrigFace2 = myImagesFaces.Root(aFace2); + } + // + if (!MFP.Contains( aFace2 )) { + LSF.Remove( itl ); + continue; + } + //if (anOrigFace.IsSame( myImagesFaces.Root( aFace2 ))) + if (anOrigFace.IsSame(anOrigFace2)) { + break; + } + itl.Next(); + } + if (itl.More()) { // aFace2 found, remove it from maps + LSF.Remove( itl ); + MFP.Remove(aFace2); + } + else{ + aFace2.Nullify(); + } + itl.Initialize( LSF ); + } + */ diff --git a/src/NMTAlgo/NMTAlgo_Splitter_2.cxx b/src/NMTAlgo/NMTAlgo_Splitter_2.cxx new file mode 100644 index 000000000..801d57334 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Splitter_2.cxx @@ -0,0 +1,679 @@ +// 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/ +// +// File: NMTAlgo_Splitter_2.cxx +// Created: Mon Feb 9 15:07:51 2004 +// Author: Igor FEOKTISTOV +// + + +#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 + +//======================================================================= +//function : KeepShapesInside +//purpose : remove shapes that are outside of S from result +//======================================================================= + void NMTAlgo_Splitter::KeepShapesInside (const TopoDS_Shape& S) +{ + TopoDS_Iterator it; + if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid + for (it.Initialize( S ); it.More(); it.Next()) + KeepShapesInside( it.Value()); + return; + } + + Standard_Boolean isTool = Standard_False; + if (!myImageShape.HasImage( S )) { + //isTool = CheckTool( S ); + //if (!isTool) return; + return; + } + + // build map of internal faces + TopTools_IndexedMapOfShape MIF; + TopoDS_Shape IntFacesComp = FindFacesInside( S, Standard_False, Standard_True); + TopExp::MapShapes( IntFacesComp, TopAbs_FACE, MIF ); + + TopoDS_Compound C; + myBuilder.MakeCompound(C); + + TopAbs_ShapeEnum anInternalShapeType = TopAbs_SHAPE; + if (!MIF.IsEmpty()) + { + // leave in the result only those shapes having a face in MIF + for (it.Initialize( myShape ); it.More(); it.Next()) { + const TopoDS_Shape & aResShape = it.Value(); + TopExp_Explorer expResF( aResShape, TopAbs_FACE ); + for (; expResF.More(); expResF.Next()) { + if ( MIF.Contains( expResF.Current())) { + myBuilder.Add( C, aResShape ); + if (aResShape.ShapeType() < anInternalShapeType) + anInternalShapeType = aResShape.ShapeType(); + break; + } + } + } + } + + // may be S was not split by internal faces then it is missing + // in myShape, add it + if (!isTool && + (anInternalShapeType > TopAbs_SOLID || S.ShapeType() > TopAbs_SOLID)) + { + TopTools_IndexedMapOfShape MSF; // map of split faces of S + TopExp::MapShapes( myImageShape.Image(S).First(), TopAbs_FACE, MSF); + + // find a shape having all faces in MSF + for (it.Initialize( myShape ); it.More(); it.Next()) { + TopExp_Explorer expResF( it.Value(), TopAbs_FACE ); + for (; expResF.More(); expResF.Next()) { + if (! MSF.Contains( expResF.Current())) + break; + } + if (! expResF.More()) { + myBuilder.Add( C, it.Value() ); + break; + } + } + } + + myShape = C; +} + +//======================================================================= +//function : RemoveShapesInside +//purpose : remove shapes that are inside S from result +//======================================================================= + void NMTAlgo_Splitter::RemoveShapesInside (const TopoDS_Shape& S) +{ + TopoDS_Iterator it; + if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid + it.Initialize( S ); + for (; it.More(); it.Next()) { + RemoveShapesInside( it.Value()); + } + return; + } + // + Standard_Boolean isTool; + TopoDS_Shape IntFacesComp; + TopoDS_Compound C; + TopTools_IndexedMapOfShape MIF; // map of internal faces + TopTools_MapOfShape RFM; + TopTools_MapIteratorOfMapOfShape itF; + // + isTool=myToolShapes.Contains(S); + //isTool = Standard_False; + if (!myImageShape.HasImage( S )) { + return; + } + // + IntFacesComp = FindFacesInside( S, Standard_False, Standard_True); + // + TopExp::MapShapes( IntFacesComp, TopAbs_FACE, MIF); + if (MIF.IsEmpty()) { + return; + } + // add to MIF split faces of S + const TopoDS_Shape& aSIm=myImageShape.Image(S).First(); + TopExp::MapShapes(aSIm, TopAbs_FACE, MIF); + // + // leave in the result only those shapes not having all face in MIF + myBuilder.MakeCompound(C); + // + // RFM : faces of removed shapes that encounter once + it.Initialize(myShape); + for (; it.More(); it.Next()) { + TopExp_Explorer expResF; + // + const TopoDS_Shape& aSR=it.Value(); + // + expResF.Init(aSR, TopAbs_FACE); + for (; expResF.More(); expResF.Next()) { + const TopoDS_Shape& aFR=expResF.Current(); + if (!MIF.Contains(aFR)) { + break; + } + } + // + if (expResF.More()) { + // add shape to result + myBuilder.Add(C, aSR); + } + else { + // add faces of a removed shape to RFM + for (expResF.ReInit(); expResF.More(); expResF.Next()) { + const TopoDS_Shape& aF = expResF.Current(); + if (!RFM.Remove(aF)) { + RFM.Add(aF); + } + } + } + }// for (; it.More(); it.Next()) + // + // + TopoDS_Compound aCx; + // + myBuilder.MakeCompound(aCx); + itF.Initialize (RFM); + for (; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + myBuilder.Add(aCx, aF); + } + // + if (!isTool) { + // rebuild S, it must remain in the result + Standard_Boolean isClosed = Standard_False; + switch (S.ShapeType()) { + case TopAbs_SOLID : + isClosed = Standard_True; break; + case TopAbs_SHELL: { + TopTools_IndexedDataMapOfShapeListOfShape MEF; + TopExp::MapShapesAndAncestors(S, TopAbs_EDGE, TopAbs_FACE, MEF); + Standard_Integer i; + for (i=1; isClosed && i<=MEF.Extent(); ++i) { + isClosed = ( MEF(i).Extent() != 1 ); + } + break; + } + default: + isClosed = Standard_False; + } + // + if (isClosed) { + // add to a new shape external faces of removed shapes, ie those in RFM + TopoDS_Shell Shell; + myBuilder.MakeShell(Shell); + // exclude redundant internal face with edges encounterd only once + TopTools_IndexedDataMapOfShapeListOfShape MEF; + // + itF.Initialize (RFM); + for ( ; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, MEF); + } + // add only faces forming a closed shell + for (itF.Reset() ; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + TopExp_Explorer expE (aF, TopAbs_EDGE); + for (; expE.More(); expE.Next()) { + if (MEF.FindFromKey(expE.Current()).Extent() == 1) { + break; + } + } + if (!expE.More()) { + myBuilder.Add( Shell, aF); + } + else { + //int a=0; + } + } + + if (S.ShapeType() == TopAbs_SOLID) { + TopoDS_Solid Solid; + myBuilder.MakeSolid( Solid ); + myBuilder.Add (Solid, Shell); + myBuilder.Add (C, Solid); + } + else { + myBuilder.Add (C, Shell); + } + } // if (isClosed) { + else { + it.Initialize(aSIm); + for (; it.More(); it.Next()) { + myBuilder.Add (C, it.Value()); + } + } + } + // + myShape = C; +} +// +//modified by NIZNHY-PKV Tue Feb 1 16:02:29 2005 f +//======================================================================= +//function : Modified +//purpose : +//======================================================================= +const TopTools_ListOfShape& NMTAlgo_Splitter::Modified (const TopoDS_Shape& S) + +{ + TopAbs_ShapeEnum aType; + // + myGenerated.Clear(); + // + aType=S.ShapeType(); + // + switch (aType) { + case TopAbs_SOLID: + case TopAbs_FACE: + case TopAbs_EDGE: + case TopAbs_VERTEX: + FindImage(S, myGenerated); + break; + + case TopAbs_SHELL: + break; + + case TopAbs_WIRE: + break; + + default: + break; + } + // + return myGenerated; +} +//modified by NIZNHY-PKV Tue Feb 1 16:02:33 2005 t +//======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean NMTAlgo_Splitter::IsDeleted (const TopoDS_Shape& S) + +{ + const TopTools_ListOfShape& aL = Modified(S); + if(aL.Extent() != 0) return Standard_False; + + TopTools_MapOfShape aMap; + TopExp_Explorer anExp; + + TopAbs_ShapeEnum aType = S.ShapeType(); + + if(aType == TopAbs_VERTEX || + aType == TopAbs_EDGE || + aType == TopAbs_FACE ) { + + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + if(S.IsSame(anExp.Current())) return Standard_False; + } + + } + + return Standard_True; +} +//======================================================================= +//function : Generated +//purpose : +//======================================================================= +const TopTools_ListOfShape& NMTAlgo_Splitter::Generated(const TopoDS_Shape& S) +{ + myGenerated.Clear(); + TopTools_ListIteratorOfListOfShape it; + TopTools_MapOfShape aMap; + TopExp_Explorer anExp; + Standard_Boolean bCheckVert = Standard_False; + + if(S.ShapeType() == TopAbs_FACE) { + if (mySectionParts.Contains(S)) { + it.Initialize(mySectionParts.FindFromKey(S)); + anExp.Init(myShape, TopAbs_EDGE); + + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + + for (; it.More(); it.Next()) { + if(aMap.Contains(it.Value())) { + myGenerated.Append(it.Value()); + } + } + } + + NMTTools_PaveFiller& aPF = myDSFiller->ChangePaveFiller(); + const NMTDS_ShapesDataStructure& aDS = myDSFiller->DS(); + const BOPTools_PInterferencePool& anIP = aPF.InterfPool(); + + Standard_Integer aNbS = aDS.NumberOfSourceShapes(); + Standard_Integer anIndex = 0, i; + + for(i = 1; i <= aNbS; ++i) { + + const TopoDS_Shape& aS = aDS.Shape(i); + if(S.IsSame(aS)) { + anIndex = i; + break; + } + + } + + if(anIndex == 0) return myGenerated; + if(!anIP->HasInterference(anIndex)) return myGenerated; + + const BOPTools_CArray1OfESInterference& aESs = anIP->ESInterferences(); + Standard_Integer aNbI = aESs.Extent(); + + if(aNbI == 0) return myGenerated; + + for(i = 1; i <= aNbI; ++i) { + + const BOPTools_ESInterference& aES = aESs(i); + Standard_Integer ind1, ind2; + aES.Indices(ind1, ind2); + + if(ind1 == anIndex || ind2 == anIndex) { + + Standard_Integer aNSI = aES.NewShape(); + if(aDS.GetShapeType(aNSI) == TopAbs_VERTEX) { + myGenerated.Append(aDS.Shape(aNSI)); + bCheckVert = Standard_True; + } + + } + + } + + if(bCheckVert) { + aMap.Clear(); + anExp.Init(myShape, TopAbs_VERTEX); + + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + + it.Initialize(myGenerated); + for (; it.More(); it.Next()) { + + if(it.Value().ShapeType() != TopAbs_VERTEX) continue; + + if(!aMap.Contains(it.Value())) { + myGenerated.Remove(it); + } + + } + } + + return myGenerated; + } + + if(S.ShapeType() == TopAbs_EDGE) { + + NMTTools_PaveFiller& aPF = myDSFiller->ChangePaveFiller(); + const NMTDS_ShapesDataStructure& aDS = myDSFiller->DS(); + const BOPTools_PInterferencePool& anIP = aPF.InterfPool(); + + Standard_Integer aNbS = aDS.NumberOfSourceShapes(); + Standard_Integer anIndex = 0, i; + + for(i = 1; i <= aNbS; ++i) { + + const TopoDS_Shape& aS = aDS.Shape(i); + if(S.IsSame(aS)) { + anIndex = i; + break; + } + + } + + if(anIndex == 0) return myGenerated; + if(!anIP->HasInterference(anIndex)) return myGenerated; + + const BOPTools_CArray1OfEEInterference& aEEs = anIP->EEInterferences(); + Standard_Integer aNbI = aEEs.Extent(); + + for(i = 1; i <= aNbI; ++i) { + + const BOPTools_EEInterference& aEE = aEEs(i); + Standard_Integer ind1, ind2; + aEE.Indices(ind1, ind2); + + if(ind1 == anIndex || ind2 == anIndex) { + + Standard_Integer aNSI = aEE.NewShape(); + if(aDS.GetShapeType(aNSI) == TopAbs_VERTEX) { + myGenerated.Append(aDS.Shape(aNSI)); + bCheckVert = Standard_True; + } + + } + + } + + const BOPTools_CArray1OfESInterference& aESs = anIP->ESInterferences(); + aNbI = aESs.Extent(); + + for(i = 1; i <= aNbI; ++i) { + + const BOPTools_ESInterference& aES = aESs(i); + Standard_Integer ind1, ind2; + aES.Indices(ind1, ind2); + + if(ind1 == anIndex || ind2 == anIndex) { + + Standard_Integer aNSI = aES.NewShape(); + if(aDS.GetShapeType(aNSI) == TopAbs_VERTEX) { + myGenerated.Append(aDS.Shape(aNSI)); + bCheckVert = Standard_True; + } + + } + + } + + if(bCheckVert) { + aMap.Clear(); + anExp.Init(myShape, TopAbs_VERTEX); + + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + + it.Initialize(myGenerated); + for (; it.More(); it.Next()) { + + if(!aMap.Contains(it.Value())) { + myGenerated.Remove(it); + } + } + } + return myGenerated; + } + return myGenerated; +} +//modified by NIZNHY-PKV Tue Feb 1 10:26:18 2005f +//======================================================================= +//function : FindImage +//purpose : +//======================================================================= +void NMTAlgo_Splitter::FindImage(const TopoDS_Shape& aS, + TopTools_ListOfShape& aLIms) +{ + TopAbs_ShapeEnum aType; + // + aType=aS.ShapeType(); + // + if (aType==TopAbs_SOLID) { + Standard_Boolean bHasImage, bHasInternalFaces; + Standard_Integer i, aNbSd; + TopTools_IndexedMapOfShape aMSo, aMSd; + TopoDS_Iterator aIt; + TopTools_IndexedDataMapOfShapeListOfShape aMFS; + TopTools_ListIteratorOfListOfShape aItLS; + // + bHasInternalFaces=myMapSIFC.IsBound(aS); + if (bHasInternalFaces){ + TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS); + // + const TopoDS_Shape& aIFC=myMapSIFC.Find(aS); + // + aIt.Initialize(aIFC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aIF=aIt.Value(); + if (aMFS.Contains(aIF)) { + const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aIF); + // + aItLS.Initialize(aLS); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aSx=aItLS.Value(); + aMSd.Add(aSx); + } + } + } + // + aNbSd=aMSd.Extent(); + if (aNbSd) { + for (i=1; i<=aNbSd; ++i) { + const TopoDS_Shape& aSx=aMSd(i); + if (!aSx.IsSame(aS)) { + aLIms.Append(aSx); + } + } + return; + } + } + // + bHasImage=myImageShape.HasImage(aS); + if (!bHasImage) { + return; + } + // + TopoDS_Shape aSd; + // + TopExp::MapShapes(myShape, TopAbs_SOLID, aMSo); + // + const TopoDS_Shape& aFC=myImageShape.Image(aS).First(); + bHasImage=NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + if (bHasImage) { + if (!aSd.IsSame(aS)) { + aLIms.Append(aSd); + } + } + } //if (aType==TopAbs_SOLID) { + //== + else if (aType==TopAbs_FACE) { + TopTools_MapOfShape aMap; + TopTools_ListIteratorOfListOfShape aIt; + TopExp_Explorer anExp; + // + if (myModifiedFaces.IsBound(aS)) { + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + // + const TopTools_ListOfShape& aLS=myModifiedFaces.Find(aS); + aIt.Initialize(aLS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aFx=aIt.Value(); + if (!aFx.IsSame(aS)) { + if (aMap.Contains(aFx)) { + aLIms.Append(aFx); + } + } + } + } + } // else if (aType==TopAbs_FACE) + //== + else if (aType==TopAbs_EDGE) { + TopTools_MapOfShape aMap; + TopTools_ListIteratorOfListOfShape aIt; + TopExp_Explorer anExp; + // + if (myImagesEdges.HasImage(aS)) { + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + // + const TopTools_ListOfShape& aLE=myImagesEdges.Image(aS); + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aEx=aIt.Value(); + if (!aEx.IsSame(aS)) { + if(aMap.Contains(aEx)) { + aLIms.Append(aEx); + } + } + } + } + }// else if (aType==TopAbs_EDGE) + //== + else if (aType==TopAbs_VERTEX) { + Standard_Integer aNbS, anIndex, i, aSDVInd; + TopExp_Explorer anExp; + // + const NMTTools_DSFiller& aDSF = Filler(); + const NMTTools_PaveFiller& aPF = aDSF.PaveFiller(); + const NMTDS_ShapesDataStructure& aDS = aDSF.DS(); + // + aNbS = aDS.NumberOfSourceShapes(); + anIndex = 0; + // + for(i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aSx = aDS.Shape(i); + if(aS.IsSame(aSx)) { + anIndex = i; + break; + } + } + // + if(!anIndex) { + return; + } + // + aSDVInd=aPF.FindSDVertex(anIndex); + if(!aSDVInd) { + return; + } + // + const TopoDS_Shape& aSDV=aDS.Shape(aSDVInd); + // + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + const TopoDS_Shape& aVx=anExp.Current(); + if(aSDV.IsSame(aVx)) { + aLIms.Append(aSDV); + break; + } + } + }// else if (aType==TopAbs_VERTEX) +} +//modified by NIZNHY-PKV Tue Feb 1 10:26:22 2005t + diff --git a/src/NMTAlgo/NMTAlgo_Tools.cdl b/src/NMTAlgo/NMTAlgo_Tools.cdl new file mode 100644 index 000000000..581235349 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Tools.cdl @@ -0,0 +1,90 @@ +// 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/ +// +-- File: NMTAlgo_Tools.cdl +-- Created: Fri Jan 30 16:29:14 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class Tools from NMTAlgo + + ---Purpose: + +uses + Orientation from TopAbs, + + Shape from TopoDS, + Edge from TopoDS, + Face from TopoDS, + Shell from TopoDS, + + ListOfShape from TopTools, + IndexedMapOfShape from TopTools +--raises + +is + OrientFacesOnShell (myclass; + aShell: Shell from TopoDS; + aShellNew: out Shell from TopoDS); + + OrientFacesOnShell (myclass; + aF : Face from TopoDS; + aSh : out Shell from TopoDS); + + Orientation(myclass; + aE: Edge from TopoDS; + aF: Face from TopoDS) + returns Orientation from TopAbs; + + Sense (myclass; + aF1: Face from TopoDS; + aF2: Face from TopoDS) + returns Integer from Standard; + + IsInside (myclass; + aS1: Shape from TopoDS; + aS2: Shape from TopoDS) + returns Boolean from Standard; + + MakeShells(myclass; + aFC:Shape from TopoDS; + aLS:out ListOfShape from TopTools); + + MakeSolids(myclass; + aLS:out ListOfShape from TopTools); + + MakeSolids(myclass; + aFC:Shape from TopoDS; + aLS:out ListOfShape from TopTools); + + BreakWebs (myclass; + aS1: Shape from TopoDS; + aS2:out Shape from TopoDS); + + FindImageSolid (myclass; + aFC : Shape from TopoDS; + aMSo : IndexedMapOfShape from TopTools; + aSo : out Shape from TopoDS) + returns Boolean from Standard; + +--fields + +end Tools; diff --git a/src/NMTAlgo/NMTAlgo_Tools.cxx b/src/NMTAlgo/NMTAlgo_Tools.cxx new file mode 100644 index 000000000..894b2d0b6 --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Tools.cxx @@ -0,0 +1,518 @@ +// 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/ +// +// File: NMTAlgo_Tools.cxx +// Created: Fri Jan 30 16:30:45 2004 +// 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 + +#include + +#include +#include + + +//======================================================================= +// function: Sense +// purpose: +//======================================================================= + Standard_Integer NMTAlgo_Tools::Sense (const TopoDS_Face& aF1, + const TopoDS_Face& aF2) +{ + Standard_Integer iSense=0; + gp_Dir aDNF1, aDNF2; + TopoDS_Edge aE1, aE2; + TopExp_Explorer anExp; + // + anExp.Init(aF1, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + aE1=TopoDS::Edge(anExp.Current()); + if (!BRep_Tool::Degenerated(aE1)) { + if (!BRep_Tool::IsClosed(aE1, aF1)) { + break; + } + } + } + // + anExp.Init(aF2, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + aE2=TopoDS::Edge(anExp.Current()); + if (!BRep_Tool::Degenerated(aE2)) { + if (!BRep_Tool::IsClosed(aE2, aF2)) { + if (aE2.IsSame(aE1)) { + iSense=1; + break; + } + } + } + } + // + if (!iSense) { + return iSense; + } + // + BOPTools_Tools3D::GetNormalToFaceOnEdge(aE1, aF1, aDNF1); + BOPTools_Tools3D::GetNormalToFaceOnEdge(aE2, aF2, aDNF2); + // + iSense=BOPTools_Tools3D::SenseFlag(aDNF1, aDNF2); + // + return iSense; +} + +//======================================================================= +// function: OrientFacesOnShell +// purpose: +//======================================================================= + void NMTAlgo_Tools::OrientFacesOnShell (const TopoDS_Face& aF1, + TopoDS_Shell& aSh) +{ + Standard_Integer aNbFSh, iSenseFlag; + gp_Dir aDNF1, aDNF2; + TopExp_Explorer anExp; + TopoDS_Edge aE1, aESh; + TopTools_IndexedDataMapOfShapeListOfShape aMEFSh; + // + anExp.Init(aF1, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + aE1=TopoDS::Edge(anExp.Current()); + if (!BRep_Tool::Degenerated(aE1)) { + break; + } + } + // + BOPTools_Tools3D::GetNormalToFaceOnEdge(aE1, aF1, aDNF1); + // + TopExp::MapShapesAndAncestors(aSh, TopAbs_EDGE, TopAbs_FACE, aMEFSh); + if (aMEFSh.Contains(aE1)) { + const TopTools_ListOfShape& aLFSh=aMEFSh.FindFromKey(aE1); + aNbFSh=aLFSh.Extent(); + if (aNbFSh==1) { + const TopoDS_Face& aFSh=TopoDS::Face(aLFSh.First()); + // + BOPTools_Tools3D::OrientEdgeOnFace(aE1, aFSh, aESh); + BOPTools_Tools3D::GetNormalToFaceOnEdge(aESh, aFSh, aDNF2); + // + iSenseFlag=BOPTools_Tools3D::SenseFlag(aDNF1, aDNF2); + if (iSenseFlag==1) { + return; + } + // + anExp.Init(aSh, TopAbs_FACE); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape& aFx=anExp.Current(); + TopoDS_Shape *pFx=(TopoDS_Shape *)&aFx; + pFx->Reverse(); + } + } + } +} +//======================================================================= +// function: OrientFacesOnShell +// purpose: +//======================================================================= + void NMTAlgo_Tools::OrientFacesOnShell (const TopoDS_Shell& aShell, + TopoDS_Shell& aShellNew) +{ + Standard_Boolean bIsProcessed1, bIsProcessed2; + Standard_Integer i, aNbE, aNbF, j; + TopAbs_Orientation anOrE1, anOrE2; + + TopTools_IndexedDataMapOfShapeListOfShape aEFMap; + TopTools_IndexedMapOfShape aProcessedFaces; + BRep_Builder aBB; + + aBB.MakeShell(aShellNew); + + TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aEFMap); + + aNbE=aEFMap.Extent(); + // + // One seam edge in aEFMap contains 2 equivalent faces. + for (i=1; i<=aNbE; i++) { + TopTools_ListOfShape& aLF=aEFMap.ChangeFromIndex(i); + + if (aLF.Extent()>1) { + TopTools_ListOfShape aLFTmp; + TopTools_IndexedMapOfShape aFM; + + TopTools_ListIteratorOfListOfShape anIt(aLF); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape& aF=anIt.Value(); + if (!aFM.Contains(aF)) { + aFM.Add(aF); + aLFTmp.Append(aF); + } + } + aLF.Clear(); + aLF=aLFTmp; + } + } + // + // Do + for (i=1; i<=aNbE; i++) { + const TopoDS_Edge& aE=TopoDS::Edge(aEFMap.FindKey(i)); + + if (BRep_Tool::Degenerated(aE)) { + continue; + } + + const TopTools_ListOfShape& aLF=aEFMap.FindFromIndex(i); + aNbF=aLF.Extent(); + + if (aNbF==2) { + TopoDS_Face& aF1=TopoDS::Face(aLF.First()); + TopoDS_Face& aF2=TopoDS::Face(aLF.Last() ); + + + bIsProcessed1=aProcessedFaces.Contains(aF1); + bIsProcessed2=aProcessedFaces.Contains(aF2); + + if (bIsProcessed1 && bIsProcessed2) { + continue; + } + + if (!bIsProcessed1 && !bIsProcessed2) { + aProcessedFaces.Add(aF1); + aBB.Add(aShellNew, aF1); + + bIsProcessed1=!bIsProcessed1; + } + + // + TopoDS_Face aF1x, aF2x; + + aF1x=aF1; + if (bIsProcessed1) { + j=aProcessedFaces.FindIndex(aF1); + aF1x=TopoDS::Face(aProcessedFaces.FindKey(j)); + } + + aF2x=aF2; + if (bIsProcessed2) { + j=aProcessedFaces.FindIndex(aF2); + aF2x=TopoDS::Face(aProcessedFaces.FindKey(j)); + } + // + + anOrE1=NMTAlgo_Tools::Orientation(aE, aF1x); + anOrE2=NMTAlgo_Tools::Orientation(aE, aF2x); + + if (bIsProcessed1 && !bIsProcessed2) { + + if (anOrE1==anOrE2) { + if (!BRep_Tool::IsClosed(aE, aF1) && + !BRep_Tool::IsClosed(aE, aF2)) { + aF2.Reverse(); + } + } + aProcessedFaces.Add(aF2); + aBB.Add(aShellNew, aF2); + } + + else if (!bIsProcessed1 && bIsProcessed2) { + if (anOrE1==anOrE2) { + if (!BRep_Tool::IsClosed(aE, aF1) && + !BRep_Tool::IsClosed(aE, aF2)) { + aF1.Reverse(); + } + } + aProcessedFaces.Add(aF1); + aBB.Add(aShellNew, aF1); + } + } + } + // + // + for (i=1; i<=aNbE; i++) { + const TopoDS_Edge& aE=TopoDS::Edge(aEFMap.FindKey(i)); + + if (BRep_Tool::Degenerated(aE)) { + continue; + } + + const TopTools_ListOfShape& aLF=aEFMap.FindFromIndex(i); + aNbF=aLF.Extent(); + if (aNbF!=2) { + TopTools_ListIteratorOfListOfShape anIt(aLF); + for(; anIt.More(); anIt.Next()) { + const TopoDS_Face& aF=TopoDS::Face(anIt.Value()); + if (!aProcessedFaces.Contains(aF)) { + aProcessedFaces.Add(aF); + aBB.Add(aShellNew, aF); + } + } + } + } +} +//======================================================================= +//function : Orientation +//purpose : +//======================================================================= + TopAbs_Orientation NMTAlgo_Tools::Orientation(const TopoDS_Edge& anE, + const TopoDS_Face& aF) +{ + TopAbs_Orientation anOr=TopAbs_INTERNAL; + + TopExp_Explorer anExp; + anExp.Init(aF, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Edge& anEF1=TopoDS::Edge(anExp.Current()); + if (anEF1.IsSame(anE)) { + anOr=anEF1.Orientation(); + break; + } + } + return anOr; +} +//======================================================================= +//function : IsInside +//purpose : Return True if the first vertex of S1 inside S2. +// If S1.IsNull(), check infinite point against S2. +//======================================================================= + Standard_Boolean NMTAlgo_Tools::IsInside (const TopoDS_Shape& theS1, + const TopoDS_Shape& theS2) +{ + BRepClass3d_SolidClassifier aClassifier( theS2 ); + // + TopExp_Explorer expl(theS1, TopAbs_VERTEX); + // + if (!expl.More()){ + aClassifier.PerformInfinitePoint( ::RealSmall()); + } + else { + const TopoDS_Vertex & aVertex = TopoDS::Vertex( expl.Current() ); + aClassifier.Perform (BRep_Tool::Pnt( aVertex ), + BRep_Tool::Tolerance( aVertex )); + } + // + return ( aClassifier.State() == TopAbs_IN ); +} +//======================================================================= +//function : MakeShells +//purpose : +//======================================================================= + void NMTAlgo_Tools::MakeShells (const TopoDS_Shape& aFC, + TopTools_ListOfShape& aLNS) +{ + NMTAlgo_Loop3d aShellMaker; + TopTools_MapOfOrientedShape aMTmp; + // + aShellMaker.AddConstFaces(aFC); + aLNS=aShellMaker.MakeShells(aMTmp); +} +//======================================================================= +//function : MakeSolids +//purpose : +//======================================================================= + void NMTAlgo_Tools::MakeSolids(const TopoDS_Shape& aFC, + TopTools_ListOfShape& theShellList) +{ + NMTAlgo_Tools::MakeShells(aFC, theShellList); + NMTAlgo_Tools::MakeSolids(theShellList); +} +//======================================================================= +//function : MakeSolids +//purpose : +//======================================================================= + void NMTAlgo_Tools::MakeSolids(TopTools_ListOfShape& theShellList) +{ + TopTools_ListOfShape aHoleShells, aNewSolids; + TopoDS_Shape anInfinitePointShape; + TopTools_DataMapOfShapeShape aInOutMap; + TopTools_ListIteratorOfListOfShape aShellIt, aSolisIt; + BRep_Builder aBB; + // + aShellIt.Initialize(theShellList); + for ( ; aShellIt.More(); aShellIt.Next()) { + const TopoDS_Shape & aShell = aShellIt.Value(); + // check if a shell is a hole of theSolid + if (NMTAlgo_Tools::IsInside(anInfinitePointShape, aShell)){ + aHoleShells.Append(aShell); + } + else { + // make a solid from a shell + TopoDS_Solid Solid; + aBB.MakeSolid( Solid ); + aBB.Add (Solid, aShell); + aNewSolids.Append (Solid); + } + } + // + // find outer a shell most close to each hole shell + aShellIt.Initialize(aHoleShells); + for (; aShellIt.More(); aShellIt.Next()){ + const TopoDS_Shape & aHole = aShellIt.Value(); + // + aSolisIt.Initialize(aNewSolids); + for ( ; aSolisIt.More(); aSolisIt.Next()) { + const TopoDS_Shape & aSolid = aSolisIt.Value(); + // + if (! NMTAlgo_Tools::IsInside(aHole, aSolid)){ + continue; + } + // + if ( aInOutMap.IsBound (aHole)){ + const TopoDS_Shape & aSolid2 = aInOutMap( aHole ); + if ( IsInside( aSolid, aSolid2 )) { + aInOutMap.UnBind( aHole ); + aInOutMap.Bind ( aHole, aSolid ); + } + } + else{ + aInOutMap.Bind (aHole, aSolid); + } + } + // + // add aHole to a solid + if (aInOutMap.IsBound( aHole )){ + TopoDS_Shape & aSolid=aInOutMap(aHole); + aBB.Add (aSolid, aHole); + } + } + theShellList.Clear(); + theShellList.Append( aNewSolids ); +} +//======================================================================= +//function : BreakWebs +//purpose : +//======================================================================= + void NMTAlgo_Tools::BreakWebs(const TopoDS_Shape& aCS, + TopoDS_Shape& aCSR) +{ + Standard_Integer i, aNbF, aNbS; + TopTools_IndexedDataMapOfShapeListOfShape aMFS; + TopTools_MapOfShape aMF; + + TopoDS_Compound aFC, aCR; + BRep_Builder aBB; + // + aBB.MakeCompound(aFC); + TopExp::MapShapesAndAncestors(aCS, TopAbs_FACE, TopAbs_SOLID, aMFS); + // + aNbF=aMFS.Extent(); + for (i=1; i<=aNbF; ++i) { + const TopoDS_Shape& aF=aMFS.FindKey(i); + const TopTools_ListOfShape& aLS=aMFS(i); + aNbS=aLS.Extent(); + if (aNbS==2) { + aMF.Add(aF); + } + else { + aBB.Add(aFC, aF); + } + } + // + if (!aMF.Extent()) { + aCSR=aCS; + return; + } + // + TopTools_ListOfShape aLNS; + TopTools_ListIteratorOfListOfShape aItS; + // + NMTAlgo_Tools::MakeShells(aFC, aLNS); + NMTAlgo_Tools::MakeSolids(aLNS); + // + aBB.MakeCompound(aCR); + aItS.Initialize(aLNS); + for ( ;aItS.More(); aItS.Next()) { + const TopoDS_Shape& aS=aItS.Value(); + aBB.Add(aCR, aS); + } + aCSR=aCR; +} +//======================================================================= +//function : FindImageSolid +//purpose : +//======================================================================= + Standard_Boolean NMTAlgo_Tools::FindImageSolid(const TopoDS_Shape& aFC, + const TopTools_IndexedMapOfShape& aMSo, + TopoDS_Shape& aSox) +{ + Standard_Boolean bFound=Standard_False; + Standard_Integer i, j, aNbSo, aNbF, aNbFSo; + TopoDS_Iterator aIt; + TopTools_IndexedMapOfShape aMFC, aMFSo; + // + aIt.Initialize(aFC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aF=aIt.Value(); + aMFC.Add(aF); + } + // + aNbF=aMFC.Extent(); + aNbSo=aMSo.Extent(); + for (i=1; i<=aNbSo; ++i) { + const TopoDS_Shape& aSo=aMSo(i); + // + bFound=Standard_True; + aMFSo.Clear(); + TopExp::MapShapes(aSo, TopAbs_FACE, aMFSo); + // + aNbFSo=aMFSo.Extent(); + if (aNbFSo!=aNbF) { + bFound=Standard_False; + continue; + } + // + for (j=1; j<=aNbFSo; ++j) { + const TopoDS_Shape& aFSo=aMFSo(j); + if (!aMFC.Contains(aFSo)) { + bFound=Standard_False; + break; + } + } + if (bFound) { + aSox=aSo; + return bFound; + } + } + return bFound; +} diff --git a/src/NMTAlgo/NMTAlgo_Tools.jxx b/src/NMTAlgo/NMTAlgo_Tools.jxx new file mode 100644 index 000000000..2923711df --- /dev/null +++ b/src/NMTAlgo/NMTAlgo_Tools.jxx @@ -0,0 +1,40 @@ +// 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/ +// +#ifndef _TopoDS_Shell_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopTools_IndexedMapOfShape_HeaderFile +#include +#endif +#ifndef _NMTAlgo_Tools_HeaderFile +#include +#endif diff --git a/src/NMTDS/NMTDS.cdl b/src/NMTDS/NMTDS.cdl new file mode 100644 index 000000000..6da914c15 --- /dev/null +++ b/src/NMTDS/NMTDS.cdl @@ -0,0 +1,58 @@ +// 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/ +// +-- File: NMTDS.cdl +-- Created: Fri Nov 28 10:13:19 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +package NMTDS + + ---Purpose: + +uses + + TCollection, + TColStd, + Bnd, + TopoDS, + TopAbs, + TopTools, + BooleanOperations, + BOPTColStd +is + class ShapesDataStructure; + class IndexRange; + + pointer PShapesDataStructure to ShapesDataStructure from NMTDS; + + class CArray1OfIndexRange instantiates + CArray1 from BOPTColStd(IndexRange from NMTDS); + + class ListOfIndexedDataMapOfShapeAncestorsSuccessors instantiates + List from TCollection(IndexedDataMapOfShapeAncestorsSuccessors from BooleanOperations); + + class IndexedDataMapOfIntegerIndexedDataMapOfShapeInteger instantiates + IndexedDataMap from TCollection(Integer from Standard, + IndexedDataMapOfShapeInteger from BooleanOperations, + MapIntegerHasher from TColStd); + +end NMTDS; diff --git a/src/NMTDS/NMTDS_IndexRange.cdl b/src/NMTDS/NMTDS_IndexRange.cdl new file mode 100644 index 000000000..a6b602957 --- /dev/null +++ b/src/NMTDS/NMTDS_IndexRange.cdl @@ -0,0 +1,58 @@ +// 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/ +// +-- File: NMTDS_IndexRange.cdl +-- Created: Fri Nov 28 10:31:05 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class IndexRange from NMTDS + + ---Purpose: + +--uses +--raises + +is + Create + returns IndexRange from NMTDS; + + SetFirst(me:out; + aFirst:Integer from Standard); + + SetLast(me:out; + aLast:Integer from Standard); + + First(me) + returns Integer from Standard; + + Last(me) + returns Integer from Standard; + + IsInRange(me; + aIndex:Integer from Standard) + returns Boolean from Standard; + +fields + myFirst : Integer from Standard is protected; + myLast : Integer from Standard is protected; + +end IndexRange; diff --git a/src/NMTDS/NMTDS_IndexRange.cxx b/src/NMTDS/NMTDS_IndexRange.cxx new file mode 100644 index 000000000..3d4b21d5d --- /dev/null +++ b/src/NMTDS/NMTDS_IndexRange.cxx @@ -0,0 +1,76 @@ +// 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/ +// +// File: NMTDS_IndexRange.cxx +// Created: Fri Nov 28 10:34:59 2003 +// Author: Peter KURNEV +// + + +#include +//======================================================================= +//function :NMTDS_IndexRange::NMTDS_IndexRange +//purpose : +//======================================================================= + NMTDS_IndexRange::NMTDS_IndexRange() +: + myFirst(0), + myLast(0) +{ +} +//======================================================================= +//function :SetFirst +//purpose : +//======================================================================= + void NMTDS_IndexRange::SetFirst(const Standard_Integer aFirst) +{ + myFirst=aFirst; +} +//======================================================================= +//function :First +//purpose : +//======================================================================= + Standard_Integer NMTDS_IndexRange::First()const +{ + return myFirst; +} +//======================================================================= +//function :SetLast +//purpose : +//======================================================================= + void NMTDS_IndexRange::SetLast(const Standard_Integer aLast) +{ + myLast=aLast; +} +//======================================================================= +//function :Last +//purpose : +//======================================================================= + Standard_Integer NMTDS_IndexRange::Last()const +{ + return myLast; +} +//======================================================================= +//function :IsInRange +//purpose : +//======================================================================= + Standard_Boolean NMTDS_IndexRange::IsInRange(const Standard_Integer aIndex)const +{ + return (Standard_Boolean)(aIndex>=myFirst && aIndex<=myLast); +} diff --git a/src/NMTDS/NMTDS_IndexRange.jxx b/src/NMTDS/NMTDS_IndexRange.jxx new file mode 100644 index 000000000..a7c0bf7e7 --- /dev/null +++ b/src/NMTDS/NMTDS_IndexRange.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _NMTDS_IndexRange_HeaderFile +#include +#endif diff --git a/src/NMTDS/NMTDS_ShapesDataStructure.cdl b/src/NMTDS/NMTDS_ShapesDataStructure.cdl new file mode 100644 index 000000000..16b8e9288 --- /dev/null +++ b/src/NMTDS/NMTDS_ShapesDataStructure.cdl @@ -0,0 +1,77 @@ +// 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/ +// +-- File: NMTDS_ShapesDataStructure.cdl +-- Created: Mon Dec 1 10:17:05 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class ShapesDataStructure from NMTDS + inherits ShapesDataStructure from BooleanOperations + + ---Purpose: + +uses + Shape from TopoDS, + CArray1OfIndexRange from NMTDS, + IndexedDataMapOfIntegerIndexedDataMapOfShapeInteger from NMTDS +--raises + +is + Create + returns ShapesDataStructure from NMTDS; + ---C++: alias "Standard_EXPORT virtual ~NMTDS_ShapesDataStructure();" +--modified by NIZNHY-PKV Wed Feb 2 11:44:38 2005ft + + SetCompositeShape(me:out; + aS:Shape from TopoDS); + + Init(me:out); + + Ranges(me) + returns CArray1OfIndexRange from NMTDS; + ---C++: return const & + + CompositeShape(me) + returns Shape from TopoDS; + ---C++: return const & + + ShapeRangeIndex(me; + aId:Integer from Standard) + returns Integer from Standard; + + Rank (me; + anIndex:Integer from Standard) + returns Integer from Standard + is redefined; + + ShapeIndex (me; + aS:Shape from TopoDS; + iRank:Integer from Standard) + returns Integer from Standard + is redefined; +fields + myCompositeShape: Shape from TopoDS is protected; + myRanges : CArray1OfIndexRange from NMTDS is protected; + myShapeIndexMap : IndexedDataMapOfIntegerIndexedDataMapOfShapeInteger from NMTDS is protected; + +end ShapesDataStructure; + diff --git a/src/NMTDS/NMTDS_ShapesDataStructure.cxx b/src/NMTDS/NMTDS_ShapesDataStructure.cxx new file mode 100644 index 000000000..0fde81747 --- /dev/null +++ b/src/NMTDS/NMTDS_ShapesDataStructure.cxx @@ -0,0 +1,257 @@ +// 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/ +// +// File: NMTDS_ShapesDataStructure.cxx +// Created: Mon Dec 1 10:21:04 2003 +// Author: Peter KURNEV +// + + +#include +#include +#include +#include +#include +#include +#include +#include + +//=========================================================================== +//function : NMTDS_ShapesDataStructure::NMTDS_ShapesDataStructure +//purpose : +//=========================================================================== + NMTDS_ShapesDataStructure::NMTDS_ShapesDataStructure() +: + BooleanOperations_ShapesDataStructure() +{ + //printf(" NMTDS_ShapesDataStructure CREATE:%x\n", (int)this); +} +//modified by NIZNHY-PKV Wed Feb 2 11:45:04 2005f +//=========================================================================== +//function : ~ +//purpose : +//=========================================================================== + NMTDS_ShapesDataStructure::~NMTDS_ShapesDataStructure() +{ + //printf(" NMTDS_ShapesDataStructure DELETE:%x\n", (int)this); +} +//modified by NIZNHY-PKV Wed Feb 2 11:45:06 2005t +//=========================================================================== +//function : SetCompositeShape +//purpose : +//=========================================================================== + void NMTDS_ShapesDataStructure::SetCompositeShape(const TopoDS_Shape& aS) +{ + myCompositeShape=aS; +} +//=========================================================================== +//function : CompositeShape +//purpose : +//=========================================================================== + const TopoDS_Shape& NMTDS_ShapesDataStructure::CompositeShape()const +{ + return myCompositeShape; +} +//=========================================================================== +//function : Ranges +//purpose : +//=========================================================================== + const NMTDS_CArray1OfIndexRange& NMTDS_ShapesDataStructure::Ranges()const +{ + return myRanges; +} +//=========================================================================== +//function : Init +//purpose : +//=========================================================================== + void NMTDS_ShapesDataStructure::Init() +{ + Standard_Integer i, j, aNbSx, aNbS, aShift, aNbRanges; + Standard_Integer iFirst, iLast; + NMTDS_ListOfIndexedDataMapOfShapeAncestorsSuccessors aLx; + NMTDS_ListIteratorOfListOfIndexedDataMapOfShapeAncestorsSuccessors aLit; + TopoDS_Iterator anIt; + // + aNbS=0; + anIt.Initialize(myCompositeShape); + for (i=0; anIt.More(); anIt.Next(), ++i) { + const TopoDS_Shape& aSx=anIt.Value(); + BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors aIndDatMapShape; + FillIndexedMapOfShapesAncestorsAndSuccessors(aSx, aIndDatMapShape); + aNbSx=aIndDatMapShape.Extent(); + aNbS+=aNbSx; + aLx.Append(aIndDatMapShape); + } + // + // Fill myRanges + myRanges.Resize(i); + aLit.Initialize(aLx); + for (i=1; aLit.More(); aLit.Next(), ++i) { + const BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors& aM=aLit.Value(); + aNbSx=aM.Extent(); + if (i==1) { + iFirst=1; + iLast=aNbSx; + myRanges(i).SetFirst(iFirst); + myRanges(i).SetLast(iLast); + continue; + } + iFirst=myRanges(i-1).Last()+1; + iLast=iFirst+aNbSx-1; + myRanges(i).SetFirst(iFirst); + myRanges(i).SetLast(iLast); + } + // + myNumberOfShapesOfTheObject=aNbS; + myNumberOfShapesOfTheTool=aNbS; + myLength=3*aNbS; + // + // Allocate the whole Table + myListOfShapeAndInterferences = (BooleanOperations_PShapeAndInterferences) + Standard::Allocate(myLength*sizeof(BooleanOperations_ShapeAndInterferences)); + // + // Fill the table + for (i=0; i<2; ++i) { + aShift=0; + if (i) { + aShift=myNumberOfShapesOfTheObject; + } + aLit.Initialize(aLx); + for (; aLit.More(); aLit.Next()) { + const BooleanOperations_IndexedDataMapOfShapeAncestorsSuccessors& aM=aLit.Value(); + aNbSx=aM.Extent(); + for (j=1; j<=aNbSx; ++j) { + const TopoDS_Shape& aSx=aM.FindKey(j); + const BooleanOperations_AncestorsSeqAndSuccessorsSeq& aASx=aM.FindFromIndex(j); + InsertShapeAndAncestorsSuccessors(aSx, aASx, aShift); + } + aShift+=aNbSx; + } + } + // + // myShapeIndexMap + myShapeIndexMap.Clear(); + // + aNbRanges=myRanges.Extent(); + for (i=1; i<=aNbRanges; ++i){ + BooleanOperations_IndexedDataMapOfShapeInteger aSIM; + // + const NMTDS_IndexRange& aR=myRanges(i); + iFirst=aR.First(); + iLast =aR.Last(); + for (j=iFirst; j<=iLast; ++j) { + const TopoDS_Shape& aS=GetShape(j); + aSIM.Add(aS, j); + } + myShapeIndexMap.Add(i, aSIM); + } + // + // myRefEdges + iLast=myNumberOfShapesOfTheObject+myNumberOfShapesOfTheTool; + myRefEdges.Resize(iLast); + + for (i=1; i<=iLast; ++i) { + const TopoDS_Shape& aS=Shape(i); + myRefEdges(i)=0; + if (aS.ShapeType()==TopAbs_EDGE) { + myNbEdges++; + myRefEdges(i)=myNbEdges; + } + } +} +//=========================================================================== +//function : ShapeRangeIndex +//purpose : +//=========================================================================== + Standard_Integer NMTDS_ShapesDataStructure::ShapeRangeIndex(const Standard_Integer aId)const +{ + Standard_Boolean bFound; + Standard_Integer i, aNbR, aIdx, aNbS, aZero=0; + // + aNbS=myNumberOfShapesOfTheObject+myNumberOfShapesOfTheTool; + + aIdx=aId; + if (aIdx > aNbS || aIdx < 1){ + return aZero; + } + // + if (aIdx > myNumberOfShapesOfTheObject) { + aIdx-=myNumberOfShapesOfTheObject; + } + // + aNbR=myRanges.Extent(); + for (i=1; i<=aNbR; ++i) { + const NMTDS_IndexRange& aRange=myRanges(i); + bFound=aRange.IsInRange(aIdx); + if (bFound) { + return i; + } + } + return aZero; +} +//=========================================================================== +//function : Rank +//purpose : +//=========================================================================== + Standard_Integer NMTDS_ShapesDataStructure::Rank(const Standard_Integer aId)const +{ + Standard_Boolean bFound; + Standard_Integer i, aNbR, aNbS, aZero=0; + // + aNbS=myNumberOfShapesOfTheObject; + + if (aId > aNbS || aId < 1){ + return aZero; + } + // + aNbR=myRanges.Extent(); + for (i=1; i<=aNbR; ++i) { + const NMTDS_IndexRange& aRange=myRanges(i); + bFound=aRange.IsInRange(aId); + if (bFound) { + return i; + } + } + return aZero; +} +//=========================================================================== +//function : ShapeIndex +//purpose : +//=========================================================================== + Standard_Integer NMTDS_ShapesDataStructure::ShapeIndex(const TopoDS_Shape& aS, + const Standard_Integer aRank)const +{ + Standard_Boolean bFound; + Standard_Integer aIndex=0; + // + bFound=myShapeIndexMap.Contains(aRank); + if (!bFound) { + return aIndex; + } + // + const BooleanOperations_IndexedDataMapOfShapeInteger& aSIM=myShapeIndexMap.FindFromKey(aRank); + // + bFound=aSIM.Contains(aS); + if (!bFound) { + return aIndex; + } + // + aIndex=aSIM.FindFromKey(aS); + return aIndex; +} diff --git a/src/NMTDS/NMTDS_ShapesDataStructure.hxx b/src/NMTDS/NMTDS_ShapesDataStructure.hxx new file mode 100644 index 000000000..3eab46368 --- /dev/null +++ b/src/NMTDS/NMTDS_ShapesDataStructure.hxx @@ -0,0 +1,116 @@ +// 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 _NMTDS_ShapesDataStructure_HeaderFile +#define _NMTDS_ShapesDataStructure_HeaderFile + +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTDS_CArray1OfIndexRange_HeaderFile +#include +#endif +#ifndef _NMTDS_IndexedDataMapOfIntegerIndexedDataMapOfShapeInteger_HeaderFile +#include +#endif +#ifndef _BooleanOperations_ShapesDataStructure_HeaderFile +#include +#endif +#ifndef _Standard_Integer_HeaderFile +#include +#endif +class TopoDS_Shape; +class NMTDS_CArray1OfIndexRange; + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + +class NMTDS_ShapesDataStructure : public BooleanOperations_ShapesDataStructure { + +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 NMTDS_ShapesDataStructure(); +Standard_EXPORT virtual ~NMTDS_ShapesDataStructure(); +Standard_EXPORT void SetCompositeShape(const TopoDS_Shape& aS) ; +Standard_EXPORT void Init() ; +Standard_EXPORT const NMTDS_CArray1OfIndexRange& Ranges() const; +Standard_EXPORT const TopoDS_Shape& CompositeShape() const; +Standard_EXPORT Standard_Integer ShapeRangeIndex(const Standard_Integer aId) const; +Standard_EXPORT virtual Standard_Integer Rank(const Standard_Integer anIndex) const; +Standard_EXPORT virtual Standard_Integer ShapeIndex(const TopoDS_Shape& aS,const Standard_Integer iRank) const; + + + + + +protected: + + // Methods PROTECTED + // + + + // Fields PROTECTED + // +TopoDS_Shape myCompositeShape; +NMTDS_CArray1OfIndexRange myRanges; +NMTDS_IndexedDataMapOfIntegerIndexedDataMapOfShapeInteger myShapeIndexMap; + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // + + +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif diff --git a/src/NMTDS/NMTDS_ShapesDataStructure.jxx b/src/NMTDS/NMTDS_ShapesDataStructure.jxx new file mode 100644 index 000000000..445438ac2 --- /dev/null +++ b/src/NMTDS/NMTDS_ShapesDataStructure.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTDS_CArray1OfIndexRange_HeaderFile +#include +#endif +#ifndef _NMTDS_ShapesDataStructure_HeaderFile +#include +#endif diff --git a/src/NMTTools/Makefile.in b/src/NMTTools/Makefile.in new file mode 100644 index 000000000..77cdada9e --- /dev/null +++ b/src/NMTTools/Makefile.in @@ -0,0 +1,103 @@ +# GEOM NMTTools : partition algorithm +# +# 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.org +# +# +# +# File : Makefile.in +# Author : Julia DOROVSKIKH +# Module : GEOM +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + + +@COMMENCE@ + +# Libraries targets +LIB = libNMTTools.la +LIB_SRC = \ + NMTTools_CommonBlock.cxx \ + NMTTools_CommonBlockAPI.cxx \ + NMTTools_CommonBlockPool_0.cxx \ + NMTTools_CoupleOfShape.cxx \ + NMTTools_DEProcessor.cxx \ + NMTTools_DSFiller.cxx \ + NMTTools_IndexedDataMapNodeOfIndexedDataMapOfIndexedMapOfInteger_0.cxx \ + NMTTools_IndexedDataMapNodeOfIndexedDataMapOfShapeIndexedMapOfShape_0.cxx \ + NMTTools_IndexedDataMapNodeOfIndexedDataMapOfShapePaveBlock_0.cxx \ + NMTTools_IndexedDataMapOfIndexedMapOfInteger_0.cxx \ + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape_0.cxx \ + NMTTools_IndexedDataMapOfShapePaveBlock_0.cxx \ + NMTTools_IteratorOfCoupleOfShape.cxx \ + NMTTools_ListIteratorOfListOfCommonBlock_0.cxx \ + NMTTools_ListIteratorOfListOfCoupleOfShape_0.cxx \ + NMTTools_ListNodeOfListOfCommonBlock_0.cxx \ + NMTTools_ListNodeOfListOfCoupleOfShape_0.cxx \ + NMTTools_ListOfCommonBlock_0.cxx \ + NMTTools_ListOfCoupleOfShape_0.cxx \ + NMTTools_PaveFiller.cxx \ + NMTTools_PaveFiller_0.cxx \ + NMTTools_PaveFiller_1.cxx \ + NMTTools_PaveFiller_2.cxx \ + NMTTools_PaveFiller_3.cxx \ + NMTTools_PaveFiller_4.cxx \ + NMTTools_PaveFiller_5.cxx \ + NMTTools_PaveFiller_6.cxx \ + NMTTools_PaveFiller_7.cxx \ + NMTTools_PaveFiller_8.cxx \ + NMTTools_PaveFiller_9.cxx \ + NMTTools_PCurveMaker.cxx \ + NMTTools_Tools.cxx + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# header files +EXPORT_HEADERS = \ + NMTTools_PDSFiller.hxx \ + NMTTools_DSFiller.hxx \ + NMTTools_PPaveFiller.hxx \ + NMTTools_PaveFiller.hxx \ + NMTTools_ListOfCoupleOfShape.hxx \ + NMTTools_Tools.hxx \ + NMTTools_CoupleOfShape.hxx \ + NMTTools_ListIteratorOfListOfCoupleOfShape.hxx \ + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx \ + NMTTools_IteratorOfCoupleOfShape.hxx \ + NMTTools_CommonBlockPool.hxx \ + Handle_NMTTools_ListNodeOfListOfCoupleOfShape.hxx \ + Handle_NMTTools_IndexedDataMapNodeOfIndexedDataMapOfShapeIndexedMapOfShape.hxx + +# idl files +EXPORT_IDLS= + + +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS += $(CAS_LDPATH) -lTKBool -lTKBO -lNMTDS -L${KERNEL_ROOT_DIR}/lib/salome + +%_moc.cxx: %.h + $(MOC) $< -o $@ + +@CONCLUDE@ diff --git a/src/NMTTools/NMTTools.cdl b/src/NMTTools/NMTTools.cdl new file mode 100644 index 000000000..866c8351a --- /dev/null +++ b/src/NMTTools/NMTTools.cdl @@ -0,0 +1,85 @@ +// 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/ +// +-- File: NMTTools.cdl +-- Created: Thu Dec 4 16:55:49 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +package NMTTools + + ---Purpose: + +uses + + TCollection, + TColStd, + gp, + TopAbs, + TopoDS, + TopTools, + Geom2d, + BooleanOperations, + BOPTColStd, + IntTools, + BOPTools, + + NMTDS + +is + class IteratorOfCoupleOfShape; + class DSFiller; + class PaveFiller; + class Tools; + class CommonBlock; + class CommonBlockAPI; + class PCurveMaker; + class DEProcessor; + class CoupleOfShape; + + pointer PPaveFiller to PaveFiller from NMTTools; + pointer PDSFiller to DSFiller from NMTTools; + + class ListOfCommonBlock instantiates + List from TCollection(CommonBlock from NMTTools); + + class CommonBlockPool instantiates + CArray1 from BOPTColStd (ListOfCommonBlock from NMTTools); + + class IndexedDataMapOfIndexedMapOfInteger instantiates + IndexedDataMap from TCollection (Integer from Standard, + IndexedMapOfInteger from TColStd, + MapIntegerHasher from TColStd); + + class IndexedDataMapOfShapePaveBlock instantiates + IndexedDataMap from TCollection (Shape from TopoDS, + PaveBlock from BOPTools, + ShapeMapHasher from TopTools); + + class IndexedDataMapOfShapeIndexedMapOfShape instantiates + IndexedDataMap from TCollection (Shape from TopoDS, + IndexedMapOfShape from TopTools, + ShapeMapHasher from TopTools); + + class ListOfCoupleOfShape instantiates + List from TCollection(CoupleOfShape from NMTTools); + +end NMTTools; diff --git a/src/NMTTools/NMTTools_CommonBlock.cdl b/src/NMTTools/NMTTools_CommonBlock.cdl new file mode 100644 index 000000000..4778f6526 --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlock.cdl @@ -0,0 +1,107 @@ +// 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/ +// +-- File: NMTTools_CommonBlock.cdl +-- Created: Tue Dec 9 12:11:48 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class CommonBlock from NMTTools + + ---Purpose: + +uses + ListOfInteger from TColStd, + PaveBlock from BOPTools, + ListOfPaveBlock from BOPTools + +--raises + +is + Create + returns CommonBlock from NMTTools; + + AddPaveBlock(me:out; + aPB : PaveBlock from BOPTools); + + AddFace(me:out; + aF : Integer from Standard); + + AddFaces(me:out; + aLF: ListOfInteger from TColStd); + + PaveBlocks(me) + returns ListOfPaveBlock from BOPTools; + ---C++: return const & + + Faces (me) + returns ListOfInteger from TColStd; + ---C++: return const & + + PaveBlock1 (me) + returns PaveBlock from BOPTools; + ---C++: return const & + + PaveBlock1 (me:out; + anIx: Integer from Standard) + returns PaveBlock from BOPTools; + ---C++: return & + + PaveBlockOnEdge (me:out; + anIndex: Integer from Standard) + returns PaveBlock from BOPTools; + ---C++: return & + + IsPaveBlockOnFace (me; + anIndex: Integer from Standard) + returns Boolean from Standard; + + IsPaveBlockOnEdge (me; + anIndex: Integer from Standard) + returns Boolean from Standard; + + IsEqual (me; + aCB:CommonBlock from NMTTools) + returns Boolean from Standard; + + Contains(me; + aPB:PaveBlock from BOPTools) + returns Boolean from Standard; + +-- SetEdge (me:out; +-- anEdge:Integer from Standard); + +-- Edge (me) +-- returns Integer from Standard; + +fields + myPaveBlocks: ListOfPaveBlock from BOPTools is protected; + myFaces : ListOfInteger from TColStd is protected; + +end CommonBlock; + + + + + + + + diff --git a/src/NMTTools/NMTTools_CommonBlock.cxx b/src/NMTTools/NMTTools_CommonBlock.cxx new file mode 100644 index 000000000..c061fe32d --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlock.cxx @@ -0,0 +1,246 @@ +// 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/ +// +// File: NMTTools_CommonBlock.cxx +// Created: Tue Dec 9 12:23:29 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include + +//======================================================================= +// function: NMTTools_CommonBlock::NMTTools_CommonBlock() +// purpose: +//======================================================================= + NMTTools_CommonBlock::NMTTools_CommonBlock() +{ +} +//======================================================================= +// function: AddPaveBlock +// purpose: +//======================================================================= + void NMTTools_CommonBlock::AddPaveBlock(const BOPTools_PaveBlock& aPB) +{ + myPaveBlocks.Append(aPB); +} +//======================================================================= +// function: AddFace +// purpose: +//======================================================================= + void NMTTools_CommonBlock::AddFace(const Standard_Integer aF) +{ + myFaces.Append(aF); +} +//======================================================================= +// function: AddFaces +// purpose: +//======================================================================= + void NMTTools_CommonBlock::AddFaces(const TColStd_ListOfInteger& aLF) +{ + TColStd_ListIteratorOfListOfInteger aIt(aLF); + // + for (; aIt.More(); aIt.Next()) { + myFaces.Append(aIt.Value()); + } +} +//======================================================================= +// function: PaveBlocks +// purpose: +//======================================================================= + const BOPTools_ListOfPaveBlock& NMTTools_CommonBlock::PaveBlocks()const +{ + return myPaveBlocks; +} +//======================================================================= +// function: Faces +// purpose: +//======================================================================= + const TColStd_ListOfInteger& NMTTools_CommonBlock::Faces()const +{ + return myFaces; +} +//======================================================================= +// function: PaveBlock1 +// purpose: +//======================================================================= + const BOPTools_PaveBlock& NMTTools_CommonBlock::PaveBlock1()const +{ + return myPaveBlocks.First(); +} +//======================================================================= +// function: PaveBlock1 +// purpose: +//======================================================================= + BOPTools_PaveBlock& NMTTools_CommonBlock::PaveBlock1(const Standard_Integer aIx) +{ + return PaveBlockOnEdge(aIx); +} +//======================================================================= +// function: PaveBlockOnEdge +// purpose: +//======================================================================= + BOPTools_PaveBlock& NMTTools_CommonBlock::PaveBlockOnEdge(const Standard_Integer aIx) +{ + static BOPTools_PaveBlock aPBs; + Standard_Integer aIOr; + BOPTools_ListIteratorOfListOfPaveBlock anIt(myPaveBlocks); + // + for (; anIt.More(); anIt.Next()) { + BOPTools_PaveBlock& aPB=anIt.Value(); + aIOr=aPB.OriginalEdge(); + if (aIOr==aIx){ + return aPB; + } + } + return aPBs; +} +//======================================================================= +// function: IsPaveBlockOnFace +// purpose: +//======================================================================= + Standard_Boolean NMTTools_CommonBlock::IsPaveBlockOnFace(const Standard_Integer aIx)const +{ + Standard_Boolean bFound=Standard_False; + Standard_Integer nF; + TColStd_ListIteratorOfListOfInteger anIt(myFaces); + // + for (; anIt.More(); anIt.Next()) { + nF=anIt.Value(); + if (nF==aIx){ + return !bFound; + } + } + return bFound; +} +//======================================================================= +// function: IsPaveBlockOnEdge +// purpose: +//======================================================================= + Standard_Boolean NMTTools_CommonBlock::IsPaveBlockOnEdge(const Standard_Integer aIx)const +{ + Standard_Boolean bFound=Standard_False; + Standard_Integer aIOr; + BOPTools_ListIteratorOfListOfPaveBlock anIt(myPaveBlocks); + // + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aIOr=aPB.OriginalEdge(); + if (aIOr==aIx){ + return !bFound; + } + } + return bFound; +} +//======================================================================= +// function: IsEqual +// purpose: +//======================================================================= + Standard_Boolean NMTTools_CommonBlock::IsEqual(const NMTTools_CommonBlock& aOther)const +{ + Standard_Boolean bFound=Standard_True; + Standard_Integer aNb1, aNb2; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + aNb1=myPaveBlocks.Extent(); + aNb2=aOther.myPaveBlocks.Extent(); + // + if (!aNb1 && !aNb2) { + return bFound; + } + if (!aNb1) { + return !bFound; + } + if (!aNb2) { + return !bFound; + } + // + const BOPTools_PaveBlock& aPB=PaveBlock1(); + // + anIt.Initialize(aOther.myPaveBlocks); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBOther=anIt.Value(); + if (aPB.IsEqual(aPBOther)){ + return bFound; + } + } + return !bFound; +} +//======================================================================= +// function: Contains +// purpose: +//======================================================================= + Standard_Boolean NMTTools_CommonBlock::Contains(const BOPTools_PaveBlock& aPBx)const +{ + Standard_Boolean bFound=Standard_False; + Standard_Integer aNb1; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + aNb1=myPaveBlocks.Extent(); + // + if (!aNb1) { + return bFound; + } + // + anIt.Initialize(myPaveBlocks); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + if (aPB.IsEqual(aPBx)) { + return !bFound; + } + } + return bFound; +} +/* +//======================================================================= +// function: SetEdge +// purpose: +//======================================================================= + void NMTTools_CommonBlock::SetEdge(const Standard_Integer anEdge) +{ + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + anIt.Initialize(myPaveBlocks); + for (; anIt.More(); anIt.Next()) { + BOPTools_PaveBlock& aPB=anIt.Value(); + aPB.SetEdge(anEdge); + } +} +//======================================================================= +// function: Edge +// purpose: +//======================================================================= + Standard_Integer NMTTools_CommonBlock::Edge()const +{ + Standard_Integer aNb; + // + aNb=myPaveBlocks.Extent(); + // + if (!aNb) { + return aNb; + } + // + const BOPTools_PaveBlock& aPB=PaveBlock1(); + aNb=aPB.Edge(); + return aNb; +} +*/ diff --git a/src/NMTTools/NMTTools_CommonBlock.jxx b/src/NMTTools/NMTTools_CommonBlock.jxx new file mode 100644 index 000000000..96f3e2846 --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlock.jxx @@ -0,0 +1,31 @@ +// 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/ +// +#ifndef _BOPTools_PaveBlock_HeaderFile +#include +#endif +#ifndef _TColStd_ListOfInteger_HeaderFile +#include +#endif +#ifndef _BOPTools_ListOfPaveBlock_HeaderFile +#include +#endif +#ifndef _NMTTools_CommonBlock_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_CommonBlockAPI.cdl b/src/NMTTools/NMTTools_CommonBlockAPI.cdl new file mode 100644 index 000000000..884992d6b --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlockAPI.cdl @@ -0,0 +1,73 @@ +// 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/ +// +-- File: NMTTools_CommonBlockAPI.cdl +-- Created: Mon Dec 15 11:35:46 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class CommonBlockAPI from NMTTools + + ---Purpose: + +uses + ListOfCommonBlock from NMTTools, + ListOfPaveBlock from BOPTools, + PaveBlock from BOPTools, + CommonBlock from NMTTools + +--raises + +is + Create (aList:ListOfCommonBlock from NMTTools) + returns CommonBlockAPI from NMTTools; + + List(me) + returns ListOfCommonBlock from NMTTools; + ---C++: return const & + ---Purpose: + --- Selector + --- + CommonPaveBlocks(me; + anE:Integer from Standard) + returns ListOfPaveBlock from BOPTools; + ---C++: return const & + ---Purpose: + --- Returns all PaveBlock-s (from the list) that are + --- common for the given edge with DS-index + --- + IsCommonBlock (me; + aPB: PaveBlock from BOPTools) + returns Boolean from Standard; + ---Purpose: + --- Returns TRUE if given PaveBlock is + --- common for the Blocks from the list + + CommonBlock(me; + aPB: PaveBlock from BOPTools) + returns CommonBlock from NMTTools; + ---C++: return & + +fields + myListOfCommonBlock :Address from Standard; + myListOfPaveBlock :ListOfPaveBlock from BOPTools; + +end CommonBlockAPI; diff --git a/src/NMTTools/NMTTools_CommonBlockAPI.cxx b/src/NMTTools/NMTTools_CommonBlockAPI.cxx new file mode 100644 index 000000000..b9cb6ec87 --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlockAPI.cxx @@ -0,0 +1,133 @@ +// 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/ +// +// File: NMTTools_CommonBlockAPI.cxx +// Created: Mon Dec 15 11:38:04 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include + +#include +#include +#include + +//======================================================================= +// function: NMTTools_CommonBlockAPI::NMTTools_CommonBlockAPI +// purpose: +//======================================================================= + NMTTools_CommonBlockAPI::NMTTools_CommonBlockAPI (const NMTTools_ListOfCommonBlock& aLCB) +{ + myListOfCommonBlock=(void *)&aLCB; +} +//======================================================================= +// function: List +// purpose: +//======================================================================= + const NMTTools_ListOfCommonBlock& NMTTools_CommonBlockAPI::List () const +{ + NMTTools_ListOfCommonBlock* pListOfCommonBlock=(NMTTools_ListOfCommonBlock*)myListOfCommonBlock; + return *pListOfCommonBlock; +} +//======================================================================= +// function: CommonPaveBlocks +// purpose: get all CommonPaveBlocks +//======================================================================= + const BOPTools_ListOfPaveBlock& NMTTools_CommonBlockAPI::CommonPaveBlocks(const Standard_Integer anE) const +{ + Standard_Integer anECurrent; + BOPTools_ListIteratorOfListOfPaveBlock anItPB; + // + BOPTools_ListOfPaveBlock* pmyListOfPaveBlock=(BOPTools_ListOfPaveBlock*) &myListOfPaveBlock; + pmyListOfPaveBlock->Clear(); + + NMTTools_ListOfCommonBlock* pListOfCommonBlock=(NMTTools_ListOfCommonBlock*)myListOfCommonBlock; + + NMTTools_ListIteratorOfListOfCommonBlock anIt(*pListOfCommonBlock); + for (; anIt.More(); anIt.Next()) { + const NMTTools_CommonBlock& aCB=anIt.Value(); + // + const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks(); + anItPB.Initialize(aLPB); + for (; anItPB.More(); anItPB.Next()) { + const BOPTools_PaveBlock& aPB=anItPB.Value(); + anECurrent=aPB.OriginalEdge(); + if (anECurrent==anE) { + pmyListOfPaveBlock->Append(aPB); + break; + } + } + } + return myListOfPaveBlock; +} +//======================================================================= +// function: IsCommonBlock +// purpose: +//======================================================================= + Standard_Boolean NMTTools_CommonBlockAPI::IsCommonBlock(const BOPTools_PaveBlock& aPB) const +{ + Standard_Integer anE; + // + anE=aPB.OriginalEdge(); + // + CommonPaveBlocks(anE); + // + BOPTools_ListIteratorOfListOfPaveBlock anIt(myListOfPaveBlock); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB1=anIt.Value(); + if (aPB1.IsEqual(aPB)) { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +// function: CommonBlock +// purpose: +//======================================================================= + NMTTools_CommonBlock& NMTTools_CommonBlockAPI::CommonBlock(const BOPTools_PaveBlock& aPB)const +{ + static NMTTools_CommonBlock aCBTMP; + // + NMTTools_ListIteratorOfListOfCommonBlock anItCB; + BOPTools_ListIteratorOfListOfPaveBlock anItPB; + // + NMTTools_ListOfCommonBlock* pLCB=(NMTTools_ListOfCommonBlock*)myListOfCommonBlock; + // + anItCB.Initialize(*pLCB); + for (; anItCB.More(); anItCB.Next()) { + NMTTools_CommonBlock& aCB=anItCB.Value(); + // + const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks(); + anItPB.Initialize(aLPB); + for (; anItPB.More(); anItPB.Next()) { + const BOPTools_PaveBlock& aPBx=anItPB.Value(); + if (aPBx.IsEqual(aPB)) { + return aCB; + } + } + } + return aCBTMP; +} diff --git a/src/NMTTools/NMTTools_CommonBlockAPI.jxx b/src/NMTTools/NMTTools_CommonBlockAPI.jxx new file mode 100644 index 000000000..54a045946 --- /dev/null +++ b/src/NMTTools/NMTTools_CommonBlockAPI.jxx @@ -0,0 +1,34 @@ +// 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/ +// +#ifndef _NMTTools_ListOfCommonBlock_HeaderFile +#include +#endif +#ifndef _BOPTools_ListOfPaveBlock_HeaderFile +#include +#endif +#ifndef _BOPTools_PaveBlock_HeaderFile +#include +#endif +#ifndef _NMTTools_CommonBlock_HeaderFile +#include +#endif +#ifndef _NMTTools_CommonBlockAPI_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_CoupleOfShape.cdl b/src/NMTTools/NMTTools_CoupleOfShape.cdl new file mode 100644 index 000000000..8cb400159 --- /dev/null +++ b/src/NMTTools/NMTTools_CoupleOfShape.cdl @@ -0,0 +1,58 @@ +// 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/ +// +-- File: NMTTools_CoupleOfShape.cdl +-- Created: Wed Jan 28 15:03:39 2004 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2004 + + +class CoupleOfShape from NMTTools + + ---Purpose: + +uses + Shape from TopoDS + +--raises + +is + Create + returns CoupleOfShape from NMTTools; + + SetShape1(me:out; + aS: Shape from TopoDS); + + SetShape2(me:out; + aS: Shape from TopoDS); + + Shape1(me) + returns Shape from TopoDS; + ---C++: return const & + + Shape2(me) + returns Shape from TopoDS; + ---C++: return const & + +fields + myShape1:Shape from TopoDS is protected; + myShape2:Shape from TopoDS is protected; + +end CoupleOfShape; diff --git a/src/NMTTools/NMTTools_CoupleOfShape.cxx b/src/NMTTools/NMTTools_CoupleOfShape.cxx new file mode 100644 index 000000000..7bc4f2d67 --- /dev/null +++ b/src/NMTTools/NMTTools_CoupleOfShape.cxx @@ -0,0 +1,64 @@ +// 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/ +// +// File: NMTTools_CoupleOfShape.cxx +// Created: Wed Jan 28 15:06:11 2004 +// Author: Peter KURNEV +// + +#include + +//======================================================================= +// function: NMTTools_CoupleOfShape::NMTTools_CoupleOfShape +// purpose: +//======================================================================= + NMTTools_CoupleOfShape::NMTTools_CoupleOfShape() +{} +//======================================================================= +// function: SetShape1 +// purpose: +//======================================================================= + void NMTTools_CoupleOfShape::SetShape1(const TopoDS_Shape& aS) +{ + myShape1=aS; +} +//======================================================================= +// function: SetShape2 +// purpose: +//======================================================================= + void NMTTools_CoupleOfShape::SetShape2(const TopoDS_Shape& aS) +{ + myShape2=aS; +} +//======================================================================= +// function: Shape1 +// purpose: +//======================================================================= + const TopoDS_Shape& NMTTools_CoupleOfShape::Shape1()const +{ + return myShape1; +} +//======================================================================= +// function: Shape2 +// purpose: +//======================================================================= + const TopoDS_Shape& NMTTools_CoupleOfShape::Shape2()const +{ + return myShape2; +} diff --git a/src/NMTTools/NMTTools_CoupleOfShape.jxx b/src/NMTTools/NMTTools_CoupleOfShape.jxx new file mode 100644 index 000000000..a44ab4cd5 --- /dev/null +++ b/src/NMTTools/NMTTools_CoupleOfShape.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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTTools_CoupleOfShape_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_DEProcessor.cdl b/src/NMTTools/NMTTools_DEProcessor.cdl new file mode 100644 index 000000000..b57cd543a --- /dev/null +++ b/src/NMTTools/NMTTools_DEProcessor.cdl @@ -0,0 +1,124 @@ +// 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/ +// +-- File: NMTTools_DEProcessor.cdl +-- Created: Wed Sep 12 12:08:37 2001 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2001 + + +class DEProcessor from NMTTools + + ---Purpose: + -- + -- The Algorithm to compute and store in interferences' pool + --- and in the Data Structure the following values + --- for degenerated edges + --- 1. Paves/Pave set(s) + --- 2. Split parts + --- 3. States (3D) for split parts + --- + +uses + + Vertex from TopoDS, + Edge from TopoDS, + Face from TopoDS, + + PPaveFiller from NMTTools, + PaveFiller from NMTTools, + --PDSFiller from NMTTools, + ListOfPaveBlock from BOPTools, + PShapesDataStructure from NMTDS, + IndexedDataMapOfIntegerDEInfo from BOPTools + + +is + --Create (aFiller:out PDSFiller from NMTTools) + -- returns DEProcessor from NMTTools; + ---Purpose: + --- Constructor + --- + Create (aFiller:out PaveFiller from NMTTools) + returns DEProcessor from NMTTools; + ---Purpose: + --- Constructor + --- + Do(me:out); + ---Purpose: + --- Launches the processor + --- + IsDone(me) + returns Boolean from Standard; + ---Purpose: + --- Returns TRUE if it is Ok + --- + --- + --- Private block + --- + --- + FindDegeneratedEdges (me:out) + is protected; + + DoPaves (me:out) + is protected; + + FindPaveBlocks (me:out; + nED:Integer from Standard; + nVD:Integer from Standard; + nFD:Integer from Standard; + aLPB:out ListOfPaveBlock from BOPTools) + is protected; + + FillPaveSet (me:out; + nED:Integer from Standard; + nVD:Integer from Standard; + nFD:Integer from Standard; + aLPB: ListOfPaveBlock from BOPTools) + is protected; + + FillSplitEdgesPool(me:out; + nED:Integer from Standard) + is protected; + + MakeSplitEdges(me:out; + nED:Integer from Standard; + nFD:Integer from Standard) + is protected; + + MakeSplitEdge (me:out; + aS1: Edge from TopoDS; + aF : Face from TopoDS; + aV1: Vertex from TopoDS; + aP1: Real from Standard; + aV2: Vertex from TopoDS; + aP2: Real from Standard; + aNewEdge:out Edge from TopoDS) + is protected; + +fields + + --myDSFiller: PDSFiller from NMTTools is protected; + myFiller : PPaveFiller from NMTTools is protected; + myDS : PShapesDataStructure from NMTDS is protected; + myIsDone : Boolean from Standard is protected; + myDEMap : IndexedDataMapOfIntegerDEInfo from BOPTools is protected; + +end DEProcessor; diff --git a/src/NMTTools/NMTTools_DEProcessor.cxx b/src/NMTTools/NMTTools_DEProcessor.cxx new file mode 100644 index 000000000..277e9e03a --- /dev/null +++ b/src/NMTTools/NMTTools_DEProcessor.cxx @@ -0,0 +1,511 @@ +// 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/ +// +// File: BOPTools_DEProcessor.cxx +// Created: Wed Sep 12 12:10:52 2001 +// 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 +#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: NMTTools_DEProcessor::NMTTools_DEProcessor +// purpose: +//======================================================================= + NMTTools_DEProcessor::NMTTools_DEProcessor(NMTTools_PaveFiller& aPaveFiller) +: + myIsDone(Standard_False) +{ + myFiller=(NMTTools_PaveFiller*) &aPaveFiller; + myDS=myFiller->DS(); +} +//======================================================================= +// function: IsDone +// purpose: +//======================================================================= + Standard_Boolean NMTTools_DEProcessor::IsDone() const +{ + return myIsDone; +} +//======================================================================= +// function: Do +// purpose: +//======================================================================= + void NMTTools_DEProcessor::Do() +{ + Standard_Integer aNbE; + myIsDone=Standard_False; + + FindDegeneratedEdges(); + aNbE=myDEMap.Extent(); + + if (!aNbE) { + myIsDone=Standard_True; + return; + } + DoPaves(); +} +//======================================================================= +// function: FindDegeneratedEdges +// purpose: +//======================================================================= + void NMTTools_DEProcessor::FindDegeneratedEdges() +{ + Standard_Integer i, aNb, nV, nF, nVx, ip, iRankE; + TopTools_IndexedDataMapOfShapeListOfShape aMEF; + // + aNb=myDS->NumberOfShapesOfTheObject(); + // + for (i=1; i<=aNb; i++) { + const TopoDS_Shape& aF=myDS->Shape(i); + if (aF.ShapeType()==TopAbs_FACE) { + TopExp::MapShapesAndAncestors (aF, TopAbs_EDGE, TopAbs_FACE, aMEF); + } + } + // + for (i=1; i<=aNb; i++) { + const TopoDS_Shape& aS=myDS->Shape(i); + if (aS.ShapeType()==TopAbs_EDGE) { + const TopoDS_Edge& aE=TopoDS::Edge(aS); + + if (BRep_Tool::Degenerated(aE)) { + iRankE=myDS->Rank(i); + + TopoDS_Vertex aV=TopExp::FirstVertex(aE); + + nVx=myDS->ShapeIndex(aV, iRankE); + // + nV=nVx; + ip=myFiller->FindSDVertex(nV); + if (ip) { + nV=ip; + } + // + TColStd_ListOfInteger aLFn; + const TopTools_ListOfShape& aLF=aMEF.FindFromKey(aE); + TopTools_ListIteratorOfListOfShape anIt(aLF); + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape& aF=anIt.Value(); + nF=myDS->ShapeIndex(aF, iRankE); + aLFn.Append(nF); + } + BOPTools_DEInfo aDEInfo; + aDEInfo.SetVertex(nV); + aDEInfo.SetFaces(aLFn); + + myDEMap.Add (i, aDEInfo); + } + } + } +} +//======================================================================= +// function: DoPaves +// purpose: +//======================================================================= + void NMTTools_DEProcessor::DoPaves() +{ + + Standard_Integer i, aNbE, nED, nVD, nFD=0; + // + aNbE=myDEMap.Extent(); + for (i=1; i<=aNbE; i++) { + nED=myDEMap.FindKey(i); + + const BOPTools_DEInfo& aDEInfo=myDEMap(i); + nVD=aDEInfo.Vertex(); + // Fill PaveSet for the edge nED + const TColStd_ListOfInteger& nLF=aDEInfo.Faces(); + TColStd_ListIteratorOfListOfInteger anIt(nLF); + for (; anIt.More(); anIt.Next()) { + nFD=anIt.Value(); + + BOPTools_ListOfPaveBlock aLPB; + FindPaveBlocks(nED, nVD, nFD, aLPB); + FillPaveSet (nED, nVD, nFD, aLPB); + } + // + // Fill aSplitEdges for the edge nED + FillSplitEdgesPool(nED); + // + // MakeSplitEdges + MakeSplitEdges(nED, nFD); + // + }// next nED +} +//======================================================================= +// function: FindPaveBlocks +// purpose: +//======================================================================= + void NMTTools_DEProcessor::FindPaveBlocks(const Standard_Integer , + const Standard_Integer nVD, + const Standard_Integer nFD, + BOPTools_ListOfPaveBlock& aLPBOut) +{ + BOPTools_ListIteratorOfListOfPaveBlock anIt; + Standard_Integer i, aNb, nF2, nV; + // + BOPTools_CArray1OfSSInterference& aFFs=(myFiller->InterfPool())->SSInterferences(); + // + aNb=aFFs.Extent(); + for (i=1; i<=aNb; ++i) { + BOPTools_SSInterference& aFF=aFFs(i); + // + nF2=aFF.OppositeIndex(nFD); + if (!nF2) { + continue; + } + // + // Split Parts + const BOPTools_ListOfPaveBlock& aLPBSplits=aFF.PaveBlocks(); + anIt.Initialize(aLPBSplits); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBSp=anIt.Value(); + // + const BOPTools_Pave& aPave1=aPBSp.Pave1(); + nV=aPave1.Index(); + if (nV==nVD) { + aLPBOut.Append(aPBSp); + continue; + } + // + const BOPTools_Pave& aPave2=aPBSp.Pave2(); + nV=aPave2.Index(); + if (nV==nVD) { + aLPBOut.Append(aPBSp); + continue; + } + } + // + // Section Parts + Standard_Integer j, aNbCurves; + BOPTools_SequenceOfCurves& aSC=aFF.Curves(); + aNbCurves=aSC.Length(); + + for (j=1; j<=aNbCurves; j++) { + const BOPTools_Curve& aBC=aSC(j); + const BOPTools_ListOfPaveBlock& aLPBSe=aBC.NewPaveBlocks(); + + anIt.Initialize(aLPBSe); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBSe=anIt.Value(); + + const BOPTools_Pave& aPv1=aPBSe.Pave1(); + nV=aPv1.Index(); + if (nV==nVD) { + aLPBOut.Append(aPBSe); + continue; + } + + const BOPTools_Pave& aPv2=aPBSe.Pave2(); + nV=aPv2.Index(); + if (nV==nVD) { + aLPBOut.Append(aPBSe); + continue; + } + } + } + } +} +//======================================================================= +// function: FillPaveSet +// purpose: +//======================================================================= + void NMTTools_DEProcessor::FillPaveSet (const Standard_Integer nED, + const Standard_Integer nVD, + const Standard_Integer nFD, + const BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Boolean bIsDone, bXDir, bRejectFlag; + Standard_Integer nE, aNbPoints, j; + Standard_Real aTD1, aTD2, aT1, aT2, aTolInter, aX, aDT; + // + aDT=Precision::PConfusion(); + // + BOPTools_PaveSet& aPaveSet= (myFiller->ChangePavePool()).ChangeValue(myDS->RefEdge(nED)); + // + // Clear aPaveSet, aSplitEdges + aPaveSet.ChangeSet().Clear(); + // + const TopoDS_Edge& aDE=TopoDS::Edge(myDS->Shape(nED)); + const TopoDS_Face& aDF=TopoDS::Face(myDS->Shape(nFD)); + // + // 2D Curve of degenerated edge on the face aDF + Handle(Geom2d_Curve) aC2DDE=BRep_Tool::CurveOnSurface(aDE, aDF, aTD1, aTD2); + // + // Choose direction for Degenerated Edge + gp_Pnt2d aP2d1, aP2d2; + aC2DDE->D0(aTD1, aP2d1); + aC2DDE->D0(aTD2, aP2d2); + + bXDir=Standard_False; + if (fabs(aP2d1.Y()-aP2d2.Y()) < aDT){ + bXDir=!bXDir; + } + // + // Prepare bounding Paves + BOPTools_Pave aPave1 (nVD, aTD1, BooleanOperations_UnknownInterference); + aPaveSet.Append(aPave1); + BOPTools_Pave aPave2 (nVD, aTD2, BooleanOperations_UnknownInterference); + aPaveSet.Append(aPave2); + // + // Fill other paves + BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + nE=aPB.Edge(); + const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); + + Handle(Geom2d_Curve) aC2D=BRep_Tool::CurveOnSurface(aE, aDF, aT1, aT2); + // + // Intersection + aTolInter=0.001; + + Geom2dAdaptor_Curve aGAC1, aGAC2; + + aGAC1.Load(aC2DDE, aTD1, aTD2); + Handle(Geom2d_Line) aL2D= Handle(Geom2d_Line)::DownCast(aC2D); + if (!aL2D.IsNull()) { + aGAC2.Load(aC2D); + } + else { + aGAC2.Load(aC2D, aT1, aT2); + } + + Geom2dInt_GInter aGInter(aGAC1, aGAC2, aTolInter, aTolInter); + + bIsDone=aGInter.IsDone(); + if(bIsDone) { + aNbPoints=aGInter.NbPoints(); + if (aNbPoints) { + for (j=1; j<=aNbPoints; ++j) { + gp_Pnt2d aP2D=aGInter.Point(j).Value(); + // + aX=(bXDir) ? aP2D.X(): aP2D.Y(); + // + if (fabs (aX-aTD1) < aDT || fabs (aX-aTD2) < aDT) { + continue; + } + if (aX < aTD1 || aX > aTD2) { + continue; + } + // + bRejectFlag=Standard_False; + const BOPTools_ListOfPave& aListOfPave=aPaveSet.Set(); + BOPTools_ListIteratorOfListOfPave aPaveIt(aListOfPave); + for (; aPaveIt.More(); aPaveIt.Next()) { + const BOPTools_Pave& aPavex=aPaveIt.Value(); + Standard_Real aXx=aPavex.Param(); + if (fabs (aX-aXx) < aDT) { + bRejectFlag=Standard_True; + break; + } + } + if (bRejectFlag) { + continue; + } + // + BOPTools_Pave aPave(nVD, aX, BooleanOperations_UnknownInterference); + aPaveSet.Append(aPave); + } + } + } + } +} +//======================================================================= +// function: FillSplitEdgesPool +// purpose: +//======================================================================= + void NMTTools_DEProcessor::FillSplitEdgesPool (const Standard_Integer nED) +{ + BOPTools_SplitShapesPool& aSplitShapesPool=myFiller->ChangeSplitShapesPool(); + BOPTools_ListOfPaveBlock& aSplitEdges=aSplitShapesPool.ChangeValue(myDS->RefEdge(nED)); + // + aSplitEdges.Clear(); + // + const BOPTools_PavePool& aPavePool=myFiller->PavePool(); + BOPTools_PavePool* pPavePool=(BOPTools_PavePool*) &aPavePool; + BOPTools_PaveSet& aPaveSet= pPavePool->ChangeValue(myDS->RefEdge(nED)); + + BOPTools_PaveBlockIterator aPBIt(nED, aPaveSet); + for (; aPBIt.More(); aPBIt.Next()) { + BOPTools_PaveBlock& aPB=aPBIt.Value(); + aSplitEdges.Append(aPB); + } +} +//======================================================================= +// function: MakeSplitEdges +// purpose: +//======================================================================= + void NMTTools_DEProcessor::MakeSplitEdges (const Standard_Integer nED, + const Standard_Integer nFD) +{ + const BOPTools_SplitShapesPool& aSplitShapesPool=myFiller->SplitShapesPool(); + const BOPTools_ListOfPaveBlock& aSplitEdges=aSplitShapesPool(myDS->RefEdge(nED)); + + Standard_Integer nV1, nV2, aNewShapeIndex; + Standard_Real t1, t2; + TopoDS_Edge aE, aESplit; + TopoDS_Vertex aV1, aV2; + + const TopoDS_Edge& aDE=TopoDS::Edge(myDS->Shape(nED)); + const TopoDS_Face& aDF=TopoDS::Face(myDS->Shape(nFD)); + + BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges); + + for (; aPBIt.More(); aPBIt.Next()) { + BOPTools_PaveBlock& aPB=aPBIt.Value(); + + const BOPTools_Pave& aPave1=aPB.Pave1(); + nV1=aPave1.Index(); + t1=aPave1.Param(); + aV1=TopoDS::Vertex(myDS->GetShape(nV1)); + aV1.Orientation(TopAbs_FORWARD); + + const BOPTools_Pave& aPave2=aPB.Pave2(); + nV2=aPave2.Index(); + t2=aPave2.Param(); + aV2=TopoDS::Vertex(myDS->GetShape(nV2)); + aV2.Orientation(TopAbs_REVERSED); + + MakeSplitEdge(aDE, aDF, aV1, t1, aV2, t2, aESplit); + // + // Add Split Part of the Original Edge to the DS + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + + anASSeq.SetNewSuccessor(nV1); + anASSeq.SetNewOrientation(aV1.Orientation()); + + anASSeq.SetNewSuccessor(nV2); + anASSeq.SetNewOrientation(aV2.Orientation()); + + myDS->InsertShapeAndAncestorsSuccessors(aESplit, anASSeq); + aNewShapeIndex=myDS->NumberOfInsertedShapes(); + myDS->SetState(aNewShapeIndex, BooleanOperations_UNKNOWN); + // + // Fill Split Set for the Original Edge + aPB.SetEdge(aNewShapeIndex); + // + } +} +//======================================================================= +// function: MakeSplitEdge +// purpose: +//======================================================================= + void NMTTools_DEProcessor::MakeSplitEdge (const TopoDS_Edge& aE, + const TopoDS_Face& aF, + const TopoDS_Vertex& aV1, + const Standard_Real aP1, + const TopoDS_Vertex& aV2, + const Standard_Real aP2, + TopoDS_Edge& aNewEdge) +{ + Standard_Real aTol=1.e-7; + + TopoDS_Edge E=aE; + + E.EmptyCopy(); + BRep_Builder BB; + BB.Add (E, aV1); + BB.Add (E, aV2); + + BB.Range(E, aF, aP1, aP2); + + BB.Degenerated(E, Standard_True); + + BB.UpdateEdge(E, aTol); + aNewEdge=E; +} +/* +//======================================================================= +// function: NMTTools_DEProcessor::NMTTools_DEProcessor +// purpose: +//======================================================================= + NMTTools_DEProcessor::NMTTools_DEProcessor(NMTTools_PDSFiller& pDSFiller) +: + myIsDone(Standard_False) +{ + myDSFiller=pDSFiller; + myFiller=(NMTTools_PaveFiller*) &(myDSFiller->PaveFiller()); + myDS=myFiller->DS(); +} +*/ diff --git a/src/NMTTools/NMTTools_DEProcessor.jxx b/src/NMTTools/NMTTools_DEProcessor.jxx new file mode 100644 index 000000000..61db39d5c --- /dev/null +++ b/src/NMTTools/NMTTools_DEProcessor.jxx @@ -0,0 +1,37 @@ +// 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/ +// +#ifndef _NMTTools_PaveFiller_HeaderFile +#include +#endif +#ifndef _BOPTools_ListOfPaveBlock_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _TopoDS_Vertex_HeaderFile +#include +#endif +#ifndef _NMTTools_DEProcessor_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_DSFiller.cdl b/src/NMTTools/NMTTools_DSFiller.cdl new file mode 100644 index 000000000..82d011819 --- /dev/null +++ b/src/NMTTools/NMTTools_DSFiller.cdl @@ -0,0 +1,99 @@ +// 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/ +// +-- File: NMTTools_DSFiller.cdl +-- Created: Fri Dec 5 13:57:03 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class DSFiller from NMTTools + + ---Purpose: + +uses + Shape from TopoDS, + InterferencePool from BOPTools, + PInterferencePool from BOPTools, + ShapesDataStructure from NMTDS, + PShapesDataStructure from NMTDS, + PPaveFiller from NMTTools, + PaveFiller from NMTTools +--raises + +is + Create + returns DSFiller from NMTTools; + + Destroy (me:out); + ---C++: alias ~ + ---Purpose: Destructor + -- + -- Selectors/Modifiers + SetCompositeShape (me:out; + aS: Shape from TopoDS); + + CompositeShape(me) + returns Shape from TopoDS; + ---C++: return const& + + SetNewFiller(me; + aFlag:Boolean from Standard); + + IsNewFiller(me) + returns Boolean from Standard; + -- + -- Perform the algo + Perform (me:out); + -- + -- Protected section + Clear (me:out) + is protected; + -- + -- Query section + DS (me) + returns ShapesDataStructure from NMTDS; + ---C++: return const & + + InterfPool (me) + returns InterferencePool from BOPTools; + ---C++: return const & + + IsDone(me) + returns Boolean from Standard; + + PaveFiller(me) + returns PaveFiller from NMTTools; + ---C++: return const & + + ChangePaveFiller (me:out) + returns PaveFiller from NMTTools; + ---C++: return & + +fields + myCompositeShape : Shape from TopoDS is protected; + myDS : PShapesDataStructure from NMTDS is protected; + myInterfPool : PInterferencePool from BOPTools is protected; + myPaveFiller : PPaveFiller from NMTTools is protected; + + myIsDone : Boolean from Standard is protected; + myIsNewFiller : Boolean from Standard is protected; + +end DSFiller; diff --git a/src/NMTTools/NMTTools_DSFiller.cxx b/src/NMTTools/NMTTools_DSFiller.cxx new file mode 100644 index 000000000..2a2266d49 --- /dev/null +++ b/src/NMTTools/NMTTools_DSFiller.cxx @@ -0,0 +1,168 @@ +// 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/ +// +// File: NMTTools_DSFiller.cxx +// Created: Fri Dec 5 14:06:34 2003 +// Author: Peter KURNEV +// + + +#include +#include + +//======================================================================= +// function: NMTTools_DSFiller::NMTTools_DSFiller +// purpose: +//======================================================================= + NMTTools_DSFiller::NMTTools_DSFiller() +{ + myPaveFiller=NULL; + myInterfPool=NULL; + myDS=NULL; + myIsNewFiller=Standard_True; + myIsDone=Standard_False; +} +//======================================================================= +// function:Destroy +// purpose: +//======================================================================= + void NMTTools_DSFiller::Destroy() +{ + Clear(); +} +//======================================================================= +// function: Clear +// purpose: +//======================================================================= + void NMTTools_DSFiller::Clear() +{ + if (myPaveFiller!=NULL) { + delete myPaveFiller; + } + if (myInterfPool!=NULL) { + delete myInterfPool; + } + if (myDS!=NULL) { + delete myDS; + } + myPaveFiller=NULL; + myInterfPool=NULL; + myDS=NULL; +} +//======================================================================= +// function: SetCompositeShape +// purpose: +//======================================================================= + void NMTTools_DSFiller::SetCompositeShape(const TopoDS_Shape& aS) +{ + myCompositeShape=aS; +} +//======================================================================= +// function: CompositeShape +// purpose: +//======================================================================= + const TopoDS_Shape& NMTTools_DSFiller::CompositeShape()const +{ + return myCompositeShape; +} +//======================================================================= +// function: SetNewFiller +// purpose: +//======================================================================= + void NMTTools_DSFiller::SetNewFiller(const Standard_Boolean aFlag) const +{ + NMTTools_DSFiller* pDSFiller=(NMTTools_DSFiller*)this; + pDSFiller->myIsNewFiller=aFlag; +} +//======================================================================= +// function: IsNewFiller +// purpose: +//======================================================================= + Standard_Boolean NMTTools_DSFiller::IsNewFiller() const +{ + return myIsNewFiller; +} +//======================================================================= +// function: DS +// purpose: +//======================================================================= + const NMTDS_ShapesDataStructure& NMTTools_DSFiller::DS () const +{ + return *myDS; +} +//======================================================================= +// function: InterfPool +// purpose: +//======================================================================= + const BOPTools_InterferencePool& NMTTools_DSFiller::InterfPool () const +{ + return *myInterfPool; +} +//======================================================================= +// function: IsDone +// purpose: +//======================================================================= + Standard_Boolean NMTTools_DSFiller::IsDone()const +{ + return myIsDone; +} +//======================================================================= +// function: PaveFiller +// purpose: +//======================================================================= + const NMTTools_PaveFiller& NMTTools_DSFiller::PaveFiller()const +{ + return *myPaveFiller; +} +//======================================================================= +// function: ChangePaveFiller +// purpose: +//======================================================================= + NMTTools_PaveFiller& NMTTools_DSFiller::ChangePaveFiller() +{ + return *myPaveFiller; +} +//======================================================================= +// function: Perform +// purpose: +//======================================================================= + void NMTTools_DSFiller::Perform() +{ + myIsDone=Standard_False; + // + if (myCompositeShape.IsNull()) { + return; + } + // + // + // Clear contents of the DS if it was before + Clear(); + // + myIsNewFiller=Standard_True; + // + myDS = new NMTDS_ShapesDataStructure; + myDS->SetCompositeShape(myCompositeShape); + myDS->Init(); + // + myInterfPool= new BOPTools_InterferencePool (*myDS); + // + myPaveFiller = new NMTTools_PaveFiller(*myInterfPool); + myPaveFiller->Perform(); + myIsDone=myPaveFiller->IsDone(); +} diff --git a/src/NMTTools/NMTTools_DSFiller.jxx b/src/NMTTools/NMTTools_DSFiller.jxx new file mode 100644 index 000000000..0eaf5fed7 --- /dev/null +++ b/src/NMTTools/NMTTools_DSFiller.jxx @@ -0,0 +1,34 @@ +// 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/ +// +#ifndef _TopoDS_Shape_HeaderFile +#include +#endif +#ifndef _NMTDS_ShapesDataStructure_HeaderFile +#include +#endif +#ifndef _BOPTools_InterferencePool_HeaderFile +#include +#endif +#ifndef _NMTTools_PaveFiller_HeaderFile +#include +#endif +#ifndef _NMTTools_DSFiller_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cdl b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cdl new file mode 100644 index 000000000..b85337d85 --- /dev/null +++ b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cdl @@ -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/ +// +-- File: NMTTools_IteratorOfCoupleOfShape.cdl +-- Created: Thu Dec 4 16:57:48 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class IteratorOfCoupleOfShape from NMTTools + inherits IteratorOfCoupleOfShape from BOPTools + + ---Purpose: + +uses + ShapeEnum from TopAbs, + IndexedMapOfCoupleOfInteger from BOPTools, + PShapesDataStructure from NMTDS, + ShapesDataStructure from NMTDS + +raises + NoSuchObject from Standard + +is + Create + returns IteratorOfCoupleOfShape from NMTTools; + + SetDS(me:out; + pDS:PShapesDataStructure from NMTDS); + + Initialize(me: in out; + Type1: ShapeEnum from TopAbs; + Type2: ShapeEnum from TopAbs) + raises NoSuchObject from Standard + is redefined; + + Current(me; Index1: in out Integer from Standard; + Index2: in out Integer from Standard; + WithSubShape: out Boolean from Standard) + is redefined; + + More(me) + returns Boolean from Standard + is redefined; + + DS(me) + returns ShapesDataStructure from NMTDS; + ---C++:return const & + +fields + myPNMTPS : PShapesDataStructure from NMTDS is protected; + myMap : IndexedMapOfCoupleOfInteger from BOPTools is protected; + myIndex1 : Integer from Standard is protected; + myIndex2 : Integer from Standard is protected; + myWithSubShapeFlag: Boolean from Standard is protected; + +end IteratorOfCoupleOfShape; diff --git a/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cxx b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cxx new file mode 100644 index 000000000..fb96d6277 --- /dev/null +++ b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.cxx @@ -0,0 +1,159 @@ +// 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/ +// +// File: NMTTools_IteratorOfCoupleOfShape.cxx +// Created: Thu Dec 4 17:00:03 2003 +// Author: Peter KURNEV +// + + +#include +#include +#include +#include +#include +#include + +//======================================================================= +// function: +// purpose: +//======================================================================= + NMTTools_IteratorOfCoupleOfShape::NMTTools_IteratorOfCoupleOfShape() +: + BOPTools_IteratorOfCoupleOfShape() +{ + myIndex1=0; + myIndex2=0; + myWithSubShapeFlag=Standard_False; +} +//======================================================================= +// function: SetDS +// purpose: +//======================================================================= + void NMTTools_IteratorOfCoupleOfShape::SetDS(const NMTDS_PShapesDataStructure& PDS) +{ + myPNMTPS=PDS; + SetDataStructure(myPNMTPS); +} +//======================================================================= +// function: Initialize +// purpose: +//======================================================================= + void NMTTools_IteratorOfCoupleOfShape::Initialize(const TopAbs_ShapeEnum Type1, + const TopAbs_ShapeEnum Type2) +{ + if(myPDS==NULL) { + Standard_NoSuchObject::Raise("NMTTools_IteratorOfCoupleOfShape::Initialize: myPDS==NULL"); + } + // + myType1 = Type1; + myType2 = Type2; + myCurrentIndex1 = -1; + myCurrentIndex2 = -1; + // + myFirstLowerIndex=1; + myFirstUpperIndex=myPNMTPS->NumberOfShapesOfTheObject(); + mySecondLowerIndex=myFirstUpperIndex+1; + mySecondUpperIndex=myFirstUpperIndex+myPNMTPS->NumberOfShapesOfTheTool(); + // + Standard_Integer n1, n2, aIR1, aIR2;//, aN1, aN2, aNS; + // + const NMTDS_CArray1OfIndexRange& aRanges=myPNMTPS->Ranges(); + // + //aNS=myPNMTPS->NumberOfShapesOfTheObject(); + myIndex1=0; + myIndex2=0; + myWithSubShapeFlag=Standard_False; + // + myListOfCouple.Clear(); + myMap.Clear(); + // + NextP(); + for (; MoreP(); NextP()) { + CurrentP(n1, n2); + // + aIR1=myPNMTPS->ShapeRangeIndex(n1); + aIR2=myPNMTPS->ShapeRangeIndex(n2); + if (aIR1==aIR2){ + continue; + } + // + BOPTools_CoupleOfInteger aCouple(n1, n2); + myListOfCouple.Append(aCouple); + // + /* + aN1=(n1>aNS)? n1-aNS : n1; + aN2=(n2>aNS)? n2-aNS : n2; + BOPTools_CoupleOfInteger aCoupleX(aN1, aN2); + myMap.Add(aCoupleX); + */ + } + myIterator.Initialize(myListOfCouple); +} +//======================================================================= +// function: Current +// purpose: +//======================================================================= + void NMTTools_IteratorOfCoupleOfShape::Current(Standard_Integer& aIndex1, + Standard_Integer& aIndex2, + Standard_Boolean& aWithSubShape) const +{ + aIndex1=myIndex1; + aIndex2=myIndex2; + aWithSubShape=myWithSubShapeFlag; +} +//======================================================================= +// function: More +// purpose: +//======================================================================= + Standard_Boolean NMTTools_IteratorOfCoupleOfShape::More()const +{ + Standard_Boolean bMore, bWithSubShape; + Standard_Integer n1, n2, aNS, aN1, aN2; + BOPTools_CoupleOfInteger aCoupleX; + NMTTools_IteratorOfCoupleOfShape* pIt=(NMTTools_IteratorOfCoupleOfShape*)this; + // + aNS=myPNMTPS->NumberOfShapesOfTheObject(); + pIt->myIndex1=0; + pIt->myIndex2=0; + pIt->myWithSubShapeFlag=Standard_False; + // + while (1) { + bMore=myIterator.More(); + if (!bMore) { + break; + } + // + BOPTools_IteratorOfCoupleOfShape::Current(n1, n2, bWithSubShape); + aN1=(n1>aNS)? n1-aNS : n1; + aN2=(n2>aNS)? n2-aNS : n2; + aCoupleX.SetCouple(aN1, aN2); + if (!myMap.Contains(aCoupleX)) { + pIt->myMap.Add(aCoupleX); + // + pIt->myIndex1=aN1; + pIt->myIndex2=aN2; + pIt->myWithSubShapeFlag=bWithSubShape; + break; + } + // + pIt->Next(); + } + return bMore; +} diff --git a/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.jxx b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.jxx new file mode 100644 index 000000000..ac0d96f7e --- /dev/null +++ b/src/NMTTools/NMTTools_IteratorOfCoupleOfShape.jxx @@ -0,0 +1,28 @@ +// 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/ +// +#ifndef _Standard_NoSuchObject_HeaderFile +#include +#endif +#ifndef _NMTDS_ShapesDataStructure_HeaderFile +#include +#endif +#ifndef _NMTTools_IteratorOfCoupleOfShape_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_PCurveMaker.cdl b/src/NMTTools/NMTTools_PCurveMaker.cdl new file mode 100644 index 000000000..3c38575a0 --- /dev/null +++ b/src/NMTTools/NMTTools_PCurveMaker.cdl @@ -0,0 +1,54 @@ +// 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/ +// +-- File: NMTTools_PCurveMaker.cdl +-- Created: +-- Author: Peter KURNEV +-- + +class PCurveMaker from NMTTools + + ---Purpose: + -- Class provides computation p-curves for the edges and theirs + --- split parts + +uses + PDSFiller from NMTTools + +is + Create (aFiller:out PDSFiller from NMTTools) + returns PCurveMaker from NMTTools; + ---Purpose: + --- Constructor + --- + Do(me:out); + ---Purpose: + --- Launch the processor + --- + IsDone(me) + returns Boolean from Standard; + ---Purpose: + --- Returns TRUE if Ok + --- + +fields + myDSFiller: PDSFiller from NMTTools is protected; + myIsDone : Boolean from Standard is protected; + +end PCurveMaker; diff --git a/src/NMTTools/NMTTools_PCurveMaker.cxx b/src/NMTTools/NMTTools_PCurveMaker.cxx new file mode 100644 index 000000000..2b139c143 --- /dev/null +++ b/src/NMTTools/NMTTools_PCurveMaker.cxx @@ -0,0 +1,128 @@ +// 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/ +// +// File: NMTTools_PCurveMaker.cxx +// Created: +// 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 +#include +#include +#include +#include +#include + + +//======================================================================= +// function: NMTTools_PCurveMaker +// purpose: +//======================================================================= + NMTTools_PCurveMaker::NMTTools_PCurveMaker(NMTTools_PDSFiller& pDSFiller) +: + myIsDone(Standard_False) +{ + myDSFiller=pDSFiller; +} +//======================================================================= +// function: IsDone +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PCurveMaker::IsDone() const +{ + return myIsDone; +} +//======================================================================= +// function: Do +// purpose: +//======================================================================= + void NMTTools_PCurveMaker::Do() +{ + Standard_Integer i, aNb, nF1, nF2, nE; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + TopoDS_Face aF1FWD, aF2FWD; + // + NMTTools_PaveFiller *pFiller=(NMTTools_PaveFiller*) &(myDSFiller->PaveFiller()); + NMTDS_ShapesDataStructure *pDS=pFiller->DS(); + // + BOPTools_CArray1OfSSInterference& aFFs=(pFiller->InterfPool())->SSInterferences(); + // + aNb=aFFs.Extent(); + for (i=1; i<=aNb; ++i) { + BOPTools_SSInterference& aFF=aFFs(i); + // Faces + aFF.Indices(nF1, nF2); + const TopoDS_Face& aF1=TopoDS::Face(pDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(pDS->Shape(nF2)); + // + // 1.Forwarding the Faces + aF1FWD=aF1; + aF1FWD.Orientation(TopAbs_FORWARD); + aF2FWD=aF2; + aF2FWD.Orientation(TopAbs_FORWARD); + // + // 2. In, On parts processing + const BOPTools_ListOfPaveBlock& aLPBInOn=aFF.PaveBlocks(); + anIt.Initialize(aLPBInOn); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + const BOPTools_PaveBlock& aPBInOn=pFiller->RealPaveBlock(aPB); + // + nE=aPBInOn.Edge(); + const TopoDS_Edge& aE=TopoDS::Edge(pDS->Shape(nE)); + + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); + } + } // for (i=1; i<=aNb; i++) + myIsDone=Standard_True; +} + diff --git a/src/NMTTools/NMTTools_PCurveMaker.jxx b/src/NMTTools/NMTTools_PCurveMaker.jxx new file mode 100644 index 000000000..8d7f0405d --- /dev/null +++ b/src/NMTTools/NMTTools_PCurveMaker.jxx @@ -0,0 +1,22 @@ +// 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/ +// +#ifndef _NMTTools_PCurveMaker_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_PaveFiller.cdl b/src/NMTTools/NMTTools_PaveFiller.cdl new file mode 100644 index 000000000..49616a9ca --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller.cdl @@ -0,0 +1,460 @@ +// 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/ +// +-- File: NMTTools_PaveFiller.cdl +-- Created: Fri Dec 5 14:35:00 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class PaveFiller from NMTTools + + ---Purpose: + +uses + ListOfInteger from TColStd, + Pnt from gp, + ShapeEnum from TopAbs, + Vertex from TopoDS, + Face from TopoDS, + + Context from IntTools, + ShrunkRange from IntTools, + + IndexedDataMapOfShapeInteger from BooleanOperations, + + InterferencePool from BOPTools, + PInterferencePool from BOPTools, + PavePool from BOPTools, + PaveBlock from BOPTools, + ListOfPaveBlock from BOPTools, + SplitShapesPool from BOPTools, + Pave from BOPTools, + PaveSet from BOPTools, + Curve from BOPTools, + SSInterference from BOPTools, + + IDMapOfPaveBlockIMapOfPaveBlock from BOPTools, + IDMapOfPaveBlockIMapOfInteger from BOPTools, + SSIntersectionAttribute from BOPTools, + + CommonBlockPool from NMTTools, + CommonBlock from NMTTools, + ListOfCommonBlock from NMTTools, + IteratorOfCoupleOfShape from NMTTools, + + ShapesDataStructure from NMTDS, + PShapesDataStructure from NMTDS + +--raises + +is + Create + returns PaveFiller from NMTTools; + + Create(aIP:InterferencePool from BOPTools) + returns PaveFiller from NMTTools; + + Destroy (me: in out) + is virtual; + ---C++: alias "Standard_EXPORT virtual ~NMTTools_PaveFiller(){Destroy();}" + -- + -- Selectors/Modifiers + SetInterferencePool(me:out; + aIP:InterferencePool from BOPTools); + + InterfPool(me:out) + returns PInterferencePool from BOPTools; + -- + -- Perform the algo + Init (me:out) + is protected; + + Perform (me:out) + is virtual; + + PerformVV (me:out) + is virtual protected; + + PerformVE (me:out) + is virtual protected; + + PerformVF (me:out) + is virtual protected; + + PerformEE (me:out) + is virtual protected; + + PerformEF (me:out) + is virtual protected; + + PerformFF (me:out) + is virtual protected; + + MakeSplitEdges(me:out) + is protected; + + PreparePaveBlocks (me:out; + aType1: ShapeEnum from TopAbs; + aType2: ShapeEnum from TopAbs) + is virtual protected; + + CorrectShrunkRanges(me:out; + aSide: Integer from Standard; + aPave: Pave from BOPTools; + aSR : out ShrunkRange from IntTools) + is protected; + + PreparePaveBlocks (me:out; + anE:Integer from Standard) + is virtual protected; + + PerformNewVertices (me:out) + is virtual protected; + + PrepareEdges (me:out) + is virtual protected; + + SortTypes (me; + anInd1:in out Integer from Standard; + anInd2:in out Integer from Standard) + is protected; + + ExpectedPoolLength(me) + returns Integer from Standard + is protected; + -- + -- Query section + IsDone(me) + returns Boolean from Standard; + + DS(me:out) + returns PShapesDataStructure from NMTDS; + + Context(me) + returns Context from IntTools; + ---C++:return const & + + ChangeContext(me:out) + returns Context from IntTools; + ---C++:return & + + PavePool(me) + returns PavePool from BOPTools; + ---C++:return const & + + ChangePavePool(me:out) + returns PavePool from BOPTools; + ---C++:return & + + CommonBlockPool(me) + returns CommonBlockPool from NMTTools; + ---C++:return const & + + ChangeCommonBlockPool(me:out) + returns CommonBlockPool from NMTTools; + ---C++:return & + + SplitShapesPool(me) + returns SplitShapesPool from BOPTools; + ---C++:return const & + + ChangeSplitShapesPool(me:out) + returns SplitShapesPool from BOPTools; + ---C++:return & + + FindSDVertex (me; + nV: Integer from Standard) + returns Integer from Standard; + + IsSuccesstorsComputed (me; + iF1:Integer from Standard; + iF2:Integer from Standard) + returns Boolean from Standard + is protected; + + IsBlocksCoinside (me; + aPB1:PaveBlock from BOPTools; + aPB2:PaveBlock from BOPTools) + returns Boolean from Standard + is protected; + + RefinePavePool(me:out) + is protected; + + CheckFacePaves(me:out; + aV : Vertex from TopoDS; + nF: Integer from Standard) + returns Integer from Standard + is protected; + + ReplaceCommonBlocks (me:out; + aLCB: ListOfCommonBlock from NMTTools) + is protected; + + RemoveCommonBlocks (me:out; + aLCB: ListOfCommonBlock from NMTTools) + is protected; + + SplitCommonBlocks (me:out; + aLCB: ListOfCommonBlock from NMTTools) + is protected; + + SplitCommonBlock (me:out; + aCB : CommonBlock from NMTTools; + aLCB: out ListOfCommonBlock from NMTTools) + is protected; + + EECommonBlocks(me:out; + aM:IDMapOfPaveBlockIMapOfPaveBlock from BOPTools) + is protected; + + EFCommonBlocks(me:out; + aMapCB:IDMapOfPaveBlockIMapOfInteger from BOPTools) + is protected; + + EENewVertices (me:out; + aM:IndexedDataMapOfShapeInteger from BooleanOperations) + is protected; + + EENewVertices (me:out; + aV:Vertex from TopoDS; + aM:IndexedDataMapOfShapeInteger from BooleanOperations) + is protected; + + EFNewVertices (me:out; + aM:IndexedDataMapOfShapeInteger from BooleanOperations) + is protected; + + EFNewVertices (me:out; + aV:Vertex from TopoDS; + aM:IndexedDataMapOfShapeInteger from BooleanOperations) + is protected; + + UpdateCommonBlocks(me:out) + is protected; + + UpdatePaveBlocks(me:out) + is protected; + + SplitIndex(me; + aPB:PaveBlock from BOPTools) + returns Integer from Standard + is protected; + + MakeBlocks(me:out) + is protected; + + -------------------------------------------------------------- + --- + --- Some API FUNCTIONS + --- + SplitsInFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + SplitsInFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + SplitsOnEdge(me:out; + nE1 :Integer from Standard; + nE2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + SplitsOnFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + SplitsOnFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + SplitsInFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + + SplitsInFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + + SplitsOnEdge(me:out; + nE1 :Integer from Standard; + nE2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + + SplitsOnFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + + SplitsOnFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + -- + SplitsFace (me:out; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools) + returns Integer from Standard; + + SplitsFace (me:out; + nF2 :Integer from Standard; + aLs :out ListOfInteger from TColStd) + returns Integer from Standard; + + CommonBlocksFace (me:out; + nF :Integer from Standard; + aLCB:out ListOfCommonBlock from NMTTools) + returns Integer from Standard; + + PrepareFace(me:out; + nF : Integer from Standard; + aF : out Face from TopoDS); + + -- + RealPaveBlock(me:out; + aPB:PaveBlock from BOPTools) + returns PaveBlock from BOPTools; + ---C++: return const & + -- + RealSplitsFace (me:out; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + + HasRealSplitsInOnFace (me:out; + nF1 :Integer from Standard; + nF2 :Integer from Standard) + returns Boolean from Standard; + + RealSplitsInFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + + RealSplitsInFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + + RealSplitsOnEdge(me:out; + nE1 :Integer from Standard; + nE2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + + RealSplitsOnFace(me:out; + nE1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + + RealSplitsOnFace(me:out; + aBid:Integer from Standard; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + aLs :out ListOfPaveBlock from BOPTools); + -- + PrepareSetForFace(me:out; + nF1 :Integer from Standard; + nF2 :Integer from Standard; + --modified by NIZNHY-PKV Fri Apr 1 11:19:15 2005f + aLPB: ListOfPaveBlock from BOPTools; + --modified by NIZNHY-PKV Fri Apr 1 10:54:16 2005t + aPSF:out PaveSet from BOPTools); + + PutPaveOnCurve(me:out; + aPSF: PaveSet from BOPTools; + aTol: Real from Standard; + aBC : out Curve from BOPTools); + + PutBoundPaveOnCurve (me:out; + aBC :out Curve from BOPTools; + aFF :out SSInterference from BOPTools); + + PutBoundPaveOnCurve (me:out; + aP : Pnt from gp; + aT : Real from Standard; + aBC :out Curve from BOPTools; + aFF :out SSInterference from BOPTools); + + FindPave (me:out; + aP : Pnt from gp; + aTpV: Real from Standard; + aPS : PaveSet from BOPTools; + aPV :out Pave from BOPTools) + returns Boolean from Standard; + + CheckIntermediatePoint(me:out; + aPB : PaveBlock from BOPTools; + aPBR: PaveBlock from BOPTools; + aTol: Real from Standard) + returns Integer from Standard; + +-- IsExistingPaveBlock (me:out; +-- aPB : PaveBlock from BOPTools; +-- aFF : SSInterference from BOPTools) +-- returns Boolean from Standard; + +--modified by NIZNHY-PKV Fri Apr 1 09:35:34 2005f + IsExistingPaveBlock (me:out; + aPB : PaveBlock from BOPTools; + aLPB: ListOfPaveBlock from BOPTools; + aTol: Real from Standard) + returns Boolean from Standard; +--modified by NIZNHY-PKV Fri Apr 1 09:35:39 2005t + + MakePCurves (me:out); + +fields + myIntrPool : PInterferencePool from BOPTools is protected; + myDS : PShapesDataStructure from NMTDS is protected; + myIsDone : Boolean from Standard is protected; + myNbSources : Integer from Standard is protected; + myNbEdges : Integer from Standard is protected; + myDSIt : IteratorOfCoupleOfShape from NMTTools is protected; + -- + myPavePool : PavePool from BOPTools is protected; + myPavePoolNew : PavePool from BOPTools is protected; + myCommonBlockPool : CommonBlockPool from NMTTools is protected; + mySplitShapesPool : SplitShapesPool from BOPTools is protected; + -- + myContext : Context from IntTools is protected; + mySectionAttribute : SSIntersectionAttribute from BOPTools is protected; +end PaveFiller; diff --git a/src/NMTTools/NMTTools_PaveFiller.cxx b/src/NMTTools/NMTTools_PaveFiller.cxx new file mode 100644 index 000000000..4594b09b4 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller.cxx @@ -0,0 +1,231 @@ +// 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/ +// +// File: NMTTools_PaveFiller.cxx +// Created: Fri Dec 5 14:58:54 2003 +// Author: Peter KURNEV +// +// +#include +// +#include +#include +#include +//QQ #include "utilities.h" + +//======================================================================= +// function: NMTTools_PaveFiller::NMTTools_PaveFiller +// purpose: +//======================================================================= + NMTTools_PaveFiller::NMTTools_PaveFiller() +{ + myIntrPool=NULL; + myDS=NULL; + myIsDone=Standard_False; + myNbSources=0; + myNbEdges=0; +} +//======================================================================= +// function:NMTTools_PaveFiller::NMTTools_PaveFiller +// purpose: +//======================================================================= + NMTTools_PaveFiller::NMTTools_PaveFiller(const BOPTools_InterferencePool& aIP) +{ + SetInterferencePool(aIP); +} +//======================================================================= +// function: Destroy +// purpose: +//======================================================================= + void NMTTools_PaveFiller::Destroy() +{ +} +//======================================================================= +// function: SetInterferencePool +// purpose: +//======================================================================= + void NMTTools_PaveFiller::SetInterferencePool(const BOPTools_InterferencePool& aIP) +{ + myIsDone=Standard_False; + // + myIntrPool=(BOPTools_InterferencePool*)&aIP; + myDS=(NMTDS_ShapesDataStructure*)myIntrPool->DS(); + myNbSources=myDS->NumberOfShapesOfTheObject()+myDS->NumberOfShapesOfTheTool(); + myNbEdges=myDS->NbEdges(); +} +//======================================================================= +// function: InterfPool +// purpose: +//======================================================================= + BOPTools_PInterferencePool NMTTools_PaveFiller::InterfPool() +{ + return myIntrPool; +} +//======================================================================= +// function:IsDone +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::IsDone() const +{ + return myIsDone; +} +//======================================================================= +// function: DS +// purpose: +//======================================================================= + NMTDS_PShapesDataStructure NMTTools_PaveFiller::DS() +{ + return myDS; +} +//======================================================================= +// function: Context +// purpose: +//======================================================================= + const IntTools_Context& NMTTools_PaveFiller::Context() const +{ + return myContext; +} +//======================================================================= +// function: ChangeContext +// purpose: +//======================================================================= + IntTools_Context& NMTTools_PaveFiller::ChangeContext() +{ + return myContext; +} +//======================================================================= +// function: PavePool +// purpose: +//======================================================================= + const BOPTools_PavePool& NMTTools_PaveFiller::PavePool() const +{ + return myPavePool; +} +//======================================================================= +// function: ChangePavePool +// purpose: +//======================================================================= + BOPTools_PavePool& NMTTools_PaveFiller::ChangePavePool() +{ + return myPavePool; +} +//======================================================================= +// function: CommonBlockPool +// purpose: +//======================================================================= + const NMTTools_CommonBlockPool& NMTTools_PaveFiller::CommonBlockPool() const +{ + return myCommonBlockPool; +} +//======================================================================= +// function: ChangeCommonBlockPool +// purpose: +//======================================================================= + NMTTools_CommonBlockPool& NMTTools_PaveFiller::ChangeCommonBlockPool() +{ + return myCommonBlockPool; +} +//======================================================================= +// function: SplitShapesPool +// purpose: +//======================================================================= + const BOPTools_SplitShapesPool& NMTTools_PaveFiller::SplitShapesPool() const +{ + return mySplitShapesPool; +} + +//======================================================================= +// function: ChangeSplitShapesPool +// purpose: +//======================================================================= + BOPTools_SplitShapesPool& NMTTools_PaveFiller::ChangeSplitShapesPool() +{ + return mySplitShapesPool; +} +//======================================================================= +// function: Init +// purpose: +//======================================================================= + void NMTTools_PaveFiller::Init() +{ + myDSIt.SetDS(myDS); +} +//======================================================================= +// function: Perform +// purpose: +//======================================================================= + void NMTTools_PaveFiller::Perform() +{ + try { + // 0. + Init();//myDSIt.SetDS(myDS); + // + //1.VV + PerformVV(); + PerformNewVertices(); + // + // 2.VE + myPavePool.Resize (myNbEdges); + PrepareEdges(); + + PerformVE(); + // + // 3.VF + PerformVF(); + // + // 4.EE + myCommonBlockPool.Resize (myNbEdges); + mySplitShapesPool.Resize (myNbEdges); + myPavePoolNew .Resize (myNbEdges); + + PreparePaveBlocks(TopAbs_VERTEX, TopAbs_EDGE); + PreparePaveBlocks(TopAbs_EDGE, TopAbs_EDGE); + // + PerformEE(); + // + RefinePavePool (); + // + myPavePoolNew.Destroy(); + myPavePoolNew.Resize (myNbEdges); + // + // 5.EF + PreparePaveBlocks(TopAbs_EDGE, TopAbs_FACE); + PerformEF(); + RefinePavePool(); + // + myPavePoolNew.Destroy(); + MakeSplitEdges(); + UpdateCommonBlocks(); + // + // 6. FF + PerformFF (); + MakeBlocks(); + MakePCurves(); + // + // 7.Postprocessing + UpdatePaveBlocks(); + // + NMTTools_DEProcessor aDEP(*this); + aDEP.Do(); + // + } + catch (BOPTColStd_Failure& /*x*/) { + //QQ MESSAGE(x.Message() << flush); + } +} diff --git a/src/NMTTools/NMTTools_PaveFiller.jxx b/src/NMTTools/NMTTools_PaveFiller.jxx new file mode 100644 index 000000000..07212861d --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller.jxx @@ -0,0 +1,85 @@ +// 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/ +// +#ifndef _BOPTools_InterferencePool_HeaderFile +#include +#endif +#ifndef _BOPTools_Pave_HeaderFile +#include +#endif +#ifndef _IntTools_ShrunkRange_HeaderFile +#include +#endif +#ifndef _IntTools_Context_HeaderFile +#include +#endif +#ifndef _BOPTools_PavePool_HeaderFile +#include +#endif +#ifndef _NMTTools_CommonBlockPool_HeaderFile +#include +#endif +#ifndef _BOPTools_SplitShapesPool_HeaderFile +#include +#endif +#ifndef _BOPTools_PaveBlock_HeaderFile +#include +#endif +#ifndef _TopoDS_Vertex_HeaderFile +#include +#endif +#ifndef _NMTTools_ListOfCommonBlock_HeaderFile +#include +#endif +#ifndef _NMTTools_CommonBlock_HeaderFile +#include +#endif +#ifndef _BOPTools_IDMapOfPaveBlockIMapOfPaveBlock_HeaderFile +#include +#endif +#ifndef _BOPTools_IDMapOfPaveBlockIMapOfInteger_HeaderFile +#include +#endif +#ifndef _BooleanOperations_IndexedDataMapOfShapeInteger_HeaderFile +#include +#endif +#ifndef _TColStd_ListOfInteger_HeaderFile +#include +#endif +#ifndef _BOPTools_ListOfPaveBlock_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _BOPTools_PaveSet_HeaderFile +#include +#endif +#ifndef _BOPTools_Curve_HeaderFile +#include +#endif +#ifndef _BOPTools_SSInterference_HeaderFile +#include +#endif +#ifndef _gp_Pnt_HeaderFile +#include +#endif +#ifndef _NMTTools_PaveFiller_HeaderFile +#include +#endif diff --git a/src/NMTTools/NMTTools_PaveFiller_0.cxx b/src/NMTTools/NMTTools_PaveFiller_0.cxx new file mode 100644 index 000000000..67951644d --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_0.cxx @@ -0,0 +1,137 @@ +// 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/ +// +// File: NMTTools_PaveFiller_0.cxx +// Created: Mon Dec 8 11:45:51 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include +#include + +//======================================================================= +//function : SortTypes +//purpose : +//======================================================================= + void NMTTools_PaveFiller::SortTypes(Standard_Integer& theWhat, + Standard_Integer& theWith)const +{ + Standard_Boolean aReverseFlag=Standard_True; + + TopAbs_ShapeEnum aType1= myDS->GetShapeType(theWhat), + aType2= myDS->GetShapeType(theWith); + + if (aType1==aType2) + return; + + if (aType1==TopAbs_EDGE && aType2==TopAbs_FACE){ + aReverseFlag=Standard_False; + } + + if (aType1==TopAbs_VERTEX && + (aType2==TopAbs_FACE || aType2==TopAbs_EDGE)) { + aReverseFlag=Standard_False; + } + + Standard_Integer aWhat, aWith; + aWhat=(aReverseFlag) ? theWith : theWhat; + aWith=(aReverseFlag) ? theWhat : theWith; + + theWhat=aWhat; + theWith=aWith; +} +//======================================================================= +// function: ExpectedPoolLength +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::ExpectedPoolLength()const +{ + Standard_Integer aNbIIs; + Standard_Real aCfPredict=.5; + + const BOPTools_ListOfCoupleOfInteger& aLC=myDSIt.ListOfCouple(); + aNbIIs=aLC.Extent(); + // + if (aNbIIs==1) { + return aNbIIs; + } + // + aNbIIs=(Standard_Integer) (aCfPredict*(Standard_Real)aNbIIs); + + return aNbIIs; +} +//======================================================================= +// function:IsSuccesstorsComputed +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::IsSuccesstorsComputed(const Standard_Integer aN1, + const Standard_Integer aN2)const +{ + Standard_Integer nSuc, n1, n2; + + BooleanOperations_OnceExplorer aExp(*myDS); + TopAbs_ShapeEnum aType=myDS->GetShapeType(aN1); + + n1=aN1; + n2=aN2; + + if (aType!=TopAbs_VERTEX) { + Standard_Integer ntmp=n1; + n1=n2; + n2=ntmp; + } + + aType=myDS->GetShapeType(n2); + if (aType==TopAbs_EDGE) { + aExp.Init(n2, TopAbs_VERTEX); + for (; aExp.More(); aExp.Next()) { + nSuc=aExp.Current(); + if (myIntrPool->IsComputed(n1, nSuc)) { + return Standard_True; + } + } + return Standard_False; + } + + else if (aType==TopAbs_FACE) { + aExp.Init(n2, TopAbs_VERTEX); + for (; aExp.More(); aExp.Next()) { + nSuc=aExp.Current(); + if (myIntrPool->IsComputed(n1, nSuc)) { + return Standard_True; + } + } + + aExp.Init(n2, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nSuc=aExp.Current(); + if (myIntrPool->IsComputed(n1, nSuc)) { + return Standard_True; + } + } + return Standard_False; + } + + return Standard_False; +} diff --git a/src/NMTTools/NMTTools_PaveFiller_1.cxx b/src/NMTTools/NMTTools_PaveFiller_1.cxx new file mode 100644 index 000000000..6aa2d4504 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_1.cxx @@ -0,0 +1,189 @@ +// 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/ +// +// File: NMTTools_PaveFiller_1.cxx +// Created: Mon Dec 8 11:47:55 2003 +// Author: Peter KURNEV +// + + +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + + +//======================================================================= +// function: PerformVV +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformVV() +{ + myIsDone=Standard_False; + // + Standard_Integer n1, n2,anIndexIn, aFlag, aWhat, aWith, aNbVVs, aBlockLength; + Standard_Boolean bJustAddInterference; + // + BOPTools_CArray1OfVVInterference& aVVs=myIntrPool->VVInterferences(); + // + // BlockLength correction + aNbVVs=ExpectedPoolLength(); + aBlockLength=aVVs.BlockLength(); + if (aNbVVs > aBlockLength) { + aVVs.SetBlockLength(aNbVVs); + } + // + // V/V BooleanOperations_VertexVertex + myDSIt.Initialize(TopAbs_VERTEX, TopAbs_VERTEX); + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, bJustAddInterference); + // + if (!myIntrPool->IsComputed(n1, n2)) { + anIndexIn=0; + aWhat=n1; + aWith=n2; + SortTypes(aWhat, aWith); + if (!bJustAddInterference) { + const TopoDS_Shape& aS1=myDS->GetShape(aWhat); + const TopoDS_Shape& aS2=myDS->GetShape(aWith); + // + const TopoDS_Vertex& aV1=TopoDS::Vertex(aS1); + const TopoDS_Vertex& aV2=TopoDS::Vertex(aS2); + aFlag=IntTools_Tools::ComputeVV (aV1, aV2); + // + if (!aFlag) { + BOPTools_VVInterference anInterf (aWhat, aWith); + anIndexIn=aVVs.Append(anInterf); + } + } + myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexVertex, anIndexIn); + } + } + myIsDone=Standard_True; +} +//======================================================================= +// function: PerformNewVertices +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformNewVertices() +{ + myIsDone=Standard_False; + // + Standard_Integer i, aNb, anIndex1, anIndex2, aNewShape; + TopoDS_Vertex aNewVertex; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + Standard_Integer aNbChains, j, aNbV, aIdV, aNbL; + TColStd_IndexedMapOfInteger aMapWhole; + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMapChains;//aMCV + TopTools_ListOfShape aLV; + TopTools_IndexedMapOfShape aM; + // + // 1. VV Interferences + BOPTools_CArray1OfVVInterference& VVs=myIntrPool->VVInterferences(); + // + NMTTools_Tools::FindChains(VVs, aMapChains); + // + aNbChains=aMapChains.Extent(); + for (i=1; i<=aNbChains; ++i) { + const TColStd_IndexedMapOfInteger& aChain=aMapChains(i); + // + aM.Clear(); + aLV.Clear(); + aNbV=aChain.Extent(); + for (j=1; j<=aNbV; ++j) { + aIdV=aChain(j); + const TopoDS_Shape& aV=myDS->Shape(aIdV); + if (!aM.Contains(aV)) { + aM.Add(aV); + aLV.Append(aV); + } + } + // + aNbL=aLV.Extent(); + if (aNbL==1){ + aNewShape=aChain(1); + } + else if (aNbL>1) { + // + // Make new Vertex + NMTTools_Tools::MakeNewVertex(aLV, aNewVertex); + // Insert New Vertex in DS; + // aNewShape is # of DS-line, where aNewVertex is kept + myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); + aNewShape=myDS->NumberOfInsertedShapes(); + // + // State of New Vertex is ON + myDS->SetState (aNewShape, BooleanOperations_ON); + } + // + // Insert New Vertex in Interference + aNb=VVs.Extent(); + for (j=1; j<=aNb; ++j) { + BOPTools_VVInterference& VV=VVs(j); + anIndex1=VV.Index1(); + anIndex2=VV.Index2(); + if (aChain.Contains(anIndex1) || aChain.Contains(anIndex2)) { + VV.SetNewShape(aNewShape); + } + } + } + myIsDone=Standard_True; +} + +//======================================================================= +// function: FindSDVertex +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::FindSDVertex(const Standard_Integer nV)const +{ + Standard_Integer i, aNb, anIndex1, anIndex2, aNewShape=0; + + BOPTools_CArray1OfVVInterference& VVs=myIntrPool->VVInterferences(); + aNb=VVs.Extent(); + + for (i=1; i<=aNb; i++) { + const BOPTools_VVInterference& VV=VVs(i); + anIndex1=VV.Index1(); + anIndex2=VV.Index2(); + if (nV==anIndex1 || nV==anIndex2) { + aNewShape=VV.NewShape(); + return aNewShape; + } + } + return aNewShape; +} diff --git a/src/NMTTools/NMTTools_PaveFiller_2.cxx b/src/NMTTools/NMTTools_PaveFiller_2.cxx new file mode 100644 index 000000000..33ea053d8 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_2.cxx @@ -0,0 +1,230 @@ +// 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/ +// +// File: NMTTools_PaveFiller_2.cxx +// Created: Mon Dec 8 12:02:56 2003 +// Author: Peter KURNEV +// + + +#include + +#include + +#include + +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include +// +#include +#include + +//======================================================================= +// function: PrepareEdges +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PrepareEdges() +{ + Standard_Integer i, nV, ii, aNBSuc, ip, aNbShapesObject; + Standard_Real aT; + TopAbs_Orientation anOr; + TopoDS_Edge aE; + TopoDS_Vertex aV; + // + aNbShapesObject=myDS->NumberOfShapesOfTheObject(); + for (i=1; i<=myNbSources; ++i) { + if (myDS->GetShapeType(i)==TopAbs_EDGE) { + aE=TopoDS::Edge(myDS->Shape(i)); + // + if (BRep_Tool::Degenerated(aE)){ + continue; + } + // + BOPTools_PaveSet& aPaveSet=myPavePool(myDS->RefEdge(i)); + // + // A <- + aNBSuc=myDS->NumberOfSuccessors(i); + for (ii=1; ii <=aNBSuc; ii++) { + nV=myDS->GetSuccessor(i, ii); + anOr=myDS->GetOrientation(i, ii); + aV=TopoDS::Vertex(myDS->Shape(nV)); + aV.Orientation(anOr); + aT=BRep_Tool::Parameter(aV, aE); + // + ip=FindSDVertex(nV); + if (ip) { + aV=TopoDS::Vertex(myDS->Shape(ip)); + aV.Orientation(anOr);// XX ? if the edge is closed it'll be amazing result + nV=ip; + } + // + BOPTools_Pave aPave(nV, aT); + aPaveSet.Append (aPave); + } + } + } +} +//======================================================================= +// function: PerformVE +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformVE() +{ + myIsDone=Standard_False; + // + Standard_Boolean bJustAddInterference; + Standard_Integer n1, n2, anIndexIn, aFlag, aWhat, aWith, aNbVEs, aBlockLength, iSDV, nV1; + Standard_Real aT; + TopoDS_Vertex aV1; + TopoDS_Edge aE2; + BOPTools_IndexedMapOfCoupleOfInteger aSnareMap; + BOPTools_CoupleOfInteger aCouple; + // + BOPTools_CArray1OfVEInterference& aVEs=myIntrPool->VEInterferences(); + // + myDSIt.Initialize (TopAbs_VERTEX, TopAbs_EDGE); + // + // BlockLength correction + aNbVEs=ExpectedPoolLength(); + aBlockLength=aVEs.BlockLength(); + if (aNbVEs > aBlockLength) { + aVEs.SetBlockLength(aNbVEs); + } + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, bJustAddInterference); + // + if (! myIntrPool->IsComputed(n1, n2)) { + if (! IsSuccesstorsComputed(n1, n2)) { + anIndexIn=0; + aWhat=n1; // Vertex + aWith=n2; // Edge + SortTypes(aWhat, aWith); + // + if(bJustAddInterference) { + myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); + continue; + } + // Edge + aE2=TopoDS::Edge(myDS->Shape(aWith)); + // + if (BRep_Tool::Degenerated(aE2)){ + continue; + } + // Vertex + nV1=aWhat; + aV1=TopoDS::Vertex(myDS->Shape(aWhat)); + // + iSDV=FindSDVertex(aWhat); + if (iSDV) { + nV1=iSDV; + aV1=TopoDS::Vertex(myDS->Shape(nV1)); + } + // + aFlag=myContext.ComputeVE (aV1, aE2, aT); + // + if (!aFlag) { + // + // Add Interference to the Pool + BOPTools_VEInterference anInterf (aWhat, aWith, aT); + anIndexIn=aVEs.Append(anInterf); + // + // Add Pave to the Edge's myPavePool + aCouple.SetCouple(nV1, aWith); + if (!aSnareMap.Contains(aCouple)){ + aSnareMap.Add(aCouple); + // + BOPTools_Pave aPave(nV1, aT, BooleanOperations_VertexEdge); + aPave.SetInterference(anIndexIn); + BOPTools_PaveSet& aPaveSet= myPavePool(myDS->RefEdge(aWith)); + aPaveSet.Append(aPave); + } + // + // State for the Vertex in DS; + myDS->SetState (aWhat, BooleanOperations_ON); + // Insert Vertex in Interference Object + BOPTools_VEInterference& aVE=aVEs(anIndexIn); + aVE.SetNewShape(aWhat); + } + myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexEdge, anIndexIn); + } + } + } + myIsDone=Standard_True; +} + +/* +// A +// + // cto900/M2 + // Some of Edges can be [Semi] Infinite. Such Edges have no + // vertices on correspondant INF ends. So we must provide + // these vertices formally (to obtain Shrunk Ranges for e.g). + // In reality this vertex(-es) does not belong to the INF Edge. + // It just has reference in the DS. + // PKV Tue Apr 23 10:21:45 2002 + { + Standard_Real aT1, aT2, aTolE; + Standard_Boolean bInf1, bInf2; + gp_Pnt aPx; + TopoDS_Vertex aVx; + BRep_Builder aBB; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + aTolE=BRep_Tool::Tolerance(aE); + Handle(Geom_Curve) aC3D=BRep_Tool::Curve (aE, aT1, aT2); + bInf1=Precision::IsNegativeInfinite(aT1); + bInf2=Precision::IsPositiveInfinite(aT2); + + if (bInf1) { + aC3D->D0(aT1, aPx); + aBB.MakeVertex(aVx, aPx, aTolE); + myDS->InsertShapeAndAncestorsSuccessors(aVx, anASSeq); + nV=myDS->NumberOfInsertedShapes(); + BOPTools_Pave aPave(nV, aT1); + aPaveSet.Append (aPave); + } + + if (bInf2) { + aC3D->D0(aT2, aPx); + aBB.MakeVertex(aVx, aPx, aTolE); + myDS->InsertShapeAndAncestorsSuccessors(aVx, anASSeq); + nV=myDS->NumberOfInsertedShapes(); + BOPTools_Pave aPave(nV, aT2); + aPaveSet.Append (aPave); + } + } +*/ diff --git a/src/NMTTools/NMTTools_PaveFiller_3.cxx b/src/NMTTools/NMTTools_PaveFiller_3.cxx new file mode 100644 index 000000000..989e6357c --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_3.cxx @@ -0,0 +1,107 @@ +// 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/ +// +// File: NMTTools_PaveFiller_3.cxx +// Created: Mon Dec 8 16:06:56 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include +#include + +#include +#include + +#include + +//======================================================================= +// function: PerformVF +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformVF() +{ + myIsDone=Standard_False; + // + Standard_Boolean aJustAddInterference; + Standard_Integer n1, n2, anIndexIn, aFlag, aWhat, aWith, aNbVSs, aBlockLength, iSDV; + Standard_Real aU, aV; + TopoDS_Vertex aV1; + TopoDS_Face aF2; + // + BOPTools_CArray1OfVSInterference& aVSs=myIntrPool->VSInterferences(); + // + // V/E Interferences + myDSIt.Initialize(TopAbs_VERTEX, TopAbs_FACE); + // + // BlockLength correction + aNbVSs=ExpectedPoolLength(); + aBlockLength=aVSs.BlockLength(); + if (aNbVSs > aBlockLength) { + aVSs.SetBlockLength(aNbVSs); + } + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, aJustAddInterference); + // + if (! myIntrPool->IsComputed(n1, n2)) { + if (! IsSuccesstorsComputed(n1, n2)) { + anIndexIn=0; + aWhat=n1; // Vertex + aWith=n2; // Face + SortTypes(aWhat, aWith); + // + iSDV=FindSDVertex(aWhat); + // + if(aJustAddInterference) { + myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexSurface, anIndexIn); + continue; + } + // + aV1=TopoDS::Vertex(myDS->Shape(aWhat)); + if (iSDV) { + aV1=TopoDS::Vertex(myDS->Shape(iSDV)); + } + // + aF2=TopoDS::Face(myDS->Shape(aWith)); + // + aFlag=myContext.ComputeVS (aV1, aF2, aU, aV); + // + if (!aFlag) { + // + // Add Interference to the Pool + BOPTools_VSInterference anInterf (aWhat, aWith, aU, aV); + anIndexIn=aVSs.Append(anInterf); + // + // SetState for Vertex in DS; + myDS->SetState (aWhat, BooleanOperations_ON); + // Insert Vertex in Interference Object + BOPTools_VSInterference& aVS=aVSs(anIndexIn); + aVS.SetNewShape(aWhat); + } + myIntrPool->AddInterference(aWhat, aWith, BooleanOperations_VertexSurface, anIndexIn); + } + } + } + myIsDone=Standard_True; +} diff --git a/src/NMTTools/NMTTools_PaveFiller_4.cxx b/src/NMTTools/NMTTools_PaveFiller_4.cxx new file mode 100644 index 000000000..1db2e5a04 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_4.cxx @@ -0,0 +1,1095 @@ +// 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/ +// +// File: NMTTools_PaveFiller_4.cxx +// Created: Mon Dec 8 17:08:58 2003 +// 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +// +static + void VertexParameters(const IntTools_CommonPrt& aCPart, + Standard_Real& aT1, + Standard_Real& aT2); +static + Standard_Boolean IsOnPave(const Standard_Real& aT1, + const IntTools_Range& aRange, + const Standard_Real& aTolerance); +static + void ProcessBlock(const BOPTools_PaveBlock& aPB, + const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB, + BOPTools_IMapOfPaveBlock& aProcessedBlocks, + BOPTools_IMapOfPaveBlock& aChain); +static + void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB, + NMTTools_ListOfCommonBlock& aLCB); + +//======================================================================= +// function: PerformEE +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformEE() +{ + myIsDone=Standard_False; + // + Standard_Boolean bJustAdd; + Standard_Integer n1, n2, anIndexIn, nE1, nE2, aNbVEs, aBlockLength; + Standard_Integer aTmp, aWhat, aWith, i, aNbCPrts, aDiscretize=30; + Standard_Real aTolE1, aTolE2, aDeflection=0.01; + BOPTools_ListIteratorOfListOfPaveBlock anIt1, anIt2; + TopoDS_Edge aEWhat, aEWith; + TopoDS_Vertex aNewVertex; + BooleanOperations_IndexedDataMapOfShapeInteger aMapVI; + BOPTools_IDMapOfPaveBlockIMapOfPaveBlock aMapCB; + // + BOPTools_CArray1OfEEInterference& aEEs=myIntrPool->EEInterferences(); + // + // BlockLength correction + aNbVEs=ExpectedPoolLength(); + aBlockLength=aEEs.BlockLength(); + if (aNbVEs > aBlockLength) { + aEEs.SetBlockLength(aNbVEs); + } + // + myDSIt.Initialize(TopAbs_EDGE, TopAbs_EDGE); + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, bJustAdd); + anIndexIn = 0; + // + if (myIntrPool->IsComputed(n1, n2)) { + continue; + } + // + nE1=n1; + nE2=n2; + SortTypes(nE1, nE2); + // + if(bJustAdd) { + myIntrPool->AddInterference (nE1, nE2, BooleanOperations_EdgeEdge, anIndexIn); + continue; + } + // + const TopoDS_Edge& aE1=TopoDS::Edge(myDS->Shape(nE1)); + const TopoDS_Edge& aE2=TopoDS::Edge(myDS->Shape(nE2)); + // + if (BRep_Tool::Degenerated(aE1) || BRep_Tool::Degenerated(aE2)){ + continue; + } + // + aTolE1=BRep_Tool::Tolerance(aE1); + aTolE2=BRep_Tool::Tolerance(aE2); + // + BOPTools_ListOfPaveBlock& aLPB1=mySplitShapesPool(myDS->RefEdge(nE1)); + // + for (anIt1.Initialize(aLPB1); anIt1.More(); anIt1.Next()) { + BOPTools_PaveBlock& aPB1=anIt1.Value(); + const IntTools_ShrunkRange& aShrunkRange1=aPB1.ShrunkRange(); + // + const IntTools_Range& aSR1=aShrunkRange1.ShrunkRange(); + const Bnd_Box& aBB1=aShrunkRange1.BndBox(); + // + BOPTools_ListOfPaveBlock& aLPB2=mySplitShapesPool(myDS->RefEdge(nE2)); + // + for (anIt2.Initialize(aLPB2); anIt2.More(); anIt2.Next()) { + BOPTools_PaveBlock& aPB2=anIt2.Value(); + const IntTools_ShrunkRange& aShrunkRange2=aPB2.ShrunkRange(); + + const IntTools_Range& aSR2=aShrunkRange2.ShrunkRange(); + const Bnd_Box& aBB2=aShrunkRange2.BndBox(); + // + if (aBB1.IsOut (aBB2)) { + continue; + } + // + // EE + IntTools_EdgeEdge aEE; + aEE.SetEdge1 (aE1); + aEE.SetEdge2 (aE2); + aEE.SetTolerance1 (aTolE1); + aEE.SetTolerance2 (aTolE2); + aEE.SetDiscretize (aDiscretize); + aEE.SetDeflection (aDeflection); + // + IntTools_Range anewSR1 = aSR1; + IntTools_Range anewSR2 = aSR2; + // + BOPTools_Tools::CorrectRange (aE1, aE2, aSR1, anewSR1); + BOPTools_Tools::CorrectRange (aE2, aE1, aSR2, anewSR2); + // + aEE.SetRange1(anewSR1); + aEE.SetRange2(anewSR2); + + aEE.Perform(); + // + anIndexIn=0; + // + if (aEE.IsDone()) { + // reverse order if it is necessary + aEWhat=aE1; + aEWith=aE2; + aWhat=nE1; + aWith=nE2; + if (aEE.Order()) { + aTmp=aWhat; + aWhat=aWith; + aWith=aTmp; + aEWhat=aE2; + aEWith=aE1; + } + // + const IntTools_SequenceOfCommonPrts& aCPrts=aEE.CommonParts(); + aNbCPrts=aCPrts.Length(); + for (i=1; i<=aNbCPrts; i++) { + const IntTools_CommonPrt& aCPart=aCPrts(i); + const IntTools_SequenceOfRanges& aRanges2=aCPart.Ranges2(); + // + anIndexIn=0; + // + TopAbs_ShapeEnum aType=aCPart.Type(); + switch (aType) { + case TopAbs_VERTEX: { + Standard_Real aT1, aT2, aTol=Precision::PConfusion(); + Standard_Boolean bIsOnPave1, bIsOnPave2; + IntTools_Range aR1, aR2; + // + VertexParameters(aCPart, aT1, aT2); + // + //decide to keep the pave or not + aR1 = (aEE.Order()) ? anewSR2 : anewSR1; + aR2 = (aEE.Order()) ? anewSR1 : anewSR2; + // + bIsOnPave1=IsOnPave(aT1, aR1, aTol); + bIsOnPave2=IsOnPave(aT2, aR2, aTol); + // + if(bIsOnPave1 || bIsOnPave2) { + myIntrPool->AddInterference (aWhat, aWith, BooleanOperations_EdgeEdge, anIndexIn); + continue; + } + // + BOPTools_Tools::MakeNewVertex(aEWhat, aT1, aEWith, aT2, aNewVertex); + // + // Add Interference to the Pool + BOPTools_EEInterference anInterf (aWhat, aWith, aCPart); + // + anIndexIn=aEEs.Append(anInterf); + myIntrPool->AddInterference (aWhat, aWith, BooleanOperations_EdgeEdge, anIndexIn); + // + // Collect + aMapVI.Add(aNewVertex, anIndexIn); + } + break; + + case TopAbs_EDGE: { + Standard_Integer aNbComPrt2; + Standard_Boolean aCoinsideFlag; + // + aNbComPrt2=aRanges2.Length(); + aCoinsideFlag=IsBlocksCoinside(aPB1, aPB2); + // + if (aNbComPrt2>1 || !aCoinsideFlag) { + myIntrPool->AddInterference (aWhat, aWith, BooleanOperations_EdgeEdge, anIndexIn); + break; + } + // + // Fill aMapCB + if (aMapCB.Contains(aPB1)) { + BOPTools_IMapOfPaveBlock& aMapPB=aMapCB.ChangeFromKey(aPB1); + aMapPB.Add(aPB1); + aMapPB.Add(aPB2); + } + else { + BOPTools_IMapOfPaveBlock aMapPB; + aMapPB.Add(aPB1); + aMapPB.Add(aPB2); + aMapCB.Add(aPB1, aMapPB); + } + // + if (aMapCB.Contains(aPB2)) { + BOPTools_IMapOfPaveBlock& aMapPB=aMapCB.ChangeFromKey(aPB2); + aMapPB.Add(aPB1); + aMapPB.Add(aPB2); + } + else { + BOPTools_IMapOfPaveBlock aMapPB; + aMapPB.Add(aPB1); + aMapPB.Add(aPB2); + aMapCB.Add(aPB2, aMapPB); + } + } + break; + default: + break; + } // switch (aType) + } // for (i=1; i<=aNbCPrts; i++) + }// if (aEE.IsDone()) + } // for (; anIt2.More(); anIt2.Next()) + } // for (; anIt1.More(); anIt1.Next()) + }// for (; myDSIt.More(); myDSIt.Next()) + // + EENewVertices (aMapVI); + EECommonBlocks(aMapCB); + // + myIsDone=Standard_True; +} +//======================================================================= +// function:EECommonBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EECommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB) +{ + NMTTools_ListOfCommonBlock aLCB; + // + FindChains(aMapCB, aLCB); + ReplaceCommonBlocks(aLCB); +} +//======================================================================= +// 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)); + // + 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); +} +//======================================================================= +// function: RefinePavePool +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RefinePavePool() +{ + Standard_Integer i, aNbNew; + + for (i=1; i<=myNbSources; i++) { + + if ((myDS->GetShape(i)).ShapeType()==TopAbs_EDGE) { + BOPTools_PaveSet& aPS= myPavePool(myDS->RefEdge(i)); + // + BOPTools_PaveSet& aNewPS= myPavePoolNew(myDS->RefEdge(i)); + BOPTools_ListOfPave& aNewLP=aNewPS.ChangeSet(); + // + aNbNew=aNewLP.Extent(); + if (aNbNew) { + BOPTools_ListIteratorOfListOfPave anIt(aNewLP); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPave=anIt.Value(); + aPS.Append(aPave); + } + // Clear the ListOfPaveBlock + BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(i)); + aLPB.Clear(); + // Prepare the paveBlocks for that egde again + PreparePaveBlocks(i); + } + aNewLP.Clear(); + } + } +} +//======================================================================= +// function: PreparePaveBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PreparePaveBlocks(const TopAbs_ShapeEnum aType1, + const TopAbs_ShapeEnum aType2) +{ + myIsDone=Standard_False; + // + Standard_Boolean Ok1, Ok2, Ok3; + Ok1= (aType1==TopAbs_VERTEX) && (aType2==TopAbs_EDGE) ; + Ok2= (aType1==TopAbs_EDGE) && (aType2==TopAbs_EDGE) ; + Ok3= (aType1==TopAbs_EDGE) && (aType2==TopAbs_FACE) ; + if (!Ok1 && !Ok2 && !Ok3) { + // error: Type mismatch + return; + } + // + Standard_Boolean aFlag = Standard_False; + Standard_Integer n1, n2, nE1, nE2, aNbSplits; + TColStd_MapOfInteger aMap; + // + myDSIt.Initialize(aType1, aType2); + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, aFlag); + nE1=n1; + nE2=n2; + SortTypes(nE1, nE2); + // + if (aType1==TopAbs_EDGE) { + BOPTools_ListOfPaveBlock& aLPB1=mySplitShapesPool(myDS->RefEdge(nE1)); + aNbSplits=aLPB1.Extent(); + if (!aNbSplits) { + if (!aMap.Contains(nE1)) { + aMap.Add(nE1); + PreparePaveBlocks(nE1); + // + if (!myIsDone) { + return; + } + } + } + } + // + if (aType2==TopAbs_EDGE) { + BOPTools_ListOfPaveBlock& aLPB2=mySplitShapesPool(myDS->RefEdge(nE2)); + aNbSplits=aLPB2.Extent(); + if (!aNbSplits) { + if (!aMap.Contains(nE2)) { + aMap.Add(nE2); + PreparePaveBlocks(nE2); + // + if (!myIsDone) { + return; + } + } + } + }// if (aType2==TopAbs_EDGE) + }// for (; myDSIt.More(); myDSIt.Next()) + + myIsDone=Standard_True; +} +//======================================================================= +// function: PreparePaveBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PreparePaveBlocks(const Standard_Integer nE) +{ + myIsDone=Standard_False; + + Standard_Integer nV1, nV2; + + TopoDS_Edge aE; + TopoDS_Vertex aV1, aV2; + + // SplitShapesPool + BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); + // Edge + aE=TopoDS::Edge(myDS->Shape(nE)); + // + if (!BRep_Tool::Degenerated(aE)){ + // + BOPTools_PaveSet& aPS=myPavePool(myDS->RefEdge(nE)); + + BOPTools_PaveBlockIterator aPBIt(nE, aPS); + for (; aPBIt.More(); aPBIt.Next()) { + BOPTools_PaveBlock& aPB=aPBIt.Value(); + + const IntTools_Range& aRange=aPB.Range(); + + const BOPTools_Pave& aPave1=aPB.Pave1(); + nV1=aPave1.Index(); + aV1=TopoDS::Vertex(myDS->GetShape(nV1)); + + const BOPTools_Pave& aPave2=aPB.Pave2(); + nV2=aPave2.Index(); + aV2=TopoDS::Vertex(myDS->GetShape(nV2)); + // + // ShrunkRange + IntTools_ShrunkRange aSR (aE, aV1, aV2, aRange, myContext); + // + Standard_Integer anErrorStatus; + anErrorStatus=aSR.ErrorStatus(); + + char buf[512]; + if (!aSR.IsDone()) { + sprintf (buf, "Can not obtain ShrunkRange for Edge %d\n", nE); + BOPTColStd_Dump::PrintMessage(buf); + sprintf (buf, "Can not obtain ShrunkRange for Edge %d", nE); + throw + BOPTColStd_Failure(buf) ; + } + // + if (anErrorStatus==6) { + sprintf(buf, + "Warning: [PreparePaveBlocks()] Max.Dummy Shrunk Range for Edge %d\n", nE); + BOPTColStd_Dump::PrintMessage(buf); + } + else { + // Check left paves and correct ShrunkRange if it is necessary + CorrectShrunkRanges (0, aPave1, aSR); + CorrectShrunkRanges (1, aPave2, aSR); + } + // + aPB.SetShrunkRange(aSR); + aLPB.Append(aPB); + } //for (; aPBIt1.More(); aPBIt1.Next()) + } + myIsDone=Standard_True; +} +//======================================================================= +// function: CorrectShrunkRanges +// purpose: +//======================================================================= + void NMTTools_PaveFiller::CorrectShrunkRanges(const Standard_Integer aSide, + const BOPTools_Pave& aPave, + IntTools_ShrunkRange& aShrunkRange) +{ + BooleanOperations_KindOfInterference aType; + Standard_Integer anIndexInterf ; + // + aType=aPave.Type(); + if (aType!=BooleanOperations_EdgeEdge) { + return; + } + // + anIndexInterf=aPave.Interference(); + if (anIndexInterf<0) { + // it can be EE interf between E and (e1,e2,..en) -> vertex + // so we can't decide which aEE.CommonPrt() we should take. + return; + } + + BOPTools_CArray1OfEEInterference& aEEs=myIntrPool->EEInterferences(); + const BOPTools_EEInterference& aEE=aEEs(anIndexInterf); + const IntTools_CommonPrt& aCP=aEE.CommonPrt(); + const TopoDS_Edge& aE1=aCP.Edge1(); + const TopoDS_Edge& aE2=aCP.Edge2(); + + const IntTools_Range& aSR=aShrunkRange.ShrunkRange(); + const TopoDS_Edge& aE=aShrunkRange.Edge(); + + IntTools_Range aNewRange; + IntTools_Range aCPRange; + + if (aE1.IsSame(aE)) { + const IntTools_Range& aR1=aCP.Range1(); + aCPRange=aR1; + } + if (aE2.IsSame(aE)) { + const IntTools_SequenceOfRanges& aSeqR=aCP.Ranges2(); + const IntTools_Range& aR2=aSeqR(1); + aCPRange=aR2; + } + // + Standard_Real aCoeff=1.05, tV, tNV; + tV=aPave.Param(); + if (aSide==0) { // Left + if (aCPRange.Last() > aSR.First()) { + tNV=aCPRange.Last(); + tNV=tV+aCoeff*(tNV-tV); + aNewRange.SetFirst(tNV); + aNewRange.SetLast (aSR.Last()); + + if(aNewRange.First() > aNewRange.Last()) { + aShrunkRange.SetShrunkRange(aNewRange); + } + } + } + else { // Right + if (aCPRange.First() < aSR.Last()) { + tNV=aCPRange.First(); + tNV=tV-aCoeff*(tV-tNV); + aNewRange.SetFirst(aSR.First()); + aNewRange.SetLast (tNV); + + if(aNewRange.First() < aNewRange.Last()) { + aShrunkRange.SetShrunkRange(aNewRange); + } + } + } +} +//======================================================================= +// function: IsBlocksCoinside +// purpose: +//======================================================================= + Standard_Boolean + NMTTools_PaveFiller::IsBlocksCoinside(const BOPTools_PaveBlock& aPB1, + const BOPTools_PaveBlock& aPB2) const +{ + Standard_Boolean bRetFlag=Standard_True; + Standard_Real aTolV11, aTolV12, aTolV21, aTolV22; + Standard_Real d1121, d1122, d1222, d1221, aTolSum, aCoeff=1.05; + gp_Pnt aP11, aP12, aP21, aP22; + + const TopoDS_Vertex& aV11=TopoDS::Vertex(myDS->Shape(aPB1.Pave1().Index())); + const TopoDS_Vertex& aV12=TopoDS::Vertex(myDS->Shape(aPB1.Pave2().Index())); + const TopoDS_Vertex& aV21=TopoDS::Vertex(myDS->Shape(aPB2.Pave1().Index())); + const TopoDS_Vertex& aV22=TopoDS::Vertex(myDS->Shape(aPB2.Pave2().Index())); + + aTolV11=BRep_Tool::Tolerance(aV11); + aTolV12=BRep_Tool::Tolerance(aV12); + aTolV21=BRep_Tool::Tolerance(aV21); + aTolV22=BRep_Tool::Tolerance(aV22); + + aP11=BRep_Tool::Pnt(aV11); + aP12=BRep_Tool::Pnt(aV12); + aP21=BRep_Tool::Pnt(aV21); + aP22=BRep_Tool::Pnt(aV22); + + d1121=aP11.Distance(aP21); + aTolSum=aCoeff*(aTolV11+aTolV21); + if (d1121RefEdge(nE)); + aLCBE.Append(aCBx); + } + } + } +} +//======================================================================= +// function: RemoveCommonBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RemoveCommonBlocks(const NMTTools_ListOfCommonBlock& aLCB) +{ + Standard_Integer nE; + NMTTools_ListOfCommonBlock aLCBx; + NMTTools_ListIteratorOfListOfCommonBlock anItCB, anItCBE; + BOPTools_ListIteratorOfListOfPaveBlock anItLPB; + // + anItCB.Initialize(aLCB); + for (; anItCB.More(); anItCB.Next()) { + const NMTTools_CommonBlock& aCB=anItCB.Value(); + const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks(); + // + // Remove aCB from each edge + anItLPB.Initialize(aLPB); + for (; anItLPB.More(); anItLPB.Next()) { + const BOPTools_PaveBlock& aPB=anItLPB.Value(); + nE=aPB.OriginalEdge(); + // + NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE)); + anItCBE.Initialize(aLCBE); + for (; anItCBE.More(); anItCBE.Next()) { + const NMTTools_CommonBlock& aCBE=anItCBE.Value(); + if (aCBE.IsEqual(aCB)) { + aLCBE.Remove(anItCBE); + break; + } + } + } + } +} +//======================================================================= +// function: SplitCommonBlock +// purpose: +//======================================================================= + void NMTTools_PaveFiller::SplitCommonBlock(const NMTTools_CommonBlock& aCB, + NMTTools_ListOfCommonBlock& aLCBx) +{ + Standard_Integer i, j, k, nE, aNbE, aNbSPBx, aNbPB; + BOPTools_SequenceOfPaveBlock aSPBx; + BOPTools_ListIteratorOfListOfPaveBlock anItLPB; + BOPTools_ListIteratorOfListOfPave anIt; + + BOPTools_PaveBlockIterator anPBIt; + // + const BOPTools_ListOfPaveBlock& aLPB=aCB.PaveBlocks(); + aNbE=aLPB.Extent(); + // + // 1. Whether we realy need to split the common block ? + anItLPB.Initialize(aLPB); + for (; anItLPB.More(); anItLPB.Next()) { + const BOPTools_PaveBlock& aPB=anItLPB.Value(); + nE=aPB.OriginalEdge(); + BOPTools_PaveSet& aPSE=myPavePoolNew(myDS->RefEdge(nE)); + aPSE.SortSet(); + // + BOPTools_PaveSet aPSx; + // + const BOPTools_ListOfPave& aLPE=aPSE.Set(); + anIt.Initialize(aLPE); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPx=anIt.Value(); + if (aPB.IsInBlock(aPx)) { + aPSx.Append(aPx); + } + } + aNbPB=aPSx.Set().Extent(); + break; + } + // + if (!aNbPB) { + // we need not split it + aLCBx.Append(aCB); + return; + } + // + // 2. Get sequence of pave Blocks containing all new pave blocks + // for each edges's source pave Block + anItLPB.Initialize(aLPB); + for (; anItLPB.More(); anItLPB.Next()) { + const BOPTools_PaveBlock& aPB=anItLPB.Value(); + const BOPTools_Pave& aPave1=aPB.Pave1(); + const BOPTools_Pave& aPave2=aPB.Pave2(); + nE=aPB.OriginalEdge(); + // + BOPTools_PaveSet aPSx; + // + // the set aPsx will contain bounadry paves aPave1, aPave2 and + // all paves of the edge nE that are inside block aPB + aPSx.Append(aPave1); + aPSx.Append(aPave2); + // + BOPTools_PaveSet& aPSE=myPavePoolNew(myDS->RefEdge(nE)); + aPSE.SortSet(); + // + const BOPTools_ListOfPave& aLPE=aPSE.Set(); + anIt.Initialize(aLPE); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPx=anIt.Value(); + if (aPB.IsInBlock(aPx)) { + aPSx.Append(aPx); + } + } + // + // Form pave blocks from aPSx and collect them in aSPBx + anPBIt.Initialize(nE, aPSx); + for (; anPBIt.More(); anPBIt.Next()) { + const BOPTools_PaveBlock& aPBx=anPBIt.Value(); + aSPBx.Append(aPBx); + } + } + // + // 3. Do new common blocks + // + const TColStd_ListOfInteger& aLF=aCB.Faces(); + aNbSPBx=aSPBx.Length(); + aNbPB=aNbSPBx/aNbE; + // + for (i=1; i<=aNbPB; ++i) { + NMTTools_CommonBlock aCBx; + // + aCBx.AddFaces(aLF); + // + for (j=1; j<=aNbE; ++j) { + k=i+(j-1)*aNbPB; + const BOPTools_PaveBlock& aPB=aSPBx(k); + aCBx.AddPaveBlock(aPB); + } + aLCBx.Append(aCBx); + } +} + +//======================================================================= +// function: VertexParameters +// purpose: +//======================================================================= +void VertexParameters(const IntTools_CommonPrt& aCPart, + Standard_Real& aT1, + Standard_Real& aT2) +{ + const IntTools_Range& aR1=aCPart.Range1(); + aT1=0.5*(aR1.First()+aR1.Last()); + // + if((aCPart.VertexParameter1() >= aR1.First()) && + (aCPart.VertexParameter1() <= aR1.Last())) { + aT1 = aCPart.VertexParameter1(); + } + // + const IntTools_SequenceOfRanges& aRanges2=aCPart.Ranges2(); + const IntTools_Range& aR2=aRanges2(1); + aT2=0.5*(aR2.First()+aR2.Last()); + // + if((aCPart.VertexParameter2() >= aR2.First()) && + (aCPart.VertexParameter2() <= aR2.Last())) { + aT2 = aCPart.VertexParameter2(); + } +} +//======================================================================= +// function: KeepPave +// purpose: +//======================================================================= +Standard_Boolean IsOnPave(const Standard_Real& aT1, + const IntTools_Range& aRange, + const Standard_Real& aTolerance) +{ + Standard_Boolean firstisonpave1, firstisonpave2, bIsOnPave; + // + firstisonpave1 = (Abs(aRange.First() - aT1) < aTolerance); + firstisonpave2 = (Abs(aRange.Last() - aT1) < aTolerance); + bIsOnPave=(firstisonpave1 || firstisonpave2); + return bIsOnPave; +} + +//======================================================================= +// function:FindChains +// purpose: +//======================================================================= +void FindChains(const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB, + NMTTools_ListOfCommonBlock& aLCB) +{ + Standard_Integer i, j, aNbCB, aNbPB; + BOPTools_IMapOfPaveBlock aProcessedBlocks, aChain; + // + aNbCB=aMapCB.Extent(); + for (i=1; i<=aNbCB; ++i) { + const BOPTools_PaveBlock& aPB=aMapCB.FindKey(i); + if (aProcessedBlocks.Contains(aPB)) { + continue; + } + // + aProcessedBlocks.Add(aPB); + aChain.Add(aPB); + // + const BOPTools_IMapOfPaveBlock& aMapPB=aMapCB(i); + aNbPB=aMapPB.Extent(); + for (j=1; j<=aNbPB; ++j) { + const BOPTools_PaveBlock& aPBx=aMapPB(j); + ProcessBlock(aPBx, aMapCB, aProcessedBlocks, aChain); + } + // + NMTTools_CommonBlock aCB; + // + aNbPB=aChain.Extent(); + for (j=1; j<=aNbPB; ++j) { + const BOPTools_PaveBlock& aPBx=aChain(j); + aCB.AddPaveBlock(aPBx); + } + aLCB.Append(aCB); + aChain.Clear(); + } +} +//======================================================================= +// function:ProcessBlock +// purpose: +//======================================================================= +void ProcessBlock(const BOPTools_PaveBlock& aPB, + const BOPTools_IDMapOfPaveBlockIMapOfPaveBlock& aMapCB, + BOPTools_IMapOfPaveBlock& aProcessedBlocks, + BOPTools_IMapOfPaveBlock& aChain) +{ + Standard_Integer j, aNbPB; + // + if (aProcessedBlocks.Contains(aPB)) { + return; + } + aProcessedBlocks.Add(aPB); + aChain.Add(aPB); + // + const BOPTools_IMapOfPaveBlock& aMapPB=aMapCB.FindFromKey(aPB); + aNbPB=aMapPB.Extent(); + for (j=1; j<=aNbPB; ++j) { + const BOPTools_PaveBlock& aPBx=aMapPB(j); + ProcessBlock(aPBx, aMapCB, aProcessedBlocks, aChain); + } +} diff --git a/src/NMTTools/NMTTools_PaveFiller_5.cxx b/src/NMTTools/NMTTools_PaveFiller_5.cxx new file mode 100644 index 000000000..fae995ed9 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_5.cxx @@ -0,0 +1,624 @@ +// 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/ +// +// File: NMTTools_PaveFiller_5.cxx +// Created: Mon Dec 15 11:28:33 2003 +// 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +static + void VertexParameter(const IntTools_CommonPrt& aCPart, + Standard_Real& aT); +static + Standard_Boolean IsOnPave(const Standard_Real& aTR, + const IntTools_Range& aCPRange, + const Standard_Real& aTolerance); + +//======================================================================= +// function: PerformEF +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformEF() +{ + myIsDone=Standard_False; + + Standard_Integer n1, n2, anIndexIn=0, nE, nF, aNbEFs, aBlockLength; + Standard_Boolean bJustAdd; + Standard_Real aTolE, aTolF, aDeflection=0.01; + Standard_Integer aDiscretize=35; + BooleanOperations_IndexedDataMapOfShapeInteger aMapVI; + BOPTools_IDMapOfPaveBlockIMapOfInteger aMapCB; + BOPTools_IMapOfPaveBlock aIMPBx; + + // + BOPTools_CArray1OfESInterference& aEFs=myIntrPool->ESInterferences(); + // + myDSIt.Initialize(TopAbs_EDGE, TopAbs_FACE); + // + // BlockLength correction + aNbEFs=ExpectedPoolLength(); + aBlockLength=aEFs.BlockLength(); + if (aNbEFs > aBlockLength) { + aEFs.SetBlockLength(aNbEFs); + } + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, bJustAdd); + anIndexIn = 0; + // + if (myIntrPool->IsComputed(n1, n2)) { + continue; + } + // + nE=n1; + nF=n2; + SortTypes(nE, nF); + // + // all Common Blocks for face nF + //XXX + NMTTools_ListOfCommonBlock aLCBF; + CommonBlocksFace(nF, aLCBF); + NMTTools_CommonBlockAPI aCBAPIF(aLCBF); + //XXX + if(bJustAdd) { + myIntrPool->AddInterference (nE, nF, BooleanOperations_EdgeSurface, anIndexIn); + continue; + } + // Edge + const TopoDS_Edge& aE=TopoDS::Edge(myDS->GetShape(nE)); + if (BRep_Tool::Degenerated(aE)){ + continue; + } + aTolE=BRep_Tool::Tolerance(aE); + // Face + const TopoDS_Face& aF=TopoDS::Face(myDS->GetShape(nF)); + aTolF=BRep_Tool::Tolerance(aF); + const Bnd_Box& aBBF=myDS->GetBoundingBox(nF); + // + // Process each PaveBlock on edge nE + BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); + // + BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB); + for (; anIt.More(); anIt.Next()) { + BOPTools_PaveBlock& aPB=anIt.Value(); + //XXX + if (aCBAPIF.IsCommonBlock(aPB)) { + continue; + } + //XXX + const IntTools_ShrunkRange& aShrunkRange=aPB.ShrunkRange(); + const IntTools_Range& aSR =aShrunkRange.ShrunkRange(); + const Bnd_Box& aBBE=aShrunkRange.BndBox(); + // + if (aBBF.IsOut (aBBE)) { + continue; + } + // + // EF + IntTools_EdgeFace aEF; + aEF.SetEdge (aE); + aEF.SetFace (aF); + aEF.SetTolE (aTolE); + aEF.SetTolF (aTolF); + aEF.SetDiscretize (aDiscretize); + aEF.SetDeflection (aDeflection); + // + aEF.SetContext((IntTools_PContext)&myContext); + // + IntTools_Range anewSR = aSR; + // + // Correction of the Shrunk Range + BOPTools_Tools::CorrectRange(aE, aF, aSR, anewSR); + aEF.SetRange (anewSR); + // + aEF.Perform(); + // + if (aEF.IsDone()) { + const IntTools_SequenceOfCommonPrts& aCPrts=aEF.CommonParts(); + Standard_Integer i, aNbCPrts; + aNbCPrts=aCPrts.Length(); + for (i=1; i<=aNbCPrts; i++) { + // + anIndexIn=0; + // + const IntTools_CommonPrt& aCPart=aCPrts(i); + TopAbs_ShapeEnum aType=aCPart.Type(); + switch (aType) { + + case TopAbs_VERTEX: { + Standard_Boolean bIsOnPave1, bIsOnPave2; + Standard_Integer nVF; + Standard_Real aT, aTolToDecide; + TopoDS_Vertex aNewVertex; + // + const IntTools_Range& aR=aCPart.Range1(); + // + // New Vertex + VertexParameter(aCPart, aT); + BOPTools_Tools::MakeNewVertex(aE, aT, aF, aNewVertex); + // + //decide to add pave or not + aTolToDecide=5.e-8; + // + bIsOnPave1=IsOnPave(anewSR.First(), aR, aTolToDecide); + bIsOnPave2=IsOnPave(anewSR.Last() , aR, aTolToDecide); + // + if (!bIsOnPave1 && !bIsOnPave2) { + nVF=CheckFacePaves(aNewVertex, nF); + if (!nVF) { + // really new vertex + // Add Interference to the Pool + BOPTools_ESInterference anInterf (nE, nF, aCPart); + anIndexIn=aEFs.Append(anInterf); + anInterf.SetNewShape(0); + // + aMapVI.Add(aNewVertex, anIndexIn); + aIMPBx.Add(aPB); + // + }// if (!nVF) + }// if (!bIsOnPave1 && !bIsOnPave2) + myIntrPool->AddInterference (nE, nF, BooleanOperations_EdgeSurface, anIndexIn); + }// case TopAbs_VERTEX: + break; + // + case TopAbs_EDGE: { + Standard_Boolean aCoinsideFlag; + // + aCoinsideFlag=BOPTools_Tools::IsBlockInOnFace(aPB, aF, myContext); + if (!aCoinsideFlag) { + myIntrPool->AddInterference (nE, nF, BooleanOperations_EdgeSurface, anIndexIn); + break; + } + // + // Fill aMapCB + if (aMapCB.Contains(aPB)) { + TColStd_IndexedMapOfInteger& aMapF=aMapCB.ChangeFromKey(aPB); + aMapF.Add(nF); + } + else { + TColStd_IndexedMapOfInteger aMapF; + aMapF.Add(nF); + aMapCB.Add(aPB, aMapF); + } + //modified by NIZNHY-PKV Fri Jan 23 14:13:08 2004 f + aIMPBx.Add(aPB); + //modified by NIZNHY-PKV Fri Jan 23 14:13:10 2004 t + }// case TopAbs_EDGE: + break; + + default: + break; + } // switch (aType) + } // for (i=1; i<=aNbCPrts; i++) + } //if (aEF.IsDone()) + } // for (; anIt.More(); anIt.Next()) + }// for (; myDSIt.More(); myDSIt.Next()) + // + // Treat New vertices + EFNewVertices(aMapVI); + // + // Add draft Common Blocks of EF type + EFCommonBlocks(aMapCB); + // + // Collect all CB we suspected to split by new vertices + NMTTools_ListOfCommonBlock aLCBx; + { + Standard_Integer i, aNbPBx, nEx; + BOPTools_IMapOfPaveBlock aMx; + // + aNbPBx=aIMPBx.Extent(); + for (i=1; i<=aNbPBx; ++i) { + const BOPTools_PaveBlock& aPBx=aIMPBx(i); + nEx=aPBx.OriginalEdge(); + NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nEx)); + if (aLCB.Extent()) { + NMTTools_CommonBlockAPI aCBAPIx(aLCB); + if (aCBAPIx.IsCommonBlock(aPBx)) { + NMTTools_CommonBlock& aCBx=aCBAPIx.CommonBlock(aPBx); + const BOPTools_PaveBlock& aPB1=aCBx.PaveBlock1(); + if (!aMx.Contains(aPB1)){ + aMx.Add(aPB1); + aLCBx.Append(aCBx); + } + } + } + } + } + // + // Split the common blocks above + if (aLCBx.Extent()) { + ReplaceCommonBlocks(aLCBx); + } + // + myIsDone=Standard_True; +} +//======================================================================= +// function:EFCommonBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EFCommonBlocks(const BOPTools_IDMapOfPaveBlockIMapOfInteger& aMapCB) +{ + Standard_Integer i, aNbPB, nE, j, aNbF, nF; + // + aNbPB=aMapCB.Extent(); + // + for (i=1; i<=aNbPB; ++i) { + const BOPTools_PaveBlock& aPB=aMapCB.FindKey(i); + const TColStd_IndexedMapOfInteger& aMapF=aMapCB.FindFromIndex(i); + aNbF=aMapF.Extent(); + // + nE=aPB.OriginalEdge(); + // + NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE)); + // + NMTTools_CommonBlockAPI aCBAPI(aLCB); + if (aCBAPI.IsCommonBlock(aPB)) { + NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); + for (j=1; j<=aNbF; ++j) { + nF=aMapF(j); + aCB.AddFace(nF); + } + } + else { + NMTTools_CommonBlock aCB; + // + aCB.AddPaveBlock(aPB); + for (j=1; j<=aNbF; ++j) { + nF=aMapF(j); + aCB.AddFace(nF); + } + aLCB.Append(aCB); + } + } +} +//======================================================================= +// function:EFNewVertices +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EFNewVertices (const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) +{ + Standard_Integer i, j, aNb, aNewShape, aFlag, iX, aNbVV, aNbSimple; + Standard_Integer aWhat, aWith, nE, nF, nV, aNbIEF, aNbEdges; + Standard_Real aT; + TopoDS_Compound aCompound; + TopoDS_Vertex aNewVertex; + BRep_Builder aBB; + BOPTools_Pave aPave; + NMTTools_IndexedDataMapOfIndexedMapOfInteger aMNVE, aMNVIEF; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + TopTools_IndexedMapOfShape aMNVComplex, aMNVSimple; + // + BOPTools_CArray1OfESInterference& aEFs=myIntrPool->ESInterferences(); + // + aNb=aMapVI.Extent(); + // + if (!aNb) { // no new vertices, no new problems + return; + } + // + // 0. + if (aNb==1) { + aNewVertex=TopoDS::Vertex(aMapVI.FindKey(1)); + EFNewVertices(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)); + EFNewVertices(aV, aMapVI); + } + // + // 3. Fill Maps : NewVertex-edges (aMNVE) + // NewVertex-interferences (aMNVIEE) + aNb=aVVInterfs.Extent(); + for (i=1; i<=aNb; ++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 (!aMNVIEF.Contains(aNewShape)) { + TColStd_IndexedMapOfInteger aMx; + aMNVIEF.Add(aNewShape, aMx); + } + // + TColStd_IndexedMapOfInteger& aME=aMNVE.ChangeFromKey(aNewShape); + TColStd_IndexedMapOfInteger& aMIEF=aMNVIEF.ChangeFromKey(aNewShape); + // + aVV.Indices(aWhat, aWith); + //aWhat + const TopoDS_Shape& aV1=tDS.Shape(aWhat); + iX=aMapVI.FindFromKey(aV1); + const BOPTools_ESInterference& aEF1=aEFs(iX); + aEF1.Indices(nE, nF); + SortTypes(nE, nF); + aME.Add(nE); + aMIEF.Add(iX); + //aWith + const TopoDS_Shape& aV2=tDS.Shape(aWith); + iX=aMapVI.FindFromKey(aV2); + const BOPTools_ESInterference& aEF2=aEFs(iX); + aEF2.Indices(nE, nF); + SortTypes(nE, nF); + aME.Add(nE); + aMIEF.Add(iX); + } + // 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 EF interferences + const TColStd_IndexedMapOfInteger& aMIEF=aMNVIEF.FindFromKey(nV); + aNbIEF=aMIEF.Extent(); + for (j=1; j<=aNbIEF; ++j) { + iX=aMIEF(j); + BOPTools_ESInterference& aEF=aEFs(iX); + aEF.SetNewShape(aNewShape); + } + // + // Update Paves on all 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)); + // + aFlag=myContext.ComputeVE (aNewVertex, aE, aT); + // + if (!aFlag) { + aPave.SetInterference(-1); + aPave.SetType (BooleanOperations_EdgeSurface); + aPave.SetIndex(aNewShape); + aPave.SetParam(aT); + // + BOPTools_PaveSet& aPaveSet=myPavePoolNew(myDS->RefEdge(nE)); + aPaveSet.Append(aPave); + } + } + } +} +//======================================================================= +// function:EFNewVertices +// purpose: +//======================================================================= + void NMTTools_PaveFiller::EFNewVertices (const TopoDS_Vertex& aNewVertex, + const BooleanOperations_IndexedDataMapOfShapeInteger& aMapVI) +{ + Standard_Integer i, aNewShape, nE, nF; + Standard_Real aT; + BOPTools_Pave aPave; + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + BOPTools_CArray1OfESInterference& aEFs=myIntrPool->ESInterferences(); + // + // Insert New Vertex in DS; + myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); + aNewShape=myDS->NumberOfInsertedShapes(); + myDS->SetState (aNewShape, BooleanOperations_ON); + // Insert New Vertex in EFInterference + i=aMapVI.FindFromKey(aNewVertex); + BOPTools_ESInterference& aEFInterf= aEFs(i); + aEFInterf.SetNewShape(aNewShape); + // Extract interference info + aEFInterf.Indices(nE, nF); + SortTypes(nE, nF); + const IntTools_CommonPrt& aCPart=aEFInterf.CommonPrt(); + VertexParameter(aCPart, aT); + // + // Pave for edge nE + aPave.SetInterference(i); + aPave.SetType (BooleanOperations_EdgeSurface); + aPave.SetIndex(aNewShape); + aPave.SetParam(aT); + // Append the Pave to the myPavePoolNew + BOPTools_PaveSet& aPaveSet=myPavePoolNew(myDS->RefEdge(nE)); + aPaveSet.Append(aPave); + // +} +//======================================================================= +// function: CheckFacePaves +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::CheckFacePaves (const TopoDS_Vertex& aNewVertex, + const Standard_Integer nF) +{ + Standard_Integer nEF, nVF, iFlag, i, aNbV; + BOPTools_ListIteratorOfListOfPave anIt; + TColStd_IndexedMapOfInteger aMVF; + // + BooleanOperations_OnceExplorer aExp(*myDS); + // + aExp.Init(nF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nEF=aExp.Current(); + BOPTools_PaveSet& aPaveSet=myPavePool(myDS->RefEdge(nEF)); + const BOPTools_ListOfPave& aLP=aPaveSet.Set(); + anIt.Initialize(aLP); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPave=anIt.Value(); + nVF=aPave.Index(); + aMVF.Add(nVF); + } + } + // + aNbV=aMVF.Extent(); + for (i=1; i<=aNbV; ++i) { + nVF=aMVF(i); + const TopoDS_Vertex& aVF=TopoDS::Vertex(myDS->Shape(nVF)); + iFlag=IntTools_Tools::ComputeVV(aNewVertex, aVF); + if (!iFlag) { + return nVF; + } + } + return 0; +} + +// +//======================================================================= +// function: VertexParameter +// purpose: +//======================================================================= +void VertexParameter(const IntTools_CommonPrt& aCPart, + Standard_Real& aT) +{ + const IntTools_Range& aR=aCPart.Range1(); + aT=0.5*(aR.First()+aR.Last()); + // + if((aCPart.VertexParameter1() >= aR.First()) && + (aCPart.VertexParameter1() <= aR.Last())) { + aT = aCPart.VertexParameter1(); + } +} +//======================================================================= +// function: IsOnPave +// purpose: +//======================================================================= +Standard_Boolean IsOnPave(const Standard_Real& aTR, + const IntTools_Range& aCPRange, + const Standard_Real& aTolerance) +{ + Standard_Boolean bIsOnPave; + Standard_Real aT1, aT2, dT1, dT2; + // + aT1=aCPRange.First(); + aT2=aCPRange.Last(); + bIsOnPave=(aTR>=aT1 && aTR<=aT1); + if (bIsOnPave) { + return bIsOnPave; + } + dT1=Abs(aTR-aT1); + dT2=Abs(aTR-aT2); + bIsOnPave=(dT1<=aTolerance || dT2<=aTolerance); + return bIsOnPave; +} diff --git a/src/NMTTools/NMTTools_PaveFiller_6.cxx b/src/NMTTools/NMTTools_PaveFiller_6.cxx new file mode 100644 index 000000000..e9bae0c1a --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_6.cxx @@ -0,0 +1,1220 @@ +// 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/ +// +// File: NMTTools_PaveFiller_6.cxx +// Created: Fri Dec 19 10:27:31 2003 +// 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 +#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 IsPairFound(const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_InterferencePool* myIntrPool, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWhat, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWith); + +static + void FMapWhat(const Standard_Integer nF, + BOPTools_InterferencePool* myIntrPool, + TColStd_IndexedMapOfInteger& aMapWhat); +static + void FMapWith(const Standard_Integer nF, + BOPTools_InterferencePool* myIntrPool, + TColStd_IndexedMapOfInteger& aMapWith); +static + Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, + const TColStd_IndexedMapOfInteger& aMapWith); + + +//======================================================================= +// function: PerformFF +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PerformFF() +{ + myIsDone=Standard_False; + // + Standard_Boolean bIsFound, bJustAdd, bIsComputed; + Standard_Integer n1, n2, anIndexIn, nF1, nF2, aBlockLength, aNbFFs; + Standard_Boolean bToApproxC3d, bToApproxC2dOnS1, bToApproxC2dOnS2, bIsDone; + Standard_Integer aNbCurves, aNbPoints; + Standard_Real anApproxTol, aTolR3D, aTolR2D; + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMapWhat, aMapWith; + IntTools_SequenceOfPntOn2Faces aPnts; + IntTools_SequenceOfCurves aCvs; + BooleanOperations_KindOfInterference aTypeFF=BooleanOperations_SurfaceSurface; + // + BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + // + // F/F Interferences [BooleanOperations_SurfaceSurface] + myDSIt.Initialize(TopAbs_FACE, TopAbs_FACE); + // + // BlockLength correction + aNbFFs=ExpectedPoolLength(); + aBlockLength=aFFs.BlockLength(); + if (aNbFFs > aBlockLength) { + aFFs.SetBlockLength(aNbFFs); + } + // + for (; myDSIt.More(); myDSIt.Next()) { + myDSIt.Current(n1, n2, bJustAdd); + // + bIsComputed=myIntrPool->IsComputed(n1, n2); + if (bIsComputed) { + continue; + } + // + nF1 = n2; + nF2 = n1; + if(n1 < n2) { + nF1 = n1; + nF2 = n2; + } + anIndexIn=0; + aPnts.Clear(); + aCvs.Clear(); + // + bIsFound=IsPairFound(nF1, nF2, myIntrPool, aMapWhat, aMapWith); + // + if (bJustAdd) { + if (!bIsFound) { + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + } + else{ + BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); + anIndexIn=aFFs.Append(anInterf); + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + } + continue; + } + // + const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + // + // FF + bToApproxC3d = mySectionAttribute.Approximation(); + bToApproxC2dOnS1 = mySectionAttribute.PCurveOnS1(); + bToApproxC2dOnS2 = mySectionAttribute.PCurveOnS2(); + // + anApproxTol=1.e-7; + // + IntTools_FaceFace aFF; + // + aFF.SetParameters (bToApproxC3d, bToApproxC2dOnS1, + bToApproxC2dOnS2, anApproxTol); + // + aFF.Perform(aF1, aF2); + // + bIsDone=aFF.IsDone(); + // + if (!bIsDone) { + if (!bIsFound) { + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + } + else { + BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); + anIndexIn=aFFs.Append(anInterf); + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + } + continue; + } + // + aTolR3D=aFF.TolReached3d(); + aTolR2D=aFF.TolReached2d(); + if (aTolR3D < 1.e-7){ + aTolR3D=1.e-7; + } + // + aFF.PrepareLines3D(); + // + const IntTools_SequenceOfCurves& aCvsX=aFF.Lines(); + const IntTools_SequenceOfPntOn2Faces& aPntsX=aFF.Points(); + // + aNbCurves=aCvsX.Length(); + aNbPoints=aPntsX.Length(); + // + if (!aNbCurves && !aNbPoints) { + BOPTools_SSInterference anInterf (nF1, nF2, 1.e-07, 1.e-07, aCvs, aPnts); + anIndexIn=aFFs.Append(anInterf); + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + continue; + } + // + { + BOPTools_SSInterference anInterf (nF1, nF2, aTolR3D, aTolR2D, aCvsX, aPntsX); + anIndexIn=aFFs.Append(anInterf); + myIntrPool->AddInterference (nF1, nF2, aTypeFF, anIndexIn); + } + // + }// for (; myDSIt.More(); myDSIt.Next()) + // + myIsDone=Standard_True; +} +//======================================================================= +// function: MakeBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::MakeBlocks() +{ + myIsDone=Standard_False; + // + Standard_Boolean bIsExistingPaveBlock, bIsValidIn2D; + Standard_Integer i, aNbFFs, nF1, nF2, aBid=0; + Standard_Integer nV1, nV2, j, aNbCurves; + Standard_Real aTolR3D, aTol2D, aT1, aT2, aTolPPC=Precision::PConfusion(); + NMTTools_IndexedDataMapOfShapePaveBlock aMEPB; + BooleanOperations_IndexedDataMapOfShapeInteger aMapEI; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + // + // 1. Produce Section Edges from intersection curves + // between each pair of faces + // + aNbFFs=aFFs.Extent(); + for (i=1; i<=aNbFFs; ++i) { + BOPTools_SSInterference& aFFi=aFFs(i); + // + // Faces + aFFi.Indices(nF1, nF2); + const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + // + BOPTools_ListOfPaveBlock aLPB, aLPBC; + // + //modified by NIZNHY-PKV Fri Mar 11 15:43:02 2005 f + { + Standard_Integer nFj1, nFj2, nE; + TColStd_IndexedMapOfInteger aMFence; + BOPTools_ListOfPaveBlock aLPBCx; + // + for (j=1; j<=aNbFFs; ++j) { + BOPTools_SSInterference& aFFj=aFFs(j); + aFFj.Indices(nFj1, nFj2); + // + if ((nF1==nFj1 && nFj2!=nF2) || + (nF1==nFj2 && nFj1!=nF2) || + (nF2==nFj1 && nFj2!=nF1) || + (nF2==nFj2 && nFj1!=nF1)) { + RealSplitsInFace (aBid, nFj1, nFj2, aLPBCx); + RealSplitsInFace (aBid, nFj2, nFj1, aLPBCx); + RealSplitsOnFace (aBid, nFj1, nFj2, aLPBCx); + } + } + // + anIt.Initialize(aLPBCx); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBCx=anIt.Value(); + // + nE=aPBCx.Edge(); + if (!aMFence.Contains(nE)) { + aMFence.Add(nE); + aLPBC.Append(aPBCx); + } + } + } + // + //modified by NIZNHY-PKV Fri Apr 1 09:49:57 2005t + // + RealSplitsInFace (aBid, nF1, nF2, aLPB); + RealSplitsInFace (aBid, nF2, nF1, aLPB); + RealSplitsOnFace (aBid, nF1, nF2, aLPB); + // + anIt.Initialize(aLPB); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aFFi.AppendBlock(aPB); + } + // + BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); + aNbCurves=aSCvs.Length(); + if (!aNbCurves) { + continue; + } + // + aTolR3D=aFFi.TolR3D(); + aTol2D=(aTolR3D < 1.e-3) ? 1.e-3 : aTolR3D; + // + BOPTools_PaveSet aPSF; + // + //modified by NIZNHY-PKV Fri Apr 1 10:53:09 2005f + PrepareSetForFace (nF1, nF2, aLPBC, aPSF); + //PrepareSetForFace (nF1, nF2, aPSF); + //modified by NIZNHY-PKV Thu Mar 31 16:16:47 2005t + // + // Put Paves On Curves + for (j=1; j<=aNbCurves; ++j) { + BOPTools_Curve& aBC=aSCvs(j); + // DEBUG + const IntTools_Curve& aC=aBC.Curve(); + Handle (Geom_Curve) aC3D= aC.Curve(); + // + PutPaveOnCurve (aPSF, aTolR3D, aBC); + } + // + // Put bounding paves on curves + for (j=1; j<=aNbCurves; ++j) { + BOPTools_Curve& aBC=aSCvs(j); + PutBoundPaveOnCurve (aBC, aFFi); + } + // + // Pave Blocks on Curves + for (j=1; j<=aNbCurves; ++j) { + BOPTools_Curve& aBC=aSCvs(j); + const IntTools_Curve& aIC= aBC.Curve(); + BOPTools_PaveSet& aPaveSet=aBC.Set(); + // + BOPTools_PaveBlockIterator aPBIter(0, aPaveSet); + for (; aPBIter.More(); aPBIter.Next()) { + BOPTools_PaveBlock& aPBNew=aPBIter.Value(); + aPBNew.SetCurve(aIC); + aPBNew.SetFace1(nF1); + aPBNew.SetFace2(nF2); + // + nV1=aPBNew.Pave1().Index(); + nV2=aPBNew.Pave2().Index(); + aT1=aPBNew.Pave1().Param(); + aT2=aPBNew.Pave2().Param(); + // ??? + if((nV1==nV2) && (Abs(aT2 - aT1) < aTolPPC)) { + continue;// mkk ft + } + // + //modified by NIZNHY-PKV Fri Apr 1 09:56:11 2005f + // 1 + const BOPTools_ListOfPaveBlock& aLPBFF=aFFi.PaveBlocks(); + bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBFF, aTolR3D); + //bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aFFi); + if (bIsExistingPaveBlock) { + continue; + } + // 2 + bIsExistingPaveBlock=IsExistingPaveBlock(aPBNew, aLPBC, aTolR3D); + if (bIsExistingPaveBlock) { + continue; + } + //modified by NIZNHY-PKV Fri Apr 1 09:56:14 2005t + // Checking of validity in 2D + // + bIsValidIn2D=myContext.IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTol2D); + if (!bIsValidIn2D) { + continue; + } + // + //aBC.AppendNewBlock(aPBNew); + // + // Make Section Edge + TopoDS_Edge aES; + // + const TopoDS_Vertex& aV1=TopoDS::Vertex(myDS->Shape(nV1)); + const TopoDS_Vertex& aV2=TopoDS::Vertex(myDS->Shape(nV2)); + // + BOPTools_Tools::MakeSectEdge (aIC, aV1, aT1, aV2, aT2, aES); + // + { + Standard_Real aTolR2D; + // + aTolR2D=aFFi.TolR2D(); + Handle(Geom2d_Curve) aC2D1=aIC.FirstCurve2d(); + Handle(Geom2d_Curve) aC2D2=aIC.SecondCurve2d(); + // + NMTTools_Tools::MakePCurve(aES, aF1, aC2D1, aTolR2D); + NMTTools_Tools::MakePCurve(aES, aF2, aC2D2, aTolR2D); + } + // + aMEPB.Add(aES, aPBNew); + aMapEI.Add(aES, i); + } + } // end of for (j=1; j<=aNbCurves; ++j) + }// for (i=1; i<=aNbFFs; ++i) + //============================================================= + // + // II. Post treatment + // + // Input data: aMEPB, aMapEI + // Result : section edges in myDS + // + Standard_Integer aNbSE; + // + aNbSE=aMEPB.Extent(); + if (!aNbSE) { + // there is nothing to do here + return; + } + // + BRep_Builder aBB; + TopoDS_Compound aCompound; + // + // 1. Make compound from SE + aBB.MakeCompound(aCompound); + for (i=1; i<=aNbSE; ++i) { + const TopoDS_Shape& aSE=aMEPB.FindKey(i); + aBB.Add(aCompound, aSE); + } + // + // + // 2. Intersect SE using auxiliary Filler + NMTDS_ShapesDataStructure tDS; + // + tDS.SetCompositeShape(aCompound); + tDS.Init(); + // + BOPTools_InterferencePool tIP(tDS); + NMTTools_PaveFiller tPF(tIP); + // + // 2.1.VV + tPF.Init(); + tPF.PerformVV(); + tPF.PerformNewVertices(); + // + // 2.2.VE + tPF.myPavePool.Resize (tPF.myNbEdges); + tPF.PrepareEdges(); + tPF.PerformVE(); + // + // 2.3.VF + tPF.PerformVF(); + // + // 2.4.EE + tPF.myCommonBlockPool.Resize (tPF.myNbEdges); + tPF.mySplitShapesPool.Resize (tPF.myNbEdges); + tPF.myPavePoolNew .Resize (tPF.myNbEdges); + + tPF.PreparePaveBlocks(TopAbs_VERTEX, TopAbs_EDGE); + tPF.PreparePaveBlocks(TopAbs_EDGE, TopAbs_EDGE); + // + tPF.PerformEE(); + // + tPF.RefinePavePool (); + // + tPF.myPavePoolNew.Destroy(); + // + tPF.MakeSplitEdges(); + tPF.UpdateCommonBlocks(); + // + // 3. Treatment of the result of intersection + // + Standard_Integer aNbOld, aNbLines, aNbPB, mV1, mV2, nE, mE, iFF; + TopAbs_ShapeEnum aType; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTColStd_IndexedDataMapOfIntegerInteger aMNewOld; + // + const BOPTools_SplitShapesPool& aSSP=tPF.mySplitShapesPool; + const NMTTools_CommonBlockPool& aCBP=tPF.myCommonBlockPool; + // + aNbLines=tDS.NumberOfInsertedShapes(); + aNbOld=tDS.NumberOfShapesOfTheObject(); + // + // 3.1 Links between indices in tDS and DS (kept in aMNewOld) + // + // 3.1.1.Old vertices [ links ] + for (i=1; i<=aNbOld; ++i) { + const TopoDS_Shape& aV=tDS.Shape(i); + aType=aV.ShapeType(); + if (aType!=TopAbs_VERTEX) { + continue; + } + // + for (j=1; j<=aNbSE; ++j) { + const BOPTools_PaveBlock& aPBSE=aMEPB(j); + nV1=aPBSE.Pave1().Index(); + const TopoDS_Shape& aV1=myDS->Shape(nV1); + if (aV1.IsSame(aV)) { + aMNewOld.Add(i, nV1); + break; + } + nV2=aPBSE.Pave2().Index(); + const TopoDS_Shape& aV2=myDS->Shape(nV2); + if (aV2.IsSame(aV)) { + aMNewOld.Add(i, nV2); + break; + } + } + } + // + // 3.1.2. New vertices [ links ] + i=tDS.NumberOfSourceShapes()+1; + for (; i<=aNbLines; ++i) { + const TopoDS_Shape& aV=tDS.Shape(i); + aType=aV.ShapeType(); + if (aType!=TopAbs_VERTEX) { + continue; + } + // + // Insert new vertex in myDS + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + myDS->InsertShapeAndAncestorsSuccessors(aV, anASSeq); + nV1=myDS->NumberOfInsertedShapes(); + // link + aMNewOld.Add(i, nV1); + } + // + // 3.2. Treatment of section edges (SE) + for (i=1; i<=aNbOld; ++i) { + const TopoDS_Shape& aE=tDS.Shape(i); + aType=aE.ShapeType(); + if (aType!=TopAbs_EDGE) { + continue; + } + // + // block of section edge that we already have for this SE + BOPTools_PaveBlock& aPBSE=aMEPB.ChangeFromKey(aE); + // + // Corresponding FF-interference + iFF=aMapEI.FindFromKey(aE); + BOPTools_SSInterference& aFFi=aFFs(iFF); + BOPTools_SequenceOfCurves& aSCvs=aFFi.Curves(); + // + BOPTools_Curve& aBC=aSCvs(1); + // + const BOPTools_ListOfPaveBlock& aLPB=aSSP(tDS.RefEdge(i)); + aNbPB=aLPB.Extent(); + // + if (!aNbPB) { + // no pave blocks -> use aPBSE and whole edge aE + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + nV1=aPBSE.Pave1().Index(); + const TopoDS_Shape& aV1=myDS->Shape(nV1); + nV2=aPBSE.Pave2().Index(); + const TopoDS_Shape& aV2=myDS->Shape(nV2); + // + anASSeq.SetNewSuccessor(nV1); + anASSeq.SetNewOrientation(aV1.Orientation()); + anASSeq.SetNewSuccessor(nV2); + anASSeq.SetNewOrientation(aV2.Orientation()); + // + myDS->InsertShapeAndAncestorsSuccessors(aE, anASSeq); + nE=myDS->NumberOfInsertedShapes(); + // + aPBSE.SetEdge(nE); + aBC.AppendNewBlock(aPBSE); + // + continue; + } + // + nF1=aPBSE.Face1(); + nF2=aPBSE.Face2(); + const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + // + const NMTTools_ListOfCommonBlock& aLCB=aCBP(tDS.RefEdge(i)); + NMTTools_CommonBlockAPI aCBAPI(aLCB); + // + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + BOPTools_PaveBlock aPB=aIt.Value(); + // + if (aCBAPI.IsCommonBlock(aPB)) { + // it can be Common Block + Standard_Real aTolEx; + Handle(Geom2d_Curve) aC2D1, aC2D2; + TopoDS_Face aF1FWD, aF2FWD; + // + NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); + const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); + // + aPB=aCB.PaveBlock1(); + mE=aPB.Edge(); // index of edge in tDS + const TopoDS_Edge& aEx=TopoDS::Edge(tDS.Shape(mE)); + aTolEx=BRep_Tool::Tolerance(aEx); + // + // Commented out by EAP in the frame of PAL9151 + // +// Standard_Boolean bHasPCOnF, bFound; +// Standard_Integer nF, k, nEOrx, nF1x, nF2x; +// Standard_Real aTolEx, aT1x, aT2x; +// BOPTools_ListIteratorOfListOfPaveBlock aItPBx; + // +// for (k=0; k<2; ++k) { +// nF=(!k) ? nF1 : nF2; +// const TopoDS_Face& aF=TopoDS::Face(myDS->Shape(nF)); +// // +// bHasPCOnF=BOPTools_Tools2D::HasCurveOnSurface(aEx, aF); +// if (bHasPCOnF) { +// continue; +// } +// // +// bFound=Standard_False; +// aItPBx.Initialize(aLPBx); +// for (; aItPBx.More(); aItPBx.Next()) { +// BOPTools_PaveBlock& aPBx=aIt.Value(); +// nEOrx=aPBx.OriginalEdge(); +// const TopoDS_Shape& aEOrx=tDS.Shape(nEOrx); +// BOPTools_PaveBlock& aPBSEx=aMEPB.ChangeFromKey(aEOrx); +// aT1x=aPBSEx.Pave1().Param(); +// aT2x=aPBSEx.Pave2().Param(); +// const IntTools_Curve& aICx=aPBSEx.Curve(); +// // +// nF1x=aPBSEx.Face1(); +// nF2x=aPBSEx.Face2(); +// // +// if (nF1x==nF) { +// Handle(Geom2d_Curve) aC2D1x=aICx.FirstCurve2d(); +// Handle(Geom2d_TrimmedCurve)aC2D1xT =new Geom2d_TrimmedCurve(aC2D1x, aT1x, aT2x); +// aBB.UpdateEdge(aEx, aC2D1xT, aF, aTolEx); +// bFound=!bFound; +// break; +// } +// // +// if (nF2x==nF) { +// Handle(Geom2d_Curve) aC2D2x=aICx.SecondCurve2d(); +// Handle(Geom2d_TrimmedCurve)aC2D2xT =new Geom2d_TrimmedCurve(aC2D2x, aT1x, aT2x); +// aBB.UpdateEdge(aEx, aC2D2xT, aF, aTolEx); +// bFound=!bFound; +// break; +// } +// } +// if (bFound){ +// BRepLib::SameParameter(aEx, aTolEx, Standard_True); +// } +// } + // + // The code till the if block end is restored from V2_2_2 revision + // + aF1FWD=aF1; + aF1FWD.Orientation(TopAbs_FORWARD); + NMTTools_Tools::MakePCurve(aEx, aF1FWD, aC2D1, aTolEx); + // + aF2FWD=aF2; + aF2FWD.Orientation(TopAbs_FORWARD); + NMTTools_Tools::MakePCurve(aEx, aF2FWD, aC2D2, aTolEx); + } //if (aCBAPI.IsCommonBlock(aPB)) + // + // new SE + mE=aPB.Edge(); // index of edge in tDS + const TopoDS_Shape& aSp=tDS.Shape(mE); + // + const BOPTools_Pave& aPave1=aPB.Pave1(); + aT1=aPave1.Param(); + mV1=aPave1.Index(); // index in tDS + nV1=aMNewOld.FindFromKey(mV1); // index in myDS + const TopoDS_Shape& aV1=myDS->Shape(nV1); + // + const BOPTools_Pave& aPave2=aPB.Pave2(); + aT2=aPave2.Param(); + mV2=aPave2.Index(); + nV2=aMNewOld.FindFromKey(mV2); + const TopoDS_Shape& aV2=myDS->Shape(nV2); + // + if (!aMNewOld.Contains(mE)) { + // add new SE to the myDS + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + // + anASSeq.SetNewSuccessor(nV1); + anASSeq.SetNewOrientation(aV1.Orientation()); + + anASSeq.SetNewSuccessor(nV2); + anASSeq.SetNewOrientation(aV2.Orientation()); + + myDS->InsertShapeAndAncestorsSuccessors(aSp, anASSeq); + nE=myDS->NumberOfInsertedShapes(); + // + aMNewOld.Add(mE, nE); + } + else { + nE=aMNewOld.FindFromKey(mE); + } + // Form PaveBlock; + BOPTools_PaveBlock aPBx; + BOPTools_Pave aP1, aP2; + // + aPBx.SetFace1(nF1); + aPBx.SetFace1(nF2); + // + aP1.SetIndex(nV1); + aP1.SetParam(aT1); + // + aP2.SetIndex(nV2); + aP2.SetParam(aT2); + // + aPBx.SetPave1(aP1); + aPBx.SetPave2(aP2); + // + aPBx.SetEdge(nE); + // + aBC.AppendNewBlock(aPBx); + }// for (; aIt.More(); aIt.Next()) + }// for (i=1; i<=aNbOld; ++i) + // + myIsDone=Standard_True; +} +//======================================================================= +// function: MakePCurves +// purpose: +//======================================================================= + void NMTTools_PaveFiller::MakePCurves() +{ + Standard_Integer i, aNb, nF1, nF2, nE; + TopoDS_Face aF1FWD, aF2FWD; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + // + aNb=aFFs.Extent(); + for (i=1; i<=aNb; i++) { + BOPTools_SSInterference& aFF=aFFs(i); + aFF.Indices(nF1, nF2); + // + const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); + // + aF1FWD=aF1; + aF1FWD.Orientation(TopAbs_FORWARD); + aF2FWD=aF2; + aF2FWD.Orientation(TopAbs_FORWARD); + // + // In, On parts processing + const BOPTools_ListOfPaveBlock& aLPBInOn=aFF.PaveBlocks(); + // + anIt.Initialize(aLPBInOn); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + nE=aPB.Edge(); + const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); + + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); + } + } +} +//modified by NIZNHY-PKV Fri Apr 1 09:36:06 2005f +//======================================================================= +// function: IsExistingPaveBlock +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, + const BOPTools_ListOfPaveBlock& aLPBR, + const Standard_Real aTolR3D) +{ + Standard_Boolean bFlag; + Standard_Integer nVNew1, nVNew2, nV1, nV2, iC; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + bFlag=Standard_False; + nVNew1=aPBNew.Pave1().Index(); + nVNew2=aPBNew.Pave2().Index(); + // + anIt.Initialize(aLPBR); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBR=anIt.Value(); + nV1=aPBR.Pave1().Index(); + nV2=aPBR.Pave2().Index(); + if (nVNew1==nV1 || nVNew1==nV2 || nVNew2==nV1 || nVNew2==nV2) { + // + iC=CheckIntermediatePoint(aPBNew, aPBR, aTolR3D); + if (!iC) { + return !bFlag; + } + } + } + return bFlag; +} +//modified by NIZNHY-PKV Fri Apr 1 09:36:06 2005t +//======================================================================= +// function: CheckIntermediatePoint +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::CheckIntermediatePoint(const BOPTools_PaveBlock& aPB, + const BOPTools_PaveBlock& aPBR, + const Standard_Real aTolC) + +{ + Standard_Real aT11, aT12, aTM, aTmp; + Standard_Integer iVM, nE2; + gp_Pnt aPM; + BRep_Builder aBB; + TopoDS_Vertex aVM; + // + // Vertex + const BOPTools_Pave& aPave11=aPB.Pave1(); + aT11=aPave11.Param(); + // + const BOPTools_Pave& aPave12=aPB.Pave2(); + aT12=aPave12.Param(); + // + aTM=IntTools_Tools::IntermediatePoint (aT11, aT12); + // + const IntTools_Curve& aIC=aPB.Curve(); + aIC.D0(aTM, aPM); + // + aBB.MakeVertex (aVM, aPM, aTolC); + // + //Edge + nE2=aPBR.Edge(); + const TopoDS_Edge& aE2=TopoDS::Edge(myDS->GetShape(nE2)); + // VE + iVM=myContext.ComputeVE(aVM, aE2, aTmp); + // + return iVM; +} +//======================================================================= +// function: PutBoundPaveOnCurve +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PutBoundPaveOnCurve(BOPTools_Curve& aBC, + BOPTools_SSInterference& aFFi) +{ + Standard_Boolean bHasBounds, bVF; + Standard_Integer nF1, nF2; + Standard_Real aT1, aT2, aTolR3D; + gp_Pnt aP1, aP2; + // + const IntTools_Curve& aIC=aBC.Curve(); + bHasBounds=aIC.HasBounds (); + if (!bHasBounds){ + return; + } + // + // Bounds + aIC.Bounds (aT1, aT2, aP1, aP2); + // + // Faces + aFFi.Indices(nF1, nF2); + aTolR3D=aFFi.TolR3D(); + // + const TopoDS_Face& aF1=TopoDS::Face(myDS->GetShape(nF1)); + const TopoDS_Face& aF2=TopoDS::Face(myDS->GetShape(nF2)); + // + bVF=myContext.IsValidPointForFaces (aP1, aF1, aF2, aTolR3D); + if (bVF) { + PutBoundPaveOnCurve (aP1, aT1, aBC, aFFi); + } + // + bVF=myContext.IsValidPointForFaces (aP2, aF1, aF2, aTolR3D); + if (bVF) { + PutBoundPaveOnCurve (aP2, aT2, aBC, aFFi); + } +} +//======================================================================= +// function: PutBoundPaveOnCurve +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PutBoundPaveOnCurve(const gp_Pnt& aP, + const Standard_Real aT, + BOPTools_Curve& aBC, + BOPTools_SSInterference& aFFi) +{ + Standard_Boolean bFound1, bFound2; + Standard_Integer nV; + Standard_Real aTolV=aFFi.TolR3D(); + + BOPTools_Pave aPave1, aPave2, aPave; + BOPTools_PaveSet& aCPS=aBC.Set(); + BOPTools_PaveSet& aFFiPS=aFFi.NewPaveSet(); + const IntTools_Curve& aIC=aBC.Curve(); + // + bFound1=FindPave(aP, aTolV, aCPS , aPave1); + bFound2=FindPave(aP, aTolV, aFFiPS, aPave2); + // + if (!bFound1 && !bFound2) { + TopoDS_Vertex aNewVertex; + BOPTools_Tools::MakeNewVertex(aP, aTolV, aNewVertex); + // + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + myDS->InsertShapeAndAncestorsSuccessors(aNewVertex, anASSeq); + nV=myDS->NumberOfInsertedShapes(); + aPave.SetIndex(nV); + aPave.SetParam(aT); + + aCPS.Append(aPave); + aFFiPS.Append(aPave); + // + // Append Techno Vertex to the Curve + TColStd_ListOfInteger& aTVs=aBC.TechnoVertices(); + aTVs.Append(nV); + } + + if (bFound1 && !bFound2) { + nV=aPave1.Index(); + aPave.SetIndex(nV); + aPave.SetParam(aT); + aFFiPS.Append(aPave); + // + const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + BOPTools_Tools::UpdateVertex (aIC, aT, aV); + } + + if (!bFound1 && bFound2) { + nV=aPave2.Index(); + aPave.SetIndex(nV); + aPave.SetParam(aT); + aCPS.Append(aPave); + // + const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + BOPTools_Tools::UpdateVertex (aIC, aT, aV); + } +} +//======================================================================= +// function: FindPave +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::FindPave(const gp_Pnt& aP, + const Standard_Real aTolPV, + const BOPTools_PaveSet& aPS, + BOPTools_Pave& aPave) +{ + Standard_Integer nV; + Standard_Boolean bIsVertex=Standard_False; + + const BOPTools_ListOfPave& aLP=aPS.Set(); + BOPTools_ListIteratorOfListOfPave anIt(aLP); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPC=anIt.Value(); + nV=aPC.Index(); + const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + bIsVertex=IntTools_Tools::IsVertex (aP, aTolPV, aV); + if (bIsVertex) { + aPave=aPC; + return bIsVertex; + } + } + return bIsVertex; +} +//======================================================================= +// function: PrepareSetForFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1, + const Standard_Integer nF2, + const BOPTools_ListOfPaveBlock& aLPBC, + BOPTools_PaveSet& aPSF) +{ + Standard_Integer nV1, nV2; + TColStd_MapOfInteger aMap; + BOPTools_ListOfPaveBlock aLPB1, aLPB2, aLPBS; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + RealSplitsFace(nF1, aLPB1); + anIt.Initialize(aLPB1); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aLPBS.Append(aPB); + } + // + RealSplitsFace(nF2, aLPB2); + anIt.Initialize(aLPB2); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aLPBS.Append(aPB); + } + // + anIt.Initialize(aLPBC); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + aLPBS.Append(aPB); + } + // + anIt.Initialize(aLPBS); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + const BOPTools_Pave& aPave1=aPB.Pave1(); + nV1=aPave1.Index(); + if (!aMap.Contains(nV1)) { + aMap.Add(nV1); + aPSF.Append(aPave1); + } + const BOPTools_Pave& aPave2=aPB.Pave2(); + nV2=aPave2.Index(); + if (!aMap.Contains(nV2)) { + aMap.Add(nV2); + aPSF.Append(aPave2); + } + } +} +//======================================================================= +// function: PutPaveOnCurve +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PutPaveOnCurve(const BOPTools_PaveSet& aPaveSet, + const Standard_Real aTolR3D, + BOPTools_Curve& aBC) +{ + Standard_Integer nV; + Standard_Boolean bIsVertexOnLine; + Standard_Real aT; + BOPTools_ListIteratorOfListOfPave anIt; + Bnd_Box aBBC; + GeomAdaptor_Curve aGAC; + // + const IntTools_Curve& aC=aBC.Curve(); + Handle (Geom_Curve) aC3D= aC.Curve(); + aGAC.Load(aC3D); + BndLib_Add3dCurve::Add(aGAC, aTolR3D, aBBC); + // + const BOPTools_ListOfPave& aLP=aPaveSet.Set(); + anIt.Initialize(aLP); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Pave& aPave=anIt.Value(); + // + nV=aPave.Index(); + const TopoDS_Vertex& aV=TopoDS::Vertex(myDS->Shape(nV)); + // + Bnd_Box aBBV; + BRepBndLib::Add(aV, aBBV); + if (aBBC.IsOut(aBBV)){ + continue; + } + // + bIsVertexOnLine=myContext.IsVertexOnLine(aV, aC, aTolR3D, aT); + // + if (bIsVertexOnLine) { + BOPTools_Pave aPaveNew(nV, aT, BooleanOperations_SurfaceSurface); + BOPTools_PaveSet& aPS=aBC.Set(); + aPS.Append(aPaveNew); + //<-B + BOPTools_Tools::UpdateVertex (aC, aT, aV); + } + } +} +///////////// +//======================================================================= +// function: IsPairFound +// purpose: +//======================================================================= +Standard_Boolean IsPairFound(const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_InterferencePool* myIntrPool, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWhat, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapWith) +{ + Standard_Boolean bIsFound; + // + if (!aMapWhat.Contains(nF1)) { + TColStd_IndexedMapOfInteger aMWhat; + FMapWhat(nF1, myIntrPool, aMWhat); + aMapWhat.Add(nF1, aMWhat); + } + // + if (!aMapWith.Contains(nF2)) { + TColStd_IndexedMapOfInteger aMWith; + FMapWith(nF2, myIntrPool, aMWith); + aMapWith.Add(nF2, aMWith); + } + // + const TColStd_IndexedMapOfInteger& aMWht=aMapWhat.FindFromKey(nF1); + const TColStd_IndexedMapOfInteger& aMWit=aMapWith.FindFromKey(nF2); + // + bIsFound=IsFound(aMWht, aMWit); + // + return bIsFound; +} +//======================================================================= +// function: FMapWhat +// purpose: +//======================================================================= +void FMapWhat(const Standard_Integer nF, + BOPTools_InterferencePool* myIntrPool, + TColStd_IndexedMapOfInteger& aMapWhat) + +{ + Standard_Integer nE, nV; + + + + BooleanOperations_ShapesDataStructure* myDS=myIntrPool->DS(); + BooleanOperations_OnceExplorer aExp(*myDS); + // + // What + aMapWhat.Add(nF); + aExp.Init(nF, TopAbs_VERTEX); + for (; aExp.More(); aExp.Next()) { + nV=aExp.Current(); + aMapWhat.Add(nV); + } + // + aExp.Init(nF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE=aExp.Current(); + aMapWhat.Add(nE); + } +} +//======================================================================= +// function: FMapWith +// purpose: +//======================================================================= +void FMapWith(const Standard_Integer nF, + BOPTools_InterferencePool* myIntrPool, + TColStd_IndexedMapOfInteger& aMapWith) +{ + TColStd_IndexedMapOfInteger aMapWhat; + + FMapWhat(nF, myIntrPool, aMapWhat); + // + // With + Standard_Integer i, aNb, anIndex, aWhat, aWith; + BOPTools_ListIteratorOfListOfInterference anIt; + + const BOPTools_CArray1OfInterferenceLine& anArrIL= myIntrPool->InterferenceTable(); + + aNb=aMapWhat.Extent(); + for (i=1; i<=aNb; i++) { + aWhat=aMapWhat(i); + + const BOPTools_InterferenceLine& aWithLine=anArrIL(aWhat); + + const BOPTools_ListOfInterference& aLI=aWithLine.List(); + anIt.Initialize(aLI); + for (; anIt.More(); anIt.Next()) { + const BOPTools_Interference& anIntf=anIt.Value(); + anIndex=anIntf.Index(); + if (anIndex) { + aWith=anIntf.With(); + aMapWith.Add(aWith); + } + } + } +} +//======================================================================= +// function: IsFound +// purpose: +//======================================================================= +Standard_Boolean IsFound(const TColStd_IndexedMapOfInteger& aMapWhat, + const TColStd_IndexedMapOfInteger& aMapWith) +{ + Standard_Boolean bFlag=Standard_False; + Standard_Integer i, aNb, aWhat; + + aNb=aMapWhat.Extent(); + for (i=1; i<=aNb; i++) { + aWhat=aMapWhat(i); + if (aMapWith.Contains(aWhat)) { + return !bFlag; + } + } + return bFlag; +} +/* +//======================================================================= +// function: PrepareSetForFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PrepareSetForFace(const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_PaveSet& aPSF) +{ + Standard_Integer nV1, nV2; + TColStd_MapOfInteger aMap; + BOPTools_ListOfPaveBlock aLPB1, aLPB2; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + RealSplitsFace(nF1, aLPB1); + RealSplitsFace(nF2, aLPB2); + // + aLPB1.Append(aLPB2); + // + anIt.Initialize(aLPB1); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + const BOPTools_Pave& aPave1=aPB.Pave1(); + nV1=aPave1.Index(); + if (!aMap.Contains(nV1)) { + aMap.Add(nV1); + aPSF.Append(aPave1); + } + const BOPTools_Pave& aPave2=aPB.Pave2(); + nV2=aPave2.Index(); + if (!aMap.Contains(nV2)) { + aMap.Add(nV2); + aPSF.Append(aPave2); + } + } +} +*/ +/* +//======================================================================= +// function: IsExistingPaveBlock +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::IsExistingPaveBlock(const BOPTools_PaveBlock& aPBNew, + const BOPTools_SSInterference& aFFi) +{ + Standard_Boolean bFlag; + Standard_Real aTolR3D; + // + aTolR3D=aFFi.TolR3D(); + const BOPTools_ListOfPaveBlock& aLPBR=aFFi.PaveBlocks(); + // + bFlag=IsExistingPaveBlock(aPBNew, aLPBR, aTolR3D); + // + return bFlag; +} +*/ diff --git a/src/NMTTools/NMTTools_PaveFiller_7.cxx b/src/NMTTools/NMTTools_PaveFiller_7.cxx new file mode 100644 index 000000000..ebc09a959 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_7.cxx @@ -0,0 +1,280 @@ +// 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/ +// +// File: NMTTools_PaveFiller_7.cxx +// Created: Thu Dec 18 15:14:55 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +// function: MakeSplitEdges +// purpose: +//======================================================================= + void NMTTools_PaveFiller::MakeSplitEdges() +{ + myIsDone=Standard_False; + // + Standard_Boolean bIsNewVertex1, bIsNewVertex2; + Standard_Integer i, aNbS, nV1, nV2, aNbPaveBlocks, aNewShapeIndex; + Standard_Real t1, t2; + TopAbs_Orientation anOri; + TopoDS_Edge aE, aESplit; + TopoDS_Vertex aV1, aV2; + // + aNbS=myDS->NumberOfShapesOfTheObject(); + for (i=1; i<=aNbS; ++i) { + if (myDS->GetShapeType(i) != TopAbs_EDGE) + continue; + // + // Original Edge + aE=TopoDS::Edge(myDS->Shape(i)); + if (BRep_Tool::Degenerated(aE)){ + continue; + } + // + anOri=aE.Orientation(); + aE.Orientation(TopAbs_FORWARD); + // + // Making Split Edges + // + // Split Set for the Original Edge i + BOPTools_ListOfPaveBlock& aSplitEdges=mySplitShapesPool(myDS->RefEdge(i)); + BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aSplitEdges); + // + aNbPaveBlocks=aSplitEdges.Extent(); + + for (; aPBIt.More(); aPBIt.Next()) { + BOPTools_PaveBlock& aPB=aPBIt.Value(); + // aPave1 + const BOPTools_Pave& aPave1=aPB.Pave1(); + nV1=aPave1.Index(); + t1=aPave1.Param(); + aV1=TopoDS::Vertex(myDS->GetShape(nV1)); + aV1.Orientation(TopAbs_FORWARD); + // aPave2 + const BOPTools_Pave& aPave2=aPB.Pave2(); + nV2=aPave2.Index(); + t2=aPave2.Param(); + aV2=TopoDS::Vertex(myDS->GetShape(nV2)); + aV2.Orientation(TopAbs_REVERSED); + //xx + if (aNbPaveBlocks==1) { + bIsNewVertex1=myDS->IsNewShape (nV1); + bIsNewVertex2=myDS->IsNewShape (nV2); + if (!bIsNewVertex1 && !bIsNewVertex2) { + aPB.SetEdge(i); + continue; + } + } + //xx + BOPTools_Tools::MakeSplitEdge(aE, aV1, t1, aV2, t2, aESplit); + // + // Add Split Part of the Original Edge to the DS + BooleanOperations_AncestorsSeqAndSuccessorsSeq anASSeq; + + anASSeq.SetNewSuccessor(nV1); + anASSeq.SetNewOrientation(aV1.Orientation()); + + anASSeq.SetNewSuccessor(nV2); + anASSeq.SetNewOrientation(aV2.Orientation()); + // + if (anOri==TopAbs_INTERNAL) { + anASSeq.SetNewAncestor(i); + aESplit.Orientation(anOri); + } + // + myDS->InsertShapeAndAncestorsSuccessors(aESplit, anASSeq); + aNewShapeIndex=myDS->NumberOfInsertedShapes(); + myDS->SetState(aNewShapeIndex, BooleanOperations_UNKNOWN); + // + // Fill Split Set for the Original Edge + aPB.SetEdge(aNewShapeIndex); + // + } + } + myIsDone=Standard_True; +} +//======================================================================= +// function: UpdateCommonBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::UpdateCommonBlocks() +{ + myIsDone=Standard_False; + // + Standard_Integer nE, aNbS, nSp, nEx, nSpx; + NMTTools_ListIteratorOfListOfCommonBlock aCBIt; + BOPTools_ListIteratorOfListOfPaveBlock aPBIt; + // + aNbS=myDS->NumberOfShapesOfTheObject(); + // + for (nE=1; nE<=aNbS; ++nE) { + if (myDS->GetShapeType(nE)!=TopAbs_EDGE){ + continue; + } + if (BRep_Tool::Degenerated(TopoDS::Edge(myDS->Shape(nE)))){ + continue; + } + // + NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE)); + BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool (myDS->RefEdge(nE)); + // + aCBIt.Initialize(aLCB); + for (; aCBIt.More(); aCBIt.Next()) { + NMTTools_CommonBlock& aCB=aCBIt.Value(); + BOPTools_PaveBlock& aPB=aCB.PaveBlock1(nE); + nSp=SplitIndex(aPB); + aPB.SetEdge(nSp); + // + const BOPTools_ListOfPaveBlock& aCBLPB=aCB.PaveBlocks(); + aPBIt.Initialize(aCBLPB); + for (; aPBIt.More(); aPBIt.Next()) { + BOPTools_PaveBlock& aPBx=aPBIt.Value(); + nEx=aPBx.OriginalEdge(); + if (nEx==nE) { + continue; + } + // + nSpx=SplitIndex(aPBx); + aPBx.SetEdge(nSpx); + } + // + } + } +} +//======================================================================= +// function: SplitIndex +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitIndex(const BOPTools_PaveBlock& aPBx)const +{ + Standard_Integer anOriginalEdge, anEdgeIndex=0; + + anOriginalEdge=aPBx.OriginalEdge(); + + const BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(anOriginalEdge)); + // + BOPTools_ListIteratorOfListOfPaveBlock anIt(aLPB); + for (; anIt.More(); anIt.Next()) { + BOPTools_PaveBlock& aPB=anIt.Value(); + if (aPB.IsEqual(aPBx)) { + anEdgeIndex=aPB.Edge(); + return anEdgeIndex; + } + } + return anEdgeIndex; +} +//======================================================================= +// function: UpdatePaveBlocks +// purpose: +//======================================================================= + void NMTTools_PaveFiller::UpdatePaveBlocks() +{ + myIsDone=Standard_False; + // + + Standard_Integer i, aNbFFs, nF1, nF2, aNbF, nF, iRankF, nE, nV1, nV2, aNbPB; + Standard_Real aT1, aT2; + TColStd_IndexedMapOfInteger aMF, aME; + TopExp_Explorer aExp; + TopoDS_Vertex aV1, aV2; + TopoDS_Edge aE; + BOPTools_Pave aPave1, aPave2; + BOPTools_PaveBlock aPB; + // + BOPTools_CArray1OfSSInterference& aFFs=myIntrPool->SSInterferences(); + // + aNbFFs=aFFs.Extent(); + for (i=1; i<=aNbFFs; ++i) { + BOPTools_SSInterference& aFFi=aFFs(i); + aFFi.Indices(nF1, nF2); + aMF.Add(nF1); + aMF.Add(nF2); + } + // + aNbF=aMF.Extent(); + for(i=1; i<=aNbF; ++i) { + nF=aMF(i); + iRankF=myDS->Rank(nF); + const TopoDS_Shape& aF=myDS->Shape(nF); + aExp.Init(aF, TopAbs_EDGE); + for(; aExp.More(); aExp.Next()) { + aE=TopoDS::Edge(aExp.Current()); + // + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + nE=myDS->ShapeIndex(aE, iRankF); + // + if (aME.Contains(nE)) { + continue; + } + aME.Add(nE); + // + BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); + aNbPB=aLPB.Extent(); + if (aNbPB) { + continue; + } + TopExp::Vertices(aE, aV1, aV2); + // + nV1=myDS->ShapeIndex(aV1, iRankF); + aT1=BRep_Tool::Parameter(aV1, aE); + aPave1.SetIndex(nV1); + aPave1.SetParam(aT1); + // + nV2=myDS->ShapeIndex(aV2, iRankF); + aT2=BRep_Tool::Parameter(aV2, aE); + aPave2.SetIndex(nV2); + aPave2.SetParam(aT2); + // + aPB.SetEdge(nE); + aPB.SetOriginalEdge(nE); + aPB.SetPave1(aPave1); + aPB.SetPave2(aPave2); + // + aLPB.Append(aPB); + } + } +} diff --git a/src/NMTTools/NMTTools_PaveFiller_8.cxx b/src/NMTTools/NMTTools_PaveFiller_8.cxx new file mode 100644 index 000000000..007478455 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_8.cxx @@ -0,0 +1,614 @@ +// 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/ +// +// File: NMTTools_PaveFiller_8.cxx +// Created: Fri Dec 19 11:15:53 2003 +// Author: Peter KURNEV +// + + +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +//======================================================================= +// function: RealPaveBlock +// purpose: +//======================================================================= + const BOPTools_PaveBlock& NMTTools_PaveFiller::RealPaveBlock(const BOPTools_PaveBlock& aPB) +{ + Standard_Integer nE; + // + nE=aPB.OriginalEdge(); + const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE)); + NMTTools_CommonBlockAPI aCBAPI(aLCBE); + if (aCBAPI.IsCommonBlock(aPB)) { + NMTTools_CommonBlock& aCB=aCBAPI.CommonBlock(aPB); + const BOPTools_PaveBlock& aPBx=aCB.PaveBlock1(); + return aPBx; + } + return aPB; +} +//======================================================================= +// function: CommonBlocksFace +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::CommonBlocksFace(const Standard_Integer nF, + NMTTools_ListOfCommonBlock& aLCB) +{ + Standard_Integer nE; + TopAbs_ShapeEnum aT; + NMTTools_ListIteratorOfListOfCommonBlock anIt; + // + aT=myDS->GetShapeType(nF); + // + if (aT!=TopAbs_FACE) { + return 1; // Type mismatch + } + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + // + aExp.Init(nF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE=aExp.Current(); + const NMTTools_ListOfCommonBlock& aLCBE=myCommonBlockPool(myDS->RefEdge(nE)); + anIt.Initialize(aLCBE); + for (; anIt.More(); anIt.Next()) { + const NMTTools_CommonBlock& aCBE=anIt.Value(); + aLCB.Append(aCBE); + } + } + return 0; //Ok +} +// +// 1 RealSplits +// +// +//======================================================================= +// function: RealSplitsFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsFace(const Standard_Integer nF, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + // + aExp.Init(nF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE=aExp.Current(); + const BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE)); + anIt.Initialize(aLPBE); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB=anIt.Value(); + const BOPTools_PaveBlock& aPBR=RealPaveBlock(aPB); + aLPB.Append(aPBR); + } + } +} +//======================================================================= +// function: HasRealSplitsInOnFace +// purpose: +//======================================================================= + Standard_Boolean NMTTools_PaveFiller::HasRealSplitsInOnFace(const Standard_Integer nF1, + const Standard_Integer nF2) +{ + Standard_Boolean bFlag; + BOPTools_ListOfPaveBlock aLPB; + // + RealSplitsInFace(0, nF1, nF2, aLPB); + // + bFlag=!aLPB.IsEmpty(); + if (bFlag) { + return bFlag; + } + // + RealSplitsInFace(0, nF1, nF2, aLPB); + // + bFlag=!aLPB.IsEmpty(); + return bFlag; +} +//======================================================================= +// function: RealSplitsInFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE1; + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + aExp.Init(nF1, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE1=aExp.Current(); + RealSplitsInFace (nE1, nF2, aLPB); + } +} +//======================================================================= +// function: RealSplitsInFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsInFace(const Standard_Integer nE1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nF1; + // + TColStd_ListIteratorOfListOfInteger anItLFCB; + NMTTools_ListIteratorOfListOfCommonBlock anItCB; + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1)); + // + anItCB.Initialize(aLCB); + for (; anItCB.More(); anItCB.Next()) { + NMTTools_CommonBlock& aCB=anItCB.Value(); + const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1); + const BOPTools_PaveBlock& aPB1R=RealPaveBlock(aPB1); + + const TColStd_ListOfInteger& aLFCB=aCB.Faces(); + anItLFCB.Initialize(aLFCB); + for (; anItLFCB.More(); anItLFCB.Next()) { + nF1=anItLFCB.Value(); + if (nF1==nF2) { + aLPB.Append(aPB1R); + } + } + } +} +//======================================================================= +// function: RealSplitsOnEdge +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsOnEdge(const Standard_Integer nE1, + const Standard_Integer nE2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE; + // + BOPTools_ListIteratorOfListOfPaveBlock anIt; + NMTTools_ListIteratorOfListOfCommonBlock anItCB; + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1)); + + anItCB.Initialize(aLCB); + for (; anItCB.More(); anItCB.Next()) { + NMTTools_CommonBlock& aCB=anItCB.Value(); + const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1); + const BOPTools_PaveBlock& aPB1R=RealPaveBlock(aPB1); + // + const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); + anIt.Initialize(aLPBx); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB2=anIt.Value(); + nE=aPB2.OriginalEdge(); + if (nE==nE2) { + aLPB.Append(aPB1R); + } + } + } +} +//======================================================================= +// function: RealSplitsOnFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer nE1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE2; + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + aExp.Init(nF2, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE2=aExp.Current(); + RealSplitsOnEdge(nE1, nE2, aLPB); + } +} +//======================================================================= +// function: RealSplitsOnFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::RealSplitsOnFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE1; + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*myDS); + aExp.Init(nF1, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE1=aExp.Current(); + RealSplitsOnFace(nE1, nF2, aLPB); + } +} + +// 2 SimpleSplits +//======================================================================= +// function: SplitsFace +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE; + TopAbs_ShapeEnum aT; + BOPTools_ListIteratorOfListOfPaveBlock anIt; + // + aT=myDS->GetShapeType(nF); + // + if (aT!=TopAbs_FACE) { + return 1; // Type mismatch + } + // + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + // + aExp.Init(nF, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE=aExp.Current(); + const BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE)); + anIt.Initialize(aLPBE); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPBE=anIt.Value(); + aLPB.Append(aPBE); + } + } + return 0; //Ok +} + +//======================================================================= +// function: SplitsInFace +// purpose: splits of edges from nF1 in nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE1; + TopAbs_ShapeEnum aT1, aT2; + + aT1=myDS->GetShapeType(nF1); + aT2=myDS->GetShapeType(nF2); + + if (aT1!=TopAbs_FACE || aT2!=TopAbs_FACE) { + return 1; // Type mismatch + } + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + aExp.Init(nF1, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE1=aExp.Current(); + SplitsInFace (nE1, nF2, aLPB); + } + return 0; //Ok +} +//======================================================================= +// function: SplitsInFace +// purpose: splits of edge nE1 in aFace2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nF1; + TopAbs_ShapeEnum aT1, aT2; + + aT1=myDS->GetShapeType(nE1); + aT2=myDS->GetShapeType(nF2); + + if (aT1!=TopAbs_EDGE || aT2!=TopAbs_FACE) { + return 1; // Type mismatch + } + // + TColStd_ListIteratorOfListOfInteger anItLFCB; + NMTTools_ListIteratorOfListOfCommonBlock anItCB; + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1)); + // + anItCB.Initialize(aLCB); + for (; anItCB.More(); anItCB.Next()) { + NMTTools_CommonBlock& aCB=anItCB.Value(); + const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1); + + const TColStd_ListOfInteger& aLFCB=aCB.Faces(); + anItLFCB.Initialize(aLFCB); + for (; anItLFCB.More(); anItLFCB.Next()) { + nF1=anItLFCB.Value(); + if (nF1==nF2) { + aLPB.Append(aPB1); + } + } + } + return 0; //Ok +} +//======================================================================= +// function: SplitsOnEdge +// purpose: splits of edge nE1 on nE2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1, + const Standard_Integer nE2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE; + TopAbs_ShapeEnum aT1, aT2; + + aT1=myDS->GetShapeType(nE1); + aT2=myDS->GetShapeType(nE2); + + if (aT1!=TopAbs_EDGE || aT2!=TopAbs_EDGE) { + return 1; // Type mismatch + } + // + BOPTools_ListIteratorOfListOfPaveBlock anIt; + NMTTools_ListIteratorOfListOfCommonBlock anItCB; + // + const NMTTools_ListOfCommonBlock& aLCB=myCommonBlockPool(myDS->RefEdge(nE1)); + + anItCB.Initialize(aLCB); + for (; anItCB.More(); anItCB.Next()) { + NMTTools_CommonBlock& aCB=anItCB.Value(); + const BOPTools_PaveBlock& aPB1=aCB.PaveBlock1(nE1);//XXX + // + const BOPTools_ListOfPaveBlock& aLPBx=aCB.PaveBlocks(); + anIt.Initialize(aLPBx); + for (; anIt.More(); anIt.Next()) { + const BOPTools_PaveBlock& aPB2=anIt.Value(); + nE=aPB2.OriginalEdge(); + if (nE==nE2) { + aLPB.Append(aPB1); + } + } + } + return 0; //Ok +} +//======================================================================= +// function: SplitsOnFace +// purpose: splits of edge nE1 on face nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE2, ip; + TopAbs_ShapeEnum aT1, aT2; + + aT1=myDS->GetShapeType(nE1); + aT2=myDS->GetShapeType(nF2); + + if (aT1!=TopAbs_EDGE || aT2!=TopAbs_FACE) { + return 1; // Type mismatch + } + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*pDS); + aExp.Init(nF2, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE2=aExp.Current(); + ip=SplitsOnEdge(nE1, nE2, aLPB); + if (ip) { + return ip; + } + } + return 0; //Ok +} +//======================================================================= +// function: SplitsOnFace +// purpose: splits of edges from face nF1 on face nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + BOPTools_ListOfPaveBlock& aLPB) +{ + Standard_Integer nE1, ip; + TopAbs_ShapeEnum aT1, aT2; + + aT1=myDS->GetShapeType(nF1); + aT2=myDS->GetShapeType(nF2); + + if (aT1!=TopAbs_FACE || aT2!=TopAbs_FACE) { + return 1; // Type mismatch + } + BooleanOperations_ShapesDataStructure *pDS=myDS; + BooleanOperations_OnceExplorer aExp(*myDS); + aExp.Init(nF1, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) { + nE1=aExp.Current(); + ip=SplitsOnFace(nE1, nF2, aLPB); + if (ip) { + return ip; + } + } + return 0; //Ok +} + +// 3 Simple Splits indices +//======================================================================= +// function: SplitsFace +// purpose: +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsFace(const Standard_Integer nF, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsFace(nF, aLPB); + if (iErr) { + return iErr; + } + + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return 0; //Ok +} + +//======================================================================= +// function: SplitsInFace +// purpose: splits of edges from nF1 in nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsInFace(0, nF1, nF2, aLPB); + if (iErr) { + return iErr; + } + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return iErr; +} +//======================================================================= +// function: SplitsInFace +// purpose: splits of edge nE1 in aFace2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsInFace(const Standard_Integer nE1, + const Standard_Integer nF2, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsInFace(nE1, nF2, aLPB); + if (iErr) { + return iErr; + } + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return iErr; +} +//======================================================================= +// function: SplitsOnEdge +// purpose: splits of edge nE1 on nE2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnEdge(const Standard_Integer nE1, + const Standard_Integer nE2, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsOnEdge(nE1, nE2, aLPB); + if (iErr) { + return iErr; + } + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return iErr; +} +//======================================================================= +// function: SplitsOnFace +// purpose: splits of edge nE1 on face nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer nE1, + const Standard_Integer nF2, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsOnEdge(nE1, nF2, aLPB); + if (iErr) { + return iErr; + } + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return iErr; +} +//======================================================================= +// function: SplitsOnFace +// purpose: splits of edges from face nF1 on face nF2 +//======================================================================= + Standard_Integer NMTTools_PaveFiller::SplitsOnFace(const Standard_Integer ,//for overriding + const Standard_Integer nF1, + const Standard_Integer nF2, + TColStd_ListOfInteger& aSplits) +{ + Standard_Integer nE, iErr; + BOPTools_ListIteratorOfListOfPaveBlock aIt; + BOPTools_ListOfPaveBlock aLPB; + // + iErr=SplitsOnFace(0, nF1, nF2, aLPB); + if (iErr) { + return iErr; + } + + aIt.Initialize(aLPB); + for (; aIt.More(); aIt.Next()) { + const BOPTools_PaveBlock& aPB=aIt.Value(); + nE=aPB.Edge(); + aSplits.Append(nE); + } + return 0; //Ok +} diff --git a/src/NMTTools/NMTTools_PaveFiller_9.cxx b/src/NMTTools/NMTTools_PaveFiller_9.cxx new file mode 100644 index 000000000..2fc560ed2 --- /dev/null +++ b/src/NMTTools/NMTTools_PaveFiller_9.cxx @@ -0,0 +1,124 @@ +// 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/ +// +// File: NMTTools_PaveFiller_9.cxx +// Created: Fri Dec 19 11:15:53 2003 +// Author: Peter KURNEV +// + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include +#include + + +//======================================================================= +// function: PrepareFace +// purpose: +//======================================================================= + void NMTTools_PaveFiller::PrepareFace(const Standard_Integer nF, + TopoDS_Face& newFace) +{ + Standard_Boolean bToReverse, bIsDegenerated; + Standard_Integer iRankF, nE, nSp, aNbPB; + Standard_Real aTol; + TopLoc_Location aLoc; + TopoDS_Face aF; + TopoDS_Wire newWire; + TopoDS_Edge aSp; + TopAbs_Orientation anOrF, anOrE; + BRep_Builder aBB; + TopExp_Explorer aExpW, aExpE; + BOPTools_ListIteratorOfListOfPaveBlock aItPB; + // + iRankF=myDS->Rank(nF); + aF=TopoDS::Face(myDS->Shape(nF)); + anOrF=aF.Orientation(); + aF.Orientation(TopAbs_FORWARD); + // + Handle(Geom_Surface) aS=BRep_Tool::Surface(aF, aLoc); + aTol=BRep_Tool::Tolerance(aF); + // + aBB.MakeFace (newFace, aS, aLoc, aTol); + // + aExpW.Init(aF, TopAbs_WIRE); + for (; aExpW.More(); aExpW.Next()) { + const TopoDS_Shape& aW=aExpW.Current(); + aBB.MakeWire(newWire); + // + aExpE.Init(aW, TopAbs_EDGE); + for (; aExpE.More(); aExpE.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExpE.Current()); + bIsDegenerated=BRep_Tool::Degenerated(aE); + anOrE=aE.Orientation(); + // + nE=myDS->ShapeIndex(aE, iRankF); + const BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE)); + aNbPB=aLPB.Extent(); + if (!aNbPB) { + aBB.Add(newWire, aE); + continue; + } + // + aItPB.Initialize(aLPB); + for (; aItPB.More(); aItPB.Next()) { + const BOPTools_PaveBlock& aPB=aItPB.Value(); + const BOPTools_PaveBlock& aPBR=RealPaveBlock(aPB); + nSp=aPBR.Edge(); + // + aSp=TopoDS::Edge(myDS->Shape(nSp)); + if (!bIsDegenerated) { + bToReverse=BOPTools_Tools3D::IsSplitToReverse1(aSp, aE, myContext); + if (bToReverse) { + aSp.Reverse(); + } + } + else { + aSp.Orientation(anOrE); + } + aBB.Add(newWire, aSp); + } + } + aBB.Add(newFace, newWire); + } + newFace.Orientation(anOrF); +} diff --git a/src/NMTTools/NMTTools_Tools.cdl b/src/NMTTools/NMTTools_Tools.cdl new file mode 100644 index 000000000..86ce89dba --- /dev/null +++ b/src/NMTTools/NMTTools_Tools.cdl @@ -0,0 +1,91 @@ +// 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/ +// +-- File: NMTTools_Tools.cdl +-- Created: Mon Dec 8 10:32:34 2003 +-- Author: Peter KURNEV +-- +---Copyright: Matra Datavision 2003 + + +class Tools from NMTTools + + ---Purpose: + +uses + Vertex from TopoDS, + Edge from TopoDS, + Face from TopoDS, + Context from IntTools, + Curve from Geom2d, + + ListOfShape from TopTools, + IndexedDataMapOfIntegerIndexedMapOfInteger from BOPTColStd, + CArray1OfVVInterference from BOPTools, + CArray1OfSSInterference from BOPTools, + ListOfCoupleOfShape from NMTTools, + IndexedDataMapOfShapeIndexedMapOfShape from NMTTools + +--raises + +is + MakeNewVertex (myclass; + aLV : ListOfShape from TopTools; + aNewVertex: out Vertex from TopoDS); + FindChains(myclass; + aVVs:CArray1OfVVInterference from BOPTools; + aMCX: out IndexedDataMapOfIntegerIndexedMapOfInteger from BOPTColStd); + + FindChains(myclass; + aVVs:CArray1OfSSInterference from BOPTools; + aMCX: out IndexedDataMapOfIntegerIndexedMapOfInteger from BOPTColStd); + + FindChains(myclass; + aMCV: IndexedDataMapOfIntegerIndexedMapOfInteger from BOPTColStd; + aMCX: out IndexedDataMapOfIntegerIndexedMapOfInteger from BOPTColStd); + + + IsSplitInOnFace(myclass; + aE : Edge from TopoDS; + aF : Face from TopoDS; + aCtx:out Context from IntTools) + returns Boolean from Standard; + + AreFacesSameDomain(myclass; + aF1 : Face from TopoDS; + aF2 : Face from TopoDS; + aCtx : out Context from IntTools) + returns Boolean from Standard; + + FindChains(myclass; + aLCS:ListOfCoupleOfShape from NMTTools; + aM :out IndexedDataMapOfShapeIndexedMapOfShape from NMTTools); + + FindChains(myclass; + aM1: IndexedDataMapOfShapeIndexedMapOfShape from NMTTools; + aM2:out IndexedDataMapOfShapeIndexedMapOfShape from NMTTools); + + MakePCurve(myclass; + aE : Edge from TopoDS; + aF : Face from TopoDS; + aC2D: Curve from Geom2d; + aTolR2D: Real from Standard); +--fields + +end Tools; diff --git a/src/NMTTools/NMTTools_Tools.cxx b/src/NMTTools/NMTTools_Tools.cxx new file mode 100644 index 000000000..1193c8f2c --- /dev/null +++ b/src/NMTTools/NMTTools_Tools.cxx @@ -0,0 +1,569 @@ +// 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/ +// +// File: NMTTools_Tools.cxx +// Created: Mon Dec 8 10:35:15 2003 +// 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static + void ProcessBlock(const Standard_Integer iV, + const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV, + TColStd_IndexedMapOfInteger& aProcessed, + TColStd_IndexedMapOfInteger& aChain); +static + void ProcessBlock(const TopoDS_Shape& aF, + const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV, + TopTools_IndexedMapOfShape& aProcessed, + TopTools_IndexedMapOfShape& aChain); + +//======================================================================= +// function: MakePCurve +// purpose: +//======================================================================= + void NMTTools_Tools::MakePCurve(const TopoDS_Edge& aE, + const TopoDS_Face& aF, + const Handle(Geom2d_Curve)& aC2Dx, + const Standard_Real aTolR2D) +{ + Standard_Integer k, aNbV; + Standard_Real aTolEdge, aTolFact, aTolV, aTolVmax; + Standard_Real aTFirst, aTLast, aOutFirst, aOutLast, aOutTol; + TopoDS_Face aFFWD; + TopTools_IndexedMapOfShape aVMap; + BRep_Builder aBB; + // + aFFWD=aF; + aFFWD.Orientation(TopAbs_FORWARD); + // + aTolEdge=BRep_Tool::Tolerance(aE); + aTolFact=Max(aTolEdge, aTolR2D); + // + TopExp::MapShapes(aE, TopAbs_VERTEX, aVMap); + // + aTolVmax=-1.; + aNbV=aVMap.Extent(); + for (k=1; k<=aNbV; ++k) { + const TopoDS_Vertex& aV=TopoDS::Vertex(aVMap(k)); + aTolV=BRep_Tool::Tolerance(aV); + if (aTolV>aTolVmax) { + aTolVmax=aTolV; + } + } + // + if (aTolFact>aTolVmax) { + aTolFact=aTolVmax; + } + // + const Handle(Geom_Curve)& aC3DE=BRep_Tool::Curve(aE, aTFirst, aTLast); + Handle(Geom_TrimmedCurve)aC3DETrim=new Geom_TrimmedCurve(aC3DE, aTFirst, aTLast); + // + Handle(Geom2d_Curve) aC2D, aC2DA; + // + aC2D=aC2Dx; + if (aC2D.IsNull()) { + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aFFWD); + BOPTools_Tools2D::CurveOnSurface(aE, aFFWD, aC2D, aOutFirst, aOutLast, aOutTol, Standard_True); + } + if (aC3DE->IsPeriodic()) { + BOPTools_Tools2D::AdjustPCurveOnFace(aFFWD, aTFirst, aTLast, aC2D, aC2DA); + } + else { + BOPTools_Tools2D::AdjustPCurveOnFace(aFFWD, aC3DETrim, aC2D, aC2DA); + } + // + aBB.UpdateEdge(aE, aC2DA, aFFWD, aTolFact); + BRepLib::SameParameter(aE); +} + +//======================================================================= +// function: IsSplitInOnFace +// purpose: +//======================================================================= + Standard_Boolean NMTTools_Tools::IsSplitInOnFace(const TopoDS_Edge& aE, + const TopoDS_Face& aF, + IntTools_Context& aContext) +{ + Standard_Boolean bFlag; + Standard_Real aT, aTolE, aTolF, aTol, aDist, aU, aV; + gp_Pnt aP; + gp_Pnt2d aP2D; + // + aTolE=BRep_Tool::Tolerance(aE); + aTolF=BRep_Tool::Tolerance(aF); + aTol=aTolE+aTolF; + // + GeomAPI_ProjectPointOnSurf& aProjector=aContext.ProjPS(aF); + // + aT=BOPTools_Tools2D::IntermediatePoint(aE); + BOPTools_Tools::PointOnEdge(aE, aT, aP); + // + aProjector.Perform(aP); + bFlag=aProjector.IsDone(); + if (!bFlag) { + return bFlag; + } + // + aDist=aProjector.LowerDistance(); + bFlag=(aDist <= aTol); + if (!bFlag) { + return bFlag; + } + // + aProjector.LowerDistanceParameters(aU, aV); + aP2D.SetCoord(aU, aV); + bFlag=aContext.IsPointInOnFace (aF, aP2D); + return bFlag; +} +//======================================================================= +// function: NMTTools_Tools::MakeNewVertex +// purpose : +//======================================================================= + void NMTTools_Tools::MakeNewVertex(const TopTools_ListOfShape& aLVs, + TopoDS_Vertex& aNewVertex) +{ + Standard_Integer aNb; + Standard_Real aTi, aDi, aDmax=-1.e5; + gp_Pnt aPi, aP; + gp_XYZ aXYZ(0.,0.,0.), aXYZi; + TopTools_ListIteratorOfListOfShape anIt; + // + aNb=aLVs.Extent(); + if (!aNb) { + return; + } + // + anIt.Initialize(aLVs); + for (; anIt.More(); anIt.Next()) { + TopoDS_Vertex aVi=TopoDS::Vertex(anIt.Value()); + aPi=BRep_Tool::Pnt(aVi); + aXYZi=aPi.XYZ(); + aXYZ=aXYZ+aXYZi; + } + // + aXYZ.Divide((Standard_Real)aNb); + aP.SetXYZ(aXYZ); + // + anIt.Initialize(aLVs); + for (; anIt.More(); anIt.Next()) { + TopoDS_Vertex aVi=TopoDS::Vertex(anIt.Value()); + aPi=BRep_Tool::Pnt(aVi); + aTi=BRep_Tool::Tolerance(aVi); + aDi=aP.Distance(aPi); + aDi=aDi+aTi; + if (aDi > aDmax) { + aDmax=aDi; + } + } + BRep_Builder aBB; + aBB.MakeVertex (aNewVertex, aP, aDmax); +} +//======================================================================= +// function: FindChains +// purpose : +//======================================================================= + void NMTTools_Tools::FindChains(const BOPTools_CArray1OfSSInterference& FFs, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains) +{ + Standard_Boolean bIsTangentFaces; + Standard_Integer j, aNb, anIndex1, anIndex2; + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMCV; + // + aNb=FFs.Extent(); + for (j=1; j<=aNb; ++j) { + const BOPTools_SSInterference& aFF=FFs(j); + // + bIsTangentFaces=aFF.IsTangentFaces(); + if (!bIsTangentFaces) { + continue; + } + // + aFF.Indices(anIndex1, anIndex2); + // + if (aMCV.Contains(anIndex1)) { + TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex1); + aMV.Add(anIndex1); + aMV.Add(anIndex2); + } + else { + TColStd_IndexedMapOfInteger aMV; + aMV.Add(anIndex1); + aMV.Add(anIndex2); + aMCV.Add(anIndex1, aMV); + } + // + if (aMCV.Contains(anIndex2)) { + TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex2); + aMV.Add(anIndex1); + aMV.Add(anIndex2); + } + else { + TColStd_IndexedMapOfInteger aMV; + aMV.Add(anIndex1); + aMV.Add(anIndex2); + aMCV.Add(anIndex2, aMV); + } + } + NMTTools_Tools::FindChains(aMCV, aMapChains); +} +//======================================================================= +// function: FindChains +// purpose : +//======================================================================= + void NMTTools_Tools::FindChains(const BOPTools_CArray1OfVVInterference& VVs, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains) +{ + Standard_Integer j, aNb, anIndex1, anIndex2; + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMCV; + // + aNb=VVs.Extent(); + for (j=1; j<=aNb; ++j) { + const BOPTools_VVInterference& VV=VVs(j); + VV.Indices(anIndex1, anIndex2); + // + if (aMCV.Contains(anIndex1)) { + TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex1); + aMV.Add(anIndex1); + aMV.Add(anIndex2); + } + else { + TColStd_IndexedMapOfInteger aMV; + aMV.Add(anIndex1); + aMV.Add(anIndex2); + aMCV.Add(anIndex1, aMV); + } + // + if (aMCV.Contains(anIndex2)) { + TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex2); + aMV.Add(anIndex1); + aMV.Add(anIndex2); + } + else { + TColStd_IndexedMapOfInteger aMV; + aMV.Add(anIndex1); + aMV.Add(anIndex2); + aMCV.Add(anIndex2, aMV); + } + } + NMTTools_Tools::FindChains(aMCV, aMapChains); +} + +//======================================================================= +// function: FindChains +// purpose : +//======================================================================= + void NMTTools_Tools::FindChains(const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV, + BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains) +{ + Standard_Integer i, j, aNbCV, aNbV, iV, iVx; + TColStd_IndexedMapOfInteger aProcessed, aChain; + // + aNbCV=aMCV.Extent(); + for (i=1; i<=aNbCV; ++i) { + iV=aMCV.FindKey(i); + if (aProcessed.Contains(iV)) { + continue; + } + // + aProcessed.Add(iV); + aChain.Add(iV); + // + const TColStd_IndexedMapOfInteger& aMV=aMCV(i); + aNbV=aMV.Extent(); + for (j=1; j<=aNbV; ++j) { + iVx=aMV(j); + ProcessBlock(iVx, aMCV, aProcessed, aChain); + } + aMapChains.Add(i, aChain); + aChain.Clear(); + } +} +//======================================================================= +// function: ProcessBlock +// purpose: +//======================================================================= +void ProcessBlock(const Standard_Integer iV, + const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV, + TColStd_IndexedMapOfInteger& aProcessed, + TColStd_IndexedMapOfInteger& aChain) +{ + Standard_Integer j, aNbV, iVx; + // + if (aProcessed.Contains(iV)) { + return; + } + aProcessed.Add(iV); + aChain.Add(iV); + // + const TColStd_IndexedMapOfInteger& aMV=aMCV.FindFromKey(iV); + aNbV=aMV.Extent(); + for (j=1; j<=aNbV; ++j) { + iVx=aMV(j); + ProcessBlock(iVx, aMCV, aProcessed, aChain); + } +} +//======================================================================= +// function: AreFacesSameDomain +// purpose : +//======================================================================= + Standard_Boolean NMTTools_Tools::AreFacesSameDomain(const TopoDS_Face& aF1x, + const TopoDS_Face& aF2y, + IntTools_Context& aCtx) +{ + Standard_Boolean bFlag; + Standard_Integer i, aNbE1, aNbE2; + + TopTools_IndexedMapOfShape aME1, aME2; + TopoDS_Edge aEF1, aEF2; + TopoDS_Face aF1, aF2; + // + aF1=aF1x; + aF1.Orientation(TopAbs_FORWARD); + aF2=aF2y; + aF2.Orientation(TopAbs_FORWARD); + // + TopExp::MapShapes(aF1, TopAbs_EDGE, aME1); + TopExp::MapShapes(aF2, TopAbs_EDGE, aME2); + // + bFlag=Standard_False; + // + aNbE1=aME1.Extent(); + aNbE2=aME2.Extent(); + // + if(!aNbE1 || !aNbE2){ + return bFlag; + } + // + if(aNbE1!=aNbE2) { + return bFlag; + } + // + for (i=1; i<=aNbE1; ++i) { + const TopoDS_Edge& aE1=TopoDS::Edge(aME1(i)); + if (BRep_Tool::Degenerated(aE1)) { + // not try to compare deg edges because it + // can not have same TShape on different faces at all + continue; + } + if (!aME2.Contains(aE1)) { + return bFlag; + } + } + // + Standard_Real aTolF1, aTolF2, aTol; + gp_Pnt2d aP2D; + gp_Pnt aP; + TopExp_Explorer anExp; + // + aTolF1=BRep_Tool::Tolerance(aF1); + aTolF2=BRep_Tool::Tolerance(aF2); + aTol=aTolF1+aTolF2; + // + anExp.Init(aF1, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Edge& aE1=TopoDS::Edge(anExp.Current()); + if (!BRep_Tool::Degenerated(aE1)) { + BOPTools_Tools3D::PointNearEdge(aE1, aF1, aP2D, aP); + bFlag=aCtx.IsValidPointForFace(aP, aF2, aTol); + break; + } + } + return bFlag; + /* + // + Standard_Real aU1, aU2, aV1, aV2; + Standard_Real dU, dV, aU, aV; + Standard_Integer aNbP=5, aNbP1, j; + gp_Pnt2d aP2D; + gp_Pnt aP; + // + aTolF1=BRep_Tool::Tolerance(aF1); + aTolF2=BRep_Tool::Tolerance(aF2); + aTol=aTolF1+aTolF2; + // + BRepTools::UVBounds(aF1, aU1, aU2, aV1, aV2); + Handle(Geom_Surface) aS1=BRep_Tool::Surface(aF1); + // + aNbP1=aNbP+1; + dU=(aU2-aU1)/aNbP1; + dV=(aV2-aV1)/aNbP1; + // + for (i=1; i<=aNbP; ++i) { + aU=aU1+i*dU; + for (j=1; j<=aNbP; ++j) { + aV=aV1+j*dV; + aP2D.SetCoord(aU, aV); + // + if(aCtx.IsPointInFace(aF1, aP2D)) { + aP=aS1->Value(aU, aV); + bFlag=aCtx.IsValidPointForFace(aP, aF2, aTol); + if (!bFlag) { + return bFlag; + } + } + } + } + */ + // + return bFlag; +} +//======================================================================= +// function: FindChains +// purpose : +//======================================================================= + void NMTTools_Tools::FindChains(const NMTTools_ListOfCoupleOfShape& aLCS, + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMapChains) +{ + NMTTools_ListIteratorOfListOfCoupleOfShape aItCS; + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape aMCV; + // + aItCS.Initialize(aLCS); + for (; aItCS.More(); aItCS.Next()) { + const NMTTools_CoupleOfShape& aCS=aItCS.Value(); + // + const TopoDS_Shape& aF1=aCS.Shape1(); + const TopoDS_Shape& aF2=aCS.Shape2(); + // + // + if (aMCV.Contains(aF1)) { + TopTools_IndexedMapOfShape& aMV=aMCV.ChangeFromKey(aF1); + aMV.Add(aF1); + aMV.Add(aF2); + } + else { + TopTools_IndexedMapOfShape aMV; + aMV.Add(aF1); + aMV.Add(aF2); + aMCV.Add(aF1, aMV); + } + // + if (aMCV.Contains(aF2)) { + TopTools_IndexedMapOfShape& aMV=aMCV.ChangeFromKey(aF2); + aMV.Add(aF1); + aMV.Add(aF2); + } + else { + TopTools_IndexedMapOfShape aMV; + aMV.Add(aF1); + aMV.Add(aF2); + aMCV.Add(aF2, aMV); + } + } + NMTTools_Tools::FindChains(aMCV, aMapChains); +} +//======================================================================= +// function: FindChains +// purpose : +//======================================================================= + void NMTTools_Tools::FindChains(const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV, + NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMapChains) +{ + Standard_Integer i, j, aNbCV, aNbV; + TopTools_IndexedMapOfShape aProcessed, aChain; + // + aNbCV=aMCV.Extent(); + for (i=1; i<=aNbCV; ++i) { + const TopoDS_Shape& aF=aMCV.FindKey(i); + if (aProcessed.Contains(aF)) { + continue; + } + // + aProcessed.Add(aF); + aChain.Add(aF); + // + const TopTools_IndexedMapOfShape& aMV=aMCV(i); + aNbV=aMV.Extent(); + for (j=1; j<=aNbV; ++j) { + const TopoDS_Shape& aFx=aMV(j); + ProcessBlock(aFx, aMCV, aProcessed, aChain); + } + aMapChains.Add(aF, aChain); + aChain.Clear(); + } +} +//======================================================================= +// function: ProcessBlock +// purpose: +//======================================================================= +void ProcessBlock(const TopoDS_Shape& aF, + const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV, + TopTools_IndexedMapOfShape& aProcessed, + TopTools_IndexedMapOfShape& aChain) +{ + Standard_Integer j, aNbV; + // + if (aProcessed.Contains(aF)) { + return; + } + aProcessed.Add(aF); + aChain.Add(aF); + // + const TopTools_IndexedMapOfShape& aMV=aMCV.FindFromKey(aF); + aNbV=aMV.Extent(); + for (j=1; j<=aNbV; ++j) { + const TopoDS_Shape& aFx=aMV(j); + ProcessBlock(aFx, aMCV, aProcessed, aChain); + } +} diff --git a/src/NMTTools/NMTTools_Tools.jxx b/src/NMTTools/NMTTools_Tools.jxx new file mode 100644 index 000000000..f39eecd53 --- /dev/null +++ b/src/NMTTools/NMTTools_Tools.jxx @@ -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/ +// +#ifndef _TopTools_ListOfShape_HeaderFile +#include +#endif +#ifndef _TopoDS_Vertex_HeaderFile +#include +#endif +#ifndef _BOPTools_CArray1OfVVInterference_HeaderFile +#include +#endif +#ifndef _BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger_HeaderFile +#include +#endif +#ifndef _BOPTools_CArray1OfSSInterference_HeaderFile +#include +#endif +#ifndef _TopoDS_Edge_HeaderFile +#include +#endif +#ifndef _TopoDS_Face_HeaderFile +#include +#endif +#ifndef _IntTools_Context_HeaderFile +#include +#endif +#ifndef _NMTTools_ListOfCoupleOfShape_HeaderFile +#include +#endif +#ifndef _NMTTools_IndexedDataMapOfShapeIndexedMapOfShape_HeaderFile +#include +#endif +#ifndef _Geom2d_Curve_HeaderFile +#include +#endif +#ifndef _NMTTools_Tools_HeaderFile +#include +#endif diff --git a/src/OperationGUI/OperationGUI_ArchimedeDlg.cxx b/src/OperationGUI/OperationGUI_ArchimedeDlg.cxx new file mode 100644 index 000000000..0d024e7f3 --- /dev/null +++ b/src/OperationGUI/OperationGUI_ArchimedeDlg.cxx @@ -0,0 +1,267 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : OperationGUI_ArchimedeDlg.cxx +// Author : Nicolas REJNERI +// Module : GEOM +// $Header$ + +#include "OperationGUI_ArchimedeDlg.h" +#include "DlgRef_1Sel3Spin.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +//================================================================================= +// class : OperationGUI_ArchimedeDlg() +// purpose : Constructs a OperationGUI_ArchimedeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_ArchimedeDlg::OperationGUI_ArchimedeDlg( GeometryGUI* theGeometryGUI, QWidget* parent ) +: GEOMBase_Skeleton( parent, "ArchimedeDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ARCHIMEDE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_ARCHIMEDE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_ARCHIMEDE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel3Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_WEIGHT")); + GroupPoints->TextLabel3->setText(tr("GEOM_WATER_DENSITY")); + GroupPoints->TextLabel4->setText(tr("GEOM_MESHING_DEFLECTION")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~OperationGUI_ArchimedeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_ArchimedeDlg::~OperationGUI_ArchimedeDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_ArchimedeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + /* Get setting of myStep value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double myStep = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + double SpecificStep1 = 0.1; + double SpecificStep2 = 0.01; + /* min, max, myStep and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, myStep, 3); + GroupPoints->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, SpecificStep1, 3); + GroupPoints->SpinBox_DZ->RangeStepAndValidator(0.001, 999.999, SpecificStep2, 3); + + GroupPoints->SpinBox_DX->SetValue( 100.0 ); + GroupPoints->SpinBox_DY->SetValue( 1.0 ); + GroupPoints->SpinBox_DZ->SetValue( 0.01 ); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DZ, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_ARCHIMEDE" ) ); + + globalSelection( GEOM_ALLSHAPES ); + + SelectionIntoArgument(); + + /* displays Dialog */ + GroupPoints->show(); + this->show(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_ArchimedeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool OperationGUI_ArchimedeDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void OperationGUI_ArchimedeDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText( "" ); + myShape = GEOM::GEOM_Object::_nil(); + + if ( IObjectCount() != 1 ) + return; + + Standard_Boolean testResult = Standard_False; + myShape = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if ( !testResult || myShape->_is_nil() || !GEOMBase::IsShape( myShape ) ) + { + myShape = GEOM::GEOM_Object::_nil(); + return; + } + + myEditCurrentArgument->setText( GEOMBase::GetName( myShape ) ); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void OperationGUI_ArchimedeDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1) + myEditCurrentArgument = GroupPoints->LineEdit1; + else + return; + + GEOMBase_Skeleton::LineEditReturnPressed(); + return; +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_ArchimedeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + globalSelection( GEOM_ALLSHAPES ); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + return; +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_ArchimedeDlg::enterEvent(QEvent* e) +{ + if(GroupConstructors->isEnabled()) + return; + this->ActivateThisDialog(); + return; +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr OperationGUI_ArchimedeDlg::createOperation() +{ + return getGeomEngine()->GetILocalOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool OperationGUI_ArchimedeDlg::isValid( QString& ) +{ + return !myShape->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool OperationGUI_ArchimedeDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + double aWeight = GroupPoints->SpinBox_DX->GetValue(); + double aWaterDensity = GroupPoints->SpinBox_DY->GetValue(); + double aMeshDeflection = GroupPoints->SpinBox_DZ->GetValue(); + + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeArchimede( myShape, aWeight, aWaterDensity, aMeshDeflection ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} diff --git a/src/OperationGUI/OperationGUI_ChamferDlg.cxx b/src/OperationGUI/OperationGUI_ChamferDlg.cxx new file mode 100644 index 000000000..79678b359 --- /dev/null +++ b/src/OperationGUI/OperationGUI_ChamferDlg.cxx @@ -0,0 +1,708 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : OperationGUI_ChamferDlg.cxx +// Author : Damien COQUERET +// Module : GEOM + +// $Header$ + +#include "OperationGUI_ChamferDlg.h" +#include "DlgRef_SpinBox.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "OCCViewer_ViewModel.h" + +#include + +#include +#include "qpixmap.h" +#include + +#include "GEOMImpl_Types.hxx" + +//================================================================================= +// class : OperationGUI_ChamferDlg() +// purpose : Constructs a OperationGUI_ChamferDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_ChamferDlg::OperationGUI_ChamferDlg( QWidget* parent ) +: GEOMBase_Skeleton(parent, "ChamferDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + myConstructorId = -1; + + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_ALL"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_EDGE"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CHAMFER_FACE"))); + QPixmap iconSelect(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption( tr( "GEOM_CHAMFER_TITLE" ) ); + + GroupConstructors->setTitle( tr( "GEOM_CHAMFER" ) ); + + RadioButton1->setPixmap( image1 ); + RadioButton2->setPixmap( image2 ); + RadioButton3->setPixmap( image3 ); + + // Create first group + + myGrp1 = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_ALL" ), this ); + + QGroupBox* aSelGrp1 = new QGroupBox( 3, Qt::Horizontal, myGrp1 ); + aSelGrp1->setFrameStyle( QFrame::NoFrame ); + aSelGrp1->setInsideMargin( 0 ); + + createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp1, MainObj1 ); + + QGroupBox* aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp1 ); + aSpinGrp->setFrameStyle( QFrame::NoFrame ); + aSpinGrp->setInsideMargin( 0 ); + + new QLabel( tr( "D" ), aSpinGrp ); + mySpinBox[ SpinBox1 ] = new DlgRef_SpinBox( aSpinGrp ); + + ( new QFrame( myGrp1 ) )->setSizePolicy( + QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + + // Create second group + + myGrp2 = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_EDGES" ), this ); + + QGroupBox* aSelGrp2 = new QGroupBox( 3, Qt::Horizontal, myGrp2 ); + aSelGrp2->setFrameStyle( QFrame::NoFrame ); + aSelGrp2->setInsideMargin( 0 ); + + createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp2, MainObj2 ); + createSelWg( tr( "FACE_1" ), iconSelect, aSelGrp2, Face1 ); + createSelWg( tr( "FACE_2" ), iconSelect, aSelGrp2, Face2 ); + + aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp2 ); + aSpinGrp->setFrameStyle( QFrame::NoFrame ); + aSpinGrp->setInsideMargin( 0 ); + + new QLabel( tr( "GEOM_D1" ), aSpinGrp ); + mySpinBox[ SpinBox21 ] = new DlgRef_SpinBox( aSpinGrp ); + + new QLabel( tr( "GEOM_D2" ), aSpinGrp ); + mySpinBox[ SpinBox22 ] = new DlgRef_SpinBox( aSpinGrp ); + + // Create third group + + myGrp3 = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_CHAMFER_FACES" ), this ); + + QGroupBox* aSelGrp3 = new QGroupBox( 3, Qt::Horizontal, myGrp3 ); + aSelGrp3->setFrameStyle( QFrame::NoFrame ); + aSelGrp3->setInsideMargin( 0 ); + + createSelWg( tr( "GEOM_MAIN_OBJECT" ), iconSelect, aSelGrp3, MainObj3 ); + createSelWg( tr( "SELECTED_FACES" ), iconSelect, aSelGrp3, Faces ); + + aSpinGrp = new QGroupBox( 1, Qt::Vertical, myGrp3 ); + aSpinGrp->setFrameStyle( QFrame::NoFrame ); + aSpinGrp->setInsideMargin( 0 ); + + new QLabel( tr( "GEOM_D1" ), aSpinGrp ); + mySpinBox[ SpinBox31 ] = new DlgRef_SpinBox( aSpinGrp ); + + new QLabel( tr( "GEOM_D2" ), aSpinGrp ); + mySpinBox[ SpinBox32 ] = new DlgRef_SpinBox( aSpinGrp ); + + ( new QLabel( myGrp3 ) )->setSizePolicy( + QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + + // Add groups to layout + + Layout1->addWidget( myGrp1, 2, 0 ); + Layout1->addWidget( myGrp2, 2, 0 ); + Layout1->addWidget( myGrp3, 2, 0 ); + + // Set range of spinboxes + + double SpecificStep = 10.0; + QMap< int, DlgRef_SpinBox* >::iterator anIter; + for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter ) + anIter.data()->RangeStepAndValidator( 0.001, 999.999, SpecificStep, 3 ); + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~OperationGUI_ChamferDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_ChamferDlg::~OperationGUI_ChamferDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::Init() +{ + myConstructorId = -1; + reset(); + RadioButton1->setChecked( true ); + myEditCurrentArgument = mySelName[ MainObj1 ]; + + /* signals and slots connections */ + + // main buttons + connect( buttonOk , SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + // group box + connect( GroupConstructors, SIGNAL( clicked( int ) ), + this, SLOT( ConstructorsClicked( int ) ) ); + + // push buttons + QMap< int, QPushButton* >::iterator anIterBtn; + for ( anIterBtn = mySelBtn.begin(); anIterBtn != mySelBtn.end(); ++anIterBtn ) + connect( anIterBtn.data(), SIGNAL( clicked() ), + this, SLOT( SetEditCurrentArgument() ) ); + + // line edits + QMap< int, QLineEdit* >::iterator anIterLE2; + for ( anIterLE2 = mySelName.begin(); anIterLE2 != mySelName.end(); ++anIterLE2 ) + connect( anIterLE2.data(), SIGNAL( returnPressed() ), + this, SLOT( LineEditReturnPressed() ) ); + + // spin boxes + QMap< int, DlgRef_SpinBox* >::iterator anIterSpin; + for ( anIterSpin = mySpinBox.begin(); anIterSpin != mySpinBox.end(); ++anIterSpin ) + connect( anIterSpin.data(), SIGNAL( valueChanged( double ) ), + this, SLOT( ValueChangedInSpinBox( double ) ) ); + + // selection + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + initName( tr( "GEOM_CHAMFER" ) ); + + myGrp2->hide(); + myGrp3->hide(); + myGrp1->show(); + + this->show(); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void OperationGUI_ChamferDlg::ConstructorsClicked( int constructorId ) +{ + // Activate next widget + if ( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type() ) + { + RadioButton1->setChecked( true ); + return; + } + + if ( myConstructorId == constructorId ) + return; + + // Get values from previous widget + double D1 = 5, D2 = 5; + if ( myConstructorId == 0 ) + D1 = D2 = mySpinBox[ SpinBox1 ]->GetValue(); + else if ( myConstructorId == 1 ) + { + D1 = mySpinBox[ SpinBox21 ]->GetValue(); + D2 = mySpinBox[ SpinBox22 ]->GetValue(); + } + else if ( myConstructorId == 2 ) + { + D1 = mySpinBox[ SpinBox31 ]->GetValue(); + D2 = mySpinBox[ SpinBox32 ]->GetValue(); + } + + myConstructorId = constructorId; + + switch ( constructorId ) + { + case 0: + myGrp1->show(); + myGrp2->hide(); + myGrp3->hide(); + mySpinBox[ SpinBox1 ]->SetValue( D1 ); + break; + case 1: + myGrp1->hide(); + myGrp2->show(); + myGrp3->hide(); + mySpinBox[ SpinBox21 ]->SetValue( D1 ); + mySpinBox[ SpinBox22 ]->SetValue( D2 ); + break; + case 2: + myGrp1->hide(); + myGrp2->hide(); + myGrp3->show(); + mySpinBox[ SpinBox31 ]->SetValue( D1 ); + mySpinBox[ SpinBox32 ]->SetValue( D2 ); + break; + default: + break; + } + + if ( constructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ]; + else if ( constructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ]; + else myEditCurrentArgument = mySelName[ MainObj3 ]; + + activateSelection(); + enableWidgets(); + + if ( !myShape->_is_nil() ) + { + myEditCurrentArgument->setText( GEOMBase::GetName( myShape ) ); + GEOMBase_Skeleton::LineEditReturnPressed(); + } + else + myEditCurrentArgument->setText( "" ); + + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool OperationGUI_ChamferDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void OperationGUI_ChamferDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText( "" ); + + // Get index of current selection focus + int aCurrFocus = -1; + QMap< int, QLineEdit* >::iterator anIter; + for ( anIter = mySelName.begin(); anIter != mySelName.end(); ++anIter ) + if ( myEditCurrentArgument == anIter.data() ) + { + aCurrFocus = anIter.key(); + break; + } + + // If selection of main object is activated + if ( aCurrFocus == MainObj1 || aCurrFocus == MainObj2 || aCurrFocus == MainObj3 ) + { + if ( IObjectCount() == 1 ) + { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + { + myShape = anObj; + mySelName[ aCurrFocus ]->setText( GEOMBase::GetName( anObj ) ); + displayPreview(); + enableWidgets(); + return; + } + } + + myShape = GEOM::GEOM_Object::_nil(); + enableWidgets(); + } + // If face selection of second tab is activated + else if ( aCurrFocus == Face1 || aCurrFocus == Face2 ) + { + if ( IObjectCount() == 1 ) + { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + { + TColStd_IndexedMapOfInteger anIndexes; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), anIndexes ); + + if ( anIndexes.Extent() == 1 ) + { + int anIndex = anIndexes( 1 ); + QString aFaceName = QString( GEOMBase::GetName( anObj ) ) + ":%1"; + myEditCurrentArgument->setText( aFaceName.arg( anIndex ) ); + myFace[ aCurrFocus ] = anIndex; + displayPreview(); + return; + } + } + } + + myFace[ aCurrFocus ] = -1; + } + // If face selection of third tab is activated + else if ( aCurrFocus == Faces ) + { + if ( IObjectCount() == 1 ) + { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + { + TColStd_IndexedMapOfInteger anIndexes; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), anIndexes ); + + if ( anIndexes.Extent() > 0 ) + { + QString aFaceName; + if ( anIndexes.Extent() == 1 ) + { + int anIndex = anIndexes( 1 ); + + aFaceName = QString( GEOMBase::GetName( anObj ) ) + QString( ":%1" ).arg( anIndex ); + } + else + aFaceName = tr( "GEOM_MEN_POPUP_NAME" ).arg( anIndexes.Extent() ); + + myEditCurrentArgument->setText( aFaceName ); + myFaces = anIndexes; + displayPreview(); + return; + } + } + } + myFaces.Clear(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::LineEditReturnPressed() +{ + QLineEdit* aSender = ( QLineEdit* )sender(); + + QMap< int, QLineEdit* >::iterator anIterLE; + for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE ) + if ( anIterLE.data() == aSender ) + myEditCurrentArgument = anIterLE.data(); + + GEOMBase_Skeleton::LineEditReturnPressed(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::SetEditCurrentArgument() +{ + QPushButton* aSender = ( QPushButton* )sender(); + + QMap< int, QPushButton* >::iterator anIter; + for ( anIter = mySelBtn.begin(); anIter != mySelBtn.end(); ++anIter ) + if ( anIter.data() == aSender ) + { + mySelName[ anIter.key() ]->setFocus(); + myEditCurrentArgument = mySelName[ anIter.key() ]; + } + + activateSelection(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::DeactivateActiveDialog() +{ + // disconnect selection + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT( SelectionIntoArgument() ) ); + + activateSelection(); + displayPreview(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + this->ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::ValueChangedInSpinBox( double newValue ) +{ + displayPreview(); +} + + +//================================================================================= +// function : createSelWg() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::createSelWg( const QString& theLbl, + QPixmap& thePix, + QWidget* theParent, + const int theId ) +{ + new QLabel( theLbl, theParent ); + mySelBtn[ theId ] = new QPushButton( theParent ); + mySelBtn[ theId ]->setPixmap( thePix ); + mySelName[ theId ] = new QLineEdit( theParent ); + mySelName[ theId ]->setReadOnly( true ); +} + +//================================================================================= +// function : reset() +// purpose : +//================================================================================= +void OperationGUI_ChamferDlg::reset() +{ + // Set Initial values of spinboxes + QMap< int, DlgRef_SpinBox* >::iterator anIter; + for ( anIter = mySpinBox.begin(); anIter != mySpinBox.end(); ++anIter ) + anIter.data()->SetValue( 5 ); + + // clear line edits + QMap< int, QLineEdit* >::iterator anIterLE; + for ( anIterLE = mySelName.begin(); anIterLE != mySelName.end(); ++anIterLE ) + anIterLE.data()->setText( "" ); + + // constructor id + int aConstructorId = getConstructorId(); + + if ( aConstructorId == 0 ) myEditCurrentArgument = mySelName[ MainObj1 ]; + else if ( aConstructorId == 1 ) myEditCurrentArgument = mySelName[ MainObj2 ]; + else myEditCurrentArgument = mySelName[ MainObj3 ]; + + myShape = GEOM::GEOM_Object::_nil(); + + myFaces.Clear(); + myFace[ Face1 ] = -1; + myFace[ Face2 ] = -1; + + erasePreview( true ); + + activateSelection(); + + enableWidgets(); +} + +//================================================================================= +// function : getConstructorId() +// purpose : +//================================================================================= +int OperationGUI_ChamferDlg::getConstructorId() const +{ + return GroupConstructors->id( GroupConstructors->selected() ); +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void OperationGUI_ChamferDlg::activateSelection() +{ + if ( !myShape->_is_nil() && + ( myEditCurrentArgument == mySelName[ Face1 ] || + myEditCurrentArgument == mySelName[ Face2 ] || + myEditCurrentArgument == mySelName[ Faces ] ) ) + localSelection( myShape, TopAbs_FACE ); + else + { + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_SOLID ); + aMap.Add( GEOM_COMPOUND ); + globalSelection( aMap ); + } + + SelectionIntoArgument(); +} + +//================================================================================= +// function : enableWidgets +// purpose : Enable widgets of faces in accordance with value of main object +//================================================================================= +void OperationGUI_ChamferDlg::enableWidgets() +{ + int anId = getConstructorId(); + + bool toEnable = !myShape->_is_nil(); + + if ( anId == 1 ) + { + mySelName[ Face1 ]->setEnabled( toEnable ); + mySelName[ Face2 ]->setEnabled( toEnable ); + mySelBtn[ Face1 ]->setEnabled( toEnable ); + mySelBtn[ Face2 ]->setEnabled( toEnable ); + + if ( !toEnable ) + { + mySelName[ Face1 ]->setText( "" ); + mySelName[ Face2 ]->setText( "" ); + myFace[ Face1 ] = -1; + myFace[ Face2 ] = -1; + } + } + else if ( anId == 2 ) + { + mySelName[ Faces ]->setEnabled( toEnable ); + + if ( !toEnable ) + myFaces.Clear(); + } +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr OperationGUI_ChamferDlg::createOperation() +{ + return getGeomEngine()->GetILocalOperations( getStudyId() ); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : Verify validity of input data +//================================================================================= +bool OperationGUI_ChamferDlg::isValid( QString& ) +{ + switch ( getConstructorId() ) + { + case 0: return !myShape->_is_nil(); + case 1: return !myShape->_is_nil() && myFace[ Face1 ] > 0 && myFace[ Face2 ] > 0; + case 2: return !myShape->_is_nil() && myFaces.Extent() > 0; + default: return false; + } +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool OperationGUI_ChamferDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + int anId = getConstructorId(); + if ( anId == 0 ) + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeChamferAll( myShape, + mySpinBox[ SpinBox1 ]->GetValue() ); + else if ( anId == 1 ) + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeChamferEdge( myShape, + mySpinBox[ SpinBox21 ]->GetValue(), + mySpinBox[ SpinBox22 ]->GetValue(), + myFace[ Face1 ], + myFace[ Face2 ] ); + else if ( anId == 2 ) + { + + int i = 0; + GEOM::ListOfLong_var anArray = new GEOM::ListOfLong; + anArray->length( myFaces.Extent() ); + + + for ( int i = 1, n = myFaces.Extent(); i <= n; i++ ) + anArray[ i - 1 ] = myFaces( i ); + + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeChamferFaces( myShape, + mySpinBox[ SpinBox31 ]->GetValue(), + mySpinBox[ SpinBox32 ]->GetValue(), + anArray ); + } + + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + + + + + + + + diff --git a/src/OperationGUI/OperationGUI_ClippingDlg.cxx b/src/OperationGUI/OperationGUI_ClippingDlg.cxx new file mode 100644 index 000000000..191eb88c2 --- /dev/null +++ b/src/OperationGUI/OperationGUI_ClippingDlg.cxx @@ -0,0 +1,403 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : OperationGUI_ClippingDlg.cxx +// Author : Michael Zorin +// Module : GEOM +// $Header: + +#include "OperationGUI_ClippingDlg.h" +#include "DlgRef_SpinBox.h" + +#include "SUIT_Session.h" +#include "SUIT_ViewWindow.h" +#include "SVTK_ViewWindow.h" +#include "SVTK_ViewModel.h" +#include "OCCViewer_ViewWindow.h" +#include "OCCViewer_ViewPort3d.h" + +#include "utilities.h" +#include +#include + +//#include + +// QT Includes +#include +#include +#include +#include +#include + +// VTK Includes +#include +#include + +//================================================================================= +// class : OperationGUI_ClippingDlg() +// purpose : +//================================================================================= +OperationGUI_ClippingDlg::OperationGUI_ClippingDlg( QWidget* parent, const char* name, bool modal, WFlags fl ) + : GEOMBase_Skeleton( parent, "OperationGUI_ClippingDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + setCaption( tr( "Change clipping range" ) ); + + GroupConstructors->close(); + GroupBoxName->close(); + + /***************************************************************/ + GroupArguments = new QGroupBox( this, "GroupArguments" ); + GroupArguments->setColumnLayout(0, Qt::Vertical ); + GroupArguments->layout()->setSpacing( 0 ); + GroupArguments->layout()->setMargin( 0 ); + QGridLayout* GroupArgumentsLayout = new QGridLayout( GroupArguments->layout() ); + GroupArgumentsLayout->setAlignment( Qt::AlignTop ); + GroupArgumentsLayout->setSpacing( 6 ); + GroupArgumentsLayout->setMargin( 11 ); + + // Controls + TextLabelNear = new QLabel( GroupArguments, "TextLabelNear" ); + TextLabelNear->setText( tr( "Near" ) ); + TextLabelNear->setFixedWidth(74); + GroupArgumentsLayout->addWidget( TextLabelNear, 0, 0 ); + + SpinBox_Near = new DlgRef_SpinBox( GroupArguments, "SpinBox_Near"); + GroupArgumentsLayout->addWidget( SpinBox_Near, 0, 1 ); + + TextLabelFar = new QLabel( GroupArguments, "TextLabelFar" ); + TextLabelFar->setText( tr( "Far" ) ); + TextLabelFar->setFixedWidth(74); + GroupArgumentsLayout->addWidget( TextLabelFar, 0, 2 ); + + SpinBox_Far = new DlgRef_SpinBox( GroupArguments, "SpinBox_Far"); + GroupArgumentsLayout->addWidget( SpinBox_Far, 0, 3 ); + + resetButton = new QPushButton( GroupArguments, "resetButton" ); + resetButton->setText( tr( "Reset" ) ); + GroupArgumentsLayout->addWidget( resetButton, 0, 4 ); + + TypeCB = new QComboBox( GroupArguments, "TypeCB" ); + TypeCB->insertItem(tr("OFF")); + TypeCB->insertItem(tr("BACK")); + TypeCB->insertItem(tr("FRONT")); + TypeCB->insertItem(tr("SLICE")); + GroupArgumentsLayout->addMultiCellWidget( TypeCB, 1, 1, 0, 4 ); + + Layout1->addWidget( GroupArguments, 2, 0 ); + + /* Initialisations */ + SpinBox_Near->RangeStepAndValidator( -999999.999, +999999.999, 10.0, 3 ); + SpinBox_Far->RangeStepAndValidator( -999999.999, +999999.999, 10.0, 3 ); + + //GeometryGUI* aGeomGUI = GeometryGUI::GetGeomGUI(); + + /* signals and slots connections */ + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ; + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( resetButton, SIGNAL (clicked() ), this, SLOT( onReset() ) ) ; + + // connect( aGeomGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( onDeactivate() ) ) ; + //connect( aGeomGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; + + Init(); +} + +//================================================================================= +// function : ~ OperationGUI_ClippingDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_ClippingDlg::~ OperationGUI_ClippingDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::Init() +{ + SUIT_ViewWindow* anActiveWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + if (!anActiveWindow) + return; + + if ( anActiveWindow->getViewManager()->getType() == SVTK_Viewer::Type() ) + { + SVTK_ViewWindow* aVTKFrame = dynamic_cast( anActiveWindow ); + if( !aVTKFrame ) + return; + + TextLabelNear->setText( tr( "Near" ) ); + TextLabelFar->setText( tr( "Far" ) ); + + TypeCB->hide(); + + vtkRenderer* aRenderer = aVTKFrame->getRenderer(); + if(!aRenderer) return; + + vtkCamera* anActiveCamera = aRenderer->GetActiveCamera(); + if( anActiveCamera == NULL ){ + MESSAGE("Trying to reset clipping range of non-existant camera"); + return; + } + + // Find the plane equation for the camera view plane + double vn[3]; + anActiveCamera->GetViewPlaneNormal(vn); + double position[3]; + anActiveCamera->GetPosition(position); + + float bounds[6]; + aRenderer->ComputeVisiblePropBounds(bounds); + + double center[3]; + center[0] = (bounds[0] + bounds[1])/2.0; + center[1] = (bounds[2] + bounds[3])/2.0; + center[2] = (bounds[4] + bounds[5])/2.0; + + double width = sqrt((bounds[1]-bounds[0])*(bounds[1]-bounds[0]) + + (bounds[3]-bounds[2])*(bounds[3]-bounds[2]) + + (bounds[5]-bounds[4])*(bounds[5]-bounds[4])); + + double distance = sqrt((position[0]-center[0])*(position[0]-center[0]) + + (position[1]-center[1])*(position[1]-center[1]) + + (position[2]-center[2])*(position[2]-center[2])); + + float range[2] = {distance - width/2.0, distance + width/2.0}; + + SpinBox_Near->SetValue(range[0]); + SpinBox_Far->SetValue(range[1]); + + return; + } + else if ( anActiveWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) + { + OCCViewer_ViewWindow* aOCCFrame = dynamic_cast( anActiveWindow ); + + TextLabelNear->setText( tr( "Depth" ) ); + TextLabelFar->setText( tr( "Thickness" ) ); + + Handle(V3d_View) view3d = ((OCCViewer_ViewPort3d*)aOCCFrame->getViewPort())->getView(); + + double depth, thickness; + int ztype= view3d->ZClipping(depth, thickness); + SpinBox_Near->SetValue(depth); + SpinBox_Far->SetValue(thickness); + TypeCB->setCurrentItem(ztype); + + //Handle(V3d_Plane) aPlane = new V3d_Plane( aOCCFrame->getViewer()->getViewer3d() ,0, 0, 1, -100); + //aPlane->Display(view3d); + } +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool OperationGUI_ClippingDlg::ClickOnApply() +{ + SUIT_ViewWindow* anActiveWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + if (!anActiveWindow) + return false; + + if ( anActiveWindow->getViewManager()->getType() == SVTK_Viewer::Type() ) + { + SVTK_ViewWindow* aVTKFrame = dynamic_cast( anActiveWindow ); + if( !aVTKFrame ) + return false; + + vtkRenderer* aRenderer = aVTKFrame->getRenderer(); + if(!aRenderer) return false; + + vtkCamera* anActiveCamera = aRenderer->GetActiveCamera(); + if( anActiveCamera == NULL ){ + MESSAGE("Trying to reset clipping range of non-existant camera"); + return false; + } + + float range[2] = { SpinBox_Near->GetValue(), SpinBox_Far->GetValue() }; + if (range[0] < 0.0) range[0] = 0.0; + anActiveCamera->SetClippingRange( range ); + + return true; + } + else if ( anActiveWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) + { + OCCViewer_ViewWindow* aOCCFrame = dynamic_cast( anActiveWindow ); + + Handle(V3d_View) view3d = ((OCCViewer_ViewPort3d*)aOCCFrame->getViewPort())->getView(); + + double depth = SpinBox_Near->GetValue(); + double thickness = SpinBox_Far->GetValue(); + int aType = TypeCB->currentItem(); + + view3d->SetZClippingType(V3d_TypeOfZclipping(aType)); + view3d->SetZClippingDepth(depth); + view3d->SetZClippingWidth(thickness); + } + + return true; +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::ClickOnOk() +{ + ClickOnApply(); + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : onActivate() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::onActivate() +{ + GEOMBase_Skeleton::ActivateThisDialog(); +} + + +//================================================================================= +// function : onDeactivate() +// purpose : public slot to deactivate if active +//================================================================================= +void OperationGUI_ClippingDlg::DeactivateActiveDialog() +{ + return; +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::enterEvent(QEvent* e) +{ + this->setEnabled(true); + return; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::closeEvent( QCloseEvent* e ) +{ + QDialog::closeEvent( e ); +} + + +//================================================================================= +// function : onReset() +// purpose : +//================================================================================= +void OperationGUI_ClippingDlg::onReset() +{ + SUIT_ViewWindow* anActiveWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + if (!anActiveWindow) + return; + + if ( anActiveWindow->getViewManager()->getType() == SVTK_Viewer::Type() ) + { + SVTK_ViewWindow* aVTKFrame = dynamic_cast( anActiveWindow ); + if( !aVTKFrame ) + return; + + vtkRenderer* aRenderer = aVTKFrame->getRenderer(); + if(!aRenderer) return; + + vtkCamera* anActiveCamera = aRenderer->GetActiveCamera(); + if( anActiveCamera == NULL ){ + MESSAGE("Trying to reset clipping range of non-existant camera"); + return; + } + + // Find the plane equation for the camera view plane + double vn[3]; + anActiveCamera->GetViewPlaneNormal(vn); + double position[3]; + anActiveCamera->GetPosition(position); + + float bounds[6]; + aRenderer->ComputeVisiblePropBounds(bounds); + + double center[3]; + center[0] = (bounds[0] + bounds[1])/2.0; + center[1] = (bounds[2] + bounds[3])/2.0; + center[2] = (bounds[4] + bounds[5])/2.0; + + double width = sqrt((bounds[1]-bounds[0])*(bounds[1]-bounds[0]) + + (bounds[3]-bounds[2])*(bounds[3]-bounds[2]) + + (bounds[5]-bounds[4])*(bounds[5]-bounds[4])); + + double distance = sqrt((position[0]-center[0])*(position[0]-center[0]) + + (position[1]-center[1])*(position[1]-center[1]) + + (position[2]-center[2])*(position[2]-center[2])); + + float range[2] = {distance - width/2.0, distance + width/2.0}; + + SpinBox_Near->SetValue(range[0]); + SpinBox_Far->SetValue(range[1]); + + return; + } + else if ( anActiveWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) + { + OCCViewer_ViewWindow* aOCCFrame = dynamic_cast( anActiveWindow ); + + TextLabelNear->setText( tr( "Depth" ) ); + TextLabelFar->setText( tr( "Thickness" ) ); + + Handle(V3d_View) view3d = ((OCCViewer_ViewPort3d*)aOCCFrame->getViewPort())->getView(); + + view3d->SetZClippingType(V3d_TypeOfZclipping(0)); + view3d->ZFitAll(); + double depth, thickness; + int ztype= view3d->ZClipping(depth, thickness); + SpinBox_Near->SetValue(0); + SpinBox_Far->SetValue(1000); + TypeCB->setCurrentItem(ztype); + } + + + + return; +} diff --git a/src/OperationGUI/OperationGUI_FilletDlg.cxx b/src/OperationGUI/OperationGUI_FilletDlg.cxx new file mode 100644 index 000000000..583aad057 --- /dev/null +++ b/src/OperationGUI/OperationGUI_FilletDlg.cxx @@ -0,0 +1,635 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : OperationGUI_FilletDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "OperationGUI_FilletDlg.h" +#include "DlgRef_1Sel1Spin.h" +#include "DlgRef_2Sel1Spin.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "OCCViewer_ViewModel.h" + +#include "qlabel.h" +#include "qpixmap.h" +#include +#include +#include + +#include "GEOMImpl_Types.hxx" + +//================================================================================= +// class : OperationGUI_FilletDlg() +// purpose : Constructs a OperationGUI_FilletDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_FilletDlg::OperationGUI_FilletDlg( QWidget* parent ) + :GEOMBase_Skeleton( parent, "OperationGUI_FilletDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + myConstructorId = -1; + + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_FILLET_ALL" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_FILLET_EDGE" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_FILLET_FACE" ) ) ); + + QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + + setCaption( tr( "GEOM_FILLET_TITLE" ) ); + + /***************************************************************/ + GroupConstructors->setTitle( tr( "GEOM_FILLET" ) ); + RadioButton1->setPixmap( image0 ); + RadioButton2->setPixmap( image1 ); + RadioButton3->setPixmap( image2 ); + + Group1 = new DlgRef_1Sel1Spin( this, "Group1" ); + Group1->GroupBox1->setTitle( tr( "GEOM_FILLET_ALL" ) ); + Group1->TextLabel1->setText( tr( "GEOM_MAIN_OBJECT" ) ); + Group1->TextLabel2->setText( tr( "GEOM_RADIUS" ) ); + Group1->PushButton1->setPixmap( iconSelect ); + Group1->LineEdit1->setReadOnly( true ); + + Group2 = new DlgRef_2Sel1Spin( this, "Group2" ); + Group2->GroupBox1->setTitle( tr( "GEOM_FILLET_EDGES" ) ); + Group2->TextLabel1->setText( tr( "GEOM_MAIN_OBJECT" ) ); + Group2->TextLabel2->setText( tr( "SELECTED_EDGES" ) ); + Group2->TextLabel3->setText( tr( "GEOM_RADIUS" ) ); + Group2->PushButton1->setPixmap( iconSelect ); + Group2->PushButton2->setPixmap( iconSelect ); + Group2->LineEdit1->setReadOnly( true ); + Group2->LineEdit2->setReadOnly( true ); + + Group3 = new DlgRef_2Sel1Spin( this, "Group3" ); + Group3->GroupBox1->setTitle(tr( "GEOM_FILLET_FACES" ) ); + Group3->TextLabel1->setText(tr( "GEOM_MAIN_OBJECT" ) ); + Group3->TextLabel2->setText(tr( "SELECTED_FACES" ) ); + Group3->TextLabel3->setText(tr( "GEOM_RADIUS" ) ); + Group3->PushButton1->setPixmap( iconSelect ); + Group3->PushButton2->setPixmap( iconSelect ); + Group3->LineEdit1->setReadOnly( true ); + Group3->LineEdit2->setReadOnly( true ); + + Layout1->addWidget( Group1, 2, 0 ); + Layout1->addWidget( Group2, 2, 0 ); + Layout1->addWidget( Group3, 2, 0 ); + /***************************************************************/ + + double SpecificStep = 10.0; + Group1->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3); + Group2->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3); + Group3->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, SpecificStep, 3); + + /* Initialisations */ + Init(); +} + + +//================================================================================= +// function : ~OperationGUI_FilletDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_FilletDlg::~OperationGUI_FilletDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::Init() +{ + myConstructorId = -1; + reset(); + RadioButton1->setChecked( true ); + myEditCurrentArgument = Group1->LineEdit1; + + // main buttons + connect( buttonOk , SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + // group box + connect( GroupConstructors, SIGNAL( clicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + + // push buttons + connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group2->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group3->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + // line edits + connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group3->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + // spin boxes + connect(Group1->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group2->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(Group3->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + // selection + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + + initName( tr( "GEOM_FILLET" ) ); + + Group2->hide(); + Group3->hide(); + Group1->show(); + + this->show(); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void OperationGUI_FilletDlg::ConstructorsClicked( int constructorId ) +{ + if ( SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type() ) + { + RadioButton1->setChecked( true ); + return; + } + + if ( myConstructorId == constructorId ) + return; + + // Get radius from previous widget + double R = 5; + if ( myConstructorId == 0 ) R = Group1->SpinBox_DX->GetValue(); + else if ( myConstructorId == 1 ) R = Group2->SpinBox_DX->GetValue(); + else R = Group3->SpinBox_DX->GetValue(); + + myConstructorId = constructorId; + + switch ( constructorId ) + { + case 0: + Group1->show(); + Group2->hide(); + Group3->hide(); + Group1->SpinBox_DX->SetValue( R ); + break; + case 1: + Group1->hide(); + Group2->show(); + Group3->hide(); + Group2->SpinBox_DX->SetValue( R ); + break; + case 2: + Group1->hide(); + Group2->hide(); + Group3->show(); + Group3->SpinBox_DX->SetValue( R ); + break; + default: + break; + } + + if ( constructorId == 0 ) myEditCurrentArgument = Group1->LineEdit1; + else if ( constructorId == 1 ) myEditCurrentArgument = Group2->LineEdit1; + else myEditCurrentArgument = Group3->LineEdit1; + + activateSelection(); + enableWidgets(); + + if ( !myShape->_is_nil() ) + { + myEditCurrentArgument->setText( GEOMBase::GetName( myShape ) ); + GEOMBase_Skeleton::LineEditReturnPressed(); + } + else + myEditCurrentArgument->setText( "" ); + + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool OperationGUI_FilletDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void OperationGUI_FilletDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText( "" ); + + // If selection of main object is activated + if ( myEditCurrentArgument == Group1->LineEdit1 || + myEditCurrentArgument == Group2->LineEdit1 || + myEditCurrentArgument == Group3->LineEdit1 ) + { + if ( IObjectCount() == 1 ) + { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + { + myShape = anObj; + myEditCurrentArgument->setText( GEOMBase::GetName( anObj ) ); + displayPreview(); + enableWidgets(); + return; + } + } + + myShape = GEOM::GEOM_Object::_nil(); + enableWidgets(); + } + // If face or edge selection is activated + else if ( myEditCurrentArgument == Group2->LineEdit2 || + myEditCurrentArgument == Group3->LineEdit2 ) + { + if ( IObjectCount() == 1 ) + { + Standard_Boolean aResult = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), aResult ); + + if ( aResult && !anObj->_is_nil() ) + { + TColStd_IndexedMapOfInteger anIndexes; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( firstIObject(), anIndexes ); + + if ( anIndexes.Extent() > 0 ) + { + QString aName; + if ( anIndexes.Extent() == 1 ) + { + int anIndex = anIndexes( 1 ); + + aName = QString( GEOMBase::GetName( anObj ) ) + QString( ":%1" ).arg( anIndex ); + } + else + aName = tr( "GEOM_MEN_POPUP_NAME" ).arg( anIndexes.Extent() ); + + myEditCurrentArgument->setText( aName ); + + if ( myConstructorId == 1 ) + myEdges = anIndexes; + else + myFaces = anIndexes; + + displayPreview(); + return; + } + } + } + myFaces.Clear(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::LineEditReturnPressed() +{ + QLineEdit* send = ( QLineEdit* )sender(); + + if ( send == Group1->LineEdit1 ) + myEditCurrentArgument = Group1->LineEdit1; + else if ( send == Group2->LineEdit1 ) + myEditCurrentArgument = Group2->LineEdit1; + else if ( send == Group3->LineEdit1 ) + myEditCurrentArgument = Group3->LineEdit1; + else + return; + + GEOMBase_Skeleton::LineEditReturnPressed(); + return; +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if ( send == Group1->PushButton1 ) + { + Group1->LineEdit1->setFocus(); + myEditCurrentArgument = Group1->LineEdit1; + } + else if( send == Group2->PushButton1 ) + { + Group2->LineEdit1->setFocus(); + myEditCurrentArgument = Group2->LineEdit1; + } + else if( send == Group2->PushButton2 ) + { + Group2->LineEdit2->setFocus(); + myEditCurrentArgument = Group2->LineEdit2; + } + else if ( send == Group3->PushButton1 ) + { + Group3->LineEdit1->setFocus(); + myEditCurrentArgument = Group3->LineEdit1; + } + else if( send == Group3->PushButton2 ) + { + Group3->LineEdit1->setFocus(); + myEditCurrentArgument = Group3->LineEdit2; + } + + activateSelection(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); + return; +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT( SelectionIntoArgument() ) ); + + activateSelection(); + displayPreview(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::enterEvent( QEvent* e ) +{ + if ( !GroupConstructors->isEnabled() ) + this->ActivateThisDialog(); +} + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::ValueChangedInSpinBox( double newValue ) +{ + displayPreview(); +} + +//================================================================================= +// function : reset() +// purpose : +//================================================================================= +void OperationGUI_FilletDlg::reset() +{ + // Set Initial values of spinboxes + Group1->SpinBox_DX->SetValue( 5 ); + Group2->SpinBox_DX->SetValue( 5 ); + Group3->SpinBox_DX->SetValue( 5 ); + + Group1->LineEdit1->setText( "" ); + Group2->LineEdit1->setText( "" ); + Group2->LineEdit2->setText( "" ); + Group3->LineEdit1->setText( "" ); + Group3->LineEdit2->setText( "" ); + + // constructor id + int aConstructorId = getConstructorId(); + + if ( aConstructorId == 0 ) myEditCurrentArgument = Group1->LineEdit1; + else if ( aConstructorId == 1 ) myEditCurrentArgument = Group2->LineEdit1; + else myEditCurrentArgument = Group3->LineEdit1; + + myShape = GEOM::GEOM_Object::_nil(); + + myFaces.Clear(); + myEdges.Clear(); + + erasePreview( true ); + + activateSelection(); + + enableWidgets(); +} + +//================================================================================= +// function : getConstructorId() +// purpose : +//================================================================================= +int OperationGUI_FilletDlg::getConstructorId() const +{ + return GroupConstructors->id( GroupConstructors->selected() ); +} + +//================================================================================= +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void OperationGUI_FilletDlg::activateSelection() +{ + + if ( !myShape->_is_nil() && myEditCurrentArgument == Group2->LineEdit2 ) + localSelection( myShape, TopAbs_EDGE ); + else if ( !myShape->_is_nil() && myEditCurrentArgument == Group3->LineEdit2 ) + localSelection( myShape, TopAbs_FACE ); + else + { + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_SOLID ); + aMap.Add( GEOM_COMPOUND ); + globalSelection( aMap ); + } + + SelectionIntoArgument(); +} + +//================================================================================= +// function : enableWidgets +// purpose : Enable widgets of faces in accordance with value of main object +//================================================================================= +void OperationGUI_FilletDlg::enableWidgets() +{ + int anId = getConstructorId(); + + bool toEnable = !myShape->_is_nil(); + + if ( anId == 1 ) + { + Group2->LineEdit2->setEnabled( toEnable ); + Group2->PushButton2->setEnabled( toEnable ); + + if ( !toEnable ) + { + Group2->LineEdit2->setText( "" ); + myEdges.Clear(); + } + } + else if ( anId == 2 ) + { + Group3->LineEdit2->setEnabled( toEnable ); + Group3->PushButton2->setEnabled( toEnable ); + + if ( !toEnable ) + { + Group3->LineEdit2->setText( "" ); + myFaces.Clear(); + } + } +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr OperationGUI_FilletDlg::createOperation() +{ + return getGeomEngine()->GetILocalOperations( getStudyId() ); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : Verify validity of input data +//================================================================================= +bool OperationGUI_FilletDlg::isValid( QString& ) +{ + switch ( getConstructorId() ) + { + case 0: return !myShape->_is_nil(); + case 1: return !myShape->_is_nil() && myEdges.Extent() > 0; + case 2: return !myShape->_is_nil() && myFaces.Extent() > 0; + default: return false; + } +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool OperationGUI_FilletDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj; + + int anId = getConstructorId(); + if ( anId == 0 ) + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeFilletAll( myShape, + getRadius() ); + else if ( anId == 1 ) + { + GEOM::ListOfLong_var aList = new GEOM::ListOfLong; + aList->length( myEdges.Extent() ); + + for ( int i = 1, n = myEdges.Extent(); i <= n; i++ ) + aList[ i - 1 ] = myEdges( i ); + + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeFilletEdges( myShape, getRadius(), aList ); + } + else if ( anId == 2 ) + { + int i = 0; + GEOM::ListOfLong_var aList = new GEOM::ListOfLong; + aList->length( myFaces.Extent() ); + + for ( int i = 1, n = myFaces.Extent(); i <= n; i++ ) + aList[ i - 1 ] = myFaces( i ); + + anObj = GEOM::GEOM_ILocalOperations::_narrow( + getOperation() )->MakeFilletFaces( myShape, getRadius(), aList ); + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + +//================================================================================= +// function : getRadius +// purpose : Get radius +//================================================================================= +double OperationGUI_FilletDlg::getRadius() const +{ + int anId = getConstructorId(); + if ( anId == 0 ) return Group1->SpinBox_DX->GetValue(); + else if ( anId == 1 ) return Group2->SpinBox_DX->GetValue(); + else return Group3->SpinBox_DX->GetValue(); +} + + + + + + + diff --git a/src/OperationGUI/OperationGUI_MaterialDlg.cxx b/src/OperationGUI/OperationGUI_MaterialDlg.cxx new file mode 100644 index 000000000..b3055d38d --- /dev/null +++ b/src/OperationGUI/OperationGUI_MaterialDlg.cxx @@ -0,0 +1,238 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 CEA +// +// 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.org +// +// +// +// File : OperationGUI_MaterialDlg.cxx +// Author : Julia DOROVSKIKH +// Module : GEOM +// $Header$ + +#include "OperationGUI_MaterialDlg.h" +#include "OperationGUI_PartitionDlg.h" + +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include "utilities.h" + +#include +#include +#include + +using namespace std; + +//================================================================================= +// class : OperationGUI_MaterialDlg() +// purpose : Constructs a OperationGUI_MaterialDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_MaterialDlg::OperationGUI_MaterialDlg (QWidget* parent, const char* name, + GEOM::ListOfGO ListShapes, + bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + myListShapes = ListShapes; + myParentDlg = parent; + + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PARTITION"))); + + setCaption(tr("GEOM_MATERIAL_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PARTITION")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1List1Spin1Btn_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_PARTITION")); + + myShapeCol = GroupPoints->ListView1->addColumn(tr("GEOM_MATERIAL_SHAPE")); + myMaterCol = GroupPoints->ListView1->addColumn(tr("GEOM_MATERIAL_MATERIAL")); + GroupPoints->ListView1->setSelectionMode(QListView::Extended); + + GroupPoints->TextLabel1->setText(tr("GEOM_MATERIAL_ID")); + GroupPoints->PushButton1->setText(tr("GEOM_MATERIAL_SET")); + + Layout1->addWidget(GroupPoints, 1, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~OperationGUI_MaterialDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_MaterialDlg::~OperationGUI_MaterialDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_MaterialDlg::Init() +{ + // get materials list from the parent dialog + OperationGUI_PartitionDlg* aParentDlg = + dynamic_cast(myParentDlg); + if (aParentDlg) + myListMaterials = aParentDlg->GetListMaterials(); + + /* list filling */ + MESSAGE("Filling list with " << myListShapes.length() << " objects"); + QString aMaterialId; + for (int ind = 0; ind < myListShapes.length(); ind++) { + GEOM::GEOM_Object_var anObject = myListShapes[ind]; + if (!anObject->_is_nil()) { + MESSAGE("Insert " << GEOMBase::GetName( anObject )); + if (ind < myListMaterials.length()) + aMaterialId = QString::number(myListMaterials[ind]); + else + aMaterialId = "0"; + QListViewItem* aItem = + new QListViewItem(GroupPoints->ListView1, GEOMBase::GetName( anObject ), aMaterialId); + } + } + MESSAGE("Filled"); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + buttonApply->close(TRUE); + buttonCancel->setText(tr("GEOM_BUT_CANCEL")); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetMaterial())); + +// connect(GroupPoints->ListView1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); +// connect(GroupPoints->SpinBox1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + /* displays Dialog */ + MESSAGE("GroupPoints->show() ..."); + GroupPoints->show(); + MESSAGE("this->show() ..."); + this->show(); + MESSAGE("return"); + + return; +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void OperationGUI_MaterialDlg::ClickOnOk() +{ + SUIT_Session::session()->activeApplication()->putInfo(tr("")); + + int nbSh = myListShapes.length(); + myListMaterials.length(nbSh); + + QListViewItemIterator it (GroupPoints->ListView1); + for (int i = 0; it.current() != 0; it++, i++) { + QString aMatIdStr = it.current()->text(myMaterCol); + myListMaterials[i] = aMatIdStr.toInt(); + MESSAGE("For shape # " << i << " material ID = " << myListMaterials[i]); + } + + // set materials list to the parent dialog + OperationGUI_PartitionDlg* aParentDlg = + dynamic_cast(myParentDlg); + if (aParentDlg) + { + aParentDlg->SetListMaterials(myListMaterials); + } + + ClickOnCancel(); + return; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void OperationGUI_MaterialDlg::SelectionIntoArgument() +{ + QString aString = ""; /* name of selection */ + + int nbSel = myGeomBase->GetNameOfSelectedIObjects(selectedIO(), aString); + if(nbSel < 1) { + return; + } + + //myGeomBase->ConvertListOfIOInListOfIOR(selectedIO(), myListShapes); + + /* no simulation */ + return; +} + + +//================================================================================= +// function : SetMaterial() +// purpose : +//================================================================================= +void OperationGUI_MaterialDlg::SetMaterial() +{ + int aMatId = GroupPoints->SpinBox1->value(); + QString aMatIdStr; + aMatIdStr.setNum(aMatId); + QListViewItemIterator it (GroupPoints->ListView1); + for (; it.current() != 0; it++) { + if (it.current()->isSelected()) + it.current()->setText(myMaterCol, aMatIdStr); + } + return; +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_MaterialDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + return; +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_MaterialDlg::enterEvent(QEvent* e) +{ + if(!GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} diff --git a/src/OperationGUI/OperationGUI_PartitionDlg.cxx b/src/OperationGUI/OperationGUI_PartitionDlg.cxx new file mode 100644 index 000000000..9315616f4 --- /dev/null +++ b/src/OperationGUI/OperationGUI_PartitionDlg.cxx @@ -0,0 +1,554 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : OperationGUI_PartitionDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "OperationGUI_PartitionDlg.h" +#include "OperationGUI_MaterialDlg.h" + +#include "GEOMImpl_Types.hxx" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include +#include + +#include "utilities.h" + +//================================================================================= +// class : OperationGUI_PartitionDlg() +// purpose : Constructs a OperationGUI_PartitionDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +OperationGUI_PartitionDlg::OperationGUI_PartitionDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PARTITION"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_PARTITION_PLANE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_PARTITION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_PARTITION")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + // Full partition (contains half-space partition) + GroupPoints = new DlgRef_4Sel1List1Check_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_PARTITION")); + GroupPoints->GroupBox2->setTitle(tr("SUPPRESS_RESULT")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_TOOL_OBJECT")); + GroupPoints->TextLabel3->setText(tr("GEOM_RECONSTRUCTION_LIMIT")); + GroupPoints->TextLabel4->setText(tr("GEOM_SUPPRESS_RESULT_INSIDE")); + GroupPoints->TextLabel5->setText(tr("GEOM_SUPPRESS_RESULT_OUTSIDE")); + GroupPoints->CheckBox1->setText(tr("GEOM_REMOVE_WEBS")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + GroupPoints->PushButton3->setPixmap(image2); + GroupPoints->PushButton4->setPixmap(image2); + GroupPoints->PushButton5->setText(tr("GEOM_SET_MATERIALS")); + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + GroupPoints->LineEdit3->setReadOnly( true ); + GroupPoints->LineEdit4->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~OperationGUI_PartitionDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +OperationGUI_PartitionDlg::~OperationGUI_PartitionDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::Init() +{ + /* type for sub shape selection */ + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_SOLID")); + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_SHELL")); + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_FACE")); + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_WIRE")); + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_EDGE")); + GroupPoints->ComboBox1->insertItem(tr("GEOM_RECONSTRUCTION_LIMIT_VERTEX")); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton4, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton5, SIGNAL(clicked()), this, SLOT(SetMaterials())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit4, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(onRemoveWebs(bool))); + + connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_PARTITION" ) ); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void OperationGUI_PartitionDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + globalSelection(); + + myListShapes.length(0); + myListTools.length(0); + myListKeepInside.length(0); + myListRemoveInside.length(0); + myListMaterials.length(0); + + switch (constructorId) + { + case 0: /*Full partition */ + { + GroupPoints->GroupBox1->setTitle(tr("GEOM_PARTITION")); + GroupPoints->TextLabel2->setText(tr("GEOM_TOOL_OBJECT")); + resize(0, 0); + GroupPoints->TextLabel3->show(); + GroupPoints->ComboBox1->show(); + GroupPoints->GroupBox2->show(); + + GroupPoints->ComboBox1->setCurrentItem(0); + GroupPoints->LineEdit3->clear(); + GroupPoints->LineEdit4->clear(); + break; + } + case 1: /*Half-space partition */ + { + + GroupPoints->GroupBox1->setTitle(tr("GEOM_PARTITION_HALFSPACE")); + GroupPoints->GroupBox2->hide(); + GroupPoints->TextLabel3->hide(); + GroupPoints->ComboBox1->hide(); + GroupPoints->TextLabel2->setText(tr("GEOM_PLANE")); + resize(0, 0); + break; + } + } + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->clear(); + GroupPoints->LineEdit2->clear(); + onRemoveWebs(false); + + myEditCurrentArgument->setFocus(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + MESSAGE(width()<<" "<setText( "" ); + QString aString = ""; + + int nbSel = GEOMBase::GetNameOfSelectedIObjects( selectedIO(), aString, true ); + + if ( nbSel < 1 ) + { + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + { + myListShapes.length( 0 ); + myListMaterials.length( 0 ); + } + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + myListTools.length( 0 ); + else if ( myEditCurrentArgument == GroupPoints->LineEdit3 ) + myListRemoveInside.length( 0 ); + else if ( myEditCurrentArgument == GroupPoints->LineEdit4 ) + myListKeepInside.length( 0 ); + } + + // One and only one plane can be selected + + if ( getConstructorId() == 1 && myEditCurrentArgument == GroupPoints->LineEdit2 && nbSel != 1 ) + { + myListTools.length( 0 ); + return; + } + + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + { + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myListShapes, true ); + myListMaterials.length( 0 ); + if ( !myListShapes.length() ) + return; + } + else if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) + { + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myListTools, true ); + if ( !myListTools.length() ) + return; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit3) + { + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myListRemoveInside, true ); + if (!myListRemoveInside.length()) + return; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit4) + { + GEOMBase::ConvertListOfIOInListOfGO( selectedIO(), myListKeepInside, true ); + if ( !myListKeepInside.length() ) + return; + } + + myEditCurrentArgument->setText( aString ); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) + myEditCurrentArgument = GroupPoints->LineEdit1; + else if(send == GroupPoints->PushButton2) + { + myEditCurrentArgument = GroupPoints->LineEdit2; + if( getConstructorId()==1 ) + globalSelection( GEOM_PLANE ); + } + else if(send == GroupPoints->PushButton3) + myEditCurrentArgument = GroupPoints->LineEdit3; + else if(send == GroupPoints->PushButton4) + myEditCurrentArgument = GroupPoints->LineEdit4; + + globalSelection( GEOM_ALLSHAPES ); + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2 || + send == GroupPoints->LineEdit3 || + send == GroupPoints->LineEdit4 ) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void OperationGUI_PartitionDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::enterEvent(QEvent* e) +{ + if(!GroupConstructors->isEnabled()) + this->ActivateThisDialog(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr OperationGUI_PartitionDlg::createOperation() +{ + return getGeomEngine()->GetIBooleanOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool OperationGUI_PartitionDlg::isValid( QString& msg ) +{ + return (myListShapes.length() || myListTools.length() || + myListKeepInside.length() || myListRemoveInside.length()); +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool OperationGUI_PartitionDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + QString msg; + + int aLimit = GetLimit(); + int aConstructorId = getConstructorId(); + + if (aConstructorId==1) + aLimit = GEOM::SHAPE; + + if (isValid( msg )) + { + + if ( aConstructorId==0 && !toRemoveWebs() ) + myListMaterials.length(0); + + anObj = GEOM::GEOM_IBooleanOperations::_narrow( getOperation() )->MakePartition(myListShapes, + myListTools, + myListKeepInside, + myListRemoveInside, + aLimit, + toRemoveWebs(), + myListMaterials); + res = true; + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//======================================================================= +//function : ComboTextChanged +//purpose : +//======================================================================= + +void OperationGUI_PartitionDlg::ComboTextChanged() +{ + bool IsEnabled = GroupPoints->ComboBox1->currentItem() < 3; + GroupPoints->LineEdit3->setEnabled(IsEnabled); + GroupPoints->LineEdit4->setEnabled(IsEnabled); + GroupPoints->TextLabel4->setEnabled(IsEnabled); + GroupPoints->TextLabel5->setEnabled(IsEnabled); + GroupPoints->PushButton3->setEnabled(IsEnabled); + GroupPoints->PushButton4->setEnabled(IsEnabled); +} + + +//================================================================================= +// function : SetMaterials() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::SetMaterials() +{ + MESSAGE("OperationGUI_MaterialDlg ..."); + OperationGUI_MaterialDlg *aDlg = + new OperationGUI_MaterialDlg(this, "", myListShapes, true); + MESSAGE("OperationGUI_MaterialDlg"); + return; +} + + +//================================================================================= +// function : onRemoveWebs() +// purpose : +//================================================================================= +void OperationGUI_PartitionDlg::onRemoveWebs(bool isChecked) +{ + if (GroupPoints->CheckBox1->isChecked() != isChecked) + GroupPoints->CheckBox1->setChecked(isChecked); + + GroupPoints->PushButton5->setEnabled(isChecked); +} + + +//================================================================================= +// function : toRemoveWebs() +// purpose : +//================================================================================= +bool OperationGUI_PartitionDlg::toRemoveWebs() const +{ + return GroupPoints->CheckBox1->isChecked(); +} + + +//================================================================================= +// function : GetLimit() +// purpose : +//================================================================================= +int OperationGUI_PartitionDlg::GetLimit() const +{ + int aLimit = GroupPoints->ComboBox1->currentItem(); + + switch(aLimit) + { + case 0 : + { + aLimit = GEOM::SOLID; + break; + } + case 1 : + { + aLimit = GEOM::SHELL; + break; + } + case 2 : + { + aLimit = GEOM::FACE; + break; + } + case 3 : + { + aLimit = GEOM::WIRE; + break; + } + case 4 : + { + aLimit = GEOM::EDGE; + break; + } + case 5 : + { + aLimit = GEOM::VERTEX; + break; + } + default : + aLimit = GEOM::SHAPE; + } + + return aLimit; +} diff --git a/src/PARTITION/Partition.cdl b/src/PARTITION/Partition.cdl new file mode 100644 index 000000000..179b425e8 --- /dev/null +++ b/src/PARTITION/Partition.cdl @@ -0,0 +1,63 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +-- +-- +-- +-- File : Partition.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +package Partition + +uses + TopoDS, + TopTools, + TopAbs, + BRepAlgo, + BRep, + gp +is + class Spliter; + class Inter3d; + class Inter2d; + class Loop2d; + class Loop3d; + +end Partition; diff --git a/src/PARTITION/Partition_Inter2d.cdl b/src/PARTITION/Partition_Inter2d.cdl new file mode 100644 index 000000000..55b69124f --- /dev/null +++ b/src/PARTITION/Partition_Inter2d.cdl @@ -0,0 +1,110 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +-- +-- +-- +-- File : Partition_Inter2d.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +class Inter2d from Partition + + ---Purpose: Computes the intersections between edges on a face + -- stores result is SD as AsDes from BRepAlgo. + +uses + AsDes from BRepAlgo, + Edge from TopoDS, + Face from TopoDS, + Vertex from TopoDS, + MapOfShape from TopTools, + Real from Standard, + ListOfShape from TopTools + +is + CompletPart2d(myclass ; AsDes : mutable AsDes from BRepAlgo; + F : Face from TopoDS; + NewEdges : MapOfShape from TopTools); + + ---Purpose: Computes the intersections between the edges stored + -- is AsDes as descendants of . Intersections is computed + -- between two edges if one of them is bound in NewEdges. + + + FindEndVertex(myclass; VertList : ListOfShape from TopTools; + f,l : Real from Standard; + E : Edge from TopoDS; + First : out Boolean from Standard; + DU : out Real from Standard) + returns Vertex from TopoDS; + ---Purpose: Returns a vertex from having parameter on + -- most close to or . is True if + -- found vertex is closer to . returns parameter + -- difference. + + AddVonE(myclass; V : Vertex from TopoDS; + E1,E2 : Edge from TopoDS; + AsDes : mutable AsDes from BRepAlgo; + F: Face from TopoDS) + returns Vertex from TopoDS; + ---Purpose: Put V in AsDes as intersection of E1 and E2. + -- Check that vertex equal to V already exists on one + -- of edges, in such a case, V is not added but + -- existing vertex is updated to be on E1 and E2 and + -- is returned insead of V. + -- Optional F is a face E1 and E2 are on. If F is + -- provided, it is used to find new vertices on E1 + -- and E2 resulting from intersection of new edges on + -- the two other faces the F interferes with and + -- through which E1 and E2 pass too. This helps to + -- avoid small edges. + + + GetTolerance(myclass; theV : Vertex from TopoDS; + theU : Real from Standard; + theE : Edge from TopoDS; + theAsDes : AsDes from BRepAlgo) + returns Real from Standard; + ---Purpose: Returns tolerance theV must have atfer its + -- addition to theE with theU parameter. theAsDes is + -- used to find pcurves of theE + +end Inter2d; + diff --git a/src/PARTITION/Partition_Inter3d.cdl b/src/PARTITION/Partition_Inter3d.cdl new file mode 100644 index 000000000..578161a25 --- /dev/null +++ b/src/PARTITION/Partition_Inter3d.cdl @@ -0,0 +1,194 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +-- +-- +-- +-- File : Partition_Inter3d.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +class Inter3d from Partition + + ---Purpose: Computes the intersection face face in a set of faces + -- Store the result in a SD as AsDes. + +uses + Edge from TopoDS, + Vertex from TopoDS, + DataMapOfShapeShape from TopTools, + MapOfShape from TopTools, + Boolean from Standard, + AsDes from BRepAlgo, + Image from BRepAlgo, + Shape from TopoDS, + Face from TopoDS, + ListOfShape from TopTools, + Real from Standard, + State from TopAbs, + DataMapOfShapeListOfShape from TopTools + +is + Create returns Inter3d from Partition; + + Create(AsDes : mutable AsDes from BRepAlgo); + + CompletPart3d (me : in out; SetOfFaces1 : ListOfShape from TopTools; + FaceShapeMap: DataMapOfShapeShape from TopTools) + is static; + + FacesPartition (me : in out; F1, F2 : Face from TopoDS) + is static; + + ---------------------------- + ---Category: Result Querying + ---------------------------- + + IsDone(me ; F1,F2 : Face from TopoDS) + returns Boolean from Standard is static; + ---Purpose: return True if F1-F2 pair has been processed + + TouchedFaces(me : in out) returns MapOfShape from TopTools + ---C++: return & + is static; + ---Purpose: return map of faces cut by new or section edges + + NewEdges(me : in out) returns MapOfShape from TopTools + ---C++: return & + is static; + ---Purpose: return new and section edges + + AsDes(me) returns AsDes from BRepAlgo + is static; + ---Purpose: return an object containing info about + -- Ascendants | Descendants + -- ------------------+--------------------- + -- 1. faces | edges cutting them + -- 2. sectoin edges | new vertices on them + + + ------------------------------- + ---Category: Same domain shapes + ------------------------------- + + HasSameDomainF(me; F : Shape from TopoDS) + returns Boolean from Standard; + ---Purpose: Return true if F has same domain faces + + IsSameDomainF(me; F1, F2 : Shape from TopoDS) + returns Boolean from Standard; + ---Purpose: Return true if F1 and F2 are same domain faces + + SameDomain(me; F : Face from TopoDS) + returns ListOfShape from TopTools; + ---C++: return const & + ---Purpose: Return same domain faces of F + + ReplaceSameDomainV (me; V : Vertex from TopoDS; + E : Edge from TopoDS) + returns Vertex from TopoDS; + ---Purpose: return same domain vertex of V if it was replaced + -- and make this vertex to be on E too, else return V + + -------------------------- + ---Category: Section edges + -------------------------- + + SectionEdgesAD (me) returns AsDes from BRepAlgo + is static; + + IsSectionEdge (me; E : Edge from TopoDS) + returns Boolean from Standard; + ---Purpose: return True if E is an edge of an initial face and + -- E intersects aother face + + HasSectionEdge (me; F : Face from TopoDS) + returns Boolean from Standard; + ---Purpose: return True if F is intersected by an edge of + -- other face + + IsSplitOn (me; NewE, OldE : Edge from TopoDS; + F : Face from TopoDS) + returns Boolean from Standard; + ---Purpose: return True if NewE is split of OldE on F; + -- no check if NewE is split of OldE :) + + SectionEdgeFaces (me; SecE : Edge from TopoDS) + returns ListOfShape from TopTools; + ---C++: return const& + ---Purpose: return faces cut by section edge + + -------------------- + ---Category: Private + -------------------- + + Inter3D (me: in out; F1, F2 : Face from TopoDS; + LInt : in out ListOfShape from TopTools) + is static private; + + StorePart3d(me : in out; F1,F2 : Face from TopoDS; + LInt1 : ListOfShape from TopTools) + is static private; + + SetDone(me : in out; F1,F2 : Face from TopoDS) + is static private; + + Affiche (me; SetOfFaces : ListOfShape from TopTools) + is static private; + +fields + + myAsDes : AsDes from BRepAlgo; + myDone : DataMapOfShapeListOfShape from TopTools; + myTouched : MapOfShape from TopTools; + myNewEdges : MapOfShape from TopTools; + + -- section edges: existing edges that are intersection lines, + -- may be partially. + -- Store as + -- FACE -> SECTION EDGES, SECTION EDGE -> OTHER SECTION EDGE + mySectionEdgesAD : AsDes from BRepAlgo; + + -- same domain shapes + -- faces + mySameDomainFM : DataMapOfShapeListOfShape from TopTools; + -- vertex -> vertex replacement + mySameDomainVM : DataMapOfShapeShape from TopTools; + +end Inter3d; diff --git a/src/PARTITION/Partition_Loop.cdl b/src/PARTITION/Partition_Loop.cdl new file mode 100644 index 000000000..8678d2f19 --- /dev/null +++ b/src/PARTITION/Partition_Loop.cdl @@ -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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +-- +-- +-- +-- File : Partition_Loop.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +class Loop from Partition + + ---Purpose: Builds the loops from a set of edges on a face. + +uses + + Face from TopoDS, + Edge from TopoDS, + ListOfShape from TopTools, + DataMapOfShapeListOfShape from TopTools + +is + + Create; + + Init (me : in out; F : Face from TopoDS) + ---Purpose: Init with the set of edges must have + -- pcurves on . + is static; + + AddEdge (me : in out; E : in out Edge from TopoDS; + LV : ListOfShape from TopTools) + ---Purpose: Add E with . will be copied and trim + -- by vertices in . + is static; + + AddConstEdge (me : in out; E : Edge from TopoDS) + ---Purpose: Add as const edge, E can be in the result. + is static; + + Perform(me : in out) + ---Purpose: Make loops. + is static; + + NewWires (me) + ---Purpose: Returns the list of wires performed. + -- can be an empty list. + ---C++: return const & + returns ListOfShape from TopTools; + + WiresToFaces (me : in out) + ---Purpose: Build faces from the wires result. + is static; + + NewFaces (me) + ---Purpose: Returns the list of faces. + ---Warning: The method as to be called before. + -- can be an empty list. + ---C++: return const & + returns ListOfShape from TopTools; + + +fields + + myFace : Face from TopoDS; + myConstEdges : ListOfShape from TopTools; + myNewWires : ListOfShape from TopTools; + myNewFaces : ListOfShape from TopTools; + +end Loop; diff --git a/src/PARTITION/Partition_Loop2d.cdl b/src/PARTITION/Partition_Loop2d.cdl new file mode 100644 index 000000000..94d0e7e4a --- /dev/null +++ b/src/PARTITION/Partition_Loop2d.cdl @@ -0,0 +1,102 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- Copyright (C) 2003 CEA/DEN, EDF R&D +-- +-- +-- +-- File : Partition_Loop2d.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +class Loop2d from Partition + + ---Purpose: Builds the loops from a set of edges on a face. + -- It works in supposition that all constant edges + -- are split edges of an initialization face and all + -- section edges are new on the face + +uses + + Orientation from TopAbs, + Boolean from Standard, + Face from TopoDS, + Image from BRepAlgo, + Face from TopoDS, + Edge from TopoDS, + ListOfShape from TopTools, + DataMapOfShapeListOfShape from TopTools, + MapOfShape from TopTools +is + + Create; + + Init (me : in out; F : Face from TopoDS) + ---Purpose: Init with the set of edges must have + -- pcurves on . + is static; + + AddConstEdge (me : in out; E : Edge from TopoDS) + ---Purpose: Add as unique edge in the result. + is static; + + AddSectionEdge (me : in out; E : Edge from TopoDS) + ---Purpose: Add as double edge in the result. + is static; + + Perform(me : in out) + ---Purpose: Make loops. + is static; + + NewWires (me) + ---Purpose: Returns the list of wires performed. + -- can be an empty list. + ---C++: return const & + returns ListOfShape from TopTools; + + WiresToFaces (me : in out; EdgeImage : Image from BRepAlgo) + ---Purpose: Build faces from the wires result. + -- serves to find original edge by new + -- one. + is static; + + NewFaces (me) + ---Purpose: Returns the list of faces. + ---Warning: The method as to be called before. + -- can be an empty list. + ---C++: return const & + returns ListOfShape from TopTools; + + +fields + + myFace : Face from TopoDS; + myFaceOri : Orientation from TopAbs; + myConstEdges : ListOfShape from TopTools; + myNewWires : ListOfShape from TopTools; + myNewFaces : ListOfShape from TopTools; + + -- internal wires do not contain constant edges + myInternalWL : ListOfShape from TopTools; + + mySectionEdges : MapOfShape from TopTools; + +end Loop2d; diff --git a/src/PARTITION/Partition_Loop3d.cdl b/src/PARTITION/Partition_Loop3d.cdl new file mode 100644 index 000000000..62e6af3ce --- /dev/null +++ b/src/PARTITION/Partition_Loop3d.cdl @@ -0,0 +1,88 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- Copyright (C) 2003 CEA/DEN, EDF R&D +-- +-- +-- +-- File : Partition_Loop3d.cdl +-- Module : GEOM + +class Loop3d from Partition + + ---Purpose: Builds the shells from a set of faces. + -- Provides methods for comparing faces mutual + -- location. + +uses + Vec from gp, + MapOfOrientedShape from TopTools, + IndexedDataMapOfShapeListOfShape from TopTools, + Face from TopoDS, + Edge from TopoDS, + ListOfShape from TopTools, + Shape from TopoDS + +is + + Create; + + AddConstFaces (me : in out; S : Shape from TopoDS) + ---Purpose: Add faces of as unique faces in the result. + is static; + + AddSectionFaces (me : in out; S : Shape from TopoDS) + ---Purpose: Add faces of as double faces in the result. + is static; + + MakeShells (me : in out; AvoidFacesMap : MapOfOrientedShape from TopTools) + returns ListOfShape from TopTools is static; + ---Purpose: Make and return shells. + -- can contain faces that must not be + -- added to result shells. + ---C++: return const & + + + ---Category: class methods + + IsInside (myclass; E : Edge from TopoDS; + F1, F2 : Face from TopoDS; + CountDot : Boolean from Standard; + Dot : in out Real from Standard; + GoodOri : in out Boolean from Standard) + returns Boolean from Standard; + ---Purpose: check if is inside by edge . + -- if , compute : scalar production of + -- normalized vectors pointing inside faces, and + -- check if faces are oriented well for sewing + + Normal (myclass; E : Edge from TopoDS; + F : Face from TopoDS) returns Vec from gp; + + +fields + + myNewShells : ListOfShape from TopTools; -- result + + myFaces : ListOfShape from TopTools; + myEFMap : IndexedDataMapOfShapeListOfShape from TopTools; + +end Loop3d; diff --git a/src/PARTITION/Partition_Spliter.cdl b/src/PARTITION/Partition_Spliter.cdl new file mode 100644 index 000000000..acef3db6a --- /dev/null +++ b/src/PARTITION/Partition_Spliter.cdl @@ -0,0 +1,204 @@ +// 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/ +// +-- GEOM PARTITION : partition algorithm +-- +-- 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +-- +-- +-- +-- File : Partition_Spliter.cdl +-- Author : Benedicte MARTIN +-- Module : GEOM + +class Spliter from Partition + + ---Purpose: Split solids, shells and faces into parts of the + -- same topology if reconstruction level is not + -- limited. + +uses + Inter3d from Partition, + Loop2d from Partition, + Builder from BRep, + ShapeEnum from TopAbs, + Compound from TopoDS, + Face from TopoDS, + Edge from TopoDS, + Shape from TopoDS, + MapOfOrientedShape from TopTools, + IndexedMapOfShape from TopTools, + DataMapOfShapeShape from TopTools, + ListOfShape from TopTools, + MapOfShape from TopTools, + AsDes from BRepAlgo, + Image from BRepAlgo + +is + Create returns Spliter from Partition; + ---Purpose: constructor + + AddShape ( me : in out; S : Shape from TopoDS); + ---Purpose: add object Shape to be splitted. + -- If S is a COMPOUND or COMPSOLID, it will be + -- exploded in order to get more simple object + -- shapes. + -- Object shapes that are vertices, edges or wires + -- won't be splitted and won't be in a result. + + AddTool ( me : in out; S : Shape from TopoDS); + ---Purpose: add cutting tool + + Compute (me : in out; Limit : ShapeEnum from TopAbs + = TopAbs_SHAPE); + ---Purpose: produce a result which is a compound of parts of + -- object shapes. A part can be either a vertex, + -- edge, wire, face, shell or solid. + -- By default, a part is of the same topology as an + -- object shape, else restricts parts + -- reconstruction. + -- If == TopAbs_VERTEX, only new vertices are + -- returned in the result + + KeepShapesInside (me : in out; S : Shape from TopoDS); + ---Purpose: remove shapes that are outside of S from result. + -- S should be an object shape. + ---Warning: call it after Compute() + + RemoveShapesInside (me : in out; S : Shape from TopoDS); + ---Purpose: remove shapes that are inside S from result. + -- S should be an object shape. + ---Warning: call it after Compute() + + Shape ( me ) returns Shape from TopoDS; + ---Purpose: return resulting compound + + Clear ( me : in out); + ---Purpose: clear fields + + + ---Category: private methods + + + MakeSolids (me: in out; Solid : Shape from TopoDS; + Shells: in out ListOfShape from TopTools) + is private; + ---Purpose: make solids out of Shells + + MakeShells (me: in out; S : Shape from TopoDS; + NS: in out ListOfShape from TopTools) is private; + ---Purpose: split S into shells + + MakeFaces (me: in out; S : Shape from TopoDS) + returns Shape from TopoDS is private; + ---Purpose: split faces of S, return compound of new faces + + MakeEdges (me; + E : Edge from TopoDS; + VOnE : ListOfShape from TopTools; + NE : in out ListOfShape from TopTools) + is private; + ---Purpose: cut E by vertices VOnE, return list of new edges + -- NE + + FindFacesInside (me: in out; S : Shape from TopoDS; + CheckClosed : Boolean = Standard_False; + All : Boolean = Standard_False) + returns Shape from TopoDS is private; + ---Purpose: return compound of faces of other shapes that are + -- inside . must have image in myImageShape. + -- makes avoid faces that do not form a + -- closed shell + -- makes return already added faces + + CheckTool ( me: in out; S : Shape from TopoDS) + returns Boolean from Standard is private; + ---Purpose: Return True if is a tool shape. Prepare tool + -- faces of for the search of internal faces. + + MergeEqualEdges (me: in out; LE : ListOfShape from TopTools) is private; + ---Purpose: among LE, find equal edges, choose ones to keep + -- and make them have pcurves on all faces they are + -- shared by + -- contains edge splits + + IsInside (myclass; S1,S2 : Shape from TopoDS) + returns Boolean from Standard is private; + ---Purpose: Return True if the first vertex of S1 inside S2. + -- If S1.IsNull(), check infinite point against S2. + + GetOriginalShape(me; aShape : Shape from TopoDS) + returns Shape from TopoDS is private; + ---Purpose: Return the shape aShape originates from. aShape + -- should be a face or more complex result shape + + FindToolsToReconstruct(me: in out) is private; + ---Purpose: find and store as objects tools which interfere + -- with solids or are inside solids without + -- an interference + +fields + + myDoneStep : ShapeEnum from TopAbs; -- rebuilt level + myShape : Compound from TopoDS; -- result + myBuilder : Builder from BRep; + + myListShapes : ListOfShape from TopTools; -- object shapes + myMapFaces : MapOfShape from TopTools; -- object faces + myMapTools : MapOfShape from TopTools; -- tool faces + myEqualEdges : MapOfShape from TopTools; -- equal splits + myNewSection : MapOfShape from TopTools; -- new secton edges + myClosedShapes : MapOfShape from TopTools; + mySharedFaces : MapOfShape from TopTools; -- faces shared by several shapes + myWrappingSolid: MapOfShape from TopTools; -- solids having other shapes inside + myFaceShapeMap : DataMapOfShapeShape from TopTools; -- to find a shape by face + + myInternalFaces: DataMapOfShapeShape from TopTools; -- shape and its internal faces + myIntNotClFaces: DataMapOfShapeShape from TopTools; -- internal but not closed + + + myAsDes : AsDes from BRepAlgo; + myImagesFaces : Image from BRepAlgo; + myImagesEdges : Image from BRepAlgo; + myImageShape : Image from BRepAlgo; + + -- contains info of same domain shapes and section edges + myInter3d : Inter3d from Partition; + + -- avoid rebuilding twice commont part of solids + myAddedFacesMap: MapOfOrientedShape from TopTools; + +end Spliter; diff --git a/src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx b/src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx new file mode 100644 index 000000000..ea44ad1bc --- /dev/null +++ b/src/PrimitiveGUI/PrimitiveGUI_BoxDlg.cxx @@ -0,0 +1,412 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : PrimitiveGUI_BoxDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "PrimitiveGUI_BoxDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + + +//================================================================================= +// class : PrimitiveGUI_BoxDlg() +// purpose : Constructs a PrimitiveGUI_BoxDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +PrimitiveGUI_BoxDlg::PrimitiveGUI_BoxDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BOX_2P"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_BOX_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + + setCaption(tr("GEOM_BOX_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_BOX")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_DIAGONAL_POINTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_POINT_I").arg("1")); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_I").arg("2")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + + GroupDimensions = new DlgRef_3Spin(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_BOX_OBJ")); + GroupDimensions->TextLabel1->setText(tr("GEOM_DX")); + GroupDimensions->TextLabel2->setText(tr("GEOM_DY")); + GroupDimensions->TextLabel3->setText(tr("GEOM_DZ")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~DialogBox_Box() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +PrimitiveGUI_BoxDlg::~PrimitiveGUI_BoxDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes */ + GroupDimensions->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + + double initValue = 200.0; + GroupDimensions->SpinBox_DX->SetValue(initValue); + GroupDimensions->SpinBox_DY->SetValue(initValue); + GroupDimensions->SpinBox_DZ->SetValue(initValue); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DZ, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_BOX" ) ); + ConstructorsClicked(0); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void PrimitiveGUI_BoxDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch (constructorId) + { + case 0: + { + globalSelection( GEOM_POINT ); + + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(""); + GroupPoints->LineEdit2->setText(""); + myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1: + { + GroupPoints->hide(); + resize(0, 0); + GroupDimensions->show(); + + break; + } + } + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool PrimitiveGUI_BoxDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed +//================================================================================= +void PrimitiveGUI_BoxDlg::SelectionIntoArgument() +{ + if ( getConstructorId() != 0 ) + return; + + myEditCurrentArgument->setText(""); + + if (IObjectCount() != 1) + { + if (myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint1 = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == GroupPoints->LineEdit2) + myPoint2 = GEOM::GEOM_Object::_nil(); + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if(!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint1 = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myPoint2 = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) + myEditCurrentArgument = GroupPoints->LineEdit1; + else if(send == GroupPoints->PushButton2) + myEditCurrentArgument = GroupPoints->LineEdit2; + + globalSelection( GEOM_POINT ); + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : enterEvent [REDEFINED] +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void PrimitiveGUI_BoxDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr PrimitiveGUI_BoxDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool PrimitiveGUI_BoxDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !(myPoint1->_is_nil() || myPoint2->_is_nil()) : true; +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool PrimitiveGUI_BoxDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) ) { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeBoxTwoPnt( myPoint1, myPoint2 ); + res = true; + } + + break; + } + case 1 : + { + double x = GroupDimensions->SpinBox_DX->GetValue(); + double y = GroupDimensions->SpinBox_DY->GetValue(); + double z = GroupDimensions->SpinBox_DZ->GetValue(); + + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeBoxDXDYDZ( x, y, z ); + res = true; + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void PrimitiveGUI_BoxDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx b/src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx new file mode 100644 index 000000000..45db91182 --- /dev/null +++ b/src/PrimitiveGUI/PrimitiveGUI_ConeDlg.cxx @@ -0,0 +1,471 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : PrimitiveGUI_ConeDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "PrimitiveGUI_ConeDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : PrimitiveGUI_ConeDlg() +// purpose : Constructs a PrimitiveGUI_ConeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +PrimitiveGUI_ConeDlg::PrimitiveGUI_ConeDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CONE_PV"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CONE_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CONE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_CONE")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel3Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_BASE_POINT")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_RADIUS_I").arg("1")); + GroupPoints->TextLabel4->setText(tr("GEOM_RADIUS_I").arg("2")); + GroupPoints->TextLabel5->setText(tr("GEOM_HEIGHT")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + + GroupDimensions = new DlgRef_3Spin(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_BOX_OBJ")); + GroupDimensions->TextLabel1->setText(tr("GEOM_RADIUS_I").arg("1")); + GroupDimensions->TextLabel2->setText(tr("GEOM_RADIUS_I").arg("2")); + GroupDimensions->TextLabel3->setText(tr("GEOM_HEIGHT")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~PrimitiveGUI_ConeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +PrimitiveGUI_ConeDlg::~PrimitiveGUI_ConeDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(0.000, 999.999, step, 3); + GroupPoints->SpinBox_DY->RangeStepAndValidator(0.000, 999.999, step, 3); + GroupPoints->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DX->RangeStepAndValidator(0.000, 999.999, step, 3); + GroupDimensions->SpinBox_DY->RangeStepAndValidator(0.000, 999.999, step, 3); + GroupDimensions->SpinBox_DZ->RangeStepAndValidator(-999.999, 999.999, step, 3); + + double aRadius1(100.0), aRadius2(0.0), aHeight(300.0); + GroupPoints->SpinBox_DX->SetValue(aRadius1); + GroupPoints->SpinBox_DY->SetValue(aRadius2); + GroupPoints->SpinBox_DZ->SetValue(aHeight); + GroupDimensions->SpinBox_DX->SetValue(aRadius1); + GroupDimensions->SpinBox_DY->SetValue(aRadius2); + GroupDimensions->SpinBox_DZ->SetValue(aHeight); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DZ, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DZ, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_CONE" ) ); + ConstructorsClicked(0); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void PrimitiveGUI_ConeDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch(constructorId) + { + case 0 : + { + globalSelection( GEOM_POINT ); + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(tr("")); + GroupPoints->LineEdit2->setText(tr("")); + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1 : + { + GroupPoints->hide(); + resize( 0, 0 ); + GroupDimensions->show(); + + break; + } + } + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool PrimitiveGUI_ConeDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void PrimitiveGUI_ConeDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void PrimitiveGUI_ConeDlg::SelectionIntoArgument() +{ + if ( getConstructorId() != 0 ) + return; + + if(IObjectCount() != 1) + { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = GEOM::GEOM_Object::_nil(); + return; + } + + /* nbSel == 1 */ + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if(!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if (myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = aSelectedObject; + else if (myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = aSelectedObject; + + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void PrimitiveGUI_ConeDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr PrimitiveGUI_ConeDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool PrimitiveGUI_ConeDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !(myPoint->_is_nil() || myDir->_is_nil()) : true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool PrimitiveGUI_ConeDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myPoint ) && !CORBA::is_nil( myDir ) ){ + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeConePntVecR1R2H( myPoint, + myDir, + getRadius1(), + getRadius2(), + getHeight()); + res = true; + } + break; + } + case 1 : + { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeConeR1R2H( getRadius1(), + getRadius2(), + getHeight()); + res = true; + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void PrimitiveGUI_ConeDlg::closeEvent( QCloseEvent* e ) +{ + // myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : getRadius1() +// purpose : +//================================================================================= +double PrimitiveGUI_ConeDlg::getRadius1() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DX->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DX->GetValue(); + return 0; +} + + +//================================================================================= +// function : getRadius2() +// purpose : +//================================================================================= +double PrimitiveGUI_ConeDlg::getRadius2() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DY->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DY->GetValue(); + return 0; +} + + +//================================================================================= +// function : getRadius2() +// purpose : +//================================================================================= +double PrimitiveGUI_ConeDlg::getHeight() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DZ->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DZ->GetValue(); + return 0; +} diff --git a/src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx b/src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx new file mode 100644 index 000000000..19aaff74d --- /dev/null +++ b/src/PrimitiveGUI/PrimitiveGUI_CylinderDlg.cxx @@ -0,0 +1,447 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : PrimitiveGUI_CylinderDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "PrimitiveGUI_CylinderDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : PrimitiveGUI_CylinderDlg() +// purpose : Constructs a PrimitiveGUI_CylinderDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +PrimitiveGUI_CylinderDlg::PrimitiveGUI_CylinderDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CYLINDER_PV"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CYLINDER_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CYLINDER_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_CYLINDER")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel2Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_BASE_POINT")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_RADIUS")); + GroupPoints->TextLabel4->setText(tr("GEOM_HEIGHT")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + + GroupDimensions = new DlgRef_2Spin(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_BOX_OBJ")); + GroupDimensions->TextLabel1->setText(tr("GEOM_RADIUS")); + GroupDimensions->TextLabel2->setText(tr("GEOM_HEIGHT")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~PrimitiveGUI_CylinderDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +PrimitiveGUI_CylinderDlg::~PrimitiveGUI_CylinderDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + /* First constructor : radius */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + /* First constructor : algebric height */ + GroupPoints->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + /* Second constructor : radius */ + GroupDimensions->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + /* Second constructor : algebric height */ + GroupDimensions->SpinBox_DY->RangeStepAndValidator(-999.999, 999.999, step, 3); + + GroupPoints->SpinBox_DX->SetValue(100.0); + GroupPoints->SpinBox_DY->SetValue(300.0); + GroupDimensions->SpinBox_DX->SetValue(100.0); + GroupDimensions->SpinBox_DY->SetValue(300.0); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_CYLINDER" ) ); + ConstructorsClicked(0); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void PrimitiveGUI_CylinderDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch(constructorId) + { + case 0 : + { + globalSelection( GEOM_POINT ); + + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(tr("")); + GroupPoints->LineEdit2->setText(tr("")); + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1 : + { + GroupPoints->hide(); + resize( 0, 0 ); + GroupDimensions->show(); + + break; + } + } + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool PrimitiveGUI_CylinderDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void PrimitiveGUI_CylinderDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void PrimitiveGUI_CylinderDlg::SelectionIntoArgument() +{ + if ( getConstructorId() != 0 ) + return; + + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) + { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = GEOM::GEOM_Object::_nil(); + else if (myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = GEOM::GEOM_Object::_nil(); + return; + } + + /* nbSel == 1 */ + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if(!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if (myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = aSelectedObject; + else if (myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void PrimitiveGUI_CylinderDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::ValueChangedInSpinBox( ) +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr PrimitiveGUI_CylinderDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool PrimitiveGUI_CylinderDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !(myPoint->_is_nil() || myDir->_is_nil() ) : true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool PrimitiveGUI_CylinderDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myPoint ) && !CORBA::is_nil( myDir )) { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeCylinderPntVecRH(myPoint, myDir, getRadius(), getHeight()); + res = true; + } + break; + } + case 1 : + { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeCylinderRH(getRadius(), getHeight()); + res = true; + + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void PrimitiveGUI_CylinderDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : getRadius() +// purpose : +//================================================================================= +double PrimitiveGUI_CylinderDlg::getRadius() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DX->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DX->GetValue(); + return 0; +} + + +//================================================================================= +// function : getHeight() +// purpose : +//================================================================================= +double PrimitiveGUI_CylinderDlg::getHeight() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DY->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DY->GetValue(); + return 0; +} diff --git a/src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx b/src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx new file mode 100644 index 000000000..49bca1dc2 --- /dev/null +++ b/src/PrimitiveGUI/PrimitiveGUI_SphereDlg.cxx @@ -0,0 +1,398 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : PrimitiveGUI_SphereDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "PrimitiveGUI_SphereDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : PrimitiveGUI_SphereDlg() +// purpose : Constructs a PrimitiveGUI_SphereDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +PrimitiveGUI_SphereDlg::PrimitiveGUI_SphereDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SPHERE_P"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SPHERE_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SPHERE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SPHERE")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel1Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_SPHERE_CR")); + GroupPoints->TextLabel1->setText(tr("GEOM_CENTER")); + GroupPoints->TextLabel2->setText(tr("GEOM_RADIUS")); + GroupPoints->PushButton1->setPixmap(image2); + + GroupDimensions = new DlgRef_1Spin(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_SPHERE_RO")); + GroupDimensions->TextLabel1->setText(tr("GEOM_RADIUS")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~PrimitiveGUI_SphereDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +PrimitiveGUI_SphereDlg::~PrimitiveGUI_SphereDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + + myPoint = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + GroupDimensions->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + GroupPoints->SpinBox_DX->SetValue(100.0); + GroupDimensions->SpinBox_DX->SetValue(100.0); + + /* 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(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName(tr("GEOM_SPHERE")); + ConstructorsClicked(0); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void PrimitiveGUI_SphereDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch (constructorId) + { + case 0: + { + globalSelection( GEOM_POINT ); + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(""); + myPoint = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break; + } + case 1: + { + GroupPoints->hide(); + resize(0, 0); + GroupDimensions->show(); + + break; + } + } + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool PrimitiveGUI_SphereDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void PrimitiveGUI_SphereDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void PrimitiveGUI_SphereDlg::SelectionIntoArgument() +{ + if ( getConstructorId() != 0 ) + return; + + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) + { + myPoint = GEOM::GEOM_Object::_nil(); + return; + } + + /* nbSel == 1 ! */ + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if (!testResult || CORBA::is_nil( aSelectedObject )) + return; + + myPoint = aSelectedObject; + myEditCurrentArgument->setText( GEOMBase::GetName( myPoint ) ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void PrimitiveGUI_SphereDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr PrimitiveGUI_SphereDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool PrimitiveGUI_SphereDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !myPoint->_is_nil() : true; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool PrimitiveGUI_SphereDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myPoint ) ) { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeSpherePntR( myPoint, getRadius() ); + res = true; + } + break; + } + case 1 : + { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeSphereR( getRadius() ); + res = true; + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void PrimitiveGUI_SphereDlg::closeEvent( QCloseEvent* e ) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + + +//================================================================================= +// function : getRadius() +// purpose : +//================================================================================= +double PrimitiveGUI_SphereDlg::getRadius() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DX->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DX->GetValue(); + return 0; +} diff --git a/src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx b/src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx new file mode 100644 index 000000000..05e6c7b6c --- /dev/null +++ b/src/PrimitiveGUI/PrimitiveGUI_TorusDlg.cxx @@ -0,0 +1,445 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : PrimitiveGUI_TorusDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "PrimitiveGUI_TorusDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : PrimitiveGUI_TorusDlg() +// purpose : Constructs a PrimitiveGUI_TorusDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +PrimitiveGUI_TorusDlg::PrimitiveGUI_TorusDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_TORUS_PV"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_TORUS_DXYZ"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_TORUS_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_TORUS")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel2Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_BASE_POINT")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_RADIUS_I").arg("1")); + GroupPoints->TextLabel4->setText(tr("GEOM_RADIUS_I").arg("2")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + + GroupDimensions = new DlgRef_2Spin(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_BOX_OBJ")); + GroupDimensions->TextLabel1->setText(tr("GEOM_RADIUS_I").arg("1")); + GroupDimensions->TextLabel2->setText(tr("GEOM_RADIUS_I").arg("2")); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~PrimitiveGUI_TorusDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +PrimitiveGUI_TorusDlg::~PrimitiveGUI_TorusDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + GroupPoints->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, step, 3); + GroupDimensions->SpinBox_DX->RangeStepAndValidator(0.001, 999.999, step, 3); + GroupDimensions->SpinBox_DY->RangeStepAndValidator(0.001, 999.999, step, 3); + + GroupPoints->SpinBox_DX->SetValue(300.0); + GroupPoints->SpinBox_DY->SetValue(100.0); + GroupDimensions->SpinBox_DX->SetValue(300.0); + GroupDimensions->SpinBox_DY->SetValue(100.0); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupDimensions->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY, SLOT(SetStep(double))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_TORUS" ) ); + ConstructorsClicked(0); +} + + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void PrimitiveGUI_TorusDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + switch(constructorId) + { + case 0 : + { + globalSelection( GEOM_LINE ); + + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(tr("")); + GroupPoints->LineEdit2->setText(tr("")); + myPoint = myDir = GEOM::GEOM_Object::_nil(); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + break ; + } + case 1 : + { + GroupPoints->hide(); + resize( 0, 0 ); + GroupDimensions->show(); + + break ; + } + } + displayPreview(); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool PrimitiveGUI_TorusDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void PrimitiveGUI_TorusDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void PrimitiveGUI_TorusDlg::SelectionIntoArgument() +{ + if ( getConstructorId() != 0 ) + return; + + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) + { + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = GEOM::GEOM_Object::_nil(); + return; + } + + + /* nbSel == 1 */ + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if(!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + myPoint = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + myDir = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_POINT ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void PrimitiveGUI_TorusDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr PrimitiveGUI_TorusDlg::createOperation() +{ + return getGeomEngine()->GetI3DPrimOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool PrimitiveGUI_TorusDlg::isValid( QString& msg ) +{ + return getConstructorId() == 0 ? !(myPoint->_is_nil() || myDir->_is_nil()) : true; +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool PrimitiveGUI_TorusDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if (!CORBA::is_nil( myPoint ) && !CORBA::is_nil( myDir )){ + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeTorusPntVecRR(myPoint, myDir, getRadius1(), getRadius2()); + res = true; + } + break; + } + case 1 : + { + anObj = GEOM::GEOM_I3DPrimOperations::_narrow( getOperation() )->MakeTorusRR(getRadius1(), getRadius2()); + res = true; + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void PrimitiveGUI_TorusDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : getRadius1() +// purpose : +//================================================================================= +double PrimitiveGUI_TorusDlg::getRadius1() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DX->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DX->GetValue(); + return 0; +} + + +//================================================================================= +// function : getRadius2() +// purpose : +//================================================================================= +double PrimitiveGUI_TorusDlg::getRadius2() const +{ + int aConstructorId = getConstructorId(); + if (aConstructorId == 0) + return GroupPoints->SpinBox_DY->GetValue(); + else if (aConstructorId == 1) + return GroupDimensions->SpinBox_DY->GetValue(); + return 0; +} diff --git a/src/RepairGUI/RepairGUI.cxx b/src/RepairGUI/RepairGUI.cxx new file mode 100644 index 000000000..fa4187134 --- /dev/null +++ b/src/RepairGUI/RepairGUI.cxx @@ -0,0 +1,146 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "RepairGUI.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" + +#include "RepairGUI_SewingDlg.h" // Method SEWING +#include "RepairGUI_SuppressFacesDlg.h" // Method SUPPRESS FACES +#include "RepairGUI_RemoveHolesDlg.h" // Method SUPPRESS HOLE +#include "RepairGUI_ShapeProcessDlg.h" // Method PROCESS SHAPE +#include "RepairGUI_CloseContourDlg.h" // Method CLOSE CONTOUR +#include "RepairGUI_RemoveIntWiresDlg.h"// Method REMOVE INTERNAL WIRES +#include "RepairGUI_DivideEdgeDlg.h" // Method DEVIDE EDGE +#include "RepairGUI_FreeBoundDlg.h" // Method FREE BOUNDARIES +#include "RepairGUI_FreeFacesDlg.h" // Method FREE FACES +#include "RepairGUI_GlueDlg.h" // Method GLUE FACES + +#include "utilities.h" + +using namespace std; + +RepairGUI* RepairGUI::myGUIObject = 0; + +//======================================================================= +// function : GetRepairGUI() +// purpose : Get the only RepairGUI object [ static ] +//======================================================================= +RepairGUI* RepairGUI::GetRepairGUI( GeometryGUI* parent ) +{ + if ( myGUIObject == 0 ) { + // init RepairGUI only once + myGUIObject = new RepairGUI( parent ); + } + return myGUIObject; +} + +//======================================================================= +// function : RepairGUI() +// purpose : Constructor +//======================================================================= +RepairGUI::RepairGUI( GeometryGUI* parent ) : GEOMGUI( parent ) +{ +} + + +//======================================================================= +// function : ~RepairGUI() +// purpose : Destructor +//======================================================================= +RepairGUI::~RepairGUI() +{ +} + + +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool RepairGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + + QDialog* aDlg = NULL; + switch (theCommandID) { + case 601: // SEWING + aDlg = new RepairGUI_SewingDlg( parent, "" ); + break; + case 602: // GLUE FACES + aDlg = new RepairGUI_GlueDlg( parent, "" ); + break; + case 603: // SUPPRESS FACES + aDlg = new RepairGUI_SuppressFacesDlg( parent, "" ); + break; + case 604: // SUPPRESS HOLES + aDlg = new RepairGUI_RemoveHolesDlg( parent, "" ); + break; + case 605: // SHAPE PROCESSING + aDlg = new RepairGUI_ShapeProcessDlg( parent, "" ); + break; + case 606: // CLOSE CONTOUR + aDlg = new RepairGUI_CloseContourDlg( parent, "" ); + break; + case 607: // REMOVE INTERNAL WIRES + aDlg = new RepairGUI_RemoveIntWiresDlg( parent, "" ); + break; + case 608: // ADD POINT ON EDGE + aDlg = new RepairGUI_DivideEdgeDlg( getGeometryGUI(), parent, "" ); + break; + case 609: // FREE BOUNDARIES + aDlg = new RepairGUI_FreeBoundDlg( getGeometryGUI(), parent ); + break; + case 610: // FREE FACES + aDlg = new RepairGUI_FreeFacesDlg( getGeometryGUI(), parent, "" ); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } + + if ( aDlg ) + aDlg->show(); + + return true; +} + + +//===================================================================================== +// EXPORTED METHODS +//===================================================================================== +extern "C" +{ +#ifdef WNT + __declspec( dllexport ) +#endif + GEOMGUI* GetLibGUI( GeometryGUI* parent ) + { + return RepairGUI::GetRepairGUI( parent ); + } +} diff --git a/src/RepairGUI/RepairGUI_CloseContourDlg.cxx b/src/RepairGUI/RepairGUI_CloseContourDlg.cxx new file mode 100644 index 000000000..e5bb3a708 --- /dev/null +++ b/src/RepairGUI/RepairGUI_CloseContourDlg.cxx @@ -0,0 +1,398 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_CloseContourDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_CloseContourDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include +#include +#include + +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_CloseContourDlg() +// purpose : Constructs a RepairGUI_CloseContourDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_CloseContourDlg::RepairGUI_CloseContourDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CLOSECONTOUR"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CLOSECONTOUR_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_CLOSECONTOUR_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("Contour to close")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + QGridLayout* aSelectWiresLay = new QGridLayout( 0, 1, 1, 0, 6, "aSelectWiresLay"); + + mySelectWiresBtn = new QPushButton( GroupPoints->GroupBox1, "mySelectWiresBtn" ); + mySelectWiresBtn->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresBtn->sizePolicy().hasHeightForWidth() ) ); + mySelectWiresBtn->setText( trUtf8( "" ) ); + mySelectWiresBtn->setPixmap(image1); + + mySelectWiresEdt = new QLineEdit( GroupPoints->GroupBox1, "mySelectWiresEdt" ); + mySelectWiresEdt->setReadOnly( true ); + + mySelectWiresLbl = new QLabel( tr( "Contour to close" ), GroupPoints->GroupBox1, "ContourLbl" ); + mySelectWiresLbl->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresLbl->sizePolicy().hasHeightForWidth() ) ); + + aSelectWiresLay->addWidget( mySelectWiresLbl, 0, 0 ); + aSelectWiresLay->addWidget( mySelectWiresBtn, 0, 1 ); + aSelectWiresLay->addWidget( mySelectWiresEdt, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + aSelectWiresLay->addItem( spacer, 1, 2 ); + + myIsVertexGr = new QButtonGroup( 2, Qt::Vertical, GroupPoints ); + myIsVertexGr->setFrameStyle( QFrame::NoFrame ); + myIsVertexGr->setRadioButtonExclusive( true ); + myIsVertexGr->insert( new QRadioButton( tr( "Close by common vertex" ), myIsVertexGr ), 0 ); + myIsVertexGr->insert( new QRadioButton( tr( "Close by new edge" ), myIsVertexGr ), 1 ); + myIsVertexGr->find( 0 )->toggle(); + + Layout1->addWidget(GroupPoints, 2, 0); + GroupPoints->getGroupBoxLayout()->addLayout( aSelectWiresLay, 1, 0 ); + GroupPoints->getGroupBoxLayout()->addMultiCellWidget(myIsVertexGr, 2, 2, 0, 2); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_CloseContourDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_CloseContourDlg::~RepairGUI_CloseContourDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd = new GEOM::short_array(); + myWiresInd->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelectWiresBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(mySelectWiresEdt, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "CLOSE_CONTOUR_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_CloseContourDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_CloseContourDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void RepairGUI_CloseContourDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText( "" ); + mySelectWiresEdt->setText( "" ); + + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + myObject = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == mySelectWiresEdt ) + myWiresInd->length( 0 ); + + if ( IObjectCount() == 1 ) + { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) // face selection + { + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes && GEOMBase::IsShape( myObject ) ) + { + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + TopoDS_Shape aShape; + if ( myGeomBase->GetShape( myObject, aShape, TopAbs_WIRE ) ) + mySelectWiresEdt->setText( myEditCurrentArgument->text() ); + } + else + myObject = GEOM::GEOM_Object::_nil(); + } + else if ( myEditCurrentArgument == mySelectWiresEdt ) + { + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + const int n = aMap.Extent(); + myWiresInd->length( n ); + for ( int i = 1; i <= n; i++ ) + myWiresInd[ i-1 ] = aMap( i ); + if ( n ) + myEditCurrentArgument->setText( QString::number( n ) + "_" + tr( "GEOM_WIRE" ) + tr( "_S_" ) ); + } + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == GroupPoints->PushButton1 ) + myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == mySelectWiresBtn && !myObject->_is_nil() ) + myEditCurrentArgument = mySelectWiresEdt; + if ( myEditCurrentArgument ) + { + initSelection(); + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == GroupPoints->LineEdit1 || send == mySelectWiresEdt ) + { + myEditCurrentArgument = (QLineEdit*)send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + mySelectWiresEdt->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_CloseContourDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_CloseContourDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_CloseContourDlg::isValid( QString& msg ) +{ + TopoDS_Shape aTmpShape; + return !myObject->_is_nil() && ( myWiresInd->length() || myGeomBase->GetShape( myObject, aTmpShape, TopAbs_WIRE ) ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_CloseContourDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->CloseContour( myObject, myWiresInd, getIsByVertex() ); + bool aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + + return aResult; +} + +//================================================================================= +// function : getIsByVertex +// purpose : +//================================================================================= +bool RepairGUI_CloseContourDlg::getIsByVertex() const +{ + return myIsVertexGr->find( 0 )->isOn(); +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_CloseContourDlg::initSelection() +{ + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + { + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_COMPOUND ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_FACE ); + aTypes.Add( GEOM_WIRE ); + + globalSelection( aTypes ); + } + else if ( myEditCurrentArgument == mySelectWiresEdt ) + { + localSelection( myObject, TopAbs_EDGE ); + localSelection( myObject, TopAbs_WIRE ); + } +} + + diff --git a/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx b/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx new file mode 100644 index 000000000..969b7162a --- /dev/null +++ b/src/RepairGUI/RepairGUI_DivideEdgeDlg.cxx @@ -0,0 +1,365 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_DivideEdgeDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_DivideEdgeDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include + +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_DivideEdgeDlg() +// purpose : Constructs a RepairGUI_DivideEdgeDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg (GeometryGUI* theGeometryGUI, QWidget* parent, + const char* name, bool modal, WFlags fl) + : GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | + WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + myGeomGUI = theGeometryGUI; + + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_DIVIDE_EDGE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_DIVIDE_EDGE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_DIVIDE_EDGE_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ADD_POINT")); + GroupPoints->TextLabel1->setText(tr("GEOM_EDGE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + myIsParameterGr = new QButtonGroup( 2, Qt::Vertical, GroupPoints ); + myIsParameterGr->setFrameStyle( QFrame::NoFrame ); + myIsParameterGr->setRadioButtonExclusive( true ); + myIsParameterGr->insert( new QRadioButton( tr( "GEOM_BY_PARAMETER" ), myIsParameterGr ), 0 ); + myIsParameterGr->insert( new QRadioButton( tr( "GEOM_BY_LENGTH" ), myIsParameterGr ), 1 ); + myIsParameterGr->find( 0 )->toggle(); + + QGridLayout* aLay = new QGridLayout( 0, 1, 2, 0, 6, "aLay" ); + myValEdt = new QtxDblSpinBox(0., 1., 0.1, GroupPoints->GroupBox1); + myValEdt->setPrecision( 3 ); + myValEdt->setValue( 0.5 ); + QLabel* aLbl1 = new QLabel( tr( "GEOM_VALUE" ), GroupPoints->GroupBox1 ); + aLay->addWidget( aLbl1, 0, 0 ); + aLay->addWidget( myValEdt, 0, 1 ); + + Layout1->addWidget(GroupPoints, 2, 0); + GroupPoints->getGroupBoxLayout()->addMultiCellWidget(myIsParameterGr, 1, 1, 0, 2); + GroupPoints->getGroupBoxLayout()->addLayout( aLay, 2, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_DivideEdgeDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_DivideEdgeDlg::~RepairGUI_DivideEdgeDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + myIndex = -1; + + //myGeomGUI->SetState( 0 ); + initSelection(); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + 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())); + + initName( tr( "DEVIDE_EDGE_NEW_OBJECT_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_DivideEdgeDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_DivideEdgeDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myIndex = -1; + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void RepairGUI_DivideEdgeDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + myObject = GEOM::GEOM_Object::_nil(); + myIndex = -1; + + if ( IObjectCount() == 1 ) + { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + Standard_Boolean aRes; + GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( !CORBA::is_nil( aSelectedObj ) && aRes ) + { + TopoDS_Shape aShape; + if ( myGeomBase->GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) + { + const int aType = aShape.ShapeType(); + if ( aType <= TopAbs_EDGE ) // edge, wire, face, shell, solid, compound + { + GEOM::short_array anIndexes; + + TColStd_IndexedMapOfInteger aMap; + SalomeApp_Application* anApp = + (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + anApp->selectionMgr()->GetIndexes( anIO, aMap ); + + if ( !aMap.IsEmpty() ) // subshape selection + { + myIndex = aMap( 1 ); + myObject = aSelectedObj; + myEditCurrentArgument->setText( tr( "GEOM_EDGE" ) + "_1" ); + } + else if ( aType == TopAbs_EDGE ) // single shape selection + { + myIndex = -1; + myObject = aSelectedObj; + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + } + else // face, shell, solid or compound was selected, and NOT its subshape. + { + myIndex = -1; + myObject = GEOM::GEOM_Object::_nil(); + } + } + } + } + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::SetEditCurrentArgument() +{ + if( sender() == GroupPoints->PushButton1 ) + { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::LineEditReturnPressed() +{ + if( sender() == GroupPoints->LineEdit1 ) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + myObject = GEOM::GEOM_Object::_nil(); + myIndex = -1; + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_DivideEdgeDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_DivideEdgeDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_DivideEdgeDlg::isValid( QString& msg ) +{ + return !myObject->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_DivideEdgeDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->DivideEdge + ( myObject, myIndex, myValEdt->value(), getIsByParameter() ); + bool aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + + return aResult; +} + +//================================================================================= +// function : getIsByParameter +// purpose : +//================================================================================= +bool RepairGUI_DivideEdgeDlg::getIsByParameter() const +{ + return myIsParameterGr->find( 0 )->isOn(); +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_DivideEdgeDlg::initSelection() +{ + GEOM::GEOM_Object_var aNullGeomObject; + localSelection( aNullGeomObject, TopAbs_EDGE ); // load local selection on ALL objects +} diff --git a/src/RepairGUI/RepairGUI_DivideEdgeDlg.h b/src/RepairGUI/RepairGUI_DivideEdgeDlg.h new file mode 100644 index 000000000..02cf3a262 --- /dev/null +++ b/src/RepairGUI/RepairGUI_DivideEdgeDlg.h @@ -0,0 +1,88 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_DivideEdgeDlg.h +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#ifndef DIALOGBOX_DivideEdge_H +#define DIALOGBOX_DivideEdge_H + +#include "GEOMBase_Skeleton.h" +#include "DlgRef_1Sel_Ext.h" +#include "QtxDblSpinBox.h" + +#include + +#include +#include + +//================================================================================= +// class : RepairGUI_DivideEdgeDlg +// purpose : +//================================================================================= +class RepairGUI_DivideEdgeDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + RepairGUI_DivideEdgeDlg (GeometryGUI* theGeometryGUI, QWidget* parent = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0); + ~RepairGUI_DivideEdgeDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& objects ); + +private : + void Init(); + void enterEvent(QEvent* e); + void closeEvent(QCloseEvent* e); + void initSelection(); + + bool getIsByParameter() const; + + GEOM::GEOM_Object_var myObject; + int myIndex; + + DlgRef_1Sel_Ext* GroupPoints; + QButtonGroup* myIsParameterGr; + QtxDblSpinBox* myValEdt; + +protected slots: + void ClickOnOk(); + bool ClickOnApply(); + void ClickOnCancel(); + + void ActivateThisDialog(); + void DeactivateActiveDialog(); + + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); +}; + +#endif // DIALOGBOX_DivideEdge_H diff --git a/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx b/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx new file mode 100644 index 000000000..896c0f0d4 --- /dev/null +++ b/src/RepairGUI/RepairGUI_FreeBoundDlg.cxx @@ -0,0 +1,282 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_FreeBoundDlg.cxx +// Author : Sergey LITONIN +// Module : GEOM +// $Header$ + +#include "RepairGUI_FreeBoundDlg.h" +#include "GEOMBase.h" +#include "GeometryGUI.h" +#include "GEOM_Displayer.h" +#include "GEOMImpl_Types.hxx" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" + +#include + +#include +#include +#include +#include +#include + +#define SPACING 5 +#define MARGIN 10 + +/* + Calss : RepairGUI_FreeBoundDlg + Description : Dialog for displaying free boundaries of selected face, shell or solid +*/ + + +//================================================================================= +// function : RepairGUI_FreeBoundDlg +// purpose : Constructor +//================================================================================= +RepairGUI_FreeBoundDlg::RepairGUI_FreeBoundDlg( GeometryGUI* theGUI, QWidget* theParent ) +: QDialog( theParent, "RepairGUI_FreeBoundDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ), + GEOMBase_Helper( dynamic_cast( theParent ) ), + myGeomGUI ( theGUI ) +{ + setCaption( tr( "CAPTION" ) ); + + QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr( "ICON_SELECT" ) ) ); + + QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, tr( "FREE_BOUND" ), this ); + + QGroupBox* aSelGrp = new QGroupBox( 1, Qt::Vertical, aMainGrp ); + aSelGrp->setInsideMargin( 0 ); + aSelGrp->setFrameStyle( QFrame::NoFrame ); + new QLabel( tr( "GEOM_OBJECT" ), aSelGrp ); + ( new QPushButton( aSelGrp ) )->setPixmap( iconSelect ); + myEdit = new QLineEdit( aSelGrp ); + myEdit->setReadOnly( true ); + myEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myClosedLbl = new QLabel( tr( "NUMBER_CLOSED" ), aMainGrp ); + myOpenLbl = new QLabel( tr( "NUMBER_OPEN" ), aMainGrp ); + + QFrame* aFrame = new QFrame( this ); + aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken ); + QPushButton* aCloseBtn = new QPushButton( tr( "GEOM_BUT_CLOSE" ), aFrame ); + QHBoxLayout* aBtnLay = new QHBoxLayout( aFrame, MARGIN, SPACING ); + aBtnLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + aBtnLay->addWidget( aCloseBtn ); + aBtnLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + + QVBoxLayout* aLay = new QVBoxLayout( this ); + aLay->setSpacing( SPACING ); + aLay->setMargin( MARGIN ); + aLay->addWidget( aMainGrp ); + aLay->addWidget( aFrame ); + + connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) ); + + Init(); +} + +//================================================================================= +// function : ~RepairGUI_FreeBoundDlg +// purpose : Destructor +//================================================================================= +RepairGUI_FreeBoundDlg::~RepairGUI_FreeBoundDlg() +{ +} + +//================================================================================= +// function : onClose +// purpose : SLOT. Called when "close" button pressed. Close dialog +//================================================================================= +void RepairGUI_FreeBoundDlg::onClose() +{ + globalSelection(); + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); + reject(); + erasePreview(); +} + +//================================================================================= +// function : onDeactivate +// purpose : Deactivate this dialog +//================================================================================= +void RepairGUI_FreeBoundDlg::onDeactivate() +{ + setEnabled(false); + globalSelection(); + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); +} + +//================================================================================= +// function : onActivate +// purpose : Activate this dialog +//================================================================================= +void RepairGUI_FreeBoundDlg::onActivate() +{ + myGeomGUI->EmitSignalDeactivateDialog(); + setEnabled( true ); + myGeomGUI->SetActiveDialogBox( this ); + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) ); + activateSelection(); + onSelectionDone(); +} + +//================================================================================= +// function : onSelectionDone +// purpose : SLOT. Called when selection changed. +//================================================================================= +void RepairGUI_FreeBoundDlg::onSelectionDone() +{ + if( IObjectCount() != 1 ) + return; + + Standard_Boolean isOk = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), isOk ); + + if ( !isOk || anObj->_is_nil() || !GEOMBase::IsShape( anObj ) ) + return; + else + { + myObj = anObj; + displayPreview( false, true, true, 3 ); + } + +} + +//================================================================================= +// function : Init +// purpose : Initialize dialog fields +//================================================================================= +void RepairGUI_FreeBoundDlg::Init() +{ + myNbClosed = myNbOpen = 0; + myObj = GEOM::GEOM_Object::_nil(); + + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT ( onDeactivate() ) ); + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) ); + + activateSelection(); + onSelectionDone(); +} + +//================================================================================= +// function : enterEvent +// purpose : Activate dialog +//================================================================================= +void RepairGUI_FreeBoundDlg::enterEvent( QEvent* e ) +{ + onActivate(); +} + +//================================================================================= +// function : closeEvent +// purpose : Close dialog +//================================================================================= +void RepairGUI_FreeBoundDlg::closeEvent( QCloseEvent* e ) +{ + onClose(); +} + +//================================================================================= +// function : activateSelection +// purpose : activate selection of faces, shells, and solids +//================================================================================= +void RepairGUI_FreeBoundDlg::activateSelection() +{ + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_FACE ); + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_SOLID ); + aMap.Add( GEOM_COMPOUND ); + globalSelection( aMap ); +} + +//================================================================================= +// function : createOperation +// purpose : Create operation +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_FreeBoundDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_FreeBoundDlg::isValid( QString& msg ) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : execute +// purpose : Get free boundaries +//================================================================================= +bool RepairGUI_FreeBoundDlg::execute( ObjectList& objects ) +{ + if ( !IsPreview() || myObj->_is_nil() ) + return false; + + GEOM::ListOfGO_var aClosed, anOpen; + + bool result = GEOM::GEOM_IHealingOperations::_narrow( + getOperation() )->GetFreeBoundary( myObj, aClosed, anOpen ); + + if ( result ) + { + myNbClosed = aClosed->length(); + myNbOpen = anOpen->length(); + int i; + for ( i = 0; i < myNbClosed; i++ ) + objects.push_back( aClosed[i]._retn() ); + for ( i = 0; i < myNbOpen; i++ ) + objects.push_back( anOpen[i]._retn() ); + + myEdit->setText( GEOMBase::GetName( myObj ) ); + QString aLabelText = tr( "NUMBER_CLOSED" ) + QString( "%1" ).arg( myNbClosed ); + myClosedLbl->setText( aLabelText ); + aLabelText = tr( "NUMBER_OPEN" ) + QString( "%1" ).arg( myNbOpen ); + myOpenLbl->setText( aLabelText ); + } + else + { + myEdit->setText( GEOMBase::GetName( myObj ) ); + myClosedLbl->setText( tr( "NUMBER_CLOSED" ) ); + myOpenLbl->setText( tr( "NUMBER_OPEN" ) ); + } + + return result; +} + + + diff --git a/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx b/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx new file mode 100644 index 000000000..3143b7fec --- /dev/null +++ b/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx @@ -0,0 +1,330 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_FreeFacesDlg.cxx +// Author : VKN +// Module : GEOM +// $Header$ + +#include "RepairGUI_FreeFacesDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SalomeApp_Tools.h" + +#include "SUIT_Session.h" +#include "SUIT_OverrideCursor.h" + +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" +#include +#include +#include +#include "GEOMBase.h" +#include "GeometryGUI.h" +#include "GEOM_Displayer.h" + +#include +#include +#include +#include +#include +#include +#define SPACING 5 +#define MARGIN 10 +#define MIN_WIDTH 200 + +using namespace std; + +//================================================================================= +// class : RepairGUI_FreeFacesDlg() +// purpose : Constructs a RepairGUI_FreeFacesDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_FreeFacesDlg::RepairGUI_FreeFacesDlg(GeometryGUI* GUI, QWidget* parent, const char* name, bool modal, WFlags fl) +:QDialog( parent, "RepairGUI_FreeBoundDlg", false, + WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ), + GEOMBase_Helper( dynamic_cast( parent ) ), + myGeomGUI( GUI ) +{ + myDisplayer = 0; + + setSizeGripEnabled( TRUE ); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_FREE_FACES_TITLE")); + + /***************************************************************/ + + QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, tr( "GEOM_SELECTED_SHAPE" ), this ); + + + QGroupBox* aSelGrp = new QGroupBox( 1, Qt::Vertical, aMainGrp ); + + aSelGrp->setInsideMargin( 0 ); + aSelGrp->setFrameStyle( QFrame::NoFrame ); + new QLabel( tr( "GEOM_OBJECT" ), aSelGrp ); + mySelBtn = new QPushButton( aSelGrp ); + mySelBtn->setPixmap( image1 ); + myEdit = new QLineEdit( aSelGrp ); + myEdit->setReadOnly( true ); + myEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myEdit->setMinimumWidth( MIN_WIDTH ); + + QFrame* aFrame = new QFrame( this ); + aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken ); + QPushButton* aCloseBtn = new QPushButton( tr( "GEOM_BUT_CLOSE" ), aFrame ); + QHBoxLayout* aBtnLay = new QHBoxLayout( aFrame, MARGIN, SPACING ); + aBtnLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + aBtnLay->addWidget( aCloseBtn ); + aBtnLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + + QVBoxLayout* aLay = new QVBoxLayout( this ); + aLay->setSpacing( SPACING ); + aLay->setMargin( MARGIN ); + aLay->addWidget( aMainGrp ); + aLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + aLay->addWidget( aFrame ); + + connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) ); + connect( mySelBtn, SIGNAL( clicked() ), + this, SLOT ( onSetEditCurrentArgument() ) ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_FreeFacesDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_FreeFacesDlg::~RepairGUI_FreeFacesDlg() +{ +} + + +//================================================================================= +// function : onClose +// purpose : SLOT. Called when "close" button pressed. Close dialog +//================================================================================= +void RepairGUI_FreeFacesDlg::onClose() +{ + globalSelection(); + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); + reject(); + erasePreview(); +} + +//================================================================================= +// function : onDeactivate +// purpose : Deactivate this dialog +//================================================================================= +void RepairGUI_FreeFacesDlg::onDeactivate() +{ + setEnabled(false); + globalSelection(); + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + myGeomGUI->SetActiveDialogBox( 0 ); +} + +//================================================================================= +// function : onActivate +// purpose : Activate this dialog +//================================================================================= +void RepairGUI_FreeFacesDlg::onActivate() +{ + myGeomGUI->EmitSignalDeactivateDialog(); + setEnabled( true ); + myGeomGUI->SetActiveDialogBox( this ); + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), SLOT ( onSelectionDone() ) ); + activateSelection(); +} + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::Init() +{ + myObj = GEOM::GEOM_Object::_nil(); + + /* signals and slots connections */ + connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT ( onDeactivate() ) ); + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL( currentSelectionChanged() ), SLOT ( onSelectionDone() ) ); + + activateSelection(); + onSelectionDone(); +} + +//================================================================================= +// function : onSelectionDone +// purpose : SLOT. Called when selection changed. +//================================================================================= +void RepairGUI_FreeFacesDlg::onSelectionDone() +{ + erasePreview(); + if( IObjectCount() != 1 ) + { + myEdit->setText( "" ); + return; + } + + Standard_Boolean isOk = Standard_False; + GEOM::GEOM_Object_var anObj = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), isOk ); + + if ( !isOk || anObj->_is_nil() || !GEOMBase::IsShape( anObj ) ) + { + myEdit->setText( "" ); + return; + } + else + { + myObj = anObj; + displayPreview( false, true, true, 3 ); + } +} + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_FreeFacesDlg::enterEvent(QEvent* e) +{ + onActivate(); +} + +//================================================================================= +// function : activateSelection +// purpose : activate selection of faces, shells, and solids +//================================================================================= +void RepairGUI_FreeFacesDlg::activateSelection() +{ + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_SOLID ); + aMap.Add( GEOM_COMPOUND ); + globalSelection( aMap ); +} + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::closeEvent(QCloseEvent* e) +{ + onClose(); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_FreeFacesDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_FreeFacesDlg::isValid( QString& msg ) +{ + return !myObj->_is_nil() ; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_FreeFacesDlg::execute( ObjectList& objects ) +{ + bool aResult = false; + GEOM::ListOfLong_var aFaceLst = + GEOM::GEOM_IShapesOperations::_narrow( getOperation() )->GetFreeFacesIDs( myObj ); + TopoDS_Shape aSelShape; + TopoDS_Shape aFace; + TopTools_IndexedMapOfShape anIndices; + if ( !myObj->_is_nil() && GEOMBase::GetShape( myObj, aSelShape ) ) + { + myEdit->setText( GEOMBase::GetName( myObj ) ); + QString aMess; + if ( !isValid( aMess ) ) + { + erasePreview( true ); + return false; + } + + SUIT_OverrideCursor(); + + TopExp::MapShapes( aSelShape, anIndices); + SALOME_Prs* aPrs = 0; + + for ( int i = 0, n = aFaceLst->length(); i < n; i++ ) + { + aFace = anIndices.FindKey( aFaceLst[i] ); + try + { + getDisplayer()->SetColor( Quantity_NOC_RED ); + getDisplayer()->SetToActivate( false ); + aPrs = !aFace.IsNull() ? getDisplayer()->BuildPrs( aFace ) : 0; + if ( aPrs ) + displayPreview( aPrs, true ); + } + catch( const SALOME::SALOME_Exception& e ) + { + SalomeApp_Tools::QtCatchCorbaException( e ); + } + } + } + return aResult; +} + +//================================================================ +// Function : getDisplayer +// Purpose : +//================================================================ +GEOM_Displayer* RepairGUI_FreeFacesDlg::getDisplayer() +{ + if ( !myDisplayer ) + myDisplayer = new GEOM_Displayer( getStudy() ); + return myDisplayer; +} + +//================================================================================= +// function : SetEditCurrentArgument +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::onSetEditCurrentArgument() +{ + myEdit->setFocus(); + onSelectionDone(); +} + diff --git a/src/RepairGUI/RepairGUI_GlueDlg.cxx b/src/RepairGUI/RepairGUI_GlueDlg.cxx new file mode 100644 index 000000000..789a0a704 --- /dev/null +++ b/src/RepairGUI/RepairGUI_GlueDlg.cxx @@ -0,0 +1,447 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_GlueDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_GlueDlg.h" +#include "DlgRef_1Sel_Ext.h" +#include "GEOMImpl_Types.hxx" + +#include "QtxDblSpinBox.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SalomeApp_Study.h" +#include "SalomeApp_Tools.h" + +#include "SUIT_Session.h" +#include "SUIT_MessageBox.h" +#include "SUIT_OverrideCursor.h" + +#include "SALOME_ListIteratorOfListIO.hxx" + +#include + +#include +#include + +using namespace std; + +#define DEFAULT_TOLERANCE_VALUE 1e-07 + +//================================================================================= +// class : RepairGUI_GlueDlg() +// purpose : Constructs a RepairGUI_GlueDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_GlueDlg::RepairGUI_GlueDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_GLUE_FACES"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_GLUE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_GLUE_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_GLUE")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + 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 );//QAD_SpinBoxDbl( GroupPoints->GroupBox1, 0, 100, 1e-7, 10, 1e-10 ); + myTolEdt->setPrecision( 10 ); + myTolEdt->setValue( DEFAULT_TOLERANCE_VALUE ); + + aLay->addWidget( aLbl1, 0, 0 ); + aLay->addWidget( myTolEdt, 0, 1 ); + + GroupPoints->getGroupBoxLayout()->addLayout( aLay, 3, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_GlueDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_GlueDlg::~RepairGUI_GlueDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + + //myGeomGUI->SetState( 0 ); + globalSelection( GEOM_COMPOUND ); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + 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())); + + initName( tr( "GLUE_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_GlueDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_GlueDlg::ClickOnApply() +{ + if ( !onAcceptLocal() ) + return false; + + initName(); + + GroupPoints->LineEdit1->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + globalSelection( GEOM_COMPOUND ); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void RepairGUI_GlueDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + if ( IObjectCount() == 1 ) { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes ) + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == GroupPoints->PushButton1 ) { + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == GroupPoints->LineEdit1 ) { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + GroupPoints->LineEdit1->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + //myGeomGUI->SetState( 0 ); + globalSelection( GEOM_COMPOUND ); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_GlueDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_GlueDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_GlueDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_GlueDlg::isValid( QString& msg ) +{ + return !myObject->_is_nil() && ( IsPreview() || myTolEdt->value() > 0. ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +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() ); + + return aResult; +} + +//================================================================ +// Function : clearShapeBufferLocal +// Purpose : +//================================================================ +void RepairGUI_GlueDlg::clearShapeBufferLocal( GEOM::GEOM_Object_ptr theObj ) +{ + if ( CORBA::is_nil( theObj ) ) + return; + + string IOR = myGeomGUI->getApp()->orb()->object_to_string( theObj ); + TCollection_AsciiString asciiIOR( strdup( IOR.c_str() ) ); + myGeomGUI->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); + + if ( !getStudy() || !( getStudy()->studyDS() ) ) + return; + + _PTR(Study) aStudy = getStudy()->studyDS(); + _PTR(SObject) aSObj ( aStudy->FindObjectIOR( IOR ) ); + if ( !aSObj ) + return; + + _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); + for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + _PTR(GenericAttribute) anAttr; + if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { + _PTR(AttributeIOR) anIOR ( anAttr ); + TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); + myGeomGUI->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); + } + } +} + +//================================================================ +// Function : onAccept +// Purpose : This method should be called from dialog's slots onOk() and onApply() +// 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 ) +{ + if ( !getStudy() || !( getStudy()->studyDS() ) ) + return false; + + _PTR(Study) aStudy = getStudy()->studyDS(); + + bool aLocked = aStudy->GetProperties()->IsLocked(); + 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") ); + return false; + } + + QString msg; + if ( !isValid( msg ) ) { + showError( msg ); + return false; + } + + erasePreview( false ); + + try { + if ( ( !publish && !useTransaction ) || 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(); + abortCommand(); + 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 ); + } + } + + 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() ) { + wc.suspend(); + QString msgw = QObject::tr( getOperation()->GetErrorCode() ); + SUIT_MessageBox::warn1((QWidget*)(SUIT_Session::session()->activeApplication()->desktop()), + QObject::tr( "WRN_WARNING" ), + msgw, + QObject::tr( "BUT_OK" )); + } + } + // JFA 28.12.2004 END + } + } + } + catch( const SALOME::SALOME_Exception& e ) { + SalomeApp_Tools::QtCatchCorbaException( e ); + abortCommand(); + } + + updateViewer(); + + return true; +} diff --git a/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx b/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx new file mode 100644 index 000000000..6dc3188eb --- /dev/null +++ b/src/RepairGUI/RepairGUI_RemoveHolesDlg.cxx @@ -0,0 +1,448 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_RemoveHolesDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_RemoveHolesDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_MessageBox.h" +#include "SUIT_Session.h" + +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_RemoveHolesDlg() +// purpose : Constructs a RepairGUI_RemoveHolesDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_RemoveHolesDlg::RepairGUI_RemoveHolesDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SUPPRESS_HOLES"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_REMOVE_HOLES_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_REMOVE_HOLES_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_HOLES")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + + myAllChk = new QCheckBox( tr( "GEOM_REMOVE_ALL_HOLES" ), GroupPoints->GroupBox1 ); + + QGridLayout* aSelectWiresLay = new QGridLayout( 0, 1, 1, 0, 6, "aSelectWiresLay"); + + mySelectWiresBtn = new QPushButton( GroupPoints->GroupBox1, "mySelectWiresBtn" ); + mySelectWiresBtn->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresBtn->sizePolicy().hasHeightForWidth() ) ); + mySelectWiresBtn->setText( trUtf8( "" ) ); + mySelectWiresBtn->setPixmap(image1); + + mySelectWiresEdt = new QLineEdit( GroupPoints->GroupBox1, "mySelectWiresEdt" ); + mySelectWiresEdt->setReadOnly( true ); + + mySelectWiresLbl = new QLabel( tr( "GEOM_WIRES_TO_REMOVE" ), GroupPoints->GroupBox1, "TextLabel1" ); + mySelectWiresLbl->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresLbl->sizePolicy().hasHeightForWidth() ) ); + + aSelectWiresLay->addWidget( mySelectWiresLbl, 0, 0 ); + aSelectWiresLay->addWidget( mySelectWiresBtn, 0, 1 ); + aSelectWiresLay->addWidget( mySelectWiresEdt, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + aSelectWiresLay->addItem( spacer, 1, 2 ); + + QGridLayout* aDetectLay = new QGridLayout( 0, 1, 1, 0, 6, "aDetectLay" ); + myFreeBoundBtn = new QPushButton( tr( "GEOM_DETECT" ), GroupPoints->GroupBox1 ); + QLabel* aLbl = new QLabel( tr( "GEOM_FREE_BOUNDARIES" ), GroupPoints->GroupBox1 ); + aDetectLay->addWidget( aLbl, 0, 0 ); + aDetectLay->addWidget( myFreeBoundBtn, 0, 1 ); + + GroupPoints->getGroupBoxLayout()->addMultiCellWidget( myAllChk, 1, 1, 0, 2 ); + GroupPoints->getGroupBoxLayout()->addLayout( aSelectWiresLay, 2, 0 ); + GroupPoints->getGroupBoxLayout()->addLayout( aDetectLay, 3, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_RemoveHolesDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_RemoveHolesDlg::~RepairGUI_RemoveHolesDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd = new GEOM::short_array(); + myWiresInd->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); + + myClosed = -1; + myOpen = -1; + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelectWiresBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(mySelectWiresEdt, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + connect( myAllChk, SIGNAL( clicked() ), this, SLOT( onRemoveAllClicked() ) ); + connect( myFreeBoundBtn, SIGNAL(clicked()), this, SLOT(onDetect()) ); + + initName( tr( "REMOVE_HOLES_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_RemoveHolesDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_RemoveHolesDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + mySelectWiresEdt->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void RepairGUI_RemoveHolesDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myObject = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == mySelectWiresEdt ) myWiresInd->length( 0 ); + + if ( IObjectCount() == 1 ) + { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) // face selection + { + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes && GEOMBase::IsShape( myObject ) ) + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + else + myObject = GEOM::GEOM_Object::_nil(); + } + else if ( myEditCurrentArgument == mySelectWiresEdt && !myAllChk->isChecked() ) + { + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + const int n = aMap.Extent(); + myWiresInd->length( n ); + for ( int i = 1; i <= n; i++ ) + myWiresInd[i-1] = aMap( i ); + if ( n ) + myEditCurrentArgument->setText( QString::number( n ) + "_" + tr( "GEOM_WIRE" ) + tr( "_S_" ) ); + } + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == GroupPoints->PushButton1 ) + myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == mySelectWiresBtn && !myObject->_is_nil() ) + myEditCurrentArgument = mySelectWiresEdt; + if ( myEditCurrentArgument ) + { + initSelection(); + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == GroupPoints->LineEdit1 || send == mySelectWiresEdt ) + { + myEditCurrentArgument = (QLineEdit*)send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + mySelectWiresEdt->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + myClosed = -1; + myOpen = -1; + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_RemoveHolesDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_RemoveHolesDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_RemoveHolesDlg::isValid( QString& msg ) +{ + myClosed = -1; + return !myObject->_is_nil() && ( IsPreview() || myAllChk->isChecked() || myWiresInd->length() ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_RemoveHolesDlg::execute( ObjectList& objects ) +{ + bool aResult = false; + if ( IsPreview() ) // called from onDetect(): detect free boundary edges, highlight them (add to objects), display message dialog + { + GEOM::ListOfGO_var aClosed, anOpen; + + aResult = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->GetFreeBoundary( myObject, aClosed, anOpen ); + + if ( aResult ) + { + myClosed = aClosed->length(); + myOpen = anOpen->length(); + int i; + for ( i = 0; i < myClosed; i++ ) + objects.push_back( aClosed[i]._retn() ); + for ( i = 0; i < myOpen; i++ ) + objects.push_back( anOpen[i]._retn() ); + } + else + myClosed = -1; + } + else + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->FillHoles( myObject, myWiresInd ); + aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + } + + return aResult; +} + +//================================================================================= +// function : onRemoveAllClicked +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::onRemoveAllClicked() +{ + bool b = myAllChk->isOn(); + mySelectWiresLbl->setEnabled( !b ); + mySelectWiresBtn->setEnabled( !b ); + mySelectWiresEdt->setEnabled( !b ); + if ( b ) + { + mySelectWiresEdt->setText( "" ); + myWiresInd->length( 0 ); + } +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::initSelection() +{ + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + { + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_COMPOUND ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_FACE ); + + globalSelection( aTypes ); + } + else if ( myEditCurrentArgument == mySelectWiresEdt ) + { + localSelection( myObject, TopAbs_EDGE ); + localSelection( myObject, TopAbs_WIRE ); + } +} + + +//================================================================================= +// function : onDetect +// purpose : +//================================================================================= +void RepairGUI_RemoveHolesDlg::onDetect() +{ + displayPreview( false, true, true, 3 ); + + // field myClosed,myOpen is initialized in execute() method, called by displayPreview(). + QString msg; + if ( myClosed != -1 ) + msg = tr( "GEOM_FREE_BOUNDS_MSG" ).arg( myClosed + myOpen ).arg( myClosed ).arg( myOpen ); + else + msg = tr( "GEOM_FREE_BOUNDS_ERROR" ); + SUIT_MessageBox::info1( this, tr( "GEOM_FREE_BOUNDS_TLT" ), msg, "Close" ); +} + diff --git a/src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx b/src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx new file mode 100644 index 000000000..91822ded9 --- /dev/null +++ b/src/RepairGUI/RepairGUI_RemoveIntWiresDlg.cxx @@ -0,0 +1,391 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_RemoveIntWiresDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_RemoveIntWiresDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_RemoveIntWiresDlg() +// purpose : Constructs a RepairGUI_RemoveIntWiresDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_RemoveIntWiresDlg::RepairGUI_RemoveIntWiresDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SUPPRESS_INT_WIRES"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_REMOVE_INTERNAL_WIRES_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_REMOVE_INTERNAL_WIRES_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_INTERNAL_WIRES")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_FACE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + + myAllChk = new QCheckBox( tr( "GEOM_REMOVE_ALL_INT_WIRES" ), GroupPoints->GroupBox1 ); + + QGridLayout* aSelectWiresLay = new QGridLayout( 0, 1, 1, 0, 6, "aSelectWiresLay"); + + mySelectWiresBtn = new QPushButton( GroupPoints->GroupBox1, "mySelectWiresBtn" ); + mySelectWiresBtn->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresBtn->sizePolicy().hasHeightForWidth() ) ); + mySelectWiresBtn->setText( trUtf8( "" ) ); + mySelectWiresBtn->setPixmap(image1); + + mySelectWiresEdt = new QLineEdit( GroupPoints->GroupBox1, "mySelectWiresEdt" ); + mySelectWiresEdt->setReadOnly( true ); + + mySelectWiresLbl = new QLabel( tr( "GEOM_WIRES_TO_REMOVE" ), GroupPoints->GroupBox1, "TextLabel1" ); + mySelectWiresLbl->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, mySelectWiresLbl->sizePolicy().hasHeightForWidth() ) ); + + aSelectWiresLay->addWidget( mySelectWiresLbl, 0, 0 ); + aSelectWiresLay->addWidget( mySelectWiresBtn, 0, 1 ); + aSelectWiresLay->addWidget( mySelectWiresEdt, 0, 2 ); + QSpacerItem* spacer = new QSpacerItem( 0, 16, QSizePolicy::Minimum, QSizePolicy::Expanding ); + aSelectWiresLay->addItem( spacer, 1, 2 ); + + GroupPoints->getGroupBoxLayout()->addMultiCellWidget( myAllChk, 1, 1, 0, 2 ); + GroupPoints->getGroupBoxLayout()->addLayout( aSelectWiresLay, 2, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_RemoveIntWiresDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_RemoveIntWiresDlg::~RepairGUI_RemoveIntWiresDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd = new GEOM::short_array(); + myWiresInd->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelectWiresBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(mySelectWiresEdt, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + connect( myAllChk, SIGNAL( clicked() ), this, SLOT( onRemoveAllClicked() ) ); + + initName( tr( "REMOVE_INT_WIRES_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_RemoveIntWiresDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + mySelectWiresEdt->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) myObject = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == mySelectWiresEdt ) myWiresInd->length( 0 ); + + if ( IObjectCount() == 1 ) + { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) // face selection + { + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes && GEOMBase::IsShape( myObject ) ) + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + else + myObject = GEOM::GEOM_Object::_nil(); + } + else if ( myEditCurrentArgument == mySelectWiresEdt && !myAllChk->isChecked() ) + { + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + const int n = aMap.Extent(); + myWiresInd->length( n ); + for ( int i = 1; i <= n; i++ ) + myWiresInd[i-1] = aMap( i ); + if ( n ) + myEditCurrentArgument->setText( QString::number( n ) + "_" + tr( "GEOM_WIRE" ) + tr( "_S_" ) ); + } + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == GroupPoints->PushButton1 ) + myEditCurrentArgument = GroupPoints->LineEdit1; + else if ( send == mySelectWiresBtn && !myObject->_is_nil() ) + myEditCurrentArgument = mySelectWiresEdt; + + if ( myEditCurrentArgument ) + { + initSelection(); + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == GroupPoints->LineEdit1 || send == mySelectWiresEdt ) + { + myEditCurrentArgument = (QLineEdit*)send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setText(""); + mySelectWiresEdt->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + myWiresInd->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_RemoveIntWiresDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_RemoveIntWiresDlg::isValid( QString& msg ) +{ + return !myObject->_is_nil() && ( myAllChk->isChecked() || myWiresInd->length() ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_RemoveIntWiresDlg::execute( ObjectList& objects ) +{ + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->RemoveIntWires( myObject, myWiresInd ); + bool aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + + return aResult; +} + +//================================================================================= +// function : onRemoveAllClicked +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::onRemoveAllClicked() +{ + bool b = myAllChk->isOn(); + mySelectWiresLbl->setEnabled( !b ); + mySelectWiresBtn->setEnabled( !b ); + mySelectWiresEdt->setEnabled( !b ); + if ( b ) + { + mySelectWiresEdt->setText( "" ); + myWiresInd->length( 0 ); + } +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_RemoveIntWiresDlg::initSelection() +{ + if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) + { + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_COMPOUND ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_FACE ); + + globalSelection( aTypes ); + } + else if ( myEditCurrentArgument == mySelectWiresEdt ) + { + //localSelection( myObject, TopAbs_EDGE ); + localSelection( myObject, TopAbs_WIRE ); + } +} + + diff --git a/src/RepairGUI/RepairGUI_SewingDlg.cxx b/src/RepairGUI/RepairGUI_SewingDlg.cxx new file mode 100644 index 000000000..05ed77509 --- /dev/null +++ b/src/RepairGUI/RepairGUI_SewingDlg.cxx @@ -0,0 +1,369 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_SewingDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_SewingDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SUIT_MessageBox.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include +#include + +#define DEFAULT_TOLERANCE_VALUE 1e-07 + +using namespace std; + +//================================================================================= +// class : RepairGUI_SewingDlg() +// purpose : Constructs a RepairGUI_SewingDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_SewingDlg::RepairGUI_SewingDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SEWING"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SEWING_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SEWING_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_Ext(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_SEWING")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + + QGridLayout* aLay = new QGridLayout( 0, 2, 2, 0, 6, "aLay" ); + myTolEdt = new QtxDblSpinBox( 0, 100, 1e-7, GroupPoints->GroupBox1 );//QAD_SpinBoxDbl( GroupPoints->GroupBox1, 0, 100, 1e-7, 10, 1e-10 ); + myTolEdt->setPrecision( 10 ); + myTolEdt->setValue( DEFAULT_TOLERANCE_VALUE ); + QLabel* aLbl1 = new QLabel( tr( "GEOM_TOLERANCE" ), GroupPoints->GroupBox1 ); + myFreeBoundBtn = new QPushButton( tr( "GEOM_DETECT" ), GroupPoints->GroupBox1 ); + QLabel* aLbl2 = new QLabel( tr( "GEOM_FREE_BOUNDARIES" ), GroupPoints->GroupBox1 ); + aLay->addWidget( aLbl1, 0, 0 ); + aLay->addWidget( myTolEdt, 0, 1 ); + aLay->addWidget( aLbl2, 1, 0 ); + aLay->addWidget( myFreeBoundBtn, 1, 1 ); + + GroupPoints->getGroupBoxLayout()->addLayout( aLay, 3, 0 ); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_SewingDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_SewingDlg::~RepairGUI_SewingDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObject = GEOM::GEOM_Object::_nil(); + + //myGeomGUI->SetState( 0 ); + initSelection(); + + myClosed = -1; + myOpen = -1; + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + 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(myFreeBoundBtn, SIGNAL(clicked()), this, SLOT(onDetect())); + + initName( tr( "SEWING_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_SewingDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_SewingDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + GroupPoints->LineEdit1->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection +//================================================================================= +void RepairGUI_SewingDlg::SelectionIntoArgument() +{ + erasePreview(); + myEditCurrentArgument->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + if ( IObjectCount() == 1 ) + { + Handle(SALOME_InteractiveObject) anIO = firstIObject(); + Standard_Boolean aRes; + myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( aRes ) + myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + } +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::SetEditCurrentArgument() +{ + const QObject* send = sender(); + if ( send == GroupPoints->PushButton1 ) + { + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::LineEditReturnPressed() +{ + const QObject* send = sender(); + if( send == GroupPoints->LineEdit1 ) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + GroupPoints->LineEdit1->setText(""); + myObject = GEOM::GEOM_Object::_nil(); + + myClosed = -1; + myOpen = -1; + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_SewingDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_SewingDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_SewingDlg::isValid( QString& msg ) +{ + myClosed = -1; + return !myObject->_is_nil() && ( IsPreview() || myTolEdt->value() > 0. ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_SewingDlg::execute( ObjectList& objects ) +{ + bool aResult = false; + if ( IsPreview() ) // called from onDetect(): detect free boundary edges, highlight them (add to objects), display message dialog + { + GEOM::ListOfGO_var aClosed, anOpen; + + aResult = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->GetFreeBoundary( myObject, aClosed, anOpen ); + + if ( aResult ) + { + myClosed = aClosed->length(); + myOpen = anOpen->length(); + int i; + for ( i = 0; i < myClosed; i++ ) + objects.push_back( aClosed[i]._retn() ); + for ( i = 0; i < myOpen; i++ ) + objects.push_back( anOpen[i]._retn() ); + } + else + myClosed = -1; + } + else + { + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->Sew( myObject, myTolEdt->value() ); + aResult = !anObj->_is_nil(); + if ( aResult ) + objects.push_back( anObj._retn() ); + } + + return aResult; +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::initSelection() +{ + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_COMPOUND ); + globalSelection( aTypes ); +} + +//================================================================================= +// function : onDetect +// purpose : +//================================================================================= +void RepairGUI_SewingDlg::onDetect() +{ + displayPreview( false, true, true, 3 ); + + // field myClosed,myOpen is initialized in execute() method, called by displayPreview(). + QString msg; + if ( myClosed != -1 ) + msg = tr( "GEOM_FREE_BOUNDS_MSG" ).arg( myClosed + myOpen ).arg( myClosed ).arg( myOpen ); + else + msg = tr( "GEOM_FREE_BOUNDS_ERROR" ); + SUIT_MessageBox::info1( this, tr( "GEOM_FREE_BOUNDS_TLT" ), msg, "Close" ); +} diff --git a/src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx b/src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx new file mode 100755 index 000000000..7c9005a1a --- /dev/null +++ b/src/RepairGUI/RepairGUI_ShapeProcessDlg.cxx @@ -0,0 +1,847 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_ShapeProcessDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_ShapeProcessDlg.h" + +#include "GEOMImpl_Types.hxx" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" +#include "SALOME_ListIO.hxx" + +#include +#include + +#include +#include +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_ShapeProcessDlg() +// purpose : Constructs a RepairGUI_ShapeProcessDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_ShapeProcessDlg::RepairGUI_ShapeProcessDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + init(); +} + + +//================================================================================= +// function : ~RepairGUI_ShapeProcessDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_ShapeProcessDlg::~RepairGUI_ShapeProcessDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::init() +{ + //myGeomGUI->SetState( 0 ); + + initParamsValues(); + initSelection(); + + setCaption(tr("GEOM_SHAPEPROCESS_TITLE")); + + GroupConstructors->hide(); + + // select widget on the top + mySelectWdgt = new DlgRef_1Sel_QTD( this, "SelectedObjects" ); + mySelectWdgt->GroupBox1->setTitle( tr("GEOM_SHAPE") ); + mySelectWdgt->TextLabel1->setText( tr("GEOM_SELECTED_OBJECTS") ); + mySelectWdgt->PushButton1->setPixmap( SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT")) ); + mySelectWdgt->LineEdit1->setReadOnly( true ); + + Layout1->addWidget( mySelectWdgt, 0, 0 ); + + // layout the two group boxes in the middle, add a list of operations + QFrame* aMidFrame = new QFrame( this ); + QGridLayout* aMidLay = new QGridLayout( aMidFrame, 1, 3, 0, 5 ); + QGroupBox* anOperGr = new QGroupBox( tr("GEOM_OPERATIONS"), aMidFrame ); + QVBoxLayout* aOperLay = new QVBoxLayout( anOperGr, 0, 0 ); + + myOpList = new QListView( anOperGr ); + myOpList->setSorting( -1 ); + myOpList->addColumn( "Operations" ); + myOpList->header()->hide(); + aOperLay->addWidget( myOpList ); + QStringList::ConstIterator it = myOpLst.end(); + do // iterating from end to begin so to keep the order of items in the listview. + new QCheckListItem ( myOpList, *(--it), QCheckListItem::CheckBox ); + while ( it != myOpLst.begin() ); + + QGroupBox* aParamsGr = new QGroupBox( tr("GEOM_PARAMETERS"), aMidFrame ); + aMidLay->addWidget( anOperGr, 0, 0 ); + aMidLay->addMultiCellWidget( aParamsGr, 0, 0, 1, 3 ); + aMidLay->setColStretch( 0, 1 ); + aMidLay->setColStretch( 1, 2 ); + + Layout1->addWidget( aMidFrame, 2, 0 ); + Layout1->setRowStretch( 0, 0 ); + Layout1->setRowStretch( 1, 1 ); + + // add a widget stack to the parameters group box + myStack = new QWidgetStack( aParamsGr ); + QVBoxLayout* aVParamsLay = new QVBoxLayout( aParamsGr ); + aVParamsLay->addWidget( myStack ); + + // continueties values.. + QStringList aContinueties = QStringList::split( ",", "C0,G1,C1,G2,C2,C3,CN" ); + + // FixShape + QFrame* aFrame = new QFrame( myStack ); + QGridLayout* aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + myFixShapeTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myFixShapeTol3D->setPrecision( 10 ); + myFixShapeMaxTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myFixShapeMaxTol3D->setPrecision( 10 ); + + aLay->addWidget( new QLabel( tr("GEOM_3D_TOLERANCE"), aFrame ), 0, 0 ); + aLay->addWidget( myFixShapeTol3D, 0, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_MAX_3D_TOLERANCE"), aFrame ), 1, 0 ); + aLay->addWidget( myFixShapeMaxTol3D, 1, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "FixShape" ) ); + + // FixFaceSize + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + myFixFaceSizeTol = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myFixFaceSizeTol->setPrecision( 10 ); + + aLay->addWidget( new QLabel( tr("GEOM_TOLERANCE"), aFrame ), 0, 0 ); + aLay->addWidget( myFixFaceSizeTol, 0, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "FixFaceSize" ) ); + + // DropSmallEdges + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + myDropSmallEdgesTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myDropSmallEdgesTol3D->setPrecision( 10 ); + + aLay->addWidget( new QLabel( tr("GEOM_3D_TOLERANCE"), aFrame ), 0, 0 ); + aLay->addWidget( myDropSmallEdgesTol3D, 0, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "DropSmallEdges" ) ); + + // SplitAngle + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + mySplitAngleAngle = new QtxDblSpinBox( 0, 360, 1, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 360, 1 ); + mySplitAngleMaxTol = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + mySplitAngleMaxTol->setPrecision( 10 ); + + aLay->addWidget( new QLabel( tr("GEOM_ANGLE_1"), aFrame ), 0, 0 ); + aLay->addWidget( mySplitAngleAngle, 0, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_MAX_TOLERANCE"), aFrame ), 1, 0 ); + aLay->addWidget( mySplitAngleMaxTol, 1, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "SplitAngle" ) ); + + // SplitClosedFaces + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + mySplitClosedFacesNum = new QSpinBox( aFrame ); + + aLay->addWidget( new QLabel( tr("GEOM_NUM_SPLIT_POINTS"), aFrame ), 0, 0 ); + aLay->addWidget( mySplitClosedFacesNum, 0, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "SplitClosedFaces" ) ); + + // SplitContinuity + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + mySplitContTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + mySplitContTol3D->setPrecision( 10 ); + mySplitContSurfCont = new QComboBox( aFrame ); + mySplitContSurfCont->insertStringList( aContinueties ); + mySplitContCurvCont = new QComboBox( aFrame ); + mySplitContCurvCont->insertStringList( aContinueties ); + + aLay->addWidget( new QLabel( tr("GEOM_3D_TOLERANCE"), aFrame ), 0, 0 ); + aLay->addWidget( mySplitContTol3D, 0, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_SURFACE_CONTINUTY"), aFrame ), 1, 0 ); + aLay->addWidget( mySplitContSurfCont, 1, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_CURVE_CONTINUTY"), aFrame ), 2, 0 ); + aLay->addWidget( mySplitContCurvCont, 2, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "SplitContinuity" ) ); + + // BSplineRestriction + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + myBSplineSurfModeChk = new QCheckBox( tr("GEOM_SURFACE_MODE"), aFrame ); + myBSpline3DCurveChk = new QCheckBox( tr("GEOM_3D_CURVE_MODE"), aFrame ); + myBSpline2DCurveChk = new QCheckBox( tr("GEOM_2D_CURVE_MODE"), aFrame ); + + myBSplineTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myBSplineTol3D->setPrecision( 10 ); + + myBSplineTol2D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myBSplineTol2D->setPrecision( 10 ); + + myBSplineDegree = new QSpinBox( aFrame ); + myBSplineSegments = new QSpinBox( aFrame ); + myBSpline2DCont = new QComboBox( aFrame ); + myBSpline2DCont->insertStringList( aContinueties ); + myBSpline3DCont = new QComboBox( aFrame ); + myBSpline3DCont->insertStringList( aContinueties ); + + myBSplineSurfModeChk->setChecked( true ); + myBSpline3DCurveChk->setChecked( true ); + myBSpline2DCurveChk->setChecked( true ); + + aLay->addWidget( myBSplineSurfModeChk, 0, 0 ); + aLay->addWidget( myBSpline3DCurveChk, 1, 0 ); + aLay->addWidget( myBSpline2DCurveChk, 2, 0 ); + aLay->addWidget( new QLabel( tr("GEOM_3D_TOLERANCE"), aFrame), 3, 0 ); + aLay->addWidget( myBSplineTol3D, 3, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_2D_TOLERANCE"), aFrame), 4, 0 ); + aLay->addWidget( myBSplineTol2D, 4, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_REQUIRED_DEGREE"), aFrame), 5, 0 ); + aLay->addWidget( myBSplineDegree, 5, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_REQUIRED_NUM_SEGMENTS"), aFrame), 6, 0 ); + aLay->addWidget( myBSplineSegments, 6, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_3D_CONTINUTY"), aFrame), 7, 0 ); + aLay->addWidget( myBSpline3DCont, 7, 1 ); + aLay->addWidget( new QLabel( tr("GEOM_2D_CONTINUTY"), aFrame), 8, 0 ); + aLay->addWidget( myBSpline2DCont, 8, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "BSplineRestriction" ) ); + + // ToBezier + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + myToBezierSurfModeChk = new QCheckBox( tr("GEOM_SURFACE_MODE"), aFrame ); + myToBezier3DCurveChk = new QCheckBox( tr("GEOM_3D_CURVE_MODE"), aFrame ); + myToBezier2DCurveChk = new QCheckBox( tr("GEOM_2D_CURVE_MODE"), aFrame ); + + myToBezierMaxTol = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + myToBezierMaxTol->setPrecision( 10 ); + + aLay->addWidget( myToBezierSurfModeChk, 0, 0 ); + aLay->addWidget( myToBezier3DCurveChk, 1, 0 ); + aLay->addWidget( myToBezier2DCurveChk, 2, 0 ); + aLay->addWidget( new QLabel( tr("GEOM_MAX_TOLERANCE"), aFrame), 3, 0 ); + aLay->addWidget( myToBezierMaxTol, 3, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "ToBezier" ) ); + + // SameParameter + aFrame = new QFrame( myStack ); + aLay = new QGridLayout( aFrame, 10, 2, 0, 5 ); + + mySameParameterTol3D = new QtxDblSpinBox( 0, 100, 1e-7, aFrame );//QAD_SpinBoxDbl( aFrame, 0, 100, 1e-7, 10, 1e-10 ); + mySameParameterTol3D->setPrecision( 10 ); + + aLay->addWidget( new QLabel( tr("GEOM_3D_TOLERANCE"), aFrame ), 0, 0 ); + aLay->addWidget( mySameParameterTol3D, 0, 1 ); + aLay->setRowStretch( 9, 2 ); + + myStack->addWidget( aFrame, myOpLst.findIndex( "SameParameter" ) ); + + // signals and slots connections + connect( myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(deactivate()) ); + connect( myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onCancel()) ); + + connect( buttonCancel, SIGNAL(clicked()), this, SLOT(onCancel()) ); + connect( buttonOk, SIGNAL(clicked()), this, SLOT(onOk()) ); + connect( buttonApply, SIGNAL(clicked()), this, SLOT(onApply()) ); + + connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(selectionChanged()) ); + connect( myOpList, SIGNAL(selectionChanged()), this, SLOT(operationChanged()) ); + + connect( mySelectWdgt->PushButton1, SIGNAL(clicked()), this, SLOT(selectClicked()) ); + connect( mySelectWdgt->LineEdit1, SIGNAL(returnPressed()), this, SLOT(lineEditReturnPressed()) ); + + connect( myToBezierSurfModeChk, SIGNAL(toggled(bool)), SLOT(advOptionToggled(bool)) ); + + adjustSize(); + loadDefaults(); // init dialog fields with values from resource file + myOpList->setSelected( myOpList->findItem( "FixShape", 0 ), true ); + reset(); + + initName( tr( "PROCESS_SHAPE_NEW_OBJ_NAME" ) ); +} + +//================================================================================= +// function : operationChanged() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::operationChanged() +{ + QListViewItem* anItem = myOpList->selectedItem(); + if ( anItem ) + { + int id = myOpLst.findIndex( anItem->text(0) ); + if ( id > -1 ) + myStack->raiseWidget( id ); + } +} + +//================================================================================= +// function : onOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_ShapeProcessDlg::onOk() +{ + if ( onApply() ) + onCancel(); +} + + + +//================================================================================= +// function : onApply() +// purpose : +//================================================================================= +bool RepairGUI_ShapeProcessDlg::onApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + reset(); + initSelection(); + + return true; +} + + +//================================================================================= +// function : onCancel() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::onCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : selectionChanged() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void RepairGUI_ShapeProcessDlg::selectionChanged() +{ + reset(); + + Standard_Boolean aRes = Standard_False; + int i = 0; + myObjects->length( IObjectCount() ); + for ( SALOME_ListIteratorOfListIO anIt( selectedIO() ); anIt.More(); anIt.Next() ) + { + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIt.Value(), aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes ) + myObjects[i++] = aSelectedObject; + } + myObjects->length( i ); + if ( i == 1 ) + mySelectWdgt->LineEdit1->setText( GEOMBase::GetName( myObjects[0] ) ); + else if ( i > 0 ) + mySelectWdgt->LineEdit1->setText( QString::number( i ) + "_" + tr( "GEOM_OBJECTS" ) ); +} + + +//================================================================================= +// function : selectClicked() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::selectClicked() +{ + myEditCurrentArgument = mySelectWdgt->LineEdit1; + mySelectWdgt->LineEdit1->setFocus(); + selectionChanged(); +} + + +//================================================================================= +// function : lineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::lineEditReturnPressed() +{ + GEOMBase_Skeleton::LineEditReturnPressed(); +} + + +//================================================================================= +// function : deactivate() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::deactivate() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : activate() +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::activate() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(selectionChanged())); + + reset(); + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_ShapeProcessDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + activate(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : same than click on cancel button +//================================================================================= +void RepairGUI_ShapeProcessDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : reset() +// purpose : Completely reset the state of method including local context +//================================================================================= +void RepairGUI_ShapeProcessDlg::reset() +{ + myObjects = new GEOM::ListOfGO(); + myObjects->length( 0 ); + mySelectWdgt->LineEdit1->setText(""); +} + + +//================================================================================= +// function : get_convert +// purpose : conversion of angle values to radians (non-angle values are not converted) +//================================================================================= +const char* get_convert( const char* theParam, const char* theValue ) +{ + if ( !strcmp( theParam, "SplitAngle.Angle" ) ) + { + double doubleValue = atof( theValue ) * PI / 180; + TCollection_AsciiString str( doubleValue ); + return CORBA::string_dup( str.ToCString() ); + } + return CORBA::string_dup( theValue ); +} + +//================================================================================= +// function : set_convert +// purpose : conversion of angle values to degrees (non-angle values are not converted) +//================================================================================= +const char* set_convert( const char* theParam, const char* theValue ) +{ + if ( !strcmp( theParam, "SplitAngle.Angle" ) ) + { + double doubleValue = atof( theValue ) * 180 / PI; + TCollection_AsciiString str( doubleValue ); + return CORBA::string_dup( str.ToCString() ); + } + return CORBA::string_dup( theValue ); +} + +//================================================================================= +// function : loadDefaults() +// purpose : initialize "values"-fields with default values retrieved from IHealingOperations +//================================================================================= +void RepairGUI_ShapeProcessDlg::loadDefaults() +{ + GEOM::GEOM_IHealingOperations_var anOp = myGeomGUI->GetGeomGen()->GetIHealingOperations( getStudyId() ); + GEOM::string_array_var anOperators, aParams, aValues; + anOp->GetShapeProcessParameters( anOperators, aParams, aValues ); + + // check the default items-operators + int i; + for ( i = 0; i < anOperators->length(); i++ ) + { + //MESSAGE("-->"<<(const char*)anOperators[i]); + QListViewItem* anItem = myOpList->findItem( (const char*)anOperators[i], 0 ); + if ( anItem /*&& anItem->inherits( "QCheckListItem" )*/ ) + ((QCheckListItem*) anItem)->setOn( true ); + } + + // Retrieve default parameters for ALL operators + for ( QListViewItemIterator it(myOpList); it.current(); ++it ) { + CORBA::String_var anOperator = CORBA::string_dup( it.current()->text( 0 ).latin1() ); + anOp->GetOperatorParameters( anOperator.in(), aParams, aValues ); + + // set default values of parameters + if ( aParams->length() != aValues->length() ) + continue; + for ( i = 0; i < aParams->length(); i++ ) { + QWidget* aCtrl = getControl( (const char*)aParams[i] ); + const char* aValue = set_convert( (const char*)aParams[i], aValues[i] ); + setValue( aCtrl, aValue ); + } + } +} + +//================================================================================= +// function : setValue() +// purpose : set value in the proper way +//================================================================================= +void RepairGUI_ShapeProcessDlg::setValue( QWidget* theControl, const char* theValue ) +{ + if ( theControl == NULL || theValue == NULL ) + return; + + if ( theControl->isA( "QtxDblSpinBox" ) ) + ((QtxDblSpinBox*)theControl)->setValue( QString( theValue ).toDouble() ); + else if ( theControl->isA( "QSpinBox" ) ) + ((QSpinBox*)theControl)->setValue( QString( theValue ).toInt() ); + else if ( theControl->isA( "QComboBox" ) ) + ((QComboBox*)theControl)->setCurrentText( QString( theValue ) ); + else if ( theControl->isA( "QCheckBox" ) ) + ((QCheckBox*)theControl)->setChecked( QString( theValue ).toInt() != 0 ); +} + +//================================================================================= +// function : getValue() +// purpose : get value in the proper way +//================================================================================= +const char* RepairGUI_ShapeProcessDlg::getValue( QWidget* theControl ) const +{ + if ( theControl == NULL ) + return ""; + + if ( theControl->isA( "QtxDblSpinBox" ) ) + return ((QtxDblSpinBox*)theControl)->text().latin1(); + else if ( theControl->isA( "QSpinBox" ) ) + return ((QSpinBox*)theControl)->text().latin1(); + else if ( theControl->isA( "QComboBox" ) ) + return ((QComboBox*)theControl)->currentText().latin1(); + else if ( theControl->isA( "QCheckBox" ) ) + return ((QCheckBox*)theControl)->isChecked() ? "1" : "0"; + + return ""; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_ShapeProcessDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_ShapeProcessDlg::isValid( QString& msg ) +{ + bool error = false; + GEOM::string_array_var anOperators = getActiveOperators(); + if ( !myObjects->length() ) + { + msg += tr( "ERROR_NO_OBJECTS" ); + error = true; + } + if ( !anOperators->length() ) + { + if ( error ) + msg += "\n"; + msg += tr( "ERROR_NO_OPERATORS" ); + error = true; + } + return !error; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_ShapeProcessDlg::execute( ObjectList& objects ) +{ + GEOM::string_array_var anOperators = getActiveOperators(); + GEOM::string_array_var aParams = getParameters( anOperators ); + GEOM::string_array_var aValues = getValues( aParams ); + + /*//-- check -- + int z; + MESSAGE("Objects : "); + for ( z = 0; z < myObjects->length(); z++ ) + MESSAGE(myObjects[z]->GetName() << " "); + MESSAGE("\nOperators : "); + for ( z = 0; z < anOperators->length(); z++ ) + MESSAGE(anOperators[z] << " "); + MESSAGE("\nParameters : "); + for ( z = 0; z < aParams->length(); z++ ) + MESSAGE(aParams[z] << " "); + MESSAGE("\nValues : "); + for ( z = 0; z < aValues->length(); z ++ ) + MESSAGE(aValues[z] << " "); + MESSAGE("\n"); + */// ----------- + + QStringList anErrorObjNames; + for ( int i = 0; i < myObjects->length(); i++ ) + { + GEOM::GEOM_Object_var obj = myObjects[i]; + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->ProcessShape( + obj, anOperators, aParams, aValues ); + if ( anObj->_is_nil() ) + anErrorObjNames << GEOMBase::GetName( obj ); + else + objects.push_back( anObj._retn() ); + } + + if ( !anErrorObjNames.empty() ) + MESSAGE("ERRORS occured while processing the following objects: " << anErrorObjNames.join( " " )); + + return anErrorObjNames.size() < myObjects->length(); // true if at least one object was OK, false if ALL objects were nil after Healing. +} + +//================================================================================= +// function : getActiveOperators +// purpose : +//================================================================================= +GEOM::string_array* RepairGUI_ShapeProcessDlg::getActiveOperators() +{ + GEOM::string_array_var anOperators = new GEOM::string_array(); + QStringList aCheckedList; + QStringList::Iterator it; + for ( it = myOpLst.begin(); it != myOpLst.end(); ++it ) + if ( ((QCheckListItem*)myOpList->findItem( *it, 0 ))->isOn() ) + aCheckedList << *it; + anOperators->length( aCheckedList.size() ); + int i = 0; + for ( it = aCheckedList.begin(); it != aCheckedList.end(); ++it ) + anOperators[i++] = CORBA::string_dup( (*it).latin1() ); + + return anOperators._retn(); +} + +//================================================================================= +// function : getcontrol +// purpose : +//================================================================================= +QWidget* RepairGUI_ShapeProcessDlg::getControl( const char* theParam ) +{ + string aParam = theParam; + if ( aParam == "SplitAngle.Angle" ) return mySplitAngleAngle; + else if ( aParam == "SplitAngle.MaxTolerance" ) return mySplitAngleMaxTol; + else if ( aParam == "SplitClosedFaces.NbSplitPoints" ) return mySplitClosedFacesNum; + else if ( aParam == "FixFaceSize.Tolerance" ) return myFixFaceSizeTol; + else if ( aParam == "DropSmallEdges.Tolerance3d" ) return myDropSmallEdgesTol3D; + else if ( aParam == "BSplineRestriction.SurfaceMode" ) return myBSplineSurfModeChk; + else if ( aParam == "BSplineRestriction.Curve3dMode" ) return myBSpline3DCurveChk; + else if ( aParam == "BSplineRestriction.Curve2dMode" ) return myBSpline2DCurveChk; + else if ( aParam == "BSplineRestriction.Tolerance3d" ) return myBSplineTol3D; + else if ( aParam == "BSplineRestriction.Tolerance2d" ) return myBSplineTol2D; + else if ( aParam == "BSplineRestriction.RequiredDegree" ) return myBSplineDegree; + else if ( aParam == "BSplineRestriction.RequiredNbSegments" ) return myBSplineSegments; + else if ( aParam == "BSplineRestriction.Continuity3d" ) return myBSpline3DCont; + else if ( aParam == "BSplineRestriction.Continuity2d" ) return myBSpline2DCont; + else if ( aParam == "SplitContinuity.Tolerance3d" ) return mySplitContTol3D; + else if ( aParam == "SplitContinuity.SurfaceContinuity" ) return mySplitContSurfCont; + else if ( aParam == "SplitContinuity.CurveContinuity" ) return mySplitContCurvCont; + else if ( aParam == "ToBezier.SurfaceMode" ) return myToBezierSurfModeChk; + else if ( aParam == "ToBezier.Curve3dMode" ) return myToBezier3DCurveChk; + else if ( aParam == "ToBezier.Curve2dMode" ) return myToBezier2DCurveChk; + else if ( aParam == "ToBezier.MaxTolerance" ) return myToBezierMaxTol; + else if ( aParam == "SameParameter.Tolerance3d" ) return mySameParameterTol3D; + else if ( aParam == "FixShape.Tolerance3d" ) return myFixShapeTol3D; + else if ( aParam == "FixShape.MaxTolerance3d" ) return myFixShapeMaxTol3D; + return NULL; +} + +//================================================================================= +// function : getParameters +// purpose : +//================================================================================= +void RepairGUI_ShapeProcessDlg::initParamsValues() +{ + myOpLst << "FixShape"; + myValMap["FixShape"] << "FixShape.Tolerance3d"; + myValMap["FixShape"] << "FixShape.MaxTolerance3d"; + + myOpLst << "FixFaceSize"; + myValMap["FixFaceSize"] << "FixFaceSize.Tolerance"; + + myOpLst << "DropSmallEdges"; + myValMap["DropSmallEdges"] << "DropSmallEdges.Tolerance3d"; + + myOpLst << "SplitAngle"; + myValMap["SplitAngle"] << "SplitAngle.Angle"; + myValMap["SplitAngle"] << "SplitAngle.MaxTolerance"; + + myOpLst << "SplitClosedFaces"; + myValMap["SplitClosedFaces"] << "SplitClosedFaces.NbSplitPoints"; + + myOpLst << "SplitContinuity"; + myValMap["SplitContinuity"] << "SplitContinuity.Tolerance3d"; + myValMap["SplitContinuity"] << "SplitContinuity.SurfaceContinuity"; + myValMap["SplitContinuity"] << "SplitContinuity.CurveContinuity"; + + myOpLst << "BSplineRestriction"; + myValMap["BSplineRestriction"] << "BSplineRestriction.SurfaceMode"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Curve3dMode"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Curve2dMode"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Tolerance3d"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Tolerance2d"; + myValMap["BSplineRestriction"] << "BSplineRestriction.RequiredDegree"; + myValMap["BSplineRestriction"] << "BSplineRestriction.RequiredNbSegments"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Continuity3d"; + myValMap["BSplineRestriction"] << "BSplineRestriction.Continuity2d"; + + myOpLst << "ToBezier"; + myValMap["ToBezier"] << "ToBezier.SurfaceMode"; + myValMap["ToBezier"] << "ToBezier.Curve3dMode"; + myValMap["ToBezier"] << "ToBezier.Curve2dMode"; + myValMap["ToBezier"] << "ToBezier.MaxTolerance"; + + myOpLst << "SameParameter"; + myValMap["SameParameter"] << "SameParameter.Tolerance3d"; +} + +//================================================================================= +// function : getParameters +// purpose : +//================================================================================= +GEOM::string_array* RepairGUI_ShapeProcessDlg::getParameters( const GEOM::string_array& theOperators ) +{ + GEOM::string_array_var aParams = new GEOM::string_array(); + int i( 0 ), j( 0 ); + + // calculate the length of parameters + for ( i = 0, j = 0; i < theOperators.length(); i++ ) + j+= myValMap[QString((const char*)theOperators[i])].size(); + + // set the new length of paremeters + aParams->length( j ); + + // fill the parameters + for ( i = 0, j = 0; i < theOperators.length(); i++ ) + { + QStringList aValLst = myValMap[QString( (const char*)theOperators[i] )]; + for ( QStringList::Iterator it = aValLst.begin(); it != aValLst.end(); ++it ) + aParams[j++] = CORBA::string_dup( (*it).latin1() ); + } + + return aParams._retn(); +} + + +//================================================================================= +// function : getValues +// purpose : +//================================================================================= +GEOM::string_array* RepairGUI_ShapeProcessDlg::getValues( const GEOM::string_array& theParams ) +{ + GEOM::string_array_var aValues = new GEOM::string_array(); + aValues->length( theParams.length() ); + + for ( int i = 0; i < theParams.length(); i++ ) + { + QWidget* aCtrl = getControl( (const char*)theParams[i] ); + if ( aCtrl ) + aValues[i] = get_convert( (const char*)theParams[i], getValue( aCtrl ) ); + } + + return aValues._retn(); +} + +//================================================================================= +// function : initSelection +// purpose : set selection of ALL shape types except vertexes +//================================================================================= +void RepairGUI_ShapeProcessDlg::initSelection() +{ + TColStd_MapOfInteger aTypes; + aTypes.Add( GEOM_COMPOUND ); + aTypes.Add( GEOM_SOLID ); + aTypes.Add( GEOM_SHELL ); + aTypes.Add( GEOM_FACE ); + aTypes.Add( GEOM_WIRE ); + aTypes.Add( GEOM_EDGE ); + globalSelection( aTypes ); +} + +//================================================================================= +// function : advOptionToggled +// purpose : this slot is used to warn the user about possible consequences +// of enabling some advanced options +//================================================================================= +void RepairGUI_ShapeProcessDlg::advOptionToggled( bool on ) +{ + QButton* btn = (QButton*)sender(); + if ( on && btn->isToggleButton() && + QMessageBox::warning( SUIT_Session::session()->activeApplication()->desktop(), tr( "GEOM_WRN_WARNING" ), tr( "TIME_CONSUMING" ), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::No ) + btn->toggle(); +} diff --git a/src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx b/src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx new file mode 100644 index 000000000..4d996d2a1 --- /dev/null +++ b/src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx @@ -0,0 +1,349 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : RepairGUI_SuppressFacesDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "RepairGUI_SuppressFacesDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include + +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_SuppressFacesDlg() +// purpose : Constructs a RepairGUI_SuppressFacesDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +RepairGUI_SuppressFacesDlg::RepairGUI_SuppressFacesDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SUPRESS_FACE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SUPRESSFACE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SUPRESSFACE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("Faces to remove")); + GroupPoints->TextLabel1->setText(tr("Faces")); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_SuppressFacesDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_SuppressFacesDlg::~RepairGUI_SuppressFacesDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + myObjects = new GEOM::ListOfGO(); + myObjects->length( 0 ); + + //myGeomGUI->SetState( 0 ); + initSelection(); + + /* 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(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + 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())); + + initName( tr( "SUPRESS_FACE_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_SuppressFacesDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_SuppressFacesDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + + myEditCurrentArgument->setText(""); + myObjects->length( 0 ); + myFaces.clear(); + + initSelection(); + + return true; +} + + +//================================================================================= +// function : ClickOnCancel() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +// : used only by SelectButtonC1A1 (LineEditC1A1) +//================================================================================= +void RepairGUI_SuppressFacesDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + Standard_Boolean aRes = Standard_False; + int i = 0; + int numFaces = 0; + myObjects->length( IObjectCount() ); + myFaces.clear(); + for ( SALOME_ListIteratorOfListIO anIt( selectedIO() ); anIt.More(); anIt.Next() ) + { + Handle(SALOME_InteractiveObject) anIO = anIt.Value(); + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); + if ( !CORBA::is_nil( aSelectedObject ) && aRes ) + { + TopoDS_Shape aShape; + if ( myGeomBase->GetShape( aSelectedObject, aShape, TopAbs_SHAPE ) ) + { + if ( aShape.ShapeType() <= TopAbs_FACE ) // FACE, SHELL, SOLID, COMPOUND + { + GEOM::short_array anIndexes; + + TColStd_IndexedMapOfInteger aMap; + ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr()->GetIndexes( anIO, aMap ); + + if ( !aMap.IsEmpty() ) + { + Convert( aMap, anIndexes ); + myObjects[i++] = aSelectedObject; // append the object + myFaces.append( anIndexes ); // append faces' indexes + numFaces += anIndexes.length();// just for text field output + } + } + } + } + } + myObjects->length( i ); // this is the right length, smaller of equal to the previously set + if ( numFaces ) + myEditCurrentArgument->setText( QString::number( numFaces ) + "_" + tr( "GEOM_FACE" ) + tr( "_S_" ) ); +} + +//================================================================================= +// function : Convert() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::Convert( const TColStd_IndexedMapOfInteger& theMap, GEOM::short_array& theOutSeq ) +{ + const int n = theMap.Extent(); + theOutSeq.length( n ); + for ( int i = 0; i < n; i++ ) + theOutSeq[i] = theMap( i+1 ); +} + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::SetEditCurrentArgument() +{ + if( sender() == GroupPoints->PushButton1 ) + { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::LineEditReturnPressed() +{ + if( sender() == GroupPoints->LineEdit1 ) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::DeactivateActiveDialog() +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + //myGeomGUI->SetState( 0 ); + initSelection(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_SuppressFacesDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_SuppressFacesDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_SuppressFacesDlg::isValid( QString& msg ) +{ + const int objL = myObjects->length(), facesL = myFaces.size(); + return ( objL && objL == facesL ); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_SuppressFacesDlg::execute( ObjectList& objects ) +{ + QStringList anErrorObjNames; + for ( int i = 0; i < myObjects->length(); i++ ) + { + GEOM::GEOM_Object_var obj = myObjects[i]; + GEOM::short_array faces = myFaces[i]; + //MESSAGE(">>>> Dlg, passing faces.. len = " << faces.length()); + GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->SuppressFaces( obj, faces ); + if ( anObj->_is_nil() ) + anErrorObjNames << GEOMBase::GetName( obj ); + else + objects.push_back( anObj._retn() ); + } + + if ( !anErrorObjNames.empty() ) + MESSAGE("ERRORS occured while processing the following objects: " << anErrorObjNames.join( " " )); + + return anErrorObjNames.size() < myObjects->length(); // true if at least one object was OK, false if ALL objects were nil after Healing. +} + +//================================================================================= +// function : initSelection +// purpose : +//================================================================================= +void RepairGUI_SuppressFacesDlg::initSelection() +{ + GEOM::GEOM_Object_var aNullGeomObject; + localSelection( aNullGeomObject, TopAbs_FACE ); // load local selection on ALL objects +} diff --git a/src/STEPExport/STEPExport.cxx b/src/STEPExport/STEPExport.cxx new file mode 100644 index 000000000..d7ed96b6f --- /dev/null +++ b/src/STEPExport/STEPExport.cxx @@ -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/ +// +// File: STEPExport.cxx +// Created: Wed May 19 14:53:52 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include + +#include + +#include +#include + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + int Export(const TopoDS_Shape& theShape, const TCollection_AsciiString& theFileName) + { + MESSAGE("Export STEP into file " << theFileName.ToCString()); + + try + { + IFSelect_ReturnStatus status ; + //VRV: OCC 4.0 migration + STEPControl_Writer aWriter; +//JFA: PAL6162 status = aWriter.Transfer( theShape, STEPControl_ManifoldSolidBrep ); + status = aWriter.Transfer( theShape, STEPControl_AsIs ); + //VRV: OCC 4.0 migration + if ( status == IFSelect_RetDone ) + status = aWriter.Write( theFileName.ToCString() ) ; + if ( status == IFSelect_RetDone ) + return 1; + } + catch(Standard_Failure) + { + //THROW_SALOME_CORBA_EXCEPTION("Exception catched in STEPExport", SALOME::BAD_PARAM); + } + return 0; + } +} diff --git a/src/STEPImport/STEPImport.cxx b/src/STEPImport/STEPImport.cxx new file mode 100644 index 000000000..3fb9cc511 --- /dev/null +++ b/src/STEPImport/STEPImport.cxx @@ -0,0 +1,133 @@ +// 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/ +// +// File: STEPImport.cxx +// Created: Wed May 19 14:41:10 2004 +// Author: Pavel TELKOV +// + +#include "utilities.h" + +#include + +#include + +#include + +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +//============================================================================= +/*! + * Import() + */ +//============================================================================= + +extern "C" +{ +SALOME_WNT_EXPORT + TopoDS_Shape Import (const TCollection_AsciiString& theFileName, + TCollection_AsciiString& theError) + { + MESSAGE("Import STEP model from file " << theFileName.ToCString()); + TopoDS_Shape aResShape; + //VRV: OCC 4.0 migration + STEPControl_Reader aReader; + //VRV: OCC 4.0 migration + TopoDS_Compound compound; + BRep_Builder B; + B.MakeCompound( compound ); + try { + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); + + if (status == IFSelect_RetDone) { + Standard_Boolean failsonly = Standard_False ; + aReader.PrintCheckLoad (failsonly, IFSelect_ItemsByEntity); + /* Root transfers */ + Standard_Integer nbr = aReader.NbRootsForTransfer(); + aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); + + for ( Standard_Integer n=1; n <= nbr; n++) { + Standard_Boolean ok = aReader.TransferRoot(n); + /* Collecting resulting entities */ + Standard_Integer nbs = aReader.NbShapes(); + if (!ok || nbs == 0) + { + // THROW_SALOME_CORBA_EXCEPTION("Exception catched in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM); + continue; // skip empty root + } + /* For a single entity */ + else if (nbr == 1 && nbs == 1) { + aResShape = aReader.Shape(1); + break; + } + + for ( Standard_Integer i=1; i<=nbs; i++ ) { + TopoDS_Shape aShape = aReader.Shape(i); + if ( aShape.IsNull() ) { + // THROW_SALOME_CORBA_EXCEPTION("Null shape in GEOM_Gen_i::ImportStep", SALOME::BAD_PARAM) ; + //return aResShape; + continue; + } + else { + B.Add( compound, aShape ) ; + } + } + } + if ( aResShape.IsNull() ) + aResShape = compound; + + } else { +// switch (status) { +// case IFSelect_RetVoid: +// theError = "Nothing created or No data to process"; +// break; +// case IFSelect_RetError: +// theError = "Error in command or input data"; +// break; +// case IFSelect_RetFail: +// theError = "Execution was run, but has failed"; +// break; +// case IFSelect_RetStop: +// theError = "Execution has been stopped. Quite possible, an exception was raised"; +// break; +// default: +// break; +// } + theError = "Wrong format of the imported file. Can't import file."; + aResShape.Nullify(); + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + theError = aFail->GetMessageString(); + aResShape.Nullify(); + } + return aResShape; + } +} diff --git a/src/ShHealOper/Makefile.in b/src/ShHealOper/Makefile.in new file mode 100644 index 000000000..82f11b3a4 --- /dev/null +++ b/src/ShHealOper/Makefile.in @@ -0,0 +1,80 @@ +# GEOM ShHealOper : Shape Healing +# +# 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.org +# +# +# +# File : Makefile.in +# Author : Alexander SLADKOV +# Module : GEOM +# $Header: + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + + +@COMMENCE@ + +# Libraries targets +LIB = libShHealOper.la + +LIB_SRC = \ + ShHealOper_CloseContour.cxx \ + ShHealOper_EdgeDivide.cxx \ + ShHealOper_FillHoles.cxx \ + ShHealOper_RemoveFace.cxx \ + ShHealOper_RemoveInternalWires.cxx \ + ShHealOper_Sewing.cxx \ + ShHealOper_ShapeProcess.cxx \ + ShHealOper_SplitCurve2d.cxx \ + ShHealOper_SplitCurve3d.cxx \ + ShHealOper_Tool.cxx \ + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# header files +EXPORT_HEADERS = \ + ShHealOper_CloseContour.hxx \ + ShHealOper_EdgeDivide.hxx \ + ShHealOper_FillHoles.hxx \ + ShHealOper_RemoveFace.hxx \ + ShHealOper_RemoveInternalWires.hxx \ + ShHealOper_Sewing.hxx \ + ShHealOper_ShapeProcess.hxx \ + ShHealOper_SpiltCurve2d.hxx \ + ShHealOper_SplitCurve2d.hxx \ + ShHealOper_SplitCurve3d.hxx \ + ShHealOper_Tool.hxx + +# idl files +EXPORT_IDLS= + +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome + +LDFLAGS += $(CAS_KERNEL) $(CAS_MATH) $(CAS_TKTopAlgo) $(CAS_LDPATH) -lTKBool -lTKShHealing + +%_moc.cxx: %.h + $(MOC) $< -o $@ + +@CONCLUDE@ diff --git a/src/ShHealOper/ShHealOper_CloseContour.cxx b/src/ShHealOper/ShHealOper_CloseContour.cxx new file mode 100644 index 000000000..e4d171b34 --- /dev/null +++ b/src/ShHealOper/ShHealOper_CloseContour.cxx @@ -0,0 +1,426 @@ +// 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/ +// +// File: ShHealOper_CloseContour.cxx +// Created: 20.04.04 11:36:01 +// Author: Galina KULIKOVA +// Copyright: Airbus Industries 2004 + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//======================================================================= +//function : ShHealOper_CloseContour() +//purpose : Constructor +//======================================================================= + +ShHealOper_CloseContour::ShHealOper_CloseContour (const TopoDS_Shape& theShape ) +{ + Init(theShape); +} +//======================================================================= +//function : Init +//purpose : +//======================================================================= + +void ShHealOper_CloseContour::Init(const TopoDS_Shape& theShape) +{ + ShHealOper_Tool::Init(theShape); + myTolerance = Precision::Confusion(); + myMaxTolerance = 1.0; + TopExp::MapShapesAndAncestors(theShape,TopAbs_EDGE,TopAbs_FACE,myMapEdgesFace); +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + +Standard_Boolean ShHealOper_CloseContour::Perform(const TopTools_SequenceOfShape& theSeqEdges, + const Standard_Boolean theModeVertex, + const Standard_Boolean theModeFixGapsCurves) +{ + myFreeEdges.Clear(); + myDone = Standard_False; + myErrorStatus =ShHealOper_NotError; + if(myInitShape.IsNull()) { + myErrorStatus = ShHealOper_InvalidParameters; + return myDone; + } + Handle(ShapeExtend_WireData) asewd = new ShapeExtend_WireData; + Standard_Integer i =1; + for ( ; i <= theSeqEdges.Length(); i++) + asewd->Add(theSeqEdges.Value(i)); + + myModeVertex = theModeVertex; + myModeFixGapsCurves = theModeFixGapsCurves; + + build(asewd); + + return myDone; +} +//======================================================================= +//function : Perform +//purpose : +//======================================================================= + +Standard_Boolean ShHealOper_CloseContour::Perform(const TopoDS_Wire& theWire, + const Standard_Boolean theModeVertex, + const Standard_Boolean theModeFixGapsCurves) +{ + myFreeEdges.Clear(); + myDone = Standard_False; + if(myInitShape.IsNull()) { + myErrorStatus = ShHealOper_InvalidParameters; + return myDone; + } + Handle(ShapeExtend_WireData) asewd = new ShapeExtend_WireData(theWire); + myModeVertex = theModeVertex; + myModeFixGapsCurves = theModeFixGapsCurves; + build(asewd); + return myDone; +} +//======================================================================= +//function : Build +//purpose : +//======================================================================= + +void ShHealOper_CloseContour::build(Handle(ShapeExtend_WireData)& theSewd) +{ + TopTools_SequenceOfShape aCommonFaces; + //checks that all specified edges belong the one face or not. + Standard_Boolean isOneFace = checkOneFace(theSewd,aCommonFaces); + + //add edge or increase max tolerance in dependance on specified VertexMode. + //if all edges belong the one face that gap will be closed in the 2D by line + //else gap will be closed in the 3D by line. + myDone = fixGaps(theSewd,aCommonFaces); + updateWire(theSewd); + Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire; + sfw->SetContext(myContext); + sfw->Load(theSewd); + + sfw->ClosedWireMode() = Standard_True; + sfw->SetPrecision(myTolerance); + sfw->SetMaxTolerance(myMaxTolerance); + + if(isOneFace) { + Standard_Integer ii =1; + for( ; ii <= aCommonFaces.Length(); ii++) { + TopoDS_Face aFace = TopoDS::Face(aCommonFaces.Value(ii)); + sfw->SetFace(aFace); + myDone = (sfw->Perform() || myDone); + //if Mode for fix gaps is equal to true that + //curve 3D and curve 2D will be pull to each other. + if(myModeFixGapsCurves) { + Standard_Boolean isFixgaps = Standard_False; + if(ii ==1) { + sfw->FixGaps3d(); + isFixgaps = sfw->StatusGaps3d(ShapeExtend_DONE); + if(!isFixgaps && sfw->StatusGaps3d(ShapeExtend_FAIL)) + myErrorStatus = ShHealOper_ErrorExecution; + } + if(sfw->FixGaps2d()) + sfw->FixSelfIntersection(); + else if(sfw->StatusGaps2d(ShapeExtend_FAIL)) + myErrorStatus = ShHealOper_ErrorExecution; + + isFixgaps = (isFixgaps || sfw->StatusGaps2d(ShapeExtend_DONE)); + myDone = (myDone || isFixgaps); + if(isFixgaps) { + Handle(ShapeExtend_WireData) sbwd = sfw->WireData(); + Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge; + for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) { + TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge)); + sfe->FixVertexTolerance(aEdge,aFace); + sfe->FixSameParameter(aEdge); + } + } + } + } + } + else { + myDone = (sfw->Perform() || myDone); + if(myModeFixGapsCurves) { + //if Mode for fix gaps is equal to true that + //curve 3D will be pull to each other. + if(sfw->FixGaps3d()) { + Handle(ShapeExtend_WireData) sbwd = sfw->WireData(); + Handle(ShapeFix_Edge) sfe = new ShapeFix_Edge; + for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) { + TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge)); + sfe->FixVertexTolerance(aEdge); + sfe->FixSameParameter(aEdge); + } + } + else if(sfw->StatusGaps3d(ShapeExtend_FAIL)) + myErrorStatus = ShHealOper_ErrorExecution; + myDone = (sfw->StatusGaps3d(ShapeExtend_DONE) || myDone); + } + } + + if(myDone) { + TopoDS_Shape aoldShape = myInitShape; + //if free edges were added they will be added to the result shape + //and type of result shape should be change if initial shape is not COMPOUND. + if( myFreeEdges.Length()) { + BRep_Builder aB; + TopoDS_Compound aComp; + aB.MakeCompound(aComp); + if(aoldShape.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator aIt(aoldShape); + for( ;aIt.More();aIt.Next() ) + aB.Add(aComp,aIt.Value()); + } + else + aB.Add(aComp,aoldShape); + + Standard_Integer i=1; + for ( ; i <= myFreeEdges.Length(); i++ ) + aB.Add(aComp,myFreeEdges.Value(i)); + aoldShape = aComp; + + } + myResultShape = myContext->Apply(aoldShape); + } + return; +} +//======================================================================= +//function : checkGaps +//purpose : +//======================================================================= + +Standard_Boolean ShHealOper_CloseContour::fixGaps(const Handle(ShapeExtend_WireData)& theWire, + const TopTools_SequenceOfShape& theCommonFaces) +{ + Handle(ShapeAnalysis_Wire) asaw = new ShapeAnalysis_Wire; + asaw->Load(theWire); + + Standard_Integer i =1; + Standard_Boolean hasGaps = Standard_False; + for ( ; i <= asaw->NbEdges(); i++) { + if(asaw->CheckGap3d(i)) { + Standard_Real dist = asaw->MinDistance3d(); + if(dist > myMaxTolerance) { + hasGaps = Standard_True; + Standard_Integer ind2 = (i ==0 ? theWire->NbEdges() :i); + Standard_Integer ind1 = (ind2 >1 ? ind2 -1 : theWire->NbEdges()); + TopoDS_Edge aE1= theWire->Edge(ind1); + TopoDS_Edge aE2= theWire->Edge(ind2); + if(!myModeVertex) + buildEdge(aE1,aE2,theCommonFaces); + else + myMaxTolerance = RealLast(); + if(ind2 == ind1) break; + } + } + + } + return hasGaps; +} + +//======================================================================= +//function : checkOneFace +//purpose : +//======================================================================= + +Standard_Boolean ShHealOper_CloseContour::checkOneFace(const Handle(ShapeExtend_WireData)& theSewd, + TopTools_SequenceOfShape& theCommonFaces) const +{ + + TopTools_IndexedMapOfShape amapfaces; + TopoDS_Edge aEdge1 = theSewd->Edge(1); + Standard_Boolean isOneFace = myMapEdgesFace.Contains(aEdge1 ); + if(!isOneFace) + return isOneFace; + + //check that all specified edges belong to one face. + const TopTools_ListOfShape& alfaces = myMapEdgesFace.FindFromKey(aEdge1); + isOneFace = isOneFace && (!alfaces.IsEmpty()); + if(!isOneFace) + return Standard_False; + + TopTools_ListIteratorOfListOfShape litr(alfaces); + for( ; litr.More();litr.Next() ) + amapfaces.Add(litr.Value()); + + TColStd_MapOfInteger amapIndex; + Standard_Integer ind =0; + Standard_Integer i =2; + for( ; i <= theSewd->NbEdges() && isOneFace; i++) { + isOneFace = myMapEdgesFace.Contains(theSewd->Edge(i)); + if(isOneFace) { + const TopTools_ListOfShape& alfaces1 = myMapEdgesFace.FindFromKey(theSewd->Edge(i)); + + TColStd_MapOfInteger aTmpInd; + for(litr.Initialize(alfaces1) ; litr.More() ;litr.Next() ) { + if(amapfaces.Contains(litr.Value())) { + ind = amapfaces.FindIndex(litr.Value()); + if( i == 2) + amapIndex.Add(ind); + else + aTmpInd.Add(ind); + } + } + if(i ==2) { + isOneFace = (amapIndex.Extent()); + continue; + } + else { + TColStd_MapIteratorOfMapOfInteger aMi(amapIndex); + for( ; aMi.More();aMi.Next()) { + if(!aTmpInd.Contains(aMi.Key())) + amapIndex.Remove(aMi.Key()); + } + isOneFace = (amapIndex.Extent()); + + } + } + } + if(theSewd->NbEdges() >1) { + Standard_Integer j =1; + for( ; j <= amapfaces.Extent(); j++) { + if(!amapIndex.Contains(j)) continue; + TopoDS_Shape aF = amapfaces.FindKey(j); + theCommonFaces.Append(aF); + } + } + return isOneFace; +} +//======================================================================= +//function : buildEdge +//purpose : +//======================================================================= + +void ShHealOper_CloseContour::buildEdge(const TopoDS_Edge& aE1, + const TopoDS_Edge& aE2, + const TopTools_SequenceOfShape& theCommonFaces) +{ + ShapeAnalysis_Edge asae; + TopoDS_Vertex aV1 = asae.LastVertex(aE1); + TopoDS_Vertex aV2 = asae.FirstVertex(aE2); + gp_Pnt p1 = BRep_Tool::Pnt(aV1); + gp_Pnt p2 = BRep_Tool::Pnt(aV2); + BRepBuilderAPI_MakeVertex mkver1( p1 ); + TopoDS_Vertex newV1 = mkver1.Vertex(); + + BRepBuilderAPI_MakeVertex mkver2( p2 ); + TopoDS_Vertex newV2 = mkver2.Vertex(); + BRep_Builder B; + B.UpdateVertex ( newV1,Precision::Confusion()); + B.UpdateVertex ( newV2, Precision::Confusion()); + Standard_Boolean isBuild = Standard_False; + TopoDS_Edge edge; + B.MakeEdge ( edge ); + ShapeBuild_Edge sbe; + //if all edges belong to one face that gap will be closed in the 2D by line + //than 3D curve will be built by 2D curve + if(theCommonFaces.Length()) { + + TopoDS_Face aF1 = TopoDS::Face(theCommonFaces.Value(1)); + Handle(Geom2d_Curve) c2d1,c2d2; + gp_Pnt2d p2d1,p2d2; + Standard_Real a1, b1,a2, b2; + if ( asae.PCurve ( aE1, aF1, c2d1, a1, b1, Standard_True ) && + asae.PCurve ( aE2, aF1, c2d2, a2, b2, Standard_True )) { + + c2d1->D0 ( b1, p2d1); + c2d2->D0 ( a2, p2d2); + gp_Vec2d v12 ( p2d1, p2d2 ); + + Handle(Geom2d_Line) aLine2d = new Geom2d_Line ( p2d1, gp_Dir2d ( v12 ) ); + B.UpdateEdge ( edge, aLine2d, aF1, ::Precision::Confusion() ); + B.Range ( edge, aF1, 0.0, v12.Magnitude() ); + + isBuild = sbe.BuildCurve3d ( edge ); + } + } + //else gap will be closed in the 3D by line. + if(!isBuild) { + gp_Vec v1 ( p1, p2 ); + Handle(Geom_Line) aLine = new Geom_Line ( p1, gp_Dir ( v1 ) ); + B.UpdateEdge ( edge, aLine, ::Precision::Confusion() ); + B.Range ( edge,0.0, v1.Magnitude()); + } + B.Add ( edge, newV1.Oriented ( TopAbs_FORWARD ) ); + B.Add ( edge, newV2.Oriented ( TopAbs_REVERSED ) ); + myContext->Replace(aV1, newV1.Oriented (aV1.Orientation())); + myContext->Replace(aV2, newV2.Oriented (aV2.Orientation())); + if(isBuild) { + newV1.Orientation(aV1.Orientation()); + TopoDS_Edge newEdge = sbe.CopyReplaceVertices ( aE1,TopoDS_Vertex(), newV1); + TopoDS_Wire aw; + B.MakeWire(aw); + B.Add(aw,newEdge); + B.Add(aw,edge); + TopoDS_Shape anE1 = myContext->Apply(aE1); + myContext->Replace(anE1,aw); + } + else { + myFreeEdges.Append(edge); + } +} +//======================================================================= +//function : UpdateWire +//purpose : +//======================================================================= + +void ShHealOper_CloseContour::updateWire (Handle(ShapeExtend_WireData)& sbwd) +{ + Standard_Integer i=1; + for ( ; i <= sbwd->NbEdges(); i++ ) { + TopoDS_Edge E = sbwd->Edge(i); + TopoDS_Shape S = myContext->Apply ( E ); + if ( S == E ) continue; + for ( TopExp_Explorer exp(S,TopAbs_EDGE); exp.More(); exp.Next() ) + sbwd->Add ( exp.Current(), i++ ); + sbwd->Remove ( i-- ); + } + for ( i =1; i <= myFreeEdges.Length(); i++ ) { + sbwd->Add(TopoDS::Edge(myFreeEdges.Value(i))); + } +} diff --git a/src/TransformationGUI/TransformationGUI_MirrorDlg.cxx b/src/TransformationGUI/TransformationGUI_MirrorDlg.cxx new file mode 100644 index 000000000..8f09b83f8 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_MirrorDlg.cxx @@ -0,0 +1,452 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_MirrorDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "TransformationGUI_MirrorDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_MirrorDlg() +// purpose : Constructs a TransformationGUI_MirrorDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_MirrorDlg::TransformationGUI_MirrorDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_MIRROR_POINT"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_MIRROR_AXE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_MIRROR_PLANE"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_MIRROR_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_MIRROR")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->setPixmap(image2); + + GroupPoints = new DlgRef_2Sel1Spin2Check(this, "GroupPoints"); + GroupPoints->SpinBox_DX->hide(); + GroupPoints->TextLabel3->hide(); + GroupPoints->CheckButton2->hide(); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_MIRROR")); + GroupPoints->TextLabel2->setFixedWidth(74); + GroupPoints->PushButton1->setPixmap(image3); + GroupPoints->PushButton2->setPixmap(image3); + GroupPoints->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + Layout1->addWidget(GroupPoints, 2, 0); + + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_MirrorDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_MirrorDlg::~TransformationGUI_MirrorDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly(true); + GroupPoints->LineEdit2->setReadOnly(true); + + myArgument = GEOM::GEOM_Object::_nil(); + + // Activate Create a Copy mode + GroupPoints->CheckButton1->setChecked(true); + CreateCopyModeChanged(true); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_MIRROR" ) ); + ConstructorsClicked( 0 ); +} + + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_MirrorDlg::ConstructorsClicked(int constructorId) +{ + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + + globalSelection(); + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit2->clear(); + myArgument = GEOM::GEOM_Object::_nil(); + + switch (constructorId) + { + case 0: /* mirror an object by point */ + { + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_MIRROR")); + break; + } + case 1: /* mirror an object by axe */ + { + GroupPoints->TextLabel2->setText(tr("GEOM_AXE_MIRROR")); + break; + } + case 2: /* mirror an object by plane */ + { + GroupPoints->TextLabel2->setText(tr("GEOM_PLANE_MIRROR")); + break; + } + } + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_MirrorDlg::ClickOnApply() +{ + if ( !onAccept(GroupPoints->CheckButton1->isChecked()) ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_MirrorDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void TransformationGUI_MirrorDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + { + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + if(aNbSel < 1) + { + myObjects.length(0); + return; + } + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) + return; + if(aNbSel != 1) + aName = tr("%1_objects").arg(aNbSel); + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + { + if(IObjectCount() != 1) + { + myArgument = GEOM::GEOM_Object::_nil(); + return; + } + Standard_Boolean testResult = Standard_False; + myArgument = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + if(!testResult || CORBA::is_nil( myArgument )) + return; + aName = GEOMBase::GetName( myArgument ); + } + myEditCurrentArgument->setText( aName ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1){ + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection(); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + switch(getConstructorId()) + { + case 0: + { + globalSelection( GEOM_POINT ); + break; + } + case 1: + { + globalSelection( GEOM_LINE ); + break; + } + case 2: + { + globalSelection( GEOM_PLANE ); + break; + } + } + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_MirrorDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void TransformationGUI_MirrorDlg::enterEvent(QEvent * e) +{ + if(!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_MirrorDlg::createOperation() +{ + return getGeomEngine()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_MirrorDlg::isValid( QString& msg ) +{ + return !(myObjects.length() == 0 || myArgument->_is_nil()); +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_MirrorDlg::execute( ObjectList& objects ) +{ + bool res = false; + bool toCreateCopy = IsPreview() || GroupPoints->CheckButton1->isChecked(); + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorPointCopy( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorPoint( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + case 1 : + { + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorAxisCopy( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorAxis( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + case 2: + { + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorPlaneCopy( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MirrorPlane( myObjects[i], myArgument ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + } + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_MirrorDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + this->GroupBoxName->setEnabled(isCreateCopy); +} diff --git a/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx new file mode 100644 index 000000000..88b262a44 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_MultiRotationDlg.cxx @@ -0,0 +1,483 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_MultiRotationDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "TransformationGUI_MultiRotationDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_MultiRotationDlg() +// purpose : Constructs a TransformationGUI_MultiRotationDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_MultiRotationDlg::TransformationGUI_MultiRotationDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_MULTIROTATION_SIMPLE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_MULTIROTATION_DOUBLE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_MULTIROTATION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_MULTIROTATION")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel1Spin(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_SIMPLE")); + GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->TextLabel3->setText(tr("GEOM_NB_TIMES")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + GroupPoints->LineEdit1->setReadOnly(true); + GroupPoints->LineEdit2->setReadOnly(true); + + GroupDimensions = new DlgRef_2Sel4Spin1Check(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_MULTIROTATION_DOUBLE")); + GroupDimensions->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + GroupDimensions->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupDimensions->TextLabel3->setText(tr("GEOM_ANGLE")); + GroupDimensions->TextLabel4->setText(tr("GEOM_NB_TIMES")); + GroupDimensions->TextLabel5->setText(tr("GEOM_STEP")); + GroupDimensions->TextLabel6->setText(tr("GEOM_NB_TIMES")); + GroupDimensions->CheckButton1->setText(tr("GEOM_REVERSE")); + GroupDimensions->PushButton1->setPixmap(image2); + GroupDimensions->PushButton2->setPixmap(image2); + GroupDimensions->LineEdit1->setReadOnly(true); + GroupDimensions->LineEdit2->setReadOnly(true); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_MultiRotationDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_MultiRotationDlg::~TransformationGUI_MultiRotationDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::Init() +{ + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + double SpecificStep1 = 5; + double SpecificStep2 = 1; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(1.0, 999.999, SpecificStep2, 3); + GroupPoints->SpinBox_DX->SetValue(myNbTimes1); + + GroupDimensions->SpinBox_DX1->RangeStepAndValidator(-999.999, 999.999, SpecificStep1, 3); + GroupDimensions->SpinBox_DY1->RangeStepAndValidator(1.0, 999.999, SpecificStep2, 3); + GroupDimensions->SpinBox_DX2->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DY2->RangeStepAndValidator(1.0, 999.999, SpecificStep2, 3); + GroupDimensions->SpinBox_DX1->SetValue(myAng); + GroupDimensions->SpinBox_DY1->SetValue(myNbTimes1); + GroupDimensions->SpinBox_DX2->SetValue(myStep); + GroupDimensions->SpinBox_DY2->SetValue(myNbTimes2); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDimensions->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDimensions->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupDimensions->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupDimensions->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DY1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DY2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX2, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY2, SLOT(SetStep(double))); + + connect(GroupDimensions->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseAngle())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_MULTIROTATION" ) ); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_MultiRotationDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + myAng = 45.0; + myStep = 50.0; + myNbTimes1 = myNbTimes2 = 2; + + globalSelection( GEOM_ALLSHAPES ); + + switch (constructorId) + { + case 0: /* Rotate simple */ + { + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(""); + GroupPoints->LineEdit2->setText(""); + + GroupPoints->SpinBox_DX->SetValue(myNbTimes1); + + break; + } + case 1: /* Rotate double */ + { + GroupPoints->hide(); + resize(0, 0); + GroupDimensions->show(); + + myEditCurrentArgument = GroupDimensions->LineEdit1; + GroupDimensions->LineEdit1->setText(""); + GroupDimensions->LineEdit2->setText(""); + + GroupDimensions->SpinBox_DX1->SetValue(myAng); + GroupDimensions->SpinBox_DY1->SetValue(myNbTimes1); + GroupDimensions->SpinBox_DX2->SetValue(myStep); + GroupDimensions->SpinBox_DY2->SetValue(myNbTimes2); + + break; + } + } + + myEditCurrentArgument->setFocus(); + myBase = myVector = GEOM::GEOM_Object::_nil(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_MultiRotationDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_MultiRotationDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_MultiRotationDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1) + myBase = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupDimensions->LineEdit2) + myVector = GEOM::GEOM_Object::_nil(); + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False;; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if ( !testResult || CORBA::is_nil( aSelectedObject ) || !GEOMBase::IsShape( aSelectedObject ) ) + return; + + + if(myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1) + myBase = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupDimensions->LineEdit2) + myVector = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_ALLSHAPES ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + else if(send == GroupDimensions->PushButton1) { + myEditCurrentArgument = GroupDimensions->LineEdit1; + globalSelection( GEOM_ALLSHAPES ); + } + else if(send == GroupDimensions->PushButton2) { + myEditCurrentArgument = GroupDimensions->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || send == GroupDimensions->LineEdit1 || + send == GroupPoints->LineEdit2 || send == GroupDimensions->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_MultiRotationDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::enterEvent(QEvent* e) +{ + if(!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::ValueChangedInSpinBox(double newValue) +{ + QObject* send = (QObject*)sender(); + + if(send == GroupPoints->SpinBox_DX || send == GroupDimensions->SpinBox_DY1) + myNbTimes1 = (int)newValue; + else if(send == GroupDimensions->SpinBox_DX1) + myAng = newValue; + else if(send == GroupDimensions->SpinBox_DX2) + myStep = newValue; + else if(send == GroupDimensions->SpinBox_DY2) + myNbTimes2 = (int)newValue; + + displayPreview(); +} + + +//================================================================================= +// function : ReverseAngle() +// purpose : 'state' not used here +//================================================================================= +void TransformationGUI_MultiRotationDlg::ReverseAngle() +{ + myAng = -myAng; + + int aConstructorId = getConstructorId(); + + if(aConstructorId == 0) + GroupPoints->SpinBox_DX->SetValue(myAng); + else if(aConstructorId == 1) + GroupDimensions->SpinBox_DX1->SetValue(myAng); + + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_MultiRotationDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_MultiRotationDlg::isValid( QString& msg ) +{ + return !(myBase->_is_nil() || myVector->_is_nil()); +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_MultiRotationDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myBase ) && !CORBA::is_nil( myVector ) ) { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MultiRotate1D( myBase, myVector, myNbTimes1 ); + res = true; + } + break; + } + case 1 : + { + if ( !CORBA::is_nil( myBase ) && !CORBA::is_nil( myVector ) ) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MultiRotate2D( myBase, myVector, myAng, myNbTimes1, myStep, myNbTimes2 ); + res = true; + } + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_MultiRotationDlg::closeEvent( QCloseEvent* e ) +{ + // myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx new file mode 100644 index 000000000..255df8858 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_MultiTranslationDlg.cxx @@ -0,0 +1,546 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_MultiTranslationDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "TransformationGUI_MultiTranslationDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include + +#include "GEOMImpl_Types.hxx" + +#include + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_MultiTranslationDlg() +// purpose : Constructs a TransformationGUI_MultiTranslationDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_MultiTranslationDlg::TransformationGUI_MultiTranslationDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr("ICON_DLG_MULTITRANSLATION_SIMPLE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr("ICON_DLG_MULTITRANSLATION_DOUBLE"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_MULTITRANSLATION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_MULTITRANSLATION")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel2Spin1Check(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_MULTITRANSLATION_SIMPLE")); + GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR_U")); + GroupPoints->TextLabel3->setText(tr("GEOM_STEP_U")); + GroupPoints->TextLabel4->setText(tr("GEOM_NB_TIMES_U")); + GroupPoints->CheckButton1->setText(tr("GEOM_REVERSE_U")); + GroupPoints->PushButton1->setPixmap(image2); + GroupPoints->PushButton2->setPixmap(image2); + GroupPoints->LineEdit1->setReadOnly(true); + GroupPoints->LineEdit2->setReadOnly(true); + + GroupDimensions = new DlgRef_3Sel4Spin2Check(this, "GroupDimensions"); + GroupDimensions->GroupBox1->setTitle(tr("GEOM_MULTITRANSLATION_DOUBLE")); + GroupDimensions->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + GroupDimensions->TextLabel2->setText(tr("GEOM_VECTOR_U")); + GroupDimensions->TextLabel3->setText(tr("GEOM_VECTOR_V")); + GroupDimensions->TextLabel4->setText(tr("GEOM_STEP_U")); + GroupDimensions->TextLabel5->setText(tr("GEOM_NB_TIMES_U")); + GroupDimensions->TextLabel6->setText(tr("GEOM_STEP_V")); + GroupDimensions->TextLabel7->setText(tr("GEOM_NB_TIMES_V")); + GroupDimensions->CheckButton1->setText(tr("GEOM_REVERSE_U")); + GroupDimensions->CheckButton2->setText(tr("GEOM_REVERSE_V")); + GroupDimensions->PushButton1->setPixmap(image2); + GroupDimensions->PushButton2->setPixmap(image2); + GroupDimensions->PushButton3->setPixmap(image2); + GroupDimensions->LineEdit1->setReadOnly(true); + GroupDimensions->LineEdit2->setReadOnly(true); + GroupDimensions->LineEdit3->setReadOnly(true); + + Layout1->addWidget(GroupPoints, 2, 0); + Layout1->addWidget(GroupDimensions, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_MultiTranslationDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_MultiTranslationDlg::~TransformationGUI_MultiTranslationDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::Init() +{ + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + double SpecificStep = 1; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupPoints->SpinBox_DY->RangeStepAndValidator(1.0, 999.999, SpecificStep, 3); + GroupPoints->SpinBox_DX->SetValue(myStepU); + GroupPoints->SpinBox_DY->SetValue(myNbTimesU); + + GroupDimensions->SpinBox_DX1->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DY1->RangeStepAndValidator(1.0, 999.999, SpecificStep, 3); + GroupDimensions->SpinBox_DX2->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupDimensions->SpinBox_DY2->RangeStepAndValidator(1.0, 999.999, SpecificStep, 3); + GroupDimensions->SpinBox_DX1->SetValue(myStepU); + GroupDimensions->SpinBox_DY1->SetValue(myNbTimesU); + GroupDimensions->SpinBox_DX2->SetValue(myStepV); + GroupDimensions->SpinBox_DY2->SetValue(myNbTimesV); + + /* 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->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDimensions->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDimensions->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupDimensions->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupDimensions->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupDimensions->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupDimensions->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupPoints->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DX1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DY1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DX2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + connect(GroupDimensions->SpinBox_DY2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double))); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DY, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DX2, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupDimensions->SpinBox_DY2, SLOT(SetStep(double))); + + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseStepU())); + connect(GroupDimensions->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(ReverseStepU())); + connect(GroupDimensions->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(ReverseStepV())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + + initName( tr( "GEOM_MULTITRANSLATION" ) ); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ConstructorsClicked(int constructorId) +{ + disconnect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0); + + myStepU = myStepV = 50.0; + myNbTimesU = myNbTimesV = 2; + + globalSelection( GEOM_ALLSHAPES ); + + switch (constructorId) + { + case 0: /* Translate simple */ + { + GroupDimensions->hide(); + resize(0, 0); + GroupPoints->show(); + + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setText(""); + GroupPoints->LineEdit2->setText(""); + + GroupPoints->SpinBox_DX->SetValue(myStepU); + GroupPoints->SpinBox_DY->SetValue(myNbTimesU); + + break; + } + case 1: /* Translate double */ + { + GroupPoints->hide(); + resize(0, 0); + GroupDimensions->show(); + + myEditCurrentArgument = GroupDimensions->LineEdit1; + GroupDimensions->LineEdit1->setText(""); + GroupDimensions->LineEdit2->setText(""); + GroupDimensions->LineEdit3->setText(""); + + GroupDimensions->SpinBox_DX1->SetValue(myStepU); + GroupDimensions->SpinBox_DY1->SetValue(myNbTimesU); + GroupDimensions->SpinBox_DX2->SetValue(myStepV); + GroupDimensions->SpinBox_DY2->SetValue(myNbTimesV); + + myVectorV = GEOM::GEOM_Object::_nil(); + break; + } + } + + myEditCurrentArgument->setFocus(); + myBase = myVectorU = GEOM::GEOM_Object::_nil(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_MultiTranslationDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_MultiTranslationDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_MultiTranslationDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + + if(IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1) + myBase = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupDimensions->LineEdit2) + myVectorU = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupDimensions->LineEdit3) + myVectorV = GEOM::GEOM_Object::_nil(); + return; + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False;; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if ( !testResult || CORBA::is_nil( aSelectedObject ) || !GEOMBase::IsShape( aSelectedObject ) ) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit1 || myEditCurrentArgument == GroupDimensions->LineEdit1) + myBase = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit2 || myEditCurrentArgument == GroupDimensions->LineEdit2) + myVectorU = aSelectedObject; + else if(myEditCurrentArgument == GroupDimensions->LineEdit3) + myVectorV = aSelectedObject; + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection( GEOM_ALLSHAPES ); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + else if(send == GroupDimensions->PushButton1) { + myEditCurrentArgument = GroupDimensions->LineEdit1; + globalSelection( GEOM_ALLSHAPES ); + } + else if(send == GroupDimensions->PushButton2) { + myEditCurrentArgument = GroupDimensions->LineEdit2; + globalSelection( GEOM_LINE ); + } + else if(send == GroupDimensions->PushButton3) { + myEditCurrentArgument = GroupDimensions->LineEdit3; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || send == GroupDimensions->LineEdit1 || + send == GroupPoints->LineEdit2 || send == GroupDimensions->LineEdit2 || + send == GroupDimensions->LineEdit3) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_MultiTranslationDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::enterEvent(QEvent* e) +{ + if(!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ValueChangedInSpinBox(double newValue) +{ + QObject* send = (QObject*)sender(); + + switch(getConstructorId()) + { + case 0 : + { + if(send == GroupPoints->SpinBox_DX) + myStepU = newValue; + else if(send == GroupPoints->SpinBox_DY) + myNbTimesU = (int)newValue; + break; + } + case 1 : + { + if(send == GroupDimensions->SpinBox_DX1) + myStepU = newValue; + else if(send == GroupDimensions->SpinBox_DY1) + myNbTimesU = (int)newValue; + else if(send == GroupDimensions->SpinBox_DX2) + myStepV = newValue; + else if(send == GroupDimensions->SpinBox_DY2) + myNbTimesV = (int)newValue; + break; + } + } + + displayPreview(); +} + + +//================================================================================= +// function : ReverseStepU() +// purpose : 'state' not used here +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ReverseStepU() +{ + myStepU = -myStepU; + + int aConstructorId = getConstructorId(); + + if(aConstructorId == 0) + GroupPoints->SpinBox_DX->SetValue(myStepU); + else if(aConstructorId == 1) + GroupDimensions->SpinBox_DX1->SetValue(myStepU); + + displayPreview(); +} + + +//================================================================================= +// function : ReverseStepV +// purpose : 'state' not used here +//================================================================================= +void TransformationGUI_MultiTranslationDlg::ReverseStepV() +{ + myStepV = -myStepV; + + GroupDimensions->SpinBox_DX2->SetValue(myStepV); + + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_MultiTranslationDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_MultiTranslationDlg::isValid( QString& msg ) +{ + int aConstructorId = getConstructorId(); + + if(aConstructorId == 0) + return !(myBase->_is_nil() || myVectorU->_is_nil()); + else if(aConstructorId == 1) + return !(myBase->_is_nil() || myVectorU->_is_nil() || myVectorV->_is_nil()); + return 0; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_MultiTranslationDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + if ( !CORBA::is_nil( myBase ) && !CORBA::is_nil( myVectorU ) ) { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MultiTranslate1D( myBase, myVectorU, myStepU, myNbTimesU ); + res = true; + } + break; + } + case 1 : + { + if ( !CORBA::is_nil( myBase ) && !CORBA::is_nil( myVectorU ) && !CORBA::is_nil( myVectorV ) ) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->MultiTranslate2D( myBase, myVectorU, myStepU, myNbTimesU, + myVectorV, myStepV, myNbTimesV ); + res = true; + } + break; + } + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_MultiTranslationDlg::closeEvent( QCloseEvent* e ) +{ + // myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} diff --git a/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx new file mode 100644 index 000000000..805bc8a72 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_OffsetDlg.cxx @@ -0,0 +1,352 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_OffsetDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "TransformationGUI_OffsetDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_OffsetDlg() +// purpose : Constructs a TransformationGUI_OffsetDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_OffsetDlg::TransformationGUI_OffsetDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_OFFSET"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_OFFSET_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_OFFSET")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel1Spin1Check(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_OFFSET")); + GroupPoints->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + + // san -- modification of an exisitng object by offset is not allowed + GroupPoints->CheckButton1->hide(); + + GroupPoints->PushButton1->setPixmap(image1); + + Layout1->addWidget(GroupPoints, 2, 0); + + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_OffsetDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_OffsetDlg::~TransformationGUI_OffsetDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly( true ); + + /* Get setting of step value from file configuration */ + double step = 1; + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupPoints->SpinBox_DX->setPrecision(5); + //@ GroupPoints->SpinBox_DX->setDblPrecision(1e-05); + GroupPoints->SpinBox_DX->SetValue(1e-05); + + // Activate Create a Copy mode + GroupPoints->CheckButton1->setChecked(true); + CreateCopyModeChanged(true); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + initName( tr( "GEOM_OFFSET" ) ); + + globalSelection( GEOM_ALLSHAPES ); + +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_OffsetDlg::ClickOnApply() +{ + if ( !onAccept( GroupPoints->CheckButton1->isChecked() ) ) + return false; + + initName(); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_OffsetDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void TransformationGUI_OffsetDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + if(aNbSel < 1) + { + myObjects.length(0); + return; + } + + // nbSel > 0 + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) + return; + + myEditCurrentArgument->setText( aName ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if ( send == GroupPoints->LineEdit1 ) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); + } +} + + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void TransformationGUI_OffsetDlg::enterEvent(QEvent * e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + globalSelection( GEOM_ALLSHAPES ); + myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument->setFocus(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_OffsetDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_OffsetDlg::createOperation() +{ + return getGeomEngine()->GetITransformOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_OffsetDlg::isValid( QString& msg ) +{ + return !(myObjects.length() == 0); +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_OffsetDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + + if (GroupPoints->CheckButton1->isChecked() || IsPreview()) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShapeCopy( myObjects[i], GetOffset() ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->OffsetShape( myObjects[i], GetOffset() ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + + res = true; + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::closeEvent( QCloseEvent* e ) +{ + // myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : GetOffset() +// purpose : +//================================================================================= +double TransformationGUI_OffsetDlg::GetOffset() const +{ + return GroupPoints->SpinBox_DX->GetValue(); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_OffsetDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + this->GroupBoxName->setEnabled(isCreateCopy); +} diff --git a/src/TransformationGUI/TransformationGUI_PositionDlg.cxx b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx new file mode 100644 index 000000000..e16e3bbd3 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_PositionDlg.cxx @@ -0,0 +1,445 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_PositionDlg.cxx +// Author : Damien COQUERET +// Module : GEOM +// $Header$ + +#include "TransformationGUI_PositionDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "TColStd_MapOfInteger.hxx" + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_PositionDlg() +// purpose : Constructs a TransformationGUI_PositionDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_PositionDlg::TransformationGUI_PositionDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POSITION"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_POSITION2"))); + QPixmap imageselect(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_POSITION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_POSITION")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->close(TRUE); + + Group1 = new DlgRef_3Sel3Spin1Check(this, "Group1"); + Group1->SpinBox1->hide(); + Group1->SpinBox2->hide(); + Group1->SpinBox3->hide(); + Group1->TextLabel4->hide(); + Group1->TextLabel5->hide(); + Group1->TextLabel6->hide(); + Group1->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + Group1->TextLabel1->setText(tr("GEOM_OBJECTS")); + Group1->TextLabel2->setText(tr("GEOM_START_LCS")); + Group1->TextLabel3->setText(tr("GEOM_END_LCS")); + Group1->PushButton1->setPixmap(imageselect); + Group1->PushButton2->setPixmap(imageselect); + Group1->PushButton3->setPixmap(imageselect); + Group1->CheckBox1->setText(tr("GEOM_CREATE_COPY")); + + Layout1->addWidget(Group1, 2, 0); + + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_PositionDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_PositionDlg::~TransformationGUI_PositionDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::Init() +{ + /* init variables */ + Group1->LineEdit1->setReadOnly(true); + Group1->LineEdit2->setReadOnly(true); + Group1->LineEdit3->setReadOnly(true); + + myStartLCS = GEOM::GEOM_Object::_nil(); + myEndLCS = GEOM::GEOM_Object::_nil(); + + // Activate Create a Copy mode + Group1->CheckBox1->setChecked(true); + CreateCopyModeChanged(true); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); + + connect(Group1->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group1->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(Group1->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(Group1->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(Group1->LineEdit3, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(Group1->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_POSITION" ) ); + ConstructorsClicked( 0 ); +} + + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_PositionDlg::ConstructorsClicked(int constructorId) +{ + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + + globalSelection(); + myEditCurrentArgument = Group1->LineEdit1; + Group1->LineEdit2->clear(); + Group1->LineEdit3->clear(); + myStartLCS = GEOM::GEOM_Object::_nil(); + myEndLCS = GEOM::GEOM_Object::_nil(); + + switch (constructorId) + { + case 0: + { + Group1->LineEdit2->hide(); + Group1->TextLabel2->hide(); + Group1->PushButton2->hide(); + break; + } + case 1: + { + Group1->LineEdit2->show(); + Group1->TextLabel2->show(); + Group1->PushButton2->show(); + break; + } + } + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + SelectionIntoArgument(); +} + + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_PositionDlg::ClickOnApply() +{ + if ( !onAccept(Group1->CheckBox1->isChecked()) ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_PositionDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection has changed +//================================================================================= +void TransformationGUI_PositionDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == Group1->LineEdit1) { + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + if(aNbSel < 1) { + myObjects.length(0); + displayPreview(); + return; + } + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) { + displayPreview(); + return; + } + } + else if(myEditCurrentArgument == Group1->LineEdit2) { + myStartLCS = GEOM::GEOM_Object::_nil(); + if(IObjectCount() != 1) { + displayPreview(); + return; + } + + Standard_Boolean testResult = Standard_False; + myStartLCS = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + if(!testResult || CORBA::is_nil( myStartLCS )) { + displayPreview(); + return; + } + aName = GEOMBase::GetName( myStartLCS ); + } + else if(myEditCurrentArgument == Group1->LineEdit3) { + myEndLCS = GEOM::GEOM_Object::_nil(); + if(IObjectCount() != 1) { + displayPreview(); + return; + } + + Standard_Boolean testResult = Standard_False; + myEndLCS = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + if(!testResult || CORBA::is_nil( myEndLCS )) { + displayPreview(); + return; + } + aName = GEOMBase::GetName( myEndLCS ); + } + + myEditCurrentArgument->setText( aName ); + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == Group1->LineEdit1 || send == Group1->LineEdit2 || send == Group1->LineEdit3) { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == Group1->PushButton1){ + myEditCurrentArgument = Group1->LineEdit1; + globalSelection(); + } + else if(send == Group1->PushButton2) { + myEditCurrentArgument = Group1->LineEdit2; + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_PLANE ); + aMap.Add( GEOM_MARKER ); + globalSelection( aMap ); + } + else if(send == Group1->PushButton3) { + myEditCurrentArgument = Group1->LineEdit3; + TColStd_MapOfInteger aMap; + aMap.Add( GEOM_PLANE ); + aMap.Add( GEOM_MARKER ); + globalSelection( aMap ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_PositionDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : when mouse enter onto the QWidget +//================================================================================= +void TransformationGUI_PositionDlg::enterEvent(QEvent * e) +{ + if(!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_PositionDlg::createOperation() +{ + return getGeomEngine()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_PositionDlg::isValid( QString& msg ) +{ + bool res; + if (getConstructorId() == 0) + res = !(myObjects.length() == 0 || myEndLCS->_is_nil()); + else + res = !(myObjects.length() == 0 || myStartLCS->_is_nil() || myEndLCS->_is_nil()); + + return res; +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_PositionDlg::execute( ObjectList& objects ) +{ + bool res = false; + bool toCreateCopy = IsPreview() || Group1->CheckBox1->isChecked(); + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + for (int i = 0; i < myObjects.length(); i++) { + if (toCreateCopy) + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->PositionShapeCopy( myObjects[i], myObjects[i], myEndLCS ); + else + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->PositionShape( myObjects[i], myObjects[i], myEndLCS ); + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + case 1 : + { + for (int i = 0; i < myObjects.length(); i++) { + if (toCreateCopy) + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->PositionShapeCopy( myObjects[i], myStartLCS, myEndLCS ); + else + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->PositionShape( myObjects[i], myStartLCS, myEndLCS ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + } + + return res; +} + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_PositionDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + this->GroupBoxName->setEnabled(isCreateCopy); +} diff --git a/src/TransformationGUI/TransformationGUI_RotationDlg.cxx b/src/TransformationGUI/TransformationGUI_RotationDlg.cxx new file mode 100644 index 000000000..7b1abd28b --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_RotationDlg.cxx @@ -0,0 +1,386 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_RotationDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "TransformationGUI_RotationDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_RotationDlg() +// purpose : Constructs a TransformationGUI_RotationDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_RotationDlg::TransformationGUI_RotationDlg(QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_ROTATION"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_ROTATION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_ROTATION")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel1Spin2Check(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_AXIS")); + GroupPoints->TextLabel3->setText(tr("GEOM_ANGLE")); + GroupPoints->LineEdit1->setReadOnly(true); + GroupPoints->LineEdit2->setReadOnly(true); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + GroupPoints->CheckButton2->setText(tr("GEOM_REVERSE")); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + double anAngle = 0; + double SpecificStep = 5; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, SpecificStep, 3); + GroupPoints->SpinBox_DX->SetValue(anAngle); + + // Activate Create a Copy mode + GroupPoints->CheckButton1->setChecked(true); + CreateCopyModeChanged(true); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + connect(GroupPoints->CheckButton2, SIGNAL(toggled(bool)), this, SLOT(onReverse())); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_RotationDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_RotationDlg::~TransformationGUI_RotationDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit2->clear(); + + myAxis = GEOM::GEOM_Object::_nil(); + + initName( tr( "GEOM_ROTATION" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_RotationDlg::ClickOnApply() +{ + if ( !onAccept( GroupPoints->CheckButton1->isChecked()) ) + return false; + + Init(); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_RotationDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_RotationDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + { + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + if(aNbSel < 1) + { + myObjects.length(0); + return; + } + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) + return; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + { + if(IObjectCount() != 1) + { + myAxis = GEOM::GEOM_Object::_nil(); + return; + } + Standard_Boolean testResult = Standard_False; + myAxis = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + if(!testResult || CORBA::is_nil( myAxis )) + return; + aName = GEOMBase::GetName( myAxis ); + } + myEditCurrentArgument->setText( aName ); + + displayPreview(); +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection(); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_LINE ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + globalSelection(); + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit2->clear(); + myAxis = GEOM::GEOM_Object::_nil(); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_RotationDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::enterEvent(QEvent* e) +{ + if (!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_RotationDlg::createOperation() +{ + return getGeomEngine()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_RotationDlg::isValid( QString& msg ) +{ + return !(myObjects.length() == 0 || myAxis->_is_nil()); +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_RotationDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + if (GroupPoints->CheckButton1->isChecked() || IsPreview()) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->RotateCopy( myObjects[i], myAxis, GetAngle() * PI180 ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->Rotate( myObjects[i], myAxis, GetAngle() * PI180 ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : GetAngle() +// purpose : +//================================================================================= +double TransformationGUI_RotationDlg::GetAngle() const +{ + return GroupPoints->SpinBox_DX->GetValue(); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + this->GroupBoxName->setEnabled(isCreateCopy); +} + + +//================================================================================= +// function : onReverse() +// purpose : +//================================================================================= +void TransformationGUI_RotationDlg::onReverse() +{ + double anOldValue = GroupPoints->SpinBox_DX->GetValue(); + GroupPoints->SpinBox_DX->SetValue( -anOldValue ); +} diff --git a/src/TransformationGUI/TransformationGUI_ScaleDlg.cxx b/src/TransformationGUI/TransformationGUI_ScaleDlg.cxx new file mode 100644 index 000000000..a215ba028 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_ScaleDlg.cxx @@ -0,0 +1,374 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_ScaleDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "TransformationGUI_ScaleDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_ScaleDlg() +// purpose : Constructs a TransformationGUI_ScaleDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_ScaleDlg::TransformationGUI_ScaleDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SCALE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_SCALE_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_SCALE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_2Sel1Spin2Check(this, "GroupPoints"); + GroupPoints->CheckButton2->hide(); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel2->setText(tr("GEOM_CENTRAL_POINT")); + GroupPoints->TextLabel3->setText(tr("GEOM_SCALE_FACTOR")); + GroupPoints->LineEdit1->setReadOnly( true ); + GroupPoints->LineEdit2->setReadOnly( true ); + GroupPoints->PushButton1->setPixmap(image1); + GroupPoints->PushButton2->setPixmap(image1); + GroupPoints->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + + // san -- modification of an exisitng object by offset is not allowed + GroupPoints->CheckButton1->hide(); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + double aFactor = 2.0; + double SpecificStep = 0.5; + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox_DX->RangeStepAndValidator(-999.999, 999.999, SpecificStep, 3); + GroupPoints->SpinBox_DX->SetValue(aFactor); + + // Activate Create a Copy mode + GroupPoints->CheckButton1->setChecked(true); + CreateCopyModeChanged(true); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox_DX, SLOT(SetStep(double))); + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_ScaleDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_ScaleDlg::~TransformationGUI_ScaleDlg() +{ + /* no need to delete child widgets, Qt does it all for us */ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::Init() +{ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit2->clear(); + + myPoint = GEOM::GEOM_Object::_nil(); + + initName( tr( "GEOM_SCALE" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_ScaleDlg::ClickOnApply() +{ + if ( !onAccept(GroupPoints->CheckButton1->isChecked()) ) + return false; + + Init(); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_ScaleDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_ScaleDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + { + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + if(aNbSel < 1) + { + myObjects.length(0); + return; + } + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) + return; + } + else if(myEditCurrentArgument == GroupPoints->LineEdit2) + { + if(IObjectCount() != 1) + { + myPoint = GEOM::GEOM_Object::_nil(); + return; + } + Standard_Boolean testResult = Standard_False; + myPoint = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + if(!testResult || CORBA::is_nil( myPoint )) + return; + aName = GEOMBase::GetName( myPoint ); + } + myEditCurrentArgument->setText( aName ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1 || + send == GroupPoints->LineEdit2) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection(); + } + else if(send == GroupPoints->PushButton2) { + myEditCurrentArgument = GroupPoints->LineEdit2; + globalSelection( GEOM_POINT ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + globalSelection(); + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_ScaleDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::enterEvent(QEvent* e) +{ + if( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_ScaleDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetITransformOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_ScaleDlg::isValid( QString& msg ) +{ + return !(myObjects.length() == 0 || myPoint->_is_nil() || fabs(GetFactor()) <= 0.00001); +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_ScaleDlg::execute( ObjectList& objects ) +{ + bool res = false; + + GEOM::GEOM_Object_var anObj; + + if (GroupPoints->CheckButton1->isChecked() || IsPreview()) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->ScaleShapeCopy( myObjects[i], myPoint, GetFactor() ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->ScaleShape( myObjects[i], myPoint, GetFactor() ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::closeEvent( QCloseEvent* e ) +{ + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : GetFactor() +// purpose : +//================================================================================= +double TransformationGUI_ScaleDlg::GetFactor() const +{ + return GroupPoints->SpinBox_DX->GetValue(); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_ScaleDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + this->GroupBoxName->setEnabled(isCreateCopy); +} diff --git a/src/TransformationGUI/TransformationGUI_TranslationDlg.cxx b/src/TransformationGUI/TransformationGUI_TranslationDlg.cxx new file mode 100644 index 000000000..d221fb855 --- /dev/null +++ b/src/TransformationGUI/TransformationGUI_TranslationDlg.cxx @@ -0,0 +1,527 @@ +// 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, +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TransformationGUI_TranslationDlg.cxx +// Author : Lucien PIGNOLONI +// Module : GEOM +// $Header$ + +#include "TransformationGUI_TranslationDlg.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" + +#include +#include + +#include "GEOMImpl_Types.hxx" + +#include "utilities.h" + +using namespace std; + +//================================================================================= +// class : TransformationGUI_TranslationDlg() +// purpose : Constructs a TransformationGUI_TranslationDlg which is a child of 'parent', with the +// name 'name' and widget flags set to 'f'. +// The dialog will by default be modeless, unless you set 'modal' to +// TRUE to construct a modal dialog. +//================================================================================= +TransformationGUI_TranslationDlg::TransformationGUI_TranslationDlg(GeometryGUI* theGeometryGUI, QWidget* parent, const char* name, bool modal, WFlags fl) + :GEOMBase_Skeleton(parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myGeometryGUI(theGeometryGUI) +{ + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_TRANSLATION_DXYZ"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_TRANSLATION_POINTS"))); + QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_TRANSLATION_VECTOR"))); + QPixmap image3(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_TRANSLATION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_TRANSLATION")); + RadioButton1->setPixmap(image0); + RadioButton2->setPixmap(image1); + RadioButton3->setPixmap(image2); + + RadioButton1->setChecked(true); + + GroupPoints = new DlgRef_3Sel3Spin1Check(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); + GroupPoints->TextLabel1->setText(tr("GEOM_OBJECTS")); + GroupPoints->TextLabel3->setText(tr("GEOM_POINT_I").arg("2")); + GroupPoints->TextLabel4->setText(tr("GEOM_DX")); + GroupPoints->TextLabel5->setText(tr("GEOM_DY")); + GroupPoints->TextLabel6->setText(tr("GEOM_DZ")); + GroupPoints->PushButton1->setPixmap(image3); + GroupPoints->PushButton2->setPixmap(image3); + GroupPoints->PushButton3->setPixmap(image3); + GroupPoints->CheckBox1->setText(tr("GEOM_CREATE_COPY")); + + Layout1->addWidget(GroupPoints, 2, 0); + /***************************************************************/ + + Init(); +} + + +//================================================================================= +// function : ~TransformationGUI_TranslationDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +TransformationGUI_TranslationDlg::~TransformationGUI_TranslationDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + GroupPoints->LineEdit1->setReadOnly(true); + GroupPoints->LineEdit2->setReadOnly(true); + GroupPoints->LineEdit3->setReadOnly(true); + + myVector = myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); + + // Activate Create a Copy mode + GroupPoints->CheckBox1->setChecked(true); + CreateCopyModeChanged(true); + + /* Get setting of step value from file configuration */ + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100); + + /* min, max, step and decimals for spin boxes & initial values */ + GroupPoints->SpinBox1->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupPoints->SpinBox2->RangeStepAndValidator(-999.999, 999.999, step, 3); + GroupPoints->SpinBox3->RangeStepAndValidator(-999.999, 999.999, step, 3); + + GroupPoints->SpinBox1->SetValue(0.0); + GroupPoints->SpinBox2->SetValue(0.0); + GroupPoints->SpinBox3->SetValue(0.0); + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); //@ Delete ? + + connect(GroupPoints->SpinBox1, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox2, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + connect(GroupPoints->SpinBox3, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox())); + + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox1, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox2, SLOT(SetStep(double))); + connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), GroupPoints->SpinBox3, SLOT(SetStep(double))); + + connect(GroupPoints->CheckBox1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())) ; + + initName( tr( "GEOM_TRANSLATION" ) ); + ConstructorsClicked( 0 ); +} + + +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void TransformationGUI_TranslationDlg::ConstructorsClicked(int constructorId) +{ + disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 ); + + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection(); + + switch (constructorId) + { + case 0: /* translation an object by dx, dy, dz */ + { + GroupPoints->ShowRows(1,2,false); + resize(0,0); + GroupPoints->ShowRows(3,5,true); + break; + } + case 1: /* translation an object by 2 points */ + { + GroupPoints->ShowRows(3,5,false); + resize(0,0); + GroupPoints->ShowRows(0,2,true); + GroupPoints->TextLabel2->setText(tr("GEOM_POINT_I").arg("1")); + GroupPoints->LineEdit2->clear(); + GroupPoints->LineEdit3->clear(); + myPoint1 = myPoint2 = GEOM::GEOM_Object::_nil(); + break; + } + case 2: /* translation an object by vector */ + { + GroupPoints->ShowRows(2,5,false); + resize(0,0); + GroupPoints->ShowRows(0,1,true); + GroupPoints->TextLabel2->setText(tr("GEOM_VECTOR")); + GroupPoints->LineEdit2->clear(); + myVector = GEOM::GEOM_Object::_nil(); + break; + } + } + + myEditCurrentArgument->setFocus(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool TransformationGUI_TranslationDlg::ClickOnApply() +{ + if ( !onAccept(GroupPoints->CheckBox1->isChecked()) ) + return false; + + initName(); + ConstructorsClicked( getConstructorId() ); + return true; +} + + +//======================================================================= +// function : ClickOnCancel() +// purpose : +//======================================================================= +void TransformationGUI_TranslationDlg::ClickOnCancel() +{ + GEOMBase_Skeleton::ClickOnCancel(); +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void TransformationGUI_TranslationDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) + { + int aNbSel = GEOMBase::GetNameOfSelectedIObjects(selectedIO(), aName); + + if(aNbSel < 1) + { + myObjects.length(0); + return; + } + GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), myObjects); + if (!myObjects.length()) + return; + } + else + { + if (IObjectCount() != 1) { + if(myEditCurrentArgument == GroupPoints->LineEdit2 && getConstructorId() == 1) + myPoint1 = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupPoints->LineEdit2 && getConstructorId() == 2) + myVector = GEOM::GEOM_Object::_nil(); + else if(myEditCurrentArgument == GroupPoints->LineEdit3) + myPoint2 = GEOM::GEOM_Object::_nil(); + return; + } + + Standard_Boolean testResult = Standard_False;; + GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(firstIObject(), testResult ); + + if (!testResult || CORBA::is_nil( aSelectedObject )) + return; + + if(myEditCurrentArgument == GroupPoints->LineEdit2 && getConstructorId() == 1) + myPoint1 = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit2 && getConstructorId() == 2) + myVector = aSelectedObject; + else if(myEditCurrentArgument == GroupPoints->LineEdit3) + myPoint2 = aSelectedObject; + + aName = GEOMBase::GetName( aSelectedObject ); + } + + myEditCurrentArgument->setText( aName ); + + displayPreview(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if(send == GroupPoints->LineEdit1) + { + myEditCurrentArgument = send; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if(send == GroupPoints->PushButton1) + { + myEditCurrentArgument = GroupPoints->LineEdit1; + globalSelection(); + } + else if (send == GroupPoints->PushButton2) + { + myEditCurrentArgument = GroupPoints->LineEdit2; + getConstructorId() == 1 ? globalSelection( GEOM_POINT ) : + globalSelection( GEOM_LINE ); + } + else if (send == GroupPoints->PushButton3) + { + myEditCurrentArgument = GroupPoints->LineEdit3; + globalSelection( GEOM_POINT ); + } + + myEditCurrentArgument->setFocus(); + SelectionIntoArgument(); +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + ConstructorsClicked( getConstructorId() ); +} + + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void TransformationGUI_TranslationDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::enterEvent(QEvent* e) +{ + if(!GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + + +//================================================================================= +// function : ValueChangedInSpinBox() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::ValueChangedInSpinBox() +{ + displayPreview(); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr TransformationGUI_TranslationDlg::createOperation() +{ + return myGeometryGUI->GetGeomGen()->GetITransformOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool TransformationGUI_TranslationDlg::isValid( QString& msg ) +{ + int aConstructorId = getConstructorId(); + + switch (aConstructorId) + { + case 0: + { + return !(myObjects.length() == 0 ); + break; + } + case 1: + { + return !(myObjects.length() == 0 || myPoint1->_is_nil() || myPoint2->_is_nil() ); + break; + } + case 2: + { + return !(myObjects.length() == 0 || myVector->_is_nil()); + break; + } + default: return false; + } +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool TransformationGUI_TranslationDlg::execute( ObjectList& objects ) +{ + bool res = false; + bool toCreateCopy = IsPreview() || GroupPoints->CheckBox1->isChecked(); + + GEOM::GEOM_Object_var anObj; + + switch ( getConstructorId() ) + { + case 0 : + { + double dx = GroupPoints->SpinBox1->GetValue(); + double dy = GroupPoints->SpinBox2->GetValue(); + double dz = GroupPoints->SpinBox3->GetValue(); + + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateDXDYDZCopy( myObjects[i], dx, dy, dz ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateDXDYDZ( myObjects[i], dx, dy, dz ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + case 1 : + { + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateTwoPointsCopy( myObjects[i], myPoint1, myPoint2 ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateTwoPoints( myObjects[i], myPoint1, myPoint2 ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + case 2: + { + if (toCreateCopy) + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateVectorCopy( myObjects[i], myVector ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + else + for (int i = 0; i < myObjects.length(); i++) + { + anObj = GEOM::GEOM_ITransformOperations::_narrow( getOperation() )->TranslateVector( myObjects[i], myVector ); + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + } + res = true; + break; + } + } + + return res; +} + + +//================================================================================= +// function : closeEvent +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::closeEvent( QCloseEvent* e ) +{ + // myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void TransformationGUI_TranslationDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + GroupBoxName->setEnabled(isCreateCopy); +} -- 2.39.2

      Our TUI Scripts provide you with useful examples + of creation of Complex Geometric + Objects.

  • kGq#R&ZE<|#vhpmz;lqMFYryX#hj%;qzp)ZPd9 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/bool3.png b/doc/salome/gui/GEOM/pics/bool3.png new file mode 100755 index 0000000000000000000000000000000000000000..af409a15e4f92d69e4b5ea3925d8b031a75b79f0 GIT binary patch literal 13184 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/box2.png b/doc/salome/gui/GEOM/pics/box2.png new file mode 100755 index 0000000000000000000000000000000000000000..85a737afb6347f3d7445455c6dc39c9ff42f4321 GIT binary patch literal 12087 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 R_-`VJgovzgnV{b1{{``yk0$^C literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/chamfer2.png b/doc/salome/gui/GEOM/pics/chamfer2.png new file mode 100755 index 0000000000000000000000000000000000000000..b2c09870e95c1ffde3dec3c9b9173c33367b9dea GIT binary patch literal 15527 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/chamfer_all.png b/doc/salome/gui/GEOM/pics/chamfer_all.png new file mode 100755 index 0000000000000000000000000000000000000000..c398cb0c57e97e5014a2e2aa5d2938aa5e529e8c GIT binary patch literal 11172 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 a@8Eg|*LOjgY`D|60Ier_8sF4jM*JUMh|`n+ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/chamfer_edge.png b/doc/salome/gui/GEOM/pics/chamfer_edge.png new file mode 100755 index 0000000000000000000000000000000000000000..8ed8fc005926a6edda8b640141caaf8313e87a05 GIT binary patch literal 9146 zcma)icR1T`^mamQHNQ5M(xPHksiH#7wrbRBY^_j4t=cP8iyEaBd$mQ45RIC(SBX_E z(V!?wiA{_U-t_l-|9!9P{Ugce$~n(C=Q-!O@AG_~1XE*!3(SJd007{^9Yfs*)Zb<5 zhr~!j{T{q~kpKXI0e5t@ErRnl>>cCnzeb#;7reMx#Najd+|ncUBC}cfJLV6-#EOr>;8*xz1H)IIXRHxB+aApgoTDlI-cel zA@0Ax&a0EAolQkAjyu_k+4ok4j{Uc8t<3Cg&8p9J`!p7$JUxh{jNF(zbzT11wJf5l zn#A7reV@(K;8#+`sU-;r!$ta7Q?P80=`pMF z^9q-K+Q6=j=6V-M0GFcyrO?lX>Ou^O4a{<1F8Z_7v(eSmVLwNb;ykz7YLA!Q2YOq) zobhTnwIyWw_hHezmki|}IHa~)qE2_SyG_8~nhJ6oseS7>%^uyD)v(vP|Jcjtz0&mb zXDDp=Y6DfWY8pdcUVWsNL!P-s$d0JbK0VzmJXby8^Zy|q$H;1qD#gJpuzH2{CQ+*( z*Rb4jia*r|U`>|bUill7m(IVH#3JbT*^L9KGB-A;z&9wLot*jx)rg$)Q(W>5lffpa z3{U#Z3m3`vqk)BIlrNHMwWBI=2Mx5?cRteUB~;Bf!oR}zuDd+S`39Y)1(()!lc$ZH zo}AkqJ+F=0YxqME5$*%nLhg-flD9spOBy00=q}F>;1^O4c{s+S>P}o%MNgeqvJXGv zm|TR;r_Lj@C?{WfoNTC`x*SoV+a6G!WimY79)|U=Xvp?FZSiCt88p^RvK3jne{wuN zL^*uz_%e>*mK*Xl=pGZ>rDbUQ`vSD^vzjv=qI|w*^p5o&Ch{gKUkgzsV}D9Q9gkw9 zymVX&kwFdQ%i#{b=$9}0MQPFc*%W~d|EJUbnn zbLwX@ATUK+SXq*+rF4cTpwDQ;ljfQtwJ_%zTjvi};9rF#82H!4PpVG%{)*-q4uF{d ziEGHi+>UK;#An}7-BlgG1h^wA5RpQ3e0O&8RbI&nzd)2)#9&&qLaaFfs<;&KB!>8~ zuhNBHlBT#Uj-uOn0qG)=KWi(2Q&yY)KGzDEl2l#Y76DqX%aCa=KCCx7dBWXibL=NR zV5r?ONUD7-AdP}{p+PEan#Xaqd5kUdgzFm00FQ}HpL8$rbnMyu z^@<@Y^OGQxz@gb_uCH4NVYCC35d_R*i2<}0s8h{M_u{L!%8-kU)SIZ8vU#C-QL)@j z@1&BINN`CECuq0jl6{ul21tCkR7nxX}inPOz%Jq01Fvc&>I&t=RLR^%Zdz5;gvv zs@T#s+r}q1TW>P%0%;VrLTTjy4hoP|>hu7IO95*|ntF zxPUPRLN zr?b@n8n|0CHWCRf$Xt)T%Tz21X1sM6TGdEhQN#ttACQFr z!cl7VJmX#X{jT0bH#)8q?8L%*m~ZlN*I)muB=o?UH1}UGtLtqcn|4qzAdCe>Q{>?Q z%C=hDj88zven42J)>%hHIQNcrCZyc#u3L-p3|Iu5uvE^S2=euSz^ZRA0*pLl`~B#| zFJq~l|9NbWJHP=*Dnd6Gqm)aBNy ziK))ES7hAnYy>aAGY~Gw$r*^Pl(a~e0SQqs8y10=W8FPT1P_mMqX3$cNYP$v?d|K1 z+NlE&tsa4KO=j`u4b_aIn~<)vHpwNZJ+L`&nMK6FE^FLDJU zy~t%+trZGe1!@$6viR<}OpIi6di+l#Z4WQvH}Y5(Z_0!7DdkESft*QwAgBTy&Df`5l=)NzKQYK}sa&Bw{2GA%=ytmKs9@NLjil+p;VMFS-jEDj zG)Qj4g(Fv+_&OisB+Ks7vPC)W8(ck4#;&1X8;Y1ydnavi*j2m z+8gELapY8s_Mr?~Aj(fs(cH09*<~%jvG@`?`V=fovDmn%P=0+58u_}TxgwpJGFBk^lfJC_Wx1;o+iPp;1Y-(}N>gGDg}rLR_;i>Fh@q*?N%!6b^wn73|PD3kheKihFjO zsl?C|Yht)X9vTXQrX3r}4&Vw98DJ^V^P0%$9mc|OggpA=p z&&)syS=zexrANj1{P%Vp>XsioNWNENC{!V1PISPx!8VxZbu7D)j0Q&d{t6HN+rRx? zPMoK%R_0X}q*>UE3KHk)0$bTO=7P?x#JVT3P)siJxrXO*ql< z6~8|jY4djfK@I9fOQ-nz)vWgiBp}0@&$*?!pA@$RlE}bq`uW2#EeIq_(U$4@o(8=o ziNYm_OzsO5?EWdL^@E`LZP{{n;`Ny& z7c4p_EKPZiW?Yy>_}Z;`g=6F$mp{y1{U3QRD<(_l`dM4a65M>SIx%7aGd zf@qFVL0tztfu&r)rEk9~#l+WW*26_^TPZ2Oun3OELIbk{nI$(0OI*XPG=f{%go z(2AvoE+^Egc$4z|gwaZTgvSi()P0v8fx2K4&NMn^3PXED*upK7Wma|T5#otg z-yy<9foo+qlncZ?I=4elMyl{1hnz)Iq2}h2rejAsCsZs|6WX&{&dGBpAnq#MYkF9PDX$g?SM#U-itdxY3b?Sb(G>cwSntVFWl&(oN z!NzXRaIl74VnZK_hg)$x5~!Nxd0f#@jKl8hW+=Tz`FUt_y}bh)m^5-jC>D=TlkEM|&~!Ok6I^lwI^5PEtbNAv4h$YQ2ZCukXa zKzPU+VS_QrZI5c4EXmnn*q?NV#Dw|RX13wK)*ghVXutN7#9mzI0hu@Oq&#w?v+-nN zlz#Y8IZF!1rYTgp@7AQ|v>95pGKad+eGhcFytI;oi5$VdY+XRLLCvbcWlfo;One{) zBV|^_=!?Fo6}QneZ*^e3lfYM&4qu{9ukAg|VzMAi3Db21Ek7dK)@BAq*X}}He@yZ_ zz9kC=efo~~({6LKInqKl;F3k`qBsh#&JA{?b3SeC;!0{<}alGz4Mx1aF!mU1RqjnZlEdHb>9v7HyLmJxx7kRu z=o>sc3}WFkK``_fg6wKIw@!p#`IfBfC1SEIY74~n0>N$XeTt{G>m*;<8XsJ5Nj&mmld@n#x8JR1B{8UkTT5Q8wj`O=js9d^8K ze`dFlx0-+i#jH#S!jeSbi{zYTafVf5$Jy>_B9KB1Uv%@QlUj2euC=#zszf7n&Y5o> z#@HFeW57Pz$kFmQ`AUjO+;H=K|y#x&wakpw}fr4>trEd{GPk85jI)Rz@NQ zh*|RFl5o3j7^#_){n^RT zB}yeep)p+*g4#}x=pJ~|PFz<`tgDrct?sbkw_%zj&u#b*OzQaKUe@_9GlF6?zZC8J zH#2;&Pe-k=8!Dqw$19yjlxOxe!0Fjw%RFMzjoX`HziUZI=9l`ev44COAP_D)g=(%b6Z=3iWk4>(< zM5xz$nhMniShU%*>taWkSA^|sD3e> zyQypN4~KyrHapmKo^OPVfUZl7Mhar7rVU6Pq_k!oIHBH@cf*|E$u4*OOoUu1LoRa{ ztwPn+C|b|2T2-PeX1~j+Xl$4sUEXR`7b7m28q-*M15Msj$AH^gs&f-sAP#MTpO(iT zLLkUG<4P-Tut~}az8XZs(1k`0sPP}Q1X?2xOzVABE>H7HU;!^nKm#U?Bg{jD8GZP> zDIaLnxQ#!w%ErJ+%x@*h$T>kZ&E|d?cU93p6kkN}C)Niiue0K3^OFmPt2n>3if8a3 zoh(#_9>IcH?)Ore*%&kKeT4M%g09LvW}%=@o?9c;ju*skfDNUr0gKEs@`K=hzEHZ( znVaGOF~&kh4s-#P9#s{g@43`|R!h@!jUXkrQCmD{kumC`GZ$xh%dchay~+b(>(Ak* zG4zoutN*9}u*NIz!azMK0Z|%AS-Z+ryssP>DD%c&zP3PsDV{4UDNUZ^TfFGD79PfiObgo+d6=Y@AsI z-E`1iL1MW#6Hyy!_7|QXHS?|a0JMVVKDI^a&#u!&>Kb8waQQM?MN#ue18y&tTT;gb zTdGv7IRwWZf&n#F?L$nzrrOExa{Nk1GEq6W;u?D07A9+?%K!R4P!ij3{uo(?!>!T8 zHlb@~ydM3!hibcw_q!uEq2k1h?7K?jA|!d8Pq#5h&?`o41Z{q*US|tgjb^D;8I0#< zD$S~>biEN&af{q2nuqI~R=ne)I5c>>iRPi43hXM2`C|^N|N1G6rZAx4|qZk*niq>jqt_J*N^0@nGOa^YBjOgRN znt&d%V{rKlK#Cs=ldz@V!Oc+4nBLl$zfE7Up)9ea!U!0P_V?cwD&Om&Y4%}3Dz>dM z04aH)_Cj7~Js?`-H={|Wq`mkcXi=C$;?{iS4R*owhu81HGW%WKA1ADnEd?DK;F5O8 z02;pZg_tgi1Lz4{SvgL|p;b>h_&P0uSx->yv_DTJ7x$JfydBVKH25dmB`d+Qm6^@A}ntBG1 zGS)=^c_99d*NkAUXNTGiXKLLRs;CRocnNH1>5Cx}mUk!;6Q8NTC!pfx$f9FM~)j0=78(?V$2VY8xN?>W&?YFS71|nd4?M;X z7jo0VioDfTIZ*<{o(1%cFh48~y$3zV9C-z34yf>PyO0Y@&vEG5&?X~R(N?*gY*%kX%l{F0Uj;Ddvnb2 zcHsqaPZoi2F+>D@gHG4tYpY??H&$vitAB3YIa;V=-~+gr|M(mL0vkDZpZqn_113@( zIo1AV-nMY#u?wL(^km9|gnoVN<-fRo63kcT}Pyb~D^T@@i1UH{1f91PkaL06AomHa_ z&^^wF%kBkW<{0Pv3rY00fSwWp33z7RaMS`n-nIGQ^VsL^TB z^H)o={GH9(m=W=mz4t(z%J4{fJ+rmKJe4=onU1$hGtERTj^8Kn7TB2LBMKE$QdCPZTm%^hUbB<~jN*3D)2fCwc!OrJVVC3rAVz0lbUKUc zr;l`^nVoj@jYwCNY#vw7`K&Lh?z97MU;=Qg7V&xSptWJdgrN3X52w4F8nmgrKqbJ$ zc9~?vERVdW*emc&@A4U3CkQ!H7jScT#AF zl=Pq&`hrQ08^^Qr54ZT+XfA8%{wn$;65nJBfq#`stJR((cTZ#{g zB_IxdF_b$TNC3KSKK$sV$@vNcW{ZYEZ}Ded%}jpGlB;~YS=b)@VSnyt%Z}|)q-b=V zn?W_C@i^CZ<%;)NU_2VM9+0t`?xDB3Li zc>Feqlp+T}&OaWu9$$t-H3G!HsA#eKI_-1mSBM-=6|4(TjxBk)`U;N^`un`*hSJ0FJJ~+#2|6^1U7*x|hXSBEljom<} zd36TGe-;=?i(ud0abhbN?Ti>@P^H#F&wf|!vENa%@jUEQ53XEutiNhuOz0z|B5box z=nt3a*NFEua=w1J6|4z5{O#WfbgaI4uj&O@!n4tJo9(`gqnR??HaG>LZjxEp`b578V5*Sm1Znu@}oso{X$GLFp+)?oL( zXgb2PeFc@1PTu`mHi*2@fx<#|GAsrR2HSzZ(SDFv|m-L37Ffvr25>5RUyp% z@Z`L~W_9bQw1we6w6TJH2_@c|mnaa7m~i9Ey$;|+QAYSG7ag)ud^`^h-bQKs`oFF& z*X4bM31bOvE=r#;54S(r7dBdEwlp8qI9ETpYuBKj$dYS2K}oN={o)7aMUxVhPmk3< z-7N8RiI~528mLW?AX^NRMn~Qjk*p7f?q6$TkWoUn{tPOORu&j>+mOh~Rh6*nntlzpO@j4_A1n2G#zmCbZ> z6CYB6n*$kF_j;tdy`HbYX1$y{iBDACdjDRsNX7gAVM|{3Tqu~4g+w}kt}$|ZzPL6K zvvCz(w;!;Rw&)puw}r}d`7mD0pG}9SMUyD*fVm$nQlZ%ZIFoL<1$_NFSQMy zw#ZM25oBig1veXyLls`ps`;_h0sLnHm_;!**Osj@zF51r67t|~Nw98^fd71nZ^ZlYjwM2T) z;cbvUu3^4G?_N2&yfM}MhyO)%HD{eSktz98nt^Ne12q7dO*zrQ!&IF<37{7fNQ(n0?CJcglhaasyTJJt}5Ee?Xeb#>RQo z{m-mPYn5o;pD_9izJJn3TsKt5kUDuv0K;K~gfwg!A|tZfMgJWvo;XdE&ad`E=j11J=sZ_v4la{y;vH_iQ(1 zuzvUbbzHM9UcquRQ^Z1Yn``?4Eb6Gd`*J1X){QWM6gIbtwuPtvyQu9zGvY(9UFXl%osTp9?`3duv&}#1 zbKlT6#;naAu_-&nSk`CXXw#XHO2$%|*|ZYvmxK8(@`UG;L!mhW;Su$3uWkC}R~b7OI`z&#Df z;3e5FCN^w_2e0X`dNc>RUrTm(P!)$LO2heXZ2d%w^a?dn2j@+E3aW~TRU=gqdo zG9CSNEtsCwabBlT134=0fI(tHI4nnc40Fn-ZLhe>2|xM)>HfynF*`!hQr9 zzZ7}(u0kEb(lJn@!%ICOP&CSARaejD+$ceCnM-w#^h+ojrzbm4x%||Alyo(>$4MZN zwSd*=Klo#Qb@AWp2wtOW|NEGPkS>kK-bu=5Rd>Q&73%&uu>GvdERbU@)7i}}uFFh? zVJ+R+&E=%iEby}G4LhhXd@$C(TN(UgRz41!YWA|hI>TrEaD=~@`ns#CU#>d^Lz$PF zR(SAh`xEMA+pubf0BxM2PIl(By6QOK|MQ~C|4Z!@TJt8<(NbkNmwG1$a7WKrxB9kI G%>Mz9tj1&j literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/chamfer_faces.png b/doc/salome/gui/GEOM/pics/chamfer_faces.png new file mode 100755 index 0000000000000000000000000000000000000000..961cf0386c27a0258feb26e05c7c43f885aef7dd GIT binary patch literal 10302 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/circle1.png b/doc/salome/gui/GEOM/pics/circle1.png new file mode 100755 index 0000000000000000000000000000000000000000..840a259735c2a8eaf844bcd62979f2dc5eaedee4 GIT binary patch literal 12982 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 ZEmVwBQ}($z!QZ1ml;qXq3ZIw;{vVfrG>QNK literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/circle2.png b/doc/salome/gui/GEOM/pics/circle2.png new file mode 100755 index 0000000000000000000000000000000000000000..7500eaf2c907f0c50c8dcfa91e8d95c124740952 GIT binary patch literal 12343 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/colorsn.png b/doc/salome/gui/GEOM/pics/colorsn.png new file mode 100755 index 0000000000000000000000000000000000000000..f0c440147a1882cad3a24857712b80770d4e7bb2 GIT binary patch literal 23078 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 S6iyw^pa64Iv`G!pE&gBX<_tLi literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/compoundsn.png b/doc/salome/gui/GEOM/pics/compoundsn.png new file mode 100755 index 0000000000000000000000000000000000000000..33e1012edfc52e977657dc3ea0a8f2da988bb778 GIT binary patch literal 1653 zcmb7Fdo&Y#7@i7I@}bh)P90{mB2+5Z&%K%3){5kk+p=Pn&O$ClQJPCOZINpxge_r2 zYhM|&G#sR|mX?L)(lDgCe5zH`3sul{)7-}Aob{NDFG&mYg5?(ONSqO7G1002~A zN1Twdw@nt*jq7B2LySor0H9zEbFxRp7EJN$qKA&?uxI8~e#-%NI+Be4zC|Pd5t~2Go>-KQy?K8!SYh9n23kzf_EGjyeJXy9#^%qBGFb3}O57RzH65ZrqvW!r0 zmHsc*1)-Ruzr;u{_xLH!1yPgIN0J0|j-@mYTeQXGABL z0G93u{m|_sCLJp{enVBvR0HDncjFE6skK&ziObh$q_)VRh|F3FNrU47=S8ka=>E$s z(cSOvHGjSdsS=kPFNJJiQn`a)?I^x+!$ZuV zHv}Uv-F+cDF(-_Tpk*WFnHj>#S}cF>4se;R(<_Q7DgwBKU_C=5*HE#X9Y<{HP{<*Z zONrq0jPDvg$PRg`bW@VK=$OPE8hp-34mfWdjypOf#`@s@g7kZ(iPI>h272=2&4Zhl z2hS<=0o37ct!5rW4EihGt}VcZ5v$udNnw3YJeNyhhDcp<0-* zBYFn~w?l9I$mgC|oUi`$n9?0?}IFtGtYO z-PRF9Z&XF22}0UkI=W7nYI>9~VL`fHEJnq8v3Jj!-aCWF%@Ov}@QD^Z$4?Fr-mF#? zB^NKf%c&zgt-sPf-4pO_x$DsVzAgQ(Hns&E0@Q<6n`Y-~b>2&Nt<^T`;aig`Fvm+` z3NNCpk8>w2G{aw{LKqKky;44dGssFq^C*T=nt^HZS64LlC0U)$Cq=ZwE)k4D=dHc z-2Du3X4dkw&=i@vLa_kurCqED{2YZH?dM2Vm*&MxUz381_3R1}K8sgymC!x@EsbCK z)#h-MNMFQe4#!COquA+%X#uaN?Of2P{~ss#DJ(rtNl>TiX=z>q@9Q#C(JYFL-_ze2 zYABz6xf+%oZ=vB6E;OY2O+Li1L}MXq?yEN|u#m_z@ULJnBwn%(jVo)uD^Ew#c zI?btA9WSkG-)ml`{>Mg9xAM5zR@FaDwQA=BwmRreJJvmSzu)?xSk5sJ=<$3`ksfFp z)c8S$<|GpN}xPbaFw Hsg%C~37R2G literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/cone1.png b/doc/salome/gui/GEOM/pics/cone1.png new file mode 100755 index 0000000000000000000000000000000000000000..f5a95922addd087c2a81a1cbddfce7f2c021e664 GIT binary patch literal 14640 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�CoEkC1n&RX9KSpdw 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 TI|h7>2qG(`C|M+7@aaDQHVLYo literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/cones.png b/doc/salome/gui/GEOM/pics/cones.png new file mode 100755 index 0000000000000000000000000000000000000000..4c8108ce150bc09b0d564a0e27914fa27255be14 GIT binary patch literal 10676 zcmch7cTiK^yKZPAigXbKLK8s{rPmOu(xeH3^rl3l6I$pXQl)*MNJ|iqDor{_QAz*_ zq4(ZGZy}UWa`XNEx&Pcdb7sz*Gqd;1o_E$-Z(D1xcRlNg(brYKbL;*s003}DQ$y_~ z06@Y-eDB{RB}%MW6s-UNE`X+*vXNibZnkCg15D!r0X!N}sKVN$94VX<>aV%D<4z4( zr5oJRV)LqQ)s&cYm%zyQJyhwb{_`o{(zfv)_kMZ!gTLC9&m(!q!_R(@iHbE=xkZ?m zSSb$ut9{P#tg4}$hNxyv#7YXX$&T_f$pmaLZoTD%z|(G4v)dBcp_ z#C=`7QYx!bHvga0NQR7K1A*$WSpJ7$k5KuvD(QEOKw+7B!rvm~5EbUcS1NRclxa^E6|%yyVzq}Td5n{vTS0ao5_&c?iMx_KjAsg*(!Rp|Ki^8 zym<-V+s9BL`0wubu}tl#2~RRQI+wqdAN|(4OB(|*2RMT;o@XTq`J?H2htyKWEghgM ze2W)%%i;Sca}RxhEE2zTsRR>h{H`D=VDY!HU+cd@8mg>v&c>Vygqo1~%h=KIDciSaNfaQp6EeiGMTUn*L_C0p;au$>u8 z$(df<@gEDqh>d8TTC!L*wP(mWtl7Y`h#Ka1gby{G*N$%9HgGod2A&QSK1Hsyyf)ZU zH2k9mic06iJktLZ_x?>}D3;QPX<`+mXWg2{6Avo+v9;Ch)QC?M<6kyy9MP+?8j6`q z=p}cjhGJ{k0VG0c>VR9(7Cu3b`Jr9`DGDnoJ@Nc#eU$~=~1>b=X&@|LQu1u z0~=$9QJr2}@IHc2eT=wfng}^Tv7ezs@J9-$HVz7DgqhfPWzy8jTgAJ)zo*rG`2(`V z_dyuNP2aXpr3>393o{AJDM8s$E37+9>z^+X*IrMbH4!e@kYSI8v54ak?Ae&6^#|E7 zNyF1Gc%R)Bs=txxE{9o!{Dmtq`t+=#Num2IjK$w0{cbE?)k;4{O*_q!rsgOO?dswg z`ssHBgSDv?s*XF|>Vw&yzoRNpm;JhF%N9WMmP=nNlEHs{T0tIP5?}EP{mGjl?Q{9* zzC>%t8g3}DHI2*xxwwufJ!dDKhrwU_FZ-Iel?Dv-shg*OyQ5is;CpGxoqZ%qsa!90 zNe%6G;|*#NF27RTugkbq=Z=FPbMYCns5pL6+zmN%Gg74e%c!k)kl>YBe82G3*H;+R zMrf_-jTjs|&ncc(z02yiy}0=lyES%-UzH0wb?1;_7-izARoUVMn4XgCR>F-WELb-S`E-QiSqpM059S2p(9zdK1(7PhppI$f~(WDQ1 ziIsBm(6#5uv}Xl;Yvja)G2xEa0@|89GcFj2i)b7-B4A71&{|o2`-HPv`$h@kVx)*Q zCNZ!;_)oF8{j%wGjb4QA^BWJ*_fzddU7tU59F7nW1qdt1A7G&;n`QI-c__lkcp~&c zO^eeR;XWClyFIl)q%-})uI1%(N;i9(sZS&QkHxf?srnx2!09i@=#wVIU0WXOY@!iGBY~sy}_HX7DGqAjKAPFSJY}^o4D-*hqG|kbg~ol>?~yu<#39l`5Tq zoCoZa%&#%!qO~teK6%Q^ovM+{{5JXFBdyVebe^>r*^h1qw{5e3pV?o-Sh39EH4`E} ziM}BS1G4%yXq$5)ZcVybH$!pV*2nzr=>?%FIjm^sXr%0?ZxJuUQ8ynbIkrS2oyVaT zH644lS{J%~?R}5>{#-AR|H;#DFSi;*4e!pmRBoMRDpR~RD9D`ZiRy8nd2N5`&!3k) z$7pgcYmjl+AL?hkcPtyZvIZN8i2al$$H#Hv^zadhJSU?KZWjArr?CUclBS@cHE%svKV#qKd6%=ba& zh?|sJ{;o#?iA1mKIqzD8Q@8lovMfQ9)0!DhW=sPJSX@0K2TyCNX5R=MW0AiRpc`iA z;b`E;vor7RJxl#5bW3-&ar-(0wWM{w{dc^-hH!Z?V`)m@deOc{6bAWJr1fCIgOc;S=TJy z&PJ|NsnoR(vtzj$P`jrAwyQTj{9{eatLWKsoCOmXnR_x2GL0DO+r0cNNt;&8h<3LR zx-y@0@;#ea-~I;TA-xQgjDA-r0k}K#H6H8Cy-o#_D&JLuy^r$(W@@g?a@g$LjE_~w zgsT2gr!dS_?VNK3A8k5Fc&68975RKIj5kA(q{|&L2{c(p?pi@{`fR(Qm}R^!`@LOv zsmE`MNVW~Q*ID;L92L^6*!t+Du4t>ae$nW%R&be9m5rwaj zIBlO-45YHk-(^>VZcG(+X&*4jpw{Ngg@f~ojb=fx_OgA^@~#4@9CaZ^7mb_0I}+ zhBW^*K z0O5}q(0$p#RrOm6Q4r?I5}F?vqa*U)(B*gPC)MYoY$krpZ6_=dDVnEF7zBjg4fx2BD7$bFG!hRBSJ^0pL#ivV{OVJr5oOUZfSPFHRa?0smyzF} z9-R}@zZtY@>!IRqb->yrAY{F%)*&)&97px+^zG5IX*PraQVa+)bEwRj z?S(C%_u8?omPALqcL+x$+x7@!p$;2k@IzvP`gS-J_LIVv67(khIOwuvq^83z=Ax|I z(A850tfwRz=&FI0=IP~mDK@P8z@3k%#75q#Y)=u5_8`~!g(g#(bzNp~Rf?(l@*ej9 zD{%9@TU(n~7$M-e%y;GyF(6l&CY~W2u2#LYS6rA#O}WHlcA!(^XL;3A{;_qAq=PIi zTFKBz&`eMk<%#u}9k4ByCqy^u9kTr*@juScB`4CSlg&K6H6Xp{9#Bpzly7={xiyS1 zod1TtuJc{D#vraLhWgf$&y|C5$&7Lejv)^p!WU)hOs2iWrvv${L!dS1S_7wU^3IG{ znn2ojOZchi+;@flK(-w$r_AZ_#i}Nfj7X5{TFLG(rgq9)Kn;A`fayUkDroXDW>t(5 zj5W?#q~GY+#<-6FoUD(rhNIj(Vx3p|thbm7fxq#DO}Fc~^c@komqfkge>DwWPMM+T z^bx*`kY6z%lC3M}F_8Ip#I%XueS0{?%#!hD*%#5oA76}{?v%{AwkJUUxITB9c&>=I z8c27_{c;UuDz2`5TJFR7%`lNm$AUUNG)P`&Fd$+)WMLuD2*)VO`fqJSyYOM9MDDVA zmgr#+cD|xKYdtT8wa(u~eSoD5Gvz0haGDi4AKv{nD!Xvp{Em`;2Dli1V8=$K{&WC$kjmC>6{xvr7FFlukA&gn)V?P}>O!i!aG`MA{Vv2@*!k;0%!#(3Q9BwDs9QNCF6$>id=#ck)+i#d7azmF}i4^{7 zD*!VPJTaiZcCuME$$E|{#?_74!{56}hWiH%#IN?CkRXp$GV(S3aGrj)s7Jg6*#YBF zVm2ARv6VMAN4`;qyPq>81inzQ6axr{%o7ftzEVUAz)LU>-qG0z_x_AK8fnF<8hcsQ-9Cr)E7;2b<3 zEC+@-Py5ABvRt35ZP0nZbENiks3>~8jUGgb<%_haZ#;PH=4qW!tg)p)39vZ+C#7_? z{h*H=ERBL=muAk7O7pZ_q7(|JRqwPJhgntuq#i0~IhR|%@E6@8}C{vt40{Z{q~o9uLUCW|t7PqNBP~=l3ij(AMZ@lrMrUapgb`4V;R8*%-4c%X8l!ZLY zN!Ye6tyXl z+*kGE#u#Dheqyk#+p-s$g3SWuqE*&Wil{K;cb|O!R7K=cH(nl{eFE?JEYUWfZOzGp zh9*oMRe1eCq?9>%)JK)M@^5(Q))3em{Ve#yuvx(Occq_P2t!xxth@D`ucef-LQ#CZ=pil6lha9x={>Kcl2 zTb23(bz+Hjby~nWD56ey!eV&?RIY67aa&N!1gJBTYpOYBcUa>W_RLINQ1s1vaRn|F zX)?Y7RTk$Tz%gY#X>}p^(s$ewl3{2=$qER0Rl8%Ew5-c6Z!$W!X*gKMi80@Q3J>z} zJDD;__3(kO*aJ6ZgWGyx??n?gT(s}K%oSKayqW`_a$U?0w8;2hp8p=#yBBihO(u%#G8 zMT`Ba4)$-T3f@41uGn8?|6Aa|)=JCm`#0Rrzw_1 z1sxVrmsNKAvyx{I`kYvewqj=;_hqv`1-K+X1W#8fgn>M_eVSK~DDwykDx}p;4RZb7 z!eIH-vyO7^!8+0ILG8@bhhk{AaQ0Uv876K=_Wqp;GPqX9Ye^G4Rj#*^lfr2I!Zrz@ ze+r_0`JEzm34Kq8YKm5_4k1@U|9f9uRIjYwY+(0rA>g9ra;N&6SznO9yXEyM&z&8$i z-M2N>aZC~9*PGAzqj>4j2gCk^84!f8eCrJO2KXv&wx)QEs)5qTU)P)Cef`zWheZ(N z`XPwY^&rklc)i#}V`aW>`o7$zN|Q@n(8GFuFySPi@e^e(e7my5yyF(7(x{8DxLXf3 zb+kJ%As;dcr`)*eOUH!)u0ESkUCLipRjAK1u!z}o`k!N-Z;hLWvt#^w4V&RD^1Naq zqao$;ms2M(88Cl|foe*6%9({I1gBX#pP4md)TQ{m9lE$&m1E-h`IF#NOq{?FYB={X zGvWOXbkQBdHa1U+D0@DAaY}Z64WA_JU=&U`W$O#U^-SM;vk?*lSQ5x;mosPZx`m%& zdepD9YR~A(^WjaL@7~pVA2Fv)za}PUV=O6oykYO)iJ*TJy^r->1G{Z}_Q^QsY~YHck*O zIx`7@WUq2wXC!WnN)v+5{ytln`SJ%`s%~sw3Jo}8y=C``juZNK_I}J=8k^=aRg0Qk zf1d^j6BXWRZYjhC_SE{iW}$b-qS)2$Wqvn@ET2Uc{e-wz!aW$gc?Hv^Yb%du00(YY zJ$gaH17-^seI10EPqgZb(M<}bQJgV04Y(r$L#l(vp)&P1dRXO$z6yWOz^EDA+JZ^# zD_SfSAJ<8uS|0*76)*W`Eq(g90U>9c)|l#ppc{7JM8zY0j7OE^U4cME*zUNde(}3+ z%f2d>FlM7&@riB1H~C-3?J9){`k@zXV**s~wi#GkTf=Wy? z=VN$4Fw1<(B=v&;H@HERyGpEL)Kj=!#Q~1}B9H_@b#t3Ut(L=djJw$^ew#lu{@vUs zgP!?tGez@}CW`MBWBN7m0k06Z1P6fXa zyNw^jC+fz%Z1OSsc0C+z``#s1Xb}fhmg+9iMDsu)xdm6|=YNS1nRIXxcA6oTKAZZA zJqD}K>=23fFY2!(`BrC$W;A*)U)%p$BE00d`q|ZJZoNwuRz?HZw&Q}m_ybis;Utz0 zA(1MzGfGA^vyVqNE*cV61D*$!x2}|EPQWj=ewQW*SsN)JCyH+#Z%ZGo#pNLpoN5yz z__`J?p1h7GEqj7!6>@pD+h#2)k61+SMPoE@5ohQnB*Xw_0;n#=T`p@MfEn$aI-CB&q|u**nG$=CP0y%hEY*f*@rFvjZJPp+j0-3 z!8(9W$O7x^VxIkr6Qj86EAHMZZ{*e!92~U+na69=3=($^8S@PXCHgGII2aFj{ZKEh z65TuFAL6ljPJ)c6FMsNf-hV^5VLkdCZjWMqn!B!!e0FM*uF%`9e|1yj^Ev33+lwFtvU|M|16&u>6fn?%(}%MR zys${BM5m1R@dhokQtyc`^#y;T;J}{DN(Y4dBSiD*@jEc(wvq-q*4Xl zSQbZv+16$kAzx!%$-=WSE20m#G!7IfgX=c6rMt)X(-ilcTb(n_s}F;2aQW$KEjMv{ z-OVAV_YaXQLU`AF9xFS05oh_K)8Xcl|D(G27L{2`(X?ymg8} z&$W!8R=#Fai<7()Y;_&_$+LeQUS{`6In9QeyXv%?IM8`10;pM6CIl~M%zYzmLRs`_ zT#MH85y&jdJF-r@jKek4puEDF! zo~}>o4o95|g6r5XzBIyLu$1bXYZeqG-biDw&opour!_L&wUy1jmao9IJ2R* z9tp%b1onL19`1CgYWxX-{!=*-)uSJthHy-QB0LkgW+II`$xhs;Cgs_Ypu+c9nwwJc zYX7#+7 z2-I!t>0I#LN%wqU{FjybY1t`aTMNCkvYDh%m#`aDmpzv|V2(Z_tJ|IpDB!Ti5X9<5 z6HBq}Z|U9IAn2Nx^y|U&0jYd1>G(G2S}x0ABj}~LLf;_h6_VG4jH+?7CuDi({!{>L z4!XrEbx<^SRZDkHtGIuED3;UU<8dn%HYkEXDs1b8Y4KLNxH@yyy>YK0r@$3 z-oWcGNy0__+#K7WBP=xB*Q>&~BlVB@tQ!@%6=Q%DaYGlI4uVgV-i)#H^X4 ze8C*QIl&g=yUnP9`FE-N)98Bu*_Iys`bT*bvgl-SO;z?&g`*pB@R>8;Vr_fyFTo@D z5~I;M(%gF9pLu#;{RF4WZjXtT#n4|l54+4tH97S)gv&owg_kj4{V*}hoSg{T>j)8q zQK#Z1@YJ0-JA&nF+Cm&0DKq)H1#h9dNA+y( zMYoOA>F$b9h*7S1XpXU=K=q-W5bNA%15nKC6TMHi(gxT8Bq zJ&nXQ4f8((rNR+aBTTzod;BaTs&{-RQm@G0?6=OncO&_?ra*(n2QwKR{yaMkGO`0! zS;s-U@rhaHg1m^?^AE=eJbh<6*=ntGShf%!Qv0S8!)r8&@((@zvfJuIG+Bh6`J0=d zI&^47Wy|_rV4T9#&^alU)_7bPJ}mbAoCR|x|4fp1I81BF+az= z2{8(V80rh5p#y)<%Z=2T~`YzTdP%@9sv^IBI)v~wx zn~!w_x@7FC@JmJM>fT~2-*lS7EwKdBlIs=Ma&xKPd;oyT?O!fH-NTjBZKyUkz92}Q zB9PK7kbE8{2$O0pc}hrg!C3x=IwwA&R#PO=#~!@@J{c4|dY9hXd|UR}ag)6DdCkrG zx=b|tB)+)fGM_5;$QE<1L#5t&Y(%tbnk}!Jnyr`mRTjkQ$L^$jki|?`oX$49vJY!7Z$Wo`~k@+1~^S>k%I9TO?{0{2b^TIu65I{Dcik@RYrskdkt zBD2jZrRc!es$;p$AB`_|nyM?RH(Qn3J$DVNJZoTUOlG0?T9s4Y>z6SrU7&YJUU_|7 zc{;v+)McO=iCT-h+{nH8>fpT#5;Ij&%c1DNb`LuX={G**G%r288oh3$BH}cN1yX{< z`EV%aODypT5a%*hRvwvl?H8Zeix2p^w~Rw5KzD)OC5I2J5k{+2f_ei^J=LEnLbFWz zi@jM!?ctTow?1NVdgh`Yt1IF0$#Q( zYv2|Za#DmvbbZI;N9SSPU7#ZW0jrI)IH-=Rv#QZ4Cu2h6xC<8uxvzb7e{u1=D4|sH zBT(O$FK?RW&37TWVDLaJwugp{727$Xm{sxV@XhLqKaI+|3-~96j4sCX*LC$gPUn1- zOgc82h*eITqhJ{qQzb1F9&R&X*_3hmLu~Qli{Z@XjPK}?9tqaA2Fp#CXSLbnoT>2V?CO_Y?W;eoUROF) zuvTp}&86rW)FRm1Xy-1pfL-Z&FoB~rqa)rRY&iw-SPI4R@p2|^jPy?|Yd0Er7Y)RT zYi28s{;c^-G-x&s9AZ zS89^iWhxeEt?uyJuu)9$+T=eBFdy61FVm(TmeuAFceQOMLNO+S9BUs%|K3x_N=K!p z=lij=uFy!`@C*+0Hven-v4=ZP0PTa|Kg<0xk}_$MTU)a7*{f3q*~MbF5PgQ)|9d|g zbPau)K)jiCw+CF;EPXd1-iQfumV+N6TY{PRt05l!jJ}?oEiS>XiOq&z-CM=F&HaOu zp5$Xo*kAZe8b=|4MC7IE-VcJ8z%0dzeD1FByVupZkMECPC9O!8G+0E3N1B^Qn*?HT zcEp>L;8%a956^H)olQDEgq>aH1O+=K zOY)uesl4vZIq8fbeRsg#UjAulBMIagaOt<-3GP0aNO`5kN`m?DXZ|0js4iEN8pLFo`1qZy_3!uynAE^KCAl@3I6aLO;xRhM1tmBE~}RVjl=`j zNFN3vN=hfJ$NK8n_6f&J$M5kEq(or;L|AAG)D zf-r^5cZ$;_d`6bFSa+J0M> zjUo0W+LjV$HmI7rEIU+0p+HUKYzY?;nOhY4x8Hw^Ri`S70N%Wt_>yQok+GI1K^%zA z2-Np_H2g%pD{m*tY!F=JmwJ)MJlccM!2?oRb57TrJ4~Kb-qv&l*Lo3IY>cw`j!N0; zFu4;oQ9qGt#vk;KQK>5rBw{7}A12JVh!>8!Il*3&1t5{sL1Nsc z;d1s`AIN_o7-fPD4+UsHJwolGgQFNQ*Sl@1R6cOVBF?*sM~gD`jX1@S?bE4`x~aiL z^T?`ChAj7`hGBk$)eWMZHMVPcWw96uJQ0cexb*$DCj_p4C?ITlv9U+A!UR0sR6*!R zIJ4-y5{l|3@;?0Ta+7GeU;F!Qs_d7^UZxlOrFI}ELI$2Fa9bn9srXXBfVVVD17v^> vKEOr`ZqFiNb`(Y=yk&^!|2L>_mm!<%7HqB|ni51dCP4FiXK|)GOMCw66X;HdckPzusNhzsKmxMHkG;BgpV$^&w0;%@4e?60~mwNT5GN~*PQ?VuLydpD1(dr7#jkC;L5(1dT>PaT`;=45@x?6j@ZE3kiliHBWO2o*fBqn@ zo`IK@$P||D&E(bLhe6)bVk@u%PI-6g4@-wL(aD6X7N%Z3^^NLlw$30BhsD;*U|%>~ zO02A`Jd=}_{>p#Djts$e?u2IPW6}DF*}fm1;&_I45=@l5)SR(pn=1`7f8^+NFGYpI zSBzykNw49a+iAk5M@+f7#p-;DY-!HxT@0ZFdf)X67aZNtM6;X&Ij69ArZ||`9=Pta z;l2I6EVf^qaXhIU{W$Lo6Q0bVEx^l9XN)NAoxbhaGJhcLi((NoB4U85i1}eSx2RWWQyt6Yee==U&v{YDshmy!mAA92yTH0c=;uk|tnVA@wl8Iw0 zR4Z~MdNCdw#ic)+t9JrpN3G*M!;M3|dOU%`B<Q%C!%zrQOERw3Ms}TOB_R$GD4VF7J^m@9+5R zX^(evb=qq73M>>j+$TM4`v(Das_0;f&{VZO<01pm?8o%YxP_nDZC}d&j95;M_w<s4svKRDj|EkJH_>tVwLPfr^aQ0^gI#86d@@TuRR!#F9n^R(kE4x-~YdF-E` z8JvEt2D^A3kY4xEfuGV}rg9`-hZwzw1`ekz^Hvc)$2Q*e>BkP#_Rku zPhs_y$*7da^{(vpAUH0cMNz)MlVc5Zejbb!05fzo< z$B%#E$;^tZVff<3GNDY zm3Qd0FnW_oDIqoW;82E4vASjw3&nwHoc8uJAC$D3j#ZJX-$x01wyFd&4SV8edy`Gx z9tH<0?eBX&Qu#XUKXgp%!QyS!F`t$e(9ru6r;|1C>*9it?W)l9_vV8>4_l$>2G=k1 za|ePJ^N*Cy;_h!)1U08kd_l#iZ~5N1yRg7+9NK73qY<$qqvfC6WrH^DNWC7WR-53U z@EB65HxVK9i*Ux{*adeyf47m1x~WWSuo!{hf+1@=IpWhbPxAxN-lY7>gvZ;nHKuYg zb9UbzL42>Eoo2s3IMrai+;X|B-`x>enbj&Xkz&wL94I(;?GKh$&+j&TKd+gdAuotr z<377p9nSQ8n4Y1vl!1wZ-@0lCCi9D8Rx6kl>*3=m3ypm_;^{#@f)vQ8J)As_;grmYib_9yC>*SJ|&gy}5t%nj*UANF!yb5qU(Np7He?6j|ziGo{mZF1Pe{ zkKvYcU2LvI>0{4DY4v^sVzPJ}a%^zz=jBybHBh5Gi@2JOd_>lLHK=d;wnKh^BC&0W z&roq7p{Z+nE^BSY&2x3L))_iwP>sCp)J#3bHDse`_qi;+Tu!aDQ6Id8px{OY53(<4 z%gq?91gfxfMsa%yikG9yeKTxqMzn&CxeA5XsksGG-sh2DJnquGJY^NEm%afHvKS|egwpoMafZaZ?D)_eB_PrdR_MeY7=l?&YxD&Lq#7_aObrOo{(ann!e<D?iB^TeT5G4^cIrltAY)ui z!SM8n?HB(3i`h08jkRGhdisW~;OJ>6lUv6;lG*{=S@mLhMz4;`3lrj6-_Tw{LDbys zT`Eu)lg+47$hBPAd$n)a@e3KSl}9_LDy`OSs+tUiGLKtM1sG5*Os$h1cI6_Pi96Fg zXRECpup>lnd6k3aZoW`O1f+(m+T5tMPBn_efgWblPNMOiS)}Eq7gcvx5~+>N`eWB~ z*^k5JbCD`x%c@yV1mDeV)Rf1$AeQUvE{1z&&S#t^p|+AIPg;hZDlgU%v8T?0*Y0IL zID@i_&PGfU@7(MTUh{F0G+xDlF8b4{aD#u}el%N|*bjdRR(8+xwtVkM{9bFJzvI=} zW)Rqwi#Ejra`}NPdw=+?mdXtO0jGD3% z;94Pt1teA@8EeY--!i!Zyft) zJ3Z6<^Mf^++H5MTm3n`qf0UW|6Q+IllBAHqGYqv|V`}$XiWHYU7hSmrk;+4Tt|yf8 zrU|zEv+gx}i~tW#mK5$G>UJxpAGyw%)wFjUt#{5fKZ?=JlBY#wJuixhY~*@4T`zEn zjy`E&9vB!1S%?jA;;z z+Y5WS8wo6aSd7+)uGHin?Pr^}y+=<+Cvn4deKxWeAD#)Pk~=QRVf*uCfFL}5V>8n6 z<%btHkPDYx;&&Yl;q^-d^oV(xA@YMNN(X9=@IWewXM6{=XGel3A7+OF+CMViM#lf_ z4U(<#$w;DNs6)`CyG2+#%(}AvxQ;7Vy-oB@$CnsN3Y4vZ4cDoikQb-v>v*oUH8lR% zP{^iY6dJKUtgJMfKrUtTD;mvweulVIQB{*tCLSo!4bH70i0GA`SrBE?*aF8nGu{x#bC&AI?Q*Xm?36>K&V`=FP>~^ye1|@=qBV5lS7Whm`33vvDDcg&b=~y|!+lf`?n`!rDn>ze^}aYS$D_ z0Az{K!d*}H91P@ku|K7PV{;Ql335*=5Vk0(sU3yD$tQVY%Wms8hBEHcGs-=C&U$Eo zx$nSVJZ1Sr#1jTkJ^>L?E4V>%c?TZh>yIM)Ua`{)-jBUIGv2+`RWP?>`Gi(yOh!Vg ztf?8;yDF|stjk6=Ha2#5vP1wLAth0NAR(PLOYMsn1-lPznx8H*@MjET3*3)T{TBVG zKkc@@=%fPjR#{mLEF8Q5-^9enq0)5EpFh{NX-40`WdP68*}H!$YWr!#>E3y)-X43c zQtI4>13wcJQ_+;==;-KMJ-smf!YnW3t**n66gZ`%QLyRzc?FM-qX!tXB#6n+Oc(jn zTE2!MtS?G~^itY-Vb(7+G*mKc68VfKcqn5#~iiJiQm?*lHol$nmfv79lSn>5jtv_gGG@J zdatbYS~Fwu()yX47Pt`U6;aUo5ts(wgAs_AJ{BxkTQ67f8N#FW zN!YSw3XXHAi5ir&npMg1CrEz@Pc@$Nu)%0|t2LnY!~Aesx-%+V<*17d?jTwAhDD${ z2o8HPD%*ucE3UE2a=b7tIrg0Kvl&}bj(Fg2HGy75beO)60w&>=xoJYwA3E?1n6{^- zeUP+cp2Rg&3Q5of!Gb2BcW?u~33 zHAmq*;&(91oomh0D!pi>zHMqJGw7?`Z|FT-?$j!?QLf$klq2FtkRO$ttk7KSGs3i7 zhBh$qE%V}WmEEe`oF~GnpmEQ2X=%9%d5e&J{rZ62>6n%0IF8TjgD4WE?&RnVF$qaA zc!~#<{Lx28b{JXsCIc`&NGPR1>}ABD>F%F$!Gk6=_tP?1MWTf{c(72 zwlt10#TivfS+mhoNQFUZu`^lZY90UaE6iWx%Hf1`(nUMv#*#8J8KVLME*JEzD37?z ziJj(b86mY!`zE7ZDu|&ISD}2ak8PM#ZaXg=_vaKOCGW|~%I+4dJ0O?9x>pQ9*L_3E zqUk;L(PXmd!->LPh@!^%c#B-UMAb;9qTz9De_Lm#{m$fzInBebUUTEDI^B;FnmfWM z$T{9aAZYjTjM{@qex4}(NK5mE!C>l@3RxpBO!^*~%)Io?%Tq~;r__re_^Sw&)P}w8 z0u^8Agn%Ift8%(OeVvS}_IkH+ejvJAg+r(BL~cV$4oR$D*MNFpjlrf{MUXqz)8dbV zqIuo&5lpeHrsgB=q_C+{)5;u=<&LoB|#SOj=aN_b5EzF~5vKO8wqGx~@NdWM;XR+Rzr2Ww(3ws719cUos<4{wz~z|{b#|`u za+MjS^TSN>M%R_uoG3I1h^uzLw9|Jx}NZc&;@4EC9RJ=rb6h^<_ zEPod+^wW3wS3ChHvrkHMBRvnk-+gWHied52v)hcp)xrk$nHqnKp0)-@1Shx~>IOtZ z8M@Y+b2AXlA1hw*73R(qh%BJQL7ifeWZ7^iwdzJKqpr*hys8vORm4xc3aTpd>fHb9 zz|F6{jX|(^7K46?aK{UuE3Ly!-blRp&8@tReCRPE2+z`6g`Tn7sqoiOo8$Zv-puwi z+j)cgXu_mj3FN|1xuvn38JDmv1O zu$r5HC}*(KarL920u1_fI$HELQ@@We4cUcv6X9_D)CM{8sG> zutSzatj%kJSx~cwnK*0TK zP)V!YoFw&T-ZbyVob|35_j{XO&Ol4x{$ECJbm51Ns>k7Z;1O9m;x&TY*=?wa+zw zA*%_FN|vJW`ap7YOw8d-%X-y83l4=CQeK(F@on>TdZDJ*OK$pLUUZ?Yn(V72!TiGYe4 z13!ZP-hlz(-6R)>uA7C#TH|-k#i-#=_{5R7Hz-|G-&%jlMqM9!d_lKaRnsW>(29|A z;iY7=`77>7VSs1GY2M?mwD*sTIPPeI(vn(kF>%y{hX1Pix}Rsh&#H2^qsn&qdL%eF zSo5go;a5CLITsf`-;w(WG`xifuWP#VIXCtkw0DIKkL?thPq>-??}`zNB{ZTN4~y6AwnDbv?R>523)%xJ!T87w>F);LBF4<=t=?)U zud-FIJj8p#+f?+S6;kDV(f(x8D^1J=4j;e#*N$KswabwpKV#F1Yvkq3d;&Mt!}IW1@aTX}Qd07*ic0HoNb30@h0`)`$1F!Ub3s-5 z0RPm~6wCi=A4ygrLuOB3zKr_ZaEakP{kbvuc~sW>iulc#-yzYr&-0u;(7|BV6|i=8 z788Im{QUhtlupG92^8Iz_ak6c;pF5T-5kk^N=)n-|J-QUA*2O83n_oPy_bhKMLwxt zjxUHwTlPb!`r`|oXKZX3?{_tjCf&X4{^)jZMv@~? z{|OW#|1Vu(Megf>^xg@rq|LpnbZ<6t8yY7BK|1p{1yulc|7An}v%RP{p(#?$Gx}jh zr-d%?_bww;)mFze3|8xo2Mj@1hk;i%W7|m?9UXn|mk?WA$jQk`+9<0ZDLVavd&GXO z)l`XbXtm`7q7J2n#Cg5e5han`RDh73w{o(ouHd-|!XEskCId@7#TwtCPNa8;YsoK2 z{*lNRTb@wE^S#-8>rSvWFBW|9H7l(t=RFau0**U0+}yFBMlzw3ZdUo{^Ioa;1AGB9 zGc(>3tbXd~tCI7g!VQIdIAm-qQA)zJ+}xxG!sHf*OYP8DWnzD=Qj=nFHSv8eog90X$Q&SVRmQp4ZNy(uUjo z%9umxY4>z#sOKl{2+|9)-!u>a4tirW^fyyA5JP^A$eVpI3@&^9$wR}A(8b)shL1-p z-8+-T8B<4vwR`-e?D~C;x2NoTHQNOyai8DR`V-_6mAxrvP=s~mSI%r9UH*)IvYabP zxVUf*rxfU*V4gEm$HF%C%EdXiePghQK?OybOTM;WAFwKdDQ3|L2_=V7@Sq-m62;+s02T<~ z0z8=YxD?!wgVPCvs95!L+6nQ%m+T94RevHbl1>6-<*!R)2>#01NXJI^Z3n^}Uw49s|llnU-KEob=m~%hw z2VT~9i^BSf0e+xkvPB4;Jz8B|1uv~m&x%;Q%pk5l2@}Te&0#T~$3J2b!QzpW-1-&Q z5KK>4>~Uq|O+WG~h%x1$@pjt)`DcxLY`%{~yew6>+ve+oM;vL*Wvn_CY0u<*ksT4# z)PAJcKRonY?>RAmA-LkX-7jp&e_#=ca{2%arXKfzw>qhiKu;oWMiO^LXwjdbd4yiZ zMm(@U>_38Q(5|3{^8JQ8me>C2K1}!QDIi;SUAcsjR??LIj?expy8CZ;>c0cQJa2Ru zKxT^pR0S`0!OxD56=hZW79N-Fao2lW^R~-X6xCn{YE@e6)%I*+7P7eb{}h%59HiW3 zHuKM)8HB|fKC9iAKN5m4j=#V(W28SOFZADa_j_X{mEGxwe8rua#yJgN9m~QgW^8fjC zUw3>~tAD@%v@_&3VO;q8kq(8>$3nrZNtHI;fp0Eu5&K#dmgM`$8;_->rR=;sqZ8wd zgqNmxkmon=y4brqKUQ!czD&8_dZk9Cqzr_x*H5Ogsl*4JZco^cDDXsr&&Uisl}&FA zBZNCL6_Q>nDXssCGcYgF51DEi%~82?vW$(51uGBu*y;|%&vvIf>#C36s*z-kbo(%p zaX4)J#@L-Kw;%(wW(GQ;H{)?W3q>s`KEEpVI z8UVZFi+B147+i|W8M!B7dfqY7)6L^@J5Rqpv8(GfV4c;V-yCO&++dkq+S8Y@3kV=i zKCgiV|Dypk@vZTEov}E5{d81wPchG2WbI~V(&*YnEZQhQ1n{U^4%vS8E{)Iir|QuD zKU_>{x0`z+ITqsu%EvfIWA%u$@lU?{Txp*5dlsjnb6*&ytE_MMPY1f4;G3J9<{e!R zpr@U=+tJ6THHBloB9teE^Q!gUHGrXVHPRS(Ad)M`nk6uDFVQcz_|{<=)?HI+Yh)|A z289T1N@T+m1&pCI8xU45r#GZ1=C-!Q+Pb=V4UI?C=D>9R^C2la zU-l2Ui6|$U2;jKcov(8mbrC@R3$RGk_4=JA_DpW%_;<}Su$h-{s=B3rvEAG!z z^6u_}o#B+rVI-elReRe1ZyfoN+|6lHuG4mGzENo3d%#FRIf8h9LAzh_u^s!}Ro2_L zZ$%Xq6@9raCyTz=4+_Oq&bv??d>y8AnrXf%-9Mi&Xr#Pr7T`=>$0=jWxw7in{Xvt` z!(R5r(S$WO>UsBLT;E{~6psBNmp(TK{ojb)(m~-DQPDiS3g+I2c`de+IdA+3 z;2>A1nzbesYRsNmO@fovO(Q`sZZj`0u~`&{kTw>@gFXC^l=N%Ai6Ll9xINbgt@sJN zpVE=*;H?u;QubFMEtk{h^+(MF03_5h8BFO9DQ34j`#fMhf%vb8EY;(TJcN`rJw4sW zKZLZRdZxocwNZ2U*yOp3W_~M^>?JflLker1uCx$kg!rdyJAA3@BNIr>zRo zcH;MV7l49>FQR(h{1?8+iA||Mm&bPbc$|TI_kO`GB~N&5WNu+iB6NGaJQwzMShK2o z4Nf4&+g0R&a0Ie2hA&E7Z##e_+PdrO5+ao~*8t}n{_lca*2s!tevS>1_`MHA(6(Q6 zlVwA0`?vqIu0u3IQNLq|euqR=YfcjfCnHLT3E9m!ROiON5Hj|)t=xjOIr4LE?S|)l zZD87S3JMqi&|q)4P9M1Lr1A*OEvO47KkqZExGUrt$5gAC6rY!lUc{Axx(vB1<84?( z2^^lN%hr!N_hxGaik$vr{<1lybS6m8#ddC*<=vAO*1jQx0M_^dY!bAz?Ce1LLY75e ze36BlnEm775O%Jb+dF;;k5E5szEAy%-wOz8JJXdB+l93$vQZ4S8^3?>AAfFGH4(mD zF%$+Xm~@*Gkl$Qk?RE)#kv24ZK}b`do9WStiqcVY0QEs%=^)4PTte0u^)5Xf53M%o zfx_tjy~bHwVV(J6;F_Odox7dytOBGWs!TjyXfOy=tqa@r2!(=q-TGE`a=fN&<&3K1 zZ~>IbdN-a7>F^`=jEU{(gFS(-en|jV9(bz|`@e{bSUkLpcx*(5uZD^R)^Jso~ zVWXp?gQQSdHNIlN-9Ti~%;eTjoao~8U7v6BZKMomc5zy88V0=+U zMI4sg6s4wv*2}f~ybrC#U$Lj5tRpxxPn13ty{u~h;^=3N#$V8;+U{z{-9IMVg&@IE z9q~$gf2P`A>$+tL!x-kaSM7e?-5C~3{Tf`LOuj(MO1#nY#%I<~dX;Pi!K1=z65O(z(egK;@?!uZ`w;&_8`>T+ySp(J3Z!s9B(u(}SU04XMiRm{IF3d+hNikO|0%~Q zj6%Bm`W}ECyJ7cq0o4d-7I)07=E;;K$$y~Qpa|g)z|8QBpyFj(K&S~>XX#n5y3rnK zqc-4bGC62RV|Kza|k=lPC0LnIvz0=a_2JGc>HO_$7eSnSr}D0sJ86 zIs&Qnn}zs(lb)U)2w=YqOiXaKQ)+fWMIdB+`t%6`HP|2gm6!J*qEn(!zy9$J0gnco z=v=cPP)F|KV3yn}@3h6GT+l(P3mgLIgsrXZ%G%m+y_?exm*WgoWutKI?3@`gIyUxW zx%SX=evsZ68X7v;7+Ma!-V;|V60zqxyYsPt`*yeO%fvpZs#OXGKOlK%Q+^`5C84H9 zLjQ|?1M2E}wj---O9=XThEl5V(>6xnX7zumL;Lyj=Yj)2%4A$Eerfy6`&*z96=|}7 zz5?d)#RhI$d%Lo#s^pfpDjW{aE>bVkY>eO=+G&*Rf|)V!@WlCD+yj8RNL`c9{elDS z-Teg{UhUHc^SGpM-tkDTY_ zDj5I^HWvqr(ul08s`!&KhZ?8-@ZQ~}i{fQTDXDVvmwCCEXQl<|bv`LVt{-1LK6Dmr z-un7d8nu8_Cd_wFsAdEto#45-Q>nG7C(WCayN*XkM_s+WXmwuD+IEMG3&|G?vk_nd zDf*mvpTraOt7jF3>w$mprRls_>k>5}>^1V#c?_q~E!jos1N?%U1TTAp9Oem%K4 zeFld=oMt^M^ODgf>KlZ?;hOpCz*N1PCx}$LR9joyt4V4y_|paR=S*yWF)?As_4~uK+5dylhQ>S-e>I0SuNUP@(%Jz z+viqtHA2=qj&8|Nun>y`b^yC20>GvDJ&iDJ3JMwq0SSr!$mU8`s;7B{ZrZ?oei4yW zuvO9rgFCD%OY0rnGENiZ8A34(qi$5Rw1R$B`v2^D`ULO3fYaVjw}`#08@J)_?>*PR z6l3AzulpRci)M`|YpHbuopB@PH;%8sUKc)UJkC53>iT)H`QQP%HW>f8}Vip z$RbLWs+<9SV53FH#4XxYzm`*M**vmt0Wa^`D?f?3@y;wxI(b7ht z3<|Hl^OM}Mt$g<9SaH2$M#x7GFz{~NF(DDt67J%Hvxc?yI~T={*N$b+<5R1Tg6+V* z2pZY^`LnD|WcHkV7!|8Z`!71Wps=u0PfXSQvXUdtmey8TMa45Dy(%$!?ihlMjg>WQ zV`D>lT}D#!+xPF{^70ShTeIZ4>iW{azFAscvgM_O;?47@iFmhL-pM+?bKdoZvj&xX zL-J547r-XTiW=*0eka;_+-Ej#43CIlWZ=ih7z&(T?pQt}Af=Ml*QeV2v;Ew0WzmJM+EBFH;r4!rZK*}eBX z5`pSb-b7aKG*ut%FklXu|BEUoiqC0eVuDe^Pdk8l`6M9R8w2Q3WDIQyf2A(}rcKKJ zf4D2w+Hsp`-pS3h_$A0nOzdtkFLy>{jBIiwhTg6wCC;h6 zZo(oIXX;_zn95+3&LE8FTu$}8zOd~JGI2fMRQUAixm(ZqD}nmlZ{9?INdgmh%=}kb zS#)avKH6JVT}iOIKv)5o%!cLKw$)0zNfzd=8nh^kl7ZO(ZVC#*K-+^PE6NzF(bqce zrfZ0^gW{o{OH$h!p5L=(kd?Ek=MP{%Z8}KrrUfeEBj>!v{?E5FUCbHUKn3*#Dp_e;bYeLUR7O zJpUm@fwfG_|7B)I7a#>u^tetbOG_4^nsZFYQt=cpbIEP(t!y2e4ofz?cS?`!R+J=w zC`Cym!{FIBB!iWR4Recs@N5JLGbe&26pS4LGA3#<`t`1aq@)r1=tz#SD8u1DCMY$*4U+DAeCIKe#e2lYxDV0e$2 z8?P56x1ENzT31HJ#mRtr1PM<6&6-Kk&KQgWl767`pom&lYGQ|Aqh#mg05cXqs-{gx zuxc`ODy=~S4yWRi1M&e?WdI;HrNALJ*~T;mGw<+ML&yas-u)LtFXH7H1_aIp!K@ce z??%VQfX2R^x9nI;Q5Oy(bZ|H}Fv>u^WQfAbXbuFCIWx|8-wZ@8&ov!_3)G-~cbk)+ zHd!%X_5R7}4WS_`KX!EojgP>P0`*(P`B z^ORHfTUR1_@7wSvD~uENtjJ;fcTR@y1MxCtfT@d;XtZU)rMR(I4ENhMu_hVJ9UUFh z;19(yX}sxpUBZ77{PlZ<#up@g{@qdk_l3R%w&2Pz36N(U{-7{wJiAN!jNtKBi;H0n zX>|+VrHB6gl)wG@@lVuJ{WSu)bbo-_3pFw|O+C|kOlg;12*Uw|_cbN-P&8n6NMj&? zNZf(D1plAx;{R;x{5?)?tKx|jZphTbuB}(hAdEDrK=9Yod#@HCs%p3nF^Q203EgnD z+(f+&Kr!B0lraM13Q*opj^vy3XBG-b$1?BxPr8itOcPJ`6XfojO#4Sh+J;v2N-pp$ zl28}(Tf@V252Jfzs6Pw+%u?C-d{oq8ND2!VfY)O;TRvgCI>~&wP2qK#>Nhi0P_@xV zSEUhKC;l$=DFE?`xv+up_2xClT9-Sg$h~h>_qf*L;^wq*J%HNtU@-31JUI=vfzwPG zQ&+r%+n{?)52&}4gTpIefXF9sq7zpwhYR?O7i2n&69SCrUUo%i4J1?H%L^g~rGzIt z44*o3-x#bOEVjBIu97_plLkS)YG6zQyf2o8b2X($oAD-mLEq~JO67HJo1T$@5*QTp z;r9Bn?)GXM8mj}mYn3ed_C=d}83~@r(0i2@6Knu~S8W&6ZV77jf2=szsFSJQ>`1!1 zcgyLD{HaahQj`9V0L((_5PP*O+GWpdK4(U`Aa*MgKnMuj0c3c1_ySlF!JW&8?4>|( zxyuW6n1-)kZ5NmVegUa#xQ5<+#-JGARX(BHJN)a-ROM%CB1ULNj2lP2Z)brm8c^ReQ3&Ph664uq1 zq<|_wYz`L0kaa*4DA~$T6FfPPxCXxO}x5*cU}c78Hn@MW|j+31ur`9BWc{!xP#O0L=eHt z(J1$W#ruNCJ1;?$$wYKssmP(5P#4%$mz!CsTk-@W9`x1WKKHC_4nJb)_1z9?kL8WpXUVg)R`ebsc<=7d*O1F_aIoWlG-u%j<_syuty~ujEvm+oveT$FZFks-~iUBi==bf)p$q9^Zh%jR3 zWs1uhd2C|?>^`;ow;YwsyU+iN0bbj&=JgwoQ`h;{UktHy<@j~pc{waTlmVEaM2re~ zrBS-d#CJY8$X<2cX|F9IK0LwLCI(!qt@t8FOFvbTzWD|`VBqIZv_c+Myc7^f0{RS~ zeOgsEKfJ0lGZCQ_JmF4ro&gpG^=o~NL5e%TE?muFOkE1@Eu`V+f9yNdWYMdCydQ?3Bi@CYEGjQA?n*XlWa**lTpu994c*?@^0JwcSQ>DJA#8pY2M6Jw%mO(dJ?Km3iK{+d66MVfPb2HjsiRk*(SBtqn}%8-H_wPppg zfIckQkhrgQ!?B~md`~bB{BKbCr<%c|)m|46M(NUznccC|6SKczc5<+;2Nljj))WDO zf@77at^U;IOkFz7Ldn3lhFj9l=gGS-AHi!@lt(_6u<;r?$q$)(dQ0vv#OKStuQBym$I$X7^du z+47PfXr};=BWai|)>4O`xDJ z(aN~6C(SXjV`-=#VhF{|DhR}16#{vA*EcuY;q5zhG*Ns-3|RjjYSW_SU;+s0*{+o_ z%(#mPz^uJezUac~{WjYEJhTqG3u-vXSz+-YTfG&jgiindo!<(#GP6KR?Jga1eK4); zEu141&;2g^CpNA4peaIOXL>(9FB=lE@SoM1S`^BZS zSMa$PHWM6sy)%D3sFNC}ua-dE3QqVLerVkxa6q#I% z5$V$LC)wDOy%v*5i7)4-#Ki47+3<%-va0&YY3Z04s(fYbZJvoO7sAm#yy1KiYAJ5yyFLitZ0TFkuxYPE9&ad!Ct1v#Ic(QMRfusqu?T5uPTXiRg3c_ihL ScmLrFk(E-EED(S1^FILjP@mEO literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/curve.png b/doc/salome/gui/GEOM/pics/curve.png new file mode 100755 index 0000000000000000000000000000000000000000..a9541de0a3e590c8c2f174204f64a64c4491c3de GIT binary patch literal 11543 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 C+~YO? literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/cylinder1.png b/doc/salome/gui/GEOM/pics/cylinder1.png new file mode 100755 index 0000000000000000000000000000000000000000..71b619df8b8ba3f097d2d5dd93daaddd185925a2 GIT binary patch literal 14719 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/cylinder2.png b/doc/salome/gui/GEOM/pics/cylinder2.png new file mode 100755 index 0000000000000000000000000000000000000000..ee6ed12e614b00840439cf70a41f58bee0e0eea9 GIT binary patch literal 13539 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 XWU~S)a}$B?6OfXex@@hqdFcNEgqMG{ literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/disp_mode1sn.png b/doc/salome/gui/GEOM/pics/disp_mode1sn.png new file mode 100755 index 0000000000000000000000000000000000000000..b5b7e8ff299f9cbbbfcdb9008e594c5caa50ae91 GIT binary patch literal 8130 zcmb_hXH-+o)v%<$h5Y$y$wZ0}wr4HCRdA)9qC9Uln_X|BR%blSx28j_>^Qq3|FwlZILu#$q28GXYhmK%#DPTK?xD zZn$sX3-@u9Dx3#%t%eJH3{_@8qCywAz;56>)OgeOZMy02P$l_P#aqB!gqvCtoY8Z3 zWz;}-7<`h|m^aiG1To7RY(O=7tWe#dz^9rv&DGjm1V&r2Uwz@bEi}GL*_jAs$D$j5 z!Y_1aqIF-vKR-LZ*nI~hAzRs4hWSSTofqBoGA1}E!Eno@?QLWFst^+zb%$C6}_I~H;9e;Ag zMIClk4q8034o_87Ru)F;B+iGqSB{zZd)-get@S4FZQTA|>eGcwkaXreRR|FEscg3V84Q8%Al=nb6R? z|3=g=Ku}TAzksD3C%~3?;lJR6Xw$NU$^RRF{Hn<`{gHr{qprU$QZUbCR}Gho2T7i- z4pjO%HA$dQc?rezn3o{7`?m15MsWweU&pIoTSE{vTbDCV;9G|sH<7~EGof?)6&3yO zFl6!5QNmN6PTnNwv-%;!WrTK931_UV?j20E8u+31q#_|N$RE+G3YC=iy~=6QLQ6# zYn!WL^Yff1>c8yE2k}`?vy<-9vaA=OM&x2n*9u4~Z?{H9_omF>dN?K7(BUIWafR6!#&M4 zPN&epY}t;HHwGJ9r*SI-z3EMPxX-5+)JWl5dgxkU6bo$BO((-8;D_Sjp3E7!`t0Al zn0)%T-B+bsGe^acGy?{nTn*ukY`#pV2NW2E;qrm!-1=QGzCQ0Rd%f zbxojpMr#n;T7zWEc+{7Y%bl?nt-%C$lQC9(pU-Nuzm0qp_NudX<(o61UR|>O@ouwk z-p>rEdIuQ78(c*SOo(hX5g#?tQ-6z$R*o7ZP~%b6%&+?5KoCBtapw3vD!! zY6VJ@2$U$+q=}=0m^XLE5_e2n@hl(A#i#AISZ{Kn$C)G8@TM&sTW5|ODlqX*PBtB^ z8)o)U_oV?AP8YCZ`l%8e%QW7MGG{!5Mz=7GC z?|&ci%6C|h&f47{sLTwcz>YHP{4^NLy}>3UT*t&=@jWNcH$+=(aqh2y>s5Rzev$LD zj6tn8J;b=)kVA>@!K}r zEHyawtfZd8$XEP465wmLyFu;k(gs8di^c}CNbPlE8G#i+O5w%^X!b{A94Efnr zrn(T3?jgj5aIZw)AO~%w03i{;IQPhU=uoZn=ez0O7+}ku2J`AulkN5Mm}YLt3A^${ zXw93281a*kxmatfGgEjGX$;kqxe>ea7)BNIO@s$e&LbS7$fLilJ(BF+Hau(S!p~if z15KCJ6xe0{(QiIeB5>xDS`tmI_E^^T#XUvMj-D8r0~os(^ng(kvyam9+LUt!0%t=GBK=&kZ_{QGY{|faPtbGJ7Ea zq0Pg#_mbWJtaC=qmEknekj5q%K|$Pdo{NHf_{8hlJ^_U}T={O}MFE%X5LbjG{#}A- zX`apG5b@fS`_jp`h@y>(3>0nxa8-VEmd(7*zGbz)Qt|f4=mYD$pI7Hu%Qu{v0F*1y zFKmYDZ1aI~AMxdc6^#Cn*Zrk)OL0PBHk5d*w?|mn5)!bX&fsA#Y2i@}3S+bu`kYXB z+!ae4D3VFmap8+0(ydpDdtk@oDh?*NRADRk8&hpFBN8RvTy*i^k#S7pMZZV;&0WH$ zcI{o7NRLRwV+bw0f^xJ6demZ8XoRA^%(ZK6`JidZF}8O2*wc0fiKXW!^t5MOBb0oN zKIQ-UwNhQ_C@OJ0r~G^UwskVko-k*;P=KO?SOJ)%hgyS zlFk1;|CY)J0_OC%@9Tk;XhLF#NaL=l>WVsyolk*ZsHZTma3QnEEC!zzIG=t{hOsC6IAYNmF)m90h((lsi4CIS8 z({iD;d?~yvo8Qy*FS+Pm=+wzsjSSX^W94^TXv08OTxWGw8Tg*~N{sIEVv3l}i{w7n zTe{NddT)TuM%WKPX(_x<19G3uSxs8Y^#%#BHF2fleRbT%@TtxxB%%P_ydYR=N`m%w zLv@R`!%a^SIgHxXNvPlQ!eWm&YA_#+o8bCww{lessnboe%Xv*|w)CjM-ufP^m%7= z=llGoBog}VK3GZyRAxi-rY*c+_!tzXB+u&M!3|?i4C*d3GuPU<=7OalW<1vQY2Monv#YcESZKaz|biE+IP z+nhl`L1uvpD*ilY7w>LTGUnxNQKE96G)d`8SZShDE~}~?zkDv9=Rs&m%y14X=Fq-m z@_MW3J@-R<-I*&DN=V^i>vzP!O5@j;K(};{n%bLJg*@7C27bJ=)XpB2u9}zbk~|op zxziV+cgwFr2ef26P)fym4@>(RLw74H)@$cwSVgcWq> zLZ4{)-*}a(*=cS|DuvLpK!<-I{Mnwz+-|cB-y1GNJMu&31Ryx>lrt?QfgfInIPRX@ z!U&wKjkmW_`gGC+=l!WV${I`WiXcRQbOtwjT_sW5@pm2nIiKVXBv8vKOu=SZ>4~#p zxATW@!Rg<*w0MUG&WnVR?zuHGo=F9EjjNS=-COEon4ff(wibSFTcR#agm$VCy1~~v z13Z}4&nJ2x|CoT(V%lCU?H16Dn99^mC=i+tOExc?&)*OM0_?f`YaDp*5%?~qQ*kJG z;e(wZY^|DR5~@&lSePyk!5?Drl|h%kU9q)aBjLsT`pQW;Fiz-FIF*!`gKGNXoJ~dFUDbJt z2I+iE1Nv!nZWgiq{K>wqZdqjq3%PwcZ*AHRgHLq}!l(}uW1i;)$o3_)mc2otnPgBQqF9@{-q9f1C``FWheP0#Cg?*ZfiW%Aqxw(Lzey0KCRgUr(&4Im8|(UF!6p zQTJ~IDKZhj$HI4VX|6xrfSWw#Jwm%%ezoLCUCFgVRM=~3epjUWYt{TbeK>^Clm%LH zMBHJ1s338IAC$ET*?ozf-$rxiew&sCF2aDjT%*x-R8@$)=R!{iXFagldQN>b8q~cq zjQQ#8ZB{D$$hN+t9s^wnmd~>CjGvCa!2RPvYfRbi?51oeaK=hbw((Xx^WRe1V^{f* zk(u~sWlaNly>dOOv}Dv~p}hhE zdp|HfgoH!%eRJ1(lZC&}?DdnJVY3B=>+lS0P0dQ@pk$+uXa7Y}O|V#0LYbTI2`R*e z^{RC+8Fu)`qmr}}Cu*f;YyjDWIx~YfWtpS zWY-|eI{QItYrF8Y`pl=^b$EVvZ*+(vSMZ2lXpOu2gS+&SgD-2Onws{r92S|ZW7T29 zBo)xQK%j)!gqo9V-Ny=hkry|5uP^Zz?bK<*h7XUkG3`i#vx4u+a&6Ud?P@ScO`bbdj%V~>I8b76!0*b3-`biz86J`t2fbX$XdVaT(eYNv^W33Y7`nE8 zX@ApuN*YXwmr8JcH)NsdW8$!atm|KEex$@%sj#9r4(!Rb*t0u-a?(`QI~+C97*eF> zkTtXZixnfGx=LP}B68qgGA`{Le-59|=Wo4>p{Q{hKw>>`2`!IoO=~1s#*33rgxv zW220vy*^u#6+tqc+;}O~xut|{zwtgNn5mJ&eoA2d+&Wx6;HWyG&cy$Ng${U3*tBrP zBP#L0uT5O_NQ%rfnPG0mALPnl{dF%ldkU$O;==Xv><50zh7et8pM2kKM8tU3IO&^l zZEBnP%FlRFRoD?{R!&Od3E7Kh?D>jOppyb8rn1(w8*4O(C^(MK%s!|aGl7+J3cddY z2GxcbTU|t0jGXP{*iTFJq=yb#vUCW^g4aWQQ`T_rY@H%&*EArgPU1K6)$8Gcar`8+V@4GqPD#}X6E%Rnt!m` zdpyf|E|7+!Vzr4stK9@aOucDCuw7fyi~g$@8G(RXIDU-kmy+5WgZXH8tHe|Zg!K6# zbw0cvo@{Y_s8DkUA$I@q?ELPH)d9g)-H+Rzs2Za|9?bjX+?)sUV;w(I@y$8)d9?E~ z+%dSoapGdl(nD!b8e2wkeQ?Il-|oM6cF@rAEh^UXMKVK_hu)e}d|O6`JtwZGUIU5h zKN#+y6RQl<@gxg>1yq?}sO`^%M!lR}zc_MD?Bh{R)nWgt8wlf2{7B25&20Pn4au5( zTN+${Vcz%f)EcgbPNKH;=XGf2FTVAEG|_xU!}>dz>gFRygof1{0xP18#{r1Ajl2g( zdIZ}qaX1FTd534Jtamm$_rg51GN<(*3CavAjM>3*`5`t#3D}J75pU# z>kw? z5kw{y1Gu{NGwe0q=c5ntKjeFf&^s&50a?4gxp^~E&pvCdYL4U;15V@UH7KjqMr#JX zx{I<5DQ>07a6BPd=a|~EzwTQiEY+NI_)%QNSq4oALawX!)OSTi3vHXyC~fs|0R}z& zBr;a8{On>|KPc{TR8`M2VbQ;wg*w5oXu0FwYRIbAxM$sa4drFlnL(@mex4$OceI_wr&M zzJ_@u9UYfl#!GFSwb0M|k7n!(%suj_13k*YlnN8}ht=uY>&V+6W8r zr#^Z>66Nm0nw|^EZ(4g%O(pP%G!94K(OYRSI5o`axa<_>IsZcgf~s%qWY5v7cz`*=bLk3LEr-o3S|aYoiQ?9RG4WG4-9=%2t$%=nHbWzS>}DLI*2usez2V#zV) z-u)WxF!Qxt_p+7j=VH~l>2iZlPOatSe_c^%P9D_$Jo-xiYhAJgEswL*;tzFC!B0zc zA}}`|OlAE^rSqcXDIPOTF2*{xbhR9oQRkx3Lhf5`(wIs&OIvZ#Rm{AWj?Cf@y@Wjs>YZx5V4A5t zjY#v#2Bo`5I!t=e*f;jFu%i=f=?gD%u-t_@W2@W0Niro^&Jc`Ei_WBp`j85pLh%rz z15fVxhii#AM1Rw7Rw1Oh2ALlxUrsf*gPD(d$JxkOCbwKlzDf3(KS&h;X?Jc>ISG}g z7{;#%q?r~`eenAWe>hff_{HqkbNgHc3^HNQ6;|H3M})x|+mRDcMfx`H=hR2XW*X`_ z+RW-OEV6)#Rq2uI*7(mZ);3oA)rvVh7^stT+?l70eYhenxwtw)xoh&`gv24(a)%A+ zo-)D7=OO^9VE=t_UTb=28%jmX;|g^i+$6D^LZhyGCW#}_p`i!lqUKveBq|OZ+Q3Z-yJ*Ng28t;4~B`5AWifo`5@u9qN{R2x&mHe z)t4?cdV6gq`44Kq_~ETo2geQ&iMv@-pK!1Id1yw6*OWUZfigaJtOl>cW$2kB)k|g8 z#`hEgPcqj73IITw=4y3TNl~?>5~I}+ESWKRAE{%O{53YWDJM{{LG?A!s;75E`f?If zw!W!zs~ErU(BkVFmDnMP$&|%Dj3EwGVCQ$4g2JdKprScOfA3(fxrpI(n#gsh6=8q=t#1M^2JZN-XoU?%X zPR}akbyZ>#b`(rgrTW0hA zXre`7y{e`J&5^hTw0ZRpAv*98fr)1!ssrl)FUEE#oAqW! z1jl`g?oexa%%jN2Ar&r7a2#*70l< zMI;T62ZEiKHX;%FPUUJOuO=9zjNp+((%=(q0FbNL)wlmc8{JE>O;m+FW<8?13SxuZ z!6mZdBVN0N@vtCis0`llFySNY`o%8sVGM2_MNoj)DwJtx>k^@5H2gPT12@K_2v>lV zP)9tc#YfDIQFihCLwmgG;KAh69#H{u@9nrRX@c)+(0J5ng6l(>JY0d>+fxfVB+Vxt z+=o!2N|sAlLp)LC$K8%hHP~~;{;J+Y=re}M#NmJVq!imZfMo*j=l~pv&J%>I8tg*v z7s{^ymt|dW$vBKic{$N0l@AkYNQ5+Kf)}YRY*~0Q6gGc07cglJ`YYdT+ z#6DOxymAaMh;WQ`4%+X8u;%0Id;V;hf(?+OvbW<7$4Hlwj>&k0XV>7_btEA41)Az$ z^gI~X98#~UZs|z~mWPLQEsDz`X*AoX%>4p>u8DD4k|xrzJgwt$qQMlQuNu1?t(#T} z)6x^oW03(NDT)-zIO94Dl+zx)#l1Q0SN79xkbLHaYdHxpJATIbc$i9UK5NTL{lvFw z)e+aYq`oSATZ)ZgknXal>Eziz+BPkCDxwL~Rb+0pJDAXCki!Jj*VI`~ndCu)C#rgD zdiwC`);UkB-3xC<&0aH00yX@QwZ-O;94TvaK@+U3*3{&?_jF5kL>+cvS>9cI?trWb zzJvN@5%+rsuq8hroZekr&gMxHR9SS!xszMcFwEk<$zI><|0#jJdyYaSe1B7)&jfJu O6k6)~YG@VPH~$BJ@fCjn literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/disp_mode2sn.png b/doc/salome/gui/GEOM/pics/disp_mode2sn.png new file mode 100755 index 0000000000000000000000000000000000000000..36223273990837b3600ae125b3b4b76b4886583f GIT binary patch literal 20528 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/distance.png b/doc/salome/gui/GEOM/pics/distance.png new file mode 100755 index 0000000000000000000000000000000000000000..7466fc424f50c9678e0c0aaeee180b70e0fe1644 GIT binary patch literal 12635 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/editgroup.png b/doc/salome/gui/GEOM/pics/editgroup.png new file mode 100755 index 0000000000000000000000000000000000000000..db3e235751c30bf972958ebaaff93fa8bf7fd71c GIT binary patch literal 15719 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 qq5?h*L-y0nrEe0oGkal85TbI#k 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/ellipse.png b/doc/salome/gui/GEOM/pics/ellipse.png new file mode 100755 index 0000000000000000000000000000000000000000..0888b5021ba27724c0c253d16118e4f3417bbdde GIT binary patch literal 13550 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/extrusion.png b/doc/salome/gui/GEOM/pics/extrusion.png new file mode 100755 index 0000000000000000000000000000000000000000..2d7017e935c381a66e281ef15ff5fb4c71cff478 GIT binary patch literal 13393 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 bU1RF7as{leK1u?=Dg;rKSCK1_c^&v~n#y`Q literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/facesn1.png b/doc/salome/gui/GEOM/pics/facesn1.png new file mode 100755 index 0000000000000000000000000000000000000000..c78703a1107594d007746d04cb8f069ba11af690 GIT binary patch literal 3142 zcma)9X;>0i7X~S{+|x`Am%`Gr+%0g!HMO*q%B6C}#@10|G)KS<6BCon%yNO$N*%|g z)yiF56T~TV!$i?!G!T_UQNWLx-`|hivQ7ANt{! z8#xjQ`=3*ce&am~hZknn~;AoBlYb z!`cdD7Sv%PKp?=P{){9V88(gnJQC#se5C`e)@|QLUgO`vg&$h<-Xd#mC$o&V?K`#Y z-e_#_x1Wv3LL79AgWwJ9bD;;d~^QFw-EwxjAFrG` zyqimh&8-lcW^)Z?4AK#TpE0fI^~Q%L=PDVu9R2!_Qu$Tprc1aYrf7JCDH%&{+3GWs ztj*|4=9h>zjzBVqd<&D~#Ho8g2_P#cQ|Q=c_~bMV#mQ3)OBS+2yA&22xL+rY#`Mm- zKbg=A`=kQ|K$WW!K2$6&Meku3vp(KZ8zGg4R9U8stOhX~vqCD&BySJwKi&1RM_sPd zF2rAzaeQU_m9@jBm_9*wa>1os$BDa0qW9wQ8_`(>AD-p!%>Tx$UZOA|j8MEA_^xYH z5!WGcKFI55_wH-F=q=IpUPN%FYx+Vw57AVXy_OXcr6uZWaQ&0uy3$6|GV9TBZwmOn z4Y<4q9Kp#d*Yg=1EoT{>?LnVEt*V(^C83l--EO80JjNz=%|qalHIE)*-9iGhwF1O4 zdlm4@SCk_CV*QH497Gt5K5iiCaLGOz+jQ!cg@f!eLe)VLB04Zn$$|=cPY4trN8$%5 z<{hEln3uD#Zh>MtU%nb|L2gyt3J(E)=CCt`JKEYY8G9r$B7Ar(C(rvOz4ou1Z^@(8 z{zK@+LQbU^?-e_Qc6R1`Q{^Ox@qYADIJ|uddM|R_ zqI(aHgghCY5*M?v-Yz)Sy`;96n(4ZLUs#njWUF1O>wv;PPDPvm)5O+^NoBw3g;S%T zQ$2B8!(o9>ELGa=a=0@;YV{4^`?tcKz!As2pWwrE>(-XzMpW|j30vkY*bBO=Jlo#rB1wjIuHI3MGb~WCasqcg)FV?p32ti zHWJ?fi`(KhVd^F^h*inN>8j)Yno{`=_Gww%nC80<S=F zGhxiL?vs$!P6CXb0d);r%4x0Snp+WJEOT>}cGb=%cX<)Ogdr7uf1sQQ`WNattl>wf ziYBP**x~m18M)DF^InysRwc$cBsyd8kJSTgHD6x)akvJxA7(4qMnh3qa`{g#e1cse zA#LHs)FH%xGat+sN-WNT#ptv-*ufQ$klJxbAAz2~H$aN6wD0kh25i9>BYzp#$H+?r zRP%)V3pjn>GaaVzbSknC8d#v~PY(lP*1N4^mrT*#-rT8%9Gj-3CJgT~m+FX*JW~=4 zQ0;5FqtX(fMTH$?92>rr$sPG!y6=5=4V}_nj4Y#_h^ZYDBpe^$+smz-NYS3_u_TA% zc^V`(EVHifcGeS^M@)07`wI5?b1RfG=xq`KnIL|?>*%FA)< zwc&@@^5J?BS21fgHP4G(cZZ&b;blW_iw`VMYw~X?tMioxXMfbT8ahsNto^Hz^951J z&dlY>ThrAbOtmW{NJvZEpuI=ryZ$%0IatIS-PC`1cor1F0RXJ&(|F#W=TGv%%PTb$ zJ{zT)tj9Dx;$T8pev2kpwUNj725K;UXfFQ(qy|{uFXGvBwt>XHCD>cTqmXb-Q|q(c ziCM4?=G*EXT7!brdp>Wv`Fe`~x zYiW(XGY6wC)flAnE?T@D_&QdB-~2+sE)#APrL`C1Zj8hWXh%~{sx#K~!!#sP^u4M3 zHLnz$i}e=onSiW{Rawh-X0oM$?K8ShI;%Jl^{ zyQY*1to>?HiQ6BHSTm>Ta)F*UhqXS)QK7S2ftx#uyBqyy8lWKQxxev+3-a|V5s!dr zkf>L|A)6;Ufye`|OLxR4Vrw2BitpX5%haas_9)~DdJ8v^ANXJq;kAL)J}!aQo@*{> za+jIScFsj*JL;F-?YCt;s!({m49*f8qAyg!{>g7$yT?5DIyxBK4b0#T_dXYYdskDk zRc?a!Yfph9Cb+rx2t70G-A9%JjQZ#e5g2FmSUiV=06N9KC-Rej``i5R<0p1ADT&Ep z2JF#dA;0kE07O{wW6xxZQ8xsLp4?yMq4Z|0Ss-N0RR~LRuUi9u>9jzH0L2(gY=$RY z2VG*M2#aFgG~2WTW~~-E8vHHHKAp5P`culG*k|tR2scChf(Ep9w5pgfaMdStUTR3EmEk zxk;l-lpdUvWmnL34W4}$()I1<@7vqf?A=sFF_C_4-DfQwVjCEazYaIh*_2-#rbjQ2 zmiCpU1jYW=J?{5TltBwJvbFOL(lCFFvR*K4cId?Lg3aO$?pEx4LHRT!%%EJ`6bLbw zZhEXpJL5flm*=+fc_fhT#nP7n9VO(LJ{8!*-ukssLHdPO>qZZ4L-5_6RM*&YJL!mWd73WW;`gL7fhKWE4!-3V(=>6mM1@ZRIc1gX*Q<_* zzseuqN0Amt^AgC+D>2N3?c0g0uA2Sa#Wp3Hj7PPtiee;=cfM<1AZ~7cq zrhIOnay6IRf7QOVZUmN}d^7eLaD-)SbvDeqiT!=|-u?j88{x>=2S3|zY}JrN=p^C2 z<=muPqI5>8z6ViC*kK};0KT5rX#H43_k7tnF!5SFsdM=;Z)meo#_pejFpA=98xmwi znIIbM3rWv4j(jIkt9IH4?7N}T8{qeGYKRh}L}mfZNAsYy!>ohgRr5=f*V5-B+^|>7 zg5Z`GVfGWRpFfB+6cIpg2Lgc?kM+4IIA?;ICFMV~#}7%RJ*AnT5{YY4MtnC$cD18o zpFu3Zcl9uIbaqk}mfa_R3jEapyX-PXhDrl6Gx|2!4LSb@U-c2xSGFK0#9i#DAdB9s z;V}n+#y*{cn~Hs=!5M5T#Kh6{pj`#>e&F}(#8b-48($h2$8Vrfpr=ueI7>xbjIgsv zZ|9aDCa+&W^ZD+cMXnJ+9?}&;cgd`Rce`QxH+lK@DfOxJ7SZ_dZ3P{-cz%zIeyc>> z0C=_5(1-`6aEdNIxZ{w%2;0dCNjCakVf--lIsA_W-PnX2nK7Dr$`_B8O-lP@LDjCq zorcPQ3OrgE@F4Sir<%WxfzNyAND^*pmtUfC+TQ;;GUcWz{=lQ&z&-48AJpa5CkXJ50;)sAq7{PMPYOMNgK{3wcuK98TXtE#%F zVB9~HU--B)h-mfap^t9RU_c2n90V+_5J*+x-APrrB5*rsSN^i4gZyjKPT$0Bv#3*n z2>AJHa(lWgF)gcWzFH<9L9wbX4~ zps=2_-7J*`uP~D5rhW(%zK7aSxK;bC9k8HkMbLy7?+z6THF&%s_#^g%{9>QVwX2+p8Qd_maU{R8W znXj88wYG9r^+%Jaz4@$8!jpi90b&dVmb<6TPx`CSjQ$xEjVaE#+$hFbD?F31ZZLLz z`=fqc>hlJ^-L-R2E_Q7DBy)vQM-%m-juE{QM^Ss+r-Wu?CLC!sa+I#(p z-jG8vRCQGDfqO%sKs>YY1}nG(mmq&<*OLXF{UPmlrLaNMf@c-wTdx5bsI5}dH4uDqY`%#vPH{=TpA@v#yMUuBDm@@A)V-xQ9mfIE`( zdb;LGSk`C(<5Ih%Mcju|F9mxW20F;FxZx)Q#Zb>tVN2LuB(@d)Vs7;#D8V$^dWnh^ zzuG0?4z(MAm(Trju^p6KzYEkJJKUN=m*_k4z>bp&X-hQLgP6YI34dj^pkK)QqR{?m zt~7dy8Y&)fSNbhi;&269bc}NnYKt4>Ol@gRHjB%bBJyGyuxhl)C*6?1xYev@AD2hX zpM(t;g~L>%`!5L0bdp%&fSb99`o8+P-3w&)bA&G;Z{}gc@h5b~G*=$5#aQ?{8932+ zZis(Quy2$^^r_?FP20eqh4qKQTsins<1fQ(Pt)Z41l{qsZS{y|-Ehv+-eXyd zAXWUIN$VtTTRMOf^%H~ly%#>XiEvLunH!Upz1>$eGjoh~ zI!xK>Ax!NtiD4q7XQiHA7M3}M3qPc+-jU-F(O%tn7^dTW^Ti$JU?Zhh&xg0oZMGO6 z{B_#lANokeoTg7cd5x(ua&)?pC$&gNk=c?+t66aJ-CYSsm8tQo1$eSQ-M*Y6aD$MDdT*jwdlD1GgV}@_nEJBw?aVh9X`$L&a0vE_ z#te8;v{Bbls~Yx(!M#*Ir{S4TCKIhq^1tc#-s5;#ljq#u3SP%Q);I7v3$341h)0p) zuaB*M26aP4B`48@k(+IQSTI4jR|?^!n$e<6OO=Qw=g&%2PU;q+KWq7Pd{TONB9}#Q zt)O*5J0JKk1BXwXX?pRc-{e8S7abKD1{{r0$zC9& zj}w2tby4@pS0(MW7OsH2!b0Rz|6f`c?uur zl?}mz*ekUQ{oVuZNsMvak3z1G5@~GAyBrLt2mKEDf?Y-(GH9c|?l&`(@|V?R!DvtK zt69(itIKQPb8CIVg}g_vu8~G6=PWtUp%O$MKxV~b@xsQ_Pcb*!iY<;_^^XR@$V1IqqsY(W9=l&lUrfYiersR%O#D zd>TExg2`41H?SkZGU2H^(`~9wbb@dB%QM?*mc<#>_WYE-t`cN=NmTAn#;ad}4PhH! zSf9$SPy5Q4pBn_tF!}r`81;+qMM-xzPe=K@9L(g{7vf(&vk;iSAJJr+QXA4p$8TKw zGoZm5*{F8CfNXbLAVJnAI_3hE4JJVYc~Vtd;W3-8Zk}}e(%V)rc_F6R#fEWA6|UHT zcs+iZ?m3lx^0{%3DB_m)%t=3KY`2BoVogwm2lp{sqW9p3qdh7Uz`%3b*VqVOTu9eK z%}6zS&B~>+Dq+X12h>bRe~oO8O|(EfUk7a*$q%9FuNgnK>;4JAA=Z~Hjzvjd0Lw0q z4=ux#NX`&4yG9eONAxOS%o~r52MN1gvyR`*t#5@*u&6xxJLR{$i+mSWE>1dk*wYFdbwuh^ORq9%{!5e(fw5d39_ z?jHA4^3z-{0hdsD63NqAYv1!Ea=!EAu*~Qs2br({W3GB*vGRDNuog86OD*t77x@U; zE-wp`e>laf?Fw@LaU`FSvcG>HNWDWSaw4QFMjzpZJUD)-G(-OopU}fBW^{U zS`ivd`LO%LJ}4=wV^YcR#jou%@{=#`huP<+i5Jqz+p8~{HC>D}W6JX0hkxCAKYC%D zV|3pH;?`G&+%G%(f*iir(#HF~*iBYGCI>zo1urVw^?F==>?i!0Gg+g8j!J4-q%38z zWJQE4&OIXXQI=I0_t_1erhdwu@Qc}hKc9hl!>*LF%8Q)&ysRS%f&QPGmCA;JQq^V1 z%_I9hs;!u;t5H>gQ!Fb75h*^n_fTRVBrmKwJl1Ea-o0B;dJ1En>l0K-9-y2(DYOcX zJYl9Bq-RD#Nljq@snDFpLdIKvPWzV?q;@8{3kez};E;brA<<9Z4az zkdRK7UTAmH{lj-g)FC};!-WhU4uHV3ahp6{Wg!P!I45nMtMko_U%7yya#A3VQYscd zmbjsv=fD;h+#$g2Qs(~gBc%8dAAM>)6a}X`UsAz@2yz(jWi*~YYfoReoI&Bfbi&JucL)PQbWv$>nYKh;=C)H7i&E zYdMb1h!uUc0WzPF@XiUq4#u2CcWdvisuh+K_#wiPJdbe%68&@C+bdfjy-Kl(tQ zD#QUJ-`AM4j?O=nSb|3Ggv-W72)K){+k#q?)?fFT<6A*+-DXBf)P_W(E_`>-@qbL<;`P34t-5!6GYP`LrrU@EII&7h& zY1euCy3QZvbuh2&<1_Z|*SkN!bScs)FDSd%H;kW$cwc<9vjE!8DH2r-Ok+nkYn#Oh zFKZ`TdsQ|E#u~1`8)^yHj@^_Z4vVBoCLa`%?BRQ4kVkYeDW(5Ju^W?nlsD~btGa+( z^vMGh^K%*Lu6o`I#mzwI<+78!c!7)~^;%dKw%|HZz(b9po_gg+)&4~XdNkR!g= zhxeo|h_6kE47S=s;N>{^U0SOp|9xCOh@`7SETEtDi7qyiu0&Tq64=kd4X8k2CI6*B+vvl*>T+-#@$fSCJs7GG7D@3@o#` zAlLUCwbyf~bkI+$Aay!YSIwv^ocv?u#D2PPD9VOb0S(SM?qlMDVx_TxV%!}x7mA;( z*B5d^%n%x@WZx}0|FXh>WaH-hm?y19UzW~iolI}T!75keMjb5X$d~#2VRhNtluRt< zGa+nb&Pg}ZId>Gl@%UEk(l*(Rky;|a?Q5(xw5Hi5RBaJt}#rVvuzIpGQ<(U{+O^WC@r@;H;u8DE(LaXzH;m95?re64$ z-N+;UE@bkSKJzGjCE<5WIFS6lVl6b<7KJ3P$(k~nbB7kELT&eVgsL$%7PXgEtY*_+ zbGp9uk4T63)3+^6r&F#cW_Y{dYhCar5QRGO5^s{9#j^Hpf@shNb7=qHKk1j4E%QHoRimxnBHmr0HU}{XoNj!I292ptRn-x z@iwl)D(P}#axqe}!;-!4Hezf%c;Xy}3&zTIF*3DUhv>*Ply|hv#@4&Xx(O_=ihL)d zNWJzMGhP1pLvCaBol|+UoVTO&!5i~oFhy_Y!6|$^gA%3 zJ^xMj)gnnH{mV=XO7vdWWf!7AbF3|_VT_dI=ArJ+<6Uq80K$-f99^5I=Tulh24Nhk z-O*M7HiErw&}9Xu>V{*2S(QcU25|?0Gj2L-Mb$m`u7LNYc~-o6>zqY1`!Yz5t$Acz z*{HK)<-`ooCgs!=wJ|-nE+WwLr|CdR=ob!t5gikeHq(vb?u(ftg8{zd?`dCJNw}qn zsL>X*O>805EX^?tM$DzgGXmhvQo>;dn~SNke2O?ReY&8p2R-MPY&@GFNEqzkQ?CnW zh>gUmlLc812G~tfL+A&-817Lvb|Jp;~=gH+Ck3~A< zJo@~}Ak2o+a*pVi&h=5aMO)Z?c-v|PTR&QW5+sJVO!#>b@#@+|ecTlmcNH1V=l6?k zAlkXHKg^yUpNTJa*(nsnaeUA?^|J5_dT%VOt$Y6s~Fz~1X`P;Y2cSkwot-; z)cM&lsQ>;sv30KH*KJ+&nbEiUDwJN!rpfor#sO7qh6g@OZS%#3uHR#L{bB9A3aa|0 z&JkO9p>HzTm+eruwWTmTwoZRRfmgfh&E5;0-};8NjjpPVXh~FZWMM8Ssm`~3Uk~0{ zP7;CM^qJPJh7&7UEzbozbKMW=+#kj370)MNlt1mREXh<+od>PQ#5PUdo?$~|Pb*|O z=5!BftOhdIezXvT1FlrT8Ol*D{j)l_C?|X?1)Entb<;O}t-xtkL7N;gMYzi~oIllf zMp#$jj;@geUT8BXq8*&AX$_ZPBOY$zG h|MhbGmun;5&C@x2m6Pp3mOL3!P)84Njs3->KLNZ4FPZ=V literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/fillet1.png b/doc/salome/gui/GEOM/pics/fillet1.png new file mode 100755 index 0000000000000000000000000000000000000000..7fd3db53f71f6be1e357bb2efbb76b23569a0897 GIT binary patch literal 12606 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 Tqgn8WX%J~id5J(H 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 E0+_X_asU7T literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/pics/fillet_all.png b/doc/salome/gui/GEOM/pics/fillet_all.png new file mode 100755 index 0000000000000000000000000000000000000000..c1650b907f48c57a31f57c3379e68d83d4693fab GIT binary patch literal 12664 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