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);
820 platform = "winapplication";
822 platform = "application";
825 SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
826 QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
827 arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
828 QObject::tr("BUT_OK"));
832 //=================================================================================
833 // function : ClickOnUndo()
835 //=================================================================================
836 void EntityGUI_SketcherDlg::ClickOnUndo()
838 myUndoCommand.append( myCommand.last() );
839 myCommand.pop_back();
841 if(myCommand.count() == 1) {
842 mySketchState = FIRST_POINT;
844 RadioButton1->setChecked(true);
847 GroupConstructors->setEnabled(false);
848 GroupDest1->setEnabled(false);
849 setEnabledUndo(false);
852 setEnabledRedo(true);
854 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
857 //=================================================================================
858 // function : ClickOnRedo()
860 //=================================================================================
861 void EntityGUI_SketcherDlg::ClickOnRedo()
863 myCommand.append( myUndoCommand.last() );
864 myUndoCommand.pop_back();
866 mySketchState = NEXT_POINT;
868 GroupConstructors->setEnabled(true);
869 GroupDest1->setEnabled(true);
870 setEnabledUndo(true);
872 if(myUndoCommand.count() == 1)
873 setEnabledRedo(false);
875 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
878 //=================================================================================
879 // function : setEnabledUndo()
881 //=================================================================================
882 void EntityGUI_SketcherDlg::setEnabledUndo(bool value)
884 Group1Sel->buttonUndo->setEnabled(value);
885 Group1Spin->buttonUndo->setEnabled(value);
886 Group2Spin->buttonUndo->setEnabled(value);
887 Group3Spin->buttonUndo->setEnabled(value);
888 Group4Spin->buttonUndo->setEnabled(value);
891 //=================================================================================
892 // function : setEnabledRedo()
894 //=================================================================================
895 void EntityGUI_SketcherDlg::setEnabledRedo(bool value)
897 Group1Sel->buttonRedo->setEnabled(value);
898 Group1Spin->buttonRedo->setEnabled(value);
899 Group2Spin->buttonRedo->setEnabled(value);
900 Group3Spin->buttonRedo->setEnabled(value);
901 Group4Spin->buttonRedo->setEnabled(value);
904 //=================================================================================
905 // function : SelectionIntoArgument()
906 // purpose : Called when selection as changed
907 //=================================================================================
908 void EntityGUI_SketcherDlg::SelectionIntoArgument()
910 myEditCurrentArgument->setText("");
914 int nbSel = IObjectCount();
915 if ( nbSel == 1 && myEditCurrentArgument == Group1Sel->LineEdit1 )
917 Standard_Boolean aRes = Standard_False;
918 GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( firstIObject(), aRes );
919 if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
921 if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_VERTEX ) ) {
923 gp_Ax3 aWPlane = myGeometryGUI->GetWorkingPlane();
925 aTrans.SetTransformation(aWPlane);
926 BRepBuilderAPI_Transform aTransformation(aShape, aTrans, Standard_False);
927 aShape = aTransformation.Shape();
930 if ( GEOMBase::VertexToPoint( aShape, aPnt ) ) {
933 Group1Sel->LineEdit1->setText( GEOMBase::GetName( aSelectedObject ) );
939 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
943 //=================================================================================
944 // function : SetEditCurrentArgument()
946 //=================================================================================
947 void EntityGUI_SketcherDlg::SetEditCurrentArgument()
949 if ( sender() == Group1Sel->PushButton1 )
951 myEditCurrentArgument = Group1Sel->LineEdit1;
952 myEditCurrentArgument->setFocus();
954 SelectionIntoArgument();
958 //=================================================================================
959 // function : LineEditReturnPressed()
961 //=================================================================================
962 void EntityGUI_SketcherDlg::LineEditReturnPressed()
964 if ( sender() == Group1Sel->LineEdit1 )
966 myEditCurrentArgument = Group1Sel->LineEdit1;
968 /* User name of object input management */
969 /* If successfull the selection is changed and signal emitted... */
970 /* so SelectionIntoArgument() is automatically called. */
971 const QString objectUserName = myEditCurrentArgument->text();
972 QWidget* thisWidget = (QWidget*)this;
973 if(GEOMBase::SelectionByNameInDialogs(thisWidget, objectUserName, selectedIO()))
974 myEditCurrentArgument->setText(objectUserName);
979 //=================================================================================
980 // function : DeactivateActiveDialog()
982 //=================================================================================
983 void EntityGUI_SketcherDlg::DeactivateActiveDialog()
985 //myGeometryGUI->SetState( -1 );
989 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
990 myGeometryGUI->SetActiveDialogBox(0);
994 //=================================================================================
995 // function : ActivateThisDialog()
997 //=================================================================================
998 void EntityGUI_SketcherDlg::ActivateThisDialog()
1000 myGeometryGUI->EmitSignalDeactivateDialog();
1002 myGeometryGUI->SetActiveDialogBox((QDialog*)this);
1004 connect(myGeometryGUI->getApp()->selectionMgr(),
1005 SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
1007 //myGeometryGUI->SetState( 0 );
1008 globalSelection( GEOM_POINT );
1010 myEditCurrentArgument = Group1Sel->LineEdit1;
1011 myEditCurrentArgument->setFocus();
1013 GEOMBase_Helper::displayPreview(false, true, true, myLineWidth);
1017 //=================================================================================
1018 // function : enterEvent [REDEFINED]
1020 //=================================================================================
1021 void EntityGUI_SketcherDlg::enterEvent(QEvent* e)
1023 if ( !GroupConstructors->isEnabled())
1024 ActivateThisDialog();
1028 //=================================================================================
1029 // function : closeEvent()
1031 //=================================================================================
1032 void EntityGUI_SketcherDlg::closeEvent(QCloseEvent* e)
1034 //myGeometryGUI->SetState( -1 );
1035 disconnect(myGeometryGUI->getApp()->selectionMgr(), 0, this, 0);
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 )
1529 // Set color for preview shape
1530 getDisplayer()->SetColor( Quantity_NOC_RED );
1532 // set width of displayed shape
1533 getDisplayer()->SetWidth( (lineWidth == -1)?myLineWidth:lineWidth );
1535 // Disable activation of selection
1536 getDisplayer()->SetToActivate( activate );
1538 // Make a reference to GEOM_Object
1539 CORBA::String_var objStr = myGeometryGUI->getApp()->orb()->object_to_string( object );
1540 getDisplayer()->SetName( objStr.in() );
1542 // Create wire from applayed object
1543 TopoDS_Shape anApplyedWire, aLastSegment;
1544 if ( !createShapes( object, anApplyedWire, aLastSegment ) )
1548 SALOME_Prs* aPrs = getDisplayer()->BuildPrs( anApplyedWire );
1549 if ( aPrs != 0 && !aPrs->IsNull() )
1550 GEOMBase_Helper::displayPreview( aPrs, append, update );
1552 getDisplayer()->SetColor( Quantity_NOC_VIOLET );
1553 aPrs = getDisplayer()->BuildPrs( aLastSegment );
1554 if ( aPrs != 0 && !aPrs->IsNull() )
1555 GEOMBase_Helper::displayPreview( aPrs, append, update );
1557 getDisplayer()->UnsetName();
1559 // Enable activation of displayed objects
1560 getDisplayer()->SetToActivate( true );
1563 //================================================================
1564 // Function : createShapes
1565 // Purpose : Create applyed wire, and last segment from entry object
1566 //================================================================
1567 bool EntityGUI_SketcherDlg::createShapes( GEOM::GEOM_Object_ptr theObject,
1568 TopoDS_Shape& theApplyedWire,
1569 TopoDS_Shape& theLastSegment )
1571 TopoDS_Shape aShape;
1572 if ( !GEOMBase::GetShape( theObject, aShape ) ||
1573 aShape.ShapeType() != TopAbs_WIRE && aShape.ShapeType() != TopAbs_VERTEX )
1576 if ( Group1Sel->isVisible() && !Group1Sel->buttonApply->isEnabled() ||
1577 Group1Spin->isVisible() && !Group1Spin->buttonApply->isEnabled() ||
1578 Group2Spin->isVisible() && !Group2Spin->buttonApply->isEnabled() ||
1579 Group3Spin->isVisible() && !Group3Spin->buttonApply->isEnabled() ||
1580 Group4Spin->isVisible() && !Group4Spin->buttonApply->isEnabled() )
1582 theApplyedWire = aShape;
1586 BRepBuilderAPI_MakeWire aBuilder;
1587 TopExp_Explorer anExp( aShape, TopAbs_EDGE );
1590 TopoDS_Shape anEdge = anExp.Current();
1592 if ( anExp.More() ) // i.e. non-last edge
1593 aBuilder.Add( TopoDS::Edge( anEdge ) );
1596 theLastSegment = anEdge;
1601 if ( aBuilder.IsDone() )
1602 theApplyedWire = aBuilder.Shape();
1607 //=================================================================================
1608 // function : keyPressEvent()
1610 //=================================================================================
1611 void EntityGUI_SketcherDlg::keyPressEvent( QKeyEvent* e )
1613 QDialog::keyPressEvent( e );
1614 if ( e->isAccepted() )
1617 if ( e->key() == Key_F1 )