В этом блоге представлены фрагменты кода, демонстрирующиеиспользование собственного и управляемого API DgnEC для следующих целей:
- Выполнение операций над свойствами EC примитивного типа, т. е. установка и получение.
- Выполнять операции над свойством EC типа массива, т. е. устанавливать, получать, вставлять и удалять элемент массива.
- Выполнять операции над свойством EC типа структуры, т. е. устанавливать и получать.
- Выполнение операций над свойством EC типа массива структур, т. е. установка, получение, вставка и удаление элемента структуры.
- Выполнять операции над свойством EC типа массива вложенных структур, т. е. устанавливать, получать, вставлять и удалять вложенные элементы структуры.
Пример схемы ЕС
Ниже приведена схема EC, используемая для выполнения различных операций со свойствами EC:
<?xml version=”1.0" encoding=”utf-8"?> <ECSchema schemaName=”PropertyTypes” nameSpacePrefix=”pt” version=”1.0" description=”For testing properties” xmlns=”http://www.bentley.com/schemas/Bentley.ECXML.2.0"> <ECClass typeName=”PropertiesClass” isDomainClass=”True”> <ECProperty propertyName=”StringProperty” typeName=”string” /> <ECProperty propertyName=”IntProperty” typeName=”int” /> <ECProperty propertyName=”DoubleProperty” typeName=”double” /> <ECProperty propertyName=”BooleanProperty” typeName=”boolean” /> <ECProperty propertyName=”LongProperty” typeName=”long” /> <ECProperty propertyName=”DateTimeProperty” typeName=”dateTime” /> <ECArrayProperty propertyName=”ArrayProperty” typeName=”string” minOccurs=”1" maxOccurs=”unbounded” /> <ECProperty propertyName=”Point2dProperty” typeName=”point2d” /> <ECProperty propertyName=”Point3dProperty” typeName=”point3d” /> <ECStructProperty propertyName=”StructProperty” typeName=”StructType” /> <ECArrayProperty propertyName=”StuctArrayProperty” typeName=”StructType” minOccurs=”1" maxOccurs=”unbounded”/> <ECArrayProperty propertyName=”ComplicatedStuctArrayProperty” typeName=”ClassWithStructArray” minOccurs=”1" maxOccurs=”unbounded”/> </ECClass> <ECClass typeName=”StructType” isStruct=”True” isDomainClass=”True”> <ECProperty propertyName=”IntegerProperty” typeName=”int” /> <ECProperty propertyName=”StringValueProperty” typeName=”string”/> </ECClass> <ECClass typeName=”ClassWithStructArray” isStruct=”True” isDomainClass=”True”> <ECProperty propertyName=”NestedStringProperty” typeName=”string”/> <ECArrayProperty propertyName=”NestedStructArray” typeName=”StructType” minOccurs=”1" maxOccurs=”unbounded”/> </ECClass> </ECSchema>
API для работы с примитивными свойствами
Ниже приведены API-интерфейсы, используемые для установки свойств EC примитивного типа и получения их значений:
- Собственный API для работы с примитивными свойствами
DgnElementECInstancePtr s_propertiesClassInstance; //Set primitive type properties using property access string and ECValue object s_propertiesClassInstance->SetValue(m_intPropertyName, ECValue(3)); ECValue value; //To get property value, pass ECValue object and property access string ECObjectsStatus status = s_propertiesClassInstance->GetValue(value, m_intPropertyName); int intVal = value.GetInteger(); s_propertiesClassInstance->SetValue(m_stringPropertyName, ECValue(L”Manufacturer”)); status = s_propertiesClassInstance->GetValue(value, m_stringPropertyName); WCharCP stringVal = value.GetString(); s_propertiesClassInstance->SetValue(m_doublePropertyName, ECValue(2.8)); status = s_propertiesClassInstance->GetValue(value, m_doublePropertyName); double doubleVal = value.GetDouble(); s_propertiesClassInstance->SetValue(m_booleanPropertyName, ECValue(true)); status = s_propertiesClassInstance->GetValue(value, m_booleanPropertyName); WCharCP boolVal = value.GetBoolean() ? L”true” : L”false”; s_propertiesClassInstance->SetValue(m_longPropertyName, ECValue(286377383789)); status = s_propertiesClassInstance->GetValue(value, m_longPropertyName); long long longVal = value.GetLong(); DateTime dateTime(DateTime::Kind::Utc, 2018, 12, 5, 6, 28, 48); value.SetDateTime(dateTime); s_propertiesClassInstance->SetValue(m_dateTimePropertyName, value); status = s_propertiesClassInstance->GetValue(value, m_dateTimePropertyName); DateTime timeVal = value.GetDateTime(); value.SetPoint2D(DPoint2d::From(12.34, 56.78)); s_propertiesClassInstance->SetValue(m_point2dPropertyName, value); status = s_propertiesClassInstance->GetValue(value, m_point2dPropertyName); DPoint2d point2d = value.GetPoint2D(); value.SetPoint3D(DPoint3d::From(12.34, 56.78, 45.86)); s_propertiesClassInstance->SetValue(m_point3dPropertyName, value); status = s_propertiesClassInstance->GetValue(value, m_point3dPropertyName); DPoint3d point3d = value.GetPoint3D();
- Управляемый API для работы с примитивными свойствами
IDgnECInstance s_propertiesClassInstance; //Set property value using property access string s_propertiesClassInstance[“StringProperty”].StringValue = “First string value”; //Get property value using property access string IECPropertyValue propVal = s_propertiesClassInstance[“StringProperty”]; string stringValue = propVal.StringValue; //Set property value using Set method s_propertiesClassInstance.SetString(“StringProperty”, “TestString”); //Get property value using Get method string temp = s_propertiesClassInstance.GetString(“StringProperty”);//We can set and get all other properties using above specified ways s_propertiesClassInstance[“IntProperty”].IntValue = 3; propVal = s_propertiesClassInstance[“IntProperty”]; int intValue = propVal.IntValue; s_propertiesClassInstance[“DoubleProperty”].DoubleValue = 2.8; propVal = s_propertiesClassInstance[“DoubleProperty”]; double doubleValue = propVal.DoubleValue; s_propertiesClassInstance[“BooleanProperty”].NativeValue = true; propVal = s_propertiesClassInstance[“BooleanProperty”]; object boolValue = propVal.NativeValue; s_propertiesClassInstance[“LongProperty”].NativeValue = 286377383789; propVal = s_propertiesClassInstance[“LongProperty”]; object longValue = propVal.NativeValue; DateTime defaultDateTime = new DateTime(1994, 12, 10, 10, 0, 0); s_propertiesClassInstance[“DateTimeProperty”].NativeValue = defaultDateTime; propVal = s_propertiesClassInstance[“DateTimeProperty”]; string dateTimeValue = propVal.NativeValue.ToString() DPoint2d point2d = new DPoint2d(2, 5); s_propertiesClassInstance[“Point2dProperty”].NativeValue = point2d; propVal = s_propertiesClassInstance[“Point2dProperty”]; object point2dValue = propVal.NativeValue; DPoint3d point3d = new DPoint3d(3, 5, 6); s_propertiesClassInstance[“Point3dProperty”].NativeValue = point3d; propVal = s_propertiesClassInstance[“Point3dProperty”]; object point3dValue = propVal.NativeValue;//Another way to set EC properties and to get it’s values DPoint2d point2d = new DPoint2d(4, 9); s_propertiesClassInstance.SetValue<DPoint2d>(“Point2dProperty”, point2d); DPoint2d point2dvalue = s_propertiesClassInstance.GetValueOrDefault<DPoint2d>(“Point2dProperty”);
- Управляемый API для работы с примитивными свойствами
IDgnECInstance s_propertiesClassInstance; //Set property value using property access string s_propertiesClassInstance[“StringProperty”].StringValue = “First string value”; //Get property value using property access string IECPropertyValue propVal = s_propertiesClassInstance[“StringProperty”]; string stringValue = propVal.StringValue; //Set property value using Set method s_propertiesClassInstance.SetString(“StringProperty”, “TestString”); //Get property value using Get method string temp = s_propertiesClassInstance.GetString(“StringProperty”);//We can set and get all other properties using above specified ways s_propertiesClassInstance[“IntProperty”].IntValue = 3; propVal = s_propertiesClassInstance[“IntProperty”]; int intValue = propVal.IntValue; s_propertiesClassInstance[“DoubleProperty”].DoubleValue = 2.8; propVal = s_propertiesClassInstance[“DoubleProperty”]; double doubleValue = propVal.DoubleValue; s_propertiesClassInstance[“BooleanProperty”].NativeValue = true; propVal = s_propertiesClassInstance[“BooleanProperty”]; object boolValue = propVal.NativeValue; s_propertiesClassInstance[“LongProperty”].NativeValue = 286377383789; propVal = s_propertiesClassInstance[“LongProperty”]; object longValue = propVal.NativeValue; DateTime defaultDateTime = new DateTime(1994, 12, 10, 10, 0, 0); s_propertiesClassInstance[“DateTimeProperty”].NativeValue = defaultDateTime; propVal = s_propertiesClassInstance[“DateTimeProperty”]; string dateTimeValue = propVal.NativeValue.ToString() DPoint2d point2d = new DPoint2d(2, 5); s_propertiesClassInstance[“Point2dProperty”].NativeValue = point2d; propVal = s_propertiesClassInstance[“Point2dProperty”]; object point2dValue = propVal.NativeValue; DPoint3d point3d = new DPoint3d(3, 5, 6); s_propertiesClassInstance[“Point3dProperty”].NativeValue = point3d; propVal = s_propertiesClassInstance[“Point3dProperty”]; object point3dValue = propVal.NativeValue;//Another way to set EC properties and to get it’s values DPoint2d point2d = new DPoint2d(4, 9); s_propertiesClassInstance.SetValue<DPoint2d>(“Point2dProperty”, point2d); DPoint2d point2dvalue = s_propertiesClassInstance.GetValueOrDefault<DPoint2d>(“Point2dProperty”);
API для работы со свойствами массива
Ниже приведены API-интерфейсы, используемые для установки свойства EC типа массива, получения значения свойства массива, вставки элемента массива и удаления элемента массива:
- Собственный API для работы со свойством массива
DgnElementECInstancePtr s_propertiesClassInstance; //To add array elements, pass property access string and count of elements to be added s_propertiesClassInstance->AddArrayElements(m_arrayPropertyName, count); //To set value for particular index s_propertiesClassInstance->SetValue(m_arrayPropertyName, ECValue(L”TestString1"), index); ECValue value; //Get all array elements from array property ECObjectsStatus status = s_propertiesClassInstance->GetValue(value, m_arrayPropertyName); ArrayInfo arrayInfo = value.GetArrayInfo(); int noOfElement = arrayInfo.GetCount(); for (int i = 0; i < noOfElement; i++) { s_propertiesClassInstance->GetValue(value, m_arrayPropertyName, i); } //To remove array element, pass access string and index of element to be removed ECObjectsStatus status = s_propertiesClassInstance-> RemoveArrayElement(m_arrayPropertyName,1); //To insert array element, pass access string, starting index at which to inset new element and number of elements to insert status = s_propertiesClassInstance->InsertArrayElements(m_arrayPropertyName,1,1);
- Управляемый API для работы со свойством массива
IDgnECInstance s_propertiesClassInstance; //Add elements to array using property access string s_propertiesClassInstance[“ArrayProperty[0]”].StringValue = “FirstString”; //Get all array elements using property access string IECPropertyValue propVal = s_propertiesClassInstance[“ArrayProperty”]; IECArrayValue stringArrayProp = propVal.ContainedValues as IECArrayValue; for (int i = 0; i < stringArrayProp.Count; i++) { MessageCenter.Instance.StatusMessage = stringArrayProp[i].StringValue; } //Get all array elements using GetPropertyValue API propVal = s_propertiesClassInstance.GetPropertyValue(“ArrayProperty”); stringArrayProp = propVal.ContainedValues as IECArrayValue; for (int i = 0; i < stringArrayProp.Count; i++) { MessageCenter.Instance.StatusMessage = stringArrayProp[i].StringValue; } //Remove array element from particular location of array propVal = s_propertiesClassInstance[“ArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.RemoveAt(1);//Remove element from specified position //Insert array element to particular location of array propVal = s_propertiesClassInstance[“ArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.InsertAt(1);//InsertAt create empty space in array for specified position //Set array property using GetOrCreateArray IEnumerable<string> stringArray = new[] { “small”,”medium”,”large” }; stringArrayProp = s_propertiesClassInstance.GetOrCreateArray(“ArrayProperty”); stringArrayProp.SetStrings(stringArray); //SetStrings takes string array and set it to array property //Get array elements using GetArray API stringArrayProp = s_propertiesClassInstance.GetArray(“ArrayProperty”); for (int i=0; i< stringArrayProp.Count; i++) { MessageCenter.Instance.StatusMessage = stringArrayProp[i].StringValue; } //Another way to get array property value using TryGetStringValue string stringValue; s_propertiesClassInstance.GetArray(“ArrayProperty”).TryGetStringValue(out stringValue);
API для работы со свойствами структуры
Ниже приведены API-интерфейсы, используемые для установки свойства EC типа структуры и получения их значений:
- Собственный API для работы со свойством структуры
DgnElementECInstancePtr s_propertiesClassInstance; //Set individual property of struct type class s_propertiesClassInstance->SetValue(L”StructProperty.IntegerProperty”, ECValue(3)); //Get individual property value of struct type class ECValue value; ECObjectsStatus status = s_propertiesClassInstance->GetValue(value, L”StructProperty.IntegerProperty”); int intValue = value.GetInteger();
- Управляемый API для работы со свойством структуры
IDgnECInstance s_propertiesClassInstance; //Set individual property value of struct type class s_propertiesClassInstance[“StructProperty.IntegerProperty”].IntValue = 2; //Get individual property value of struct type class IECPropertyValue propVal = s_propertiesClassInstance[“StructProperty.IntegerProperty”]; int intValue = propVal.IntValue; //Get struct type property value as a single string propVal = s_propertiesClassInstance[“StructProperty”]; MessageCenter.Instance.StatusMessage = propVal.StringValue;//Set value to struct property using GetOrCreateStruct IECStructValue structVal = s_propertiesClassInstance.GetOrCreateStruct(“StructProperty”); structVal.SetInteger(“IntegerProperty”, 4); //Get struct type property value using GetStruct structVal = s_propertiesClassInstance.GetStruct(“StructProperty”); int ? intVal = structVal.GetInteger(“IntegerProperty”);//Another way to get value of struct property using TryGetStringValue string stringValue; s_propertiesClassInstance.GetStruct(“StructProperty”).TryGetStringValue(out stringValue);
API для работы со свойствами массива структур
Ниже приведены API-интерфейсы, используемые для установки свойства EC типа массива структур, получения значения свойства массива структур, вставки элемента структуры и удаления элемента структуры из массива структур.
- Собственный API для работы со свойством массива структур
DgnElementECInstancePtr s_propertiesClassInstance; //To set struct array property, pass property access string and number of elements to insert into it s_propertiesClassInstance->AddArrayElements(m_structArrayPropertyName, nElements); //Get struct type class and create instance of it ECClassP structClass = s_ecSchema->GetClassP(propertyTypesExample.m_structTypeClass); IECInstancePtr ecInstance = structClass->GetDefaultStandaloneEnabler()->CreateInstance(); //Set value to created instance properties ecInstance->SetValue(m_structIntegerPropertyName, ECValue(1)); //Set instance to ecValue object ECValue v; v.SetStruct(ecInstance.get()); //Set ecValue object to particular location in struct array s_propertiesClassInstance->SetValue(m_structArrayPropertyName, v, index); //To insert struct element at particular location in struct array, pass property access string, starting index at which to insert new element and number of elements to be inserted s_propertiesClassInstance->InsertArrayElements(m_structArrayPropertyName, 2, 1); ecInstance = structClass->GetDefaultStandaloneEnabler()->CreateInstance(); ecInstance->SetValue(m_structIntegerPropertyName, ECValue(3)); v.SetStruct(ecInstance.get()); s_propertiesClassInstance->SetValue(m_structArrayPropertyName, v, 2);//Get the stuct array property values ECValue value; ECObjectsStatus status = s_propertiesClassInstance->GetValue(value, m_structArrayPropertyName); //Get the array information from ecValue object int count = (int)(value.GetArrayInfo().GetCount()); for (int i = 0; i < count; i++) { //Get the value stored at particular index in struct array s_propertiesClassInstance->GetValue(value, m_structArrayPropertyName, i); //Get struct instance from ecValue object IECInstancePtr instance = value.GetStruct(); instance->GetValue(value, m_structIntegerPropertyName); int value = value.GetInteger(); }
- Управляемый API для работы со свойством массива структур
IDgnECInstance s_propertiesClassInstance; //Set struct array property using property access string s_propertiesClassInstance[“StuctArrayProperty[0].IntegerProperty”].IntValue = 1; s_propertiesClassInstance[“StuctArrayProperty[1].IntegerProperty”].IntValue = 2; //Gets all struct elements from struct array IECPropertyValue propVal = s_propertiesClassInstance[“StuctArrayProperty”]; IECArrayValue stringArrayProp = propVal.ContainedValues as IECArrayValue; for (int i = 0; i < stringArrayProp.Count; i++) { MessageCenter.Instance.StatusMessage = stringArrayProp[i].StringValue; } //Remove struct element from particular location of struct array propVal = s_propertiesClassInstance[“StuctArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.RemoveAt(1); //Insert struct element at particular location of struct array propVal = s_propertiesClassInstance[“StuctArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.InsertAt(1); s_propertiesClassInstance.SetInteger(“StuctArrayProperty[1].IntegerProperty”, 2);//Set struct array property using GetOrCreateStructArray IECStructArrayValue structArrayValue = s_propertiesClassInstance.GetOrCreateStructArray(“StuctArrayProperty”); IECStructValue[] structValues = structArrayValue.SetStructs(2).ToArray(); structValues[0].SetInteger(“IntegerProperty”, 1); structValues[1].SetInteger(“IntegerProperty”, 2);//Get struct array property value using GetStructArray structArrayValue = s_propertiesClassInstance.GetStructArray(“StuctArrayProperty”); structValues = structArrayValue.GetStructs().ToArray(); //To get every struct element in struct array as a single string for (int i=0; i<structValues.Length; i++) { structValues[i].StringValue; } //To get struct array element’s individual property values for (int i = 0; i < structValues.Length; i++) { int? intVal = structValues[i].GetInteger(“IntegerProperty”); string stringVal = structValues[i].GetString(“StringValueProperty”); }
API для работы со свойствами массива вложенных структур
Ниже приведены API-интерфейсы, используемые для установки свойства EC типа вложенного массива структур, получения значения свойства массива вложенных структур, вставки элемента структуры и удаления элемента структуры из вложенного массива структур.
- Собственный API для работы с вложенным свойством массива структур
DgnElementECInstancePtr s_propertiesClassInstance; //To set nested struct array property, pass property access string and number of struct elements to insert into it s_propertiesClassInstance->AddArrayElements(m_complicatedStructArrayPropertyName, nElements); //Get a class having struct type array and create instance of it ECClassP classWithStructArray = s_ecSchema->GetClassP(propertyTypesExample.m_classWithStructArray); IECInstancePtr classWithStructArrayInstance = classWithStructArray-> GetDefaultStandaloneEnabler()->CreateInstance(); //Set value to struct array type property of created instance classWithStructArrayInstance->AddArrayElements(m_nestedStructArrayPropertyName, nElements); ECClassP structTypeClass = s_ecSchema->GetClassP(propertyTypesExample.m_structTypeClass); IECInstancePtr structTypeClassInstance = structTypeClass->GetDefaultStandaloneEnabler()-> CreateInstance(); structTypeClassInstance->SetValue(m_structIntegerPropertyName, ECValue(1)); ECValue value; value.SetStruct(structTypeClassInstance.get()); classWithStructArrayInstance->SetValue(m_nestedStructArrayPropertyName, value, index);//index specifies particular location at which to insert element //Set instance of class having struct array to nested struct array property ECValue structVal; structVal.SetStruct(classWithStructArrayInstance.get()); s_propertiesClassInstance->SetValue(m_complicatedStructArrayPropertyName, structVal, indexOfComplicatedStructProperty);//indexOfComplicatedStructProperty specifies particular location at which to insert element//Get nested struct array property values ECObjectsStatus status = s_propertiesClassInstance->GetValue(value, m_complicatedStructArrayPropertyName); int count = (int)(value.GetArrayInfo().GetCount()); //Loop till number of elements in nested struct array property for (int i = 0; i < count; i++) { s_propertiesClassInstance->GetValue(value, m_complicatedStructArrayPropertyName, i); IECInstancePtr instance = value.GetStruct(); instance->GetValue(value, m_nestedStructArrayPropertyName); //Loop till number of nested struct array elements int countNested = (int)(value.GetArrayInfo().GetCount()); for (int j = 0; j < countNested; j++) { instance->GetValue(value, m_nestedStructArrayPropertyName, j); IECInstancePtr structInstance = value.GetStruct(); structInstance->GetValue(value, m_structIntegerPropertyName); int value = value.GetInteger(); } }
- Управляемый API для работы со свойством массива вложенных структур
IDgnECInstance s_propertiesClassInstance; //Set nested struct array property using property access string s_propertiesClassInstance[“ComplicatedStuctArrayProperty[0].NestedStructArray[0].IntegerProperty”].IntValue = 1; //Gets all elements from nested struct array property IECPropertyValue propVal = s_propertiesClassInstance[“ComplicatedStuctArrayProperty”]; IECArrayValue stringArrayProp = propVal.ContainedValues as IECArrayValue; for (int i = 0; i < stringArrayProp.Count; i++) { MessageCenter.Instance.StatusMessage = stringArrayProp[i].StringValue; } //Remove element from particular location of nested struct array propVal = s_propertiesClassInstance[“ComplicatedStuctArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.RemoveAt(1); //Insert element at particular location of nested struct array propVal = s_propertiesClassInstance[“ComplicatedStuctArrayProperty”]; stringArrayProp = propVal.ContainedValues as IECArrayValue; stringArrayProp.InsertAt(1);//Set value to nested struct array property using GetOrCreateStructArray IECStructArrayValue structArrayValue = s_propertiesClassInstance.GetOrCreateStructArray(“ComplicatedStuctArrayProperty”); IECStructValue[] structValues = structArrayValue.SetStructs(2).ToArray();//SetStructs(2) specifies number of elements to be added IECStructArrayValue nestedStructArrayValue = structValues[0].GetOrCreateStructArray(“NestedStructArray”); IECStructValue[] nestedStructValue = nestedStructArrayValue.SetStructs(2).ToArray(); nestedStructValue[0].SetInteger(“IntegerProperty”,1); nestedStructValue[0].SetString(“StringValueProperty”, “FirstString”);//Get value from nested struct array property using GetStructArray structArrayValue = s_propertiesClassInstance.GetStructArray(“ComplicatedStuctArrayProperty”); structValues = structArrayValue.GetStructs().ToArray(); for (int i = 0; i < structValues.Length; i++) { //To get every struct element in nested struct array as a single string MessageCenter.Instance.StatusMessage = structValues[i].StringValue; } for (int i = 0; i < structValues.Length; i++) { //To get struct array element’s individual property values nestedStructArrayValue = structValues[i].GetStructArray(“NestedStructArray”); nestedStructValue = nestedStructArrayValue.GetStructs().ToArray(); for (int j = 0; j < nestedStructValue.Length; j++) { int? nestedInt = nestedStructValue[j].GetInteger(“IntegerProperty”); string nestedString = nestedStructValue[j].GetString(“StringValueProperty”); } }
Аккредитация
Чтобы найти этот пост и другие посты в блоге, вики, объявления на веб-сайте Bentley Communities, нажмите здесь.
Если вы хотите поговорить с экспертом Bentley о переходе на MicroStation CONNECT Edition, заполните эту форму, чтобы кто-то связался с вами, чтобы дать совет и помощь.
Спасибо за чтение!