2017-02-13 2 views
0

Я установил данные изображения 3D-массива, визуализацию и покажу его и добавлю к нему vtkboxwidget.Как получить координаты vtkboxwidget

Я хочу получить координаты каждого угла vtkboxwidget, когда пользователь вращается, масштабирует vtkboxwidget. Как я могу это сделать. Вот мой код.

#include "myrender.h" 
#include <vtkInteractorStyleTrackballCamera.h> 
// For vtkBoxWidget: 
#include "vtkPlanes.h" 
#include "vtkBoxWidget.h" 
#include "vtkTransform.h" 
#include "vtkCommand.h" 
#include "vtkProperty.h" 
#include "vtkPlane.h" 
#include "vtkImageData.h" 
#include "vtkExtractVOI.h" 
#include "vtkBorderRepresentation.h" 
#include "vtkProp3D.h" 

class vtkMyCallback : public vtkCommand{ 
public: 
    static vtkMyCallback *New() { 
     return new vtkMyCallback; 
    } 
    virtual void Execute(
     vtkObject *caller, unsigned long, void*) { 
    // Here we use the vtkBoxWidget to transform the underlying coneActor 
    // (by manipulating its transformation matrix). 
    vtkSmartPointer<vtkTransform> t = 
     vtkSmartPointer<vtkTransform>::New(); 
    vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller); 
    widget->GetTransform(t); 
    //widget->GetProp3D()->SetUserTransform(t); 
    double *pos = t->GetPosition(); 
    t->GetMatrix(); 
    std::cout<<"position: "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<std::endl; 
}}; 
MyRender::MyRender() { 
    ROIdata = NULL; 
    ROI_sz0 = 0; 
    ROI_sz1 = 0; 
    ROI_sz2 = 0; 
} 

MyRender::~MyRender() { 

} 

void MyRender::setData(unsigned char *ROIdata, int ROI_sz0, int ROI_sz1,  int ROI_sz2) { 
    this->ROIdata = ROIdata; 
    this->ROI_sz0 = ROI_sz0; 
    this->ROI_sz1 = ROI_sz1; 
    this->ROI_sz2 = ROI_sz2; 
} 

void MyRender::render(vtkSmartPointer<vtkRenderWindow> renWin) { 
int width = ROI_sz0; 
int height = ROI_sz1; 
int depth = ROI_sz2; 
/** 
* RENDER WHOLE BRAIN DATA AND SHOW. 
*/ 
//Convert the c-style image to a vtkImageData 
vtkSmartPointer<vtkImageImport> imageImport = vtkSmartPointer<vtkImageImport>::New(); 
imageImport->SetImportVoidPointer(ROIdata); 
imageImport->SetDataScalarTypeToUnsignedChar(); 
imageImport->SetNumberOfScalarComponents(1); 
imageImport->SetDataSpacing(1.0, 1.0, 1.0); 
imageImport->SetDataOrigin(0, 0, 0); 
imageImport->SetDataExtent(0, width-1, 0, height-1, 0, depth-1); 
imageImport->SetWholeExtent(0, width-1, 0, height-1, 0, depth-1); 
imageImport->Update(); 
int *arr = imageImport->GetOutput()->GetDimensions(); 
std::cout<<"x size: "<<arr[0]<<" y size: "<<arr[1]<<" z size: "<<arr[2]<<std::endl; 
//Create the standard ren, render window, and interactor 
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); 
//Create transfer mapping scalar value to opacity 
vtkSmartPointer<vtkPiecewiseFunction> opacityFunc = vtkSmartPointer<vtkPiecewiseFunction>::New(); 
opacityFunc->AddPoint(0, 0.0); 
opacityFunc->AddPoint(512, 1.0); 
opacityFunc->ClampingOff(); 
//Create transfer mapping scalar value to color 
vtkSmartPointer<vtkColorTransferFunction> colorFunc 
     = vtkSmartPointer<vtkColorTransferFunction>::New(); 
colorFunc->AddRGBPoint(150, 1.0, 1.0, 1.0); 
//The property describes how the data will look 
vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New(); 
volumeProperty->SetColor(colorFunc); 
volumeProperty->SetScalarOpacity(opacityFunc); 
volumeProperty->ShadeOn(); 
volumeProperty->SetInterpolationTypeToLinear(); 
vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper = vtkSmartPointer<vtkSmartVolumeMapper>::New(); 
volumeMapper->SetInputConnection(imageImport->GetOutputPort()); 
//The volume holds the mapper and the property and can be used to position/orient the volume 
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); 
volume->SetMapper(volumeMapper); 
volume->SetProperty(volumeProperty); 
ren->AddVolume(volume); 
ren->SetBackground(0, 0, 0); 

vtkSmartPointer<vtkBoxWidget> box = vtkSmartPointer<vtkBoxWidget>::New(); 
box->SetInteractor(renWin->GetInteractor()); 
box->SetPlaceFactor(1); 
box->SetInputConnection(imageImport->GetOutputPort()); 
box->PlaceWidget(); 
box->InsideOutOn(); 
box->SetProp3D(volume); 
box->GetOutlineProperty()->SetRepresentationToSurface(); 
box->GetOutlineProperty()->SetOpacity(1.0); 
box->RotationEnabledOff(); 
vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New(); 
box->AddObserver(vtkCommand::InteractionEvent, callback); 
box->On(); 

renWin->AddRenderer(ren); 
renWin->Render(); 
} 

Как я могу получить coodinates из vtkboxwidget в классе vtkCommand в режиме реального времени. Большое спасибо.

ответ

1

doc От:

аннулируются vtkBoxWidget :: GetPolyData (vtkPolyData * П.Д.)
захватить polydata (включая точки), которые определяют виджет окошка. Полидата состоит из 6 четырехсторонних граней и 15 точек. Первые восемь точек определяют восемь угловых вершин; следующие шесть определяют граничные точки -x, + x, -y, + y, -z, + z; и конечная точка (15-я из 15 точек) определяет центр гексаэдра. Эти точечные значения гарантированно будут обновлены при вызове событий InteractionEvent или EndInteractionEvent. Пользователь предоставляет vtkPolyData, и к нему добавляются точки и ячейки.

Похоже, это то, что вы ищете, или нет?

+0

Большое спасибо, это именно то, что я хочу. установить входное соединение в начале и использовать getpolydata для получения границ. Спасибо. box-> SetInputConnection (imageImport-> GetOutputPort()); vtkSmartPointer pd = vtkSmartPointer :: New(); box-> GetPolyData (pd); double * bound = pd-> GetBounds(); – MySuperPower

+0

Рад, что я мог помочь. Если это решает все, что вам нужно, можете ли вы пометить ответ как принятый? Чтобы он исчез из списка оставшихся без ответа вопросов ... – tomj

+0

Спасибо, я нажал на серый крючок, и он изменился на зеленый, это удовлетворило необходимость, о которой вы говорили? Мне очень жаль, что я новичок и не очень хорош на английском. – MySuperPower

Смежные вопросы