From 7319fe8043c84555c766cc6cf7f6585f89fe4d12 Mon Sep 17 00:00:00 2001 From: dmv Date: Tue, 19 Jan 2010 08:21:42 +0000 Subject: [PATCH] 0020660: EDF 1238 GEOM: Missing equivalent of 2nd contructor of LCS in TUI --- doc/salome/gui/GEOM/input/creating_lcs.doc | 9 +- .../gui/GEOM/input/tui_basic_geom_objs.doc | 41 ++++ idl/GEOM_Gen.idl | 16 ++ idl/GEOM_Superv.idl | 4 + src/BasicGUI/BasicGUI_MarkerDlg.cxx | 221 ++++++------------ src/BasicGUI/BasicGUI_MarkerDlg.h | 5 + src/GEOMImpl/GEOMImpl_IBasicOperations.cxx | 109 +++++++++ src/GEOMImpl/GEOMImpl_IBasicOperations.hxx | 6 + src/GEOMImpl/GEOMImpl_IMarker.hxx | 45 ++++ src/GEOMImpl/GEOMImpl_MarkerDriver.cxx | 43 ++++ src/GEOMImpl/GEOMImpl_Types.hxx | 4 +- src/GEOM_I/GEOM_IBasicOperations_i.cc | 56 +++++ src/GEOM_I/GEOM_IBasicOperations_i.hh | 4 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 28 +++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 6 + src/GEOM_SWIG/GEOM_TestAll.py | 4 + src/GEOM_SWIG/geompyDC.py | 39 ++-- 17 files changed, 461 insertions(+), 179 deletions(-) diff --git a/doc/salome/gui/GEOM/input/creating_lcs.doc b/doc/salome/gui/GEOM/input/creating_lcs.doc index 5f06f4ff3..2516af99d 100644 --- a/doc/salome/gui/GEOM/input/creating_lcs.doc +++ b/doc/salome/gui/GEOM/input/creating_lcs.doc @@ -17,6 +17,7 @@ YDY, YDZ is a a vector of OY direction of the LCS. \n Secondly, you can simply select any object in the object browser or 3D viewer, in this case the coordinates of origin and axes direction of the LCS are calculated automatically basing on the selected object. +\n TUI command: geompy.MakeMarkerFromShape(theShape). \n Arguments: Name + reference object. \image html neo-localcs2.png @@ -24,8 +25,10 @@ of the LCS are calculated automatically basing on the selected object. \n The last algorithm of LCS construction allows to define the coordinates of origin by a point and axes directions by a line or a vector. -\n Arguments: Name + 1 point of origin + X axis direction, Y -axis direction. +\n TUI command: geompy.MakeMarkerPntTwoVec(Center, VectorX, +VectorY) where Center is a point specified the coordinate system location, +VectorX is a derection of OX axis and VectorY direction of OY axis. +\n Arguments: Name + 1 point of origin + X axis direction, Y axis direction. \image html neo-localcs3.png @@ -37,4 +40,6 @@ and in 3D viewer. \image html image145.png "Local Coordinate System" +TUI Script provide you with useful example of creation of +\ref tui_creation_lcs "Local Coordinate System". */ \ No newline at end of file diff --git a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc index 34f782d45..5e1f73312 100644 --- a/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc @@ -345,4 +345,45 @@ gg.setDisplayMode(id_plane5,1) gg.setTransparency(id_plane5,0.5) \endcode +\anchor tui_creation_lcs +

Creation of a Local Coordinate System

