济南友泉软件有限公司
FreeCAD 源码分析
之
FreeCAD 基础:FreeCADBase 模块
济南友泉软件有限公司
2020/2/12
济南友泉软件有限公司
目录
一、 模块功能概述 .................................................................................. 1
二、 公共类 ............................................................................................ 1
2.1 RTTI ............................................................................................ 1
2.2 工厂模式 ...................................................................................... 2
2.3 观察者模式................................................................................... 3
2.4 异常处理 ...................................................................................... 3
2.5 引用计数 ...................................................................................... 3
2.6 对象持久化................................................................................... 4
三、 几何类 ............................................................................................ 1
3.1 Vector3D ...................................................................................... 1
3.2 Axis ............................................................................................. 1
3.3 BoundBox3 ................................................................................... 1
3.4 CoordinateSystem ......................................................................... 2
3.5 Builder3D & InventorBuilder .......................................................... 2
3.6 Matrix4D ...................................................................................... 2
3.7 Placement .................................................................................... 2
3.8 Rotation ....................................................................................... 2
3.9 投影变换 ...................................................................................... 3
四、 日志输出 ......................................................................................... 4
4.1 输出接口 ...................................................................................... 4
4.2 日志级别 ...................................................................................... 4
4.3 日志回调 ...................................................................................... 5
五、 工具类 ............................................................................................ 6
5.1 编码与解码................................................................................... 6
I
济南友泉软件有限公司
5.2 调试器 ......................................................................................... 6
5.3 文件信息 ...................................................................................... 6
5.4 文件读写 ...................................................................................... 6
5.5 进度显示 ...................................................................................... 7
5.6 UUID ........................................................................................... 7
5.7 参数管理 ...................................................................................... 8
5.8 检测内存 ...................................................................................... 8
5.9 调用栈信息................................................................................... 8
六、
Python 封装 ..................................................................................... 9
6.1 解释器 ......................................................................................... 9
参考资料 ................................................................................................... 10
II
济南友泉软件有限公司
一、 模块功能概述
FreeCADBase 提供了 FreeCAD 软件开发的基础类库,具体来说,主要功能包括
公共功能
定义了工厂模式、观察者模式,以及数据持久化的接口。
数学几何
定义了三维空间几何的基本数据结构。
日志
定义了统一的接口完成软件运行时日志信息的输出与管理。
实用工具
提供了文件读写、内存检测、参数管理等主要工具。
Python
使用 PyCXX 扩展 Python 功能。
1
济南友泉软件有限公司
二、 公共类
2.1 RTTI
RTTI(Runtime Type Identification)是运行时类型识别。通过继承 BaseClass 类并
利用提供的宏,可以非常方便地实现 BaseClass 子类支持 RTTI。
为了使用户创建的类 UserClass 支持 RTTI,可以按照下面的格式定义 UserClass,
TYPESYSTEM_HEADER()
//UserClass.h
class UserClass : public Base::BaseClass
{
public:
};
/// Construction
UserClass();
/// Destruction
virtual ~UserClass();
//UserClass.cpp
TYPESYSTEM_SOURCE(UserClass, Base::BaseClass)
UserClass::UserClass()
{
}
UserClass::~UserClass()
{
}
实际上,TYPESYSTEM_HEADER、TYPESYSTEM_SOURCE 等宏用于定义下面的一系列
的成员函数、成员变量等操作。
类型信息
static Type BaseClass::classTypeId;
获取类型
static Type BaseClass::getClassTypeId(void);
virtual Type BaseClass::getTypeId(void) const;
1
济南友泉软件有限公司
初始化类型信息数据结构
static void BaseClass::initSubclass(Base::Type &toInit,const char* ClassName,
const char *ParentName, Type::instantiationMethod method=0);
类型判断
bool BaseClass::isDerivedFrom(const Type type) const
创建对象
static void * BaseClass::create(void)
关联 Python
virtual PyObject * BaseClass::getPyObject(void);
virtual void BaseClass::setPyObject(PyObject *);
创建类对象
static void * BaseClass::create(void)
类型转换
template T * freecad_dynamic_cast(Base::BaseClass * t)
template const T * freecad_dynamic_cast(const Base::BaseClass * t)
2.2 工厂模式
Factory、AbstractProducer 等类实现了工厂模式。Factory 中包含一个
AbstractProducer 映射表,可以通过 FactoryAddProducer 向 Factory 注册对象生成的
方法,
void Factory::AddProducer (const char* sClassName, AbstractProducer *pcProducer)
2
济南友泉软件有限公司
2.3 观察者模式
Observer、Subject 等类实现了观察者模式。Subject 类及其子类表示需要被观察
的对象,需要绑定对应的观察者。
void Subject::Attach(Observer<_MessageType> *ToObserv)
void Subject::Detach(Observer<_MessageType> *ToObserv)
当 Subject 对象数据发生变化时,需要调用 Subject::Notify 通知 Observer.
void Subject::Notify(_MessageType rcReason)
2.4 异常处理
异常处理可以将逻辑代码与程序运行时的错误处理进行分离。Exception 类是其他
异常处理类的基类,其他派生类主要用于处理 XML 解析、文件读写等操作异常。
类名
Exception
AbortException
XMLBaseException
XMLParseException
XMLAttributeError
FileException
FileSystemError
BadFormatError
异常类的基类,定义了异常信息输出等基本功能。
功能
程序终止
XML 文件解析时异常
文件 I/O 异常
文件系统操作异常(比如重命名)
数据结构格式错误异常。
此外,ExceptionFactory、ExceptionProducer 等类提供了针对异常对象的工厂模型实
现。
2.5 引用计数
Base::Reference 类模板实现了引用计数风格的对象管理接口,
3
济南友泉软件有限公司
template class Reference
模板参数 T 必须是 Base::Handled 及其派生类。
2.6 对象持久化
数据持久化是把对象数据保存到存储介质或者从存储介质读取数据来创建对象。
Base::Persistence 定义了持久化对象的基本接口,Persistence::Save 函数完成对象数
据存储到 XML 文件中;Persistence::Restore 完成从 XML 文件读取对象数据。
4