2017-02-13 1 views
0

Je définis une image de tableau 3D, la restitue et l'affiche, et y ajoute un vtkboxwidget.Comment obtenir les coordonnées de vtkboxwidget

Je veux obtenir les coordonnées de chaque angle du vtkboxwidget une fois que l'utilisateur tourne, met à l'échelle le vtkboxwidget. Comment puis-je faire ceci. Voici mon code.

#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(); 
} 

Comment puis-je obtenir les coodinates de vtkboxwidget en classe vtkCommand en temps réel. Merci beaucoup.

Répondre

1

De l'doc:

vide vtkBoxWidget :: GetPolyData (vtkPolyData * pd)
Prenez le polydata (y compris les points) qui définissent le widget box. La polydata est composée de 6 faces quadrilatérales et de 15 points. Les huit premiers points définissent les huit sommets de coin; les six suivants définissent les points de contour -x, + x, -y, + y, -z, + z; et le dernier point (le 15ème sur 15 points) définit le centre de l'hexaèdre. Ces valeurs de point sont garanties pour être à jour lorsque les événements InteractionEvent ou EndInteractionEvent sont invoqués. L'utilisateur fournit le vtkPolyData et les points et les cellules y sont ajoutés.

On dirait que c'est ce que vous cherchez, ou pas?

+0

Merci beaucoup, c'est exactement ce que je veux. Définissez la connexion d'entrée au début, et utilisez getpolydata pour obtenir les limites. Je vous remercie. box-> SetInputConnection (imageImport-> GetOutputPort()); vtkSmartPointer pd = vtkSmartPointer :: Nouveau(); box-> GetPolyData (pd); double * lié = pd-> GetBounds(); – MySuperPower

+0

Je suis heureux d'avoir pu aider. Si cela résout tout ce dont vous avez besoin, pourriez-vous marquer la réponse comme acceptée? Pour que ça disparaisse des listes de questions sans réponses ... – tomj

+0

Merci, j'ai cliqué sur le crochet gris et ça a changé en vert, est-ce que ça satisfait le besoin que vous avez dit? Je suis tellement désolé que je suis plus récent et pas bon en anglais. – MySuperPower