sdaiGetAttr

valueType argument to specify what type of data caller wants to get and value argument where the caller should provide a buffer, and the function will write the result to. Table 1 shows type of buffer the caller should provide depending on the valueType for sdaiGetAttr, and it works similarly for all get-functions. Note: with SDAI API it is impossible to check buffer type at compilation or execution time and this is responsibility of a caller to ensure that requested valueType is matching with the value argument, a mismatch will lead to unpredictable results. The Table 2 shows what valueType can be fulfilled depending on actual model data. If a get-function cannot get a value it will return 0, it may happen when model item is unset ($) or incompatible with requested valueType. To separate these cases you can use engiGetInstanceAttrType(BN), sdaiGetADBType and engiGetAggrType. On success get-function will return non-zero. More precisely, according to ISO 10303-24-2001 on success they return content of value argument (*value) for sdaiADB, sdaiAGGR, or sdaiINSTANCE or value argument itself for other types (it has no useful meaning for C#).

Table 1 – Required value buffer depending on valueType (on the example of sdaiGetAttr but valid for all get-functions)

valueType               C/C++                                                           C#

sdaiINTEGER             int_t val;                                                      int_t val;
                        sdaiGetAttr (instance, attribute, sdaiINTEGER, &val);           stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiINTEGER, out val);

sdaiREAL or sdaiNUMBER  double val;                                                     double val;
                        sdaiGetAttr (instance, attribute, sdaiREAL, &val);              stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiREAL, out val);

sdaiBOOLEAN             SdaiBoolean val;                                                bool val;
                        sdaiGetAttr (instance, attribute, sdaiBOOLEAN, &val);           stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiBOOLEAN, out val);

sdaiLOGICAL             const TCHAR* val;                                               string val;
                        sdaiGetAttr (instance, attribute, sdaiLOGICAL, &val);           stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiLOGICAL, out val);

sdaiENUM                const TCHAR* val;                                               string val;
                        sdaiGetAttr (instance, attribute, sdaiENUM, &val);              stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiENUM, out val);

sdaiBINARY              const TCHAR* val;                                               string val;
                        sdaiGetAttr (instance, attribute, sdaiBINARY, &val);            stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiBINARY, out val);

sdaiSTRING              const char* val;                                                string val;
                        sdaiGetAttr (instance, attribute, sdaiSTRING, &val);            stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiSTRING, out val);

sdaiUNICODE             const wchar_t* val;                                             string val;
                        sdaiGetAttr (instance, attribute, sdaiUNICODE, &val);           stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiUNICODE, out val);

sdaiEXPRESSSTRING       const char* val;                                                string val;
                        sdaiGetAttr (instance, attribute, sdaiEXPRESSSTRING, &val);     stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiEXPRESSSTRING, out val);

sdaiINSTANCE            SdaiInstance val;                                               int_t val;
                        sdaiGetAttr (instance, attribute, sdaiINSTANCE, &val);          stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiINSTANCE, out val);

sdaiAGGR                SdaiAggr aggr;                                                  int_t aggr;
                        sdaiGetAttr (instance, attribute, sdaiAGGR, &aggr);             stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiAGGR, out aggr);

sdaiADB                 SdaiADB adb = sdaiCreateEmptyADB();                             int_t adb = 0;  //  it is important to initialize
                        sdaiGetAttr (instance, attribute, sdaiADB, adb);                stepengine.sdaiGetAttr (instance, attribute, stepengine.sdaiADB, out adb);      
                        sdaiDeleteADB (adb);

                        SdaiADB adb = nullptr;  //  it is important to initialize
                        sdaiGetAttr (instance, attribute, sdaiADB, &adb);
TCHAR is “char” or “wchar_t” depending on setStringUnicode. (Non-standard behavior) sdaiLOGICAL behaves differently from ISO 10303-24-2001: it expects char* while standard declares int_t. (Non-standard extension) sdiADB in C++ has an option to work without sdaiCreateEmptyADB and sdaiDeleteADB as shown in the table.
Table 2 - valueType can be requested depending on actual model data.

valueType       Works for following values in the model
                  integer      real     .T. or .F.     .U.      other enum    binary      string     instance      list      $ (empty)
sdaiINTEGER         Yes         Yes *        .           .           .           .           .           .           .           .
sdaiREAL            Yes         Yes          .           .           .           .           .           .           .           .
sdaiNUMBER          Yes         Yes          .           .           .           .           .           .           .           .
sdaiBOOLEAN          .           .          Yes          .           .           .           .           .           .           .
sdaiLOGICAL          .           .          Yes         Yes          .           .           .           .           .           .
sdaiENUM             .           .          Yes         Yes         Yes          .           .           .           .           .
sdaiBINARY           .           .           .           .           .          Yes          .           .           .           .
sdaiSTRING          Yes         Yes         Yes         Yes         Yes         Yes         Yes          .           .           .
sdaiUNICODE         Yes         Yes         Yes         Yes         Yes         Yes         Yes          .           .           .
sdaiEXPRESSSTRING   Yes         Yes         Yes         Yes         Yes         Yes         Yes          .           .           .
sdaiINSTANCE         .           .           .           .           .           .           .          Yes          .           .
sdaiAGGR             .           .           .           .           .           .           .           .          Yes          .
sdaiADB             Yes         Yes         Yes         Yes         Yes         Yes         Yes         Yes         Yes          .
Note: sdaiGetAttr, stdaiGetAttrBN, engiGetElement will success with any model data, except non-set($) (Non-standard extensions) sdaiGetADBValue: sdaiADB is allowed and will success when sdaiGetADBTypePath is not NULL, returning ABD value has type path element removed.

