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

ADN Club => Civil 3D API => Тема начата: Захаров Максим от 28-07-2021, 15:08:47

Название: Копирование 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
Название: Re: Копирование PropertySet
Отправлено: Александр Ривилис от 28-07-2021, 16:32:57
destDb1.MLeaderStyleDictionaryId
А это причем здесь?
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 28-07-2021, 17:16:32
Да вообще не причем, я и прошу помочь, что вместо этой строчки написать, не могу разобраться
Название: Re: Копирование PropertySet
Отправлено: Александр Ривилис от 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
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 06-08-2021, 15:46:26
Александр подскажите пожалуйста, как мне rxClass определить?
Код - vb.net [Выбрать]
  1. helpme.Clone(sourceDb, destDb1, setIds, dictStyle.RecordType, True)
dictStyle.RecordType - что мне подставить для PropertySet?
Название: Re: Копирование PropertySet
Отправлено: Александр Ривилис от 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))
Название: Re: Копирование PropertySet
Отправлено: Александр Ривилис от 06-08-2021, 16:51:20
Впрочем возможно нужно с PropertySetDefinition, а не c PropertySet
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 06-08-2021, 16:54:12
Спасибо, вроде в первом приближении работает
Название: Re: Копирование PropertySet
Отправлено: Александр Ривилис от 06-08-2021, 16:56:05
Захаров Максим,
Было бы очень неплохо, если бы ты привёл кусок кода - как пример для тех, кто будет искать решение аналогичной задачи.
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 06-08-2021, 16:59:56
Да конечно, только надо еще по тестить, и напишу
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 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
Название: Re: Копирование PropertySet
Отправлено: trir от 06-12-2021, 11:18:46
Цитировать
нужно подключить 2 dll (AecPropDataMgd.dll и AecPropDataMgd.dll)
где то тут ошибка...
Название: Re: Копирование PropertySet
Отправлено: Захаров Максим от 06-12-2021, 11:30:12
Исправил