FastCAE使用的是OCCT(OpenCascade)几何内核,FastCAE几何模块菜单上每个功能对应着一个创建几何的类,本文简单分析这部分源码。
一、几何命令类
打开FastCAE几何模块,在功能菜单中可以看到很多几何操作功能,包括创建立方体、创建圆柱,创建点,布尔操作,物体进行变换等。这每一个功能被封装成一个类,底层会调用OCCT的API,代码在GeometryCommand模块中。
其中,GeoCommandBase是所有几何创建命令的基类,也是QObject对象,定义了通用接口,基础的QT槽函数,通用字段。其中,字段_resShape用于保存OCC创建shape对象。
class GEOMETRYCOMMANDAPI GeoCommandBase : public QObject
{
Q_OBJECT
public:
GeoCommandBase(GUI::MainWindow* m, MainWidget::PreWindow* p);
~GeoCommandBase() = default;
virtual bool execute() = 0;
virtual void undo();
virtual void redo();
virtual void releaseResult();
TopoDS_Shape* getResultShape();
CommandType getComamndType();
void setEditData(Geometry::GeometrySet* set);
signals:
void updateGeoTree();
void showSet(Geometry::GeometrySet* s, bool r = true);
void showDatum(Geometry::GeometryDatum*);
void removeDisplayActor(Geometry::GeometrySet* s);
void removeDisplayDatumActor(Geometry::GeometryDatum*);
void updateActions();
void updatePropertySig(DataProperty::DataBase* data);
protected:
GUI::MainWindow* _mainWindow{};
MainWidget::PreWindow* _preWindow{};
CommandType _type{ D3Feature };
TopoDS_Shape* _resShape{};
Geometry::GeometryData* _geoData{};
GeoComandList* _commandList{};
bool _isEdit{ false };
Geometry::GeometrySet* _editSet{};
};
子类都需要实现execute()方法,在这个方法中会封装OCCT的API。几何模块界面上对应的子类有:
几何创建类 | 菜单功能 | OCCT API |
---|---|---|
CommandCreateBox | 创建立方体 | BRepPrimAPI_MakeBox |
GeoCommandCreateCone | 创建圆台 | BRepPrimAPI_MakeCone |
GeoCommandCreateCylinder | 创建圆柱 | BRepPrimAPI_MakeCylinder |
GeoCommandCreateSphere | 创建球体 | BRepPrimAPI_MakeSphere |
GeoCommandCreateLine | 创建线 | BRepBuilderAPI_MakeEdge |
CommandCreateFace | 创建面 | BRepBuilderAPI_MakeFace |
GeoCommandCreateDatumplane | 创建基准面 | BRepBuilderAPI_MakeFace |
CommandBool | 布尔运算 | BRepAlgoAPI_Cut、BRepAlgoAPI_Fuse、 BRepAlgoAPI_Common |
GeoCommandMakeExtrusion | 拉伸 | BRepPrimAPI_MakePrism |
GeoCommandMakeRevol | 旋转 | BRepPrimAPI_MakeRevol |
execute()方法建模完成后,一般会更新GUI,但这样设计并不合理。一是每个类都有说明存在冗余代码,同时相当于下层会调用上层接口,存在依赖倒置。
GeoCommandBase::execute();
emit showSet(newset);
emit updateGeoTree();
现代CAE软件一般允许脱离GUI,单独可脚本化执行,可无界面化执行。这样设计会导致必须存在GUI才可以正常工作。
二、调用入口GeometryCommandPy
FastCAE内置了python命令解析器。在单击几何模块菜单时,会先执行python命令,再调用上述几何创建类。
这些python命令的入口都在GeometryCommandPy.h中定义。
GUI层不直接调用的好处在于,可以使用python脚本重放整个建模过程,脚本化是目前CAE软件的必备基础能力。