这段代码定义了一个名为 GH_Ex_Ana_CondScale
的类,它是一个 Grasshopper 组件,用于在 Excel 工作表中添加基于相对值的条件格式颜色。以下是该组件的主要功能和介绍:
功能概述:
主要特性:
输入参数:
输出:
使用场景:
这个组件适用于需要在 Excel 中可视化数据分布的情况。例如:
特殊说明:
GH_Ex_Rng__Base
类,可能是一个自定义的基类总的来说,这个组件为用户提供了一种简便的方法来在 Grasshopper 环境中为 Excel 数据添加高级的条件格式,增强了数据的可视化效果和可读性。
这个流程图将展示 GH_Ex_Ana_CondScale
类中 SolveInstance
方法的主要流程。
这个流程图对应到代码中的主要步骤如下:
开始 (Start):SolveInstance
方法开始。
获取工作表和范围 (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;
获取输入参数 (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);
是否激活? (Activate?):
if (activate)
{
// ...
}
是否清除? (Clear?):
if (clear) range.ClearConditions();
是否为三色? (Is three-color?):
if (isThree)
{
range.AddConditionalScale(a,b,c,mid);
}
else
{
range.AddConditionalScale(a, b);
}
设置输出 (Set output):
DA.SetData(0, range);
结束 (End):SolveInstance
方法结束。
这个流程图清晰地展示了 SolveInstance
方法的主要逻辑流程,包括条件判断和主要操作步骤。
public GH_Ex_Ana_CondScale()
: base("Conditional Scale", "Scale",
"Add conditional formatting colors to a Range based on relative values",
Constants.ShortName, Constants.SubAnalysis)
{
}
中文注释:
///
/// 初始化 GH_Ex_Ana_CondScale 类的新实例。
/// 这个构造函数设置了组件的名称、昵称、描述和分类。
///
public GH_Ex_Ana_CondScale()
: base("Conditional Scale", "Scale",
"基于相对值为范围添加条件格式颜色",
Constants.ShortName, Constants.SubAnalysis)
{
}
解释:
这个构造函数初始化了 GH_Ex_Ana_CondScale
类的实例。它调用基类构造函数,设置组件的名称(“Conditional Scale”)、昵称(“Scale”)、描述和分类。这些信息将在 Grasshopper 界面中显示,帮助用户理解组件的功能。
public override GH_Exposure Exposure
{
get { return GH_Exposure.secondary; }
}
中文注释:
///
/// 设置组件的曝光级别。
/// 返回 secondary 表示这是一个次要的或不太常用的组件。
///
public override GH_Exposure Exposure
{
get { return GH_Exposure.secondary; }
}
解释:
这个属性定义了组件在 Grasshopper 界面中的曝光级别。GH_Exposure.secondary
表示这是一个次要的组件,可能不会在主工具栏中直接显示,但可以在子菜单或搜索中找到。
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);
// ... (其他参数注册)
}
中文注释和解释:
///
/// 注册所有输入参数。
/// 这个方法定义了组件接受的所有输入。
///
/// 参数管理器,用于添加和配置输入参数
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);
// ... (添加其他参数,如颜色、清除选项、激活选项等)
}
这个方法注册了组件的所有输入参数。它首先调用基类方法来注册一些基本参数,然后添加特定于这个组件的参数。每个参数都有名称、昵称、描述、访问类型和默认值(如果适用)。
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
base.RegisterOutputParams(pManager);
}
中文注释:
///
/// 注册所有输出参数。
/// 在这个例子中,它只是调用基类方法来注册标准输出。
///
/// 参数管理器,用于添加和配置输出参数
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
base.RegisterOutputParams(pManager);
}
解释:
这个方法注册组件的输出参数。在这个特定的实现中,它只是调用基类方法,这意味着它可能只输出一个标准的 Excel 范围对象。
这是组件的核心方法,执行主要的逻辑。由于这个方法较长,我会分几个部分来解释。
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);
// ... (获取颜色和其他参数)
中文注释和解释:
///
/// 执行组件的主要逻辑。
/// 这个方法获取所有输入数据,处理它们,然后设置输出。
///
/// 数据访问对象,用于获取输入和设置输出
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 范围对象设置为组件的输出。
protected override System.Drawing.Bitmap Icon
{
get
{
return Properties.Resources.BB_Cond_Scale_01;
}
}
中文注释:
///
/// 提供组件的图标。
/// 这个图标将在 Grasshopper 界面中显示。
///
protected override System.Drawing.Bitmap Icon
{
get
{
// 返回预定义的图标资源
return Properties.Resources.BB_Cond_Scale_01;
}
}
这个属性返回组件在 Grasshopper 界面中使用的图标。
public override Guid ComponentGuid
{
get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
}
中文注释:
///
/// 获取此组件的唯一标识符。
/// 这个 GUID 在发布后不应更改,用于识别组件。
///
public override Guid ComponentGuid
{
get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
}
这个属性返回组件的全局唯一标识符(GUID)。每个 Grasshopper 组件都需要一个唯一的 GUID 来区分它们。
总结:
这个类实现了一个 Grasshopper 组件,用于在 Excel 中添加基于相对值的条件格式颜色。它展示了如何创建一个自定义的 Grasshopper 组件,包括设置输入和输出参数、处理数据、应用特定的 Excel 功能,以及提供必要的元数据(如图标和GUID)。这个组件的设计允许用户灵活地应用两色或三色渐变条件格式,为数据可视化提供了强大的工具。
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
{
///
/// GH_Ex_Ana_CondScale 类定义了一个 Grasshopper 组件,
/// 用于在 Excel 范围内添加基于相对值的条件格式颜色。
///
public class GH_Ex_Ana_CondScale : GH_Ex_Rng__Base
{
///
/// 初始化 GH_Ex_Ana_CondScale 类的新实例。
///
public GH_Ex_Ana_CondScale()
: base("Conditional Scale", "Scale",
"Add conditional formatting colors to a Range based on relative values",
Constants.ShortName, Constants.SubAnalysis)
{
}
///
/// 设置组件的曝光级别。
/// GH_Exposure.secondary 表示这是一个次要的或不太常用的组件。
///
public override GH_Exposure Exposure
{
get { return GH_Exposure.secondary; }
}
///
/// 注册所有的输入参数。
///
/// 用于添加和配置输入参数的参数管理器
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;
}
///
/// 注册所有的输出参数。
///
/// 用于添加和配置输出参数的参数管理器
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
// 调用基类方法注册标准输出(通常是修改后的 Excel 范围)
base.RegisterOutputParams(pManager);
}
///
/// 这是执行实际工作的方法。
///
/// 用于检索输入和存储输出的 DA 对象
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);
}
///
/// 提供组件的图标。
///
protected override System.Drawing.Bitmap Icon
{
get
{
// 返回组件的图标
return Properties.Resources.BB_Cond_Scale_01;
}
}
///
/// 获取此组件的唯一 ID。发布后不要更改此 ID。
///
public override Guid ComponentGuid
{
get { return new Guid("7c251907-0e3b-4c57-b948-98ea7c76b68f"); }
}
}
}
这些注释详细解释了代码的每个主要部分,包括:
这种详细的注释不仅有助于理解代码的结构和功能,还为其他开发者提供了有价值的上下文信息。您可以重点解释一些关键概念,如:
努力学习 Grasshopper 插件开发和 Excel 自动化