diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx index ffe05748e..d4921d648 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -115,6 +116,9 @@ Standard_Integer GEOMImpl_HealingDriver::Execute(TFunction_Logbook& log) const case DIVIDE_EDGE: AddPointOnEdge(&HI, anOriginalShape, aShape); break; + case CHANGE_ORIENTATION: + ChangeOrientation(&HI, anOriginalShape, aShape); + break; default: return 0; } @@ -379,6 +383,27 @@ Standard_Boolean GEOMImpl_HealingDriver::AddPointOnEdge (GEOMImpl_IHealing* theH } +//======================================================================= +//function : ChangeOrientation +//purpose : +//======================================================================= +Standard_Boolean GEOMImpl_HealingDriver::ChangeOrientation (GEOMImpl_IHealing* theHI, + const TopoDS_Shape& theOriginalShape, + TopoDS_Shape& theOutShape) const +{ + ShHealOper_ChangeOrientation aHealer (theOriginalShape); + + Standard_Boolean aResult = aHealer.Perform(); + + if (aResult) + theOutShape = aHealer.GetResultShape(); + else + raiseNotDoneExeption( aHealer.GetErrorStatus() ); + + return aResult; +} + + //======================================================================= //function : GEOMImpl_HealingDriver_Type_ //purpose : diff --git a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx index aa1086b51..3bc27c1a8 100644 --- a/src/GEOMImpl/GEOMImpl_HealingDriver.hxx +++ b/src/GEOMImpl/GEOMImpl_HealingDriver.hxx @@ -163,7 +163,7 @@ Standard_Boolean RemoveIntWires( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS Standard_Boolean RemoveHoles ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean Sew ( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; Standard_Boolean AddPointOnEdge( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; - +Standard_Boolean ChangeOrientation( GEOMImpl_IHealing*, const TopoDS_Shape&, TopoDS_Shape& ) const; }; diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx index 1d3d9f420..4f35762f9 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.cxx @@ -773,3 +773,111 @@ bool GEOMImpl_IHealingOperations::GetFreeBoundary (Handle(GEOM_Object) theObject SetErrorCode(OK); return true; } + + +//============================================================================= +/*! + * ChangeOrientation + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientation (Handle(GEOM_Object) theObject) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) + return NULL; //There is no function which creates an object to be processed + + //Add the function + aFunction = theObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CHANGE_ORIENTATION); + + if (aFunction.IsNull()) + return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Healing 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) << "geompy.ChangeOrientation(" + << theObject << ")"; + + SetErrorCode(OK); + return theObject; +} + + +//============================================================================= +/*! + * ChangeOrientationCopy + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IHealingOperations::ChangeOrientationCopy (Handle(GEOM_Object) theObject) +{ + // set error code, check parameters + SetErrorCode(KO); + + if (theObject.IsNull()) + return NULL; + + Handle(GEOM_Function) aFunction, aLastFunction = theObject->GetLastFunction(); + if (aLastFunction.IsNull()) + return NULL; //There is no function which creates an object to be processed + + // Add a new object + Handle(GEOM_Object) aNewObject = GetEngine()->AddObject( GetDocID(), GEOM_COPY ); + + //Add the function + aFunction = aNewObject->AddFunction(GEOMImpl_HealingDriver::GetID(), CHANGE_ORIENTATION); + + if (aFunction.IsNull()) + return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_HealingDriver::GetID()) return NULL; + + // prepare "data container" class IHealing + GEOMImpl_IHealing HI(aFunction); + HI.SetOriginal( aLastFunction ); + + //Compute the translation + try { + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Healing 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) << aNewObject << " = geompy.ChangeOrientationCopy(" + << theObject << ")"; + + SetErrorCode(OK); + return aNewObject; +} + diff --git a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx index 1a7359374..3b36d040f 100644 --- a/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IHealingOperations.hxx @@ -81,6 +81,10 @@ class GEOMImpl_IHealingOperations : public GEOM_IOperations { Standard_EXPORT bool GetFreeBoundary ( Handle(GEOM_Object) theObject, Handle(TColStd_HSequenceOfTransient)& theOutClosedWires, Handle(TColStd_HSequenceOfTransient)& theOutOpenWires ); + + Standard_EXPORT Handle(GEOM_Object) ChangeOrientation( Handle(GEOM_Object) theObject); + Standard_EXPORT Handle(GEOM_Object) ChangeOrientationCopy( Handle(GEOM_Object) theObject); + }; #endif diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 4f679dd16..a1e340e29 100755 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -204,13 +204,14 @@ #define ARCHIMEDE_TYPE 1 // Shape Healing operators -#define SHAPE_PROCESS 1 -#define SUPPRESS_FACES 2 -#define CLOSE_CONTOUR 3 -#define REMOVE_INT_WIRES 4 -#define FILL_HOLES 5 -#define SEWING 6 -#define DIVIDE_EDGE 7 +#define SHAPE_PROCESS 1 +#define SUPPRESS_FACES 2 +#define CLOSE_CONTOUR 3 +#define REMOVE_INT_WIRES 4 +#define FILL_HOLES 5 +#define SEWING 6 +#define DIVIDE_EDGE 7 +#define CHANGE_ORIENTATION 8 #define BASIC_FILLING 1 diff --git a/src/RepairGUI/Makefile.in b/src/RepairGUI/Makefile.in index 3c698b919..b5aec03e1 100644 --- a/src/RepairGUI/Makefile.in +++ b/src/RepairGUI/Makefile.in @@ -50,6 +50,7 @@ LIB_SRC = RepairGUI.cxx \ RepairGUI_DivideEdgeDlg.cxx \ RepairGUI_FreeBoundDlg.cxx \ RepairGUI_FreeFacesDlg.cxx \ + RepairGUI_ChangeOrientationDlg.cxx \ RepairGUI_GlueDlg.cxx LIB_MOC = \ @@ -62,6 +63,7 @@ LIB_MOC = \ RepairGUI_DivideEdgeDlg.h \ RepairGUI_FreeBoundDlg.h \ RepairGUI_FreeFacesDlg.h \ + RepairGUI_ChangeOrientationDlg.h \ RepairGUI_GlueDlg.h LIB_CLIENT_IDL = SALOME_Exception.idl SALOME_GenericObj.idl SALOME_Component.idl diff --git a/src/RepairGUI/RepairGUI.cxx b/src/RepairGUI/RepairGUI.cxx index 32853a771..3631415bc 100644 --- a/src/RepairGUI/RepairGUI.cxx +++ b/src/RepairGUI/RepairGUI.cxx @@ -43,6 +43,7 @@ #include "RepairGUI_FreeBoundDlg.h" // Method FREE BOUNDARIES #include "RepairGUI_FreeFacesDlg.h" // Method FREE FACES #include "RepairGUI_GlueDlg.h" // Method GLUE FACES +#include "RepairGUI_ChangeOrientationDlg.h" // Method CHANGE ORIENTATION #include "utilities.h" @@ -86,8 +87,9 @@ bool RepairGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case 606: aDlg = new RepairGUI_CloseContourDlg (getGeometryGUI(), parent, ""); break; case 607: aDlg = new RepairGUI_RemoveIntWiresDlg(getGeometryGUI(), parent, ""); break; case 608: aDlg = new RepairGUI_DivideEdgeDlg (getGeometryGUI(), parent, ""); break; - case 609: aDlg = new RepairGUI_FreeBoundDlg (getGeometryGUI(), parent, ""); break; - case 610: aDlg = new RepairGUI_FreeFacesDlg (getGeometryGUI(), parent, ""); break; + case 609: aDlg = new RepairGUI_FreeBoundDlg (getGeometryGUI(), parent, ""); break; + case 610: aDlg = new RepairGUI_FreeFacesDlg (getGeometryGUI(), parent, ""); break; + case 611: aDlg = new RepairGUI_ChangeOrientationDlg (getGeometryGUI(), parent, ""); break; default: app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); break; diff --git a/src/RepairGUI/RepairGUI_ChangeOrientationDlg.cxx b/src/RepairGUI/RepairGUI_ChangeOrientationDlg.cxx new file mode 100644 index 000000000..afb28f5aa --- /dev/null +++ b/src/RepairGUI/RepairGUI_ChangeOrientationDlg.cxx @@ -0,0 +1,301 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 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 : RepairGUI_ChangeOrientationDlg.cxx +// Author : Sergey KUUL +// Module : GEOM + +#include "RepairGUI_ChangeOrientationDlg.h" + +#include "SalomeApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SUIT_Session.h" +#include "SALOME_ListIteratorOfListIO.hxx" + +#include "GEOMImpl_Types.hxx" + +#include + +#include + +using namespace std; + +//================================================================================= +// class : RepairGUI_ChangeOrientationDlg() +// purpose : Constructs a RepairGUI_ChangeOrientationDlg 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. +//================================================================================= +RepairGUI_ChangeOrientationDlg::RepairGUI_ChangeOrientationDlg(GeometryGUI* theGeometryGUI, + QWidget* parent, const char* name, + bool modal, WFlags fl) + :GEOMBase_Skeleton(theGeometryGUI, parent, name, modal, WStyle_Customize | + WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + //QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_SUPRESS_FACE"))); + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_CHANGE_ORIENTATION"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT"))); + + setCaption(tr("GEOM_CHANGE_ORIENTATION_TITLE")); + + /***************************************************************/ + GroupConstructors->setTitle(tr("GEOM_CHANGE_ORIENTATION_TITLE")); + RadioButton1->setPixmap(image0); + RadioButton2->close(TRUE); + RadioButton3->close(TRUE); + + GroupPoints = new DlgRef_1Sel1Check_QTD(this, "GroupPoints"); + GroupPoints->GroupBox1->setTitle(tr("GEOM_CHANGE_ORIENTATION")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->CheckButton1->setText(tr("GEOM_CREATE_COPY")); + GroupPoints->PushButton1->setPixmap(image1); +// GroupPoints->LineEdit1->setReadOnly( true ); + + Layout1->addWidget(GroupPoints, 2, 0); + + setHelpFileName("change_orientation.htm"); + + Init(); +} + + +//================================================================================= +// function : ~RepairGUI_ChangeOrientationDlg() +// purpose : Destroys the object and frees any allocated resources +//================================================================================= +RepairGUI_ChangeOrientationDlg::~RepairGUI_ChangeOrientationDlg() +{ +} + + +//================================================================================= +// function : Init() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::Init() +{ + /* init variables */ + myEditCurrentArgument = GroupPoints->LineEdit1; + + GroupPoints->CheckButton1->setChecked(true); + + myOkObject = false; + + /* signals and slots connections */ + connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + + connect(GroupPoints->CheckButton1, SIGNAL(toggled(bool)), this, SLOT(CreateCopyModeChanged(bool))); + + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + initName( tr( "CHANGE_ORIENTATION_NEW_OBJ_NAME" ) ); +} + + +//================================================================================= +// function : ClickOnOk() +// purpose : Same than click on apply but close this dialog. +//================================================================================= +void RepairGUI_ChangeOrientationDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_ChangeOrientationDlg::ClickOnApply() +{ +// if ( !onAccept() ) + if ( !onAccept(GroupPoints->CheckButton1->isChecked()) ) + return false; + + initName(); + + myEditCurrentArgument->setText(""); + + return true; +} + + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection as changed or other case +//================================================================================= +void RepairGUI_ChangeOrientationDlg::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + QString aName; + + if(myEditCurrentArgument == GroupPoints->LineEdit1) { + if (IObjectCount() != 1) { + if (myEditCurrentArgument == GroupPoints->LineEdit1) + myOkObject = false; + return; + } + } + + // nbSel == 1 + Standard_Boolean testResult = Standard_False; + GEOM::GEOM_Object_ptr aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( firstIObject(), testResult ); + + if (!testResult) + return; + + if (myEditCurrentArgument == GroupPoints->LineEdit1) { + myObject = aSelectedObject; + myOkObject = true; + } + + myEditCurrentArgument->setText( GEOMBase::GetName( aSelectedObject ) ); + +} + + +//================================================================================= +// function : SetEditCurrentArgument() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if( send == GroupPoints->PushButton1 ) + { + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; + } + SelectionIntoArgument(); +} + + +//================================================================================= +// function : LineEditReturnPressed() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::LineEditReturnPressed() +{ + QLineEdit* send = (QLineEdit*)sender(); + if( send == GroupPoints->LineEdit1 ) { + myEditCurrentArgument = GroupPoints->LineEdit1; + GEOMBase_Skeleton::LineEditReturnPressed(); + } +} + + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + +} + + +//================================================================================= +// function : enterEvent() +// purpose : Mouse enter onto the dialog to activate it +//================================================================================= +void RepairGUI_ChangeOrientationDlg::enterEvent(QEvent* e) +{ + if ( !GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + + +//================================================================================= +// function : closeEvent() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::closeEvent(QCloseEvent* e) +{ + //myGeomGUI->SetState( -1 ); + GEOMBase_Skeleton::closeEvent( e ); +} + + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr RepairGUI_ChangeOrientationDlg::createOperation() +{ + return getGeomEngine()->GetIHealingOperations( getStudyId() ); +} + + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool RepairGUI_ChangeOrientationDlg::isValid( QString& msg ) +{ + return myOkObject; +} + + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool RepairGUI_ChangeOrientationDlg::execute( ObjectList& objects ) +{ + bool toCreateCopy = GroupPoints->CheckButton1->isChecked(); + + GEOM::GEOM_Object_var anObj; + if(toCreateCopy) { + anObj = GEOM::GEOM_IHealingOperations::_narrow(getOperation())->ChangeOrientationCopy(myObject); + } + else { + anObj = GEOM::GEOM_IHealingOperations::_narrow(getOperation())->ChangeOrientation(myObject); + } + + if ( !anObj->_is_nil() ) + objects.push_back( anObj._retn() ); + + return true; +} + + +//================================================================================= +// function : CreateCopyModeChanged() +// purpose : +//================================================================================= +void RepairGUI_ChangeOrientationDlg::CreateCopyModeChanged(bool isCreateCopy) +{ + GroupBoxName->setEnabled(isCreateCopy); +} diff --git a/src/RepairGUI/RepairGUI_ChangeOrientationDlg.h b/src/RepairGUI/RepairGUI_ChangeOrientationDlg.h new file mode 100644 index 000000000..19f5be34c --- /dev/null +++ b/src/RepairGUI/RepairGUI_ChangeOrientationDlg.h @@ -0,0 +1,77 @@ +// GEOM GEOMGUI : GUI for Geometry component +// +// Copyright (C) 2003 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 : RepairGUI_ChangeOrientationDlg.h +// Author : Sergey KUUL +// Module : GEOM + +#ifndef DIALOGBOX_CHANGEORIENTATION_H +#define DIALOGBOX_CHANGEORIENTATION_H + +#include "GEOMBase_Skeleton.h" +#include "DlgRef_1Sel1Check_QTD.h" +#include + +//#include + +//================================================================================= +// class : RepairGUI_ChangeOrientationDlg +// purpose : +//================================================================================= +class RepairGUI_ChangeOrientationDlg : public GEOMBase_Skeleton +{ + Q_OBJECT + +public: + RepairGUI_ChangeOrientationDlg(GeometryGUI* theGeometryGUI, QWidget* parent = 0, + const char* name = 0, bool modal = FALSE, WFlags fl = 0); + ~RepairGUI_ChangeOrientationDlg(); + +protected: + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid( QString& ); + virtual bool execute( ObjectList& objects ); + +private : + void Init(); + void enterEvent(QEvent* e); + void closeEvent(QCloseEvent* e); + + GEOM::GEOM_Object_var myObject; + bool myOkObject; + + DlgRef_1Sel1Check_QTD* GroupPoints; + + +private slots: + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void LineEditReturnPressed(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); + void CreateCopyModeChanged(bool isCreateCopy); +}; + +#endif // DIALOGBOX_SUPPRESSFACES_H