libreCAD源码阅读笔记3
1 前言
打开RS_Document源码后,又出现了RS_EntityContainer、RS_Entity等一系列类,这好像就是libreCAD的数据模型,有具体的实体类,也有实体类所关联的数据。
2 相关类
2.1 RS_EntityContainer类
RS_EntityContainer类是一个Composite模式的类,主要是各种点、线、面等具体要素的集合。
2.2 RS_Entity类
RS_Entity是点、线、弧线等绘制对象的基类,属性有该绘制对象所属的对象容器、图层;对象的最小外包矩形;绘制自己时用的RS_Pen;对象ID等内容。对象的draw函数为纯虚函数,子类需要实现该类实现绘制自身的功能,该函数接受RS_Painter、RS_GrahpicView作为绘制环境和绘制窗体。
2.2.1 RS_Entity子类示例:RS_Point
不论是RS_Point、RS_Line、RS_Polyline,甚至是RS_Layer都对应一个RS_XXXData结构体与绘制对象组合负责存储对象的具体数据。RS_PointData结构体里面维护一个RS_Vector类,该类是一个空间三维向量,存储着(x,y,z)。下面是RS_Point的draw函数完成自身绘制,也就是通过传入的RS_Painter、RS_GraphicView,用RS_Painter将自身的数据绘制到RS_GraphicView面板上。
void RS_Point::draw(RS_Painter* painter,RS_GraphicView* view, double& /*patternOffset*/) {
if (painter==NULL || view==NULL) {
return;
}
painter->drawPoint(view->toGui(getPos()));
}
2.3 RS_Document类
RS_Document类本身就是一个RS_EntityContainer容器,存储着各种各样的绘制实体和他们的数据,因此RS_Document就是一个数据集合。同时,RS_Document可以看成一个数据文件里面的数据,如DWG、DXF文件等。
3 结束
学到这里大体明白了libreCAD的数据组织情况。下一步将继续阅读XX_GraphicView相关类,分析画一个实体的具体实现过程。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容