首页 / 资讯中心 / 文章详情

Visio 2010 UML绘图:模板模具、ShapeSheet与VBA导出避坑

Visio 2010 UML绘图:模板模具、ShapeSheet与VBA导出避坑 ★ FEATURED ARTICLE
简介Visio 2010 是微软推出的专业绘图软件面向需要绘制流程图、组织结构图、网络拓扑及 UML 模型的办公人员、项目管理者与软件开发者即使缺乏设计基础也能借助模板和拖放式操作完成较规范的图表。这份压缩包共 5 个文件以 txt 说明文档、exe 查看器程序、htm 页面和 url 链接为主整体约 16.54MB体量轻便便于快速获取和留存。包内提供查看器主程序、安装与使用说明、产品激活信息以及在线帮助入口读者可据此了解软件功能、打开现有 Visio 文件并参考说明完成基础配置与上手操作。对于需要了解 UML 类图、用例图、序列图或状态图的开发者也能借助该工具的可视化环境梳理系统架构、提升团队沟通效率。资源已有 1807 人学习下载适合需要低成本查阅 Visio 图表、补充绘图工具说明或临时查看 Visio 文件的用户参考。1. Visio 2010 值得装的理由一张图改三次还不崩先给个具体场景需求评审前一晚产品要一张说得清状态流转的流程图开发要一张能和代码对上号的类图你手上只有 Word 和一堆聊天截图。这时候去搜 Visio UML 流程图 的人要的通常不是“好看”而是“改得动”——三个月后加一个状态、删一个类图还能在五分钟内改完而不是重画。Visio 2010 的价值就在这里模板、模具、形状表三层结构把一张图从“一次性图片”变成可以批量修改、可以校验、可以按参数导出的工程文件。它适合写设计文档的后端、做流程梳理的实施、要交图的课程团队不适合只想贴个框图到聊天框里的人那种需求任何在线白板都比它快。下面按“先把结构建对 → 再落笔 → 再导出 → 最后看翻车点”的顺序走。2. 模板、模具、形状表三层结构决定你改图的速度装完打开就直接拖框的人八成会在第三次改图时返工。原因不在手速在于没分清这三层各自的职责模板管“这张图纸的规矩”模具管“形状从哪来”形状表管“每个框里的信息怎么被复用”。分清了后面加页、加图、批量改名都是分钟级的事分不清就是无穷无尽的手点。2.1 四层对象各管什么什么时候该动哪一层层级典型文件/位置管什么什么时候动它模板.vst页面尺寸、方向、图层、样式、挂载的模具团队要统一图纸规范时模具.vss一组母版形状同一类图反复用的同一类图要画十次以上时形状母版实例图纸内部几何、文本、User 单元格单张图要挂业务信息时ShapeSheet右键 → 显示 ShapeSheet形状的公式、锁定、连接行为要批量改、要校验、要导数据时绝大多数人只碰第三层拖形状、双击改字。于是二十个类要改一个命名规则就得手点二十次还得保证不漏。常见做法是把规范沉到第一、二层让第三层只负责“填内容”。我一般会先花二十分钟做一套自己的模具后面每张图都从这套模具开始画。模板和模具的区别值得多说一句模板是“整张图纸的初始化状态”你打开它就有固定的页面大小、固定的图层列表、固定的形状窗口模具只是一盒形状挂在哪个模板上都能用。所以规范类的东西比如“评审层必须锁定”“标注层不打印”放模板形状库放模具两者分开维护改一个不影响另一个。2.2 自制一套 UML 模具一次投入后面每次省一小时工具自带的那套 UML 形状和早期版本不完全一样很多老教程里讲的“模型资源管理器”那套联动我打开时并没有找到同一套东西。所以更稳的路线是手动构建只用基本形状和线条把语义做进形状表这样任何版本的 Visio 都能打开也不会因为模板差异丢形状。步骤如下全程十分钟量级。新建空白绘图页面设 A4 横向、缩放 100%。空白图比自带模板干净不会被塞一堆用不到的图层。用矩形画类框本体再用线条工具按住 Shift 拉两条水平分割线位置分别落在高度的 1/3 和 2/3。分割线要放在矩形内部不要贴边。全选三件矩形加两条线后组合右键 → 显示 ShapeSheet在 User-defined Cells 段右键插入行建User.ClassName和User.Members两个单元格。这一步是把“类名”和“成员列表”变成形状的属性而不是正文。打开形状窗口更多形状 → 我的形状在窗口空白处右键 → 新建模具命名成比如“UML-类图”。把刚才的组合从图纸拖到这个模具上母版就生成了。右键母版 → 编辑母版形状把文字块的默认内容改成“ClassName\n---\n method()”并设置字体、字号、文本边距。以后拖出来的每个实例都自带这套初始文本。保存模具为 .vss放进“我的形状”目录再按第 2.4 节配好图层把模具挂到模板上另存为 .vst。图层这一步别省。我一般固定三层图形可编辑、标注颜色浅、字号小、评审红色批注打印时关掉。图层属性里能勾选“锁定”和“打印”把评审层设成不打印导出 PDF 时就不会把红色的大叉带给客户。2.3 用 ShapeSheet 把类名写进 User 单元格靠公式而不是手打类图最容易失控的地方是“名字和内容分家”框里手打一遍类名图例里再打一遍文档里再打一遍改一次漏两处。把类名沉到User.ClassName正文用公式引它就只剩一处真源。下面这段 VBA 做的是遍历当前页所有形状凡是有User.ClassName的把类名和成员拼成正文写回 Text 单元格。Sub SyncClassText() Dim shp As Visio.Shape Dim clsName As String, members As String For Each shp In ActivePage.Shapes 只处理存在 User.ClassName 的形状第二个参数 0 表示不查继承来的单元格 If shp.CellExistsU(User.ClassName, 0) 0 Then clsName shp.CellsU(User.ClassName).ResultStrU() members shp.CellsU(User.Members).ResultStrU() FormulaU 赋值需要带引号Chr(10) 是换行保证类名和成员分行 shp.CellsU(Text).FormulaU clsName Chr(10) members End If Next shp End Sub逻辑不复杂但三个地方容易写错。CellExistsU的第二个参数传 0 是只查本地单元格传 1 会连继承链一起查母版实例上得到的结果不一样我自己踩过一次表现是“有的框同步了有的没同步”。ResultStrU()里的空串表示不指定单位字符串单元格要这么取直接Result会拿到数值型结果。FormulaU不是ResultU赋值时必须把内容包成公式字符串引号要用两个双引号转义这一步错了会直接抛类型错误。配套的单元格约定建议固定下来团队里谁看都懂单元格含义示例值User.ClassName类名唯一真源OrderServiceUser.Members成员列表换行分隔 create(): voidUser.Stereotype构造型标注serviceFillForegnd填充色按模块区分RGB(232,240,254)LockTextEdit锁定正文防止有人手改1把LockTextEdit设成 1 之后正文只能靠脚本刷图上就不会出现“脚本改了一半、手工改了一半”的混合态。代价是临时补一句话不方便所以我的习惯是画图阶段不锁交给别人评审前统一锁一遍。2.4 模板里必须配好的三件事页面尺寸、图层、样式这三样不提前定后面每张图都要重新调。页面尺寸按交付方式定要打印就 A4 横向、边距 1.5cm只出 PDF 就地设成“适应绘图”让 Visio 按内容自动撑开页面。样式指字体和主题中英文混排别用花体字号 910pt连线粗细 1pt箭头用实心三角。这几项统一之后图看起来是一套的而不是拼起来的。3. 落笔顺序类图、流程图与连接线粘附的四个操作关口结构建好接下来是画。画图本身没什么玄学容易出问题的是顺序先摆框再连线还是先定网格再摆框判断分支从哪一边出跨页怎么接。这些细节决定了后面改一次要动几个形状。3.1 先定网格和页面再摆第一个框页面设置打开“网格”间距设 5mm勾选“对齐到网格”。这一步听起来琐碎但它决定了所有形状的坐标都是 5 的倍数后面用脚本按坐标排序、按行对齐才不会出现 0.37mm 这种小数。我一般还会在页面设置里把“打印分页符”关掉出图时少一层干扰线。摆框顺序建议从左到右、从上到下一个模块放完再放下一个模块中途不要插着连。因为连接线一旦粘附到形状上形状移动时线会跟着走如果线先连好再挪框很容易把已经摆整齐的结构打乱成蛛网。3.2 类图三种关系线别用错UML 类图的关系语义靠线型和箭头区分Visio 里没有强约束全靠人自觉所以画完一定要自查一遍。常用的三种关系线型参数如下关系线型箭头/端点常见误用继承/实现实线空心三角指向父类用实心箭头和关联混淆依赖虚线开口箭头指向被依赖方画成实线语义变成关联关联/聚合实线无箭头或空心菱形聚合和组合菱形搞反线的参数在“线条”对话框里设线型选实线/虚线箭头选“空心三角形”或“开口箭头”粗细 1pt起点终点都设成“无”。设置完建议直接存成样式后面新画的线继承同样参数避免一张图里出现 1pt 和 1.5pt 混排。3.3 流程图判断分支从长边出跨页用引用形状流程图最容易看起来乱的地方是判断菱形的出口。约定俗成是/否两个分支从菱形的左右两个顶点出不从上下出因为上下通常留给回流线。分支线上加文字标签标签用文本框贴在线中间不要双击线写字——双击出来的文字是线的正文缩放时会跟着线跑位很容易错位。页面装不下时不要硬缩用“跨页引用”形状从基本流程图形状里拖一个双击它可以跳到目标页也可以当场新建一页并自动加回跳引用。这个形状的好处是改了页码不用手动同步坏处是打印时会多出一块小方框所以我在评审前会把它挪到页面边角或者干脆在交付版本里换成普通文本框写“见第 3 页”。3.4 用 VBA 找出没粘上的连接线“线看起来连着其实没粘”是 Visio 里最典型的隐性故障拖动框线留在原地或者线跟着走但端点飘在框外面。人工一条条点太慢这段脚本一次扫完当前文档所有页。Sub CheckDangling() Dim pg As Visio.Page Dim shp As Visio.Shape Dim badCount As Long For Each pg In ActiveDocument.Pages For Each shp In pg.Shapes OneD 为 True 表示这是一维形状也就是连接线 If shp.OneD True Then Connects.Count 小于 2说明至少有一端没粘到形状上 If shp.Connects.Count 2 Then badCount badCount 1 Debug.Print pg.Name | shp.NameID | 端点未完整粘附 End If End If Next shp Next pg MsgBox 本次共发现 badCount 条未完整粘附的连接线 End Sub判断依据是Connects集合的数量。一条动态连接线正常应该有两个连接记录起点一个、终点一个只有一个或零个就是没粘好。NameID是形状在当前页内的唯一编号配合pg.Name能直接在“绘图资源管理器”里定位到具体哪一条。输出到“立即窗口”比弹窗更实用因为一次可能几十条弹窗只能看到一条就得关掉。脚本跑完回头去看那些被标记的线如果端点是小绿点说明粘在连接点上如果是红点或方块说明粘在形状几何上或根本没粘。修法是选中线拖动端点重新吸附到形状边缘看到端点变成绿色小方块再松手。粘附行为在“视图 → 视觉帮助”里控制把“粘附到连接点”打开、其他粘附项按需关掉能让吸附结果更可预测。4. 导出与交付PDF、PNG 和 .vsd 格式的三个参数面图画完只是半成品交付形态才是别人真正看到的东西。同一张图打印参数不同出来的 PDF 可能差出两层意思要么右边被裁掉一截要么虚线淡成实线。4.1 打印成 PDF 的关键参数参数建议值影响纸张与方向与页面设置一致不一致会强制缩放字变模糊缩放100%或“调整为 1 页宽”选“适应纸张”容易把细线压没页边距1.21.5cm太小会裁到边缘的标注层颜色评审稿彩色归档稿黑白黑白下浅色填充会变成灰块背景打印关闭网格和分页符不会进 PDF顺序上先“打印预览”看一眼分页再输出。Visio 的分页是按页面设置的纸张算的一张横向大图可能被切成四页预览里能看到分页符落在哪。发现被切得难看不要急着改缩放先回页面设置把页面尺寸改成“适应绘图”让图纸本身变大比压缩内容干净得多。如果对方要求黑白打印浅色填充比如 #E8F0FE在黑白下几乎是白块层级关系全丢。我一般准备两套主题彩色评审用黑白归档用归档版把所有填充改成白底、只留边框和线型差异。4.2 批量导出 PNG一页一张文件名带页名文档里图不止一张时手动一页页“另存为图片”很折磨。这段脚本把当前文档每一页导成一张 PNG目录不存在就建。Sub ExportPagesPNG() Dim pg As Visio.Page Dim outDir As String, fName As String outDir D:\visio_out\ If Dir(outDir, vbDirectory) Then MkDir outDir 位图导出分辨率单位 DPI流程图交付用 200 已经够清晰 Application.Settings.RasterExportResolution visRasterExportResolutionCustom Application.Settings.RasterExportResolutionX 200 Application.Settings.RasterExportResolutionY 200 For Each pg In ActiveDocument.Pages 页名里可能带斜杠或冒号Windows 文件名不允许先替换掉 fName Replace(pg.Name, /, _) fName Replace(fName, :, _) pg.Export outDir fName .png Next pg MsgBox 导出完成共 ActiveDocument.Pages.Count 页 End Sub两个参数面需要说明。分辨率用 DPI 控制200 是文档插图的安全值投屏演示可以降到 150要印刷就上 300再高文件会大得难传。文件名这里只处理了斜杠和冒号如果页名里有问号、星号导出会静默失败或者报错所以命名页时最好只用中文、字母、数字和短横线。还有一点pg.Export导出的是整页内容包括页面上的辅助线、不可见图层里的形状。如果之前为了排版留了一堆空白框会一起导出去。所以导出前把辅助性图层设为不可见再运行脚本。4.3 .vsd 与 .vsdx先用一条命令看清手上是什么格式2010 默认存的是.vsd二进制格式新版本默认存.vsdx本质是个 zip 包里面是 XML。两边互传时最常见的情况是对方发来的.vsdx这边双击打不开或者这边发出去的.vsd对方打开后提示需要转换。传文件之前先确认格式比事后解释省事。# 判断文件到底是老式二进制还是 zip 容器 file drawing.vsd # 输出含 Composite Document File V2 - 老式 .vsd 二进制 # 输出含 Zip archive data - 其实是 .vsdx 或改名后的 zip 包 # 如果是 zip 容器可以直接看内部结构 unzip -l drawing.vsdx | head -20看内部结构这一步对排查很有用.vsdx里每一页是visio/pages/page1.xml这样的文件形状的文本、坐标、User 单元格都在里面用文本编辑器就能搜关键字。.vsd是二进制搜不了这也是为什么我习惯把源文件另存一份.vsdx作为“可检索副本”即使主交付物仍然是.vsd。跨版本的现实做法源文件保持.vsd评审稿一律给 PDF需要对方编辑时再按对方版本另存。别指望格式自动兼容尤其图里用了自定义母版和 ShapeSheet 公式的跨版本打开后母版可能被替换成“未知形状”公式丢失看着还在、改起来全废。5. 避坑与排查五个让我整页返工的现场下面这几条都是真实发生过的每条按现象、原因、解决写。看完能省下至少一次通宵。5.1 形状一动连线留在原地现象拖动一个流程框到新位置连到它身上的线纹丝不动端点悬空看着像断开的。原因连接线的端点没有粘附到形状的连接点上只是视觉上压在框的边缘。Visio 判断“连上没连上”看的是粘附关系不是像素距离。解决删掉这条线重连用连接线工具从形状边缘的蓝色连接点拖出看到端点变绿再松手。批量修的话跑第 3.4 节那段脚本定位再逐条重连。预防手段是画图前在“视图 → 视觉帮助”里把“粘附到连接点”打开。5.2 导出的 PDF 里字体变了形现象本地看着是等宽字体PDF 发出去在另一台机器上打开英文变成宋体中文个别字变成方框。原因用了对方机器上没装的字体导出时没有嵌入。不同 PDF 输出通道对字体嵌入的处理不一样系统自带的虚拟打印机通常按“作为图像”或“使用系统字体”处理。解决图纸字体只从系统自带字体里选别用下载来的设计字体确认必须保真时在打印对话框里把“作为图像打印”勾上牺牲一点矢量清晰度换一致外观。团队协作时把字体写进模板的样式里新图继承样式就不会各写各的。5.3 文件从几兆涨到几十兆拖一下卡三秒现象一开始很轻的图改了一个月变成 30MB 以上滚动和拖动明显卡顿另存也要等半天。原因多半是往图里贴了位图截图尤其是手机拍的流程图照片以及文档模具里堆积了几十个从别的图复制过来、实际没用的母版。Visio 会把用过的母版都存进文档越攒越多。解决截图先在外部裁切压缩再贴打开“绘图资源管理器”看文档模具删掉图上没实例的母版页面数量多的话按模块拆成多个文件用超链接互相指而不是塞在一个文件里。我一般每周清一次文档模具养成习惯后文件大小能稳定在几兆。5.4 打印出来右边少一块现象屏幕上完整预览里发现最右边的两列形状跑到第二页去了或者干脆被裁掉。原因页面尺寸小于绘图内容。Visio 的页面是固定大小的画布形状超出画布不会自动扩大打印时就按分页切开。解决设计 → 页面设置 → 页面尺寸选“适应绘图”让画布跟着内容走或者打印时选“调整为 1 页宽”。前者改的是文件本身推荐后者只影响这一次输出。改完记得回预览确认别直接点打印。5.5 图层锁了还是能选中评审批注被印进正式稿现象明明把“评审”层设成锁定还是能点中上面的红框导出 PDF 时红色的批注赫然在列。原因图层属性里“锁定”管的是该层的形状能否被选中和编辑“打印”是另一个独立开关两者互不影响。只锁不关打印批注照样输出。解决打开图层属性对话框对评审层同时勾选“锁定”并取消“打印”对标注层按需取消打印。做完这一步再出 PDF。团队模板里把这两个开关预设好新图直接继承就不用每次手动检查。6. 进阶用法把形状表当数据源导出一份可对比的图形清单图做多了会发现一个尴尬事评审会上有人说“上一版的类图里 OrderService 有五个方法怎么现在只剩三个”没人答得上来因为差异藏在两张图里靠肉眼比对。可行的做法是把图当数据源把每个形状的关键属性导成 CSV两次导出做文本比对差异一目了然。这段脚本导出当前页所有带User.ClassName的形状一行一个字段用逗号分隔。Sub ExportShapeInventory() Dim shp As Visio.Shape Dim fNum As Integer Dim line As String fNum FreeFile Open D:\visio_out\inventory.csv For Output As #fNum Print #fNum, Page,ShapeId,ClassName,Members For Each shp In ActivePage.Shapes If shp.CellExistsU(User.ClassName, 0) 0 Then line ActivePage.Name , shp.NameID , _ shp.CellsU(User.ClassName).ResultStrU() , _ Replace(shp.CellsU(User.Members).ResultStrU(), Chr(10), / ) Print #fNum, line End If Next shp Close #fNum MsgBox 清单已导出 End SubUser.Members里是换行分隔的多行文本直接写进 CSV 会把一条记录拆成多行所以用Replace把换行换成/保证一行一条记录。NameID是形状在页内的编号形状删了重建编号会变所以比对时以ClassName为键、Members为值NameID只作定位参考。导出的 CSV 丢进版本库每次评审前跑一遍用普通 diff 就能看出哪个类加了方法、哪个类被删了。这套做法我用了很久最大的好处不是省时间而是让“图”和“文档”有了同一个可核对的基线——图不再是随手画的附件而是有版本、有差异记录的东西。一个具体技巧把User.Stereotype也加进导出字段然后在 CSV 里按构造型排序能一眼看出哪一层controller/service/repository的形状数量异常通常是某个模块漏画了。另外导出前把页面上的临时形状删干净否则清单里会混进一堆没有类名的空框。血泪经验是这套脚本别等到交付前才跑。我现在的习惯是每次改完图就导一次清单顺手看一眼行数有没有突变——行数突然少一半多半是母版被替换或者某个页面被误删了。从那以后我每次交图前都强制走一遍“导出清单 → diff → 再出 PDF”的顺序比事后解释便宜太多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站