如何使用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
相关产品推荐
相关产品推荐

