C4D S26 C++ 插件编写--批量设置颜色并打关键帧

最近在研究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);
}

建议观看完《批量生成点阵球再来学习》

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值