libreCAD源码阅读笔记3

libreCAD源码阅读笔记3

1 前言

打开RS_Document源码后,又出现了RS_EntityContainer、RS_Entity等一系列类,这好像就是libreCAD的数据模型,有具体的实体类,也有实体类所关联的数据。

2 相关类

2.1 RS_EntityContainer类

RS_EntityContainer类是一个Composite模式的类,主要是各种点、线、面等具体要素的集合。
RS_EntityContainer
RS_EntityContainer

2.2 RS_Entity类

RS_Entity是点、线、弧线等绘制对象的基类,属性有该绘制对象所属的对象容器、图层;对象的最小外包矩形;绘制自己时用的RS_Pen;对象ID等内容。对象的draw函数为纯虚函数,子类需要实现该类实现绘制自身的功能,该函数接受RS_Painter、RS_GrahpicView作为绘制环境和绘制窗体。
RS_Entity

2.2.1 RS_Entity子类示例:RS_Point

UML图
不论是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文件等。
RS_Document

3 结束

学到这里大体明白了libreCAD的数据组织情况。下一步将继续阅读XX_GraphicView相关类,分析画一个实体的具体实现过程。

© 版权声明
THE END
喜欢就支持一下吧
点赞777 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容