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 分享
No matter when you start, it is important not to stop after the start.
无论你在什么时候开始,重要的是开始之后就不要停止
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容