fixed vtk containerbox handler
This commit is contained in:
@@ -46,15 +46,7 @@ namespace uLib {
|
||||
namespace Vtk {
|
||||
|
||||
vtkDetectorChamber::vtkDetectorChamber(DetectorChamber *content)
|
||||
: vtkContainerBox(content), m_Actor(vtkActor::New()),
|
||||
m_Widget(vtkBoxWidget::New()) {
|
||||
m_Callback = vtkWidgetCallback::New();
|
||||
m_PickerCallback = vtkSelectionCallback::New();
|
||||
|
||||
m_Callback->SetChamber(this);
|
||||
m_PickerCallback->SetChamber(this);
|
||||
m_Widget->AddObserver(vtkCommand::InteractionEvent, m_Callback);
|
||||
|
||||
: vtkContainerBox(content), m_Actor(vtkActor::New()) {
|
||||
m_InitialTransform = vtkSmartPointer<vtkTransform>::New();
|
||||
m_RelativeTransform = vtkSmartPointer<vtkTransform>::New();
|
||||
m_TotalTransform = vtkSmartPointer<vtkTransform>::New();
|
||||
@@ -64,9 +56,6 @@ vtkDetectorChamber::vtkDetectorChamber(DetectorChamber *content)
|
||||
|
||||
vtkDetectorChamber::~vtkDetectorChamber() {
|
||||
m_Actor->Delete();
|
||||
m_Widget->Delete();
|
||||
m_Callback->Delete();
|
||||
m_PickerCallback->Delete();
|
||||
}
|
||||
|
||||
DetectorChamber *vtkDetectorChamber::GetContent() {
|
||||
@@ -77,20 +66,8 @@ void vtkDetectorChamber::PrintSelf(std::ostream &o) const {
|
||||
vtkContainerBox::PrintSelf(o);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect the interactor to the widget
|
||||
*/
|
||||
void vtkDetectorChamber::ConnectInteractor(
|
||||
vtkRenderWindowInteractor *interactor) {
|
||||
if (!interactor)
|
||||
return;
|
||||
m_Widget->SetInteractor(interactor);
|
||||
m_Widget->SetProp3D(m_Actor);
|
||||
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, m_PickerCallback);
|
||||
}
|
||||
|
||||
void vtkDetectorChamber::SetTransform(vtkTransform *t) {
|
||||
|
||||
if (!t) return;
|
||||
|
||||
m_RelativeTransform->SetMatrix(t->GetMatrix());
|
||||
m_RelativeTransform->Update();
|
||||
@@ -107,11 +84,22 @@ void vtkDetectorChamber::SetTransform(vtkTransform *t) {
|
||||
this->Update();
|
||||
}
|
||||
|
||||
vtkBoxWidget *vtkDetectorChamber::GetWidget() { return m_Widget; }
|
||||
|
||||
void vtkDetectorChamber::Update() {
|
||||
if (m_Actor->GetMapper())
|
||||
m_Actor->GetMapper()->Update();
|
||||
|
||||
// If the actor has a UserMatrix, we update the content.
|
||||
if (m_Actor->GetUserMatrix()) {
|
||||
vtkMatrix4x4* vmat = m_Actor->GetUserMatrix();
|
||||
Matrix4f transform;
|
||||
for (int i = 0; i < 4; ++i)
|
||||
for (int j = 0; j < 4; ++j)
|
||||
transform(i, j) = vmat->GetElement(i, j);
|
||||
|
||||
this->GetContent()->SetMatrix(transform);
|
||||
this->GetContent()->Updated();
|
||||
}
|
||||
|
||||
BaseClass::Update();
|
||||
}
|
||||
|
||||
@@ -144,56 +132,14 @@ void vtkDetectorChamber::InstallPipe() {
|
||||
m_Actor->GetProperty()->SetOpacity(0.4);
|
||||
m_Actor->GetProperty()->SetAmbient(0.7);
|
||||
|
||||
// Temporarily disable UserTransform to place widget on local base
|
||||
m_Widget->SetProp3D(m_Actor);
|
||||
|
||||
m_TotalTransform->SetInput(m_RelativeTransform);
|
||||
m_TotalTransform->Concatenate(m_InitialTransform);
|
||||
m_Actor->SetUserTransform(m_TotalTransform);
|
||||
m_TotalTransform->Update();
|
||||
|
||||
m_Widget->PlaceWidget();
|
||||
m_Widget->SetPlaceFactor(2);
|
||||
|
||||
this->SetProp(m_Actor);
|
||||
this->Update();
|
||||
}
|
||||
|
||||
void vtkDetectorChamber::vtkWidgetCallback::Execute(vtkObject *caller,
|
||||
unsigned long, void *) {
|
||||
vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget *>(caller);
|
||||
|
||||
// Get the Relative transform from the widget //
|
||||
vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New();
|
||||
widget->GetTransform(t);
|
||||
chamber->SetTransform(t);
|
||||
|
||||
// Apply to both the content and the actor state //
|
||||
chamber->Update();
|
||||
}
|
||||
|
||||
void vtkDetectorChamber::vtkSelectionCallback::Execute(vtkObject *caller,
|
||||
unsigned long, void *) {
|
||||
vtkRenderWindowInteractor *interactor =
|
||||
reinterpret_cast<vtkRenderWindowInteractor *>(caller);
|
||||
vtkSmartPointer<vtkPropPicker> picker = vtkSmartPointer<vtkPropPicker>::New();
|
||||
int *pos = interactor->GetEventPosition();
|
||||
picker->Pick(
|
||||
pos[0], pos[1], 0,
|
||||
interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
|
||||
|
||||
vtkProp *picked = picker->GetViewProp();
|
||||
if (picked == chamber->m_Actor) {
|
||||
if (!chamber->m_Widget->GetEnabled()) {
|
||||
chamber->m_Widget->SetInteractor(interactor);
|
||||
chamber->m_Widget->On();
|
||||
}
|
||||
} else {
|
||||
if (chamber->m_Widget->GetEnabled()) {
|
||||
chamber->m_Widget->Off();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Vtk
|
||||
} // namespace uLib
|
||||
@@ -56,11 +56,7 @@ public:
|
||||
|
||||
void SetTransform(class vtkTransform *t);
|
||||
|
||||
class vtkBoxWidget *GetWidget();
|
||||
|
||||
void Update();
|
||||
|
||||
void ConnectInteractor(vtkRenderWindowInteractor *interactor) override;
|
||||
void Update() override;
|
||||
|
||||
void PrintSelf(std::ostream &o) const;
|
||||
|
||||
@@ -68,30 +64,7 @@ protected:
|
||||
void InstallPipe() override;
|
||||
|
||||
private:
|
||||
class vtkWidgetCallback : public vtkCommand {
|
||||
public:
|
||||
static vtkWidgetCallback *New() { return new vtkWidgetCallback; }
|
||||
void SetChamber(uLib::Vtk::vtkDetectorChamber *ch) { this->chamber = ch; }
|
||||
virtual void Execute(vtkObject *caller, unsigned long, void *) override;
|
||||
|
||||
private:
|
||||
uLib::Vtk::vtkDetectorChamber *chamber;
|
||||
};
|
||||
|
||||
class vtkSelectionCallback : public vtkCommand {
|
||||
public:
|
||||
static vtkSelectionCallback *New() { return new vtkSelectionCallback; }
|
||||
void SetChamber(uLib::Vtk::vtkDetectorChamber *ch) { this->chamber = ch; }
|
||||
virtual void Execute(vtkObject *caller, unsigned long, void *) override;
|
||||
|
||||
private:
|
||||
uLib::Vtk::vtkDetectorChamber *chamber;
|
||||
};
|
||||
|
||||
vtkActor *m_Actor;
|
||||
vtkBoxWidget *m_Widget;
|
||||
vtkWidgetCallback *m_Callback;
|
||||
vtkSelectionCallback *m_PickerCallback;
|
||||
|
||||
vtkSmartPointer<vtkTransform> m_InitialTransform;
|
||||
vtkSmartPointer<vtkTransform> m_RelativeTransform;
|
||||
|
||||
@@ -110,21 +110,13 @@ BOOST_AUTO_TEST_CASE(vtkVoxRaytracerRepresentationTest) {
|
||||
// renderer //
|
||||
Vtk::Viewer viewer;
|
||||
|
||||
// widget //
|
||||
vtkBoxWidget *widget = v_grid.GetWidget();
|
||||
|
||||
vtkWidgetCallback *cbk = vtkWidgetCallback::New();
|
||||
cbk->SetTracer(&v_rt);
|
||||
cbk->SetMuon(&muon);
|
||||
cbk->SetAnnotation(viewer.GetAnnotation());
|
||||
widget->AddObserver(vtkCommand::InteractionEvent, cbk);
|
||||
widget->SetInteractor(viewer.GetInteractor());
|
||||
widget->PlaceWidget();
|
||||
widget->On();
|
||||
|
||||
viewer.AddPuppet(v_grid);
|
||||
viewer.AddPuppet(v_rt);
|
||||
viewer.AddPuppet(v_muon);
|
||||
|
||||
// Select grid to show handler widget
|
||||
viewer.SelectPuppet(&v_grid);
|
||||
|
||||
viewer.Start();
|
||||
}
|
||||
|
||||
|
||||
@@ -42,35 +42,52 @@ namespace Vtk {
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vtkVoxRaytracerRepresentation::vtkVoxRaytracerRepresentation(Content &content)
|
||||
: m_Content(&content), m_Assembly(vtkAssembly::New()),
|
||||
: m_Content(&content),
|
||||
m_Sphere1(vtkSphereSource::New()), m_Sphere2(vtkSphereSource::New()),
|
||||
m_Line1(vtkLineSource::New()), m_Line2(vtkLineSource::New()),
|
||||
m_Line3(vtkLineSource::New()), m_RayLine(vtkAppendPolyData::New()),
|
||||
m_RayLineActor(vtkActor::New()),
|
||||
m_RayRepresentation(vtkAppendPolyData::New()),
|
||||
m_RayRepresentationActor(vtkActor::New()),
|
||||
m_Transform(vtkTransform::New()) {
|
||||
m_Transform(vtkTransform::New()),
|
||||
m_HasMuon(false), m_HasPoca(false) {
|
||||
default_radius = content.GetImage()->GetSpacing()(0) / 4;
|
||||
m_Sphere1->SetRadius(default_radius);
|
||||
m_Sphere2->SetRadius(default_radius);
|
||||
m_SelectedElement = m_RayLine;
|
||||
|
||||
this->SetSelectable(false);
|
||||
InstallPipe();
|
||||
|
||||
if (m_Content && m_Content->GetImage()) {
|
||||
Object::connect(m_Content->GetImage(), &StructuredGrid::Updated, this, &vtkVoxRaytracerRepresentation::imageUpdate);
|
||||
}
|
||||
}
|
||||
|
||||
vtkVoxRaytracerRepresentation::~vtkVoxRaytracerRepresentation() {
|
||||
m_Assembly->Delete();
|
||||
m_RayLine->Delete();
|
||||
m_RayLineActor->Delete();
|
||||
m_RayRepresentationActor->Delete();
|
||||
m_Transform->Delete();
|
||||
}
|
||||
|
||||
VoxRaytracer *vtkVoxRaytracerRepresentation::GetRaytracerAlgorithm() {
|
||||
uLib::VoxRaytracer *vtkVoxRaytracerRepresentation::GetRaytracerAlgorithm() {
|
||||
return m_Content;
|
||||
}
|
||||
|
||||
vtkProp *vtkVoxRaytracerRepresentation::GetProp() { return m_Assembly; }
|
||||
void vtkVoxRaytracerRepresentation::Update() {
|
||||
this->imageUpdate();
|
||||
}
|
||||
|
||||
void vtkVoxRaytracerRepresentation::imageUpdate() {
|
||||
if (m_HasMuon) {
|
||||
if (m_HasPoca) {
|
||||
this->SetMuon(m_Muon, m_Poca);
|
||||
} else {
|
||||
this->SetMuon(m_Muon);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vtkPolyData *vtkVoxRaytracerRepresentation::GetPolyData() const {
|
||||
std::cout << "get Raytracer polydata\n";
|
||||
@@ -94,6 +111,10 @@ void vtkVoxRaytracerRepresentation::SetRepresentationElements(
|
||||
}
|
||||
|
||||
void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon) {
|
||||
m_Muon = muon;
|
||||
m_HasMuon = true;
|
||||
m_HasPoca = false;
|
||||
|
||||
HPoint3f pt1, pt2, src;
|
||||
src = muon.LineIn().origin;
|
||||
m_Content->GetEntryPoint(muon.LineIn(), pt1);
|
||||
@@ -152,6 +173,11 @@ void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon) {
|
||||
}
|
||||
|
||||
void vtkVoxRaytracerRepresentation::SetMuon(MuonScatter &muon, HPoint3f poca) {
|
||||
m_Muon = muon;
|
||||
m_Poca = poca;
|
||||
m_HasMuon = true;
|
||||
m_HasPoca = true;
|
||||
|
||||
HPoint3f pt1, pt2, src;
|
||||
src = muon.LineIn().origin;
|
||||
m_Content->GetEntryPoint(muon.LineIn(), pt1);
|
||||
|
||||
@@ -58,7 +58,7 @@ class vtkActor;
|
||||
namespace uLib {
|
||||
namespace Vtk {
|
||||
|
||||
class vtkVoxRaytracerRepresentation : public Puppet {
|
||||
class vtkVoxRaytracerRepresentation : public Puppet, public Object {
|
||||
typedef VoxRaytracer Content;
|
||||
|
||||
public:
|
||||
@@ -67,7 +67,9 @@ public:
|
||||
|
||||
uLib::VoxRaytracer *GetRaytracerAlgorithm();
|
||||
|
||||
vtkProp *GetProp();
|
||||
virtual void Update() override;
|
||||
|
||||
void imageUpdate();
|
||||
|
||||
vtkPolyData *GetPolyData() const;
|
||||
|
||||
@@ -99,9 +101,12 @@ private:
|
||||
void SetColor(vtkActor *actor, Vector4f rgba);
|
||||
|
||||
VoxRaytracer *m_Content;
|
||||
MuonScatter m_Muon;
|
||||
HPoint3f m_Poca;
|
||||
bool m_HasMuon;
|
||||
bool m_HasPoca;
|
||||
|
||||
Scalarf default_radius;
|
||||
vtkAssembly *m_Assembly;
|
||||
vtkAppendPolyData *m_RayLine;
|
||||
vtkActor *m_RayLineActor;
|
||||
vtkActor *m_RayRepresentationActor;
|
||||
|
||||
Reference in New Issue
Block a user