2016-09-28 4 views
0

В моей надстройке Visio создаю некоторые фигуры, не имеющие геометрии, только текст. После кода C# используются для создания текстов в центре Visio страницы:Создание фигур Visio 2016 в надстройке C#

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 

Что не так с методом Shape.BoundingBox() в Visio 2016?

Спасибо,

Sal

+0

Привет, я подтверждаю, что вижу ту же самую разницу между 2013 и 2016 годами и поднял ее с командой Visio. – JohnGoldsmith

+0

@JohnGoldsmith - вы слышали новости из команды Visio? Как вы думаете, можно ли исправить проблему в любом входящем пакете Office 2016? – Sal

+0

Привет, Просто обновите, что исправление для этого сейчас находится на пути: https://support.microsoft.com/en-gb/help/3203473/july-5-2017-update-for-visio- 2016-kb3203473 – JohnGoldsmith

ответ

0

я мог Репрографический это Aswell, но есть некоторые детали к этому, которые предлагают BoundingBox() работает отлично в visio16,

Shape.BoundingBox() принимает флаг в качестве первого параметра, который упоминается здесь »((короткий) Visio.VisBoundingBoxArgs.visBBoxUprightText», который используется для получения ограничивающей рамки прямоугольника, в который заключен текст. Вот метод catch, Shape.BoundingBox() проверяет форму .type(), который в этом случае возвращается как прямоугольник, и флаг говорит, чтобы получить ограничивающий прямоугольник для t ext, который заканчивается в случае сбоя и, следовательно, на выходе, как наблюдалось.

Выше заявление может быть подтверждено с информацией приведенной здесь, https://msdn.microsoft.com/en-us/library/office/ff766755.aspx

«Если метод BoundingBox возвращает ошибку, или если просят вернуть прямоугольник, охватывающий нулевые формы, прямоугольник Возвращается {слева: 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 
} 

Визио внутри первой получает временный прямоугольник текста внутри фактического прямоугольника, а затем вызывает метод BoundingBox на этой температуры прямоугольника формы всякий раз, когда используется флаг «visBBoxUprightText» при запросе для BoundingBox() который в конечном итоге отлично работает без каких-либо сбоев.

+0

Метод BoundingBox работает корректно для нормальной геометрии, но не в случае OP, когда форма не имеет геометрии.Тот же код в 2013 году работает так, как ожидалось, поэтому существует разница между двумя версиями, которых не должно быть. – JohnGoldsmith

+0

Прошло ли дальнейшее исследование и, таким образом, было обнаружено, что были внесены некоторые недавние изменения в метод Shape.BoundingBox(), который вызвал это. Для обходного пути можно использовать Shape.VisualBoundingBox() – bluemoonstudios