仅供参考,将所有标签设置为相同颜色很容易。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() 将该函数设置为在创建饼图内部节点时自动调用。
![在此处输入图像描述](https://i.stack.imgur.com/5n7CD.png)