From 7d2fc6b422963767d49bab8c74d226342a856f27 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 18 Jan 2013 11:52:16 +0000 Subject: [PATCH] Mantis issue 0021394: EDF 1637 GEOM: Function 'MinDistance' with creation of vertices --- doc/salome/gui/GEOM/images/distance.png | Bin 16262 -> 21548 bytes doc/salome/gui/GEOM/input/min_distance.doc | 10 +- .../gui/GEOM/input/tui_min_distance.doc | 50 +++- src/DlgRef/DlgRef.cxx | 42 ---- src/DlgRef/DlgRef.h | 48 ---- src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui | 211 ---------------- src/DlgRef/DlgRef_1Sel4Spin_QTD.ui | 214 ---------------- src/DlgRef/DlgRef_1Sel5Spin_QTD.ui | 232 ----------------- src/DlgRef/Makefile.am | 3 - src/GEOMGUI/GEOM_msg_en.ts | 8 + src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 142 ++++++++--- src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 4 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 25 +- src/GEOM_SWIG/GEOM_TestMeasures.py | 10 + src/GEOM_SWIG/geompyDC.py | 22 ++ src/MeasureGUI/Makefile.am | 2 - .../MeasureGUI_2Sel4LineEdit_QTD.ui | 189 -------------- src/MeasureGUI/MeasureGUI_DistanceDlg.cxx | 234 +++++++++++++----- src/MeasureGUI/MeasureGUI_DistanceDlg.h | 58 ++++- src/MeasureGUI/MeasureGUI_Widgets.cxx | 17 +- src/MeasureGUI/MeasureGUI_Widgets.h | 19 +- 21 files changed, 444 insertions(+), 1096 deletions(-) delete mode 100644 src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui delete mode 100644 src/DlgRef/DlgRef_1Sel4Spin_QTD.ui delete mode 100644 src/DlgRef/DlgRef_1Sel5Spin_QTD.ui delete mode 100644 src/MeasureGUI/MeasureGUI_2Sel4LineEdit_QTD.ui diff --git a/doc/salome/gui/GEOM/images/distance.png b/doc/salome/gui/GEOM/images/distance.png index 594bef905b8b4726328375860e8d3c766bd34d80..31fa829fdea01f24fa2138e7e6ec97b3dbdcb7a4 100755 GIT binary patch literal 21548 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 literal 16262 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 Command: geompy.MinDistance(Shape1, Shape2), +\n On \b Apply or Apply and Close it creates a set of closest +points of the shapes. + +TUI Commands: +\naDist = geompy.MinDistance(Shape1, Shape2), +\n[aDist, DX, DY, DZ] = geompy.MinDistanceComponents(Shape1, Shape2), +\n[nbSols, (x11, y11, z11, x21, y21, z21, ...)] = geompy.ClosestPoints(Shape1, Shape2), where \em Shape1 and \em Shape2 are shapes between which the minimal distance is computed. @@ -13,4 +19,4 @@ See also a \ref tui_min_distance_page "TUI example". \image html distance.png -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/GEOM/input/tui_min_distance.doc b/doc/salome/gui/GEOM/input/tui_min_distance.doc index e26e219f9..6afa6abd6 100644 --- a/doc/salome/gui/GEOM/input/tui_min_distance.doc +++ b/doc/salome/gui/GEOM/input/tui_min_distance.doc @@ -5,11 +5,51 @@ \code 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 +# Create two curves with three closest points +Vertex_1 = geompy.MakeVertex(0, 0, 0) +Vertex_2 = geompy.MakeVertex(0, 70, 0) +Vertex_3 = geompy.MakeVertex(30, 100, 0) +Vertex_4 = geompy.MakeVertex(60, 70, 0) +Vertex_5 = geompy.MakeVertex(90, 100, 0) +Vertex_6 = geompy.MakeVertex(120, 70, 0) +Vertex_7 = geompy.MakeVertex(120, 0, 0) +Vertex_8 = geompy.MakeVertex(90, -30, 0) +Vertex_9 = geompy.MakeVertex(60, 0, 0) +Vertex_10 = geompy.MakeVertex(30, -30, 0) + +geompy.addToStudy( Vertex_1, 'Vertex_1' ) +geompy.addToStudy( Vertex_2, 'Vertex_2' ) +geompy.addToStudy( Vertex_3, 'Vertex_3' ) +geompy.addToStudy( Vertex_4, 'Vertex_4' ) +geompy.addToStudy( Vertex_5, 'Vertex_5' ) +geompy.addToStudy( Vertex_6, 'Vertex_6' ) +geompy.addToStudy( Vertex_7, 'Vertex_7' ) +geompy.addToStudy( Vertex_8, 'Vertex_8' ) +geompy.addToStudy( Vertex_9, 'Vertex_9' ) +geompy.addToStudy( Vertex_10, 'Vertex_10' ) + +Curve_a = geompy.MakeInterpol([Vertex_2, Vertex_3, Vertex_4, Vertex_5, Vertex_6], False, True) +Curve_b = geompy.MakeInterpol([Vertex_1, Vertex_7, Vertex_8, Vertex_9, Vertex_10], False, True) + +geompy.addToStudy( Curve_a, 'Curve_a' ) +geompy.addToStudy( Curve_b, 'Curve_b' ) + +# Get all closest points +[nbSols, listCoords] = geompy.ClosestPoints(Curve_a, Curve_b) + +for i in range(nbSols): + v1 = geompy.MakeVertex(listCoords[i*6 + 0], listCoords[i*6 + 1], listCoords[i*6 + 2]) + v2 = geompy.MakeVertex(listCoords[i*6 + 3], listCoords[i*6 + 4], listCoords[i*6 + 5]) + + geompy.addToStudy(v1, 'MinDist_%d_Curve_a'%(i+1)) + geompy.addToStudy(v2, 'MinDist_%d_Curve_b'%(i+1)) + +# Get minimum distance +print "Minimal distance between Curve_a and Curve_b is", geompy.MinDistance(Curve_a, Curve_b) + +# Get minimum distance with components along axes +[aDist, DX, DY, DZ] = geompy.MinDistanceComponents(Curve_a, Curve_b) +print "Minimal distance between Curve_a and Curve_b is (", DX, ",", DY, ",", DZ, ")" \endcode */ diff --git a/src/DlgRef/DlgRef.cxx b/src/DlgRef/DlgRef.cxx index 01be686b6..a7a551f60 100644 --- a/src/DlgRef/DlgRef.cxx +++ b/src/DlgRef/DlgRef.cxx @@ -217,34 +217,6 @@ DlgRef_1Sel3Spin1Check::~DlgRef_1Sel3Spin1Check() { } -////////////////////////////////////////// -// DlgRef_1Sel4Spin2Check -////////////////////////////////////////// - -DlgRef_1Sel4Spin2Check::DlgRef_1Sel4Spin2Check( QWidget* parent, Qt::WindowFlags f ) -: QWidget( parent, f ) -{ - setupUi( this ); -} - -DlgRef_1Sel4Spin2Check::~DlgRef_1Sel4Spin2Check() -{ -} - -////////////////////////////////////////// -// DlgRef_1Sel4Spin -////////////////////////////////////////// - -DlgRef_1Sel4Spin::DlgRef_1Sel4Spin( QWidget* parent, Qt::WindowFlags f ) -: QWidget( parent, f ) -{ - setupUi( this ); -} - -DlgRef_1Sel4Spin::~DlgRef_1Sel4Spin() -{ -} - ////////////////////////////////////////// // DlgRef_1Sel5Spin1Check ////////////////////////////////////////// @@ -259,20 +231,6 @@ DlgRef_1Sel5Spin1Check::~DlgRef_1Sel5Spin1Check() { } -////////////////////////////////////////// -// DlgRef_1Sel5Spin -////////////////////////////////////////// - -DlgRef_1Sel5Spin::DlgRef_1Sel5Spin( QWidget* parent, Qt::WindowFlags f ) -: QWidget( parent, f ) -{ - setupUi( this ); -} - -DlgRef_1Sel5Spin::~DlgRef_1Sel5Spin() -{ -} - ////////////////////////////////////////// // DlgRef_1Spin ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef.h b/src/DlgRef/DlgRef.h index bb707a511..b727e96ec 100644 --- a/src/DlgRef/DlgRef.h +++ b/src/DlgRef/DlgRef.h @@ -258,38 +258,6 @@ public: ~DlgRef_1Sel3Spin1Check(); }; -////////////////////////////////////////// -// DlgRef_1Sel4Spin2Check -////////////////////////////////////////// - -#include "ui_DlgRef_1Sel4Spin2Check_QTD.h" - -class DLGREF_EXPORT DlgRef_1Sel4Spin2Check : public QWidget, - public Ui::DlgRef_1Sel4Spin2Check_QTD -{ - Q_OBJECT - -public: - DlgRef_1Sel4Spin2Check( QWidget* = 0, Qt::WindowFlags = 0 ); - ~DlgRef_1Sel4Spin2Check(); -}; - -////////////////////////////////////////// -// DlgRef_1Sel4Spin -////////////////////////////////////////// - -#include "ui_DlgRef_1Sel4Spin_QTD.h" - -class DLGREF_EXPORT DlgRef_1Sel4Spin : public QWidget, - public Ui::DlgRef_1Sel4Spin_QTD -{ - Q_OBJECT - -public: - DlgRef_1Sel4Spin( QWidget* = 0, Qt::WindowFlags = 0 ); - ~DlgRef_1Sel4Spin(); -}; - ////////////////////////////////////////// // DlgRef_1Sel5Spin1Check ////////////////////////////////////////// @@ -306,22 +274,6 @@ public: ~DlgRef_1Sel5Spin1Check(); }; -////////////////////////////////////////// -// DlgRef_1Sel5Spin -////////////////////////////////////////// - -#include "ui_DlgRef_1Sel5Spin_QTD.h" - -class DLGREF_EXPORT DlgRef_1Sel5Spin : public QWidget, - public Ui::DlgRef_1Sel5Spin_QTD -{ - Q_OBJECT - -public: - DlgRef_1Sel5Spin( QWidget* = 0, Qt::WindowFlags = 0 ); - ~DlgRef_1Sel5Spin(); -}; - ////////////////////////////////////////// // DlgRef_1Spin ////////////////////////////////////////// diff --git a/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui b/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui deleted file mode 100644 index a6c6a6391..000000000 --- a/src/DlgRef/DlgRef_1Sel4Spin2Check_QTD.ui +++ /dev/null @@ -1,211 +0,0 @@ - - DlgRef_1Sel4Spin2Check_QTD - - - - 0 - 0 - 156 - 120 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - 6 - - - - - - - - - 9 - - - 9 - - - 9 - - - 9 - - - 6 - - - 6 - - - - - - 0 - 0 - - - - TL1 - - - false - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - - 0 - 0 - - - - TL2 - - - false - - - - - - - - - - - - 0 - 0 - - - - TL3 - - - false - - - - - - - - - - - - 0 - 0 - - - - TL4 - - - false - - - - - - - - - - - - 0 - 0 - - - - TL5 - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - qPixmapFromMimeSource - - - SalomeApp_DoubleSpinBox - QDoubleSpinBox -
SalomeApp_DoubleSpinBox.h
-
-
- - PushButton1 - LineEdit1 - SpinBox_DX - SpinBox_DY - SpinBox_DZ - SpinBox_SC - CheckBox1 - CheckBox2 - - - -
diff --git a/src/DlgRef/DlgRef_1Sel4Spin_QTD.ui b/src/DlgRef/DlgRef_1Sel4Spin_QTD.ui deleted file mode 100644 index 43cbcba2b..000000000 --- a/src/DlgRef/DlgRef_1Sel4Spin_QTD.ui +++ /dev/null @@ -1,214 +0,0 @@ - - DlgRef_1Sel4Spin_QTD - - - - 0 - 0 - 271 - 117 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - 6 - - - - - - - - - 9 - - - 9 - - - 9 - - - 9 - - - 6 - - - 6 - - - - - - 0 - 0 - - - - TL6 - - - false - - - - - - - - - - - - - - 6 - - - 9 - - - 9 - - - 9 - - - 9 - - - - - - 0 - 0 - - - - TL3 - - - false - - - - - - - - - - - 0 - 0 - - - - TL4 - - - false - - - - - - - - - - - 0 - 0 - - - - TL5 - - - false - - - - - - - - - - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - TL1 - - - false - - - - - - - - - - qPixmapFromMimeSource - - - SalomeApp_DoubleSpinBox - QDoubleSpinBox -
SalomeApp_DoubleSpinBox.h
-
-
- - PushButton1 - LineEdit1 - SpinBox_DX - SpinBox_DY - SpinBox_DZ - SpinBox_S - - - -
diff --git a/src/DlgRef/DlgRef_1Sel5Spin_QTD.ui b/src/DlgRef/DlgRef_1Sel5Spin_QTD.ui deleted file mode 100644 index 1b945b5a8..000000000 --- a/src/DlgRef/DlgRef_1Sel5Spin_QTD.ui +++ /dev/null @@ -1,232 +0,0 @@ - - DlgRef_1Sel5Spin_QTD - - - - 0 - 0 - 174 - 123 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - 9 - - - 9 - - - 9 - - - 9 - - - 6 - - - 6 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - 6 - - - - - - 0 - 0 - - - - TL4 - - - false - - - - - - - - 0 - 0 - - - - TL3 - - - false - - - - - - - - - - - 0 - 0 - - - - TL2 - - - false - - - - - - - - - - - 0 - 0 - - - - TL6 - - - false - - - - - - - - - - - - - - - - - 0 - 0 - - - - TL5 - - - false - - - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - TL1 - - - false - - - - - - - - - - - - - qPixmapFromMimeSource - - - SalomeApp_DoubleSpinBox - QDoubleSpinBox -
SalomeApp_DoubleSpinBox.h
-
-
- - PushButton1 - LineEdit1 - SpinBox1 - SpinBox2 - SpinBox4 - SpinBox5 - SpinBox3 - - - -
diff --git a/src/DlgRef/Makefile.am b/src/DlgRef/Makefile.am index 3e5d05b63..681636166 100644 --- a/src/DlgRef/Makefile.am +++ b/src/DlgRef/Makefile.am @@ -48,10 +48,7 @@ UIC_FILES = \ ui_DlgRef_1Sel3Spin_QTD.h \ ui_DlgRef_1Sel3Spin1Check_QTD.h \ ui_DlgRef_1Sel3Spin2Check1Spin_QTD.h \ - ui_DlgRef_1Sel4Spin2Check_QTD.h \ - ui_DlgRef_1Sel4Spin_QTD.h \ ui_DlgRef_1Sel5Spin1Check_QTD.h \ - ui_DlgRef_1Sel5Spin_QTD.h \ ui_DlgRef_1Sel_QTD.h \ ui_DlgRef_1SelExt_QTD.h \ ui_DlgRef_1Spin_QTD.h \ diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index c0ec2c792..8b0e0e82c 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -1082,6 +1082,10 @@ Please, select face, shell or solid and try again GEOM_MINDIST_TITLE Minimun Distance Between Two Objects + + GEOM_MINDIST_NAME + MinDist + GEOM_MIRROR Mirror @@ -1202,6 +1206,10 @@ Please, select face, shell or solid and try again GEOM_SOURCE_OBJECT Source vertex, edge or wire + + GEOM_SOLUTION + Solution : + GEOM_TARGET_OBJECT Target face diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 6f4194500..b81e5c7ab 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -1542,6 +1542,36 @@ TCollection_AsciiString GEOMImpl_IMeasureOperations::WhatIs (Handle(GEOM_Object) return Astr; } +//============================================================================= +/*! + * AreCoordsInside + */ +//============================================================================= +std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, + const std::vector& coords, + double tolerance) +{ + std::vector res; + if (!theShape.IsNull()) { + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (!aRefShape.IsNull()) { + TopoDS_Shape aShape = aRefShape->GetValue(); + if (!aShape.IsNull()) { + BRepClass3d_SolidClassifier SC(aShape); + unsigned int nb_points = coords.size()/3; + for (int i = 0; i < nb_points; i++) { + double x = coords[3*i]; + double y = coords[3*i+1]; + double z = coords[3*i+2]; + gp_Pnt aPnt(x, y, z); + SC.Perform(aPnt, tolerance); + res.push_back( ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ) ); + } + } + } + } + return res; +} //======================================================================= //function : CheckSingularCase @@ -1845,38 +1875,6 @@ static bool CheckSingularCase(const TopoDS_Shape& aSh1, } */ - -//============================================================================= -/*! - * AreCoordsInside - */ -//============================================================================= -std::vector GEOMImpl_IMeasureOperations::AreCoordsInside(Handle(GEOM_Object) theShape, - const std::vector& coords, - double tolerance) -{ - std::vector res; - if (!theShape.IsNull()) { - Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); - if (!aRefShape.IsNull()) { - TopoDS_Shape aShape = aRefShape->GetValue(); - if (!aShape.IsNull()) { - BRepClass3d_SolidClassifier SC(aShape); - unsigned int nb_points = coords.size()/3; - for (int i = 0; i < nb_points; i++) { - double x = coords[3*i]; - double y = coords[3*i+1]; - double z = coords[3*i+2]; - gp_Pnt aPnt(x, y, z); - SC.Perform(aPnt, tolerance); - res.push_back( ( SC.State() == TopAbs_IN ) || ( SC.State() == TopAbs_ON ) ); - } - } - } - } - return res; -} - //============================================================================= /*! * GetMinDistance @@ -1941,7 +1939,7 @@ Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance // additional workaround for bugs 19899, 19908 and 19910 from Mantis gp_Pnt Ptmp1, Ptmp2; double dist = CheckSingularCase(aShape1, aShape2, Ptmp1, Ptmp2); - if(dist>-1.0) { + if (dist > -1.0) { Ptmp1.Coord(X1, Y1, Z1); Ptmp2.Coord(X2, Y2, Z2); SetErrorCode(OK); @@ -1978,6 +1976,84 @@ Standard_Real GEOMImpl_IMeasureOperations::GetMinDistance return MinDist; } +//======================================================================= +/*! + * Get coordinates of closest points of two shapes + */ +//======================================================================= +Standard_Integer GEOMImpl_IMeasureOperations::ClosestPoints (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + Handle(TColStd_HSequenceOfReal)& theDoubles) +{ + SetErrorCode(KO); + Standard_Integer nbSolutions = 0; + + if (theShape1.IsNull() || theShape2.IsNull()) return nbSolutions; + + Handle(GEOM_Function) aRefShape1 = theShape1->GetLastFunction(); + Handle(GEOM_Function) aRefShape2 = theShape2->GetLastFunction(); + if (aRefShape1.IsNull() || aRefShape2.IsNull()) return nbSolutions; + + TopoDS_Shape aShape1 = aRefShape1->GetValue(); + TopoDS_Shape aShape2 = aRefShape2->GetValue(); + if (aShape1.IsNull() || aShape2.IsNull()) { + SetErrorCode("One of Objects has NULL Shape"); + return nbSolutions; + } + + // Compute the extremities + try { +#if OCC_VERSION_LARGE > 0x06010000 + OCC_CATCH_SIGNALS; +#endif + + // skl 30.06.2008 + // additional workaround for bugs 19899, 19908 and 19910 from Mantis + gp_Pnt P1, P2; + double dist = CheckSingularCase(aShape1, aShape2, P1, P2); + if (dist > -1.0) { + nbSolutions = 1; + + theDoubles->Append(P1.X()); + theDoubles->Append(P1.Y()); + theDoubles->Append(P1.Z()); + theDoubles->Append(P2.X()); + theDoubles->Append(P2.Y()); + theDoubles->Append(P2.Z()); + + SetErrorCode(OK); + return nbSolutions; + } + + BRepExtrema_DistShapeShape dst (aShape1, aShape2); + if (dst.IsDone()) { + nbSolutions = dst.NbSolution(); + if (theDoubles.IsNull()) theDoubles = new TColStd_HSequenceOfReal; + + gp_Pnt P1, P2; + for (int i = 1; i <= nbSolutions; i++) { + P1 = dst.PointOnShape1(i); + P2 = dst.PointOnShape2(i); + + theDoubles->Append(P1.X()); + theDoubles->Append(P1.Y()); + theDoubles->Append(P1.Z()); + theDoubles->Append(P2.X()); + theDoubles->Append(P2.Y()); + theDoubles->Append(P2.Z()); + } + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return nbSolutions; + } + + SetErrorCode(OK); + return nbSolutions; +} + //======================================================================= /*! * Get coordinates of point diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index eff6fdaca..1a9071838 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -144,6 +144,10 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Standard_Real& X1, Standard_Real& Y1, Standard_Real& Z1, Standard_Real& X2, Standard_Real& Y2, Standard_Real& Z2); + Standard_EXPORT Standard_Integer ClosestPoints (Handle(GEOM_Object) theShape1, + Handle(GEOM_Object) theShape2, + Handle(TColStd_HSequenceOfReal)& theDoubles); + Standard_EXPORT void PointCoordinates (Handle(GEOM_Object) theShape, Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ); diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index 257822004..b6132132c 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -531,7 +531,7 @@ CORBA::Long GEOM_IMeasureOperations_i::ClosestPoints GetOperations()->SetNotDone(); // allocate the CORBA array - int nbSols = -1; + int nbSols = 0; GEOM::ListOfDouble_var aDoublesArray = new GEOM::ListOfDouble(); //Get the reference shape @@ -541,23 +541,12 @@ CORBA::Long GEOM_IMeasureOperations_i::ClosestPoints if (!aShape1.IsNull() && !aShape2.IsNull()) { Handle(TColStd_HSequenceOfReal) aDoubles = new TColStd_HSequenceOfReal; // Get shape parameters - //nbSols = GetOperations()->ClosestPoints(aShape1, aShape2, aDoubles); - //int nbDbls = aDoubles->Length(); - //aDoublesArray->length(nbDbls); - //for (int id = 0; id < nbDbls; id++) { - // aDoublesArray[id] = aDoubles->Value(id + 1); - //} - // tmp - double X1, Y1, Z1, X2, Y2, Z2; - GetOperations()->GetMinDistance(aShape1, aShape2, X1, Y1, Z1, X2, Y2, Z2); - aDoublesArray->length(6); - aDoublesArray[0] = X1; - aDoublesArray[1] = Y1; - aDoublesArray[2] = Z1; - aDoublesArray[3] = X2; - aDoublesArray[4] = Y2; - aDoublesArray[5] = Z2; - nbSols = 1; + nbSols = GetOperations()->ClosestPoints(aShape1, aShape2, aDoubles); + int nbDbls = aDoubles->Length(); + aDoublesArray->length(nbDbls); + for (int id = 0; id < nbDbls; id++) { + aDoublesArray[id] = aDoubles->Value(id + 1); + } } theCoords = aDoublesArray._retn(); diff --git a/src/GEOM_SWIG/GEOM_TestMeasures.py b/src/GEOM_SWIG/GEOM_TestMeasures.py index ea9e31c86..cd9c07dd0 100644 --- a/src/GEOM_SWIG/GEOM_TestMeasures.py +++ b/src/GEOM_SWIG/GEOM_TestMeasures.py @@ -164,6 +164,16 @@ def TestMeasureOperations (geompy, math): print "\nMinimal distance between Box and Cube = ", MinDistComps[0] print "Its components are (", MinDistComps[1], ", ", MinDistComps[2], ", ", MinDistComps[3], ")" + # Get all closest points + [nbSols, listCoords] = geompy.ClosestPoints(box, cube) + for i in range(nbSols): + v1 = geompy.MakeVertex(listCoords[i*6 + 0], listCoords[i*6 + 1], listCoords[i*6 + 2]) + v2 = geompy.MakeVertex(listCoords[i*6 + 3], listCoords[i*6 + 4], listCoords[i*6 + 5]) + + geompy.addToStudy(v1, 'MinDist_%d_on_Box'%(i+1)) + geompy.addToStudy(v2, 'MinDist_%d_on_Cube'%(i+1)) + pass + ####### Angle ####### OX = geompy.MakeVectorDXDYDZ(10, 0,0) diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 9d750572a..0dc6009ef 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -8878,6 +8878,28 @@ class geompyDC(GEOM._objref_GEOM_Gen): aRes = [aTuple[0], aTuple[4] - aTuple[1], aTuple[5] - aTuple[2], aTuple[6] - aTuple[3]] return aRes + ## Get closest points of the given shapes. + # @param theShape1,theShape2 Shapes to find closest points of. + # @return The number of found solutions (-1 in case of infinite number of + # solutions) and a list of (X, Y, Z) coordinates for all couples of points. + # + # @ref tui_measurement_tools_page "Example" + def ClosestPoints (self, theShape1, theShape2): + """ + Get closest points of the given shapes. + + Parameters: + theShape1,theShape2 Shapes to find closest points of. + + Returns: + The number of found solutions (-1 in case of infinite number of + solutions) and a list of (X, Y, Z) coordinates for all couples of points. + """ + # Example: see GEOM_TestMeasures.py + aTuple = self.MeasuOp.ClosestPoints(theShape1, theShape2) + RaiseIfFailed("ClosestPoints", self.MeasuOp) + return aTuple + ## Get angle between the given shapes in degrees. # @param theShape1,theShape2 Lines or linear edges to find angle between. # @note If both arguments are vectors, the angle is computed in accordance diff --git a/src/MeasureGUI/Makefile.am b/src/MeasureGUI/Makefile.am index 55cfcf7a5..c739ca76b 100644 --- a/src/MeasureGUI/Makefile.am +++ b/src/MeasureGUI/Makefile.am @@ -15,7 +15,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# # GEOM MEASUREGUI : # File : Makefile.am @@ -95,7 +94,6 @@ UIC_FILES = \ ui_MeasureGUI_1Sel3LineEdit_QTD.h \ ui_MeasureGUI_1Sel6LineEdit_QTD.h \ ui_MeasureGUI_2Sel1LineEdit_QTD.h \ - ui_MeasureGUI_2Sel4LineEdit_QTD.h \ ui_MeasureGUI_SkeletonBox_QTD.h BUILT_SOURCES = $(UIC_FILES) diff --git a/src/MeasureGUI/MeasureGUI_2Sel4LineEdit_QTD.ui b/src/MeasureGUI/MeasureGUI_2Sel4LineEdit_QTD.ui deleted file mode 100644 index d63fb5ab9..000000000 --- a/src/MeasureGUI/MeasureGUI_2Sel4LineEdit_QTD.ui +++ /dev/null @@ -1,189 +0,0 @@ - - MeasureGUI_2Sel4LineEdit_QTD - - - - 0 - 0 - 198 - 197 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - 0 - 0 - - - - TL1 - - - false - - - - - - - - 0 - 0 - - - - - - - - - 100 - 0 - - - - - - - - - 0 - 0 - - - - TL2 - - - false - - - - - - - - 0 - 0 - - - - - - - - - 100 - 0 - - - - - - - - - 0 - 0 - - - - TL3 - - - false - - - - - - - - - - - 0 - 0 - - - - TL4 - - - false - - - - - - - - - - - 0 - 0 - - - - TL5 - - - false - - - - - - - - - - - 0 - 0 - - - - TL6 - - - false - - - - - - - - - - - - - - diff --git a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx index d0d9fda91..8d670a9d0 100644 --- a/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_DistanceDlg.cxx @@ -77,19 +77,28 @@ MeasureGUI_DistanceDlg::MeasureGUI_DistanceDlg (GeometryGUI* GUI, QWidget* paren mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); - myGrp = new MeasureGUI_2Sel4LineEdit (centralWidget()); + mainFrame()->GroupBoxName->hide(); + + myGrp = new MeasureGUI_DistanceGroup (centralWidget()); myGrp->GroupBox1->setTitle(tr("GEOM_MINDIST_OBJ")); + + // Arguments myGrp->TextLabel1->setText(tr("GEOM_OBJECT_I").arg("1")); myGrp->TextLabel2->setText(tr("GEOM_OBJECT_I").arg("2")); + myGrp->PushButton1->setIcon(image1); + myGrp->PushButton2->setIcon(image1); + myGrp->LineEdit1->setReadOnly(true); + myGrp->LineEdit2->setReadOnly(true); + + // Solutions combobox + myGrp->TextLabel7->setText(tr("GEOM_SOLUTION")); + + // Distance, dx, dy and dz myGrp->TextLabel3->setText(tr("GEOM_LENGTH")); myGrp->TextLabel4->setText(tr("GEOM_DX")); myGrp->TextLabel5->setText(tr("GEOM_DY")); myGrp->TextLabel6->setText(tr("GEOM_DZ")); myGrp->LineEdit3->setReadOnly(true); - myGrp->PushButton1->setIcon(image1); - myGrp->PushButton2->setIcon(image1); - myGrp->LineEdit1->setReadOnly(true); - myGrp->LineEdit2->setReadOnly(true); myGrp->LineEdit4->setReadOnly(true); myGrp->LineEdit5->setReadOnly(true); myGrp->LineEdit6->setReadOnly(true); @@ -128,10 +137,11 @@ void MeasureGUI_DistanceDlg::Init() connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(myGrp->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(myGrp->ComboBox1, SIGNAL(currentIndexChanged(int)), this, SLOT(SolutionSelected(int))); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - initName(tr("GEOM_DISTANCE")); globalSelection(); SelectionIntoArgument(); } @@ -184,6 +194,38 @@ void MeasureGUI_DistanceDlg::enterEvent(QEvent*) ActivateThisDialog(); } +//================================================================================= +// function : SolutionSelected() +// purpose : Called when ComboBox selection has changed +//================================================================================= +void MeasureGUI_DistanceDlg::SolutionSelected (int i) +{ + if (i < 0 || myDbls->length() <= i*6) { + myGrp->LineEdit3->setText(""); + myGrp->LineEdit4->setText(""); + myGrp->LineEdit5->setText(""); + myGrp->LineEdit6->setText(""); + erasePreview(); + return; + } + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + + gp_Pnt p1 (myDbls[i*6 + 0], myDbls[i*6 + 1], myDbls[i*6 + 2]); + gp_Pnt p2 (myDbls[i*6 + 3], myDbls[i*6 + 4], myDbls[i*6 + 5]); + + double aDist = p1.Distance(p2); + myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist, aPrecision)); + + gp_XYZ aVec = p2.XYZ() - p1.XYZ(); + myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X(), aPrecision)); + myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y(), aPrecision)); + myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z(), aPrecision)); + + redisplayPreview(); +} + //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection has changed @@ -260,56 +302,29 @@ void MeasureGUI_DistanceDlg::processObject() myGrp->LineEdit1->setText(!myObj1->_is_nil() ? GEOMBase::GetName(myObj1) : ""); myGrp->LineEdit2->setText(!myObj2->_is_nil() ? GEOMBase::GetName(myObj2) : ""); - gp_Pnt aPnt1, aPnt2; - double aDist = 0.; - if (getParameters(aDist, aPnt1, aPnt2)) { - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - int aPrecision = resMgr->integerValue( "Geometry", "length_precision", 6 ); + myGrp->ComboBox1->clear(); + erasePreview(); - myGrp->LineEdit3->setText(DlgRef::PrintDoubleValue(aDist, aPrecision)); + int nbSols = 0; - gp_XYZ aVec = aPnt2.XYZ() - aPnt1.XYZ(); - myGrp->LineEdit4->setText(DlgRef::PrintDoubleValue(aVec.X(), aPrecision)); - myGrp->LineEdit5->setText(DlgRef::PrintDoubleValue(aVec.Y(), aPrecision)); - myGrp->LineEdit6->setText(DlgRef::PrintDoubleValue(aVec.Z(), aPrecision)); + QString msg; + if (!isValid(msg)) return; - redisplayPreview(); + GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); + try { + nbSols = anOper->ClosestPoints(myObj1, myObj2, myDbls); } - else { - myGrp->LineEdit3->setText(""); - myGrp->LineEdit4->setText(""); - myGrp->LineEdit5->setText(""); - myGrp->LineEdit6->setText(""); - erasePreview(); + catch (const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + return; } -} -//================================================================================= -// function : getParameters() -// purpose : Get distance between objects -//================================================================================= -bool MeasureGUI_DistanceDlg::getParameters (double& theDistance, gp_Pnt& thePnt1, gp_Pnt& thePnt2) -{ - QString msg; - if (isValid(msg)) { - GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); - - try { - double x1, y1, z1, x2, y2, z2; - theDistance = anOper->GetMinDistance(myObj1, myObj2, x1, y1, z1, x2, y2, z2); - - thePnt1.SetCoord(x1, y1, z1); - thePnt2.SetCoord(x2, y2, z2); - } - catch (const SALOME::SALOME_Exception& e) { - SalomeApp_Tools::QtCatchCorbaException(e); - return false; + if (anOper->IsDone() && nbSols > 0) { + for (int i = 0; i < nbSols; i++) { + myGrp->ComboBox1->addItem(QString("Solution %1").arg(i + 1)); } - - return anOper->IsDone(); + myGrp->ComboBox1->setCurrentIndex(0); } - - return false; } //================================================================================= @@ -318,16 +333,19 @@ bool MeasureGUI_DistanceDlg::getParameters (double& theDistance, gp_Pnt& thePnt1 //================================================================================= SALOME_Prs* MeasureGUI_DistanceDlg::buildPrs() { - double aDist = 0.; - gp_Pnt aPnt1 (0, 0, 0), aPnt2 (0, 0, 0); - SUIT_ViewWindow* vw = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); - if (myObj1->_is_nil() || myObj2->_is_nil() || - !getParameters(aDist, aPnt1, aPnt2) || + int currSol = myGrp->ComboBox1->currentIndex(); + + if (myObj1->_is_nil() || myObj2->_is_nil() || currSol == -1 || vw->getViewManager()->getType() != OCCViewer_Viewer::Type()) return 0; + gp_Pnt aPnt1 (myDbls[currSol*6 + 0], myDbls[currSol*6 + 1], myDbls[currSol*6 + 2]); + gp_Pnt aPnt2 (myDbls[currSol*6 + 3], myDbls[currSol*6 + 4], myDbls[currSol*6 + 5]); + + double aDist = aPnt1.Distance(aPnt2); + try { if (aDist <= 1.e-9) { @@ -408,15 +426,19 @@ bool MeasureGUI_DistanceDlg::execute (ObjectList& objects) GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); GEOM::GEOM_IBasicOperations_var aBasicOper = getGeomEngine()->GetIBasicOperations(getStudyId()); - double x1, y1, z1, x2, y2, z2; - double aDist = anOper->GetMinDistance(myObj1, myObj2, x1, y1, z1, x2, y2, z2); + GEOM::ListOfDouble_var aDbls; + int nbSols = anOper->ClosestPoints(myObj1, myObj2, aDbls); - GEOM::GEOM_Object_var anObj1 = aBasicOper->MakePointXYZ(x1, y1, z1); - GEOM::GEOM_Object_var anObj2 = aBasicOper->MakePointXYZ(x2, y2, z2); + if (anOper->IsDone()) { + for (int i = 0; i < nbSols; i++) { + GEOM::GEOM_Object_var anObj1 = aBasicOper->MakePointXYZ(aDbls[i*6 + 0], aDbls[i*6 + 1], aDbls[i*6 + 2]); + GEOM::GEOM_Object_var anObj2 = aBasicOper->MakePointXYZ(aDbls[i*6 + 3], aDbls[i*6 + 4], aDbls[i*6 + 5]); - if (!anObj1->_is_nil() && !anObj2->_is_nil()) { - objects.push_back(anObj1._retn()); - objects.push_back(anObj2._retn()); + if (!anObj1->_is_nil() && !anObj2->_is_nil()) { + objects.push_back(anObj1._retn()); + objects.push_back(anObj2._retn()); + } + } } return true; @@ -449,3 +471,95 @@ void MeasureGUI_DistanceDlg::redisplayPreview() SalomeApp_Tools::QtCatchCorbaException(e); } } + +//================================================================ +// Function : getNewObjectName +// Purpose : Redefine this method to return proper name for a new object +//================================================================ +QString MeasureGUI_DistanceDlg::getNewObjectName (int currObj) const +{ + QString aName = tr("GEOM_MINDIST_NAME") + QString("_%1_").arg((currObj+1)/2); + aName += GEOMBase::GetName(currObj%2 ? myObj1 : myObj2); + + return aName; +} + +//================================================================================= +// function : MeasureGUI_DistanceGroup +// purpose : +//================================================================================= +MeasureGUI_DistanceGroup::MeasureGUI_DistanceGroup (QWidget *parent) +{ + gridLayout = new QGridLayout (parent); + gridLayout->setSpacing(6); + gridLayout->setContentsMargins(11, 11, 11, 11); + gridLayout->setHorizontalSpacing(0); + gridLayout->setVerticalSpacing(0); + gridLayout->setContentsMargins(0, 0, 0, 0); + + GroupBox1 = new QGroupBox (parent); + + gridLayout1 = new QGridLayout (GroupBox1); + gridLayout1->setSpacing(6); + gridLayout1->setContentsMargins(11, 11, 11, 11); + gridLayout1->setHorizontalSpacing(6); + gridLayout1->setVerticalSpacing(6); + gridLayout1->setContentsMargins(9, 9, 9, 9); + + // 2Sel + TextLabel1 = new QLabel(GroupBox1); + TextLabel2 = new QLabel(GroupBox1); + + PushButton1 = new QPushButton (GroupBox1); + PushButton2 = new QPushButton (GroupBox1); + + LineEdit1 = new QLineEdit(GroupBox1); + LineEdit2 = new QLineEdit(GroupBox1); + + gridLayout1->addWidget(TextLabel1, 0, 0, 1, 1); + gridLayout1->addWidget(TextLabel2, 1, 0, 1, 1); + gridLayout1->addWidget(PushButton1, 0, 1, 1, 1); + gridLayout1->addWidget(PushButton2, 1, 1, 1, 1); + gridLayout1->addWidget(LineEdit1, 0, 2, 1, 1); + gridLayout1->addWidget(LineEdit2, 1, 2, 1, 1); + + // 1Combo + TextLabel7 = new QLabel (GroupBox1); + + ComboBox1 = new QComboBox (GroupBox1); + + gridLayout1->addWidget(TextLabel7, 2, 0, 1, 1); + gridLayout1->addWidget(ComboBox1, 2, 1, 1, 2); + + // 4Text + TextLabel3 = new QLabel (GroupBox1); + TextLabel4 = new QLabel (GroupBox1); + TextLabel5 = new QLabel (GroupBox1); + TextLabel6 = new QLabel (GroupBox1); + + LineEdit3 = new QLineEdit(GroupBox1); + LineEdit4 = new QLineEdit(GroupBox1); + LineEdit5 = new QLineEdit(GroupBox1); + LineEdit6 = new QLineEdit(GroupBox1); + + gridLayout1->addWidget(TextLabel3, 3, 0, 1, 1); + gridLayout1->addWidget(TextLabel4, 4, 0, 1, 1); + gridLayout1->addWidget(TextLabel5, 5, 0, 1, 1); + gridLayout1->addWidget(TextLabel6, 6, 0, 1, 1); + + gridLayout1->addWidget(LineEdit3, 3, 1, 1, 2); + gridLayout1->addWidget(LineEdit4, 4, 1, 1, 2); + gridLayout1->addWidget(LineEdit5, 5, 1, 1, 2); + gridLayout1->addWidget(LineEdit6, 6, 1, 1, 2); + + gridLayout->addWidget(GroupBox1, 0, 0, 1, 1); +} + +//================================================================================= +// function : ~MeasureGUI_DistanceGroup() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +MeasureGUI_DistanceGroup::~MeasureGUI_DistanceGroup() +{ + // no need to delete child widgets, Qt does it all for us +} diff --git a/src/MeasureGUI/MeasureGUI_DistanceDlg.h b/src/MeasureGUI/MeasureGUI_DistanceDlg.h index 83a44272c..9f4c7992c 100644 --- a/src/MeasureGUI/MeasureGUI_DistanceDlg.h +++ b/src/MeasureGUI/MeasureGUI_DistanceDlg.h @@ -28,9 +28,59 @@ #include -class MeasureGUI_2Sel4LineEdit; +// IDL Headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +#include +#include +#include +#include +#include +#include + class gp_Pnt; +//================================================================================= +// class : MeasureGUI_DistanceGroup +// purpose : +//================================================================================= +class MeasureGUI_DistanceGroup : public QWidget +{ + Q_OBJECT + + public: + MeasureGUI_DistanceGroup (QWidget *parent); + ~MeasureGUI_DistanceGroup(); + + public: + QGridLayout *gridLayout; + QGroupBox *GroupBox1; + QGridLayout *gridLayout1; + + // 2Sel + QLabel *TextLabel1; + QLabel *TextLabel2; + QPushButton *PushButton1; + QPushButton *PushButton2; + QLineEdit *LineEdit1; + QLineEdit *LineEdit2; + + // 1Combo + QLabel *TextLabel7; + QComboBox *ComboBox1; + + // 4Text + QLabel *TextLabel3; + QLabel *TextLabel4; + QLabel *TextLabel5; + QLabel *TextLabel6; + QLineEdit *LineEdit3; + QLineEdit *LineEdit4; + QLineEdit *LineEdit5; + QLineEdit *LineEdit6; +}; + //================================================================================= // class : MeasureGUI_DistanceDlg // purpose : @@ -48,6 +98,7 @@ protected: virtual GEOM::GEOM_IOperations_ptr createOperation(); virtual bool isValid (QString&); virtual bool execute (ObjectList&); + virtual QString getNewObjectName (int CurrObj = -1) const; void redisplayPreview(); virtual void processObject(); @@ -56,13 +107,13 @@ protected: private: void Init(); void enterEvent (QEvent*); - bool getParameters (double&, gp_Pnt&, gp_Pnt&); private: GEOM::GEOM_Object_var myObj1; GEOM::GEOM_Object_var myObj2; - MeasureGUI_2Sel4LineEdit* myGrp; + MeasureGUI_DistanceGroup* myGrp; + GEOM::ListOfDouble_var myDbls; private slots: void ClickOnOk(); @@ -70,6 +121,7 @@ private slots: void ActivateThisDialog(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void SolutionSelected (int i); }; #endif // MEASUREGUI_DISTANCEDLG_H diff --git a/src/MeasureGUI/MeasureGUI_Widgets.cxx b/src/MeasureGUI/MeasureGUI_Widgets.cxx index 5cb2936fd..d9b93cf1e 100644 --- a/src/MeasureGUI/MeasureGUI_Widgets.cxx +++ b/src/MeasureGUI/MeasureGUI_Widgets.cxx @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : MeasureGUI_Widgets.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #include "MeasureGUI_Widgets.h" ////////////////////////////////////////// @@ -121,20 +120,6 @@ MeasureGUI_2Sel1LineEdit::~MeasureGUI_2Sel1LineEdit() { } -////////////////////////////////////////// -// MeasureGUI_2Sel4LineEdit -////////////////////////////////////////// - -MeasureGUI_2Sel4LineEdit::MeasureGUI_2Sel4LineEdit( QWidget* parent, Qt::WindowFlags f ) -: QWidget( parent, f ) -{ - setupUi( this ); -} - -MeasureGUI_2Sel4LineEdit::~MeasureGUI_2Sel4LineEdit() -{ -} - ////////////////////////////////////////// // MeasureGUI_SkeletonBox ////////////////////////////////////////// diff --git a/src/MeasureGUI/MeasureGUI_Widgets.h b/src/MeasureGUI/MeasureGUI_Widgets.h index 17067d067..651b65298 100644 --- a/src/MeasureGUI/MeasureGUI_Widgets.h +++ b/src/MeasureGUI/MeasureGUI_Widgets.h @@ -15,11 +15,10 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// // File : MeasureGUI_Widgets.h // Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) -// + #ifndef MEASUREGUI_WIDGETS_H #define MEASUREGUI_WIDGETS_H @@ -135,22 +134,6 @@ public: ~MeasureGUI_2Sel1LineEdit(); }; -////////////////////////////////////////// -// MeasureGUI_2Sel4LineEdit -////////////////////////////////////////// - -#include "ui_MeasureGUI_2Sel4LineEdit_QTD.h" - -class MeasureGUI_2Sel4LineEdit : public QWidget, - public Ui::MeasureGUI_2Sel4LineEdit_QTD -{ - Q_OBJECT - -public: - MeasureGUI_2Sel4LineEdit( QWidget* = 0, Qt::WindowFlags = 0 ); - ~MeasureGUI_2Sel4LineEdit(); -}; - ////////////////////////////////////////// // MeasureGUI_SkeletonBox ////////////////////////////////////////// -- 2.39.2