ADN Open CIS
Сообщество программистов Autodesk в СНГ

06/02/2014

Пользовательские свойства точек COGO

Пользовательские свойства позволяют нам хранить дополнительную информацию о точках COGO. В этой статье будет показано, как создавать новые свойства, как их назначать точкам и как записывать в них значения. Этот процесс очень простой и предоставляет большую гибкость при выборе типа свойств, которые вы можете создавать. Давайте начнем с команды “demo”.

Код - C#: [Выделить]
  1. [CommandMethod("CDS_UDPDemo")]
  2. public void CDS_UDPDemo()
  3. {
  4.    createDemoPointsRepresentingWells();
  5.    createDemoProperties();
  6.    createDemoPointGroup();
  7.    setDemoPointProperties();
  8. }

 

Код - VB.NET: [Выделить]
  1. <CommandMethod("CDS_UDPDemo")> _
  2.  Public Sub CDS_UDPDemo()
  3.    createDemoPointsRepresentingWells()
  4.    createDemoProperties()
  5.    createDemoPointGroup()
  6.    setDemoPointProperties()
  7.  End Sub

 

Это команда очень простая. Вначале мы создали несколько точек “Wells”. Затем мы создали пользовательское свойство (User Defined Properties/UDPs). И наконец, мы создали группу точек для включения в нее наших точек, отображения свойств и задания их значений. Я не буду тратить время на объяснения, как создавать точки и группы точек, поскольку это уже было: CogoPointBasics и PointGroups. Важно понимать что классификация пользовательских свойств, которая является свойством группы, применяются к группе точек, и ее необходимо указывать, вызывая функцию “UseCustomClassification()” группы точек. Вы можете загрузить весть исходный код из “CivilizedDevelopment”.

Создание пользовательских классификаций

Первое, что вам необходимо, это “классификация” к свойствам группы. Возможно, в чертеже, в котором вы работаете, уже есть доступные классификации, но вы захотите создать собственную классификацию для ваших пользовательских свойств. Это так же хорошая идея, чтобы создать свою группу точек для отображения свойств. Создать Как вы можете видеть, создать новую классификацию очень просто.

Код - C#: [Выделить]
  1. private UDPClassification createClassification(string name)
  2.  {
  3.    UDPClassificationCollection classifications = UDPClassificationCollection.GetPointUDPClassifications(_database);
  4.    return classifications.Add(name);
  5.  }

 

Код - VB.NET: [Выделить]
  1. Private Function createClassification(name As String) As UDPClassification
  2.    Dim classifications As UDPClassificationCollection = UDPClassificationCollection.GetPointUDPClassifications(_database)
  3.    Return classifications.Add(name)
  4.  End Function

 

Мы получили доступ к коллекции классификаций через статический метод “GetPointUDPClassifications()” в классе “UDPClassficationCollection”. Коллекция “UDPClassificationCollection” предоставляет интерфейс для доступа и управления классификациями в чертеже, а также для создания новых. Классификации создаются по имени, а метод “Add()” вызывает исключение, если указанное имя уже существует. Вы можете избежать исключения, использовав функцию “Contains()” для проверки существования вводимого имени.

Создание пользовательских свойств

Процесс создания пользовательских свойств состоит из двух этапов. Вначале мы должны создать информацию о типе пользовательского свойства, которая определяет тип значений. Затем мы должны создать пользовательское свойство, с помощью объекта “UDPClassification”, используя информацию о типе. Следующий пример демонстрирует создание информации о различных типах, поддерживаемых API.

Код - C#: [Выделить]
  1. private AttributeTypeInfoBool makeBoolDefinition(string name, string description)
  2.  {
  3.    AttributeTypeInfoBool definition = new AttributeTypeInfoBool(name);
  4.    definition.Description = description;
  5.    definition.DefaultValue = false;
  6.    definition.UseDefaultValue = true;
  7.    return definition;
  8.  }

 

Код - VB.NET: [Выделить]
  1. Private Function makeBoolDefinition(name As String, description As String) As AttributeTypeInfoBool
  2.   Dim definition As New AttributeTypeInfoBool(name)
  3.    definition.Description = description
  4.    definition.DefaultValue = False
  5.    definition.UseDefaultValue = True
  6.    Return definition
  7.  End Function

 

Для создания значения типа “boolean” мы использовали класс “ AttributeTypeInfoBool ”. Этот класс, как и любой другой класс информации о типе, позволяет задавать имя и описание. Он так же позволяет задать значение по умолчанию для свойства. В большинстве случаев, для корректности инициализации свойства, вам нужно будет указывать значение по умолчанию и устанавливать значение “True” для свойства “UseDefaultValue”.

