#include <vtkActor.h>
#include <vtkBorderRepresentation.h>
#include <vtkBorderWidget.h>
#include <vtkCommand.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkWidgetCallbackMapper.h>
#include <vtkWidgetEvent.h>
class vtkCustomBorderWidget : public vtkBorderWidget
{
public:
static vtkCustomBorderWidget* New();
vtkTypeMacro(vtkCustomBorderWidget, vtkBorderWidget);
static void MoveAction(vtkAbstractWidget* w);
static void EndSelectAction(vtkAbstractWidget* w);
vtkCustomBorderWidget();
};
class vtkDisappearBorderCallback : public vtkCommand
{
public:
static vtkDisappearBorderCallback* New()
{
return new vtkDisappearBorderCallback;
}
vtkSmartPointer<vtkRenderer> m_renderer;
vtkSmartPointer<vtkBorderWidget> m_widget;
void SetRender(vtkSmartPointer<vtkRenderer> renderer)
{
m_renderer = renderer;
}
void SetWidget(vtkSmartPointer<vtkCustomBorderWidget> widget)
{
m_widget = static_cast<vtkBorderWidget*>(widget);
}
virtual void Execute(vtkObject* caller, unsigned long, void*)
{
std::cout << "Do Not show border! \n";
this->m_widget->GetBorderRepresentation()->SetShowBorderToOff();
//this->m_widget->GetBorderRepresentation()->SetVisibility(0);
//this->m_widget->SetEnabled(0);
}
vtkDisappearBorderCallback() { }
};
class vtkShowBorderCallback : public vtkCommand
{
public:
static vtkShowBorderCallback* New()
{
return new vtkShowBorderCallback;
}
vtkSmartPointer<vtkRenderer> m_renderer;
vtkSmartPointer<vtkBorderWidget> m_widget;
void SetRender(vtkSmartPointer<vtkRenderer> renderer)
{
m_renderer = renderer;
}
void SetWidget(vtkSmartPointer<vtkCustomBorderWidget> widget)
{
m_widget = static_cast<vtkBorderWidget*>(widget);
}
virtual void Execute(vtkObject* caller, unsigned long, void*)
{
//this->m_widget->CreateDefaultRepresentation();
//this->m_widget->SelectableOff();
//this->m_widget->SetResizable(0);
//this->m_widget->GetBorderRepresentation()->ProportionalResizeOn();
//this->m_widget->GetBorderRepresentation()->SetBorderColor(1.0, 0.0, 0.0);
//this->m_widget->EnabledOn();
//this->m_widget->GetBorderRepresentation()->SetShowBorderToOn();
//this->m_widget->GetRepresentation()->VisibilityOn();
double pos[3];
pos[0] = this->m_renderer->GetRenderWindow()->GetInteractor()->GetEventPosition()[0];
pos[1] = this->m_renderer->GetRenderWindow()->GetInteractor()->GetEventPosition()[1];
pos[2] = 0;
double WorldPoint[3];
this->m_renderer->SetDisplayPoint(pos);
this->m_renderer->DisplayToView();
WorldPoint[0] = (this->m_renderer->GetViewPoint())[0];
WorldPoint[1] = (this->m_renderer->GetViewPoint())[1];
WorldPoint[2] = (this->m_renderer->GetViewPoint())[2];
//std::cout << "World Position: " << WorldPoint[0] << " " << WorldPoint[1] << " " << WorldPoint[2] << "\n";
this->m_widget->GetBorderRepresentation()->GetPositionCoordinate()->SetCoordinateSystemToView();
this->m_widget->GetBorderRepresentation()->GetPosition2Coordinate()->SetCoordinateSystemToView();
this->m_widget->GetBorderRepresentation()->SetPosition(WorldPoint[0] - 0.1, WorldPoint[1] - 0.1);
this->m_widget->GetBorderRepresentation()->SetPosition2(WorldPoint[0] + 0.1, WorldPoint[1] + 0.1);
}
vtkShowBorderCallback() { }
};
vtkStandardNewMacro(vtkCustomBorderWidget);
// namespace
int main(int, char* [])
{
vtkNew<vtkNamedColors> colors;
// Sphere
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetRadius(4.0);
sphereSource->Update();
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(
colors->GetColor3d("DarkOliveGreen").GetData());
// A renderer and render window
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("BorderWidget");
// An interactor
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkNew<vtkCustomBorderWidget> borderWidget;
borderWidget->SetInteractor(renderWindowInteractor);
borderWidget->CreateDefaultRepresentation();
//borderWidget->SelectableOff();
//borderWidget->SetResizable(1);
borderWidget->On();
borderWidget->GetBorderRepresentation()->ProportionalResizeOn();
borderWidget->GetBorderRepresentation()->SetBorderColor(1.0, 0.0, 0.0);
borderWidget->GetBorderRepresentation()->SetShowBorderToOff();
renderer->AddActor(actor);
renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
vtkShowBorderCallback* show_border = vtkShowBorderCallback::New();
show_border->SetRender(renderer);
show_border->SetWidget(borderWidget);
renderWindowInteractor->AddObserver(vtkCommand::LeftButtonPressEvent, show_border);
vtkDisappearBorderCallback* disappear_border = vtkDisappearBorderCallback::New();
disappear_border->SetRender(renderer);
disappear_border->SetWidget(borderWidget);
renderWindowInteractor->AddObserver(vtkCommand::RightButtonPressEvent, disappear_border);
//borderWidget->On();
renderWindowInteractor->Initialize();
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
vtkCustomBorderWidget::vtkCustomBorderWidget()
{
this->CallbackMapper->SetCallbackMethod(
vtkCommand::LeftButtonReleaseEvent, vtkWidgetEvent::EndSelect, this,
vtkCustomBorderWidget::EndSelectAction);
this->CallbackMapper->SetCallbackMethod(
vtkCommand::MouseMoveEvent, vtkWidgetEvent::Move, this,
vtkCustomBorderWidget::MoveAction);
}
void vtkCustomBorderWidget::MoveAction(vtkAbstractWidget* w)
{
vtkBorderWidget* borderWidget = dynamic_cast<vtkBorderWidget*>(w);
borderWidget->GetBorderRepresentation()->SetShowBorderToOn();
vtkBorderWidget::MoveAction(w);
double pos[3];
pos[0] = borderWidget->GetInteractor()->GetEventPosition()[0];
pos[1] = borderWidget->GetInteractor()->GetEventPosition()[1];
pos[2] = 0;
double WorldPoint[3];
borderWidget->GetRepresentation()->GetRenderer()->SetDisplayPoint(pos);
borderWidget->GetRepresentation()->GetRenderer()->DisplayToView();
WorldPoint[0] = (borderWidget->GetRepresentation()->GetRenderer()->GetViewPoint())[0];
WorldPoint[1] = (borderWidget->GetRepresentation()->GetRenderer()->GetViewPoint())[1];
WorldPoint[2] = (borderWidget->GetRepresentation()->GetRenderer()->GetViewPoint())[2];
borderWidget->GetBorderRepresentation()->GetPositionCoordinate()->SetCoordinateSystemToView();
borderWidget->GetBorderRepresentation()->GetPosition2Coordinate()->SetCoordinateSystemToView();
borderWidget->GetBorderRepresentation()->SetPosition(WorldPoint[0] - 0.1, WorldPoint[1] - 0.1);
borderWidget->GetBorderRepresentation()->SetPosition2(WorldPoint[0] + 0.1, WorldPoint[1] + 0.1);
}
void vtkCustomBorderWidget::EndSelectAction(vtkAbstractWidget* w)
{
vtkBorderWidget* borderWidget = dynamic_cast<vtkBorderWidget*>(w);
vtkBorderWidget::EndSelectAction(w);
borderWidget->GetBorderRepresentation()->SetShowBorderToOff();
}
vtkBorderWidget:实现一个跟随鼠标移动的方框
最新推荐文章于 2024-02-19 18:09:36 发布