Lemma is an Electromagnetics API
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

matplot.cpp 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. #ifdef LEMMAUSEVTK
  2. #include "matplot.h"
  3. #include "vtkActor.h"
  4. #include "vtkAxesActor.h"
  5. #include "vtkCamera.h"
  6. #include "vtkCaptionActor2D.h"
  7. #include "vtkContourFilter.h"
  8. #include "vtkDataSetMapper.h"
  9. #include "vtkGlyph3D.h"
  10. #include "vtkGlyphSource2D.h"
  11. #include "vtkOutlineFilter.h"
  12. #include "vtkPolyData.h"
  13. #include "vtkPolyDataMapper.h"
  14. #include "vtkPNGWriter.h"
  15. #include "vtkProperty.h"
  16. #include "vtkProperty2D.h"
  17. #include "vtkRectilinearGridGeometryFilter.h"
  18. #include "vtkRenderWindow.h"
  19. #include "vtkRenderWindowInteractor.h"
  20. #include "vtkStructuredGridGeometryFilter.h"
  21. #include "vtkScalarBarActor.h"
  22. #include "vtkTextProperty.h"
  23. #include "vtkTubeFilter.h"
  24. #include "vtkWarpScalar.h"
  25. #include "vtkWindowToImageFilter.h"
  26. #include "vtkRenderLargeImage.h"
  27. #include "vtkTextActor.h"
  28. #include "vtkVectorText.h"
  29. #include "vtkTransformPolyDataFilter.h"
  30. #include "vtkTransform.h"
  31. #include "vtkFollower.h"
  32. #include "vtkAxisActor2D.h"
  33. //#include "vtkCubeAxesActor.h"
  34. #include "vtkCubeAxesActor2D.h"
  35. using namespace matplot;
  36. /// Default constructor
  37. Plot2D_VTK::Plot2D_VTK(std::string x_label, std::string y_label,
  38. int xpix, int ypix, bool semilogX)
  39. {
  40. semilogx = semilogX;
  41. xPix = xpix;
  42. yPix = ypix;
  43. plot_no = 0;
  44. // set up the renderer
  45. rend = vtkRenderer::New();
  46. rend->SetBackground(1., 1., 1.);
  47. // set up the xy plot
  48. xyplot = vtkXYPlotActor::New();
  49. xyplot->GetProperty()->SetColor(0.0, 0.0, 0.0);
  50. xyplot->SetBorder(10);
  51. xyplot->GetPositionCoordinate()->SetValue(0.0, 0.0, 0);
  52. xyplot->GetPosition2Coordinate()->SetValue(1.0, 1.0, 0);
  53. xyplot->GetProperty()->SetLineWidth(1);
  54. xyplot->GetProperty()->SetPointSize(5);
  55. xyplot->PlotPointsOff();
  56. xyplot->PlotLinesOff();
  57. xyplot->PlotCurvePointsOn();
  58. xyplot->PlotCurveLinesOn();
  59. xyplot->SetXValuesToArcLength();
  60. xyplot->SetLabelFormat("%2.1f");
  61. xyplot->SetTitle("");
  62. xyplot->SetXTitle(x_label.c_str());
  63. xyplot->SetYTitle(y_label.c_str());
  64. if (semilogx) {
  65. xyplot->LogxOn();
  66. }
  67. vtkTextProperty* text_prop = xyplot->GetTitleTextProperty();
  68. text_prop->SetColor(0.0, 0.0, 0.0);
  69. text_prop->SetFontFamilyToArial();
  70. xyplot->SetAxisTitleTextProperty(text_prop);
  71. xyplot->SetAxisLabelTextProperty(text_prop);
  72. xyplot->SetTitleTextProperty(text_prop);
  73. }
  74. /// Destructor
  75. Plot2D_VTK::~Plot2D_VTK()
  76. {
  77. xyplot->Delete();
  78. rend->Delete();
  79. }
  80. /// Render current figure to screen
  81. void Plot2D_VTK::show()
  82. {
  83. rend->AddActor(xyplot);
  84. render_interactive(rend,xPix,yPix);
  85. }
  86. /// Render current figure to file
  87. void Plot2D_VTK::draw_to_png(std::string filename)
  88. {
  89. rend->AddActor(xyplot);
  90. render_to_png(rend,xPix,yPix,filename);
  91. }
  92. //==============================================================================
  93. Surf_VTK::Surf_VTK(int px, int py)
  94. {
  95. has_data = false;
  96. Lxy = -1;
  97. Lz = -1;
  98. xPix = px;
  99. yPix = py;
  100. gridfunc = vtkStructuredGrid::New();
  101. rend = vtkRenderer::New();
  102. }
  103. /// Destructor
  104. Surf_VTK::~Surf_VTK()
  105. {
  106. gridfunc->Delete();
  107. rend->Delete();
  108. }
  109. /// Clear plot data before reuse
  110. void Surf_VTK::purge()
  111. {
  112. assert(has_data);
  113. gridfunc->Delete();
  114. rend->Delete();
  115. gridfunc = vtkStructuredGrid::New();
  116. rend = vtkRenderer::New();
  117. has_data = false;
  118. Lxy = -1;
  119. Lz = -1;
  120. }
  121. void Surf_VTK::renderer(bool draw_axes, bool draw_colorbar, bool draw_box,
  122. bool do_warp)
  123. {
  124. assert(has_data);
  125. // filter to geometry primitive
  126. vtkStructuredGridGeometryFilter *geometry =
  127. vtkStructuredGridGeometryFilter::New();
  128. geometry->SetInputData(gridfunc);
  129. // warp to fit in box
  130. vtkWarpScalar *warp = vtkWarpScalar::New();
  131. if (do_warp)
  132. {
  133. double scale = Lxy/Lz;
  134. warp->SetInputConnection(geometry->GetOutputPort());
  135. warp->XYPlaneOn();
  136. warp->SetScaleFactor(scale);
  137. }
  138. // map gridfunction
  139. vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
  140. if (do_warp)
  141. mapper->SetInputConnection(warp->GetOutputPort());
  142. else
  143. mapper->SetInputConnection(geometry->GetOutputPort());
  144. double tmp[2];
  145. gridfunc->GetScalarRange(tmp);
  146. mapper->SetScalarRange(tmp[0], tmp[1]);
  147. // create plot surface actor
  148. vtkActor *surfplot = vtkActor::New();
  149. surfplot->SetMapper(mapper);
  150. // create outline
  151. vtkOutlineFilter *outlinefilter = vtkOutlineFilter::New();
  152. if (do_warp)
  153. outlinefilter->SetInputConnection(warp->GetOutputPort());
  154. else
  155. outlinefilter->SetInputConnection(geometry->GetOutputPort());
  156. vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
  157. outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());
  158. vtkActor *outline = vtkActor::New();
  159. outline->SetMapper(outlineMapper);
  160. outline->GetProperty()->SetColor(0, 0, 0);
  161. // create axes
  162. vtkAxesActor* axes = vtkAxesActor::New();
  163. axes->SetShaftTypeToCylinder();
  164. axes->SetNormalizedShaftLength( 0.85, 0.85, 0.85);
  165. axes->SetNormalizedTipLength( 0.15, 0.15, 0.15);
  166. axes->SetCylinderRadius( 0.500 * axes->GetCylinderRadius() );
  167. axes->SetConeRadius( 1.025 * axes->GetConeRadius() );
  168. axes->SetSphereRadius( 1.500 * axes->GetSphereRadius() );
  169. vtkTextProperty* text_prop_ax = axes->GetXAxisCaptionActor2D()->
  170. GetCaptionTextProperty();
  171. text_prop_ax->SetColor(0.0, 0.0, 0.0);
  172. text_prop_ax->SetFontFamilyToArial();
  173. text_prop_ax->SetFontSize(8);
  174. axes->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->
  175. ShallowCopy(text_prop_ax);
  176. axes->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->
  177. ShallowCopy(text_prop_ax);
  178. // create colorbar
  179. vtkScalarBarActor *colorbar = vtkScalarBarActor::New();
  180. colorbar->SetLookupTable(mapper->GetLookupTable());
  181. colorbar->SetWidth(0.085);
  182. colorbar->SetHeight(0.9);
  183. colorbar->SetPosition(0.9, 0.1);
  184. vtkTextProperty* text_prop_cb = colorbar->GetLabelTextProperty();
  185. text_prop_cb->SetColor(1.0, 1.0, 1.0);
  186. colorbar->SetLabelTextProperty(text_prop_cb);
  187. // renderer
  188. rend->AddActor(surfplot);
  189. if (draw_box)
  190. rend->AddActor(outline);
  191. if (draw_axes)
  192. rend->AddActor(axes);
  193. if (draw_colorbar)
  194. rend->AddActor(colorbar);
  195. rend->SetBackground(0.25, 0.25, 0.25);
  196. // renderer is now set up!
  197. // clean up
  198. colorbar->Delete();
  199. warp->Delete();
  200. axes->Delete();
  201. outline->Delete();
  202. outlinefilter->Delete();
  203. outlineMapper->Delete();
  204. surfplot->Delete();
  205. mapper->Delete();
  206. geometry->Delete();
  207. }
  208. //==============================================================================
  209. /// Default constructor
  210. Contour_VTK::Contour_VTK(int px, int py)
  211. {
  212. XScale = LINEAR;
  213. YScale = LINEAR;
  214. has_data = false;
  215. xPix = px;
  216. yPix = py;
  217. gridfunc = vtkRectilinearGrid::New();
  218. rend = vtkRenderer::New();
  219. }
  220. /// Default constructor
  221. Contour_VTK::Contour_VTK(int px, int py, SCALE xsc, SCALE ysc)
  222. {
  223. XScale = xsc;
  224. YScale = ysc;
  225. xlabel = "x";
  226. ylabel = "y";
  227. has_data = false;
  228. xPix = px;
  229. yPix = py;
  230. gridfunc = vtkRectilinearGrid::New();
  231. rend = vtkRenderer::New();
  232. }
  233. /// Destructor
  234. Contour_VTK::~Contour_VTK()
  235. {
  236. gridfunc->Delete();
  237. rend->Delete();
  238. }
  239. /// Clear plot data before reuse
  240. void Contour_VTK::purge()
  241. {
  242. assert(has_data);
  243. gridfunc->Delete();
  244. rend->Delete();
  245. gridfunc = vtkRectilinearGrid::New();
  246. rend = vtkRenderer::New();
  247. has_data = false;
  248. }
  249. /// Set labels for contour plots
  250. void Contour_VTK::SetXLabel(const std::string &xlab) {
  251. xlabel = xlab;
  252. }
  253. void Contour_VTK::SetYLabel(const std::string &ylab ) {
  254. ylabel = ylab;
  255. }
  256. void Contour_VTK::renderer(bool draw_colorbar, bool draw_surf, int lines)
  257. {
  258. assert(has_data);
  259. // filter to geometry primitive
  260. vtkRectilinearGridGeometryFilter *geometry =
  261. vtkRectilinearGridGeometryFilter::New();
  262. geometry->SetInputData(gridfunc);
  263. // map gridfunction
  264. vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
  265. mapper->SetInputConnection(geometry->GetOutputPort());
  266. double tmp[2];
  267. gridfunc->GetScalarRange(tmp);
  268. mapper->SetScalarRange(tmp[0], tmp[1]);
  269. // create plot surface actor
  270. vtkActor *surfplot = vtkActor::New();
  271. surfplot->SetMapper(mapper);
  272. // create contour lines (10 lines)
  273. vtkContourFilter *contlines = vtkContourFilter::New();
  274. contlines->SetInputConnection(geometry->GetOutputPort());
  275. double tempdiff = (tmp[1]-tmp[0])/(10*lines);
  276. contlines->GenerateValues(lines, tmp[0]+tempdiff, tmp[1]-tempdiff);
  277. vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
  278. contourMapper->SetInputConnection(contlines->GetOutputPort());
  279. if (draw_surf)
  280. contourMapper->ScalarVisibilityOff();
  281. else
  282. contourMapper->SetScalarRange(tmp[0], tmp[1]);
  283. vtkActor *contours = vtkActor::New();
  284. contours->SetMapper(contourMapper);
  285. contours->GetProperty()->SetOpacity(.25);
  286. contours->GetProperty()->SetColor(0.5,0.5,0.5);
  287. // create outline
  288. vtkOutlineFilter *outlinefilter = vtkOutlineFilter::New();
  289. outlinefilter->SetInputConnection(geometry->GetOutputPort());
  290. vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
  291. outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());
  292. vtkActor *outline = vtkActor::New();
  293. outline->SetMapper(outlineMapper);
  294. outline->GetProperty()->SetColor(0, 0, 0);
  295. // create colorbar
  296. vtkScalarBarActor *colorbar = vtkScalarBarActor::New();
  297. if (draw_surf)
  298. colorbar->SetLookupTable(mapper->GetLookupTable());
  299. else
  300. colorbar->SetLookupTable(contourMapper->GetLookupTable());
  301. //
  302. colorbar->SetWidth(0.085);
  303. colorbar->SetHeight(0.9);
  304. colorbar->SetPosition(0.9, 0.1);
  305. vtkTextProperty* text_prop_cb = colorbar->GetLabelTextProperty();
  306. text_prop_cb->SetColor(1.0, 1.0, 1.0);
  307. colorbar->SetLabelTextProperty(text_prop_cb);
  308. double xrange[2];
  309. double yrange[2];
  310. gridfunc->GetXCoordinates()->GetRange(xrange);
  311. gridfunc->GetYCoordinates()->GetRange(yrange);
  312. vtkCubeAxesActor2D *caxis = vtkCubeAxesActor2D::New();
  313. caxis->ZAxisVisibilityOff();
  314. caxis->SetXLabel(xlabel.c_str());
  315. caxis->SetYLabel(ylabel.c_str());
  316. vtkCamera* mycam = rend->MakeCamera(); // vtkCamera::New();
  317. //rend->SetActiveCamera(mycam);
  318. caxis->SetBounds( xrange[0], xrange[1], yrange[0], yrange[1], 0, 0);
  319. caxis->SetRanges( xrange[0], xrange[1], ymin, ymax, 0, 0);
  320. caxis->SetUseRanges(1);
  321. caxis->SetCamera( mycam );
  322. caxis->SetNumberOfLabels(6);
  323. // doesn't work, rotate y label 90 degrees
  324. caxis->GetYAxisActor2D()->GetTitleTextProperty()->SetOrientation(90.);
  325. rend->AddActor(caxis);
  326. mycam->Delete();
  327. caxis->Delete();
  328. // handdrwan label
  329. // // X label
  330. // vtkVectorText *xlabel = vtkVectorText::New();
  331. // vtkTransformPolyDataFilter *transxlabel = vtkTransformPolyDataFilter::New();
  332. // vtkTransform *trans = vtkTransform::New();
  333. // vtkPolyDataMapper *xlabmap = vtkPolyDataMapper::New();
  334. // vtkFollower *xlabact = vtkFollower::New();
  335. // locate and rotate as needed
  336. //double yranget = std::abs(yrange[1]-yrange[0]);
  337. //double xranget = std::abs(xrange[1]-xrange[0]);
  338. // trans->Identity();
  339. // trans->Scale(5,5,5); // TODO, is 5 always OK???
  340. // transxlabel->SetTransform(trans);
  341. // transxlabel->SetInputConnection(xlabel->GetOutputPort());
  342. // // TODO input name
  343. // xlabel->SetText("Frequency [Hz]");
  344. // transxlabel->SetInputConnection(xlabel->GetOutputPort());
  345. // xlabmap->SetInputConnection(transxlabel->GetOutputPort());
  346. // xlabact->SetMapper(xlabmap);
  347. // // centre between axis
  348. // xlabact->SetPosition( (xrange[0]+xrange[1])/2 - xlabact->GetCenter()[0],
  349. // yrange[0]-.2*yranget, 0 );
  350. // //rend->AddActor(xlabact);
  351. // // Y label
  352. // vtkVectorText *ylabel = vtkVectorText::New();
  353. // vtkTransformPolyDataFilter *transylabel = vtkTransformPolyDataFilter::New();
  354. // vtkTransform *ytrans = vtkTransform::New();
  355. // vtkPolyDataMapper *ylabmap = vtkPolyDataMapper::New();
  356. // vtkFollower *ylabact = vtkFollower::New();
  357. // // locate and rotate as needed
  358. // ytrans->Identity();
  359. // ytrans->Scale(5,5,5); // TODO don't hard code, calc from window size maybe??
  360. // ytrans->RotateZ(90);
  361. // transylabel->SetTransform(ytrans);
  362. // transylabel->SetInputConnection(ylabel->GetOutputPort());
  363. //
  364. // ylabel->SetText("Pulse moment [A sec]");
  365. // transylabel->SetInputConnection(ylabel->GetOutputPort());
  366. // ylabmap->SetInputConnection(transylabel->GetOutputPort());
  367. // ylabact->SetMapper(ylabmap);
  368. // ylabact->SetPosition( xrange[0]-.2*xranget,
  369. // (yrange[0]+yrange[1])/2 - ylabact->GetCenter()[1],
  370. // 0 );
  371. // //rend->AddActor(ylabact);
  372. if (draw_surf)
  373. rend->AddActor(surfplot);
  374. rend->AddActor(contours);
  375. rend->AddActor(outline);
  376. if (draw_colorbar) {
  377. rend->AddActor(colorbar);
  378. }
  379. rend->SetBackground(0.25, 0.25, 0.25);
  380. // double xrange[2];
  381. // double yrange[2];
  382. // gridfunc->GetXCoordinates()->GetRange(xrange);
  383. // gridfunc->GetYCoordinates()->GetRange(yrange);
  384. // vtkCubeAxesActor *caxis = vtkCubeAxesActor::New();
  385. // caxis->ZAxisVisibilityOff();
  386. // caxis->SetCamera(rend->GetActiveCamera());
  387. // caxis->SetBounds( xrange[0], xrange[1], yrange[0], yrange[1], 0, 1 );
  388. // rend->AddActor(caxis);
  389. //rend->AddActor(yaxis);
  390. // // clean up
  391. // xlabel->Delete();
  392. // transxlabel->Delete();
  393. // trans->Delete();
  394. // xlabmap->Delete();
  395. // xlabact->Delete();
  396. //
  397. // ylabel->Delete();
  398. // transylabel->Delete();
  399. // ytrans->Delete();
  400. // ylabmap->Delete();
  401. // ylabact->Delete();
  402. // renderer is now set up!
  403. //caxis->Delete();
  404. //yaxis->Delete();
  405. contours->Delete();
  406. contlines->Delete();
  407. contourMapper->Delete();
  408. outline->Delete();
  409. outlinefilter->Delete();
  410. outlineMapper->Delete();
  411. colorbar->Delete();
  412. surfplot->Delete();
  413. mapper->Delete();
  414. geometry->Delete();
  415. }
  416. //==============================================================================
  417. /// Default constructor
  418. Quiver_VTK::Quiver_VTK(int px, int py)
  419. {
  420. has_data = false;
  421. xPix = px;
  422. yPix = py;
  423. gridfunc = vtkRectilinearGrid::New();
  424. rend = vtkRenderer::New();
  425. }
  426. /// Destructor
  427. Quiver_VTK::~Quiver_VTK()
  428. {
  429. gridfunc->Delete();
  430. rend->Delete();
  431. }
  432. /// Clear plot data before reuse
  433. void Quiver_VTK::purge()
  434. {
  435. assert(has_data);
  436. gridfunc->Delete();
  437. rend->Delete();
  438. gridfunc = vtkRectilinearGrid::New();
  439. rend = vtkRenderer::New();
  440. has_data = false;
  441. }
  442. void Quiver_VTK::renderer(double s)
  443. {
  444. assert(has_data);
  445. // filter to geometry primitive
  446. vtkRectilinearGridGeometryFilter *geometry =
  447. vtkRectilinearGridGeometryFilter::New();
  448. geometry->SetInputData(gridfunc);
  449. // make a vector glyph
  450. vtkGlyphSource2D* vec = vtkGlyphSource2D::New();
  451. vec->SetGlyphTypeToArrow();
  452. vec->SetScale(s);
  453. vec->FilledOff();
  454. vtkGlyph3D* glyph = vtkGlyph3D::New();
  455. glyph->SetInputConnection(geometry->GetOutputPort());
  456. glyph->SetSourceConnection(vec->GetOutputPort());
  457. glyph->SetColorModeToColorByScalar();
  458. // map gridfunction
  459. vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
  460. mapper->SetInputConnection(glyph->GetOutputPort());
  461. double tmp[2];
  462. gridfunc->GetScalarRange(tmp);
  463. mapper->SetScalarRange(tmp[0], tmp[1]);
  464. // create plot quiver actor
  465. vtkActor *quiver_actor = vtkActor::New();
  466. quiver_actor->SetMapper(mapper);
  467. // create colorbar
  468. vtkScalarBarActor *colorbar = vtkScalarBarActor::New();
  469. colorbar->SetLookupTable(mapper->GetLookupTable());
  470. colorbar->SetWidth(0.085);
  471. colorbar->SetHeight(0.9);
  472. colorbar->SetPosition(0.9, 0.1);
  473. vtkTextProperty* text_prop_cb = colorbar->GetLabelTextProperty();
  474. text_prop_cb->SetColor(1.0, 1.0, 1.0);
  475. colorbar->SetLabelTextProperty(text_prop_cb);
  476. // create outline
  477. vtkOutlineFilter *outlinefilter = vtkOutlineFilter::New();
  478. outlinefilter->SetInputConnection(geometry->GetOutputPort());
  479. vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
  480. outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());
  481. vtkActor *outline = vtkActor::New();
  482. outline->SetMapper(outlineMapper);
  483. outline->GetProperty()->SetColor(0, 0, 0);
  484. // add actors to renderer
  485. rend->AddActor(quiver_actor);
  486. rend->AddActor(colorbar);
  487. rend->AddActor(outline);
  488. rend->SetBackground(0.25, 0.25, 0.25);
  489. // renderer is now set up!
  490. // clean up
  491. outline->Delete();
  492. outlinefilter->Delete();
  493. outlineMapper->Delete();
  494. vec->Delete();
  495. glyph->Delete();
  496. colorbar->Delete();
  497. quiver_actor->Delete();
  498. mapper->Delete();
  499. }
  500. //==============================================================================
  501. /** Start interactive rendereing (default camera).
  502. * Sets resolution to (xPix,yPix)
  503. */
  504. void matplot::render_interactive(vtkRenderer *rend, int xPix, int yPix)
  505. {
  506. vtkRenderWindow *renWin = vtkRenderWindow::New();
  507. vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  508. renWin->AddRenderer(rend);
  509. iren->SetRenderWindow(renWin);
  510. renWin->SetSize(xPix, yPix);
  511. // makes first frame look reasonable interactive
  512. renWin->Render();
  513. renWin->Start();
  514. // Start interactive rendering
  515. iren->Initialize();
  516. iren->Start();
  517. iren->Disable();
  518. iren->Delete();
  519. renWin->Delete();
  520. }
  521. /** Start interactive rendereing (manual camera placement).
  522. * Sets resolution to (xPix,yPix)
  523. */
  524. void matplot::render_interactive_cam(vtkRenderer *rend, int xPix, int yPix,
  525. double cam[3], double focal[3])
  526. {
  527. rend->GetActiveCamera()->SetViewUp(0, 0, 1);
  528. rend->GetActiveCamera()->SetPosition(cam);
  529. rend->GetActiveCamera()->SetFocalPoint(focal);
  530. vtkRenderWindow *renWin = vtkRenderWindow::New();
  531. vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  532. renWin->AddRenderer(rend);
  533. iren->SetRenderWindow(renWin);
  534. renWin->SetSize(xPix, yPix);
  535. // Start interactive rendering
  536. iren->Initialize();
  537. iren->Start();
  538. iren->Delete();
  539. renWin->Delete();
  540. }
  541. /// Renders scene to PNG (default camera)
  542. void matplot::render_to_png(vtkRenderer *rend, int xPix, int yPix,
  543. std::string fname)
  544. {
  545. vtkRenderWindow *renWin = vtkRenderWindow::New();
  546. renWin->AddRenderer(rend);
  547. renWin->SetSize(xPix, yPix);
  548. renWin->Render();
  549. rend->Render();
  550. vtkRenderLargeImage* renderLarge = vtkRenderLargeImage::New();
  551. renderLarge->SetInput(rend);
  552. renderLarge->SetMagnification(1);
  553. vtkPNGWriter *pngfile = vtkPNGWriter::New();
  554. pngfile->SetFileName(fname.c_str());
  555. pngfile->SetInputConnection(renderLarge->GetOutputPort());
  556. pngfile->Update();
  557. pngfile->Update();
  558. pngfile->Update();
  559. pngfile->Write();
  560. renderLarge->Delete();
  561. pngfile->Delete();
  562. renWin->Delete();
  563. }
  564. /// Renders scene to PNG (manual camera placement)
  565. void matplot::render_to_png_cam(vtkRenderer *rend, int xPix, int yPix,
  566. std::string fname, double cam[3],
  567. double focal[3])
  568. {
  569. rend->GetActiveCamera()->SetViewUp(0, 0, 1);
  570. rend->GetActiveCamera()->SetPosition(cam);
  571. rend->GetActiveCamera()->SetFocalPoint(focal);
  572. vtkRenderWindow *renWin = vtkRenderWindow::New();
  573. renWin->AddRenderer(rend);
  574. renWin->SetSize(xPix, yPix);
  575. vtkRenderLargeImage* renderLarge = vtkRenderLargeImage::New();
  576. renderLarge->SetInput(rend);
  577. renderLarge->SetMagnification(1);
  578. //vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
  579. vtkPNGWriter *pngfile = vtkPNGWriter::New();
  580. //pngfile->SetInputConnection(w2i->GetOutputPort());
  581. pngfile->SetInputConnection(renderLarge->GetOutputPort());
  582. pngfile->SetFileName(fname.c_str());
  583. //w2i->SetInput(renWin);
  584. //w2i->Update();
  585. renWin->Render();
  586. pngfile->Write();
  587. //w2i->Delete();
  588. renderLarge->Delete();
  589. pngfile->Delete();
  590. renWin->Delete();
  591. }
  592. #endif