Код - C#: [Выделить]
  1. private AttributeTypeInfoString makeStringDefinition(string name, string description)
  2.  {
  3.    AttributeTypeInfoString definition = new AttributeTypeInfoString(name);
  4.    definition.Description = description;
  5.    definition.DefaultValue = String.Empty;
  6.    definition.UseDefaultValue = true;
  7.    return definition;
  8.  }

 

Код - VB.NET: [Выделить]
  1. Private Function makeStringDefinition(name As String, description As String) As AttributeTypeInfoString
  2.    Dim definition As New AttributeTypeInfoString(name)
  3.    definition.Description = description
  4.    definition.DefaultValue = [String].Empty
  5.    definition.UseDefaultValue = True
  6.    Return definition
  7.  End Function

 

Свойства типа “string” очень похожи на свойства типа “boolean”. Вы определяете их с помощью класса “AttributeTypeInfoString” с обязательным указанием имени. Так же можно установить описание для этих свойств. Информация о строковом типе так же позволяет установить значение по умолчанию и указать, должно ли оно использоваться.

Код - C#: [Выделить]
  1. private AttributeTypeInfoEnum makeEnumDefinition(string name, string description)
  2.  {
  3.    EnumDefinition valueDefinitions = new EnumDefinition();
  4.    AttributeTypeInfoEnum definition = new AttributeTypeInfoEnum(name, valueDefinitions.Values);
  5.    definition.Description = description;
  6.    definition.DefaultValue = valueDefinitions.DefaultValue;
  7.    definition.UseDefaultValue = true;
  8.    return definition;
  9.  }

 

Код - VB.NET: [Выделить]
  1. Private Function makeEnumDefinition(name As String, description As String) As AttributeTypeInfoEnum
  2.    Dim valueDefinitions As New EnumDefinition()
  3.    Dim definition As New AttributeTypeInfoEnum(name, valueDefinitions.Values)
  4.    definition.Description = description
  5.    definition.DefaultValue = valueDefinitions.DefaultValue
  6.    definition.UseDefaultValue = True
  7.    Return definition
  8.  End Function

 

Вы можете создавать пользовательские свойства перечисления (enums). Только строковые типы поддерживают перечисления и должны быть указаны “IEnumerable<string>”. Вы так же можете устанавливать значения по умолчанию, которое должно быть одно из поддерживаемых значений, указывать будет ли оно использоваться.

Код - C#: [Выделить]
  1. private AttributeTypeInfoInt makeIntDefinition(string name, string description)
  2.  {
  3.    AttributeTypeInfoInt definition = new AttributeTypeInfoInt(name);
  4.    definition.Description = description;
  5.    definition.DefaultValue = 0;
  6.    definition.LowerBoundValue = Int32.MinValue;
  7.    definition.LowerBoundInclusive = true;
  8.    definition.UpperBoundValue = Int32.MaxValue;
  9.    definition.UpperBoundInclusive = true;
  10.    definition.UseDefaultValue = true;
  11.    return definition;
  12.  }

 

Код - VB.NET: [Выделить]
  1. Private Function makeIntDefinition(name As String, description As String) As AttributeTypeInfoInt
  2.   Dim definition As New AttributeTypeInfoInt(name)
  3.    definition.Description = description
  4.    definition.DefaultValue = 0
  5.    definition.LowerBoundValue = Int32.MinValue
  6.    definition.LowerBoundInclusive = True
  7.    definition.UpperBoundValue = Int32.MaxValue
  8.    definition.UpperBoundInclusive = True
  9.    definition.UseDefaultValue = True
  10.    Return definition
  11.  End Function

 

Свойства типа “integer” определяются с помощью класса “AttributeTypeInfoInt”. Вы должны указать имя и можете указать описание, значение по умолчанию и использование. Кроме того, этот тип позволяет указывать минимально и максимально допустимые значения. В принципе, класс “AttributeTypeInfoInt” позволяет указывать диапазон действительных значений для свойства.

Код - C#: [Выделить]
  1. private AttributeTypeInfoDouble makeDoubleDefinition(string name, string description)
  2.  {
  3.    AttributeTypeInfoDouble definition = new AttributeTypeInfoDouble(name);
  4.    definition.Description = description;
  5.    definition.DefaultValue = 0.0;
  6.    definition.UseDefaultValue = true;
  7.    definition.LowerBoundValue = 0.0;
  8.    definition.LowerBoundInclusive = true;
  9.    definition.UpperBoundValue = Double.MaxValue;
  10.    definition.UpperBoundInclusive = true;
  11.    definition.UseDefaultValue = true;
  12.    definition.DataType = AttributeTypeInfoDoubleDataType.Percent;
  13.    return definition;
  14.  }

 

