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
及其相关方法来获取拓扑形状的类型、复制空的形状、以及将形状信息转储到文件中。在实际应用中,这些方法可以根据具体需求和操作场景进行进一步扩展和应用。