国外大佬,曾经写过两个关于DrawTools相关的开源绘图软件。
我更新了一个优化的版本如下图,稍后会发布更新给大家。 需要的用户可发邮件给我 448283544@qq.com
应用于AGV地图编辑器如下:
那么这个优于很多普通的画布软件,包含点、多种线、矩形、椭圆基本图像,贝塞尔曲线。缩放,Redo,undo等等,那么也能自定义图像和自定义可以拖拽到画布的新的业务实体。
后面我将添加标尺和图像之间吸附, 功能将变得更加强大,与我们使用到的AutoCad类似!
应用于地图编辑器如下, 类似openTCS的C#实现:
Mark Miller
- Download updated demo - 55.57 KB
- Download (VS 2010) updated source - 889.43 KB
DrawTools 2014
Arnault Bonafos, 16 Jan 2014
- Download source - 85 KB
- Download binaries - 37.9 KB
Architecture
Dynamic handling for showing scroll bars
A dirty boolean is handled in GraphicsList
, the canvas document, where it should be. To this Dirty
property is associated a DocumentDirtyObserver
interface.
Hide Copy Code
public interface DocumentDirtyObserver { void IsDirty(GraphicsList gList); }
Every time the document is modified, look with the different draw tools, its Dirty
property is set to true
and any DocumentDirtyObserver
is fired.
Hide Copy Code
public bool Dirty { get { return this.dirty; } set { this.dirty = value; if (this.dirty) { NotifyDirty(); } } }
The class DrawArea
implements the DocumentDirtyObserver
, and every time the document is 'dirty
', it calls AdjustRendering
, which in turn computes the bounding box of the canvas document (GraphicsList
).
Hide Copy Code
void AdjustRendering() { Size docSize; if (this.GraphicsList != null) { docSize = this.GraphicsList.GetSize(); docSize.Width += 20; docSize.Height += 20; AutoScrollMinSize = docSize; } else { AutoScrollMinSize = new Size(0, 0); } Invalidate(); }
This way, it implements the Mode/View/Controller design pattern, the GraphicsList
being the model, DrawArea
being the View and the draw Tools
being the controller.
In the future, Dirty
property should be handled in only one place (it is also handled in the DrawArea
class).
Export the graph to JPEG format
The DrawTools 2014 architecture is good enough to be followed to implement a new menu strip option.
-
Add a menu item to the menu bar
Simply open the MainForm designer and add the option
-
Link the
MenuItem
to aMainForm
method to trigger theCommandExportToJpg
Hide Copy Code
private void CommandExportToJpg() { docManager.ExportToJpg(); }
- Implement the user interface logic in the
DocManager ExportToJpg
I let you look at the
DocManager.ExportToJpg
- Subscribe
MainForm ExportEvent
method implementation toDocManager
event.
Hide Copy Code
docManager.ExportEvent += docManager_ExportEvent;
- Implement
MainForm
logic to actually transform image bitmap into JPEG file.All is in the source code, I don't copy it here as it is essentially technical stuff.