Удержание цвета заливки не зависит от того, является ли фигура частью группы или нет. Как только вы получите ссылку на правильную форму, вы можете посмотреть на соответствующие ячейки.
Visio имеет два основных способа установки цвета заливки - Узор заливки и Градиентная заливка . Последний с 2013 года.
Для Заполнение узором вы смотрите на три ячейки: FillForegnd
, FillBkgnd
и FillPattern
. Большинство фигур начинаются со сплошной заливки (FillPattern
1), и это означает, что используется только FillForegnd
. Для других типов паттернов вы имеете дело как с FillForegnd
, так и с FillBkgnd
.
Для Градиентная заливка для ячейки FillGradientEnabled
установлено значение 1, в результате чего секция Fill Gradient Stops
принимает прецеденты.
В фоновом режиме Visio поддерживает коллекцию Document.Colors
. Некоторые встроенные цвета могут быть доступны по индексу: 0 = черный, 1 = белый, 2 = красный, 3 = зеленый и т. Д. Вплоть до 23. Любые дополнительные пользовательские цвета добавляются в коллекцию и также получают индекс , Это означает, что при наличии индекса вы можете искать экземпляр цвета в коллекции Colors.
Ниже приведен код для демонстрации того, как получить доступ к различным типам раскраски. Учитывая эти четыре формы:
Первые 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})";
}
}
... это дает следующий вывод: