программный выбор виджета vtk - PullRequest
1 голос
/ 11 февраля 2020

Я изо всех сил пытаюсь добиться основных c функциональных возможностей виджета VTK: выбор и удаление.

У меня есть vtkDistanceWidget . И после того, как я создал, я собираюсь щелкнуть по его ручке (см. Изображение ниже):

enter image description here

, чтобы выбрать его, чтобы изменить это и в конечном итоге удалить его . Дело в том, что я не знаю, когда этот виджет выбран. Если я использую средство выбора:

vtkPropPicker* pPicker = vtkPropPicker::New();
pPicker->Pick(nPosition[0], nPosition[1], 0, m_pRenderer);
TRACE("Pointer: %p\n", pPicker->GetProp3D());

, TRACE не выполняется, когда я нажимаю на маркеры виджета, но он виден, когда я щелкаю в любом месте в остальных.

Кроме того, вторая попытка, Я пытался с обратными вызовами:

void CVTKDoc::CreateDistanceWidget(CVTKView* pView)
{
vtkDistanceWidget* pDistanceWidget = vtkDistanceWidget::New();
pDistanceWidget->SetInteractor(pView->m_pInteractor);
// Create the default widget representation and set the label format
pDistanceWidget->CreateDefaultRepresentation();
static_cast<vtkDistanceRepresentation*>(pDistanceWidget->GetRepresentation())->SetLabelFormat(_T("%-#6.3g mm"));
// Allow the observer to access the widget
vtkCallbackCommand* pKeypressCallback = vtkCallbackCommand::New();
pKeypressCallback->SetCallback(&CVTKDoc::LeftButtonPressEvent);
pKeypressCallback->SetClientData(pDistanceWidget);
pDistanceWidget->GetInteractor()->AddObserver(vtkCommand::KeyPressEvent, pKeypressCallback);
pDistanceWidget->On();
// Add widget pointer to map to cleanup later
if (NULL != pDistanceWidget)
    InsertWidgetToMap(pView, pDistanceWidget);
pKeypressCallback->Delete();
}

и затем (stati c method)

void CVTKDoc::KeypressCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
{
CVTKDoc* pDoc = CVTKDoc::GetDoc();
vtkRenderWindowInteractor* pInteractor = static_cast<vtkRenderWindowInteractor*>(caller);
CString sKey = pInteractor->GetKeySym();
TRACE(">>>%s\n", sKey);
}

Каждый раз, когда я нажимаю левую кнопку, я вижу TRACE, но когда я нажимаю кнопку на дескрипторе виджета , функция обратного вызова вообще не выполняется , как в первом решении.

Как узнать, когда я нажимаю на ручки виджетов?

...