BRepPrimAPI_MakeBox aBox(10., 10., 10.);
std::cout << "Box creation failed: shape is null. 11:" << aBox.IsDone() << std::endl;
这段代码IsDone()一直是0,困扰了我很久。
后来借助AI 对源码的分析才搞明白需要这种写法,注意后面的Solid()方法
TopoDS_Shape aShape = BRepPrimAPI_MakeBox(1, 1, 1).Solid();
aShape.DumpJson(std::cout);
if (aShape.IsNull()) {
std::cout << "Box creation failed: shape is null." << std::endl;
}
构造函数底层逻辑
1. 构造函数执行流程
BRepPrimAPI_MakeBox::BRepPrimAPI_MakeBox(10., 10., 10.)
↓
调用 pmin(gp_Pnt(0,0,0), 10., 10., 10.) 计算最小点
↓
创建 gp_Ax2 坐标系: gp_Ax2(pmin(0,0,0,10,10,10), gp_Dir(0,0,1), gp_Dir(1,0,0))
↓
构造 BRepPrim_Wedge(myWedge): BRepPrim_Wedge(gp_Ax2, Abs(10), Abs(10), Abs(10))
2. 内部数据结构
- myWedge: BRepPrim_Wedge 对象,存储几何信息
- myShape: 继承自 BRepBuilderAPI_MakeShape 的结果存储
3. IsDone() 方法调用
bool IsDone() const { return BRepBuilderAPI_Command::IsDone(); }
时序图
类图
关键执行细节
- 坐标系创建: 使用默认坐标系,原点在(0,0,0),Z轴向上,X轴向右
- Wedge构造: Box实际上是特殊的Wedge(楔形体),所有侧面都是垂直的
- 延迟构建: 构造函数只设置参数,实际的几何体构建在调用
Shape(),Solid(),Shell()时进行 - 状态管理: 通过继承的
BRepBuilderAPI_Command管理构建状态
这个设计体现了OCCT的延迟计算模式和分层架构思想。
延迟构建
具体分析:
1. Shell() 函数
const TopoDS_Shell& BRepPrimAPI_MakeBox::Shell()
{
myShape = myWedge.Shell(); // 构建Shell几何体
Done(); // 设置 myDone = true
return TopoDS::Shell(myShape);
}
2. Solid() 函数
const TopoDS_Solid& BRepPrimAPI_MakeBox::Solid()
{
BRep_Builder B;
B.MakeSolid(TopoDS::Solid(myShape)); // 构建Solid几何体
B.Add(myShape, myWedge.Shell());
Done(); // 设置 myDone = true
return TopoDS::Solid(myShape);
}
3. Shape() 函数(基类实现)
const TopoDS_Shape& BRepBuilderAPI_MakeShape::Shape()
{
if (!IsDone()) // 如果还没有完成
{
((BRepBuilderAPI_MakeShape*)(void*)this)->Build(); // 调用Build()
Check(); // 验证状态
}
return myShape;
}
而 Build() 在 BRepPrimAPI_MakeBox 中的实现是:
void BRepPrimAPI_MakeBox::Build(const Message_ProgressRange& /*theRange*/)
{
Solid(); // 调用Solid(),而Solid()会调用Done()
}
Done()方法的作用:
void BRepBuilderAPI_Command::Done()
{
myDone = Standard_True; // 直接设置myDone为true
}
执行流程总结:
- 构造函数:只设置参数,
myDone = false(默认) - 调用Shell()/Solid():构建几何体 +
Done()→myDone = true - 调用Shape():检查
IsDone(),如果false则调用Build()→Solid()→Done()→myDone = true
所以您的问题中的这三个函数确实都会设置myDone为true,确保后续的IsDone()调用返回正确状态。这是OCCT状态管理模式的核心机制。

465

被折叠的 条评论
为什么被折叠?



