Mantis issue 0021392: EDF 1631 GEOM: Dump study of sketcher 3D with relatives coordinates.

This commit is contained in:
jfa 2012-09-06 13:29:35 +00:00
parent b0cc47d13b
commit 89c42a4f37
12 changed files with 1191 additions and 685 deletions

View File

@ -2785,10 +2785,10 @@ module GEOM
/*!
* \brief Create a sketcher (wire or face), following the textual description,
* passed through \a theCommand argument.
* passed through \a theCommand argument.
*
* Edges of the resulting wire or face will be arcs of circles and/or linear segments. \n
* Format of the description string have to be the following:
* Format of the description string has to be the following:
*
* "Sketcher[:F x1 y1]:CMD[:CMD[:CMD...]]"
*
@ -2816,32 +2816,60 @@ module GEOM
* coordinates of the working plane.
* \param theWorkingPlane Nine double values, defining origin,
* OZ and OX directions of the working plane.
* \return New GEOM_Object, containing the created wire.
* \return New GEOM_Object, containing the created wire or face.
*/
GEOM_Object MakeSketcher (in string theCommand, in ListOfDouble theWorkingPlane);
/*!
* \brief Create a 3D sketcher, following the numerical description,
* passed through points created by \a theCoordinates argument.
*
* Format of the description string have to be the following:
*
* "Make3DSketcher[x1, y1, z1, x2, y2, z2, ..., xN, yN, zN]"
*/
GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates);
/*!
* \brief Create a sketcher (wire or face), following the textual description,
* passed through \a theCommand argument.
* passed through \a theCommand argument.
*
* For format of the description string see the previous method.\n
*
* \param theCommand String, defining the sketcher in local
* coordinates of the working plane.
* \param theWorkingPlane Planar Face or LCS(Marker) of the working plane.
* \return New GEOM_Object, containing the created wire.
* \return New GEOM_Object, containing the created wire or face.
*/
GEOM_Object MakeSketcherOnPlane (in string theCommand, in GEOM_Object theWorkingPlane);
/*!
* \brief Create a 3D sketcher, following the textual description,
* passed through \a theCommand argument.
*
* Format of the description string has to be the following:
*
* "3DSketcher:CMD[:CMD[:CMD...]]"
*
* Where CMD is one of
* - "TT x y z" : Create segment by point at X & Y or set the first point
* - "T dx dy dz" : Create segment by point with DX & DY
* .
* \n
* - "OXY angleX angle2 length" : Create segment by two angles and length
* - "OYZ angleY angle2 length" : Create segment by two angles and length
* - "OXZ angleX angle2 length" : Create segment by two angles and length
* .
* \n
* - "WW" : Close Wire (to finish)
*
* \param theCommand String, defining the sketcher in local
* coordinates of the working plane.
* \return New GEOM_Object, containing the created wire.
*/
GEOM_Object Make3DSketcherCommand (in string theCommand);
/*!
* \brief Create a 3D sketcher, made of a straight segments, joining points
* with coordinates passed through \a theCoordinates argument.
*
* Order of coordinates has to be the following:
* x1, y1, z1, x2, y2, z2, ..., xN, yN, zN
*
* \param theCoordinates List of double values.
* \return New GEOM_Object, containing the created wire.
*/
GEOM_Object Make3DSketcher (in ListOfDouble theCoordinates);
};
// # GEOM_ILocalOperations:

File diff suppressed because it is too large Load Diff

View File

@ -15,12 +15,11 @@
// 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 GEOMGUI : GUI for Geometry component
// File : EntityGUI_3DSketcherDlg.h
// Author : DMV, OCN
//
#ifndef ENTITYGUI_3DSKETCHERDLG_H
#define ENTITYGUI_3DSKETCHERDLG_H
@ -53,14 +52,15 @@ class EntityGUI_3DSketcherDlg : public GEOMBase_Skeleton
struct XYZ
{
XYZ() { x = y = z = 0.0; xt = yt = zt = "0.0"; }
double x, y, z;
QString xt, yt, zt;
XYZ() { x = y = z = 0.0; command = params = ""; }
double x, y, z; // for preview only
QString command;
QString params;
};
typedef QList<XYZ> XYZList;
public:
EntityGUI_3DSketcherDlg( GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0, const double = 2. );
EntityGUI_3DSketcherDlg (GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0, const double = 2.);
~EntityGUI_3DSketcherDlg();
protected:

View File

