Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / java / src / SampleAISSelectPackage / SampleAISSelectPackage.cxx
1 #include <SampleAISSelectPackage.hxx>
2 #include <TCollection_AsciiString.hxx>
3 #include <AIS_InteractiveContext.hxx>
4 #include <AIS_InteractiveObject.hxx>
5 #include <AIS_Shape.hxx>
6 #include <User_Cylinder.hxx>
7 #include <BRepPrimAPI_MakeBox.hxx>
8 #include <BRepFilletAPI_MakeFillet.hxx>
9 #include <gp_Pnt.hxx>
10 #include <TopoDS.hxx>
11 #include <TopoDS_Edge.hxx>
12 #include <TopoDS_Face.hxx>
13 #include <TopoDS_Shape.hxx>
14 #include <Geom_Surface.hxx>
15 #include <Geom_Plane.hxx>
16 #include <BRep_Tool.hxx>
17 #include <Quantity_Color.hxx>
18
19 #include <V3d_Viewer.hxx>
20 #include <V3d_View.hxx>
21
22 #ifdef WNT
23 #include <WNT_Window.hxx>
24 #include <Graphic3d_WNTGraphicDevice.hxx>
25 #else
26 #include <Xw_Window.hxx>
27 #include <Graphic3d_GraphicDevice.hxx>
28 #endif
29
30
31
32
33 //===============================================================
34 // Function name: CreateViewer
35 //===============================================================
36  Handle(V3d_Viewer) SampleAISSelectPackage::CreateViewer (const Standard_ExtString aName) 
37 {
38 #ifdef WNT
39 static Handle(Graphic3d_WNTGraphicDevice) defaultDevice;
40     
41   if (defaultDevice.IsNull()) 
42     defaultDevice = new Graphic3d_WNTGraphicDevice();
43   return new V3d_Viewer(defaultDevice, aName);
44 #else
45 static Handle(Graphic3d_GraphicDevice) defaultDevice;
46     
47   if (defaultDevice.IsNull()) 
48     defaultDevice = new Graphic3d_GraphicDevice("");
49   return new V3d_Viewer(defaultDevice, aName);
50 #endif //WNT
51 }
52
53 //===============================================================
54 // Function name: SetWindow
55 //===============================================================
56 void SampleAISSelectPackage::SetWindow (const Handle(V3d_View)& aView,
57                                         const Standard_Integer hiwin,
58                                         const Standard_Integer lowin)
59 {
60 #ifdef WNT
61   Handle(Graphic3d_WNTGraphicDevice) d = 
62     Handle(Graphic3d_WNTGraphicDevice)::DownCast(aView->Viewer()->Device());
63   Handle(WNT_Window) w = new WNT_Window(d,hiwin,lowin);
64 #else
65   Handle(Graphic3d_GraphicDevice) d = 
66     Handle(Graphic3d_GraphicDevice)::DownCast(aView->Viewer()->Device());
67   Handle(Xw_Window) w = new Xw_Window(d,hiwin,lowin,Xw_WQ_3DQUALITY);
68 #endif
69   aView->SetWindow(w);
70 }
71
72
73
74
75 //===============================================================
76 // Function name: DisplayBox
77 //===============================================================
78  void SampleAISSelectPackage::DisplayBox(const Handle(AIS_InteractiveContext)& aContext,
79                                          TCollection_AsciiString& Message) 
80 {
81   aContext->CloseAllContexts();
82   BRepPrimAPI_MakeBox B(gp_Pnt(-400.,-400.,-100.),200.,150.,100.);
83   Handle(AIS_Shape) aBox = new AIS_Shape(B.Shape());
84   aContext->Display(aBox);
85
86   Message = "\
87                 \n\
88 BRepPrimAPI_MakeBox B(gp_Pnt(-400.,-400.,-100.),200.,150.,100.); \n\
89 Handle(AIS_Shape) aBox = new AIS_Shape(B.Shape()); \n\
90 myAISContext->Display(aBox); \n\
91                 \n";
92 }
93
94 //===============================================================
95 // Function name: DisplayCylinder
96 //===============================================================
97  void SampleAISSelectPackage::DisplayCylinder(const Handle(AIS_InteractiveContext)& aContext,
98                                               TCollection_AsciiString& Message) 
99 {
100   aContext->CloseAllContexts();
101   Handle(User_Cylinder) aCyl = new User_Cylinder(100.,200.);
102   aContext->SetDisplayMode(aCyl,1);
103   aContext->Display(aCyl);
104
105   Message = "\
106                 \n\
107 Handle(User_Cylinder) aCyl = new User_Cylinder(100.,200.); \n\
108 myAISContext->SetDisplayMode(aCyl,1); \n\
109 myAISContext->Display(aCyl); \n\
110  \n\
111 NOTE: a User_Cylinder is an object defined by the user. \n\
112 The User_Cylinder class inherits the AIS_InteractiveObject \n\
113 CASCADE class, its usage is the same as an AIS_InteractiveObject. \n\
114                 \n";
115 }
116
117 //===============================================================
118 // Function name: SelectVertices
119 //===============================================================
120  void SampleAISSelectPackage::SelectVertices(const Handle(AIS_InteractiveContext)& aContext,
121                                              TCollection_AsciiString& Message) 
122 {
123   aContext->CloseAllContexts();
124   aContext->OpenLocalContext();
125   aContext->ActivateStandardMode(TopAbs_VERTEX);
126
127   Message = "\
128                 \n\
129 myAISContext->OpenLocalContext(); \n\
130 myAISContext->ActivateStandardMode(TopAbs_VERTEX); \n\
131                 \n";
132 }
133
134 //===============================================================
135 // Function name: SelectEdges
136 //===============================================================
137  void SampleAISSelectPackage::SelectEdges(const Handle(AIS_InteractiveContext)& aContext,
138                                           TCollection_AsciiString& Message) 
139 {
140   aContext->CloseAllContexts();
141   aContext->OpenLocalContext();
142   aContext->ActivateStandardMode(TopAbs_EDGE);
143
144   Message = "\
145                 \n\
146 myAISContext->OpenLocalContext(); \n\
147 myAISContext->ActivateStandardMode(TopAbs_EDGE); \n\
148                 \n";
149 }
150
151 //===============================================================
152 // Function name: SelectFaces
153 //===============================================================
154  void SampleAISSelectPackage::SelectFaces(const Handle(AIS_InteractiveContext)& aContext,
155                                           TCollection_AsciiString& Message) 
156 {
157   aContext->CloseAllContexts();
158   aContext->OpenLocalContext();
159   aContext->ActivateStandardMode(TopAbs_FACE);
160
161   Message = "\
162                 \n\
163 myAISContext->OpenLocalContext(); \n\
164 myAISContext->ActivateStandardMode(TopAbs_FACE); \n\
165                 \n";
166 }
167
168 //===============================================================
169 // Function name: SelectNeutral
170 //===============================================================
171  void SampleAISSelectPackage::SelectNeutral(const Handle(AIS_InteractiveContext)& aContext,
172                                             TCollection_AsciiString& Message) 
173 {
174   aContext->CloseAllContexts();
175
176   Message = "\
177                 \n\
178 myAISContext->CloseAllContexts(); \n\
179                 \n";
180 }
181
182 //===============================================================
183 // Function name: MakeFillet
184 //===============================================================
185  Standard_Integer SampleAISSelectPackage::MakeFillet(const Handle(AIS_InteractiveContext)& aContext,
186                                                      const Standard_Real aValue,
187                                                      TCollection_AsciiString& Message) 
188 {
189   aContext->InitSelected();
190   if(aContext->MoreSelected()) {
191     Handle(AIS_Shape) S = Handle(AIS_Shape)::DownCast(aContext->SelectedInteractive());
192         if(S.IsNull()) {
193                 return 2;
194         }
195     BRepFilletAPI_MakeFillet aFillet(S->Shape());
196
197     for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
198     {
199                 TopoDS_Shape aLocalShape = aContext->SelectedShape();
200                 TopoDS_Edge anEdge;
201                 if(aLocalShape.ShapeType() == TopAbs_EDGE) {
202                         anEdge = TopoDS::Edge(aLocalShape);
203                 }
204         
205                 if (anEdge.IsNull())
206                         return 2;
207                 aFillet.Add(aValue, anEdge);
208         }
209
210     TopoDS_Shape aNewShape;
211     try {
212       aNewShape = aFillet.Shape();
213     }
214     catch(Standard_Failure) {
215       return 1;
216     }
217
218     S->Set(aNewShape);
219     aContext->Redisplay(S);
220
221   Message = "\
222                 \n\
223 Handle(AIS_Shape) S = Handle(AIS_Shape)::DownCast(myAISContext->SelectedInteractive()); \n\
224 BRepFilletAPI_MakeFillet aFillet(S->Shape()); \n\
225  \n\
226 for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected()) \n\
227 { \n\
228   TopoDS_Edge anEdge = TopoDS::Edge(myAISContext->SelectedShape()); \n\
229   aFillet.Add(aValue, anEdge); \n\
230 } \n\
231  \n\
232 TopoDS_Shape aNewShape; \n\
233  \n\
234 aNewShape = aFillet.Shape(); \n\
235  \n\
236 S->Set(aNewShape); \n\
237 myAISContext->Redisplay(S); \n\
238                 \n";
239     return 0;
240   }
241   return 2;
242 }
243
244 //===============================================================
245 // Function name: IsCylinderSelected
246 //===============================================================
247  Standard_Boolean SampleAISSelectPackage::IsCylinderSelected(const Handle(AIS_InteractiveContext)& aContext) 
248 {
249   Standard_Boolean result = Standard_False;
250
251   aContext->InitCurrent();
252   if (aContext->MoreCurrent()) {
253     if (aContext->Current()->IsKind(STANDARD_TYPE(User_Cylinder)))
254       result = Standard_True;
255   }
256
257   return result;
258 }
259
260 //===============================================================
261 // Function name: StartSelectFace
262 //===============================================================
263  void SampleAISSelectPackage::StartSelectFace(const Handle(AIS_InteractiveContext)& aContext) 
264 {
265   aContext->OpenLocalContext();
266   aContext->Activate(aContext->Current(),4);
267 }
268
269 //===============================================================
270 // Function name: GetFaceColor
271 //===============================================================
272  Quantity_Color SampleAISSelectPackage::GetFaceColor(const Handle(AIS_InteractiveContext)& aContext) 
273 {
274   Quantity_Color aColor(Quantity_NOC_WHITE);
275
276   aContext->InitSelected();
277   if (aContext->MoreSelected()) {
278     Handle(AIS_InteractiveObject) Current = aContext->SelectedInteractive();
279     if (Current->HasColor())
280       aColor = aContext->Color(Current);
281   }
282
283   return aColor;
284 }
285
286 //===============================================================
287 // Function name: SetFaceColor
288 //===============================================================
289  void SampleAISSelectPackage::SetFaceColor(const Handle(AIS_InteractiveContext)& aContext,
290                                            const Quantity_Color& aColor,
291                                            TCollection_AsciiString& Message) 
292 {
293   TopoDS_Shape S = aContext->SelectedShape();
294   Handle(Geom_Surface) Surface = BRep_Tool::Surface(TopoDS::Face(S));
295   if (Surface->IsKind(STANDARD_TYPE(Geom_Plane)))
296     Handle(User_Cylinder)::DownCast(aContext->Current())->SetPlanarFaceColor(aColor.Name());
297   else
298     Handle(User_Cylinder)::DownCast(aContext->Current())->SetCylindricalFaceColor(aColor.Name());
299   aContext->Redisplay(aContext->Current());
300
301   Message = "\
302                 \n\
303 TopoDS_Shape S = myAISContext->SelectedShape(); \n\
304 Handle(Geom_Surface) Surface = BRep_Tool::Surface(TopoDS::Face(S)); \n\
305  \n\
306 if (Surface->IsKind(STANDARD_TYPE(Geom_Plane))) \n\
307   Handle(User_Cylinder)::DownCast(myAISContext->Current())->SetPlanarFaceColor(aColor.Name()); \n\
308 else \n\
309   Handle(User_Cylinder)::DownCast(myAISContext->Current())->SetCylindricalFaceColor(aColor.Name()); \n\
310  \n\
311 myAISContext->Redisplay(myAISContext->Current()); \n\
312  \n\
313  \n\
314 NOTE: a User_Cylinder is an object defined by the user. \n\
315 The User_Cylinder class inherits the AIS_InteractiveObject \n\
316 CASCADE class, its usage is the same as an AIS_InteractiveObject. \n\
317 Methods SetPlanarFaceColor and SetCylindricalFaceColor are also \n\
318 defined in the User_Cylinder class. \n\
319                 \n";
320 }
321
322
323 //===============================================================
324 // Function name: EndSelectFace
325 //===============================================================
326  void SampleAISSelectPackage::EndSelectFace(const Handle(AIS_InteractiveContext)& aContext) 
327 {
328   aContext->CloseLocalContext();
329 }