1.OpenS-CAD是一个不错的小巧的开源程序,以图层方式组织图形,可以绘制基本的线段、弧段、圆,可以进行节点对象捕捉,可以选择几何对象、对图幅进行平移、放大、缩小。可以将结果序列化保存为xml格式。其中的图形数据绘制组织方式和局部刷新知识点值得学习。

http://www.codeproject.com/Articles/22549/OpenS-CAD-a-simple-2D-CAD-application

2.基本架构

  多文档/视图结构。

  将活动的DocumentForm的菜单作为主窗体的菜单。

3.绘制的一点分析

  将绘制成功的对象加入集合,在OnPaint中统一进行绘制(绘制在位图上),新增加对象m_newObject等临时对象绘制在控件上。编辑的过程中通过局部刷新技术减少闪烁,主要是在是MouseMove事件中。移动、选择、绘制、编辑、漫游等命令类型在三个鼠标事件中用于区别不同的操作对应不同的代码。

  绘制线段:MouseDown后,如果新建对象m_newObject为null,构造线段;再次单击m_newObject!=null,添加到m_data中。同时初始化新的m_newObject,线段是两点相同的线段。

程序入口:


OpenS-CAD学习(1)_数据OpenS-CAD学习(1)_构造函数_02


1 public MainWin()
2 {
3 UnitPoint p = HitUtil.CenterPointFrom3Points(new UnitPoint(0,2), new UnitPoint(1.4142136f, 1.4142136f), new UnitPoint(2,0));
4
5 InitializeComponent();
6 Text = Program.AppName;
7 string[] args = Environment.GetCommandLineArgs();
8 if (args.Length == 2) // assume it points to a file
9 OpenDocument(args[1]);
10 else
11 OpenDocument(string.Empty);
12
13 m_menuItems = new MenuItemManager(this);
14 m_menuItems.SetupStripPanels();
15 SetupToolbars();
16
17 Application.Idle += new EventHandler(OnIdle);
18 }

MainWin构造函数

文档窗体:DocumentForm

文档窗体中的绘图画布:CanvasCtrl m_canvas;        存储绘制图形数据的集合:DataModel m_data;