как все таки выключить ВЭА что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз
А что это за понятие такое "Выключить ВЭ"? Сколько знаком с автокадом, но слышу в первый раз(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ficecream.me%2Fuploads%2Fa9faf2030f5a58512f0c1b1bf3403fc0.png&hash=2b4e8aafb445f0dce0f6ae293d767f60)
Возможно, что пытаетесь отключить основной видовой экран листа.Эээ.. а можно несколько подробней?
Эээ.. а можно несколько подробней?Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран. Его отключить нельзя. Вот тут у меня была похожая проблема: http://adn-cis.org/forum/index.php?topic=228.0
Я так понимаю ,что всё то что мы непосредственно в пространстве листа рисуем, попадает в этот самый основной видовой экран.Да, это оно. Спасибо, не знал эту тонкость.
Эээ.. а можно несколько подробней?Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа. Отключить его нельзя. И вообще трогать не надо - большинство свойств и методов вызывает ошибку. Есть на каждом листе.
Кстати, не самый рациональный алгоритм при большом количестве BlockTableRecord. Лучше было бы подойти со стороны Layout - их всегда меньше и из каждого Layout можно сразу получить все Viewport'ы в нём (Layout.GetViewports).Ну так и получилось в итоге, т.к. искать ID для первого ВЭ было как то не с руки, кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...
Вьюпорт с Number==1 - это не вьюпорт, а просто хранилице визуальных настроек самого листа.А вот как найти первый ВЭ... спасибо. =О)
кто их знает какой из них первый, какой второй, то зашел со стороны Layout ...Я ж написал - Number == 1
Я ж написал - Number == 1Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.
Я ж написал - Number == 1Увы но нет, это так не работает, автокад назначает номера видовым экранам только в открытом листе, для всех остальных ВЭ на остальных листах номер всегда = -1.
Вот.Заодно уточни версию AutoCAD в которой проверял. Это может быть баг в конкретной версии.
If no changes have been made, or the viewport is not on, or is not onscreen, then this function does nothing.
LAYOUTREGENCTL не влияет?Влияет! Если 0 - то всё ок. Если 2 - то как я описывал ранее.
вот так отрабатывает без ошибокВот тут я перестал понимать...
Кроме Layout1 никакие листы не инициализированы:т.е. до тех пор, пока не будет инициирован лист, ВЭ не будет записано ID владельца или владельцу не будет установлено свойство, что он - лист?
т.е. до тех пор, пока не будет инициирован лист, ВЭ не будет записано ID владельца или владельцу не будет установлено свойство, что он - лист?До тех пор у листа не будет Viewport'ов. На тех картинках, которые я привёл видно, что GetViewports для неинициализированных листов возвращает пустой список. Меня удивило другое. Такое впечатление, что лист "Корпус 1. Секция 3. Стены подвала." (впрочем как и многие другие) был создан и не инициализирован (возможно программно?) и в него были добавлены Viewport'ы до инициализации. Вручную, как я понимаю это сделать нельзя - при переключении на лист он инциализируется.
Такое впечатление, что лист "Корпус 1. Секция 3. Стены подвала." (впрочем как и многие другие) был создан и не инициализирован (возможно программно?) и в него были добавлены Viewport'ы до инициализации. Вручную, как я понимаю это сделать нельзя - при переключении на лист он инциализируется.Нет. Эти листы делались либо из шаблона (другой файл), либо просто добавлялись руками, ВЭ создавались руками.
Layout1, Layout2 ... делал точно руками в процессе тестирования кода из первого сообщения в этой теме.Посмотри значение переменной LAYOUTCREATEVIEWPORT.
LAYOUTCREATEVIEWPORT=0Вот поэтому что-то и не срослось.
я сам делал ВЭ командой _-vports
НО... для листов, которые были принудительно инициализированны, каким то чудом становятся видимыми ВЭ (те которые под номером 0) и выключаются.Похожая ситуация. Метод layout. Inizialise вдобавок выключают и существующие vp на некоторых других layouts или вообще на всех. Все vp делались руками в различных вариантах(обычный, подрезанный,полигональный,по примитиву).Возможно ли избежать создания видимого , но выключенного vp[0] и выключения существующих vp без переключений на каждый layout ?
Метод layout. Inizialise вдобавок выключают и существующие vp на некоторых других layouts или вообще на всех.Это или баг в AutoCAD или в конкретном чертеже.
в layout1 и layaout2 включенные vp.В них вообще нет Viewport'ов - эти листы не были инициализированы. Когда ты на них переключаешься, AutoCAD их сам инициализирует и на них получаются Viewport'ы.
Поэтому сначала нужно создавать Layout, инициализировать егоЯ все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является инициализацией?
это все понятно, кроме:Даже если ты установил LAYOUTCREATEVIEWPORT в 0, при создании листа Viewport'ы не создаются, но при переключении на созданный лист AutoCAD неявно выполняет его инициализацию и создаёт в нём один основной (невидимый) Viewport:Поэтому сначала нужно создавать Layout, инициализировать егоЯ все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является инициализацией?
И в них (похоже программно) закинуты Viewport'ы.Это не так.
Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является инициализацией?Такой последовательность вручную можно назвать инициализацией?
Цитата: Александр Ривилис от 22-09-2020, 12:11:21Вручную можно создать Viewport только если переключится на соответствующий Layout, что приводит к его инициализации (фактически вызов Layout.Initialize()). В этом случае в нём всегда есть как минимум два Viewport'а - один основной невидимый, второй - который ты создал.
Я все layout создаю руками(т.е последовательно создаю вкладку, в ней создаю viewport, затем создаю следующую вкладку,в ней свой viewport) - это не является инициализацией?
Такой последовательность вручную можно назвать инициализацией?
Если нужно, видео могу позднее записать.Было бы очень желательно, но вот только делать это в AutoCAD 2013 совершенно бессмысленно, так как эта версия уже очень давно не поддерживается. Если есть возможность - запиши в одной из двух последних версий (2020 или 2021).
В первой вкладке копируем существующий вьюпорт.Копируешь через буфер обмена, или командой _COPY?
Copy. В 2020 не могу сегодня проверитьХорошо. Запиши в 2013. Я по твоей последовательности проверю в 2021. Если такой ошибки не будет, то увы... Значит исправили в одной из последующих версий.
ARX не подойдет? MGD не пойму как ставить на 13й.Нет, не подойдет. Он не всю информацию снимает. Как сказано здесь: https://adn-cis.org/forum/index.php?topic=7274.0
Чтобы установить ARXDBG и MGDDBG необходимо их BUNDLE'ы разархивировать в каталог %ProgramFiles%\Autodesk\ApplicationPlugins
Через netload вообще ничего не ставится, а загружается. Но не в этом случае. Здесь AutoCAD при запуске сам загружает при помощи автозагрузчика. И загружает автозагрузчик для AutoCAD 2013 файл "C:\Program Files\Autodesk\ApplicationPlugins\Autodesk DWG MgdDBG.bundle\Contents\Resources\DWGMgdDbgSource\bin\DebugA2013\MgdDbg.dll"Off-Topic: показать
если достаточно разархивировать туда же куда и arx, т.е. %ProgramFiles%\Autodesk\ApplicationPlugins, то нет не подгружает.попробую автокад переустановитьДолжно быть так:
Не грузится mgd...Через netload указанный мной выше файл тоже не грузится?
угуНу тогда даже и не знаю чем помочь... Попробуй у себя перекомпилировать MGDDBG для AutoCAD 2013.
Layout.GetViewports возвращает пустой список для неактивного листа.
придётся таки переключаться на нужный лист, а затем уже проверять Layout.GetViewports
Не грузится mgd...(:загрузилось. некоторые файлы, не все, но самые нужные, были заблокированы.
узнал об этом, прочитав соответствующую тему:).Сочувствую. Но теперь думаю, что надолго это запомнишь. Кстати, тоже самое касается не только dll, но и arx/dbx/crx и т.д.
надолго это запомнишь
В связи с вышеобозначенной ситуацией, если не использовать layout.GetVieports и проходить обычным циклом по пространству листа, первый попавшийся id vieport-а, это 0-й vp и далее следущие попадающиеся vp, совпадают с vp.Number или не факт?Увы, но это не факт.
То есть номер viewport -а без layout.GetViewports никак не получить?Фактически номер у него возникает только тогда, когда Layout становится активным:
номер у него возникает только тогда, когда Layout становится активным
Какой способ будет предпочтительней при прочих равных?Handle
Насколько быстро ищет по базе handle's?Практически моментально. Только лучше вместо GetObjectId использовать метод TryGetObjectId. Это обсуждалось у нас на форуме.
Это обсуждалось у нас на форумеАга, мелькало где то.
Он ведь не факт, что первый в коллекции?Не 100% факт, но можно поэкспериментировать.
Не 100% фактХм... https://adn-cis.org/forum/index.php?topic=228.msg415#msg415
Дима. Ты не прочитал всю эту тему. В данном случае идёт речь о том, что Layout.GetViewports возвращает пустой массив, хотя Layout был инициализирован, чертеж был сохранён и открыт повторно. Этот массив не пустой только если Layout был инициализирован в этой сессии AutoCAD или на него в этой сессии AutoCAD переключались.Не 100% фактХм... https://adn-cis.org/forum/index.php?topic=228.msg415#msg415
Возможно да, не так понял. Но вроде как спрашивали именно про это... Ну да ладно, вопрошающий сам разберётся :)Тем не менее почитай тему внимательно. Ответ от ADN DevHelp меня сильно удивил. Я был уверен, что если вызвано Layout.Initialize() или было хотя-бы переключение на этот лист, то после сохранения чертежа, его повторного открытия и вызова Layout.GetViewports() возвращает не пустой массив и мы всегда сможем определить главный Viewport. Оказалось, что это не так.
каким образом получить из коллекции вьюпортов конкретного листа, к примеру, 0-й вьюпорт этого листа? Он ведь не факт, что первый в коллекции? Или его ObjectId можно чему-то сопоставить/приравнять?
1. Если лист активныйЕсли лист активный, то достаточно Layout.GetViewports() и взять первый Viewport - это будет однозначно быстрее, так как AutoCAD уже сам проанализировал лист, нашел все его Viewport'ы и определил какой из них главный.
1.1 получаешь Database.GetViewports(true) и берешь первый лист
1.2 получаешь BlockTableRecordId, получаешгь блок листа (BlockTableRecord) находишь все Viewport, берешь с Viewport.Number==1 (1....n)
Возможно у листа отсутствует Layout, если лист не был инициализирован.А вот это как??? Лист == Layout.
А вот это как??? Лист == Layout.Прошу прощения, написал не правильно. Имел ввиду такой сценарий:
Предполагаю, что можно склонировать блок листа в чертеж, и при этом не появиться запись(Layout) в NOD/ACAD_LAYOUT.Это только если всё это делать незаконными методами. LayoutManager.CloneLayout клонирует правильно Layout, LayoutManager.DeleteLayout его правильно удаляет.