Table 1 – Required value buffer depending on valueType (on the example of sdaiAppend but valid for all put-functions)
valueType C/C++ C#
sdaiINTEGER int_t val = 123; int_t val = 123;
sdaiAppend (aggregate, sdaiINTEGER, &val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiINTEGER, ref val);
sdaiREAL or sdaiNUMBER double val = 123.456; double val = 123.456;
sdaiAppend (aggregate, sdaiREAL, &val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiREAL, ref val);
sdaiBOOLEAN SdaiBoolean val = sdaiTRUE; bool val = true;
sdaiAppend (aggregate, sdaiBOOLEAN, &val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiBOOLEAN, ref val);
sdaiLOGICAL const TCHAR* val = "U"; string val = "U";
sdaiAppend (aggregate, sdaiLOGICAL, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiLOGICAL, val);
sdaiENUM const TCHAR* val = "NOTDEFINED"; string val = "NOTDEFINED";
sdaiAppend (aggregate, sdaiENUM, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiENUM, val);
sdaiBINARY const TCHAR* val = "0123456ABC"; string val = "0123456ABC";
sdaiAppend (aggregate, sdaiBINARY, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiBINARY, val);
sdaiSTRING const char* val = "My Simple String"; string val = "My Simple String";
sdaiAppend (aggregate, sdaiSTRING, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiSTRING, val);
sdaiUNICODE const wchar_t* val = L"Any Unicode String"; string val = "Any Unicode String";
sdaiAppend (aggregate, sdaiUNICODE, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiUNICODE, val);
sdaiEXPRESSSTRING const char* val = "EXPRESS format, i.e. \\X2\\00FC\\X0\\"; string val = "EXPRESS format, i.e. \\X2\\00FC\\X0\\";
sdaiAppend (aggregate, sdaiEXPRESSSTRING, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiEXPRESSSTRING, val);
sdaiINSTANCE SdaiInstance val = sdaiCreateInstanceBN (model, "IFCSITE"); int_t val = IFCEngine.sdaiCreateInstanceBN (model, "IFCSITE");
sdaiAppend (aggregate, sdaiINSTANCE, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiINSTANCE, val);
sdaiAGGR SdaiAggr val = sdaiCreateAggr (inst, 0); int_t val = sdaiCreateAggr (inst, 0);
sdaiPutAttr (val, sdaiINSTANCE, inst); IFCEngine.sdaiPutAttr (val, IFCEngine.sdaiINSTANCE, inst);
sdaiAppend (aggregate, sdaiAGGR, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiAGGR, val);
sdaiADB int_t integerValue = 123; int_t integerValue = 123;
SdaiADB val = sdaiCreateADB (sdaiINTEGER, &integerValue); int_t val = IFCEngine.sdaiCreateADB (IFCEngine.sdaiINTEGER, ref integerValue);
sdaiPutADBTypePath (val, 1, "IFCINTEGER"); IFCEngine.sdaiPutADBTypePath (val, 1, "IFCINTEGER");
sdaiAppend (aggregate, sdaiADB, val); IFCEngine.sdaiAppend (aggregate, IFCEngine.sdaiADB, val);
... ...
sdaiDeleteADB (val); // optional IFCEngine.sdaiDeleteADB (val); // optional
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 has an option to work without sdaiDeleteADB as shown in the table (all open ADB's will be deleted on model close).
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 . . . . . . . . .
sdaiREAL . Yes . . . . . . . .
sdaiNUMBER . Yes . . . . . . . .
sdaiBOOLEAN . . Yes . . . . . . .
sdaiLOGICAL . . Yes Yes . . . . . .
sdaiENUM . . Yes Yes Yes . . . . .
sdaiBINARY . . . . . Yes . . . .
sdaiSTRING . . . . . . Yes . . .
sdaiUNICODE . . . . . . Yes . . .
sdaiEXPRESSSTRING . . . . . . Yes . . .
sdaiINSTANCE . . . . . . . Yes . .
sdaiAGGR . . . . . . . . Yes .
sdaiADB Yes Yes Yes Yes Yes Yes Yes Yes Yes .
Syntax
public const string ifcenginedll = @"ifcengine.dll"; [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, [param: MarshalAs(UnmanagedType.U1)] ref bool value); [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, ref int_t value); [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, int_t value); [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, ref double value); [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, ref IntPtr value); [DllImport(ifcenginedll, EntryPoint = "sdaiAppend")] public static extern void sdaiAppend(int_t aggregate, int_t valueType, byte[] value); public static void sdaiAppend(int_t aggregate, int_t valueType, string value) { valueType = getStringType(valueType); if (valueType != 0) { var bytes = stringToBytes(valueType, value); if (bytes != null) { sdaiAppend(aggregate, valueType, bytes); } } }
Property aggregate
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 snippets that show how the API call sdaiAppend can be used.
using RDF; // include at least IFCEngine.cs within your solution // // Created result when stored as IFC: // #31313 = IFCPOSTALADDRESS($, $, $, $, ('RDF Ltd.', 'Main Office'), '32', 'Bankya', 'Sofia', '1320', 'Bulgaria'); // Int64 ifcPostalAddressInstance = RDF.IFCEngine.sdaiCreateInstanceBN(model, "IFCPOSTALADDRESS"); Int64 addressLines = RDF.IFCEngine.sdaiCreateAggrBN(ifcPostalAddressInstance, "AddressLines"); RDF.IFCEngine.sdaiAppend(addressLines, RDF.IFCEngine.sdaiSTRING, "RDF Ltd."); RDF.IFCEngine.sdaiAppend(addressLines, RDF.IFCEngine.sdaiSTRING, "Main Office"); RDF.IFCEngine.sdaiPutAttrBN(ifcPostalAddressInstance, "PostalBox", RDF.IFCEngine.sdaiSTRING, "32"); RDF.IFCEngine.sdaiPutAttrBN(ifcPostalAddressInstance, "Town", RDF.IFCEngine.sdaiSTRING, "Bankya"); RDF.IFCEngine.sdaiPutAttrBN(ifcPostalAddressInstance, "Region", RDF.IFCEngine.sdaiSTRING, "Sofia"); // It is allowed to mix sdaiUNICODE and sdaiSTRING RDF.IFCEngine.sdaiPutAttrBN(ifcPostalAddressInstance, "PostalCode", RDF.IFCEngine.sdaiUNICODE, "1320"); // as long as each call is consitent in itself. RDF.IFCEngine.sdaiPutAttrBN(ifcPostalAddressInstance, "Country", RDF.IFCEngine.sdaiSTRING, "Bulgaria");