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