@ferdinand Thanks for the response.
That's what I was afraid the situation would be, I believe I have a work around that will be able to fulfill what I need it to do.
John Thomas
@ferdinand Thanks for the response.
That's what I was afraid the situation would be, I believe I have a work around that will be able to fulfill what I need it to do.
John Thomas
Hello,
I am working on a FieldObject plugin that I am registering with RegisterFieldPlugin. My FieldObject is meant to be getting data from a linked object in its UI and then using the passed data to calculate the values for Sample.
My issue is coming in that when I make a change to the linked object it is not being reflected in the FieldObject. This issue seems to stem from the fact that the FieldObject is running its code prior to the change in the linked object being reflected. So instead of the FieldObject having fresh values it referencing the previous data.
Visualized this is what seems to be happening.
FieldObject runs its Sample
Linked Object updates its data
and I am looking to have the reverse order happen. This happens regardless of the order of the objects in the Object Manager.
Is it possible to have an object in the scene update before the FieldObject is called? In the sdk is there an example of the order in which Cinema will call things to be updated in the hierarchy.
Any help would be greatly appreciated.
John Thomas
Hello,
I'm working on a tag plugin that is using positional data of an object to drive parameters. This is simple and straightforward so it is working properly using the code below inside of the Execute function to drive the Radius value of a sphere object.
EXECUTIONRESULT TagParamRun::Execute(BaseTag* tag, BaseDocument* doc, BaseObject* op, BaseThread* bt, Int32 priority, EXECUTIONFLAGS flags)
{
if (tag->GetObject())
{
BaseObject* parentObj = tag->GetObject();
if (parentObj->GetType() == Osphere)
{
ApplicationOutput("Parent object " + parentObj->GetName());
Matrix sphereMat = parentObj->GetMg();
Vector spherePos = sphereMat.off;
Vector centerPos = Vector(0);
Float distance = sqrt(pow(spherePos.x - centerPos.x, 2) + pow(spherePos.y - centerPos.y, 2) + pow(spherePos.z - centerPos.z, 2));
GeData setData;
distance = distance / 2;
if (distance > 50)
distance = 50;
setData.SetFloat(100 - distance);
parentObj->SetParameter(ConstDescID(DescLevel(PRIM_SPHERE_RAD)), setData, DESCFLAGS_SET::NONE);
}
}
return EXECUTIONRESULT::OK;
}
My issue comes in when I have the object with my tag under a Cloner. As I drag the tag's object around the scene all of the cloned spheres are changing their radius based on that single object instead of their cloned positions. Shown below.
If I make the cloner edititable then the setup is working as I would expect.
Is there a way to make it so that my tag is running after the Cloner has run? In this case 9 separate spheres with attached tags running on their own positions.
Any help would be greatly appreciated.
John Thomas
@i_mazlov Thanks for the response.
I tried utilizing the code and I am not getting any response when I try running it.
John Thomas
Any ideas, my GetDParameter is defined with this code.
Bool ExampleFieldLayer::GetDParameter(const GeListNode* node, const DescID& id, GeData& t_data, DESCFLAGS_GET& flags) const
{
Int32 ID = id[0].id;
if (ID == 1006)
{
Int32 dirty = 0;
maxon::WeakRawPtr<const GeListNode> weakPtr(node);
if (weakPtr.Get())
{
GeListNode* convert = MAXON_REMOVE_CONST(weakPtr.Get());
BaseList2D* convertObject = static_cast<BaseList2D*>(convert);
BitmapButtonStruct bbs(convertObject, id, dirty);
t_data = GeData(bbs, CUSTOMDATATYPE_BITMAPBUTTON);
flags |= DESCFLAGS_GET::PARAM_GET;
}
}
return SUPER::GetDParameter(node, id, t_data, flags);
}
Thanks for the response. I'll see if this does what I need it to
John Thomas
Thanks for the response.
Going through the code you have the line
assetDescription = repository.FindLatestAsset(maxon.AssetTypes.NodeTemplate(), assetId, maxon.Id(), maxon.ASSET_FIND_MODE.LATEST)
Looking at the sdk the NodeTemplate for AssetTypes first appears in 2024.2. Is there a way to tell if there is a Maxon One asset in 2023 or is this new functionality that isn't possible in older versions?
John Thomas
Thanks for the response.
My SetDParamter function is defined with this code.
Bool ExampleFieldLayer::SetDParameter(GeListNode* node, const DescID& id, const GeData& t_data, DESCFLAGS_SET& flags)
{
switch (id[0].id)
{
case 1006: // ID_EXECUTERUN
{
if (flags & DESCFLAGS_SET::USERINTERACTION)
{
ApplicationOutput("Running SetDParameter");
}
break;
}
}
return SUPER::SetDParameter(node, id, t_data, flags);
}
And at no point am I getting a print from the BitmapButton being pressed.
John Thomas
Hello.
I'm currently trying to create a FieldLayer plugin that is using a resource file for the creation of its description. Everything is working properly with the exception of a BitmapButton that does not seem to be sending any kind of message that it has been pressed.
Here is the line from the resource file that I am creating the BitmapButton.
BITMAPBUTTON ID_EXECUTERUN {BUTTON;}
Inside of Message I Have the MSG_DESCRIPTION_GETBITMAP to set the image for the bitmap.
if (type == MSG_DESCRIPTION_GETBITMAP)
{
DescriptionGetBitmap* dgb = static_cast<DescriptionGetBitmap*>(t_data);
Int32 ID = dgb->_descId[0].id;
AutoAlloc<BaseBitmap> bm;
Filename bg;
if (ID == ID_EXECUTERUN )
{
bg = GeGetPluginPath() + Filename("res") + Filename("Icons") + Filename("Execute.png");
bm->Init(bg);
AutoAlloc<BaseBitmap> bm2;
bm2->Init(bm->GetBw() / 2, bm->GetBh() / 2);
bm->ScaleIt(bm2, 256, TRUE, TRUE);
dgb->_bmp = bm2.Release();
}
}
There was a forum post that was dealing with the same issue, but the solution offered in the post does not seem to be working. I put prints in both the SetDParameter function as well as the MSG_DESCRIPTION_COMMAND message and neither one is ever being printed, all of the other controls I have are working properly.
Is there something fundamental that I'm missing that is preventing it from catching that the button is being pressed?
Any help would be greatly appreciated.
John Thomas