PAYATHON 2026

如何去掉 OpenCascade AIS_TextLabel 的白色背景并固定文字朝向?

数据小许

去掉白色背景

将 label.SetDisplayType(1) 改为 label.SetDisplayType(Aspect_TODT_NORMAL)。对于新建标签,也可以直接删除这行,使用默认的普通文字显示模式。

原代码中的 1 对应 Aspect_TODT_SUBTITLE,会在文字背后启用填充矩形。Aspect_TODT_NORMAL 只显示文字,因此先修改显示类型即可,无需依赖 SetBackdrop(False)。OpenCascade 官方说明

使用 pythonocc-core 时,最小修改如下:

from OCC.Core.Aspect import Aspect_TODT_NORMAL

label.SetDisplayType(Aspect_TODT_NORMAL)

建议使用枚举名称,避免用数字表示显示模式。

固定文字所在平面和朝向

可以继续使用 AIS_TextLabel。通过 SetOrientation3D(gp_Ax2(...)) 指定文字在模型空间中的平面和阅读方向,避免文字始终朝向相机。AIS_TextLabel API 文档

以下示例沿用现有的 text、position、height 和 color 变量,将文字放在经过 position 且平行于 XY 平面的平面内。实际使用时,应将法向和文字横向替换为尺寸标注平面的方向。

from OCC.Core.AIS import AIS_TextLabel
from OCC.Core.Aspect import Aspect_TODT_NORMAL
from OCC.Core.Graphic3d import (
    Graphic3d_HTA_CENTER,
    Graphic3d_VTA_CENTER,
)
from OCC.Core.Quantity import Quantity_Color, Quantity_TOC_RGB
from OCC.Core.TCollection import TCollection_ExtendedString
from OCC.Core.gp import gp_Ax2, gp_Dir, gp_Pnt

anchor = gp_Pnt(*position)

# 示例:平面法向为 +Z,文字横向为 +X
orientation = gp_Ax2(
    anchor,
    gp_Dir(0.0, 0.0, 1.0),
    gp_Dir(1.0, 0.0, 0.0),
)

label = AIS_TextLabel()
label.SetText(TCollection_ExtendedString(str(text)))
label.SetOrientation3D(orientation)
label.SetHeight(height)
label.SetDisplayType(Aspect_TODT_NORMAL)
label.SetHJustification(Graphic3d_HTA_CENTER)
label.SetVJustification(Graphic3d_VTA_CENTER)
label.SetColor(Quantity_Color(*color, Quantity_TOC_RGB))
label.SetFlipping(False)
label.SetZoomable(False)

self._context.Display(label, False)
self._context.UpdateCurrentViewer()

gp_Ax2 的原点确定标签位置,法向确定文字平面,X 方向确定文字横向。法向和 X 方向不能平行。SetOrientation3D() 同时设置了位置,因此示例中无需再调用 SetPosition()。

缩放时保持文字大小

SetZoomable(False) 表示文字不随视图缩放而放大或缩小。不过,其最终效果还需要结合三维朝向设置判断。

以 OCCT 7.9.0 的实现为例,启用 SetOrientation3D() 后,AIS_TextLabel 会在生成显示内容时设置 Graphic3d_TMF_ZoomPers,使标签保持模型空间中的朝向,并补偿视图缩放。该实现还会根据 SetFlipping() 的状态调整内部文字缩放属性,因此三维模式下的行为不能只看一次 SetZoomable() 调用。OCCT 7.9.0 源码

需要区分两个效果:

  • 缩放视图时,文字尺寸保持稳定。
  • 旋转相机时,文字仍位于指定平面,会因观察角度产生透视或投影压缩。

固定平面文字随观察角度发生的变化是正常的。例如,从接近平面侧面的方向观察时,文字会显得很窄。设置 SetFlipping(False) 后,从背面观察时文字也不会自动翻转为正向阅读。

修改后仍有背景时如何检查

如果修改的是已经显示的标签,应重新计算其显示内容:

label.SetDisplayType(Aspect_TODT_NORMAL)
self._context.Redisplay(label, True)

同时确认后续代码没有再次设置 Aspect_TODT_SUBTITLE,并检查场景中是否还保留着旧标签。

原始代码中,if hasattr(label, "SetBackdrop"): 后的语句缺少缩进;如果实际代码也如此,会先触发 Python 缩进错误。去掉背景不需要这一段,可以直接删除。

由于问题没有提供 OCCT 和 Python 绑定版本,也没有实际截图,上述判断以代码中的显示类型为依据。若绑定中缺少示例 API,应检查所安装版本的接口文档;仅凭这些材料无法进一步判断其他渲染异常。

备注:内容仅供参考。