Salome HOME
2d483cae70f3a8a3846561f638a9cc6960fb42af
[modules/geom.git] / src / OperationGUI / OperationGUI_GetSharedShapesDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  GEOM GEOMGUI : GUI for Geometry component
23 //  File   : OperationGUI_GetSharedShapesDlg.cxx
24 //  Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
25
26 #include "OperationGUI_GetSharedShapesDlg.h"
27
28 #include <DlgRef.h>
29 #include <GeometryGUI.h>
30 #include <GEOMBase.h>
31
32 #include <GEOMImpl_Types.hxx>
33
34 #include <SUIT_Desktop.h>
35 #include <SUIT_Session.h>
36 #include <SUIT_ResourceMgr.h>
37 #include <SUIT_MessageBox.h>
38 #include <SalomeApp_Application.h>
39 #include <LightApp_SelectionMgr.h>
40
41 #include <TopoDS_Iterator.hxx>
42 #include <TopoDS_Shape.hxx>
43
44 //=================================================================================
45 // class    : OperationGUI_GetSharedShapesDlg()
46 // purpose  : Constructs a OperationGUI_GetSharedShapesDlg which is a child of 'parent', with the
47 //            name 'name' and widget flags set to 'f'.
48 //            The dialog will by default be modeless, unless you set 'modal' to
49 //            TRUE to construct a modal dialog.
50 //=================================================================================
51 OperationGUI_GetSharedShapesDlg::OperationGUI_GetSharedShapesDlg
52 (GeometryGUI* theGeometryGUI, QWidget* parent)
53   : GEOMBase_Skeleton(theGeometryGUI, parent, false)
54 {
55   SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr();
56   QPixmap image0(aResMgr->loadPixmap("GEOM", tr("ICON_DLG_SHARED_SHAPES")));
57   QPixmap image2(aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
58
59   setWindowTitle(tr("GEOM_SHARED_SHAPES_TITLE"));
60
61   /***************************************************************/
62   mainFrame()->GroupConstructors->setTitle(tr("GEOM_GET_SHARED_SHAPES"));
63   mainFrame()->RadioButton1->setIcon(image0);
64   mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
65   mainFrame()->RadioButton2->close();
66   mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
67   mainFrame()->RadioButton3->close();
68
69   GroupPoints = new DlgRef_2Sel1List1Check(centralWidget());
70   GroupPoints->GroupBox1->setTitle(tr("GEOM_SHARED_SHAPES_INPUT"));
71   GroupPoints->TextLabel1->setText(tr("GEOM_SHAPES"));
72   GroupPoints->TextLabel2->hide();
73   GroupPoints->TextLabel3->setText(tr("GEOM_SUBSHAPE_TYPE"));
74   GroupPoints->PushButton1->setIcon(image2);
75   GroupPoints->PushButton2->hide();
76   GroupPoints->LineEdit1->setReadOnly(true);
77   GroupPoints->LineEdit2->hide();
78   GroupPoints->LineEdit1->setEnabled(true);
79   GroupPoints->CheckButton1->hide();
80
81   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
82   layout->setMargin(0); layout->setSpacing(6);
83   layout->addWidget(GroupPoints);
84
85   /***************************************************************/
86
87   setHelpFileName("shared_shapes_page.html");
88
89   Init();
90 }
91
92 //=================================================================================
93 // function : ~OperationGUI_GetSharedShapesDlg()
94 // purpose  : Destroys the object and frees any allocated resources
95 //=================================================================================
96 OperationGUI_GetSharedShapesDlg::~OperationGUI_GetSharedShapesDlg()
97 {
98   // no need to delete child widgets, Qt does it all for us
99 }
100
101 //=================================================================================
102 // function : Init()
103 // purpose  :
104 //=================================================================================
105 void OperationGUI_GetSharedShapesDlg::Init()
106 {
107   /* type for sub shape selection */
108   GroupPoints->ComboBox1->addItem(tr("GEOM_SOLID"));
109   GroupPoints->ComboBox1->addItem(tr("GEOM_SHELL"));
110   GroupPoints->ComboBox1->addItem(tr("GEOM_FACE"));
111   GroupPoints->ComboBox1->addItem(tr("GEOM_WIRE"));
112   GroupPoints->ComboBox1->addItem(tr("GEOM_EDGE"));
113   GroupPoints->ComboBox1->addItem(tr("GEOM_VERTEX"));
114
115   GroupPoints->ComboBox1->setCurrentIndex(0);
116
117   /* signals and slots connections */
118   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
119   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
120
121   connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
122
123   connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
124
125   connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
126
127   connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged()));
128
129   connect(myGeomGUI->getApp()->selectionMgr(),
130            SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
131
132   //initName(getNewObjectName());
133   initName(getPrefixByType());
134
135   ConstructorsClicked(0);
136   GroupPoints->PushButton1->click();
137 }
138
139 //=================================================================================
140 // function : ConstructorsClicked()
141 // purpose  : Radio button management
142 //=================================================================================
143 void OperationGUI_GetSharedShapesDlg::ConstructorsClicked (int constructorId)
144 {
145   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
146   globalSelection();
147
148   myListShapes.length(0);
149
150   GroupPoints->ComboBox1->setCurrentIndex(0);
151   GroupPoints->PushButton1->setDown(true);
152
153   myEditCurrentArgument = GroupPoints->LineEdit1;
154   GroupPoints->LineEdit1->clear();
155
156   qApp->processEvents();
157   updateGeometry();
158   resize(minimumSizeHint());
159
160   myEditCurrentArgument->setFocus();
161   connect(myGeomGUI->getApp()->selectionMgr(),
162           SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
163   SelectionIntoArgument();
164 }
165
166 //=================================================================================
167 // function : ClickOnOk()
168 // purpose  :
169 //=================================================================================
170 void OperationGUI_GetSharedShapesDlg::ClickOnOk()
171 {
172   if (ClickOnApply())
173     ClickOnCancel();
174 }
175
176 //=================================================================================
177 // function : ClickOnApply()
178 // purpose  :
179 //=================================================================================
180 bool OperationGUI_GetSharedShapesDlg::ClickOnApply()
181 {
182   if (!onAccept())
183     return false;
184
185   //initName(getNewObjectName());
186   initName(getPrefixByType());
187
188   return true;
189 }
190
191 //=================================================================================
192 // function : SelectionIntoArgument()
193 // purpose  : Called when selection as changed or other case
194 //=================================================================================
195 void OperationGUI_GetSharedShapesDlg::SelectionIntoArgument()
196 {
197   myEditCurrentArgument->setText("");
198   QString aString = "";
199
200   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
201   SALOME_ListIO aSelList;
202   aSelMgr->selectedObjects(aSelList);
203
204   int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true);
205
206   if (nbSel < 1) {
207     myListShapes.length(0);
208   }
209
210   GEOMBase::ConvertListOfIOInListOfGO(aSelList, myListShapes, true);
211   if (!myListShapes.length())
212     return;
213
214   myEditCurrentArgument->setText(aString);
215 }
216
217 //=================================================================================
218 // function : SetEditCurrentArgument()
219 // purpose  :
220 //=================================================================================
221 void OperationGUI_GetSharedShapesDlg::SetEditCurrentArgument()
222 {
223   QPushButton* send = (QPushButton*)sender();
224
225   if (send == GroupPoints->PushButton1) {
226     myEditCurrentArgument = GroupPoints->LineEdit1;
227     GroupPoints->LineEdit1->setEnabled(true);
228   }
229
230   globalSelection(GEOM_ALLSHAPES);
231
232   myEditCurrentArgument->setFocus();
233   SelectionIntoArgument();
234   send->setDown(true);
235 }
236
237 //=================================================================================
238 // function : ActivateThisDialog()
239 // purpose  :
240 //=================================================================================
241 void OperationGUI_GetSharedShapesDlg::ActivateThisDialog()
242 {
243   GEOMBase_Skeleton::ActivateThisDialog();
244   connect(myGeomGUI->getApp()->selectionMgr(),
245           SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
246
247   ConstructorsClicked(getConstructorId());
248 }
249
250 //=================================================================================
251 // function : enterEvent()
252 // purpose  :
253 //=================================================================================
254 void OperationGUI_GetSharedShapesDlg::enterEvent(QEvent*)
255 {
256   if (!mainFrame()->GroupConstructors->isEnabled())
257     this->ActivateThisDialog();
258 }
259
260 //=======================================================================
261 //function : ComboTextChanged
262 //purpose  :
263 //=======================================================================
264 void OperationGUI_GetSharedShapesDlg::ComboTextChanged()
265 {
266   //initName(getNewObjectName());
267   initName(getPrefixByType());
268 }
269
270 //=================================================================================
271 // function : GetType()
272 // purpose  :
273 //=================================================================================
274 int OperationGUI_GetSharedShapesDlg::GetType() const
275 {
276   int aLimit = GroupPoints->ComboBox1->currentIndex();
277
278   switch (aLimit) {
279   case 0:  aLimit = GEOM::SOLID ; break;
280   case 1:  aLimit = GEOM::SHELL ; break;
281   case 2:  aLimit = GEOM::FACE  ; break;
282   case 3:  aLimit = GEOM::WIRE  ; break;
283   case 4:  aLimit = GEOM::EDGE  ; break;
284   case 5:  aLimit = GEOM::VERTEX; break;
285   default: aLimit = GEOM::SHAPE ;
286   }
287
288   return aLimit;
289 }
290
291 //=================================================================================
292 // function : createOperation
293 // purpose  :
294 //=================================================================================
295 GEOM::GEOM_IOperations_ptr OperationGUI_GetSharedShapesDlg::createOperation()
296 {
297   return getGeomEngine()->GetIShapesOperations(getStudyId());
298 }
299
300 //=================================================================================
301 // function : isValid
302 // purpose  :
303 //=================================================================================
304 bool OperationGUI_GetSharedShapesDlg::isValid (QString& msg)
305 {
306   if (myListShapes.length() < 2) {
307     msg = tr("MSG_SHARED_SHAPES_TOO_FEW_SHAPES");
308     return false;
309   }
310   return true;
311 }
312
313 //=================================================================================
314 // function : execute
315 // purpose  :
316 //=================================================================================
317 bool OperationGUI_GetSharedShapesDlg::execute (ObjectList& objects)
318 {
319   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
320   GEOM::ListOfGO_var aList = anOper->GetSharedShapesMulti(myListShapes, GetType());
321
322   if (!aList->length())
323     return false;
324
325   if (aList->length() > 1)
326     myMainFrame->ResultName->setText(getPrefixByType());
327
328   for (int i = 0, n = aList->length(); i < n; i++)
329     objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i]));
330
331   return objects.size();
332 }
333
334 //================================================================
335 // Function : getFather
336 // Purpose  : Get father object for object to be added in study
337 //            ( called with addInStudy method )
338 //================================================================
339 GEOM::GEOM_Object_ptr OperationGUI_GetSharedShapesDlg::getFather (GEOM::GEOM_Object_ptr)
340 {
341   if (myListShapes.length() > 0)
342     //return myListShapes[0]._retn();
343     return myListShapes[0];
344   return NULL;
345 }
346
347 //================================================================
348 // Function : getPrefixByType
349 // Purpose  :
350 //================================================================
351 QString OperationGUI_GetSharedShapesDlg::getPrefixByType () const
352 {
353   QString aPref;
354
355   int aLimit = GroupPoints->ComboBox1->currentIndex();
356
357   switch (aLimit) {
358   case 0:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SOLID")) ; break;
359   case 1:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHELL")) ; break;
360   case 2:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_FACE"))  ; break;
361   case 3:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_WIRE"))  ; break;
362   case 4:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_EDGE"))  ; break;
363   case 5:  aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_VERTEX")); break;
364   default: aPref = tr("GEOM_SHARED_SHAPE").arg(tr("GEOM_SHAPE")) ;
365   }
366
367   return aPref;
368 }