Solved CustomGui and CustomDataType examples... not used anywhere?

Hi,

it's nice to have the examples for CustomGuis and CustomDataTypes in the SDK in customdata_customgui.cpp. But how is it actually used? Is there any example code of how to use this in e.g. an ObjectData? You know, set data, get data, et cetera.

I know how to use CustomDataTypes in general, but what about one that's not from the API? Last time I did that was 10+ years ago, and I can't remember.

This did not work:

In the .res file:

DOTS OTEST_DOTS  { }

Code in the object plugin:

iCustomDataTypeDots* dotsData = (iCustomDataTypeDots*)bc->GetCustomDataType(OTEST_DOTS, ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS);
const maxon::Int count = dotsData->_points.GetCount();

Thanks in advance!

Cheers,
Frank

www.frankwilleke.de
Only asking personal code questions here.

hi,

what is not working? including the DOTS in the resource file or the code?

I did try updating the objectdata_description plugin to make it work with this custom data example.
I didn't try using "DOTS" on a .res file.

Remember that the data could not be stored inside the basecontainer. It is better to use GetParameter and SetParameter

Setting parameter can be done like this :

GeData dotData = GeData(ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS, DEFAULTVALUE);
iCustomDataTypeDots* dotDataP = (iCustomDataTypeDots*)dotData.GetCustomDataType(ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS);

	if (dotDataP)
	{
		iferr (dotDataP->_points.Append(Vector(3, 1, 0)))
		{
			break;
		}

	}
	node->SetParameter(DescID(ID_DYNAMIC_ELEMENT + DESCRIPTIONELEMENTS::DOTDATA), dotData, DESCFLAGS_SET::NONE);

getting data is pretty simple:

const Bool success = node->GetParameter(DescID(ID_DYNAMIC_ELEMENT + DESCRIPTIONELEMENTS::DOTDATA), data, DESCFLAGS_GET::NONE);

	// check type
	if (success && data.GetType() == ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS)
	{
			
		iCustomDataTypeDots* dotDataP = (iCustomDataTypeDots*)data.GetCustomDataType(ID_SDK_EXAMPLE_CUSTOMDATATYPE_DOTS);
		if (dotDataP)
		{
			const Int32 pointCount = dotDataP->_points.GetCount();
			String result = FormatString("Number of data stored @", pointCount);
			node->SetParameter(DescID(ID_RESULT_TEXT), result, DESCFLAGS_SET::NONE);
		}
	}

cheers,
Manuel

MAXON SDK Specialist

MAXON Registered Developer

Hi Manuel,

ah, this works! With the code I posted, I got crashes when trying to access any members of dotDataP. I guess, that was because I didn't properly initialize it.

Thanks!

Cheers,
Frank

www.frankwilleke.de
Only asking personal code questions here.

Hi again,

sorry for setting this to "unsolved" again.

I could not find the changes to objectdata_description you mentioned on GitHub. Therefore, I'm writing here again.

I have one last remaining problem in CustomDataTypeClass::CopyData(): The call const iCustomDataTypeDots* const s = static_cast<const iCustomDataTypeDots*>(src); always returns the data I have set in my ObjectData's Init() function. For some reason, the new data is not carried over.

Are there some typical stumblestones that may lead to this problem?

Cheers,
Frank

www.frankwilleke.de
Only asking personal code questions here.

I've set it back to SOLVED again.

Just a hint for anyone else who might run into a similar problem: Make sure your CustomDataTypeClass::Compare() impementation does not falsely return 0 under certain conditions.

The SDK example goes the easy route: It even says in the comments: "this just compares the number of points ... a better implementation would also compare the values of the points". What would be a good way to compare arbitrary data like the maxon::BaseArray<Vector> from the SDK example, and assign the "1" or "-1" results?

Sometimes, the data isn't less or greater, sometimes it's just different.

Cheers,
Frank

www.frankwilleke.de
Only asking personal code questions here.

hi,

sorry i didn't had time to investigate yesterday. I'm happy that you find out the solution.

Cheers,
Manuel

MAXON SDK Specialist

MAXON Registered Developer