]> SALOME platform Git repositories - modules/geom.git/blob - src/GenerationGUI/GenerationGUI_PipeDlg.cxx
Salome HOME
33b43b09fb49b85ad2c4f82c940f233460f6abd5
[modules/geom.git] / src / GenerationGUI / GenerationGUI_PipeDlg.cxx
1 // Copyright (C) 2007-2015  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, or (at your option) any later version.
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
23 // GEOM GEOMGUI : GUI for Geometry component
24 // File   : GenerationGUI_PipeDlg.cxx
25 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
26 //
27 #include "GenerationGUI_PipeDlg.h"
28
29 #include <DlgRef.h>
30 #include <GeometryGUI.h>
31 #include <GEOMBase.h>
32 #include <GEOMUtils.hxx>
33
34 #include <SUIT_Session.h>
35 #include <SUIT_ResourceMgr.h>
36 #include <SalomeApp_Application.h>
37 #include <LightApp_SelectionMgr.h>
38
39 #include <TopoDS_Shape.hxx>
40 #include <TColStd_MapOfInteger.hxx>
41
42 #include <GEOMImpl_Types.hxx>
43
44 //=================================================================================
45 // class    : GenerationGUI_PipeDlg()
46 // purpose  : Constructs a GenerationGUI_PipeDlg 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 GenerationGUI_PipeDlg::GenerationGUI_PipeDlg (GeometryGUI* theGeometryGUI, QWidget* parent,
52                                               bool modal, Qt::WindowFlags fl)
53   : GEOMBase_Skeleton  (theGeometryGUI, parent, modal, fl),
54     myGenGroupCheckGP  (0),
55     myPrefixLblGP      (0),
56     myPrefixEditGP     (0),
57     myGenGroupCheckGMP (0),
58     myPrefixLblGMP     (0),
59     myPrefixEditGMP    (0)
60 {
61   QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE")));
62   QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
63   QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE_BINORMAL")));
64   QPixmap image3 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE_SECTION")));
65
66   setWindowTitle(tr("GEOM_PIPE_TITLE"));
67
68   /***************************************************************/
69   mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE"));
70   mainFrame()->RadioButton1->setIcon(image0);
71   mainFrame()->RadioButton2->setIcon(image2);
72   mainFrame()->RadioButton3->setIcon(image3);
73   // mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
74   // mainFrame()->RadioButton3->close();
75
76   GroupPoints = new DlgRef_3Sel1Check(centralWidget());
77
78   GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
79   GroupPoints->TextLabel1->setText(tr("GEOM_BASE_OBJECT"));
80   GroupPoints->TextLabel2->setText(tr("GEOM_PATH_OBJECT"));
81   GroupPoints->TextLabel3->setText(tr("GEOM_BINORMAL"));
82   GroupPoints->PushButton1->setIcon(image1);
83   GroupPoints->PushButton2->setIcon(image1);
84   GroupPoints->PushButton3->setIcon(image1);
85   GroupPoints->CheckButton1->setText(tr("GEOM_SELECT_UNPUBLISHED_EDGES"));
86
87   // Add widgets for group generation
88   QGridLayout *aLayoutGP = (QGridLayout *)GroupPoints->GroupBox1->layout();
89
90   myGenGroupCheckGP =
91     new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupPoints->GroupBox1);
92   myPrefixLblGP     =
93     new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupPoints->GroupBox1);
94   myPrefixEditGP    = new QLineEdit(GroupPoints->GroupBox1);
95
96   aLayoutGP->addWidget(myGenGroupCheckGP, 4, 0, 1, 3);
97   aLayoutGP->addWidget(myPrefixLblGP,     5, 0, 1, 2);
98   aLayoutGP->addWidget(myPrefixEditGP,    5, 2);
99
100   GroupMakePoints = new DlgRef_3Sel2Check3Spin(centralWidget());
101
102   GroupMakePoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
103   GroupMakePoints->TextLabel1->setText(tr("GEOM_BASE_OBJECT"));
104   GroupMakePoints->TextLabel2->setText(tr("GEOM_LOCATIONS"));
105   GroupMakePoints->TextLabel3->setText(tr("GEOM_PATH_OBJECT"));
106   GroupMakePoints->PushButton1->setIcon(image1);
107   GroupMakePoints->PushButton2->setIcon(image1);
108   GroupMakePoints->PushButton3->setIcon(image1);
109   GroupMakePoints->CheckBox1->setText(tr("GEOM_WITH_CONTACT"));
110   GroupMakePoints->CheckBox2->setText(tr("GEOM_WITH_CORRECTION"));
111   GroupMakePoints->SpinBox1->setAttribute(Qt::WA_DeleteOnClose);
112   GroupMakePoints->SpinBox2->setAttribute(Qt::WA_DeleteOnClose);
113   GroupMakePoints->SpinBox3->setAttribute(Qt::WA_DeleteOnClose);
114   GroupMakePoints->TextLabel4->setAttribute(Qt::WA_DeleteOnClose);
115   GroupMakePoints->TextLabel5->setAttribute(Qt::WA_DeleteOnClose);
116   GroupMakePoints->TextLabel6->setAttribute(Qt::WA_DeleteOnClose);
117   GroupMakePoints->SpinBox1->close();
118   GroupMakePoints->SpinBox2->close();
119   GroupMakePoints->SpinBox3->close();
120   GroupMakePoints->TextLabel4->close();
121   GroupMakePoints->TextLabel5->close();
122   GroupMakePoints->TextLabel6->close();
123
124   // Add widgets for group generation
125   QGridLayout *aLayoutGMP = (QGridLayout *)GroupMakePoints->GroupBox1->layout();
126
127   myGenGroupCheckGMP =
128     new QCheckBox(tr("GEOM_GENERATE_GROUPS"), GroupMakePoints->GroupBox1);
129   myPrefixLblGMP     =
130     new QLabel (tr("GEOM_GROUP_NAME_PREFIX"), GroupMakePoints->GroupBox1);
131   myPrefixEditGMP    = new QLineEdit(GroupMakePoints->GroupBox1);
132
133   aLayoutGMP->addWidget(myGenGroupCheckGMP, 8, 0, 1, 3);
134   aLayoutGMP->addWidget(myPrefixLblGMP,     9, 0, 1, 2);
135   aLayoutGMP->addWidget(myPrefixEditGMP,    9, 2);
136
137   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
138   layout->setMargin(0); layout->setSpacing(6);
139   layout->addWidget(GroupPoints);
140   layout->addWidget(GroupMakePoints);
141   /***************************************************************/
142
143   setHelpFileName("create_extrusion_alongpath_page.html");
144
145   // Initialisation
146   Init();
147 }
148
149 //=================================================================================
150 // function : ~GenerationGUI_PipeDlg()
151 // purpose  : Destroys the object and frees any allocated resources
152 //=================================================================================
153 GenerationGUI_PipeDlg::~GenerationGUI_PipeDlg()
154 {
155   // no need to delete child widgets, Qt does it all for us
156 }
157
158 //=================================================================================
159 // function : Init()
160 // purpose  :
161 //=================================================================================
162 void GenerationGUI_PipeDlg::Init()
163 {
164   // init variables
165   GroupPoints->LineEdit1->setReadOnly(true);
166   GroupPoints->LineEdit2->setReadOnly(true);
167   GroupPoints->LineEdit3->setReadOnly(true);
168
169   GroupPoints->LineEdit1->setText("");
170   GroupPoints->LineEdit2->setText("");
171   GroupPoints->LineEdit3->setText("");
172   myPath.nullify();
173   myVec.nullify();
174
175   GroupPoints->CheckButton1->setEnabled(false);
176
177   GroupMakePoints->LineEdit1->setReadOnly(true);
178   GroupMakePoints->LineEdit2->setReadOnly(true);
179   GroupMakePoints->LineEdit3->setReadOnly(true);
180
181   GroupMakePoints->LineEdit1->setText("");
182   GroupMakePoints->LineEdit2->setText("");
183   GroupMakePoints->LineEdit3->setText("");
184
185   showOnlyPreviewControl();
186
187   // signals and slots connections
188   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
189   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
190
191   connect(this,          SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
192
193   connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
194   connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
195   connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
196
197   connect(GroupPoints->CheckButton1,   SIGNAL(toggled(bool)), this, SLOT(SelectionTypeButtonClicked()));
198
199   connect(GroupMakePoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
200   connect(GroupMakePoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
201   connect(GroupMakePoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
202   connect(GroupMakePoints->CheckBox1, SIGNAL(clicked()), this, SLOT(processPreview()));
203   connect(GroupMakePoints->CheckBox2, SIGNAL(clicked()), this, SLOT(processPreview()));
204   connect(myGenGroupCheckGP,  SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool)));
205   connect(myGenGroupCheckGMP, SIGNAL(toggled(bool)), this, SLOT(GenGroupClicked(bool)));
206
207   initName(tr("GEOM_PIPE"));
208   resize(100,100);
209
210   GroupPoints->TextLabel3->hide();
211   GroupPoints->PushButton3->hide();
212   GroupPoints->LineEdit3->hide();
213   ConstructorsClicked(0);
214
215   GroupPoints->PushButton1->click();
216   SelectionIntoArgument();
217   updateGenGroup();
218 }
219
220 //=================================================================================
221 // function : ConstructorsClicked()
222 // purpose  : Radio button management
223 //=================================================================================
224 void GenerationGUI_PipeDlg::ConstructorsClicked( int constructorId )
225 {
226   erasePreview();
227
228   switch (constructorId) {
229   case 0:
230     GroupMakePoints->hide();
231     GroupPoints->show();
232     GroupPoints->TextLabel3->hide();
233     GroupPoints->PushButton3->hide();
234     GroupPoints->LineEdit3->hide();
235     GroupPoints->PushButton1->click();
236     myGenGroupCheckGP->setChecked(false);
237     resetGenGroup(myGenGroupCheckGP, false, true);
238     break;
239   case 1:
240     GroupMakePoints->hide();
241     GroupPoints->show();
242     GroupPoints->TextLabel3->show();
243     GroupPoints->PushButton3->show();
244     GroupPoints->LineEdit3->show();
245     GroupPoints->PushButton1->click();
246     myGenGroupCheckGP->setChecked(false);
247     resetGenGroup(myGenGroupCheckGP, false, true);
248     break;
249   case 2:
250     GroupPoints->hide();
251     GroupMakePoints->show();
252     GroupMakePoints->PushButton1->click();
253     myGenGroupCheckGMP->setChecked(false);
254     resetGenGroup(myGenGroupCheckGMP, false, true);
255     break;
256   default:
257     break;
258   }
259
260   qApp->processEvents();
261   updateGeometry();
262   resize(100,100);
263
264   SelectionIntoArgument();
265   processPreview();
266 }
267
268 //=================================================================================
269 // function : SelectionBittonClicked()
270 // purpose  : Selection type Radio button management
271 //=================================================================================
272 void GenerationGUI_PipeDlg::SelectionTypeButtonClicked()
273 {
274   globalSelection();
275   if ( GroupPoints->CheckButton1->isChecked() ) {
276     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
277   } else {
278     TColStd_MapOfInteger aMap;
279     aMap.Add(GEOM_COMPOUND);
280     aMap.Add(GEOM_WIRE);
281     aMap.Add(GEOM_LINE);
282     globalSelection(aMap);
283   }
284   if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
285     myEditCurrentArgument->setText("");
286     myPath.nullify();
287     updateGenGroup();
288   }
289   processPreview();
290 }
291
292 //=================================================================================
293 // function : ClickOnOk()
294 // purpose  :
295 //=================================================================================
296 void GenerationGUI_PipeDlg::ClickOnOk()
297 {
298   setIsApplyAndClose( true );
299   if (ClickOnApply())
300     ClickOnCancel();
301 }
302
303 //=================================================================================
304 // function : ClickOnApply()
305 // purpose  :
306 //=================================================================================
307 bool GenerationGUI_PipeDlg::ClickOnApply()
308 {
309   if (!onAccept())
310     return false;
311
312   initName();
313
314   return true;
315 }
316
317 //=================================================================================
318 // function : SelectionIntoArgument()
319 // purpose  : Called when selection is changed or on dialog initialization or activation
320 //=================================================================================
321 void GenerationGUI_PipeDlg::SelectionIntoArgument()
322 {
323   erasePreview();
324   myEditCurrentArgument->setText("");
325
326   if ( myEditCurrentArgument == GroupPoints->LineEdit1 ) {
327     myBaseObjects.clear();
328     QList<GEOM::GeomObjPtr> objects = getSelected( TopAbs_SHAPE, -1 );
329     for ( int i = 0; i < objects.count(); i++ ) {
330       GEOM::shape_type stype = objects[i]->GetMaxShapeType();
331       GEOM::shape_type maxallowed = getConstructorId() == 1 ? GEOM::FACE : GEOM::SHELL;
332       GEOM::shape_type minallowed = getConstructorId() == 1 ? GEOM::EDGE : GEOM::VERTEX;
333       if ( stype < maxallowed || stype > minallowed )
334         continue;
335       myBaseObjects << objects[i];
336     }
337     if ( !myBaseObjects.isEmpty() ) {
338       QString aName = myBaseObjects.count() > 1 ? QString( "%1_objects").arg( myBaseObjects.count() ) : GEOMBase::GetName( myBaseObjects[0].get() );
339       myEditCurrentArgument->setText( aName );
340     }
341   }
342   else if (myEditCurrentArgument == GroupPoints->LineEdit2) {
343     QList<TopAbs_ShapeEnum> types;
344     types << TopAbs_EDGE << TopAbs_WIRE;
345     myPath = getSelected( types );
346     if ( myPath ) {
347       QString aName = GEOMBase::GetName( myPath.get() );
348       myEditCurrentArgument->setText( aName );
349       if ( getConstructorId() == 1 && !myVec )
350         GroupPoints->PushButton3->click();
351       else if ( myBaseObjects.isEmpty() )
352         GroupPoints->PushButton1->click();
353     }
354     updateGenGroup();
355   }
356   else if (myEditCurrentArgument == GroupPoints->LineEdit3) {
357     myVec = getSelected( TopAbs_EDGE );
358     if ( myVec ) {
359       QString aName = GEOMBase::GetName( myVec.get() );
360       myEditCurrentArgument->setText( aName );
361       if ( myBaseObjects.isEmpty() )
362         GroupPoints->PushButton1->click();
363       else if ( !myPath )
364         GroupPoints->PushButton2->click();
365     }
366   }
367   else if ( myEditCurrentArgument == GroupMakePoints->LineEdit1 ) {
368     QList<TopAbs_ShapeEnum> types;
369     types << TopAbs_EDGE << TopAbs_WIRE << TopAbs_FACE << TopAbs_SHELL;
370     QList<GEOM::GeomObjPtr> objects = getSelected( types, -1 );
371     GEOMBase::Synchronize( myBaseObjects, objects );
372     if ( !myBaseObjects.isEmpty() ) {
373       QString aName = myBaseObjects.count() > 1 ? QString( "%1_objects").arg( myBaseObjects.count() ) : GEOMBase::GetName( myBaseObjects[0].get() );
374       myEditCurrentArgument->setText( aName );
375     }
376   }
377   else if ( myEditCurrentArgument == GroupMakePoints->LineEdit2 ) {
378     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
379     QList<GEOM::GeomObjPtr> objects = getSelected( TopAbs_VERTEX, -1 );
380     GEOMBase::Synchronize( myLocations, objects );
381     if ( !myLocations.isEmpty() ) {
382       QString aName = myLocations.count() > 1 ? QString( "%1_objects").arg( myLocations.count() ) : GEOMBase::GetName( myLocations[0].get() );
383       myEditCurrentArgument->setText( aName );
384     }
385   }
386   else if ( myEditCurrentArgument == GroupMakePoints->LineEdit3 ) {
387     QList<TopAbs_ShapeEnum> types;
388     types << TopAbs_EDGE << TopAbs_WIRE;
389     myPath = getSelected( types );
390     if ( myPath ) {
391       QString aName = GEOMBase::GetName( myPath.get() );
392       myEditCurrentArgument->setText( aName );
393     }
394     updateGenGroup();
395   }
396
397   processPreview();
398 }
399
400 //=================================================================================
401 // function : SetEditCurrentArgument()
402 // purpose  :
403 //=================================================================================
404 void GenerationGUI_PipeDlg::SetEditCurrentArgument()
405 {
406   QPushButton* send = (QPushButton*)sender();
407
408   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
409   globalSelection(GEOM_ALLSHAPES);
410   GroupPoints->PushButton1->setDown(false);
411   GroupPoints->PushButton2->setDown(false);
412   GroupPoints->PushButton3->setDown(false);
413   GroupPoints->LineEdit1->setEnabled(false);
414   GroupPoints->LineEdit2->setEnabled(false);
415   GroupPoints->LineEdit3->setEnabled(false);
416   if (send == GroupPoints->PushButton1) {
417     myEditCurrentArgument = GroupPoints->LineEdit1;
418     GroupPoints->CheckButton1->setEnabled(false);
419   }
420   else if (send == GroupPoints->PushButton2) {
421     myEditCurrentArgument = GroupPoints->LineEdit2;
422
423     if ( GroupPoints->CheckButton1->isChecked() ) {
424       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
425     } else {
426       TColStd_MapOfInteger aMap;
427       aMap.Add(GEOM_COMPOUND);
428       aMap.Add(GEOM_WIRE);
429       aMap.Add(GEOM_LINE);
430       globalSelection(aMap);
431     }
432     GroupPoints->CheckButton1->setEnabled(true);
433   }
434   else if(send == GroupPoints->PushButton3) {
435     myEditCurrentArgument = GroupPoints->LineEdit3;
436     GroupPoints->CheckButton1->setEnabled(false);
437     localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
438   }
439
440   GroupMakePoints->PushButton1->setDown(false);
441   GroupMakePoints->PushButton2->setDown(false);
442   GroupMakePoints->PushButton3->setDown(false);
443   GroupMakePoints->LineEdit1->setEnabled(false);
444   GroupMakePoints->LineEdit2->setEnabled(false);
445   GroupMakePoints->LineEdit3->setEnabled(false);
446   if (send == GroupMakePoints->PushButton1) {
447     myEditCurrentArgument = GroupMakePoints->LineEdit1;
448   }
449   else if(send == GroupMakePoints->PushButton2) {
450     myEditCurrentArgument = GroupMakePoints->LineEdit2;
451   }
452   else if (send == GroupMakePoints->PushButton3) {
453     myEditCurrentArgument = GroupMakePoints->LineEdit3;
454   }
455
456   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
457           this, SLOT(SelectionIntoArgument()));
458
459   // enable line edit
460   myEditCurrentArgument->setEnabled(true);
461   myEditCurrentArgument->setFocus();
462   // after setFocus(), because it will be setDown(false) when loses focus
463   send->setDown(true);
464
465   // seems we need it only to avoid preview disappearing, caused by selection mode change
466   processPreview();
467 }
468
469 //=================================================================================
470 // function : ActivateThisDialog()
471 // purpose  :
472 //=================================================================================
473 void GenerationGUI_PipeDlg::ActivateThisDialog()
474 {
475   GEOMBase_Skeleton::ActivateThisDialog();
476   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
477            this, SLOT( SelectionIntoArgument() ) );
478
479   ConstructorsClicked(getConstructorId());
480 }
481
482 //=================================================================================
483 // function : enterEvent()
484 // purpose  : when mouse enter onto the QWidget
485 //=================================================================================
486 void GenerationGUI_PipeDlg::enterEvent (QEvent*)
487 {
488   if (!mainFrame()->GroupConstructors->isEnabled())
489     ActivateThisDialog();
490 }
491
492 //=================================================================================
493 // function : createOperation
494 // purpose  :
495 //=================================================================================
496 GEOM::GEOM_IOperations_ptr GenerationGUI_PipeDlg::createOperation()
497 {
498   return getGeomEngine()->GetI3DPrimOperations(getStudyId());
499 }
500
501 //=================================================================================
502 // function : isValid
503 // purpose  :
504 //=================================================================================
505 bool GenerationGUI_PipeDlg::isValid (QString&)
506 {
507   bool ok = false;
508   switch ( getConstructorId() ) {
509   case 0 :
510     ok = !myBaseObjects.isEmpty() && myPath;
511     break;
512   case 1 :
513     ok = !myBaseObjects.isEmpty() && myPath && myVec;
514     break;
515   case 2 :
516     ok = !myBaseObjects.isEmpty() && ( myLocations.isEmpty() || myBaseObjects.count() == myLocations.count() ) && myPath;
517     break;
518   default:
519     break;
520   }
521   return ok;
522 }
523
524 //=================================================================================
525 // function : execute
526 // purpose  :
527 //=================================================================================
528 bool GenerationGUI_PipeDlg::execute (ObjectList& objects)
529 {
530   GEOM::ListOfGO_var aList;
531
532   GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation());
533   bool doGroups = !IsPreview();
534
535   myGroupObjectsMap.clear();
536
537   switch( getConstructorId() ) {
538   case 0:
539   case 1:
540     if (doGroups) {
541       doGroups = myGenGroupCheckGP->isEnabled() &&
542                  myGenGroupCheckGP->isChecked();
543     }
544
545     for (int i = 0; i < myBaseObjects.count(); i++) {
546       switch ( getConstructorId() ) {
547       case 0 :
548         aList = anOper->MakePipe(myBaseObjects[i].get(),
549                                  myPath.get(), doGroups);
550         break;
551       case 1 :
552         aList = anOper->MakePipeBiNormalAlongVector
553               (myBaseObjects[i].get(), myPath.get(), myVec.get(), doGroups);
554         break;
555       }
556
557       if (aList->length() > 0) {
558         if (doGroups) {
559           addGroups(aList);
560         }
561
562         if (!aList[0]->_is_nil()) {
563           objects.push_back(aList[0]._retn());
564         }
565       }
566     }
567     break;
568   case 2:
569     {
570       GEOM::ListOfGO_var myBaseGO = new GEOM::ListOfGO();
571       GEOM::ListOfGO_var myLocationsGO = new GEOM::ListOfGO();
572       myBaseGO->length( myBaseObjects.count() );
573       myLocationsGO->length( myLocations.count() );
574       for (int i = 0; i < myBaseObjects.count(); i++) {
575         myBaseGO[i] = myBaseObjects[i].copy();
576       }
577       for (int i = 0; i < myLocations.count(); i++) {
578         myLocationsGO[i] = myLocations[i].copy();
579       }
580
581       if (doGroups) {
582         doGroups = myGenGroupCheckGMP->isEnabled() &&
583                    myGenGroupCheckGMP->isChecked();
584       }
585
586       aList = anOper->MakePipeWithDifferentSections
587                           (myBaseGO.in(), myLocationsGO.in(), myPath.get(), 
588                            GroupMakePoints->CheckBox1->isChecked(), 
589                            GroupMakePoints->CheckBox2->isChecked(), doGroups);
590
591       if (aList->length() > 0) {
592         if (doGroups) {
593           addGroups(aList);
594         }
595
596         if (!aList[0]->_is_nil()) {
597           objects.push_back(aList[0]._retn());
598         }
599       }
600     }
601     break;
602   default:
603     break;
604   }
605   return true;
606 }
607
608 //=================================================================================
609 // function : addSubshapeToStudy
610 // purpose  : virtual method to add new SubObjects if local selection
611 //=================================================================================
612 void GenerationGUI_PipeDlg::addSubshapesToStudy()
613 {
614   GEOMBase::PublishSubObject( myPath.get() );
615   GEOMBase::PublishSubObject( myVec.get() );
616 }
617
618 //=================================================================================
619 // function : extractPrefix
620 // purpose  : redefined from GEOMBase_Helper class
621 //=================================================================================
622 bool GenerationGUI_PipeDlg::extractPrefix() const
623 {
624   return myBaseObjects.count() > 1;
625 }
626
627 //=================================================================================
628 // function : restoreSubShapes
629 // purpose  : virtual method to restore tree of argument's sub-shapes under
630 //            the resulting shape. Redefined from GEOMBase_Helper class.
631 //=================================================================================
632 void GenerationGUI_PipeDlg::restoreSubShapes
633               (SALOMEDS::Study_ptr theStudy, SALOMEDS::SObject_ptr theSObject)
634 {
635   QCheckBox *aGenGroupCheck = NULL;
636   QLineEdit *aPrefixEdit    = NULL;
637
638   switch (getConstructorId()) {
639   case 0 :
640   case 1 :
641     aGenGroupCheck = myGenGroupCheckGP;
642     aPrefixEdit    = myPrefixEditGP;
643     break;
644   case 2 :
645     aGenGroupCheck = myGenGroupCheckGMP;
646     aPrefixEdit    = myPrefixEditGMP;
647     break;
648   default:
649     break;
650   }
651
652   if (aGenGroupCheck == NULL || !aGenGroupCheck->isChecked()) {
653     return;
654   }
655
656   // get Object from SObject
657   GEOM::GEOM_Object_var aFather = GEOM::GEOM_Object::_narrow
658             (theSObject->GetObject());
659
660   if (CORBA::is_nil(aFather)) {
661     return;
662   }
663
664   ObjectMap::const_iterator anIter    =
665     myGroupObjectsMap.find(aFather->GetEntry());
666   QString                   aPrefix   = aPrefixEdit->text();
667   bool                      hasPrefix = !aPrefix.isEmpty();
668
669   if (anIter != myGroupObjectsMap.end()) {
670     QList<GEOM::GeomObjPtr>::const_iterator it = anIter->second.begin();
671
672     for (; it != anIter->second.end(); it++) {
673       // Compose the name
674       QString aName;
675
676       if (hasPrefix) {
677         aName = aPrefix + "_";
678       }
679
680       aName += tr((*it)->GetName());
681       getGeomEngine()->AddInStudy(theStudy, (*it).get(),
682                                   aName.toStdString().c_str(), aFather);
683     }
684   }
685 }
686
687 //=================================================================================
688 // function : getSourceObjects
689 // purpose  : virtual method to get source objects
690 //=================================================================================
691 QList<GEOM::GeomObjPtr> GenerationGUI_PipeDlg::getSourceObjects()
692 {
693   QList<GEOM::GeomObjPtr> res(myBaseObjects);
694   res << myPath << myVec;
695   for (int i = 0; i < myLocations.count(); i++)
696     res << myLocations[i];
697   return res;
698 }
699
700 //=================================================================================
701 // function : GenGroupClicked
702 // purpose  : Slot to treat checking "Generate groups" check box.
703 //=================================================================================
704 void GenerationGUI_PipeDlg::GenGroupClicked(bool isChecked)
705 {
706   resetGenGroup((QCheckBox *)sender(), isChecked, false);
707 }
708
709 //=================================================================================
710 // function : updateGenGroup
711 // purpose  : Update "Generate groups" widgets depending on the path.
712 //=================================================================================
713 void GenerationGUI_PipeDlg::updateGenGroup()
714 {
715   bool isEnable = true;
716
717   if (myPath) {
718     // Check if the path is closed.
719     TopoDS_Shape aShapePath;
720
721     if (GEOMBase::GetShape(myPath.get(), aShapePath)) {
722       isEnable = GEOMUtils::IsOpenPath(aShapePath);
723     }
724   }
725
726   QCheckBox *aGenGroupCheck = NULL;
727
728   switch (getConstructorId()) {
729   case 0 :
730   case 1 :
731     aGenGroupCheck = myGenGroupCheckGP;
732     break;
733   case 2 :
734     aGenGroupCheck = myGenGroupCheckGMP;
735     break;
736   default:
737     break;
738   }
739
740   if (aGenGroupCheck != NULL) {
741     const bool isChecked = aGenGroupCheck->isChecked();
742
743     aGenGroupCheck->setEnabled(isEnable);
744     resetGenGroup(aGenGroupCheck, isEnable && isChecked, false);
745   }
746 }
747
748 //=================================================================================
749 // function : resetGenGroup
750 // purpose  : Resets data of "Generate groups" widgets.
751 //=================================================================================
752 void GenerationGUI_PipeDlg::resetGenGroup(QCheckBox  *theGenGroup,
753                                           const bool  isChecked,
754                                           const bool  isClearPrefix)
755 {
756   QLabel    *aPrefixLbl  = NULL;
757   QLineEdit *aPrefixEdit = NULL;
758
759   if (theGenGroup == myGenGroupCheckGP) {
760     aPrefixLbl  = myPrefixLblGP;
761     aPrefixEdit = myPrefixEditGP;
762   } else if (theGenGroup == myGenGroupCheckGMP) {
763     aPrefixLbl  = myPrefixLblGMP;
764     aPrefixEdit = myPrefixEditGMP;
765   }
766
767   if (aPrefixLbl != NULL) {
768     aPrefixLbl->setEnabled(isChecked);
769     aPrefixEdit->setEnabled(isChecked);
770
771     if (isClearPrefix) {
772       aPrefixEdit->setText("");
773     }
774   }
775 }
776
777 //=================================================================================
778 // function : addGroups
779 // purpose  : Add result groups to the list of groups.
780 //=================================================================================
781 void GenerationGUI_PipeDlg::addGroups(GEOM::ListOfGO_var &theResult)
782 {
783   const int aNbObj = theResult->length();
784
785   if (aNbObj > 0) {
786     if (!theResult[0]->_is_nil()) {
787       QString anEntry = theResult[0]->GetEntry();
788       int     i;
789
790       for (i = 1; i < aNbObj; ++i) {
791         if (!theResult[i]->_is_nil()) {
792           myGroupObjectsMap[anEntry].append(GEOM::GeomObjPtr(theResult[i]));
793         }
794       }
795     }
796   }
797 }