728x90
VTK addobserver의 기능을 Activiz.Net을 이용할 때에는 event delegate를 사용하면 쉽게 구현할 수 있다.
다만, event 를 수행하는데 있어서 내부에서 사용하는 객체의 접근에 대한 참조 정보가 에러가 발생하는 경우가 있다.
그럴경우에는 아래와 같은 에러 메시지가 발생한다.
관련 thread 는 다음과 같다.
해결방법으로는 event 내부에서 사용되는 객체의 메모리가 해제되지 않도록 관리하면 된다.
/// <summary>
/// page61, vtkPickEvent 기능 구현
/// </summary>
///
vtkActor2D textActor;
vtkTextMapper textMapper;
vtkCellPicker picker;
private void tutVtkPickEvent()
{
vtkMyObserver observer = vtkMyObserver.New();
picker = vtkCellPicker.New();
textMapper = vtkTextMapper.New();
var tprop = textMapper.GetTextProperty();
tprop.SetFontFamilyToArial();
tprop.SetFontSize(10);
tprop.BoldOn();
tprop.ShadowOn();
tprop.SetColor(1, 0, 0);
textActor = vtkActor2D.New();
textActor.VisibilityOff();
textActor.SetMapper(textMapper);
ren1.AddActor(textActor);
picker.RemoveObserver((uint)vtkCommand.EventIds.EndPickEvent);
picker.EndPickEvt += (s, e) =>
{
if (picker.GetCellId() < 0)
{
textActor.VisibilityOff();
}
else
{
var selPt = picker.GetSelectionPoint();
var pickerPos = picker.GetPickPosition();
textMapper.SetInput($"{pickerPos[0]:F2}, {pickerPos[1]:F2}, {pickerPos[2]:F2}");
var textWidth = textMapper.GetWidth(ren1);
textActor.SetPosition(selPt[0] - textWidth/2, selPt[1]);
textActor.VisibilityOn();
}
ren1.GetRenderWindow().Render();
};
iren.SetPicker(picker);
}
728x90
728x90