Копирование объектов в отдельный чертеж

Автор Тема: Копирование объектов в отдельный чертеж  (Прочитано 3853 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Добрый день. Прошу помочь в работе.
Есть файл, там 500 примитивов. Необходимо каждый примитив сохранить в отдельном файле. Программа вроде не сложная, правда долго работает, шаблон acadiso как то долго открывается. Но не суть. Объекты копируются, но хотелось бы реализовать Zoom all, что то вроде того. А то открываеш созданный файл, а примитывы далеко в стороне. Именно это и не работает, помогите
Код - vb.net [Выбрать]
  1. Dim sLocalRoot As String = Application.GetSystemVariable("LOCALROOTPREFIX")
  2.                                     Dim acDocMgr As DocumentCollection = Application.DocumentManager
  3.                                     Dim acNewDoc As Document = acDocMgr.Add(strTemplatePath)
  4.                                     Dim acDbNewDoc As Database = acNewDoc.Database
  5.                                     Using acLckDoc As DocumentLock = acNewDoc.LockDocument()
  6.                                         Using acTrans = acDbNewDoc.TransactionManager.StartTransaction()
  7.                                             Dim acBlkTblNewDoc As BlockTable
  8.                                             acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead)
  9.                                             Dim acBlkTblRecNewDoc As BlockTableRecord
  10.                                             acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  11.                                             Dim acIdMap As IdMapping = New IdMapping()
  12.                                             db.WblockCloneObjects(idColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Ignore, False)
  13.                                             acTrans.Commit()
  14.                                             'acNewDoc.SendStringToExecute("_zoom _all ", True, True, False)
  15.                                         End Using
  16.                                     End Using
  17.                                     Dim min2d As Point2d = New Point2d(minX, minY)
  18.                                     Dim max2d As Point2d = New Point2d(maxX, maxY)
  19.                                     Dim view As ViewTableRecord = New ViewTableRecord()
  20.                                     view.CenterPoint = min2d + ((max2d - min2d) / 2.0)
  21.                                     view.Height = max2d.Y - min2d.Y
  22.                                     view.Width = max2d.X - min2d.X
  23.                                     'acNewDoc.Editor.SetCurrentView(view)'эта сточка не работает
  24.                                     'acNewDoc.SendStringToExecute("_zoom _all ", True, True, False)'и так не работает
  25.                                     acNewDoc.Database.SaveAs(strSave, True, DwgVersion.AC1021, acNewDoc.Database.SecurityParameters)
  26.                                     acNewDoc.CloseAndDiscard

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Объекты копируются, но хотелось бы реализовать Zoom all, что то вроде того
Для этой цели нужно переключаться на новый документ. Ну и SendStringToExecute не подходит - выполнится после завершения команды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
На форуме уже обсуждалось как зуммировать чертеж без открытия в редакторе: https://adn-cis.org/forum/index.php?topic=831.msg3438#msg3438

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Не помогает. Документ у меня новый открывается, может и замудрил, но срочно надо. Все программа делает, создает документ, копирует примитивы, осталось на них отцентрироватьмя. Они все в модели, листы не нужны.
Код - vb.net [Выбрать]
  1. Dim sLocalRoot As String = Application.GetSystemVariable("LOCALROOTPREFIX")
  2.                                     Dim acDocMgr As DocumentCollection = Application.DocumentManager
  3.                                     Dim acNewDoc As Document = acDocMgr.Add(strTemplatePath)
  4.                                     Dim acDbNewDoc As Database = acNewDoc.Database
  5.                                     acDocMgr.MdiActiveDocument = acNewDoc
  6.                                     Using acLckDoc As DocumentLock = acNewDoc.LockDocument()
  7.                                         Using acTrans = acDbNewDoc.TransactionManager.StartTransaction()
  8.                                             Dim acBlkTblNewDoc As BlockTable
  9.                                             acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead)
  10.                                             Dim acBlkTblRecNewDoc As BlockTableRecord
  11.                                             acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  12.                                             Dim acIdMap As IdMapping = New IdMapping()
  13.                                             db.WblockCloneObjects(idColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Ignore, False)
  14.                                             acTrans.Commit()
  15.                                         End Using
  16.                                     End Using
  17.                                     Dim min2d As Point2d = New Point2d(minX, minY)
  18.                                     Dim max2d As Point2d = New Point2d(maxX, maxY)
  19.                                     Dim view As ViewTableRecord = New ViewTableRecord()
  20.                                     view.CenterPoint = min2d + ((max2d - min2d) / 2.0)
  21.                                     view.Height = max2d.Y - min2d.Y
  22.                                     view.Width = max2d.X - min2d.X
  23.                                     acNewDoc.Editor.SetCurrentView(view)
  24.                                     acNewDoc.Database.SaveAs(strSave, True, DwgVersion.AC1021, acNewDoc.Database.SecurityParameters)
  25.                                     acNewDoc.CloseAndDiscard

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Захаров Максим,
Тебе avc подсказал решение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Не понятно зачем загружать чертеж в редактор (со всеми тормозами), если потом сразу закрывать?
Ну и я в подобном случае использовал имеющийся активный вид а не создавал новый. Это работало.
Код - C# [Выбрать]
  1.         using ViewportTable vTab = db.ViewportTableId.Open(OpenMode.ForRead) as ViewportTable;
  2.         ObjectId acVptId = vTab["*Active"];
  3.         using ViewportTableRecord vpTabRec = acVptId.Open(OpenMode.ForWrite) as ViewportTableRecord;

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не понятно зачем загружать чертеж в редактор (со всеми тормозами), если потом сразу закрывать?
Наверное идея в том, чтобы использовать файл шаблона. Хотя можно было сделать проще - скопировать шаблон как dwg-файл, а затем его открыть через ReadDwgFile.
Захаров Максим,
Кстати, перед центрированием/масштабированием не забудь вызвать UpdateExt(true) чтобы получить правильные границы чертежа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Попробовал, не помогает
Теперь пишет ошибка записи файла (ошибка на 28 строке). Может я не правильно объяснил, мне надо в пространстве модели отцентрироваться, а похоже данные строки avs в листе мне объекты отображает
Код - vb.net [Выбрать]
  1. Dim sLocalRoot As String = Application.GetSystemVariable("LOCALROOTPREFIX")
  2.                                     Dim acDocMgr As DocumentCollection = Application.DocumentManager
  3.                                     Dim acNewDoc As Document = acDocMgr.Add(strTemplatePath)
  4.                                     Dim acDbNewDoc As Database = acNewDoc.Database
  5.                                     acDocMgr.MdiActiveDocument = acNewDoc
  6.                                     Using acLckDoc As DocumentLock = acNewDoc.LockDocument()
  7.                                         Using acTrans = acDbNewDoc.TransactionManager.StartTransaction()
  8.                                             Dim acBlkTblNewDoc As BlockTable
  9.                                             acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead)
  10.                                             Dim acBlkTblRecNewDoc As BlockTableRecord
  11.                                             acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  12.                                             Dim acIdMap As IdMapping = New IdMapping()
  13.                                             db.WblockCloneObjects(idColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Ignore, False)
  14.                                             Dim min2d As Point2d = New Point2d(minX, minY)
  15.                                             Dim max2d As Point2d = New Point2d(maxX, maxY)
  16.                                             Using vTab As ViewportTable = acDbNewDoc.ViewportTableId.Open(OpenMode.ForRead)
  17.                                                 Dim acVptId As ObjectId = vTab("*Active")
  18.                                                 Using vpTabRec As ViewportTableRecord = acVptId.Open(OpenMode.ForWrite)
  19.                                                     vpTabRec.CenterPoint = min2d + ((max2d - min2d) / 2.0)
  20.                                                     vpTabRec.Height = max2d.Y - min2d.Y
  21.                                                     vpTabRec.Width = max2d.X - min2d.X
  22.                                                     'acNewDoc.Editor.SetCurrentView(vpTabRec)
  23.                                                 End Using
  24.                                             End Using
  25.                                             acTrans.Commit()
  26.                                         End Using
  27.                                     End Using
  28.                                     acNewDoc.Database.SaveAs(strSave, True, DwgVersion.AC1021, acNewDoc.Database.SecurityParameters)
  29.                                     acNewDoc.CloseAndDiscard

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Захаров Максим,
Ну а как оно может помочь, если делать совсем не то, что тебе предлагают?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Прошу прощения, если не так вопрос сформулировал. Я это понял когда добавил строчки кода от avc. В пространстве модели объекты не появились, зато в листе2 в видовом экране все получилось. Тоже пригодиться в будущем. Но вот ошибка пошла при сохранении файла, но объекты копируются. Мне бы отцентрироваться в пространстве модели, а то пользователь откроет файл, и подумает что там ни чего нет

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Возможно у вас в шаблоне записан активный вьюпорт на листе. Попробуйте переключиться на модель.
А что за ошибка при сохранении - это отдельная тема. Может правда файл такой невозможно создать или он заблокирован. Попробуйте не открывать шаблон в редакторе, работать с БД закрытого чертежа.

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Вообщем я все переделал как и советовали. Да конечно, теперь все работает быстрее, создал пустой чертеж на основе шаблона acadiso.
Но все равно, в пространстве модели объектов не видно, приходится открывать файл и делать zoom в ручную. В листах все есть
Код - vb.net [Выбрать]
  1. Using newDb As Database = New Database(False, False)
  2.                                         newDb.ReadDwgFile(strTemplatePath, FileOpenMode.OpenForReadAndWriteNoShare, True, Nothing)
  3.                                         newDb.CloseInput(True)
  4.                                         Dim newDbMsId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(newDb)
  5.                                         Dim idMap As IdMapping = New IdMapping()
  6.                                         db.WblockCloneObjects(idColl, newDbMsId, idMap, DuplicateRecordCloning.Replace, False)
  7.                                         Dim prevDb As Database = HostApplicationServices.WorkingDatabase
  8.                                         HostApplicationServices.WorkingDatabase = newDb
  9.                                         newDb.UpdateExt(True)
  10.                                         Using vTab As ViewportTable = TryCast(newDb.ViewportTableId.Open(OpenMode.ForRead), ViewportTable)
  11.                                             Dim acVptId As ObjectId = vTab("*Active")
  12.                                             Using vpTabRec As ViewportTableRecord = TryCast(acVptId.Open(OpenMode.ForWrite), ViewportTableRecord)
  13.                                                 Dim scrRatio As Double = (vpTabRec.Width / vpTabRec.Height)
  14.                                                 Dim matWCS2DCS As Matrix3d = Matrix3d.PlaneToWorld(vpTabRec.ViewDirection)
  15.                                                 matWCS2DCS = Matrix3d.Displacement(vpTabRec.Target - Point3d.Origin) * matWCS2DCS
  16.                                                 matWCS2DCS = Matrix3d.Rotation(-vpTabRec.ViewTwist, vpTabRec.ViewDirection, vpTabRec.Target) * matWCS2DCS
  17.                                                 matWCS2DCS = matWCS2DCS.Inverse()
  18.                                                 Dim extents As Extents3d = New Extents3d(db.Extmin, db.Extmax)
  19.                                                 extents.TransformBy(matWCS2DCS)
  20.                                                 Dim width As Double = (extents.MaxPoint.X - extents.MinPoint.X)
  21.                                                 Dim height As Double = (extents.MaxPoint.Y - extents.MinPoint.Y)
  22.                                                 Dim center As Point2d = New Point2d((extents.MaxPoint.X + extents.MinPoint.X) * 0.5, (extents.MaxPoint.Y + extents.MinPoint.Y) * 0.5)
  23.                                                 If width > (height * scrRatio) Then height = width / scrRatio
  24.                                                 vpTabRec.Height = height
  25.                                                 vpTabRec.Width = height * scrRatio
  26.                                                 vpTabRec.CenterPoint = center
  27.                                             End Using
  28.                                         End Using
  29.                                         HostApplicationServices.WorkingDatabase = prevDb
  30.                                         newDb.SaveAs(strSave, DwgVersion.AC1021)
  31.                                     End Using

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Так вы выяснили, что там в шаблоне активно модель или лейаут? Переключение на модель так и не пробовали (newDb.TileMode=true)?
« Последнее редактирование: 18-07-2022, 23:11:23 от avc »

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Нет не помогает. В модели объекты далеко, в листах все ок
Код - vb.net [Выбрать]
  1. Using newDb As Database = New Database(False, False)
  2.                                         newDb.ReadDwgFile(strTemplatePath, FileOpenMode.OpenForReadAndWriteNoShare, True, Nothing)
  3.                                         newDb.CloseInput(True)
  4.                                         Dim newDbMsId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(newDb)
  5.                                         Dim idMap As IdMapping = New IdMapping()
  6.                                         db.WblockCloneObjects(idColl, newDbMsId, idMap, DuplicateRecordCloning.Replace, False)
  7.                                         Dim prevDb As Database = HostApplicationServices.WorkingDatabase
  8.                                         HostApplicationServices.WorkingDatabase = newDb
  9.                                         newDb.UpdateExt(True)
  10.                                         newDb.TileMode = True
  11.                                         Using vTab As ViewportTable = TryCast(newDb.ViewportTableId.Open(OpenMode.ForRead), ViewportTable)
  12.                                             Dim acVptId As ObjectId = vTab("*Active")
  13.                                             Using vpTabRec As ViewportTableRecord = TryCast(acVptId.Open(OpenMode.ForWrite), ViewportTableRecord)
  14.                                                 Dim scrRatio As Double = (vpTabRec.Width / vpTabRec.Height)
  15.                                                 Dim matWCS2DCS As Matrix3d = Matrix3d.PlaneToWorld(vpTabRec.ViewDirection)
  16.                                                 matWCS2DCS = Matrix3d.Displacement(vpTabRec.Target - Point3d.Origin) * matWCS2DCS
  17.                                                 matWCS2DCS = Matrix3d.Rotation(-vpTabRec.ViewTwist, vpTabRec.ViewDirection, vpTabRec.Target) * matWCS2DCS
  18.                                                 matWCS2DCS = matWCS2DCS.Inverse()
  19.                                                 Dim extents As Extents3d = New Extents3d(db.Extmin, db.Extmax)
  20.                                                 extents.TransformBy(matWCS2DCS)
  21.                                                 Dim width As Double = (extents.MaxPoint.X - extents.MinPoint.X)
  22.                                                 Dim height As Double = (extents.MaxPoint.Y - extents.MinPoint.Y)
  23.                                                 Dim center As Point2d = New Point2d((extents.MaxPoint.X + extents.MinPoint.X) * 0.5, (extents.MaxPoint.Y + extents.MinPoint.Y) * 0.5)
  24.                                                 If width > (height * scrRatio) Then height = width / scrRatio
  25.                                                 vpTabRec.Height = height
  26.                                                 vpTabRec.Width = height * scrRatio
  27.                                                 vpTabRec.CenterPoint = center
  28.                                             End Using
  29.                                             'newDb.Pextmin = min2d
  30.                                             'newDb.Pextmax = max2d
  31.                                         End Using
  32.                                         HostApplicationServices.WorkingDatabase = prevDb
  33.                                         newDb.SaveAs(strSave, DwgVersion.AC1021)
  34.                                     End Using

