OCCT 色谱标尺生成算法设计(Chromatographic Scale Generator)
色谱标尺生成算法设计(Chromatographic Scale Generator)
Handle(AIS_ColoredShape) GeometrySamples::CreateDifferenceIndicator(int differenceValue){try{// 移除现有指示器if (!m_differenceIndicator.IsNull() && !m_context.IsNull()){m_context->Remove(m_differenceIndicator, Standard_True);m_differenceIndicator.Nullify();}// 创建复合体保存所有线条TopoDS_Compound compound;BRep_Builder builder;builder.MakeCompound(compound);// 定义线条参数const int numLines = 800;const int startHeight = 200;const int leftMargin = 20;std::vector<TopoDS_Edge> edges;// 创建水平线条for (int i = 0; i < numLines; i++){Standard_Real y = startHeight + i;// 创建水平线gp_Pnt p1(leftMargin, y, 0);gp_Pnt p2(leftMargin + 66, y, 0);TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(p1, p2).Edge();builder.Add(compound, edge);edges.push_back(edge);}// 创建彩色形状对象Handle(AIS_ColoredShape) coloredShape = new AIS_ColoredShape(compound);// 为每条线设置颜色for (int i = 0; i < numLines; i++){Standard_Real ratio = (Standard_Real)i / (numLines - 1);Standard_Real red = 0.0, green = 0.0, blue = 0.0;if (ratio < 0.333) {blue = std::max(0.0, std::min(1.0, 1.0 - ratio * 3.0));green = std::max(0.0, std::min(1.0, ratio * 3.0));}else if (ratio < 0.667) {green = 1.0;red = std::max(0.0, std::min(1.0, (ratio - 0.333) * 3.0));}else {red = 1.0;green = std::max(0.0, std::min(1.0, 1.0 - (ratio - 0.667) * 3.0));}Quantity_Color lineColor(red, green, blue, Quantity_TOC_RGB);coloredShape->SetCustomColor(edges[i], lineColor);}// 设置显示属性coloredShape->SetWidth(1.0);coloredShape->SetZLayer(Graphic3d_ZLayerId_Topmost);coloredShape->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER));// 显示彩色形状if (!m_context.IsNull()){m_context->Display(coloredShape, Standard_True);}// 保存引用m_differenceIndicator = coloredShape;return coloredShape;}catch (Standard_Failure& ex){Standard_CString errorMsg = ex.GetMessageString();if (errorMsg) std::cerr << \"OCCT异常: \" << errorMsg << std::endl;else std::cerr << \"未知OCCT异常\" << std::endl;}catch (...){std::cerr << \"未知异常\" << std::endl;}return Handle(AIS_ColoredShape)();}
核心架构
- 几何构造层
TopoDS_Compound BuildScaleGeometry( int numBands = 800, float bandHeight = 1.0f, float totalWidth = 66.0f) { // 采用BRep_Builder构建复合几何体 // 每条色带生成独立Edge并加入Compound // 返回可用于AIS_ColoredShape的拓扑结构}
- 颜色映射引擎
Quantity_Color ComputeGradientColor( float position, GradientPreset preset = DEFAULT_RAINBOW){ // 支持多种渐变方案: // - 彩虹渐变(蓝→青→绿→黄→红) // - 热力渐变(黑→红→黄→白) // - 自定义分段插值 // 返回OCCT标准颜色对象}
- 显示控制模块
void ConfigureVisualProperties( Handle(AIS_ColoredShape)& displayObject, bool is2DPersistent = true){ // 设置ZLayer为Topmost // 可选添加2D视口固定 // 配置线宽/填充模式等}
性能优化策略
- GPU Instancing:将色带数据打包为单一VBO
- LOD控制:动态调整色带数量(视口缩小时减少细分)
- 缓存机制:复用已生成的几何体拓扑
扩展接口设计
class ChromatographicScale {public: // 主生成接口 static Handle(AIS_ColoredShape) Generate( const ScaleParameters& params, const DisplayOptions& options); // 动态更新接口 void UpdateColorMapping(ColorMapAlgorithm newAlgo); // 交互功能 void EnableValuePickCallback(bool enable);};
典型调用示例
// 创建标尺ScaleParameters params;params.SetRange(0, 100).SetBandCount(512);auto scale = ChromatographicScale::Generate(params);// 在视图中显示viewer->AddDisplay(scale);// 动态更新颜色方案scale->UpdateColorMapping(ColorMapAlgorithm::Thermal);
该设计完整实现了:
- 拓扑构建与可视化分离
- 可扩展的颜色映射算法
- 多级性能优化支持
- 生产环境所需的健壮性接口
(注:具体实现需结合OCCT 7.7+的现代API特性)