先建立整体图景:卡片和数据流怎么运作、为什么值得二次开发。
遇到特殊的计算逻辑、专属的数据处理,找不到对应卡片就卡住。
把自己的算法封装成卡片,像积木一样复用到任意工作流中。
麻雀虽小五脏俱全 —— 走通这一张卡片,你就掌握了所有自定义卡片的骨架。
看清“自定义卡片到底是什么”:一个类库、两个依赖、四个抽象成员、一套加载机制。
跟着一步步敲代码:新建项目 → 加引用 → 继承实现 → 写核心逻辑。
using ProjectPenguin.Cards;
public class Class1 : ProcessorCardBase
{
public Class1() : base(
"基本名称", // 画布中显示
"缩写", // 太长时用
"描述信息", // 悬停提示
"大类", // 分类
"子类")
{
}
}
public override Guid
CardGuid =>
Guid.Parse(
"{95FAD3CB-…}");
helper. AddWellKnownType OfDataCard( typeof(string), "出口","出口", "描述…", DataProcessingMode .OneByOne);
public override
void Build(
IDataDelivery idd)
{
idd.SetDataItem(
0,
"Hello, world!");
}
Copy "$(TargetPath)" "C:\Users\<用户名>\AppData\Roaming \nonstructure\Penguin\Cards\<你的工程名>.crd"
看到输出的这一刻,你已经完整走通了自定义卡片的全流程。
DataProcessingMode.OneByOne 是什么含义?多端口如何编号?
关注官方公众号与《二次开发指南》,加入交流群一起玩。
F:\repos\GamaCardDemo\
├─ GamaCardDemo.csproj SDK · net472
├─ TwoNumberAdditionCard.cs 卡片类
└─ bin\Debug\
└─ GamaCardDemo.dll 编译产物
%AppData%\nonstructure\Penguin\Cards\
└─ GamaCardDemo.crd 生成后自动复制
using System;
using ProjectPenguin.Cards;
using ProjectPenguin.Cards.Enums;
using ProjectPenguin.Cards.ProcessorCardHelpers;
namespace GamaCardDemo;
public class TwoNumberAdditionCard : ProcessorCardBase
{
public TwoNumberAdditionCard()
: base("两数相加","相加","计算 A + B","数学","数学运算符") { }
public override string EnglishAlias => "Add Two Numbers";
private static readonly Guid sc_guid =
Guid.Parse("{344AD618-F33D-48C4-8E77-68B8BA49383C}");
public override Guid CardGuid => sc_guid;
protected override void AddInputSideDataCards(IDataCardEmbedmentHelper h) {
h.AddWellKnownTypeOfDataCard(typeof(double),"第一个数","A","加数A",DataProcessingMode.OneByOne);
h.AddWellKnownTypeOfDataCard(typeof(double),"第二个数","B","加数B",DataProcessingMode.OneByOne);
}
protected override void AddOutputSideDataCards(IDataCardEmbedmentHelper h) {
h.AddWellKnownTypeOfDataCard(typeof(double),"结果","结果","A + B",DataProcessingMode.OneByOne);
}
public override void Build(IDataDelivery idd) {
double a = 0, b = 0;
if (!idd.GetDataItem(0, ref a)) return;
if (!idd.GetDataItem(1, ref b)) return;
idd.SetDataItem(0, a + b);
}
}