]> SALOME platform Git repositories - modules/geom.git/blob - src/OperationGUI/OperationGUI_GetShapesOnShapeDlg.cxx
Salome HOME
Implementation of the "21187: EDF 1137 GEOM: Performance issue when manipulating...
[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   showOnlyPreviewControl();
118
119   // signals and slots connections
120   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
121   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
122
123   connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
124   connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
125
126   connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
127   connect(GroupPoints->LineEdit2, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
128
129   connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged()));
130   connect(GroupPoints->ComboBox2, SIGNAL(activated(int)), this, SLOT(ComboTextChanged()));
131
132   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
133           this, SLOT(SelectionIntoArgument()));
134
135   initName(mainFrame()->GroupConstructors->title());
136
137   GroupPoints->TextLabel3->show();
138   GroupPoints->ComboBox1->show();
139   GroupPoints->ComboBox1->setCurrentIndex(0);
140   GroupPoints->ComboBox2->show();
141   GroupPoints->ComboBox2->setCurrentIndex(0);
142
143   globalSelection(GEOM_ALLSHAPES);
144
145   GroupPoints->PushButton1->click();
146   SelectionIntoArgument();
147   resize(100,100);
148 }
149
150 //=================================================================================
151 // function : ClickOnOk()
152 // purpose  :
153 //=================================================================================
154 void OperationGUI_GetShapesOnShapeDlg::ClickOnOk()
155 {
156   if (ClickOnApply())
157     ClickOnCancel();
158 }
159
160 //=================================================================================
161 // function : ClickOnApply()
162 // purpose  :
163 //=================================================================================
164 bool OperationGUI_GetShapesOnShapeDlg::ClickOnApply()
165 {
166   if (!onAccept())
167     return false;
168
169   initName();
170   // activate first line edit
171   GroupPoints->PushButton1->click();
172   return true;
173 }
174
175 //=================================================================================
176 // function : SelectionIntoArgument()
177 // purpose  : Called when selection is changed or on dialog initialization or activation
178 //=================================================================================
179 void OperationGUI_GetShapesOnShapeDlg::SelectionIntoArgument()
180 {
181   myEditCurrentArgument->setText("");
182
183   if      (myEditCurrentArgument == GroupPoints->LineEdit1) myObject1 = GEOM::GEOM_Object::_nil();
184   else if (myEditCurrentArgument == GroupPoints->LineEdit2) myObject2 = GEOM::GEOM_Object::_nil();
185
186   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
187   SALOME_ListIO aSelList;
188   aSelMgr->selectedObjects(aSelList);
189
190   QString aName = "";
191   int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aName, true);
192
193   if (nbSel > 0) {
194     GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
195     if ( GEOMBase::IsShape(aSelectedObject) ) {
196       myEditCurrentArgument->setText(aName);
197
198       // clear selection
199       disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
200       myGeomGUI->getApp()->selectionMgr()->clearSelected();
201       connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
202               this, SLOT(SelectionIntoArgument()));
203
204       if (myEditCurrentArgument == GroupPoints->LineEdit1) {
205         myObject1 = aSelectedObject;
206         if (myObject2->_is_nil())
207           GroupPoints->PushButton2->click();
208       }
209       else if (myEditCurrentArgument == GroupPoints->LineEdit2) {
210         myObject2 = aSelectedObject;
211         if (myObject1->_is_nil())
212           GroupPoints->PushButton1->click();
213       }
214     }
215   }
216   processPreview();
217 }
218
219 //=================================================================================
220 // function : SetEditCurrentArgument()
221 // purpose  :
222 //=================================================================================
223 void OperationGUI_GetShapesOnShapeDlg::SetEditCurrentArgument()
224 {
225   QPushButton* send = (QPushButton*)sender();
226
227   if      (send == GroupPoints->PushButton1) {
228     myEditCurrentArgument = GroupPoints->LineEdit1;
229
230     GroupPoints->PushButton2->setDown(false);
231     GroupPoints->LineEdit2->setEnabled(false);
232   }
233   else if (send == GroupPoints->PushButton2) {
234     myEditCurrentArgument = GroupPoints->LineEdit2;
235
236     GroupPoints->PushButton1->setDown(false);
237     GroupPoints->LineEdit1->setEnabled(false);
238   }
239
240   // enable line edit
241   myEditCurrentArgument->setEnabled(true);
242   myEditCurrentArgument->setFocus();
243   // after setFocus(), because it will be setDown(false) when loses focus
244   send->setDown(true);
245 }
246
247 //=================================================================================
248 // function : LineEditReturnPressed()
249 // purpose  :
250 //=================================================================================
251 void OperationGUI_GetShapesOnShapeDlg::LineEditReturnPressed()
252 {
253   QLineEdit* send = (QLineEdit*)sender();
254   if (send == GroupPoints->LineEdit1 || send == GroupPoints->LineEdit2)
255   {
256     myEditCurrentArgument = send;
257     GEOMBase_Skeleton::LineEditReturnPressed();
258   }
259 }
260
261 //=================================================================================
262 // function : ActivateThisDialog()
263 // purpose  :
264 //=================================================================================
265 void OperationGUI_GetShapesOnShapeDlg::ActivateThisDialog()
266 {
267   GEOMBase_Skeleton::ActivateThisDialog();
268   globalSelection(GEOM_ALLSHAPES);
269   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
270            this, SLOT( SelectionIntoArgument() ) );
271   processPreview();
272 }
273
274 //=================================================================================
275 // function : enterEvent()
276 // purpose  : when mouse enter onto the QWidget
277 //=================================================================================
278 void OperationGUI_GetShapesOnShapeDlg::enterEvent (QEvent*)
279 {
280   if (!mainFrame()->GroupConstructors->isEnabled())
281     ActivateThisDialog();
282 }
283
284 //=================================================================================
285 // function : createOperation
286 // purpose  :
287 //=================================================================================
288 GEOM::GEOM_IOperations_ptr OperationGUI_GetShapesOnShapeDlg::createOperation()
289 {
290   return getGeomEngine()->GetIShapesOperations(getStudyId());
291 }
292
293 //=================================================================================
294 // function : isValid
295 // purpose  :
296 //=================================================================================
297 bool OperationGUI_GetShapesOnShapeDlg::isValid(QString&)
298 {
299   //Handle(SALOME_InteractiveObject) IO = firstIObject();
300   //GEOM::GEOM_Object_var anObject = GEOMBase::ConvertIOinGEOMObject( IO );
301   //if ( anObject->_is_nil() )
302   //  return false;
303
304   return !CORBA::is_nil(myObject1) && !CORBA::is_nil(myObject2);
305 }
306
307 //=================================================================================
308 // function : execute
309 // purpose  :
310 //=================================================================================
311 bool OperationGUI_GetShapesOnShapeDlg::execute (ObjectList& objects)
312 {
313   int aLimit = GroupPoints->ComboBox1->currentIndex();
314   switch (aLimit)
315   {
316   case 0:  aLimit = GEOM::SOLID ; break;
317   case 1:  aLimit = GEOM::FACE  ; break;
318   case 2:  aLimit = GEOM::EDGE  ; break;
319   case 3:  aLimit = GEOM::VERTEX; break;
320   default: aLimit = GEOM::SHAPE ; break;
321   }
322
323   GEOM::shape_state aState;
324   switch (GroupPoints->ComboBox2->currentIndex())
325   {
326     case 0:  aState = GEOM::ST_IN;    break;
327     case 1:  aState = GEOM::ST_OUT;   break;
328     case 2:  aState = GEOM::ST_ON;    break;
329     case 3:  aState = GEOM::ST_ONIN;  break;
330     case 4:  aState = GEOM::ST_ONOUT; break;
331     default: break;
332   }
333
334   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
335   GEOM::GEOM_Object_var anObj = anOper->GetShapesOnShapeAsCompound(myObject2, myObject1,
336                                                                    (CORBA::Short) aLimit,
337                                                                    aState);
338
339   if (!anObj->_is_nil())
340     objects.push_back(anObj._retn());
341
342   return objects.size();
343 }
344
345 //=======================================================================
346 //function : ComboTextChanged
347 //purpose  :
348 //=======================================================================
349 void OperationGUI_GetShapesOnShapeDlg::ComboTextChanged()
350 {
351   // VRS ???? What is it for ??? commented for a while...
352   //bool IsEnabled = GroupPoints->ComboBox1->currentIndex() < 3;
353   processPreview();
354 }