0020660: EDF 1238 GEOM: Missing equivalent of 2nd contructor of LCS in TUI

This commit is contained in:
dmv 2010-01-19 08:21:42 +00:00
parent 6c8fff57cb
commit 7319fe8043
17 changed files with 461 additions and 179 deletions

View File

@ -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 <b>TUI command:</b> <em>geompy.MakeMarkerFromShape(theShape)</em>.
\n <b>Arguments:</b> 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 <b>Arguments:</b> Name + 1 point of origin + X axis direction, Y
axis direction.
\n <b>TUI command:</b> <em>geompy.MakeMarkerPntTwoVec(Center, VectorX,
VectorY)</em> where Center is a point specified the coordinate system location,
VectorX is a derection of OX axis and VectorY direction of OY axis.
\n <b>Arguments:</b> 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"
<b>TUI Script</b> provide you with useful example of creation of
\ref tui_creation_lcs "Local Coordinate System".
*/

View File

@ -345,4 +345,45 @@ gg.setDisplayMode(id_plane5,1)
gg.setTransparency(id_plane5,0.5)
\endcode
\anchor tui_creation_lcs
<br><h2>Creation of a Local Coordinate System</h2>
\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
*/

View File

@ -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

View File

@ -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.

View File

@ -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<VTKViewer_ViewFrame*>( aFrame );
if ( aVTKFrame )
{
aVTKFrame->AdjustTrihedrons( true );
return;
}
OCCViewer_ViewFrame* aOCCFrame = dynamic_cast<OCCViewer_ViewFrame*>( 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<<myData[X]->text();
aParameters<<myData[Y]->text();
aParameters<<myData[Z]->text();
aParameters<<myData[ DX1 ]->text();
aParameters<<myData[ DY1 ]->text();
aParameters<<myData[ DZ1 ]->text();
aParameters<<myData[ DX2 ]->text();
aParameters<<myData[ DY2 ]->text();
aParameters<<myData[ DZ2 ]->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<<myData[X]->text();
aParameters<<myData[Y]->text();
aParameters<<myData[Z]->text();
aParameters<<myData[ DX1 ]->text();
aParameters<<myData[ DY1 ]->text();
aParameters<<myData[ DZ1 ]->text();
aParameters<<myData[ DX2 ]->text();
aParameters<<myData[ DY2 ]->text();
aParameters<<myData[ DZ2 ]->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() );
}

View File

@ -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();

View File

@ -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

View File

@ -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,

View File

@ -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:

View File

@ -25,6 +25,7 @@
#include <GEOMImpl_IMarker.hxx>
#include <GEOMImpl_Types.hxx>
#include <GEOM_Function.hxx>
#include <GEOMImpl_IMeasureOperations.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRep_Tool.hxx>
@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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:
//=============================================================================

View File

@ -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,

View File

@ -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")

View File

@ -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.