在C#加载项中创建Visio 2016形状

时间:2016-09-28 20:03:21

标签: c# visio office-addins

在我的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()有什么问题?

谢谢,

萨尔

1 个答案:

答案 0 :(得分:0)

我还可以重复这个,但是有一些细节可以看出BoundingBox()在visio16中运行正常,

Shape.BoundingBox()将标志作为第一个参数,如此处所述"((短)Visio.VisBoundingBoxArgs.visBBoxUprightText"用于获取文本所包含的矩形的边界框。这是catch,Shape.BoundingBox()方法检查Shape.type(),在这种情况下,返回为矩形,标志表示获取文本的边界框,最终出现在失败的情况下,因此观察输出。

上述声明可以使用此处给出的信息进行验证, https://msdn.microsoft.com/en-us/library/office/ff766755.aspx

"如果BoundingBox方法返回错误,或者要求返回包含零形状的矩形,则返回的矩形为{left:0,bottom:0,right:-1,top:-1 };否则,返回的矩形小于或等于(< =)right,而bottom小于或等于(< =)top。返回的数字是内部单位(英寸)。"

另外为了验证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内部首先获取实际矩形内文本的临时矩形,然后在使用标记" visBBoxUprightText"时,在此临时矩形形状上调用BoundingBox方法。查询BoundingBox()时最终正常工作而没有任何失败。