Как получить цвет объекта формы в MS Visio через C # - PullRequest
0 голосов
/ 25 марта 2019

У меня есть объект формы, нарисованный как «группа», так что две подформы являются прямыми потомками группы. Все фигуры в группе имеют отличительные цвета.

Я хочу знать, что это за свойство, которое может помочь мне получить цвет объектов формы (красный, зеленый, белый).

Я знаю, что у формы есть свойство стиля (Shape.Style), но это не дает мне значение цвета.

enter image description here

Application visApp = new Application();

Document visDoc = visApp.Documents.Open(VisiofilePath);

var shp = visApp.ActivePage.Shapes.ItemFromID[1];

string shapeColor = string.Empty;

foreach (Visio.Shape s in shp.Shapes)
{
    if(s.Text == "Child Object 1")
     {
        //shapeColor = 
     }

     if(s.Text == "Child Object 2")
     {
        //shapeColor = 
     }        
}

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 26 марта 2019

Удержание цвета заливки не зависит от того, является ли фигура частью группы или нет. Как только вы получите ссылку на правильную форму, вы можете посмотреть на соответствующие ячейки.

Visio имеет два основных способа установки цвета заливки - Узор заливки и Градиентная заливка . Последний с 2013 года.

Для Заполнение узором вы смотрите на три ячейки: FillForegnd, FillBkgnd и FillPattern. Большинство фигур начинаются со сплошной заливки (FillPattern 1), и это означает, что используется только FillForegnd. Для других типов паттернов вы имеете дело как с FillForegnd, так и с FillBkgnd.

Для Градиентная заливка для ячейки FillGradientEnabled установлено значение 1, в результате чего секция Fill Gradient Stops принимает прецеденты.

В фоновом режиме Visio поддерживает коллекцию Document.Colors. Некоторые встроенные цвета могут быть доступны по индексу: 0 = черный, 1 = белый, 2 = красный, 3 = зеленый и т. Д. Вплоть до 23. Любые дополнительные пользовательские цвета добавляются в коллекцию и также получают индекс , Это означает, что при наличии индекса вы можете искать экземпляр цвета в коллекции Colors.

Ниже приведен код для демонстрации того, как получить доступ к различным типам раскраски. Учитывая эти четыре формы:

enter image description here

Первые 3 фигуры используют заливку по шаблону, а последние используют градиентную заливку.

  • Лист.1 использует формулу ячейки индекса (3),
  • Sheet.2 использует функцию RGB,
  • В Sheet.3 используется шаблон (2), поэтому используются ячейки переднего плана и фона
  • Sheet.4 использует градиентные остановки, поэтому ячейки переднего плана и фона игнорируются

... вы могли бы использовать следующий код для чтения цветов на работе (обратите внимание, что это использование LINQPad, поскольку окно вывода проясняет, что происходит:

void Main()
{
    var vApp = MyExtensions.GetRunningVisio();

    for (int i = 1; i <= 4; i++)
    {
        var shp = vApp.ActivePage.Shapes.ItemFromID[i];
        var colorInfos = new List<ColorInfo>();
        colorInfos.Add(new ColorInfo(shp.CellsU["FillForegnd"]));
        colorInfos.Add(new ColorInfo(shp.CellsU["FillBkgnd"]));
        new
        {
            shp.NameID,
            FillPattern = shp.CellsU["FillPattern"].ResultIU,
            FillGradientEnabled = Convert.ToBoolean(shp.CellsU["FillGradientEnabled"].ResultIU),
            PatternColors = colorInfos,
            GradientColors = FillGradientColors(shp) ?? "Default (10 stops all white)"
        }.Dump();
    }
}

private dynamic FillGradientColors(Visio.Shape shp)
{
    List<string> rgbs = null;
    var iSect = (short)Visio.VisSectionIndices.visSectionFillGradientStops;
    for (int i = 0; i < shp.RowCount[iSect]; i++)
    {
        var targetCell = shp.CellsSRC[iSect, (short)i, (short)Visio.VisCellIndices.visGradientStopColor];
        if (targetCell.IsInherited == 0)
        {
            if (rgbs is null)
            {
                rgbs = new List<string>();
            }
            rgbs.Add(ColorInfo.RgbString(targetCell));
        }
    }   
    return rgbs;    
}


public class ColorInfo
{
    private Visio.Cell _vCell;

    public ColorInfo(Visio.Cell vCell)
    {
        _vCell = vCell;
        RGB = RgbString(_vCell);
    }

    public string Name => _vCell.Name;
    public string RGB { get; set; }
    public string FormulaU => _vCell.FormulaU;

    public static string RgbString(Visio.Cell cell)
    {
        var colorIdx = cell.Result[(short)Visio.VisUnitCodes.visUnitsColor];
        var c = cell.Document.Colors.Item16[(short)colorIdx];
        return $"RGB({c.Red},{c.Green},{c.Blue})";
    }
}

... это дает следующий вывод:

enter image description here

...