Syntax

public const string enginedll = @"engine.dll";

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x86_sdaiGetAttr(Int32 instance, Int32 attribute, Int32 valueType, out bool value);

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x64_sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out bool value);

public static Int32 sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out bool value)
		{
			if (IntPtr.Size == 4)
			{
				var _result = x86_sdaiGetAttr((Int32)instance, (Int32)attribute, (Int32)valueType, out bool _value);
				value = _value;
				return _result;
			}
			else
			{
				return x64_sdaiGetAttr(instance, attribute, valueType, out value);
			}
		}

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x86_sdaiGetAttr(Int32 instance, Int32 attribute, Int32 valueType, out Int32 value);

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x64_sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out Int64 value);

public static Int32 sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out Int64 value)
		{
			if (IntPtr.Size == 4)
			{
				var _result = x86_sdaiGetAttr((Int32)instance, (Int32)attribute, (Int32)valueType, out Int32 _value);
				value = _value;
				return _result;
			}
			else
			{
				return x64_sdaiGetAttr(instance, attribute, valueType, out value);
			}
		}

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x86_sdaiGetAttr(Int32 instance, Int32 attribute, Int32 valueType, out double value);

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x64_sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out double value);

public static Int32 sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out double value)
		{
			if (IntPtr.Size == 4)
			{
				var _result = x86_sdaiGetAttr((Int32)instance, (Int32)attribute, (Int32)valueType, out double _value);
				value = _value;
				return _result;
			}
			else
			{
				return x64_sdaiGetAttr(instance, attribute, valueType, out value);
			}
		}

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x86_sdaiGetAttr(Int32 instance, Int32 attribute, Int32 valueType, out IntPtr value);

[DllImport(enginedll, EntryPoint = "sdaiGetAttr")]
public static extern Int32 x64_sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out IntPtr value);

public static Int32 sdaiGetAttr(Int64 instance, Int64 attribute, Int64 valueType, out IntPtr value)
		{
			if (IntPtr.Size == 4)
			{
				var _result = x86_sdaiGetAttr((Int32)instance, (Int32)attribute, (Int32)valueType, out IntPtr _value);
				value = _value;
				return _result;
			}
			else
			{
				return x64_sdaiGetAttr(instance, attribute, valueType, out value);
			}
		}    

Property instance

Size: 32 bit / 4 byte (value)
...

Property attribute

Size: 32 bit / 4 byte (reference)
...

Property valueType

Size: 32 bit / 4 byte (value)
...

Property value

Size: 32 bit / 4 byte (reference)
...

Example (based on pure API calls)

Here you can find code snippits that show how the API call sdaiGetAttr can be used.

using RDF;      //  include at least engine.cs within your solution

Int64 localGetAttrBN(Int64 instance, byte[] attributeName, Int64 valueType, out Int64 value)
{
    //
    //  This function is an alternative to the API call sdaiGetAttrBN()
    //  based on sdaiGetAttr().
    //
    //  Use of sdaiGetAttr() can lead to performance improvement compared to sdaiGetAttrBN().
    //
    Int64 instanceType = ifcengine.sdaiGetInstanceType(instance),
          attribute = ifcengine.sdaiGetAttrDefinition(instanceType, attributeName);

    return ifcengine.sdaiGetAttr(instance, attribute, valueType, out value);
}

Int64 localGetAttrBN(Int64 instance, byte[] attributeName, Int64 valueType, out double value)
{
    //
    //  This function is an alternative to the API call sdaiGetAttrBN()
    //  based on sdaiGetAttr().
    //
    //  Use of sdaiGetAttr() can lead to performance improvement compared to sdaiGetAttrBN().
    //
    Int64 instanceType = ifcengine.sdaiGetInstanceType(instance),
          attribute = ifcengine.sdaiGetAttrDefinition(instanceType, attributeName);

    return ifcengine.sdaiGetAttr(instance, attribute, valueType, out value);
}

Int64 localGetAttrBN(Int64 instance, byte[] attributeName, Int64 valueType, out IntPtr value)
{
    //
    //  This function is an alternative to the API call sdaiGetAttrBN()
    //  based on sdaiGetAttr().
    //
    //  Use of sdaiGetAttr() can lead to performance improvement compared to sdaiGetAttrBN().
    //
    Int64 instanceType = ifcengine.sdaiGetInstanceType(instance),
          attribute = ifcengine.sdaiGetAttrDefinition(instanceType, attributeName);

    return ifcengine.sdaiGetAttr(instance, attribute, valueType, out value);
}