Salome HOME
Merge from V5_1_3_BR branch (07/12/09)
[modules/geom.git] / src / EntityGUI / EntityGUI_SketcherDlg.cxx
1 //  Copyright (C) 2007-2008  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 // GEOM GEOMGUI : GUI for Geometry component
23 // File   : EntityGUI_SketcherDlg.cxx
24 // Author : Damien COQUERET, Open CASCADE S.A.S.
25 //
26 #include "EntityGUI_SketcherDlg.h"
27 #include "EntityGUI_Widgets.h"
28 #include <QtxDoubleSpinBox.h>
29
30 #include <GEOMBase.h>
31 #include <GeometryGUI.h>
32 #include <GEOMImpl_Types.hxx>
33 #include <Geom_Surface.hxx>
34 #include <Geom_Plane.hxx>
35
36 #include <SUIT_Desktop.h>
37 #include <SUIT_Session.h>
38 #include <SUIT_MessageBox.h>
39 #include <SUIT_ResourceMgr.h>
40 #include <SalomeApp_Application.h>
41 #include <LightApp_Application.h>
42 #include <LightApp_SelectionMgr.h>
43
44 #include <QKeyEvent>
45
46 #include <BRep_Tool.hxx>
47 #include <TopExp.hxx>
48 #include <TopExp_Explorer.hxx>
49 #include <TopoDS_Vertex.hxx>
50 #include <TopoDS.hxx>
51 #include <BRepBuilderAPI_Transform.hxx>
52 #include <BRepBuilderAPI_MakeWire.hxx>
53 #include <Sketcher_Profile.hxx>
54
55 #include <SalomeApp_Study.h>
56
57 #include <gp_Pln.hxx>
58
59 //=================================================================================
60 // class    : EntityGUI_SketcherDlg()
61 // purpose  : Constructs a EntityGUI_SketcherDlg which is a child of 'parent', with the
62 //            name 'name' and widget flags set to 'f'.
63 //            The dialog will by default be modeless, unless you set 'modal' to
64 //            TRUE to construct a modal dialog.
65 //=================================================================================
66 EntityGUI_SketcherDlg::EntityGUI_SketcherDlg( GeometryGUI* GUI, QWidget* parent,
67                                               bool modal, Qt::WindowFlags fl,
68                                               const double lineWidth )
69   : QDialog( parent, fl ),
70     myIsAllAdded( false ),
71     myIsApply( false ),
72     GEOMBase_Helper( dynamic_cast<SUIT_Desktop*>( parent ) ),
73     myGeometryGUI( GUI ),
74     myLineWidth( lineWidth )
75 {
76   setModal( modal );
77   setAttribute( Qt::WA_DeleteOnClose );
78
79   myGeometryGUI->SetActiveDialogBox(this);
80
81   MainWidget = new EntityGUI_Skeleton( this );
82   QVBoxLayout* topLayout = new QVBoxLayout( this );
83   topLayout->setMargin( 9 ); topLayout->setSpacing( 6 );
84
85   MainWidget->buttonCancel->setText( tr( "GEOM_BUT_CANCEL" ) );
86   MainWidget->buttonEnd->setText( tr( "GEOM_BUT_END_SKETCH" ) );
87   MainWidget->buttonClose->setText( tr( "GEOM_BUT_CLOSE_SKETCH" ) );
88   MainWidget->buttonHelp->setText( tr( "GEOM_BUT_HELP" ) );
89
90   QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
91   QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_UNDO" ) ) );
92   QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_REDO" ) ) );
93
94   setWindowTitle( tr( "GEOM_SKETCHER_TITLE" ) );
95
96   MainWidget->GroupConstructors->setTitle( tr( "GEOM_SKETCHER_EL" ) );
97   MainWidget->RadioButton1->setText( tr( "GEOM_SKETCHER_SEGMENT" ) );
98   MainWidget->RadioButton2->setText( tr( "GEOM_SKETCHER_ARC" ) );
99   MainWidget->GroupDest->setTitle( tr( "GEOM_SKETCHER_DEST" ) );
100   MainWidget->GroupDest1->setTitle( tr( "GEOM_SKETCHER_TYPE" ) );
101   MainWidget->RB_Dest1->setText( tr( "GEOM_SKETCHER_POINT" ) );
102   MainWidget->RB_Dest2->setText( tr( "GEOM_SKETCHER_DIR" ) );
103
104   /***************************************************************/
105
106   GroupBox1 = new QGroupBox(tr("GEOM_CS"), this);
107   QGridLayout* OwnLayout = new QGridLayout(GroupBox1);
108   OwnLayout->setSpacing(6);
109   OwnLayout->setMargin(11);
110
111   ComboBox1 = new QComboBox(GroupBox1);
112   OwnLayout->addWidget(ComboBox1);
113
114   topLayout->addWidget(GroupBox1);
115   topLayout->addWidget( MainWidget );
116
117   GroupPt = new EntityGUI_Point( MainWidget->DestCnt );
118
119   GroupPt->GroupPoint->setTitle( tr( "GEOM_SKETCHER_POINT" ) );
120   GroupPt->RB_Point1->setText( tr( "GEOM_SKETCHER_ABS" ) );
121   GroupPt->RB_Point2->setText( tr( "GEOM_SKETCHER_REL" ) );
122   GroupPt->RB_Point3->setText( tr( "GEOM_SKETCHER_SEL" ) );
123
124   GroupD1 = new EntityGUI_Dir1( MainWidget->DestCnt );
125
126   GroupD1->GroupDir1->setTitle( tr( "GEOM_SKETCHER_DIR" ) );
127   GroupD1->RB_Dir11->setText( tr( "GEOM_SKETCHER_ANGLE" ) );
128   GroupD1->RB_Dir12->setText( tr( "GEOM_SKETCHER_PER" ) );
129   GroupD1->RB_Dir13->setText( tr( "GEOM_SKETCHER_TAN" ) );
130   GroupD1->RB_Dir14->setText( tr( "GEOM_SKETCHER_VXVY" ) );
131
132   GroupD2 = new EntityGUI_Dir2( MainWidget->DestCnt );
133
134   GroupD2->GroupDir2->setTitle( tr( "GEOM_SKETCHER_DIR" ) );
135   GroupD2->RB_Dir21->setText( tr( "GEOM_SKETCHER_LENGTH" ) );
136   GroupD2->RB_Dir22->setText( tr( "GEOM_SKETCHER_X" ) );
137   GroupD2->RB_Dir23->setText( tr( "GEOM_SKETCHER_Y" ) );
138
139   Group1Sel = new EntityGUI_1Sel( MainWidget->SkeletonCnt );
140
141   Group1Sel->TextLabel1->setText( tr( "GEOM_SKETCHER_POINT2" ) );
142   Group1Sel->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
143   Group1Sel->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
144   Group1Sel->PushButton1->setIcon( image0 );
145   Group1Sel->buttonUndo->setIcon( image1 );
146   Group1Sel->buttonRedo->setIcon( image2 );
147   Group1Sel->LineEdit1->setReadOnly( true );
148
149   Group1Spin = new EntityGUI_1Spin( MainWidget->SkeletonCnt );
150   Group1Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
151   Group1Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
152   Group1Spin->buttonUndo->setIcon( image1 );
153   Group1Spin->buttonRedo->setIcon( image2 );
154
155   Group2Spin = new EntityGUI_2Spin( MainWidget->SkeletonCnt );
156   Group2Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
157   Group2Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
158   Group2Spin->buttonUndo->setIcon( image1 );
159   Group2Spin->buttonRedo->setIcon( image2 );
160
161   Group3Spin = new EntityGUI_3Spin( MainWidget->SkeletonCnt );
162   Group3Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
163   Group3Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
164   Group3Spin->buttonUndo->setIcon( image1 );
165   Group3Spin->buttonRedo->setIcon( image2 );
166
167   Group4Spin = new EntityGUI_4Spin( MainWidget->SkeletonCnt );
168   Group4Spin->GroupBox1->setTitle( tr( "GEOM_SKETCHER_VALUES" ) );
169   Group4Spin->buttonApply->setText( tr( "GEOM_SKETCHER_APPLY" ) );
170   Group4Spin->buttonUndo->setIcon( image1 );
171   Group4Spin->buttonRedo->setIcon( image2 );
172
173   QGridLayout* DestCntLayout = new QGridLayout( MainWidget->DestCnt );
174   DestCntLayout->setMargin( 0 ); DestCntLayout->setSpacing( 6 );
175   DestCntLayout->addWidget( GroupPt, 0, 0, 1, 2 );
176   DestCntLayout->addWidget( GroupD1, 1, 0 );
177   DestCntLayout->addWidget( GroupD2, 1, 1 );
178
179   QVBoxLayout* SkeletonCntlayout = new QVBoxLayout( MainWidget->SkeletonCnt );
180   SkeletonCntlayout->setMargin( 0 ); SkeletonCntlayout->setSpacing( 6 );
181   SkeletonCntlayout->addWidget( Group1Sel,  0, 0 );
182   SkeletonCntlayout->addWidget( Group1Spin, 0, 0 );
183   SkeletonCntlayout->addWidget( Group2Spin, 0, 0 );
184   SkeletonCntlayout->addWidget( Group3Spin, 0, 0 );
185   SkeletonCntlayout->addWidget( Group4Spin, 0, 0 );
186   /***************************************************************/
187
188   QButtonGroup* ButtonGroup = new QButtonGroup( this );
189   ButtonGroup->addButton( MainWidget->RB_Dest1, 1 );
190   ButtonGroup->addButton( MainWidget->RB_Dest2, 0 );
191
192   /* signals and slots connections */
193   connect( MainWidget->buttonEnd,    SIGNAL( clicked() ), this, SLOT( ClickOnEnd() ) );
194   connect( MainWidget->buttonClose,  SIGNAL( clicked() ), this, SLOT( ClickOnEnd() ) );
195   connect( MainWidget->buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) );
196   connect( MainWidget->buttonHelp,   SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) );
197
198   connect( Group1Sel->buttonApply,   SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
199   connect( Group1Sel->buttonUndo,    SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
200   connect( Group1Sel->buttonRedo,    SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) );
201   connect( Group1Spin->buttonApply,  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
202   connect( Group1Spin->buttonUndo,   SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
203   connect( Group1Spin->buttonRedo,   SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) );
204   connect( Group2Spin->buttonApply,  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
205   connect( Group2Spin->buttonUndo,   SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
206   connect( Group2Spin->buttonRedo,   SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) );
207   connect( Group3Spin->buttonApply,  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
208   connect( Group3Spin->buttonUndo,   SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
209   connect( Group3Spin->buttonRedo,   SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) ) ;
210   connect( Group4Spin->buttonApply,  SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
211   connect( Group4Spin->buttonUndo,   SIGNAL( clicked() ), this, SLOT( ClickOnUndo() ) );
212   connect( Group4Spin->buttonRedo,   SIGNAL( clicked() ), this, SLOT( ClickOnRedo() ) );
213
214   connect( MainWidget->ButtonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( TypeClicked( int ) ) );
215   connect( ButtonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( DestClicked( int ) ) );
216   connect( GroupPt->ButtonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( PointClicked( int ) ) );
217   connect( GroupD1->ButtonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( Dir1Clicked( int ) ) );
218   connect( GroupD2->ButtonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( Dir2Clicked( int ) ));
219
220   connect( Group1Sel->LineEdit1,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
221   connect( Group1Sel->PushButton1, SIGNAL( clicked() ),       this, SLOT( SetEditCurrentArgument() ) );
222
223   connect( Group1Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
224   connect( Group2Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
225   connect( Group2Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
226   connect( Group3Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
227   connect( Group3Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
228   connect( Group3Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
229   connect( Group4Spin->SpinBox_DX, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
230   connect( Group4Spin->SpinBox_DY, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
231   connect( Group4Spin->SpinBox_DZ, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
232   connect( Group4Spin->SpinBox_DS, SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox( double ) ) );
233
234   connect( ComboBox1, SIGNAL( activated( int ) ), this, SLOT( SelectionIntoArgument() ) );
235
236   connect( myGeometryGUI, SIGNAL( SignalDefaultStepValueChanged( double ) ), this, SLOT( SetDoubleSpinBoxStep( double ) ) );
237
238   connect( myGeometryGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) );
239   connect( myGeometryGUI, SIGNAL( SignalCloseAllDialogs() ),        this, SLOT( ClickOnCancel() ) );
240   
241   // install event filter on spin-boxes to provide Apply action on Return pressed
242   Group1Spin->SpinBox_DX->installEventFilter(this);
243   Group2Spin->SpinBox_DX->installEventFilter(this);
244   Group2Spin->SpinBox_DY->installEventFilter(this);
245   Group3Spin->SpinBox_DX->installEventFilter(this);
246   Group3Spin->SpinBox_DY->installEventFilter(this);
247   Group3Spin->SpinBox_DZ->installEventFilter(this);
248   Group4Spin->SpinBox_DX->installEventFilter(this);
249   Group4Spin->SpinBox_DY->installEventFilter(this);
250   Group4Spin->SpinBox_DZ->installEventFilter(this);
251   Group4Spin->SpinBox_DS->installEventFilter(this);
252
253   Init();
254 }
255
256
257 //=================================================================================
258 // function : ~EntityGUI_SketcherDlg()
259 // purpose  : Destroys the object and frees any allocated resources
260 //=================================================================================
261 EntityGUI_SketcherDlg::~EntityGUI_SketcherDlg()
262 {
263   myGeometryGUI->SetActiveDialogBox( 0 );
264 }
265
266
267 //=================================================================================
268 // function : eventFilter()
269 // purpose  : event filter for spin-boxes to provide Apply action on Return pressed
270 //=================================================================================
271 bool EntityGUI_SketcherDlg::eventFilter (QObject* object, QEvent* event)
272 {
273   if (event->type() == QEvent::KeyPress) {
274     QKeyEvent* ke = (QKeyEvent*)event;
275     if (ke->key() == Qt::Key_Return) {
276       if (object == Group1Spin->SpinBox_DX) {
277         Group1Spin->buttonApply->animateClick();
278         return true;
279       } else if (object == Group2Spin->SpinBox_DX ||
280                  object == Group2Spin->SpinBox_DY) {
281         Group2Spin->buttonApply->animateClick();
282         return true;
283       } else if (object == Group3Spin->SpinBox_DX ||
284                  object == Group3Spin->SpinBox_DY ||
285                  object == Group3Spin->SpinBox_DZ) {
286         Group3Spin->buttonApply->animateClick();
287         return true;
288       } else if (object == Group4Spin->SpinBox_DX ||
289                  object == Group4Spin->SpinBox_DY ||
290                  object == Group4Spin->SpinBox_DZ ||
291                  object == Group4Spin->SpinBox_DS) {
292         Group4Spin->buttonApply->animateClick();
293         return true;
294       }
295     }
296   }
297
298   // Fix of the NPAL16010 bug is removed, because it's not actual with the Qt-4.x
299
300   return QDialog::eventFilter(object, event);
301 }
302
303
304 //=================================================================================
305 // function : Init()
306 // purpose  :
307 //=================================================================================
308 void EntityGUI_SketcherDlg::Init()
309 {
310   /* init variables */
311   myEditCurrentArgument = Group1Sel->LineEdit1;
312   myCommand.append( "Sketcher" );
313   myUndoCommand.append( "Sketcher" );
314
315   mySketchState = FIRST_POINT;
316   globalSelection( GEOM_POINT );
317
318   myLastX1 = 0.0;
319   myLastY1 = 0.0;
320   myLastX2 = 0.0;
321   myLastY2 = 0.0;
322
323   myHelpFileName = "create_sketcher_page.html";
324
325   /* Get setting of step value from file configuration */
326   double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
327
328   /* min, max, step and decimals for spin boxes */
329   initSpinBox( Group1Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
330   initSpinBox( Group2Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
331   initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
332   initSpinBox( Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
333   initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
334   initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
335   initSpinBox( Group4Spin->SpinBox_DX, COORD_MIN, COORD_MAX, 0.1, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
336   initSpinBox( Group4Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 0.1, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
337   initSpinBox( Group4Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
338   initSpinBox( Group4Spin->SpinBox_DS, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
339
340   /* displays Dialog */
341   MainWidget->GroupConstructors->setEnabled( false );
342   MainWidget->GroupDest1->setEnabled( false );
343   setEnabledUndo( false );
344   setEnabledRedo( false );
345
346   MainWidget->RadioButton1->setChecked( true );
347
348   resize(100,100);
349   TypeClicked( 0 );
350
351   FindLocalCS();
352
353   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
354 }
355
356
357 //=================================================================================
358 // function : InitClick()
359 // purpose  :
360 //=================================================================================
361 void EntityGUI_SketcherDlg::InitClick()
362 {
363   disconnect( myGeometryGUI->getApp()->selectionMgr(), 0, this, 0 );
364
365   Group1Sel->hide();
366   Group1Spin->hide();
367   Group2Spin->hide();
368   Group3Spin->hide();
369   Group4Spin->hide();
370
371   resize(100,100);
372 }
373
374
375 //=================================================================================
376 // function : TypeClicked()
377 // purpose  : Radio button management
378 //=================================================================================
379 void EntityGUI_SketcherDlg::TypeClicked( int constructorId )
380 {
381   myConstructorId = constructorId;
382   if ( myConstructorId == 0 ) {    // SEGMENT
383     GroupD2->setEnabled( true );
384     MainWidget->RB_Dest1->setEnabled( true );
385     MainWidget->RB_Dest1->setChecked( true );
386     DestClicked( 1 );
387   }
388   else if (  myConstructorId == 1 ) { // ARC
389     GroupD2->setEnabled( false );
390     MainWidget->RB_Dest1->setEnabled( false );
391     MainWidget->RB_Dest2->setChecked( true );
392     DestClicked( 0 );
393   }
394 }
395
396
397 //=================================================================================
398 // function : DestClicked()
399 // purpose  : Radio button management
400 //=================================================================================
401 void EntityGUI_SketcherDlg::DestClicked( int constructorId )
402 {
403   GroupPt->hide();
404   GroupD1->hide();
405   GroupD2->hide();
406
407   if ( constructorId == 1 ) {
408     // Point
409     GroupPt->RB_Point1->setChecked( true );
410     GroupPt->show();
411     PointClicked( 1 );  // XY
412   }
413   else if (  constructorId == 0 ) {
414     // Direction
415     GroupD1->RB_Dir11->setChecked( true );
416     GroupD1->show();
417     GroupD2->show();
418     Dir1Clicked( 2 );  // Angle
419   }
420 }
421
422
423 //=================================================================================
424 // function : PointClicked()
425 // purpose  : Radio button management
426 //=================================================================================
427 void EntityGUI_SketcherDlg::PointClicked( int constructorId )
428 {
429   InitClick();
430
431   // Get setting of step value from file configuration
432   double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
433
434   if ( myConstructorId == 0 ) {  // SEGMENT
435     if ( constructorId == 1 ) {  // XY
436       mySketchType = PT_ABS;
437       initSpinBox( Group2Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
438       initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
439       Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X2" ) );
440       Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y2" ) );
441       myX = 0.0;
442       Group2Spin->SpinBox_DX->setValue( myX );
443       myY = 0.0;
444       Group2Spin->SpinBox_DY->setValue( myY );
445       Group2Spin->show();
446       Group2Spin->buttonApply->setFocus();
447
448       GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
449     }
450     else if ( constructorId == 0 ) {  // DXDY
451       mySketchType = PT_RELATIVE;
452       initSpinBox( Group2Spin->SpinBox_DX, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
453       initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
454       Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_DX2" ) );
455       Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_DY2" ) );
456       myDX = 0.0;
457       Group2Spin->SpinBox_DX->setValue( myDX );
458       myDY = 0.0;
459       Group2Spin->SpinBox_DY->setValue( myDY );
460       Group2Spin->show();
461       Group2Spin->buttonApply->setFocus();
462
463       GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
464     }
465     else if ( constructorId == 2 ) {  // Selection
466       mySketchType = PT_SEL;
467       myEditCurrentArgument = Group1Sel->LineEdit1;
468       connect( myGeometryGUI->getApp()->selectionMgr(),
469                SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
470       Group1Sel->show();
471       Group1Sel->buttonApply->setFocus();
472       SelectionIntoArgument();
473     }
474   }
475 }
476
477
478 //=================================================================================
479 // function : Dir1Clicked()
480 // purpose  : Radio button management
481 //=================================================================================
482 void EntityGUI_SketcherDlg::Dir1Clicked( int constructorId )
483 {
484   myConstructorDirId = constructorId;
485   GroupD2->RB_Dir21->setChecked( true );
486   Dir2Clicked( 2 );
487 }
488
489
490 //=================================================================================
491 // function : Dir2Clicked()
492 // purpose  : Radio button management
493 //=================================================================================
494 void EntityGUI_SketcherDlg::Dir2Clicked( int constructorId )
495 {
496   InitClick();
497   myAngle = 0.0;
498
499   // Get setting of step value from file configuration
500   double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
501
502   if ( myConstructorId == 0 ) {  // SEGMENT
503     myX = 0.0;
504     myY = 0.0;
505     myLength = 100.0;
506     if ( myConstructorDirId == 2 ) {  // Angle
507       initSpinBox( Group2Spin->SpinBox_DX, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
508       initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
509       Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_ANGLE2" ) );
510       Group2Spin->SpinBox_DX->setValue( myAngle );
511       Group2Spin->buttonApply->setFocus();
512       Group2Spin->show();
513
514       if ( constructorId == 2 ) {  // Length
515         mySketchType = DIR_ANGLE_LENGTH;
516         Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_LENGTH2" ) );
517         Group2Spin->SpinBox_DY->setValue( myLength );
518       }
519       else if ( constructorId == 0 ) {  // X
520         mySketchType = DIR_ANGLE_X;
521         Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_X3" ) );
522         Group2Spin->SpinBox_DY->setValue( myX );
523       }
524       else if ( constructorId == 1 ) {  // Y
525         mySketchType = DIR_ANGLE_Y;
526         Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_Y3" ) );
527         Group2Spin->SpinBox_DY->setValue( myY );
528       }
529     }
530     else if ( myConstructorDirId == 0 ) {  // Perpendicular
531       Group1Spin->show();
532       Group1Spin->buttonApply->setFocus();
533
534       if ( constructorId == 2 ) {  // Length
535         mySketchType = DIR_PER_LENGTH;
536         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_LENGTH2" ) );
537         Group1Spin->SpinBox_DX->setValue( myLength );
538       }
539       else if ( constructorId == 0 ) {  // X
540         mySketchType = DIR_PER_X;
541         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X3" ) );
542         Group1Spin->SpinBox_DX->setValue( myX );
543       }
544       else if ( constructorId == 1 ) {  // Y
545         mySketchType = DIR_PER_Y;
546         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_Y3" ) );
547         Group1Spin->SpinBox_DX->setValue( myY );
548       }
549     }
550     else if ( myConstructorDirId == 1 ) {  // Tangent
551       Group1Spin->show();
552       Group1Spin->buttonApply->setFocus();
553
554       if ( constructorId == 2 ) {  // Length
555         mySketchType = DIR_TAN_LENGTH;
556         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_LENGTH2" ) );
557         Group1Spin->SpinBox_DX->setValue( myLength );
558       }
559       else if ( constructorId == 0 ) {  // X
560         mySketchType = DIR_TAN_X;
561         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_X3" ) );
562         Group1Spin->SpinBox_DX->setValue( myX );
563       }
564       else if ( constructorId == 1 ) {  // Y
565         mySketchType = DIR_TAN_Y;
566         Group1Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_Y3" ) );
567         Group1Spin->SpinBox_DX->setValue( myY );
568       }
569     }
570     else if ( myConstructorDirId == 3 ) {  // DXDY
571       initSpinBox( Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, 0.1, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
572       initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 0.1, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
573       initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
574       Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_VX2" ) );
575       Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_VY2" ) );
576       myDX = 0.0;
577       Group3Spin->SpinBox_DX->setValue( myDX );
578       myDY = 0.0;
579       Group3Spin->SpinBox_DY->setValue( myDY );
580       Group3Spin->show();
581       Group3Spin->buttonApply->setFocus();
582
583       if ( constructorId == 2 ) {  // Length
584         mySketchType = DIR_DXDY_LENGTH;
585         Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_LENGTH2" ) );
586         Group3Spin->SpinBox_DZ->setValue( myLength );
587       }
588       else if ( constructorId == 0 ) { // X
589         mySketchType = DIR_DXDY_X;
590         Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_X3" ) );
591         Group3Spin->SpinBox_DZ->setValue( myX );
592       }
593       else if ( constructorId == 1 ) {  // Y
594         mySketchType = DIR_DXDY_Y;
595         Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_Y3" ) );
596         Group3Spin->SpinBox_DZ->setValue( myY );
597       }
598     }
599   }
600   else if ( myConstructorId == 1 ) {  // ARC
601     if ( myConstructorDirId == 2 ) {  // Angle
602       if ( constructorId == 2 ) {  // Length
603         mySketchType = DIR_ANGLE_LENGTH;
604         initSpinBox( Group3Spin->SpinBox_DX, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
605         initSpinBox( Group3Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
606         initSpinBox( Group3Spin->SpinBox_DZ, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
607         Group3Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_ANGLE2" ) );
608         Group3Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_RADIUS2" ) );
609         Group3Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_ANGLE2" ));
610         Group3Spin->SpinBox_DX->setValue( myAngle );
611         myRadius = 100.0;
612         Group3Spin->SpinBox_DY->setValue( myRadius );
613         myLength = 30.0;
614         Group3Spin->SpinBox_DZ->setValue( myLength );
615         Group3Spin->show();
616         Group3Spin->buttonApply->setFocus();
617       }
618     }
619     else if ( myConstructorDirId == 0 ) {  // Perpendicular
620       if ( constructorId == 2 ) {  // Length
621         mySketchType = DIR_PER_LENGTH;
622         initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
623         initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
624         Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_RADIUS2" ) );
625         Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_ANGLE2" ) );
626         myRadius = 100.0;
627         Group2Spin->SpinBox_DX->setValue( myRadius );
628         myLength = 30.0;
629         Group2Spin->SpinBox_DY->setValue( myLength );
630         Group2Spin->show();
631         Group2Spin->buttonApply->setFocus();
632       }
633     }
634     else if ( myConstructorDirId == 1 ) {  // Tangent
635       if ( constructorId == 2 ) {  // Length
636         mySketchType = DIR_TAN_LENGTH;
637         initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, step, 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
638         initSpinBox( Group2Spin->SpinBox_DY, COORD_MIN, COORD_MAX, 5., 3 ); // VSR: TODO: DBL_DIGITS_DISPLAY
639         Group2Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_RADIUS2" ) );
640         Group2Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_ANGLE2" ) );
641         myRadius = 100.0;
642         Group2Spin->SpinBox_DX->setValue( myRadius );
643         myLength = 30.0;
644         Group2Spin->SpinBox_DY->setValue( myLength );
645         Group2Spin->show();
646         Group2Spin->buttonApply->setFocus();
647       }
648     }
649     else if ( myConstructorDirId == 3 ) {  // DXDY
650       if ( constructorId == 2 ) {  // Length
651         mySketchType = DIR_DXDY_LENGTH;
652         Group4Spin->TextLabel1->setText( tr( "GEOM_SKETCHER_VX2" ) );
653         Group4Spin->TextLabel2->setText( tr( "GEOM_SKETCHER_VY2" ) );
654         Group4Spin->TextLabel3->setText( tr( "GEOM_SKETCHER_RADIUS2" ) );
655         Group4Spin->TextLabel4->setText( tr( "GEOM_SKETCHER_ANGLE2" ) );
656         myDX = 0.0;
657         Group4Spin->SpinBox_DX->setValue( myDX );
658         myDY = 0.0;
659         Group4Spin->SpinBox_DY->setValue( myDY );
660         myRadius = 100.0;
661         Group4Spin->SpinBox_DZ->setValue( myRadius );
662         myLength = 30.0;
663         Group4Spin->SpinBox_DS->setValue( myLength );
664         Group4Spin->show();
665         Group4Spin->buttonApply->setFocus();
666       }
667     }
668   }
669
670   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
671 }
672
673
674 //=================================================================================
675 // function : ClickOnCancel()
676 // purpose  :
677 //=================================================================================
678 void EntityGUI_SketcherDlg::ClickOnCancel()
679 {
680   close();
681 }
682
683
684 //=================================================================================
685 // function : ClickOnEnd()
686 // purpose  : connected to buttonEnd AND buttonClose
687 //=================================================================================
688 void EntityGUI_SketcherDlg::ClickOnEnd()
689 {
690   if ( sender() == MainWidget->buttonClose ) {
691     // Verify validity of commands
692     if ( myCommand.count() <= 2 ) {
693       SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(),
694                                  tr( "GEOM_ERROR_STATUS" ), tr( "CANNOT_CLOSE" ), tr( "BUT_OK" ) );
695       return;
696     }
697
698     QString Parameters;
699     QString Command = myCommand.join( "" ) + GetNewCommand( Parameters );
700     Sketcher_Profile aProfile( Command.toAscii() );
701
702     Command = myCommand.join( "" );
703     aProfile = Sketcher_Profile( Command.toAscii() );
704     TopoDS_Shape myShape;
705     if ( aProfile.IsDone() )
706       myShape = aProfile.GetShape();
707
708     if ( myShape.ShapeType() != TopAbs_VERTEX )
709       myCommand.append( ":WW" );
710   }
711   else {
712     // PAL16008 (Sketcher Validation should be equal to Apply&Close)
713     if ( Group1Spin->buttonApply->isEnabled() && Group1Spin->isVisible() ||
714          Group2Spin->buttonApply->isEnabled() && Group2Spin->isVisible() ||
715          Group3Spin->buttonApply->isEnabled() && Group3Spin->isVisible() ||
716          Group4Spin->buttonApply->isEnabled() && Group4Spin->isVisible() ||
717          Group1Sel ->buttonApply->isEnabled() && Group1Sel->isVisible() ) {
718       ClickOnApply();
719     }
720     myIsAllAdded = true;
721   }
722
723   if ( myCommand.size() > 2 )
724     if ( !onAccept() )
725       return;
726
727   close();
728 }
729
730 //=================================================================================
731 // function : ClickOnApply()
732 // purpose  :
733 //=================================================================================
734 bool EntityGUI_SketcherDlg::ClickOnApply()
735 {
736   if ( sender() && sender()->inherits( "QPushButton" ) )
737     ( (QPushButton*)sender() )->setFocus(); // to update value of currently edited spin-box (PAL11948)
738
739   QString aParameters;
740   myCommand.append( GetNewCommand( aParameters ) );
741   mySketchState = NEXT_POINT;
742
743   myUndoCommand.clear();
744   myUndoCommand.append( "Sketcher" );
745
746   myParameters.append( aParameters );
747   myUndoParameters.clear();
748
749   MainWidget->GroupConstructors->setEnabled( true );
750   MainWidget->GroupDest1->setEnabled( true );
751   setEnabledUndo( true );
752   setEnabledRedo( false );
753
754   myIsApply = true;
755   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
756   myIsApply = false;
757
758   // Set focus to SpinBox_DX
759   if ( sender() == Group1Spin->buttonApply ) {
760     (Group1Spin->SpinBox_DX)->setFocus();
761     (Group1Spin->SpinBox_DX)->selectAll();
762   }
763   else if ( sender() == Group2Spin->buttonApply ) {
764     (Group2Spin->SpinBox_DX)->setFocus();
765     (Group2Spin->SpinBox_DX)->selectAll();
766   }
767   else if ( sender() == Group3Spin->buttonApply ) {
768     (Group3Spin->SpinBox_DX)->setFocus();
769     (Group3Spin->SpinBox_DX)->selectAll();
770   }
771   else if ( sender() == Group4Spin->buttonApply ) {
772     (Group4Spin->SpinBox_DX)->setFocus();
773     (Group4Spin->SpinBox_DX)->selectAll();
774   }
775
776   return true;
777 }
778
779 //=================================================================================
780 // function : ClickOnHelp()
781 // purpose  :
782 //=================================================================================
783 void EntityGUI_SketcherDlg::ClickOnHelp()
784 {
785   LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() );
786   if ( app )
787     app->onHelpContextModule( myGeometryGUI ? app->moduleName( myGeometryGUI->moduleName() ) : QString( "" ), myHelpFileName );
788   else {
789     QString platform;
790 #ifdef WIN32
791     platform = "winapplication";
792 #else
793     platform = "application";
794 #endif
795
796     SUIT_MessageBox::warning( 0, QObject::tr( "WRN_WARNING" ),
797                               QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).
798                               arg( app->resourceMgr()->stringValue( "ExternalBrowser", platform ) ).arg( myHelpFileName ),
799                               QObject::tr( "BUT_OK" ) );
800   }
801 }
802
803 //=================================================================================
804 // function : ClickOnUndo()
805 // purpose  :
806 //=================================================================================
807 void EntityGUI_SketcherDlg::ClickOnUndo()
808 {
809   myUndoCommand.append( myCommand.last() );
810   myCommand.pop_back();
811
812   myUndoParameters.append( myParameters.last() );
813   myParameters.pop_back();
814
815   if ( myCommand.count() == 1 ) {
816     mySketchState = FIRST_POINT;
817
818     MainWidget->RadioButton1->setChecked( true );
819     TypeClicked( 0 );
820
821     MainWidget->GroupConstructors->setEnabled( false );
822     MainWidget->GroupDest1->setEnabled( false );
823     setEnabledUndo( false );
824   }
825
826   setEnabledRedo( true );
827
828   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
829 }
830
831 //=================================================================================
832 // function : ClickOnRedo()
833 // purpose  :
834 //=================================================================================
835 void EntityGUI_SketcherDlg::ClickOnRedo()
836 {
837   myCommand.append( myUndoCommand.last() );
838   myUndoCommand.pop_back();
839
840   myParameters.append( myUndoParameters.last() );
841   myUndoParameters.pop_back();
842
843   mySketchState = NEXT_POINT;
844
845   MainWidget->GroupConstructors->setEnabled( true );
846   MainWidget->GroupDest1->setEnabled( true );
847   setEnabledUndo( true );
848
849   if ( myUndoCommand.count() == 1 )
850     setEnabledRedo( false );
851
852   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
853 }
854
855 //=================================================================================
856 // function : setEnabledUndo()
857 // purpose  :
858 //=================================================================================
859 void EntityGUI_SketcherDlg::setEnabledUndo( bool value )
860 {
861   Group1Sel->buttonUndo->setEnabled( value );
862   Group1Spin->buttonUndo->setEnabled( value );
863   Group2Spin->buttonUndo->setEnabled( value );
864   Group3Spin->buttonUndo->setEnabled( value );
865   Group4Spin->buttonUndo->setEnabled( value );
866 }
867
868 //=================================================================================
869 // function : setEnabledRedo()
870 // purpose  :
871 //=================================================================================
872 void EntityGUI_SketcherDlg::setEnabledRedo( bool value )
873 {
874   Group1Sel->buttonRedo->setEnabled( value );
875   Group1Spin->buttonRedo->setEnabled( value );
876   Group2Spin->buttonRedo->setEnabled( value );
877   Group3Spin->buttonRedo->setEnabled( value );
878   Group4Spin->buttonRedo->setEnabled( value );
879 }
880
881 //=================================================================================
882 // function : SelectionIntoArgument()
883 // purpose  : Called when selection as changed
884 //=================================================================================
885 void EntityGUI_SketcherDlg::SelectionIntoArgument()
886 {
887   myEditCurrentArgument->setText( "" );
888   myX = myLastX1;
889   myY = myLastY1;
890
891   LightApp_SelectionMgr* aSelMgr = myGeometryGUI->getApp()->selectionMgr();
892   SALOME_ListIO aSelList;
893   aSelMgr->selectedObjects(aSelList);
894
895   int nbSel = aSelList.Extent();
896   if (nbSel == 1 && myEditCurrentArgument == Group1Sel->LineEdit1) {
897     Standard_Boolean aRes = Standard_False;
898     GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes);
899     if (!CORBA::is_nil(aSelectedObject) && aRes) {
900       TopoDS_Shape aShape;
901       if (GEOMBase::GetShape(aSelectedObject, aShape, TopAbs_VERTEX)) {
902         gp_Trsf aTrans;
903         gp_Ax3 aWPlane = GetActiveLocalCS();
904
905         aTrans.SetTransformation(aWPlane);
906         BRepBuilderAPI_Transform aTransformation (aShape, aTrans, Standard_False);
907         aShape = aTransformation.Shape();
908
909         gp_Pnt aPnt;
910         if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) {
911           myX = aPnt.X();
912           myY = aPnt.Y();
913           Group1Sel->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) );
914         }
915       }
916     }
917   }
918
919   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
920 }
921
922
923 //=================================================================================
924 // function : SetEditCurrentArgument()
925 // purpose  :
926 //=================================================================================
927 void EntityGUI_SketcherDlg::SetEditCurrentArgument()
928 {
929   if ( sender() == Group1Sel->PushButton1 ) {
930     myEditCurrentArgument = Group1Sel->LineEdit1;
931     myEditCurrentArgument->setFocus();
932   }
933   SelectionIntoArgument();
934 }
935
936
937 //=================================================================================
938 // function : LineEditReturnPressed()
939 // purpose  :
940 //=================================================================================
941 void EntityGUI_SketcherDlg::LineEditReturnPressed()
942 {
943   if ( sender() == Group1Sel->LineEdit1 ) {
944     myEditCurrentArgument = Group1Sel->LineEdit1;
945
946     /* User name of object input management                          */
947     /* If successfull the selection is changed and signal emitted... */
948     /* so SelectionIntoArgument() is automatically called.           */
949     const QString objectUserName = myEditCurrentArgument->text();
950     QWidget* thisWidget = (QWidget*)this;
951
952     LightApp_SelectionMgr* aSelMgr = myGeometryGUI->getApp()->selectionMgr();
953     SALOME_ListIO aSelList;
954     aSelMgr->selectedObjects(aSelList);
955
956     if (GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, aSelList))
957       myEditCurrentArgument->setText( objectUserName );
958   }
959 }
960
961
962 //=================================================================================
963 // function : DeactivateActiveDialog()
964 // purpose  :
965 //=================================================================================
966 void EntityGUI_SketcherDlg::DeactivateActiveDialog()
967 {
968   //myGeometryGUI->SetState( -1 );
969
970   setEnabled( false );
971   globalSelection();
972   disconnect( myGeometryGUI->getApp()->selectionMgr(), 0, this, 0 );
973   myGeometryGUI->SetActiveDialogBox( 0 );
974 }
975
976
977 //=================================================================================
978 // function : ActivateThisDialog()
979 // purpose  :
980 //=================================================================================
981 void EntityGUI_SketcherDlg::ActivateThisDialog()
982 {
983   myGeometryGUI->EmitSignalDeactivateDialog();
984   setEnabled( true );
985   myGeometryGUI->SetActiveDialogBox( this );
986
987   connect( myGeometryGUI->getApp()->selectionMgr(),
988           SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
989
990   //myGeometryGUI->SetState( 0 );
991   globalSelection( GEOM_POINT );
992
993   myEditCurrentArgument = Group1Sel->LineEdit1;
994   myEditCurrentArgument->setFocus();
995
996   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
997 }
998
999
1000 //=================================================================================
1001 // function : enterEvent [REDEFINED]
1002 // purpose  :
1003 //=================================================================================
1004 void EntityGUI_SketcherDlg::enterEvent( QEvent* )
1005 {
1006   if ( !MainWidget->GroupConstructors->isEnabled() )
1007     ActivateThisDialog();
1008 }
1009
1010
1011 //=================================================================================
1012 // function : closeEvent()
1013 // purpose  :
1014 //=================================================================================
1015 void EntityGUI_SketcherDlg::closeEvent( QCloseEvent* e )
1016 {
1017   //myGeometryGUI->SetState( -1 );
1018   disconnect( myGeometryGUI->getApp()->selectionMgr(), 0, this, 0 );
1019   myGeometryGUI->getApp()->updateActions();
1020   QDialog::closeEvent( e );
1021 }
1022
1023
1024 //=================================================================================
1025 // function : ValueChangedInSpinBox()
1026 // purpose  :
1027 //=================================================================================
1028 void EntityGUI_SketcherDlg::ValueChangedInSpinBox( double newValue )
1029 {
1030   QObject* send = (QObject*)sender();
1031   Standard_Real vx, vy, vz, vs;
1032   vx = vy = vz = vs = 0.0;
1033
1034   QString vxStr, vyStr, vzStr, vsStr;
1035
1036   QString newValueStr;
1037   if( SalomeApp_DoubleSpinBox* aDoubleSpinBox = (SalomeApp_DoubleSpinBox*)send )
1038     newValueStr = aDoubleSpinBox->text();
1039
1040   if ( send == Group1Spin->SpinBox_DX ) {
1041     vx = newValue;                        vxStr = newValueStr;
1042   }
1043   else if ( send == Group2Spin->SpinBox_DX ) {
1044     vx = newValue;                        vxStr = newValueStr;
1045     vy = Group2Spin->SpinBox_DY->value(); vyStr = Group2Spin->SpinBox_DY->text();
1046   }
1047   else if ( send == Group2Spin->SpinBox_DY ) {
1048     vx = Group2Spin->SpinBox_DX->value(); vxStr = Group2Spin->SpinBox_DX->text();
1049     vy = newValue;                        vyStr = newValueStr;
1050   }
1051   else if ( send == Group3Spin->SpinBox_DX ) {
1052     vx = newValue;                        vxStr = newValueStr;
1053     vy = Group3Spin->SpinBox_DY->value(); vyStr = Group3Spin->SpinBox_DY->text();
1054     vz = Group3Spin->SpinBox_DZ->value(); vzStr = Group3Spin->SpinBox_DZ->text();
1055   }
1056   else if ( send == Group3Spin->SpinBox_DY ) {
1057     vx = Group3Spin->SpinBox_DX->value(); vxStr = Group3Spin->SpinBox_DX->text();
1058     vy = newValue;                        vyStr = newValueStr;
1059     vz = Group3Spin->SpinBox_DZ->value(); vzStr = Group3Spin->SpinBox_DZ->text();
1060   }
1061   else if ( send == Group3Spin->SpinBox_DZ ) {
1062     vx = Group3Spin->SpinBox_DX->value(); vxStr = Group3Spin->SpinBox_DX->text();
1063     vy = Group3Spin->SpinBox_DY->value(); vyStr = Group3Spin->SpinBox_DY->text();
1064     vz = newValue;                        vzStr = newValueStr;
1065   }
1066   else if ( send == Group4Spin->SpinBox_DX ) {
1067     vx = newValue;                        vxStr = newValueStr;
1068     vy = Group4Spin->SpinBox_DY->value(); vyStr = Group4Spin->SpinBox_DY->text();
1069     vz = Group4Spin->SpinBox_DZ->value(); vzStr = Group4Spin->SpinBox_DZ->text();
1070     vs = Group4Spin->SpinBox_DS->value(); vsStr = Group4Spin->SpinBox_DS->text();
1071   }
1072   else if ( send == Group4Spin->SpinBox_DY ) {
1073     vx = Group4Spin->SpinBox_DX->value(); vxStr = Group4Spin->SpinBox_DX->text();
1074     vy = newValue;                        vyStr = newValueStr;
1075     vz = Group4Spin->SpinBox_DZ->value(); vzStr = Group4Spin->SpinBox_DZ->text();
1076     vs = Group4Spin->SpinBox_DS->value(); vsStr = Group4Spin->SpinBox_DS->text();
1077   }
1078   else if ( send == Group4Spin->SpinBox_DZ ) {
1079     vx = Group4Spin->SpinBox_DX->value(); vxStr = Group4Spin->SpinBox_DX->text();
1080     vy = Group4Spin->SpinBox_DY->value(); vyStr = Group4Spin->SpinBox_DY->text();
1081     vz = newValue;                        vzStr = newValueStr;
1082     vs = Group4Spin->SpinBox_DS->value(); vsStr = Group4Spin->SpinBox_DS->text();
1083   }
1084   else if ( send == Group4Spin->SpinBox_DS ) {
1085     vx = Group4Spin->SpinBox_DX->value(); vxStr = Group4Spin->SpinBox_DX->text();
1086     vy = Group4Spin->SpinBox_DY->value(); vyStr = Group4Spin->SpinBox_DY->text();
1087     vz = Group4Spin->SpinBox_DZ->value(); vzStr = Group4Spin->SpinBox_DZ->text();
1088     vs = newValue;                        vsStr = newValueStr;
1089   }
1090   // Fix of the NPAL16010 bug is removed, because it's not actual with the Qt-4.x
1091
1092   if ( myConstructorId == 0 ) {  // SEGMENT
1093     if ( mySketchType == PT_ABS ) {
1094       myX = vx;
1095       myY = vy;
1096       myXStr = vxStr;
1097       myYStr = vyStr;
1098     }
1099     else if ( mySketchType == PT_RELATIVE ) {
1100       myDX = vx;
1101       myDY = vy;
1102       myDXStr = vxStr;
1103       myDYStr = vyStr;
1104     }
1105     else if ( mySketchType == DIR_ANGLE_LENGTH ) {
1106       myAngle = vx;
1107       myLength = vy;
1108       myAngleStr = vxStr;
1109       myLengthStr = vyStr;
1110     }
1111     else if ( mySketchType == DIR_ANGLE_X ) {
1112       myAngle = vx;
1113       myX = vy;
1114       myAngleStr = vxStr;
1115       myXStr = vyStr;
1116     }
1117     else if ( mySketchType == DIR_ANGLE_Y ) {
1118       myAngle = vx;
1119       myY = vy;
1120       myAngleStr = vxStr;
1121       myYStr = vyStr;
1122     }
1123     else if ( mySketchType == DIR_PER_LENGTH ) {
1124       myLength = vx;
1125       myLengthStr = vxStr;
1126     }
1127     else if ( mySketchType == DIR_PER_X ) {
1128       myX = vx;
1129       myXStr = vxStr;
1130     }
1131     else if ( mySketchType == DIR_PER_Y ) {
1132       myY = vx;
1133       myYStr = vxStr;
1134     }
1135     else if ( mySketchType == DIR_TAN_LENGTH ) {
1136       myLength = vx;
1137       myLengthStr = vxStr;
1138     }
1139     else if ( mySketchType == DIR_TAN_X ) {
1140       myX = vx;
1141       myXStr = vxStr;
1142     }
1143     else if ( mySketchType == DIR_TAN_Y ) {
1144       myY = vx;
1145       myYStr = vxStr;
1146     }
1147     else if ( mySketchType == DIR_DXDY_LENGTH ) {
1148       myDX = vx;
1149       myDY = vy;
1150       myLength = vz;
1151       myDXStr = vxStr;
1152       myDYStr = vyStr;
1153       myLengthStr = vzStr;
1154     }
1155     else if ( mySketchType == DIR_DXDY_X ) {
1156       myDX = vx;
1157       myDY = vy;
1158       myX = vz;
1159       myDXStr = vxStr;
1160       myDYStr = vyStr;
1161       myXStr = vzStr;
1162     }
1163     else if ( mySketchType == DIR_DXDY_Y ) {
1164       myDX = vx;
1165       myDY = vy;
1166       myY = vz;
1167       myDXStr = vxStr;
1168       myDYStr = vyStr;
1169       myYStr = vzStr;
1170     }
1171   }
1172   else if ( myConstructorId == 1 ) {  // ARC
1173     if ( mySketchType == DIR_ANGLE_LENGTH ) {
1174       myAngle = vx;
1175       myRadius = vy;
1176       myLength = vz;
1177       myAngleStr = vxStr;
1178       myRadiusStr = vyStr;
1179       myLengthStr = vzStr;
1180     }
1181     else if ( mySketchType == DIR_PER_LENGTH ) {
1182       myRadius = vx;
1183       myLength = vy;
1184       myRadiusStr = vxStr;
1185       myLengthStr = vyStr;
1186     }
1187     else if ( mySketchType == DIR_TAN_LENGTH ) {
1188       myRadius = vx;
1189       myLength = vy;
1190       myRadiusStr = vxStr;
1191       myLengthStr = vyStr;
1192     }
1193     else if ( mySketchType == DIR_DXDY_LENGTH ) {
1194       myDX = vx;
1195       myDY = vy;
1196       myRadius = vz;
1197       myLength = vs;
1198       myDXStr = vxStr;
1199       myDYStr = vyStr;
1200       myRadiusStr = vzStr;
1201       myLengthStr = vsStr;
1202     }
1203   }
1204
1205   GEOMBase_Helper::displayPreview( false, true, true, myLineWidth );
1206 }
1207
1208
1209 //=================================================================================
1210 // function : GetNewCommand()
1211 // purpose  : Build the new command with context
1212 //=================================================================================
1213 QString EntityGUI_SketcherDlg::GetNewCommand( QString& theParameters )
1214 {
1215   theParameters.clear();
1216   QString myNewCommand = ":";
1217   if ( mySketchState == FIRST_POINT ) {
1218     if ( mySketchType == PT_ABS || mySketchType == PT_SEL ) {
1219       myNewCommand = myNewCommand + "F " + QString::number( myX ) + " " + QString::number( myY );
1220       theParameters = myXStr + ":" + myYStr;
1221     }
1222     if ( mySketchType == PT_RELATIVE) {
1223       myNewCommand = myNewCommand + "F " + QString::number( myDX ) + " " + QString::number( myDY );
1224       theParameters = myDXStr + ":" + myDYStr;
1225     }
1226     return myNewCommand;
1227   }
1228
1229   if ( myConstructorId == 0  ) {  // SEGMENT
1230     if ( mySketchType == PT_ABS || mySketchType == PT_SEL ) {
1231       myNewCommand = myNewCommand + "TT " + QString::number( myX ) + " " + QString::number( myY );
1232       theParameters = myXStr + ":" + myYStr;
1233     }
1234     if ( mySketchType == PT_RELATIVE) {
1235       myNewCommand = myNewCommand + "T " + QString::number( myDX ) + " " + QString::number( myDY );
1236       theParameters = myDXStr + ":" + myDYStr;
1237     }
1238     if ( mySketchType == DIR_ANGLE_LENGTH ) {
1239       myNewCommand = myNewCommand + "R " + QString::number( myAngle );
1240       myNewCommand = myNewCommand + ":" + "L " + QString::number( myLength );
1241       theParameters = myAngleStr + ":" + myLengthStr;
1242     }
1243     if ( mySketchType == DIR_ANGLE_X ) {
1244       myNewCommand = myNewCommand + "R " + QString::number( myAngle );
1245       myNewCommand = myNewCommand + ":" + "IX " + QString::number( myX );
1246       theParameters = myAngleStr + ":" + myXStr;
1247     }
1248     if ( mySketchType == DIR_ANGLE_Y ) {
1249       myNewCommand = myNewCommand + "R " + QString::number( myAngle );
1250       myNewCommand = myNewCommand + ":" + "IY " + QString::number( myY );
1251       theParameters = myAngleStr + ":" + myYStr;
1252     }
1253     if ( mySketchType == DIR_PER_LENGTH ) {
1254       myNewCommand = myNewCommand + "R " + QString::number( 90.0 );
1255       myNewCommand = myNewCommand + ":" + "L " + QString::number( myLength );
1256       theParameters = QString::number( 90.0 ) + ":" + myLengthStr;
1257     }
1258     if ( mySketchType == DIR_PER_X ) {
1259       myNewCommand = myNewCommand + "R " + QString::number( 90.0 );
1260       myNewCommand = myNewCommand + ":" + "IX " + QString::number( myX );
1261       theParameters = QString::number( 90.0 ) + ":" + myXStr;
1262     }
1263     if ( mySketchType == DIR_PER_Y ) {
1264       myNewCommand = myNewCommand + "R " + QString::number( 90.0 );
1265       myNewCommand = myNewCommand + ":" + "IY " + QString::number( myY );
1266       theParameters = QString::number( 90.0 ) + ":" + myYStr;
1267     }
1268     if ( mySketchType == DIR_TAN_LENGTH ) {
1269       myNewCommand = myNewCommand + "L " + QString::number( myLength );
1270       theParameters = myLengthStr;
1271     }
1272     if ( mySketchType == DIR_TAN_X ) {
1273       myNewCommand = myNewCommand + "IX " + QString::number( myX );
1274       theParameters = myXStr;
1275     }
1276     if ( mySketchType == DIR_TAN_Y) {
1277       myNewCommand = myNewCommand + "IY " + QString::number(myY);
1278       theParameters = myYStr;
1279     }
1280     if ( mySketchType == DIR_DXDY_LENGTH ) {
1281       myNewCommand = myNewCommand + "D " + QString::number( myDX ) + " " + QString::number( myDY );
1282       myNewCommand = myNewCommand + ":" + "L " + QString::number( myLength );
1283       theParameters = myDXStr + ":" + myDYStr + ":" + myLengthStr;
1284     }
1285     if ( mySketchType == DIR_DXDY_X ) {
1286       myNewCommand = myNewCommand + "D " + QString::number( myDX ) + " " + QString::number( myDY );
1287       myNewCommand = myNewCommand + ":" + "IX " + QString::number( myX );
1288       theParameters = myDXStr + ":" + myDYStr + ":" + myXStr;
1289     }
1290     if ( mySketchType == DIR_DXDY_Y ) {
1291       myNewCommand = myNewCommand + "D " + QString::number( myDX ) + " " + QString::number( myDY );
1292       myNewCommand = myNewCommand + ":" + "IY " + QString::number( myY );
1293       theParameters = myDXStr + ":" + myDYStr + ":" + myYStr;
1294     }
1295   }
1296   else if ( myConstructorId == 1 ) {  // ARC
1297     if ( mySketchType == DIR_ANGLE_LENGTH ) {
1298       myNewCommand = myNewCommand + "R " + QString::number( myAngle );
1299       myNewCommand = myNewCommand + ":" + "C " + QString::number( myRadius ) + " " + QString::number( myLength );
1300       theParameters = myAngleStr + ":" + myRadiusStr + ":" + myLengthStr;
1301     }
1302     if ( mySketchType == DIR_PER_LENGTH ) {
1303       myNewCommand = myNewCommand + "R " + QString::number( 90.0 );
1304       myNewCommand = myNewCommand + ":" + "C " + QString::number( myRadius ) + " " + QString::number( myLength );
1305       theParameters = QString::number( 90.0 ) + ":" + myRadiusStr + ":" + myLengthStr;
1306     }
1307     if ( mySketchType == DIR_TAN_LENGTH ) {
1308       myNewCommand = myNewCommand + "C " + QString::number( myRadius ) + " " + QString::number( myLength );
1309       theParameters = myRadiusStr + ":" + myLengthStr;
1310     }
1311     if ( mySketchType == DIR_DXDY_LENGTH ) {
1312       myNewCommand = myNewCommand + "D " + QString::number( myDX ) + " " + QString::number( myDY );
1313       myNewCommand = myNewCommand + ":" + "C " + QString::number( myRadius ) + " " + QString::number( myLength );
1314       theParameters = myDXStr + ":" + myDYStr + ":" + myRadiusStr + ":" + myLengthStr;
1315     }
1316   }
1317   return myNewCommand;
1318 }
1319
1320 //=================================================================================
1321 // function : createOperation
1322 // purpose  :
1323 //=================================================================================
1324 GEOM::GEOM_IOperations_ptr EntityGUI_SketcherDlg::createOperation()
1325 {
1326   return getGeomEngine()->GetICurvesOperations( getStudyId() );
1327 }
1328
1329 //=================================================================================
1330 // function : isValid
1331 // purpose  :
1332 //=================================================================================
1333 bool EntityGUI_SketcherDlg::isValid( QString& msg )
1334 {
1335   bool ok = true;
1336   bool toCorrect = !IsPreview() || myIsApply;
1337
1338   if( Group1Spin->isVisible() ) {
1339     ok = Group1Spin->SpinBox_DX->isValid( msg, toCorrect ) && ok;
1340   }
1341   else if( Group2Spin->isVisible() ) {
1342     ok = Group2Spin->SpinBox_DX->isValid( msg, toCorrect ) && ok;
1343     ok = Group2Spin->SpinBox_DY->isValid( msg, toCorrect ) && ok;
1344   }
1345   else if( Group3Spin->isVisible() ) {
1346     ok = Group3Spin->SpinBox_DX->isValid( msg, toCorrect ) && ok;
1347     ok = Group3Spin->SpinBox_DY->isValid( msg, toCorrect ) && ok;
1348     ok = Group3Spin->SpinBox_DZ->isValid( msg, toCorrect ) && ok;
1349   }
1350   else if( Group4Spin->isVisible() ) {
1351     ok = Group4Spin->SpinBox_DX->isValid( msg, toCorrect ) && ok;
1352     ok = Group4Spin->SpinBox_DY->isValid( msg, toCorrect ) && ok;
1353     ok = Group4Spin->SpinBox_DZ->isValid( msg, toCorrect ) && ok;
1354     ok = Group4Spin->SpinBox_DS->isValid( msg, toCorrect ) && ok;
1355   }
1356
1357   if( myIsApply && !ok )
1358     showError( msg );
1359
1360   return ok;
1361 }
1362
1363 //=================================================================================
1364 // function : execute
1365 // purpose  :
1366 //=================================================================================
1367 bool EntityGUI_SketcherDlg::execute( ObjectList& objects )
1368 {
1369   QString aParameters;
1370
1371   if ( mySketchState == FIRST_POINT ) {
1372     myLastX2 = myX;
1373     myLastY2 = myY;
1374   }
1375   else {
1376     //Test if the current point is the same as the last one
1377     TopoDS_Shape myShape1, myShape2;
1378
1379     //Last Shape
1380     QString Command1 = myCommand.join( "" );
1381     Sketcher_Profile aProfile1( Command1.toAscii() );
1382     if ( aProfile1.IsDone() )
1383       myShape1 = aProfile1.GetShape();
1384
1385     //Current Shape
1386     QString Command2 = Command1 + GetNewCommand( aParameters );
1387     Sketcher_Profile aProfile2( Command2.toAscii() );
1388     if ( aProfile2.IsDone() )
1389       myShape2 = aProfile2.GetShape();
1390
1391     if ( myShape2.IsNull() ) {
1392       //the current point is the same as the last one
1393       myLastX2 = myLastX1;
1394       myLastY2 = myLastY1;
1395     }
1396     else {
1397       TopoDS_Vertex V1, V2;
1398       gp_Pnt pt;
1399       if ( myShape1.ShapeType() == TopAbs_VERTEX ) {
1400         //the last shape is the first point
1401         pt = BRep_Tool::Pnt( TopoDS::Vertex( myShape1 ) );
1402         myLastX1 = pt.X();
1403         myLastY1 = pt.Y();
1404       }
1405       else {
1406         TopExp::Vertices( TopoDS::Wire( myShape1 ), V1, V2 );
1407         pt = BRep_Tool::Pnt( V2 );
1408         myLastX1 = pt.X();
1409         myLastY1 = pt.Y();
1410       }
1411       TopExp::Vertices( TopoDS::Wire( myShape2 ), V1, V2 );
1412       pt = BRep_Tool::Pnt( V2 );
1413       myLastX2 = pt.X();
1414       myLastY2 = pt.Y();
1415     }
1416   }
1417
1418   QString cmd;
1419   if ( ( mySketchState != FIRST_POINT &&
1420          myLastX1 == myLastX2 && myLastY1 == myLastY2 ) || myIsAllAdded ) {
1421     cmd = myCommand.join( "" );
1422
1423     if ( Group1Sel->isVisible() ) {
1424       Group1Sel->buttonApply->setEnabled( false );
1425       //Group1Sel->buttonApply->setFocus();
1426     }
1427     if ( Group1Spin->isVisible() ) {
1428       Group1Spin->buttonApply->setEnabled( false );
1429       //Group1Spin->buttonApply->setFocus();
1430     }
1431     if ( Group2Spin->isVisible() ) {
1432       Group2Spin->buttonApply->setEnabled( false );
1433       //Group2Spin->buttonApply->setFocus();
1434     }
1435     if ( Group3Spin->isVisible() ) {
1436       Group3Spin->buttonApply->setEnabled( false );
1437       //Group3Spin->buttonApply->setFocus();
1438     }
1439     if ( Group4Spin->isVisible() ) {
1440       Group4Spin->buttonApply->setEnabled( false );
1441       //Group4Spin->buttonApply->setFocus();
1442     }
1443   }
1444   else {
1445     cmd = myCommand.join( "" ) + GetNewCommand( aParameters );
1446
1447     if ( Group1Sel->isVisible() ) {
1448       Group1Sel->buttonApply->setEnabled( true );
1449       //Group1Sel->buttonApply->setFocus();
1450     }
1451     if ( Group1Spin->isVisible() ) {
1452       Group1Spin->buttonApply->setEnabled( true );
1453       //Group1Spin->buttonApply->setFocus();
1454     }
1455     if ( Group2Spin->isVisible() ) {
1456       Group2Spin->buttonApply->setEnabled( true );
1457       //Group2Spin->buttonApply->setFocus();
1458     }
1459     if ( Group3Spin->isVisible() ) {
1460       Group3Spin->buttonApply->setEnabled( true );
1461       //Group3Spin->buttonApply->setFocus();
1462     }
1463     if ( Group4Spin->isVisible() ) {
1464       Group4Spin->buttonApply->setEnabled( true );
1465       //Group4Spin->buttonApply->setFocus();
1466     }
1467   }
1468
1469   gp_Ax3 myWPlane = GetActiveLocalCS();
1470   GEOM::ListOfDouble_var WPlane = new GEOM::ListOfDouble;
1471   WPlane->length( 9 );
1472   WPlane[0] = myWPlane.Location().X();
1473   WPlane[1] = myWPlane.Location().Y();
1474   WPlane[2] = myWPlane.Location().Z();
1475
1476   WPlane[3] = myWPlane.Direction().X();
1477   WPlane[4] = myWPlane.Direction().Y();
1478   WPlane[5] = myWPlane.Direction().Z();
1479
1480   WPlane[6] = myWPlane.XDirection().X();
1481   WPlane[7] = myWPlane.XDirection().Y();
1482   WPlane[8] = myWPlane.XDirection().Z();
1483
1484   GEOM::GEOM_ICurvesOperations_var anOper = GEOM::GEOM_ICurvesOperations::_narrow(getOperation());
1485   GEOM::GEOM_Object_var anObj = anOper->MakeSketcher( cmd.toLatin1().constData(), WPlane );
1486
1487   if ( !anObj->_is_nil() )
1488   {
1489     if( !IsPreview() ) {
1490       QStringList aCurrentParameters = myParameters;
1491       aCurrentParameters << aParameters;
1492       anObj->SetParameters(aCurrentParameters.join(":").toLatin1().constData());
1493     }
1494
1495     objects.push_back( anObj._retn() );
1496   }
1497
1498   return true;
1499 }
1500
1501 //================================================================
1502 // Function : displayPreview
1503 // Purpose  : Method for displaying preview of resulting shape
1504 //            Redefined from GEOMBase_Helper.
1505 //================================================================
1506 void EntityGUI_SketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object,
1507                                             const bool            append,
1508                                             const bool            activate,
1509                                             const bool            update,
1510                                             const double          lineWidth,
1511                                             const int             displayMode,
1512                                             const int             color )
1513 {
1514   // Set color for preview shape
1515   getDisplayer()->SetColor( Quantity_NOC_RED );
1516
1517   // set width of displayed shape
1518   getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth );
1519
1520   // Disable activation of selection
1521   getDisplayer()->SetToActivate( activate );
1522
1523   // Make a reference to GEOM_Object
1524   CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string( object );
1525   getDisplayer()->SetName( objStr.in() );
1526
1527   // Create wire from applayed object
1528   TopoDS_Shape anApplyedWire, aLastSegment;
1529   if ( !createShapes( object, anApplyedWire, aLastSegment ) )
1530     return;
1531
1532   // Build prs
1533   SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire );
1534   if ( aPrs != 0 && !aPrs->IsNull() )
1535     GEOMBase_Helper::displayPreview( aPrs, append, update );
1536
1537   getDisplayer()->SetColor( Quantity_NOC_VIOLET );
1538   aPrs = getDisplayer()->BuildPrs( aLastSegment );
1539   if ( aPrs != 0 && !aPrs->IsNull() )
1540     GEOMBase_Helper::displayPreview( aPrs, append, update );
1541
1542   getDisplayer()->UnsetName();
1543
1544   // Enable activation of displayed objects
1545   getDisplayer()->SetToActivate( true );
1546 }
1547
1548 //================================================================
1549 // Function : createShapes
1550 // Purpose  : Create applyed wire, and last segment from entry object
1551 //================================================================
1552 bool EntityGUI_SketcherDlg::createShapes( GEOM::GEOM_Object_ptr theObject,
1553                                           TopoDS_Shape&         theApplyedWire,
1554                                           TopoDS_Shape&         theLastSegment )
1555 {
1556   TopoDS_Shape aShape;
1557   if ( !GEOMBase::GetShape( theObject, aShape ) ||
1558        aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX )
1559     return false;
1560
1561   if ( Group1Sel->isVisible()  && !Group1Sel->buttonApply->isEnabled()  ||
1562        Group1Spin->isVisible() && !Group1Spin->buttonApply->isEnabled() ||
1563        Group2Spin->isVisible() && !Group2Spin->buttonApply->isEnabled() ||
1564        Group3Spin->isVisible() && !Group3Spin->buttonApply->isEnabled() ||
1565        Group4Spin->isVisible() && !Group4Spin->buttonApply->isEnabled() ) {
1566      theApplyedWire = aShape;
1567      return true;
1568   }
1569
1570   BRepBuilderAPI_MakeWire aBuilder;
1571   TopExp_Explorer anExp( aShape, TopAbs_EDGE );
1572   while ( 1 ) {
1573     TopoDS_Shape anEdge = anExp.Current();
1574     anExp.Next();
1575     if ( anExp.More() ) // i.e. non-last edge
1576       aBuilder.Add( TopoDS::Edge( anEdge ) );
1577     else {
1578       theLastSegment = anEdge;
1579       break;
1580     }
1581   }
1582
1583   if ( aBuilder.IsDone() )
1584     theApplyedWire = aBuilder.Shape();
1585
1586   return true;
1587 }
1588
1589 //=================================================================================
1590 // function : keyPressEvent()
1591 // purpose  :
1592 //=================================================================================
1593 void  EntityGUI_SketcherDlg::keyPressEvent( QKeyEvent* e )
1594 {
1595   QDialog::keyPressEvent( e );
1596   if ( e->isAccepted() )
1597     return;
1598
1599   if ( e->key() == Qt::Key_F1 ) {
1600     e->accept();
1601     ClickOnHelp();
1602   }
1603 }
1604
1605 void EntityGUI_SketcherDlg::initSpinBox( SalomeApp_DoubleSpinBox* spinBox,
1606                                          double min,  double max,
1607                                          double step, int decimals )
1608 {
1609   spinBox->setDecimals( decimals );
1610   spinBox->setRange( min, max );
1611   spinBox->setSingleStep( step );
1612 }
1613
1614 //=================================================================================
1615 // function : SetDoubleSpinBoxStep()
1616 // purpose  : Double spin box management
1617 //=================================================================================
1618 void EntityGUI_SketcherDlg::SetDoubleSpinBoxStep( double step )
1619 {
1620   Group1Spin->SpinBox_DX->setSingleStep(step);
1621   Group2Spin->SpinBox_DX->setSingleStep(step);
1622   Group2Spin->SpinBox_DY->setSingleStep(step);
1623   Group3Spin->SpinBox_DX->setSingleStep(step);
1624   Group3Spin->SpinBox_DY->setSingleStep(step);
1625   Group3Spin->SpinBox_DZ->setSingleStep(step);
1626   Group4Spin->SpinBox_DX->setSingleStep(step);
1627   Group4Spin->SpinBox_DY->setSingleStep(step);
1628   Group4Spin->SpinBox_DZ->setSingleStep(step);
1629   Group4Spin->SpinBox_DS->setSingleStep(step);
1630 }
1631
1632 //=================================================================================
1633 // function : FindLocalCS()
1634 // purpose  : Find All Coordinates systems in study
1635 //=================================================================================
1636 void EntityGUI_SketcherDlg::FindLocalCS()
1637 {
1638   ComboBox1->clear();
1639   myLCSList.clear();
1640   SalomeApp_Application* app =
1641     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1642   if ( !app )
1643     return;
1644
1645   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1646   if ( !appStudy )
1647     return;
1648
1649   _PTR(Study) aStudy = appStudy->studyDS();
1650
1651   //add Global CS
1652   ComboBox1->addItem(tr("GEOM_GCS"));
1653   gp_Pnt aOrigin = gp_Pnt(0, 0, 0);
1654   gp_Dir aDirZ = gp_Dir(0, 0, 1);
1655   gp_Dir aDirX = gp_Dir(1, 0, 0);
1656   gp_Ax3 globalCS = gp_Ax3(aOrigin, aDirZ, aDirX);
1657   myLCSList.push_back(globalCS);
1658
1659   // get GEOM component
1660   CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() );
1661   _PTR(SObject) obj = aStudy->FindObjectIOR( geomIOR.in() );
1662   if (!obj)
1663     return;
1664   _PTR(SComponent) fc = obj->GetFatherComponent();
1665   QString geomComp = fc->GetID().c_str();
1666   _PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() );
1667   if ( !comp )
1668     return;
1669
1670   // browse through all GEOM data tree
1671   _PTR(ChildIterator) it ( aStudy->NewChildIterator( comp ) );
1672   for ( it->InitEx( true ); it->More(); it->Next() ) {
1673     _PTR(SObject) child( it->Value() );
1674     CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child );
1675     GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
1676     if( CORBA::is_nil( geomObj ) ) 
1677       continue;
1678     if (geomObj->GetType() == GEOM_MARKER) {
1679       ComboBox1->addItem(geomObj->GetName());
1680       TopoDS_Shape aShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), geomObj);
1681       
1682       gp_Ax3 aLCS;
1683       aLCS.Transform(aShape.Location().Transformation());
1684       if (aShape.ShapeType() == TopAbs_FACE) {
1685         Handle(Geom_Surface) aGS = BRep_Tool::Surface(TopoDS::Face(aShape));
1686         if (!aGS.IsNull() && aGS->IsKind(STANDARD_TYPE(Geom_Plane))) {
1687           Handle(Geom_Plane) aGPlane = Handle(Geom_Plane)::DownCast(aGS);
1688           gp_Pln aPln = aGPlane->Pln();
1689           aLCS = aPln.Position();
1690         }
1691       }
1692       myLCSList.push_back(aLCS);
1693     }
1694   }
1695 }
1696
1697 //=================================================================================
1698 // function : GetActiveLocalCS()
1699 // purpose  : Find All Coordinates systems in study
1700 //=================================================================================
1701 gp_Ax3 EntityGUI_SketcherDlg::GetActiveLocalCS()
1702 {
1703   int ind = ComboBox1->currentIndex();
1704   if (ind == -1)
1705     return myGeometryGUI->GetWorkingPlane();
1706
1707   gp_Ax3 aLCS = myLCSList.at(ind);
1708
1709   myGeometryGUI->SetWorkingPlane( aLCS );
1710   myGeometryGUI->ActiveWorkingPlane();
1711   return aLCS;
1712 }