网络图实用工具






4.52/5 (10投票s)
一个简单的前端,用于管理基于类似 Visio 的形状连接器的网络图。
引言
一个图形化的前端来管理网络图,这对于许多目的都非常有用,例如编写模拟软件或仅仅是组织收集到的数据(例如,通过网络扫描器)。在这个简单的程序中,我们将看到一种实现具有这些基本功能的图形化前端的简单方法。
- 形状拖放
- 移动连接器(也定义为粘合线)
- 从/向文本文件加载和保存配置
……无需任何 Office 库,因此即使您没有安装 Visio 或 PowerPoint 也可以使用它。
通用实现
该软件有一个主库,即 GScenario.cs,它实现了所有绘制对象的内存表示。形式上,这是一个类,其中有一个指向当前对象的指针 (CurrObjIndx
) 和一个对象数组,如下所示:
public class GObject
public string Name;
public string Type;
public int x1;
public int y1;
public string Lnk1;
public int x2;
public int y2;
public string Lnk2;
这些属性是:对象的(假定唯一)名称(例如,“Router_0”)、其类型(每种类型都有不同的图标)、包含窗口的边界以及连接线。这些参数仅对线对象有意义,并且有助于实现粘合线,并指示线对象的哪个端点已连接。对象类型的图标存储在 ImageList
对象中。主窗体中的以下函数获取每种类型的正确图像:
private Image FindGObjectTypeImage(string ObjType)
所有 GDI 函数都在主窗体类中管理,而相应的图形信息由 GScenario
类,或者更确切地说,由其实例 Gnetwork
进行分配、修改等。需要注意的一个重要事实是,在对象修改了窗体的外观(例如 Paint
事件)之后,必须使用内存数组(GNetwork
)中的信息重新绘制图表。
拖放功能
对于形状(矩形对象)和线条这两种不同情况,可以轻松说明拖放。第一种情况很简单,因为第二种情况还必须实现“粘合线”效果。为了管理形状的拖放情况,我们使用主窗体对象的以下事件:
MouseDown
MouseUp
如果单击点位于与该对象相关的矩形内,MouseDown
事件可以指示对象拖动的开始。进入拖动模式时,光标会变成一个小手形状。MouseUp
表示鼠标按钮的释放,我们假设这对应于拖动的结束,前提是经过了显著(在此我们选择 300 毫秒)的时间间隔:这是为了避免将双击误认为是拖放。当发生鼠标释放时,我们只需将先前找到的对象中心移动到鼠标释放事件的坐标(即 e.X
和 e.Y
,其中 e
是相应的 MouseEventArgs
变量)。如果被拖动的对象是线条,主要区别在于,如果鼠标释放点落在矩形对象内,则该线条必须与其中心连接。特别是,最接近鼠标按下点的线条的终端点必须连接到容器对象的中心,如下图所示:
加载和保存
这没什么好解释的:只需使用 GScenario
的这些方法即可。
public bool LoadFile(string FileFullPath, ref string sErrFileMsg)
public bool SaveFile(string FileFullPath, ref string sErrFileMsg)
GNetwork
对象被加载/翻译到如下的文本文件中:
object=Emitter_0;
type=Emitter;
x1=116;
y1=119;
lnk1=;
x2=196;
y2=199;
lnk2=;
end object.
object=Receiver_0;
type=Receiver;
x1=674;
y1=145;
lnk1=;
x2=754;
y2=225;
lnk2=;
end object.
…
我们使用 System.IO
命名空间的基本功能,并且每一行都具有以下形式:
[variable_name]=[variable_value];
进一步的考量
一个恰当的简单函数从每“行字符串”中提取(变量,值)对(例如:x1=116;-> 变量=x1;值=116)并将其保存到内存或磁盘。本示例是针对 TCP 网络开发的:因此,所管理的 are 客户端(TCP 流发射器)、服务器(接收器)等。然而,显然其有效性是通用的,并且可以用于所有类型的层级依赖网络,例如在物流、生产计划等领域…(在这种情况下,节点是仓库)。此程序在计算对象方面不执行任何操作;它们仅包含图形元素,并且要在特定上下文中进行使用,必须进行情境化,例如,在 GObject
类中添加有关谁在进行计算的信息(即带宽、容量等)。此程序非常简单,因此粘合线管理是基础的:例如,使连接模式更类似于 Visio/PowerPoint 的模式会很有趣,即实现与形状的终端点的连接(而不仅仅是中心),或者仅通过垂直线进行连接。总之,重要的是要说程序工作(计算中心、评估单击是否包含在内…)不是通过实际图像对象,而是通过容器矩形。因此,如果您选择这样的图像:
如果一切(几乎)顺利,并且图像区域远小于矩形区域,并且不居中……您必须实现一种更有效的方式来管理对象,或者您必须选择不同的图像。
历史
- 首次发布 - 1.0 [2008/01/28]