opencascade AIS_Shape源码学习【重中之重】 原创
opencascade AIS_Shape
前言
//! 一个用于管理形状展示和选择的框架。
//! AIS_Shape是交互对象,大多数应用程序都会使用它。
//! 提供了标准函数,允许您在开放的局部上下文中准备选择形状的组成元素 -
//! 顶点、边、面等。这些特定于“Shape”类型对象的选择模式被称为标准激活模式。
//! 这些模式仅在开放的局部上下文中考虑,并且仅对重新定义虚拟方法
//! AcceptShapeDecomposition并返回true的交互对象起作用。
//! 还提供了多个高级函数。其中包括管理继承形状类的偏差角度和偏差系数的函数 -
//! 这些服务允许您选择一种类型的形状交互对象以获得更高的绘图精度。
//! 在这种情况下,与上述偏差角度和系数函数对应的Prs3d_Drawer::IsOwn…函数会返回true,
//! 表示特定对象有可用的本地设置。
//!
//! 此类允许使用每个面的底层表面的本机UV参数空间在形状上映射纹理
//! (这意味着纹理将在所有面上视觉上重复显示)。
//! 为了生成纹理坐标,在计算AIS_Shaded显示模式中的呈现之前,应设置适当的着色属性:
//! @code
//! Handle(AIS_Shape) aPrs = new AIS_Shape();
//! aPrs->Attributes()->SetupOwnShadingAspect();
//! aPrs->Attributes()->ShadingAspect()->Aspect()->SetTextureMapOn();
//! aPrs->Attributes()->ShadingAspect()->Aspect()->SetTextureMap (new Graphic3d_Texture2Dmanual (Graphic3d_NOT_2D_ALUMINUM));
//! @endcode
//! 纹理本身在参数范围(0,1)x(0,1)内进行参数化。
此类重中之重
1
初始化形状对象,构建由线、边和顶点组成的形状。
Standard_EXPORT AIS_Shape(const TopoDS_Shape& shap);
2
返回索引0。此值指 SHAPE,来自 TopAbs_ShapeEnum。
virtual Standard_Integer Signature() const Standard_OVERRIDE { return 0; }
3
返回 Interactive Object 的类型作为 Object。
virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KindOfInteractive_Shape; }
4
如果交互对象接受形状分解,则返回 true。
virtual Standard_Boolean AcceptShapeDecomposition() const Standard_OVERRIDE { return Standard_True; }
5
返回指定的显示模式是否被支持。
virtual Standard_Boolean AcceptDisplayMode(const Standard_Integer theMode) const Standard_OVERRIDE { return theMode >= 0 && theMode <= 2; }
6
返回此形状对象。
const TopoDS_Shape& Shape() const { return myshape; }
7
构造一个具体形状对象的实例 theShape。
void SetShape(const TopoDS_Shape& theShape);
8
SetShape() 的别名。
void Set(const TopoDS_Shape& theShape) { SetShape(theShape); }
9
为此特定形状设置偏差系数的本地值。
Standard_EXPORT Standard_Boolean SetOwnDeviationCoefficient();
10
为此特定形状设置偏差角度的本地值。
Standard_EXPORT Standard_Boolean SetOwnDeviationAngle();
11
为此特定形状设置偏差系数的本地值。
Standard_EXPORT void SetOwnDeviationCoefficient(const Standard_Real aCoefficient);
12
这会计算一个新的角度和偏差值 anAngle,并将这些值设置到我的 Drawer 中,使其成为形状的本地值。
Standard_EXPORT void SetAngleAndDeviation(const Standard_Real anAngle);
13
返回用户设置的角度初始值。
Standard_EXPORT Standard_Real UserAngle() const;
14
设置 myOwnDeviationAngle 字段在 Prs3d_Drawer 中,并重新计算呈现。
Standard_EXPORT void SetOwnDeviationAngle(const Standard_Real anAngle);
15
如果偏差系数 aCoefficient 和先前的偏差系数 aPreviousCoefficient 的值已经设置,则返回 true 并返回这些值。如果这些值尚未设置,则返回 false。
Standard_EXPORT Standard_Boolean OwnDeviationCoefficient(Standard_Real& aCoefficient, Standard_Real& aPreviousCoefficient) const;
16
如果偏差角度 anAngle 和先前的偏差角度 aPreviousAngle 的值已经设置,则返回 true 并返回这些值。如果这些值尚未设置,则返回 false。
Standard_EXPORT Standard_Boolean OwnDeviationAngle(Standard_Real& anAngle, Standard_Real& aPreviousAngle) const;
17
设置形状使用的 HLR 算法类型。
void SetTypeOfHLR(const Prs3d_TypeOfHLR theTypeOfHLR) { myDrawer->SetTypeOfHLR(theTypeOfHLR); }
18
获取使用的 HLR 算法类型。
Prs3d_TypeOfHLR TypeOfHLR() const { return myDrawer->TypeOfHLR(); }
19
设置重建复合形状中的颜色 aColor。通过以下 Drawer 方法对外观进行操作:
- 自由边界:Prs3d_Drawer_FreeBoundaryAspect,
- 等值线:Prs3d_Drawer_UIsoAspect、Prs3dDrawer_VIsoAspect,
- 共享边界:Prs3d_Drawer_UnFreeBoundaryAspect,
- 着色:Prs3d_Drawer_ShadingAspect,
- 隐藏线模式下的可见线颜色:Prs3d_Drawer_SeenLineAspect,
- 隐藏线模式下的隐藏线颜色:Prs3d_Drawer_HiddenLineAspect。
Standard_EXPORT virtual void SetColor(const Quantity_Color& theColor) Standard_OVERRIDE;
20
删除重建复合形状中的颜色设置。
Standard_EXPORT virtual void UnsetColor() Standard_OVERRIDE;
21
设置重建复合形状中的线宽度值 aValue。改变线的外观。
Standard_EXPORT virtual void SetWidth(const Standard_Real aValue) Standard_OVERRIDE;
22
删除重建复合形状中的线宽度设置。
Standard_EXPORT virtual void UnsetWidth() Standard_OVERRIDE;
23
允许在重建复合形状中为材料 aName 设置设置。
Standard_EXPORT virtual void SetMaterial(const Graphic3d_MaterialAspect& aName) Standard_OVERRIDE;
24
删除重建复合形状中的材料设置。
Standard_EXPORT virtual void UnsetMaterial() Standard_OVERRIDE;
25
设置重建复合形状中的透明度值 aValue。
Standard_EXPORT virtual void SetTransparency(const Standard_Real aValue = 0.6) Standard_OVERRIDE;
26
删除重建复合形状中的透明度设置。
Standard_EXPORT virtual void UnsetTransparency() Standard_OVERRIDE;
27
构造一个边界框,用于重建复合拓扑形状的呈现。
Standard_EXPORT virtual const Bnd_Box& BoundingBox();
28
AIS_InteractiveObject 定义了另一个虚拟方法 BoundingBox,它与上面的方法不同;保持其可见性。
using AIS_InteractiveObject::BoundingBox;
29
根据当前表面模型,返回形状的颜色属性。
Standard_EXPORT virtual void Color(Quantity_Color& aColor) const Standard_OVERRIDE;
30
根据当前表面模型,返回形状的材料名称属性。
Standard_EXPORT virtual Graphic3d_NameOfMaterial Material() const Standard_OVERRIDE;
31
根据当前表面模型,返回形状的透明度属性。
Standard_EXPORT virtual Standard_Real Transparency() const Standard_OVERRIDE;
32
返回指定选择模式的形状类型。
static TopAbs_ShapeEnum SelectionType(const Standard_Integer theSelMode)
{
switch (theSelMode)
{
case 1: return TopAbs_VERTEX;
case 2: return TopAbs_EDGE;
case 3: return TopAbs_WIRE;
case 4: return TopAbs_FACE;
case 5: return TopAbs_SHELL;
case 6: return TopAbs_SOLID;
case 7: return TopAbs_COMPSOLID;
case 8: return TopAbs_COMPOUND;
case 0: return TopAbs_SHAPE;
}
return TopAbs_SHAPE;
}
33
返回指定形状类型的选择模式。
static Standard_Integer SelectionMode(const TopAbs_ShapeEnum theShapeType)
{
switch (theShapeType)
{
case TopAbs_VERTEX: return 1;
case TopAbs_EDGE: return 2;
case TopAbs_WIRE: return 3;
case TopAbs_FACE: return 4;
case TopAbs_SHELL: return 5;
case TopAbs_SOLID: return 6;
case TopAbs_COMPSOLID: return 7;
case TopAbs_COMPOUND: return 8;
case TopAbs_SHAPE: return 0;
}
return 0;
}
34
返回纹理重复的 UV 值;默认为 (1, 1)。
const gp_Pnt2d& TextureRepeatUV() const { return myUVRepeat; }
35
设置每个面上纹理的重复次数。纹理本身在 (0,1) x (0,1) 的参数空间内。
要为要纹理化的形状的每个面设置 UV 空间的参数化 (Umin,Umax) x (Vmin,Vmax)。
void SetTextureRepeatUV(const gp_Pnt2d& theRepeatUV) { myUVRepeat = theRepeatUV; }
36
返回纹理原点的 UV 位置;默认为 (0, 0)。
const gp_Pnt2d& TextureOriginUV() const { return myUVOrigin; }
37
使用此方法更改纹理的原点。
Texel (0,0) 将映射到表面 (myUVOrigin.X(), myUVOrigin.Y())。
void SetTextureOriginUV(const gp_Pnt2d& theOriginUV) { myUVOrigin = theOriginUV; }
38
返回 UV 坐标的比例因子;默认为 (1, 1)。
const gp_Pnt2d& TextureScaleUV() const { return myUVScale; }
39
使用此方法缩放纹理(按照面的百分比)。
您可以为 U 和 V 都指定一个比例因子。
示例:如果将 ScaleU 和 ScaleV 设置为 0.5,并启用纹理重复,
纹理将在每个方向上的面上出现两次。
void SetTextureScaleUV(const gp_Pnt2d& theScaleUV) { myUVScale = theScaleUV; }
40
计算正常的呈现。
Standard_EXPORT virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode) Standard_OVERRIDE;
41
计算投影呈现。
virtual void computeHLR(const Handle(Graphic3d_Camera)& theProjector,
const Handle(TopLoc_Datum3D)& theTrsf,
const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE
42
计算选择。
Standard_EXPORT virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode) Standard_OVERRIDE;
创建自有的外观(如果不存在),并设置颜色。
如果已创建新的外观,则返回 TRUE。
bool setColor(const Handle(Prs3d_Drawer)& theDrawer, const Quantity_Color& theColor)
43
创建自有的外观(如果不存在),并设置宽度。
####//! @return 如果已创建新的外观,则返回 TRUE。
Standard_EXPORT bool setWidth(const Handle(Prs3d_Drawer)& theDrawer, const Standard_Real theWidth) const;
44
设置透明度。
Standard_EXPORT void setTransparency(const Handle(Prs3d_Drawer)& theDrawer, const Standard_Real theValue) const;
45
设置材料。
void setMaterial(const Handle(Prs3d_Drawer)& theDrawer, const Graphic3d_MaterialAspect& theMaterial, const Standard_Boolean theToKeepColor, const Standard_Boolean theToKeepTransp) const;
46
替换抽屉链接的已计算组的外观为新的自有值。
Standard_EXPORT void replaceWithNewOwnAspects();
47
计算指定形状的 HLR 呈现。
Standard_EXPORT static void computeHlrPresentation(const Handle(Graphic3d_Camera)& theProjector,
const Handle(Prs3d_Presentation)& thePrs,
const TopoDS_Shape& theShape,
const Handle(Prs3d_Drawer)& theDrawer);
48
将我的内容转储到流中。
void DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth = -1)
用法用例
OpenCascade中的AIS_Shape
类用于管理和显示几何形状。以下是一个简单的示例,展示如何创建和使用AIS_Shape
类来显示一个简单的立方体:
#include <AIS_Shape.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_Drawer.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <Graphic3d_NameOfMaterial.hxx>
#include <Quantity_Color.hxx>
#include <Quantity.hxx>
int main()
{
// 创建一个简单的立方体形状
BRepPrimAPI_MakeBox boxMaker(10.0, 20.0, 30.0);
TopoDS_Shape cube = boxMaker.Shape();
// 创建一个AIS_Shape对象并设置形状
Handle(AIS_Shape) aisShape = new AIS_Shape(cube);
// 设置显示属性
aisShape->SetColor(Quantity_Color(Quantity_NOC_RED));
aisShape->SetMaterial(Graphic3d_NOM_PLASTIC);
// 创建一个交互上下文
Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext();
// 将AIS_Shape对象添加到交互上下文中
context->Display(aisShape, Standard_True);
// 进入事件循环
context->UpdateCurrentViewer();
// 退出程序
return 0;
}
示例解释:
-
包含必要的头文件:
AIS_Shape.hxx
: 包含AIS_Shape
类的声明。AIS_InteractiveContext.hxx
: 包含AIS_InteractiveContext
类的声明,用于管理交互对象。- 其他一些OpenCascade的核心类和函数。
-
创建立方体形状:
使用BRepPrimAPI_MakeBox
类创建一个立方体形状,并获取其TopoDS_Shape
表示。 -
创建AIS_Shape对象:
使用AIS_Shape
类的构造函数,将上一步创建的立方体形状传递进去。 -
设置显示属性:
使用SetColor
方法设置形状的颜色为红色,并使用SetMaterial
方法设置材质为塑料。 -
创建交互上下文:
使用AIS_InteractiveContext
类创建一个交互上下文对象,用于管理和显示交互对象。 -
显示形状:
使用Display
方法将AIS_Shape
对象添加到交互上下文中显示。 -
事件循环:
调用UpdateCurrentViewer
方法进入事件循环,等待用户交互。 -
程序退出:
当用户关闭应用程序时,事件循环结束,程序退出。
这个示例演示了如何使用OpenCascade的AIS_Shape
类来创建、显示和交互一个简单的几何形状(立方体)。