问题描述
采用OCC计算点到曲面的误差,希望采用云图的方式更加直观的显示误差的范围,在参考网络上有关云图的资料发现,之前版本中,V3d_Viewer中自带云图的功能,然而7.2版本中这个功能集成在了AIS_ColorScale中,具体实现过程中参数设置是问题所在,摸索过后,实现了云图的显示功能。
解决方案
//用户输入云图的最大值和最小值
void XXX::makeColorScale(double &maxN, double &minN)//制作显示误差的云图
{
//AIS_ColorScale系统自带的制作云图的方式
Handle(AIS_InteractiveContext) myAISContext = GetDocument()->GetIC();//获取上下文的Context
Handle(AIS_ColorScale) aColorScale = new AIS_ColorScale();//云图制作集成在这个方法中
//获取界面的长和宽
CRect cr;
GetClientRect(&cr);
ClientToScreen(&cr);
int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CXFULLSCREEN);
//设置云图参数,具体参数的含义可以参看OCC自带的用户手册
aColorScale->SetBreadth((int)(cx*0.06));
aColorScale->SetHeight((int)(cy*0.3));
aColorScale->SetMax(maxN);
aColorScale->SetMin(minN);
aColorScale->SetNumberOfIntervals(8);
aColorScale->SetSmoothTransition(Standard_True);
aColorScale->SetLabelPosition(Aspect_TOCSP_RIGHT);
//这一步是将云图从X-Y空间 进行转换,很重要
aColorScale->SetZLayer (Graphic3d_ZLayerId_TopOSD);
double z = 0.1*cy;
gp_Pnt thePoint(0.0,0.0,z);
Graphic3d_Vec2i anoffset(0,Standard_Integer(thePoint.Z()));
myAISContext->SetTransformPersistence (aColorScale, new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER,anoffset));
//云图显示
myAISContext->SetDisplayMode(aColorScale,1,Standard_False);
myAISContext->Display(aColorScale,Standard_False);
}
功能实现