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

ADN Club => AutoCAD .NET API => Тема начата: Захаров Максим от 09-01-2019, 15:19:21

Название: Дополнительные свойства объекта
Отправлено: Захаров Максим от 09-01-2019, 15:19:21
Здравствуйте.
Подскажите пожалуйста как добраться до этих свойств. Изменить их, добавить поле. Данные уже созданы необходимо их только обновлять.
(https://i.postimg.cc/dDHDdzvr/image.png) (https://postimg.cc/dDHDdzvr)
Название: Re: Дополнительные свойства объекта
Отправлено: avc от 09-01-2019, 15:22:48
Это явно не Автокадовские свойства. Какой-то плагин добавил. А хранится может где угодно. Может просто атрибуты блока, а может в xData или xRecord.
Пользуйтесь утилитами (http://adn-cis.org/forum/index.php?topic=7274.0) для поиска места хранения/
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 09-01-2019, 15:31:04
Из Civil 3d идет экспорт коридора как Тело. По факту это просто обычное Тело или Солид просто к нему прикреплены дополнительные данные. Ни каких плагинов дополнительных не использовалось. Просто в ручную поля добавлять долго
Название: Re: Дополнительные свойства объекта
Отправлено: avc от 09-01-2019, 16:09:32
У Civil вроде есть свой API. В Автокаде нет никаких способов добавлять свои свойства: ни у пользователя, ни у dotNet API. только в objectARX на плюсах со скрипом можно дописать динамические свойства к обычному солиду.
Название: Re: Дополнительные свойства объекта
Отправлено: Дмитрий Загорулькин от 09-01-2019, 16:22:18
Это наборы характеристик (Property Sets) - функционал Civil 3D позаимствованный из ACA. Доступен с версии 2016 SP какой-то там. Если погуглить, можно найти примеры работы с ними. Вроде как, совсем недавно где-то видел обсуждение на эту тему, но сходу найти что-то не смог.
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 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
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 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
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 09-01-2019, 18:07:43
Спасибо Александр.
Дело сдвинулось с мертвой точки. Подскажите пожалуйста, а как имя поля прочитать? Значение дает, а до имени поля не могу добраться. Скажите, а могу я поле добавить со значением, а не только прочитать?
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 09-01-2019, 18:40:23
Подскажите пожалуйста, а как имя поля прочитать? Значение дает, а до имени поля не могу добраться.
Думаю, что через PropertySet.PropertyIdToName(int id)
По поводу добавления - не в курсе. Впрочем посмотри этот код: http://adn-cis.org/forum/index.php?topic=362.msg1413#msg1413
Может что-то и сможешь использовать.
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 09-01-2019, 19:16:52
По поводу добавления - не в курсе.
Похоже добавить поле нельзя. Можно лишь изменить значение. В PropertySetDataCollection методы Add/Remove/Insert/Clear вызывают исключение  NotSupportedException("Read only collection.")
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 09-01-2019, 20:58:19
Спасибо Александр.
Есть еще вариант может есть метод на COM.
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 09-01-2019, 20:59:55
Есть еще вариант может есть метод на COM.
Это вопрос или утверждение?
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 09-01-2019, 21:53:46
Это вопрос. Может через com можно добавить поле? Должен же быть выход из тупика.
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 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
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 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
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 10-01-2019, 16:24:07
Вроде получается но на некоторых блоках кода ошибка вываливается (я их закоментировал), хотя пока они мне не нужны, главное пользовательские свойства идут
Вообще-то "AecDbDoor" - это тип примитива "Дверь" в AutoCAD Architecture, которого нет в Civil 3D. Поэтому наверное и вываливается ошибка.
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 10-01-2019, 16:57:51
Нет программа работает нормально. Ошибка идет если раскомментировать 2 нижних блока. Что-то в них не так.
А конкретно в строке
propDefAutomatic.SetAutomaticData("AecDbDoor", "Width")
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 10-01-2019, 16:58:58
Нет программа работает нормально. Ошибка идет если раскомментировать 2 нижних блока. Что-то в них не так.
Какие два нижних блока? О чем речь?
Название: Re: Дополнительные свойства объекта
Отправлено: Захаров Максим от 10-01-2019, 17:02:58
Ну кстати наверное да. Дверей конечно нет в сивиле. Интересно как бы понять а что можно загнать в эту строку
Название: Re: Дополнительные свойства объекта
Отправлено: Александр Ривилис от 10-01-2019, 17:08:39
Ну кстати наверное да. Дверей конечно нет в сивиле. Интересно как бы понять а что можно загнать в эту строку

Можно загнать имена классов объектов/примитивов Civil 3D. Но имена не из .NET API (которые являются обертками), а имена C++ классов. Например,  AeccDbPipe, а не Pipe: http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/net/Autodesk__Civil__PipeNetwork__DatabaseServices__Pipe.htm