1.实现原理
FreeCAD定义了一套属性层次结构,最上层是Property基类,该类主要提供了外部访问属性的接口及两个成员变量:属性名称、属性状态及属性容器类PropertyContainer。具体的属性直接或间接继承Property类,属性类中主要记录属性名称、属性状态及属性值信息,属性的外部依赖关系,属性类型及特征等信息都记录在属性容器中。属性状态主要标志属性是否关联、能否修改及是否在GUI界面显示等信息,属性中共定义了32种状态,如下图所示:
属性机制要保证当外部用户修改或更新属性值后,该属性归属或关联的对象要同步更新。属性相关关联信息记录在PropertyContainer类中,属性值发生变化是会调用该类的onChanged接口,如下图所示:
onChanged提供了一个更新接口,它接收了Property参数,实体类会根据自己的特性重载onChanged接口,该接口内部会触发FreeCAD的recompute机制,它重新计算关联的对象信息从而达到更新目的。
2.使用情况
为了方便使用,属性机制定义了一些给对象添加属性的宏函数,如下图所示:
实际使用中,各对象先通过宏函数把对象信息关联到具体的属性容器中,并给属性赋一个初始值,如下所示:
属性的值可以通过外部数据传入和修改,它会调用属性的SetValue接口,该接口赋值的同时触发recompute机制重新计算对象。
FreeCAD的模型几何信息、材质信息、显示信息都是通过属性机制管理,每个信息都对应一个属性,然后就可以利用上面描述的过程修改信息,更新管理模型。下图是显示相关属性:
3.总结
FreeCAD属性机制在记录对象属性值的同时,保证属性发生变化的时候更新关联的对象,了解其实现机制可以为后面属性相关的工作提供参考。