已知形状ID,如何从Visio中获取其画布X、Y坐标?
解决Visio VBA获取形状页面坐标的问题
问题原因
你当前用PinX/PinY拿到的是形状相对父容器或组的局部坐标,如果形状嵌套在组、容器这类父对象里,这个值只会反映它在父对象内的位置,不会对应画布(页面)上的绝对位置,所以才会出现数值始终不变的情况。
两种可行解决方案
方法1:用LocalToPage转换局部坐标到页面坐标
这个方法能直接把形状局部坐标系里的点转换成页面坐标系的坐标,传入(0,0)就对应形状的Pin(中心锚点)位置:
Dim shpObj As Visio.Shape Dim pageCoords As Visio.Point Set shpObj = Application.ActiveWindow.Page.Shapes.ItemFromID(blockID) ' 将形状局部原点(Pin位置)转成页面坐标 Set pageCoords = shpObj.LocalToPage(0, 0) ' 格式化输出英寸单位的坐标 LocationX = Format(pageCoords.X, "000.0000") LocationY = Format(pageCoords.Y, "000.0000")
方法2:用ResultIU直接获取绝对坐标
ResultIU会返回Visio内部单位(1单位=1英寸)的绝对坐标值,自动跳过父对象的相对偏移:
Dim shpObj As Visio.Shape Dim localCent As Double Set shpObj = Application.ActiveWindow.Page.Shapes.ItemFromID(blockID) ' 获取PinX的页面绝对坐标(英寸) localCent = shpObj.CellsU("PinX").ResultIU LocationX = Format(localCent, "000.0000") ' 获取PinY的页面绝对坐标(英寸) localCent = shpObj.CellsU("PinY").ResultIU LocationY = Format(localCent, "000.0000")
额外说明
- 只有当形状直接放在页面上(没有任何父容器/组)时,
PinX/PinY的默认值才等于页面坐标。 ResultIU比指定单位字符串的Result("inches")更稳定,不会因为单位设置出现误差。
内容的提问来源于stack exchange,提问作者user10215784
相关产品推荐
相关产品推荐

