//Function (slot) to read vtk image data void Application::openvtkclicked() { QString temp = QFileDialog::getOpenFileName(this, tr("Open VTK Data File"),"",tr("VTK Data (*.vtk)")); QFile data(temp); QString line; QTextStream in(&data); in.setCodec("UTF-8"); if (data.open(QFile::ReadOnly)) { line = in.readLine(); if(line.contains("vtk") == true) { do { line = in.readLine(); if(line.contains("DATASET") == true) { //call for slicers if(line.contains("STRUCTURED_POINTS") == true)//if dataset is compatible { dataset = line; currentfile = temp; viewstructuredpointslices(); //calls this function to display slices along axes showisotog(); //generates isosurface in case, isosurfacing is true Enableall(); } else { setStatusTip("Unsupported or Invalid Dataset!!"); QErrorMessage errmsg; errmsg.showMessage(tr("Unsupported or Invalid Dataset!!")); errmsg.setWindowIcon(QIcon(":/ICONS/Head.jpg")); errmsg.exec(); } break; } } while (!line.isNull()); } else { this->setStatusTip("Invalid VTK file or file corrupt!!"); QErrorMessage errmsg; errmsg.showMessage(tr("Invalid VTK file or file corrupt!!")); errmsg.setWindowIcon(QIcon(":/ICONS/Head.jpg")); errmsg.exec(); } data.close(); } else this->setStatusTip("File Opening Failed!!"); }
//this slot takes the two points as input, for defining a new axis //for slicing, the new axis being the line joining these two points. //This axis is considered as z-axis, whose direction cosines are easily obtained //by using simple maths formula. Now, for for other two axis, idea is that they must //lie on the plane perpendicular to the axis. So by defining this plane, an arbitrary axis is //chosen from this plane as x-axis and direction cosines for y-axis is obtained by using //cross product rule. For arbitrarily chosing x-axis, concept used is that it must cut atleast //one of three coordinate planes. void Application::defineptr() { double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0,tx,ty,tz; double lx,ly,lz,mx,my,mz,nx,ny,nz; bool ok=0; CoInputDialog *dialog = new CoInputDialog(&x1,&y1,&z1,&x2,&y2,&z2,&ok); //taking input of coordinates dialog->setStyle(QStyleFactory::create("Plastique")); dialog->exec(); if(!ok) { return; } if(x1 == x2 && y1 == y2 && z1 == z2) { QErrorMessage errmsg; errmsg.showMessage(tr("Invalid Input!!")); errmsg.setWindowIcon(QIcon(":/ICONS/Head.jpg")); errmsg.exec(); return; } lz = (x2-x1)/sqrt(pow(x2-x1,2)+pow(y2-y1,2)+pow(z2-z1,2)); //direction cosines of new z-axis mz = (y2-y1)/sqrt(pow(x2-x1,2)+pow(y2-y1,2)+pow(z2-z1,2)); nz = (z2-z1)/sqrt(pow(x2-x1,2)+pow(y2-y1,2)+pow(z2-z1,2)); if(lz!=0 ) //choosing a coordinate on perpendicular plane { tz = 0; ty = 1/sqrt(1+((mz*mz)/(lz*lz))); tx = sqrt(1-(ty*ty)); } else if (mz!=0) { tx = 0; tz = 1/sqrt(1+((nz*nz)/(mz*mz))); ty = sqrt(1-(tz*tz)); } else if (nz!=0) { ty = 0; tx = 1/sqrt(1+((lz*lz)/(nz*nz))); tz = sqrt(1-(tx*tx)); } lx = tx/sqrt((tx*tx)+(ty*ty)+(tz*tz)); //direction cosines of new x-axis, based on the point choosen mx = ty/sqrt((tx*tx)+(ty*ty)+(tz*tz)); nx = tz/sqrt((tx*tx)+(ty*ty)+(tz*tz)); ly = (mz*nx) - (mx*nz); //using cross product, direction cosines of new y-axis my = (lx*nz) - (lz*nx); ny = (lz*mx) - (lx*mz); double arbaxisElements[16] = { //matrix for reslicing lx, mx, nx, 0, ly, my, ny, 0, lz, mz, nz, 0, 0, 0, 0, 1 }; pathmat = vtkMatrix4x4::New(); pathmat->DeepCopy(arbaxisElements); pathmat->SetElement(0, 3, center[0]); pathmat->SetElement(1, 3, center[1]); pathmat->SetElement(2, 3, center[2]); vtkImageReslice *reslice = vtkImageReslice::New(); //setting the new axis reslice->SetInputConnection(reader->GetOutputPort()); reslice->SetOutputDimensionality(2); reslice->SetResliceAxes(pathmat); reslice->SetInterpolationModeToLinear(); vtkImageActor *actorx = vtkImageActor::New(); actorx->SetInput(reslice->GetOutput()); vtkRenderer *rendererx = vtkRenderer::New(); rendererx->AddActor(actorx); vtkRenderWindow *windx = vtkRenderWindow::New(); windx->AddRenderer(rendererx); vtkInteractorStyleImage *imageStyle = vtkInteractorStyleImage::New(); vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New(); interactor->SetInteractorStyle(imageStyle); //setting up interactor style to image style windx->SetInteractor(interactor); ArbAxisInterCall *Intercall = new ArbAxisInterCall(); Intercall->SetImageReslice(reslice); Intercall->SetInteractor(interactor); imageStyle->AddObserver(vtkCommand::MouseMoveEvent, Intercall); //Adding observer for renedring based on mouse activies imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, Intercall); imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, Intercall); defaxwid->SetRenderWindow(windx); defaxwid->GetRenderWindow()->Render(); //rendering }