Salome HOME
Merge from V5_1_main 14/05/2010
[modules/geom.git] / src / BasicGUI / BasicGUI_ArcDlg.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
23 // GEOM GEOMGUI : GUI for Geometry component
24 // File   : BasicGUI_ArcDlg.cxx
25 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
26 //
27 #include "BasicGUI_ArcDlg.h"
28
29 #include <DlgRef.h>
30 #include <GeometryGUI.h>
31 #include <GEOMBase.h>
32
33 #include <SUIT_ResourceMgr.h>
34 #include <SUIT_Session.h>
35 #include <SalomeApp_Application.h>
36 #include <LightApp_SelectionMgr.h>
37
38 #include <TColStd_IndexedMapOfInteger.hxx>
39 #include <TopTools_IndexedMapOfShape.hxx>
40 #include <TopoDS_Shape.hxx>
41 #include <TopoDS_Edge.hxx>
42 #include <TopoDS.hxx>
43 #include <TopExp.hxx>
44
45 #include <GEOMImpl_Types.hxx>
46
47 //=================================================================================
48 // class    : BasicGUI_ArcDlg()
49 // purpose  : Constructs a BasicGUI_ArcDlg which is a child of 'parent', with the
50 //            name 'name' and widget flags set to 'f'.
51 //            The dialog will by default be modeless, unless you set 'modal' to
52 //            TRUE to construct a modal dialog.
53 //=================================================================================
54 BasicGUI_ArcDlg::BasicGUI_ArcDlg( GeometryGUI* theGeometryGUI, QWidget* parent,
55                                   bool modal, Qt::WindowFlags fl )
56   : GEOMBase_Skeleton( theGeometryGUI, parent, modal, fl )
57 {
58   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
59   QPixmap image0( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_ARC" ) ) );
60   QPixmap image1( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_ARC_CENTER" ) ) );
61   QPixmap image2( aResMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
62   QPixmap image3( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_ARC_OF_ELLIPSE" ) ) );
63
64   setWindowTitle( tr( "GEOM_ARC_TITLE" ) );
65
66   /***************************************************************/
67   mainFrame()->GroupConstructors->setTitle( tr( "GEOM_ARC" ) );
68   mainFrame()->RadioButton1->setIcon( image0 );
69   mainFrame()->RadioButton2->setIcon( image1 );
70   mainFrame()->RadioButton3->setIcon( image3 );
71
72   Group3Pnts = new DlgRef_3Sel( centralWidget() );
73
74   Group3Pnts->GroupBox1->setTitle( tr( "GEOM_POINTS" ) );
75   Group3Pnts->TextLabel1->setText( tr( "GEOM_POINT_I" ).arg( 1 ) );
76   Group3Pnts->TextLabel2->setText( tr( "GEOM_POINT_I" ).arg( 2 ) );
77   Group3Pnts->TextLabel3->setText( tr( "GEOM_POINT_I" ).arg( 3 ) );
78
79   Group3Pnts->LineEdit1->setReadOnly( true );
80   Group3Pnts->LineEdit2->setReadOnly( true );
81   Group3Pnts->LineEdit3->setReadOnly( true );
82
83   Group3Pnts->LineEdit1->setEnabled(true);
84   Group3Pnts->LineEdit2->setEnabled(false);
85   Group3Pnts->LineEdit3->setEnabled(false);
86
87   Group3Pnts->PushButton1->setIcon(image2);
88   Group3Pnts->PushButton2->setIcon(image2);
89   Group3Pnts->PushButton3->setIcon(image2);
90
91
92   Group3Pnts2 = new DlgRef_3Sel1Check( centralWidget() );
93
94   Group3Pnts2->GroupBox1->setTitle( tr( "GEOM_POINTS" ) );
95   Group3Pnts2->TextLabel1->setText( tr( "GEOM_CENTER_POINT" ) );
96   Group3Pnts2->TextLabel2->setText( tr( "GEOM_POINT_I" ).arg( "Start" ) );
97   Group3Pnts2->TextLabel3->setText( tr( "GEOM_POINT_I" ).arg( "End" ) );
98
99   Group3Pnts2->LineEdit1->setReadOnly( true );
100   Group3Pnts2->LineEdit2->setReadOnly( true );
101   Group3Pnts2->LineEdit3->setReadOnly( true );
102
103   Group3Pnts2->LineEdit1->setEnabled(true);
104   Group3Pnts2->LineEdit2->setEnabled(false);
105   Group3Pnts2->LineEdit3->setEnabled(false);
106
107   Group3Pnts2->PushButton1->setIcon( image2 );
108   Group3Pnts2->PushButton2->setIcon( image2 );
109   Group3Pnts2->PushButton3->setIcon( image2 );
110   
111   Group3Pnts2->CheckButton1->setText( tr( "GEOM_REVERSE" ) );
112
113   Group3Pnts3 = new DlgRef_3Sel( centralWidget() );
114
115   Group3Pnts3->GroupBox1->setTitle( tr( "GEOM_POINTS" ) );
116   Group3Pnts3->TextLabel1->setText( tr( "GEOM_CENTER_POINT" ) );
117   Group3Pnts3->TextLabel2->setText( tr( "GEOM_POINT_I" ).arg( 1 ) );
118   Group3Pnts3->TextLabel3->setText( tr( "GEOM_POINT_I" ).arg( 2 ) );
119
120   Group3Pnts3->LineEdit1->setReadOnly( true );
121   Group3Pnts3->LineEdit2->setReadOnly( true );
122   Group3Pnts3->LineEdit3->setReadOnly( true );
123
124   Group3Pnts3->LineEdit1->setEnabled(true);
125   Group3Pnts3->LineEdit2->setEnabled(false);
126   Group3Pnts3->LineEdit3->setEnabled(false);
127
128   Group3Pnts3->PushButton1->setIcon(image2);
129   Group3Pnts3->PushButton2->setIcon(image2);
130   Group3Pnts3->PushButton3->setIcon(image2);
131
132   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
133   layout->setMargin( 0 ); layout->setSpacing( 6 );
134   layout->addWidget( Group3Pnts );
135   layout->addWidget( Group3Pnts2 );
136   layout->addWidget( Group3Pnts3 );
137
138   setHelpFileName( "create_arc_page.html" );
139
140   Init();
141 }
142
143
144 //=================================================================================
145 // function : ~BasicGUI_ArcDlg()
146 // purpose  : Destroys the object and frees any allocated resources
147 //=================================================================================
148 BasicGUI_ArcDlg::~BasicGUI_ArcDlg()
149 {
150 }
151
152
153 //=================================================================================
154 // function : Init()
155 // purpose  :
156 //=================================================================================
157 void BasicGUI_ArcDlg::Init()
158 {
159   /* init variables */
160   myEditCurrentArgument = Group3Pnts->LineEdit1;
161
162   myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
163   Group3Pnts2->CheckButton1->setChecked( false );
164   Group3Pnts->PushButton1->setDown(true);
165
166   /* signals and slots connections */
167   connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) );
168   connect( myGeomGUI, SIGNAL( SignalCloseAllDialogs() ),        this, SLOT( ClickOnCancel() ) );
169  
170   connect( this,           SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
171  
172   connect( buttonOk(),     SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
173   connect( buttonApply(),  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
174
175   connect( Group3Pnts->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
176   connect( Group3Pnts->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
177   connect( Group3Pnts->PushButton3, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
178
179   connect( Group3Pnts->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
180   connect( Group3Pnts->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
181   connect( Group3Pnts->LineEdit3, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
182   
183   connect( Group3Pnts2->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
184   connect( Group3Pnts2->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
185   connect( Group3Pnts2->PushButton3, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
186
187   connect( Group3Pnts2->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
188   connect( Group3Pnts2->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
189   connect( Group3Pnts2->LineEdit3, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
190
191   connect( Group3Pnts2->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( ReverseSense() ) );
192
193   connect( Group3Pnts3->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
194   connect( Group3Pnts3->PushButton2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
195   connect( Group3Pnts3->PushButton3, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
196
197   connect( Group3Pnts3->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
198   connect( Group3Pnts3->LineEdit2, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
199   connect( Group3Pnts3->LineEdit3, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
200
201   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
202            this, SLOT( SelectionIntoArgument() ) );
203
204   initName( tr( "GEOM_ARC" ) ); 
205   
206
207   ConstructorsClicked( 0 );
208 }
209
210
211 //=================================================================================
212 // function : ClickOnOk()
213 // purpose  :
214 //=================================================================================
215 void BasicGUI_ArcDlg::ClickOnOk()
216 {
217   if ( ClickOnApply() )
218     ClickOnCancel();
219 }
220
221 //=================================================================================
222 // function : ClickOnApply()
223 // purpose  :
224 //=================================================================================
225 bool BasicGUI_ArcDlg::ClickOnApply()
226 {
227   if ( !onAccept() )
228     return false;
229
230   initName();
231   ConstructorsClicked( getConstructorId() );
232
233   return true;
234 }
235
236
237 //=================================================================================
238 // function : SelectionIntoArgument()
239 // purpose  : Called when selection as changed or other case
240 //=================================================================================
241 void BasicGUI_ArcDlg::SelectionIntoArgument()
242 {
243   myEditCurrentArgument->setText( "" );
244
245   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
246   SALOME_ListIO aSelList;
247   aSelMgr->selectedObjects(aSelList);
248
249   if (aSelList.Extent() != 1) {
250     switch (getConstructorId()) {
251     case 0:
252       if      ( myEditCurrentArgument == Group3Pnts->LineEdit1 )   myPoint1 = GEOM::GEOM_Object::_nil();
253       else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 )   myPoint2 = GEOM::GEOM_Object::_nil();
254       else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 )   myPoint3 = GEOM::GEOM_Object::_nil();
255       return;
256       break;
257     case 1:
258       if      ( myEditCurrentArgument == Group3Pnts2->LineEdit1 )   myPoint1 = GEOM::GEOM_Object::_nil();
259       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit2 )   myPoint2 = GEOM::GEOM_Object::_nil();
260       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 )   myPoint3 = GEOM::GEOM_Object::_nil();
261       return;
262       break;
263     case 2:
264       if      ( myEditCurrentArgument == Group3Pnts3->LineEdit1 )   myPoint1 = GEOM::GEOM_Object::_nil();
265       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit2 )   myPoint2 = GEOM::GEOM_Object::_nil();
266       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit3 )   myPoint3 = GEOM::GEOM_Object::_nil();
267       return;
268       break;
269     }
270   }   
271   // nbSel == 1
272   Standard_Boolean aRes = Standard_False;
273   GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes);
274   if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
275     QString aName = GEOMBase::GetName(aSelectedObject);
276
277     // Get Selected object if selected subshape
278     TopoDS_Shape aShape;
279     if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull())
280     {
281       TColStd_IndexedMapOfInteger aMap;
282       aSelMgr->GetIndexes(aSelList.First(), aMap);
283       if (aMap.Extent() == 1) // Local Selection
284       {
285         int anIndex = aMap(1);
286         aName += QString(":vertex_%1").arg(anIndex);
287
288         //Find SubShape Object in Father
289         GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName);
290
291         if ( aFindedObject == GEOM::GEOM_Object::_nil() ) { // Object not found in study
292           GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId());
293           aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex);
294         }
295         else
296           aSelectedObject = aFindedObject; // get Object from study
297       }
298       else // Global Selection
299       {
300         if (aShape.ShapeType() != TopAbs_VERTEX) {
301           aSelectedObject = GEOM::GEOM_Object::_nil();
302           aName = "";
303         }
304       }
305     }
306
307     myEditCurrentArgument->setText(aName);
308
309     if (!aSelectedObject->_is_nil()) { // clear selection if something selected
310       globalSelection();
311       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );      
312     }
313
314     switch ( getConstructorId() ) {
315     case 0:
316       if      ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) {
317         myPoint1 = aSelectedObject;
318         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
319           Group3Pnts->PushButton2->click();
320       }
321       else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) {
322         myPoint2 = aSelectedObject;
323         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
324           Group3Pnts->PushButton3->click();
325       }
326       else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) {
327         myPoint3 = aSelectedObject;
328         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
329           Group3Pnts->PushButton1->click();
330       }
331       break;
332     case 1:
333       if ( myEditCurrentArgument == Group3Pnts2->LineEdit1 ) {
334         myPoint1 = aSelectedObject;
335         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
336           Group3Pnts2->PushButton2->click();
337       }
338       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit2 ) {
339         myPoint2 = aSelectedObject;
340         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
341           Group3Pnts2->PushButton3->click();
342       }
343       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 ) {
344         myPoint3 = aSelectedObject;
345         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
346           Group3Pnts2->PushButton1->click();
347       }
348       break;
349     case 2:
350       if ( myEditCurrentArgument == Group3Pnts3->LineEdit1 ) {
351         myPoint1 = aSelectedObject;
352         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
353           Group3Pnts3->PushButton2->click();
354       }
355       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit2 ) {
356         myPoint2 = aSelectedObject;
357         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
358           Group3Pnts3->PushButton3->click();
359       }
360       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit3 ) {
361         myPoint3 = aSelectedObject;
362         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
363           Group3Pnts3->PushButton1->click();
364       }
365       break;
366     }
367   }
368
369   displayPreview();
370 }
371
372
373 //=================================================================================
374 // function : SetEditCurrentArgument()
375 // purpose  :
376 //=================================================================================
377 void BasicGUI_ArcDlg::SetEditCurrentArgument()
378 {
379   globalSelection(); // close local selection to clear it
380   localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
381
382   QPushButton* send = (QPushButton*)sender();
383   switch ( getConstructorId() ) {
384   case 0:
385     if      ( send == Group3Pnts->PushButton1 ) {
386       myEditCurrentArgument = Group3Pnts->LineEdit1;
387       Group3Pnts->PushButton2->setDown(false);
388       Group3Pnts->PushButton3->setDown(false);
389       Group3Pnts->LineEdit1->setEnabled(true);
390       Group3Pnts->LineEdit2->setEnabled(false);
391       Group3Pnts->LineEdit3->setEnabled(false);
392     }
393     else if ( send == Group3Pnts->PushButton2 ) {
394       myEditCurrentArgument = Group3Pnts->LineEdit2;
395       Group3Pnts->PushButton1->setDown(false);
396       Group3Pnts->PushButton3->setDown(false);
397       Group3Pnts->LineEdit1->setEnabled(false);
398       Group3Pnts->LineEdit2->setEnabled(true);
399       Group3Pnts->LineEdit3->setEnabled(false);
400     }
401     else if ( send == Group3Pnts->PushButton3 ) {
402       myEditCurrentArgument = Group3Pnts->LineEdit3;
403       Group3Pnts->PushButton1->setDown(false);
404       Group3Pnts->PushButton2->setDown(false);
405       Group3Pnts->LineEdit1->setEnabled(false);
406       Group3Pnts->LineEdit2->setEnabled(false);
407       Group3Pnts->LineEdit3->setEnabled(true);
408     }
409     break;
410   case 1:
411     if      ( send == Group3Pnts2->PushButton1 ) {
412       myEditCurrentArgument = Group3Pnts2->LineEdit1;
413       Group3Pnts2->PushButton2->setDown(false);
414       Group3Pnts2->PushButton3->setDown(false);
415       Group3Pnts2->LineEdit1->setEnabled(true);
416       Group3Pnts2->LineEdit2->setEnabled(false);
417       Group3Pnts2->LineEdit3->setEnabled(false);
418     }
419     else if ( send == Group3Pnts2->PushButton2 ) {
420       myEditCurrentArgument = Group3Pnts2->LineEdit2;
421       Group3Pnts2->PushButton1->setDown(false);
422       Group3Pnts2->PushButton3->setDown(false);
423       Group3Pnts2->LineEdit1->setEnabled(false);
424       Group3Pnts2->LineEdit2->setEnabled(true);
425       Group3Pnts2->LineEdit3->setEnabled(false);
426     }
427     else if ( send == Group3Pnts2->PushButton3 ) {
428       myEditCurrentArgument = Group3Pnts2->LineEdit3;
429       Group3Pnts2->PushButton1->setDown(false);
430       Group3Pnts2->PushButton2->setDown(false);
431       Group3Pnts2->LineEdit1->setEnabled(false);
432       Group3Pnts2->LineEdit2->setEnabled(false);
433       Group3Pnts2->LineEdit3->setEnabled(true);
434     }
435     break;
436   case 2:
437     if ( send == Group3Pnts3->PushButton1 ) {
438       myEditCurrentArgument = Group3Pnts3->LineEdit1;
439       Group3Pnts3->PushButton2->setDown(false);
440       Group3Pnts3->PushButton3->setDown(false);
441       Group3Pnts3->LineEdit1->setEnabled(true);
442       Group3Pnts3->LineEdit2->setEnabled(false);
443       Group3Pnts3->LineEdit3->setEnabled(false);
444     }
445     else if ( send == Group3Pnts3->PushButton2 ) {
446       myEditCurrentArgument = Group3Pnts3->LineEdit2;
447       Group3Pnts3->PushButton1->setDown(false);
448       Group3Pnts3->PushButton3->setDown(false);
449       Group3Pnts3->LineEdit1->setEnabled(false);
450       Group3Pnts3->LineEdit2->setEnabled(true);
451       Group3Pnts3->LineEdit3->setEnabled(false);
452     }
453     else if ( send == Group3Pnts3->PushButton3 ) {
454       myEditCurrentArgument = Group3Pnts3->LineEdit3;
455       Group3Pnts3->PushButton1->setDown(false);
456       Group3Pnts3->PushButton2->setDown(false);
457       Group3Pnts3->LineEdit1->setEnabled(false);
458       Group3Pnts3->LineEdit2->setEnabled(false);
459       Group3Pnts3->LineEdit3->setEnabled(true);
460     }
461     break;
462   }
463   myEditCurrentArgument->setFocus();
464   //  SelectionIntoArgument();
465   send->setDown(true);
466   displayPreview();
467 }
468
469
470 //=================================================================================
471 // function : LineEditReturnPressed()
472 // purpose  :
473 //=================================================================================
474 void BasicGUI_ArcDlg::LineEditReturnPressed()
475 {
476   QLineEdit* send = (QLineEdit*)sender();
477   if ( send == Group3Pnts->LineEdit1 || send == Group3Pnts->LineEdit2 || send == Group3Pnts->LineEdit3 ||
478        send == Group3Pnts2->LineEdit1 || send == Group3Pnts2->LineEdit2 || send == Group3Pnts2->LineEdit3 ||
479        send == Group3Pnts3->LineEdit1 || send == Group3Pnts3->LineEdit2 || send == Group3Pnts3->LineEdit3 ) {
480     myEditCurrentArgument = send;
481     GEOMBase_Skeleton::LineEditReturnPressed();
482   }
483 }
484
485
486 //=================================================================================
487 // function : ActivateThisDialog()
488 // purpose  :
489 //=================================================================================
490 void BasicGUI_ArcDlg::ActivateThisDialog()
491 {
492   GEOMBase_Skeleton::ActivateThisDialog();
493
494   connect( myGeomGUI->getApp()->selectionMgr(),
495            SIGNAL( currentSelectionChanged() ),
496            this,
497            SLOT(SelectionIntoArgument() ) );
498
499   ConstructorsClicked( getConstructorId() );
500 }
501
502 //=================================================================================
503 // function : enterEvent()
504 // purpose  :
505 //=================================================================================
506 void BasicGUI_ArcDlg::enterEvent( QEvent* )
507 {
508   if ( !mainFrame()->GroupConstructors->isEnabled() )
509     ActivateThisDialog();
510 }
511
512 //=================================================================================
513 // function : createOperation
514 // purpose  :
515 //=================================================================================
516 GEOM::GEOM_IOperations_ptr BasicGUI_ArcDlg::createOperation()
517 {
518   return myGeomGUI->GetGeomGen()->GetICurvesOperations( getStudyId() );
519 }
520
521 //=================================================================================
522 // function : isEqual
523 // purpose  : it may also be needed to check for min distance between gp_Pnt-s...
524 //=================================================================================
525 static bool isEqual( const GEOM::GEOM_Object_var& thePnt1, const GEOM::GEOM_Object_var& thePnt2 )
526 {
527   return thePnt1->_is_equivalent( thePnt2 );
528 }
529
530 //=================================================================================
531 // function : isValid
532 // purpose  :
533 //=================================================================================
534 bool BasicGUI_ArcDlg::isValid( QString& msg )
535 {
536   switch (getConstructorId()) {
537   case 0:
538     {
539       if (Group3Pnts->LineEdit1->text().trimmed().isEmpty() ||
540           Group3Pnts->LineEdit2->text().trimmed().isEmpty() ||
541           Group3Pnts->LineEdit3->text().trimmed().isEmpty())
542         return false;
543       break;
544     }
545   case 1:
546     {
547       if (Group3Pnts2->LineEdit1->text().trimmed().isEmpty() ||
548           Group3Pnts2->LineEdit2->text().trimmed().isEmpty() ||
549           Group3Pnts2->LineEdit3->text().trimmed().isEmpty())
550         return false;
551       break;
552     }
553   case 2:
554     {
555       if (Group3Pnts3->LineEdit1->text().trimmed().isEmpty() ||
556           Group3Pnts3->LineEdit2->text().trimmed().isEmpty() ||
557           Group3Pnts3->LineEdit3->text().trimmed().isEmpty())
558         return false;
559       break;
560     }
561   }
562   return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() &&
563     !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 );
564 }
565
566 //=================================================================================
567 // function : execute
568 // purpose  :
569 //=================================================================================
570 bool BasicGUI_ArcDlg::execute( ObjectList& objects )
571 {
572   bool res = false;
573   GEOM::GEOM_Object_var anObj;
574
575   GEOM::GEOM_ICurvesOperations_var anOper = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() );
576
577   switch ( getConstructorId() ) {
578   case 0:
579     {
580       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
581         anObj = anOper->MakeArc( myPoint1, myPoint2, myPoint3 );
582         res = true;
583       }
584       break;
585     }
586   case 1:
587     {
588       bool Sense = Group3Pnts2->CheckButton1->isChecked();
589       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
590         anObj = anOper->MakeArcCenter( myPoint1, myPoint2, myPoint3, Sense );
591         res = true;
592       }
593       break;
594     }
595   case 2:
596     {
597       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
598         anObj = anOper->MakeArcOfEllipse( myPoint1, myPoint2, myPoint3 );
599         res = true;
600       }
601       break;
602     }
603   }
604   if ( !anObj->_is_nil() ) {
605     objects.push_back( anObj._retn() );
606   }
607   return res;
608 }
609
610 //=================================================================================
611 // function : ConstructorsClicked()
612 // purpose  : Radio button management
613 //=================================================================================
614 void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId )
615 {
616   disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 );
617
618   switch ( constructorId ) {
619   case 0:
620     {
621       globalSelection(); // close local contexts, if any
622       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
623
624       Group3Pnts->show();
625       Group3Pnts2->hide();
626       Group3Pnts3->hide();
627       Group3Pnts->PushButton1->setDown(true);
628       Group3Pnts->PushButton2->setDown(false);
629       Group3Pnts->PushButton3->setDown(false);
630       Group3Pnts->LineEdit1->setText( "" );
631       Group3Pnts->LineEdit2->setText( "" );
632       Group3Pnts->LineEdit3->setText( "" );
633       Group3Pnts->LineEdit1->setEnabled(true);
634       Group3Pnts->LineEdit2->setEnabled(false);
635       Group3Pnts->LineEdit3->setEnabled(false);
636       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
637
638       myEditCurrentArgument = Group3Pnts->LineEdit1;
639       break;
640     }
641   case 1:
642     {
643       globalSelection(); // close local contexts, if any
644       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
645
646       Group3Pnts->hide();
647       Group3Pnts2->show();
648       Group3Pnts3->hide();
649       Group3Pnts2->PushButton1->setDown(true);
650       Group3Pnts2->PushButton2->setDown(false);
651       Group3Pnts2->PushButton3->setDown(false);
652       Group3Pnts2->LineEdit1->setText( "" );
653       Group3Pnts2->LineEdit2->setText( "" );
654       Group3Pnts2->LineEdit3->setText( "" );
655       Group3Pnts2->LineEdit1->setEnabled(true);
656       Group3Pnts2->LineEdit2->setEnabled(false);
657       Group3Pnts2->LineEdit3->setEnabled(false);
658       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
659       
660       myEditCurrentArgument = Group3Pnts2->LineEdit1;
661       break;
662     }
663   case 2:
664     {
665       globalSelection(); // close local contexts, if any
666       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
667
668       Group3Pnts->hide();
669       Group3Pnts2->hide();
670       Group3Pnts3->show();
671       Group3Pnts3->PushButton1->setDown(true);
672       Group3Pnts3->PushButton2->setDown(false);
673       Group3Pnts3->PushButton3->setDown(false);
674       Group3Pnts3->LineEdit1->setText( "" );
675       Group3Pnts3->LineEdit2->setText( "" );
676       Group3Pnts3->LineEdit3->setText( "" );
677       Group3Pnts3->LineEdit1->setEnabled(true);
678       Group3Pnts3->LineEdit2->setEnabled(false);
679       Group3Pnts3->LineEdit3->setEnabled(false);
680       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
681
682       myEditCurrentArgument = Group3Pnts3->LineEdit1;
683       break;
684     }
685   }
686
687   qApp->processEvents();
688   updateGeometry();
689   resize( minimumSizeHint() );
690
691   myEditCurrentArgument->setFocus();
692   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
693            this, SLOT( SelectionIntoArgument() ) );
694
695   if ( CORBA::is_nil( myPoint1 ) )
696     SelectionIntoArgument();
697
698   displayPreview();
699 }
700
701 //=================================================================================
702 // function : ReverseSense()
703 // purpose  : Orientation of the arc
704 //=================================================================================
705 void BasicGUI_ArcDlg::ReverseSense()
706 {
707   displayPreview();
708 }
709
710 //=================================================================================
711 // function : addSubshapeToStudy
712 // purpose  : virtual method to add new SubObjects if local selection
713 //=================================================================================
714 void BasicGUI_ArcDlg::addSubshapesToStudy()
715 {
716   QMap<QString, GEOM::GEOM_Object_var> objMap;
717
718   switch ( getConstructorId() ) {
719   case 0:
720     objMap[Group3Pnts->LineEdit1->text()] = myPoint1;
721     objMap[Group3Pnts->LineEdit2->text()] = myPoint2;
722     objMap[Group3Pnts->LineEdit3->text()] = myPoint3;
723     break;
724   case 1:
725     objMap[Group3Pnts2->LineEdit1->text()] = myPoint1;
726     objMap[Group3Pnts2->LineEdit2->text()] = myPoint2;
727     objMap[Group3Pnts2->LineEdit3->text()] = myPoint3;
728     break;
729   case 2:
730     objMap[Group3Pnts3->LineEdit1->text()] = myPoint1;
731     objMap[Group3Pnts3->LineEdit2->text()] = myPoint2;
732     objMap[Group3Pnts3->LineEdit3->text()] = myPoint3;
733     break;
734   }
735   addSubshapesToFather( objMap );
736 }