Организовать доступ к Property Values в ACA

Автор Тема: Организовать доступ к Property Values в ACA  (Прочитано 6464 раз)

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

Оффлайн JohnLenninАвтор темы

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Уважаемые коллеги!

К сожалению не могу найти пример на .Net дя доступа к непосредственным значениям Property которые присвоены конкретному объекту в кокретном PropertySetDef.
Когда-то давно я писал на VBA утилиту, которая эти данные вытаскивает и редактирует. К сожалению сейчас не могу найти ничего похожего для .Net'а.
На VBA это называлось AecScheduleProperty. Задача - считать и отредактировать эти AecScheduleProperty для конкретного объекта с заданным objectid.
Подскажите пожалуйста где можно почитать инфу по этому вопросу для .Net.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Организовать доступ к Property Values в ACA
« Ответ #1 : 28-11-2013, 21:51:34 »
Я так сильно подозреваю, что вопрос касается не чистого AutoCAD, а вертикального решения наподобие AutoCAD Architecture. Если я прав, то вариантов немного: либо брать в руки OMF (информацию о нем надо искать на официальном сайте ADN), либо лезьть глубоко в словари и разбираться с ними. В свое время я потратил приличное количество времени на то, чтобы получить все свойства объекта AA через лисп...
« Последнее редактирование: 28-11-2013, 22:11:38 от Александр Ривилис »
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн JohnLenninАвтор темы

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Re: Организовать доступ к Property Values в ACA
« Ответ #2 : 28-11-2013, 22:02:55 »
Да, речь как раз про ACA - AutoCAD Architecture. Самое смешное, что лет 5 назад, я писал на VBA код, который эти значения достает и работает с ними, к сожалению сейчас этого кода нет под рукой. Пытаюсь найти что-то похожее на .Net. На adndevblog.typepad.com полно статей, как создавать менять и приаттачивать эти propertysetdef (описания) к объектам, а как получить их значения кокнретного объекта и изменить их - ничего нет. Может я на столько тупой что не замечаю то, что лежит под носом?
В объектной модели вроде как в Autodesk.Aec.PropertyData.DatabaseServices за это отвечает скорее всего PropertySetData, но нигде нет описания как с этим работать и смущает еще и то, что раньше в VBA это 100% точно называлось  AecScheduleProperty.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Организовать доступ к Property Values в ACA
« Ответ #3 : 28-11-2013, 22:19:42 »
Я с этим разбирался аж в 2006 году, поэтому тонкостей решения, конечно, уже не помню. Но! Есть PropertySet'ы на объекты, а есть - на стили. И для получения конкретных значений для опрашиваемого объекта приходилось их комбинировать. Может быть, в этом направлении посмотреть?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Организовать доступ к Property Values в ACA
« Ответ #4 : 28-11-2013, 22:51:07 »
смущает еще и то, что раньше в VBA это 100% точно называлось  AecScheduleProperty.
На VBA было что-то такого типа:
Код - Visual Basic [Выбрать]
  1. Sub changeDoorNumber()
  2.     Dim obj As AcadObject
  3.     Dim SchedApp As New AecScheduleApplication
  4.     Dim cPropSets As AecSchedulePropertySets
  5.     Dim propSet As AecSchedulePropertySet
  6.     Dim cProps As AecScheduleProperties
  7.     Dim prop As AecScheduleProperty
  8.     Dim count As Integer  
  9.     Dim pt As Variant
  10.     ThisDrawing.Utility.GetEntity obj, pt, "Выберите дверь: "
  11.  
  12.     Set cPropSets = SchedApp.PropertySets(obj)      
  13.  
  14.     If (cPropSets.count > 0) Then
  15.         Set propSet = cPropSets.Item("DoorObjects")
  16.         Set cProps = propSet.Properties
  17.         Set prop = cProps.Item("Number")
  18.         prop.Value = 99
  19.     Else
  20.         MsgBox "Никаких свойств нет :( !", vbInformation, "(c)"
  21.     End If
  22. End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн JohnLenninАвтор темы

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Re: Организовать доступ к Property Values в ACA
« Ответ #5 : 28-11-2013, 22:56:16 »
Да, Александр!
Точно что-то вроде того...
Попробую поразбираться, хотя аналогии трудно провести, потому как в .net совсем другие названия классов и доступ через транзакции...
to Алексей:
Здесь четко properyset'ы на объекты, т.к. объекты одного стиля могут иметь разные значения в одном и том-же property ну например все окна одинаковые (одного стиля), но у них есть скажем так порядковый номер или там тип стекла и т.п.
Все эти объекты я вставил в чертеж, создал необходимые propertysetdef'ы и даже приаттачил их к объектам, осталось только значения property присовить необходимым объектам соответсвующие, а потом их считать и отредактировать.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Организовать доступ к Property Values в ACA
« Ответ #6 : 28-11-2013, 23:16:31 »
А для маркировки используются PropertySet'ы объектов или еще и стилей? У меня-то там было и то, и другое...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Организовать доступ к Property Values в ACA
« Ответ #7 : 28-11-2013, 23:58:50 »
Попробую поразбираться, хотя аналогии трудно провести, потому как в .net совсем другие названия классов и доступ через транзакции...
Никто не запрещает использовать COM в .NET и не исключаю, что не всю функциональность из COM (т.е. то что было доступно в VBA) перевели в .NET Во всяком случае в чистом AutoCAD именно так.

