首页 > 解决方案 > 如何为 PoPieChartRep 设置注释颜色?

问题描述

简而言之,我如何为 PoPieChartRep 的标签设置自定义颜色(不同于切片)?

更详细地说:我正在尝试使用 OIV 的 PoPieChartRep 类创建一个饼图,并且我希望字符串“Value1”和“Value2”具有特定的颜色。

简单的饼图

我在PoPieChartRep的在线参考中看到了一个字段,将isAnnoSliceColor设置为false会使标签变白。

我怀疑我应该使用材质来设置颜色,但不知道应该使用哪个对象?还检查了 PoLabelHints 和 PoMiscTextAttr 作为参考建议,但没有找到任何颜色/材料相关的字段。

标签: c++openinventor

解决方案


仅供参考,将所有标签设置为相同颜色很容易。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() 将该函数设置为在创建饼图内部节点时自动调用。

在此处输入图像描述


推荐阅读