1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // GEOM GEOMGUI : GUI for Geometry component
24 // File : MeasureGUI_CreateDimensionDlg.cxx
25 // Author : Anton POLETAEV, Open CASCADE S.A.S.
27 #include "MeasureGUI_CreateDimensionDlg.h"
28 #include "MeasureGUI_DimensionCreateTool.h"
30 #include <GEOM_Constants.h>
31 #include <GeometryGUI.h>
34 #include <GEOMUtils.hxx>
35 #include <GEOMGUI_DimensionProperty.h>
37 #include <LightApp_SelectionMgr.h>
38 #include <SalomeApp_Application.h>
39 #include <SalomeApp_DataObject.h>
40 #include <SalomeApp_Study.h>
41 #include <SOCC_ViewModel.h>
43 #include <SUIT_ViewWindow.h>
44 #include <SUIT_ViewManager.h>
45 #include <SUIT_MessageBox.h>
46 #include <SUIT_ResourceMgr.h>
47 #include <SUIT_Session.h>
48 #include <SUIT_Desktop.h>
50 #include <Aspect_PolygonOffsetMode.hxx>
52 //=================================================================================
53 // function : Constructor
55 //=================================================================================
56 MeasureGUI_CreateDimensionDlg::MeasureGUI_CreateDimensionDlg( const GEOM::GeomObjPtr& theObj,
59 : GEOMBase_Skeleton( theGUI, theParent ),
60 myParentObj( theObj ),
61 myEditingViewer( NULL )
63 setWindowTitle( tr( "CREATE_DIMENSION_TITLE" ) );
65 // init "dimension type" radio buttons
66 QAbstractButton* aTypeButtonLength = mainFrame()->RadioButton1;
67 QAbstractButton* aTypeButtonDiameter = mainFrame()->RadioButton2;
68 QAbstractButton* aTypeButtonAngle = mainFrame()->RadioButton3;
70 mainFrame()->GroupConstructors->setTitle( tr( "DIMENSIONS" ) );
71 aTypeButtonDiameter->setText( tr( "DIAMETER" ) );
72 aTypeButtonLength->setText( tr( "LENGTH" ) );
73 aTypeButtonAngle->setText( tr( "ANGLE" ) );
75 // construct "arguments" pane
76 QGroupBox* aGroupArgs = new QGroupBox( tr( "ARGUMENTS" ), centralWidget() );
77 QVBoxLayout* aGroupArgsLayout = new QVBoxLayout( aGroupArgs );
79 myLengthArgs = new LengthPane ( centralWidget() );
80 myDiameterArgs = new DiameterPane( centralWidget() );
81 myAngleArgs = new AnglePane ( centralWidget() );
83 // connect selector pane signals
84 connect( myLengthArgs, SIGNAL( StartSelection( const QList<TopAbs_ShapeEnum>& ) ),
85 SLOT( OnStartSelection( const QList<TopAbs_ShapeEnum>& ) ) );
86 connect( myDiameterArgs, SIGNAL( StartSelection( const QList<TopAbs_ShapeEnum>& ) ),
87 SLOT( OnStartSelection( const QList<TopAbs_ShapeEnum>& ) ) );
88 connect( myAngleArgs, SIGNAL( StartSelection( const QList<TopAbs_ShapeEnum>& ) ),
89 SLOT( OnStartSelection( const QList<TopAbs_ShapeEnum>& ) ) );
91 connect( myLengthArgs, SIGNAL( StopSelection() ), SLOT( OnStopSelection() ) );
92 connect( myDiameterArgs, SIGNAL( StopSelection() ), SLOT( OnStopSelection() ) );
93 connect( myAngleArgs, SIGNAL( StopSelection() ), SLOT( OnStopSelection( ) ) );
95 connect( myLengthArgs, SIGNAL( SelectionDone() ), SLOT( OnSelectionDone() ) );
96 connect( myDiameterArgs, SIGNAL( SelectionDone() ), SLOT( OnSelectionDone() ) );
97 connect( myAngleArgs, SIGNAL( SelectionDone() ), SLOT( OnSelectionDone() ) );
99 aGroupArgsLayout->addWidget( myLengthArgs );
100 aGroupArgsLayout->addWidget( myDiameterArgs );
101 aGroupArgsLayout->addWidget( myAngleArgs );
103 // construct main layout
104 QVBoxLayout* aCustomWidLayout = new QVBoxLayout( centralWidget() );
105 aCustomWidLayout->setMargin( 0 );
106 aCustomWidLayout->setSpacing( 6 );
107 aCustomWidLayout->addWidget( aGroupArgs );
109 // add visibility rules for structural widgets
110 connect( aTypeButtonLength, SIGNAL( toggled(bool) ), myLengthArgs, SLOT( setVisible(bool) ) );
111 connect( aTypeButtonDiameter, SIGNAL( toggled(bool) ), myDiameterArgs, SLOT( setVisible(bool) ) );
112 connect( aTypeButtonAngle, SIGNAL( toggled(bool) ), myAngleArgs, SLOT( setVisible(bool) ) );
114 // signals and slots connections
115 connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
116 connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
118 // map functional signals
119 myRBGroup->setId( aTypeButtonLength, TypeButtonID_Length );
120 myRBGroup->setId( aTypeButtonDiameter, TypeButtonID_Diameter );
121 myRBGroup->setId( aTypeButtonAngle, TypeButtonID_Angle );
123 connect( this, SIGNAL( constructorsClicked( int ) ), SLOT( ConstructTypeChanged( int ) ) );
124 connect( myLengthArgs, SIGNAL( TabChanged() ), SLOT( OnArgumentTabChanged() ) );
125 connect( myDiameterArgs, SIGNAL( TabChanged() ), SLOT( OnArgumentTabChanged() ) );
126 connect( myAngleArgs, SIGNAL( TabChanged() ), SLOT( OnArgumentTabChanged() ) );
128 myDimensionInteractor = new MeasureGUI_DimensionInteractor( theGUI, theParent );
133 //=================================================================================
134 // function : Destructor
136 //=================================================================================
137 MeasureGUI_CreateDimensionDlg::~MeasureGUI_CreateDimensionDlg()
141 //=================================================================================
142 // function : ActiveArgs
144 //=================================================================================
145 MeasureGUI_CreateDimensionDlg::BaseSelectorPane* MeasureGUI_CreateDimensionDlg::ActiveArgs()
147 switch ( getConstructorId() )
149 case TypeButtonID_Length : return myLengthArgs;
150 case TypeButtonID_Diameter : return myDiameterArgs;
151 case TypeButtonID_Angle : return myAngleArgs;
157 //=================================================================================
158 // function : GenerateName
160 //=================================================================================
161 QString MeasureGUI_CreateDimensionDlg::GenerateName( const QString& thePrefix )
163 QRegExp anExtractIds( "^" + thePrefix + "_([0-9]+)$" );
165 QSet<int> anOccupiedIds;
167 GEOMGUI_DimensionProperty aProp =
168 getStudy()->getObjectProperty( GEOM::sharedPropertiesId(),
169 myParentObj->GetStudyEntry(),
170 GEOM::propertyName( GEOM::Dimensions ),
172 .value<GEOMGUI_DimensionProperty>();
174 // get names and convert to QStrings to perform index matching
175 for( int anIt = 0; anIt < aProp.GetNumber(); ++anIt )
177 if ( anExtractIds.indexIn( aProp.GetName( anIt ) ) == -1 )
182 anOccupiedIds.insert( anExtractIds.cap( 1 ).toInt() );
188 if ( !anOccupiedIds.contains( aSearchId ) )
196 return QString( thePrefix + "_%1" ).arg( aSearchId );
199 //=================================================================================
200 // function : ConstructTypeChanged
202 //=================================================================================
203 void MeasureGUI_CreateDimensionDlg::ConstructTypeChanged( int theType )
205 ActiveArgs()->Reset();
212 case TypeButtonID_Length : aName = GenerateName( tr("NAME_LENGTH") ); break;
213 case TypeButtonID_Diameter : aName = GenerateName( tr("NAME_DIAMETER") ); break;
214 case TypeButtonID_Angle : aName = GenerateName( tr("NAME_ANGLE") ); break;
217 myMainFrame->ResultName->setText( aName );
223 resize( minimumSizeHint() );
226 //=================================================================================
227 // function : OnArgumentTabChanged
229 //=================================================================================
230 void MeasureGUI_CreateDimensionDlg::OnArgumentTabChanged()
236 //=================================================================================
237 // function : OnStartSelection
239 //=================================================================================
240 void MeasureGUI_CreateDimensionDlg::OnStartSelection( const QList<TopAbs_ShapeEnum>& theModes )
246 QList<TopAbs_ShapeEnum>::const_iterator aModeIt = theModes.constBegin();
247 for ( ; aModeIt != theModes.constEnd(); ++aModeIt )
249 localSelection( myParentObj.get(), *aModeIt );
252 mySelectionModes = theModes;
254 connect( myGeomGUI->getApp()->selectionMgr(),
255 SIGNAL( currentSelectionChanged() ),
256 SLOT( SelectionIntoArgument() ) );
259 //=================================================================================
260 // function : OnStopSelection
262 //=================================================================================
263 void MeasureGUI_CreateDimensionDlg::OnStopSelection()
267 disconnect( myGeomGUI->getApp()->selectionMgr(),
268 SIGNAL( currentSelectionChanged() ),
270 SLOT( SelectionIntoArgument() ) );
273 //=================================================================================
274 // function : SelectionIntoArgument
275 // purpose : Handle model selection by active selector pane
276 //=================================================================================
277 void MeasureGUI_CreateDimensionDlg::SelectionIntoArgument()
279 LightApp_SelectionMgr* aSelectionMgr = myGeomGUI->getApp()->selectionMgr();
280 SALOME_ListIO aSelection;
281 aSelectionMgr->selectedObjects( aSelection );
283 if ( aSelection.Extent() != 1 )
285 ActiveArgs()->SelectionIntoArguments( GEOM::GeomObjPtr() );
293 ActiveArgs()->SelectionIntoArguments( getSelected( mySelectionModes ) );
296 //=================================================================================
297 // function : OnSelectionDone
299 //=================================================================================
300 void MeasureGUI_CreateDimensionDlg::OnSelectionDone()
302 // create new dimension presentation
303 myDimension = CreateDimension();
305 if ( myDimension.IsNull() )
307 // can not create preview, repeat selection
308 SUIT_MessageBox::warning( this,
309 tr( "WARNING_TITLE_CANNOT_CREATE_DIMENSION" ),
310 tr( "WARNING_MSG_INVALID_ARGUMENTS" ) );
312 ActiveArgs()->Reset();
317 // show preview of dimension object
318 SUIT_ViewWindow* aViewWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow();
320 SOCC_Prs* aSalomePrs = dynamic_cast<SOCC_Prs*>( ( (SOCC_Viewer*)( aViewWindow->getViewManager()->getViewModel() ) )->CreatePrs( 0 ) );
322 aSalomePrs->AddObject( myDimension );
324 displayPreview( aSalomePrs );
329 //=================================================================================
330 // function : ClickOnOk
332 //=================================================================================
333 void MeasureGUI_CreateDimensionDlg::ClickOnOk()
335 setIsApplyAndClose( true );
336 if ( ClickOnApply() )
342 //=================================================================================
343 // function : ClickOnApply
345 //=================================================================================
346 bool MeasureGUI_CreateDimensionDlg::ClickOnApply()
350 if ( !AddDimensionToOwner() )
355 redisplay( myParentObj.get() );
357 if ( !isApplyAndClose() )
365 //=================================================================================
366 // function : StartLocalEditing
368 //=================================================================================
369 void MeasureGUI_CreateDimensionDlg::StartLocalEditing()
373 myDimensionInteractor->Enable();
375 if ( myDimension.IsNull() )
380 SalomeApp_Application* anApp = myGeomGUI->getApp();
382 SUIT_ViewManager* aViewMgr = anApp->activeViewManager();
384 if ( aViewMgr->getType() != OCCViewer_Viewer::Type() )
389 SOCC_Viewer* anOCCViewer = dynamic_cast<SOCC_Viewer*>( aViewMgr->getViewModel() );
391 myEditingViewer = anOCCViewer;
392 if ( !myEditingViewer )
397 Handle(AIS_InteractiveContext) anAISContext = myEditingViewer->getAISContext();
398 Handle(V3d_Viewer) aViewer3d = myEditingViewer->getViewer3d();
400 aViewer3d->AddZLayer( myEditingLayer );
402 anAISContext->OpenLocalContext( Standard_False, Standard_False );
403 anAISContext->Load( myDimension, AIS_DSM_All );
404 anAISContext->SetZLayer( myDimension, myEditingLayer );
405 anAISContext->Activate( myDimension, AIS_DSM_Line );
406 anAISContext->Activate( myDimension, AIS_DSM_Text );
409 //=================================================================================
410 // function : StopLocalEditing
412 //=================================================================================
413 void MeasureGUI_CreateDimensionDlg::StopLocalEditing()
415 myDimensionInteractor->Disable();
417 if ( !myEditingViewer )
422 Handle(AIS_InteractiveContext) anAISContext = myEditingViewer->getAISContext();
423 Handle(V3d_Viewer) aViewer3d = myEditingViewer->getViewer3d();
425 aViewer3d->RemoveZLayer( myEditingLayer );
426 anAISContext->CloseLocalContext();
428 myEditingViewer = NULL;
431 //=================================================================================
434 //=================================================================================
435 void MeasureGUI_CreateDimensionDlg::Init()
441 myDiameterArgs->setVisible( false );
442 myAngleArgs ->setVisible( false );
443 myLengthArgs ->setVisible( true );
444 myLengthArgs->Reset();
446 myRBGroup->button( TypeButtonID_Length )->click();
449 //=================================================================================
450 // function : CreateDimensionPrs
452 //=================================================================================
453 Handle(AIS_Dimension) MeasureGUI_CreateDimensionDlg::CreateDimension()
455 Handle(AIS_Dimension) aDimensionIO;
457 // prepare dimension styling
458 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
460 QColor aQColor = aResMgr->colorValue ( "Geometry", "dimensions_color", QColor( 0, 255, 0 ) );
461 int aLineWidth = aResMgr->integerValue( "Geometry", "dimensions_line_width", 1 );
462 double aFontHeight = aResMgr->doubleValue ( "Geometry", "dimensions_font_height", 10 );
463 double anArrowLength = aResMgr->doubleValue ( "Geometry", "dimensions_arrow_length", 5 );
464 bool isUnitsShown = aResMgr->booleanValue( "Geometry", "dimensions_show_units", false );
465 QString aUnitsLength = aResMgr->stringValue ( "Geometry", "dimensions_length_units", "m" );
466 QString aUnitsAngle = aResMgr->stringValue ( "Geometry", "dimensions_angle_units", "deg" );
468 MeasureGUI_DimensionCreateTool aTool( myGeomGUI );
470 switch ( getConstructorId() )
472 // create length dimension
473 case TypeButtonID_Length :
475 LengthPane* aLengthPane = qobject_cast<LengthPane*>( ActiveArgs() );
477 switch (aLengthPane->ActiveTab())
479 case LengthPane::TabID_SingleEdge:
481 const GEOM::GeomObjPtr& anEdge = aLengthPane->GetSingleEdge();
483 aDimensionIO = aTool.LengthOnEdge( anEdge );
487 case LengthPane::TabID_TwoPoints:
489 const GEOM::GeomObjPtr& aPoint1 = aLengthPane->GetPoint1();
490 const GEOM::GeomObjPtr& aPoint2 = aLengthPane->GetPoint2();
492 aDimensionIO = aTool.LengthByPoints( aPoint1, aPoint2 );
496 case LengthPane::TabID_ParallelEdges:
498 const GEOM::GeomObjPtr& anEdge1 = aLengthPane->GetEdge1();
499 const GEOM::GeomObjPtr& anEdge2 = aLengthPane->GetEdge2();
501 aDimensionIO = aTool.LengthByParallelEdges( anEdge1, anEdge2 );
508 // create diameter dimension
509 case TypeButtonID_Diameter :
511 DiameterPane* aDiameterPane = qobject_cast<DiameterPane*>( ActiveArgs() );
513 const GEOM::GeomObjPtr& aShape = aDiameterPane->GetShape();
515 aDimensionIO = aTool.Diameter( aShape );
519 // create angle dimension
520 case TypeButtonID_Angle :
522 AnglePane* anAnglePane = qobject_cast<AnglePane*>( ActiveArgs() );
524 switch (ActiveArgs()->ActiveTab())
526 case AnglePane::TabID_TwoEdges:
528 const GEOM::GeomObjPtr& anEdge1 = anAnglePane->GetEdge1();
529 const GEOM::GeomObjPtr& anEdge2 = anAnglePane->GetEdge2();
531 aDimensionIO = aTool.AngleByTwoEdges( anEdge1, anEdge2 );
535 case AnglePane::TabID_ThreePoints:
537 const GEOM::GeomObjPtr& aPoint1 = anAnglePane->GetPoint1();
538 const GEOM::GeomObjPtr& aPoint2 = anAnglePane->GetPoint2();
539 const GEOM::GeomObjPtr& aPoint3 = anAnglePane->GetPoint3();
541 aDimensionIO = aTool.AngleByThreePoints( aPoint1, aPoint2, aPoint3 );
549 if ( aDimensionIO.IsNull() )
554 Quantity_Color aColor( aQColor.redF(), aQColor.greenF(), aQColor.blueF(), Quantity_TOC_RGB );
556 Handle(Prs3d_DimensionAspect) aStyle = new Prs3d_DimensionAspect();
558 aStyle->SetCommonColor( aColor );
559 aStyle->MakeUnitsDisplayed( (Standard_Boolean) isUnitsShown );
560 aStyle->MakeText3d( Standard_True );
561 aStyle->MakeTextShaded( Standard_True );
562 aStyle->TextAspect()->SetHeight( aFontHeight );
563 aStyle->ArrowAspect()->SetLength( anArrowLength );
564 aStyle->LineAspect()->SetWidth( aLineWidth );
565 aDimensionIO->SetDimensionAspect( aStyle );
566 aDimensionIO->SetPolygonOffsets( Aspect_POM_Fill, -1.0, -1.0 );
571 //=================================================================================
572 // class : AddDimensionToOwner
574 //=================================================================================
575 bool MeasureGUI_CreateDimensionDlg::AddDimensionToOwner()
577 if ( myDimension.IsNull() )
583 TopoDS_Shape anParentSh;
584 if ( GEOMBase::GetShape( myParentObj.get(), anParentSh ) )
586 aLCS = GEOMUtils::GetPosition( anParentSh );
589 QString aName = getNewObjectName();
591 SalomeApp_Study* aStudy = getStudy();
593 GEOMGUI_DimensionProperty aProp =
594 aStudy->getObjectProperty( GEOM::sharedPropertiesId(),
595 myParentObj->GetStudyEntry(),
596 GEOM::propertyName( GEOM::Dimensions ),
598 .value<GEOMGUI_DimensionProperty>();
600 // append new dimension record to data
601 aProp.AddRecord( myDimension, aLCS );
602 aProp.SetName( aProp.GetNumber() - 1, aName );
603 aProp.SetVisible( aProp.GetNumber() - 1, true );
605 // store modified property data
606 aStudy->setObjectProperty( GEOM::sharedPropertiesId(),
607 myParentObj->GetStudyEntry(),
608 GEOM::propertyName( GEOM::Dimensions ),
614 /* ------------------------------------------------------------------------------*
616 * Argument shape selector layout *
618 * ------------------------------------------------------------------------------*/
620 //=================================================================================
621 // class : MeasureGUI_CreateDimensionDlg::LengthPane
622 // purpose : Constructor
623 //=================================================================================
624 MeasureGUI_CreateDimensionDlg::LengthPane::LengthPane( QWidget* theParent )
625 : BaseSelectorPane( theParent )
627 myTabs = new QTabWidget( this );
628 mySingleEdgeSelectors = new MeasureGUI_1Sel_Frame( this );
629 myTwoPointsSelectors = new MeasureGUI_2Sel_Frame( this );
630 myParallelEdgesSelectors = new MeasureGUI_2Sel_Frame( this );
632 myTabs->addTab( mySingleEdgeSelectors, MeasureGUI_CreateDimensionDlg::tr( "EDGE_LENGTH" ) );
633 myTabs->addTab( myTwoPointsSelectors, MeasureGUI_CreateDimensionDlg::tr( "TWO_POINTS" ) );
634 myTabs->addTab( myParallelEdgesSelectors, MeasureGUI_CreateDimensionDlg::tr( "PARALLEL_EDGES" ) );
636 mySingleEdgeSelectors->PushButton1->setIcon( mySelectorIcon );
637 mySingleEdgeSelectors->TextLabel1->setText( MeasureGUI_CreateDimensionDlg::tr( "EDGE" ) );
638 mySingleEdgeSelectors->LineEdit1->setReadOnly( true );
640 myTwoPointsSelectors->PushButton1->setIcon( mySelectorIcon );
641 myTwoPointsSelectors->PushButton2->setIcon( mySelectorIcon );
642 myTwoPointsSelectors->TextLabel1->setText( MeasureGUI_CreateDimensionDlg::tr( "POINT_1" ) );
643 myTwoPointsSelectors->TextLabel2->setText( MeasureGUI_CreateDimensionDlg::tr( "POINT_2" ) );
644 myTwoPointsSelectors->LineEdit1->setReadOnly( true );
645 myTwoPointsSelectors->LineEdit2->setReadOnly( true );
647 myParallelEdgesSelectors->PushButton1->setIcon( mySelectorIcon );
648 myParallelEdgesSelectors->PushButton2->setIcon( mySelectorIcon );
649 myParallelEdgesSelectors->TextLabel1 ->setText( MeasureGUI_CreateDimensionDlg::tr( "EDGE_1" ) );
650 myParallelEdgesSelectors->TextLabel2 ->setText( MeasureGUI_CreateDimensionDlg::tr( "EDGE_2" ) );
651 myParallelEdgesSelectors->LineEdit1->setReadOnly( true );
652 myParallelEdgesSelectors->LineEdit2->setReadOnly( true );
654 QVBoxLayout* aLayout = new QVBoxLayout( this );
656 aLayout->setMargin( 0 );
657 aLayout->addWidget( myTabs );
659 SelectionModes anEdgeModes;
660 SelectionModes aPointModes;
661 anEdgeModes << TopAbs_EDGE;
662 aPointModes << TopAbs_VERTEX;
664 SetTabWidget( myTabs );
665 RegisterSelector( mySingleEdgeSelectors->LineEdit1, mySingleEdgeSelectors->PushButton1, anEdgeModes, TabID_SingleEdge );
666 RegisterSelector( myTwoPointsSelectors->LineEdit1, myTwoPointsSelectors->PushButton1, aPointModes, TabID_TwoPoints );
667 RegisterSelector( myTwoPointsSelectors->LineEdit2, myTwoPointsSelectors->PushButton2, aPointModes, TabID_TwoPoints );
668 RegisterSelector( myParallelEdgesSelectors->LineEdit1, myParallelEdgesSelectors->PushButton1, anEdgeModes, TabID_ParallelEdges );
669 RegisterSelector( myParallelEdgesSelectors->LineEdit2, myParallelEdgesSelectors->PushButton2, anEdgeModes, TabID_ParallelEdges );
672 //=================================================================================
673 // class : MeasureGUI_CreateDimensionDlg::DiameterPane
674 // purpose : Constructor
675 //=================================================================================
676 MeasureGUI_CreateDimensionDlg::DiameterPane::DiameterPane( QWidget* theParent )
677 : BaseSelectorPane( theParent )
679 myShapeSelector = new MeasureGUI_1Sel_Frame( this );
680 myShapeSelector->PushButton1->setIcon( mySelectorIcon );
681 myShapeSelector->TextLabel1 ->setText( MeasureGUI_CreateDimensionDlg::tr( "OBJECT" ) );
683 QVBoxLayout* aLayout = new QVBoxLayout( this );
685 aLayout->setMargin( 0 );
686 aLayout->addWidget( myShapeSelector );
688 SelectionModes aDiamModes;
689 aDiamModes << TopAbs_SHAPE
693 RegisterSelector( myShapeSelector->LineEdit1, myShapeSelector->PushButton1, aDiamModes );
696 //=================================================================================
697 // class : MeasureGUI_CreateDimensionDlg::AnglePane
698 // purpose : Constructor
699 //=================================================================================
700 MeasureGUI_CreateDimensionDlg::AnglePane::AnglePane( QWidget* theParent )
701 : BaseSelectorPane( theParent )
703 myTabs = new QTabWidget( this );
704 myTwoEdgesSelectors = new MeasureGUI_2Sel_Frame( this );
705 myThreePointsSelectors = new MeasureGUI_3Sel_Frame( this );
707 myTabs->addTab( myTwoEdgesSelectors, MeasureGUI_CreateDimensionDlg::tr( "TWO_EDGES" ) );
708 myTabs->addTab( myThreePointsSelectors, MeasureGUI_CreateDimensionDlg::tr( "THREE_POINTS" ) );
710 myTwoEdgesSelectors->PushButton1->setIcon( mySelectorIcon );
711 myTwoEdgesSelectors->PushButton2->setIcon( mySelectorIcon );
712 myTwoEdgesSelectors->TextLabel1 ->setText( MeasureGUI_CreateDimensionDlg::tr( "EDGE_1" ) );
713 myTwoEdgesSelectors->TextLabel2 ->setText( MeasureGUI_CreateDimensionDlg::tr( "EDGE_2" ) );
715 myThreePointsSelectors->PushButton1->setIcon( mySelectorIcon );
716 myThreePointsSelectors->PushButton2->setIcon( mySelectorIcon );
717 myThreePointsSelectors->PushButton3->setIcon( mySelectorIcon );
718 myThreePointsSelectors->TextLabel1 ->setText( MeasureGUI_CreateDimensionDlg::tr( "POINT_1" ) );
719 myThreePointsSelectors->TextLabel2 ->setText( MeasureGUI_CreateDimensionDlg::tr( "POINT_2" ) );
720 myThreePointsSelectors->TextLabel3 ->setText( MeasureGUI_CreateDimensionDlg::tr( "POINT_3" ) );
722 QVBoxLayout* aLayout = new QVBoxLayout( this );
724 aLayout->setMargin( 0 );
725 aLayout->addWidget( myTabs );
727 SelectionModes anEdgeModes;
728 SelectionModes aPointModes;
729 anEdgeModes << TopAbs_EDGE;
730 aPointModes << TopAbs_VERTEX;
732 SetTabWidget( myTabs );
733 RegisterSelector( myTwoEdgesSelectors->LineEdit1, myTwoEdgesSelectors->PushButton1, anEdgeModes, TabID_TwoEdges );
734 RegisterSelector( myTwoEdgesSelectors->LineEdit2, myTwoEdgesSelectors->PushButton2, anEdgeModes, TabID_TwoEdges );
735 RegisterSelector( myThreePointsSelectors->LineEdit1, myThreePointsSelectors->PushButton1, aPointModes, TabID_ThreePoints );
736 RegisterSelector( myThreePointsSelectors->LineEdit2, myThreePointsSelectors->PushButton2, aPointModes, TabID_ThreePoints );
737 RegisterSelector( myThreePointsSelectors->LineEdit3, myThreePointsSelectors->PushButton3, aPointModes, TabID_ThreePoints );
740 /* ------------------------------------------------------------------------------*
742 * Argument shape selection logics *
744 * ------------------------------------------------------------------------------*/
746 //=================================================================================
747 // class : MeasureGUI_CreateDimensionDlg::BaseSelectorPane
748 // purpose : Constructor
749 //=================================================================================
750 MeasureGUI_CreateDimensionDlg::BaseSelectorPane::BaseSelectorPane( QWidget* theParent )
751 : QWidget( theParent ),
754 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
755 mySelectorIcon = aResMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) );
758 //=================================================================================
759 // function : BaseSelectorPane::Reset
760 // purpose : Reset selector line edits and controls
761 //=================================================================================
762 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::Reset( bool theOpenDefaultTab )
764 if ( theOpenDefaultTab && myTabs )
766 myTabs->setCurrentIndex( 0 );
769 QMap< int, QList<QLineEdit*> >::iterator aTabsIt = mySelectors.begin();
770 for ( ; aTabsIt != mySelectors.end(); ++aTabsIt )
772 QList<QLineEdit*>& aSelectors = *aTabsIt;
773 QList<QLineEdit*>::iterator aSelectorIt = aSelectors.begin();
774 for ( ; aSelectorIt != aSelectors.end(); ++aSelectorIt )
776 QLineEdit* aSelector = *aSelectorIt;
778 mySelectedShapes[aSelector] = GEOM::GeomObjPtr();
782 QLineEdit* aFirstSelector = mySelectors[ ActiveTab() ].first();
784 mySelectionButtons[aFirstSelector]->click();
787 //=================================================================================
788 // function : BaseSelectorPane::ActiveTab
789 // purpose : Returns active tab
790 //=================================================================================
791 int MeasureGUI_CreateDimensionDlg::BaseSelectorPane::ActiveTab() const
793 return myTabs != NULL ? myTabs->currentIndex() : 0;
796 //=================================================================================
797 // function : BaseSelectorPane::SelectionIntoArgument
798 // purpose : Populates current selector
799 //=================================================================================
800 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::SelectionIntoArguments( const GEOM::GeomObjPtr& theSelected )
802 if ( theSelected.isNull() )
804 myCurrentSelector->clear();
805 mySelectedShapes[myCurrentSelector] = GEOM::GeomObjPtr();
809 QString aName = GEOMBase::GetName( theSelected.get() );
811 myCurrentSelector->setText( aName );
813 mySelectedShapes[myCurrentSelector] = theSelected;
815 // find next empty selector (iterate to the last)
816 QList<QLineEdit*>& aCurrentSelectors = mySelectors[ ActiveTab() ];
817 int aCurrentPos = aCurrentSelectors.indexOf( myCurrentSelector );
818 int aSelectorIt = aCurrentPos + 1;
819 for ( ; aSelectorIt != aCurrentSelectors.size(); ++aSelectorIt )
821 QLineEdit* aNextSelector = aCurrentSelectors[aSelectorIt];
822 if ( mySelectedShapes[aNextSelector].isNull() )
824 mySelectionButtons[aNextSelector]->click();
829 // find next empty selector (itearte from the first)
831 for ( ; aSelectorIt != aCurrentPos; ++aSelectorIt )
833 QLineEdit* aNextSelector = aCurrentSelectors[aSelectorIt];
834 if ( mySelectedShapes[aNextSelector].isNull() )
836 mySelectionButtons[aNextSelector]->click();
841 // stop selector switching
842 myCurrentSelector->setEnabled( false );
843 mySelectionButtons[myCurrentSelector]->setDown( false );
845 // every selector is populated - construct presentation
846 emit StopSelection();
847 emit SelectionDone();
850 //=================================================================================
851 // function : BaseSelectorPane::GetSelection
853 //=================================================================================
854 GEOM::GeomObjPtr MeasureGUI_CreateDimensionDlg::BaseSelectorPane::GetSelection( QLineEdit* theSelector ) const
856 return mySelectedShapes[theSelector];
859 //=================================================================================
860 // function : BaseSelectorPane::OnSelectorClicked
861 // purpose : Handle activation of selector controls pair {edit, button}
862 //=================================================================================
863 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::OnSelectorClicked()
865 // clicked "selector" button
866 QAbstractButton* aSender = qobject_cast<QAbstractButton*>( sender() );
872 // get "selector" controls on the active tab
873 QList<QLineEdit*>& aCurrentSelectors = mySelectors[ ActiveTab() ];
875 // iterate over controls on the tab and process them
876 for ( int aSelectorIt = 0; aSelectorIt < aCurrentSelectors.size(); ++aSelectorIt )
878 QLineEdit* aSelector = aCurrentSelectors[aSelectorIt];
879 QPushButton* aButton = mySelectionButtons[aSelector];
881 bool isClickedOnes = (aButton == aSender);
883 aSelector->setEnabled( isClickedOnes );
887 myCurrentSelector = aSelector;
888 myCurrentSelector->setFocus();
891 aButton->setDown( isClickedOnes );
894 emit StartSelection( mySelectionModes[myCurrentSelector] );
897 //=================================================================================
898 // function : BaseSelectorPane::OnTabChanged
900 //=================================================================================
901 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::OnTabChanged()
903 QList<QLineEdit*>& aSelectors = mySelectors[ ActiveTab() ];
904 QList<QLineEdit*>::iterator aSelectorIt = aSelectors.begin();
905 for ( ; aSelectorIt != aSelectors.end(); ++aSelectorIt )
907 QLineEdit* aSelector = *aSelectorIt;
911 mySelectedShapes[aSelector] = GEOM::GeomObjPtr();
914 QLineEdit* aFirstSelector = mySelectors[ ActiveTab() ].first();
916 mySelectionButtons[aFirstSelector]->click();
921 //=================================================================================
922 // function : BaseSelectorPane::SetTabWidget
924 //=================================================================================
925 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::SetTabWidget( QTabWidget* theTabs )
928 connect( myTabs, SIGNAL( currentChanged( int ) ), this, SLOT( OnTabChanged() ) );
931 //=================================================================================
932 // function : BaseSelectorPane::RegisterSelector
934 //=================================================================================
935 void MeasureGUI_CreateDimensionDlg::BaseSelectorPane::RegisterSelector( QLineEdit* theSelectorEdit,
936 QPushButton* theSelectorButton,
937 const SelectionModes& theSelectorModes,
940 if ( !mySelectors.contains( theTab ) )
942 mySelectors.insert( theTab, QList<QLineEdit*>() );
944 mySelectors[theTab].append( theSelectorEdit );
946 mySelectionButtons[theSelectorEdit] = theSelectorButton;
947 mySelectionModes [theSelectorEdit] = theSelectorModes;
949 connect( theSelectorButton, SIGNAL( clicked() ), this, SLOT( OnSelectorClicked() ) );