如何通过 C# 在 MS Visio 中获取形状对象的颜色
How to get the color of a shape object in MS Visio through C#
我将一个形状对象绘制为 'group',这样两个子形状就是该组的直接子对象。组中的所有形状都有不同的颜色。
我想知道 属性 可以帮助我获得形状对象的颜色(红色、绿色、白色)的是什么。
我知道形状有样式 属性 (Shape.Style),但它没有给我颜色值。
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 =
}
}
任何帮助将不胜感激。
获取填充颜色不受形状是否属于组的影响。一旦您获得了对正确形状的引用,您就可以查看相应的单元格。
Visio 有两种设置填充颜色的主要方法 - 图案填充 和渐变填充。后者是从2013年开始。
对于图案填充,您正在查看三个单元格:FillForegnd
、FillBkgnd
和FillPattern
。大多数形状以实心填充 (FillPattern
1) 开始,这意味着仅使用 FillForegnd
。对于其他模式类型,您同时处理 FillForegnd
和 FillBkgnd
.
对于渐变填充,FillGradientEnabled
单元格设置为 1,这导致 Fill Gradient Stops
部分采用先例。
在后台,Visio 维护着一个 Document.Colors
集合。可以通过索引访问一些内置颜色:0 = 黑色、1 = 白色、2 = 红色、3 = 绿色等,一直到 23。使用的任何其他自定义颜色都会添加到集合中,并且还会给出一个索引.这意味着,给定一个索引,您可以在 Colors 集合中查找颜色实例。
以下是一些演示如何访问各种类型着色的代码。给定这四种形状:
前三个形状使用图案填充,最后一个使用渐变填充。
- Sheet.1 使用索引单元格公式 (
3
),
- Sheet.2使用RGB函数,
- Sheet.3 使用模式 (
2
),因此同时使用前景和背景单元格
- Sheet.4 使用渐变色标,因此忽略前景和背景单元格
...您可以使用以下代码来读取工作中的颜色(注意这是使用 LINQPad 作为输出 window 可以更清楚地了解发生了什么:
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})";
}
}
...这会产生以下输出:
我将一个形状对象绘制为 'group',这样两个子形状就是该组的直接子对象。组中的所有形状都有不同的颜色。
我想知道 属性 可以帮助我获得形状对象的颜色(红色、绿色、白色)的是什么。
我知道形状有样式 属性 (Shape.Style),但它没有给我颜色值。
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 =
}
}
任何帮助将不胜感激。
获取填充颜色不受形状是否属于组的影响。一旦您获得了对正确形状的引用,您就可以查看相应的单元格。
Visio 有两种设置填充颜色的主要方法 - 图案填充 和渐变填充。后者是从2013年开始。
对于图案填充,您正在查看三个单元格:FillForegnd
、FillBkgnd
和FillPattern
。大多数形状以实心填充 (FillPattern
1) 开始,这意味着仅使用 FillForegnd
。对于其他模式类型,您同时处理 FillForegnd
和 FillBkgnd
.
对于渐变填充,FillGradientEnabled
单元格设置为 1,这导致 Fill Gradient Stops
部分采用先例。
在后台,Visio 维护着一个 Document.Colors
集合。可以通过索引访问一些内置颜色:0 = 黑色、1 = 白色、2 = 红色、3 = 绿色等,一直到 23。使用的任何其他自定义颜色都会添加到集合中,并且还会给出一个索引.这意味着,给定一个索引,您可以在 Colors 集合中查找颜色实例。
以下是一些演示如何访问各种类型着色的代码。给定这四种形状:
前三个形状使用图案填充,最后一个使用渐变填充。
- Sheet.1 使用索引单元格公式 (
3
), - Sheet.2使用RGB函数,
- Sheet.3 使用模式 (
2
),因此同时使用前景和背景单元格 - Sheet.4 使用渐变色标,因此忽略前景和背景单元格
...您可以使用以下代码来读取工作中的颜色(注意这是使用 LINQPad 作为输出 window 可以更清楚地了解发生了什么:
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})";
}
}
...这会产生以下输出: