Пользовательские свойства точек COGO
Пользовательские свойства позволяют нам хранить дополнительную информацию о точках COGO. В этой статье будет показано, как создавать новые свойства, как их назначать точкам и как записывать в них значения. Этот процесс очень простой и предоставляет большую гибкость при выборе типа свойств, которые вы можете создавать. Давайте начнем с команды “demo”.
- [CommandMethod("CDS_UDPDemo")]
- public void CDS_UDPDemo()
- {
- createDemoPointsRepresentingWells();
- createDemoProperties();
- createDemoPointGroup();
- setDemoPointProperties();
- }
- <CommandMethod("CDS_UDPDemo")> _
- Public Sub CDS_UDPDemo()
- createDemoPointsRepresentingWells()
- createDemoProperties()
- createDemoPointGroup()
- setDemoPointProperties()
- End Sub
Это команда очень простая. Вначале мы создали несколько точек “Wells”. Затем мы создали пользовательское свойство (User Defined Properties/UDPs). И наконец, мы создали группу точек для включения в нее наших точек, отображения свойств и задания их значений. Я не буду тратить время на объяснения, как создавать точки и группы точек, поскольку это уже было: CogoPointBasics и PointGroups. Важно понимать что классификация пользовательских свойств, которая является свойством группы, применяются к группе точек, и ее необходимо указывать, вызывая функцию “UseCustomClassification()” группы точек. Вы можете загрузить весть исходный код из “CivilizedDevelopment”.
Создание пользовательских классификаций
Первое, что вам необходимо, это “классификация” к свойствам группы. Возможно, в чертеже, в котором вы работаете, уже есть доступные классификации, но вы захотите создать собственную классификацию для ваших пользовательских свойств. Это так же хорошая идея, чтобы создать свою группу точек для отображения свойств. Создать Как вы можете видеть, создать новую классификацию очень просто.
- private UDPClassification createClassification(string name)
- {
- UDPClassificationCollection classifications = UDPClassificationCollection.GetPointUDPClassifications(_database);
- return classifications.Add(name);
- }
- Private Function createClassification(name As String) As UDPClassification
- Dim classifications As UDPClassificationCollection = UDPClassificationCollection.GetPointUDPClassifications(_database)
- Return classifications.Add(name)
- End Function
Мы получили доступ к коллекции классификаций через статический метод “GetPointUDPClassifications()” в классе “UDPClassficationCollection”. Коллекция “UDPClassificationCollection” предоставляет интерфейс для доступа и управления классификациями в чертеже, а также для создания новых. Классификации создаются по имени, а метод “Add()” вызывает исключение, если указанное имя уже существует. Вы можете избежать исключения, использовав функцию “Contains()” для проверки существования вводимого имени.
Создание пользовательских свойств
Процесс создания пользовательских свойств состоит из двух этапов. Вначале мы должны создать информацию о типе пользовательского свойства, которая определяет тип значений. Затем мы должны создать пользовательское свойство, с помощью объекта “UDPClassification”, используя информацию о типе. Следующий пример демонстрирует создание информации о различных типах, поддерживаемых API.
- private AttributeTypeInfoBool makeBoolDefinition(string name, string description)
- {
- AttributeTypeInfoBool definition = new AttributeTypeInfoBool(name);
- definition.Description = description;
- definition.DefaultValue = false;
- definition.UseDefaultValue = true;
- return definition;
- }
- Private Function makeBoolDefinition(name As String, description As String) As AttributeTypeInfoBool
- Dim definition As New AttributeTypeInfoBool(name)
- definition.Description = description
- definition.DefaultValue = False
- definition.UseDefaultValue = True
- Return definition
- End Function
Для создания значения типа “boolean” мы использовали класс “ AttributeTypeInfoBool ”. Этот класс, как и любой другой класс информации о типе, позволяет задавать имя и описание. Он так же позволяет задать значение по умолчанию для свойства. В большинстве случаев, для корректности инициализации свойства, вам нужно будет указывать значение по умолчанию и устанавливать значение “True” для свойства “UseDefaultValue”.
- private AttributeTypeInfoString makeStringDefinition(string name, string description)
- {
- AttributeTypeInfoString definition = new AttributeTypeInfoString(name);
- definition.Description = description;
- definition.DefaultValue = String.Empty;
- definition.UseDefaultValue = true;
- return definition;
- }
- Private Function makeStringDefinition(name As String, description As String) As AttributeTypeInfoString
- Dim definition As New AttributeTypeInfoString(name)
- definition.Description = description
- definition.DefaultValue = [String].Empty
- definition.UseDefaultValue = True
- Return definition
- End Function
Свойства типа “string” очень похожи на свойства типа “boolean”. Вы определяете их с помощью класса “AttributeTypeInfoString” с обязательным указанием имени. Так же можно установить описание для этих свойств. Информация о строковом типе так же позволяет установить значение по умолчанию и указать, должно ли оно использоваться.
- private AttributeTypeInfoEnum makeEnumDefinition(string name, string description)
- {
- EnumDefinition valueDefinitions = new EnumDefinition();
- AttributeTypeInfoEnum definition = new AttributeTypeInfoEnum(name, valueDefinitions.Values);
- definition.Description = description;
- definition.DefaultValue = valueDefinitions.DefaultValue;
- definition.UseDefaultValue = true;
- return definition;
- }
- Private Function makeEnumDefinition(name As String, description As String) As AttributeTypeInfoEnum
- Dim valueDefinitions As New EnumDefinition()
- Dim definition As New AttributeTypeInfoEnum(name, valueDefinitions.Values)
- definition.Description = description
- definition.DefaultValue = valueDefinitions.DefaultValue
- definition.UseDefaultValue = True
- Return definition
- End Function
Вы можете создавать пользовательские свойства перечисления (enums). Только строковые типы поддерживают перечисления и должны быть указаны “IEnumerable<string>”. Вы так же можете устанавливать значения по умолчанию, которое должно быть одно из поддерживаемых значений, указывать будет ли оно использоваться.
- private AttributeTypeInfoInt makeIntDefinition(string name, string description)
- {
- AttributeTypeInfoInt definition = new AttributeTypeInfoInt(name);
- definition.Description = description;
- definition.DefaultValue = 0;
- definition.LowerBoundValue = Int32.MinValue;
- definition.LowerBoundInclusive = true;
- definition.UpperBoundValue = Int32.MaxValue;
- definition.UpperBoundInclusive = true;
- definition.UseDefaultValue = true;
- return definition;
- }
- Private Function makeIntDefinition(name As String, description As String) As AttributeTypeInfoInt
- Dim definition As New AttributeTypeInfoInt(name)
- definition.Description = description
- definition.DefaultValue = 0
- definition.LowerBoundValue = Int32.MinValue
- definition.LowerBoundInclusive = True
- definition.UpperBoundValue = Int32.MaxValue
- definition.UpperBoundInclusive = True
- definition.UseDefaultValue = True
- Return definition
- End Function
Свойства типа “integer” определяются с помощью класса “AttributeTypeInfoInt”. Вы должны указать имя и можете указать описание, значение по умолчанию и использование. Кроме того, этот тип позволяет указывать минимально и максимально допустимые значения. В принципе, класс “AttributeTypeInfoInt” позволяет указывать диапазон действительных значений для свойства.
- private AttributeTypeInfoDouble makeDoubleDefinition(string name, string description)
- {
- AttributeTypeInfoDouble definition = new AttributeTypeInfoDouble(name);
- definition.Description = description;
- definition.DefaultValue = 0.0;
- definition.UseDefaultValue = true;
- definition.LowerBoundValue = 0.0;
- definition.LowerBoundInclusive = true;
- definition.UpperBoundValue = Double.MaxValue;
- definition.UpperBoundInclusive = true;
- definition.UseDefaultValue = true;
- definition.DataType = AttributeTypeInfoDoubleDataType.Percent;
- return definition;
- }
- Private Function makeDoubleDefinition(name As String, description As String) As AttributeTypeInfoDouble
- Dim definition As New AttributeTypeInfoDouble(name)
- definition.Description = description
- definition.DefaultValue = 0.0
- definition.UseDefaultValue = True
- definition.LowerBoundValue = 0.0
- definition.LowerBoundInclusive = True
- definition.UpperBoundValue = [Double].MaxValue
- definition.UpperBoundInclusive = True
- definition.UseDefaultValue = True
- definition.DataType = AttributeTypeInfoDoubleDataType.Percent
- Return definition
- End Function
Вы так же можете создавать свойства, хранящие значения типа “double”. Для этого следует использовать класс “ AttributeTypeInfoDouble ”, который предоставляет такой же интерфейс, как и класс “ AttributeTypeInfoInt ”. Свойства типа “double” являются более гибкими, так как позволяют указывать тип представляемых значений. Класс “AttributeTypeInfoDouble” предоставляет свойство “DataType”, значение которого берется из перечисления “AttributeTypeInfoDoubleDataType” и будет предоставлять тип значения в соответствии с выбранным типом. Если вы не зададите свойство “DataType”, значение будет интерпретироваться, как “double”, но вы все равно сможете представлять его в любом типе данных перечисления (угол, направление, координата, поворот и др.). Это дает вам большие возможности в описании свойств точки. В приведенном выше примере показано представление типа “double” в качестве процента.
После того, как вы создали свое определение пользовательских свойств (информация о типе), вы может добавить его к классификации, как это продемонстрировано в следующем примере.
- private void addUDPs(UDPClassification classification)
- {
- _potable = classification.CreateUDP(makeBoolDefinition("Potable", "Indicates if water is suitable for consumption."));
- _chloride = classification.CreateUDP(makeIntDefinition("Chloride", "Amount of chloride (mg/l)."));
- _laboratory = classification.CreateUDP(makeStringDefinition("Laboratory", "Name of the laboratory that performed analysis."));
- _hardness = classification.CreateUDP(makeEnumDefinition("Hardness", "Hardness with respect to anions in metallic cations."));
- _alkalinity = classification.CreateUDP(makeDoubleDefinition("Alkalinity", "Ability to resist sudden changes in pH."));
- }
- Private Sub addUDPs(classification As UDPClassification)
- _potable = classification.CreateUDP(makeBoolDefinition("Potable", "Indicates if water is suitable for consumption."))
- _chloride = classification.CreateUDP(makeIntDefinition("Chloride", "Amount of chloride (mg/l)."))
- _laboratory = classification.CreateUDP(makeStringDefinition("Laboratory", "Name of the laboratory that performed analysis."))
- _hardness = classification.CreateUDP(makeEnumDefinition("Hardness", "Hardness with respect to anions in metallic cations."))
- _alkalinity = classification.CreateUDP(makeDoubleDefinition("Alkalinity", "Ability to resist sudden changes in pH."))
- End Sub
Установка пользовательских свойств COGO точкам
Для установки свойства, необходимо вызвать метод “SetUDPValue()” объекта COGO точка, указав пользовательское свойство и его значение. Следующие пример демонстрирует, как это сделать.
- private void customizePoint(ObjectId id)
- {
- CogoPoint point = id.GetObject(OpenMode.ForWrite) as CogoPoint;
- point.SetUDPValue(_potable, true);
- point.SetUDPValue(_chloride, 150);
- point.SetUDPValue(_laboratory, "CivilDev Labs, Inc.");
- point.SetUDPValue(_hardness, "Carbonate (Temporary)");
- point.SetUDPValue(_alkalinity, 7.5);
- }
- Private Sub customizePoint(id As ObjectId)
- Dim point As CogoPoint = TryCast(id.GetObject(OpenMode.ForWrite), CogoPoint)
- point.SetUDPValue(_potable, True)
- point.SetUDPValue(_chloride, 150)
- point.SetUDPValue(_laboratory, "CivilDev Labs, Inc.")
- point.SetUDPValue(_hardness, "Carbonate (Temporary)")
- point.SetUDPValue(_alkalinity, 7.5)
- End Sub
Обсуждение: http://adn-cis.org/forum/index.php?topic=510
Опубликовано 06.02.2014