+\code +import GEOM +import geompy +import math +import SALOMEDS + +#Create vertexes, vectors and shapes to construct local CS +Vertex_1 = geompy.MakeVertex(50, 50, 50) +Vertex_2 = geompy.MakeVertex(70, 70, 70) +Vertex_3 = geompy.MakeVertex(0, 0, 0) +Vector_X = geompy.MakeVectorDXDYDZ(50, 0, 0) +Vector_Y = geompy.MakeVectorDXDYDZ(0, 50, 0) +Face_1 = geompy.MakeFaceHW(100, 100, 1) +Box_1 = geompy.MakeBoxTwoPnt(Vertex_1, Vertex_2) + +#Construct local CS by manual definition +LocalCS_1 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0) + +#Construct local CS by center point and two vectors (X and Y directions) +LocalCS_2 = geompy.MakeMarkerPntTwoVec(Vertex_3, Vector_X, Vector_Y) + +#Construct local CS from shape orientation +LocalCS_FACE = geompy.MakeMarkerFromShape(Face_1) +LocalCS_BOX = geompy.MakeMarkerFromShape(Box_1) + +#Add created object to study +geompy.addToStudy( Face_1, "Face_1" ) +geompy.addToStudy( Vertex_1, "Vertex_1" ) +geompy.addToStudy( Vertex_2, "Vertex_2" ) +geompy.addToStudy( Box_1, "Box_1" ) +geompy.addToStudy( Vertex_3, "Vertex_3" ) +geompy.addToStudy( Vector_X, "Vector_X" ) +geompy.addToStudy( Vector_Y, "Vector_Y" ) +geompy.addToStudy( LocalCS_1, "LocalCS_1" ) +geompy.addToStudy( LocalCS_2, "LocalCS_3" ) +geompy.addToStudy( LocalCS_FACE, "LocalCS_FACE" ) +geompy.addToStudy( LocalCS_BOX, "LocalCS_BOX" ) +\endcode + */ diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 0763fb493..795212497 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -539,6 +539,22 @@ module GEOM in double theXDX, in double theXDY, in double theXDZ, in double theYDX, in double theYDY, in double theYDZ); + /*! + * Create a local coordinate system from shape. + * \param theShape The initial shape to detect the coordinate system. + * \return New GEOM_Object, containing the created coordinate system. + */ + GEOM_Object MakeMarkerFromShape (in GEOM_Object theShape); + + /*! + * Create a local coordinate system from point and two vectors (DX, DY). + * \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. + */ + GEOM_Object MakeMarkerPntTwoVec (in GEOM_Object theOrigin, in GEOM_Object theXVec, in GEOM_Object theYVec); + /*! * Create a tangent plane to specified face in the point with specified parameters. * Values of parameters should be between 0. and 1.0 diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 516f14110..a120304e3 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -103,6 +103,10 @@ module GEOM 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) ; + + GEOM_Object MakeMarkerFromShape (in GEOM_Object theShape) ; + + GEOM_Object MakeMarkerPntTwoVec (in GEOM_Object theOrigin, in GEOM_Object theXVec, in GEOM_Object theYVec) ; /*! * Create a tangent plane to specified face in the point with specified parameters. diff --git a/src/BasicGUI/BasicGUI_MarkerDlg.cxx b/src/BasicGUI/BasicGUI_MarkerDlg.cxx index 9bc0adf13..a24113d4e 100644 --- a/src/BasicGUI/BasicGUI_MarkerDlg.cxx +++ b/src/BasicGUI/BasicGUI_MarkerDlg.cxx @@ -167,6 +167,7 @@ BasicGUI_MarkerDlg::~BasicGUI_MarkerDlg() //================================================================================= void BasicGUI_MarkerDlg::Init() { + myShape = myPoint = myVectorX = myVectorY = GEOM::GEOM_Object::_nil(); myBlockPreview = false; myConstructorId = -1; myEditCurrentArgument = Group1->LineEdit1; @@ -218,24 +219,6 @@ void BasicGUI_MarkerDlg::Init() 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 ); - */ } //================================================================================= @@ -248,7 +231,6 @@ void BasicGUI_MarkerDlg::ConstructorsClicked( int constructorId ) globalSelection(); // close local contexts, if any localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); activate( GEOM_MARKER ); - displayPreview(); return; } @@ -276,6 +258,7 @@ void BasicGUI_MarkerDlg::ConstructorsClicked( int constructorId ) globalSelection( GEOM_ALLGEOM ); myEditCurrentArgument = Group1->LineEdit1; Group1->LineEdit1->setText( "" ); + myShape = GEOM::GEOM_Object::_nil(); break; } case 2: @@ -295,10 +278,15 @@ void BasicGUI_MarkerDlg::ConstructorsClicked( int constructorId ) Group2->LineEdit1->setEnabled( true ); Group2->LineEdit2->setEnabled( false ); Group2->LineEdit3->setEnabled( false ); + myPoint = GEOM::GEOM_Object::_nil(); + myVectorX = GEOM::GEOM_Object::_nil(); + myVectorY = GEOM::GEOM_Object::_nil(); break; } } + displayPreview(); + qApp->processEvents(); updateGeometry(); resize( minimumSizeHint() ); @@ -428,39 +416,9 @@ void BasicGUI_MarkerDlg::onSelectionDone() QString aName = GEOMBase::GetName( aSelectedObj ); if ( getConstructorId() == 1 ) { // by shape position - // Get shape's position - CORBA::Double Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz, Yx, Yy, Yz; - Ox = Oy = Oz = Zx = Zy = Xy = Xz = Yx = Yz = 0; - Zz = Xx = Yy = 1.; - - GEOM::GEOM_IMeasureOperations_ptr aMeasureOp = - myGeomGUI->GetGeomGen()->GetIMeasureOperations( getStudyId() ); - aMeasureOp->GetPosition( aSelectedObj, Ox, Oy, Oz, Zx, Zy, Zz, Xx, Xy, Xz ); - - // Calculate Y direction - if ( aMeasureOp->IsDone() ) { - gp_Pnt aPnt ( Ox, Oy, Oz ); - gp_Dir aDirN ( Zx, Zy, Zz ); - gp_Dir aDirX ( Xx, Xy, Xz ); - gp_Ax3 anAx3 ( aPnt, aDirN, aDirX ); - - gp_Dir aDirY = anAx3.YDirection(); - aDirY.Coord(Yx,Yy,Yz); - } - - // Set values - myData[ X ]->setValue( Ox ); - myData[ Y ]->setValue( Oy ); - myData[ Z ]->setValue( Oz ); - - myData[ DX1 ]->setValue( Xx ); - myData[ DY1 ]->setValue( Xy ); - myData[ DZ1 ]->setValue( Xz ); - - myData[ DX2 ]->setValue( Yx ); - myData[ DY2 ]->setValue( Yy ); - myData[ DZ2 ]->setValue( Yz ); - + TopoDS_Shape aShape; + if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) + myShape = aSelectedObj; myEditCurrentArgument->setText( aName ); } else if ( getConstructorId() == 2 ) { // by point and two vectors @@ -487,57 +445,27 @@ void BasicGUI_MarkerDlg::onSelectionDone() 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() ); + myPoint = aSelectedObj; myEditCurrentArgument->setText( aName ); if (Group2->LineEdit2->text() == "") Group2->PushButton2->click(); } - 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() ); + myVectorX = aSelectedObj; myEditCurrentArgument->setText( aName ); if (Group2->LineEdit3->text() == "") Group2->PushButton3->click(); } - 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() ); + myVectorY = aSelectedObj; myEditCurrentArgument->setText( aName ); if (Group2->LineEdit1->text() == "") Group2->PushButton1->click(); } - else { - myData[ DX2 ]->setValue( 0 ); - myData[ DY2 ]->setValue( 0 ); - myData[ DZ2 ]->setValue( 0 ); - } } } } @@ -545,34 +473,14 @@ void BasicGUI_MarkerDlg::onSelectionDone() } 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 ); - } + myShape = GEOM::GEOM_Object::_nil(); + } else if ( getConstructorId() == 2 ) { + if ( myEditCurrentArgument == Group2->LineEdit1 ) + myPoint = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group2->LineEdit2 ) + myVectorX = GEOM::GEOM_Object::_nil(); + else if ( myEditCurrentArgument == Group2->LineEdit3 ) + myVectorY = GEOM::GEOM_Object::_nil(); } } @@ -685,31 +593,28 @@ GEOM::GEOM_IOperations_ptr BasicGUI_MarkerDlg::createOperation() bool BasicGUI_MarkerDlg::isValid( QString& msg ) { const int id = getConstructorId(); - gp_Vec v1( myData[ DX1 ]->value(), myData[ DY1 ]->value(), myData[ DZ1 ]->value() ), - v2( myData[ DX2 ]->value(), myData[ DY2 ]->value(), myData[ DZ2 ]->value() ); - - 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: { - bool ok = true; - for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter ) - ok = anIter.value()->isValid( msg, !IsPreview()) && ok; - return isOk && ok; - } - case 1: - return !Group1->LineEdit1->text().isEmpty() && isOk; - case 2: - return !Group2->LineEdit1->text().isEmpty() && - !Group2->LineEdit2->text().isEmpty() && - !Group2->LineEdit3->text().isEmpty() && isOk; + case 0: { + gp_Vec v1( myData[ DX1 ]->value(), myData[ DY1 ]->value(), myData[ DZ1 ]->value() ), + v2( myData[ DX2 ]->value(), myData[ DY2 ]->value(), myData[ DZ2 ]->value() ); + + 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" ); + } + bool ok = true; + for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter ) + ok = anIter.value()->isValid( msg, !IsPreview()) && ok; + return isOk && ok; + } + case 1: + return !myShape->_is_nil(); + case 2: + return !myPoint->_is_nil() && !myVectorX->_is_nil() && !myVectorY->_is_nil(); } return false; } @@ -721,28 +626,32 @@ bool BasicGUI_MarkerDlg::isValid( QString& msg ) bool BasicGUI_MarkerDlg::execute( ObjectList& objects ) { GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow( getOperation() ); - GEOM::GEOM_Object_var anObj = anOper->MakeMarker( myData[ X ]->value(), - myData[ Y ]->value(), - myData[ Z ]->value(), - myData[ DX1 ]->value(), - myData[ DY1 ]->value(), - myData[ DZ1 ]->value(), - myData[ DX2 ]->value(), - myData[ DY2 ]->value(), - myData[ DZ2 ]->value() ); + GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_nil(); QStringList aParameters; - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); - aParameters<text(); + const int id = getConstructorId(); + if (id == 0) { + anObj = anOper->MakeMarker( myData[ X ]->value(), myData[ Y ]->value(), + myData[ Z ]->value(), myData[ DX1 ]->value(), + myData[ DY1 ]->value(), myData[ DZ1 ]->value(), + myData[ DX2 ]->value(), myData[ DY2 ]->value(), + myData[ DZ2 ]->value() ); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + aParameters<text(); + } else if (id == 1) { + anObj = anOper->MakeMarkerFromShape( myShape ); + } else if (id == 2) { + anObj = anOper->MakeMarkerPntTwoVec( myPoint, myVectorX, myVectorY ); + } if ( !anObj->_is_nil() ) { - if ( !IsPreview() ) + if ( !IsPreview() && id == 0) anObj->SetParameters(aParameters.join(":").toLatin1().constData()); objects.push_back( anObj._retn() ); } diff --git a/src/BasicGUI/BasicGUI_MarkerDlg.h b/src/BasicGUI/BasicGUI_MarkerDlg.h index 364b0d737..18e765af4 100644 --- a/src/BasicGUI/BasicGUI_MarkerDlg.h +++ b/src/BasicGUI/BasicGUI_MarkerDlg.h @@ -61,6 +61,11 @@ private: void enterEvent( QEvent* ); void onSelectionDone0(); + GEOM::GEOM_Object_var myShape; + GEOM::GEOM_Object_var myPoint; + GEOM::GEOM_Object_var myVectorX; + GEOM::GEOM_Object_var myVectorY; + private slots: void onOk(); bool onApply(); diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx index ebba432d7..3bce36434 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.cxx @@ -1057,6 +1057,115 @@ Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeMarker return aMarker; } +//============================================================================= +/*! + * MakeMarkerFromShape + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeMarkerFromShape + (const Handle(GEOM_Object)& theShape) +{ + 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_SHAPE); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MarkerDriver::GetID()) return NULL; + + GEOMImpl_IMarker aPI(aFunction); + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return NULL; + + aPI.SetShape(aRefShape); + + //Compute the marker value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + 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.MakeMarkerFromShape(" << theShape << ")"; + + SetErrorCode(OK); + return aMarker; +} + +//============================================================================= +/*! + * MakeMarkerPntTwoVec + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IBasicOperations::MakeMarkerPntTwoVec + (const Handle(GEOM_Object)& theOrigin, + const Handle(GEOM_Object)& theXVec, + const Handle(GEOM_Object)& theYVec) +{ + 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_PNT2VEC); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_MarkerDriver::GetID()) return NULL; + + GEOMImpl_IMarker aPI(aFunction); + + Handle(GEOM_Function) aRefOrigin = theOrigin->GetLastFunction(); + Handle(GEOM_Function) aRefXVec = theXVec->GetLastFunction(); + Handle(GEOM_Function) aRefYVec = theYVec->GetLastFunction(); + if (aRefOrigin.IsNull() || aRefXVec.IsNull() || aRefYVec.IsNull()) return NULL; + + aPI.SetOrigin(aRefOrigin); + aPI.SetXVec(aRefXVec); + aPI.SetYVec(aRefYVec); + + //Compute the marker value + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + 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.MakeMarkerPntTwoVec(" + << theOrigin << ", " << theXVec << ", " << theYVec << ")"; + + SetErrorCode(OK); + return aMarker; +} + //============================================================================= /*! * MakeTangentPlaneOnFace diff --git a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx index 0b318a72c..195f80354 100644 --- a/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBasicOperations.hxx @@ -100,6 +100,12 @@ class GEOMImpl_IBasicOperations : public GEOM_IOperations { Standard_EXPORT Handle(GEOM_Object) MakeMarker (double theOX, double theOY, double theOZ, double theXDX, double theXDY, double theXDZ, double theYDX, double theYDY, double theYDZ); + + Standard_EXPORT Handle(GEOM_Object) MakeMarkerFromShape (const Handle(GEOM_Object)& theShape); + + Standard_EXPORT Handle(GEOM_Object) MakeMarkerPntTwoVec (const Handle(GEOM_Object)& theOrigin, + const Handle(GEOM_Object)& theXVec, + const Handle(GEOM_Object)& theYVec); Standard_EXPORT Handle(GEOM_Object) MakeTangentPlaneOnFace(const Handle(GEOM_Object)& theFace, double theParamU, diff --git a/src/GEOMImpl/GEOMImpl_IMarker.hxx b/src/GEOMImpl/GEOMImpl_IMarker.hxx index 54265314f..d0cd303e2 100644 --- a/src/GEOMImpl/GEOMImpl_IMarker.hxx +++ b/src/GEOMImpl/GEOMImpl_IMarker.hxx @@ -35,6 +35,11 @@ #define CS_ARG_Y_DY 8 #define CS_ARG_Y_DZ 9 +#define CS_ARG_SHAPE 10 +#define CS_ARG_ORIGIN 11 +#define CS_ARG_XVEC 12 +#define CS_ARG_YVEC 13 + class GEOMImpl_IMarker { public: @@ -61,6 +66,26 @@ class GEOMImpl_IMarker _func->SetReal(CS_ARG_Y_DY, theDY); _func->SetReal(CS_ARG_Y_DZ, theDZ); } + + void SetShape (Handle(GEOM_Function) theShape) + { + _func->SetReference(CS_ARG_SHAPE, theShape); + } + + void SetOrigin (Handle(GEOM_Function) theOrigin) + { + _func->SetReference(CS_ARG_ORIGIN, theOrigin); + } + + void SetXVec (Handle(GEOM_Function) theXVec) + { + _func->SetReference(CS_ARG_XVEC, theXVec); + } + + void SetYVec (Handle(GEOM_Function) theYVec) + { + _func->SetReference(CS_ARG_YVEC, theYVec); + } void GetOrigin (double& theX, double& theY, double& theZ) { @@ -82,6 +107,26 @@ class GEOMImpl_IMarker theDY = _func->GetReal(CS_ARG_Y_DY); theDZ = _func->GetReal(CS_ARG_Y_DZ); } + + Handle(GEOM_Function) GetShape() + { + return _func->GetReference(CS_ARG_SHAPE); + } + + Handle(GEOM_Function) GetOrigin() + { + return _func->GetReference(CS_ARG_ORIGIN); + } + + Handle(GEOM_Function) GetXVec() + { + return _func->GetReference(CS_ARG_XVEC); + } + + Handle(GEOM_Function) GetYVec() + { + return _func->GetReference(CS_ARG_YVEC); + } private: diff --git a/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx b/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx index 12231f722..2ffbd23e1 100644 --- a/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_MarkerDriver.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -102,6 +103,48 @@ Standard_Integer GEOMImpl_MarkerDriver::Execute(TFunction_Logbook& log) const 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 (aType == MARKER_SHAPE) { + Handle(GEOM_Function) aRefShape = aPI.GetShape(); + TopoDS_Shape aSh = aRefShape->GetValue(); + gp_Ax3 anAx3 = GEOMImpl_IMeasureOperations::GetPosition(aSh); + gp_Pln aPln (anAx3); + + double aTrimSize = 100.0; + aShape = BRepBuilderAPI_MakeFace(aPln, -aTrimSize, +aTrimSize, -aTrimSize, +aTrimSize).Shape(); + } else if (aType == MARKER_PNT2VEC) { + Handle(GEOM_Function) aRefOrigin = aPI.GetOrigin(); + Handle(GEOM_Function) aRefXVec = aPI.GetXVec(); + Handle(GEOM_Function) aRefYVec = aPI.GetYVec(); + TopoDS_Shape aShapeOrigin = aRefOrigin->GetValue(); + TopoDS_Shape aShapeXVec = aRefXVec->GetValue(); + TopoDS_Shape aShapeYVec = aRefYVec->GetValue(); + if (aShapeOrigin.ShapeType() != TopAbs_VERTEX || aShapeOrigin.IsNull()) return 0; + if (aShapeXVec.ShapeType() != TopAbs_EDGE || aShapeXVec.IsNull()) return 0; + if (aShapeYVec.ShapeType() != TopAbs_EDGE || aShapeYVec.IsNull()) return 0; + + gp_Pnt aPO = BRep_Tool::Pnt( TopoDS::Vertex( aShapeOrigin ) ); + + gp_Pnt aPX1 = BRep_Tool::Pnt( TopExp::FirstVertex( TopoDS::Edge( aShapeXVec ) ) ); + gp_Pnt aPX2 = BRep_Tool::Pnt( TopExp::LastVertex( TopoDS::Edge( aShapeXVec ) ) ); + gp_Vec aVX( aPX1, aPX2 ); + + gp_Pnt aPY1 = BRep_Tool::Pnt( TopExp::FirstVertex( TopoDS::Edge( aShapeYVec ) ) ); + gp_Pnt aPY2 = BRep_Tool::Pnt( TopExp::LastVertex( TopoDS::Edge( aShapeYVec ) ) ); + gp_Vec aVY( aPY1, aPY2 ); + + if (aVX.Magnitude() < gp::Resolution() || aVY.Magnitude() < gp::Resolution()) + Standard_ConstructionError::Raise + ("Local CS creation aborted: vector of zero length is given"); + + if ( aVX.IsParallel(aVY, Precision::Angular())) + Standard_ConstructionError::Raise("Parallel Vectors 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 { diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 9105d82c8..b6b753451 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -295,4 +295,6 @@ #define BLOCK_COMPOUND_IMPROVE 10 // Marker -#define MARKER_CS 1 +#define MARKER_CS 1 +#define MARKER_SHAPE 2 +#define MARKER_PNT2VEC 3 diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.cc b/src/GEOM_I/GEOM_IBasicOperations_i.cc index 278d9090d..06b4fa6b8 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.cc +++ b/src/GEOM_I/GEOM_IBasicOperations_i.cc @@ -561,6 +561,62 @@ GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeMarker return GetObject(anObject); } +//============================================================================= +/*! + * MakeMarkerFromShape + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeMarkerFromShape + (GEOM::GEOM_Object_ptr theShape) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the referenced object + Handle(GEOM_Object) aRef = GetObjectImpl(theShape); + if (aRef.IsNull()) return aGEOMObject._retn(); + + //Create the point + Handle(GEOM_Object) anObject = GetOperations()->MakeMarkerFromShape(aRef); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + +//============================================================================= +/*! + * MakeMarkerPntTwoVec + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IBasicOperations_i::MakeMarkerPntTwoVec + (GEOM::GEOM_Object_ptr theOrigin, + GEOM::GEOM_Object_ptr theXVec, + GEOM::GEOM_Object_ptr theYVec) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + //Get the referenced objects + Handle(GEOM_Object) aRef1 = GetObjectImpl(theOrigin); + Handle(GEOM_Object) aRef2 = GetObjectImpl(theXVec); + Handle(GEOM_Object) aRef3 = GetObjectImpl(theYVec); + if (aRef1.IsNull() || aRef2.IsNull() || aRef3.IsNull()) return aGEOMObject._retn(); + + //Create the point + Handle(GEOM_Object) anObject = GetOperations()->MakeMarkerPntTwoVec(aRef1, + aRef2, + aRef3); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeTangentPlaneOnFace diff --git a/src/GEOM_I/GEOM_IBasicOperations_i.hh b/src/GEOM_I/GEOM_IBasicOperations_i.hh index 7910c4e17..b999fc9a6 100644 --- a/src/GEOM_I/GEOM_IBasicOperations_i.hh +++ b/src/GEOM_I/GEOM_IBasicOperations_i.hh @@ -114,6 +114,10 @@ class GEOM_I_EXPORT GEOM_IBasicOperations_i : CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); + GEOM::GEOM_Object_ptr MakeMarkerFromShape (GEOM::GEOM_Object_ptr theShape); + + GEOM::GEOM_Object_ptr MakeMarkerPntTwoVec (GEOM::GEOM_Object_ptr theOrigin, GEOM::GEOM_Object_ptr theXVec, GEOM::GEOM_Object_ptr theYVec); + GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, CORBA::Double theParameterU, CORBA::Double theParameterV, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 2762674fe..6518d8338 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -802,6 +802,34 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMarker return anObj; } +//============================================================================= +// MakeMarkerFromShape: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMarkerFromShape (GEOM::GEOM_Object_ptr theShape) +{ + beginService( " GEOM_Superv_i::MakeMarkerFromShape" ); + MESSAGE("GEOM_Superv_i::MakeMarkerFromShape"); + getBasicOp(); + GEOM::GEOM_Object_ptr anObj = myBasicOp->MakeMarkerFromShape(theShape); + endService( " GEOM_Superv_i::MakeMarkerFromShape" ); + return anObj; +} + +//============================================================================= +// MakeMarkerPntTwoVec: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeMarkerPntTwoVec (GEOM::GEOM_Object_ptr theOrigin, + GEOM::GEOM_Object_ptr theXVec, + GEOM::GEOM_Object_ptr theYVec) +{ + beginService( " GEOM_Superv_i::MakeMarkerPntTwoVec" ); + MESSAGE("GEOM_Superv_i::MakeMarkerPntTwoVec"); + getBasicOp(); + GEOM::GEOM_Object_ptr anObj = myBasicOp->MakeMarkerPntTwoVec(theOrigin, theXVec, theYVec); + endService( " GEOM_Superv_i::MakeMarkerPntTwoVec" ); + return anObj; +} + //============================================================================= // MakeTangentPlaneOnFace: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index 1ed69ad45..d726e3b2a 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -191,6 +191,12 @@ public: CORBA::Double theXDX, CORBA::Double theXDY, CORBA::Double theXDZ, CORBA::Double theYDX, CORBA::Double theYDY, CORBA::Double theYDZ); + GEOM::GEOM_Object_ptr MakeMarkerFromShape (GEOM::GEOM_Object_ptr theShape); + + GEOM::GEOM_Object_ptr MakeMarkerPntTwoVec (GEOM::GEOM_Object_ptr theOrigin, + GEOM::GEOM_Object_ptr theXVec, + GEOM::GEOM_Object_ptr theYVec); + GEOM::GEOM_Object_ptr MakeTangentPlaneOnFace (GEOM::GEOM_Object_ptr theFace, CORBA::Double theParameterU, CORBA::Double theParameterV, diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index fb7598780..e0d2599f9 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -107,6 +107,9 @@ def TestAll (geompy, math): Sketcher = 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]) #(String, List of Doubles)->GEOM_Object_ptr Sketcher3d = geompy.Make3DSketcher([0,0,0, 50,50,50, 0,50,50, 10,0,0]) + + #Create local coordinate system from shape + cs4 = geompy.MakeMarkerFromShape(Plane) #Test point on curve creation p_on_arc = geompy.MakeVertexOnCurve(Arc, 0.25) #(GEOM_Object_ptr, Double)->GEOM_Object_ptr @@ -303,6 +306,7 @@ def TestAll (geompy, math): id_cs1 = geompy.addToStudy(cs1, "CS 50,50,50, 1,0,0, 0,1,0") id_cs2 = geompy.addToStudy(cs2, "CS 70,80,10, 1,0,1, 1,1,0") id_cs3 = geompy.addToStudy(cs3, "CS: pz, vxy, vz") + id_cs4 = geompy.addToStudy(cs4, "CS: Plane") id_Line = geompy.addToStudy(Line, "Line") id_Line1 = geompy.addToStudy(Line1, "Line by point and vector") diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 4e05cc58d..1788293dd 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -641,7 +641,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters) return anObj - ## Create a plane, passing through the 2 vectors + ## Create a plane, passing through the 2 vectors # with center in a start point of the first vector. # @param theVec1 Vector, defining center point and plane direction. # @param theVec2 Vector, defining the plane normal direction. @@ -657,10 +657,10 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters) return anObj - ## Create a plane, based on a Local coordinate system. + ## Create a plane, based on a Local coordinate system. # @param theLCS coordinate system, defining plane. # @param theTrimSize Half size of a side of quadrangle face, representing the plane. - # @param theOrientation OXY, OYZ or OZX orientation - (1, 2 or 3) + # @param theOrientation OXY, OYZ or OZX orientation - (1, 2 or 3) # @return New GEOM_Object, containing the created plane. # # @ref tui_creation_plane "Example" @@ -686,28 +686,27 @@ class geompyDC(GEOM._objref_GEOM_Gen): RaiseIfFailed("MakeMarker", self.BasicOp) anObj.SetParameters(Parameters) return anObj + + ## Create a local coordinate system from shape. + # @param theShape The initial shape to detect the coordinate system. + # @return New GEOM_Object, containing the created coordinate system. + # + # @ref tui_creation_lcs "Example" + def MakeMarkerFromShape(self, theShape): + anObj = self.BasicOp.MakeMarkerFromShape(theShape) + RaiseIfFailed("MakeMarkerFromShape", self.BasicOp) + return anObj - ## Create a local coordinate system. + ## Create a local coordinate system from point and two vectors. # @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. # - # @ref swig_MakeMarker "Example" + # @ref tui_creation_lcs "Example" def MakeMarkerPntTwoVec(self, theOrigin, theXVec, theYVec): - O = self.PointCoordinates( theOrigin ) - OXOY = [] - for vec in [ theXVec, theYVec ]: - v1, v2 = self.SubShapeAll( vec, ShapeType["VERTEX"] ) - p1 = self.PointCoordinates( v1 ) - p2 = self.PointCoordinates( v2 ) - for i in range( 0, 3 ): - OXOY.append( p2[i] - p1[i] ) - # - anObj = self.BasicOp.MakeMarker( O[0], O[1], O[2], - OXOY[0], OXOY[1], OXOY[2], - OXOY[3], OXOY[4], OXOY[5], ) - RaiseIfFailed("MakeMarker", self.BasicOp) + anObj = self.BasicOp.MakeMarkerPntTwoVec(theOrigin, theXVec, theYVec) + RaiseIfFailed("MakeMarkerPntTwoVec", self.BasicOp) return anObj # end of l3_basic_go @@ -1255,7 +1254,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters) return anObj - ## Create a shape by extrusion of the base shape along the dx, dy, dz direction + ## Create a shape by extrusion of the base shape along the dx, dy, dz direction # @param theBase Base shape to be extruded. # @param theDX, theDY, theDZ Directions of extrusion. # @return New GEOM_Object, containing the created prism. @@ -1269,7 +1268,7 @@ class geompyDC(GEOM._objref_GEOM_Gen): anObj.SetParameters(Parameters) return anObj - ## Create a shape by extrusion of the base shape along the dx, dy, dz direction + ## Create a shape by extrusion of the base shape along the dx, dy, dz direction # i.e. all the space, transfixed by the base shape during its translation # along the vector on the given distance in 2 Ways (forward/backward) . # @param theBase Base shape to be extruded. -- 2.39.2