InExcludeData - Crash Problem

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/12/2007 at 15:11, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   10.111 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hi,

in my expression tag, I use an InExcludeList Element to get a list of objects from the user. But I have some problems...

In the Execute() function, I do the following:

1. Get the List of objects that are linked in the InExclude box:

> _
> GeData      myList;
> tag->GetParameter(DescID(SCOOBYCAMEXP_LIST), myList, NULL);
> InExcludeData* SC_List = static_cast<InExcludeData*>(myList.GetCustomDataType(CUSTOMDATATYPE_INEXCLUDE_LIST));
> _

2. Get the number of linked objects:

> _
> LONG      ListCount = SC_List->GetObjectCount();
> _

But the value that is returned, is not always correct. For example, I have linked 6 objects in the list, it returns 6. But when I delete some of those objects from the scene (without removing them from the InExclude box first) it still returns 6.

I only want my calculations to be performed if there are at least 2 objects linked in the list. But because of the problem described above, the following code does not work:

> _
> if (ListCount > 1)
> {
> GePrint("Hello World");
> }
> _

It always prints "Hello World", even if there is only 1 or even 0 objects in the list.

What can I do? Is there some way to refresh the InExclude box? Do I have to free myList or SC_List at the end of the Execute() function? How would that work?

Best regards & big thanks for any help,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/12/2007 at 15:20, xxxxxxxx wrote:

Since InExcludeData accepts pointers deleting the actual object doesn't remove the pointer from the InExcludeData object.

Hope i'm not way off here, i didn't actually test this :>

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/12/2007 at 16:57, xxxxxxxx wrote:

So what's best to do?

Maybe iterating all items in the list, checking if there's a real object in it, and remove the item from the list if it's not?

There must be an easier way, I can't believe they let all developers write this function themselves. That would be nasty ;-)

Greetings,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/12/2007 at 17:15, xxxxxxxx wrote:

There's nothing mentioned on pointers being deleted if there is no object, so i wouldn't think there is any way around this except removing them manually. I don't think those few extra lines of code would hurt you too much though.

I hope someone with more experience with this will give you a better solution...

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 27/12/2007 at 03:23, xxxxxxxx wrote:

OK, now I get the ObjectCount from a separate function that first checks all object pointers in the list, and removes the invalid ones.

But that means, this function is called every frame. Is there any function I could use instead of the Execute() so my function is only called when the user really *does* something in the ObjectManager ?

Greetings,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 27/12/2007 at 04:11, xxxxxxxx wrote:

I'd use

> virtual Bool Message(GeListNode* node, LONG type, void* data)

you have tons of types of messages, just check the sdk for the one that suites you best

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 28/12/2007 at 09:44, xxxxxxxx wrote:

Simply try direct container access. The list updates itself automatically:

(InExcludeData* )tag->GetDataInstance()->GetCustomDataType(SCOOBYCAMEXP_LIST, CUSTOMDATATYPE_INEXCLUDE_LIST);