CustusX  15.8
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 //--------------------------------------------------------
142 //--------------------------------------------------------
143 //--------------------------------------------------------
144 
146 {
147 // mRenderer = renderer;
148  source = vtkSphereSourcePtr::New();
149  source->SetRadius(4);
150 // default:
151 // source->SetThetaResolution(8);
152 // source->SetPhiResolution(8);
153  // 24*16 = 384, 8*8=64, 16*12=192
154  source->SetThetaResolution(16);
155  source->SetPhiResolution(12);
156  source->LatLongTessellationOn();
157 
158  vtkPolyDataNormalsPtr normals = vtkPolyDataNormalsPtr::New();
159  normals->SetInputConnection(source->GetOutputPort());
160  normals->Update();
161 
162  mapper = vtkPolyDataMapperPtr::New();
163  mapper->SetInputConnection(normals->GetOutputPort());
164 
165  actor = vtkActorPtr::New();
166  actor->SetMapper(mapper);
167 
168  this->setRenderer(renderer);
169 }
170 
172 {
173  this->setRenderer(NULL);
174 }
175 
177 {
178  if (mRenderer)
179  {
180  mRenderer->RemoveActor(actor);
181  }
182 
183  mRenderer = renderer;
184 
185  if (mRenderer)
186  {
187  mRenderer->AddActor(actor);
188  }
189 }
190 
191 void GraphicalPoint3D::setRadius(double radius)
192 {
193  source->SetRadius(radius);
194 }
195 
196 void GraphicalPoint3D::setColor(QColor color)
197 {
198  setColorAndOpacity(actor->GetProperty(), color);
199 }
200 
202 {
203  actor->SetPosition(point.begin());
204 }
205 
207 {
208  return Vector3D(actor->GetPosition());
209 }
210 
212 {
213  return actor;
214 }
215 
217 {
218  return source->GetOutput();
219 }
220 
221 //--------------------------------------------------------
222 //--------------------------------------------------------
223 //--------------------------------------------------------
224 
226 {
227  mRenderer = renderer;
228  source = vtkLineSourcePtr::New();
229  mapper = vtkPolyDataMapperPtr::New() ;
230  actor = vtkActorPtr::New() ;
231 
232  mapper->SetInputConnection( source->GetOutputPort() );
233  actor->SetMapper (mapper );
234  this->setRenderer(renderer);
235 }
236 
238 {
239  this->setRenderer(NULL);
240 }
241 
243 {
244  if (mRenderer)
245  {
246  mRenderer->RemoveActor(actor);
247  }
248 
249  mRenderer = renderer;
250 
251  if (mRenderer)
252  {
253  mRenderer->AddActor(actor);
254  }
255 }
256 
257 void GraphicalLine3D::setColor(QColor color)
258 {
259  setColorAndOpacity(actor->GetProperty(), color);
260 }
261 
263 {
264  source->SetPoint1(point1.begin());
265  source->SetPoint2(point2.begin());
266 }
267 
269 {
270  actor->GetProperty()->SetLineStipplePattern(stipple);
271 }
272 
274 {
275  return actor;
276 }
277 
278 //--------------------------------------------------------
279 //--------------------------------------------------------
280 //--------------------------------------------------------
281 
283 {
284  mRenderer = renderer;
285  source = vtkArcSourcePtr::New();
286  source->SetResolution(20);
287  mapper = vtkPolyDataMapperPtr::New() ;
288  actor = vtkActorPtr::New() ;
289 
290  mapper->SetInputConnection( source->GetOutputPort() );
291  actor->SetMapper (mapper );
292  if (mRenderer)
293  mRenderer->AddActor(actor);
294 }
295 
297 {
298  if (mRenderer)
299  mRenderer->RemoveActor(actor);
300 }
301 
302 void GraphicalArc3D::setColor(QColor color)
303 {
304  setColorAndOpacity(actor->GetProperty(), color);
305 }
306 
308 {
309  source->SetPoint1(point1.begin());
310  source->SetPoint2(point2.begin());
311  source->SetCenter(center.begin());
312 }
313 
314 void GraphicalArc3D::setStipple(int stipple)
315 {
316  actor->GetProperty()->SetLineStipplePattern(stipple);
317 }
318 
320 {
321  return actor;
322 }
323 
324 //--------------------------------------------------------
325 //--------------------------------------------------------
326 //--------------------------------------------------------
327 
329 {
330  mRenderer = renderer;
331  source = vtkArrowSourcePtr::New();
332  source->SetTipResolution(24);
333  source->SetShaftResolution(24);
334  mapper = vtkPolyDataMapperPtr::New() ;
335  actor = vtkActorPtr::New() ;
336 
337  mapper->SetInputConnection( source->GetOutputPort() );
338  actor->SetMapper (mapper );
339  if (mRenderer)
340  mRenderer->AddActor(actor);
341 }
342 
344 {
345  if (mRenderer)
346  mRenderer->RemoveActor(actor);
347 }
348 
349 void GraphicalArrow3D::setColor(QColor color)
350 {
351  setColorAndOpacity(actor->GetProperty(), color);
352 }
353 
355 {
356  // find an arbitrary vector k perpendicular to normal:
357  Vector3D k = cross(Vector3D(1,0,0), normal);
358  if (similar(k, Vector3D(0,0,0)))
359  k = cross(Vector3D(0,1,0), normal);
360  k = k.normalized();
361  Transform3D M = createTransformIJC(normal, k, base);
362 
363 // std::cout << "GraphicalArrow3D::setValue " << base << " - " << normal << std::endl;
364  Transform3D S = createTransformScale(Vector3D(length,1,1));
365  M = M * S;
366  // let arrow shape increase slowly with length:
367 // source->SetTipLength(0.35/sqrt(length));
368 // source->SetTipRadius(0.1*sqrt(length));
369 // source->SetShaftRadius(0.03*sqrt(length));
370  source->SetTipLength(0.35);
371  source->SetTipRadius(0.1*(length));
372  source->SetShaftRadius(0.03*(length));
373  actor->SetUserMatrix(M.getVtkMatrix());
374 }
375 
376 //--------------------------------------------------------
377 //--------------------------------------------------------
378 //--------------------------------------------------------
379 
380 Rect3D::Rect3D(vtkRendererPtr renderer, QColor color)
381 {
382  mRenderer = renderer;
383  mapper = vtkPolyDataMapperPtr::New();
384  actor = vtkActorPtr::New();
385  setColorAndOpacity(actor->GetProperty(), color);
386  actor->SetMapper(mapper);
387  if (mRenderer)
388  mRenderer->AddActor(actor);
389 
390  mPolyData = vtkPolyDataPtr::New();
391  mPoints = vtkPointsPtr::New();
392  mSide = vtkCellArrayPtr::New();
393 
394  vtkIdType cells[5] = { 0,1,2,3,0 };
395  mSide->InsertNextCell(5, cells);
396 
397  mPolyData->SetPoints(mPoints);
398  mapper->SetInputData(mPolyData);
399 }
400 
401 void Rect3D::setLine(bool on, int width)
402 {
403  if (on)
404  {
405  mPolyData->SetLines(mSide);
406  actor->GetProperty()->SetLineWidth(width);
407  }
408  else
409  {
410  mPolyData->SetLines(NULL);
411  }
412 }
413 
414 void Rect3D::setSurface(bool on)
415 {
416  if (on)
417  {
418  mPolyData->SetPolys(mSide);
419  actor->GetProperty()->SetOpacity(1.0); // transparent planes dont work well together with texture volume. Use 1.0
420  }
421  else
422  {
423  mPolyData->SetPolys(NULL);
424  }
425 }
426 
428 {
429  if (mRenderer)
430  mRenderer->RemoveActor(actor);
431 }
432 
433 void Rect3D::setColor(QColor color)
434 {
435  setColorAndOpacity(actor->GetProperty(), color);
436 }
437 
439 {
440  mPoints = vtkPointsPtr::New();
441  mPoints->InsertPoint(0, M.coord(bb.corner(0,0,0)).begin());
442  mPoints->InsertPoint(1, M.coord(bb.corner(0,1,0)).begin());
443  mPoints->InsertPoint(2, M.coord(bb.corner(1,1,0)).begin());
444  mPoints->InsertPoint(3, M.coord(bb.corner(1,0,0)).begin());
445  mPolyData->SetPoints(mPoints);
446 }
447 
448 //--------------------------------------------------------
449 //--------------------------------------------------------
450 //--------------------------------------------------------
451 
453 {
454  mText = vtkVectorTextPtr::New();
455  vtkPolyDataMapperPtr mapper = vtkPolyDataMapperPtr::New();
456  mapper->SetInputConnection(mText->GetOutputPort());
457  mFollower = vtkFollowerPtr::New();
458  mFollower->SetMapper(mapper);
459  Vector3D mTextScale(2,2,2);
460  mFollower->SetScale(mTextScale.begin());
461 
462  this->setSizeInNormalizedViewport(true, 0.025);
463  this->setRenderer(renderer);
464 }
465 
467 {
468  if (mRenderer)
469  {
470  mRenderer->RemoveActor(mFollower);
471  mViewportListener->stopListen();
472  }
473 
474  mRenderer = renderer;
475 
476  if (mRenderer)
477  {
478  mRenderer->AddActor(mFollower);
479  mFollower->SetCamera(mRenderer->GetActiveCamera());
480  if (mViewportListener)
481  mViewportListener->startListen(mRenderer);
482  }
483 }
484 
486 {
487  if (mRenderer)
488  mRenderer->RemoveActor(mFollower);
489 }
490 
491 void FollowerText3D::setSize(double val)
492 {
493  mSize = val;
494  this->scaleText();
495 }
496 
498 {
499  if (on)
500  {
501  if (!mViewportListener)
502  {
503  mViewportListener.reset(new ViewportListener);
504  mViewportListener->setCallback(boost::bind(&FollowerText3D::scaleText, this));
505  }
506  }
507  else
508  {
509  mViewportListener.reset();
510  }
511 
512  this->setSize(size);
513 }
514 
515 void FollowerText3D::setColor(QColor color)
516 {
517  setColorAndOpacity(mFollower->GetProperty(), color);
518 }
519 
520 void FollowerText3D::setText(QString text)
521 {
522  mText->SetText(cstring_cast(text));
523 }
524 
526 {
527  mFollower->SetPosition(pos.begin());
528 }
529 
531 {
532  return mFollower;
533 }
534 
542 {
543  if (!mViewportListener || !mViewportListener->isListening())
544  {
545  mFollower->SetScale(Vector3D(mSize,mSize,mSize).begin());
546  return;
547  }
548 
549  double size = mViewportListener->getVpnZoom();
550 
551  double scale = mSize/size;
552 // std::cout << "s= " << size << " ,scale= " << scale << std::endl;
553  Vector3D mTextScale(scale,scale,scale);
554  if (mFollower)
555  mFollower->SetScale(mTextScale.begin());
556 }
557 
558 //--------------------------------------------------------
559 //--------------------------------------------------------
560 //--------------------------------------------------------
561 
563 {
564  mText = vtkCaptionActor2DPtr::New();
565  mText->BorderOff();
566  mText->LeaderOff();
567 
568  mText->GetCaptionTextProperty()->BoldOff();
569  mText->GetCaptionTextProperty()->ItalicOff();
570  mText->GetCaptionTextProperty()->ShadowOff();
571  mText->SetWidth(10);
572  mText->SetHeight(0.03);
573 
574  this->setRenderer(renderer);
575 }
576 
578 {
579  if (mRenderer)
580  {
581  mRenderer->RemoveActor(mText);
582  }
583 
584  mRenderer = renderer;
585 
586  if (mRenderer)
587  {
588  mRenderer->AddActor(mText);
589  }
590 }
591 
593 {
594  if (mRenderer)
595  mRenderer->RemoveActor(mText);
596 }
597 
598 void CaptionText3D::setSize(double val)
599 {
600  mText->SetHeight(val);
601 }
602 
603 void CaptionText3D::setColor(QColor color)
604 {
605  mText->GetCaptionTextProperty()->SetColor(getColorAsVector3D(color).begin());
606 }
607 
608 void CaptionText3D::setText(QString text)
609 {
610  mText->SetCaption(cstring_cast(text));
611 }
612 
614 {
615  mText->SetAttachmentPoint(pos.begin());
616 }
617 
619 {
620  return mText;
621 }
622 
623 //--------------------------------------------------------
624 //--------------------------------------------------------
625 //--------------------------------------------------------
626 
627 }
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)