CustusX  15.3.4-beta
An IGT application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
61 {
62  mMapper = vtkPolyDataMapperPtr::New();
63 
64  mActor = vtkActorPtr::New();
65  mActor->SetMapper(mMapper);
66 
67  this->setSource(source);
68  this->setRenderer(renderer);
69 }
70 
72 {
73  mData = vtkPolyDataPtr();
74  mSource = source;
75 
76  if (mSource)
77  mMapper->SetInputConnection(mSource->GetOutputPort());
78  else
79  mMapper->SetInputConnection(NULL);
80 }
81 
83 {
84  this->setRenderer(NULL);
85 }
86 
88 {
89  if (mRenderer)
90  mRenderer->RemoveActor(mActor);
91 
92  mRenderer = renderer;
93 
94  if (mRenderer)
95  mRenderer->AddActor(mActor);
96 }
97 
98 
100 {
101  mActor->GetProperty()->SetColor(color.begin());
102 }
103 
105 {
106  mActor->SetPosition(point.begin());
107 }
108 
110 {
111  mSource = vtkPolyDataAlgorithmPtr();
112  mData = data;
113 
114  if (mData)
115  mMapper->SetInputData(mData);
116 }
117 
119 {
120  return Vector3D(mActor->GetPosition());
121 }
122 
124 {
125  return mActor;
126 }
127 
129 {
130  if (mSource)
131  return mSource->GetOutput();
132  else
133  return mData;
134 }
135 
137 {
138  return mSource;
139 }
140 
141 
145 
147 {
148 // mRenderer = renderer;
149  source = vtkSphereSourcePtr::New();
150  source->SetRadius(4);
151 // default:
152 // source->SetThetaResolution(8);
153 // source->SetPhiResolution(8);
154  // 24*16 = 384, 8*8=64, 16*12=192
155  source->SetThetaResolution(16);
156  source->SetPhiResolution(12);
157  source->LatLongTessellationOn();
158 
159  vtkPolyDataNormalsPtr normals = vtkPolyDataNormalsPtr::New();
160  normals->SetInputConnection(source->GetOutputPort());
161  normals->Update();
162 
163  mapper = vtkPolyDataMapperPtr::New();
164  mapper->SetInputConnection(normals->GetOutputPort());
165 
166  actor = vtkActorPtr::New();
167  actor->SetMapper(mapper);
168 
169  this->setRenderer(renderer);
170 }
171 
173 {
174  this->setRenderer(NULL);
175 }
176 
178 {
179  if (mRenderer)
180  {
181  mRenderer->RemoveActor(actor);
182  }
183 
184  mRenderer = renderer;
185 
186  if (mRenderer)
187  {
188  mRenderer->AddActor(actor);
189  }
190 }
191 
192 void GraphicalPoint3D::setRadius(double radius)
193 {
194  source->SetRadius(radius);
195 }
196 
197 void GraphicalPoint3D::setColor(QColor color)
198 {
199  setColorAndOpacity(actor->GetProperty(), color);
200 }
201 
202 //void GraphicalPoint3D::setColor(Vector3D color)
203 //{
204 // actor->GetProperty()->SetColor(color.begin());
205 //}
206 
208 {
209  actor->SetPosition(point.begin());
210 }
211 
213 {
214  return Vector3D(actor->GetPosition());
215 }
216 
218 {
219  return actor;
220 }
221 
223 {
224  return source->GetOutput();
225 }
226 
227 
231 
232 
234 {
235  mRenderer = renderer;
236  source = vtkLineSourcePtr::New();
237  mapper = vtkPolyDataMapperPtr::New() ;
238  actor = vtkActorPtr::New() ;
239 
240  mapper->SetInputConnection( source->GetOutputPort() );
241  actor->SetMapper (mapper );
242  this->setRenderer(renderer);
243 }
244 
246 {
247  this->setRenderer(NULL);
248 }
249 
251 {
252  if (mRenderer)
253  {
254  mRenderer->RemoveActor(actor);
255  }
256 
257  mRenderer = renderer;
258 
259  if (mRenderer)
260  {
261  mRenderer->AddActor(actor);
262  }
263 }
264 
265 void GraphicalLine3D::setColor(QColor color)
266 {
267  setColorAndOpacity(actor->GetProperty(), color);
268 }
269 
271 {
272  source->SetPoint1(point1.begin());
273  source->SetPoint2(point2.begin());
274 }
275 
277 {
278  actor->GetProperty()->SetLineStipplePattern(stipple);
279 }
280 
282 {
283  return actor;
284 }
285 
289 
293 
294 
296 {
297  mRenderer = renderer;
298  source = vtkArcSourcePtr::New();
299  source->SetResolution(20);
300  mapper = vtkPolyDataMapperPtr::New() ;
301  actor = vtkActorPtr::New() ;
302 
303  mapper->SetInputConnection( source->GetOutputPort() );
304  actor->SetMapper (mapper );
305  if (mRenderer)
306  mRenderer->AddActor(actor);
307 }
308 
310 {
311  if (mRenderer)
312  mRenderer->RemoveActor(actor);
313 }
314 
315 void GraphicalArc3D::setColor(QColor color)
316 {
317  setColorAndOpacity(actor->GetProperty(), color);
318 }
319 
321 {
322  source->SetPoint1(point1.begin());
323  source->SetPoint2(point2.begin());
324  source->SetCenter(center.begin());
325 }
326 
327 void GraphicalArc3D::setStipple(int stipple)
328 {
329  actor->GetProperty()->SetLineStipplePattern(stipple);
330 }
331 
333 {
334  return actor;
335 }
336 
340 
344 
345 
347 {
348  mRenderer = renderer;
349  source = vtkArrowSourcePtr::New();
350  source->SetTipResolution(24);
351  source->SetShaftResolution(24);
352  mapper = vtkPolyDataMapperPtr::New() ;
353  actor = vtkActorPtr::New() ;
354 
355  mapper->SetInputConnection( source->GetOutputPort() );
356  actor->SetMapper (mapper );
357  if (mRenderer)
358  mRenderer->AddActor(actor);
359 }
360 
362 {
363  if (mRenderer)
364  mRenderer->RemoveActor(actor);
365 }
366 
367 void GraphicalArrow3D::setColor(QColor color)
368 {
369  setColorAndOpacity(actor->GetProperty(), color);
370 }
371 
373 {
374  // find an arbitrary vector k perpendicular to normal:
375  Vector3D k = cross(Vector3D(1,0,0), normal);
376  if (similar(k, Vector3D(0,0,0)))
377  k = cross(Vector3D(0,1,0), normal);
378  k = k.normalized();
379  Transform3D M = createTransformIJC(normal, k, base);
380 
381 // std::cout << "GraphicalArrow3D::setValue " << base << " - " << normal << std::endl;
382  Transform3D S = createTransformScale(Vector3D(length,1,1));
383  M = M * S;
384  // let arrow shape increase slowly with length:
385 // source->SetTipLength(0.35/sqrt(length));
386 // source->SetTipRadius(0.1*sqrt(length));
387 // source->SetShaftRadius(0.03*sqrt(length));
388  source->SetTipLength(0.35);
389  source->SetTipRadius(0.1*(length));
390  source->SetShaftRadius(0.03*(length));
391  actor->SetUserMatrix(M.getVtkMatrix());
392 }
393 
397 
398 
399 Rect3D::Rect3D(vtkRendererPtr renderer, QColor color)
400 {
401  mRenderer = renderer;
402  mapper = vtkPolyDataMapperPtr::New();
403  actor = vtkActorPtr::New();
404  setColorAndOpacity(actor->GetProperty(), color);
405  actor->SetMapper(mapper);
406  if (mRenderer)
407  mRenderer->AddActor(actor);
408 
409  mPolyData = vtkPolyDataPtr::New();
410  mPoints = vtkPointsPtr::New();
411  mSide = vtkCellArrayPtr::New();
412 
413  vtkIdType cells[5] = { 0,1,2,3,0 };
414  mSide->InsertNextCell(5, cells);
415 
416  mPolyData->SetPoints(mPoints);
417  mapper->SetInputData(mPolyData);
418 }
419 
420 void Rect3D::setLine(bool on, int width)
421 {
422  if (on)
423  {
424  mPolyData->SetLines(mSide);
425  actor->GetProperty()->SetLineWidth(width);
426  }
427  else
428  {
429  mPolyData->SetLines(NULL);
430  }
431 }
432 
433 void Rect3D::setSurface(bool on)
434 {
435  if (on)
436  {
437  mPolyData->SetPolys(mSide);
438  actor->GetProperty()->SetOpacity(1.0); // transparent planes dont work well together with texture volume. Use 1.0
439  }
440  else
441  {
442  mPolyData->SetPolys(NULL);
443  }
444 }
445 
447 {
448  if (mRenderer)
449  mRenderer->RemoveActor(actor);
450 }
451 
452 void Rect3D::setColor(QColor color)
453 {
454  setColorAndOpacity(actor->GetProperty(), color);
455 }
456 
458 {
459  mPoints = vtkPointsPtr::New();
460  mPoints->InsertPoint(0, M.coord(bb.corner(0,0,0)).begin());
461  mPoints->InsertPoint(1, M.coord(bb.corner(0,1,0)).begin());
462  mPoints->InsertPoint(2, M.coord(bb.corner(1,1,0)).begin());
463  mPoints->InsertPoint(3, M.coord(bb.corner(1,0,0)).begin());
464  mPolyData->SetPoints(mPoints);
465 // mPolyData->Update();
466 }
467 
471 
472 
474 {
475 // mRenderer = renderer;
476 // if (!mRenderer)
477 // return;
478 
479  mText = vtkVectorTextPtr::New();
480  vtkPolyDataMapperPtr mapper = vtkPolyDataMapperPtr::New();
481  mapper->SetInputConnection(mText->GetOutputPort());
482  mFollower = vtkFollowerPtr::New();
483  mFollower->SetMapper(mapper);
484 // mFollower->SetCamera(mRenderer->GetActiveCamera());
485  Vector3D mTextScale(2,2,2);
486  mFollower->SetScale(mTextScale.begin());
487 
488  this->setSizeInNormalizedViewport(true, 0.025);
489 // mRenderer->AddActor(mFollower);
490  this->setRenderer(renderer);
491 }
492 
494 {
495  if (mRenderer)
496  {
497  mRenderer->RemoveActor(mFollower);
498  mViewportListener->stopListen();
499  }
500 
501  mRenderer = renderer;
502 
503  if (mRenderer)
504  {
505  mRenderer->AddActor(mFollower);
506  mFollower->SetCamera(mRenderer->GetActiveCamera());
507  if (mViewportListener)
508  mViewportListener->startListen(mRenderer);
509  }
510 }
511 
513 {
514  if (mRenderer)
515  mRenderer->RemoveActor(mFollower);
516 }
517 
518 void FollowerText3D::setSize(double val)
519 {
520  mSize = val;
521  this->scaleText();
522 }
523 
525 {
526  if (on)
527  {
528  if (!mViewportListener)
529  {
530  mViewportListener.reset(new ViewportListener);
531  mViewportListener->setCallback(boost::bind(&FollowerText3D::scaleText, this));
532  }
533  }
534  else
535  {
536  mViewportListener.reset();
537  }
538 
539  this->setSize(size);
540 }
541 
542 void FollowerText3D::setColor(QColor color)
543 {
544  setColorAndOpacity(mFollower->GetProperty(), color);
545 // mFollower->GetProperty()->SetColor(getColorAsVector3D(color).begin());
546 }
547 
548 void FollowerText3D::setText(QString text)
549 {
550  mText->SetText(cstring_cast(text));
551 }
552 
554 {
555  mFollower->SetPosition(pos.begin());
556 }
557 
559 {
560  return mFollower;
561 }
562 
570 {
571  if (!mViewportListener || !mViewportListener->isListening())
572  {
573  mFollower->SetScale(Vector3D(mSize,mSize,mSize).begin());
574  return;
575  }
576 
577  double size = mViewportListener->getVpnZoom();
578 
579  double scale = mSize/size;
580 // std::cout << "s= " << size << " ,scale= " << scale << std::endl;
581  Vector3D mTextScale(scale,scale,scale);
582  if (mFollower)
583  mFollower->SetScale(mTextScale.begin());
584 }
585 
589 
590 
592 {
593  mText = vtkCaptionActor2DPtr::New();
594  mText->BorderOff();
595  mText->LeaderOff();
596 
597  mText->GetCaptionTextProperty()->BoldOff();
598  mText->GetCaptionTextProperty()->ItalicOff();
599  mText->GetCaptionTextProperty()->ShadowOff();
600  mText->SetWidth(10);
601  mText->SetHeight(0.03);
602 
603  this->setRenderer(renderer);
604 }
605 
607 {
608  if (mRenderer)
609  {
610  mRenderer->RemoveActor(mText);
611  }
612 
613  mRenderer = renderer;
614 
615  if (mRenderer)
616  {
617  mRenderer->AddActor(mText);
618  }
619 }
620 
622 {
623  if (mRenderer)
624  mRenderer->RemoveActor(mText);
625 }
626 
627 void CaptionText3D::setSize(double val)
628 {
629  mText->SetHeight(val);
630 }
631 
632 void CaptionText3D::setColor(QColor color)
633 {
634  mText->GetCaptionTextProperty()->SetColor(getColorAsVector3D(color).begin());
635 }
636 
637 void CaptionText3D::setText(QString text)
638 {
639  mText->SetCaption(cstring_cast(text));
640 }
641 
643 {
644  mText->SetAttachmentPoint(pos.begin());
645 }
646 
648 {
649  return mText;
650 }
651 
655 
656 }
void setColor(Vector3D color)
void setValue(Vector3D point1, Vector3D point2, Vector3D center)
CaptionText3D(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
vtkSmartPointer< class vtkPolyDataMapper > vtkPolyDataMapperPtr
void setValue(Vector3D point)
GraphicalPoint3D(vtkRendererPtr renderer=vtkRendererPtr())
vtkCaptionActor2DPtr getActor()
Transform3D createTransformScale(const Vector3D &scale_)
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
void setPosition(Vector3D pos)
void setText(QString text)
GraphicalArc3D(vtkRendererPtr renderer=vtkRendererPtr())
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
void setColor(QColor color)
cstring_cast_Placeholder cstring_cast(const T &val)
vtkPolyDataAlgorithmPtr getSource()
Rect3D(vtkRendererPtr renderer, QColor color)
GraphicalLine3D(vtkRendererPtr renderer=vtkRendererPtr())
void setData(vtkPolyDataPtr data)
vtkSmartPointer< class vtkPolyData > vtkPolyDataPtr
Definition: cxProbeSector.h:47
bool similar(const DoubleBoundingBox3D &a, const DoubleBoundingBox3D &b, double tol)
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)
void setRenderer(vtkRendererPtr renderer=vtkRendererPtr())
Transform3D createTransformIJC(const Vector3D &ivec, const Vector3D &jvec, const Vector3D &center)
vtkSmartPointer< class vtkRenderer > vtkRendererPtr
vtkSmartPointer< class vtkFollower > vtkFollowerPtr
void scaleText()
internal method
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)
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 setPosition(Vector3D point)
void setSizeInNormalizedViewport(bool on, double size)
void setSource(vtkPolyDataAlgorithmPtr source)
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)
vtkSmartPointer< class vtkPolyDataAlgorithm > vtkPolyDataAlgorithmPtr
Definition: cxViewWrapper.h:47
RealScalar length() const
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 setColorAndOpacity(vtkPropertyPtr property, QColor color)
void setColor(QColor color)
void setText(QString text)
void setValue(Vector3D point1, Vector3D point2)