c++ - 如何为 PoPieChartRep 设置注释颜色?
问题描述
简而言之,我如何为 PoPieChartRep 的标签设置自定义颜色(不同于切片)?
更详细地说:我正在尝试使用 OIV 的 PoPieChartRep 类创建一个饼图,并且我希望字符串“Value1”和“Value2”具有特定的颜色。
我在PoPieChartRep的在线参考中看到了一个字段,将isAnnoSliceColor设置为false会使标签变白。
我怀疑我应该使用材质来设置颜色,但不知道应该使用哪个对象?还检查了 PoLabelHints 和 PoMiscTextAttr 作为参考建议,但没有找到任何颜色/材料相关的字段。
解决方案
仅供参考,将所有标签设置为相同颜色很容易。PoPieChartRep 包含一个名为“annotationApp”的 SoAppearanceKit,因此您只需要:
auto appKit = (SoAppearanceKit*)pieChart->getPart("annotationApp", TRUE);
auto appMat = (SoMaterial*)appKit->getPart("material", TRUE);
appMat->diffuseColor.setValue(1, 0.5f, 0);
为每个标签设置不同的颜色不是“内置”的,但可以通过修改饼图的内部场景图来实现。我们的目标是在每个文本标签节点之前插入一个 SoMaterial 节点。我们知道 PoPieChartRep 包含一个 SoGroup 名称“注释”,它的子元素是文本标签(我们不关心它们的内部结构)。首先将“isAnnoSliceColor”字段设置为 false,因此饼图不会为标签创建材质节点。一个问题:您需要知道 PoPieChartRep 在第一次遍历之前不会真正创建文本标签节点。您可以应用一个操作来强制执行此操作,或者在查看器上调用 setScenegraph() 后简单地进行修改。修改可能是这样的:
SbColor textColors[] = { {1,0,0}, {0,1,0}, {0,0,1}, {1,1,0}, {1,0,1}, {0,1,1},
{1,0.5f,0}, {1,0,0.5f}, {0.5f,1,0}, {0.5f,0,1} };
auto appGroup = (SoGroup*)pieChart->getPart("annotation", TRUE);
int numText = appGroup->getNumChildren();
int insertIndex = 0;
for (int i = 0; i < numText; ++i) {
auto matNode = new SoMaterial();
matNode->diffuseColor.setValue(textColors[i]);
appGroup->insertChild(matNode, insertIndex);
insertIndex += 2;
}
正确的做法是将此代码放在一个函数中,并使用 addPostRebuildCallback() 将该函数设置为在创建饼图内部节点时自动调用。
推荐阅读
- mongodb - Mongoose 连接错误:MongoError: failed to connect to server
- java - 无法在 JAVA 中使用 bean 解析 JSON 数据
- postgresql - 使用窗口函数将聚合与另一个聚合进行比较
- python-3.x - 如何在 Django 2.x 中创建自定义 ACL 功能?
- react-admin - 警告:缺少关键的翻译:“”;
- python-2.7 - 问:Sonos Python 自检错误:找不到记录器“smapi”的处理程序
- angular - 以角度 6 获取 Leaflet 地图坐标中的光标位置
- entity-framework-core - 实体框架核心 SQLite 版本
- spring - 自定义 AuthenticationFailureHandler @Bean 与新的 FailureHandler()
- node.js - 无法使用 firebase 函数将字节数组图像上传到火存储