opencascade TopoDS_TShape源码学习

opencascade TopoDS_TShape

前言

TShape 是描述二维或三维空间中一组点的拓扑结构。

拓扑形状是由其他形状组成的结构。这是一个延迟类,用于支持拓扑对象。
TShape 由其可选的域(几何)和组件(带有位置和方向的其他 TShape)定义。这些组件存储在形状列表中。
一个 TShape 包含以下布尔标志:

  • Free : 自由或冻结。
  • Modified : 已修改。
  • Checked : 已检查。
  • Orientable : 可定向。
  • Closed : 已闭合(注意只有线和壳可以是闭合的)。
  • Infinite : 无限的。
  • Convex : 是凸的。
    用户不能直接访问从 TShape 派生的类。他们使用从 Shape 派生的类来处理它们。

方法

1. 返回释放标志。

Standard_Boolean Free() const { return ((myFlags & TopoDS_TShape_Flags_Free) != 0); }

2. 设置释放标志。

void Free(Standard_Boolean theIsFree) { setFlag(TopoDS_TShape_Flags_Free, theIsFree); }

3. 返回锁定标志。

Standard_Boolean Locked() const { return ((myFlags & TopoDS_TShape_Flags_Locked) != 0); }

4. 设置锁定标志。

void Locked(Standard_Boolean theIsLocked) { setFlag(TopoDS_TShape_Flags_Locked, theIsLocked); }

5. 返回修改标志。

Standard_Boolean Modified() const { return ((myFlags & TopoDS_TShape_Flags_Modified) != 0); }

6. 设置修改标志。

void Modified(Standard_Boolean theIsModified)
{
setFlag(TopoDS_TShape_Flags_Modified, theIsModified);
if (theIsModified)
{
setFlag(TopoDS_TShape_Flags_Checked, false); // 当一个 TShape 被修改时,它也被标记为未检查
}
}

7. 返回检查标志。

Standard_Boolean Checked() const { return ((myFlags & TopoDS_TShape_Flags_Checked) != 0); }

8. 设置检查标志。

void Checked(Standard_Boolean theIsChecked) { setFlag(TopoDS_TShape_Flags_Checked, theIsChecked); }

9. 返回定向性标志。

Standard_Boolean Orientable() const { return ((myFlags & TopoDS_TShape_Flags_Orientable) != 0); }

10. 设置定向性标志。

void Orientable(Standard_Boolean theIsOrientable) { setFlag(TopoDS_TShape_Flags_Orientable, theIsOrientable); }

11. 返回闭合性标志。

Standard_Boolean Closed() const { return ((myFlags & TopoDS_TShape_Flags_Closed) != 0); }

12. 设置闭合性标志。

void Closed(Standard_Boolean theIsClosed) { setFlag(TopoDS_TShape_Flags_Closed, theIsClosed); }

13. 返回无限性标志。

Standard_Boolean Infinite() const { return ((myFlags & TopoDS_TShape_Flags_Infinite) != 0); }

14. 设置无限性标志。

void Infinite(Standard_Boolean theIsInfinite) { setFlag(TopoDS_TShape_Flags_Infinite, theIsInfinite); }

15. 返回凸性标志。

Standard_Boolean Convex() const { return ((myFlags & TopoDS_TShape_Flags_Convex) != 0); }

16. 设置凸性标志。

void Convex(Standard_Boolean theIsConvex) { setFlag(TopoDS_TShape_Flags_Convex, theIsConvex); }

17. 返回作为 ShapeEnum 枚举项的类型:

Standard_EXPORT virtual TopAbs_ShapeEnum ShapeType() const = 0;

18. 返回一个没有子形状的 TShape 的副本。

Standard_EXPORT virtual Handle(TopoDS_TShape) EmptyCopy() const = 0;

19. 返回直接子形状(子对象)的数量。

Standard_Integer NbChildren() const { return myShapes.Size(); }

20. 将我自己的内容转储到流中。

