【问题标题】:How to get the color of a shape object in MS Visio through C#如何通过 C# 在 MS Visio 中获取形状对象的颜色
【发布时间】:2019-03-25 12:48:08
【问题描述】:

我将一个形状对象绘制为一个“组”,这样两个子形状就是该组的直接子对象。组中的所有形状都有不同的颜色。

我想知道什么属性可以帮助我获得形状对象的颜色(红、绿、白)。

我知道形状具有样式属性 (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 中有开发人员选项卡吗?
  • @EpicKip :是的,我在 Visio 中启用了“开发人员”选项卡。
  • 好的,如果你按下显示 shapesheet,你可以看到属性的名称(只要找到你正在谈论的颜色的那个)你可以通过 .Cells 访问它。我认为。这是一个关于改变颜色的问题,它应该同样适用于阅读:stackoverflow.com/questions/44523785/…
  • @EpicKip : ShapeSheet 中可以帮助我了解形状背景颜色的属性是什么?
  • 您可以通过将其设置为您知道 rgb 的颜色来测试它,然后在 shapesheet 中找到该颜色。当您找到该颜色时,您就知道属性名称 ;)

标签: c# interop visio flowchart


【解决方案1】:

获取填充颜色不受形状是否属于组的影响。获得正确形状的参考后,您就可以查看相应的单元格。

Visio 有两种主要的填充颜色设置方法 - 图案填充渐变填充。后者是从 2013 年开始。

对于图案填充,您正在查看三个单元格:FillForegndFillBkgndFillPattern。大多数形状都以实心填充 (FillPattern 1) 开始,这意味着仅使用 FillForegnd。对于其他模式类型,您同时处理 FillForegndFillBkgnd

对于渐变填充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 作为输出窗口,可以更清楚地看到发生了什么:

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})";
    }
}

...这会产生以下输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多