1. 绘图文档和图形库是统一的 XML 格式
一般图形软件的图库不外乎采用以下几种技术:
一、 程序中自带图库。这适用于特定的专业领域,如果需求发生变化,程序必须改变,目前许多自行开发图形系统的软件公司采用这种技术,一来需求相对固定,二来实现也较为简单,这种技术的缺点在于,以后需求发生变化,程序经常需要修改,将不得不派专门的程序员长期从事这项工作,给用户的感觉很不舒服,几年后,因种种原因,这个程序很可能已经无法使用了。
二、 专门做一个图库设计工具软件,图库有专门的格式。这个已经比前面进了一步,起码用户似乎可以“自定义图库”了。给用户的感觉要好一点。但是这种技术的缺点在于,图库中的图形都是所谓的“组合图形”,是死的,只能做一些简单的状态变化。而象曲线图、饼图、棒图、仪器仪表等图形就无法实现了。
三、 插件技术。这个就更进一步,目前在许多工业组态软件的图形系统中采用。为了实现上述各种复杂的组合图形,干脆用外部程序辅助实现,有的是自己定义接口方式,好一点的采用 ActiveX 标准接口。这种技术的缺点在于,你常常需要很多外部插件,如果厂家没有提供某个图形,你就必须请厂家帮忙解决,或者利用厂家提供的接口开发规范用 C++ 等语言编写插件。可想而知,这种技术几乎无法应用于互联网。而且用户受限于自己的开发水平、只能在厂家提供的技术框框里面转游,无法真正自由地创造他想要的而别人没有的东西。此外,如果厂家采用所谓标准的 ActiveX 技术的话,还有一个先天性致命缺陷,那就是,这种外部插件无法自由旋转,无法和其他图形协调存在,另外还有缩放、打印方面的难题,即使厂家解决了这些问题,拼凑的痕迹严重。图形根本谈不上流畅自如。
四、 文档格式。许多厂家的图形文档采用自行规定的二进制格式,这种格式的文档读取速度较快,但是安全性、可维护性很差。笔者十年前曾经用过外国的一个多媒体软件叫做“ Action! ”,它产生的文件有百兆之多,在经常性的修改中,突然有天电脑停电了,恢复正常打开电脑后,文件却无法读取了,因为是二进制格式,你不知道哪里出了问题,找备份吧,可是这几天的工作都白干了。自从有了 XML 文档格式,采用它存储数据就成为最佳的选择方案,你用其他 XML 阅读软件就可以轻松编辑这种文档。
五、 Visual Graph 采用图形文档和图库文档统一的 XML 格式,你可以任意自由地 画图,任意设计属性、函数、事件,这样相当于给图形赋予了生命,设计好的图形文件马上就可以被当作图库来使用,这样通过多层嵌套,就可以设计非常复杂的图形出来,这样紧凑的结构、巧妙的设计,也只有 Visual Graph 才有。
2. 一个文档包括多个页面图形
你可以在一个文档内包含多个画面,而当这个文档被用作图库的时候,每个画面又被当作一个个图元来使用了。象变魔术似的,整个系统形成完备的整体。
3. 页面支持多图层,图层可以隐藏或锁定
画很大的图时,有可能需要建立多个图层,例如地理图上的道路、电力设施、水管、商店、政府部门等可以分别设定在不同的图层上,图层其实也是页面的一种特殊表现。
4. 基本图形只有三种(文字、形状、线条),却可以制作种类繁多的元件
一切复杂的图形元件都来自于这三类图形,基础图形越少,整个系统的架构越灵活可靠。反观许多其他图形软件,把什么图片、圆弧、各种专用图符等放在系统内部,当作不同的类别实现,这样源代码上增大了不少,结构却很松散,有些图形系统宣称几十万行源代码,似乎东西不少,其实,源代码越多,说明结构越是松散。 Visual Graph 的源代码只有区区六万多行,功能却远远超越其他软件,结构紧凑是一大特点。
5. 可以进入元件内部编辑其细节
需要专门的图库编辑软件麽?不需要,只要在 Visual Graph 集成环境中,就可以随时进入图元的内部进行修改。
6. 线条编辑,允许插点,删点,画曲线,直线
在线条上插入顶点,按住 Ctrl 键和鼠标左键即可。删除顶点,也是这种操作。线条的每个顶点除了有 x 和 y 两个坐标值以外,还有一个顶点属性值,用来描述这个顶点的画法以及其他属性。通过简单改变顶点的属性,一条折线可以变成曲线,可以变成两段不相连接的折线,还可以变成封闭的多边形等。
7. 直接在画面上编辑文字,文字自由旋转,光标也能旋转
许多软件没有做到这么细致的程度,它在编辑文字的时候,给一个输入框,编辑完成就画到画面上。这种方式给人的感觉不够流畅。 Visual Graph 为了让用户感觉自然,特意开发了这种文字编辑方式,即使文字单元有旋转,编辑方式丝毫不变,甚至光标也会跟着旋转。这样精细的设计,来自于对产品精益求精的态度,以及对用户的关怀,也有益于提升产品的竞争力。
8. 无数次的 Undo 和 Redo
在这方面,现在许多软件也能做到无数级别的撤销操作和恢复操作,但是象 Visual Graph 这样能够对绝大多数操作进行撤销和恢复的很少。而且软件对内存进行了精确的计算,会根据内存状况采用一定的调度策略,否则,如果真的允许无数次 Undo 和 Redo ,再大的内存、再大的硬盘也受不了啊。许多方面,尽管用户可能很少用到,但都严格地保证了安全,边界条件得到了有效的控制。
9. 浮点坐标,图形精细编辑
如果你发现某个图形系统采用整数坐标,那么这个系统的图形放大到一定程度肯定失真。图形也无法做到宣称的精确旋转,因为旋转后,图形一定错位了。 Visual Graph 图形系统可以编辑象花鸟这样精细的矢量图。
10. 内置专门的 Visual Graph 图形语言
支撑构建如此强大图库系统的是 Visual Graph 专用图形脚本语言,这种专门为图形系统设计的语言结构如此简单,语法只有简单的几条,变量也不需要定义,直接任意赋值。比起其他流行的编程语言,更加简洁明快,更加高效。
11. 每个图形定义背景图片,图片可以透明、缩放
如果考虑到图片文件、图片的填充方式、图片是否透明,似乎涉及图片的属性就有最少三个, Visual Graph 巧妙地把图片跟网纹结合在一起,只增加了一个图片文件属性,就解决了所有这些有关图片的问题。在其他许多方面,也采用这样的策略,使得现有的属性数目较少,而利用率却非常高,方便用户灵活配置、记忆与编程。
12. 和许多绘图软件图形互相拷贝粘贴,可以编辑 EMF 格式的图形
EMF 是各种矢量图形软件相互交换格式的一种标准图形格式,象 Word 、 Visio 、 Autocad 、 Coreldraw 等都支持 EMF 格式的存取。 Visual Graph 可以把这些软件的图形拷贝后粘贴进来进行编辑,也可以把图形拷贝到这些软件中去进行编辑(特殊粘贴)。有用户曾提出意见,为啥某软件的图形能够拷贝到 Visual Graph 中进行编辑,而 Visual Graph 的图形拷贝后到它那里却不能编辑呢?是不是格式有问题?但这恰恰说明 Visual Graph 软件的兼容性更好、更规范些。
13. 文档打印纸可以自由设定大小和缩放比例
打印无级缩放,多大的图形都可以放在一张纸上打印,而打印效果直观地显示在画面上,只要切换显示打印纸,就可以清楚看到打印纸的位置,你可以用鼠标改变它的位置和大小。打印纸越小,相对来讲打印出来的图形就越大,反之,打印纸越大,打印出来的图形就越小,而所包括的图形也更多。不需要模拟显示,如果需要,也可以自己做一个模拟显示界面出来。
14. 打印和设备无关
画面打印情况只与打印纸、图形的相对位置有关,与设备无关。所有页面公用同一张打印纸。
15. 文档可以设置背景图形或者各类网纹
巧妙配合各种 网纹效果,可以实现图形的平铺、居中、缩放等,所有页面公用同一个背景。
16. 支持图形分组
允许建立若干个图形数组,这些数组被保存进文件,这样可以方便地对图形进行分组管理和编程。例如,在一幅地图上,把所有房子建立一个数组,把所有公用设施按照类别分别建立一个数组等。
17. 多种连接线,十分灵活,可以建立图形间的拓扑关系,自由添加连接点
有直线连接线,曲线连接线,平直连接线。图元内部可以自由设置任意个数的连接点,图形的连接点数目以及每个连接点关联的图形、连接点的位置都可以用程序访问,也可以用程序设置两个图形相连接。可以编写图形拓扑分析程序,例如计算两点之间有哪些图形存在,计算最短路径等等。
18. 多种箭头风格,并可以任意自定义箭头
内置多种箭头风格,满足大多数时候的需要,如果箭头不够,可以选择自定义箭头,自定义箭头可以自行设计。实际上,自定义箭头库也是图形文件,也可以在 Visual Graph 中进行编辑。某些图形软件光是在箭头的处理上就提供了很多个属性,这样的设计我们认为喧宾夺主,而且即使如此也无法实现所谓的“任意”箭头。 Visual Graph 的设计思想是常用的箭头内定,不常用的箭头就干脆“任意”自定义算了。这样既简化了系统,节约了存储,突出了重点,也满足了对灵活性的要求。
19. 自定义线型
线条有多种表现形式,可以修改每种线型的具体形状。
20. 自定义网纹
系统内定的基础网纹多达 70 种,还有透明网纹、过度填充网纹、图片填充网纹等,能够满足绝大多数需要,网纹可以自定义样式。
21. 支持多种网格类型定位,但优先连接关系定位
图形的定位方面,离不开网格,在以前的旧版本,网格大小并没有保存进文件,只是一个公共值,下次载入文件后,万一网格大小不一致,就无法象上次那样方便地工作了,所以,“记忆上次的方便环境”成为新版本的一个特点。相比而言,网格定位还不如连接关系定位更重要,所以,如果图形在某处有连接点,很可能优先把连接点放置在网格上。这也是为了更方便地绘图。
22. 支持文字和其他图形两种对齐方案
文字是不允许用鼠标拖动重叠的,我们认为文字重叠就互相看不清楚了,所以就尽量防止这种状况的发生。所以操作若干文字单元左对齐就不会出现象其他图形那样堆叠的情况,而出现一种类似表格操作的形式。
23. 支持任意角度自由旋转,旋转中不改变图形其它逻辑
在许多图形软件中,所谓的图形旋转只是一种“半旋转”,也就是说,某些图形可以旋转,某些图形无法旋转,某些图形只能旋转 90 度、 180 度。而 Visual Graph 做到了彻底的无条件旋转,不管任何图形元件,都可以任意角度自由旋转。更重要的是,在旋转后,图形的逻辑关系不变,运算程序能够一如既往正常运行。例如棒图、饼图、曲线图、甚至页面上所有图形一起都可以随意旋转而正常工作。
24. 过渡填充、图片、箭头、文字标注、文字光标自动旋转
许多软件的图形旋转总会有这样那样的“穿帮”情况出现,例如旋转后,过渡填充却不旋转;图片旋转后,还是在水平垂直方向上方方正正的;以及文字只能在显示时候旋转等等。而 Visual Graph 把这些做得很透,让用户无法挑剔。
25. 基本图形、图形元件均可以自定义多个文字标注
普通的矩形、椭圆等形状可以添加一个文字标注,折线的每一条线上都可以添加一个文字标注,图形元件可以定义哪些文字单元是标注。在折线上的标注文字根据其对齐方式的不同,在线上有不同的位置,随着折线的变化,标注文字也随之移动。图形元件上的标注文字可以直接编辑,不用进入封装好的元件内部。
26. 自定义多类型存储属性(整数、小数、逻辑、字符串)
当程序员想给图形添加一些特定的数据时,可以给这个图形随便增加自定义属性,对自定义属性的读写、存储等操作和对固有属性没有区别。
27. 自定义任何属性,类似流行编程语言中 " 属性 " 的概念
这是技术上的又一个创举,把一些编程语言( Delphi 、 C# 等)的“属性”概念引入到 Visual Graph 中,从而使得系统变成了一种似乎无所不能的图形编程语言。你只需要简单地修改一个属性的值,就可以驱动图形做任何复杂的变化。注意,这里说的“任何”的内涵比一般图形软件宣称的要大得多。许多情况下,不是系统无法实现某种技术,而是程序员能否想到如何更方便的问题。
28. 自定义函数(私有、公有函数)
既然有脚本,就离不开自定义函数,函数按照作用域的不同,分为私有函数、公有函数、引出函数三种,如果一个函数只想被内部的其他图形访问,可以使用私有函数,如果允许外部图形访问,可以使用公有函数,如果这是一个触发事件,则可以使用引出函数。这些非常符合一般面向对象编程语言的习惯。函数与过程的区别仅在于是否在 return 后面有返回值。函数参数没有显式的类型,会根据调用者的参数决定。这样设计的结果,使得脚本在形式上更加简洁。
29. 众多的图形操作事件,例如鼠标点击、移动、图形缩放、创建、删除
每个图形都有自己的事件,例如,在运行状态下,当鼠标单击时,会优先执行最上面那个图形的鼠标单击事件中的脚本程序。图形创建时、删除时、绘制后、鼠标移入移出等都有相应的脚本事件。如果程序员只想把 Visual Graph 当作一般控件使用,也可以利用控件本身的众多事件。这两套事件体系是不一样的,每个图形都有自己的事件,这些事件是 Visual Graph 内部规定的,而 ActiveX 的事件是图形控件整体的事件,遵循国际标准接口。
30. 通过对象的名字,访问它的属性和函数
真正面向对象的矢量图形处理系统,对象的名字支持中文。
31. 无级别缩放,比例巨大,局部放大,整页、宽度缩放
图形最大放大到 100 倍,最小缩小到 1/10 ,由于采用浮点数,放大很多倍后,可以精确编辑图形。整页、宽度缩放主要应用于报表场合,当画面上显示打印纸的时候,就会看到它的作用了。当图形缩放的时候,字体会缩放,但是线条的宽度可以设定是否缩放(环境设置),有的时候,放大以后要对细节进行编辑,应该设定线条宽度禁止缩放,而打印的时候,则应该使用线条宽度缩放选项。有一种线宽( 0 )被设置成无论如何缩放,都只是一条细线,这用来描述某些轮廓。
32. 图形可以设定是否打印
打印区域内的某些图形可能仅为了显示只用,并不想打印出来,则可以修改这个属性。
33. 整体或局部图形导出 BMP 、 EMF 格式图片
常常会有这样的需求,选择一部分图形,允许把这部分图形生成图片。
34. 支持读取互联网服务器图形文件
直接读取互联网上的图形文件,无需下载。
35. 支持图形从内存或数据库读写
由于整个 Visual Graph 文件是 XML 文档格式,程序员可以把文件存放在数据库中,进行读写。
36. 支持移动图形到屏幕中间,滚动屏幕,手抓屏幕滚动
有一些有关屏幕操作的函数,帮助程序员更好地控制画面显示的内容。
37. 用程序或者脚本绘图
这也是基本功能,可以用脚本或者其他程序动态生成各种图形、页面、单元组,甚至图形之间的连接关系。
38. 支持标尺,自形设计标尺
Visual Graph 的坐标体系是逻辑坐标体系,默认的标尺上面显示的也是逻辑坐标值,也就是屏幕象素的坐标,如果用户的系统要求使用不同的坐标系,可以自行换算,主要是改用自己的标尺就可以了。关于如何制作自己的标尺,也提供源代码作参考。系统提供了两种坐标系,一种是以左下角为原点的,另一种是以左上角为原点的。
39. 图形锁定和解锁,按住 ALT 键可以操作加锁的图形
图形基本功能,锁定后的图形,不能简单地用鼠标选中和编辑。
40. 支持自定义提示窗口
每个图形(包括页面)都有一个 Hint (提示)属性,设置这个值,当鼠标在图形上面停留一会,在鼠标附近就会出现一个小窗口显示这个字符串,每个图形文件都内置一个提示信息窗口 HintWindow ,用户可以对此进行编程,例如在 HintWindow 上面画图。
41. 元件自定义连接点
元件可以添加任意多个连接点,如果元件中放了一条连接线,则这条连接线上的所有点都可以被连接。例如,在电力系统中广泛使用的母线就可以采用这种技术实现。
42. 元件自定义调控点
在元件设计时,可以放置任意多个控制点,将来这些控制点将允许用户鼠标拖动操作,当鼠标拖动操作的时候,会执行 OnNodeChange 事件,在元件内写好这个事件的脚本程序,元件就可以按照你的意愿变化形状了。如果一个元件定义了两个以上的调控点,并且这些调控点又同时是连接点时,这个元件将来不会出现选择框。
43. 支持各种仪器仪表、刀闸、开关、信号灯开发
给这些设备图形添加自定义属性,仪器仪表可以添加最小值、最大值、当前指针值等属性,改变这些属性,仪器仪表就会发生变化(例如指针旋转)。刀闸、开关可以添加开关属性,改变这个属性,开关的样式也发生相应的变化。信号灯可以添加当前状态属性,允许根据属性不同,信号灯的状态发生变化。这些在其他图形软件里面非得使用插件才能实现的功能,在 Visual Graph 看来,却是如此简单。
44. 支持各种按钮的开发
由于图形有鼠标左键按下和放开的事件,只要在鼠标按下的事件里让图形产生一个变化,在鼠标放开时恢复这个变化就可以了。
45. 支持曲线图、棒图、饼图开发
这些东西稍微复杂一点,系统自带了好几个这方面的例子或者图库,可以参照使用,自行修改。不管图形多么复杂,都不需要插件。
46. 支持报表开发,表格高度智能,移线、合并、插入或删除表格行列,多种表格边框
这是 Visual Graph 又一独创技术,其实矢量图形系统应该包括表格,表格不也是图形么?可奇怪的是,几乎没有一个图形软件拥有制作表格的功能。什么是表格? Visual Graph 对表格的概念有一个大胆的突破,所谓表格,无非是若干文字单元拼凑而成的一组图形而已。可以移动里面的线条、划线分割、合并、插入或者删除表格行列,整体修改一部分表格的边框等等,这些操作由系统内部通过一定的智能规则判断实现。用这种简单的方式, Visual Graph 实现了表格功能,其中的任何一个文字单元都是独立的个体,这样,对于程序访问非常有利。对于中国式表格来说,常常没有行列的概念, Visual Graph 正好能够做好这些表。当然,做好一个报表系统不是那么容易的事情, Visual Graph 有以下的策略解决这些难题。
一、 对于固定格式表格,这就不用多说了。
二、 对于变动表格,需要设计专门的报表模版来生成。
三、 对于报表中的数据,要利用自己编程语言的数据库功能,采用一定的技术,实际上就是把数据填写到这些表格中去。这方面也提供了不少的例子了。
四、 对于报表中混排图形的情形,本系统可以说是最好的选择了。
最重要的一点是,如果熟练掌握了 Visual Graph ,你就不需要再采用其他的报表控件,尤其是在互联网上使用时,与图形界面部分浑然自成一体,非常节省资源。
47. 允许混合编程,互相调用,不仅您的程序可以操控 VG 的一切技术,而且 VG 的脚本可以调用执行您的任何程序
在 Visual Graph 中出现的任何图形、任何属性、任何函数都是可以在自己程序中访问的,但前提是,这些东西必须在集成环境下能够访问才行。例如,元件内部的私有函数,是无法访问的。
另外, Visual Graph 可以访问程序员自己语言中的函数,这可是一个非常特殊而且重要的功能,因为现有的脚本语言不可能穷尽所有的功能,事实上,它是一种非常简单的语言,所含功能性的函数很少,因此,在某些情况下,你可能需要扩充这种脚本语言的功能。例如日期访问、数据库访问等等。虽然不是必需的,但为用户考虑得很周到,使你不用担心将来功能不够怎么办的问题。
48. 支持扩充功能函数
Visual Graph 可以调用外部函数库中的函数,例如 Windows API 函数等,给程序员提供了另外一个自由的机会。
49. 可以制作对话盒、子窗口、弹出式窗口、菜单等窗口元素。
在很多情况下,用 Visual Graph 做这些窗口元素比起用编译语言做有更多的优势,因为它不是编译语言做死的,而是外置的,易于维护修改的,这样,以后可以轻而易举地变换软件的功能。只要制作好足够多的图形基础控件,甚至能做应用软件开发。
50. 图元的链接和嵌入
如果图上有大量相同的图形(比如很多刀闸),图形采取嵌入方式比较好,这样能够大大减少文件的体积,更快地载入文件。图库改变后,下次载入图形文件也相应会反映这种改变。
51. 提供图形的全部 COM 接口
COM 接口能够方便程序的编写,接口属性和函数在基本形态上和 Visual Graph 内部的脚本语言完全一致,这样有利于学习和记忆。只可能因所用编程语言的不同,而有些形式上的改变,例如在 VC 中,没有属性这个概念,所有的属性都被变成 Get 和 Set 函数了。
52. 可以设定图形的透明度
每个图形或者元件均可以设置透明度,不管它们如何动作,均有非常完美的表现。
53. 可以修改为数众多的系统参数
系统字体、颜色、光标形状、箭头、线型、网纹等许多重要参数均可以改变(注意不是属性的改变,而是常量的改变),改变系统参数后,对所有图形均起作用。
54. 根据自己的需要选择合适的图形显示驱动程序
通过设置,可以使用不同的图形显示驱动程序,在速度或者精度等方面达到最佳平衡。
55. 包括一个功能非常齐全的属性列表控件,这样对于图形程序的开发就更方便了。
只通过一条简单的命令,就可以把图形和属性列表控件联系起来,在属性列表控件中对图形进行全方位的编辑。这个属性列表控件也是一个图形文件,用户熟练以后可自行编辑修改。
56. 支持界面设计、插件等。
可以自由开发诸如菜单、工具栏、按钮、列表框、下拉框、检查框等 windows 界面元素。支持 Visual Graph 插件开发。
57. 非常适合应用于互联网。
软件发布包特别小(压缩以后只有 300k 左右),功能特别全,非常适合应用于互联网软件开发。