1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // GEOM GEOMGUI : GUI for Geometry component
23 // File : EntityGUI_SketcherDlg.cxx
24 // Author : Damien COQUERET
28 #include "EntityGUI_SketcherDlg.h"
29 #include "Sketcher_Profile.hxx"
30 #include "GEOM_Displayer.h"
33 #include "SUIT_Desktop.h"
34 #include "SUIT_Session.h"
35 #include "SUIT_MessageBox.h"
36 #include "SUIT_ResourceMgr.h"
37 #include "SalomeApp_Application.h"
38 #include "LightApp_Application.h"
39 #include "LightApp_SelectionMgr.h"
41 #include <qpushbutton.h>
44 #include <BRep_Tool.hxx>
46 #include <TopExp_Explorer.hxx>
47 #include <TopoDS_Vertex.hxx>
49 #include <BRepBuilderAPI_Transform.hxx>
50 #include <BRepBuilderAPI_MakeWire.hxx>
52 #include "GEOMImpl_Types.hxx"
54 #include "utilities.h"
58 //=================================================================================
59 // class : EntityGUI_SketcherDlg()
60 // purpose : Constructs a EntityGUI_SketcherDlg which is a child of 'parent', with the
61 // name 'name' and widget flags set to 'f'.
62 // The dialog will by default be modeless, unless you set 'modal' to
63 // TRUE to construct a modal dialog.
64 //=================================================================================
65 EntityGUI_SketcherDlg::EntityGUI_SketcherDlg(GeometryGUI* GUI, QWidget* parent,
66 const char* name, bool modal, WFlags fl,
67 const double lineWidth)
68 :EntityGUI_Skeleton_QTD(parent, name, modal, WStyle_Customize |
69 WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose),
70 myIsAllAdded( false ),
71 GEOMBase_Helper( dynamic_cast<SUIT_Desktop*>( parent ) ),
73 myLineWidth( lineWidth )
75 myGeometryGUI->SetActiveDialogBox(this);
77 if ( !name ) setName("EntityGUI_SketcherDlg");
79 buttonCancel->setText(tr("GEOM_BUT_CANCEL"));
80 buttonEnd->setText(tr("GEOM_BUT_END_SKETCH"));
81 buttonClose->setText(tr("GEOM_BUT_CLOSE_SKETCH"));
82 buttonHelp->setText(tr("GEOM_BUT_HELP"));
84 QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_SELECT")));
85 QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_UNDO")));
86 QPixmap image2(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM",tr("ICON_DLG_REDO")));
88 setCaption(tr("GEOM_SKETCHER_TITLE"));
90 GroupConstructors->setTitle(tr("GEOM_SKETCHER_EL"));
91 RadioButton1->setText(tr("GEOM_SKETCHER_SEGMENT"));
92 RadioButton2->setText(tr("GEOM_SKETCHER_ARC"));
93 GroupDest->setTitle(tr("GEOM_SKETCHER_DEST"));
94 GroupDest1->setTitle(tr("GEOM_SKETCHER_TYPE"));
95 RB_Dest1->setText(tr("GEOM_SKETCHER_POINT"));
96 RB_Dest2->setText(tr("GEOM_SKETCHER_DIR"));
98 /***************************************************************/
99 GroupPt = new EntityGUI_Point_QTD(GroupDest, "GroupPt");
100 GroupPt->GroupPoint->setTitle(tr("GEOM_SKETCHER_POINT"));
101 GroupPt->RB_Point1->setText(tr("GEOM_SKETCHER_ABS"));
102 GroupPt->RB_Point2->setText(tr("GEOM_SKETCHER_REL"));
103 GroupPt->RB_Point3->setText(tr("GEOM_SKETCHER_SEL"));
105 GroupD1 = new EntityGUI_Dir1_QTD(GroupDest, "GroupD1");
106 GroupD1->GroupDir1->setTitle(tr("GEOM_SKETCHER_DIR"));
107 GroupD1->RB_Dir11->setText(tr("GEOM_SKETCHER_ANGLE"));
108 GroupD1->RB_Dir12->setText(tr("GEOM_SKETCHER_PER"));
109 GroupD1->RB_Dir13->setText(tr("GEOM_SKETCHER_TAN"));
110 GroupD1->RB_Dir14->setText(tr("GEOM_SKETCHER_VXVY"));
112 GroupD2 = new EntityGUI_Dir2_QTD(GroupDest, "GroupD2");
113 GroupD2->GroupDir2->setTitle(tr("GEOM_SKETCHER_DIR"));
114 GroupD2->RB_Dir21->setText(tr("GEOM_SKETCHER_LENGTH"));
115 GroupD2->RB_Dir22->setText(tr("GEOM_SKETCHER_X"));
116 GroupD2->RB_Dir23->setText(tr("GEOM_SKETCHER_Y"));
118 Group1Sel = new EntityGUI_1Sel_QTD(this, "Group1Sel");
119 Group1Sel->TextLabel1->setText(tr("GEOM_SKETCHER_POINT2"));
120 Group1Sel->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES"));
121 Group1Sel->buttonApply->setText(tr("GEOM_SKETCHER_APPLY"));
122 Group1Sel->PushButton1->setPixmap(image0);
123 Group1Sel->buttonUndo->setPixmap(image1);
124 Group1Sel->buttonRedo->setPixmap(image2);
125 Group1Sel->LineEdit1->setReadOnly( true );
127 Group1Spin = new EntityGUI_1Spin(this, "Group1Spin");
128 Group1Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES"));
129 Group1Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY"));
130 Group1Spin->buttonUndo->setPixmap(image1);
131 Group1Spin->buttonRedo->setPixmap(image2);
132 QWidget::setTabOrder(Group1Spin->SpinBox_DX , Group1Spin->buttonApply);
133 QWidget::setTabOrder(Group1Spin->buttonApply, Group1Spin->buttonUndo);
134 QWidget::setTabOrder(Group1Spin->buttonUndo , Group1Spin->buttonRedo);
136 Group2Spin = new EntityGUI_2Spin(this, "Group2Spin");
137 Group2Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES"));
138 Group2Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY"));
139 Group2Spin->buttonUndo->setPixmap(image1);
140 Group2Spin->buttonRedo->setPixmap(image2);
141 QWidget::setTabOrder(Group2Spin->SpinBox_DX , Group2Spin->SpinBox_DY);
142 QWidget::setTabOrder(Group2Spin->SpinBox_DY , Group2Spin->buttonApply);
143 QWidget::setTabOrder(Group2Spin->buttonApply, Group2Spin->buttonUndo);
144 QWidget::setTabOrder(Group2Spin->buttonUndo , Group2Spin->buttonRedo);
146 Group3Spin = new EntityGUI_3Spin(this, "Group3Spin");
147 Group3Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES"));
148 Group3Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY"));
149 Group3Spin->buttonUndo->setPixmap(image1);
150 Group3Spin->buttonRedo->setPixmap(image2);
151 QWidget::setTabOrder(Group3Spin->SpinBox_DX , Group3Spin->SpinBox_DY);
152 QWidget::setTabOrder(Group3Spin->SpinBox_DY , Group3Spin->SpinBox_DZ);
153 QWidget::setTabOrder(Group3Spin->SpinBox_DZ , Group3Spin->buttonApply);
154 QWidget::setTabOrder(Group3Spin->buttonApply, Group3Spin->buttonUndo);
155 QWidget::setTabOrder(Group3Spin->buttonUndo , Group3Spin->buttonRedo);
157 Group4Spin = new EntityGUI_4Spin(this, "Group4Spin");
158 Group4Spin->GroupBox1->setTitle(tr("GEOM_SKETCHER_VALUES"));
159 Group4Spin->buttonApply->setText(tr("GEOM_SKETCHER_APPLY"));
160 Group4Spin->buttonUndo->setPixmap(image1);
161 Group4Spin->buttonRedo->setPixmap(image2);
162 QWidget::setTabOrder(Group4Spin->SpinBox_DX , Group4Spin->SpinBox_DY);
163 QWidget::setTabOrder(Group4Spin->SpinBox_DY , Group4Spin->SpinBox_DZ);
164 QWidget::setTabOrder(Group4Spin->SpinBox_DZ , Group4Spin->SpinBox_DS);
165 QWidget::setTabOrder(Group4Spin->SpinBox_DS , Group4Spin->buttonApply);
166 QWidget::setTabOrder(Group4Spin->buttonApply, Group4Spin->buttonUndo);
167 QWidget::setTabOrder(Group4Spin->buttonUndo , Group4Spin->buttonRedo);
169 Layout5->addMultiCellWidget(GroupPt, 1, 1, 0, 1);
170 Layout5->addWidget(GroupD1, 1, 0);
171 Layout5->addWidget(GroupD2, 1, 1);
173 Layout1->addWidget(Group1Sel, 2, 0);
174 Layout1->addWidget(Group1Spin, 2, 0);
175 Layout1->addWidget(Group2Spin, 2, 0);
176 Layout1->addWidget(Group3Spin, 2, 0);
177 Layout1->addWidget(Group4Spin, 2, 0);
178 /***************************************************************/
180 /* signals and slots connections */
181 connect(buttonEnd, SIGNAL(clicked()), this, SLOT(ClickOnEnd()));
182 connect(buttonClose, SIGNAL(clicked()), this, SLOT(ClickOnEnd()));
183 connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
184 connect(buttonHelp, SIGNAL( clicked() ), this, SLOT( ClickOnHelp()));
186 connect(Group1Sel->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
187 connect(Group1Sel->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo()));
188 connect(Group1Sel->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo()));
189 connect(Group1Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
190 connect(Group1Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo()));
191 connect(Group1Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo()));
192 connect(Group2Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
193 connect(Group2Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo()));
194 connect(Group2Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo()));
195 connect(Group3Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
196 connect(Group3Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo()));
197 connect(Group3Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo()));
198 connect(Group4Spin->buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
199 connect(Group4Spin->buttonUndo, SIGNAL(clicked()), this, SLOT(ClickOnUndo()));
200 connect(Group4Spin->buttonRedo, SIGNAL(clicked()), this, SLOT(ClickOnRedo()));
202 connect(GroupConstructors, SIGNAL(clicked(int)), this, SLOT(TypeClicked(int)));
203 connect(GroupDest1, SIGNAL(clicked(int)), this, SLOT(DestClicked(int)));
204 connect(GroupPt->GroupPoint, SIGNAL(clicked(int)), this, SLOT(PointClicked(int)));
205 connect(GroupD1->GroupDir1, SIGNAL(clicked(int)), this, SLOT(Dir1Clicked(int)));
206 connect(GroupD2->GroupDir2, SIGNAL(clicked(int)), this, SLOT(Dir2Clicked(int)));
208 connect(Group1Sel->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
209 connect(Group1Sel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
211 connect(Group1Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
212 connect(Group2Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
213 connect(Group2Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
214 connect(Group3Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
215 connect(Group3Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
216 connect(Group3Spin->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
217 connect(Group4Spin->SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
218 connect(Group4Spin->SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
219 connect(Group4Spin->SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
220 connect(Group4Spin->SpinBox_DS, SIGNAL(valueChanged(double)), this, SLOT(ValueChangedInSpinBox(double)));
222 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group1Spin->SpinBox_DX, SLOT(SetStep(double)));
223 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2Spin->SpinBox_DX, SLOT(SetStep(double)));
224 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group2Spin->SpinBox_DY, SLOT(SetStep(double)));
225 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DX, SLOT(SetStep(double)));
226 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DY, SLOT(SetStep(double)));
227 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group3Spin->SpinBox_DZ, SLOT(SetStep(double)));
228 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DX, SLOT(SetStep(double)));
229 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DY, SLOT(SetStep(double)));
230 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DZ, SLOT(SetStep(double)));
231 connect(myGeometryGUI, SIGNAL(SignalDefaultStepValueChanged(double)), Group4Spin->SpinBox_DS, SLOT(SetStep(double)));
233 connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
234 connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
236 // install event filter on spin-boxes to provide Apply action on Return pressed
237 Group1Spin->SpinBox_DX->installEventFilter(this);
238 Group2Spin->SpinBox_DX->installEventFilter(this);
239 Group2Spin->SpinBox_DY->installEventFilter(this);
240 Group3Spin->SpinBox_DX->installEventFilter(this);
241 Group3Spin->SpinBox_DY->installEventFilter(this);
242 Group3Spin->SpinBox_DZ->installEventFilter(this);
243 Group4Spin->SpinBox_DX->installEventFilter(this);
244 Group4Spin->SpinBox_DY->installEventFilter(this);
245 Group4Spin->SpinBox_DZ->installEventFilter(this);
246 Group4Spin->SpinBox_DS->installEventFilter(this);
251 //=================================================================================
252 // function : ~EntityGUI_SketcherDlg()
253 // purpose : Destroys the object and frees any allocated resources
254 //=================================================================================
255 EntityGUI_SketcherDlg::~EntityGUI_SketcherDlg()
257 myGeometryGUI->SetActiveDialogBox( 0 );
260 //=================================================================================
261 // function : eventFilter()
262 // purpose : event filter for spin-boxes to provide Apply action on Return pressed
263 //=================================================================================
264 bool EntityGUI_SketcherDlg::eventFilter (QObject* object, QEvent* event)
266 if (event->type() == QEvent::KeyPress) {
267 QKeyEvent* ke = (QKeyEvent*)event;
268 if (ke->key() == Key_Return) {
269 if (object == Group1Spin->SpinBox_DX) {
270 Group1Spin->buttonApply->animateClick();
272 } else if (object == Group2Spin->SpinBox_DX ||
273 object == Group2Spin->SpinBox_DY) {
274 Group2Spin->buttonApply->animateClick();
276 } else if (object == Group3Spin->SpinBox_DX ||
277 object == Group3Spin->SpinBox_DY ||
278 object == Group3Spin->SpinBox_DZ) {
279 Group3Spin->buttonApply->animateClick();
281 } else if (object == Group4Spin->SpinBox_DX ||
282 object == Group4Spin->SpinBox_DY ||
283 object == Group4Spin->SpinBox_DZ ||
284 object == Group4Spin->SpinBox_DS) {
285 Group4Spin->buttonApply->animateClick();
291 if (event->type() == QEvent::KeyRelease) {
292 // NPAL16010 (Sketcher Apply non available if only one line is modified)
293 // To have Apply active as soon as value text changed
294 QString s = ((QtxDblSpinBox*) object)->text();
296 double newVal = s.toDouble( &ok );
298 ValueChangedInSpinBox( newVal );
301 return EntityGUI_Skeleton_QTD::eventFilter(object, event);
305 //=================================================================================
308 //=================================================================================
309 void EntityGUI_SketcherDlg::Init()
312 myEditCurrentArgument = Group1Sel->LineEdit1;
313 myCommand.append( "Sketcher" );
314 myUndoCommand.append( "Sketcher" );
316 mySketchState = FIRST_POINT;
317 globalSelection( GEOM_POINT );
324 myHelpFileName = "create_sketcher_page.html";
326 /* Get setting of step value from file configuration */
327 double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
329 /* min, max, step and decimals for spin boxes */
330 Group1Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
331 Group2Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
332 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
333 Group3Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
334 Group3Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
335 Group3Spin->SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
336 Group4Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, DBL_DIGITS_DISPLAY);
337 Group4Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, DBL_DIGITS_DISPLAY);
338 Group4Spin->SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
339 Group4Spin->SpinBox_DS->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
341 /* displays Dialog */
342 GroupConstructors->setEnabled(false);
343 GroupDest1->setEnabled(false);
344 setEnabledUndo(false);
345 setEnabledRedo(false);
347 RadioButton1->setChecked(true);
352 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
356 //=================================================================================
357 // function : InitClick()
359 //=================================================================================
360 void EntityGUI_SketcherDlg::InitClick()
362 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
374 //=================================================================================
375 // function : TypeClicked()
376 // purpose : Radio button management
377 //=================================================================================
378 void EntityGUI_SketcherDlg::TypeClicked(int constructorId)
380 myConstructorId = constructorId;
381 if ( myConstructorId == 0 ) // SEGMENT
383 GroupD2->setEnabled(true);
384 RB_Dest1->setEnabled(true);
385 RB_Dest1->setChecked(true);
388 else if ( myConstructorId == 1 ) // ARC
390 GroupD2->setEnabled(false);
391 RB_Dest1->setEnabled(false);
392 RB_Dest2->setChecked(true);
398 //=================================================================================
399 // function : DestClicked()
400 // purpose : Radio button management
401 //=================================================================================
402 void EntityGUI_SketcherDlg::DestClicked( int constructorId )
408 if ( constructorId == 1 )
410 GroupPt->RB_Point1->setChecked(true);
412 PointClicked(1); // XY
414 else if ( constructorId == 0 )
416 GroupD1->RB_Dir11->setChecked(true);
419 Dir1Clicked(2); // Angle
424 //=================================================================================
425 // function : PointClicked()
426 // purpose : Radio button management
427 //=================================================================================
428 void EntityGUI_SketcherDlg::PointClicked(int constructorId)
432 // Get setting of step value from file configuration
433 double step = SUIT_Session::session()->resourceMgr()->doubleValue("Geometry", "SettingsGeomStep", 100.0);
435 if ( myConstructorId == 0 )
437 if ( constructorId == 1 )
439 mySketchType = PT_ABS;
440 Group2Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
441 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
442 Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X2"));
443 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y2"));
445 Group2Spin->SpinBox_DX->SetValue(myX);
447 Group2Spin->SpinBox_DY->SetValue(myY);
449 Group2Spin->buttonApply->setFocus();
451 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
453 else if ( constructorId == 0 )
455 mySketchType = PT_RELATIVE;
456 Group2Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
457 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
458 Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_DX2"));
459 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_DY2"));
461 Group2Spin->SpinBox_DX->SetValue(myDX);
463 Group2Spin->SpinBox_DY->SetValue(myDY);
465 Group2Spin->buttonApply->setFocus();
467 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
469 else if ( constructorId == 2 )
471 mySketchType = PT_SEL;
472 myEditCurrentArgument = Group1Sel->LineEdit1;
473 connect(myGeometryGUI->getApp()->selectionMgr(),
474 SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
476 Group1Sel->buttonApply->setFocus();
477 SelectionIntoArgument();
483 //=================================================================================
484 // function : Dir1Clicked()
485 // purpose : Radio button management
486 //=================================================================================
487 void EntityGUI_SketcherDlg::Dir1Clicked(int constructorId)
489 myConstructorDirId = constructorId;
490 GroupD2->RB_Dir21->setChecked(true);
495 //=================================================================================
496 // function : Dir2Clicked()
497 // purpose : Radio button management
498 //=================================================================================
499 void EntityGUI_SketcherDlg::Dir2Clicked(int constructorId)
504 // Get setting of step value from file configuration
505 double step = SUIT_Session::session()->resourceMgr()->doubleValue("Geometry", "SettingsGeomStep", 100.0);
507 if ( myConstructorId == 0 )
512 if ( myConstructorDirId == 2 )
514 Group2Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
515 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
516 Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_ANGLE2"));
517 Group2Spin->SpinBox_DX->SetValue(myAngle);
518 Group2Spin->buttonApply->setFocus();
521 if ( constructorId == 2 )
523 mySketchType = DIR_ANGLE_LENGTH;
524 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_LENGTH2"));
525 Group2Spin->SpinBox_DY->SetValue(myLength);
527 else if ( constructorId == 0 )
529 mySketchType = DIR_ANGLE_X;
530 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_X3"));
531 Group2Spin->SpinBox_DY->SetValue(myX);
533 else if ( constructorId == 1 )
535 mySketchType = DIR_ANGLE_Y;
536 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y3"));
537 Group2Spin->SpinBox_DY->SetValue(myY);
540 else if ( myConstructorDirId == 0 )
543 Group1Spin->buttonApply->setFocus();
545 if ( constructorId == 2 )
547 mySketchType = DIR_PER_LENGTH;
548 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2"));
549 Group1Spin->SpinBox_DX->SetValue(myLength);
551 else if ( constructorId == 0 )
553 mySketchType = DIR_PER_X;
554 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3"));
555 Group1Spin->SpinBox_DX->SetValue(myX);
557 else if ( constructorId == 1 )
559 mySketchType = DIR_PER_Y;
560 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3"));
561 Group1Spin->SpinBox_DX->SetValue(myY);
564 else if ( myConstructorDirId == 1 )
567 Group1Spin->buttonApply->setFocus();
569 if ( constructorId == 2 )
571 mySketchType = DIR_TAN_LENGTH;
572 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2"));
573 Group1Spin->SpinBox_DX->SetValue(myLength);
575 else if ( constructorId == 0 )
577 mySketchType = DIR_TAN_X;
578 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3"));
579 Group1Spin->SpinBox_DX->SetValue(myX);
581 else if ( constructorId == 1 )
583 mySketchType = DIR_TAN_Y;
584 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3"));
585 Group1Spin->SpinBox_DX->SetValue(myY);
588 else if ( myConstructorDirId == 3 )
590 Group3Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, DBL_DIGITS_DISPLAY);
591 Group3Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 0.1, DBL_DIGITS_DISPLAY);
592 Group3Spin->SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
593 Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_VX2"));
594 Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_VY2"));
596 Group3Spin->SpinBox_DX->SetValue(myDX);
598 Group3Spin->SpinBox_DY->SetValue(myDY);
600 Group3Spin->buttonApply->setFocus();
602 if ( constructorId == 2 )
604 mySketchType = DIR_DXDY_LENGTH;
605 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_LENGTH2"));
606 Group3Spin->SpinBox_DZ->SetValue(myLength);
608 else if ( constructorId == 0 )
610 mySketchType = DIR_DXDY_X;
611 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_X3"));
612 Group3Spin->SpinBox_DZ->SetValue(myX);
614 else if ( constructorId == 1 )
616 mySketchType = DIR_DXDY_Y;
617 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_Y3"));
618 Group3Spin->SpinBox_DZ->SetValue(myY);
622 else if ( myConstructorId == 1 )
624 if ( myConstructorDirId == 2 )
626 if ( constructorId == 2 )
628 mySketchType = DIR_ANGLE_LENGTH;
629 Group3Spin->SpinBox_DX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
630 Group3Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
631 Group3Spin->SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
632 Group3Spin->TextLabel1->setText(tr("GEOM_SKETCHER_ANGLE2"));
633 Group3Spin->TextLabel2->setText(tr("GEOM_SKETCHER_RADIUS2"));
634 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_ANGLE2"));
635 Group3Spin->SpinBox_DX->SetValue(myAngle);
637 Group3Spin->SpinBox_DY->SetValue(myRadius);
639 Group3Spin->SpinBox_DZ->SetValue(myLength);
641 Group3Spin->buttonApply->setFocus();
644 else if ( myConstructorDirId == 0 )
646 if ( constructorId == 2 )
648 mySketchType = DIR_PER_LENGTH;
649 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
650 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
651 Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_RADIUS2"));
652 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_ANGLE2"));
654 Group2Spin->SpinBox_DX->SetValue(myRadius);
656 Group2Spin->SpinBox_DY->SetValue(myLength);
658 Group2Spin->buttonApply->setFocus();
661 else if ( myConstructorDirId == 1 )
663 if ( constructorId == 2 )
665 mySketchType = DIR_TAN_LENGTH;
666 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, step, DBL_DIGITS_DISPLAY);
667 Group2Spin->SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5., DBL_DIGITS_DISPLAY);
668 Group2Spin->TextLabel1->setText(tr("GEOM_SKETCHER_RADIUS2"));
669 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_ANGLE2"));
671 Group2Spin->SpinBox_DX->SetValue(myRadius);
673 Group2Spin->SpinBox_DY->SetValue(myLength);
675 Group2Spin->buttonApply->setFocus();
678 else if ( myConstructorDirId == 3 )
680 if ( constructorId == 2 )
682 mySketchType = DIR_DXDY_LENGTH;
683 Group4Spin->TextLabel1->setText(tr("GEOM_SKETCHER_VX2"));
684 Group4Spin->TextLabel2->setText(tr("GEOM_SKETCHER_VY2"));
685 Group4Spin->TextLabel3->setText(tr("GEOM_SKETCHER_RADIUS2"));
686 Group4Spin->TextLabel4->setText(tr("GEOM_SKETCHER_ANGLE2"));
688 Group4Spin->SpinBox_DX->SetValue(myDX);
690 Group4Spin->SpinBox_DY->SetValue(myDY);
692 Group4Spin->SpinBox_DZ->SetValue(myRadius);
694 Group4Spin->SpinBox_DS->SetValue(myLength);
696 Group4Spin->buttonApply->setFocus();
701 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
705 //=================================================================================
706 // function : ClickOnCancel()
708 //=================================================================================
709 void EntityGUI_SketcherDlg::ClickOnCancel()
715 //=================================================================================
716 // function : ClickOnEnd()
717 // purpose : connected to buttonEnd AND buttonClose
718 //=================================================================================
719 void EntityGUI_SketcherDlg::ClickOnEnd()
721 if ( sender() == buttonClose )
723 // Verify validity of commands
724 if ( myCommand.count() <= 2 )
726 SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(),
727 tr( "GEOM_ERROR_STATUS" ), tr( "CANNOT_CLOSE" ), tr( "BUT_OK" ) );
731 QString Command = myCommand.join( "" ) + GetNewCommand();
732 Sketcher_Profile aProfile (Command.ascii());
734 Command = myCommand.join( "" );
735 aProfile = Sketcher_Profile(Command.ascii());
736 TopoDS_Shape myShape;
737 if ( aProfile.IsDone() )
738 myShape = aProfile.GetShape();
740 if(myShape.ShapeType() != TopAbs_VERTEX)
741 myCommand.append( ":WW" );
745 // PAL16008 (Sketcher Validation should be equal to Apply&Close)
746 if (Group1Spin->buttonApply->isEnabled() && Group1Spin->isVisible() ||
747 Group2Spin->buttonApply->isEnabled() && Group2Spin->isVisible() ||
748 Group3Spin->buttonApply->isEnabled() && Group3Spin->isVisible() ||
749 Group4Spin->buttonApply->isEnabled() && Group4Spin->isVisible() ||
750 Group1Sel ->buttonApply->isEnabled() && Group1Sel->isVisible() )
757 if( myCommand.size() > 2 )
764 //=================================================================================
765 // function : ClickOnApply()
767 //=================================================================================
768 bool EntityGUI_SketcherDlg::ClickOnApply()
770 if (sender() && sender()->inherits("QPushButton"))
771 ((QPushButton*)sender())->setFocus(); // to update value of currently edited spin-box (PAL11948)
773 myCommand.append( GetNewCommand() );
774 mySketchState = NEXT_POINT;
776 myUndoCommand.clear();
777 myUndoCommand.append( "Sketcher" );
779 GroupConstructors->setEnabled(true);
780 GroupDest1->setEnabled(true);
781 setEnabledUndo(true);
782 setEnabledRedo(false);
784 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
786 // Set focus to SpinBox_DX
787 if (sender() == Group1Spin->buttonApply) {
788 (Group1Spin->SpinBox_DX)->setFocus();
789 (Group1Spin->SpinBox_DX)->selectAll();
791 else if (sender() == Group2Spin->buttonApply) {
792 (Group2Spin->SpinBox_DX)->setFocus();
793 (Group2Spin->SpinBox_DX)->selectAll();
795 else if (sender() == Group3Spin->buttonApply) {
796 (Group3Spin->SpinBox_DX)->setFocus();
797 (Group3Spin->SpinBox_DX)->selectAll();
799 else if (sender() == Group4Spin->buttonApply) {
800 (Group4Spin->SpinBox_DX)->setFocus();
801 (Group4Spin->SpinBox_DX)->selectAll();
807 //=================================================================================
808 // function : ClickOnHelp()
810 //=================================================================================
811 void EntityGUI_SketcherDlg::ClickOnHelp()
813 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
815 app->onHelpContextModule(myGeometryGUI ? app->moduleName(myGeometryGUI->moduleName()) : QString(""), myHelpFileName);
819 platform = "winapplication";
821 platform = "application";
824 SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
825 QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
826 arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
827 QObject::tr("BUT_OK"));
831 //=================================================================================
832 // function : ClickOnUndo()
834 //=================================================================================
835 void EntityGUI_SketcherDlg::ClickOnUndo()
837 myUndoCommand.append( myCommand.last() );
838 myCommand.pop_back();
840 if(myCommand.count() == 1) {
841 mySketchState = FIRST_POINT;
843 RadioButton1->setChecked(true);
846 GroupConstructors->setEnabled(false);
847 GroupDest1->setEnabled(false);
848 setEnabledUndo(false);
851 setEnabledRedo(true);
853 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
856 //=================================================================================
857 // function : ClickOnRedo()
859 //=================================================================================
860 void EntityGUI_SketcherDlg::ClickOnRedo()
862 myCommand.append( myUndoCommand.last() );
863 myUndoCommand.pop_back();
865 mySketchState = NEXT_POINT;
867 GroupConstructors->setEnabled(true);
868 GroupDest1->setEnabled(true);
869 setEnabledUndo(true);
871 if(myUndoCommand.count() == 1)
872 setEnabledRedo(false);
874 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
877 //=================================================================================
878 // function : setEnabledUndo()
880 //=================================================================================
881 void EntityGUI_SketcherDlg::setEnabledUndo(bool value)
883 Group1Sel->buttonUndo->setEnabled(value);
884 Group1Spin->buttonUndo->setEnabled(value);
885 Group2Spin->buttonUndo->setEnabled(value);
886 Group3Spin->buttonUndo->setEnabled(value);
887 Group4Spin->buttonUndo->setEnabled(value);
890 //=================================================================================
891 // function : setEnabledRedo()
893 //=================================================================================
894 void EntityGUI_SketcherDlg::setEnabledRedo(bool value)
896 Group1Sel->buttonRedo->setEnabled(value);
897 Group1Spin->buttonRedo->setEnabled(value);
898 Group2Spin->buttonRedo->setEnabled(value);
899 Group3Spin->buttonRedo->setEnabled(value);
900 Group4Spin->buttonRedo->setEnabled(value);
903 //=================================================================================
904 // function : SelectionIntoArgument()
905 // purpose : Called when selection as changed
906 //=================================================================================
907 void EntityGUI_SketcherDlg::SelectionIntoArgument()
909 myEditCurrentArgument->setText("");
913 int nbSel = IObjectCount();
914 if ( nbSel == 1 && myEditCurrentArgument == Group1Sel->LineEdit1 )
916 Standard_Boolean aRes = Standard_False;
917 GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes );
918 if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
920 if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_VERTEX ) ) {
922 gp_Ax3 aWPlane = myGeometryGUI->GetWorkingPlane();
924 aTrans.SetTransformation(aWPlane);
925 BRepBuilderAPI_Transform aTransformation(aShape, aTrans, Standard_False);
926 aShape = aTransformation.Shape();
929 if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) {
932 Group1Sel->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) );
938 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
942 //=================================================================================
943 // function : SetEditCurrentArgument()
945 //=================================================================================
946 void EntityGUI_SketcherDlg::SetEditCurrentArgument()
948 if ( sender() == Group1Sel->PushButton1 )
950 myEditCurrentArgument = Group1Sel->LineEdit1;
951 myEditCurrentArgument->setFocus();
953 SelectionIntoArgument();
957 //=================================================================================
958 // function : LineEditReturnPressed()
960 //=================================================================================
961 void EntityGUI_SketcherDlg::LineEditReturnPressed()
963 if ( sender() == Group1Sel->LineEdit1 )
965 myEditCurrentArgument = Group1Sel->LineEdit1;
967 /* User name of object input management */
968 /* If successfull the selection is changed and signal emitted... */
969 /* so SelectionIntoArgument() is automatically called. */
970 const QString objectUserName = myEditCurrentArgument->text();
971 QWidget* thisWidget = (QWidget*)this;
972 if(GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, selectedIO()))
973 myEditCurrentArgument->setText(objectUserName);
978 //=================================================================================
979 // function : DeactivateActiveDialog()
981 //=================================================================================
982 void EntityGUI_SketcherDlg::DeactivateActiveDialog()
984 //myGeometryGUI->SetState( -1 );
988 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
989 myGeometryGUI->SetActiveDialogBox(0);
993 //=================================================================================
994 // function : ActivateThisDialog()
996 //=================================================================================
997 void EntityGUI_SketcherDlg::ActivateThisDialog()
999 myGeometryGUI->EmitSignalDeactivateDialog();
1001 myGeometryGUI->SetActiveDialogBox((QDialog*)this);
1003 connect(myGeometryGUI->getApp()->selectionMgr(),
1004 SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1006 //myGeometryGUI->SetState( 0 );
1007 globalSelection( GEOM_POINT );
1009 myEditCurrentArgument = Group1Sel->LineEdit1;
1010 myEditCurrentArgument->setFocus();
1012 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
1016 //=================================================================================
1017 // function : enterEvent [REDEFINED]
1019 //=================================================================================
1020 void EntityGUI_SketcherDlg::enterEvent(QEvent* e)
1022 if ( !GroupConstructors->isEnabled())
1023 ActivateThisDialog();
1027 //=================================================================================
1028 // function : closeEvent()
1030 //=================================================================================
1031 void EntityGUI_SketcherDlg::closeEvent(QCloseEvent* e)
1033 //myGeometryGUI->SetState( -1 );
1034 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
1035 myGeometryGUI->getApp()->updateActions();
1036 QDialog::closeEvent( e );
1040 //=================================================================================
1041 // function : ValueChangedInSpinBox()
1043 //=================================================================================
1044 void EntityGUI_SketcherDlg::ValueChangedInSpinBox(double newValue)
1046 QObject* send = (QObject*)sender();
1047 Standard_Real vx, vy, vz, vs;
1048 vx = vy = vz = vs = 0.0;
1050 if ( send == Group1Spin->SpinBox_DX)
1054 else if ( send == Group2Spin->SpinBox_DX )
1057 vy = Group2Spin->SpinBox_DY->GetValue();
1059 else if ( send == Group2Spin->SpinBox_DY)
1061 vx = Group2Spin->SpinBox_DX->GetValue();
1064 else if ( send == Group3Spin->SpinBox_DX)
1067 vy = Group3Spin->SpinBox_DY->GetValue();
1068 vz = Group3Spin->SpinBox_DZ->GetValue();
1070 else if ( send == Group3Spin->SpinBox_DY)
1072 vx = Group3Spin->SpinBox_DX->GetValue();
1074 vz = Group3Spin->SpinBox_DZ->GetValue();
1076 else if ( send == Group3Spin->SpinBox_DZ)
1078 vx = Group3Spin->SpinBox_DX->GetValue();
1079 vy = Group3Spin->SpinBox_DY->GetValue();
1082 else if ( send == Group4Spin->SpinBox_DX)
1085 vy = Group4Spin->SpinBox_DY->GetValue();
1086 vz = Group4Spin->SpinBox_DZ->GetValue();
1087 vs = Group4Spin->SpinBox_DS->GetValue();
1089 else if ( send == Group4Spin->SpinBox_DY)
1091 vx = Group4Spin->SpinBox_DX->GetValue();
1093 vz = Group4Spin->SpinBox_DZ->GetValue();
1094 vs = Group4Spin->SpinBox_DS->GetValue();
1096 else if ( send == Group4Spin->SpinBox_DZ)
1098 vx = Group4Spin->SpinBox_DX->GetValue();
1099 vy = Group4Spin->SpinBox_DY->GetValue();
1101 vs = Group4Spin->SpinBox_DS->GetValue();
1103 else if ( send == Group4Spin->SpinBox_DS)
1105 vx = Group4Spin->SpinBox_DX->GetValue();
1106 vy = Group4Spin->SpinBox_DY->GetValue();
1107 vz = Group4Spin->SpinBox_DZ->GetValue();
1110 // NPAL16010 (Sketcher Apply non available if only one line is modified)
1111 // if ValueChangedInSpinBox() called from eventFilter()
1112 else if ( Group1Spin->SpinBox_DX->hasFocus() )
1116 else if ( Group2Spin->SpinBox_DX ->hasFocus() )
1119 vy = Group2Spin->SpinBox_DY->GetValue();
1121 else if ( Group2Spin->SpinBox_DY->hasFocus() )
1123 vx = Group2Spin->SpinBox_DX->GetValue();
1126 else if ( Group3Spin->SpinBox_DX->hasFocus() )
1129 vy = Group3Spin->SpinBox_DY->GetValue();
1130 vz = Group3Spin->SpinBox_DZ->GetValue();
1132 else if ( Group3Spin->SpinBox_DY->hasFocus() )
1134 vx = Group3Spin->SpinBox_DX->GetValue();
1136 vz = Group3Spin->SpinBox_DZ->GetValue();
1138 else if ( Group3Spin->SpinBox_DZ->hasFocus() )
1140 vx = Group3Spin->SpinBox_DX->GetValue();
1141 vy = Group3Spin->SpinBox_DY->GetValue();
1144 else if ( Group4Spin->SpinBox_DX->hasFocus() )
1147 vy = Group4Spin->SpinBox_DY->GetValue();
1148 vz = Group4Spin->SpinBox_DZ->GetValue();
1149 vs = Group4Spin->SpinBox_DS->GetValue();
1151 else if ( Group4Spin->SpinBox_DY->hasFocus() )
1153 vx = Group4Spin->SpinBox_DX->GetValue();
1155 vz = Group4Spin->SpinBox_DZ->GetValue();
1156 vs = Group4Spin->SpinBox_DS->GetValue();
1158 else if ( Group4Spin->SpinBox_DZ->hasFocus() )
1160 vx = Group4Spin->SpinBox_DX->GetValue();
1161 vy = Group4Spin->SpinBox_DY->GetValue();
1163 vs = Group4Spin->SpinBox_DS->GetValue();
1165 else if ( Group4Spin->SpinBox_DS->hasFocus() )
1167 vx = Group4Spin->SpinBox_DX->GetValue();
1168 vy = Group4Spin->SpinBox_DY->GetValue();
1169 vz = Group4Spin->SpinBox_DZ->GetValue();
1173 if ( myConstructorId == 0 )
1175 if ( mySketchType == PT_ABS)
1180 else if ( mySketchType == PT_RELATIVE)
1185 else if ( mySketchType == DIR_ANGLE_LENGTH)
1190 else if ( mySketchType == DIR_ANGLE_X)
1195 else if ( mySketchType == DIR_ANGLE_Y)
1200 else if ( mySketchType == DIR_PER_LENGTH)
1204 else if ( mySketchType == DIR_PER_X)
1208 else if ( mySketchType == DIR_PER_Y)
1212 else if ( mySketchType == DIR_TAN_LENGTH)
1216 else if ( mySketchType == DIR_TAN_X)
1220 else if ( mySketchType == DIR_TAN_Y)
1224 else if ( mySketchType == DIR_DXDY_LENGTH)
1230 else if ( mySketchType == DIR_DXDY_X)
1236 else if ( mySketchType == DIR_DXDY_Y)
1243 else if ( myConstructorId == 1 )
1245 if ( mySketchType == DIR_ANGLE_LENGTH)
1251 else if ( mySketchType == DIR_PER_LENGTH)
1256 else if ( mySketchType == DIR_TAN_LENGTH)
1261 else if ( mySketchType == DIR_DXDY_LENGTH)
1270 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
1274 //=================================================================================
1275 // function : GetNewCommand()
1276 // purpose : Build the new command with context
1277 //=================================================================================
1278 QString EntityGUI_SketcherDlg::GetNewCommand()
1280 QString myNewCommand = ":";
1281 if ( mySketchState == FIRST_POINT ) {
1282 if ( mySketchType == PT_ABS || mySketchType == PT_SEL)
1283 myNewCommand = myNewCommand + "F " + QString::number(myX) + " " + QString::number(myY);
1284 if ( mySketchType == PT_RELATIVE)
1285 myNewCommand = myNewCommand + "F " + QString::number(myDX) + " " + QString::number(myDY);
1286 return myNewCommand;
1289 if ( myConstructorId == 0 )
1291 if ( mySketchType == PT_ABS || mySketchType == PT_SEL)
1292 myNewCommand = myNewCommand + "TT " + QString::number(myX) + " " + QString::number(myY);
1293 if ( mySketchType == PT_RELATIVE)
1294 myNewCommand = myNewCommand + "T " + QString::number(myDX) + " " + QString::number(myDY);
1295 if ( mySketchType == DIR_ANGLE_LENGTH)
1297 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1298 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1300 if ( mySketchType == DIR_ANGLE_X)
1302 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1303 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1305 if ( mySketchType == DIR_ANGLE_Y)
1307 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1308 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
1310 if ( mySketchType == DIR_PER_LENGTH)
1312 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1313 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1315 if ( mySketchType == DIR_PER_X)
1317 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1318 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1320 if ( mySketchType == DIR_PER_Y)
1322 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1323 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
1325 if ( mySketchType == DIR_TAN_LENGTH)
1326 myNewCommand = myNewCommand + "L " + QString::number(myLength);
1327 if ( mySketchType == DIR_TAN_X)
1328 myNewCommand = myNewCommand + "IX " + QString::number(myX);
1329 if ( mySketchType == DIR_TAN_Y)
1330 myNewCommand = myNewCommand + "IY " + QString::number(myY);
1331 if ( mySketchType == DIR_DXDY_LENGTH)
1333 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1334 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1336 if ( mySketchType == DIR_DXDY_X)
1338 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1339 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1341 if ( mySketchType == DIR_DXDY_Y)
1343 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1344 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
1347 else if ( myConstructorId == 1 )
1349 if ( mySketchType == DIR_ANGLE_LENGTH)
1351 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1352 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1354 if ( mySketchType == DIR_PER_LENGTH)
1356 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1357 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1359 if ( mySketchType == DIR_TAN_LENGTH)
1361 myNewCommand = myNewCommand + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1363 if ( mySketchType == DIR_DXDY_LENGTH)
1365 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1366 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1369 return myNewCommand;
1372 //=================================================================================
1373 // function : createOperation
1375 //=================================================================================
1376 GEOM::GEOM_IOperations_ptr EntityGUI_SketcherDlg::createOperation()
1378 return getGeomEngine()->GetICurvesOperations( getStudyId() );
1381 //=================================================================================
1382 // function : isValid
1384 //=================================================================================
1385 bool EntityGUI_SketcherDlg::isValid( QString& msg )
1390 //=================================================================================
1391 // function : execute
1393 //=================================================================================
1394 bool EntityGUI_SketcherDlg::execute( ObjectList& objects )
1396 if(mySketchState == FIRST_POINT) {
1401 //Test if the current point is the same as the last one
1402 TopoDS_Shape myShape1, myShape2;
1405 QString Command1 = myCommand.join( "" );
1406 Sketcher_Profile aProfile1 (Command1.ascii());
1407 if(aProfile1.IsDone())
1408 myShape1 = aProfile1.GetShape();
1411 QString Command2 = Command1 + GetNewCommand();
1412 Sketcher_Profile aProfile2 (Command2.ascii());
1413 if(aProfile2.IsDone())
1414 myShape2 = aProfile2.GetShape();
1416 if(myShape2.IsNull()) {
1417 //the current point is the same as the last one
1418 myLastX2 = myLastX1;
1419 myLastY2 = myLastY1;
1422 TopoDS_Vertex V1, V2;
1424 if(myShape1.ShapeType() == TopAbs_VERTEX) {
1425 //the last shape is the first point
1426 pt = BRep_Tool::Pnt(TopoDS::Vertex(myShape1));
1431 TopExp::Vertices(TopoDS::Wire(myShape1), V1, V2);
1432 pt = BRep_Tool::Pnt(V2);
1436 TopExp::Vertices(TopoDS::Wire(myShape2), V1, V2);
1437 pt = BRep_Tool::Pnt(V2);
1444 if( ( mySketchState != FIRST_POINT &&
1445 myLastX1 == myLastX2 && myLastY1 == myLastY2 ) || myIsAllAdded ) {
1446 cmd = myCommand.join( "" );
1448 if ( Group1Sel->isVisible() ) {
1449 Group1Sel->buttonApply->setEnabled(false);
1450 //Group1Sel->buttonApply->setFocus();
1452 if ( Group1Spin->isVisible() ) {
1453 Group1Spin->buttonApply->setEnabled(false);
1454 //Group1Spin->buttonApply->setFocus();
1456 if ( Group2Spin->isVisible() ) {
1457 Group2Spin->buttonApply->setEnabled(false);
1458 //Group2Spin->buttonApply->setFocus();
1460 if ( Group3Spin->isVisible() ) {
1461 Group3Spin->buttonApply->setEnabled(false);
1462 //Group3Spin->buttonApply->setFocus();
1464 if ( Group4Spin->isVisible() ) {
1465 Group4Spin->buttonApply->setEnabled(false);
1466 //Group4Spin->buttonApply->setFocus();
1470 cmd = myCommand.join( "" ) + GetNewCommand();
1472 if ( Group1Sel->isVisible() ) {
1473 Group1Sel->buttonApply->setEnabled(true);
1474 //Group1Sel->buttonApply->setFocus();
1476 if ( Group1Spin->isVisible() ) {
1477 Group1Spin->buttonApply->setEnabled(true);
1478 //Group1Spin->buttonApply->setFocus();
1480 if ( Group2Spin->isVisible() ) {
1481 Group2Spin->buttonApply->setEnabled(true);
1482 //Group2Spin->buttonApply->setFocus();
1484 if ( Group3Spin->isVisible() ) {
1485 Group3Spin->buttonApply->setEnabled(true);
1486 //Group3Spin->buttonApply->setFocus();
1488 if ( Group4Spin->isVisible() ) {
1489 Group4Spin->buttonApply->setEnabled(true);
1490 //Group4Spin->buttonApply->setFocus();
1494 gp_Ax3 myWPlane = myGeometryGUI->GetWorkingPlane();
1495 GEOM::ListOfDouble_var WPlane = new GEOM::ListOfDouble;
1497 WPlane[0] = myWPlane.Location().X();
1498 WPlane[1] = myWPlane.Location().Y();
1499 WPlane[2] = myWPlane.Location().Z();
1501 WPlane[3] = myWPlane.Direction().X();
1502 WPlane[4] = myWPlane.Direction().Y();
1503 WPlane[5] = myWPlane.Direction().Z();
1505 WPlane[6] = myWPlane.XDirection().X();
1506 WPlane[7] = myWPlane.XDirection().Y();
1507 WPlane[8] = myWPlane.XDirection().Z();
1509 GEOM::GEOM_Object_var anObj =
1510 GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeSketcher( cmd.latin1(), WPlane );
1512 if ( !anObj->_is_nil() )
1513 objects.push_back( anObj._retn() );
1518 //================================================================
1519 // Function : displayPreview
1520 // Purpose : Method for displaying preview of resulting shape
1521 // Redefined from GEOMBase_Helper.
1522 //================================================================
1523 void EntityGUI_SketcherDlg::displayPreview( GEOM::GEOM_Object_ptr object,
1525 const bool activate,
1527 const double lineWidth,
1528 const int displayMode,
1531 // Set color for preview shape
1532 getDisplayer()->SetColor( Quantity_NOC_RED );
1534 // set width of displayed shape
1535 getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth );
1537 // Disable activation of selection
1538 getDisplayer()->SetToActivate( activate );
1540 // Make a reference to GEOM_Object
1541 CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string( object );
1542 getDisplayer()->SetName( objStr.in() );
1544 // Create wire from applayed object
1545 TopoDS_Shape anApplyedWire, aLastSegment;
1546 if ( !createShapes( object, anApplyedWire, aLastSegment ) )
1550 SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire );
1551 if ( aPrs != 0 && !aPrs->IsNull() )
1552 GEOMBase_Helper::displayPreview( aPrs, append, update );
1554 getDisplayer()->SetColor( Quantity_NOC_VIOLET );
1555 aPrs = getDisplayer()->BuildPrs( aLastSegment );
1556 if ( aPrs != 0 && !aPrs->IsNull() )
1557 GEOMBase_Helper::displayPreview( aPrs, append, update );
1559 getDisplayer()->UnsetName();
1561 // Enable activation of displayed objects
1562 getDisplayer()->SetToActivate( true );
1565 //================================================================
1566 // Function : createShapes
1567 // Purpose : Create applyed wire, and last segment from entry object
1568 //================================================================
1569 bool EntityGUI_SketcherDlg::createShapes( GEOM::GEOM_Object_ptr theObject,
1570 TopoDS_Shape& theApplyedWire,
1571 TopoDS_Shape& theLastSegment )
1573 TopoDS_Shape aShape;
1574 if ( !GEOMBase::GetShape( theObject, aShape ) ||
1575 aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX )
1578 if ( Group1Sel->isVisible() && !Group1Sel->buttonApply->isEnabled() ||
1579 Group1Spin->isVisible() && !Group1Spin->buttonApply->isEnabled() ||
1580 Group2Spin->isVisible() && !Group2Spin->buttonApply->isEnabled() ||
1581 Group3Spin->isVisible() && !Group3Spin->buttonApply->isEnabled() ||
1582 Group4Spin->isVisible() && !Group4Spin->buttonApply->isEnabled() )
1584 theApplyedWire = aShape;
1588 BRepBuilderAPI_MakeWire aBuilder;
1589 TopExp_Explorer anExp( aShape, TopAbs_EDGE );
1592 TopoDS_Shape anEdge = anExp.Current();
1594 if ( anExp.More() ) // i.e. non-last edge
1595 aBuilder.Add( TopoDS::Edge( anEdge ) );
1598 theLastSegment = anEdge;
1603 if ( aBuilder.IsDone() )
1604 theApplyedWire = aBuilder.Shape();
1609 //=================================================================================
1610 // function : keyPressEvent()
1612 //=================================================================================
1613 void EntityGUI_SketcherDlg::keyPressEvent( QKeyEvent* e )
1615 QDialog::keyPressEvent( e );
1616 if ( e->isAccepted() )
1619 if ( e->key() == Key_F1 )