how to use DESC_ACCEPT / DESC_REFUSE [SOLVED]
-
On 23/05/2015 at 22:18, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 15+
Platform: Windows ;
Language(s) : C++ ;---------
I'm creating a link box dynamically, inside a tag, in GetDDescription()cid = DescLevel(MATERIAL_LINK, DTYPE_BASELISTLINK, 0); if (!singleid || cid.IsPartOf(*singleid, nullptr)) // important to check for speedup c4d! { BaseContainer slink = GetCustomDataTypeDefault(DTYPE_BASELISTLINK); slink.SetString(DESC_SHORT_NAME, "Material"); slink.SetString(DESC_NAME, "Material"); slink.SetContainer(DESC_ACCEPT, MY_MATERIAL_PLUGIN_ID); if (!description->SetParameter(cid, slink, DescLevel(TAG_GROUP))) return true; }
I want to accept only my MaterialData plugin.
-
On 24/05/2015 at 10:41, xxxxxxxx wrote:
There seems to be some confusion about them and not much information.
https://developers.maxon.net/forum/topic/2094/1444_descrefuse--descaccept&KW=DESC_ACCEPT
If you can't get it working, another approach is to check for the MSG_DESCRIPTION_CHECKDRAGANDDROP message. There you can accept/refuse programmatically:
// NodeData.Message //*---------------------------------------------------------------------------* Bool GCBInfoTag::Message(GeListNode* node, LONG type, void* data) //*---------------------------------------------------------------------------* { if (!node) return FALSE; if (type == MSG_DESCRIPTION_CHECKDRAGANDDROP) return MsgCheckDragAndDrop(static_cast<DescriptionCheckDragAndDrop*>(data), static_cast<BaseTag*>(node)); return SUPER::Message(node,type,data); } // GCBInfoTag.MsgCheckDragAndDrop - Message MSG_DESCRIPTION_CHECKDRAGANDDROP //*---------------------------------------------------------------------------* Bool GCBInfoTag::MsgCheckDragAndDrop(DescriptionCheckDragAndDrop* dcdd, BaseTag* tag) //*---------------------------------------------------------------------------* { // Accept/Decline if (!dcdd) return TRUE; // GreeblerObj/Tag LinkBox if (dcdd->id[0].id == TGCBINFO_LINK) { BaseObject* orig = tag->GetObject(); if (!orig) return FALSE; BaseList2D* element = static_cast<BaseList2D*>(dcdd->element); if (!element) return FALSE; // ---------- Must be GreeblerObject or GreeblerTag dcdd->result = element->IsInstanceOf(ID_GREEBLEROBJ) || element->IsInstanceOf(ID_GREEBLERTAG); } return TRUE; }
-
On 25/05/2015 at 03:59, xxxxxxxx wrote:
Hi Mohamed,
Originally posted by xxxxxxxx
slink.SetContainer(DESC_ACCEPT, MY_MATERIAL_PLUGIN_ID);
A container isn't set there as MY_MATERIAL_PLUGIN_ID seems to be an integer value.
Here's how you can simply set the DESC_ACCEPT container:BaseContainer accept; accept.SetInt32(MY_MATERIAL_PLUGIN_ID, 1); slink.SetContainer(DESC_ACCEPT, ac);
-
On 25/05/2015 at 07:50, xxxxxxxx wrote:
thanks Robert, and Yannick, this is quite simple and straight forward "I encourage to put this example in the SDK documentation".
-
On 25/05/2015 at 08:25, xxxxxxxx wrote:
Originally posted by xxxxxxxx
I encourage to put this example in the SDK documentation.
That's a good idea. I'll add a short code snippet to DESC_ACCEPT and DESC_REFUSE.