1 // GEOM GEOMGUI : GUI for Geometry component
3 // Copyright (C) 2003 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
24 // File : EntityGUI_SketcherDlg.cxx
25 // Author : Damien COQUERET
29 #include "EntityGUI_SketcherDlg.h"
30 #include "Sketcher_Profile.hxx"
31 #include "GEOM_Displayer.h"
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"
42 #include <qpushbutton.h>
45 #include <BRep_Tool.hxx>
47 #include <TopExp_Explorer.hxx>
48 #include <TopoDS_Vertex.hxx>
50 #include <BRepBuilderAPI_Transform.hxx>
51 #include <BRepBuilderAPI_MakeWire.hxx>
53 #include "GEOMImpl_Types.hxx"
55 #include "utilities.h"
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 ) ),
74 myLineWidth( lineWidth )
76 myGeometryGUI->SetActiveDialogBox(this);
78 if ( !name ) setName("EntityGUI_SketcherDlg");
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"));
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")));
89 setCaption(tr("GEOM_SKETCHER_TITLE"));
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"));
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"));
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"));
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"));
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 );
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);
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);
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);
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);
170 Layout5->addMultiCellWidget(GroupPt, 1, 1, 0, 1);
171 Layout5->addWidget(GroupD1, 1, 0);
172 Layout5->addWidget(GroupD2, 1, 1);
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 /***************************************************************/
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()));
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()));
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)));
209 connect(Group1Sel->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
210 connect(Group1Sel->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
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)));
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)));
234 connect(myGeometryGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
235 connect(myGeometryGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
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);
252 //=================================================================================
253 // function : ~EntityGUI_SketcherDlg()
254 // purpose : Destroys the object and frees any allocated resources
255 //=================================================================================
256 EntityGUI_SketcherDlg::~EntityGUI_SketcherDlg()
258 myGeometryGUI->SetActiveDialogBox( 0 );
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)
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();
273 } else if (object == Group2Spin->SpinBox_DX ||
274 object == Group2Spin->SpinBox_DY) {
275 Group2Spin->buttonApply->animateClick();
277 } else if (object == Group3Spin->SpinBox_DX ||
278 object == Group3Spin->SpinBox_DY ||
279 object == Group3Spin->SpinBox_DZ) {
280 Group3Spin->buttonApply->animateClick();
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();
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();
297 double newVal = s.toDouble( &ok );
299 ValueChangedInSpinBox( newVal );
302 return EntityGUI_Skeleton_QTD::eventFilter(object, event);
306 //=================================================================================
309 //=================================================================================
310 void EntityGUI_SketcherDlg::Init()
313 myEditCurrentArgument = Group1Sel->LineEdit1;
314 myCommand.append( "Sketcher" );
315 myUndoCommand.append( "Sketcher" );
317 mySketchState = FIRST_POINT;
318 globalSelection( GEOM_POINT );
325 myHelpFileName = "sketcher.htm";
327 /* Get setting of step value from file configuration */
328 double step = SUIT_Session::session()->resourceMgr()->doubleValue( "Geometry", "SettingsGeomStep", 100.0 );
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);
342 /* displays Dialog */
343 GroupConstructors->setEnabled(false);
344 GroupDest1->setEnabled(false);
345 setEnabledUndo(false);
346 setEnabledRedo(false);
348 RadioButton1->setChecked(true);
353 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
357 //=================================================================================
358 // function : InitClick()
360 //=================================================================================
361 void EntityGUI_SketcherDlg::InitClick()
363 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
375 //=================================================================================
376 // function : TypeClicked()
377 // purpose : Radio button management
378 //=================================================================================
379 void EntityGUI_SketcherDlg::TypeClicked(int constructorId)
381 myConstructorId = constructorId;
382 if ( myConstructorId == 0 ) // SEGMENT
384 GroupD2->setEnabled(true);
385 RB_Dest1->setEnabled(true);
386 RB_Dest1->setChecked(true);
389 else if ( myConstructorId == 1 ) // ARC
391 GroupD2->setEnabled(false);
392 RB_Dest1->setEnabled(false);
393 RB_Dest2->setChecked(true);
399 //=================================================================================
400 // function : DestClicked()
401 // purpose : Radio button management
402 //=================================================================================
403 void EntityGUI_SketcherDlg::DestClicked( int constructorId )
409 if ( constructorId == 1 )
411 GroupPt->RB_Point1->setChecked(true);
413 PointClicked(1); // XY
415 else if ( constructorId == 0 )
417 GroupD1->RB_Dir11->setChecked(true);
420 Dir1Clicked(2); // Angle
425 //=================================================================================
426 // function : PointClicked()
427 // purpose : Radio button management
428 //=================================================================================
429 void EntityGUI_SketcherDlg::PointClicked(int constructorId)
433 // Get setting of step value from file configuration
434 double step = SUIT_Session::session()->resourceMgr()->doubleValue("Geometry", "SettingsGeomStep", 100.0);
436 if ( myConstructorId == 0 )
438 if ( constructorId == 1 )
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"));
446 Group2Spin->SpinBox_DX->SetValue(myX);
448 Group2Spin->SpinBox_DY->SetValue(myY);
450 Group2Spin->buttonApply->setFocus();
452 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
454 else if ( constructorId == 0 )
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"));
462 Group2Spin->SpinBox_DX->SetValue(myDX);
464 Group2Spin->SpinBox_DY->SetValue(myDY);
466 Group2Spin->buttonApply->setFocus();
468 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
470 else if ( constructorId == 2 )
472 mySketchType = PT_SEL;
473 myEditCurrentArgument = Group1Sel->LineEdit1;
474 connect(myGeometryGUI->getApp()->selectionMgr(),
475 SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
477 Group1Sel->buttonApply->setFocus();
478 SelectionIntoArgument();
484 //=================================================================================
485 // function : Dir1Clicked()
486 // purpose : Radio button management
487 //=================================================================================
488 void EntityGUI_SketcherDlg::Dir1Clicked(int constructorId)
490 myConstructorDirId = constructorId;
491 GroupD2->RB_Dir21->setChecked(true);
496 //=================================================================================
497 // function : Dir2Clicked()
498 // purpose : Radio button management
499 //=================================================================================
500 void EntityGUI_SketcherDlg::Dir2Clicked(int constructorId)
505 // Get setting of step value from file configuration
506 double step = SUIT_Session::session()->resourceMgr()->doubleValue("Geometry", "SettingsGeomStep", 100.0);
508 if ( myConstructorId == 0 )
513 if ( myConstructorDirId == 2 )
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();
522 if ( constructorId == 2 )
524 mySketchType = DIR_ANGLE_LENGTH;
525 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_LENGTH2"));
526 Group2Spin->SpinBox_DY->SetValue(myLength);
528 else if ( constructorId == 0 )
530 mySketchType = DIR_ANGLE_X;
531 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_X3"));
532 Group2Spin->SpinBox_DY->SetValue(myX);
534 else if ( constructorId == 1 )
536 mySketchType = DIR_ANGLE_Y;
537 Group2Spin->TextLabel2->setText(tr("GEOM_SKETCHER_Y3"));
538 Group2Spin->SpinBox_DY->SetValue(myY);
541 else if ( myConstructorDirId == 0 )
544 Group1Spin->buttonApply->setFocus();
546 if ( constructorId == 2 )
548 mySketchType = DIR_PER_LENGTH;
549 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2"));
550 Group1Spin->SpinBox_DX->SetValue(myLength);
552 else if ( constructorId == 0 )
554 mySketchType = DIR_PER_X;
555 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3"));
556 Group1Spin->SpinBox_DX->SetValue(myX);
558 else if ( constructorId == 1 )
560 mySketchType = DIR_PER_Y;
561 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3"));
562 Group1Spin->SpinBox_DX->SetValue(myY);
565 else if ( myConstructorDirId == 1 )
568 Group1Spin->buttonApply->setFocus();
570 if ( constructorId == 2 )
572 mySketchType = DIR_TAN_LENGTH;
573 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_LENGTH2"));
574 Group1Spin->SpinBox_DX->SetValue(myLength);
576 else if ( constructorId == 0 )
578 mySketchType = DIR_TAN_X;
579 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_X3"));
580 Group1Spin->SpinBox_DX->SetValue(myX);
582 else if ( constructorId == 1 )
584 mySketchType = DIR_TAN_Y;
585 Group1Spin->TextLabel1->setText(tr("GEOM_SKETCHER_Y3"));
586 Group1Spin->SpinBox_DX->SetValue(myY);
589 else if ( myConstructorDirId == 3 )
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"));
597 Group3Spin->SpinBox_DX->SetValue(myDX);
599 Group3Spin->SpinBox_DY->SetValue(myDY);
601 Group3Spin->buttonApply->setFocus();
603 if ( constructorId == 2 )
605 mySketchType = DIR_DXDY_LENGTH;
606 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_LENGTH2"));
607 Group3Spin->SpinBox_DZ->SetValue(myLength);
609 else if ( constructorId == 0 )
611 mySketchType = DIR_DXDY_X;
612 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_X3"));
613 Group3Spin->SpinBox_DZ->SetValue(myX);
615 else if ( constructorId == 1 )
617 mySketchType = DIR_DXDY_Y;
618 Group3Spin->TextLabel3->setText(tr("GEOM_SKETCHER_Y3"));
619 Group3Spin->SpinBox_DZ->SetValue(myY);
623 else if ( myConstructorId == 1 )
625 if ( myConstructorDirId == 2 )
627 if ( constructorId == 2 )
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);
638 Group3Spin->SpinBox_DY->SetValue(myRadius);
640 Group3Spin->SpinBox_DZ->SetValue(myLength);
642 Group3Spin->buttonApply->setFocus();
645 else if ( myConstructorDirId == 0 )
647 if ( constructorId == 2 )
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"));
655 Group2Spin->SpinBox_DX->SetValue(myRadius);
657 Group2Spin->SpinBox_DY->SetValue(myLength);
659 Group2Spin->buttonApply->setFocus();
662 else if ( myConstructorDirId == 1 )
664 if ( constructorId == 2 )
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"));
672 Group2Spin->SpinBox_DX->SetValue(myRadius);
674 Group2Spin->SpinBox_DY->SetValue(myLength);
676 Group2Spin->buttonApply->setFocus();
679 else if ( myConstructorDirId == 3 )
681 if ( constructorId == 2 )
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"));
689 Group4Spin->SpinBox_DX->SetValue(myDX);
691 Group4Spin->SpinBox_DY->SetValue(myDY);
693 Group4Spin->SpinBox_DZ->SetValue(myRadius);
695 Group4Spin->SpinBox_DS->SetValue(myLength);
697 Group4Spin->buttonApply->setFocus();
702 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
706 //=================================================================================
707 // function : ClickOnCancel()
709 //=================================================================================
710 void EntityGUI_SketcherDlg::ClickOnCancel()
716 //=================================================================================
717 // function : ClickOnEnd()
718 // purpose : connected to buttonEnd AND buttonClose
719 //=================================================================================
720 void EntityGUI_SketcherDlg::ClickOnEnd()
722 if ( sender() == buttonClose )
724 // Verify validity of commands
725 if ( myCommand.count() <= 2 )
727 SUIT_MessageBox::error1( SUIT_Session::session()->activeApplication()->desktop(),
728 tr( "GEOM_ERROR_STATUS" ), tr( "CANNOT_CLOSE" ), tr( "BUT_OK" ) );
732 QString Command = myCommand.join( "" ) + GetNewCommand();
733 Sketcher_Profile aProfile (Command.ascii());
735 Command = myCommand.join( "" );
736 aProfile = Sketcher_Profile(Command.ascii());
737 TopoDS_Shape myShape;
738 if ( aProfile.IsDone() )
739 myShape = aProfile.GetShape();
741 if(myShape.ShapeType() != TopAbs_VERTEX)
742 myCommand.append( ":WW" );
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() )
758 if( myCommand.size() > 2 )
765 //=================================================================================
766 // function : ClickOnApply()
768 //=================================================================================
769 bool EntityGUI_SketcherDlg::ClickOnApply()
771 if (sender() && sender()->inherits("QPushButton"))
772 ((QPushButton*)sender())->setFocus(); // to update value of currently edited spin-box (PAL11948)
774 myCommand.append( GetNewCommand() );
775 mySketchState = NEXT_POINT;
777 myUndoCommand.clear();
778 myUndoCommand.append( "Sketcher" );
780 GroupConstructors->setEnabled(true);
781 GroupDest1->setEnabled(true);
782 setEnabledUndo(true);
783 setEnabledRedo(false);
785 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
787 // Set focus to SpinBox_DX
788 if (sender() == Group1Spin->buttonApply) {
789 (Group1Spin->SpinBox_DX)->setFocus();
790 (Group1Spin->SpinBox_DX)->selectAll();
792 else if (sender() == Group2Spin->buttonApply) {
793 (Group2Spin->SpinBox_DX)->setFocus();
794 (Group2Spin->SpinBox_DX)->selectAll();
796 else if (sender() == Group3Spin->buttonApply) {
797 (Group3Spin->SpinBox_DX)->setFocus();
798 (Group3Spin->SpinBox_DX)->selectAll();
800 else if (sender() == Group4Spin->buttonApply) {
801 (Group4Spin->SpinBox_DX)->setFocus();
802 (Group4Spin->SpinBox_DX)->selectAll();
808 //=================================================================================
809 // function : ClickOnHelp()
811 //=================================================================================
812 void EntityGUI_SketcherDlg::ClickOnHelp()
814 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
816 app->onHelpContextModule(myGeometryGUI ? app->moduleName(myGeometryGUI->moduleName()) : QString(""), myHelpFileName);
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"));
825 //=================================================================================
826 // function : ClickOnUndo()
828 //=================================================================================
829 void EntityGUI_SketcherDlg::ClickOnUndo()
831 myUndoCommand.append( myCommand.last() );
832 myCommand.pop_back();
834 if(myCommand.count() == 1) {
835 mySketchState = FIRST_POINT;
837 RadioButton1->setChecked(true);
840 GroupConstructors->setEnabled(false);
841 GroupDest1->setEnabled(false);
842 setEnabledUndo(false);
845 setEnabledRedo(true);
847 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
850 //=================================================================================
851 // function : ClickOnRedo()
853 //=================================================================================
854 void EntityGUI_SketcherDlg::ClickOnRedo()
856 myCommand.append( myUndoCommand.last() );
857 myUndoCommand.pop_back();
859 mySketchState = NEXT_POINT;
861 GroupConstructors->setEnabled(true);
862 GroupDest1->setEnabled(true);
863 setEnabledUndo(true);
865 if(myUndoCommand.count() == 1)
866 setEnabledRedo(false);
868 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
871 //=================================================================================
872 // function : setEnabledUndo()
874 //=================================================================================
875 void EntityGUI_SketcherDlg::setEnabledUndo(bool value)
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);
884 //=================================================================================
885 // function : setEnabledRedo()
887 //=================================================================================
888 void EntityGUI_SketcherDlg::setEnabledRedo(bool value)
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);
897 //=================================================================================
898 // function : SelectionIntoArgument()
899 // purpose : Called when selection as changed
900 //=================================================================================
901 void EntityGUI_SketcherDlg::SelectionIntoArgument()
903 myEditCurrentArgument->setText("");
907 int nbSel = IObjectCount();
908 if ( nbSel == 1 && myEditCurrentArgument == Group1Sel->LineEdit1 )
910 Standard_Boolean aRes = Standard_False;
911 GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes );
912 if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
914 if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_VERTEX ) ) {
916 gp_Ax3 aWPlane = myGeometryGUI->GetWorkingPlane();
918 aTrans.SetTransformation(aWPlane);
919 BRepBuilderAPI_Transform aTransformation(aShape, aTrans, Standard_False);
920 aShape = aTransformation.Shape();
923 if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) {
926 Group1Sel->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) );
932 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
936 //=================================================================================
937 // function : SetEditCurrentArgument()
939 //=================================================================================
940 void EntityGUI_SketcherDlg::SetEditCurrentArgument()
942 if ( sender() == Group1Sel->PushButton1 )
944 myEditCurrentArgument = Group1Sel->LineEdit1;
945 myEditCurrentArgument->setFocus();
947 SelectionIntoArgument();
951 //=================================================================================
952 // function : LineEditReturnPressed()
954 //=================================================================================
955 void EntityGUI_SketcherDlg::LineEditReturnPressed()
957 if ( sender() == Group1Sel->LineEdit1 )
959 myEditCurrentArgument = Group1Sel->LineEdit1;
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);
972 //=================================================================================
973 // function : DeactivateActiveDialog()
975 //=================================================================================
976 void EntityGUI_SketcherDlg::DeactivateActiveDialog()
978 //myGeometryGUI->SetState( -1 );
982 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
983 myGeometryGUI->SetActiveDialogBox(0);
987 //=================================================================================
988 // function : ActivateThisDialog()
990 //=================================================================================
991 void EntityGUI_SketcherDlg::ActivateThisDialog()
993 myGeometryGUI->EmitSignalDeactivateDialog();
995 myGeometryGUI->SetActiveDialogBox((QDialog*)this);
997 connect(myGeometryGUI->getApp()->selectionMgr(),
998 SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1000 //myGeometryGUI->SetState( 0 );
1001 globalSelection( GEOM_POINT );
1003 myEditCurrentArgument = Group1Sel->LineEdit1;
1004 myEditCurrentArgument->setFocus();
1006 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
1010 //=================================================================================
1011 // function : enterEvent [REDEFINED]
1013 //=================================================================================
1014 void EntityGUI_SketcherDlg::enterEvent(QEvent* e)
1016 if ( !GroupConstructors->isEnabled())
1017 ActivateThisDialog();
1021 //=================================================================================
1022 // function : closeEvent()
1024 //=================================================================================
1025 void EntityGUI_SketcherDlg::closeEvent(QCloseEvent* e)
1027 //myGeometryGUI->SetState( -1 );
1028 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
1029 QDialog::closeEvent( e );
1033 //=================================================================================
1034 // function : ValueChangedInSpinBox()
1036 //=================================================================================
1037 void EntityGUI_SketcherDlg::ValueChangedInSpinBox(double newValue)
1039 QObject* send = (QObject*)sender();
1040 Standard_Real vx, vy, vz, vs;
1041 vx = vy = vz = vs = 0.0;
1043 if ( send == Group1Spin->SpinBox_DX)
1047 else if ( send == Group2Spin->SpinBox_DX )
1050 vy = Group2Spin->SpinBox_DY->GetValue();
1052 else if ( send == Group2Spin->SpinBox_DY)
1054 vx = Group2Spin->SpinBox_DX->GetValue();
1057 else if ( send == Group3Spin->SpinBox_DX)
1060 vy = Group3Spin->SpinBox_DY->GetValue();
1061 vz = Group3Spin->SpinBox_DZ->GetValue();
1063 else if ( send == Group3Spin->SpinBox_DY)
1065 vx = Group3Spin->SpinBox_DX->GetValue();
1067 vz = Group3Spin->SpinBox_DZ->GetValue();
1069 else if ( send == Group3Spin->SpinBox_DZ)
1071 vx = Group3Spin->SpinBox_DX->GetValue();
1072 vy = Group3Spin->SpinBox_DY->GetValue();
1075 else if ( send == Group4Spin->SpinBox_DX)
1078 vy = Group4Spin->SpinBox_DY->GetValue();
1079 vz = Group4Spin->SpinBox_DZ->GetValue();
1080 vs = Group4Spin->SpinBox_DS->GetValue();
1082 else if ( send == Group4Spin->SpinBox_DY)
1084 vx = Group4Spin->SpinBox_DX->GetValue();
1086 vz = Group4Spin->SpinBox_DZ->GetValue();
1087 vs = Group4Spin->SpinBox_DS->GetValue();
1089 else if ( send == Group4Spin->SpinBox_DZ)
1091 vx = Group4Spin->SpinBox_DX->GetValue();
1092 vy = Group4Spin->SpinBox_DY->GetValue();
1094 vs = Group4Spin->SpinBox_DS->GetValue();
1096 else if ( send == Group4Spin->SpinBox_DS)
1098 vx = Group4Spin->SpinBox_DX->GetValue();
1099 vy = Group4Spin->SpinBox_DY->GetValue();
1100 vz = Group4Spin->SpinBox_DZ->GetValue();
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() )
1109 else if ( Group2Spin->SpinBox_DX ->hasFocus() )
1112 vy = Group2Spin->SpinBox_DY->GetValue();
1114 else if ( Group2Spin->SpinBox_DY->hasFocus() )
1116 vx = Group2Spin->SpinBox_DX->GetValue();
1119 else if ( Group3Spin->SpinBox_DX->hasFocus() )
1122 vy = Group3Spin->SpinBox_DY->GetValue();
1123 vz = Group3Spin->SpinBox_DZ->GetValue();
1125 else if ( Group3Spin->SpinBox_DY->hasFocus() )
1127 vx = Group3Spin->SpinBox_DX->GetValue();
1129 vz = Group3Spin->SpinBox_DZ->GetValue();
1131 else if ( Group3Spin->SpinBox_DZ->hasFocus() )
1133 vx = Group3Spin->SpinBox_DX->GetValue();
1134 vy = Group3Spin->SpinBox_DY->GetValue();
1137 else if ( Group4Spin->SpinBox_DX->hasFocus() )
1140 vy = Group4Spin->SpinBox_DY->GetValue();
1141 vz = Group4Spin->SpinBox_DZ->GetValue();
1142 vs = Group4Spin->SpinBox_DS->GetValue();
1144 else if ( Group4Spin->SpinBox_DY->hasFocus() )
1146 vx = Group4Spin->SpinBox_DX->GetValue();
1148 vz = Group4Spin->SpinBox_DZ->GetValue();
1149 vs = Group4Spin->SpinBox_DS->GetValue();
1151 else if ( Group4Spin->SpinBox_DZ->hasFocus() )
1153 vx = Group4Spin->SpinBox_DX->GetValue();
1154 vy = Group4Spin->SpinBox_DY->GetValue();
1156 vs = Group4Spin->SpinBox_DS->GetValue();
1158 else if ( Group4Spin->SpinBox_DS->hasFocus() )
1160 vx = Group4Spin->SpinBox_DX->GetValue();
1161 vy = Group4Spin->SpinBox_DY->GetValue();
1162 vz = Group4Spin->SpinBox_DZ->GetValue();
1166 if ( myConstructorId == 0 )
1168 if ( mySketchType == PT_ABS)
1173 else if ( mySketchType == PT_RELATIVE)
1178 else if ( mySketchType == DIR_ANGLE_LENGTH)
1183 else if ( mySketchType == DIR_ANGLE_X)
1188 else if ( mySketchType == DIR_ANGLE_Y)
1193 else if ( mySketchType == DIR_PER_LENGTH)
1197 else if ( mySketchType == DIR_PER_X)
1201 else if ( mySketchType == DIR_PER_Y)
1205 else if ( mySketchType == DIR_TAN_LENGTH)
1209 else if ( mySketchType == DIR_TAN_X)
1213 else if ( mySketchType == DIR_TAN_Y)
1217 else if ( mySketchType == DIR_DXDY_LENGTH)
1223 else if ( mySketchType == DIR_DXDY_X)
1229 else if ( mySketchType == DIR_DXDY_Y)
1236 else if ( myConstructorId == 1 )
1238 if ( mySketchType == DIR_ANGLE_LENGTH)
1244 else if ( mySketchType == DIR_PER_LENGTH)
1249 else if ( mySketchType == DIR_TAN_LENGTH)
1254 else if ( mySketchType == DIR_DXDY_LENGTH)
1263 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
1267 //=================================================================================
1268 // function : GetNewCommand()
1269 // purpose : Build the new command with context
1270 //=================================================================================
1271 QString EntityGUI_SketcherDlg::GetNewCommand()
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;
1282 if ( myConstructorId == 0 )
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)
1290 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1291 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1293 if ( mySketchType == DIR_ANGLE_X)
1295 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1296 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1298 if ( mySketchType == DIR_ANGLE_Y)
1300 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1301 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
1303 if ( mySketchType == DIR_PER_LENGTH)
1305 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1306 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1308 if ( mySketchType == DIR_PER_X)
1310 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1311 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1313 if ( mySketchType == DIR_PER_Y)
1315 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1316 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
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)
1326 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1327 myNewCommand = myNewCommand + ":" + "L " + QString::number(myLength);
1329 if ( mySketchType == DIR_DXDY_X)
1331 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1332 myNewCommand = myNewCommand + ":" + "IX " + QString::number(myX);
1334 if ( mySketchType == DIR_DXDY_Y)
1336 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1337 myNewCommand = myNewCommand + ":" + "IY " + QString::number(myY);
1340 else if ( myConstructorId == 1 )
1342 if ( mySketchType == DIR_ANGLE_LENGTH)
1344 myNewCommand = myNewCommand + "R " + QString::number(myAngle);
1345 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1347 if ( mySketchType == DIR_PER_LENGTH)
1349 myNewCommand = myNewCommand + "R " + QString::number(90.0);
1350 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1352 if ( mySketchType == DIR_TAN_LENGTH)
1354 myNewCommand = myNewCommand + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1356 if ( mySketchType == DIR_DXDY_LENGTH)
1358 myNewCommand = myNewCommand + "D " + QString::number(myDX) + " " + QString::number(myDY);
1359 myNewCommand = myNewCommand + ":" + "C " + QString::number(myRadius) + " " + QString::number(myLength);
1362 return myNewCommand;
1365 //=================================================================================
1366 // function : createOperation
1368 //=================================================================================
1369 GEOM::GEOM_IOperations_ptr EntityGUI_SketcherDlg::createOperation()
1371 return getGeomEngine()->GetICurvesOperations( getStudyId() );
1374 //=================================================================================
1375 // function : isValid
1377 //=================================================================================
1378 bool EntityGUI_SketcherDlg::isValid( QString& msg )
1383 //=================================================================================
1384 // function : execute
1386 //=================================================================================
1387 bool EntityGUI_SketcherDlg::execute( ObjectList& objects )
1389 if(mySketchState == FIRST_POINT) {
1394 //Test if the current point is the same as the last one
1395 TopoDS_Shape myShape1, myShape2;
1398 QString Command1 = myCommand.join( "" );
1399 Sketcher_Profile aProfile1 (Command1.ascii());
1400 if(aProfile1.IsDone())
1401 myShape1 = aProfile1.GetShape();
1404 QString Command2 = Command1 + GetNewCommand();
1405 Sketcher_Profile aProfile2 (Command2.ascii());
1406 if(aProfile2.IsDone())
1407 myShape2 = aProfile2.GetShape();
1409 if(myShape2.IsNull()) {
1410 //the current point is the same as the last one
1411 myLastX2 = myLastX1;
1412 myLastY2 = myLastY1;
1415 TopoDS_Vertex V1, V2;
1417 if(myShape1.ShapeType() == TopAbs_VERTEX) {
1418 //the last shape is the first point
1419 pt = BRep_Tool::Pnt(TopoDS::Vertex(myShape1));
1424 TopExp::Vertices(TopoDS::Wire(myShape1), V1, V2);
1425 pt = BRep_Tool::Pnt(V2);
1429 TopExp::Vertices(TopoDS::Wire(myShape2), V1, V2);
1430 pt = BRep_Tool::Pnt(V2);
1437 if( ( mySketchState != FIRST_POINT &&
1438 myLastX1 == myLastX2 && myLastY1 == myLastY2 ) || myIsAllAdded ) {
1439 cmd = myCommand.join( "" );
1441 if ( Group1Sel->isVisible() ) {
1442 Group1Sel->buttonApply->setEnabled(false);
1443 //Group1Sel->buttonApply->setFocus();
1445 if ( Group1Spin->isVisible() ) {
1446 Group1Spin->buttonApply->setEnabled(false);
1447 //Group1Spin->buttonApply->setFocus();
1449 if ( Group2Spin->isVisible() ) {
1450 Group2Spin->buttonApply->setEnabled(false);
1451 //Group2Spin->buttonApply->setFocus();
1453 if ( Group3Spin->isVisible() ) {
1454 Group3Spin->buttonApply->setEnabled(false);
1455 //Group3Spin->buttonApply->setFocus();
1457 if ( Group4Spin->isVisible() ) {
1458 Group4Spin->buttonApply->setEnabled(false);
1459 //Group4Spin->buttonApply->setFocus();
1463 cmd = myCommand.join( "" ) + GetNewCommand();
1465 if ( Group1Sel->isVisible() ) {
1466 Group1Sel->buttonApply->setEnabled(true);
1467 //Group1Sel->buttonApply->setFocus();
1469 if ( Group1Spin->isVisible() ) {
1470 Group1Spin->buttonApply->setEnabled(true);
1471 //Group1Spin->buttonApply->setFocus();
1473 if ( Group2Spin->isVisible() ) {
1474 Group2Spin->buttonApply->setEnabled(true);
1475 //Group2Spin->buttonApply->setFocus();
1477 if ( Group3Spin->isVisible() ) {
1478 Group3Spin->buttonApply->setEnabled(true);
1479 //Group3Spin->buttonApply->setFocus();
1481 if ( Group4Spin->isVisible() ) {
1482 Group4Spin->buttonApply->setEnabled(true);
1483 //Group4Spin->buttonApply->setFocus();
1487 gp_Ax3 myWPlane = myGeometryGUI->GetWorkingPlane();
1488 GEOM::ListOfDouble_var WPlane = new GEOM::ListOfDouble;
1490 WPlane[0] = myWPlane.Location().X();
1491 WPlane[1] = myWPlane.Location().Y();
1492 WPlane[2] = myWPlane.Location().Z();
1494 WPlane[3] = myWPlane.Direction().X();
1495 WPlane[4] = myWPlane.Direction().Y();
1496 WPlane[5] = myWPlane.Direction().Z();
1498 WPlane[6] = myWPlane.XDirection().X();
1499 WPlane[7] = myWPlane.XDirection().Y();
1500 WPlane[8] = myWPlane.XDirection().Z();
1502 GEOM::GEOM_Object_var anObj =
1503 GEOM::GEOM_ICurvesOperations::_narrow( getOperation() )->MakeSketcher( cmd.latin1(), WPlane );
1505 if ( !anObj->_is_nil() )
1506 objects.push_back( anObj._retn() );
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,
1518 const bool activate,
1520 const double lineWidth )
1522 // Set color for preview shape
1523 getDisplayer()->SetColor( Quantity_NOC_RED );
1525 // set width of displayed shape
1526 getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth );
1528 // Disable activation of selection
1529 getDisplayer()->SetToActivate( activate );
1531 // Make a reference to GEOM_Object
1532 getDisplayer()->SetName( myGeometryGUI->getApp()->orb()->object_to_string( object ) );
1534 // Create wire from applayed object
1535 TopoDS_Shape anApplyedWire, aLastSegment;
1536 if ( !createShapes( object, anApplyedWire, aLastSegment ) )
1540 SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire );
1541 if ( aPrs != 0 && !aPrs->IsNull() )
1542 GEOMBase_Helper::displayPreview( aPrs, append, update );
1544 getDisplayer()->SetColor( Quantity_NOC_VIOLET );
1545 aPrs = getDisplayer()->BuildPrs( aLastSegment );
1546 if ( aPrs != 0 && !aPrs->IsNull() )
1547 GEOMBase_Helper::displayPreview( aPrs, append, update );
1549 getDisplayer()->UnsetName();
1551 // Enable activation of displayed objects
1552 getDisplayer()->SetToActivate( true );
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 )
1563 TopoDS_Shape aShape;
1564 if ( !GEOMBase::GetShape( theObject, aShape ) ||
1565 aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX )
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() )
1574 theApplyedWire = aShape;
1578 BRepBuilderAPI_MakeWire aBuilder;
1579 TopExp_Explorer anExp( aShape, TopAbs_EDGE );
1582 TopoDS_Shape anEdge = anExp.Current();
1584 if ( anExp.More() ) // i.e. non-last edge
1585 aBuilder.Add( TopoDS::Edge( anEdge ) );
1588 theLastSegment = anEdge;
1593 if ( aBuilder.IsDone() )
1594 theApplyedWire = aBuilder.Shape();
1599 //=================================================================================
1600 // function : keyPressEvent()
1602 //=================================================================================
1603 void EntityGUI_SketcherDlg::keyPressEvent( QKeyEvent* e )
1605 QDialog::keyPressEvent( e );
1606 if ( e->isAccepted() )
1609 if ( e->key() == Key_F1 )