Отмечено как Решение Захаров Максим 19-07-2022, 21:18:48

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

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Все благодарю, все получилось. Большое спасибо avc
Код - vb.net [Выбрать]
  1. Using newDb As Database = New Database(False, False)
  2.                                         newDb.ReadDwgFile(strTemplatePath, FileOpenMode.OpenForReadAndWriteNoShare, True, Nothing)
  3.                                         newDb.CloseInput(True)
  4.                                         Dim newDbMsId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(newDb)
  5.                                         Dim idMap As IdMapping = New IdMapping()
  6.                                         db.WblockCloneObjects(idColl, newDbMsId, idMap, DuplicateRecordCloning.Replace, False)
  7.                                         Dim prevDb As Database = HostApplicationServices.WorkingDatabase
  8.                                         HostApplicationServices.WorkingDatabase = newDb
  9.                                         newDb.UpdateExt(True)
  10.                                         newDb.TileMode = True
  11.                                         Using vTab As ViewportTable = TryCast(newDb.ViewportTableId.Open(OpenMode.ForRead), ViewportTable)
  12.                                             Dim acVptId As ObjectId = vTab("*Active")
  13.                                             Using vpTabRec As ViewportTableRecord = TryCast(acVptId.Open(OpenMode.ForWrite), ViewportTableRecord)
  14.                                                 Dim scrRatio As Double = (vpTabRec.Width / vpTabRec.Height)
  15.                                                 Dim matWCS2DCS As Matrix3d = Matrix3d.PlaneToWorld(vpTabRec.ViewDirection)
  16.                                                 matWCS2DCS = Matrix3d.Displacement(vpTabRec.Target - Point3d.Origin) * matWCS2DCS
  17.                                                 matWCS2DCS = Matrix3d.Rotation(-vpTabRec.ViewTwist, vpTabRec.ViewDirection, vpTabRec.Target) * matWCS2DCS
  18.                                                 matWCS2DCS = matWCS2DCS.Inverse()
  19.                                                 Dim extents As Extents3d = New Extents3d(newDb.Extmin, newDb.Extmax)
  20.                                                 extents.TransformBy(matWCS2DCS)
  21.                                                 Dim width As Double = (extents.MaxPoint.X - extents.MinPoint.X)
  22.                                                 Dim height As Double = (extents.MaxPoint.Y - extents.MinPoint.Y)
  23.                                                 Dim center As Point2d = New Point2d((extents.MaxPoint.X + extents.MinPoint.X) * 0.5, (extents.MaxPoint.Y + extents.MinPoint.Y) * 0.5)
  24.                                                 If width > (height * scrRatio) Then height = width / scrRatio
  25.                                                 vpTabRec.Height = height
  26.                                                 vpTabRec.Width = height * scrRatio
  27.                                                 vpTabRec.CenterPoint = center
  28.                                             End Using
  29.                                         End Using
  30.                                         HostApplicationServices.WorkingDatabase = prevDb
  31.                                         newDb.SaveAs(strSave, DwgVersion.AC1021)
  32.                                     End Using