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.
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
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
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