IMP 0021068 (Projection) and bug 0021110 (Low efficiency of the explode)

This commit is contained in:
jfa 2011-04-22 11:47:35 +00:00
parent eb734a1dc1
commit b5c1f9a735
26 changed files with 816 additions and 50 deletions

View File

@ -906,6 +906,14 @@ module GEOM
*/
GEOM_Object OffsetShapeCopy (in GEOM_Object theObject, in double theOffset);
/*!
* Create new object as projection of the given one on a 2D surface.
* \param theSource The source object for the projection. It can be a point, edge or wire.
* \param theTarget The target object. It can be planar or cylindrical face.
* \return New GEOM_Object, containing the projection.
*/
GEOM_Object ProjectShapeCopy (in GEOM_Object theSource, in GEOM_Object theTarget);
/*!
* Scale the given object by the factor.
* \param theObject The object to be scaled.
@ -1558,12 +1566,26 @@ module GEOM
/*!
* Get a sub shape defined by its unique ID inside \a theMainShape
* \param theMainShape Main shape.
* \param theID Unique ID of sub shape inside \a theMainShape.
* \return GEOM_Object, corresponding to found sub shape.
* \note The sub shape GEOM_Objects can has ONLY ONE function.
* Don't try to apply modification operations on them.
* Don't try to apply modification operations (without copy) on them.
*/
GEOM_Object GetSubShape (in GEOM_Object theMainShape,
in long theID);
/*!
* Get a set of sub shapes defined by their unique IDs inside \a theMainShape
* \param theMainShape Main shape.
* \param theIndices List of unique IDs of sub shapes inside \a theMainShape.
* \return List of GEOM_Objects, corresponding to found sub shapes.
* \note The sub shape GEOM_Objects can has ONLY ONE function.
* Don't try to apply modification operations (without copy) on them.
*/
ListOfGO MakeSubShapes (in GEOM_Object theMainShape,
in ListOfLong theIndices);
/*!
* Get global index of \a theSubShape in \a theMainShape.
* \param theMainShape Main shape.
@ -3625,7 +3647,7 @@ module GEOM
/*!
* Add a sub shape defined by indices in \a theIndices
* (contains unique IDs of sub shapes inside theMainShape)
* (contains unique IDs of sub shapes inside \a theMainShape)
* \note The sub shape GEOM_Objects can has ONLY ONE function.
* Don't try to apply modification operations on them.
* \note Internal method

View File

@ -112,6 +112,7 @@ multitranslationdouble.png \
multitranslationsimple.png \
normale.png \
offset.png \
projection.png \
origin_and_vectors.png \
partition.png \
partitionkeep.png \

BIN
resources/projection.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

View File

@ -726,35 +726,31 @@ bool EntityGUI_SubShapeDlg::isValid (QString& msg)
bool EntityGUI_SubShapeDlg::execute (ObjectList& objects)
{
GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
//GEOM::ListOfGO_var aList = anOper->ExtractSubShapes(myObject, shapeType(), true);
GEOM::ListOfGO_var aList = anOper->ExtractSubShapes(myObject, shapeType(), isAllSubShapes());
if (!aList->length())
return false;
// Throw away sub-shapes not selected by user if not in preview mode
// and manual selection is active
if (!isAllSubShapes()) {
// manual selection
TColStd_IndexedMapOfInteger aMapIndex;
int nbSel = getSelectedSubshapes(aMapIndex);
if (nbSel > 0) {
//GEOM::GEOM_ILocalOperations_var aLocOp =
// getGeomEngine()->GetILocalOperations(getStudyId());
TopTools_IndexedMapOfShape aSubShapesMap;
TopExp::MapShapes(myShape, aSubShapesMap);
int i;
for (int i = 0, n = aList->length(); i < n; i++) {
//if (aMapIndex.Contains(aLocOp->GetSubShapeIndex(myObject, aList[i])))
TopoDS_Shape aSShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), aList[i]);
if (aMapIndex.Contains(aSubShapesMap.FindIndex(aSShape)))
objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i]));
else
aList[i]->UnRegister();
}
GEOM::ListOfLong_var anArray = new GEOM::ListOfLong;
anArray->length(nbSel);
for (i = 1; i <= nbSel; i++)
anArray[i - 1] = aMapIndex.FindKey(i);
GEOM::ListOfGO_var aList = anOper->MakeSubShapes(myObject, anArray);
int n = aList->length();
for (i = 0; i < n; i++)
objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i]));
}
}
else {
GEOM::ListOfGO_var aList = anOper->ExtractSubShapes(myObject, shapeType(), true);
if (!aList->length())
return false;
for (int i = 0, n = aList->length(); i < n; i++)
objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i]));
}

View File

@ -18,12 +18,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 : GEOMGUI.cxx
// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
//
#include "GEOMGUI.h"
#include "GeometryGUI.h"
@ -109,4 +108,3 @@ GeometryGUI* GEOMGUI::getGeometryGUI()
{
return myGeometryGUI;
}

View File

@ -341,6 +341,10 @@
<source>ICON_DLG_OFFSET</source>
<translation>offset.png</translation>
</message>
<message>
<source>ICON_DLG_PROJECTION</source>
<translation>projection.png</translation>
</message>
<message>
<source>ICON_DLG_PARTITION</source>
<translation>partition.png</translation>
@ -921,6 +925,10 @@
<source>ICO_OFFSET</source>
<translation>offset.png</translation>
</message>
<message>
<source>ICO_PROJECTION</source>
<translation>projection.png</translation>
</message>
<message>
<source>ICO_ORIGIN_AND_VECTORS</source>
<translation>origin_and_vectors.png</translation>

View File

@ -1065,6 +1065,22 @@ Please, select face, shell or solid and try again</translation>
<source>GEOM_OFFSET_TITLE</source>
<translation>Offset Surface</translation>
</message>
<message>
<source>GEOM_PROJECTION</source>
<translation>Projection</translation>
</message>
<message>
<source>GEOM_PROJECTION_TITLE</source>
<translation>Projection on Face</translation>
</message>
<message>
<source>GEOM_SOURCE_OBJECT</source>
<translation>Source vertex, edge or wire</translation>
</message>
<message>
<source>GEOM_TARGET_OBJECT</source>
<translation>Target face</translation>
</message>
<message>
<source>GEOM_OPERATIONS</source>
<translation>Operations</translation>
@ -2425,6 +2441,10 @@ Please, select face, shell or solid and try again</translation>
<source>MEN_OFFSET</source>
<translation>Offset Surface</translation>
</message>
<message>
<source>MEN_PROJECTION</source>
<translation>Projection</translation>
</message>
<message>
<source>MEN_OPERATIONS</source>
<translation>Operations</translation>
@ -3077,6 +3097,10 @@ Please, select face, shell or solid and try again</translation>
<source>STB_OFFSET</source>
<translation>Offset surface</translation>
</message>
<message>
<source>STB_PROJECTION</source>
<translation>Project a point, an edge or a wire on a face</translation>
</message>
<message>
<source>STB_ORIGIN_AND_VECTORS</source>
<translation>Create an origin and base Vectors</translation>
@ -3613,6 +3637,10 @@ Please, select face, shell or solid and try again</translation>
<source>TOP_OFFSET</source>
<translation>Offset surface</translation>
</message>
<message>
<source>TOP_PROJECTION</source>
<translation>Projection</translation>
</message>
<message>
<source>TOP_ORIGIN_AND_VECTORS</source>
<translation>Create an origin and base Vectors</translation>

View File

@ -468,6 +468,7 @@ void GeometryGUI::OnGUIEvent( int id )
case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR
case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE
case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET
case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION
case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION
case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION
case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
@ -710,6 +711,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( GEOMOp::OpMirror, "MIRROR" );
createGeomAction( GEOMOp::OpScale, "SCALE" );
createGeomAction( GEOMOp::OpOffset, "OFFSET" );
createGeomAction( GEOMOp::OpProjection, "PROJECTION" );
createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
createGeomAction( GEOMOp::OpMultiRotate, "MUL_ROTATION" );
@ -898,6 +900,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createMenu( GEOMOp::OpMirror, transId, -1 );
createMenu( GEOMOp::OpScale, transId, -1 );
createMenu( GEOMOp::OpOffset, transId, -1 );
createMenu( GEOMOp::OpProjection, transId, -1 );
createMenu( separator(), transId, -1 );
createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
createMenu( GEOMOp::OpMultiRotate, transId, -1 );
@ -1034,6 +1037,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createTool( GEOMOp::OpMirror, transTbId );
createTool( GEOMOp::OpScale, transTbId );
createTool( GEOMOp::OpOffset, transTbId );
createTool( GEOMOp::OpProjection, transTbId );
createTool( separator(), transTbId );
createTool( GEOMOp::OpMultiTranslate, transTbId );
createTool( GEOMOp::OpMultiRotate, transTbId );

View File

@ -114,6 +114,7 @@ namespace GEOMOp {
OpMultiTranslate = 3606, // MENU OPERATIONS - TRANSFORMATION - MULTI-TRANSLATION
OpMultiRotate = 3607, // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION
OpReimport = 3608, // POPUP MENU - RELOAD IMPORTED
OpProjection = 3609, // MENU OPERATIONS - TRANSFORMATION - PROJECTION
// OperationGUI
OpPartition = 3700, // MENU OPERATION - PARTITION
OpArchimede = 3701, // MENU OPERATION - ARCHIMEDE

View File

@ -18,10 +18,9 @@
// 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 intreface to a function for the Mirror creation.
//
//NOTE: This is an interface to a function for the Mirror creation.
#include "GEOM_Function.hxx"
#define MIRROR_ARG_ORIGINAL 1

View File

@ -1196,6 +1196,89 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetSubShape
return anObj;
}
//=============================================================================
/*!
* MakeSubShapes
*/
//=============================================================================
Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeSubShapes
(Handle(GEOM_Object) theMainShape,
Handle(TColStd_HArray1OfInteger) theIndices)
{
SetErrorCode(KO);
Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient;
if (!theIndices->Length()) {
SetErrorCode(NOT_FOUND_ANY);
return aSeq;
}
if (theMainShape.IsNull()) return NULL;
TopoDS_Shape aShape = theMainShape->GetValue();
if (aShape.IsNull()) return NULL;
Handle(GEOM_Function) aMainShape = theMainShape->GetLastFunction();
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aShape, anIndices);
Handle(TColStd_HArray1OfInteger) anArray;
Handle(GEOM_Object) anObj;
TCollection_AsciiString anAsciiList, anEntry;
Standard_Integer i, low = theIndices->Lower(), up = theIndices->Upper();
for (i = low; i <= up; i++) {
int id = theIndices->Value(i);
if (1 <= id && id <= anIndices.Extent()) {
TopoDS_Shape aValue = anIndices.FindKey(id);
anArray = new TColStd_HArray1OfInteger(1,1);
anArray->SetValue(1, id);
anObj = GetEngine()->AddObject(GetDocID(), GEOM_SUBSHAPE);
if (!anObj.IsNull()) {
Handle(GEOM_Function) aFunction = anObj->AddFunction(GEOM_Object::GetSubShapeID(), 1);
if (aFunction.IsNull()) return aSeq;
GEOM_ISubShape aSSI (aFunction);
aSSI.SetMainShape(aMainShape);
aSSI.SetIndices(anArray);
// Set function value directly, as we know it.
// Usage of Solver here would lead to significant loss of time,
// because GEOM_SubShapeDriver will build TopTools_IndexedMapOfShape
// on the main shape for each being calculated sub-shape separately.
aFunction->SetValue(aValue);
// Put this subshape in the list of subshapes of theMainShape
aMainShape->AddSubShapeReference(aFunction);
aSeq->Append(anObj);
// for python command
TDF_Tool::Entry(anObj->GetEntry(), anEntry);
anAsciiList += anEntry;
anAsciiList += ",";
}
}
}
//Make a Python command
anAsciiList.Trunc(anAsciiList.Length() - 1);
GEOM::TPythonDump pd (aMainShape, /*append=*/true);
pd << "[" << anAsciiList.ToCString() << "] = geompy.SubShapes("
<< theMainShape << ", [" ;
for (i = low; i <= up - 1; i++) {
pd << theIndices->Value(i) << ", ";
}
pd << theIndices->Value(up) << "])";
SetErrorCode(OK);
return aSeq;
}
//=============================================================================
/*!
* GetSubShapeIndex

View File

@ -123,6 +123,10 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations
Standard_EXPORT Handle(GEOM_Object) GetSubShape (Handle(GEOM_Object) theMainShape,
const Standard_Integer theID);
Standard_EXPORT Handle(TColStd_HSequenceOfTransient) MakeSubShapes
(Handle(GEOM_Object) theMainShape,
Handle(TColStd_HArray1OfInteger) theIndices);
Standard_EXPORT Standard_Integer GetSubShapeIndex (Handle(GEOM_Object) theMainShape,
Handle(GEOM_Object) theSubShape);

View File

@ -1176,6 +1176,60 @@ Handle(GEOM_Object) GEOMImpl_ITransformOperations::OffsetShapeCopy
}
//=============================================================================
/*!
* ProjectShapeCopy
*/
//=============================================================================
Handle(GEOM_Object) GEOMImpl_ITransformOperations::ProjectShapeCopy
(Handle(GEOM_Object) theSource, Handle(GEOM_Object) theTarget)
{
SetErrorCode(KO);
if (theSource.IsNull() || theTarget.IsNull()) return NULL;
Handle(GEOM_Function) aLastFunction = theSource->GetLastFunction();
if (aLastFunction.IsNull()) return NULL; //There is no function which creates an object to be projected
//Add a new Projection object
Handle(GEOM_Object) aCopy = GetEngine()->AddObject(GetDocID(), GEOM_PROJECTION);
//Add a Projection function
Handle(GEOM_Function) aFunction =
aCopy->AddFunction(GEOMImpl_MirrorDriver::GetID(), PROJECTION_COPY);
//Check if the function is set correctly
if (aFunction->GetDriverGUID() != GEOMImpl_MirrorDriver::GetID()) return NULL;
GEOMImpl_IMirror aTI (aFunction);
aTI.SetPlane(theTarget->GetLastFunction());
aTI.SetOriginal(aLastFunction);
//Compute the Projection
try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
if (!GetSolver()->ComputeFunction(aFunction)) {
SetErrorCode("Projection driver failed");
return NULL;
}
}
catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
SetErrorCode(aFail->GetMessageString());
return NULL;
}
//Make a Python command
GEOM::TPythonDump(aFunction) << aCopy << " = geompy.MakeProjection("
<< theSource << ", " << theTarget << ")";
SetErrorCode(OK);
return aCopy;
}
//=============================================================================
/*!
* ScaleShape

View File

@ -109,6 +109,9 @@ class GEOMImpl_ITransformOperations : public GEOM_IOperations
Standard_EXPORT Handle(GEOM_Object) OffsetShapeCopy (Handle(GEOM_Object) theObject,
double theOffset);
Standard_EXPORT Handle(GEOM_Object) ProjectShapeCopy (Handle(GEOM_Object) theSource,
Handle(GEOM_Object) theTarget);
Standard_EXPORT Handle(GEOM_Object) ScaleShape (Handle(GEOM_Object) theObject,
Handle(GEOM_Object) thePoint,
double theFactor);

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>
@ -30,6 +29,10 @@
#include <BRep_Tool.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepClass_FaceClassifier.hxx>
#include <BRepOffsetAPI_NormalProjection.hxx>
#include <BRepTools.hxx>
#include <TopAbs.hxx>
#include <TopExp.hxx>
@ -40,6 +43,7 @@
#include <TopoDS_Vertex.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <Geom_Plane.hxx>
#include <gp_Trsf.hxx>
@ -89,6 +93,120 @@ Standard_Integer GEOMImpl_MirrorDriver::Execute(TFunction_Logbook& log) const
TopoDS_Shape anOriginal = anOriginalFunction->GetValue();
if (anOriginal.IsNull()) return 0;
// Projection
if (aType == PROJECTION_COPY) {
// Source shape (point, edge or wire)
if (anOriginal.ShapeType() != TopAbs_VERTEX &&
anOriginal.ShapeType() != TopAbs_EDGE &&
anOriginal.ShapeType() != TopAbs_WIRE) {
Standard_ConstructionError::Raise
("Projection aborted : the source shape is neither a vertex, nor an edge or a wire");
}
// Target face
Handle(GEOM_Function) aTargetFunction = TI.GetPlane();
if (aTargetFunction.IsNull()) return 0;
TopoDS_Shape aFaceShape = aTargetFunction->GetValue();
//if (aFaceShape.IsNull() || aFaceShape.ShapeType() != TopAbs_FACE) {
// Standard_ConstructionError::Raise
// ("Projection aborted : the target shape is not a face");
//}
Standard_Real tol = 1.e-4;
if (anOriginal.ShapeType() == TopAbs_VERTEX) {
if (aFaceShape.IsNull() || aFaceShape.ShapeType() != TopAbs_FACE) {
Standard_ConstructionError::Raise
("Projection aborted : the target shape is not a face");
}
TopoDS_Face aFace = TopoDS::Face(aFaceShape);
Handle(Geom_Surface) surface = BRep_Tool::Surface(aFace);
double U1, U2, V1, V2;
//surface->Bounds(U1, U2, V1, V2);
BRepTools::UVBounds(aFace, U1, U2, V1, V2);
// projector
GeomAPI_ProjectPointOnSurf proj;
proj.Init(surface, U1, U2, V1, V2, tol);
gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(anOriginal));
proj.Perform(aPnt);
if (!proj.IsDone()) {
Standard_ConstructionError::Raise
("Projection aborted : GeomAPI_ProjectPointOnSurf failed");
}
int nbPoints = proj.NbPoints();
if (nbPoints < 1) {
Standard_ConstructionError::Raise("No solution found");
}
Quantity_Parameter U, V;
proj.LowerDistanceParameters(U, V);
gp_Pnt2d aProjPnt (U, V);
// classifier
BRepClass_FaceClassifier aClsf (aFace, aProjPnt, tol);
if (aClsf.State() != TopAbs_IN && aClsf.State() != TopAbs_ON) {
bool isSol = false;
double minDist = RealLast();
for (int i = 1; i <= nbPoints; i++) {
Quantity_Parameter Ui, Vi;
proj.Parameters(i, Ui, Vi);
aProjPnt = gp_Pnt2d(Ui, Vi);
aClsf.Perform(aFace, aProjPnt, tol);
if (aClsf.State() == TopAbs_IN || aClsf.State() == TopAbs_ON) {
isSol = true;
double dist = proj.Distance(i);
if (dist < minDist) {
minDist = dist;
U = Ui;
V = Vi;
}
}
}
if (!isSol) {
Standard_ConstructionError::Raise("No solution found");
}
}
gp_Pnt surfPnt = surface->Value(U, V);
aShape = BRepBuilderAPI_MakeVertex(surfPnt).Shape();
}
else {
//see BRepTest_BasicCommands.cxx for example of BRepOffsetAPI_NormalProjection
BRepOffsetAPI_NormalProjection OrtProj (aFaceShape);
OrtProj.Add(anOriginal);
//Standard_Real tol = 1.e-4;
//Standard_Real tol2d = Pow(tol, 2./3);
//GeomAbs_Shape Continuity = GeomAbs_C2;
//Standard_Integer MaxDeg = 14;
//Standard_Integer MaxSeg = 16;
//OrtProj.SetParams(tol, tol2d, Continuity, MaxDeg, MaxSeg);
try {
OrtProj.Build();
} catch (Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
TCollection_AsciiString aMsg (aFail->GetMessageString());
if (!aMsg.Length())
aMsg = "Projection aborted : possibly the source shape intersects the cylinder's axis";
Standard_ConstructionError::Raise(aMsg.ToCString());
}
if (!OrtProj.IsDone()) {
Standard_ConstructionError::Raise
("Projection aborted : BRepOffsetAPI_NormalProjection failed");
}
aShape = OrtProj.Shape();
}
if (aShape.IsNull()) return 0;
aFunction->SetValue(aShape);
log.SetTouched(Label());
return 1;
}
// Bug 12158: Check for standalone (not included in faces) degenerated edges
TopTools_IndexedDataMapOfShapeListOfShape aEFMap;
TopExp::MapShapesAndAncestors(anOriginal, TopAbs_EDGE, TopAbs_FACE, aEFMap);
@ -118,8 +236,8 @@ Standard_Integer GEOMImpl_MirrorDriver::Execute(TFunction_Logbook& log) const
const gp_Dir dir = pos.Direction(); /* Main direction of the plane (Z axis) */
gp_Ax2 aPln (loc, dir);
aTrsf.SetMirror(aPln);
} else if (aType == MIRROR_AXIS || aType == MIRROR_AXIS_COPY) {
}
else if (aType == MIRROR_AXIS || aType == MIRROR_AXIS_COPY) {
Handle(GEOM_Function) anAxis = TI.GetAxis();
if (anAxis.IsNull()) return 0;
TopoDS_Shape anAxisShape = anAxis->GetValue();
@ -131,8 +249,8 @@ Standard_Integer GEOMImpl_MirrorDriver::Execute(TFunction_Logbook& log) const
gp_Vec aV (aP1, aP2);
gp_Ax1 anAx1 (aP1, aV);
aTrsf.SetMirror(anAx1);
} else if (aType == MIRROR_POINT || aType == MIRROR_POINT_COPY) {
}
else if (aType == MIRROR_POINT || aType == MIRROR_POINT_COPY) {
Handle(GEOM_Function) aPoint = TI.GetPoint();
if (aPoint.IsNull()) return 0;
TopoDS_Shape aVertexShape = aPoint->GetValue();
@ -141,7 +259,8 @@ Standard_Integer GEOMImpl_MirrorDriver::Execute(TFunction_Logbook& log) const
gp_Pnt aP = BRep_Tool::Pnt(aVertex);
aTrsf.SetMirror(aP);
} else {
}
else {
return 0;
}
@ -198,7 +317,5 @@ const Handle(GEOMImpl_MirrorDriver) Handle(GEOMImpl_MirrorDriver)::DownCast(cons
}
}
return _anOtherObject ;
return _anOtherObject;
}

