最近在研究C4D 插件的编写,发现相关文档非常少,先记录下以备将来需要,也会详细讲解下代码
前提须知
可观看我的C4D S26 C++ 插件编写–批量生成点阵球,完成项目的创建
链接: 批量生成点阵球
官网以及官方C++ SDK文档
https://developers.maxon.net/docs/cpp/2024_2_0/
https://developers.maxon.net/
建立项目后,编写插件中的点击按钮触发事件
在CreateLayout()函数中,先编写界面
TabGroupBegin(IDC_DYMAMIC_GADGET + 4, BFH_LEFT | BFH_RIGHT, TAB_NOSELECT);
GroupBegin(GUIlist + 5, BFH_SCALEFIT | BFV_SCALEFIT, 4, 0, "Setup Wirecolor"_s, BFV_BORDERGROUP_FOLD, 0, 0); //设置表面颜色
{
GroupBorderSpace(5, 5, 5, 5); //边距
GroupBorder(BORDER_OUT2); //边框属性 BORDER_GROUP_IN
AddStaticText(IDC_MESSAGE_FRAME, BFH_RIGHT, 0, 0, "Frame At : "_s, 0);
AddEditNumberArrows(IDC_SPINBOX_FRAME, BFH_LEFT, 100, 1);
AddStaticText(IDC_MESSAGE_COLOUR, BFH_RIGHT, 0, 0, "Color : "_s, 0);
AddColorField(IDC_GADGET, BFV_SCALE | BFV_FIT, 150, 20, DR_COLORFIELD_ICC_BASEDOC);
AddStaticText(IDC_MESSAGE_SPACE, BFH_RIGHT, 80, 20, " "_s, 0);
AddStaticText(IDC_MESSAGE_SPACE, BFH_RIGHT, 80, 20, " "_s, 0);
AddButton(IDC_BUTTON_COLOUR, BFH_CENTER, 100, 20, "Setup"_s);
}
GroupEnd();
GroupEnd();
下面是一些 关键代码
BaseDocument* doc = GetActiveDocument(); //获得场景
const Int32 fps = doc->GetFps(); //获取当前的FPS
BaseTime keyTime = BaseTime(0, fps); //设置位置,当前是从0开始
SetViewColor(VIEWCOLOR_SHADEDWIRE, _myProprietaryColor); //着色线框颜色
GetActiveDocument()->GetActiveObjects(selection, GETACTIVEOBJECTFLAGS::NONE);//获得选中的所有球
具体相关代码
获得控件值
Float brightness;
Int32 cend;
ObjectColorProperties objColor;
Vector _myProprietaryColor;
GetColorField(IDC_GADGET, _myProprietaryColor, brightness);
GetInt32(IDC_SPINBOX_FRAME, cend);
设置颜色并打关键帧
Bool FirstDialog::Command(Int32 id, const BaseContainer& msg) //点击界面就会触发
{
switch (id)
{
.........
case IDC_BUTTON_COLOUR: //设置表明颜色
{
AutoAlloc<AtomArray> selection;
BaseObject* activeObject = nullptr;
const DescID id_RGB = DescID(DescLevel(ID_BASEOBJECT_COLOR, DTYPE_COLOR, 0));
GetActiveDocument()->GetActiveObjects(selection, GETACTIVEOBJECTFLAGS::NONE);//获得选中的所有球
BaseDocument* doc = GetActiveDocument();
const Int32 fps = doc->GetFps();
BaseTime keyTime = BaseTime(cend, fps);
SetViewColor(VIEWCOLOR_SHADEDWIRE, _myProprietaryColor); //着色线框颜色
if (selection->GetCount() <= 0)
{
const maxon::String errString = "No selected"_s;
::MessageDialog(errString);
break;
}
for (Int32 a = 0; a < selection->GetCount(); ++a)//遍历选中的球
{
activeObject = static_cast<BaseObject*>(selection->GetIndex(a));
objColor.usecolor = ID_BASEOBJECT_USECOLOR_ALWAYS;
objColor.color = _myProprietaryColor;
objColor.xray = false;
activeObject->SetColorProperties(&objColor);
CTrack* tracks = activeObject->FindCTrack(id_RGB);//找到颜色轨道
if (tracks == nullptr)
{
tracks = CTrack::Alloc(activeObject, id_RGB);
if (tracks == nullptr) //创建失败
break;
activeObject->InsertTrackSorted(tracks);
}
CCurve* const curves = tracks->GetCurve();//找到轨道里的颜色曲线
if (curves == nullptr)
break;
createkayRGB(curves, keyTime, GeData{ _myProprietaryColor });//给颜色曲线打关键帧
}
}
}
return true;
}
//打关键帧
void createkayRGB(CCurve* curve, BaseTime keyTime, GeData value)
{
CKey* key = curve->AddKey(keyTime, nullptr);
if (key == nullptr)
return;
key->SetGeData(curve, value);
}
建议观看完《批量生成点阵球再来学习》