Fraxinus  17.12
An IGT application
cxGraphicalPrimitives.cpp
Go to the documentation of this file.
1 /*=========================================================================
2 This file is part of CustusX, an Image Guided Therapy Application.
3 
4 Copyright (c) 2008-2014, SINTEF Department of Medical Technology
5 All rights reserved.
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9 
10 1. Redistributions of source code must retain the above copyright notice,
11  this list of conditions and the following disclaimer.
12 
13 2. Redistributions in binary form must reproduce the above copyright notice,
14  this list of conditions and the following disclaimer in the documentation
15  and/or other materials provided with the distribution.
16 
17 3. Neither the name of the copyright holder nor the names of its contributors
18  may be used to endorse or promote products derived from this software
19  without specific prior written permission.
20 
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 =========================================================================*/
32 
33 #include "cxGraphicalPrimitives.h"
34 
35 #include "boost/bind.hpp"
36 #include <vtkSphereSource.h>
37 #include <vtkLineSource.h>
38 #include <vtkArcSource.h>
39 #include <vtkPolyDataMapper.h>
40 #include <vtkActor.h>
41 #include <vtkCellArray.h>
42 #include <vtkProperty.h>
43 #include <vtkRenderer.h>
44 #include <vtkCommand.h>
45 #include <vtkFollower.h>
46 #include <vtkVectorText.h>
47 #include <vtkCamera.h>
48 #include "cxTypeConversions.h"
49 #include "cxBoundingBox3D.h"
50 #include "vtkArrowSource.h"
51 #include "vtkMatrix4x4.h"
52 #include "vtkCaptionActor2D.h"
53 #include "vtkTextProperty.h"
54 #include "cxVtkHelperClasses.h"
55 #include "vtkPolyDataNormals.h"
56 
57 namespace cx
58 {
59 
60 
62 {
63  mProperty = vtkPropertyPtr::New();
64  mActor = vtkActorPtr::New();
65  mActor->SetProperty(mProperty);
66 }
67 
69 {
70  this->setRenderer(NULL);
71 }
72 
74 {
76  mSource = source;
77 
78  if (mSource)
79  getMapper()->SetInputConnection(mSource->GetOutputPort());
80  else
81  getMapper()->SetInputConnection(NULL);
82 }
83 
85 {
86  if (mRenderer)
87  mRenderer->RemoveActor(mActor);
88 
89  mRenderer = renderer;
90 
91  if (mRenderer)
92  mRenderer->AddActor(mActor);
93 }
94 
96 {
97  mActor->SetVisibility(visible);
98 }
99 
100 
102 {
103  mActor->GetProperty()->SetBackfaceCulling(val);
104 }
105 
107 {
108  mActor->GetProperty()->SetFrontfaceCulling(val);
109 }
110 
111 void GraphicalGeometricBase::setColor(double red, double green, double blue)
112 {
113  mActor->GetProperty()->SetColor(red, green, blue);
114 }
115 
117 {
118  mActor->GetProperty()->SetColor(color.begin());
119 }
120 
122 {
123  mActor->SetPosition(point.begin());
124 }
125 
127 {
128  mActor->GetProperty()->SetOpacity(val);
129 }
130 
131 void GraphicalGeometricBase::setUserMatrix(vtkMatrix4x4 *matrix)
132 {
133  mActor->SetUserMatrix(matrix);
134 }
135 
137 {
138  if(pointSize<=0)
139  return;
140  mProperty->SetPointSize(pointSize);
141 }
142 
144 {
145  getMapper()->SetScalarVisibility(show);
146 }
147 
149 {
150  return Vector3D(mActor->GetPosition());
151 }
152 
154 {
155  return mActor;
156 }
157 
159 {
160  return mProperty;
161 }
162 
164 {
165  if (mSource)
166  return mSource->GetOutput();
167  else
168  return mData;
169 }
170 
172 {
173  return mSource;
174 }
175 
176 //--------------------------------------------------------
177 //--------------------------------------------------------
178 //-------------------------------------------------------
179 
181  GraphicalGeometricBase(source,renderer)
182 {
183  mMapper = vtkPolyDataMapperPtr::New();
184 
185  mActor->SetMapper(mMapper);
186  setSource(source);
187  setRenderer(renderer);
188 }
189 
191 {
192  mActor->GetProperty()->SetRepresentationToWireframe();
193 }
194 
196 {
198  mData = data;
199 
200  mMapper->SetInputData(mData);
201 }
202 
204 {
205  mActor->SetTexture(texture);
206 }
207 
208 
210 {
211  return mMapper;
212 }
213 
214 //--------------------------------------------------------
215 //--------------------------------------------------------
216 //-------------------------------------------------------
217 
219  GraphicalGeometricBase(source,renderer)
220 {
221  mMapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
222  vtkSmartPointer<vtkArrowSource> arrowSource = vtkSmartPointer<vtkArrowSource>::New();
223  mMapper->SetSourceConnection(arrowSource->GetOutputPort());
224  mMapper->ScalarVisibilityOn();
225  mMapper->SetUseLookupTableScalarRange(1);
226  mMapper->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_FIELD_DATA);
227  mActor->SetMapper(mMapper);
228  setSource(source);
229  setRenderer(renderer);
230 }
231 
232 
234 {
235  mData = data;
236  if (data)
237  mMapper->SetInputData(mData);
238 }
239 
240 void GraphicalGlyph3DData::setOrientationArray(const char* orientationArray)
241 {
242  mMapper->SetOrientationArray(orientationArray);
243 }
244 
245 void GraphicalGlyph3DData::setColorArray(const char* colorArray)
246 {
247  if(strlen(colorArray)>0)
248  {
249  setScalarVisibility(true);
250  }else
251  {
252  setScalarVisibility(false);
253  }
254  mMapper->SelectColorArray(colorArray);
255 }
256 
257 
258 void GraphicalGlyph3DData::setLUT(const char* lut)
259 {
260  vtkSmartPointer<vtkColorSeries> colorSeries = vtkSmartPointer<vtkColorSeries>::New();
261  vtkSmartPointer<vtkLookupTable> table = vtkLookupTable::New();
262  colorSeries->SetColorSchemeByName(lut);
263  colorSeries->BuildLookupTable(table , vtkColorSeries::ORDINAL);
264  mMapper->SetLookupTable(table);
265 }
266 
267 
268 void GraphicalGlyph3DData::setScaleFactor(double scaleFactor)
269 {
270  if(scaleFactor<=0) return;
271  mMapper->SetScaleFactor(scaleFactor);
272 }
273 
275 {
276  return mMapper;
277 }
278 
279 //--------------------------------------------------------
280 //--------------------------------------------------------
281 //--------------------------------------------------------
282 
284 {
285  // mRenderer = renderer;
286  source = vtkSphereSourcePtr::New();
287  source->SetRadius(4);
288  // default:
289  // source->SetThetaResolution(8);
290  // source->SetPhiResolution(8);
291  // 24*16 = 384, 8*8=64, 16*12=192
292  source->SetThetaResolution(16);
293  source->SetPhiResolution(12);
294  source->LatLongTessellationOn();
295 
296  vtkPolyDataNormalsPtr normals = vtkPolyDataNormalsPtr::New();
297  normals->SetInputConnection(source->GetOutputPort());
298  normals->Update();
299 
300  mapper = vtkPolyDataMapperPtr::New();
301  mapper->SetInputConnection(normals->GetOutputPort());
302 
303  actor = vtkActorPtr::New();
304  actor->SetMapper(mapper);
305 
306  this->setRenderer(renderer);
307 }
308 
310 {
311  this->setRenderer(NULL);
312 }
313 
315 {
316  if (mRenderer)
317  {
318  mRenderer->RemoveActor(actor);
319  }
320 
321  mRenderer = renderer;
322 
323  if (mRenderer)
324  {
325  mRenderer->AddActor(actor);
326  }
327 }
328 
329 void GraphicalPoint3D::setRadius(double radius)
330 {
331  source->SetRadius(radius);
332 }
333 
334 void GraphicalPoint3D::setColor(QColor color)
335 {
336  setColorAndOpacity(actor->GetProperty(), color);
337 }
338 
340 {
341  actor->SetPosition(point.begin());
342 }
343 
345 {
346  return Vector3D(actor->GetPosition());
347 }
348 
350 {
351  return actor;
352 }
353 
355 {
356  return source->GetOutput();
357 }
358 
359 //--------------------------------------------------------
360 //--------------------------------------------------------
361 //--------------------------------------------------------
362 
364 {
365  mRenderer = renderer;
366  source = vtkLineSourcePtr::New();
367  mapper = vtkPolyDataMapperPtr::New() ;
368  actor = vtkActorPtr::New() ;
369 
370  mapper->SetInputConnection( source->GetOutputPort() );
371  actor->SetMapper (mapper );
372  this->setRenderer(renderer);
373 }
374 
376 {
377  this->setRenderer(NULL);
378 }
379 
381 {
382  if (mRenderer)
383  {
384  mRenderer->RemoveActor(actor);
385  }
386 
387  mRenderer = renderer;
388 
389  if (mRenderer)
390  {
391  mRenderer->AddActor(actor);
392  }
393 }
394 
395 void GraphicalLine3D::setColor(QColor color)
396 {
397  setColorAndOpacity(actor->GetProperty(), color);
398 }
399 
401 {
402  source->SetPoint1(point1.begin());
403  source->SetPoint2(point2.begin());
404 }
405 
407 {
408  actor->GetProperty()->SetLineStipplePattern(stipple);
409 }
410 
412 {
413  return actor;
414 }
415 
416 //--------------------------------------------------------
417 //--------------------------------------------------------
418 //--------------------------------------------------------
419 
421 {
422  mRenderer = renderer;
423  source = vtkArcSourcePtr::New();
424  source->SetResolution(20);
425  mapper = vtkPolyDataMapperPtr::New() ;
426  actor = vtkActorPtr::New() ;
427 
428  mapper->SetInputConnection( source->GetOutputPort() );
429  actor->SetMapper (mapper );
430  if (mRenderer)
431  mRenderer->AddActor(actor);
432 }
433 
435 {
436  if (mRenderer)
437  mRenderer->RemoveActor(actor);
438 }
439 
440 void GraphicalArc3D::setColor(QColor color)
441 {
442  setColorAndOpacity(actor->GetProperty(), color);
443 }
444 
446 {
447  source->SetPoint1(point1.begin());
448  source->SetPoint2(point2.begin());
449  source->SetCenter(center.begin());
450 }
451 
452 void GraphicalArc3D::setStipple(int stipple)
453 {
454  actor->GetProperty()->SetLineStipplePattern(stipple);
455 }
456 
458 {
459  return actor;
460 }
461 
462 //--------------------------------------------------------
463 //--------------------------------------------------------
464 //--------------------------------------------------------
465 
467 {
468  mRenderer = renderer;
469  source = vtkArrowSourcePtr::New();
470  source->SetTipResolution(24);
471  source->SetShaftResolution(24);
472  mapper = vtkPolyDataMapperPtr::New() ;
473  actor = vtkActorPtr::New() ;
474 
475  mapper->SetInputConnection( source->GetOutputPort() );
476  actor->SetMapper (mapper );
477  if (mRenderer)
478  mRenderer->AddActor(actor);
479 }
480 
482 {
483  if (mRenderer)
484  mRenderer->RemoveActor(actor);
485 }
486 
487 void GraphicalArrow3D::setColor(QColor color)
488 {
489  setColorAndOpacity(actor->GetProperty(), color);
490 }
491 
493 {
494  // find an arbitrary vector k perpendicular to normal:
495  Vector3D k = cross(Vector3D(1,0,0), normal);
496  if (similar(k, Vector3D(0,0,0)))
497  k = cross(Vector3D(0,1,0), normal);
498  k = k.normalized();
499  Transform3D M = createTransformIJC(normal, k, base);
500 
501  // std::cout << "GraphicalArrow3D::setValue " << base << " - " << normal << std::endl;
502  Transform3D S = createTransformScale(Vector3D(length,1,1));
503  M = M * S;
504  // let arrow shape increase slowly with length:
505  // source->SetTipLength(0.35/sqrt(length));
506  // source->SetTipRadius(0.1*sqrt(length));
507  // source->SetShaftRadius(0.03*sqrt(length));
508  source->SetTipLength(0.35);
509  source->SetTipRadius(0.1*(length));
510  source->SetShaftRadius(0.03*(length));
511  actor->SetUserMatrix(M.getVtkMatrix());
512 }
513 
514 //--------------------------------------------------------
515 //--------------------------------------------------------
516 //--------------------------------------------------------
517 
518 Rect3D::Rect3D(vtkRendererPtr renderer, QColor color)
519 {
520  mRenderer = renderer;
521  mapper = vtkPolyDataMapperPtr::New();
522  actor = vtkActorPtr::New();
523  setColorAndOpacity(actor->GetProperty(), color);
524  actor->SetMapper(mapper);
525  if (mRenderer)
526  mRenderer->AddActor(actor);
527 
528  mPolyData = vtkPolyDataPtr::New();
529  mPoints = vtkPointsPtr::New();
530  mSide = vtkCellArrayPtr::New();
531 
532  vtkIdType cells[5] = { 0,1,2,3,0 };
533  mSide->InsertNextCell(5, cells);
534 
535  mPolyData->SetPoints(mPoints);
536  mapper->SetInputData(mPolyData);
537 }
538 
539 void Rect3D::setLine(bool on, int width)
540 {
541  if (on)
542  {
543  mPolyData->SetLines(mSide);
544  actor->GetProperty()->SetLineWidth(width);
545  }
546  else
547  {
548  mPolyData->SetLines(NULL);
549  }
550 }
551 
552 void Rect3D::setSurface(bool on)
553 {
554  if (on)
555  {
556  mPolyData->SetPolys(mSide);
557  actor->GetProperty()->SetOpacity(1.0); // transparent planes dont work well together with texture volume. Use 1.0
558  }
559  else
560  {
561  mPolyData->SetPolys(NULL);
562  }
563 }
564 
566 {
567  if (mRenderer)
568  mRenderer->RemoveActor(actor);
569 }
570 
571 void Rect3D::setColor(QColor color)
572 {
573  setColorAndOpacity(actor->GetProperty(), color);
574 }
575 
577 {
578  mPoints = vtkPointsPtr::New();
579  mPoints->InsertPoint(0, M.coord(bb.corner(0,0,0)).begin());
580  mPoints->InsertPoint(1, M.coord(bb.corner(0,1,0)).begin());
581  mPoints->InsertPoint(2, M.coord(bb.corner(1,1,0)).begin());
582  mPoints->InsertPoint(3, M.coord(bb.corner(1,0,0)).begin());
583  mPolyData->SetPoints(mPoints);
584 }
585 
586 //--------------------------------------------------------
587 //--------------------------------------------------------
588 //--------------------------------------------------------
589 
591 {
592  mText = vtkVectorTextPtr::New();
593  vtkPolyDataMapperPtr mapper = vtkPolyDataMapperPtr::New();
594  mapper->SetInputConnection(mText->GetOutputPort());
595  mFollower = vtkFollowerPtr::New();
596  mFollower->SetMapper(mapper);
597  Vector3D mTextScale(2,2,2);
598  mFollower->SetScale(mTextScale.begin());
599 
600  this->setSizeInNormalizedViewport(true, 0.025);
601  this->setRenderer(renderer);
602 }
603 
605 {
606  if (mRenderer)
607  {
608  mRenderer->RemoveActor(mFollower);
609  mViewportListener->stopListen();
610  }
611 
612  mRenderer = renderer;
613 
614  if (mRenderer)
615  {
616  mRenderer->AddActor(mFollower);
617  mFollower->SetCamera(mRenderer->GetActiveCamera());
618  if (mViewportListener)
619  mViewportListener->startListen(mRenderer);
620  }
621 }
622 
624 {
625  if (mRenderer)
626  mRenderer->RemoveActor(mFollower);
627 }
628 
629 void FollowerText3D::setSize(double val)
630 {
631  mSize = val;
632  this->scaleText();
633 }
634 
636 {
637  if (on)
638  {
639  if (!mViewportListener)
640  {
641  mViewportListener.reset(new ViewportListener);
642  mViewportListener->setCallback(boost::bind(&FollowerText3D::scaleText, this));
643  }
644  }
645  else
646  {
647  mViewportListener.reset();
648  }
649 
650  this->setSize(size);
651 }
652 
653 void FollowerText3D::setColor(QColor color)
654 {
655  setColorAndOpacity(mFollower->GetProperty(), color);
656 }
657 
658 void FollowerText3D::setText(QString text)
659 {
660  mText->SetText(cstring_cast(text));
661 }
662 
664 {
665  mFollower->SetPosition(pos.begin());
666 }
667 
669 {
670  return mFollower;
671 }
672 
680 {
681  if (!mViewportListener || !mViewportListener->isListening())
682  {
683  mFollower->SetScale(Vector3D(mSize,mSize,mSize).begin());
684  return;
685  }
686 
687  double size = mViewportListener->getVpnZoom(Vector3D(mFollower->GetPosition()));
688 
689  double scale = mSize/size;
690  // std::cout << "s= " << size << " ,scale= " << scale << std::endl;
691  Vector3D mTextScale(scale,scale,scale);
692  if (mFollower)
693  mFollower->SetScale(mTextScale.begin());
694 }
695 
696 //--------------------------------------------------------
697 //--------------------------------------------------------
698 //--------------------------------------------------------
699 
701 {
702  mText = vtkCaptionActor2DPtr::New();
703  mText->BorderOff();
704  mText->LeaderOff();
705 
706  mText->GetCaptionTextProperty()->BoldOff();
707  mText->GetCaptionTextProperty()->ItalicOff();
708  mText->GetCaptionTextProperty()->ShadowOff();
709  mText->SetWidth(10);
710  mText->SetHeight(0.03);
711 
712  this->setRenderer(renderer);
713 }
714 
716 {
717  mText->SetPosition(-15, -30);
718  mText->SetPosition2(15, -10);
719 }
720 
722 {
723  mText->SetPosition(-15, 2);
724 }
725 
727 {
728  mText->SetVisibility(visible);
729 }
730 
732 {
733  if (mRenderer)
734  {
735  mRenderer->RemoveActor(mText);
736  }
737 
738  mRenderer = renderer;
739 
740  if (mRenderer)
741  {
742  mRenderer->AddActor(mText);
743  }
744 }
745 
747 {
748  if (mRenderer)
749  mRenderer->RemoveActor(mText);
750 }
751 
752 void CaptionText3D::setSize(double val)
753 {
754  mText->SetHeight(val);
755 }
756 
757 void CaptionText3D::setColor(QColor color)
758 {
759  mText->GetCaptionTextProperty()->SetColor(getColorAsVector3D(color).begin());
760 }
761 
762 void CaptionText3D::setText(QString text)
763 {
764  mText->SetCaption(cstring_cast(text));
765 }
766 
768 {
769  mPos = pos;
770  mText->SetAttachmentPoint(pos.begin());
771 }
772 
774 {
775  return mPos;
776 }
777 
779 {
780  return mText;
781 }
782 
783 //--------------------------------------------------------
784 //--------------------------------------------------------
785 //--------------------------------------------------------
786 
787 }
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
void setScaleFactor(double scaleFactor)
vtkSmartPointer< class vtkTexture > vtkTexturePtr
void setValue(Vector3D point1, Vector3D point2, Vector3D center)
CaptionText3D(vtkRendererPtr renderer=vtkRendererPtr())
GraphicalGlyph3DData(vtkPolyDataAlgorithmPtr source=vtkPolyDataAlgorithmPtr(), vtkRendererPtr renderer=vtkRendererPtr())
vtkSmartPointer< class vtkActor > vtkActorPtr
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
Vector3D corner(int x, int y, int z) const
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
Vector3D getColorAsVector3D(QColor color)
Scalar * begin()
PlainObject normal() const
void setData(vtkPolyDataPtr data)
vtkSmartPointer< class vtkPolyDataMapper > vtkPolyDataMapperPtr
void setValue(Vector3D point)
Vector3D getPosition() const
GraphicalPoint3D(vtkRendererPtr renderer=vtkRendererPtr())
vtkCaptionActor2DPtr getActor()
Transform3D createTransformScale(const Vector3D &scale_)
vtkSmartPointer< class vtkProperty > vtkPropertyPtr
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
void setOrientationArray(const char *orientationArray)
void setPosition(Vector3D pos)
void setText(QString text)
GraphicalArc3D(vtkRendererPtr renderer=vtkRendererPtr())
void setColor(QColor color)
cstring_cast_Placeholder cstring_cast(const T &val)
virtual vtkMapperPtr getMapper()=0
Rect3D(vtkRendererPtr renderer, QColor color)
void setColorArray(const char *colorArray)
GraphicalLine3D(vtkRendererPtr renderer=vtkRendererPtr())
void setData(vtkPolyDataPtr data)
Listens to changes in viewport and camera matrix.
Vector3D cross(const Vector3D &a, const Vector3D &b)
compute cross product of a and b.
Definition: cxVector3D.cpp:62
void setStipple(int stipple)
GraphicalGeometricBase(vtkPolyDataAlgorithmPtr source=vtkPolyDataAlgorithmPtr(), vtkRendererPtr renderer=vtkRendererPtr())
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
void setTexture(vtkTexturePtr texture)
Transform3D createTransformIJC(const Vector3D &ivec, const Vector3D &jvec, const Vector3D &center)
vtkSmartPointer< class vtkRenderer > vtkRendererPtr
vtkSmartPointer< class vtkFollower > vtkFollowerPtr
void setColor(double red, double green, double blue)
void scaleText()
internal method
vtkSmartPointer< class vtkMapper > vtkMapperPtr
void setPosition(Vector3D pos)
void setLine(bool on, int width)
GraphicalPolyData3D(vtkPolyDataAlgorithmPtr source=vtkPolyDataAlgorithmPtr(), vtkRendererPtr renderer=vtkRendererPtr())
vtkSmartPointer< class vtkPolyDataNormals > vtkPolyDataNormalsPtr
FollowerText3D(vtkRendererPtr renderer=vtkRendererPtr())
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
void setColor(QColor color)
void setUserMatrix(vtkMatrix4x4 *matrix)
vtkSmartPointer< class vtkCaptionActor2D > vtkCaptionActor2DPtr
void setColor(QColor color)
Representation of a floating-point bounding box in 3D. The data are stored as {xmin,xmax,ymin,ymax,zmin,zmax}, in order to simplify communication with vtk.
void setSizeInNormalizedViewport(bool on, double size)
vtkPolyDataAlgorithmPtr getSource()
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
void updatePosition(const DoubleBoundingBox3D bb, const Transform3D &M)
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
Definition: cxVector3D.h:63
void setSurface(bool on)
bool similar(const CameraInfo &lhs, const CameraInfo &rhs, double tol)
vtkSmartPointer< class vtkPolyDataAlgorithm > vtkPolyDataAlgorithmPtr
Definition: cxViewWrapper.h:50
RealScalar length() const
void setVisibility(bool visible)
void setSource(vtkPolyDataAlgorithmPtr source)
void setStipple(int stipple)
void setColor(QColor color)
void setValue(Vector3D base, Vector3D normal, double length)
GraphicalArrow3D(vtkRendererPtr renderer=vtkRendererPtr())
void setRadius(double radius)
void setColor(QColor color)
void setText(QString text)
vtkPolyDataAlgorithmPtr mSource
void setValue(Vector3D point1, Vector3D point2)
void setColorAndOpacity(vtkPropertyOrProperty2DPtr property, QColor color)
Namespace for all CustusX production code.