将多个模具添加到同一Visio工作表
本文关键字:Visio 工作 添加 | 更新日期: 2023-09-27 18:29:27
我有C#代码,可以创建Visio应用程序实例,然后打开一些现有的模板,这样我就可以获得绘图所需的形状母版。Visio 2013更改了一些内容,所以我需要打开两个不同的模板。问题是我在Visio中打开了2个绘图,每个模具1个。当我构建文档并保存它时,我可以关闭它,但仍有另一个空图形打开。我在创建图形的活动文档中也会得到一个空的空白页。
Visio.Application va = new Visio.Application();
va .Documents.Add(@"");
Visio.Documents vdocs = va.Documents;
const string templateNameU = "BASFLO_M.VSTX";
const string ConnectorStencilNameU = "BASFLO_M.VSSX";
const string RectangleStencilNameU = "BASIC_U.VSS";
const string stencilNameU = "CONNEC_U.VSSX";
const string connectorMasterNameU = "Dynamic Connector";
const string RectangleMasterNameU = "Rounded Rectangle";
Visio.Master connectorMaster = null;
Visio.Master rectangleMaster = null;
// open the templates we need
Visio.Document vc = vdocs.OpenEx(RectangleStencilNameU, short)Visio.VisOpenSaveArgs.visOpenDocked);
va.Documents.Add(templateNameU);
我试着用关闭所有打开的图纸
foreach (Visio.Document d in va.Documents)
{
va.Documents[d.Name].Close();
}
va.ActiveDocument.Close();
但这很混乱。由于某些原因,for循环没有关闭活动文档。有没有一种方法可以将多个模板添加到同一文档和/或页面,这样我只能使用一个页面?有没有一种方法可以删除空白页,而不需要使用for循环来获取页面名称来删除它?我浏览了API,但没有找到任何方法。
看起来您正在创建两个文档。。即带有va.Documents.Add(")的第一个(空),然后是基于使用va.Documents.Add(templateNameU)的模板的第二个。
如果你不想要第一个,就不要创建它。这意味着,你可以创建新的文档,然后打开模板,然后绘制,然后关闭所有内容,就像这样:
var doc = va.Documents.Add(templateNameU)
var stn1 = va.Documents.Open(<first stencil>)
var stn2 = va.Documents.Open(<second stencil>)
// ... do stuff with the doc and then close everything...
doc.Close();
stn1.Close();
stn2.Close();
我是不是错过了什么?
顺便说一句,要获得"动态连接器",你不需要打开"连接器模板",它包含一个特定的动态连接器。要获得默认连接器,只需使用Application.ConnectorToolDataObject
此外,还可以使用shape连接形状。AutoConnect(这也将使用默认连接器)
此外,实际上你不需要专门打开模具。如果它是模板的一部分,当您基于该模板创建新图形时,它将自动为您打开(因此您可以使用Application.Documents[]获取它们。
也许有帮助?(绘制2个矩形并将它们连接起来):
var doc = va.Documents.Add("BASICD_M.VSTX");
var stencil = va.Documents["BASIC_M.VSSX"];
var rectMaster = stencil.Masters["Rounded Rectangle"];
var rect1 = va.ActivePage.Drop(rectMaster, 1, 1);
var rect2 = va.ActivePage.Drop(rectMaster, 3, 1);
rect1.AutoConnect(rect2, Visio.VisAutoConnectDir.visAutoConnectDirNone);