Дополнительные свойства объекта

Автор Тема: Дополнительные свойства объекта  (Прочитано 15473 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Здравствуйте.
Подскажите пожалуйста как добраться до этих свойств. Изменить их, добавить поле. Данные уже созданы необходимо их только обновлять.


Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Дополнительные свойства объекта
« Ответ #1 : 09-01-2019, 15:22:48 »
Это явно не Автокадовские свойства. Какой-то плагин добавил. А хранится может где угодно. Может просто атрибуты блока, а может в xData или xRecord.
Пользуйтесь утилитами (http://adn-cis.org/forum/index.php?topic=7274.0) для поиска места хранения/

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #2 : 09-01-2019, 15:31:04 »
Из Civil 3d идет экспорт коридора как Тело. По факту это просто обычное Тело или Солид просто к нему прикреплены дополнительные данные. Ни каких плагинов дополнительных не использовалось. Просто в ручную поля добавлять долго

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Дополнительные свойства объекта
« Ответ #3 : 09-01-2019, 16:09:32 »
У Civil вроде есть свой API. В Автокаде нет никаких способов добавлять свои свойства: ни у пользователя, ни у dotNet API. только в objectARX на плюсах со скрипом можно дописать динамические свойства к обычному солиду.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Дополнительные свойства объекта
« Ответ #4 : 09-01-2019, 16:22:18 »
Это наборы характеристик (Property Sets) - функционал Civil 3D позаимствованный из ACA. Доступен с версии 2016 SP какой-то там. Если погуглить, можно найти примеры работы с ними. Вроде как, совсем недавно где-то видел обсуждение на эту тему, но сходу найти что-то не смог.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #5 : 09-01-2019, 17:09:20 »
Думал будет проще.
Из того что нагуглил это для создания property Set (https://adndevblog.typepad.com/aec/2012/09/defining-a-property-set-definition-in-net-.html)
А это для подключения к объекту https://adndevblog.typepad.com/aec/2012/09/attach-a-property-set-to-an-object.html

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дополнительные свойства объекта
« Ответ #6 : 09-01-2019, 17:12:15 »
Захаров Максим,
https://forums.autodesk.com/t5/civil-3d-customization/read-property-data-from-an-entity/m-p/7834510#M14590
Код - C# [Выбрать]
  1. using (Autodesk.AutoCAD.ApplicationServices.DocumentLock loc = acDoc.LockDocument())
  2. {
  3.     using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  4.     {
  5.         // Request for objects to be selected in the drawing area
  6.  
  7.         PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection();
  8.  
  9.         // If the prompt status is OK, objects were selected
  10.         if (acSSPrompt.Status == PromptStatus.OK)
  11.         {
  12.             SelectionSet acSSet = acSSPrompt.Value;
  13.  
  14.             // Step through the objects in the selection set
  15.             foreach (SelectedObject acSSObj in acSSet)
  16.             {
  17.                 Autodesk.AutoCAD.DatabaseServices.DBObject dbObj = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForRead);
  18.                 ObjectIdCollection setIds = PropertyDataServices.GetPropertySets(dbObj);
  19.  
  20.                 foreach (ObjectId psId in setIds)
  21.                 {
  22.                     PropertySet pset = acTrans.GetObject(psId, OpenMode.ForRead, false, false) as PropertySet;
  23.                     PropertySetDataCollection psetDataColl = pset.PropertySetData;
  24.                     PropertySetData pTempData;
  25.                     for (int c = 0; c < psetDataColl.Count; c++)
  26.                     {
  27.                         pPropData = psetDataColl[c];
  28.                         object data = pPropData.GetData();
  29.                     }
  30.                 }
  31.  
  32.                 return;
  33.             }
  34.         }
  35.     }
  36. }
  37.  
Не забыть подключить AecPropDataMgd.dll
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #7 : 09-01-2019, 18:07:43 »
Спасибо Александр.
Дело сдвинулось с мертвой точки. Подскажите пожалуйста, а как имя поля прочитать? Значение дает, а до имени поля не могу добраться. Скажите, а могу я поле добавить со значением, а не только прочитать?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дополнительные свойства объекта
« Ответ #8 : 09-01-2019, 18:40:23 »
Подскажите пожалуйста, а как имя поля прочитать? Значение дает, а до имени поля не могу добраться.
Думаю, что через PropertySet.PropertyIdToName(int id)
По поводу добавления - не в курсе. Впрочем посмотри этот код: http://adn-cis.org/forum/index.php?topic=362.msg1413#msg1413
Может что-то и сможешь использовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дополнительные свойства объекта
« Ответ #9 : 09-01-2019, 19:16:52 »
По поводу добавления - не в курсе.
Похоже добавить поле нельзя. Можно лишь изменить значение. В PropertySetDataCollection методы Add/Remove/Insert/Clear вызывают исключение  NotSupportedException("Read only collection.")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #10 : 09-01-2019, 20:58:19 »
Спасибо Александр.
Есть еще вариант может есть метод на COM.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дополнительные свойства объекта
« Ответ #11 : 09-01-2019, 20:59:55 »
Есть еще вариант может есть метод на COM.
Это вопрос или утверждение?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #12 : 09-01-2019, 21:53:46 »
Это вопрос. Может через com можно добавить поле? Должен же быть выход из тупика.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Дополнительные свойства объекта
« Ответ #13 : 09-01-2019, 22:18:26 »
Может через com можно добавить поле?
Нет. Фактически ты всё сам нагуглил:
Думал будет проще.
Из того что нагуглил это для создания property Set (https://adndevblog.typepad.com/aec/2012/09/defining-a-property-set-definition-in-net-.html)
А это для подключения к объекту https://adndevblog.typepad.com/aec/2012/09/attach-a-property-set-to-an-object.html
« Последнее редактирование: 09-01-2019, 23:06:37 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 141
  • Карма: 3
Re: Дополнительные свойства объекта
« Ответ #14 : 10-01-2019, 15:39:51 »
Спасибо.
Вроде получается но на некоторых блоках кода ошибка вываливается (я их закоментировал), хотя пока они мне не нужны, главное пользовательские свойства идут
Код - vb.net [Выбрать]
  1. <CommandMethod("ACANetScheduleLabs")>
  2.     Public Sub CreatePropertySetDefinition()
  3.         Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  4.         Dim db As Database = doc.Database
  5.         Dim ed As Editor = doc.Editor
  6.         Dim propSetDefName As String = "ACADoorObjects"
  7.         Try
  8.             Dim propSetDef As New Autodesk.Aec.PropertyData.DatabaseServices.PropertySetDefinition
  9.             propSetDef.SetToStandard(db)
  10.             propSetDef.SubSetDatabaseDefaults(db)
  11.             propSetDef.Description = "Property Set Definition by ACA.NET"
  12.             Dim isStyle As Boolean = False
  13.             Dim appliedTo = New Specialized.StringCollection()
  14.             appliedTo.Add("AecDbDoor")       ' apply to a door object
  15.             propSetDef.SetAppliesToFilter(appliedTo, isStyle)
  16.  
  17.             Dim propDefManual = New Autodesk.Aec.PropertyData.DatabaseServices.PropertyDefinition()
  18.             propDefManual.SetToStandard(db)
  19.             propDefManual.SubSetDatabaseDefaults(db)
  20.             propDefManual.Name = "ACAManualProp"
  21.             propDefManual.Description = "Manual property by ACA.NET"
  22.             propDefManual.DataType = Autodesk.Aec.PropertyData.DataType.Text
  23.             propDefManual.DefaultData = "ACA Default"
  24.             propSetDef.Definitions.Add(propDefManual)
  25.  
  26.             'Dim propDefAutomatic = New Autodesk.Aec.PropertyData.DatabaseServices.PropertyDefinition()
  27.             'propDefAutomatic.SetToStandard(db)
  28.             'propDefAutomatic.SubSetDatabaseDefaults(db)
  29.             'propDefAutomatic.Name = "ACAWidth"
  30.             'propDefAutomatic.Description = "Automatic property by ACA.NET"
  31.             'propDefAutomatic.SetAutomaticData("AecDbDoor", "Width")
  32.             'propSetDef.Definitions.Add(propDefAutomatic)
  33.  
  34.             'propDefAutomatic = New Autodesk.Aec.PropertyData.DatabaseServices.PropertyDefinition()
  35.             'propDefAutomatic.SetToStandard(db)
  36.             'propDefAutomatic.SubSetDatabaseDefaults(db)
  37.             'propDefAutomatic.Name = "ACAHeight"
  38.             'propDefAutomatic.Description = "Automatic property by ACA.NET"
  39.             'propDefAutomatic.SetAutomaticData("AecDbDoor", "Height")
  40.             'propSetDef.Definitions.Add(propDefAutomatic)
  41.  
  42.             Using tr As Transaction = db.TransactionManager.StartTransaction()
  43.                 Dim dictPropSetDef = New Autodesk.Aec.PropertyData.DatabaseServices.DictionaryPropertySetDefinitions(db)
  44.                 If dictPropSetDef.Has(propSetDefName, tr) Then
  45.                     ed.WriteMessage("error - the property set defintion already exists: " & propSetDefName)
  46.                     Return
  47.                 End If
  48.                 dictPropSetDef.AddNewRecord(propSetDefName, propSetDef)
  49.                 tr.AddNewlyCreatedDBObject(propSetDef, True)
  50.                 'выбираем объект
  51.                 Dim opt As PromptEntityOptions = New PromptEntityOptions(vbLf & "Выберите объект: ")
  52.                 Dim resBlk As PromptEntityResult = Nothing
  53.                 resBlk = ed.GetEntity(opt)
  54.                 Dim pvId As ObjectId = resBlk.ObjectId
  55.                 Dim obj As Autodesk.AutoCAD.DatabaseServices.Entity = tr.GetObject(pvId, OpenMode.ForWrite)
  56.                 Autodesk.Aec.PropertyData.DatabaseServices.PropertyDataServices.AddPropertySet(obj, propSetDef.Id)
  57.                 tr.Commit()
  58.             End Using
  59.         Catch ex As Exception
  60.             ed.WriteMessage("error in CreatePropSetDef: " & ex.ToString & vbCrLf)
  61.             Return
  62.         End Try
  63.         ed.WriteMessage("property set definition " & propSetDefName & " is successfully created." & vbCrLf)
  64.     End Sub