@ -961,7 +961,7 @@ std::list<int> GEOM_Engine::getAllTextures(int theDocID)
//=============================================================================
/*!
* ProcessFunction: Dump fucntion description into script
* ProcessFunction: Dump function description into script
*/
//=============================================================================
bool ProcessFunction(Handle(GEOM_Function)& theFunction,
@ -1036,6 +1036,95 @@ bool ProcessFunction(Handle(GEOM_Function)& theFunction,
//Replace parameter by notebook variables
ReplaceVariables(aDescr,theVariables);
//Process sketcher functions, replacing string command by calls to Sketcher interface
if (aDescr.Search( "Make3DSketcher" ) != -1) {
TCollection_AsciiString aNewDescr;
int i = 1;
TCollection_AsciiString aSubStr = aDescr.Token("\n\t", i);
for (; !aSubStr.IsEmpty(); aSubStr = aDescr.Token("\n\t", i)) {
if (aSubStr.Search( "Make3DSketcherCommand" ) != -1) {
TCollection_AsciiString aResult = aSubStr.Token(" ", 1);
// "3DSketcher:CMD[:CMD[:CMD...]]"
TCollection_AsciiString aCommand = aSubStr.Token("\"", 2);
// Split the command string to separate CMDs
int icmd = 2;
TColStd_SequenceOfAsciiString aSequence;
if (aCommand.Length()) {
TCollection_AsciiString aToken = aCommand.Token(":", icmd);
while (aToken.Length() > 0) {
aSequence.Append(aToken);
aToken = aCommand.Token(":", ++icmd);
}
}
if (aSequence.Length() > 0) {
if (i > 1)
aNewDescr += "\n\t";
aNewDescr += "sk = geompy.Sketcher3D()";
int nbCMDs = aSequence.Length();
for (icmd = 1; icmd <= nbCMDs; icmd++) {
aNewDescr += "\n\t";
TCollection_AsciiString aCMD = aSequence.Value(icmd);
// Split the CMD into string values
TColStd_SequenceOfAsciiString aStrVals;
int ival = 1;
TCollection_AsciiString aToken = aCMD.Token(" ", ival);
while (aToken.Length() > 0) {
aStrVals.Append(aToken);
aToken = aCMD.Token(" ", ++ival);
}
TCollection_AsciiString aCMDpref = aStrVals.Value(1);
if (aCMDpref == "TT") {
aNewDescr += "sk.addPointsAbsolute(";
aNewDescr += aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")";
}
else if (aCMDpref == "T") {
aNewDescr += "sk.addPointsRelative(";
aNewDescr += aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")";
}
else if (aCMDpref == "WW") {
aNewDescr += "sk.close()";
}
else {
aNewDescr += "sk.addPointAnglesLength(\"";
aNewDescr += aCMDpref + "\", " +
aStrVals.Value(2) + ", " + aStrVals.Value(3) + ", " + aStrVals.Value(4) + ")";
}
}
aNewDescr += "\n\t";
aNewDescr += aResult + " = sk.wire()";
}
} // Make3DSketcherCommand
else if (aSubStr.Search( "Make3DSketcher" ) != -1) {
TCollection_AsciiString aResult = aSubStr.Token(" ", 1);
TCollection_AsciiString aCommand = aSubStr.Token("[", 2);
aCommand = aCommand.Token("]", 1);
if (i > 1)
aNewDescr += "\n\t";
aNewDescr += "sk = geompy.Sketcher3D()";
aNewDescr += "\n\t";
aNewDescr += "sk.addPointsAbsolute(";
aNewDescr += aCommand + ")";
aNewDescr += "\n\t";
aNewDescr += aResult + " = sk.wire()";
}
else {
if (i > 1)
aNewDescr += "\n\t";
aNewDescr += aSubStr;
}
i++;
}
aDescr = aNewDescr;
}
if ( theIsDumpCollected ) {
int i = 1;
bool isBefore = true;

View File

@ -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
//
#include <Standard_Stream.hxx>
@ -26,9 +25,13 @@
#include <GEOMImpl_IMeasureOperations.hxx>
#include <Basics_Utils.hxx>
// OCCT Includes
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Wire.hxx>
@ -63,41 +66,232 @@ Standard_Integer GEOMImpl_3DSketcherDriver::Execute(TFunction_Logbook& log) cons
{
if (Label().IsNull()) return 0;
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
GEOMImpl_I3DSketcher aCI (aFunction);
TopoDS_Shape aShape;
Handle(TColStd_HArray1OfReal) aCoordsArray = aCI.GetCoordinates();
int anArrayLength = aCoordsArray->Length();
if (aFunction->GetType() == SKETCHER3D_COORDS) {
Handle(TColStd_HArray1OfReal) aCoordsArray = aCI.GetCoordinates();
int anArrayLength = aCoordsArray->Length();
std::list<gp_Pnt> points;
for (int i = 0; i <= (anArrayLength-3); i += 3) {
gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3));
if (points.empty() || aPnt.Distance(points.back()) > gp::Resolution())
points.push_back(aPnt);
}
std::list<gp_Pnt> points;
if ( points.size() == 1) { // Only Start Point
BRepBuilderAPI_MakeVertex mkVertex (points.back());
aShape = mkVertex.Shape();
}
else if ( points.size() > 1) { // Make Wire
BRepBuilderAPI_MakePolygon aMakePoly;
std::list<gp_Pnt>::iterator it;
for (it = points.begin(); it != points.end(); ++it) {
aMakePoly.Add(*it);
for (int i = 0; i <= (anArrayLength-3); i += 3) {
gp_Pnt aPnt = gp_Pnt(aCoordsArray->Value(i+1), aCoordsArray->Value(i+2), aCoordsArray->Value(i+3));
if (points.empty() || aPnt.Distance(points.back()) > gp::Resolution())
points.push_back(aPnt);
}
if (points.size() > 2 &&
points.back().X() == points.front().X() &&
points.back().Y() == points.front().Y() &&
points.back().Z() == points.front().Z())
aMakePoly.Close();
if (aMakePoly.IsDone())
aShape = aMakePoly.Wire();
if ( points.size() == 1) { // Only Start Point
BRepBuilderAPI_MakeVertex mkVertex (points.back());
aShape = mkVertex.Shape();
}
else if ( points.size() > 1) { // Make Wire
BRepBuilderAPI_MakePolygon aMakePoly;
std::list<gp_Pnt>::iterator it;
for (it = points.begin(); it != points.end(); ++it) {
aMakePoly.Add(*it);
}
if (points.size() > 2 &&
points.back().X() == points.front().X() &&
points.back().Y() == points.front().Y() &&
points.back().Z() == points.front().Z())
aMakePoly.Close();
if (aMakePoly.IsDone())
aShape = aMakePoly.Wire();
}
}
else if (aFunction->GetType() == SKETCHER3D_COMMAND) {
Kernel_Utils::Localizer loc;
TCollection_AsciiString aCommand = aCI.GetCommand();
// "3DSketcher:CMD[:CMD[:CMD...]]"
// Split the command string to separate CMDs
int icmd = 2;
TColStd_SequenceOfAsciiString aSequence;
if (aCommand.Length()) {
TCollection_AsciiString aToken = aCommand.Token(":", icmd);
while (aToken.Length() > 0) {
aSequence.Append(aToken);
aToken = aCommand.Token(":", ++icmd);
}
}
int nbEdges = 0;
bool isFirstPointSet = false;
gp_XYZ p = gp::Origin().XYZ();
BRepBuilderAPI_MakeVertex MV0 (p);
TopoDS_Vertex V = TopoDS::Vertex(MV0.Shape());
gp_XYZ p0 = p;
TopoDS_Vertex V0 = V;
bool doClose = false;
BRepBuilderAPI_MakeWire MW;
int nbCMDs = aSequence.Length();
for (icmd = 1; icmd <= nbCMDs; icmd++) {
TCollection_AsciiString aCMD = aSequence.Value(icmd);
// Split the CMD into string values
TColStd_SequenceOfAsciiString aStrVals;
int ival = 1;
TCollection_AsciiString aToken = aCMD.Token(" ", ival);
while (aToken.Length() > 0) {
aStrVals.Append(aToken);
aToken = aCMD.Token(" ", ++ival);
}
// "TT x y z" : Create segment by point at X & Y or set the first point
// "T dx dy dz" : Create segment by point with DX & DY
//
// "OXY angleX angle2 length" : Create segment by two angles and length
// "OYZ angleY angle2 length" : Create segment by two angles and length
// "OXZ angleX angle2 length" : Create segment by two angles and length
//
// "WW" : Close Wire (to finish)
switch (aStrVals.Value(1).Value(1))
{
case 'T':
{
if (aStrVals.Length() != 4)
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
gp_XYZ vp;
vp.SetX(aStrVals.Value(2).RealValue());
vp.SetY(aStrVals.Value(3).RealValue());
vp.SetZ(aStrVals.Value(4).RealValue());
if (aStrVals.Value(1) == "TT") { // absolute coordinates
if (!isFirstPointSet) {
p = vp;
BRepBuilderAPI_MakeVertex MV (p);
V = TopoDS::Vertex(MV.Shape());
p0 = p;
V0 = V;
isFirstPointSet = true;
}
else {
if ((vp - p).SquareModulus() > Precision::Confusion()) {
BRepBuilderAPI_MakeVertex MV (vp);
TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape());
BRepBuilderAPI_MakeEdge ME (V, VV);
MW.Add(ME);
nbEdges++;
p = vp;
V = VV;
}
}
}
else if (aStrVals.Value(1) == "T") { // relative coordinates
if (vp.SquareModulus() > Precision::Confusion()) {
vp = p + vp;
BRepBuilderAPI_MakeVertex MV (vp);
TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape());
BRepBuilderAPI_MakeEdge ME (V, VV);
MW.Add(ME);
nbEdges++;
p = vp;
V = VV;
}
}
else
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
}
break;
case 'O':
{
if (aStrVals.Length() != 4)
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
double anAngle = aStrVals.Value(2).RealValue() * M_PI/180.0;
double anAngle2 = aStrVals.Value(3).RealValue() * M_PI/180.0;
double aLength = aStrVals.Value(4).RealValue();
double aProjectedLength = aLength * cos(anAngle2);
gp_XYZ vp;
vp.SetX(aStrVals.Value(2).RealValue());
vp.SetY(aStrVals.Value(3).RealValue());
vp.SetZ(aStrVals.Value(4).RealValue());
if (aStrVals.Value(1) == "OXY") {
vp.SetX(p.X() + aProjectedLength * cos(anAngle));
vp.SetY(p.Y() + aProjectedLength * sin(anAngle));
vp.SetZ(p.Z() + aLength * sin(anAngle2));
}
else if (aStrVals.Value(1) == "OYZ") {
vp.SetX(p.X() + aLength * sin(anAngle2));
vp.SetY(p.Y() + aProjectedLength * cos(anAngle));
vp.SetZ(p.Z() + aProjectedLength * sin(anAngle));
}
else if (aStrVals.Value(1) == "OXZ") {
vp.SetX(p.X() + aProjectedLength * cos(anAngle));
vp.SetY(p.Y() + aLength * sin(anAngle2));
vp.SetZ(p.Z() + aProjectedLength * sin(anAngle));
}
else
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
BRepBuilderAPI_MakeVertex MV (vp);
TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape());
BRepBuilderAPI_MakeEdge ME (V, VV);
MW.Add(ME);
nbEdges++;
p = vp;
V = VV;
}
break;
case 'W':
{
if (aStrVals.Length() != 1)
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
if (aStrVals.Value(1) == "WW")
doClose = true;
else
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
}
break;
default:
{
Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
}
}
}
if (doClose &&
nbEdges > 1 && // as 3D sketcher has only straight edges
(p - p0).SquareModulus() > Precision::Confusion()) {
BRepBuilderAPI_MakeEdge ME (V, V0);
MW.Add(ME);
nbEdges++;
}
if (nbEdges > 0) {
if (!MW.IsDone())
Standard_ConstructionError::Raise("3D Sketcher error: Wire construction failed.");
aShape = MW;
}
else {
if (isFirstPointSet) {
aShape = V0;
}
}
}
else {
}
if (aShape.IsNull()) return 0;

View File

@ -15,28 +15,35 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//NOTE: This is an interface to a function for the Sketcher creation.
//
#include "GEOM_Function.hxx"
#include <TColStd_HArray1OfReal.hxx>
#define SKETCH_ARG_COORDS 1
class GEOMImpl_I3DSketcher
{
public:
public:
GEOMImpl_I3DSketcher(Handle(GEOM_Function) theFunction): _func(theFunction) {}
GEOMImpl_I3DSketcher (Handle(GEOM_Function) theFunction): _func(theFunction) {}
void SetCoordinates(const Handle(TColStd_HArray1OfReal)& theValue)
{ _func->SetRealArray(SKETCH_ARG_COORDS, theValue); }
void SetCoordinates (const Handle(TColStd_HArray1OfReal)& theValue)
{ _func->SetRealArray(SKETCH_ARG_COORDS, theValue); }
Handle(TColStd_HArray1OfReal) GetCoordinates() { return _func->GetRealArray(SKETCH_ARG_COORDS); }
private:
void SetCommand (const TCollection_AsciiString& theCommand)
{ _func->SetString(SKETCH_ARG_COMMAND, theCommand); }
TCollection_AsciiString GetCommand() { return _func->GetString(SKETCH_ARG_COMMAND); }
private:
enum {
SKETCH_ARG_COORDS = 1,
SKETCH_ARG_COMMAND = 2
};
Handle(GEOM_Function) _func;
};

View File

@ -18,7 +18,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
//
#ifdef WNT
// E.A. : On windows with python 2.6, there is a conflict
@ -1166,73 +1165,6 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcher (const char* theCom
return aSketcher;
}
//=============================================================================
/*!
* Make3DSketcher
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::list<double> theCoordinates)
{
SetErrorCode(KO);
//Add a new Sketcher object
Handle(GEOM_Object) a3DSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER);
//Add a new Sketcher function
Handle(GEOM_Function) aFunction =
a3DSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), GEOM_3DSKETCHER);
if (aFunction.IsNull()) return NULL;
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL;
GEOMImpl_I3DSketcher aCI (aFunction);
int nbOfCoords = 0;
std::list<double>::iterator it = theCoordinates.begin();
for (; it != theCoordinates.end(); it++)
nbOfCoords++;
Handle(TColStd_HArray1OfReal) aCoordsArray = new TColStd_HArray1OfReal (1, nbOfCoords);
it = theCoordinates.begin();
int ind = 1;
for (; it != theCoordinates.end(); it++, ind++)
aCoordsArray->SetValue(ind, *it);
aCI.SetCoordinates(aCoordsArray);
//Compute the Sketcher value
try {
#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("3D Sketcher driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOM::TPythonDump pd (aFunction);
pd << a3DSketcher << " = geompy.Make3DSketcher([";
it = theCoordinates.begin();
pd << (*it++);
while (it != theCoordinates.end()) {
pd << ", " << (*it++);
}
pd << "])";
SetErrorCode(OK);
return a3DSketcher;
}
//=============================================================================
/*!
* MakeSketcherOnPlane
@ -1289,3 +1221,121 @@ Handle(GEOM_Object) GEOMImpl_ICurvesOperations::MakeSketcherOnPlane
SetErrorCode(OK);
return aSketcher;
}
//=============================================================================
/*!
* Make3DSketcherCommand
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcherCommand (const char* theCommand)
{
SetErrorCode(KO);
if (!theCommand || strcmp(theCommand, "") == 0) return NULL;
//Add a new Sketcher object
Handle(GEOM_Object) aSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER);
//Add a new Sketcher function
Handle(GEOM_Function) aFunction =
aSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), SKETCHER3D_COMMAND);
if (aFunction.IsNull()) return NULL;
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL;
GEOMImpl_I3DSketcher aCI (aFunction);
TCollection_AsciiString aCommand ((char*) theCommand);
aCI.SetCommand(aCommand);
//Compute the 3D Sketcher value
try {
#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("3D Sketcher driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOM::TPythonDump pd (aFunction);
pd << aSketcher << " = geompy.Make3DSketcherCommand(\"" << aCommand.ToCString() << "\")";
SetErrorCode(OK);
return aSketcher;
}
//=============================================================================
/*!
* Make3DSketcher
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ICurvesOperations::Make3DSketcher (std::list<double> theCoordinates)
{
SetErrorCode(KO);
//Add a new Sketcher object
Handle(GEOM_Object) a3DSketcher = GetEngine()->AddObject(GetDocID(), GEOM_3DSKETCHER);
//Add a new Sketcher function
Handle(GEOM_Function) aFunction =
a3DSketcher->AddFunction(GEOMImpl_3DSketcherDriver::GetID(), SKETCHER3D_COORDS);
if (aFunction.IsNull()) return NULL;
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_3DSketcherDriver::GetID()) return NULL;
GEOMImpl_I3DSketcher aCI (aFunction);
int nbOfCoords = 0;
std::list<double>::iterator it = theCoordinates.begin();
for (; it != theCoordinates.end(); it++)
nbOfCoords++;
Handle(TColStd_HArray1OfReal) aCoordsArray = new TColStd_HArray1OfReal (1, nbOfCoords);
it = theCoordinates.begin();
int ind = 1;
for (; it != theCoordinates.end(); it++, ind++)
aCoordsArray->SetValue(ind, *it);
aCI.SetCoordinates(aCoordsArray);
//Compute the Sketcher value
try {
#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("3D Sketcher driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOM::TPythonDump pd (aFunction);
pd << a3DSketcher << " = geompy.Make3DSketcher([";
it = theCoordinates.begin();
pd << (*it++);
while (it != theCoordinates.end()) {
pd << ", " << (*it++);
}
pd << "])";
SetErrorCode(OK);
return a3DSketcher;
}

View File

@ -18,7 +18,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
//
#ifndef _GEOMImpl_ICurvesOperations_HXX_
#define _GEOMImpl_ICurvesOperations_HXX_
@ -78,16 +77,17 @@ class GEOMImpl_ICurvesOperations : public GEOM_IOperations {
bool theIsClosed = false,
bool theDoReordering = false);
Standard_EXPORT Handle(GEOM_Object) MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
CurveType theCurveType,
int theParamNbStep=0, bool theNewMethod=false);
Standard_EXPORT Handle(GEOM_Object) MakeCurveParametric
(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
CurveType theCurveType, int theParamNbStep=0, bool theNewMethod=false);
Standard_EXPORT Handle(GEOM_Object) MakeSketcher (const char* theCommand,
std::list<double> theWorkingPlane);
Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (std::list<double> theCoordinates);
Standard_EXPORT Handle(GEOM_Object) MakeSketcherOnPlane (const char* theCommand,
Handle(GEOM_Object) theWorkingPlane);
Standard_EXPORT Handle(GEOM_Object) Make3DSketcherCommand (const char* theCommand);
Standard_EXPORT Handle(GEOM_Object) Make3DSketcher (std::list<double> theCoordinates);
};
#endif

View File

@ -18,7 +18,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_Object types
@ -295,7 +294,10 @@
#define GLUE_EDGES_BY_LIST 4
#define SKETCHER_NINE_DOUBLS 1
#define SKETCHER_PLANE 2
#define SKETCHER_PLANE 2
#define SKETCHER3D_COORDS 1
#define SKETCHER3D_COMMAND 2
// Measures
#define CDG_MEASURE 1

View File

@ -18,7 +18,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
//
#include <Standard_Stream.hxx>
@ -433,13 +432,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSplineInterpolation
* MakeCurveParametric
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
GEOM::curve_type theCurveType) {
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric
(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
GEOM::curve_type theCurveType)
{
GEOM::GEOM_Object_var aGEOMObject;
//Set a not done flag
GetOperations()->SetNotDone();
GEOMImpl_ICurvesOperations::CurveType aType;
switch(theCurveType) {
case GEOM::Polyline:
@ -453,18 +454,17 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char*
break;
default:
break;
}
}
// Make Polyline
Handle(GEOM_Object) anObject =
GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
theParamMin, theParamMax,
theParamStep, aType);
GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
theParamMin, theParamMax,
theParamStep, aType);
if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn();
return aGEOMObject._retn();
return GetObject(anObject);
}
@ -473,13 +473,15 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametric(const char*
* MakeCurveParametricNew
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, CORBA::Long theParamNbStep,
GEOM::curve_type theCurveType) {
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew
(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, CORBA::Long theParamNbStep,
GEOM::curve_type theCurveType)
{
GEOM::GEOM_Object_var aGEOMObject;
//Set a not done flag
GetOperations()->SetNotDone();
GEOMImpl_ICurvesOperations::CurveType aType;
switch(theCurveType) {
case GEOM::Polyline:
@ -493,18 +495,17 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeCurveParametricNew(const cha
break;
default:
break;
}
}
// Make Polyline
Handle(GEOM_Object) anObject =
GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
theParamMin, theParamMax,
GetOperations()->MakeCurveParametric(thexExpr, theyExpr, thezExpr,
theParamMin, theParamMax,
0.0, aType, theParamNbStep, true);
if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn();
return aGEOMObject._retn();
return GetObject(anObject);
}
@ -534,6 +535,46 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcher
return GetObject(anObject);
}
//=============================================================================
/*!
* MakeSketcherOnPlane
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane
(const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane)
{
//Set a not done flag
GetOperations()->SetNotDone();
Handle(GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane);
// Make Sketcher
Handle(GEOM_Object) anObject =
GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane);
if (!GetOperations()->IsDone() || anObject.IsNull())
return GEOM::GEOM_Object::_nil();
return GetObject(anObject);
}
//=============================================================================
/*!
* Make3DSketcherCommand
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcherCommand (const char* theCommand)
{
//Set a not done flag
GetOperations()->SetNotDone();
// Make 3D Sketcher
Handle(GEOM_Object) anObject = GetOperations()->Make3DSketcherCommand(theCommand);
if (!GetOperations()->IsDone() || anObject.IsNull())
return GEOM::GEOM_Object::_nil();
return GetObject(anObject);
}
//=============================================================================
/*!
* Make3DSketcher
@ -559,25 +600,3 @@ GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::Make3DSketcher
return GetObject(anObject);
}
//=============================================================================
/*!
* MakeSketcherOnPlane
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ICurvesOperations_i::MakeSketcherOnPlane
(const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane)
{
//Set a not done flag
GetOperations()->SetNotDone();
Handle(GEOM_Object) aWorkingPlane = GetObjectImpl(theWorkingPlane);
// Make Sketcher
Handle(GEOM_Object) anObject =
GetOperations()->MakeSketcherOnPlane(theCommand, aWorkingPlane);
if (!GetOperations()->IsDone() || anObject.IsNull())
return GEOM::GEOM_Object::_nil();
return GetObject(anObject);
}

View File

@ -18,7 +18,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
//
#ifndef _GEOM_ICurvesOperations_i_HeaderFile
#define _GEOM_ICurvesOperations_i_HeaderFile
@ -33,49 +32,49 @@
#include "GEOMImpl_ICurvesOperations.hxx"
class GEOM_I_EXPORT GEOM_ICurvesOperations_i :
class GEOM_I_EXPORT GEOM_ICurvesOperations_i :
public virtual POA_GEOM::GEOM_ICurvesOperations,
public virtual GEOM_IOperations_i
{
public:
GEOM_ICurvesOperations_i (PortableServer::POA_ptr thePOA, GEOM::GEOM_Gen_ptr theEngine,
::GEOMImpl_ICurvesOperations* theImpl);
::GEOMImpl_ICurvesOperations* theImpl);
~GEOM_ICurvesOperations_i();
GEOM::GEOM_Object_ptr MakeCirclePntVecR (GEOM::GEOM_Object_ptr theCenter,
GEOM::GEOM_Object_ptr theVector,
double theR);
GEOM::GEOM_Object_ptr theVector,
double theR);
GEOM::GEOM_Object_ptr MakeCircleThreePnt (GEOM::GEOM_Object_ptr thePnt1,
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr MakeCircleCenter2Pnt (GEOM::GEOM_Object_ptr thePnt1,
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr MakeEllipse (GEOM::GEOM_Object_ptr theCenter,
GEOM::GEOM_Object_ptr theVector,
double theRMajor, double theRMinor);
GEOM::GEOM_Object_ptr theVector,
double theRMajor, double theRMinor);
GEOM::GEOM_Object_ptr MakeEllipseVec (GEOM::GEOM_Object_ptr theCenter,
GEOM::GEOM_Object_ptr theVector,
double theRMajor, double theRMinor,
GEOM::GEOM_Object_ptr theVectorMajor);
GEOM::GEOM_Object_ptr theVector,
double theRMajor, double theRMinor,
GEOM::GEOM_Object_ptr theVectorMajor);
GEOM::GEOM_Object_ptr MakeArc (GEOM::GEOM_Object_ptr thePnt1,
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr MakeArcCenter (GEOM::GEOM_Object_ptr thePnt1,
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3,
bool theSense);
GEOM::GEOM_Object_ptr MakeArcOfEllipse (GEOM::GEOM_Object_ptr thePnt1,
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr thePnt2,
GEOM::GEOM_Object_ptr thePnt3);
GEOM::GEOM_Object_ptr MakePolyline (const GEOM::ListOfGO& thePoints,
CORBA::Boolean theIsClosed);
@ -86,20 +85,24 @@ class GEOM_I_EXPORT GEOM_ICurvesOperations_i :
CORBA::Boolean theIsClosed,
CORBA::Boolean theDoReordering);
GEOM::GEOM_Object_ptr MakeCurveParametric(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
GEOM::curve_type theCurveType);
GEOM::GEOM_Object_ptr MakeCurveParametricNew(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, CORBA::Long theParamNbStep,
GEOM::curve_type theCurveType);
GEOM::GEOM_Object_ptr MakeCurveParametric
(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, double theParamStep,
GEOM::curve_type theCurveType);
GEOM::GEOM_Object_ptr MakeCurveParametricNew
(const char* thexExpr, const char* theyExpr, const char* thezExpr,
double theParamMin, double theParamMax, CORBA::Long theParamNbStep,
GEOM::curve_type theCurveType);
GEOM::GEOM_Object_ptr MakeSketcher (const char* theCommand, const GEOM::ListOfDouble& theWorkingPlane);
GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates);
GEOM::GEOM_Object_ptr MakeSketcherOnPlane (const char* theCommand, GEOM::GEOM_Object_ptr theWorkingPlane);
GEOM::GEOM_Object_ptr Make3DSketcherCommand (const char* theCommand);
GEOM::GEOM_Object_ptr Make3DSketcher (const GEOM::ListOfDouble& theCoordinates);
::GEOMImpl_ICurvesOperations* GetOperations()
{ return (::GEOMImpl_ICurvesOperations*)GetImpl(); }
};

View File

@ -1622,7 +1622,6 @@ class geompyDC(GEOM._objref_GEOM_Gen):
# - "C radius length" : Create arc by direction, radius and length(in degree)
# - "AA x y": Create arc by point at X & Y
# - "A dx dy" : Create arc by point with DX & DY
# - "A dx dy" : Create arc by point with DX & DY
# - "UU x y radius flag1": Create arc by point at X & Y with given radiUs
# - "U dx dy radius flag1" : Create arc by point with DX & DY with given radiUs
# - "EE x y xc yc flag1 flag2": Create arc by point at X & Y with given cEnter coordinates
@ -1672,7 +1671,6 @@ class geompyDC(GEOM._objref_GEOM_Gen):
- "C radius length" : Create arc by direction, radius and length(in degree)
- "AA x y": Create arc by point at X & Y
- "A dx dy" : Create arc by point with DX & DY
- "A dx dy" : Create arc by point with DX & DY
- "UU x y radius flag1": Create arc by point at X & Y with given radiUs
- "U dx dy radius flag1" : Create arc by point with DX & DY with given radiUs
- "EE x y xc yc flag1 flag2": Create arc by point at X & Y with given cEnter coordinates
@ -1729,8 +1727,10 @@ class geompyDC(GEOM._objref_GEOM_Gen):
Returns:
New GEOM.GEOM_Object, containing the created wire.
"""
theCommand,Parameters = ParseSketcherCommand(theCommand)
anObj = self.CurvesOp.MakeSketcherOnPlane(theCommand, theWorkingPlane)
RaiseIfFailed("MakeSketcherOnPlane", self.CurvesOp)
anObj.SetParameters(Parameters)
return anObj
## Create a sketcher wire, following the numerical description,
@ -1758,6 +1758,21 @@ class geompyDC(GEOM._objref_GEOM_Gen):
anObj.SetParameters(Parameters)
return anObj
## Obtain a 3D sketcher interface
def Sketcher3D (self):
"""
Example of usage:
sk = geompy.Sketcher3D()
sk.addPointsAbsolute(0, 0, 0)
sk.addPointsAbsolute(70, 0, 0)
sk.addPointsRelative(0, 0, 130)
sk.addPointAnglesLength("OXY", 50, 0, 100)
sk.addPointAnglesLength("OXZ", 30, 80, 130)
a3D_Sketcher_1 = sk.makeWire()
"""
sk = Sketcher3D (self)
return sk
# end of l3_sketcher
## @}
@ -1771,7 +1786,7 @@ class geompyDC(GEOM._objref_GEOM_Gen):
#
# @return New GEOM.GEOM_Object, containing the created box.
# @ref tui_creation_box "Example"
def MakeBox(self,x1,y1,z1,x2,y2,z2):
def MakeBox (self, x1,y1,z1, x2,y2,z2):
"""
Create a box by coordinates of two opposite vertices.
@ -8836,6 +8851,67 @@ class geompyDC(GEOM._objref_GEOM_Gen):
RaiseIfFailed("AddTexture", self.InsertOp)
return ID
## 3D Sketcher functionality
## Use geompy.Sketcher3D() to obtain an instance of this class
def printVar (var):
if isinstance(var, str):
return "\'%s\'"%var
else:
return "%.7f"%var
class Sketcher3D:
def __init__(self, geompyD):
self.geompyD = geompyD
self.myCommand = "3DSketcher"
pass
def addPointsAbsolute (self, *listCoords):
ii = 1
for cc in listCoords:
if ii == 1:
self.myCommand = self.myCommand + ":TT"
#self.myCommand = self.myCommand + " %.7f"%cc
self.myCommand = self.myCommand + " %s"%printVar(cc)
if ii == 3:
ii = 1
else:
ii = ii + 1
pass
def addPointsRelative (self, *listCoords):
ii = 1
for cc in listCoords:
if ii == 1:
self.myCommand = self.myCommand + ":T"
#self.myCommand = self.myCommand + " %.7f"%cc
self.myCommand = self.myCommand + " %s"%printVar(cc)
if ii == 3:
ii = 1
else:
ii = ii + 1
pass
## axes can be: "OXY", "OYZ" or "OXZ"
def addPointAnglesLength (self, axes, angle1, angle2, length):
#self.myCommand = self.myCommand + ":%s %.7f %.7f %.7f" % (axes, angle1, angle2, length)
self.myCommand = self.myCommand + ":%s %s %s %s" % (axes, printVar(angle1), printVar(angle2), printVar(length))
pass
def close (self):
self.myCommand = self.myCommand + ":WW"
pass
## Obtain the sketcher result
def wire (self):
print "myCommand =", self.myCommand
Command,Parameters = ParseSketcherCommand(self.myCommand)
print "Command =", Command
wire = self.geompyD.CurvesOp.Make3DSketcherCommand(Command)
self.myCommand = "3DSketcher"
RaiseIfFailed("Sketcher3D", self.geompyD.CurvesOp)
wire.SetParameters(Parameters)
return wire
import omniORB
#Register the new proxy for GEOM_Gen
omniORB.registerObjref(GEOM._objref_GEOM_Gen._NP_RepositoryId, geompyDC)