Код - VB.NET: [Выделить]
  1. Private Function makeDoubleDefinition(name As String, description As String) As AttributeTypeInfoDouble
  2.   Dim definition As New AttributeTypeInfoDouble(name)
  3.    definition.Description = description
  4.    definition.DefaultValue = 0.0
  5.    definition.UseDefaultValue = True
  6.    definition.LowerBoundValue = 0.0
  7.    definition.LowerBoundInclusive = True
  8.    definition.UpperBoundValue = [Double].MaxValue
  9.    definition.UpperBoundInclusive = True
  10.    definition.UseDefaultValue = True
  11.    definition.DataType = AttributeTypeInfoDoubleDataType.Percent
  12.    Return definition
  13.  End Function

 

Вы так же можете создавать свойства, хранящие значения типа “double”. Для этого следует использовать класс “ AttributeTypeInfoDouble ”, который предоставляет такой же интерфейс, как и класс “ AttributeTypeInfoInt ”. Свойства типа “double” являются более гибкими, так как позволяют указывать тип представляемых значений. Класс “AttributeTypeInfoDouble” предоставляет свойство “DataType”, значение которого берется из перечисления “AttributeTypeInfoDoubleDataType” и будет предоставлять тип значения в соответствии с выбранным типом. Если вы не зададите свойство “DataType”, значение будет интерпретироваться, как “double”, но вы все равно сможете представлять его в любом типе данных перечисления (угол, направление, координата, поворот и др.). Это дает вам большие возможности в описании свойств точки. В приведенном выше примере показано представление типа “double” в качестве процента.

После того, как вы создали свое определение пользовательских свойств (информация о типе), вы может добавить его к классификации, как это продемонстрировано в следующем примере.

Код - C#: [Выделить]
  1. private void addUDPs(UDPClassification classification)
  2.  {
  3.    _potable = classification.CreateUDP(makeBoolDefinition("Potable", "Indicates if water is suitable for consumption."));
  4.    _chloride = classification.CreateUDP(makeIntDefinition("Chloride", "Amount of chloride (mg/l)."));
  5.    _laboratory = classification.CreateUDP(makeStringDefinition("Laboratory", "Name of the laboratory that performed analysis."));
  6.    _hardness = classification.CreateUDP(makeEnumDefinition("Hardness", "Hardness with respect to anions in metallic cations."));
  7.    _alkalinity = classification.CreateUDP(makeDoubleDefinition("Alkalinity", "Ability to resist sudden changes in pH."));
  8. }

 

Код - VB.NET: [Выделить]
  1. Private Sub addUDPs(classification As UDPClassification)
  2.    _potable = classification.CreateUDP(makeBoolDefinition("Potable""Indicates if water is suitable for consumption."))
  3.    _chloride = classification.CreateUDP(makeIntDefinition("Chloride", "Amount of chloride (mg/l)."))
  4.    _laboratory = classification.CreateUDP(makeStringDefinition("Laboratory""Name of the laboratory that performed analysis."))
  5.    _hardness = classification.CreateUDP(makeEnumDefinition("Hardness""Hardness with respect to anions in metallic cations."))
  6.    _alkalinity = classification.CreateUDP(makeDoubleDefinition("Alkalinity""Ability to resist sudden changes in pH."))
  7.  End Sub

 

Установка пользовательских свойств COGO точкам

Для установки свойства, необходимо вызвать метод “SetUDPValue()” объекта COGO точка, указав пользовательское свойство и его значение. Следующие пример демонстрирует, как это сделать.

Код - C#: [Выделить]
  1. private void customizePoint(ObjectId id)
  2.  {
  3.    CogoPoint point = id.GetObject(OpenMode.ForWrite) as CogoPoint;
  4.    point.SetUDPValue(_potable, true);
  5.    point.SetUDPValue(_chloride, 150);
  6.    point.SetUDPValue(_laboratory, "CivilDev Labs, Inc.");
  7.    point.SetUDPValue(_hardness, "Carbonate (Temporary)");
  8.    point.SetUDPValue(_alkalinity, 7.5);
  9.  }

 

Код - VB.NET: [Выделить]
  1. Private Sub customizePoint(id As ObjectId)
  2.    Dim point As CogoPoint = TryCast(id.GetObject(OpenMode.ForWrite), CogoPoint)
  3.    point.SetUDPValue(_potable, True)
  4.    point.SetUDPValue(_chloride, 150)
  5.    point.SetUDPValue(_laboratory, "CivilDev Labs, Inc.")
  6.    point.SetUDPValue(_hardness, "Carbonate (Temporary)")
  7.    point.SetUDPValue(_alkalinity, 7.5)
  8. End Sub

 

Источник: http://civilizeddevelopment.typepad.com/civilized-development/2012/07/21wojpweek-11-user-defined-properties.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=510

Опубликовано 06.02.2014