Bootstrap

【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondScale.cs

这段代码定义了一个名为 GH_Ex_Ana_CondScale 的类,它是一个 Grasshopper 组件,用于在 Excel 工作表中添加基于相对值的条件格式颜色。以下是该组件的主要功能和介绍:

  1. 功能概述:

    • 这个组件用于在 Excel 中为指定范围的单元格添加条件格式,根据单元格的相对值来应用颜色渐变。
    • 它可以应用两色或三色渐变,根据用户的输入来决定。
  2. 主要特性:

    • 可以指定工作表和单元格范围
    • 支持两色或三色渐变
    • 可以自定义渐变的颜色
    • 可以设置三色渐变的中点参数
    • 提供清除现有条件格式的选项
    • 包含激活/停用条件格式的开关
  3. 输入参数:

    • 工作表和范围
    • 渐变中点参数(用于三色渐变)
    • 渐变颜色(最多三种颜色)
    • 清除现有条件的布尔值
    • 激活条件格式的布尔值
  4. 输出:

    • 应用了条件格式的 Excel 范围
  5. 使用场景:
    这个组件适用于需要在 Excel 中可视化数据分布的情况。例如:

    • 突出显示销售数据中的高值和低值
    • 可视化温度或其他测量数据的分布
    • 在财务报表中高亮显示重要数值
  6. 特殊说明:

    • 这个组件是 Grasshopper 插件的一部分,专门用于 Excel 数据处理和可视化
    • 它继承自 GH_Ex_Rng__Base 类,可能是一个自定义的基类
    • 组件的曝光级别被设置为次要(secondary),表明它可能不是最常用的功能,但在特定情况下很有用

总的来说,这个组件为用户提供了一种简便的方法来在 Grasshopper 环境中为 Excel 数据添加高级的条件格式,增强了数据的可视化效果和可读性。

Flow diagram

这个流程图将展示 GH_Ex_Ana_CondScale 类中 SolveInstance 方法的主要流程。

是/Yes
是/Yes
否/No
否/No
是/Yes
否/No
开始 / Start
获取工作表和范围 / Get worksheet and range
获取输入参数 / Get input parameters
是否激活? / Activate?
是否清除? / Clear?
清除现有条件 / Clear existing conditions
是否为三色? / Is three-color?
设置输出 / Set output
添加三色条件格式 / Add three-color conditional formatting
添加双色条件格式 / Add two-color conditional formatting
结束 / End

这个流程图对应到代码中的主要步骤如下:

  1. 开始 (Start):SolveInstance 方法开始。

  2. 获取工作表和范围 (Get worksheet and range):

    IGH_Goo gooS = null;
    DA.GetData(0, ref gooS);
    ExWorksheet worksheet = new ExWorksheet();
    bool hasWs = gooS.TryGetWorksheet(ref worksheet);
    
    IGH_Goo gooR = null;
    DA.GetData(1, ref gooR);
    ExRange range = new ExRange();
    if (!gooR.TryGetRange(ref range, worksheet)) return;
    if (!hasWs) worksheet = range.Worksheet;
    
  3. 获取输入参数 (Get input parameters):

    double mid = 0.5;
    DA.GetData(2, ref mid);
    Sd.Color a = Sd.Color.LightGray;
    DA.GetData(3, ref a);
    Sd.Color b = Sd.Color.Gray;
    DA.GetData(4, ref b);
    Sd.Color c = Sd.Color.DarkGray;
    bool isThree = DA.GetData(5, ref c);
    bool clear = false;
    DA.GetData(6, ref clear);
    bool activate = false;
    DA.GetData(7, ref activate);
    
  4. 是否激活? (Activate?):

    if (activate)
    {
        // ...
    }
    
  5. 是否清除? (Clear?):

    if (clear) range.ClearConditions();
    
  6. 是否为三色? (Is three-color?):

    if (isThree)
    {
        range.AddConditionalScale(a,b,c,mid);
    }
    else
    {
        range.AddConditionalScale(a, b);
    }
    
  7. 设置输出 (Set output):

    DA.SetData(0, range);
    
  8. 结束 (End):SolveInstance 方法结束。

这个流程图清晰地展示了 SolveInstance 方法的主要逻辑流程,包括条件判断和主要操作步骤。

Description

  1. 构造函数
public GH_Ex_Ana_CondScale()
  : base("Conditional Scale", "Scale",
      "Add conditional formatting colors to a Range based on relative values",
      Constants.ShortName, Constants.SubAnalysis)
{
}

中文注释:

