Salome HOME
Merge from V5_1_main 14/05/2010
[modules/geom.git] / src / OperationGUI / OperationGUI_GetShapesOnShapeDlg.cxx
1 //  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  This library is free software; you can redistribute it and/or
4 //  modify it under the terms of the GNU Lesser General Public
5 //  License as published by the Free Software Foundation; either
6 //  version 2.1 of the License.
7 //
8 //  This library is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 //  Lesser General Public License for more details.
12 //
13 //  You should have received a copy of the GNU Lesser General Public
14 //  License along with this library; if not, write to the Free Software
15 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 // GEOM GEOMGUI : GUI for Geometry component
21 // File   : OperationGUI_GetShapesOnShapeDlg.cxx
22 // Author : Sergey KUUL, Open CASCADE S.A.S. (sergey.kuul@opencascade.com)
23 //
24 #include "OperationGUI_GetShapesOnShapeDlg.h"
25
26 #include <DlgRef.h>
27 #include <GeometryGUI.h>
28 #include <GEOMBase.h>
29
30 #include <SUIT_Session.h>
31 #include <SUIT_ResourceMgr.h>
32 #include <SalomeApp_Application.h>
33 #include <LightApp_SelectionMgr.h>
34
35 //==============================================================================
36 // class    : OperationGUI_GetShapesOnShapeDlg()
37 // purpose  : Constructs a OperationGUI_GetShapesOnShapeDlg which is a child of
38 //            'parent', with the name 'name' and widget flags set to 'f'.
39 //            The dialog will by default be modeless, unless you set 'modal' to
40 //            TRUE to construct a modal dialog.
41 //=================================================================================
42 OperationGUI_GetShapesOnShapeDlg::OperationGUI_GetShapesOnShapeDlg (GeometryGUI* theGeometryGUI,
43                                                                     QWidget* parent)
44   : GEOMBase_Skeleton(theGeometryGUI, parent, false)
45 {
46   SUIT_ResourceMgr* aResMgr = myGeomGUI->getApp()->resourceMgr();
47   QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_SHAPES_ON_SHAPE")));
48   QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
49
50   setWindowTitle(tr("GEOM_SHAPES_ON_SHAPE_TITLE"));
51
52   /***************************************************************/
53   mainFrame()->GroupConstructors->setTitle(tr("GEOM_SHAPES_ON_SHAPE"));
54   mainFrame()->RadioButton1->setIcon(image0);
55   mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
56   mainFrame()->RadioButton2->close();
57   mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
58   mainFrame()->RadioButton3->close();
59
60   GroupPoints = new DlgRef_2Sel2List(centralWidget());
61   //GroupPoints->GroupBox1->setTitle(tr("GEOM_PARTITION"));
62   GroupPoints->GroupBox1->setTitle("Input data");
63   GroupPoints->TextLabel1->setText(tr("GEOM_SHAPES_ON_SHAPE_ESHAPE"));
64   GroupPoints->TextLabel2->setText(tr("GEOM_SHAPES_ON_SHAPE_CSHAPE"));
65   GroupPoints->TextLabel3->setText(tr("GEOM_RECONSTRUCTION_LIMIT"));
66   GroupPoints->TextLabel4->setText(tr("GEOM_SHAPES_ON_SHAPE_STATE"));
67   GroupPoints->PushButton1->setIcon(image2);
68   GroupPoints->PushButton2->setIcon(image2);
69   GroupPoints->LineEdit1->setReadOnly(true);
70   GroupPoints->LineEdit2->setReadOnly(true);
71
72   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
73   layout->setMargin(0); layout->setSpacing(6);
74   layout->addWidget(GroupPoints);
75   /***************************************************************/
76
77   setHelpFileName("shapesonshape_page.html");
78
79   Init();
80 }
81
82 //=================================================================================
83 // function : ~OperationGUI_GetShapesOnShapeDlg
84 // purpose  : Destroys the object and frees any allocated resources
85 //=================================================================================
86 OperationGUI_GetShapesOnShapeDlg::~OperationGUI_GetShapesOnShapeDlg()
87 {
88 }
89
90 //=================================================================================
91 // function : Init()
92 // purpose  :
93 //=================================================================================
94 void OperationGUI_GetShapesOnShapeDlg::Init()
95 {
96   // type for sub shape selection
97   GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_SOLID"));
98   // commented by skl for IPAL19949 - finder isn't allowed such type
99   //GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_SHELL"));
100   GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_FACE"));
101   // commented by skl for IPAL19949 - finder isn't allowed such type
102   //GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_WIRE"));
103   GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_EDGE"));
104   GroupPoints->ComboBox1->addItem(tr("GEOM_RECONSTRUCTION_LIMIT_VERTEX"));
105
106   // type for state selection
107   GroupPoints->ComboBox2->addItem(tr("GEOM_STATE_IN"));
108   GroupPoints->ComboBox2->addItem(tr("GEOM_STATE_OUT"));
109   GroupPoints->ComboBox2->addItem(tr("GEOM_STATE_ON"));
110   GroupPoints->ComboBox2->addItem(tr("GEOM_STATE_ONIN"));
111   GroupPoints->ComboBox2->addItem(tr("GEOM_STATE_ONOUT"));
112
113   GroupPoints->LineEdit1->clear();
114   GroupPoints->LineEdit2->clear();
115   myObject1 = myObject2 = GEOM::GEOM_Object::_nil();
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(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
122   connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
123
124   connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
125   connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
126
127   connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged()));
128   connect(GroupPoints->ComboBox2, SIGNAL(activated(int)), this, SLOT(ComboTextChanged()));
129
130   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
131           this, SLOT(SelectionIntoArgument()));
132
133   initName(mainFrame()->GroupConstructors->title());
134
135   GroupPoints->TextLabel3->show();
136   GroupPoints->ComboBox1->show();
137   GroupPoints->ComboBox1->setCurrentIndex(0);
138   GroupPoints->ComboBox2->show();
139   GroupPoints->ComboBox2->setCurrentIndex(0);
140
141   globalSelection(GEOM_ALLSHAPES);
142
143   GroupPoints->PushButton1->click();
144   SelectionIntoArgument();
145   resize(100,100);
146 }
147
148 //=================================================================================
149 // function : ClickOnOk()
150 // purpose  :
151 //=================================================================================
152 void OperationGUI_GetShapesOnShapeDlg::ClickOnOk()
153 {
154   if (ClickOnApply())
155     ClickOnCancel();
156 }
157
158 //=================================================================================
159 // function : ClickOnApply()
160 // purpose  :
161 //=================================================================================
162 bool OperationGUI_GetShapesOnShapeDlg::ClickOnApply()
163 {
164   if (!onAccept())
165     return false;
166
167   initName();
168   // activate first line edit
169   GroupPoints->PushButton1->click();
170   return true;
171 }
172
173 //=================================================================================
174 // function : SelectionIntoArgument()
175 // purpose  : Called when selection is changed or on dialog initialization or activation
176 //=================================================================================
177 void OperationGUI_GetShapesOnShapeDlg::SelectionIntoArgument()
178 {
179   myEditCurrentArgument->setText("");
180
181   if      (myEditCurrentArgument == GroupPoints->LineEdit1) myObject1 = GEOM::GEOM_Object::_nil();
182   else if (myEditCurrentArgument == GroupPoints->LineEdit2) myObject2 = GEOM::GEOM_Object::_nil();
183
184   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
185   SALOME_ListIO aSelList;
186   aSelMgr->selectedObjects(aSelList);
187
188   QString aName = "";
189   int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aName, true);
190
191   if (nbSel > 0) {
192     Standard_Boolean aRes = Standard_False;
193     GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes);
194     if (!CORBA::is_nil(aSelectedObject) && aRes && GEOMBase::IsShape(aSelectedObject)) {
195       myEditCurrentArgument->setText(aName);
196
197       // clear selection
198       disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
199       myGeomGUI->getApp()->selectionMgr()->clearSelected();
200       connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
201               this, SLOT(SelectionIntoArgument()));
202
203       if (myEditCurrentArgument == GroupPoints->LineEdit1) {
204         myObject1 = aSelectedObject;
205         if (myObject2->_is_nil())
206           GroupPoints->PushButton2->click();
207       }
208       else if (myEditCurrentArgument == GroupPoints->LineEdit2) {
209         myObject2 = aSelectedObject;
210         if (myObject1->_is_nil())
211           GroupPoints->PushButton1->click();
212       }
213     }
214   }
215 }
216
217 //=================================================================================
218 // function : SetEditCurrentArgument()
219 // purpose  :
220 //=================================================================================
221 void OperationGUI_GetShapesOnShapeDlg::SetEditCurrentArgument()
222 {
223   QPushButton* send = (QPushButton*)sender();
224
225   if      (send == GroupPoints->PushButton1) {
226     myEditCurrentArgument = GroupPoints->LineEdit1;
227
228     GroupPoints->PushButton2->setDown(false);
229     GroupPoints->LineEdit2->setEnabled(false);
230   }
231   else if (send == GroupPoints->PushButton2) {
232     myEditCurrentArgument = GroupPoints->LineEdit2;
233
234     GroupPoints->PushButton1->setDown(false);
235     GroupPoints->LineEdit1->setEnabled(false);
236   }
237
238   // enable line edit
239   myEditCurrentArgument->setEnabled(true);
240   myEditCurrentArgument->setFocus();
241   // after setFocus(), because it will be setDown(false) when loses focus
242   send->setDown(true);
243 }
244
245 //=================================================================================
246 // function : LineEditReturnPressed()
247 // purpose  :
248 //=================================================================================
249 void OperationGUI_GetShapesOnShapeDlg::LineEditReturnPressed()
250 {
251   QLineEdit* send = (QLineEdit*)sender();
252   if (send == GroupPoints->LineEdit1 || send == GroupPoints->LineEdit2)
253   {
254     myEditCurrentArgument = send;
255     GEOMBase_Skeleton::LineEditReturnPressed();
256   }
257 }
258
259 //=================================================================================
260 // function : ActivateThisDialog()
261 // purpose  :
262 //=================================================================================
263 void OperationGUI_GetShapesOnShapeDlg::ActivateThisDialog()
264 {
265   GEOMBase_Skeleton::ActivateThisDialog();
266   globalSelection(GEOM_ALLSHAPES);
267   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
268            this, SLOT( SelectionIntoArgument() ) );
269 }
270
271 //=================================================================================
272 // function : enterEvent()
273 // purpose  : when mouse enter onto the QWidget
274 //=================================================================================
275 void OperationGUI_GetShapesOnShapeDlg::enterEvent (QEvent*)
276 {
277   if (!mainFrame()->GroupConstructors->isEnabled())
278     ActivateThisDialog();
279 }
280
281 //=================================================================================
282 // function : createOperation
283 // purpose  :
284 //=================================================================================
285 GEOM::GEOM_IOperations_ptr OperationGUI_GetShapesOnShapeDlg::createOperation()
286 {
287   return getGeomEngine()->GetIShapesOperations(getStudyId());
288 }
289
290 //=================================================================================
291 // function : isValid
292 // purpose  :
293 //=================================================================================
294 bool OperationGUI_GetShapesOnShapeDlg::isValid(QString&)
295 {
296   //Handle(SALOME_InteractiveObject) IO = firstIObject();
297   //Standard_Boolean testResult;
298   //GEOM::GEOM_Object_var anObject = GEOMBase::ConvertIOinGEOMObject(IO, testResult);
299   //if (!testResult || anObject->_is_nil())
300   //  return false;
301
302   return !CORBA::is_nil(myObject1) && !CORBA::is_nil(myObject2);
303 }
304
305 //=================================================================================
306 // function : execute
307 // purpose  :
308 //=================================================================================
309 bool OperationGUI_GetShapesOnShapeDlg::execute (ObjectList& objects)
310 {
311   int aLimit = GroupPoints->ComboBox1->currentIndex();
312   switch (aLimit)
313   {
314   case 0:  aLimit = GEOM::SOLID ; break;
315   case 1:  aLimit = GEOM::FACE  ; break;
316   case 2:  aLimit = GEOM::EDGE  ; break;
317   case 3:  aLimit = GEOM::VERTEX; break;
318   default: aLimit = GEOM::SHAPE ; break;
319   }
320
321   GEOM::shape_state aState;
322   switch (GroupPoints->ComboBox2->currentIndex())
323   {
324     case 0:  aState = GEOM::ST_IN;    break;
325     case 1:  aState = GEOM::ST_OUT;   break;
326     case 2:  aState = GEOM::ST_ON;    break;
327     case 3:  aState = GEOM::ST_ONIN;  break;
328     case 4:  aState = GEOM::ST_ONOUT; break;
329     default: break;
330   }
331
332   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
333   GEOM::GEOM_Object_var anObj = anOper->GetShapesOnShapeAsCompound(myObject2, myObject1,
334                                                                    (CORBA::Short) aLimit,
335                                                                    aState);
336
337   if (!anObj->_is_nil())
338     objects.push_back(anObj._retn());
339
340   return objects.size();
341 }
342
343 //=======================================================================
344 //function : ComboTextChanged
345 //purpose  :
346 //=======================================================================
347 void OperationGUI_GetShapesOnShapeDlg::ComboTextChanged()
348 {
349   // VRS ???? What is it for ??? commented for a while...
350   //bool IsEnabled = GroupPoints->ComboBox1->currentIndex() < 3;
351 }