You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Glue将Visio形状仅连接到矩形侧边标记中点

解决Visio连接器粘接到矩形侧边中点的问题

当前代码将连接器粘接到形状的Pin点(通常为形状中心),要实现粘接到矩形侧边中点,可通过两种方式修改:

方法1:通过形状边界公式计算中点

矩形的侧边中点可通过Pin点坐标结合宽高计算,对应Visio单元格公式如下:

  • 上边中点:PinX, PinY + Height*0.5
  • 下边中点:PinX, PinY - Height*0.5
  • 左边中点:PinX - Width*0.5, PinY
  • 右边中点:PinX + Width*0.5, PinY

修改后的代码示例:

// Drop Shape
Visio.Master visioMaster = visioStencil.Masters.get_ItemU(@"Rectangle");
Visio.Shape visioShape = visioPage.Drop(visioMaster, 0.0, 0.0);

Visio.Master visioMaster1 = visioStencil.Masters.get_ItemU(@"Rectangle");
Visio.Shape visioShape1 = visioPage.Drop(visioMaster1, 0.0, 1.0);

// Add a dynamic connector to the page using glue.
Visio.Shape vsoConnectorShape = visioShape.ContainingPage.Drop(app.ConnectorToolDataObject, 0.0, 0.0);

// Set the connector properties, using different arrows, colors, and patterns for many-to-many relationships.

// 连接起点到第一个矩形的上边中点
Visio.Cell cellBeginX = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DBeginX);
cellBeginX.GlueTo(visioShape.get_CellsU("PinX"));
Visio.Cell cellBeginY = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DBeginY);
cellBeginY.GlueTo(visioShape.get_CellsU("PinY+Height*0.5"));

// 连接终点到第二个矩形的下边中点
Visio.Cell cellEndX = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DEndX);
cellEndX.GlueTo(visioShape1.get_CellsU("PinX"));
Visio.Cell cellEndY = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DEndY);
cellEndY.GlueTo(visioShape1.get_CellsU("PinY-Height*0.5"));

方法2:使用形状内置连接点

Visio默认矩形的四个侧边中点已预设连接点,可直接通过visRowConnectionPts行索引定位:

  • 下边中点:行号0
  • 左边中点:行号1
  • 右边中点:行号2
  • 上边中点:行号3

修改后的代码示例:

// Drop Shape
Visio.Master visioMaster = visioStencil.Masters.get_ItemU(@"Rectangle");
Visio.Shape visioShape = visioPage.Drop(visioMaster, 0.0, 0.0);

Visio.Master visioMaster1 = visioStencil.Masters.get_ItemU(@"Rectangle");
Visio.Shape visioShape1 = visioPage.Drop(visioMaster1, 0.0, 1.0);

// Add a dynamic connector to the page using glue.
Visio.Shape vsoConnectorShape = visioShape.ContainingPage.Drop(app.ConnectorToolDataObject, 0.0, 0.0);

// Set the connector properties, using different arrows, colors, and patterns for many-to-many relationships.

// 连接起点到第一个矩形的上边中点(内置连接点行号3)
Visio.Cell cellBeginX = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DBeginX);
cellBeginX.GlueTo(visioShape.get_CellsSRC(3, (short)Visio.VisRowIndices.visRowConnectionPts, (short)Visio.VisCellIndices.visCnnctPtX));
Visio.Cell cellBeginY = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DBeginY);
cellBeginY.GlueTo(visioShape.get_CellsSRC(3, (short)Visio.VisRowIndices.visRowConnectionPts, (short)Visio.VisCellIndices.visCnnctPtY));

// 连接终点到第二个矩形的下边中点(内置连接点行号0)
Visio.Cell cellEndX = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DEndX);
cellEndX.GlueTo(visioShape1.get_CellsSRC(0, (short)Visio.VisRowIndices.visRowConnectionPts, (short)Visio.VisCellIndices.visCnnctPtX));
Visio.Cell cellEndY = vsoConnectorShape.get_CellsSRC(1, (short)Visio.VisRowIndices.visRowXForm1D, (short)Visio.VisCellIndices.vis1DEndY);
cellEndY.GlueTo(visioShape1.get_CellsSRC(0, (short)Visio.VisRowIndices.visRowConnectionPts, (short)Visio.VisCellIndices.visCnnctPtY));

两种方法对比

  • 方法1更灵活,支持自定义任意形状的侧边中点计算;
  • 方法2更简洁,依托Visio内置连接点,适配标准矩形场景。

内容的提问来源于stack exchange,提问作者Nihar Sahoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:40:34