Custom data+gui access with GetParameter()
-
Hello,
I have a custom data type for some time, and it works fine, without any GUI. I use it only to store data.
Now I made a custom GUI, based on the DOTS example, and seems to work well. The GUI sets the data, I save the scene and when loaded it correctly displays the stored data.But, when I try to access my custom data using
GetParameter()
, it's always empty.
I rarely use the object's container to access data, took me some time to figure out the data was hidden there, but I don't understand whyGetParameter()
can't access it.To check if I was doing something wrong, I added a
DOTS
parameter to my object, and the same happens with it. The code below is inside a Generator'sGetVirtualObjects()
, we can clearly see the difference.// With GetParameter() the dots array is always empty GeData dotsData; DescID desc( DescLevel( ID_USERDATA, DTYPE_SUBCONTAINER, 0 ), DescLevel( my_DOTS_parmeter, ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS, 0 ) ); op->GetParameter( desc, dotsData, DESCFLAGS_GET_0 ); auto dots = static_cast<iCustomDataTypeDots*>( dotsData.GetCustomDataType( ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS ) ); ApplicationOutput( "Dots GetParameter() size = " + String::IntToString( dots ? dots->_points.GetCount() : -1 ) ); // But the BaseContainer has it all... auto bc = op->GetDataInstance(); dots = static_cast<iCustomDataTypeDots*>( bc->GetData( my_DOTS_parmeter ).GetCustomDataType( ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS ) ); ApplicationOutput( "Dots BaseContainer size = " + String::IntToString( dots ? dots->_points.GetCount() : -1 ) );
Is that a limitation?
How do I make the data available fromGetParameter()
? -
No idea why it does not work out of the box.
But you could implement NodeData::GetDParameter() to see if something weird happens there and to set the value yourself.
Edit: I just tested the scenario in R20 and with
RoundedTube
and everything seems to work fine. -
hi,
I confirm what @PluginStudent said. If you call
GetParameter
, it will end in theGetDParameter
of the object if implemented or in NodeData::GetDParameter() witch by default do nothing and return true. That's why your always retrieve an empty data.Don't forget to initialise your data or to take that into account in the
GetDParameter
functionCheers,
Manuel -
@m_magalhaes But
GetParameter()
does work for this custom type, when I'm not using a custom GUI.
ALONG
parameter with custom GUI also works withGetParameter()
.
Sounds like the combination Custom type + Custom GUI is missing something to haveGetParameter()
out of the box.
ButSPLINE
for example, is both custom type and custom GUI, and I can access withGetParameter()
.
Ain't nothing missing onCustomGuiData
,iCustomGui
,CustomDataTypeClass
oriCustomDataType
to make it work?I understand how I can make it work with
GetDParameter()
, but it feels unnecessary, any object that needs it will have that same pasted code. -
hi,
after another look at it, the function will check the BaseContainer. If you Init the
BaseContainer
you don't even need theGetDParameter
function.AutoAlloc<iCustomDataTypeDots> data; BaseContainer* bc = ((BaseList2D*)node)->GetDataInstance(); bc->SetData(5000, GeData(ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS, data));
So yes, something is kind of missing, i need to figure this out. I need to dive to the code a bit. I didn't want to wait too much before giving you some feedback.
Cheers,
Manuel -
@m_magalhaes No hurry, for now there's just one place where I need this, I get it using the BaseContainer. But I will probably use it more often, so if the DOTS example is updated I can replicate the solution to my own type and remove this workaround.
Thanks!