/* * Copyright (C) 2008,2009,2010 Thorsten Liebig (Thorsten.Liebig@gmx.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include "QVTKStructure.h" #include "QVTKWidget.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkAxesActor.h" #include "vtkActor.h" #include "ContinuousStructure.h" #include "ParameterCoord.h" #include "VTKPrimitives.h" #include "vtkCubeSource.h" #include "vtkPolyDataMapper.h" #include "vtkCellArray.h" #include "vtkActor.h" #include "vtkLODActor.h" #include "vtkFollower.h" #include "vtkAxes.h" #include "vtkVectorText.h" #include "vtkFollower.h" #include "vtkTextProperty.h" #include "vtkTextActor.h" #include "vtkCamera.h" #include "vtkProperty.h" #include "vtkOrientationMarkerWidget.h" #include "vtkPropAssembly.h" #include "vtkTextProperty.h" #include "vtkCaptionActor2D.h" #include "vtkRectilinearGrid.h" #include "vtkRectilinearGridGeometryFilter.h" #include "vtkDoubleArray.h" #include "vtkActorCollection.h" #include "vtkInteractorStyle.h" #include "vtkCommand.h" #include "vtkCallbackCommand.h" #include "vtkWindowToImageFilter.h" #include "vtkPNGWriter.h" #include #include #include #include #include "vtkInteractorStyleRubberBand2DPlane.h" #include #include "CSPrimPoint.h" #include "CSPrimBox.h" #include "CSPrimMultiBox.h" #include "CSPrimSphere.h" #include "CSPrimSphericalShell.h" #include "CSPrimCylinder.h" #include "CSPrimCylindricalShell.h" #include "CSPrimPolygon.h" #include "CSPrimLinPoly.h" #include "CSPrimRotPoly.h" #include "CSPrimPolyhedron.h" #include "CSPrimCurve.h" #include "CSPrimWire.h" #include "CSPrimUserDefined.h" #include "CSPropDiscMaterial.h" #include "CSTransform.h" QVTKStructure::QVTKStructure() { clCS=NULL; ActorGridPlane[0]=NULL; ActorGridPlane[1]=NULL; ActorGridPlane[2]=NULL; m_Rect_Grid = NULL; m_Struct_Grid = NULL; m_CamData = NULL; iResolution=32; AllowUpdate=true; VTKWidget= new QVTKWidget(); ren = vtkRenderer::New(); VTKWidget->GetRenderWindow()->AddRenderer(ren); AddAxes(); SetBackgroundColor(255,255,255); SetCallback(VTKWidget->GetRenderWindow()->GetInteractor()); } QVTKStructure::~QVTKStructure() { clear(); } void QVTKStructure::AddAxes() { Axes = vtkAxesActor::New(); Axes->SetTotalLength(4,4,4); vtkOrientationMarkerWidget* marker = vtkOrientationMarkerWidget::New(); vtkPropAssembly* assembly = vtkPropAssembly::New(); assembly->AddPart(Axes); marker->SetOrientationMarker(assembly); marker->SetViewport(0.0,0.0,0.25,0.25); marker->SetInteractor(VTKWidget->GetRenderWindow()->GetInteractor()); marker->SetEnabled(1); marker->InteractiveOff(); //assembly->Delete(); //marker->Delete(); } void QVTKStructure::SetBackgroundColor(int r, int g, int b) { double rgb[3]={(double)r/255.0,(double)g/255.0,(double)b/255.0}; double irgb[3]={1-rgb[0],1-rgb[1],1-rgb[2]}; ren->SetBackground(rgb); Axes->GetXAxisCaptionActor2D()->GetCaptionTextProperty()->SetColor(irgb); Axes->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->SetColor(irgb); Axes->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->SetColor(irgb); for (int i=0;i<3;++i) { if (ActorGridPlane[i]!=NULL) ActorGridPlane[i]->GetProperty()->SetColor(irgb); } VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::SetGeometry(ContinuousStructure *CS) { clear(); clCS=CS; } void QVTKStructure::clear() { for (int i=0;iRemoveActor(ActorGridPlane[i]); ActorGridPlane[i]->Delete(); ActorGridPlane[i]=NULL; } } if (m_Rect_Grid) m_Rect_Grid->Delete(); m_Rect_Grid=NULL; if (m_Struct_Grid) m_Struct_Grid->Delete(); m_Struct_Grid=NULL; } void QVTKStructure::RenderGrid() { if (clCS==NULL) return; CSRectGrid* CSGrid = clCS->GetGrid(); if (CSGrid->isValid()==false) return; if (CSGrid->GetMeshType()==CARTESIAN) { if (m_Rect_Grid) m_Rect_Grid->Delete(); m_Rect_Grid = vtkRectilinearGrid::New(); vtkDoubleArray *Coords[3]; int iQty[3]; for (int n=0;n<3;++n) { iQty[n]=CSGrid->GetQtyLines(n); Coords[n]=vtkDoubleArray::New(); for (int m=0;mInsertNextValue(CSGrid->GetLine(n,m)); } if (iQty[0]*iQty[1]*iQty[2]==0) { for (int n=0;n<3;++n) Coords[n]->Delete(); return; } m_Rect_Grid->SetDimensions(iQty[0],iQty[1],iQty[2]); m_Rect_Grid->SetXCoordinates(Coords[0]); m_Rect_Grid->SetYCoordinates(Coords[1]); m_Rect_Grid->SetZCoordinates(Coords[2]); for (int n=0;n<3;++n) Coords[n]->Delete(); } else if (CSGrid->GetMeshType()==CYLINDRICAL) { if (m_Struct_Grid) m_Struct_Grid->Delete(); m_Struct_Grid = vtkStructuredGrid::New(); unsigned int uiQty[3]; double* lines[3]={NULL,NULL,NULL}; for (unsigned int n=0;n<3;++n) lines[n] = CSGrid->GetLines(n,lines[n],uiQty[n]); m_Struct_Grid->SetDimensions(uiQty[0],uiQty[1],uiQty[2]); vtkPoints *points = vtkPoints::New(); points->SetNumberOfPoints(uiQty[0]*uiQty[1]*uiQty[2]); double r[3]; int id=0; for (unsigned int k=0; kSetPoint(id++,r); } m_Struct_Grid->SetPoints(points); points->Delete(); for (unsigned int n=0;n<3;++n) { delete[] lines[n]; lines[n] = NULL; } } else cerr << "QVTKStructure::RenderGrid(): Error, unknown grid type!" << endl; RenderGridDir(0,0); RenderGridDir(1,0); RenderGridDir(2,0); } void QVTKStructure::RenderGridX(int plane_pos) { RenderGridDir(0,plane_pos); VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::RenderGridY(int plane_pos) { RenderGridDir(1,plane_pos); VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::RenderGridZ(int plane_pos) { RenderGridDir(2,plane_pos); VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::RenderGridDir(int dir, unsigned int plane_pos) { if (ActorGridPlane[dir]!=NULL) { ren->RemoveActor(ActorGridPlane[dir]); ActorGridPlane[dir]->Delete(); } ActorGridPlane[dir] = vtkLODActor::New(); vtkPolyDataMapper *gridMapper = vtkPolyDataMapper::New(); vtkPolyDataAlgorithm *plane = NULL; CSRectGrid* CSGrid = clCS->GetGrid(); int uiQty[3]; for (int n=0;n<3;++n) uiQty[n]=CSGrid->GetQtyLines(n); if ((int)plane_pos>=uiQty[dir]) { cerr << "QVTKStructure::RenderGridDir: requested plane postion is out of range, resetting to max value!" << endl; plane_pos = uiQty[dir]-1; } if (CSGrid->GetMeshType()==CARTESIAN) { if (m_Rect_Grid==NULL) { ActorGridPlane[dir]->Delete(); gridMapper->Delete(); ActorGridPlane[dir]=NULL; cerr << "QVTKStructure::RenderGridDir: Error, rect grid mesh was not created, skipping drawing..." << endl; return; } vtkRectilinearGridGeometryFilter *grid_plane = vtkRectilinearGridGeometryFilter::New(); plane = grid_plane; #if VTK_MAJOR_VERSION>=6 grid_plane->SetInputData(m_Rect_Grid); #else grid_plane->SetInput(m_Rect_Grid); #endif switch (dir) { case 2: { grid_plane->SetExtent(0,uiQty[0]-1, 0,uiQty[1]-1, plane_pos,plane_pos); break; } case 1: { grid_plane->SetExtent(0,uiQty[0]-1, plane_pos,plane_pos, 0,uiQty[2]-1); break; } case 0: { grid_plane->SetExtent(plane_pos,plane_pos, 0,uiQty[1]-1, 0,uiQty[2]-1); break; } } } else if (CSGrid->GetMeshType()==CYLINDRICAL) { if (m_Struct_Grid==NULL) { ActorGridPlane[dir]->Delete(); gridMapper->Delete(); ActorGridPlane[dir]=NULL; cerr << "QVTKStructure::RenderGridDir: Error, structured grid mesh was not created, skipping drawing..." << endl; return; } vtkStructuredGridGeometryFilter *grid_plane = vtkStructuredGridGeometryFilter::New(); plane = grid_plane; #if VTK_MAJOR_VERSION>=6 grid_plane->SetInputData(m_Struct_Grid); #else grid_plane->SetInput(m_Struct_Grid); #endif switch (dir) { case 2: { grid_plane->SetExtent(0,uiQty[0]-1, 0,uiQty[1]-1, plane_pos,plane_pos); break; } case 1: { grid_plane->SetExtent(0,uiQty[0]-1, plane_pos,plane_pos, 0,uiQty[2]-1); break; } case 0: { grid_plane->SetExtent(plane_pos,plane_pos, 0,uiQty[1]-1, 0,uiQty[2]-1); break; } } } else cerr << "QVTKStructure::RenderGrid(): Error, unknown grid type!" << endl; gridMapper->SetInputConnection(plane->GetOutputPort()); ActorGridPlane[dir]->SetMapper(gridMapper); ActorGridPlane[dir]->GetProperty()->SetColor(0,0,0); ActorGridPlane[dir]->GetProperty()->SetDiffuse(0); ActorGridPlane[dir]->GetProperty()->SetAmbient(1); ActorGridPlane[dir]->GetProperty()->SetRepresentationToWireframe(); ActorGridPlane[dir]->GetProperty()->SetOpacity((double)GridOpacity/255.0); ren->AddActor(ActorGridPlane[dir]); gridMapper->Delete(); plane->Delete(); } void QVTKStructure::SetGridOpacity(int val) { GridOpacity = val; if (AllowUpdate==false) return; for (int i=0;i<3;++i) { if (ActorGridPlane[i]!=NULL) ActorGridPlane[i]->GetProperty()->SetOpacity((double)val/255.0); } VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::ResetView() { ren->ResetCamera(); VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::setXY() { vtkCamera* cam=ren->GetActiveCamera(); ren->ResetCamera(); double fp[3]; cam->SetViewUp(0.5,0.5,0.5); cam->GetFocalPoint(fp); fp[2]+=1; cam->SetPosition(fp); cam->SetRoll(0); ResetView(); } void QVTKStructure::setYZ() { vtkCamera* cam=ren->GetActiveCamera(); ren->ResetCamera(); double fp[3]; cam->SetViewUp(0.5,0.5,0.5); cam->GetFocalPoint(fp); fp[0]+=1; cam->SetPosition(fp); cam->SetRoll(-90); ResetView(); } void QVTKStructure::setZX() { vtkCamera* cam=ren->GetActiveCamera(); ren->ResetCamera(); double fp[3]; cam->SetViewUp(0.5,0.5,0.5); cam->GetFocalPoint(fp); fp[1]+=1; cam->SetPosition(fp); cam->SetRoll(90); ResetView(); } void QVTKStructure::SetPropOpacity(unsigned int uiID, int val) { for (int i=0;iSetOpacity2All((double)val/255.0); } } VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::RenderGeometry() { for (int i=0;iGetQtyProperties(); for (int i=0;iGetProperty(i); if (prop==NULL) return; int QtyPrim=prop->GetQtyPrimitives(); if (QtyPrim>0) { VTKLayerStruct layStruct; VTKPrimitives* vtkPrims= new VTKPrimitives(ren); layStruct.VTKProp=vtkPrims; layStruct.uID=prop->GetUniqueID(); LayerPrimitives.append(layStruct); RGBa col=prop->GetFillColor(); if (prop->GetVisibility()==false) col.a=0; double rgb[3]={(double)col.R/255.0,(double)col.G/255.0,(double)col.B/255.0}; for (int n=0;nGetPrimitive(n); if (prim==NULL) return; CoordinateSystem primCS = prim->GetCoordinateSystem(); CSTransform* transform = prim->GetTransform(); double* transform_matrix = NULL; if (transform) transform_matrix = transform->GetMatrix(); if (primCS==UNDEFINED_CS) primCS=clCS->GetCoordInputType(); switch (prim->GetType()) { case CSPrimitives::BOX: { CSPrimBox* box = prim->ToBox(); if (primCS==CARTESIAN) vtkPrims->AddCube(box->GetStartCoord()->GetCartesianCoords(),box->GetStopCoord()->GetCartesianCoords(),rgb,(double)col.a/255.0,transform_matrix); else if (primCS==CYLINDRICAL) vtkPrims->AddCylindricalCube(box->GetStartCoord()->GetCylindricalCoords(),box->GetStopCoord()->GetCylindricalCoords(),rgb,(double)col.a/255.0,transform_matrix); break; } case CSPrimitives::MULTIBOX: { CSPrimMultiBox* multibox = prim->ToMultiBox(); int qtyPts=multibox->GetQtyBoxes()*2; double *coords = new double[qtyPts*3]; for (int a=0;aGetCoord(3*a); coords[a+1]=multibox->GetCoord(3*a+1); coords[qtyPts+a]=multibox->GetCoord(3*a+2); coords[qtyPts+a+1]=multibox->GetCoord(3*a+3); coords[2*qtyPts+a]=multibox->GetCoord(3*a+4); coords[2*qtyPts+a+1]=multibox->GetCoord(3*a+5); } vtkPrims->AddDisc(coords,qtyPts,rgb,(double)col.a/255.0,transform_matrix); delete[] coords; break; } case CSPrimitives::SPHERE: { CSPrimSphere* sphere = prim->ToSphere(); vtkPrims->AddSphere(sphere->GetCenter()->GetCartesianCoords(),sphere->GetRadius(),rgb,(double)col.a/255.0,iResolution,transform_matrix); break; } case CSPrimitives::SPHERICALSHELL: { CSPrimSphericalShell* sphereshell = prim->ToSphericalShell(); const double* center = sphereshell->GetCenter()->GetCartesianCoords(); const double radius = sphereshell->GetRadius(); const double shellWidth = sphereshell->GetShellWidth(); vtkPrims->AddSphericalShell(center, radius-shellWidth/2, radius+shellWidth/2, rgb, (double)col.a/255.0, iResolution, transform_matrix); break; } case CSPrimitives::CYLINDER: { CSPrimCylinder* cylinder = prim->ToCylinder(); vtkPrims->AddCylinder2(cylinder->GetAxisStartCoord()->GetCartesianCoords(),cylinder->GetAxisStopCoord()->GetCartesianCoords(),cylinder->GetRadius(),rgb,(double)col.a/255.0,iResolution,transform_matrix); break; } case CSPrimitives::CYLINDRICALSHELL: { CSPrimCylindricalShell* cylinder = prim->ToCylindricalShell(); const double* start = cylinder->GetAxisStartCoord()->GetCartesianCoords(); const double* stop = cylinder->GetAxisStopCoord()->GetCartesianCoords(); const double radius = cylinder->GetRadius(); const double shellWidth = cylinder->GetShellWidth(); vtkPrims->AddCylindricalShell( start, stop, radius-shellWidth/2, radius+shellWidth/2, rgb, (double)col.a/255.0, iResolution, transform_matrix ); break; } case CSPrimitives::POLYGON: case CSPrimitives::LINPOLY: case CSPrimitives::ROTPOLY: { CSPrimPolygon* poly = NULL; if (prim->GetType()==CSPrimitives::POLYGON) poly = prim->ToPolygon(); else if (prim->GetType()==CSPrimitives::LINPOLY) poly = prim->ToLinPoly(); else if (prim->GetType()==CSPrimitives::ROTPOLY) poly = prim->ToRotPoly(); int normDir = poly->GetNormDir(); double elev = poly->GetElevation(); int nP = (normDir+1)%3; int nPP = (normDir+2)%3; int nrPts = poly->GetQtyCoords(); double dCoords[3*nrPts]; for (int n=0;nGetCoord(2*n); dCoords[nPP*nrPts + n] = poly->GetCoord(2*n+1); } double dVector[6] = {0,0,0,0,0,0}; if (prim->GetType()==CSPrimitives::POLYGON) vtkPrims->AddClosedPoly(dCoords,nrPts,dVector,rgb,(double)col.a/255.0,transform_matrix); if (prim->GetType()==CSPrimitives::LINPOLY) { dVector[normDir] = prim->ToLinPoly()->GetLength(); vtkPrims->AddClosedPoly(dCoords,nrPts,dVector,rgb,(double)col.a/255.0,transform_matrix); } if (prim->GetType()==CSPrimitives::ROTPOLY) { dVector[2*prim->ToRotPoly()->GetRotAxisDir()+1]=1; double angles[2] = {prim->ToRotPoly()->GetAngle(0)*180/PI,prim->ToRotPoly()->GetAngle(1)*180/PI}; vtkPrims->AddRotationalPoly(dCoords,nrPts,dVector,angles,rgb,(double)col.a/255.0,32,transform_matrix); } break; } case CSPrimitives::POLYHEDRONREADER: case CSPrimitives::POLYHEDRON: { CSPrimPolyhedron* polyhedron = dynamic_cast(prim); vtkCellArray *poly = vtkCellArray::New(); vtkPolyData* polydata=vtkPolyData::New(); vtkPoints *points = vtkPoints::New(); for (unsigned int i=0; iGetNumVertices();i++) points->InsertPoint(i,polyhedron->GetVertex(i)); unsigned int numVertex; int* vertices; for (unsigned int i=0; iGetNumFaces();++i) { if (polyhedron->GetFaceValid(i)==false) continue; vertices=polyhedron->GetFace(i,numVertex); poly->InsertNextCell(numVertex); for (unsigned int p=0; pInsertCellPoint(vertices[p]); } polydata->SetPoints(points); polydata->SetPolys(poly); vtkPrims->AddPolyData(polydata,rgb,(double)col.a/255.0,transform_matrix); poly->Delete(); points->Delete(); polydata->Delete(); break; } // case CSPrimitives::POLYHEDRONREADER: // { // CSPrimPolyhedronReader* reader = prim->ToPolyhedronReader(); // double center[]={0,0,0}; // vtkPrims->AddSTLObject(reader->GetFilename().c_str(),center,rgb,(double)col.a/255.0,transform_matrix); // break; // } case CSPrimitives::CURVE: case CSPrimitives::WIRE: { CSPrimCurve* curve = NULL; if (prim->GetType()==CSPrimitives::CURVE) curve = prim->ToCurve(); else curve = prim->ToWire(); unsigned int nrP = (unsigned int)curve->GetNumberOfPoints(); double dCoords[3*nrP]; double xyz[3]; bool isCurve = (prim->GetType()==CSPrimitives::CURVE); for (unsigned int n=0;nGetPoint(n,xyz,CARTESIAN,isCurve); dCoords[0*nrP+n] = xyz[0]; dCoords[1*nrP+n] = xyz[1]; dCoords[2*nrP+n] = xyz[2]; } if (isCurve) vtkPrims->AddLinePoly(dCoords,nrP,1,rgb,(double)col.a/255.0); else { CSPrimWire* wire = prim->ToWire(); vtkPrims->AddTubePoly(dCoords,nrP,wire->GetWireRadius(),rgb,(double)col.a/255.0,8,transform_matrix); } break; } } } } } VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::RenderDiscMaterialModel() { for (int i=0;iGetQtyProperties();++i) { CSProperties* prop = clCS->GetProperty(i); CSPropDiscMaterial* dm_prop = prop->ToDiscMaterial(); if (dm_prop) { VTKDiscModel model; VTKPrimitives* vtkPrims= new VTKPrimitives(ren); model.vtk_model = vtkPrims; model.uID = dm_prop->GetUniqueID(); m_DiscMatModels.append(model); vtkPolyData* polydata = dm_prop->CreatePolyDataModel(); double rgb[3] = {1,1,1}; CSTransform* transform = new CSTransform(dm_prop->GetTransform()); transform->SetPreMultiply(); transform->Scale(dm_prop->GetScale()); double* transform_matrix = NULL; if (transform) transform_matrix = transform->GetMatrix(); vtkPrims->AddPolyData(polydata,rgb,1.0,transform_matrix); delete transform; } } VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::SetParallelProjection(bool val, bool render) { vtkCamera* cam = ren->GetActiveCamera(); cam->SetParallelProjection(val); if (render) VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::Set2DInteractionStyle(bool val, bool render) { if (val) VTKWidget->GetRenderWindow()->GetInteractor()->SetInteractorStyle(vtkInteractorStyleRubberBand2DPlane::New()); else VTKWidget->GetRenderWindow()->GetInteractor()->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New()); if (render) VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::SaveCamData() { if (m_CamData==NULL) m_CamData = new CamData; vtkCamera *Camera = ren->GetActiveCamera(); Camera->GetPosition(m_CamData->pos); Camera->GetFocalPoint(m_CamData->focalPoint); Camera->GetViewUp(m_CamData->viewUp); m_CamData->viewAngle = Camera->GetViewAngle(); } void QVTKStructure::RestoreCamData(bool render) { if (m_CamData==NULL) return; vtkCamera *Camera = ren->GetActiveCamera(); Camera->SetPosition( m_CamData->pos ); Camera->SetFocalPoint( m_CamData->focalPoint ); Camera->SetViewUp( m_CamData->viewUp ); Camera->SetViewAngle( m_CamData->viewAngle ); Camera->Modified(); if (render) VTKWidget->GetRenderWindow()->GetInteractor()->Render(); } void QVTKStructure::ExportView2Image() { QString filename = QFileDialog::getSaveFileName(VTKWidget, tr("Choose file to save image"), QString(), tr("Images (*.png)")); if (filename.isEmpty()) return; vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New(); filter->SetInput(VTKWidget->GetRenderWindow()); vtkPNGWriter* png_writer= vtkPNGWriter::New(); png_writer->SetInputConnection(filter->GetOutputPort()); //png_writer->SetQuality(100); png_writer->SetFileName(filename.toStdString().c_str()); png_writer->Write(); } void QVTKStructure::ExportProperty2PolyDataVTK(unsigned int uiID, QString filename, double scale) { for (int i=0;iWritePolyData2File(name.toStdString().c_str(), scale); } } } for (int i=0;iWritePolyData2File(name.toStdString().c_str(), scale); } } } } void QVTKStructure::ExportProperty2STL(unsigned int uiID, QString filename, double scale) { for (int i=0;iWritePolyData2STL(name.toStdString().c_str(), scale); } } } } void QVTKStructure::ExportProperty2PLY(unsigned int uiID, QString filename, double scale) { for (int i=0;iWritePolyData2PLY(name.toStdString().c_str(), scale); } } } } void QVTKStructure::KeyPress(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata) { UNUSED(caller); UNUSED(eid); UNUSED(calldata); //vtkInteractorStyle * istyle = (vtkInteractorStyle *) caller; vtkRenderWindowInteractor * iren = ((KeyPressData *)clientdata)->iren; //vtkRenderWindow *renWin = iren->GetRenderWindow(); vtkActor **GridPlanes = ((KeyPressData *)clientdata)->GridPlanes; //vtkRenderer *ren = ((KeyPressData *)clientdata)->ren; int key; key=iren->GetKeyCode(); // fprintf(stderr,"Event... EiD: %d Key: %d OpenGL?: %d\n",eid,key,renWin->SupportsOpenGL()); switch(key) { case 's': { for (int n=0;n<3;++n) { if (GridPlanes[n]) GridPlanes[n]->GetProperty()->SetRepresentationToWireframe(); } iren->Render(); break; } } } void QVTKStructure::SetCallback(vtkRenderWindowInteractor *iren) { ren->GetActiveCamera()->SetFocalPoint(0,0,0); //Callback KeyPressData *cbData = new KeyPressData; cbData->GridPlanes=ActorGridPlane; cbData->ren=ren; cbData->iren=iren; vtkCallbackCommand *cb = vtkCallbackCommand::New(); cb->SetCallback(KeyPress); cb->SetClientData((void *)cbData); iren->AddObserver(vtkCommand::KeyReleaseEvent, cb); //VTKWidget->GetRenderWindow()->GetInteractor()->AddObserver(vtkCommand::KeyReleaseEvent, cb); cb->Delete(); // free(cbData); }