OpenCascade开发:移除AIS_TextLabel符号白色背景及固定平面文本显示方案咨询
针对你在OpenCascade几何程序开发中遇到的两个文本显示问题,我整理了具体的解决方案:
问题1:移除AIS_TextLabel周围的白色背景
你代码里尝试用SetBackdrop(False)来关闭背景,但在部分OpenCascade版本中,这个方法可能没有直接生效——因为AIS_TextLabel的背景控制最终是由其关联的Graphic3d_TextAspect样式对象决定的。你可以直接操作这个样式对象来彻底移除白色背景:
label = AIS_TextLabel() label.SetText(str(text)) label.SetPosition(gp_Pnt(*position)) label.SetHeight(height) label.SetDisplayType(1) label.SetHJustification(Graphic3d_HTA_CENTER) label.SetVJustification(Graphic3d_VTA_CENTER) # 获取文本样式属性,直接修改背景设置 text_aspect = label.Attributes() text_aspect.SetBackdrop(False) # 保险起见,可额外设置背景色为完全透明(针对旧版本兼容) back_color = Quantity_Color(1.0, 1.0, 1.0, Quantity_TOC_RGB) text_aspect.SetBackdropColor(back_color) text_aspect.SetBackdropTransparency(1.0) # 1.0代表完全透明 # 应用修改后的样式 label.SetAttributes(text_aspect) color_obj = Quantity_Color(*color, Quantity_TOC_RGB) label.SetColor(color_obj) self._context.Display(label, False)
这样操作后,文本周围的白色矩形背景应该会被完全移除。
问题2:固定在尺寸平面、不随相机旋转/缩放改变的文本显示方式
AIS_TextLabel是屏幕对齐的组件,默认会始终朝向相机,且视图缩放时文本大小会跟着变化。要实现你需要的“平面固定、不转向相机、缩放大小不变”的效果,有两种适配不同场景的方案:
方案1:生成3D文本实体(完全绑定几何平面)
如果你的需求是文本作为几何的一部分,和尺寸平面完全绑定(相机旋转时随平面转动,模型缩放时文本大小同步变化),可以用BRepBuilderAPI_MakeText生成文本的3D形状,再通过AIS_Shape显示:
# 创建3D文本几何形状(参数依次为文本内容、位置、字高、厚度) text_shape = BRepBuilderAPI_MakeText("1", gp_Pnt(*position), height, 0.1).Shape() # 创建AIS对象并配置显示属性 ais_text = AIS_Shape(text_shape) color_obj = Quantity_Color(*color, Quantity_TOC_RGB) ais_text.SetColor(color_obj) self._context.Display(ais_text, False)
这种方式下,文本是真实的3D几何,完全贴合指定平面,不会随相机旋转转向镜头;但视图缩放时,文本的屏幕大小会和其他几何同步变化,适合文本需要和模型尺寸严格匹配的场景。
方案2:自定义AIS对象实现屏幕大小固定的平面文本
如果需要视图缩放时文本屏幕大小保持不变,同时固定在平面内不朝向相机,需要自定义AIS_InteractiveObject,在绘制时动态调整文本的世界空间大小,抵消视图缩放的影响:
class FixedPlaneText(AIS_InteractiveObject): def __init__(self, text, position, plane, screen_height, color): super().__init__() self.text = text self.position = gp_Pnt(*position) self.plane = plane # 传入尺寸所在的平面(gp_Pln类型) self.screen_height = screen_height # 文本在屏幕上的固定高度 self.color = Quantity_Color(*color, Quantity_TOC_RGB) def Compute(self, thePresentation, theDisplayMode): pres = thePresentation.GetPresentation() # 获取当前视图的投影参数,计算屏幕高度对应的世界空间尺寸 view = self.Context().CurrentViewer().ActiveView() world_height = view.Viewport().ScreenToWorld(self.position, self.screen_height) # 创建3D文本样式,设置为平面内的固定朝向 text_aspect = Graphic3d_TextAspect() text_aspect.SetText(self.text) text_aspect.SetColor(self.color) text_aspect.SetHeight(world_height) text_aspect.SetOrientation(Graphic3d_TOR_3D) # 启用3D空间朝向,不转向相机 text_aspect.SetHorizontalJustification(Graphic3d_HTA_CENTER) text_aspect.SetVerticalJustification(Graphic3d_VTA_CENTER) # 创建文本图元并添加到场景 text_primitive = Graphic3d_Text() text_primitive.SetAspect(text_aspect) text_primitive.SetPosition(self.position) text_primitive.SetPlane(self.plane) # 绑定到指定平面 pres.AddPrimitive(text_primitive) return True # 使用示例:假设你已经有尺寸所在的平面plane fixed_text = FixedPlaneText("1", position, plane, height, color) self._context.Display(fixed_text, False)
这个方案中,文本会始终固定在指定平面内,相机旋转时不会转向镜头;每次绘制时会根据当前视图的缩放比例自动调整文本的世界空间大小,确保屏幕上的显示尺寸保持不变。
内容的提问来源于stack exchange,提问作者Александр Трифонов

