Мои знакомые инженеры отказываются переходить на 2017 т.к. не могут открывать в нем старые чертежи. Виды, сделанные через ViewBase (БазВид) не показывают ничего или показывают кусочки модели. Когда я взялся решить эту проблему, я был уверен, что плагин ModelDoc просто не имеет нормальной обратной совместимости и надо создавать виды заново. Но вновь созданные виды тоже не работали и я занялся чисткой чертежей. Я написал программку, которая убивала все объекты AcDbViewBorder, AcDbDetailSymbol и AcDbSectionSymbol. Потом нашел мусор в словарях и удалил словари SY_IDW_DICT_ROOT, SY_IDW_VERSION и SY_ROOT_DICTIONARY (Похоже плагин ModelDoc когда то назывался Synergy). Но даже в таком стерильном документе новые виды по старой модели не строились. Я понял, что дело не в совместимости версий. Есть объекты чертежа, с которыми 2015 работает нормально, а 2017 не справляется (про 2016 мнения народа расходятся). Пару дней помучился – нашел-таки эти объекты. Это зеркальные блоки. Если любой солид загнать в блок и потом вызвать Mirror для блока – то ViewBase уже ничего не покажет. Или покажет только первый, незеркальный блок. Напоровшись на зеркальный блок, плагин прекращает отрисовку без всяких сообщений об ошибках. Все нормальные объекты, которые он еще не успел прочертить, прочерчены не будут. Ребята из моей команды используют Mirror ежеминутно – удобно расставлять симметричные объекты. Поэтому все старые чертежи не отображались. Проблема нигде не упоминается в интернете (или я не нашел?) и я стал искать, что можно сделать. Дальше уже чистые танцы с бубном без всякой логики.
Я заметил, что зеркальность отображается в свойствах блока как Scale X = -1. Иногда Зеркало по Z выворачивает объекты. Если изменить масштаб хотя бы чуть-чуть, на -1.0000001 – ViewBase сразу заработает! А в чертеже это не видно. Ура! Пишу программу и получаю банан – большинство больных BlockReference не принимает даже своей собственной матрицы трансформации. Т.е.
br.BlockTransform = br.BlockTransform вызывает ошибку. Автокад сам считает недопустимой трансформацию, сделанную его же командой Mirror. Но можно поиграться с br.ScaleFactors. Тут еще много приколов. Часто недостаточно обновить только зеркальный блок, надо еще потеребить остальные ссылки на этот же блок. Часто Автокад просто отказывается присваивать новый ScaleFactors – никаких ошибок, но у объекта остался старый ScaleFactors. Помогает трансформация по матрице масштабирования. Но и она может игнорироваться, если коэффициент масштабирования меньше чем 1.00001 (т.е. автокад считает 1.000001 == 1). Короче, работающий бубен я, в конце концов, сделал. Если кто хочет покамлать – опубликую код. Но если опять вызвать Mirror, то и с бубном надо танцевать заново. А ошибка от масштабирований будет накапливаться. Вернуть Scale X обратно на -1 нельзя – опять отключатся виды.
Если кто знает менее шаманский метод – напишите пожалуйста.
p.s. извиняюсь за многословность. Долго шаманил, дым в голове