Standard_EXPORT void DumpJson(Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const;

21. 构造一个空的 TShape。

TopoDS_TShape()
myFlags(TopoDS_TShape_Flags_Free
| TopoDS_TShape_Flags_Modified
| TopoDS_TShape_Flags_Orientable) {}

22. 定义的掩码值。

enum TopoDS_TShape_Flags {
TopoDS_TShape_Flags_Free = 0x001,
TopoDS_TShape_Flags_Modified = 0x002,
TopoDS_TShape_Flags_Checked = 0x004,
TopoDS_TShape_Flags_Orientable = 0x008,
TopoDS_TShape_Flags_Closed = 0x010,
TopoDS_TShape_Flags_Infinite = 0x020,
TopoDS_TShape_Flags_Convex = 0x040,
TopoDS_TShape_Flags_Locked = 0x080
};

用法用例

在OpenCASCADE中,TopoDS_TShape 是一个抽象基类,通常不直接实例化,而是通过其具体的子类来表示不同类型的拓扑形状。这些子类包括 TopoDS_Vertex, TopoDS_Edge, TopoDS_Wire, TopoDS_Face 等,每个子类都提供了特定类型拓扑形状的功能和方法。

以下是一些基于 TopoDS_TShape 及其子类的典型用法示例:

示例1: 创建和修改拓扑形状

#include <TopoDS_Vertex.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>

int main()
{
    // 创建一个顶点
    gp_Pnt point(0, 0, 0); // 创建一个点
    TopoDS_Vertex vertex = BRepBuilderAPI_MakeVertex(point);

    // 修改顶点的状态
    vertex.Free(Standard_False); // 设置顶点为非自由状态
    vertex.Locked(Standard_True); // 锁定顶点,使其不可修改

    // 检查顶点的状态
    if (vertex.Locked()) {
        std::cout << "Vertex is locked and cannot be modified." << std::endl;
    }

    return 0;
}

示例2: 遍历和操作拓扑形状

#include <TopoDS_Face.hxx>
#include <TopExp_Explorer.hxx>

int main()
{
    // 创建一个面对象
    TopoDS_Face face;

    // 假设有一个复杂的拓扑结构,需要遍历其子对象
    TopExp_Explorer exp(face, TopAbs_EDGE);
    for (; exp.More(); exp.Next()) {
        const TopoDS_Edge& edge = TopoDS::Edge(exp.Current());

        // 对每条边执行某些操作
        // ...
    }

    return 0;
}

示例3: 使用 TopoDS_Iterator 访问子形状

#include <TopoDS_Iterator.hxx>
#include <TopoDS_Shape.hxx>

void ProcessShapes(const TopoDS_Shape& shape)
{
    TopoDS_Iterator it(shape);
    for (; it.More(); it.Next()) {
        const TopoDS_Shape& subShape = it.Value();

        // 处理子形状
        // ...
    }
}

int main()
{
    // 示例用法:遍历并处理一个复杂的拓扑形状
    TopoDS_Shape complexShape;

    ProcessShapes(complexShape);

    return 0;
}

TopoDS_TShape 是一个抽象基类,通常在实际编程中,我们更多地会使用其具体的子类(如 TopoDS_Vertex, TopoDS_Edge, TopoDS_Wire, TopoDS_Face 等)来表示具体的拓扑形状。然而,作为抽象基类,TopoDS_TShape 中定义的一些方法对于理解其基本概念和操作也是很重要的。以下是一些 TopoDS_TShape 中方法的进一步示例:

示例1: 获取拓扑形状的类型

#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Face.hxx>
#include <TopAbs.hxx>

void PrintShapeType(const TopoDS_Shape& shape)
{
    TopAbs_ShapeEnum shapeType = shape.ShapeType();

    switch (shapeType) {
        case TopAbs_VERTEX:
            std::cout << "Shape is a vertex." << std::endl;
            break;
        case TopAbs_EDGE:
            std::cout << "Shape is an edge." << std::endl;
            break;
        case TopAbs_WIRE:
            std::cout << "Shape is a wire." << std::endl;
            break;
        case TopAbs_FACE:
            std::cout << "Shape is a face." << std::endl;
            break;
        default:
            std::cout << "Shape type is unknown." << std::endl;
            break;
    }
}

int main()
{
    // 创建不同类型的拓扑形状
    TopoDS_Vertex vertex;
    TopoDS_Edge edge;
    TopoDS_Wire wire;
    TopoDS_Face face;

    // 打印每个形状的类型
    PrintShapeType(vertex);
    PrintShapeType(edge);
    PrintShapeType(wire);
    PrintShapeType(face);

    return 0;
}

示例4: 复制一个空的拓扑形状

#include <TopoDS_TShape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS.hxx>

int main()
{
    // 创建一个顶点对象
    TopoDS_Vertex vertex;

    // 复制一个空的顶点形状
    Handle(TopoDS_TShape) emptyCopy = vertex.EmptyCopy();

    if (!emptyCopy.IsNull()) {
        std::cout << "Empty copy of vertex shape created successfully." << std::endl;
    } else {
        std::cout << "Failed to create empty copy of vertex shape." << std::endl;
    }

    return 0;
}

示例5: 使用 DumpJson 方法输出形状信息

#include <TopoDS_Shape.hxx>
#include <TopoDS.hxx>
#include <TCollection_AsciiString.hxx>
#include <OSD_Path.hxx>
#include <OSD_File.hxx>

void DumpShapeToJson(const TopoDS_Shape& shape)
{
    TCollection_AsciiString jsonFilePath("shape_dump.json");
    OSD_Path path(jsonFilePath);

    // 打开文件
    OSD_File file;
    file.Open(path, OSD_Write | OSD_Create);

    // 检查文件是否打开成功
    if (!file.IsOpen()) {
        std::cout << "Failed to open JSON file for writing." << std::endl;
        return;
    }

    // 将形状的信息转储到 JSON 文件中
    shape.DumpJson(file);

    // 关闭文件
    file.Close();

    std::cout << "Shape information dumped to shape_dump.json." << std::endl;
}

int main()
{
    // 示例用法:创建一个复杂的拓扑形状并转储其信息到 JSON 文件中
    TopoDS_Shape complexShape;

    DumpShapeToJson(complexShape);

    return 0;
}

这些示例展示了如何使用 TopoDS_TShape 及其相关方法来获取拓扑形状的类型、复制空的形状、以及将形状信息转储到文件中。在实际应用中,这些方法可以根据具体需求和操作场景进行进一步扩展和应用。

参考

参考