如何为 PoPieChartRep 设置注释颜色?
How do you set annotation color for PoPieChartRep?
简而言之,我如何为 PoPieChartRep 的标签设置自定义颜色(不同于切片)?
更详细:
我正在尝试使用 OIV 的 PoPieChartRep class 创建一个饼图,我希望字符串“Value1”和“Value2”具有特定的颜色。
我在 PoPieChartRep 的 online reference 中看到一个字段,将 isAnnoSliceColor 设置为 false 会使标签变白。
我怀疑我应该使用 material 来设置颜色,但不知道哪个对象应该有它?
还按照参考建议检查了 PoLabelHints 和 PoMiscTextAttr,但未找到任何 color/material 相关字段。
仅供参考,将所有标签设置为相同颜色很容易。 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,这样饼图就不会为标签创建 material 节点。一个陷阱:您需要知道 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() 将该函数设置为在创建饼图内部节点时自动调用。
简而言之,我如何为 PoPieChartRep 的标签设置自定义颜色(不同于切片)?
更详细: 我正在尝试使用 OIV 的 PoPieChartRep class 创建一个饼图,我希望字符串“Value1”和“Value2”具有特定的颜色。
我在 PoPieChartRep 的 online reference 中看到一个字段,将 isAnnoSliceColor 设置为 false 会使标签变白。
我怀疑我应该使用 material 来设置颜色,但不知道哪个对象应该有它? 还按照参考建议检查了 PoLabelHints 和 PoMiscTextAttr,但未找到任何 color/material 相关字段。
仅供参考,将所有标签设置为相同颜色很容易。 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,这样饼图就不会为标签创建 material 节点。一个陷阱:您需要知道 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() 将该函数设置为在创建饼图内部节点时自动调用。