/// <summary>
/// 初始化 GH_Ex_Ana_CondScale 类的新实例。
/// 这个构造函数设置了组件的名称、昵称、描述和分类。
/// </summary>
public GH_Ex_Ana_CondScale()
  : base("Conditional Scale", "Scale",
      "基于相对值为范围添加条件格式颜色",
      Constants.ShortName, Constants.SubAnalysis)
{
}

解释:
这个构造函数初始化了 GH_Ex_Ana_CondScale 类的实例。它调用基类构造函数,设置组件的名称(“Conditional Scale”)、昵称(“Scale”)、描述和分类。这些信息将在 Grasshopper 界面中显示,帮助用户理解组件的功能。

  1. Exposure 属性
public override GH_Exposure Exposure
{
    get { return GH_Exposure.secondary; }
}

中文注释:

/// <summary>
/// 设置组件的曝光级别。
/// 返回 secondary 表示这是一个次要的或不太常用的组件。
/// </summary>
public override GH_Exposure Exposure
{
    get { return GH_Exposure.secondary; }
}

解释:
这个属性定义了组件在 Grasshopper 界面中的曝光级别。GH_Exposure.secondary 表示这是一个次要的组件,可能不会在主工具栏中直接显示,但可以在子菜单或搜索中找到。

  1. RegisterInputParams 方法
protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
    base.RegisterInputParams(pManager);
    pManager[1].Optional = true;
    pManager.AddNumberParameter("Parameter", "P", "The parameter of the midpoint of a 3 color gradient", GH_ParamAccess.item, 0.5);
    // ... (其他参数注册)
}

中文注释和解释:

/// <summary>
/// 注册所有输入参数。
/// 这个方法定义了组件接受的所有输入。
/// </summary>
/// <param name="pManager">参数管理器,用于添加和配置输入参数</param>
protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
    // 调用基类方法注册基本参数(通常是工作表和范围)
    base.RegisterInputParams(pManager);
    
    // 设置第二个参数(索引1)为可选
    pManager[1].Optional = true;
    
    // 添加中点参数(用于三色渐变)
    // AddNumberParameter: 添加数字类型参数
    // Parameters: 名称, 昵称, 描述, 访问类型, 默认值
    pManager.AddNumberParameter("Parameter", "P", "三色渐变的中点参数", GH_ParamAccess.item, 0.5);
    
    // ... (添加其他参数,如颜色、清除选项、激活选项等)
}

这个方法注册了组件的所有输入参数。它首先调用基类方法来注册一些基本参数,然后添加特定于这个组件的参数。每个参数都有名称、昵称、描述、访问类型和默认值(如果适用)。

  1. RegisterOutputParams 方法
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
    base.RegisterOutputParams(pManager);
}

中文注释:

/// <summary>
/// 注册所有输出参数。
/// 在这个例子中,它只是调用基类方法来注册标准输出。
/// </summary>
/// <param name="pManager">参数管理器,用于添加和配置输出参数</param>
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
    base.RegisterOutputParams(pManager);
}

解释:
这个方法注册组件的输出参数。在这个特定的实现中,它只是调用基类方法,这意味着它可能只输出一个标准的 Excel 范围对象。

  1. SolveInstance 方法

这是组件的核心方法,执行主要的逻辑。由于这个方法较长,我会分几个部分来解释。

a. 获取输入数据:

