Salome HOME
Code refactoring
[modules/geom.git] / src / BasicGUI / BasicGUI_MarkerDlg.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_MarkerDlg.cxx
25 // Author : Sergey LITONIN, Open CASCADE S.A.S. (sergey.litonin@opencascade.com)
26 //
27 #include "BasicGUI_MarkerDlg.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 <QLabel>
39
40 #include <GEOMImpl_Types.hxx>
41
42 // OCCT Includes
43 #include <BRep_Tool.hxx>
44 #include <TopExp.hxx>
45 #include <TopAbs.hxx>
46 #include <TopoDS.hxx>
47 #include <TopoDS_Vertex.hxx>
48 #include <TopoDS_Face.hxx>
49 #include <Geom_Plane.hxx>
50 #include <TopTools_IndexedMapOfShape.hxx>
51 #include <TColStd_IndexedMapOfInteger.hxx>
52 #include <gp_Pnt.hxx>
53 #include <gp_Pln.hxx>
54
55 //=================================================================================
56 // class    : BasicGUI_MarkerDlg()
57 // purpose  : Constructor
58 //=================================================================================
59 BasicGUI_MarkerDlg::BasicGUI_MarkerDlg( GeometryGUI* theGeometryGUI, QWidget* theParent )
60   : GEOMBase_Skeleton( theGeometryGUI, theParent, false,
61                        Qt::WindowTitleHint | Qt::WindowSystemMenuHint )
62 {
63   QPixmap iconCS1   ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER" ) ) );
64   QPixmap iconCS2   ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER2" ) ) );
65   QPixmap iconCS3   ( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_MARKER3" ) ) );
66   QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
67
68   setWindowTitle( tr( "CAPTION" ) );
69
70   mainFrame()->GroupConstructors->setTitle( tr( "LOCALCS" ) );
71   mainFrame()->RadioButton1->setIcon( iconCS1 );
72   mainFrame()->RadioButton2->setIcon( iconCS2 );
73   mainFrame()->RadioButton3->setIcon( iconCS3 );
74
75   Group1 = new DlgRef_1Sel( centralWidget() );
76
77   Group1->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) );
78   Group1->TextLabel1->setText( tr( "GEOM_OBJECT" ) );
79   Group1->PushButton1->setIcon( iconSelect );
80   Group1->PushButton1->setDown( true );
81
82   Group2 = new DlgRef_3Sel( centralWidget() );
83
84   Group2->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) );
85   Group2->TextLabel1->setText( tr( "GEOM_POINT" ) );
86   Group2->TextLabel2->setText( tr( "XDIR" ) );
87   Group2->TextLabel3->setText( tr( "YDIR" ) );
88   Group2->PushButton1->setIcon( iconSelect );
89   Group2->PushButton2->setIcon( iconSelect );
90   Group2->PushButton3->setIcon( iconSelect );
91   Group2->PushButton1->setDown( true );
92
93   aMainGrp = new QFrame( centralWidget() );
94   aMainGrp->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
95   aMainGrp->setContentsMargins( 0, 0, 0, 0 );
96   QHBoxLayout* aMainGrpLayout = new QHBoxLayout( aMainGrp );
97   aMainGrpLayout->setMargin( 0 );
98   
99   QGroupBox* anOriGrp = new QGroupBox( tr( "ORIGIN" ), aMainGrp );
100   QVBoxLayout* anOriGrpLayout = new QVBoxLayout( anOriGrp );
101
102   anOriGrpLayout->addWidget( new QLabel( tr( "GEOM_X" ), anOriGrp ) );
103   myData[ X ] = new SalomeApp_DoubleSpinBox( anOriGrp );
104   anOriGrpLayout->addWidget( myData[ X ] );
105   anOriGrpLayout->addWidget( new QLabel( tr( "GEOM_Y" ), anOriGrp ) );
106   myData[ Y ] = new SalomeApp_DoubleSpinBox( anOriGrp );
107   anOriGrpLayout->addWidget( myData[ Y ] );
108   anOriGrpLayout->addWidget( new QLabel( tr( "GEOM_Z" ), anOriGrp ) );
109   myData[ Z ] = new SalomeApp_DoubleSpinBox( anOriGrp );
110   anOriGrpLayout->addWidget( myData[ Z ] );
111
112   aMainGrpLayout->addWidget( anOriGrp );
113
114   QGroupBox* aXAxisGrp = new QGroupBox( tr( "XDIR" ), aMainGrp );
115   QVBoxLayout* aXAxisGrpLayout = new QVBoxLayout( aXAxisGrp );
116
117   aXAxisGrpLayout->addWidget( new QLabel( tr( "DX" ), aXAxisGrp ) );
118   myData[ DX1 ] = new SalomeApp_DoubleSpinBox( aXAxisGrp );
119   aXAxisGrpLayout->addWidget( myData[ DX1 ] );
120   aXAxisGrpLayout->addWidget( new QLabel( tr( "DY" ), aXAxisGrp ) );
121   myData[ DY1 ] = new SalomeApp_DoubleSpinBox( aXAxisGrp );
122   aXAxisGrpLayout->addWidget( myData[ DY1 ] );
123   aXAxisGrpLayout->addWidget( new QLabel( tr( "DZ" ), aXAxisGrp ) );
124   myData[ DZ1 ] = new SalomeApp_DoubleSpinBox( aXAxisGrp );
125   aXAxisGrpLayout->addWidget( myData[ DZ1 ] );
126
127   aMainGrpLayout->addWidget( aXAxisGrp );
128
129   QGroupBox* anYAxisGrp = new QGroupBox( tr( "YDIR" ), aMainGrp );
130   QVBoxLayout* anYAxisGrpLayout = new QVBoxLayout( anYAxisGrp );
131
132   anYAxisGrpLayout->addWidget( new QLabel( tr( "DX" ), anYAxisGrp ) );
133   myData[ DX2 ] = new SalomeApp_DoubleSpinBox( anYAxisGrp );
134   anYAxisGrpLayout->addWidget( myData[ DX2 ] );
135   anYAxisGrpLayout->addWidget( new QLabel( tr( "DY" ), anYAxisGrp ) );
136   myData[ DY2 ] = new SalomeApp_DoubleSpinBox( anYAxisGrp );
137   anYAxisGrpLayout->addWidget( myData[ DY2 ] );
138   anYAxisGrpLayout->addWidget( new QLabel( tr( "DZ" ), anYAxisGrp ) );
139   myData[ DZ2 ] = new SalomeApp_DoubleSpinBox( anYAxisGrp );
140   anYAxisGrpLayout->addWidget( myData[ DZ2 ] );
141
142   aMainGrpLayout->addWidget( anYAxisGrp );
143
144   QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
145   layout->setMargin( 0 ); layout->setSpacing( 6 );
146   layout->addWidget( aMainGrp );
147   layout->addWidget( Group1 );
148   layout->addWidget( Group2 );
149
150   setHelpFileName( "create_lcs_page.html" );
151
152   Init();
153 }
154
155
156 //=================================================================================
157 // function : ~BasicGUI_MarkerDlg()
158 // purpose  : Destroys the object and frees any allocated resources
159 //=================================================================================
160 BasicGUI_MarkerDlg::~BasicGUI_MarkerDlg()
161 {
162 }
163
164
165 //=================================================================================
166 // function : Init()
167 // purpose  :
168 //=================================================================================
169 void BasicGUI_MarkerDlg::Init()
170 {
171   myShape = myPoint = myVectorX = myVectorY = GEOM::GEOM_Object::_nil();
172   myBlockPreview = false;
173   myConstructorId = -1;
174   myEditCurrentArgument = Group1->LineEdit1;
175   Group1->LineEdit1->setReadOnly( true );
176   Group2->LineEdit1->setReadOnly( true );
177   Group2->LineEdit2->setReadOnly( true );
178   Group2->LineEdit3->setReadOnly( true );
179   Group2->LineEdit1->setEnabled( true );
180   Group2->LineEdit2->setEnabled( false );
181   Group2->LineEdit3->setEnabled( false );
182
183   connect( this,                SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
184
185   connect( Group1->PushButton1, SIGNAL( clicked() ),      this, SLOT( SetEditCurrentArgument() ) );
186   connect( Group2->PushButton1, SIGNAL( clicked() ),      this, SLOT( SetEditCurrentArgument() ) );
187   connect( Group2->PushButton2, SIGNAL( clicked() ),      this, SLOT( SetEditCurrentArgument() ) );
188   connect( Group2->PushButton3, SIGNAL( clicked() ),      this, SLOT( SetEditCurrentArgument() ) );
189
190   connect( Group1->LineEdit1,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
191   connect( Group2->LineEdit1,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
192   connect( Group2->LineEdit2,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
193   connect( Group2->LineEdit3,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
194
195   connect( myGeomGUI,           SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( onDeactivate() ) );
196   connect( myGeomGUI,           SIGNAL( SignalCloseAllDialogs() ),        this, SLOT( ClickOnCancel() ) );
197
198   connect( buttonOk(),          SIGNAL( clicked() ), this, SLOT( onOk() ) );
199   connect( buttonApply(),       SIGNAL( clicked() ), this, SLOT( onApply() ) );
200
201   connect( myGeomGUI->getApp()->selectionMgr(),
202            SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionDone() ) );
203
204   initName( tr( "LCS_NAME" ) );
205
206   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
207   double step = resMgr->doubleValue( "Geometry", "SettingsGeomStep", 100 );
208
209   for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter ) {
210     initSpinBox( anIter.value(), COORD_MIN, COORD_MAX, step, "length_precision" );
211     connect( anIter.value(), SIGNAL( valueChanged( double ) ),
212              this, SLOT( onValueChanged( double ) ) );
213   }
214   
215   myBlockPreview = true;
216   for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter )
217     anIter.value()->setValue( 0 );
218   myData[ DX1 ]->setValue( 1 );
219   myData[ DY2 ]->setValue( 1 );
220   myBlockPreview = false;
221
222   ConstructorsClicked( 0 );
223 }
224
225 //=================================================================================
226 // function : ConstructorsClicked()
227 // purpose  : Radio button management
228 //=================================================================================
229 void BasicGUI_MarkerDlg::ConstructorsClicked( int constructorId )
230 {
231   if ( myConstructorId == constructorId && myConstructorId == 0 ) {
232     globalSelection(); // close local contexts, if any
233     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
234     activate( GEOM_MARKER );
235     return;
236   }
237
238   myConstructorId = constructorId;
239
240   disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 );
241
242   switch ( constructorId ) {
243   case 0:
244     {
245       Group1->hide();
246       Group2->hide();
247       aMainGrp->show();
248       globalSelection(); // close local contexts, if any
249       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
250       activate( GEOM_MARKER );
251       break;
252     }
253   case 1:
254     {
255       aMainGrp->hide();
256       Group2->hide();
257       Group1->show();
258       Group1->PushButton1->setDown( true );
259       globalSelection( GEOM_ALLGEOM );
260       myEditCurrentArgument = Group1->LineEdit1;
261       Group1->LineEdit1->setText( "" );
262       myShape = GEOM::GEOM_Object::_nil();
263       break;
264     }
265   case 2:
266     {
267       aMainGrp->hide();
268       Group1->hide();
269       Group2->show();
270       Group2->PushButton1->setDown( true );
271       Group2->PushButton2->setDown( false );
272       Group2->PushButton3->setDown( false );
273       globalSelection(); // close local contexts, if any
274       localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
275       myEditCurrentArgument = Group2->LineEdit1;
276       Group2->LineEdit1->setText( "" );
277       Group2->LineEdit2->setText( "" );
278       Group2->LineEdit3->setText( "" );
279       Group2->LineEdit1->setEnabled( true );
280       Group2->LineEdit2->setEnabled( false );
281       Group2->LineEdit3->setEnabled( false );
282       myPoint = GEOM::GEOM_Object::_nil();
283       myVectorX = GEOM::GEOM_Object::_nil();
284       myVectorY = GEOM::GEOM_Object::_nil();
285       break;
286     }
287   }
288
289   displayPreview();
290
291   qApp->processEvents();
292   updateGeometry();
293   resize( minimumSizeHint() );
294   
295   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
296            this, SLOT( onSelectionDone() ) );
297   onSelectionDone();
298 }
299
300 //=================================================================================
301 // function : onOk()
302 // purpose  :
303 //=================================================================================
304 void BasicGUI_MarkerDlg::onOk()
305 {
306   if ( onApply() )
307     ClickOnCancel();
308 }
309
310 //=================================================================================
311 // function : onApply()
312 // purpose  :
313 //=================================================================================
314 bool BasicGUI_MarkerDlg::onApply()
315 {
316   if ( !onAccept() )
317     return false;
318
319   initName();
320   ConstructorsClicked( getConstructorId() );
321
322   return true;
323 }
324
325 //=================================================================================
326 // function : onSelectionDone0()
327 // purpose  : Reaction on selection when first method of creation is current one
328 //=================================================================================
329 void BasicGUI_MarkerDlg::onSelectionDone0()
330 {
331   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
332   SALOME_ListIO aSelList;
333   aSelMgr->selectedObjects(aSelList);
334
335   if (aSelList.Extent() == 1) {
336     Handle(SALOME_InteractiveObject) anIO = aSelList.First();
337     GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO );
338     
339     if ( !aSelectedObj->_is_nil() ) {
340       TopoDS_Shape aShape;
341       if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) && !aShape.IsNull() ) {
342         // Existing LCS selected
343         if ( aSelectedObj->GetType() == GEOM_MARKER && aShape.ShapeType() == TopAbs_FACE ) {
344           TopoDS_Face aFace = TopoDS::Face( aShape );
345           Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast( BRep_Tool::Surface( aFace ) );
346           
347           if ( !aPlane.IsNull() ) {
348             gp_Ax3 anAx3 = aPlane->Pln().Position();
349             gp_Pnt aLoc = anAx3.Location();
350             gp_Dir aXDir = anAx3.XDirection();
351             gp_Dir aYDir = anAx3.YDirection();
352             
353             myData[ X ]->setValue( aLoc.X() );
354             myData[ Y ]->setValue( aLoc.Y() );
355             myData[ Z ]->setValue( aLoc.Z() );
356             
357             myData[ DX1 ]->setValue( aXDir.X() );
358             myData[ DY1 ]->setValue( aXDir.Y() );
359             myData[ DZ1 ]->setValue( aXDir.Z() );
360             
361             myData[ DX2 ]->setValue( aYDir.X() );
362             myData[ DY2 ]->setValue( aYDir.Y() );
363             myData[ DZ2 ]->setValue( aYDir.Z() );
364             aSelMgr->clearSelected();
365           }
366         }
367         else {
368           TColStd_IndexedMapOfInteger aMap;
369           aSelMgr->GetIndexes( anIO, aMap );
370           if ( aMap.Extent() == 1 ) { // Local Selection
371             int anIndex = aMap( 1 );
372             TopTools_IndexedMapOfShape aShapes;
373             TopExp::MapShapes( aShape, aShapes );
374             aShape = aShapes.FindKey( anIndex );
375             aSelMgr->clearSelected(); // ???
376           }
377
378           if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX ) {
379             gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( aShape ) );
380             myData[ X ]->setValue( aPnt.X() );
381             myData[ Y ]->setValue( aPnt.Y() );
382             myData[ Z ]->setValue( aPnt.Z() );
383           }
384         }
385       }
386     }
387   }
388   
389   displayPreview();
390 }
391
392
393 //=================================================================================
394 // function : onSelectionDone()
395 // purpose  : Called when selection as changed or other case
396 //=================================================================================
397 void BasicGUI_MarkerDlg::onSelectionDone()
398 {
399   if ( getConstructorId() == 0 ) {
400     onSelectionDone0();
401     return;
402   }
403
404   myEditCurrentArgument->setText( "" );
405
406   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
407   SALOME_ListIO aSelList;
408   aSelMgr->selectedObjects(aSelList);
409
410   if (aSelList.Extent() == 1) {
411     Handle(SALOME_InteractiveObject) anIO = aSelList.First();
412     GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO );
413
414     if ( !CORBA::is_nil( aSelectedObj ) ) {
415       QString aName = GEOMBase::GetName( aSelectedObj );
416       
417       if ( getConstructorId() == 1 ) { // by shape position
418         TopoDS_Shape aShape;
419         if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) )
420           myShape = aSelectedObj;
421         myEditCurrentArgument->setText( aName );
422       }
423       else if ( getConstructorId() == 2 ) { // by point and two vectors
424         TopoDS_Shape aShape;
425         if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) {
426           TopAbs_ShapeEnum aNeedType = TopAbs_EDGE;
427           if ( myEditCurrentArgument == Group2->LineEdit1 )
428             aNeedType = TopAbs_VERTEX;
429           
430           TColStd_IndexedMapOfInteger aMap;
431           aSelMgr->GetIndexes( anIO, aMap );
432
433           if ( aMap.Extent() == 1 ) { // Local Selection
434             int anIndex = aMap( 1 );
435             if ( aNeedType == TopAbs_EDGE )
436               aName += QString( ":edge_%1" ).arg( anIndex );
437             else
438               aName += QString( ":vertex_%1" ).arg( anIndex );
439             
440             //Find SubShape Object in Father
441             GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather( aSelectedObj, aName );
442             if ( aFindedObject->_is_nil() ) { // Object not found in study
443               GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
444               aSelectedObj = aShapesOp->GetSubShape( aSelectedObj, anIndex );
445             } 
446             else {
447               aSelectedObj = aFindedObject; // get Object from study
448             }
449           }
450           else { // Global Selection
451             if ( aShape.ShapeType() != aNeedType ) {
452               aSelectedObj = GEOM::GEOM_Object::_nil();
453               aName = "";
454             }
455           }
456           
457           if ( myEditCurrentArgument == Group2->LineEdit1 ) {
458             myPoint = aSelectedObj;
459             myEditCurrentArgument->setText( aName );
460             if (!myPoint->_is_nil() && Group2->LineEdit2->text() == "")
461                 Group2->PushButton2->click();
462           }
463           else if (myEditCurrentArgument == Group2->LineEdit2) {
464             myVectorX = aSelectedObj;
465             myEditCurrentArgument->setText( aName );
466             if (!myVectorX->_is_nil() && Group2->LineEdit3->text() == "")
467               Group2->PushButton3->click();
468           }
469           else if ( myEditCurrentArgument == Group2->LineEdit3 ) {
470             myVectorY = aSelectedObj;
471             myEditCurrentArgument->setText( aName );
472             if (!myVectorX->_is_nil() && Group2->LineEdit1->text() == "")
473                 Group2->PushButton1->click();
474           }
475         }
476       }
477     }
478   }
479   else {
480     if ( getConstructorId() == 1 ) {
481       myShape = GEOM::GEOM_Object::_nil();
482     } else if ( getConstructorId() == 2 ) {
483       if ( myEditCurrentArgument == Group2->LineEdit1 )
484         myPoint = GEOM::GEOM_Object::_nil();
485       else if ( myEditCurrentArgument == Group2->LineEdit2 )
486         myVectorX = GEOM::GEOM_Object::_nil();
487       else if ( myEditCurrentArgument == Group2->LineEdit3 )
488         myVectorY = GEOM::GEOM_Object::_nil();
489     }
490   }
491
492   displayPreview();
493 }
494
495 //=================================================================================
496 // function : SetEditCurrentArgument()
497 // purpose  :
498 //=================================================================================
499 void BasicGUI_MarkerDlg::SetEditCurrentArgument()
500 {
501   QPushButton* send = (QPushButton*)sender();
502   globalSelection(); // close local contexts, if any
503
504   if ( send == Group1->PushButton1 ) {
505     myEditCurrentArgument = Group1->LineEdit1;
506     globalSelection( GEOM_ALLGEOM );
507   }
508   else if ( send == Group2->PushButton1 ) {
509     myEditCurrentArgument = Group2->LineEdit1;
510     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_VERTEX );
511     Group2->PushButton2->setDown( false );
512     Group2->PushButton3->setDown( false );
513     Group2->LineEdit1->setEnabled( true );
514     Group2->LineEdit2->setEnabled( false );
515     Group2->LineEdit3->setEnabled( false );
516   }
517   else if ( send == Group2->PushButton2 ) {
518     myEditCurrentArgument = Group2->LineEdit2;
519     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
520     Group2->PushButton1->setDown( false );
521     Group2->PushButton3->setDown( false );
522     Group2->LineEdit1->setEnabled( false );
523     Group2->LineEdit2->setEnabled( true );
524     Group2->LineEdit3->setEnabled( false );
525   }
526   else if ( send == Group2->PushButton3 ) {
527     myEditCurrentArgument = Group2->LineEdit3;
528     localSelection( GEOM::GEOM_Object::_nil(), TopAbs_EDGE );
529     Group2->PushButton1->setDown( false );
530     Group2->PushButton2->setDown( false );
531     Group2->LineEdit1->setEnabled( false );
532     Group2->LineEdit2->setEnabled( false );
533     Group2->LineEdit3->setEnabled( true );
534   }
535   
536   myEditCurrentArgument->setFocus();
537   send->setDown(true);
538   onSelectionDone();
539 }
540
541 //=================================================================================
542 // function : LineEditReturnPressed()
543 // purpose  :
544 //=================================================================================
545 void BasicGUI_MarkerDlg::LineEditReturnPressed()
546 {
547   QLineEdit* send = (QLineEdit*)sender();
548
549   myEditCurrentArgument = send;
550   GEOMBase_Skeleton::LineEditReturnPressed();
551 }
552
553 //=================================================================================
554 // function : onActivate()
555 // purpose  :
556 //=================================================================================
557 void BasicGUI_MarkerDlg::onActivate()
558 {
559   GEOMBase_Skeleton::ActivateThisDialog();
560   connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
561            this, SLOT( onSelectionDone() ) );
562
563   ConstructorsClicked( getConstructorId() );
564 }
565
566 //=================================================================================
567 // function : onDeactivate()
568 // purpose  : public slot to deactivate if active
569 //=================================================================================
570 void BasicGUI_MarkerDlg::onDeactivate()
571 {
572   GEOMBase_Skeleton::DeactivateActiveDialog();
573 }
574
575 //=================================================================================
576 // function : enterEvent()
577 // purpose  :
578 //=================================================================================
579 void BasicGUI_MarkerDlg::enterEvent( QEvent* )
580 {
581   if ( !mainFrame()->GroupConstructors->isEnabled() )
582     onActivate();
583 }
584
585 //=================================================================================
586 // function : createOperation
587 // purpose  :
588 //=================================================================================
589 GEOM::GEOM_IOperations_ptr BasicGUI_MarkerDlg::createOperation()
590 {
591   return myGeomGUI->GetGeomGen()->GetIBasicOperations( getStudyId() );
592 }
593
594 //=================================================================================
595 // function : isValid
596 // purpose  :
597 //=================================================================================
598 bool BasicGUI_MarkerDlg::isValid( QString& msg )
599 {
600   const int id = getConstructorId();
601   switch ( id ) {
602     case 0: {
603       gp_Vec v1( myData[ DX1 ]->value(), myData[ DY1 ]->value(), myData[ DZ1 ]->value() ),
604         v2( myData[ DX2 ]->value(), myData[ DY2 ]->value(), myData[ DZ2 ]->value() );
605       
606       bool isOk = false;
607       // we will got exception if the magnitude of any of the 2 vectors <= gp::Resolution()
608       // Vectors shouldn't be checked for being orthogonal here!
609       if ( v1.Magnitude() > gp::Resolution() && v2.Magnitude() > gp::Resolution() ) {
610         isOk = !v1.IsParallel( v2, Precision::Angular() );
611         if ( !isOk )
612           msg += tr( "VEC_PARALLEL" );
613       }
614       bool ok = true;
615       for ( DataMap::iterator anIter = myData.begin(); anIter != myData.end(); ++anIter )
616         ok = anIter.value()->isValid( msg, !IsPreview()) && ok;
617       return isOk && ok;
618     }
619     case 1:
620       return !myShape->_is_nil();
621     case 2:
622       return !myPoint->_is_nil() && !myVectorX->_is_nil() && !myVectorY->_is_nil();
623   }
624   return false;
625 }
626
627 //=================================================================================
628 // function : execute
629 // purpose  :
630 //=================================================================================
631 bool BasicGUI_MarkerDlg::execute( ObjectList& objects )
632 {
633   GEOM::GEOM_IBasicOperations_var anOper = GEOM::GEOM_IBasicOperations::_narrow( getOperation() );
634   GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_nil();
635   QStringList aParameters;
636   const int id = getConstructorId();
637   if (id == 0) {
638     anObj = anOper->MakeMarker( myData[ X   ]->value(), myData[ Y   ]->value(), 
639                                 myData[ Z   ]->value(), myData[ DX1 ]->value(),
640                                 myData[ DY1 ]->value(), myData[ DZ1 ]->value(),
641                                 myData[ DX2 ]->value(), myData[ DY2 ]->value(),
642                                 myData[ DZ2 ]->value() );
643     aParameters<<myData[X]->text();
644     aParameters<<myData[Y]->text();
645     aParameters<<myData[Z]->text();
646     aParameters<<myData[ DX1 ]->text(); 
647     aParameters<<myData[ DY1 ]->text(); 
648     aParameters<<myData[ DZ1 ]->text();
649     aParameters<<myData[ DX2 ]->text();
650     aParameters<<myData[ DY2 ]->text();
651     aParameters<<myData[ DZ2 ]->text();
652   } else if (id == 1) {
653     anObj = anOper->MakeMarkerFromShape( myShape ); 
654   } else if (id == 2) {
655     anObj = anOper->MakeMarkerPntTwoVec( myPoint, myVectorX, myVectorY ); 
656   }
657   
658   if ( !anObj->_is_nil() ) {
659     if ( !IsPreview() && id == 0)
660       anObj->SetParameters(aParameters.join(":").toLatin1().constData());
661     objects.push_back( anObj._retn() );
662   }
663
664   return true;
665 }
666
667 //=================================================================================
668 // function : onValueChanged
669 // purpose  :
670 //=================================================================================
671 void BasicGUI_MarkerDlg::onValueChanged( double )
672 {
673   displayPreview();
674 }
675
676 //=================================================================================
677 // function : displayPreview
678 // purpose  :
679 //=================================================================================
680 void BasicGUI_MarkerDlg::displayPreview ( const bool   activate,
681                                           const bool   update,
682                                           const bool   toRemoveFromEngine,
683                                           const double lineWidth )
684 {
685   if ( !myBlockPreview ) {
686     GEOMBase_Skeleton::displayPreview( activate, update, toRemoveFromEngine, lineWidth );
687     if ( myConstructorId == 0 )
688       GEOMBase_Skeleton::activate( GEOM_MARKER );
689   }
690 }