When a C++ custom command returns an array, the value received by the caller depends on the scripting language, and whether a CValueArray or a CRefArray is returned. For example, if a command returns a CValueArray, then a JScript caller gets a safe array, but if a command returns a CRefArray, then a JScript caller gets an XSICollection.
Return Value |
||
---|---|---|
Language |
CRefArray |
CValueArray |
VBScript |
XSICollection |
XSICollection |
JScript |
XSICollection |
safe array |
PerlScript |
XSICollection |
array |
Python |
XSICollection instance |
tuple |
JScript Example: Calling a C++ command that returns an array
// // GetValueArray() is a C++ custom command that returns a CValueArray // var aSafeArray = GetValueArray(); var aVBArray = new VBArray( aSafeArray ); logmessage( typeof( aVBArray ) ); logmessage( aVBArray.dimensions() ); // Access the VBArray directly for (var i=0; i <= aVBArray.ubound(1); i++) { Application.LogMessage( aVBArray.getItem(i).fullname ); } // Convert the VBArray to a JScript array var aJSarray = aVBArray.toArray(); for (e=new Enumerator(aJSarray);!e.atEnd();e.moveNext()) { var o = e.item(); logmessage( o.fullname ); } // // GetRefArray() is a C++ custom command that returns a CRefArray // var objects = GetRefArray(); logmessage( objects.type ); //INFO : XSICollection for (e=new Enumerator(objects);!e.atEnd();e.moveNext()) { var o = e.item(); Application.LogMessage( o.fullname ); }
Python Example: Calling a C++ command that returns an array
# # GetValueArray is a C++ custom command that returns a CValueArray # objects = Application.GetValueArray() Application.Logmessage( unicode(type(objects)) )#INFO : <type 'tuple'> for o in objects: Application.LogMessage( o.name ) Application.Logmessage( unicode(type(o)) )#INFO : <type 'instance'> Application.LogMessage( Application.classname(o) ) # # GetRefArray is a C++ custom command that returns a CRefArray # objects = Application.GetRefArray() Application.Logmessage( unicode(type(objects)) )#INFO : <type 'instance'> Application.Logmessage( objects.type )# XSICollection for o in objects: Application.LogMessage(o.name) for i in range(objects.Count): Application.LogMessage(objects(i).FullName)
VBScript Example: Calling a C++ command that returns an array
' ' GetValueArray() returns a CValueArray ' set objects = GetValueArray() logmessage( typename( objects ) )'INFO : Object logmessage( objects.type )'INFO : XSICollection for each o in objects logmessage o.name next ' ' GetRefArray() returns a CRefArray ' set objects = GetRefArray() logmessage typename( objects )'INFO : Object logmessage( objects.type )'INFO : XSICollection for each o in objects logmessage o.name next
PerlScript Example: Calling a C++ command that returns an array
# # GetRefArray() returns a CRefArray # # scalar context my $objects = GetRefArray(); $Application->LogMessage( $objects->Type );#INFO : XSICollection for $i (0..$objects->Count-1) { $o = $objects->Item($i); $Application->LogMessage( $o->IsKindOf("polymsh") ); $Application->LogMessage( $o->{'FullName'} ); } # list context my @objects = GetRefArray(); $Application->logmessage( $objects[0]->Type ); #INFO : XSICollection for $i (0..$objects[0]->Count-1) { $o = $objects[0]->Item($i); $Application->LogMessage( $o->IsKindOf("polymsh") ); $Application->LogMessage( $o->{'FullName'} ); } # # Test() returns a CValueArray # # list context my @test = Test(); $Application->LogMessage( ref( $test[0] ) ); #INFO : ARRAY for $o (@{$test[0]}) { $Application->LogMessage( $o->FullName ); } # scalar context my $test = Test(); $Application->LogMessage( ref( $test ) ); #INFO : ARRAY for $o (@{$test}) { $Application->LogMessage( ref( $o ) ); #INFO : Win32::OLE $Application->LogMessage( $o->FullName ); }