Analasying type of an object. Faster way?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 05/01/2008 at 18:27, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 10.5
Platform:
Language(s) : C.O.F.F.E.E ;---------
Hi,I have a function which should only be executed if a Polygonobject or a Primitive (Cube, sphere, cyl, ...) is selected.
So I created another function which analyses an object. Here it is:
> _
> AnalyseObject( obj ) {
> var arr = new(array, 17);
>
> arr[0] = 5159; // Cube
> arr[1] = 5160; // Sphere
> arr[2] = 5162; // Cone
> arr[3] = 5170; // Cylinder
> arr[4] = 5174; // Polygon
> arr[5] = 5168; // Plane
> arr[6] = 5164; // ...
> arr[7] = 5167;
> arr[8] = 5171;
> arr[9] = 5172;
> arr[10] = 5161;
> arr[11] = 5163;
> arr[12] = 5165;
> arr[13] = 5169;
> arr[14] = 5166;
> arr[15] = 5173;
> arr[16] = 5100; // PolygoneObject
>
> var i = 0;
> while (i < 17) {
> if (arr _== obj- >GetType()) return obj;
> i++;
> }
> println("NOT WHAT I WANT");
> return NULL;
> }
> _Now my question: Isn't there a faster way in COFFEE?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 05/01/2008 at 18:36, xxxxxxxx wrote:
I think that's about it. There is no general categorization of object types (say, to see if an object is a primitive type). You can't even use class derivation to check a general category, say, of your own plugin objects all derived from your base plugin object:
class MyPluginObject : ObjectData {} // ID_MYPLUGINOBJECT
class DerivedObj1 : MyPluginObject {} // ID_DERIVEDOBJ1
class DerivedObj2 : MyPluginObject {} // ID_DERIVEDOBJ2
etc.To check if the object is any of these, you can't check:
if (obj->IsInstanceOf(ID_MYPLUGINOBJECT)) ...
or even
if (obj->IsInstanceOf(Obase)) // surprise, your object isn't an object!
This will fail for DerivedObj1 and DerivedObj2 - sad huh? So, you have to check for each case individually:
if (obj->IsInstanceOf(ID_DERIVEDOBJ1) || obj->IsInstanceOf(ID_DERIVEDOBJ2) || etc.) ...
This may be C++ but the situation is the same with COFFEE. Unfortunately, the way that C4D instances work, using C++ class derivation tactics can't be employed.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/01/2008 at 04:54, xxxxxxxx wrote:
Oh, ok, yes this is sad...
What would be a better approach? Iterrating through an array like in my example (supposing the array is already full), or writing all in a single if condition? Would there be a speed gain with the 'if'?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/01/2008 at 05:55, xxxxxxxx wrote:
Quote: _What would be a better approach? Iterrating through an array like in my example (supposing the array is already full), or writing all in a single if condition? Would there be a speed gain with the 'if'?
>
> * * *
_
Just use the switch statement and GetType(). Little example:
> _
> var type = op- >GetType();
>
> switch(type)
> {
> case Opolygon:
> println("polygon");
> break;
> case Ocube:
> println("cube");
> break;
> default:
> println("none of these");
> break;
> }
> _cheers,
Matthias -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/01/2008 at 09:00, xxxxxxxx wrote:
I agree with Matthias that this is the best way to go. Simply replace the array/loop with the switch in your AnalyzeObject() method.
The 'Oxxxx' types are delineated in the coffeesymbols.h file
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 06/01/2008 at 18:07, xxxxxxxx wrote:
Ok, thank you. I'm going to take a look into the coffeesymbols.h file.