本文采用VTK9.3.0版本,其他版本如VKT8.0亦有同样的问题
VTK显示文本时,Z轴刻度标签出现了重叠,如下图:
寻找好久,没有找到设置标签间距、个数等相关的公有成员函数,此问题一直没有解决。
于是想到改VKT9.3.0源码,解决此问题。下面大概记录涉及到的源码文件和相关函数:
1、找到相关文件
VS2017打开源码后,与此相关的文件为:vtkCubeAxesActor.h、vtkCubeAxesActor.cxx,如下图:
2、.h中增加私有成员变量
1
2
3
|
//whl2024-06-03
bool m_XAxisFlag, m_YAxisFlag, m_ZAxisFlag;//标识是否修改刻度区间的个数
int m_XMajorNum, m_YMajorNum, m_ZMajorNum;//标识设置刻度区间的个数,例如2表示2个区间3个刻度
|
3、构造函数中队成员变量初始化
1
2
3
4
|
//whl
m_XAxisFlag = false;
m_YAxisFlag = false;
m_ZAxisFlag = false;
|
4、增加公有成员函数,进行是否自定义修改刻度区间的设置
.h中
1
2
|
//whl设置某个轴划分刻度区间的个数,可防止轴刻度文本重叠:nAxis轴号,bFlag设置/取消设置的标志,nMajorNum划分区间的个数
void SetAxisMajorNum(int nAxis, bool bFlag, int nMajorNum = 2);
|
.cpp中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//------------------------------------------------------------------------------
void vtkCubeAxesActor::SetAxisMajorNum(int nAxis, bool bFlag, int nMajorNum)
{
switch (nAxis)
{
case 0:
m_XAxisFlag = bFlag;
m_XMajorNum = nMajorNum;
break;
case 1:
m_YAxisFlag = bFlag;
m_YMajorNum = nMajorNum;
break;
case 2:
m_ZAxisFlag = bFlag;
m_ZMajorNum = nMajorNum;
break;
}
}
|
5、最重要的地方,在AdjustTicksComputeRange()函数中修改增加:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//whl判断是否自定义刻度区间
if (m_XAxisFlag && 0==axis)
{
major = range / m_XMajorNum;
}
if (m_YAxisFlag && 1==axis)
{
major = range / m_YMajorNum;
}
if (m_ZAxisFlag && 2==axis)
{
major = range / m_ZMajorNum;
}
|
6、使用时,在调用VTK轴相关的地方(代码中还增加了Z轴标签旋转90°,效果更好)
1
2
3
|
//设置某个轴划分区间的个数,可防止轴刻度文本重叠:nAxis轴号,bFlag设置/取消设置的标志,nMajorNum划分区间的个数
m_cubeAxesActor->SetAxisMajorNum(2, true, 2);//设置Z轴
m_cubeAxesActor->GetLabelTextProperty(2)->SetOrientation(90);//Z轴标签旋转90°
|
7、最终结果:
|