opencascade TopoDS_Shape源码学习【重中之重】 原创
opencascade TopoDS_Shape
前言
描述了一个形状,它 引用了一个基础形状,该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度(而不是相对于其他形状的方向)来定义的。注意:如果一个形状引用的基础形状的形状列表为空,则该形状被视为空。
1
创建一个不引用任何内容的空形状
TopoDS_Shape() : myOrient(TopAbs_EXTERNAL);
2
通用移动构造函数,也接受子类(TopoDS_Shape层次结构仅声明了没有额外字段的假子类)。
template
TopoDS_Shape(T2&& theOther, typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value>::type* = 0)
: myTShape(std::forward(theOther).myTShape),
myLocation(std::forward(theOther).myLocation),
myOrient(std::forward(theOther).myOrient) ;
3
通用移动赋值运算符。
template
typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value, TopoDS_Shape>::type&
operator=(T2&& theOther) ;
4
如果此形状为空,则返回true。换句话说,它不引用任何可能被赋予位置和方向的基础形状。
IsNull() ;
5
销毁存储在此形状中的对基础形状的引用。结果,此形状变为空。
void Nullify() ;
6
返回形状的局部坐标系。
const TopLoc_Location& Location() const { return myLocation; }
7
设置形状的局部坐标系。
void Location(const TopLoc_Location& theLoc, const Standard_Boolean theRaiseExc = Standard_True) ;
8
返回一个与相似但局部坐标系设置为的形状。
TopoDS_Shape Located(const TopLoc_Location& theLoc, const Standard_Boolean theRaiseExc = Standard_True) ;
9
返回形状的方向。
TopAbs_Orientation Orientation() const { return myOrient; }
10
设置形状的方向。
void Orientation(TopAbs_Orientation theOrient) { myOrient = theOrient; }
11
返回一个与相似但方向设置为的形状。
TopoDS_Shape Oriented(TopAbs_Orientation theOrient) const
{
TopoDS_Shape aShape(*this);
aShape.Orientation(theOrient);
return aShape;
}
#### 12
返回一个指向实际形状实现的句柄。
const Handle(TopoDS_TShape)& TShape() const { return myTShape; }
#### 13
返回与此形状对应的TopAbs_ShapeEnum枚举值,
例如VERTEX、EDGE等。 异常 如果此形状为空,则抛出Standard_NullObject异常。
TopAbs_ShapeEnum ShapeType() const { return myTShape->ShapeType(); }
#### 14
返回自由标志的值。
Standard_Boolean Free() const { return myTShape->Free(); }
#### 15
设置自由标志。
void Free(Standard_Boolean theIsFree) { myTShape->Free(theIsFree); }
#### 16
返回锁定标志的值。
Standard_Boolean Locked() const { return myTShape->Locked(); }
#### 17
设置锁定标志。
void Locked(Standard_Boolean theIsLocked) { myTShape->Locked(theIsLocked); }
#### 18
返回修改标志的值。
Standard_Boolean Modified() const { return myTShape->Modified(); }
#### 19
设置修改标志。
void Modified(Standard_Boolean theIsModified) { myTShape->Modified(theIsModified); }
####20
返回检查标志的值。
Standard_Boolean Checked() const { return myTShape->Checked(); }
#### 21
设置检查标志。
void Checked(Standard_Boolean theIsChecked) { myTShape->Checked(theIsChecked); }
22
返回可定向性标志的值。
Standard_Boolean Orientable() const { return myTShape->Orientable(); }
23
设置可定向性标志。
void Orientable(const Standard_Boolean theIsOrientable) { myTShape->Orientable(theIsOrientable); }
24
返回封闭性标志的值。
Standard_Boolean Closed() const { return myTShape->Closed(); }
25
设置封闭性标志。
void Closed(Standard_Boolean theIsClosed) { myTShape->Closed(theIsClosed); }
26
返回无穷性标志的值。
Standard_Boolean Infinite() const { return myTShape->Infinite(); }
27
设置无穷性标志。
void Infinite(Standard_Boolean theIsInfinite) { myTShape->Infinite(theIsInfinite); }
28
返回凸性标志的值。
Standard_Boolean Convex() const { return myTShape->Convex(); }
29
设置凸性标志。
void Convex(Standard_Boolean theIsConvex) { myTShape->Convex(theIsConvex); }
30
将形状的位置乘以thePosition。
void Move(const TopLoc_Location& thePosition, const Standard_Boolean theRaiseExc = Standard_True) ;
31
返回一个与相似但位置乘以thePosition的形状。
TopoDS_Shape Moved(const TopLoc_Location& thePosition, const Standard_Boolean theRaiseExc = Standard_True) ;
32
使用TopAbs包中的Reverse方法反转方向。
void Reverse() { myOrient = TopAbs::Reverse(myOrient); }
33
返回一个与相似但方向使用TopAbs包中的Reverse方法反转的形状。
TopoDS_Shape Reversed() const ;
34
使用TopAbs包中的Complement方法补全方向。
void Complement() { myOrient = TopAbs::Complement(myOrient); }
35
返回一个与相似但方向使用TopAbs包中的Complement方法补全的形状。
TopoDS_Shape Complemented() const ;
36
使用TopAbs包中的Compose方法更新形状的方向,通过与theOrient组合。
void Compose(TopAbs_Orientation theOrient) ;
37
返回一个与相似但方向使用TopAbs包中的Compose方法与theOrient组合的形状。
TopoDS_Shape Composed(TopAbs_Orientation theOrient) const ;
38
返回直接子形状(子节点)的数量。
TopoDS_Iterator 用于访问子形状
Standard_Integer NbChildren() const { return myTShape.IsNull() ? 0 : myTShape->NbChildren(); }
39
//! 如果两个形状是伙伴,则返回True,即如果它们共享同一个TShape。
//! 位置和方向可能不同。
Standard_Boolean IsPartner(const TopoDS_Shape& theOther) const { return (myTShape == theOther.myTShape); }
40
//! 如果两个形状相同,则返回True,即如果它们共享同一个TShape和相同的位置。
//! 方向可能不同。
Standard_Boolean IsSame(const TopoDS_Shape& theOther) const
{
return myTShape == theOther.myTShape
&& myLocation == theOther.myLocation;
}
45
//! 如果两个形状相等,则返回True,即如果它们共享同一个TShape、相同的位置和方向。
Standard_Boolean IsEqual(const TopoDS_Shape& theOther) const
{
return myTShape == theOther.myTShape
&& myLocation == theOther.myLocation
&& myOrient == theOther.myOrient;
}
46
//! 返回一个表示的哈希值。该值在范围[1, theUpperBound]内。它是根据
//! TShape和Location计算得出的。Orientation(方向)未被使用。
//! @param theUpperBound 计算哈希码时必须位于的范围的上界
//! @return 一个计算出的哈希码,范围在[1, theUpperBound]内
Standard_EXPORT Standard_Integer HashCode(Standard_Integer theUpperBound) const;
47
//! 用一个新的Shape替换,该Shape具有相同的
//! Orientation(方向)和Location(位置),以及一个新的TShape,该TShape具有
//! 相同的几何形状但没有子形状。
void EmptyCopy() { myTShape = myTShape->EmptyCopy(); }
48
//! 返回一个新的Shape,该Shape具有相同的
//! Orientation(方向)和Location(位置),以及一个新的TShape,该TShape具有
//! 相同的几何形状但没有子形状。
TopoDS_Shape EmptyCopied() const
{
TopoDS_Shape aShape(*this);
aShape.EmptyCopy();
return aShape;
}
49
设置TShape
void TShape(const Handle(TopoDS_TShape)& theTShape) { myTShape = theTShape; }
50
将我的内容转储到流中
Standard_EXPORT void DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
用法用例
TopoDS_Shape
是 OpenCASCADE 中表示拓扑形状的基类,它本身是一个抽象类,不能直接实例化。但是,它定义了一些方法和操作,可以通过其派生类(如 TopoDS_Vertex
、TopoDS_Edge
、TopoDS_Face
、TopoDS_Solid
等)来操作和访问拓扑形状的属性和信息。
以下是一些示例,展示了如何使用 TopoDS_Shape
类中的方法及其派生类的操作:
1. 获取拓扑类型
通过 ShapeType()
方法可以获取拓扑形状的类型,它返回一个枚举值,表示形状的具体类型(顶点、边、面、实体等)。
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Solid.hxx>
#include <TopExp.hxx>
#include <iostream>
void PrintShapeType(const TopoDS_Shape& shape) {
switch (shape.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_FACE:
std::cout << "Shape is a face." << std::endl;
break;
case TopAbs_SOLID:
std::cout << "Shape is a solid." << std::endl;
break;
default:
std::cout << "Unknown shape type." << std::endl;
break;
}
}
int main() {
// 示例:创建一个顶点
TopoDS_Vertex vertex;
// 在实际应用中,需要通过构造函数或者其他方法来创建顶点
// 打印顶点的类型
PrintShapeType(vertex);
return 0;
}
2. 拓扑结构查询
通过 TopExp
类提供的方法可以进行更复杂的拓扑结构查询,如查找顶点、边、面之间的关系和连接。
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopExp.hxx>
#include <iostream>
void PrintConnectedEdges(const TopoDS_Vertex& vertex) {
// 查找连接到顶点的边
TopTools_IndexedMapOfShape edgeMap;
TopExp::MapShapes(vertex, TopAbs_EDGE, edgeMap);
for (int i = 1; i <= edgeMap.Extent(); ++i) {
const TopoDS_Edge& edge = TopoDS::Edge(edgeMap(i));
std::cout << "Connected edge with orientation: " << (edge.Orientation() == TopAbs_FORWARD ? "Forward" : "Reversed") << std::endl;
}
}
int main() {
// 示例:创建一个顶点和一条边
TopoDS_Vertex vertex;
// 在实际应用中,需要通过构造函数或者其他方法来创建顶点
TopoDS_Edge edge;
// 在实际应用中,需要通过构造函数或者其他方法来创建边
// 打印顶点连接的边
PrintConnectedEdges(vertex);
return 0;
}
3. 拓扑属性访问
通过 TopoDS_Shape
类及其派生类可以访问拓扑形状的特定属性,如边的起点和终点、面的法向量等。
#include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx>
#include <BRep_Tool.hxx>
#include <gp_Pnt.hxx>
#include <iostream>
void PrintEdgeVertices(const TopoDS_Edge& edge) {
// 获取边的起点和终点坐标
const TopoDS_Vertex& startVertex = TopExp::FirstVertex(edge);
const TopoDS_Vertex& endVertex = TopExp::LastVertex(edge);
gp_Pnt startPoint = BRep_Tool::Pnt(startVertex);
gp_Pnt endPoint = BRep_Tool::Pnt(endVertex);
std::cout << "Edge start point: (" << startPoint.X() << ", " << startPoint.Y() << ", " << startPoint.Z() << ")" << std::endl;
std::cout << "Edge end point: (" << endPoint.X() << ", " << endPoint.Y() << ", " << endPoint.Z() << ")" << std::endl;
}
int main() {
// 示例:创建一条边
TopoDS_Edge edge;
// 在实际应用中,需要通过构造函数或者其他方法来创建边
// 打印边的起点和终点坐标
PrintEdgeVertices(edge);
return 0;
}
这些示例展示了如何利用 TopoDS_Shape
及其派生类的方法来操作和查询拓扑形状的信息。在实际应用中,根据具体的需求和场景,可以进一步组合和扩展这些方法,以实现更复杂的几何建模和拓扑操作。
参考
参考