P.S.: Кстати быстрое "гугление" привело к такой ссылке: http://forums.autodesk.com/t5/NET/VB-NET-accessing-property-set-data/m-p/2117133#M8779
Там расписано как мигрировать из VBA в VB.NET в данной ситуации, какие ссылки добавить. Ну а дальше VB.NET->C# это уже совсем просто...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Организовать доступ к Property Values в ACA
« Ответ #8 : 29-11-2013, 08:41:57 »
Ну а дальше VB.NET->C# это уже совсем просто...

Маленькое отступление от темы, относящееся к обозначенной цитате...

Когда у меня возникла необходимость переползать с VBA на что-то менее напоминающее "чёрный ящик", т. к. со временем возникли конкретные проблемы при программировании в MS Access (кривизна реализации редакторов форм и кода), я для начала решил, что изучать мне следует какой-то из .NET языков. В качестве вариантов рассматривал либо VB.NET, либо C#. Вначале решил взять на вооружение VB.NET, поскольку надеялся, что синтаксис будет очень похож и я достаточно быстро освоюсь.

Однако, полистав в магазине книжки по VB.NET понял, что не всё так просто как мною ожидалось. Общего у этих двух языков только две первые буквы в названии, на этом сходства заканчиваются. Синтаксис VB.NET для меня был в то время непривычен и непонятен. Т. о. знание VBA мне не давало никаких преимуществ для изучения VB.NET. Поняв это, я стал смотреть, какой .NET язык наиболее популярен, для какого из них присутствует больше всего литературы и примеров в Интернете. Однозначно это был C#, в виду чего и решил взяться за него. Вопреки моим ожиданиям, изучения проходило легче, чем я изначально предполагал.

В настоящий момент времени, сам по себе синтаксис VBA и VB.NET у меня вызывает какое-то внутреннее отторжение и дискомфорт, как будто это клинопись гоблинов, в которой каждая буква кривится от боли. Освоив синтаксис C# я вижу, насколько он "читабельней" и гармоничней, что ли... Читая код VBA или VB.NET у меня возникают ощущение, близкие к физической боли (особенно конструкции вроде if-then-else). Вот не знаю почему, но после C# коробит меня от этих языков, какое-то прямо внутреннее неприятие... :(

Т. о. я бы не рекомендовал делать такой крюк: сначала изучать VB.NET, чтобы после него взяться C# - это, на мой взгляд, пустая трата времени. Лучше сразу браться за освоение C#.

ИМХО
« Последнее редактирование: 29-11-2013, 08:56:47 от Андрей Бушман »

Оффлайн Anton

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Re: Организовать доступ к Property Values в ACA
« Ответ #9 : 22-01-2014, 12:25:12 »
Попробуй такую функцию:

Код - vb.net [Выбрать]
  1.    
  2. Public Function SetValueFromPropertySetByName(ByVal psetname As String, ByVal pname As String, ByVal dbobj As Autodesk.AutoCAD.DatabaseServices.DBObject, ByVal NewValue As Object) As Boolean
  3.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.         Dim db As Database = doc.Database
  5.         Dim ed As Editor = doc.Editor
  6.  
  7.         Dim findany As Boolean = False
  8.         Dim setIds As ObjectIdCollection = Autodesk.Aec.PropertyData.DatabaseServices.PropertyDataServices.GetPropertySets(dbobj)
  9.         Try
  10.             Using tr As Transaction = db.TransactionManager.StartTransaction
  11.                 Dim psId As ObjectId
  12.                 For Each psId In setIds 'setids is all property sets
  13.                     Dim pset As Autodesk.Aec.PropertyData.DatabaseServices.PropertySet = tr.GetObject(psId, OpenMode.ForWrite, False, False) ' As AecPropDb.PropertySet
  14.                     If pset.PropertySetDefinitionName = psetname Then
  15.                         Dim pid As Integer 'have to create this object to place the PropertyNameToId somewhere
  16.                         pid = pset.PropertyNameToId(pname) 'propertynametoid gives the id for the psetdef
  17.                         ed.WriteMessage(vbCrLf & " Property ID " & pid & " Property Name " & pset.PropertyIdToName(pid) & vbCrLf)
  18.                         Using acLckDoc As DocumentLock = doc.LockDocument() '
  19.                             pset.SetAt(pid, NewValue)
  20.                         End Using
  21.                         findany = True
  22.                         'esential findany changes the value of the function
  23.                     End If
  24.                 Next
  25.                 tr.Commit()
  26.             End Using
  27.         Catch ex As Autodesk.AutoCAD.Runtime.Exception
  28.             ed.WriteMessage("error in SetValueFromPropertySetByName: " + ex.ToString + vbCrLf)
  29.             Return findany
  30.         End Try
  31.         Return findany
  32.     End Function
  33.  

psetname - это наименование PropertySetDef
pname - это наименование самой Property в PropertySetDef
dbobj - это объект к которому приаттачен PropertySetDef
NewValue - новое значение Property
возвращает true если изменение прошло верно и false, если property не найдена или заданный propertysetdef не приаттачен к данному объекту
« Последнее редактирование: 22-01-2014, 23:35:23 от Anton »

Оффлайн JohnLenninАвтор темы

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Re: Организовать доступ к Property Values в ACA
« Ответ #10 : 04-02-2014, 22:47:21 »
Спасибо все работает!!!