protected override void SolveInstance(IGH_DataAccess DA)
{
    // 获取工作表
    IGH_Goo gooS = null;
    DA.GetData(0, ref gooS);
    ExWorksheet worksheet = new ExWorksheet();
    bool hasWs = gooS.TryGetWorksheet(ref worksheet);

    // 获取范围
    IGH_Goo gooR = null;
    DA.GetData(1, ref gooR);
    ExRange range = new ExRange();
    if (!gooR.TryGetRange(ref range, worksheet)) return;
    if (!hasWs) worksheet = range.Worksheet;

    // 获取其他参数
    double mid = 0.5;
    DA.GetData(2, ref mid);
    // ... (获取颜色和其他参数)

中文注释和解释:

/// <summary>
/// 执行组件的主要逻辑。
/// 这个方法获取所有输入数据,处理它们,然后设置输出。
/// </summary>
/// <param name="DA">数据访问对象,用于获取输入和设置输出</param>
protected override void SolveInstance(IGH_DataAccess DA)
{
    // 获取工作表输入
    IGH_Goo gooS = null;
    DA.GetData(0, ref gooS);
    ExWorksheet worksheet = new ExWorksheet();
    bool hasWs = gooS.TryGetWorksheet(ref worksheet);

    // 获取范围输入
    IGH_Goo gooR = null;
    DA.GetData(1, ref gooR);
    ExRange range = new ExRange();
    if (!gooR.TryGetRange(ref range, worksheet)) return;
    if (!hasWs) worksheet = range.Worksheet;

    // 获取中点参数
    double mid = 0.5;
    DA.GetData(2, ref mid);

    // ... (获取颜色和其他参数)

这部分代码从输入参数中获取必要的数据,包括 Excel 工作表、单元格范围和其他参数(如颜色、中点值等)。它使用 DA.GetData 方法来获取每个输入参数的值。

b. 处理条件格式:

if (activate)
{
    if (clear) range.ClearConditions();
    if (isThree)
    {
        range.AddConditionalScale(a,b,c,mid);
    }
    else
    {
        range.AddConditionalScale(a, b);
    }
}

中文注释和解释:

// 如果激活标志为真,应用条件格式
if (activate)
{
    // 如果清除标志为真,先清除现有的条件格式
    if (clear) range.ClearConditions();

    // 根据是否使用三色渐变来添加相应的条件格式
    if (isThree)
    {
        // 添加三色条件格式
        // AddConditionalScale: 为范围添加条件格式比例尺
        // Parameters: 颜色1, 颜色2, 颜色3, 中点值
        range.AddConditionalScale(a, b, c, mid);
    }
    else
    {
        // 添加两色条件格式
        // Parameters: 颜色1, 颜色2
        range.AddConditionalScale(a, b);
    }
}

这部分是方法的核心逻辑。它首先检查是否需要激活条件格式。如果需要,它会根据用户的输入清除现有的条件格式,然后根据是使用两色还是三色渐变来添加新的条件格式。

c. 设置输出:

DA.SetData(0, range);

中文注释:

// 设置输出数据
// SetData: 将处理后的范围对象设置为组件的输出
DA.SetData(0, range);

这行代码将处理后的 Excel 范围对象设置为组件的输出。

  1. Icon 属性
protected override System.Drawing.Bitmap Icon
{
    get
    {
        return Properties.Resources.BB_Cond_Scale_01;
    }
}

中文注释:

/// <summary>
/// 提供组件的图标。
/// 这个图标将在 Grasshopper 界面中显示。
/// </summary>
protected override System.Drawing.Bitmap Icon
{
    get
    {
        // 返回预定义的图标资源
        return Properties.Resources.BB_Cond_Scale_01;
    }
}

这个属性返回组件在 Grasshopper 界面中使用的图标。

  1. ComponentGuid 属性
public override Guid ComponentGuid
{
    get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
}

中文注释:

/// <summary>
/// 获取此组件的唯一标识符。
/// 这个 GUID 在发布后不应更改,用于识别组件。
/// </summary>
public override Guid ComponentGuid
{
    get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
}

这个属性返回组件的全局唯一标识符(GUID)。每个 Grasshopper 组件都需要一个唯一的 GUID 来区分它们。

总结:
这个类实现了一个 Grasshopper 组件,用于在 Excel 中添加基于相对值的条件格式颜色。它展示了如何创建一个自定义的 Grasshopper 组件,包括设置输入和输出参数、处理数据、应用特定的 Excel 功能,以及提供必要的元数据(如图标和GUID)。这个组件的设计允许用户灵活地应用两色或三色渐变条件格式,为数据可视化提供了强大的工具。

Code:

using Grasshopper.Kernel;
using Grasshopper.Kernel.Parameters;
using Grasshopper.Kernel.Types;
using Rhino.Geometry;
using System;
using System.Collections.Generic;
using Sd = System.Drawing;

namespace Bumblebee.Components
{
    /// <summary>
    /// GH_Ex_Ana_CondScale 类定义了一个 Grasshopper 组件,
    /// 用于在 Excel 范围内添加基于相对值的条件格式颜色。
    /// </summary>
    public class GH_Ex_Ana_CondScale : GH_Ex_Rng__Base
    {
        /// <summary>
        /// 初始化 GH_Ex_Ana_CondScale 类的新实例。
        /// </summary>
        public GH_Ex_Ana_CondScale()
          : base("Conditional Scale", "Scale",
              "Add conditional formatting colors to a Range based on relative values",
              Constants.ShortName, Constants.SubAnalysis)
        {
        }

        /// <summary>
        /// 设置组件的曝光级别。
        /// GH_Exposure.secondary 表示这是一个次要的或不太常用的组件。
        /// </summary>
        public override GH_Exposure Exposure
        {
            get { return GH_Exposure.secondary; }
        }

        /// <summary>
        /// 注册所有的输入参数。
        /// </summary>
        /// <param name="pManager">用于添加和配置输入参数的参数管理器</param>
        protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
        {
            // 调用基类方法注册基本参数(通常是工作表和范围)
            base.RegisterInputParams(pManager);
            // 设置第二个参数为可选
            pManager[1].Optional = true;
            // 添加中点参数(用于三色渐变)
            pManager.AddNumberParameter("Parameter", "P", "The parameter of the midpoint of a 3 color gradient", GH_ParamAccess.item, 0.5);
            pManager[2].Optional = true;
            // 添加第一个渐变颜色
            pManager.AddColourParameter("Gradient Color 1", "C0", "The first color of the gradient", GH_ParamAccess.item, Sd.Color.LightGray);
            pManager[3].Optional = true;
            // 添加第二个渐变颜色
            pManager.AddColourParameter("Gradient Color 2", "C1", "The second color of the gradient", GH_ParamAccess.item, Sd.Color.Gray);
            pManager[4].Optional = true;
            // 添加第三个渐变颜色(可选)
            pManager.AddColourParameter("Gradient Color 3", "C2", "The third color of the gradient", GH_ParamAccess.item);
            pManager[5].Optional = true;
            // 添加清除现有条件的布尔参数
            pManager.AddBooleanParameter("Clear", "_X", "If true, the existing conditions will be cleared", GH_ParamAccess.item, false);
            pManager[6].Optional = true;
            // 添加激活条件的布尔参数
            pManager.AddBooleanParameter("Activate", "_A", "If true, the condition will be applied", GH_ParamAccess.item, false);
            pManager[7].Optional = true;
        }

        /// <summary>
        /// 注册所有的输出参数。
        /// </summary>
        /// <param name="pManager">用于添加和配置输出参数的参数管理器</param>
        protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
        {
            // 调用基类方法注册标准输出(通常是修改后的 Excel 范围)
            base.RegisterOutputParams(pManager);
        }

        /// <summary>
        /// 这是执行实际工作的方法。
        /// </summary>
        /// <param name="DA">用于检索输入和存储输出的 DA 对象</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            // 获取工作表输入
            IGH_Goo gooS = null;
            DA.GetData(0, ref gooS);
            ExWorksheet worksheet = new ExWorksheet();
            bool hasWs = gooS.TryGetWorksheet(ref worksheet);

            // 获取范围输入
            IGH_Goo gooR = null;
            DA.GetData(1, ref gooR);
            ExRange range = new ExRange();
            if (!gooR.TryGetRange(ref range, worksheet)) return;
            if (!hasWs) worksheet = range.Worksheet;

            // 获取中点参数
            double mid = 0.5;
            DA.GetData(2, ref mid);

            // 获取第一个颜色
            Sd.Color a = Sd.Color.LightGray;
            DA.GetData(3, ref a);

            // 获取第二个颜色
            Sd.Color b = Sd.Color.Gray;
            DA.GetData(4, ref b);

            // 获取第三个颜色(如果提供)
            Sd.Color c = Sd.Color.DarkGray;
            bool isThree = DA.GetData(5, ref c);

            // 获取清除标志
            bool clear = false;
            DA.GetData(6, ref clear);

            // 获取激活标志
            bool activate = false;
            DA.GetData(7, ref activate);

            // 如果激活,应用条件格式
            if (activate)
            {
                // 如果需要,清除现有条件
                if (clear) range.ClearConditions();
                
                // 根据是否为三色渐变添加相应的条件格式
                if (isThree)
                {
                    range.AddConditionalScale(a,b,c,mid);
                }
                else
                {
                    range.AddConditionalScale(a, b);
                }
            }

            // 设置输出(修改后的范围)
            DA.SetData(0, range);
        }

        /// <summary>
        /// 提供组件的图标。
        /// </summary>
        protected override System.Drawing.Bitmap Icon
        {
            get
            {
                // 返回组件的图标
                return Properties.Resources.BB_Cond_Scale_01;
            }
        }

        /// <summary>
        /// 获取此组件的唯一 ID。发布后不要更改此 ID。
        /// </summary>
        public override Guid ComponentGuid
        {
            get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
        }
    }
}

这些注释详细解释了代码的每个主要部分,包括:

  1. 类的整体目的
  2. 构造函数的作用
  3. 各种属性和方法的功能
  4. 输入参数的注册和说明
  5. 主要逻辑(SolveInstance 方法)中的每个步骤
  6. 图标和 GUID 的作用

这种详细的注释不仅有助于理解代码的结构和功能,还为其他开发者提供了有价值的上下文信息。您可以重点解释一些关键概念,如:

  • Grasshopper 组件的基本结构
  • 如何处理 Excel 相关的操作
  • 条件格式的实现方式
  • 参数的注册和处理
  • 组件的可视化元素(如图标)的重要性

努力学习 Grasshopper 插件开发和 Excel 自动化

;