Клонирование или копирование листа (layout)

Автор Тема: Клонирование или копирование листа (layout)  (Прочитано 26266 раз)

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

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
У меня платформа VB.NET представленную ссылку попробую разобрать.



Вот тут беру код, но у VB.NET не полный функционал VBA. Спасибо за помощь

Если я Вас правильно понял, средствами VB.NET лист не клонировать?

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
В сообщении помеченном как решение у меня не подключается "Transaction" не знаю что подгрузить, но и не к чему наверное, то есть лишние библиотеки.
Вот нашел код, но выдаёт ошибку
Код - vb.net [Выбрать]
  1. CadApp = New AcadApplication
  2. CadApp.ActiveDocument.Close()
  3. CadApp.Documents.Open(OpenFileDialog.FileName)
  4. CadApp.Visible = True
  5. CadDoc = CadApp.ActiveDocument
  6.  
  7. Dim iInd As Integer, iCntLayout As Integer
  8. Dim objLayout As AcadLayout, objNewLayout As AcadLayout
  9. Dim objEnt As AcadObject
  10. Dim arrObjBlock() As Object
  11. iCntLayout = CadDoc.Layouts.Count
  12. objLayout = CadDoc.Layouts.Item(iCntLayout - 1)
  13. objNewLayout = CadDoc.Layouts.Add(CadDoc.Layouts.Item(iCntLayout - 1).Name & "(copy)")
  14. ReDim arrObjBlock(objLayout.Block.Count - 1)
  15. iInd = 0
  16. For Each objEnt In objLayout.Block
  17. arrObjBlock(iInd) = objEnt
  18. iInd = iInd + 1
  19. Next
  20. CadDoc.CopyObjects(arrObjBlock, objNewLayout.Block)
  21. objNewLayout.CopyFrom(objLayout)



Выдаёт ошибку, System.Runtime.lnteropServices.COMException: "Неверный массив объектов" - а то на картинке очень мелко, я так думаю вот тут "objNewLayout.Block" не правильный тип может, в книге сказано что это не обязательный параметр, но если его исключить, то тоже ошибка

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
В сообщении помеченном как решение у меня не подключается "Transaction" не знаю что подгрузить,
В этой теме или в той на которую я дал тебе ссылку?
Попробуй вместо:
Код - vb.net [Выбрать]
  1. Dim arrObjBlock() As Object
вставить:
Код - vb.net [Выбрать]
  1. Dim arrObjBlock() As Autodesk.AutoCAD.Interop.Common.AcadEntity

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Голова уже кругом, в какой системе я пишу, как она называется.
Код - vb.net [Выбрать]
  1. Dim CadLayout As Object = acLayoutMgr.GetLayoutId(grdLayout.Rows(grdLayout.CurrentCell.RowIndex).Cells(1).Value)
  2. acLayoutMgr.SetCurrentLayoutId(CadLayout) ' не принимает ID либо либо я не правильно понимаю команду
  3. acLayoutMgr.CurrentLayout = grdLayout.Rows(grdLayout.CurrentCell.RowIndex).Cells(1).Value ' это видимо только вывод, но ни как не присвоение значений.
Я знаю имя листа и его ID как мне переключаться между листами, либо тут вообще всё через транзакции происходит?

Tutorials пересмотрел массу, там и нашёл как получить список листов документа, много примеров настройки печати (но до этого ещё далеко, так как параметры печати считываются только из открытого листа - это я знаю как опытный пользователь AutoCAD) - это я к тому что прежде чем написать сюда, я пользовался поиском.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
D_TRex,
Ну как минимум вместо:
Код - vb.net [Выбрать]
  1. Dim CadLayout As Object = acLayoutMgr.GetLayoutId(grdLayout.Rows(grdLayout.CurrentCell.RowIndex).Cells(1).Value)
должно быть
Код - vb.net [Выбрать]
  1. Dim CadLayout As ObjectId = acLayoutMgr.GetLayoutId(grdLayout.Rows(grdLayout.CurrentCell.RowIndex).Cells(1).Value)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Это было и до этого, в смысле такой же текст