View File

@ -93,6 +93,8 @@
#define GEOM_3DSKETCHER 44
#define GEOM_PROJECTION 45
//GEOM_Function types
#define COPY_WITH_REF 1
@ -154,6 +156,8 @@
#define OFFSET_SHAPE 1
#define OFFSET_SHAPE_COPY 2
#define PROJECTION_COPY 1
#define SCALE_SHAPE 1
#define SCALE_SHAPE_COPY 2
#define SCALE_SHAPE_AXES 3

View File

@ -2308,13 +2308,13 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainShap
if (CORBA::is_nil(theMainShape) || theIndices.length() < 1)
return GEOM::GEOM_Object::_nil();
CORBA::String_var entry = theMainShape->GetEntry();
Handle(GEOM_Object) aMainsShape = _impl->GetObject(theMainShape->GetStudyID(), entry);
if (aMainsShape.IsNull()) return GEOM::GEOM_Object::_nil();
Handle(GEOM_Object) aMainShape = _impl->GetObject(theMainShape->GetStudyID(), entry);
if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil();
Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length());
for(Standard_Integer i = 0; i<theIndices.length(); i++) anArray->SetValue(i+1, theIndices[i]);
Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainsShape, anArray, true);
Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true);
if(anObject.IsNull()) return GEOM::GEOM_Object::_nil();
TCollection_AsciiString anEntry;

