1 // Copyright (C) 2007-2016 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, or (at your option) any later version.
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 #include "OCCViewer_AISSelector.h"
25 #include <Basics_OCCTVersion.hxx>
30 OCCViewer_AISSelector::OCCViewer_AISSelector( QObject* parent,
31 const Handle (AIS_InteractiveContext)& aisContext) :
34 myEnableSelection( true ),
35 myEnableMultipleSelection( true )
37 myHilightColor = Quantity_NOC_CYAN1;
38 mySelectColor = Quantity_NOC_GRAY80;
40 setAISContext( aisContext );
46 OCCViewer_AISSelector::~OCCViewer_AISSelector()
51 Enables/disables selection
53 void OCCViewer_AISSelector::enableSelection( bool bEnable )
55 myEnableSelection = bEnable;
59 Enables/disables multiple selection i.e
60 selection of several objects at the same time.
62 void OCCViewer_AISSelector::enableMultipleSelection( bool bEnable )
64 myEnableMultipleSelection = bEnable;
65 if ( bEnable ) myEnableSelection = bEnable;
69 Sets the color to hilight the detected objects
71 void OCCViewer_AISSelector::setHilightColor ( Quantity_NameOfColor color )
73 myHilightColor = color;
74 if ( !myAISContext.IsNull() ) {
75 #if OCC_VERSION_LARGE > 0x07000000
76 const Handle(Graphic3d_HighlightStyle)& hStyle = myAISContext->HighlightStyle();
77 hStyle->SetColor( myHilightColor );
79 myAISContext->SetHilightColor( myHilightColor );
85 Sets the color to display the selected objects
87 void OCCViewer_AISSelector::setSelectColor ( Quantity_NameOfColor color )
89 mySelectColor = color;
90 if ( !myAISContext.IsNull() ) {
91 #if OCC_VERSION_LARGE > 0x07000000
92 const Handle(Graphic3d_HighlightStyle)& sStyle = myAISContext->SelectionStyle();
93 sStyle->SetColor( mySelectColor );
95 myAISContext->SelectionColor( mySelectColor );
101 Sets the interactive context for this selector
103 void OCCViewer_AISSelector::setAISContext ( const Handle (AIS_InteractiveContext)& aisContext )
105 myAISContext = aisContext;
106 if ( ! myAISContext.IsNull() ) {
107 #if OCC_VERSION_LARGE > 0x07000000
108 const Handle(Graphic3d_HighlightStyle)& hStyle = myAISContext->HighlightStyle();
109 const Handle(Graphic3d_HighlightStyle)& sStyle = myAISContext->SelectionStyle();
110 hStyle->SetColor( myHilightColor );
111 sStyle->SetColor( mySelectColor );
113 myAISContext->SetHilightColor( myHilightColor );
114 myAISContext->SelectionColor( mySelectColor );
116 myAISContext->SetSubIntensityColor( Quantity_NOC_CYAN1 );
121 Checks the status of pick and emits 'selSelectionDone' or
122 'selSelectionCancel'.
123 Returns 'true' if no error, 'false' otherwise.
125 bool OCCViewer_AISSelector::checkSelection ( AIS_StatusOfPick status,
129 if ( myAISContext.IsNull() )
132 myNumSelected = myAISContext->NbCurrents(); /* update after the last selection */
134 if ( status == AIS_SOP_NothingSelected && !hadSelection ) {
135 emit selSelectionCancel( addTo );
137 else if ( status == AIS_SOP_NothingSelected && hadSelection ) {
138 emit selSelectionCancel( addTo ); /* unselected now */
140 else if ( status == AIS_SOP_OneSelected || status == AIS_SOP_SeveralSelected )
142 emit selSelectionDone( addTo ); /* selected ( the same object, may be ) */
144 return ( status != AIS_SOP_Error && status != AIS_SOP_NothingSelected );
148 Detects the interactive objects at position (x,y).
149 Returns 'true' if no error, 'false' otherwise.
151 bool OCCViewer_AISSelector::moveTo ( int x, int y, const Handle (V3d_View)& view )
153 if ( myAISContext.IsNull() )
156 if ( !myEnableSelection )
159 AIS_StatusOfDetection status = AIS_SOD_Error;
160 status = myAISContext->MoveTo ( x, y, view, Standard_True );
161 return ( status != AIS_SOD_Error && status != AIS_SOD_AllBad );
165 Selects the detected interactive objects.
166 Calls checkSelection() for checking the status.
168 bool OCCViewer_AISSelector::select ()
170 if ( myAISContext.IsNull() )
173 if ( !myEnableSelection )
176 bool hadSelection = ( myNumSelected > 0 );
178 /* select and send notifications */
179 return checkSelection ( myAISContext->Select( Standard_True ), hadSelection, false );
183 Selects the objects covered by the rectangle.
184 Multiple selection must be enabled to get use of this function.
185 Calls checkSelection() for checking the status.
187 bool OCCViewer_AISSelector::select ( int left, int top, int right, int bottom,
188 const Handle (V3d_View)& view )
190 if ( myAISContext.IsNull() )
193 if ( !myEnableSelection || !myEnableMultipleSelection )
194 return false; /* selection with rectangle is considered as multiple selection */
196 bool hadSelection = ( myNumSelected > 0 );
198 /* select and send notifications */
199 return checkSelection ( myAISContext->Select( left, top, right, bottom, view, Standard_True ),
200 hadSelection, false );
204 Adds new selected objects to the objects previously selected.
205 Multiple selection must be enabled to get use of this function.
206 Calls checkSelection() for checking the status.
208 bool OCCViewer_AISSelector::shiftSelect ()
210 if ( myAISContext.IsNull() )
213 if ( !myEnableSelection )
216 bool hadSelection = ( myNumSelected > 0 ); /* something was selected */
217 if ( hadSelection && !myEnableMultipleSelection)
220 /* select and send notifications */
221 return checkSelection ( myAISContext->ShiftSelect( Standard_True ), hadSelection, true );
225 Adds new selected objects covered by the rectangle to the objects
227 Multiple selection must be enabled to get use of this function.
228 Calls checkSelection() for checking the status.
230 bool OCCViewer_AISSelector::shiftSelect ( int left, int top, int right, int bottom,
231 const Handle (V3d_View)& view )
234 if ( myAISContext.IsNull() )
237 if ( !myEnableSelection || !myEnableMultipleSelection )
238 return false; /* selection with rectangle is considered as multiple selection */
240 bool hadSelection = ( myNumSelected > 0 ); /* something was selected */
241 if ( hadSelection && !myEnableMultipleSelection)
244 /* select and send notifications */
245 return checkSelection ( myAISContext->ShiftSelect( left, top, right, bottom, view, Standard_True ),
246 hadSelection, true );