nanoCAD и системные переменные
На форуме dwg.ru появился запрос на смену привязки в процессе работы Lisp-кода. Фигня вопрос - подумал я. И как же капитально я обломился!
Суть задачи проста и незатейлива - сменить режим привязки, что-то там запросить у пользователя (к примеру, точку), и вернуть все обратно как было.
В ACAD подобная конструкция сработает как и ожидается:
1 2 3 4 | (setvar "osmode" 1) (setq pt1 (getpoint "\nEnd point : ")) (setvar "osmode" 512) (setq pt2 (getpoint "\nNearest point : ")) |
Режим привязки будет корректно меняться. Но в NC подобное не срабатывает ни разу. Полное ощущение, что setvar тупо игнорится.
В чате посоветовали в настройках, вызываемых через _.params, отключить принудительное назначение привязки (ну ни себе фига, я и не думал в эту сторону от слова совсем!). Не помогло.
Уж не помню, на основании чего я сделал вывод, что после установки osmode может помочь вызов какой-либо команды:
1 2 3 4 5 6 7 8 | (setvar "osmode" 1) (command "_.point" "0,0,0") (entdel (entlast)) (setq pt1 (getpoint "\nEnd point : ")) (setvar "osmode" 512) (command "_.point" "0,0,0") (entdel (entlast)) (setq pt2 (getpoint "\nNearest point : ")) |
Не-а, эффект равен нулю.
Ладно, думаю - но уж на NET-то должно все работать нормально! Угу, ага, губозакатывательную машинку забыл купить:
1 2 3 4 5 6 | Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Application.SetSystemVariable("osmode", 1); PromptPointResult pt1 = ed.GetPoint("\nEnd point"); Application.SetSystemVariable("osmode", 512); PromptPointResult pt2 = ed.GetPoint("\nNearest point"); |
Все то же, все там же.
В результаты выяснилось, что системная переменная osmode в NC меняется только в единственном случае - смены ее через команду (!!!!). Т.е. вот такой код сработает как и заказывалось:
1 2 3 4 | (command "osmode" 1) (getpoint "\nEnd point : ") (command "osmode" 512) (getpoint "\nNearest point ") |
А ведь было у меня ощущение, что NC не сильно дружит с системными переменными!
Первое: в ком.строке колочу dwgcodepage. На выходе - 29. Но стоит запросить (getvar "dwgcodepage") - и результат "ANSI_1251".
Второе: вбиваю название любой системной переменной. Хоть osmode, хоть celtype, жму Enter - и хочу посмотреть на нее справку. Что нормальный человек жмет? Правильно, F1. Только сильно повезет, если справка вообще откроется. А уж о том, чтоб сразу активировать соответствующую закладку, вообще речи не идет. Кстати, в поиске системные переменные участвуют или нет?
Третье: программист может вполне легко создать собственную системную переменную. Кто не верит - вбейте в ком.строке (setvar "abcdef" 1234), а потом - (getvar "abcdef"). Мне одному это кажется дикостью невероятной?
Вывод: меняя системные переменные в NC, приходится проверять даже железобетонно работающие решения. На справку надежды ноль.
Пожелание разработчикам:
- во-первых, привести работу с системными переменными (вообще всеми!) в единый режим независимо от варианта смены их значений
- во-вторых, дополнить и по-новой проиндексировать справку
- в-третьих, запретить программисту создавать собственные системные переменные.
- в-четвертых, самим разобраться и прописать в справке, как собственные режимы привязки коррелируют с прописанными значениями в _.params (поскольку лично я в справке этой информации навскидку не увидел).
P.S. NC 23.1.
В чате подсказали возможное решение проблемы - писать названия системных переменных ТОЛЬКО В ВЕРХНЕМ РЕГИСТРЕ. Бред и маразм - но вроде бы по отзывам работает.
Справку по системным переменным можно посмотреть в функциональной панели "Системные переменные" или иначе - "Монитор системных переменных".
Максим
Это понятно. Непонятно, почему в каде (setvar "osmode" 0) и (setvar "OSMODE" 0) работают, а в нанике сработает только второй вариант, и никак иначе. Статья именно про это, а не про "где посмотреть".