]> SALOME platform Git repositories - modules/geom.git/blob - src/BasicGUI/BasicGUI_ArcDlg.cxx
Salome HOME
RNC: EDF 1542: Take into account orientation in newly created MakeVertexOnCurveByLeng...
[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   GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
273   if ( !CORBA::is_nil( aSelectedObject ) ) {
274     QString aName = GEOMBase::GetName(aSelectedObject);
275
276     // Get Selected object if selected subshape
277     TopoDS_Shape aShape;
278     if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_SHAPE) && !aShape.IsNull())
279     {
280       TColStd_IndexedMapOfInteger aMap;
281       aSelMgr->GetIndexes(aSelList.First(), aMap);
282       if (aMap.Extent() == 1) // Local Selection
283       {
284         int anIndex = aMap(1);
285         aName += QString(":vertex_%1").arg(anIndex);
286
287         //Find SubShape Object in Father
288         GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather(aSelectedObject, aName);
289
290                 if ( aFindedObject->_is_nil() ) { // Object not found in study
291           GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId());
292           aSelectedObject = aShapesOp->GetSubShape(aSelectedObject, anIndex);
293         }
294         else
295           aSelectedObject = aFindedObject; // get Object from study
296       }
297       else // Global Selection
298       {
299         if (aShape.ShapeType() != TopAbs_VERTEX) {
300           aSelectedObject = GEOM::GEOM_Object::_nil();
301           aName = "";
302         }
303       }
304     }
305
306     myEditCurrentArgument->setText(aName);
307
308     if (!aSelectedObject->_is_nil()) { // clear selection if something selected
309       globalSelection();
310       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );      
311     }
312
313     switch ( getConstructorId() ) {
314     case 0:
315       if      ( myEditCurrentArgument == Group3Pnts->LineEdit1 ) {
316         myPoint1 = aSelectedObject;
317         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
318           Group3Pnts->PushButton2->click();
319       }
320       else if ( myEditCurrentArgument == Group3Pnts->LineEdit2 ) {
321         myPoint2 = aSelectedObject;
322         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
323           Group3Pnts->PushButton3->click();
324       }
325       else if ( myEditCurrentArgument == Group3Pnts->LineEdit3 ) {
326         myPoint3 = aSelectedObject;
327         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
328           Group3Pnts->PushButton1->click();
329       }
330       break;
331     case 1:
332       if ( myEditCurrentArgument == Group3Pnts2->LineEdit1 ) {
333         myPoint1 = aSelectedObject;
334         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
335           Group3Pnts2->PushButton2->click();
336       }
337       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit2 ) {
338         myPoint2 = aSelectedObject;
339         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
340           Group3Pnts2->PushButton3->click();
341       }
342       else if ( myEditCurrentArgument == Group3Pnts2->LineEdit3 ) {
343         myPoint3 = aSelectedObject;
344         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
345           Group3Pnts2->PushButton1->click();
346       }
347       break;
348     case 2:
349       if ( myEditCurrentArgument == Group3Pnts3->LineEdit1 ) {
350         myPoint1 = aSelectedObject;
351         if ( !myPoint1->_is_nil() && myPoint2->_is_nil() )
352           Group3Pnts3->PushButton2->click();
353       }
354       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit2 ) {
355         myPoint2 = aSelectedObject;
356         if ( !myPoint2->_is_nil() && myPoint3->_is_nil() )
357           Group3Pnts3->PushButton3->click();
358       }
359       else if ( myEditCurrentArgument == Group3Pnts3->LineEdit3 ) {
360         myPoint3 = aSelectedObject;
361         if ( !myPoint3->_is_nil() && myPoint1->_is_nil() )
362           Group3Pnts3->PushButton1->click();
363       }
364       break;
365     }
366   }
367
368   displayPreview();
369 }
370
371
372 //=================================================================================
373 // function : SetEditCurrentArgument()
374 // purpose  :
375 //=================================================================================
376 void BasicGUI_ArcDlg::SetEditCurrentArgument()
377 {
378   globalSelection(); // close local selection to clear it
379   localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
380
381   QPushButton* send = (QPushButton*)sender();
382   switch ( getConstructorId() ) {
383   case 0:
384     if      ( send == Group3Pnts->PushButton1 ) {
385       myEditCurrentArgument = Group3Pnts->LineEdit1;
386       Group3Pnts->PushButton2->setDown(false);
387       Group3Pnts->PushButton3->setDown(false);
388       Group3Pnts->LineEdit1->setEnabled(true);
389       Group3Pnts->LineEdit2->setEnabled(false);
390       Group3Pnts->LineEdit3->setEnabled(false);
391     }
392     else if ( send == Group3Pnts->PushButton2 ) {
393       myEditCurrentArgument = Group3Pnts->LineEdit2;
394       Group3Pnts->PushButton1->setDown(false);
395       Group3Pnts->PushButton3->setDown(false);
396       Group3Pnts->LineEdit1->setEnabled(false);
397       Group3Pnts->LineEdit2->setEnabled(true);
398       Group3Pnts->LineEdit3->setEnabled(false);
399     }
400     else if ( send == Group3Pnts->PushButton3 ) {
401       myEditCurrentArgument = Group3Pnts->LineEdit3;
402       Group3Pnts->PushButton1->setDown(false);
403       Group3Pnts->PushButton2->setDown(false);
404       Group3Pnts->LineEdit1->setEnabled(false);
405       Group3Pnts->LineEdit2->setEnabled(false);
406       Group3Pnts->LineEdit3->setEnabled(true);
407     }
408     break;
409   case 1:
410     if      ( send == Group3Pnts2->PushButton1 ) {
411       myEditCurrentArgument = Group3Pnts2->LineEdit1;
412       Group3Pnts2->PushButton2->setDown(false);
413       Group3Pnts2->PushButton3->setDown(false);
414       Group3Pnts2->LineEdit1->setEnabled(true);
415       Group3Pnts2->LineEdit2->setEnabled(false);
416       Group3Pnts2->LineEdit3->setEnabled(false);
417     }
418     else if ( send == Group3Pnts2->PushButton2 ) {
419       myEditCurrentArgument = Group3Pnts2->LineEdit2;
420       Group3Pnts2->PushButton1->setDown(false);
421       Group3Pnts2->PushButton3->setDown(false);
422       Group3Pnts2->LineEdit1->setEnabled(false);
423       Group3Pnts2->LineEdit2->setEnabled(true);
424       Group3Pnts2->LineEdit3->setEnabled(false);
425     }
426     else if ( send == Group3Pnts2->PushButton3 ) {
427       myEditCurrentArgument = Group3Pnts2->LineEdit3;
428       Group3Pnts2->PushButton1->setDown(false);
429       Group3Pnts2->PushButton2->setDown(false);
430       Group3Pnts2->LineEdit1->setEnabled(false);
431       Group3Pnts2->LineEdit2->setEnabled(false);
432       Group3Pnts2->LineEdit3->setEnabled(true);
433     }
434     break;
435   case 2:
436     if ( send == Group3Pnts3->PushButton1 ) {
437       myEditCurrentArgument = Group3Pnts3->LineEdit1;
438       Group3Pnts3->PushButton2->setDown(false);
439       Group3Pnts3->PushButton3->setDown(false);
440       Group3Pnts3->LineEdit1->setEnabled(true);
441       Group3Pnts3->LineEdit2->setEnabled(false);
442       Group3Pnts3->LineEdit3->setEnabled(false);
443     }
444     else if ( send == Group3Pnts3->PushButton2 ) {
445       myEditCurrentArgument = Group3Pnts3->LineEdit2;
446       Group3Pnts3->PushButton1->setDown(false);
447       Group3Pnts3->PushButton3->setDown(false);
448       Group3Pnts3->LineEdit1->setEnabled(false);
449       Group3Pnts3->LineEdit2->setEnabled(true);
450       Group3Pnts3->LineEdit3->setEnabled(false);
451     }
452     else if ( send == Group3Pnts3->PushButton3 ) {
453       myEditCurrentArgument = Group3Pnts3->LineEdit3;
454       Group3Pnts3->PushButton1->setDown(false);
455       Group3Pnts3->PushButton2->setDown(false);
456       Group3Pnts3->LineEdit1->setEnabled(false);
457       Group3Pnts3->LineEdit2->setEnabled(false);
458       Group3Pnts3->LineEdit3->setEnabled(true);
459     }
460     break;
461   }
462   myEditCurrentArgument->setFocus();
463   //  SelectionIntoArgument();
464   send->setDown(true);
465   displayPreview();
466 }
467
468
469 //=================================================================================
470 // function : LineEditReturnPressed()
471 // purpose  :
472 //=================================================================================
473 void BasicGUI_ArcDlg::LineEditReturnPressed()
474 {
475   QLineEdit* send = (QLineEdit*)sender();
476   if ( send == Group3Pnts->LineEdit1 || send == Group3Pnts->LineEdit2 || send == Group3Pnts->LineEdit3 ||
477        send == Group3Pnts2->LineEdit1 || send == Group3Pnts2->LineEdit2 || send == Group3Pnts2->LineEdit3 ||
478        send == Group3Pnts3->LineEdit1 || send == Group3Pnts3->LineEdit2 || send == Group3Pnts3->LineEdit3 ) {
479     myEditCurrentArgument = send;
480     GEOMBase_Skeleton::LineEditReturnPressed();
481   }
482 }
483
484
485 //=================================================================================
486 // function : ActivateThisDialog()
487 // purpose  :
488 //=================================================================================
489 void BasicGUI_ArcDlg::ActivateThisDialog()
490 {
491   GEOMBase_Skeleton::ActivateThisDialog();
492
493   connect( myGeomGUI->getApp()->selectionMgr(),
494            SIGNAL( currentSelectionChanged() ),
495            this,
496            SLOT(SelectionIntoArgument() ) );
497
498   ConstructorsClicked( getConstructorId() );
499 }
500
501 //=================================================================================
502 // function : enterEvent()
503 // purpose  :
504 //=================================================================================
505 void BasicGUI_ArcDlg::enterEvent( QEvent* )
506 {
507   if ( !mainFrame()->GroupConstructors->isEnabled() )
508     ActivateThisDialog();
509 }
510
511 //=================================================================================
512 // function : createOperation
513 // purpose  :
514 //=================================================================================
515 GEOM::GEOM_IOperations_ptr BasicGUI_ArcDlg::createOperation()
516 {
517   return myGeomGUI->GetGeomGen()->GetICurvesOperations( getStudyId() );
518 }
519
520 //=================================================================================
521 // function : isEqual
522 // purpose  : it may also be needed to check for min distance between gp_Pnt-s...
523 //=================================================================================
524 static bool isEqual( const GEOM::GEOM_Object_var& thePnt1, const GEOM::GEOM_Object_var& thePnt2 )
525 {
526   return thePnt1->_is_equivalent( thePnt2 );
527 }
528
529 //=================================================================================
530 // function : isValid
531 // purpose  :
532 //=================================================================================
533 bool BasicGUI_ArcDlg::isValid( QString& msg )
534 {
535   switch (getConstructorId()) {
536   case 0:
537     {
538       if (Group3Pnts->LineEdit1->text().trimmed().isEmpty() ||
539           Group3Pnts->LineEdit2->text().trimmed().isEmpty() ||
540           Group3Pnts->LineEdit3->text().trimmed().isEmpty())
541         return false;
542       break;
543     }
544   case 1:
545     {
546       if (Group3Pnts2->LineEdit1->text().trimmed().isEmpty() ||
547           Group3Pnts2->LineEdit2->text().trimmed().isEmpty() ||
548           Group3Pnts2->LineEdit3->text().trimmed().isEmpty())
549         return false;
550       break;
551     }
552   case 2:
553     {
554       if (Group3Pnts3->LineEdit1->text().trimmed().isEmpty() ||
555           Group3Pnts3->LineEdit2->text().trimmed().isEmpty() ||
556           Group3Pnts3->LineEdit3->text().trimmed().isEmpty())
557         return false;
558       break;
559     }
560   }
561   return !myPoint1->_is_nil() && !myPoint2->_is_nil() && !myPoint3->_is_nil() &&
562     !isEqual( myPoint1, myPoint2 ) && !isEqual( myPoint1, myPoint3 ) && !isEqual( myPoint2, myPoint3 );
563 }
564
565 //=================================================================================
566 // function : execute
567 // purpose  :
568 //=================================================================================
569 bool BasicGUI_ArcDlg::execute( ObjectList& objects )
570 {
571   bool res = false;
572   GEOM::GEOM_Object_var anObj;
573
574   GEOM::GEOM_ICurvesOperations_var anOper = GEOM::GEOM_ICurvesOperations::_narrow( getOperation() );
575
576   switch ( getConstructorId() ) {
577   case 0:
578     {
579       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
580         anObj = anOper->MakeArc( myPoint1, myPoint2, myPoint3 );
581         res = true;
582       }
583       break;
584     }
585   case 1:
586     {
587       bool Sense = Group3Pnts2->CheckButton1->isChecked();
588       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
589         anObj = anOper->MakeArcCenter( myPoint1, myPoint2, myPoint3, Sense );
590         res = true;
591       }
592       break;
593     }
594   case 2:
595     {
596       if ( !CORBA::is_nil( myPoint1 ) && !CORBA::is_nil( myPoint2 ) && !CORBA::is_nil( myPoint3 ) ) {
597         anObj = anOper->MakeArcOfEllipse( myPoint1, myPoint2, myPoint3 );
598         res = true;
599       }
600       break;
601     }
602   }
603   if ( !anObj->_is_nil() ) {
604     objects.push_back( anObj._retn() );
605   }
606   return res;
607 }
608
609 //=================================================================================
610 // function : ConstructorsClicked()
611 // purpose  : Radio button management
612 //=================================================================================
613 void BasicGUI_ArcDlg::ConstructorsClicked( int constructorId )
614 {
615   disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 );
616
617   switch ( constructorId ) {
618   case 0:
619     {
620       globalSelection(); // close local contexts, if any
621       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
622
623       Group3Pnts->show();
624       Group3Pnts2->hide();
625       Group3Pnts3->hide();
626       Group3Pnts->PushButton1->setDown(true);
627       Group3Pnts->PushButton2->setDown(false);
628       Group3Pnts->PushButton3->setDown(false);
629       Group3Pnts->LineEdit1->setText( "" );
630       Group3Pnts->LineEdit2->setText( "" );
631       Group3Pnts->LineEdit3->setText( "" );
632       Group3Pnts->LineEdit1->setEnabled(true);
633       Group3Pnts->LineEdit2->setEnabled(false);
634       Group3Pnts->LineEdit3->setEnabled(false);
635       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
636
637       myEditCurrentArgument = Group3Pnts->LineEdit1;
638       break;
639     }
640   case 1:
641     {
642       globalSelection(); // close local contexts, if any
643       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
644
645       Group3Pnts->hide();
646       Group3Pnts2->show();
647       Group3Pnts3->hide();
648       Group3Pnts2->PushButton1->setDown(true);
649       Group3Pnts2->PushButton2->setDown(false);
650       Group3Pnts2->PushButton3->setDown(false);
651       Group3Pnts2->LineEdit1->setText( "" );
652       Group3Pnts2->LineEdit2->setText( "" );
653       Group3Pnts2->LineEdit3->setText( "" );
654       Group3Pnts2->LineEdit1->setEnabled(true);
655       Group3Pnts2->LineEdit2->setEnabled(false);
656       Group3Pnts2->LineEdit3->setEnabled(false);
657       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
658       
659       myEditCurrentArgument = Group3Pnts2->LineEdit1;
660       break;
661     }
662   case 2:
663     {
664       globalSelection(); // close local contexts, if any
665       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX ); //Select Vertex on All Shapes
666
667       Group3Pnts->hide();
668       Group3Pnts2->hide();
669       Group3Pnts3->show();
670       Group3Pnts3->PushButton1->setDown(true);
671       Group3Pnts3->PushButton2->setDown(false);
672       Group3Pnts3->PushButton3->setDown(false);
673       Group3Pnts3->LineEdit1->setText( "" );
674       Group3Pnts3->LineEdit2->setText( "" );
675       Group3Pnts3->LineEdit3->setText( "" );
676       Group3Pnts3->LineEdit1->setEnabled(true);
677       Group3Pnts3->LineEdit2->setEnabled(false);
678       Group3Pnts3->LineEdit3->setEnabled(false);
679       myPoint1 = myPoint2 = myPoint3 = GEOM::GEOM_Object::_nil();
680
681       myEditCurrentArgument = Group3Pnts3->LineEdit1;
682       break;
683     }
684   }
685
686   qApp->processEvents();
687   updateGeometry();
688   resize( minimumSizeHint() );
689
690   myEditCurrentArgument->setFocus();
691   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
692            this, SLOT( SelectionIntoArgument() ) );
693
694   if ( CORBA::is_nil( myPoint1 ) )
695     SelectionIntoArgument();
696
697   displayPreview();
698 }
699
700 //=================================================================================
701 // function : ReverseSense()
702 // purpose  : Orientation of the arc
703 //=================================================================================
704 void BasicGUI_ArcDlg::ReverseSense()
705 {
706   displayPreview();
707 }
708
709 //=================================================================================
710 // function : addSubshapeToStudy
711 // purpose  : virtual method to add new SubObjects if local selection
712 //=================================================================================
713 void BasicGUI_ArcDlg::addSubshapesToStudy()
714 {
715   QMap<QString, GEOM::GEOM_Object_var> objMap;
716
717   switch ( getConstructorId() ) {
718   case 0:
719     objMap[Group3Pnts->LineEdit1->text()] = myPoint1;
720     objMap[Group3Pnts->LineEdit2->text()] = myPoint2;
721     objMap[Group3Pnts->LineEdit3->text()] = myPoint3;
722     break;
723   case 1:
724     objMap[Group3Pnts2->LineEdit1->text()] = myPoint1;
725     objMap[Group3Pnts2->LineEdit2->text()] = myPoint2;
726     objMap[Group3Pnts2->LineEdit3->text()] = myPoint3;
727     break;
728   case 2:
729     objMap[Group3Pnts3->LineEdit1->text()] = myPoint1;
730     objMap[Group3Pnts3->LineEdit2->text()] = myPoint2;
731     objMap[Group3Pnts3->LineEdit3->text()] = myPoint3;
732     break;
733   }
734   addSubshapesToFather( objMap );
735 }