level 12
class vtkSeedCallback : public vtkCommand
{
public:
static vtkSeedCallback *New()
{
return new vtkSeedCallback;
}
vtkSeedCallback() {}
virtual void Execute(vtkObject*, unsigned long event, void *calldata)
{
if (event == vtkCommand::PlacePointEvent)
{
std::cout << "Placing point..." << std::endl;
std::cout << "There are now " << this->SeedRepresentation->GetNumberOfSeeds() << " seeds." << std::endl;
for(unsigned int seedId = 0; seedId < this->SeedRepresentation->GetNumberOfSeeds(); seedId++)
{
double pos[3];
this->SeedRepresentation->GetSeedWorldPosition(0, pos);
std::cout << "Seed " << seedId << " : (" << pos[0] << " " << pos[1] << " " << pos[2] << ")" << std::endl;
seed_pos[0] = pos[0];seed_pos[1] = pos[1];seed_pos[2] = pos[2];
}
return;
}
if (event == vtkCommand::InteractionEvent)
{
std::cout << "Interaction..." << std::endl;
if (calldata)
{
double pos[3];
this->SeedRepresentation->GetSeedWorldPosition(0, pos);
std::cout << "Moved to (" << pos[0] << " " << pos[1] << " " << pos[2] << ")" << std::endl;
}
return;
}
}
void SetRepresentation(vtkSmartPointer<vtkSeedRepresentation> rep)
{
this->SeedRepresentation = rep;
}
void SetWidget(vtkSmartPointer<vtkSeedWidget> widget)
{
this->SeedWidget = widget;
}
private:
vtkSeedRepresentation* SeedRepresentation;
vtkSeedWidget* SeedWidget;
public:
int seed_pos[3];
};
2014年07月17日 17点07分
1
level 12
种子点获取坐标值的callback。
试发一下,代码居然不走样,不错~~~
vtk中的callback近乎无所不能。
2014年07月17日 17点07分
2
level 12
class vtkAngleCallback : public vtkCommand
{
public:
static vtkAngleCallback *New()
{ return new vtkAngleCallback; }
virtual void Execute(vtkObject*, unsigned long eid, void*)
{
if ( eid == vtkCommand::PlacePointEvent )
{
std::cout << "point placed\n";
}
else if ( eid == vtkCommand::InteractionEvent )
{
double point1[3], center[3], point2[3];
this->Rep->GetPoint1WorldPosition(point1);
this->Rep->GetCenterWorldPosition(center);
this->Rep->GetPoint2WorldPosition(point2);
std::cout << "Angle between " << "("
<< point1[0] << ","
<< point1[1] << ","
<< point1[2] << "), ("
<< center[0] << ","
<< center[1] << ","
<< center[2] << ") and ("
<< point2[0] << ","
<< point2[1] << ","
<< point2[2] << ") is "
<< this->Rep->GetAngle() << " radians." << std::endl;
}
}
vtkAngleRepresentation3D *Rep;
vtkAngleCallback():Rep(0) {}
};
2014年07月17日 17点07分
3
level 12
角度测量的callback。
不定期写,不定期添加,算笔记,也算分享。
不一定原创,共同学习之。
2014年07月17日 17点07分
4
level 12
class vtkBorderCallback : public vtkCommand
{
public:
vtkBorderCallback(){}
static vtkBorderCallback *New()
{
return new vtkBorderCallback;
}
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkBorderWidget *borderWidget =
reinterpret_cast<vtkBorderWidget*>(caller);
//get the world coordinates of the two corners of the box
vtkCoordinate* lowerLeftCoordinate = static_cast<vtkBorderRepresentation*>(borderWidget->GetRepresentation())->GetPositionCoordinate();
double* lowerLeft = lowerLeftCoordinate ->GetComputedWorldValue(this->LeftRenderer);
std::cout << "Lower left coordinate: " << lowerLeft[0] << ", " << lowerLeft[1] << ", " << lowerLeft[2] << std::endl;
vtkCoordinate* upperRightCoordinate = static_cast<vtkBorderRepresentation*>(borderWidget->GetRepresentation())->GetPosition2Coordinate();
double* upperRight = upperRightCoordinate ->GetComputedWorldValue(this->LeftRenderer);
std::cout << "Upper right coordinate: " << upperRight[0] << ", " << upperRight[1] << ", " << upperRight[2] << std::endl;
double* bounds = this->ImageActor->GetBounds();
double xmin = bounds[0];
double xmax = bounds[1];
double ymin = bounds[2];
double ymax = bounds[3];
if( (lowerLeft[0] > xmin) && (upperRight[0] < xmax) && (lowerLeft[1] > ymin) && (upperRight[1] < ymax) )
{
this->ClipFilter->SetOutputWholeExtent(
vtkMath::Round(lowerLeft[0]),
vtkMath::Round(upperRight[0]),
vtkMath::Round(lowerLeft[1]),
vtkMath::Round(upperRight[1]), 0, 1);
}
else
{
std::cout << "box is NOT inside image" << std::endl;
}
}
void SetLeftRenderer(vtkSmartPointer<vtkRenderer> renderer) {this->LeftRenderer = renderer;}
void SetImageActor(vtkSmartPointer<vtkImageActor> actor) {this->ImageActor = actor;}
void SetClipFilter(vtkSmartPointer<vtkImageClip> clip) {this->ClipFilter = clip;}
private:
vtkSmartPointer<vtkRenderer> LeftRenderer;
vtkSmartPointer<vtkImageActor> ImageActor;
vtkSmartPointer<vtkImageClip> ClipFilter;
};
2014年07月17日 17点07分
5
level 12
class vtkSliderCallback : public vtkCommand
{
public:
static vtkSliderCallback *New()
{
return new vtkSliderCallback;
}
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkSliderWidget *sliderWidget =
reinterpret_cast<vtkSliderWidget*>(caller);
if(!sliderWidget) return;
int value = static_cast<int>(static_cast<vtkSliderRepresentation *>
(sliderWidget->GetRepresentation())->GetValue());
if ( this->WidgetX )
{
this->WidgetX->SetSliceIndex(value);
}
else if( this->WidgetY )
{
this->WidgetY->SetSliceIndex(value);
}
else if (this->WidgetZ)
{
this->WidgetZ->SetSliceIndex(value);
}
}
vtkSliderCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}
vtkImagePlaneWidget* WidgetX;
vtkImagePlaneWidget* WidgetY;
vtkImagePlaneWidget* WidgetZ;
};
2014年07月17日 17点07分
7
level 12
拖动条控制Slice显示callback,
优点:比起用GUI控件操作 流畅程度不是一个级别。。。原因至今没搞明白,汗
2014年07月17日 17点07分
8
level 12
class vtkWidgetWindowLevelCallback : public vtkCommand
{
public:
static vtkWidgetWindowLevelCallback *New()
{
return new vtkWidgetWindowLevelCallback;
}
void Execute( vtkObject *caller, unsigned long vtkNotUsed( event ),
void *callData )
{
vtkImagePlaneWidget* self =
reinterpret_cast< vtkImagePlaneWidget* >( caller );
if(!self) return;
double* wl = static_cast<double*>( callData );
if ( self == this->WidgetX )
{
this->WidgetY->SetWindowLevel(wl[0],wl[1]);
this->WidgetZ->SetWindowLevel(wl[0],wl[1]);
}
else if( self == this->WidgetY )
{
this->WidgetX->SetWindowLevel(wl[0],wl[1]);
this->WidgetZ->SetWindowLevel(wl[0],wl[1]);
}
else if (self == this->WidgetZ)
{
this->WidgetX->SetWindowLevel(wl[0],wl[1]);
this->WidgetY->SetWindowLevel(wl[0],wl[1]);
}
}
vtkWidgetWindowLevelCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}
vtkImagePlaneWidget* WidgetX;
vtkImagePlaneWidget* WidgetY;
vtkImagePlaneWidget* WidgetZ;
};
2014年07月17日 17点07分
9
level 12
窗宽窗位调节callback~
可以类比到三个viewer的各种同步调节
2014年07月17日 17点07分
10
level 12
class PickCommand: public vtkCommand
{
public:
static PickCommand*New()
{ return new PickCommand; }
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
vtkLineWidget *lineWidget = reinterpret_cast<vtkLineWidget*>(caller);
double O[3], A[3], B[3];
//重新设置两条线段到同一个端点
lineWidget->GetPoint1 (O);
//lineWidget1->SetPoint1 (O);
lineWidget1->GetPoint2 (A);
double OA,OB,AB;
OA=sqrt((A[0]-O[0])*(A[0]-O[0]) + (A[1]-O[1])*(A[1]-O[1]) + (A[2]-O[2])*(A[2]-O[2]));
char cAct[100];
sprintf((char *)cAct, "%.4f", OA);
this->Text->SetInput (cAct);
}
PickCommand():Text(0) {}
public:
vtkTextMapper *Text;
};
void PickerInteractionCallback( vtkObject* vtkNotUsed(object),
unsigned long event,
void* clientdata,
void* vtkNotUsed(calldata) )
{
vtkInteractorStyleTrackballCamera * style =
(vtkInteractorStyleTrackballCamera*)clientdata;
switch( event )
{
case vtkCommand::LeftButtonPressEvent:
MouseMotion = 0;
style->OnLeftButtonDown();
break;
case vtkCommand::LeftButtonReleaseEvent:
if (MouseMotion == 0)
{
//int *pick = iren->GetEventPosition();
//picker->Pick((double)pick[0], (double)pick[1], 0.0, ren1);
}
style->OnLeftButtonUp();
break;
case vtkCommand::MouseMoveEvent:
MouseMotion = 1;
style->OnMouseMove();
break;
}
}
2014年07月17日 17点07分
11
level 12
三维长度测量callback~
好像比包中原装的好些..
2014年07月17日 17点07分
12
level 1
楼主;在vtk中一个窗口实现4个renderer并且实现同步交互
2015年01月17日 01点01分
13
纳尼?
2015年01月19日 01点01分
level 1
Seed widget可以用于拾取某个mesh表面的点吗,我知道pointpick可以实现,但是我发现pointpick拾取到的点还是有可能id为-1,怎么保证拾取到的点id都是>=0呢
2017年01月05日 01点01分
16
去看看pointpick的3D拾取原理
2017年01月05日 02点01分
@rabbitbride 看到它的拾取原理是这样的:通过发射光线与Actor相交而拾取对象的,除了返回坐标值,Actor和Mapper,它也返回在指定容差内沿着光线,最靠近光线的那个点的ID,但是我觉得知道这个不能解决我的问题。这个还好,可以通过id判断把id为-1的点去掉,不知道还有没有其他方法。
2017年01月05日 03点01分
@rabbitbride 还有一个问题是,怎么在vtkcommand中改变主程序里面actor的input的属性呢,比如我想把拾取到的点染色
2017年01月05日 03点01分
@rabbitbride 感觉自己有种知其然不知其所以然的感觉,感觉自己需要看过类似的代码才能知道该怎么做
2017年01月05日 03点01分