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);
162 return ( status != AIS_SOD_Error && status != AIS_SOD_AllBad );
166 Selects the detected interactive objects.
167 Calls checkSelection() for checking the status.
169 bool OCCViewer_AISSelector::select ()
171 if ( myAISContext.IsNull() )
174 if ( !myEnableSelection )
177 bool hadSelection = ( myNumSelected > 0 );
179 /* select and send notifications */
180 return checkSelection ( myAISContext->Select(), hadSelection, false );
184 Selects the objects covered by the rectangle.
185 Multiple selection must be enabled to get use of this function.
186 Calls checkSelection() for checking the status.
188 bool OCCViewer_AISSelector::select ( int left, int top, int right, int bottom,
189 const Handle (V3d_View)& view )
191 if ( myAISContext.IsNull() )
194 if ( !myEnableSelection || !myEnableMultipleSelection )
195 return false; /* selection with rectangle is considered as multiple selection */
197 bool hadSelection = ( myNumSelected > 0 );
199 /* select and send notifications */
200 return checkSelection ( myAISContext->Select(left, top, right, bottom, view),
201 hadSelection, false );
205 Adds new selected objects to the objects previously selected.
206 Multiple selection must be enabled to get use of this function.
207 Calls checkSelection() for checking the status.
209 bool OCCViewer_AISSelector::shiftSelect ()
211 if ( myAISContext.IsNull() )
214 if ( !myEnableSelection )
217 bool hadSelection = ( myNumSelected > 0 ); /* something was selected */
218 if ( hadSelection && !myEnableMultipleSelection)
221 /* select and send notifications */
222 return checkSelection ( myAISContext->ShiftSelect(), hadSelection, true );
226 Adds new selected objects covered by the rectangle to the objects
228 Multiple selection must be enabled to get use of this function.
229 Calls checkSelection() for checking the status.
231 bool OCCViewer_AISSelector::shiftSelect ( int left, int top, int right, int bottom,
232 const Handle (V3d_View)& view )
235 if ( myAISContext.IsNull() )
238 if ( !myEnableSelection || !myEnableMultipleSelection )
239 return false; /* selection with rectangle is considered as multiple selection */
241 bool hadSelection = ( myNumSelected > 0 ); /* something was selected */
242 if ( hadSelection && !myEnableMultipleSelection)
245 /* select and send notifications */
246 return checkSelection ( myAISContext->ShiftSelect(left,top,right,bottom, view),
247 hadSelection, true );