Вопрос больше в том возможно ли переключать листы из плагина, потому как до этого мне говорили что COM и вообще VB это прошлый век, вот решил попробовать и опять тупик. В COM всё просто нашёл коллекцию, считал все параметры, а тут нашел коллекцию, но это коллекция имён одного словаря, а вот как к нему обратиться - без понятия, вот по наитию пробую команды, но они видимо не подходят

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Вопрос больше в том возможно ли переключать листы из плагина
https://forums.autodesk.com/t5/net/change-current-layout/td-p/7461260

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

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

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Контекст вызова - есть список листов (не вкладки как в каде) при клике я планирую переходить на лист. Спасибо за оба совета проблема была в необходимости блокирования документа и после этого всё отлично заработало
Код - vb.net [Выбрать]
  1. CadDoc.LockDocument()
  2. acLayoutMgr.CurrentLayout = grdLayout.Rows(grdLayout.CurrentCell.RowIndex).Cells(1).Value
и не надо объявлять переменную. Спасибо

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Новая тема "яйца выеденного не стоит"
Код - vb.net [Выбрать]
  1. CadDoc.LockDocument()
потом документ сам разблокируется? Но вопрос следующий - последнее время заказчики требуют DWG хотя не имеют ни малейшего понятия о блоках, внешних ссылках и подшивках. Autodesk позволил ставить парольную защиту на открытие документа, а нет ли возможности блокирования (как допустим PDF) то есть только просмотр, копировать нельзя (допустим появится надпись "создано в учебной версии", редактировать нельзя, только просмотр и печать? Проблема острая так как я проектировщик и жалко отдавать свои блоки (взрывать потом атрибуты слетают) свои наработки, да даже просто они понятия не имеют о подшивке и поэтому открывается документ не корректно - так как его отлучили от основной массы.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
жалко отдавать свои блоки
Есть такой ресурс - dwg.ru, там один из крупнейших русскоязычных форумов пользователей САПР. Так вот, там эта тема про защиту чертежа поднималась и обсуждалась многократно. Можете ознакомиться: https://dwg.ru/cse?q=%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0%20dwg

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 626
  • Карма: 161
    • ПГСу Бложик
Проблема острая так как я проектировщик и жалко отдавать свои блоки (взрывать потом атрибуты слетают) свои наработки, да даже просто они понятия не имеют о подшивке и поэтому открывается документ не корректно - так как его отлучили от основной массы.
Решение давно известно, нужно написать для себя программу по расчленению сего и вся и от учению от подшивки и проекта, а так же удалению всего лишнего из файла чертежа и хорошо бы, разделения файла по листам... =о)

А на тему запрета редактирования, я лет 10 назад встречал чертеж в котором все линии были заменены на тексты, просто мелкий текст высотой в требуемую толщину линий, редактировать тот чертеж руками было крайне не просто. Было бы желание.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Новая тема "яйца выеденного не стоит"
Каждый вопрос, не имеющий прямого отношения к теме - требует создания отдельной темы!!!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Нужно самостоятельно разблокировать
Мне бы примерчик, я только недавно в этой среде по Вашему совету - вроде немного разобрался, опять же по Вашим примерам кода
нужно написать для себя программу по расчленению сего и вся
Идея хороша, правда надо подумать как быть с атрибутами, а ещё сложнее с AutoCAD Civil, у него вообще свои элементы, я даже не пробовал обратиться к ним программно, по поводу линий текстом вот сейчас читаю тему
Есть такой ресурс - dwg.ru
Я в курсе, там распространяют лисп для блокировки путем создания многовидового блока и там же рядом есть лисп для разблокировки

Хотелось бы посредством форума ещё ра обозначить тему и может быть вопрос будет оглашён разработчикам так как это больная тема, а допустим DWF не проходит так как просмотрщик не столь распространён.
Каждый вопрос, не имеющий прямого отношения к теме - требует создания отдельной темы!!!
Да я надеялся получить однозначный ответ, ну или вообще остаться без ответа, тем более не понятно в какую тему это занести.

Ах да ни в коем случае не в рекламных целях, но вот видео того что я хотел сделать, это ещё не всё, но с главными вопросами разобрался, собирал по крупицам код тут и в справке, могу скинуть исходники, но там ни какого порядка ))