52f99d93 |
1 | // Created on: 2012-02-03 |
2 | // |
3 | // Copyright (c) 2012-2014 OPEN CASCADE SAS |
4 | // |
5 | // This file is part of Open CASCADE Technology software library. |
6 | // |
7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
11 | // distribution for complete text of the license and disclaimer of any warranty. |
12 | // |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
15 | |
52f99d93 |
16 | #ifdef _WIN32 |
12e6d499 |
17 | #include <windows.h> |
18 | #include <WNT_WClass.hxx> |
19 | #include <WNT_Window.hxx> |
52f99d93 |
20 | #endif |
21 | |
22 | #include <Draw.hxx> |
23 | #include <Draw_Interpretor.hxx> |
24 | #include <Draw_PluginMacro.hxx> |
25 | #include <TCollection_AsciiString.hxx> |
26 | #include <TopoDS_Shape.hxx> |
27 | #include <BRep_Builder.hxx> |
28 | #include <BRepTools.hxx> |
29 | #include <DBRep.hxx> |
30 | #include <NCollection_DoubleMap.hxx> |
31 | #include <NCollection_List.hxx> |
32 | #include <NCollection_DataMap.hxx> |
33 | #include <TopTools_DataMapOfIntegerShape.hxx> |
34 | #include <OpenGl_GraphicDriver.hxx> |
12e6d499 |
35 | #include <V3d.hxx> |
36 | #include <V3d_TypeOfOrientation.hxx> |
52f99d93 |
37 | #include <Aspect_DisplayConnection.hxx> |
38 | |
39 | #include <IVtk_Types.hxx> |
40 | #include <IVtkVTK_ShapeData.hxx> |
41 | #include <IVtkOCC_Shape.hxx> |
42 | #include <IVtkOCC_ShapeMesher.hxx> |
43 | #include <IVtkTools_ShapeDataSource.hxx> |
44 | #include <IVtkTools_ShapeObject.hxx> |
45 | #include <IVtkTools_SubPolyDataFilter.hxx> |
46 | #include <IVtkTools_DisplayModeFilter.hxx> |
47 | #include <IVtkTools_ShapePicker.hxx> |
48 | |
49 | #include <IVtkDraw.hxx> |
50 | #include <IVtkDraw_HighlightAndSelectionPipeline.hxx> |
51 | #include <IVtkDraw_Interactor.hxx> |
52 | |
a9660929 |
53 | // prevent disabling some MSVC warning messages by VTK headers |
8e16477b |
54 | #include <Standard_WarningsDisable.hxx> |
52f99d93 |
55 | #include <vtkAlgorithmOutput.h> |
56 | #include <vtkAppendPolyData.h> |
57 | #include <vtkBMPWriter.h> |
58 | #include <vtkCamera.h> |
59 | #include <vtkCellData.h> |
60 | #include <vtkCommand.h> |
61 | #include <vtkGeometryFilter.h> |
62 | #include <vtkIdTypeArray.h> |
63 | #include <vtkImageResize.h> |
64 | #include <vtkImageWriter.h> |
65 | #include <vtkInteractorStyleTrackballCamera.h> |
66 | #include <vtkJPEGWriter.h> |
67 | #include <vtkPNGWriter.h> |
68 | #include <vtkPNMWriter.h> |
69 | #include <vtkPolyDataMapper.h> |
70 | #include <vtkProperty.h> |
71 | #include <vtkRenderWindow.h> |
72 | #include <vtkRenderer.h> |
73 | #include <vtkRenderWindowInteractor.h> |
74 | #include <vtkSmartPointer.h> |
75 | #include <vtkTIFFWriter.h> |
76 | #include <vtkWindowToImageFilter.h> |
52f99d93 |
77 | #ifndef _WIN32 |
12e6d499 |
78 | #include <X11/X.h> |
79 | #include <X11/Shell.h> |
80 | #include <X11/Xlib.h> |
81 | #include <X11/Xutil.h> |
82 | #include <GL/glx.h> |
83 | #include <Xw_Window.hxx> |
84 | #include <vtkXRenderWindowInteractor.h> |
85 | #include <vtkXOpenGLRenderWindow.h> |
86 | #include <tk.h> |
52f99d93 |
87 | #endif |
8e16477b |
88 | #include <Standard_WarningsRestore.hxx> |
52f99d93 |
89 | |
12e6d499 |
90 | #if (VTK_MAJOR_VERSION > 8) || (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 1) |
91 | #define HAVE_VTK_SRGB |
52f99d93 |
92 | #endif |
93 | |
94 | //================================================================ |
95 | // TYPE DEFINITIONS |
96 | //================================================================ |
97 | |
98 | typedef NCollection_DoubleMap<TopoDS_Shape, TCollection_AsciiString> DoubleMapOfShapesAndNames; |
99 | typedef NCollection_DoubleMap<vtkSmartPointer<vtkActor>, TCollection_AsciiString> DoubleMapOfActorsAndNames; |
100 | |
101 | typedef IVtkDraw_HighlightAndSelectionPipeline PipelinePtr; |
52f99d93 |
102 | |
103 | //================================================================ |
104 | // GLOBAL VARIABLES |
105 | //================================================================ |
106 | |
107 | Standard_IMPORT Standard_Boolean Draw_VirtualWindows; |
108 | |
109 | static Handle(Aspect_DisplayConnection)& GetDisplayConnection() |
110 | { |
111 | static Handle(Aspect_DisplayConnection) aDisplayConnection; |
112 | return aDisplayConnection; |
113 | } |
114 | |
115 | static void SetDisplayConnection (const Handle(Aspect_DisplayConnection)& theDisplayConnection) |
116 | { |
117 | GetDisplayConnection() = theDisplayConnection; |
118 | } |
119 | |
120 | static DoubleMapOfShapesAndNames& GetMapOfShapes() |
121 | { |
122 | static DoubleMapOfShapesAndNames aMap; |
123 | return aMap; |
124 | } |
125 | |
126 | static DoubleMapOfActorsAndNames& GetMapOfActors() |
127 | { |
128 | static DoubleMapOfActorsAndNames aMap; |
129 | return aMap; |
130 | } |
131 | |
132 | static vtkSmartPointer<vtkRenderer>& GetRenderer() |
133 | { |
134 | static vtkSmartPointer<vtkRenderer> aRenderer; |
135 | return aRenderer; |
136 | } |
137 | |
138 | static Handle(ShapePipelineMap)& GetPipelines() |
139 | { |
140 | static Handle(ShapePipelineMap) aPLMap; |
141 | if (aPLMap.IsNull()) |
142 | { |
143 | aPLMap = new ShapePipelineMap(); |
144 | } |
145 | |
146 | return aPLMap; |
147 | } |
148 | |
149 | static Handle(PipelinePtr) GetPipeline (const IVtk_IdType& theShapeID) |
150 | { |
151 | Handle(PipelinePtr) aPtr; |
152 | GetPipelines()->Find (theShapeID, aPtr); |
153 | return aPtr; |
154 | } |
155 | |
156 | //! Get VTK render pipeline with shape ID got from actor. |
157 | static Handle(PipelinePtr) PipelineByActor (const vtkSmartPointer<vtkActor>& theActor) |
158 | { |
159 | IVtk_IdType aShapeID = IVtkTools_ShapeObject::GetShapeSource (theActor)->GetShape()->GetId(); |
160 | return GetPipeline (aShapeID); |
161 | } |
162 | |
163 | //! Get VTK render pipeline with actor that has the input name. |
164 | static Handle(PipelinePtr) PipelineByActorName (const TCollection_AsciiString& theName) |
165 | { |
166 | const vtkSmartPointer<vtkActor>& anActor = GetMapOfActors().Find2 (theName); |
167 | return PipelineByActor (anActor); |
168 | } |
169 | |
52f99d93 |
170 | #ifdef _WIN32 |
171 | |
172 | static Handle(WNT_Window)& GetWindow() |
173 | { |
174 | static Handle(WNT_Window) aWindow; |
175 | return aWindow; |
176 | } |
177 | |
178 | #else |
179 | |
180 | static Handle(Xw_Window)& GetWindow() |
181 | { |
182 | static Handle(Xw_Window) aXWWin; |
183 | return aXWWin; |
184 | } |
185 | |
186 | #endif |
187 | |
188 | static vtkSmartPointer<IVtkDraw_Interactor>& GetInteractor() |
189 | { |
190 | static vtkSmartPointer<IVtkDraw_Interactor> anInteractor; |
191 | return anInteractor; |
192 | } |
193 | |
194 | static vtkSmartPointer<IVtkTools_ShapePicker>& GetPicker() |
195 | { |
196 | static vtkSmartPointer<IVtkTools_ShapePicker> aPicker; |
197 | return aPicker; |
198 | } |
199 | |
200 | //! Generate identical number for shape |
201 | Standard_Integer GenerateId() |
202 | { |
203 | static unsigned int aShapesCounter = (unsigned int )-1; |
204 | return (Standard_Integer )++aShapesCounter; |
205 | } |
206 | |
207 | //========================================================= |
208 | // Function : WClass |
209 | // Purpose : |
210 | //========================================================= |
1bd04b5a |
211 | const Handle(WNT_WClass)& IVtkDraw::WClass() |
52f99d93 |
212 | { |
1bd04b5a |
213 | static Handle(WNT_WClass) aWindowClass; |
bd6c4619 |
214 | #ifdef _WIN32 |
52f99d93 |
215 | if (aWindowClass.IsNull()) |
216 | { |
1bd04b5a |
217 | aWindowClass = new WNT_WClass ("GWVTK_Class", NULL, |
52f99d93 |
218 | CS_VREDRAW | CS_HREDRAW, 0, 0, |
ad03c234 |
219 | ::LoadCursorW (NULL, IDC_ARROW)); |
52f99d93 |
220 | } |
221 | #endif |
222 | return aWindowClass; |
223 | } |
224 | |
225 | //============================================================== |
226 | // Function : ViewerInit |
12e6d499 |
227 | // Purpose : |
52f99d93 |
228 | //============================================================== |
12e6d499 |
229 | void IVtkDraw::ViewerInit (const IVtkWinParams& theParams) |
52f99d93 |
230 | { |
12e6d499 |
231 | Standard_Integer aPxLeft = 0, aPxTop = 460; |
232 | Standard_Integer aPxWidth = 409, aPxHeight = 409; |
233 | if (theParams.TopLeft.x() != 0) |
52f99d93 |
234 | { |
12e6d499 |
235 | aPxLeft = theParams.TopLeft.x(); |
52f99d93 |
236 | } |
12e6d499 |
237 | if (theParams.TopLeft.y() != 0) |
52f99d93 |
238 | { |
12e6d499 |
239 | aPxTop = theParams.TopLeft.y(); |
52f99d93 |
240 | } |
12e6d499 |
241 | if (theParams.Size.x() != 0) |
52f99d93 |
242 | { |
12e6d499 |
243 | aPxWidth = theParams.Size.x(); |
52f99d93 |
244 | } |
12e6d499 |
245 | if (theParams.Size.y() != 0) |
52f99d93 |
246 | { |
12e6d499 |
247 | aPxHeight = theParams.Size.y(); |
52f99d93 |
248 | } |
12e6d499 |
249 | |
250 | if (!GetRenderer()) |
52f99d93 |
251 | { |
252 | SetDisplayConnection (new Aspect_DisplayConnection ()); |
bd6c4619 |
253 | #ifdef _WIN32 |
52f99d93 |
254 | if (GetWindow().IsNull()) |
255 | { |
1bd04b5a |
256 | GetWindow() = new WNT_Window ("IVtkTest", WClass(), |
52f99d93 |
257 | WS_OVERLAPPEDWINDOW, |
258 | aPxLeft, aPxTop, |
259 | aPxWidth, aPxHeight, |
260 | Quantity_NOC_BLACK); |
261 | GetWindow()->SetVirtual (Draw_VirtualWindows); |
262 | } |
263 | #else |
264 | |
265 | if (GetWindow().IsNull()) |
266 | { |
267 | GetWindow() = new Xw_Window (GetDisplayConnection(), |
268 | "IVtkTest", |
269 | aPxLeft, aPxTop, |
270 | aPxWidth, aPxHeight); |
271 | GetWindow()->SetVirtual (Draw_VirtualWindows); |
272 | } |
273 | #endif |
274 | // Init pipeline |
275 | GetRenderer() = vtkSmartPointer<vtkRenderer>::New(); |
276 | |
277 | vtkSmartPointer<vtkRenderWindow> aRenWin = vtkSmartPointer<vtkRenderWindow>::New(); |
278 | aRenWin->AddRenderer (GetRenderer()); |
279 | GetRenderer()->GetActiveCamera()->ParallelProjectionOn(); |
280 | aRenWin->SetSize (aPxWidth, aPxHeight); |
281 | |
12e6d499 |
282 | aRenWin->SetMultiSamples (theParams.NbMsaaSample); |
283 | aRenWin->SetAlphaBitPlanes (1); |
284 | #ifdef HAVE_VTK_SRGB |
285 | aRenWin->SetUseSRGBColorSpace (theParams.UseSRGBColorSpace); |
286 | #else |
287 | if (theParams.UseSRGBColorSpace) |
288 | { |
289 | Message::SendWarning() << "Warning: skipped option -srgb unsupported by old VTK"; |
290 | } |
291 | #endif |
292 | |
bd6c4619 |
293 | #ifdef _WIN32 |
52f99d93 |
294 | aRenWin->SetWindowId((void*)GetWindow()->HWindow()); |
295 | #else |
296 | Window aWindowId = GetWindow()->XWindow(); |
297 | aRenWin->SetWindowId ((void*)aWindowId); |
298 | Display *aDisplayId = GetDisplayConnection()->GetDisplay(); |
299 | aRenWin->SetDisplayId (aDisplayId); |
300 | |
301 | // Setup XWindow |
302 | XSynchronize (aDisplayId, 1); |
303 | GetWindow()->Map(); |
304 | |
305 | // X11 : For keyboard on SUN |
306 | XWMHints wmhints; |
307 | wmhints.flags = InputHint; |
308 | wmhints.input = 1; |
309 | |
310 | XSetWMHints (aDisplayId, aWindowId, &wmhints); |
311 | |
312 | XSelectInput (aDisplayId, aWindowId, ExposureMask | KeyPressMask | |
313 | ButtonPressMask | ButtonReleaseMask | |
314 | StructureNotifyMask | |
315 | PointerMotionMask | |
316 | Button1MotionMask | Button2MotionMask | |
317 | Button3MotionMask |
318 | ); |
319 | |
320 | XSynchronize (aDisplayId, 0); |
321 | |
322 | #endif |
323 | |
324 | // Init interactor |
325 | GetInteractor() = vtkSmartPointer<IVtkDraw_Interactor>::New(); |
326 | GetInteractor()->SetRenderWindow (aRenWin); |
327 | GetInteractor()->SetOCCWindow (GetWindow()); |
328 | |
329 | vtkSmartPointer<vtkInteractorStyleTrackballCamera> |
330 | aStyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); |
331 | GetInteractor()->SetInteractorStyle (aStyle); |
332 | |
333 | // Init picker |
334 | GetPicker() = vtkSmartPointer<IVtkTools_ShapePicker>::New(); |
896faa72 |
335 | GetPicker()->SetTolerance (0.025f); |
52f99d93 |
336 | GetPicker()->SetRenderer (GetRenderer()); |
337 | |
338 | GetInteractor()->SetShapePicker (GetPicker()); |
339 | GetInteractor()->SetPipelines (GetPipelines()); |
340 | GetInteractor()->Initialize(); |
341 | |
342 | aRenWin->SetOffScreenRendering(Draw_VirtualWindows); |
343 | aRenWin->Render(); |
52f99d93 |
344 | } |
345 | |
346 | GetWindow()->Map(); |
347 | } |
348 | |
349 | //================================================================ |
350 | // Function : VtkInit |
351 | // Purpose : |
352 | //================================================================ |
353 | static Standard_Integer VtkInit (Draw_Interpretor& , |
12e6d499 |
354 | Standard_Integer theNbArgs, |
355 | const char** theArgVec) |
52f99d93 |
356 | { |
12e6d499 |
357 | bool hasSize = false; |
358 | IVtkDraw::IVtkWinParams aParams; |
359 | for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) |
360 | { |
361 | TCollection_AsciiString anArg (theArgVec[anArgIter]); |
362 | anArg.LowerCase(); |
363 | if (anArg == "-msaa" |
364 | && anArgIter + 1 < theNbArgs) |
365 | { |
366 | aParams.NbMsaaSample = Draw::Atoi (theArgVec[++anArgIter]); |
367 | } |
368 | else if (anArg == "-srgb") |
369 | { |
370 | aParams.UseSRGBColorSpace = true; |
371 | if (anArgIter + 1 < theNbArgs |
372 | && Draw::ParseOnOff (theArgVec[anArgIter + 1], aParams.UseSRGBColorSpace)) |
373 | { |
374 | ++anArgIter; |
375 | } |
376 | } |
377 | else if (!hasSize |
378 | && anArgIter + 3 < theNbArgs) |
379 | { |
380 | aParams.TopLeft.SetValues (Draw::Atoi (theArgVec[anArgIter + 0]), |
381 | Draw::Atoi (theArgVec[anArgIter + 1])); |
382 | aParams.Size .SetValues (Draw::Atoi (theArgVec[anArgIter + 2]), |
383 | Draw::Atoi (theArgVec[anArgIter + 3])); |
384 | } |
385 | else |
386 | { |
387 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
388 | return 1; |
389 | } |
390 | } |
52f99d93 |
391 | |
12e6d499 |
392 | IVtkDraw::ViewerInit (aParams); |
393 | return 0; |
394 | } |
395 | |
396 | //================================================================ |
397 | // Function : VtkClose |
398 | // Purpose : |
399 | //================================================================ |
400 | static Standard_Integer VtkClose (Draw_Interpretor& , |
401 | Standard_Integer theNbArgs, |
402 | const char** ) |
403 | { |
404 | if (theNbArgs > 1) |
405 | { |
406 | Message::SendFail() << "Syntax error: wrong number of arguments"; |
407 | return 1; |
408 | } |
409 | |
410 | if (GetWindow()) |
411 | { |
412 | GetWindow()->Unmap(); |
413 | } |
414 | |
415 | GetWindow().Nullify(); |
416 | if (GetInteractor()) |
417 | { |
418 | GetInteractor()->GetRenderWindow()->Finalize(); |
419 | //GetInteractor()->SetRenderWindow (NULL); |
420 | GetInteractor()->TerminateApp(); |
421 | } |
422 | |
423 | GetInteractor() = NULL; |
424 | GetRenderer() = NULL; |
425 | GetPicker() = NULL; |
426 | return 0; |
427 | } |
428 | |
429 | //================================================================ |
430 | // Function : VtkRenderParams |
431 | // Purpose : |
432 | //================================================================ |
433 | static Standard_Integer VtkRenderParams (Draw_Interpretor& , |
434 | Standard_Integer theNbArgs, |
435 | const char** theArgVec) |
436 | { |
437 | if (!GetInteractor() |
438 | || !GetInteractor()->IsEnabled()) |
439 | { |
440 | Message::SendFail() << "Syntax error: call ivtkinit before"; |
441 | return 1; |
442 | } |
443 | else if (theNbArgs <= 1) |
444 | { |
445 | Message::SendFail() << "Syntax error: wrong number of arguments"; |
446 | return 1; |
447 | } |
448 | |
449 | for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) |
450 | { |
451 | TCollection_AsciiString anArg (theArgVec[anArgIter]); |
452 | anArg.LowerCase(); |
453 | if (anArg == "-depthpeeling" |
454 | && anArgIter + 1 < theNbArgs) |
455 | { |
456 | Standard_Integer aNbLayers = Draw::Atoi (theArgVec[++anArgIter]); |
457 | GetRenderer()->SetUseDepthPeeling (aNbLayers > 0); |
458 | GetRenderer()->SetMaximumNumberOfPeels (aNbLayers); |
459 | } |
460 | else if (anArg == "-shadows") |
461 | { |
462 | bool toUseShadows = true; |
463 | if (anArgIter + 1 < theNbArgs |
464 | && Draw::ParseOnOff (theArgVec[anArgIter + 1], toUseShadows)) |
465 | { |
466 | ++anArgIter; |
467 | } |
468 | #if (VTK_MAJOR_VERSION >= 7) |
469 | GetRenderer()->SetUseShadows (toUseShadows); |
470 | #else |
471 | Message::SendWarning() << "Warning: skipped option -shadows unsupported by old VTK"; |
472 | #endif |
473 | } |
474 | else |
475 | { |
476 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
477 | return 1; |
478 | } |
479 | } |
480 | |
481 | GetInteractor()->GetRenderWindow()->Render(); |
52f99d93 |
482 | return 0; |
483 | } |
484 | |
485 | |
486 | //================================================================ |
487 | // Function : CreateActor |
488 | // Purpose : |
489 | //================================================================ |
490 | vtkActor* CreateActor (const Standard_Integer theId, |
491 | const TopoDS_Shape& theShape) |
492 | { |
493 | if ( theShape.IsNull() ) |
494 | { |
495 | return NULL; |
496 | } |
497 | |
498 | Handle(PipelinePtr) aPL = new PipelinePtr (theShape, theId); |
499 | GetPipelines()->Bind (theId, aPL); |
500 | |
501 | return aPL->Actor(); |
502 | } |
503 | |
504 | //================================================================ |
505 | // Function : VtkDisplay |
506 | // Purpose : |
507 | //================================================================ |
508 | |
12e6d499 |
509 | static Standard_Integer VtkDisplay (Draw_Interpretor& , |
52f99d93 |
510 | Standard_Integer theArgNum, |
511 | const char** theArgs) |
512 | { |
12e6d499 |
513 | if (!GetInteractor() |
514 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
515 | { |
12e6d499 |
516 | Message::SendFail() << "Error : call ivtkinit before"; |
517 | return 1; |
52f99d93 |
518 | } |
52f99d93 |
519 | if (theArgNum < 2) |
520 | { |
12e6d499 |
521 | Message::SendFail() << "Error : expects at least 1 argument\n"; |
522 | return 1; |
52f99d93 |
523 | } |
524 | |
525 | TCollection_AsciiString aName; |
526 | TopoDS_Shape anOldShape, aNewShape; |
a2f76b15 |
527 | vtkSmartPointer<vtkRenderer>& aRenderer = GetRenderer(); |
52f99d93 |
528 | for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex) |
529 | { |
530 | // Get name of shape |
531 | aName = theArgs[anIndex]; |
532 | // Get shape from DRAW |
533 | aNewShape = DBRep::Get (theArgs[anIndex]); |
534 | |
535 | // The shape is already in the map |
536 | if (GetMapOfShapes().IsBound2 (aName)) |
537 | { |
538 | // Get shape from map |
539 | anOldShape = GetMapOfShapes().Find2 (aName); |
540 | // Equal shapes |
541 | if (anOldShape.IsEqual (aNewShape)) |
542 | { |
543 | // Get actor from map and display it |
544 | PipelineByActorName (aName)->AddToRenderer (aRenderer); |
545 | } |
546 | // Different shapes |
547 | else |
548 | { |
549 | if (aNewShape.IsNull()) continue; |
550 | // Create actor from DRAW shape |
551 | vtkActor* anActor = CreateActor (GenerateId(), aNewShape); |
552 | // Remove old actor from render |
553 | PipelineByActorName (aName)->RemoveFromRenderer (aRenderer); |
554 | // Update maps |
555 | GetMapOfShapes().UnBind2 (aName); |
556 | GetMapOfShapes().Bind (aNewShape, aName); |
557 | GetMapOfActors().UnBind2 (aName); |
558 | GetMapOfActors().Bind (anActor, aName); |
559 | // Display new actor |
560 | PipelineByActorName (aName)->AddToRenderer (aRenderer); |
561 | // Compute selection for displayed actors |
562 | GetPicker()->SetSelectionMode (SM_Shape, Standard_True); |
563 | } |
564 | } |
565 | // There is no shape with given name in map |
566 | else |
567 | { |
568 | if (aNewShape.IsNull()) continue; |
569 | // Create actor from DRAW shape |
a2f76b15 |
570 | Standard_Integer anId = GenerateId(); |
571 | vtkSmartPointer<vtkActor> anActor = CreateActor (anId, aNewShape); |
52f99d93 |
572 | // Update maps |
573 | GetMapOfShapes().Bind (aNewShape, aName); |
574 | GetMapOfActors().Bind (anActor, aName); |
575 | // Display actor |
a2f76b15 |
576 | GetPipeline(anId)->AddToRenderer(aRenderer); |
52f99d93 |
577 | |
578 | // Compute selection for displayed actors |
579 | GetPicker()->SetSelectionMode (SM_Shape, Standard_True); |
580 | } |
581 | } |
582 | |
583 | // Redraw window |
584 | aRenderer->ResetCamera(); |
585 | GetInteractor()->GetRenderWindow()->Render(); |
586 | |
587 | return 0; |
588 | } |
589 | |
590 | //================================================================ |
591 | // Function : VtkErase |
592 | // Purpose : |
593 | //================================================================ |
12e6d499 |
594 | static Standard_Integer VtkErase (Draw_Interpretor& , |
52f99d93 |
595 | Standard_Integer theArgNum, |
596 | const char** theArgs) |
597 | { |
12e6d499 |
598 | if (!GetInteractor() |
599 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
600 | { |
12e6d499 |
601 | Message::SendFail() << "Error: call ivtkinit before"; |
602 | return 1; |
52f99d93 |
603 | } |
604 | |
605 | vtkSmartPointer<vtkRenderer> aRenderer = GetRenderer(); |
52f99d93 |
606 | if (theArgNum == 1) |
607 | { |
12e6d499 |
608 | // Erase all objects |
52f99d93 |
609 | DoubleMapOfActorsAndNames::Iterator anIterator (GetMapOfActors()); |
610 | while (anIterator.More()) |
611 | { |
612 | PipelineByActor (anIterator.Key1())->RemoveFromRenderer (aRenderer); |
613 | anIterator.Next(); |
614 | } |
615 | } |
52f99d93 |
616 | else |
617 | { |
12e6d499 |
618 | // Erase named objects |
52f99d93 |
619 | for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex) |
620 | { |
12e6d499 |
621 | TCollection_AsciiString aName = theArgs[anIndex]; |
622 | vtkSmartPointer<vtkActor> anActor; |
623 | if (!GetMapOfActors().Find2 (aName, anActor)) |
52f99d93 |
624 | { |
12e6d499 |
625 | Message::SendFail() << "Syntax error: object '" << aName << "' not found"; |
626 | return 1; |
52f99d93 |
627 | } |
12e6d499 |
628 | |
629 | PipelineByActorName (aName)->RemoveFromRenderer (aRenderer); |
52f99d93 |
630 | } |
631 | } |
632 | |
633 | // Redraw window |
634 | aRenderer->ResetCamera(); |
635 | GetInteractor()->GetRenderWindow()->Render(); |
636 | return 0; |
637 | } |
638 | |
a2f76b15 |
639 | //================================================================ |
640 | // Function : VtkRemove |
641 | // Purpose : Remove the actor from memory. |
642 | //================================================================ |
12e6d499 |
643 | static Standard_Integer VtkRemove (Draw_Interpretor& , |
644 | Standard_Integer theArgNum, |
645 | const char** theArgs) |
a2f76b15 |
646 | { |
12e6d499 |
647 | if (!GetInteractor() |
648 | || !GetInteractor()->IsEnabled()) |
a2f76b15 |
649 | { |
12e6d499 |
650 | Message::SendFail() << "Error: call ivtkinit before"; |
651 | return 1; |
a2f76b15 |
652 | } |
653 | |
654 | vtkSmartPointer<vtkRenderer> aRenderer = GetRenderer(); |
a2f76b15 |
655 | if (theArgNum == 1) |
656 | { |
657 | // Remove all actors from the renderer |
658 | DoubleMapOfActorsAndNames::Iterator anIterator(GetMapOfActors()); |
659 | while (anIterator.More()) |
660 | { |
12e6d499 |
661 | vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc = IVtkTools_ShapeObject::GetShapeSource (anIterator.Key1()); |
662 | if (aSrc.GetPointer() != NULL && !aSrc->GetShape().IsNull()) |
a2f76b15 |
663 | { |
664 | GetPicker()->RemoveSelectableObject(aSrc->GetShape()); |
665 | } |
666 | else |
667 | { |
668 | aRenderer->RemoveActor(anIterator.Key1()); |
669 | } |
670 | anIterator.Next(); |
671 | } |
672 | // Remove all pipelines from the renderer |
673 | for (ShapePipelineMap::Iterator anIt(*GetPipelines()); anIt.More(); anIt.Next()) |
674 | { |
675 | anIt.Value()->RemoveFromRenderer(aRenderer); |
676 | } |
677 | // Clear maps and remove all TopoDS_Shapes, actors and pipelines |
678 | GetMapOfShapes().Clear(); |
679 | GetMapOfActors().Clear(); |
680 | GetPipelines()->Clear(); |
681 | } |
a2f76b15 |
682 | else |
683 | { |
12e6d499 |
684 | // Remove named objects |
a2f76b15 |
685 | for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex) |
686 | { |
12e6d499 |
687 | TCollection_AsciiString aName = theArgs[anIndex]; |
688 | vtkSmartPointer<vtkActor> anActor; |
689 | if (!GetMapOfActors().Find2 (aName, anActor)) |
a2f76b15 |
690 | { |
12e6d499 |
691 | Message::SendFail() << "Syntax error: object '" << aName << "' not found"; |
692 | return 1; |
a2f76b15 |
693 | } |
12e6d499 |
694 | |
695 | // Remove the actor and its pipeline (if found) from the renderer |
696 | vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); |
697 | if (aSrc.GetPointer() != NULL && !aSrc->GetShape().IsNull()) |
698 | { |
699 | IVtk_IdType aShapeID = aSrc->GetShape()->GetId(); |
700 | GetPicker()->RemoveSelectableObject (aSrc->GetShape()); |
701 | GetPipeline (aSrc->GetShape()->GetId())->RemoveFromRenderer (aRenderer); |
0177fe26 |
702 | GetPipelines()->UnBind (aShapeID); // Remove a pipeline |
12e6d499 |
703 | } |
704 | else |
705 | { |
706 | aRenderer->RemoveActor (anActor); |
707 | } |
708 | // Remove the TopoDS_Shape and the actor |
709 | GetMapOfShapes().UnBind2 (aName); // Remove a TopoDS shape |
710 | GetMapOfActors().UnBind2 (aName); // Remove an actor |
a2f76b15 |
711 | } |
712 | } |
713 | |
714 | // Redraw window |
715 | aRenderer->ResetCamera(); |
716 | GetInteractor()->GetRenderWindow()->Render(); |
717 | return 0; |
718 | } |
719 | |
52f99d93 |
720 | //================================================================ |
721 | // Function : VtkSetDisplayMode |
722 | // Purpose : |
723 | // Draw args : ivtksetdispmode [name] mode(0,1) |
724 | //================================================================ |
12e6d499 |
725 | static Standard_Integer VtkSetDisplayMode (Draw_Interpretor& , |
52f99d93 |
726 | Standard_Integer theArgNum, |
727 | const char** theArgs) |
728 | { |
12e6d499 |
729 | if (!GetInteractor() |
730 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
731 | { |
12e6d499 |
732 | Message::SendFail() << "Error: call ivtkinit before"; |
733 | return 1; |
52f99d93 |
734 | } |
12e6d499 |
735 | else if (theArgNum != 2 && theArgNum != 3) |
52f99d93 |
736 | { |
12e6d499 |
737 | Message::SendFail() << "Syntax error: expects 1 or 2 arguments"; |
738 | return 1; |
52f99d93 |
739 | } |
740 | |
52f99d93 |
741 | if (theArgNum == 2) |
742 | { |
12e6d499 |
743 | // Set disp mode for all objects |
744 | Standard_Integer aMode = Draw::Atoi (theArgs[1]); // Get mode |
52f99d93 |
745 | DoubleMapOfActorsAndNames::Iterator anIter (GetMapOfActors()); |
746 | while (anIter.More()) |
747 | { |
12e6d499 |
748 | vtkSmartPointer<vtkActor> anActor = anIter.Key1(); |
52f99d93 |
749 | IVtkTools_ShapeDataSource* aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); |
750 | if (aSrc) |
751 | { |
752 | IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); |
753 | if (!anOccShape.IsNull()) |
754 | { |
755 | IVtkTools_DisplayModeFilter* aFilter = GetPipeline ( anOccShape->GetId() )->GetDisplayModeFilter(); |
756 | aFilter->SetDisplayMode((IVtk_DisplayMode)aMode); |
757 | aFilter->Modified(); |
758 | aFilter->Update(); |
759 | } |
760 | } |
761 | anIter.Next(); |
762 | } |
763 | } |
764 | // Set disp mode for named object |
765 | else |
766 | { |
52f99d93 |
767 | TCollection_AsciiString aName = theArgs[1]; |
12e6d499 |
768 | vtkSmartPointer<vtkActor> anActor; |
769 | if (!GetMapOfActors().Find2 (aName, anActor)) |
52f99d93 |
770 | { |
12e6d499 |
771 | Message::SendFail() << "Syntax error: object '" << aName << "' not found"; |
772 | return 1; |
773 | } |
774 | |
775 | Standard_Integer aMode = atoi(theArgs[2]); |
776 | vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); |
777 | if (aSrc) |
778 | { |
779 | IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); |
780 | if (!anOccShape.IsNull()) |
52f99d93 |
781 | { |
12e6d499 |
782 | IVtkTools_DisplayModeFilter* aFilter = GetPipeline (anOccShape->GetId())->GetDisplayModeFilter(); |
783 | aFilter->SetDisplayMode ((IVtk_DisplayMode)aMode); |
784 | aFilter->Modified(); |
785 | aFilter->Update(); |
52f99d93 |
786 | } |
787 | } |
788 | } |
789 | |
790 | // Redraw window |
791 | GetInteractor()->Render(); |
792 | return 0; |
793 | } |
794 | |
4db6748c |
795 | //================================================================ |
796 | // Function : VtkSetBoundaryDraw |
12e6d499 |
797 | // Purpose : |
4db6748c |
798 | //================================================================ |
12e6d499 |
799 | static Standard_Integer VtkSetBoundaryDraw (Draw_Interpretor& , |
800 | Standard_Integer theArgNum, |
801 | const char** theArgs) |
4db6748c |
802 | { |
12e6d499 |
803 | if (!GetInteractor() |
804 | || !GetInteractor()->IsEnabled()) |
4db6748c |
805 | { |
12e6d499 |
806 | Message::SendFail() << "Error: call ivtkinit before"; |
807 | return 1; |
4db6748c |
808 | } |
12e6d499 |
809 | else if (theArgNum != 2 && theArgNum != 3) |
4db6748c |
810 | { |
12e6d499 |
811 | Message::SendFail() << "Syntax error: expects 1 or 2 arguments"; |
812 | return 1; |
4db6748c |
813 | } |
814 | |
4db6748c |
815 | if (theArgNum == 2) |
816 | { |
12e6d499 |
817 | // Set disp mode for all objects |
818 | Standard_Boolean toDraw = true; |
819 | Draw::ParseOnOff (theArgs[1], toDraw); |
4db6748c |
820 | DoubleMapOfActorsAndNames::Iterator anIter(GetMapOfActors()); |
821 | while (anIter.More()) |
822 | { |
12e6d499 |
823 | vtkSmartPointer<vtkActor> anActor = anIter.Key1(); |
4db6748c |
824 | // Set Red color for boundary edges |
825 | vtkLookupTable* aTable = (vtkLookupTable*)anActor->GetMapper()->GetLookupTable(); |
826 | IVtkTools::SetLookupTableColor(aTable, MT_SharedEdge, 1., 0., 0., 1.); |
827 | |
828 | IVtkTools_ShapeDataSource* aSrc = IVtkTools_ShapeObject::GetShapeSource(anActor); |
829 | if (aSrc) |
830 | { |
831 | IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); |
832 | if (!anOccShape.IsNull()) |
833 | { |
834 | IVtkTools_DisplayModeFilter* aFilter = GetPipeline(anOccShape->GetId())->GetDisplayModeFilter(); |
835 | aFilter->SetDisplayMode(DM_Shading); |
836 | aFilter->SetFaceBoundaryDraw(toDraw != 0); |
837 | aFilter->Modified(); |
838 | aFilter->Update(); |
839 | } |
840 | } |
841 | anIter.Next(); |
842 | } |
843 | } |
4db6748c |
844 | else |
845 | { |
12e6d499 |
846 | // Set disp mode for named object |
4db6748c |
847 | TCollection_AsciiString aName = theArgs[1]; |
12e6d499 |
848 | vtkSmartPointer<vtkActor> anActor; |
849 | if (!GetMapOfActors().Find2 (aName, anActor)) |
4db6748c |
850 | { |
12e6d499 |
851 | Message::SendFail() << "Syntax error: object '" << aName << "' not found"; |
852 | return 1; |
853 | } |
4db6748c |
854 | |
12e6d499 |
855 | Standard_Boolean toDraw = true; |
856 | Draw::ParseOnOff (theArgs[2], toDraw); |
857 | |
858 | // Set Red color for boundary edges |
859 | vtkLookupTable* aTable = (vtkLookupTable*)anActor->GetMapper()->GetLookupTable(); |
860 | IVtkTools::SetLookupTableColor (aTable, MT_SharedEdge, 1., 0., 0., 1.); |
861 | |
862 | vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); |
863 | if (aSrc) |
864 | { |
865 | IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); |
866 | if (!anOccShape.IsNull()) |
4db6748c |
867 | { |
12e6d499 |
868 | IVtkTools_DisplayModeFilter* aFilter = GetPipeline (anOccShape->GetId())->GetDisplayModeFilter(); |
869 | aFilter->SetDisplayMode (DM_Shading); |
870 | aFilter->SetFaceBoundaryDraw (toDraw != 0); |
871 | aFilter->Modified(); |
872 | aFilter->Update(); |
4db6748c |
873 | } |
874 | } |
875 | } |
876 | |
877 | // Redraw window |
878 | GetInteractor()->Render(); |
879 | return 0; |
880 | } |
881 | |
52f99d93 |
882 | //================================================================ |
883 | // Function : VtkSetSelectionMode |
12e6d499 |
884 | // Purpose : |
52f99d93 |
885 | //================================================================ |
12e6d499 |
886 | static Standard_Integer VtkSetSelectionMode (Draw_Interpretor& , |
52f99d93 |
887 | Standard_Integer theArgNum, |
888 | const char** theArgs) |
889 | { |
12e6d499 |
890 | if (!GetInteractor() |
891 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
892 | { |
12e6d499 |
893 | Message::SendFail() << "Error: call ivtkinit before"; |
894 | return 1; |
52f99d93 |
895 | } |
12e6d499 |
896 | else if (theArgNum != 3 && theArgNum != 4) |
52f99d93 |
897 | { |
12e6d499 |
898 | Message::SendFail() << "Syntax error: expects 2 or 3 arguments"; |
899 | return 1; |
52f99d93 |
900 | } |
901 | |
52f99d93 |
902 | if (theArgNum == 3) |
903 | { |
12e6d499 |
904 | // Set sel mode for all objects |
905 | const Standard_Integer aMode = Draw::Atoi (theArgs[1]); |
906 | Standard_Boolean isTurnOn = true; |
907 | if (aMode < 0 || aMode > 8 || !Draw::ParseOnOff (theArgs[2], isTurnOn)) |
52f99d93 |
908 | { |
12e6d499 |
909 | Message::SendFail() << "Syntax error: only 0-8 selection modes are supported"; |
910 | return 1; |
52f99d93 |
911 | } |
912 | DoubleMapOfActorsAndNames::Iterator anIter (GetMapOfActors()); |
913 | while (anIter.More()) |
914 | { |
12e6d499 |
915 | vtkSmartPointer<vtkActor> anActor = anIter.Key1(); |
52f99d93 |
916 | if (aMode == SM_Shape && isTurnOn) |
917 | { |
918 | IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); |
919 | IVtk_SelectionModeList::Iterator anIt (aList); |
920 | // Turn off all sel modes differed from SM_Shape |
921 | while (anIt.More()) |
922 | { |
923 | IVtk_SelectionMode aCurMode = anIt.Value(); |
924 | if (SM_Shape != aCurMode) |
925 | { |
926 | GetPicker()->SetSelectionMode (anActor, aCurMode, Standard_False); |
927 | } |
928 | anIt.Next(); |
929 | } |
930 | GetPicker()->SetSelectionMode (anActor, SM_Shape); |
931 | } |
932 | |
933 | if (aMode != SM_Shape) |
934 | { |
935 | if (isTurnOn) |
936 | { |
937 | GetPicker()->SetSelectionMode (anActor, (IVtk_SelectionMode)aMode); |
938 | GetPicker()->SetSelectionMode (anActor, SM_Shape, Standard_False); |
939 | if (aMode == SM_Vertex) |
940 | { |
941 | GetPipeline( IVtkTools_ShapeObject::GetShapeSource(anActor)->GetShape()->GetId() )->SharedVerticesSelectionOn(); |
942 | } |
943 | } |
944 | else |
945 | { |
946 | GetPicker()->SetSelectionMode (anActor, (IVtk_SelectionMode)aMode, Standard_False); |
947 | IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); |
948 | if (!aList.Size()) |
949 | { |
950 | GetPicker()->SetSelectionMode(anActor, SM_Shape); |
951 | } |
952 | if (aMode == SM_Vertex) |
953 | { |
954 | GetPipeline( IVtkTools_ShapeObject::GetShapeSource(anActor)->GetShape()->GetId() )->SharedVerticesSelectionOff(); |
955 | } |
956 | } |
957 | } |
958 | anIter.Next(); |
959 | } |
960 | } |
961 | |
52f99d93 |
962 | if (theArgNum == 4) |
963 | { |
12e6d499 |
964 | // Set sel mode for named object |
965 | const Standard_Integer aMode = Draw::Atoi (theArgs[2]); |
966 | Standard_Boolean isTurnOn = true; |
967 | if (aMode < 0 || aMode > 8 || !Draw::ParseOnOff (theArgs[3], isTurnOn)) |
52f99d93 |
968 | { |
12e6d499 |
969 | Message::SendFail() << "Syntax error: only 0-8 selection modes are supported"; |
970 | return 1; |
52f99d93 |
971 | } |
972 | |
973 | TCollection_AsciiString aName = theArgs[1]; |
974 | if (GetMapOfActors().IsBound2 (aName)) |
975 | { |
12e6d499 |
976 | vtkSmartPointer<vtkActor> anActor = GetMapOfActors().Find2 (aName); |
52f99d93 |
977 | if (aMode == SM_Shape && isTurnOn) |
978 | { |
979 | IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); |
980 | IVtk_SelectionModeList::Iterator anIt (aList); |
981 | // Turn off all sel modes differed from SM_Shape |
982 | while (anIt.More()) |
983 | { |
984 | IVtk_SelectionMode aCurMode = anIt.Value(); |
985 | if (SM_Shape != aCurMode) |
986 | { |
987 | GetPicker()->SetSelectionMode (anActor, aCurMode, Standard_False); |
988 | } |
989 | anIt.Next(); |
990 | } |
991 | GetPicker()->SetSelectionMode (anActor, SM_Shape); |
992 | } |
993 | |
994 | if (aMode != SM_Shape) |
995 | { |
996 | if (isTurnOn) |
997 | { |
998 | GetPicker()->SetSelectionMode (anActor, (IVtk_SelectionMode)aMode); |
999 | GetPicker()->SetSelectionMode (anActor, SM_Shape, Standard_False); |
1000 | if (aMode == SM_Vertex) |
1001 | { |
1002 | GetPipeline( IVtkTools_ShapeObject::GetShapeSource(anActor)->GetShape()->GetId() )->SharedVerticesSelectionOn(); |
1003 | } |
1004 | } |
1005 | else |
1006 | { |
1007 | GetPicker()->SetSelectionMode (anActor, (IVtk_SelectionMode)aMode, Standard_False); |
1008 | IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); |
1009 | if (!aList.Size()) |
1010 | { |
1011 | GetPicker()->SetSelectionMode(anActor, SM_Shape); |
1012 | } |
1013 | if (aMode == SM_Vertex) |
1014 | { |
1015 | GetPipeline( IVtkTools_ShapeObject::GetShapeSource(anActor)->GetShape()->GetId() )->SharedVerticesSelectionOff(); |
1016 | } |
1017 | } |
1018 | } |
1019 | } |
1020 | } |
1021 | |
1022 | // Redraw window |
1023 | GetInteractor()->Render(); |
12e6d499 |
1024 | return 0; |
1025 | } |
1026 | |
1027 | //================================================================ |
1028 | // Function : VtkSetColor |
1029 | // Purpose : |
1030 | //================================================================ |
1031 | static Standard_Integer VtkSetColor (Draw_Interpretor& , |
1032 | Standard_Integer theArgNb, |
1033 | const char** theArgVec) |
1034 | { |
1035 | if (!GetInteractor() |
1036 | || !GetInteractor()->IsEnabled()) |
1037 | { |
1038 | Message::SendFail() << "Error: call ivtkinit before\n"; |
1039 | return 1; |
1040 | } |
1041 | |
1042 | NCollection_Sequence< vtkSmartPointer<vtkActor> > anActorSeq; |
1043 | Quantity_Color aQColor; |
1044 | bool hasColor = false; |
1045 | for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) |
1046 | { |
1047 | TCollection_AsciiString anArg (theArgVec[anArgIter]); |
1048 | vtkSmartPointer<vtkActor> anActor; |
1049 | if (hasColor) |
1050 | { |
1051 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
1052 | return 1; |
1053 | } |
1054 | else if (GetMapOfActors().Find2 (anArg, anActor)) |
1055 | { |
1056 | anActorSeq.Append (anActor); |
1057 | } |
1058 | else |
1059 | { |
1060 | Standard_Integer aNbParsed = Draw::ParseColor (theArgNb - anArgIter, |
1061 | theArgVec + anArgIter, |
1062 | aQColor); |
1063 | if (aNbParsed == 0) |
1064 | { |
1065 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
1066 | return 1; |
1067 | } |
1068 | anArgIter += aNbParsed - 1; |
1069 | hasColor = true; |
1070 | } |
1071 | } |
1072 | if (!hasColor || anActorSeq.IsEmpty()) |
1073 | { |
1074 | Message::SendFail() << "Syntax error: wrong number of arguments"; |
1075 | return 1; |
1076 | } |
1077 | |
1078 | bool isSRGBAware = false; |
1079 | #ifdef HAVE_VTK_SRGB |
1080 | isSRGBAware = GetRenderer()->GetRenderWindow()->GetUseSRGBColorSpace(); |
1081 | #endif |
1082 | const Graphic3d_Vec3 aColor = isSRGBAware ? (Graphic3d_Vec3 )aQColor : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor); |
1083 | for (NCollection_Sequence< vtkSmartPointer<vtkActor> >::Iterator anActorIter (anActorSeq); anActorIter.More(); anActorIter.Next()) |
1084 | { |
1085 | const vtkSmartPointer<vtkActor>& anActor = anActorIter.Value(); |
1086 | vtkLookupTable* aTable = (vtkLookupTable* )anActor->GetMapper()->GetLookupTable(); |
1087 | IVtkTools::SetLookupTableColor (aTable, MT_ShadedFace, aColor.r(), aColor.g(), aColor.b(), 1.0); |
1088 | } |
1089 | |
1090 | GetInteractor()->Render(); |
1091 | return 0; |
1092 | } |
1093 | |
1094 | //================================================================ |
1095 | // Function : VtkSetTransparency |
1096 | // Purpose : |
1097 | //================================================================ |
1098 | static Standard_Integer VtkSetTransparency (Draw_Interpretor& , |
1099 | Standard_Integer theArgNb, |
1100 | const char** theArgVec) |
1101 | { |
1102 | if (!GetInteractor() |
1103 | || !GetInteractor()->IsEnabled()) |
1104 | { |
1105 | Message::SendFail() << "Error: call ivtkinit before\n"; |
1106 | return 1; |
1107 | } |
1108 | |
1109 | NCollection_Sequence< vtkSmartPointer<vtkActor> > anActorSeq; |
1110 | Standard_Real aTransparency = -1.0; |
1111 | for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) |
1112 | { |
1113 | TCollection_AsciiString anArg (theArgVec[anArgIter]); |
1114 | vtkSmartPointer<vtkActor> anActor; |
1115 | if (aTransparency >= 0.0) |
1116 | { |
1117 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
1118 | return 1; |
1119 | } |
1120 | else if (GetMapOfActors().Find2 (anArg, anActor)) |
1121 | { |
1122 | anActorSeq.Append (anActor); |
1123 | } |
1124 | else if (!Draw::ParseReal (theArgVec[anArgIter], aTransparency) |
1125 | || aTransparency < 0.0 |
1126 | || aTransparency >= 1.0) |
1127 | { |
1128 | Message::SendFail() << "Syntax error at '" << anArg << "'"; |
1129 | return 1; |
1130 | } |
1131 | } |
1132 | if (aTransparency < 0.0 || aTransparency >= 1) |
1133 | { |
1134 | Message::SendFail() << "Syntax error: wrong number of arguments"; |
1135 | return 1; |
1136 | } |
52f99d93 |
1137 | |
12e6d499 |
1138 | for (NCollection_Sequence< vtkSmartPointer<vtkActor> >::Iterator anActorIter (anActorSeq); anActorIter.More(); anActorIter.Next()) |
1139 | { |
1140 | const vtkSmartPointer<vtkActor>& anActor = anActorIter.Value(); |
1141 | anActor->GetProperty()->SetOpacity (1.0 - aTransparency); |
1142 | } |
1143 | |
1144 | GetInteractor()->Render(); |
52f99d93 |
1145 | return 0; |
1146 | } |
1147 | |
1148 | //================================================================ |
1149 | // Function : VtkMoveTo |
1150 | // Purpose : |
1151 | // Draw args : ivtkmoveto x y |
1152 | //================================================================ |
1153 | static Standard_Integer VtkMoveTo(Draw_Interpretor& theDI, |
1154 | Standard_Integer theArgNum, |
1155 | const char** theArgs) |
1156 | { |
12e6d499 |
1157 | if (!GetInteractor() |
1158 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
1159 | { |
12e6d499 |
1160 | Message::SendFail() << "Error: call ivtkinit before"; |
1161 | return 1; |
52f99d93 |
1162 | } |
12e6d499 |
1163 | else if (theArgNum != 3) |
52f99d93 |
1164 | { |
12e6d499 |
1165 | Message::SendFail() << "Syntax error: expects 2 arguments"; |
1166 | return 1; |
52f99d93 |
1167 | } |
1168 | |
1169 | Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1; |
1170 | GetInteractor()->MoveTo (atoi (theArgs[1]), anY); |
1e756cb9 |
1171 | |
1172 | gp_XYZ aPickPnt; |
1173 | GetInteractor()->Selector()->GetPickPosition (aPickPnt.ChangeData()); |
1174 | theDI << aPickPnt.X() << " " << aPickPnt.Y() << " " << aPickPnt.Z(); |
52f99d93 |
1175 | return 0; |
1176 | } |
1177 | |
1178 | //================================================================ |
1179 | // Function : VtkSelect |
12e6d499 |
1180 | // Purpose : |
52f99d93 |
1181 | //================================================================ |
12e6d499 |
1182 | static Standard_Integer VtkSelect (Draw_Interpretor& , |
52f99d93 |
1183 | Standard_Integer theArgNum, |
1184 | const char** theArgs) |
1185 | { |
12e6d499 |
1186 | if (!GetInteractor() |
1187 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
1188 | { |
12e6d499 |
1189 | Message::SendFail() << "Error: call ivtkinit before"; |
1190 | return 1; |
52f99d93 |
1191 | } |
12e6d499 |
1192 | else if (theArgNum != 3) |
52f99d93 |
1193 | { |
12e6d499 |
1194 | Message::SendFail() << "Syntax error: expects 3 arguments"; |
1195 | return 1; |
52f99d93 |
1196 | } |
1197 | |
a2f76b15 |
1198 | Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1; |
52f99d93 |
1199 | GetInteractor()->MoveTo (atoi (theArgs[1]), anY); |
1200 | GetInteractor()->OnSelection(); |
1201 | return 0; |
1202 | |
1203 | } |
1204 | |
1205 | //=================================================================== |
12e6d499 |
1206 | // Fubction : VtkViewProj |
52f99d93 |
1207 | // Purpose : |
52f99d93 |
1208 | //=================================================================== |
12e6d499 |
1209 | static Standard_Integer VtkViewProj (Draw_Interpretor& , |
1210 | Standard_Integer theNbArgs, |
1211 | const char** theArgVec) |
52f99d93 |
1212 | { |
12e6d499 |
1213 | if (!GetInteractor() |
1214 | || !GetInteractor()->IsEnabled()) |
1215 | { |
1216 | Message::SendFail() << "Error: call ivtkinit before"; |
1217 | return 1; |
1218 | } |
1219 | else if (theNbArgs != 1) |
1220 | { |
1221 | Message::SendFail() << "Syntax error: wrong number of arguments"; |
1222 | return 1; |
1223 | } |
1224 | |
1225 | TCollection_AsciiString aCmd (theArgVec[0]); |
1226 | aCmd.LowerCase(); |
1227 | |
1228 | V3d_TypeOfOrientation aProj = V3d_Xpos; |
1229 | bool hasProjDir = false; |
1230 | if (aCmd == "ivtkaxo") |
1231 | { |
1232 | hasProjDir = true; |
1233 | aProj = V3d_TypeOfOrientation_Zup_AxoRight; |
1234 | } |
1235 | else if (aCmd == "ivtktop") |
1236 | { |
1237 | hasProjDir = true; |
1238 | aProj = V3d_TypeOfOrientation_Zup_Top; |
1239 | } |
1240 | else if (aCmd == "ivtkbottom") |
1241 | { |
1242 | hasProjDir = true; |
1243 | aProj = V3d_TypeOfOrientation_Zup_Bottom; |
1244 | } |
1245 | else if (aCmd == "ivtkfront") |
1246 | { |
1247 | hasProjDir = true; |
1248 | aProj = V3d_TypeOfOrientation_Zup_Front; |
1249 | } |
1250 | else if (aCmd == "ivtkback") |
1251 | { |
1252 | hasProjDir = true; |
1253 | aProj = V3d_TypeOfOrientation_Zup_Back; |
1254 | } |
1255 | else if (aCmd == "ivtkleft") |
1256 | { |
1257 | hasProjDir = true; |
1258 | aProj = V3d_TypeOfOrientation_Zup_Left; |
1259 | } |
1260 | else if (aCmd == "ivtkright") |
1261 | { |
1262 | hasProjDir = true; |
1263 | aProj = V3d_TypeOfOrientation_Zup_Right; |
1264 | } |
1265 | |
1266 | if (hasProjDir) |
52f99d93 |
1267 | { |
12e6d499 |
1268 | const gp_Dir aBck = V3d::GetProjAxis (aProj); |
1269 | Graphic3d_Vec3d anUp (0.0, 0.0, 1.0); |
1270 | if (aProj == V3d_Zpos) |
1271 | { |
1272 | anUp.SetValues (0.0, 1.0, 0.0); |
1273 | } |
1274 | else if (aProj == V3d_Zneg) |
1275 | { |
1276 | anUp.SetValues (0.0, -1.0, 0.0); |
1277 | } |
1278 | |
1279 | vtkCamera* aCam = GetRenderer()->GetActiveCamera(); |
1280 | const double aDist = aCam->GetDistance(); |
1281 | |
1282 | Graphic3d_Vec3d aNewEye = Graphic3d_Vec3d (aBck.X(), aBck.Y(), aBck.Z()) * aDist; |
1283 | aCam->SetPosition (aNewEye.x(), aNewEye.y(), aNewEye.z()); |
1284 | aCam->SetFocalPoint (0.0, 0.0, 0.0); |
1285 | aCam->SetViewUp (anUp.x(), anUp.y(), anUp.z()); |
1286 | aCam->OrthogonalizeViewUp(); |
52f99d93 |
1287 | } |
1288 | |
1289 | GetRenderer()->ResetCamera(); |
1290 | GetInteractor()->Render(); |
1291 | return 0; |
1292 | } |
1293 | |
1294 | //=================================================================== |
1295 | // Fubction : VtkDump |
1296 | // Purpose : |
52f99d93 |
1297 | //=================================================================== |
12e6d499 |
1298 | static Standard_Integer VtkDump (Draw_Interpretor& , |
52f99d93 |
1299 | Standard_Integer theArgNum, |
1300 | const char** theArgs) |
1301 | { |
12e6d499 |
1302 | if (!GetInteractor() |
1303 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
1304 | { |
12e6d499 |
1305 | Message::SendFail() << "Error : call ivtkinit before"; |
52f99d93 |
1306 | return 1; |
1307 | } |
12e6d499 |
1308 | else if (theArgNum < 2) |
52f99d93 |
1309 | { |
12e6d499 |
1310 | Message::SendFail() << "Syntax error: wrong number of parameters"; |
1311 | return 1; |
52f99d93 |
1312 | } |
52f99d93 |
1313 | |
12e6d499 |
1314 | vtkSmartPointer<vtkWindowToImageFilter> anImageFilter = vtkSmartPointer<vtkWindowToImageFilter>::New(); |
52f99d93 |
1315 | anImageFilter->SetInput (GetInteractor()->GetRenderWindow()); |
1316 | // Set custom buffer type |
1317 | if (theArgNum > 2) |
1318 | { |
1319 | TCollection_AsciiString aBufferType (theArgs[2]); |
1320 | aBufferType.LowerCase(); |
1321 | if (aBufferType.IsEqual ("rgb")) |
1322 | { |
1323 | anImageFilter->SetInputBufferTypeToRGB(); |
1324 | } |
1325 | else if (aBufferType.IsEqual ("rgba")) |
1326 | { |
1327 | anImageFilter->SetInputBufferTypeToRGBA(); |
1328 | } |
1329 | else if (aBufferType.IsEqual ("depth")) |
1330 | { |
1331 | anImageFilter->SetInputBufferTypeToZBuffer(); |
1332 | } |
1333 | } |
1334 | anImageFilter->Update(); |
1335 | |
1336 | // Set custom stereo projection options |
1337 | if (theArgNum > 5 && GetRenderer()->GetRenderWindow()->GetStereoRender()) |
1338 | { |
1339 | Standard_CString aStereoProjStr = theArgs[5]; |
1340 | |
1341 | Standard_Integer aStereoType = GetRenderer()->GetRenderWindow()->GetStereoType(); |
1342 | if (strcasecmp (aStereoProjStr, "L")) |
1343 | { |
1344 | GetRenderer()->GetRenderWindow()->SetStereoTypeToLeft(); |
1345 | GetRenderer()->GetRenderWindow()->StereoUpdate(); |
1346 | anImageFilter->Update(); |
1347 | GetRenderer()->GetRenderWindow()->SetStereoType (aStereoType); |
1348 | } |
1349 | else if (strcasecmp (aStereoProjStr, "R")) |
1350 | { |
1351 | GetRenderer()->GetRenderWindow()->SetStereoTypeToRight(); |
1352 | GetRenderer()->GetRenderWindow()->StereoUpdate(); |
1353 | anImageFilter->Update(); |
1354 | GetRenderer()->GetRenderWindow()->SetStereoType (aStereoType); |
1355 | } |
1356 | else |
1357 | { |
12e6d499 |
1358 | Message::SendFail() << "Syntax error: unknown value for stereo projection"; |
52f99d93 |
1359 | return 1; |
1360 | } |
1361 | } |
1362 | |
1363 | // Set parameters for image writer |
1364 | vtkSmartPointer<vtkImageWriter> anImageWriter; |
1365 | TCollection_AsciiString aFilename (theArgs[1]); |
1366 | Standard_Integer anExtStart = aFilename.SearchFromEnd (TCollection_AsciiString(".")); |
1367 | TCollection_AsciiString aFormat = (anExtStart == -1) ? TCollection_AsciiString("") |
1368 | : aFilename.SubString (anExtStart + 1, aFilename.Length()); |
1369 | aFormat.LowerCase(); |
1370 | |
1371 | if (aFormat.IsEqual ("png")) |
1372 | { |
1373 | anImageWriter = vtkSmartPointer<vtkPNGWriter>::New(); |
1374 | } |
1375 | else if (aFormat.IsEqual ("bmp")) |
1376 | { |
1377 | anImageWriter = vtkSmartPointer<vtkBMPWriter>::New(); |
1378 | } |
1379 | else if (aFormat.IsEqual ("jpeg")) |
1380 | { |
1381 | anImageWriter = vtkSmartPointer<vtkJPEGWriter>::New(); |
1382 | } |
1383 | else if (aFormat.IsEqual ("tiff")) |
1384 | { |
1385 | anImageWriter = vtkSmartPointer<vtkTIFFWriter>::New(); |
1386 | } |
1387 | else if (aFormat.IsEqual ("pnm")) |
1388 | { |
1389 | anImageWriter = vtkSmartPointer<vtkPNMWriter>::New(); |
1390 | } |
1391 | else // aFormat is unsupported or not set. |
1392 | { |
1393 | if (aFormat.IsEmpty()) |
1394 | { |
12e6d499 |
1395 | Message::SendWarning() << "Warning: the image format is not set.\n" |
1396 | << "The image will be saved into PNG format."; |
52f99d93 |
1397 | anImageWriter = vtkSmartPointer<vtkPNGWriter>::New(); |
1398 | aFormat = TCollection_AsciiString ("png"); |
1399 | if (anExtStart != -1) |
1400 | { |
1401 | aFilename.Split (anExtStart); |
1402 | } |
1403 | else |
1404 | { |
1405 | aFilename += "."; |
1406 | } |
1407 | aFilename += aFormat; |
1408 | } |
1409 | else |
1410 | { |
12e6d499 |
1411 | Message::SendFail() << "Error: the image format " << aFormat << " is not supported"; |
52f99d93 |
1412 | return 1; |
1413 | } |
1414 | |
1415 | } |
1416 | |
1417 | anImageWriter->SetFileName (aFilename.ToCString()); |
1418 | |
1419 | Standard_Integer aWidth = (theArgNum > 3) ? atoi (theArgs[3]) : 0; |
1420 | Standard_Integer aHeight = (theArgNum > 4) ? atoi (theArgs[4]) : 0; |
1421 | if (aWidth >= 0 || aHeight >= 0) |
1422 | { |
1423 | // Scale image |
1424 | vtkSmartPointer<vtkImageResize> anImageResize = vtkSmartPointer<vtkImageResize>::New(); |
1425 | #if VTK_MAJOR_VERSION <= 5 |
1426 | anImageResize->SetInput (anImageFilter->GetOutput()); |
1427 | #else |
1428 | anImageResize->SetInputData (anImageFilter->GetOutput()); |
1429 | #endif |
1430 | |
1431 | anImageResize->SetOutputDimensions (aWidth, aHeight, 1); |
1432 | anImageResize->Update(); |
1433 | anImageWriter->SetInputConnection (anImageResize->GetOutputPort()); |
1434 | } |
1435 | else |
1436 | { |
1437 | anImageWriter->SetInputConnection (anImageFilter->GetOutputPort()); |
1438 | } |
1439 | anImageWriter->Write(); |
52f99d93 |
1440 | return 0; |
1441 | } |
1442 | |
1443 | //=================================================================== |
1444 | // Fubction : VtkBackgroundColor |
1445 | // Purpose : |
52f99d93 |
1446 | //=================================================================== |
12e6d499 |
1447 | static Standard_Integer VtkBackgroundColor (Draw_Interpretor& , |
52f99d93 |
1448 | Standard_Integer theArgNum, |
1449 | const char** theArgs) |
1450 | { |
12e6d499 |
1451 | if (!GetInteractor() |
1452 | || !GetInteractor()->IsEnabled()) |
52f99d93 |
1453 | { |
12e6d499 |
1454 | Message::SendFail() << "Error: call ivtkinit before"; |
52f99d93 |
1455 | return 1; |
1456 | } |
1457 | |
12e6d499 |
1458 | Quantity_Color aQColor1; |
1459 | const Standard_Integer aNbParsed1 = Draw::ParseColor (theArgNum - 1, theArgs + 1, aQColor1); |
1460 | if (aNbParsed1 == 0) |
52f99d93 |
1461 | { |
12e6d499 |
1462 | Message::SendFail() << "Syntax error: wrong number of parameters"; |
52f99d93 |
1463 | return 1; |
1464 | } |
1465 | |
12e6d499 |
1466 | bool isSRGBAware = false; |
1467 | #ifdef HAVE_VTK_SRGB |
1468 | isSRGBAware = GetRenderer()->GetRenderWindow()->GetUseSRGBColorSpace(); |
1469 | #endif |
1470 | const Graphic3d_Vec3 aColor1 = isSRGBAware ? (Graphic3d_Vec3 )aQColor1 : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor1); |
52f99d93 |
1471 | GetRenderer()->SetGradientBackground(false); |
12e6d499 |
1472 | GetRenderer()->SetBackground (aColor1.r(), aColor1.g(), aColor1.b()); |
1473 | if (theArgNum - 1 > aNbParsed1) |
52f99d93 |
1474 | { |
12e6d499 |
1475 | Quantity_Color aQColor2; |
1476 | const Standard_Integer aNbParsed2 = Draw::ParseColor (theArgNum - 1 - aNbParsed1, theArgs + 1 + aNbParsed1, aQColor2); |
1477 | if (aNbParsed2 == 0) |
1478 | { |
1479 | Message::SendFail() << "Syntax error: wrong number of parameters"; |
1480 | return 1; |
1481 | } |
52f99d93 |
1482 | |
12e6d499 |
1483 | const Graphic3d_Vec3 aColor2 = isSRGBAware ? (Graphic3d_Vec3 )aQColor2 : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor2); |
1484 | GetRenderer()->SetBackground2 (aColor2.r(), aColor2.g(), aColor2.b()); |
1485 | GetRenderer()->SetGradientBackground (true); |
52f99d93 |
1486 | } |
1487 | |
1488 | GetInteractor()->Render(); |
52f99d93 |
1489 | return 0; |
1490 | } |
1491 | |
1492 | //================================================================ |
1493 | // Function : Commands |
1494 | // Purpose : |
1495 | //================================================================ |
1496 | void IVtkDraw::Commands (Draw_Interpretor& theCommands) |
1497 | { |
1498 | const char *group = "VtkViewer"; |
12e6d499 |
1499 | |
52f99d93 |
1500 | theCommands.Add("ivtkinit", |
12e6d499 |
1501 | "ivtkinit [leftPx topPx widthPx heightPx] [-srgb {on|off}] [-msaa NbSamples]" |
1502 | "\n\t\t: Creates the Vtk window." |
1503 | "\n\t\t: -srgb Enable/disable sRGB colorspace; OFF by default." |
1504 | "\n\t\t: -msaa Requests desired number of samples for multisampling buffer;" |
1505 | "\n\t\t: 0 by default meaning no MSAA.", |
52f99d93 |
1506 | __FILE__, VtkInit, group); |
1507 | |
12e6d499 |
1508 | theCommands.Add("ivtkclose", |
1509 | "ivtkclose : Closes the Vtk window.", |
1510 | __FILE__, VtkClose, group); |
1511 | |
1512 | theCommands.Add("ivtkrenderparams", |
1513 | "ivtkrenderparams [-depthPeeling NbLayers] [-shadows {on|off}]" |
1514 | "\n\t\t: Sets Vtk rendering parameters." |
1515 | "\n\t\t: -shadows Turn shadows on/off; OFF by default." |
1516 | "\n\t\t: -depthPeeling Enable/disable depth peeling for rendering transparent objects" |
1517 | "\n\t\t: with specified number of layers;" |
1518 | "\n\t\t: 0 by default meaning order-dependent transparency without depth peeling.", |
1519 | __FILE__, VtkRenderParams, group); |
1520 | |
52f99d93 |
1521 | theCommands.Add("ivtkdisplay", |
12e6d499 |
1522 | "ivtkdisplay name1 [name2 ...]" |
1523 | "\n\t\t: Displays named objects in Vtk view.", |
52f99d93 |
1524 | __FILE__, VtkDisplay, group); |
1525 | |
1526 | theCommands.Add("ivtkerase", |
12e6d499 |
1527 | "ivtkerase [name1 name2 ...]" |
1528 | "\n\t\t: Hides in Vtk renderer named objects or all objects.", |
52f99d93 |
1529 | __FILE__, VtkErase, group); |
a2f76b15 |
1530 | |
1531 | theCommands.Add("ivtkremove", |
12e6d499 |
1532 | "ivtkremove name1 [name2 ...]" |
1533 | "\n\t\t: Removes from Vtk renderer named objects.", |
1534 | __FILE__, VtkRemove, group); |
1535 | |
1536 | theCommands.Add("ivtkclear", |
1537 | "ivtkclear : Removes all objects from Vtk renderer.", |
a2f76b15 |
1538 | __FILE__, VtkRemove, group); |
52f99d93 |
1539 | |
1540 | theCommands.Add("ivtksetdispmode", |
12e6d499 |
1541 | "ivtksetdispmode [name] mode={0|1}" |
1542 | "\n\t\t: Sets or unsets display mode 'mode' to the object with name 'name' or to all objects.", |
52f99d93 |
1543 | __FILE__, VtkSetDisplayMode, group); |
1544 | |
4db6748c |
1545 | theCommands.Add("ivtksetboundingdraw", |
12e6d499 |
1546 | "ivtksetboundingdraw [name] {on|off}" |
1547 | "\n\t\t: Sets or unsets boundaries drawing for shading display mode" |
1548 | "\n\t\t: to the object with name 'name' or to all objects.", |
4db6748c |
1549 | __FILE__, VtkSetBoundaryDraw, group); |
1550 | |
52f99d93 |
1551 | theCommands.Add("ivtksetselmode", |
12e6d499 |
1552 | "ivtksetselmode [name] mode {on|off}" |
1553 | "\n\t\t: Sets or unsets selection mode 'mode' to the object with name 'name'" |
1554 | "\n\t\t: or to the all displayed objects.", |
52f99d93 |
1555 | __FILE__, VtkSetSelectionMode, group); |
1556 | |
1557 | theCommands.Add("ivtkmoveto", |
12e6d499 |
1558 | "ivtkmoveto x y" |
1559 | "\n\t\t: Moves position to the pixel with coordinates (x,y). The object on this position is highlighted.", |
52f99d93 |
1560 | __FILE__, VtkMoveTo, group); |
1561 | |
1562 | theCommands.Add("ivtkselect", |
12e6d499 |
1563 | "ivtkselect x y" |
1564 | "\n\t\t: Selects object which correspond to the pixel with input coordinates (x,y).", |
52f99d93 |
1565 | __FILE__, VtkSelect, group); |
1566 | |
1567 | theCommands.Add("ivtkfit", |
12e6d499 |
1568 | "ivtkfit : Fits all displayed objects into Vtk view.", |
1569 | __FILE__, VtkViewProj, group); |
1570 | |
1571 | theCommands.Add("ivtkaxo", |
1572 | "ivtkaxo : Resets Vtk view orientation to axo", |
1573 | __FILE__, VtkViewProj, group); |
1574 | |
1575 | theCommands.Add("ivtkfront", |
1576 | "ivtkfront : Resets Vtk view orientation to front", |
1577 | __FILE__, VtkViewProj, group); |
1578 | |
1579 | theCommands.Add("ivtkback", |
1580 | "ivtkback : Resets Vtk view orientation to back", |
1581 | __FILE__, VtkViewProj, group); |
1582 | |
1583 | theCommands.Add("ivtktop", |
1584 | "ivtktop : Resets Vtk view orientation to top", |
1585 | __FILE__, VtkViewProj, group); |
1586 | |
1587 | theCommands.Add("ivtkbottom", |
1588 | "ivtkbottom : Resets Vtk view orientation to bottom", |
1589 | __FILE__, VtkViewProj, group); |
1590 | |
1591 | theCommands.Add("ivtkleft", |
1592 | "ivtkleft : Resets Vtk view orientation to left", |
1593 | __FILE__, VtkViewProj, group); |
1594 | |
1595 | theCommands.Add("ivtkright", |
1596 | "ivtkright : Resets Vtk view orientation to right", |
1597 | __FILE__, VtkViewProj, group); |
52f99d93 |
1598 | |
1599 | theCommands.Add("ivtkdump", |
12e6d499 |
1600 | "ivtkdump <FullFilename>.{png|bmp|jpeg|tiff|pnm} [buffer={rgb|rgba|depth}]" |
1601 | "\n\t\t: [width height] [stereoproj={L|R}]" |
1602 | "\n\t\t: Dumps contents of viewer window to PNG, BMP, JPEG, TIFF or PNM file.", |
52f99d93 |
1603 | __FILE__, VtkDump, group); |
1604 | |
1605 | theCommands.Add("ivtkbgcolor", |
12e6d499 |
1606 | "ivtkbgcolor Color1 [Color2]" |
1607 | "\n\t\t: Sets uniform background color or gradient one if second triple of parameters is set.", |
52f99d93 |
1608 | __FILE__, VtkBackgroundColor, group); |
52f99d93 |
1609 | |
12e6d499 |
1610 | theCommands.Add("ivtksetcolor", |
1611 | "ivtksetcolor name {ColorName|R G B}" |
1612 | "\n\t\t: Sets color to the object with name 'name'.", |
1613 | __FILE__, VtkSetColor, group); |
1614 | |
1615 | theCommands.Add("ivtksettransparency", |
1616 | "ivtksettransparency name 0..1" |
1617 | "\n\t\t: Sets transparency to the object with name 'name'.", |
1618 | __FILE__, VtkSetTransparency, group); |
1619 | } |
52f99d93 |
1620 | |
1621 | //================================================================ |
1622 | // Function : Factory |
1623 | // Purpose : |
1624 | //================================================================ |
1625 | void IVtkDraw::Factory (Draw_Interpretor& theDI) |
1626 | { |
1627 | // definition of Viewer Commands |
1628 | IVtkDraw::Commands (theDI); |
1629 | } |
1630 | |
1631 | // Declare entry point PLUGINFACTORY |
1632 | DPLUGIN(IVtkDraw) |