在我的Visio插件中,我创建了一些没有几何形状,只有文本的形状。下面的c#代码用于在Visio页面的中心创建文本:
Master MyMaster = MyStencil.Masters["Navigation"];
Shape MyShape = MyPage.Drop(MyMaster, PageRight / 2.0, PageTop / 2.0);
MyShape.Text = "Some text";
double ShapeLeft, ShapeBottom, ShapeRight, ShapeTop;
MyShape.BoundingBox((short)VisBoundingBoxArgs.visBBoxUprightText,
out ShapeLeft, out ShapeBottom, out ShapeRight, out ShapeTop);
文本形状创建后,计算其边界框以生成页面的其他组件。这在早期版本的Visio中运行良好,但在Visio 2016中就不行了。
Visio 2010和Visio 2013中的文本形状边界框为:
ShapeLeft = 5.48
ShapeBottom = 4.05
ShapeRight = 6.20
ShapeTop = 4.21
Visio 2016中的形状边界框为:
ShapeLeft = 0.0
ShapeBottom = 0.0
ShapeRight = -1.0
ShapeTop = -1.0
在Visio 2016中Shape.BoundingBox()方法有什么问题?
谢谢你,Sal
我也可以复制这个,但是有一些细节表明BoundingBox()在visio16中工作得很好,
Shape.BoundingBox()将flag作为第一个参数,正如这里所提到的"((短)Visio.VisBoundingBoxArgs。visBBoxUprightText",用于获取文本所包围的矩形的边界框。这里是catch, Shape.BoundingBox()方法检查Shape.type(),在本例中,Shape.type()作为矩形返回,标志表示获取文本的边界框,该文本以失败情况结束,因此输出为观察到的。
上面的语句可以用这里给出的信息验证,https://msdn.microsoft.com/en-us/library/office/ff766755.aspx
"如果BoundingBox方法返回错误,或者要求返回包含0个形状的矩形,则返回的矩形为{left: 0, bottom: 0, right: -1, top: -1};否则,返回的矩形左小于等于(<=)右,而底小于等于(<=)顶。返回的数字以内部单位(英寸)为单位。"
为了验证BoundingBox()返回正确的值,我们可以尝试使用标志"visBBoxUprightWH",它给出了我们正在查询边界框的矩形的确切边界框。(下面的代码)
private void button1_Click(object sender, RibbonControlEventArgs e)
{
Visio::Application application = Globals.ThisAddIn.Application;
Visio::Page page = application.ActivePage;
Visio::Document basicStencil = application.Documents.OpenEx("basic_u.vssx", (short)(Visio.VisOpenSaveArgs.visOpenRO | Visio.VisOpenSaveArgs.visOpenHidden));
var master = basicStencil.Masters.ItemU["Rectangle"];
double pinX = 5.5;
double pinY = 5.5;
double height = 2.0;
double width = 2.0;
Visio::Shape shape = page.Drop(master, pinX, pinY);
String text = "I am here";
shape.Text = text;
Visio.Cell cell = shape.get_CellsU("Height");
cell.ResultIUForce = height;
cell = shape.get_CellsU("Width");
cell.ResultIUForce = width;
double Left = 0.0;
double Right = 0.0;
double Bottom = 0.0;
double Top = 0.0;
shape.BoundingBox((short)Visio.VisBoundingBoxArgs.visBBoxDrawingCoords, out Left, out Bottom, out Right, out Top);
Console.WriteLine(Left); //4.5
Console.WriteLine(Right); //6.5
Console.WriteLine(Bottom); //6.5
Console.WriteLine(Top); //4.5
}
visio内部首先获取实际矩形内文本的临时矩形,然后在这个临时矩形形状上调用BoundingBox方法,无论何时使用标志"visBBoxUprightText",同时查询BoundingBox(),最终工作正常,没有任何失败。