
import c4d
from c4d import gui# 定义常量用于 UI 元素的 ID
GROUP_ID = 1
LABEL_INPUT_ID = 1002
SEARCH_BY_LABEL_BUTTON_ID = 1005
ADD_BUTTON_ID = 1001
REMOVE_BUTTON_ID = 1003
TAG_INPUT_ID = 1004
StaticText_ID = 101
StaticText1_ID = 102
StaticText2_ID = 103
StaticText3_ID = 104
Blank_TEXT_ID = 100
SUFFIX_INPUT_ID = 1006 # 新的自定义后缀文本框 ID
Set_TagName_BUTTON_ID = 1007class CombinedDialog(gui.GeDialog):def CreateLayout(self):self.SetTitle("批量创建等于物体名的Tag工具")self.GroupBegin(GROUP_ID, c4d.BFH_LEFT | c4d.BFV_TOP, cols=3, rows=2)self.AddStaticText(StaticText_ID, c4d.BFH_CENTER, name="Tag>Basic>name>标签名称:")self.AddEditText(LABEL_INPUT_ID, c4d.BFH_CENTER, 200, 15)self.AddButton(SEARCH_BY_LABEL_BUTTON_ID, c4d.BFH_CENTER, 200, 15, name="通过标签名找标签常量名")self.AddStaticText(StaticText1_ID, c4d.BFH_LEFT, name="console里反馈的标签常量名")self.AddEditText(TAG_INPUT_ID, c4d.BFH_LEFT, 200, 15)self.AddStaticText(StaticText2_ID, c4d.BFH_LEFT, name="添加自定义后缀文本框")self.AddEditText(SUFFIX_INPUT_ID, c4d.BFH_LEFT, 200, 15) # 添加自定义后缀文本框self.AddButton(ADD_BUTTON_ID, c4d.BFH_LEFT, 100, 15, "批量添加")self.AddStaticText(StaticText3_ID, c4d.BFH_LEFT, name="tag名等于物体名+后缀")self.AddStaticText(Blank_TEXT_ID, c4d.BFH_LEFT, name="")self.AddButton(REMOVE_BUTTON_ID, c4d.BFH_LEFT, 100, 15, "批量移除")self.AddButton(Set_TagName_BUTTON_ID, c4d.BFH_LEFT, 100, 15, "批量命名Tag")self.GroupEnd()return Truedef Command(self, id, msg):if id == SEARCH_BY_LABEL_BUTTON_ID:self.search_by_label()elif id == ADD_BUTTON_ID:self.add_tag()elif id == REMOVE_BUTTON_ID:self.remove_tag()elif id == Set_TagName_BUTTON_ID:self.set_sel_label_name()return Truedef search_by_label(self):label_name = self.GetString(LABEL_INPUT_ID)constant_name = find_constant_by_label_name(label_name)if constant_name:print(f"对应的常量为:{constant_name}")else:print("未找到对应的常量。")def add_tag(self):doc = c4d.documents.GetActiveDocument()selections = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)tag_type_str = self.GetString(TAG_INPUT_ID)if not tag_type_str:print("请输入常量名。")returnconstant_value = getattr(c4d, tag_type_str)suffix = self.GetString(SUFFIX_INPUT_ID) # 获取自定义后缀文本框的值if not selections:print("请选择一个或多个物体")for obj in selections:new_tag = obj.MakeTag(constant_value)if new_tag:new_tag.SetName(obj.GetName() + suffix)c4d.EventAdd()def remove_tag(self):doc = c4d.documents.GetActiveDocument()selections = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)if not selections:print("请选择一个或多个物体。")returntag_type_str = self.GetString(TAG_INPUT_ID)constant_value = getattr(c4d, tag_type_str)for obj in selections:tags = obj.GetTags()for tag in tags:if tag.GetType() == constant_value:tag.Remove()c4d.EventAdd()def set_sel_label_name(self):doc = c4d.documents.GetActiveDocument()selection = doc.GetSelection()suffix = self.GetString(SUFFIX_INPUT_ID) # 获取自定义后缀文本框的值index=1for element in selection:if isinstance(element, c4d.BaseTag):new_name = suffixelement.SetName(new_name+"_"+str(index)) index+=1c4d.EventAdd()def find_constant_by_label_name(label_name):for attr_name in dir(c4d):attr_value = getattr(c4d, attr_name)if isinstance(attr_value, int):try:tag_name = c4d.GetTagName(attr_value)if tag_name == label_name:return attr_nameexcept:passreturn Noneif __name__ == '__main__':dialog = CombinedDialog()dialog.Open(c4d.DLG_TYPE_ASYNC, xpos=100, ypos=100, defaultw=300, defaulth=150)