View File

@ -91,9 +91,9 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdge
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeOnCurveByLength
(GEOM::GEOM_Object_ptr theCurve,
CORBA::Double theLength,
GEOM::GEOM_Object_ptr theStartPoint)
(GEOM::GEOM_Object_ptr theCurve,
CORBA::Double theLength,
GEOM::GEOM_Object_ptr theStartPoint)
{
GEOM::GEOM_Object_var aGEOMObject;
@ -126,8 +126,8 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeOnCurveByLength
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdgeWire
(GEOM::GEOM_Object_ptr theWire,
const CORBA::Double theLinearTolerance,
const CORBA::Double theAngularTolerance)
const CORBA::Double theLinearTolerance,
const CORBA::Double theAngularTolerance)
{
GEOM::GEOM_Object_var aGEOMObject;
@ -665,6 +665,42 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::GetSubShape
return GetObject(anObject);
}
//=============================================================================
/*!
* MakeSubShapes
*/
//=============================================================================
GEOM::ListOfGO* GEOM_IShapesOperations_i::MakeSubShapes (GEOM::GEOM_Object_ptr theMainShape,
const GEOM::ListOfLong& theIndices)
{
GEOM::ListOfGO_var aSeq = new GEOM::ListOfGO;
Standard_Integer i;
//Set a not done flag
GetOperations()->SetNotDone();
if (theIndices.length() < 1)
return aSeq._retn();
Handle(GEOM_Object) aShape = GetObjectImpl(theMainShape);
if (aShape.IsNull()) return aSeq._retn();
Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger (1, theIndices.length());
for (i = 0; i < theIndices.length(); i++)
anArray->SetValue(i+1, theIndices[i]);
Handle(TColStd_HSequenceOfTransient) aHSeq = GetOperations()->MakeSubShapes(aShape, anArray);
if (!GetOperations()->IsDone() || aHSeq.IsNull())
return aSeq._retn();
Standard_Integer aLength = aHSeq->Length();
aSeq->length(aLength);
for (i = 0; i < aLength; i++)
aSeq[i] = GetObject(Handle(GEOM_Object)::DownCast(aHSeq->Value(i+1)));
return aSeq._retn();
}
//=============================================================================
/*!
* GetSubShapeIndex

View File

@ -111,6 +111,9 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i :
GEOM::GEOM_Object_ptr GetSubShape (GEOM::GEOM_Object_ptr theMainShape,
CORBA::Long theID);
GEOM::ListOfGO* MakeSubShapes (GEOM::GEOM_Object_ptr theMainShape,
const GEOM::ListOfLong& theIndices);
CORBA::Long GetSubShapeIndex (GEOM::GEOM_Object_ptr theMainShape,
GEOM::GEOM_Object_ptr theSubShape);

View File

@ -636,6 +636,33 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::OffsetShapeCopy
return GetObject(anObject);
}
//=============================================================================
/*!
* ProjectShapeCopy
*/
//=============================================================================
GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::ProjectShapeCopy
(GEOM::GEOM_Object_ptr theSource,
GEOM::GEOM_Object_ptr theTarget)
{
GEOM::GEOM_Object_var aGEOMObject;
//Set a not done flag
GetOperations()->SetNotDone();
//Get the input objects
Handle(GEOM_Object) aSource = GetObjectImpl(theSource);
Handle(GEOM_Object) aTarget = GetObjectImpl(theTarget);
if (aSource.IsNull() || aTarget.IsNull()) return aGEOMObject._retn();
//Create the projection
Handle(GEOM_Object) anObject = GetOperations()->ProjectShapeCopy(aSource, aTarget);
if (!GetOperations()->IsDone() || anObject.IsNull())
return aGEOMObject._retn();
return GetObject(anObject);
}
//=============================================================================
/*!
* ScaleShape

View File

@ -121,6 +121,9 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
GEOM::GEOM_Object_ptr OffsetShapeCopy (GEOM::GEOM_Object_ptr theObject,
CORBA::Double theOffset);
GEOM::GEOM_Object_ptr ProjectShapeCopy (GEOM::GEOM_Object_ptr theSource,
GEOM::GEOM_Object_ptr theTarget);
GEOM::GEOM_Object_ptr ScaleShape (GEOM::GEOM_Object_ptr theObject,
GEOM::GEOM_Object_ptr thePoint,
CORBA::Double theFactor);

View File

@ -2319,6 +2319,18 @@ class geompyDC(GEOM._objref_GEOM_Gen):
RaiseIfFailed("ExtractSubShapes", self.ShapesOp)
return ListObj
## Get a set of sub shapes defined by their unique IDs inside <VAR>theMainShape</VAR>
# @param theMainShape Main shape.
# @param theIndices List of unique IDs of sub shapes inside <VAR>theMainShape</VAR>.
# @return List of GEOM_Objects, corresponding to found sub shapes.
#
# @ref swig_all_decompose "Example"
def SubShapes(self, aShape, anIDs):
# Example: see GEOM_TestAll.py
ListObj = self.ShapesOp.MakeSubShapes(aShape, anIDs)
RaiseIfFailed("SubShapes", self.ShapesOp)
return ListObj
# end of l4_decompose
## @}
@ -3005,6 +3017,18 @@ class geompyDC(GEOM._objref_GEOM_Gen):
anObj.SetParameters(Parameters)
return anObj
## Create new object as projection of the given one on a 2D surface.
# @param theSource The source object for the projection. It can be a point, edge or wire.
# @param theTarget The target object. It can be planar or cylindrical face.
# @return New GEOM_Object, containing the projection.
#
# @ref tui_projection "Example"
def MakeProjection(self, theSource, theTarget):
# Example: see GEOM_TestAll.py
anObj = self.TrsfOp.ProjectShapeCopy(theSource, theTarget)
RaiseIfFailed("ProjectShapeCopy", self.TrsfOp)
return anObj
# -----------------------------------------------------------------------------
# Patterns
# -----------------------------------------------------------------------------

View File

@ -15,13 +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 TRANSFORMATIONGUI :
# File : Makefile.am
# Author : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com)
# Package : TransformationGUI
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am
# header files
@ -34,6 +32,7 @@ salomeinclude_HEADERS = \
TransformationGUI_MirrorDlg.h \
TransformationGUI_ScaleDlg.h \
TransformationGUI_OffsetDlg.h \
TransformationGUI_ProjectionDlg.h \
TransformationGUI_PositionDlg.h
# Libraries targets
@ -48,6 +47,7 @@ dist_libTransformationGUI_la_SOURCES = \
TransformationGUI_MirrorDlg.h \
TransformationGUI_ScaleDlg.h \
TransformationGUI_OffsetDlg.h \
TransformationGUI_ProjectionDlg.h \
TransformationGUI_PositionDlg.h \
\
TransformationGUI.cxx \
@ -58,6 +58,7 @@ dist_libTransformationGUI_la_SOURCES = \
TransformationGUI_MirrorDlg.cxx \
TransformationGUI_ScaleDlg.cxx \
TransformationGUI_OffsetDlg.cxx \
TransformationGUI_ProjectionDlg.cxx \
TransformationGUI_PositionDlg.cxx
MOC_FILES = \
@ -68,6 +69,7 @@ MOC_FILES = \
TransformationGUI_MirrorDlg_moc.cxx \
TransformationGUI_ScaleDlg_moc.cxx \
TransformationGUI_OffsetDlg_moc.cxx \
TransformationGUI_ProjectionDlg_moc.cxx \
TransformationGUI_PositionDlg_moc.cxx
nodist_libTransformationGUI_la_SOURCES = \
@ -99,4 +101,3 @@ libTransformationGUI_la_LDFLAGS = \
../GEOMFiltersSelection/libGEOMFiltersSelection.la \
../GEOMBase/libGEOMBase.la \
$(CAS_LDPATH) -lTKShHealing

View File

@ -18,12 +18,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 : TransformationGUI.cxx
// Author : Damien COQUERET, Open CASCADE S.A.S.
//
#include "TransformationGUI.h"
#include <GEOMBase.h>
@ -46,6 +45,7 @@
#include "TransformationGUI_MirrorDlg.h" // Method MIRROR
#include "TransformationGUI_ScaleDlg.h" // Method SCALE
#include "TransformationGUI_OffsetDlg.h" // Method OFFSET
#include "TransformationGUI_ProjectionDlg.h" // Method PROJECTION
#include "TransformationGUI_PositionDlg.h" // Method POSITION
//=======================================================================
@ -97,6 +97,9 @@ bool TransformationGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
case GEOMOp::OpOffset: // OFFSET
aDlg = new TransformationGUI_OffsetDlg( getGeometryGUI(), parent );
break;
case GEOMOp::OpProjection: // PROJECTION
aDlg = new TransformationGUI_ProjectionDlg( getGeometryGUI(), parent );
break;
case GEOMOp::OpMultiTranslate: // MULTI TRANSLATION
aDlg = new TransformationGUI_MultiTranslationDlg( getGeometryGUI(), parent );
break;

View File

@ -0,0 +1,277 @@
// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
// File : TransformationGUI_ProjectionDlg.cxx
// Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
#include "TransformationGUI.h"
#include "TransformationGUI_ProjectionDlg.h"
#include <DlgRef.h>
#include <GeometryGUI.h>
#include <GEOMBase.h>
#include <SUIT_Session.h>
#include <SUIT_ResourceMgr.h>
#include <SalomeApp_Application.h>
#include <LightApp_SelectionMgr.h>
//=================================================================================
// class : TransformationGUI_ProjectionDlg()
// purpose : Constructs a TransformationGUI_ProjectionDlg which is a child of 'parent', with the
// name 'name' and widget flags set to 'f'.
// The dialog will by default be modeless, unless you set 'modal' to
// TRUE to construct a modal dialog.
//=================================================================================
TransformationGUI_ProjectionDlg::TransformationGUI_ProjectionDlg (GeometryGUI* theGeometryGUI,
QWidget* parent, bool modal, Qt::WindowFlags fl)
: GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl)
{
QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PROJECTION")));
QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
setWindowTitle(tr("GEOM_PROJECTION_TITLE"));
mainFrame()->GroupConstructors->setTitle(tr("GEOM_PROJECTION"));
mainFrame()->RadioButton1->setIcon(image0);
mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
mainFrame()->RadioButton3->close();
myGroup = new DlgRef_2Sel (centralWidget());
myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
myGroup->TextLabel1->setText(tr("GEOM_SOURCE_OBJECT"));
myGroup->TextLabel2->setText(tr("GEOM_TARGET_OBJECT"));
myGroup->PushButton1->setIcon(image1);
myGroup->PushButton2->setIcon(image1);
myGroup->LineEdit1->setReadOnly(true);
myGroup->LineEdit2->setReadOnly(true);
QVBoxLayout* layout = new QVBoxLayout(centralWidget());
layout->setMargin(0); layout->setSpacing(6);
layout->addWidget(myGroup);
setHelpFileName("projection_operation_page.html");
// Initialisation
Init();
}
//=================================================================================
// function : ~TransformationGUI_ProjectionDlg()
// purpose : Destroys the object and frees any allocated resources
//=================================================================================
TransformationGUI_ProjectionDlg::~TransformationGUI_ProjectionDlg()
{
}
//=================================================================================
// function : Init()
// purpose :
//=================================================================================
void TransformationGUI_ProjectionDlg::Init()
{
mainFrame()->GroupBoxPublish->show();
// init variables
myEditCurrentArgument = myGroup->LineEdit1;
myGroup->LineEdit1->setText("");
myGroup->LineEdit2->setText("");
myObject1.nullify();
myObject2.nullify();
showOnlyPreviewControl();
// signals and slots connections
connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(),
SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
initName(mainFrame()->GroupConstructors->title());
setTabOrder(mainFrame()->GroupConstructors, mainFrame()->GroupBoxName);
setTabOrder(mainFrame()->GroupBoxName, mainFrame()->GroupMedium);
setTabOrder(mainFrame()->GroupMedium, mainFrame()->GroupButtons);
mainFrame()->RadioButton1->setFocus();
globalSelection(GEOM_ALLSHAPES);
myGroup->PushButton1->click();
SelectionIntoArgument();
resize(100,100);
}
//=================================================================================
// function : ClickOnOk()
// purpose :
//=================================================================================
void TransformationGUI_ProjectionDlg::ClickOnOk()
{
setIsApplyAndClose(true);
if (ClickOnApply())
ClickOnCancel();
}
//=================================================================================
// function : ClickOnApply()
// purpose :
//=================================================================================
bool TransformationGUI_ProjectionDlg::ClickOnApply()
{
if (!onAccept())
return false;
initName();
// activate selection and connect selection manager
myGroup->PushButton1->click();
return true;
}
//=================================================================================
// function : SelectionIntoArgument()
// purpose : Called when selection is changed or on dialog initialization or activation
//=================================================================================
void TransformationGUI_ProjectionDlg::SelectionIntoArgument()
{
myEditCurrentArgument->setText("");
GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_SHAPE);
TopoDS_Shape aShape;
if (aSelectedObject && GEOMBase::GetShape(aSelectedObject.get(), aShape) && !aShape.IsNull()) {
QString aName = GEOMBase::GetName(aSelectedObject.get());
myEditCurrentArgument->setText(aName);
// clear selection
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
myGeomGUI->getApp()->selectionMgr()->clearSelected();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
if (myEditCurrentArgument == myGroup->LineEdit1) {
myObject1 = aSelectedObject;
if (!myObject2)
myGroup->PushButton2->click();
}
else if (myEditCurrentArgument == myGroup->LineEdit2) {
myObject2 = aSelectedObject;
if (!myObject1)
myGroup->PushButton1->click();
}
}
else {
if (myEditCurrentArgument == myGroup->LineEdit1) myObject1.nullify();
else if (myEditCurrentArgument == myGroup->LineEdit2) myObject2.nullify();
}
}
//=================================================================================
// function : SetEditCurrentArgument()
// purpose :
//=================================================================================
void TransformationGUI_ProjectionDlg::SetEditCurrentArgument()
{
QPushButton* send = (QPushButton*)sender();
if (send == myGroup->PushButton1) {
myEditCurrentArgument = myGroup->LineEdit1;
myGroup->PushButton2->setDown(false);
myGroup->LineEdit2->setEnabled(false);
}
else if (send == myGroup->PushButton2) {
myEditCurrentArgument = myGroup->LineEdit2;
myGroup->PushButton1->setDown(false);
myGroup->LineEdit1->setEnabled(false);
}
// enable line edit
myEditCurrentArgument->setEnabled(true);
myEditCurrentArgument->setFocus();
// after setFocus(), because it will be setDown(false) when loses focus
send->setDown(true);
}
//=================================================================================
// function : ActivateThisDialog()
// purpose :
//=================================================================================
void TransformationGUI_ProjectionDlg::ActivateThisDialog()
{
GEOMBase_Skeleton::ActivateThisDialog();
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
processPreview();
}
//=================================================================================
// function : enterEvent()
// purpose : when mouse enter onto the QWidget
//=================================================================================
void TransformationGUI_ProjectionDlg::enterEvent (QEvent*)
{
if (!mainFrame()->GroupConstructors->isEnabled())
ActivateThisDialog();
}
//=================================================================================
// function : createOperation
// purpose :
//=================================================================================
GEOM::GEOM_IOperations_ptr TransformationGUI_ProjectionDlg::createOperation()
{
return getGeomEngine()->GetITransformOperations(getStudyId());
}
//=================================================================================
// function : isValid
// purpose :
//=================================================================================
bool TransformationGUI_ProjectionDlg::isValid (QString&)
{
return myObject1 && myObject2;
}
//=================================================================================
// function : execute
// purpose :
//=================================================================================
bool TransformationGUI_ProjectionDlg::execute (ObjectList& objects)
{
GEOM::GEOM_Object_var anObj;
GEOM::GEOM_ITransformOperations_var anOper = GEOM::GEOM_ITransformOperations::_narrow(getOperation());
anObj = anOper->ProjectShapeCopy(myObject1.get(), myObject2.get());
if (!anObj->_is_nil())
objects.push_back(anObj._retn());
return true;
}

View File

@ -0,0 +1,70 @@
// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
// File : TransformationGUI_ProjectionDlg.h
// Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
#ifndef TRANSFORMATIONGUI_PROJECTIONDLG_H
#define TRANSFORMATIONGUI_PROJECTIONDLG_H
#include "GEOMBase_Skeleton.h"
#include "GEOM_GenericObjPtr.h"
class DlgRef_2Sel;
//=================================================================================
// class : TransformationGUI_ProjectionDlg
// purpose :
//=================================================================================
class TransformationGUI_ProjectionDlg : public GEOMBase_Skeleton
{
Q_OBJECT
public:
TransformationGUI_ProjectionDlg (GeometryGUI*, QWidget* = 0,
bool = false, Qt::WindowFlags = 0 );
~TransformationGUI_ProjectionDlg();
protected:
// redefined from GEOMBase_Helper
virtual GEOM::GEOM_IOperations_ptr createOperation();
virtual bool isValid (QString&);
virtual bool execute (ObjectList&);
private:
void Init();
void enterEvent (QEvent*);
private:
GEOM::GeomObjPtr myObject1;
GEOM::GeomObjPtr myObject2;
DlgRef_2Sel* myGroup;
private slots:
void ClickOnOk();
bool ClickOnApply();
void SetEditCurrentArgument();
void SelectionIntoArgument();
void ActivateThisDialog();
};
#endif // TRANSFORMATIONGUI_PROJECTIONDLG_H