Копирование PropertySet

Автор Тема: Копирование PropertySet  (Прочитано 3506 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Копирование PropertySet
« : 28-07-2021, 15:08:47 »
Добрый день.
Подскажите как скопировать PropertySet из другого чертежа в текущий. Идея такая, есть чертеж-шаблон в котором определены таблицы со свойствами PropertySet
Нужно их скопировать. Я не понимаю что поставить в строке Dim destDictId1 As ObjectId = destDb1.MLeaderStyleDictionaryId
Или вообще идея не правильная

Код - vb.net [Выбрать]
  1. Dim sourceFileName As String = Path.Combine(NameFullPatch, NameFile)
  2.         Dim sourceDb As Database = New Database(False, True)
  3.         sourceDb.ReadDwgFile(sourceFileName, FileShare.Read, True, String.Empty)
  4.         Dim sourceTr As Transaction = sourceDb.TransactionManager.StartTransaction()
  5.         Using sourceTr
  6.             Dim sourceBtr As BlockTableRecord = sourceTr.GetObject(sourceDb.CurrentSpaceId, OpenMode.ForRead, False)
  7.             For Each id As ObjectId In sourceBtr
  8.                 Dim ent As Autodesk.AutoCAD.DatabaseServices.Entity = sourceTr.GetObject(id, OpenMode.ForRead, False) 'открываем объект на чтение
  9.                 If ent.Handle.ToString Like StrHandle Then
  10.                     Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  11.                     Dim destDb1 As Database = acDoc.Database
  12.                     Dim destDictId1 As ObjectId = destDb1.[color=orange]MLeaderStyleDictionaryId[/color]
  13.                     Dim setIds As ObjectIdCollection = Autodesk.Aec.PropertyData.DatabaseServices.PropertyDataServices.GetPropertySets(ent)
  14.                     Dim ObjColID As ObjectIdCollection = New ObjectIdCollection
  15.                     For Each psId As ObjectId In setIds
  16.                         ObjColID.Add(psId)
  17.                     Next
  18.                     Dim iMap1 As IdMapping = New IdMapping()
  19.                     destDb1.WblockCloneObjects(ObjColID, destDictId1, iMap1, DuplicateRecordCloning.Replace, False)
  20.                     Exit For
  21.                 End If
  22.             Next
  23.             sourceTr.Commit()
  24.         End Using

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование PropertySet
« Ответ #1 : 28-07-2021, 16:32:57 »
destDb1.MLeaderStyleDictionaryId
А это причем здесь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #2 : 28-07-2021, 17:16:32 »
Да вообще не причем, я и прошу помочь, что вместо этой строчки написать, не могу разобраться

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование PropertySet
« Ответ #3 : 28-07-2021, 18:07:55 »
PropertySets Definitions содержатся в словаре "AEC_PROPERTY_SET_DEFS" в NOD (т.е. в словаре, у которого ObjectId равен Database.NamedObjectsDictionaryId). Теоретически их можно скопировать с помощью WblockCloneObjects. Но я совсем не уверен, что копирование будет корректным. Вообще WblockCloneObjects хорошо работает только с объектами AutoCAD, но не с объектами вертикальных приложений.
Попробуй метод Autodesk.Aec.ApplicationServices.Utility.CloningHelper(). Он описан здесь: https://adndevblog.typepad.com/aec/2012/08/importexport-styles-fromto-another-drawing-in-net-.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #4 : 06-08-2021, 15:46:26 »
Александр подскажите пожалуйста, как мне rxClass определить?
Код - vb.net [Выбрать]
  1. helpme.Clone(sourceDb, destDb1, setIds, dictStyle.RecordType, True)
dictStyle.RecordType - что мне подставить для PropertySet?

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование PropertySet
« Ответ #5 : 06-08-2021, 16:15:45 »
dictStyle.RecordType - что мне подставить для PropertySet?
Думаю что:
Код - C# [Выбрать]
  1. RXClass.GetClass(typeof(/*Autodesk.Aec.PropertyData.DatabaseServices.*/ PropertySet));
Код - vb.net [Выбрать]
  1. RXClass.GetClass(GetType(Autodesk.Aec.PropertyData.DatabaseServices.PropertySet))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование PropertySet
« Ответ #6 : 06-08-2021, 16:51:20 »
Впрочем возможно нужно с PropertySetDefinition, а не c PropertySet
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #7 : 06-08-2021, 16:54:12 »
Спасибо, вроде в первом приближении работает

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование PropertySet
« Ответ #8 : 06-08-2021, 16:56:05 »
Захаров Максим,
Было бы очень неплохо, если бы ты привёл кусок кода - как пример для тех, кто будет искать решение аналогичной задачи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #9 : 06-08-2021, 16:59:56 »
Да конечно, только надо еще по тестить, и напишу

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #10 : 06-12-2021, 11:08:42 »
Вроде все работает, нужно подключить 2 dll (AecCoreMgd.dll и AecPropDataMgd.dll)
'=================================================================================================================================
    'функция копирует PropertySET из другого чертежа (1-Полный путь к файлу-шаблону .dwg, 2-имя таблицы)
   
Код - vb.net [Выбрать]
  1.  Public Shared Function FuncCreateTablePSDestDraw(ByVal PathDraw As String, ByVal NamePSTable As String) As Boolean
  2.         FuncCreateTablePSDestDraw = False
  3.         Dim sourceDb As Database = New Database(False, True)
  4.         sourceDb.ReadDwgFile(PathDraw, FileShare.Read, True, String.Empty)
  5.         Dim sourceTr As Transaction = sourceDb.TransactionManager.StartTransaction()
  6.         Using sourceTr
  7.             Dim dictPropSetDef = New Autodesk.Aec.PropertyData.DatabaseServices.DictionaryPropertySetDefinitions(sourceDb)
  8.             If dictPropSetDef.Has(NamePSTable, sourceTr) Then
  9.                 Dim IDPSTable As ObjectId = dictPropSetDef.GetAt(NamePSTable)
  10.                 Dim CollDictPropSet As ObjectIdCollection = New ObjectIdCollection
  11.                 CollDictPropSet.Add(IDPSTable)
  12.                 Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  13.                 Dim destDb As Database = acDoc.Database
  14.                 Dim destTr As Transaction = destDb.TransactionManager.StartTransaction()
  15.                 Using destTr
  16.                     Dim dictPropSetDefTemp = New Autodesk.Aec.PropertyData.DatabaseServices.DictionaryPropertySetDefinitions(destDb)
  17.                     If dictPropSetDefTemp.Has(NamePSTable, destTr) = False Then
  18.                         Dim helpme As Autodesk.Aec.ApplicationServices.Utility.CloningHelper = New Autodesk.Aec.ApplicationServices.Utility.CloningHelper
  19.                         Dim RXClassPS As RXClass = RXClass.GetClass(GetType(Autodesk.Aec.PropertyData.DatabaseServices.PropertySet))
  20.                         helpme.Clone(sourceDb, destDb, CollDictPropSet, RXClassPS, True)
  21.                         FuncCreateTablePSDestDraw = True
  22.                     End If
  23.                     destTr.Commit()
  24.                 End Using
  25.             End If
  26.         End Using
  27.     End Function

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 423
  • Карма: 57
Re: Копирование PropertySet
« Ответ #11 : 06-12-2021, 11:18:46 »
Цитировать
нужно подключить 2 dll (AecPropDataMgd.dll и AecPropDataMgd.dll)
где то тут ошибка...

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Копирование PropertySet
« Ответ #12 : 06-12-2021, 11:30:12 »
Исправил