【C#】【EXCEL】Bumblebee/Components/Analysis/GH_Ex_Ana_CondBetween.cs
这段代码定义了一个名为 GH_Ex_Ana_CondBetween
的 Grasshopper 组件,其主要功能是为 Excel 工作表中的特定范围添加条件格式。具体来说:
-
功能概述:
- 为 Excel 中的数据范围添加基于区间值的条件格式
- 允许用户自定义高亮颜色
- 提供选项来反转条件(高亮区间外的值)
- 可以清除现有的条件格式
- 可以控制是否激活条件格式
-
输入参数:
- 工作表数据
- 范围数据
- 区间(用于评估的数值范围)
- 单元格颜色
- 是否反转条件
- 是否清除现有条件
- 是否激活条件格式
-
输出:
- 处理后的 Excel 范围对象
-
组件特性:
- 作为次要组件显示在 Grasshopper 界面中
- 具有自定义图标
- 有唯一的组件标识符(GUID)
-
使用场景:
这个组件适用于需要在 Grasshopper 中处理 Excel 数据的情况,特别是当用户想要突出显示落在特定数值区间内(或外)的数据时。它可以帮助用户快速识别符合特定条件的数据,提高数据分析和可视化的效率。 -
代码结构:
- 继承自基础范围组件 (
GH_Ex_Rng__Base
) - 重写了多个方法来自定义组件行为
- 使用
SolveInstance
方法实现主要逻辑
- 继承自基础范围组件 (
-
扩展性:
这个组件展示了如何将 Excel 的高级功能集成到 Grasshopper 中,为数据分析和可视化提供了更多可能性。类似的方法可以用于创建其他类型的 Excel 数据处理组件。
总的来说,这个组件为 Grasshopper 用户提供了一种灵活的方式来对 Excel 数据应用条件格式,特别是基于数值区间的格式。它体现了将 Excel 的强大功能与 Grasshopper 的参数化设计能力相结合的潜力,为建筑、工程等领域的专业人士提供了更强大的数据处理和可视化工具。
Flow diagram
这个流程图对应到代码中的主要步骤如下:
- 开始 (Start): 对应
SolveInstance
方法的开始。 - 初始化参数 (Initialize Parameters): 对应方法开始时的变量声明。
- 获取工作表数据 (Get Worksheet Data): 对应
DA.GetData(0, ref gooS)
和相关处理。 - 获取范围数据 (Get Range Data): 对应
DA.GetData(1, ref gooR)
和相关处理。 - 获取其他输入参数 (Get Other Input Parameters): 对应获取间隔、颜色、翻转、清除和激活等参数的代码。
- 是否激活条件? (Activate Condition?): 对应
if (activate)
条件判断。 - 是否清除现有条件? (Clear Existing Conditions?): 对应
if (clear)
条件判断。 - 清除条件 (Clear Conditions): 对应
range.ClearConditions()
调用。 - 添加条件格式 (Add Conditional Formatting): 对应
range.AddConditionalBetween()
调用。 - 设置输出数据 (Set Output Data): 对应
DA.SetData(0, range)
调用。 - 结束 (End): 对应方法的结束。
这个流程图清晰地展示了代码的主要逻辑流程,包括数据获取、条件判断和操作执行的顺序。
Description
- 构造函数
GH_Ex_Ana_CondBetween()
public GH_Ex_Ana_CondBetween()
: base("Conditional Between", "Between",
"Add conditional formatting to a Range for values between two numbers",
Constants.ShortName, Constants.SubAnalysis)
{
}
解释:
这是组件的构造函数。它调用基类构造函数,设置组件的名称、昵称、描述和分类。初始化条件格式(区间)组件,设置其基本信息。
Initializes the Conditional Between component, setting its basic information.
Exposure
属性
public override GH_Exposure Exposure
{
get { return GH_Exposure.secondary; }
}
解释:
设置组件在 Grasshopper 界面中的显示级别。将组件设置为次要显示级别,通常在子菜单中显示。
Sets the component to secondary exposure level, typically displayed in a submenu.
RegisterInputParams
方法
protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
base.RegisterInputParams(pManager);
pManager[1].Optional = true;
pManager.AddIntervalParameter("Domain", "D", "The domain to evaluate", GH_ParamAccess.item);
pManager.AddColourParameter("Cell Color", "C", "The cell highlight color", GH_ParamAccess.item, Sd.Color.LightGray);
// ... 其他参数注册
}
解释:
注册组件的输入参数。调用基类方法注册基本参数,然后添加特定于此组件的参数。定义组件所需的输入数据,如区间、颜色、条件设置等。
Defines the input data required by the component, such as interval, color, condition settings, etc.
RegisterOutputParams
方法
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
base.RegisterOutputParams(pManager);
}
解释:
注册组件的输出参数。这里直接调用基类方法,表明输出与基类相同。定义组件的输出数据,在这里与基类输出相同。
Defines the output data of the component, which is the same as the base class in this case.
SolveInstance
方法
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;
// 获取其他参数
Interval interval = new Interval();
if (!DA.GetData(2, ref interval)) return;
Sd.Color color = Sd.Color.LightGray;
DA.GetData(3, ref color);
// ... 获取其他参数
// 应用条件格式
if (activate)
{
if (clear) range.ClearConditions();
range.AddConditionalBetween(interval.Min, interval.Max, color, flip);
}
// 设置输出
DA.SetData(0, range);
}
解释:
这是组件的核心方法,执行实际的数据处理。依次获取输入数据,处理工作表和范围信息,然后根据设置应用条件格式。
Sequentially retrieves input data, processes worksheet and range information, then applies conditional formatting based on settings.
关键步骤包括:
-
获取并验证工作表和范围数据
-
获取条件格式的参数(区间、颜色等)
-
根据激活状态决定是否应用条件格式
-
如果需要,清除现有条件并添加新的条件格式
-
输出处理后的范围对象
-
Icon
属性
protected override System.Drawing.Bitmap Icon
{
get
{
return Properties.Resources.BB_Cond_Between_01;
}
}
解释:
提供组件的图标。返回组件在 Grasshopper 界面中显示的自定义图标。
Returns the custom icon displayed for the component in the Grasshopper interface.
ComponentGuid
属性
public override Guid ComponentGuid
{
get { return new Guid("bd35ec14-ab24-4bbf-99ae-38ccc3d4a6da"); }
}
解释:
定义组件的唯一标识符。返回组件的唯一 GUID,用于 Grasshopper 内部识别和管理。
Returns the unique GUID of the component, used for internal identification and management in Grasshopper.
总结:
这个组件展示了如何创建一个自定义的 Grasshopper 组件,用于在 Excel 范围内应用条件格式。它demonstrates了参数注册、数据处理和 Excel 操作的集成。通过这种方式,开发者可以扩展 Grasshopper 的功能,为用户提供更强大的数据分析和可视化工具。
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
{
// 定义一个条件格式(区间)组件类,继承自基础范围组件
public class GH_Ex_Ana_CondBetween : GH_Ex_Rng__Base
{
/// <summary>
/// 初始化 GH_Ex_An_CondBetween 类的新实例
/// </summary>
public GH_Ex_Ana_CondBetween()
: base("Conditional Between", "Between",
"Add conditional formatting to a Range for values between two numbers",
Constants.ShortName, Constants.SubAnalysis)
{
// 构造函数:设置组件的名称、昵称、描述和分类
}
/// <summary>
/// 设置组件的显示级别
/// </summary>
public override GH_Exposure Exposure
{
get { return GH_Exposure.secondary; } // 将组件设置为次要显示级别
}
/// <summary>
/// 注册所有输入参数
/// </summary>
protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
base.RegisterInputParams(pManager); // 调用基类方法注册基本参数
pManager[1].Optional = true; // 设置第二个参数为可选
pManager.AddIntervalParameter("Domain", "D", "The domain to evaluate", GH_ParamAccess.item); // 添加区间参数
pManager.AddColourParameter("Cell Color", "C", "The cell highlight color", GH_ParamAccess.item, Sd.Color.LightGray); // 添加颜色参数,默认为浅灰色
pManager[3].Optional = true; // 设置为可选
pManager.AddBooleanParameter("Flip", "F", "If true, non unique values will be highlighted", GH_ParamAccess.item, false); // 添加翻转参数
pManager[4].Optional = true; // 设置为可选
pManager.AddBooleanParameter("Clear", "_X", "If true, the existing conditions will be cleared", GH_ParamAccess.item, false); // 添加清除条件参数
pManager[5].Optional = true; // 设置为可选
pManager.AddBooleanParameter("Activate", "_A", "If true, the condition will be applied", GH_ParamAccess.item, false); // 添加激活条件参数
pManager[6].Optional = true; // 设置为可选
}
/// <summary>
/// 注册所有输出参数
/// </summary>
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
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; // 如果之前没有获取到工作表,从范围中获取
Interval interval = new Interval();
if (!DA.GetData(2, ref interval)) return; // 获取区间数据
Sd.Color color = Sd.Color.LightGray;
DA.GetData(3, ref color); // 获取颜色数据
bool flip = false;
DA.GetData(4, ref flip); // 获取是否翻转
bool clear = false;
DA.GetData(5, ref clear); // 获取是否清除现有条件
bool activate = false;
DA.GetData(6, ref activate); // 获取是否激活条件
if (activate)
{
if (clear) range.ClearConditions(); // 如果需要清除,则清除现有条件
range.AddConditionalBetween(interval.Min, interval.Max, color, flip); // 添加条件格式
}
DA.SetData(0, range); // 设置输出数据
}
/// <summary>
/// 提供组件的图标
/// </summary>
protected override System.Drawing.Bitmap Icon
{
get
{
// 你可以将图像文件添加到项目资源中并像这样访问它们:
// return Resources.IconForThisComponent;
return Properties.Resources.BB_Cond_Between_01;
}
}
/// <summary>
/// 获取此组件的唯一 ID。发布后不要更改此 ID。
/// </summary>
public override Guid ComponentGuid
{
get { return new Guid("bd35ec14-ab24-4bbf-99ae-38ccc3d4a6da"); }
}
}
}