EdwardSt Posted May 18 Report Share Posted May 18 8 минут назад, kpblc сказал: Ай, неправильно понимаешь (setq lst (sysvar-save '(("osmode" . 0)("aflags" . 16)))) ; ... (sysvar-restore lst) Ай, поправь, если я не прав: (sysvar-save сохраняет и устанавливает новые значения, а (sysvar-restore только восстанавливает (т.е. устанавливает). Если так, то ЛЮБОЙ из указанных мной вызовов должен дать ошибку в 5.1 Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 18 Report Share Posted May 18 Посмотри код: в sysvar-save проверяется - если устанавливаемая переменная не существует (getvar для несуществующей переменной возвращает nil), то функция и не пытается что-то там куда-то установить. Результирующий список получает только перечень измененных системных переменных с их начальным значением. Судя по всему, в NC5.1 попытка вызова (getvar "aflags") вернет nil - так что в результат sysvar-save эта переменная просто не попадет. Переменные установили, сохранили исходное значение - и после этого уже выполняем восстановление, используя результаты выполнения sysvar-save. По крайней мере логика именно такая у меня была. P.S. NC5.1 в наличии нет и вряд ли появится. 2 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 18 Report Share Posted May 18 7 минут назад, kpblc сказал: Судя по всему, в NC5.1 попытка вызова (getvar "aflags") вернет nil Скорее всего, да. Но немаленькая вероятность, что считать сможет, а установить - нет. Т.е., без краш-теста (sysvar-save в 5.1 однозначно сказать нельзя. Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 18 Report Share Posted May 18 Ну я предлагаю автору вопроса скачать мой код, сохранить как lsp, загрузить в NC и тут же в ком.строке: (setq lst (sysvar-save '(("osmode" . 0)("aflags" . 16)))) Привести здесь результаты выполнения (если скриншотом, то лучше всего сделать только ком.строку), а потом (sysvar-restore lst) И сюда результаты. Иначе мы гарантированно ничего не сможем ни сделать, ни придумать 1 Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 Не хотелось вмешиваться в Ваши жаркие баталии (весьма интересные), но для себя нашел выход в функции "разметки" ("Черчение" - "Точка" - "Разметка"). NC v5.1. Понимаю, что не "по Фен-Шую", но за неимением времени подойдет! Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 20 минут назад, Иван_ сказал: Не хотелось вмешиваться в Ваши жаркие баталии Вмешательства, собственно, и не требовалось. Это были вялые комменты в ожидании подробностей о результатах предлагаемых решений, т.к. самостоятельно проверить не можем (версия 5.1 нам недоступна). Не дождались ... Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 19 Report Share Posted May 19 Спойлер М-да, и надо же было забыть про стандартные команды _measure и _divide! Позор! Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 Уважаемый kpblc, я не совсем понял о "...скачать мой код". В каком посте он находится. Спасибо! Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 7 минут назад, Иван_ сказал: я не совсем понял о "...скачать мой код". Код из поста Его нужно сохранить в файл *.lsp., загрузить этот файл и выполнить команды из 1 Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 Спасибо! Я в программировании полный профан, но не пойму как вызвать вышеуказанный lisp. Код скопировал - вставил в блокнот (файл pikettest.txt) - через UnrealCommander переименовал в pikettest.lsp - загрузил в NC 5.1... добавлено через 4 минут Такое выдает Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 Попробуйте загрузить прилагаемый файл и Спойлер test.lsp Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 21 час назад, kpblc сказал: (getvar для несуществующей переменной возвращает nil), К сожалению, оказалось несколько напряжнее. Кроме nil еще и тревожное сообщение. 17 минут назад, Иван_ сказал: Спасибо. Предлагаю опробовать минимально модифицированный код Спойлер c_piket.lsp Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 Выдает это. Вызывал командой PIKET. Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 19 Report Share Posted May 19 13 минут назад, EdwardSt сказал: К сожалению, оказалось несколько напряжнее. Кроме nil еще и тревожное сообщение. Ну а с чего бы ему не быть-то Пробуй такой код test2.lsp Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 8 минут назад, Иван_ сказал: Выдает это. Вызывал командой PIKET. По-видимому, кроме отсутствующей переменной еще и синтаксис команды "_block" в 5.1 отличается. Попробуй из прилагаемого файла блок скопировать в свой чертеж и сразу удалить его. А после этого запустить команду piket. Если заработает, тот проблема остается на этапе создания нового описания блока. Криво, неудобно, но решаемо... Блок-пикет.dwg добавлено через 1 минуту 10 минут назад, kpblc сказал: Ну а с чего бы ему не быть-то Пробуй такой код Это не ко мне. У меня 5.1 не установлен Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 19 Report Share Posted May 19 Спойлер (defun fun_save-layer-status (doc / res) ;| * Сохранение статуса слоев. * Параметры вызова: doc ; активный документ, в котором надо работать |; (vlax-for item (vla-get-layers doc) (setq res (cons (cons item (mapcar (function (lambda (prop / temp) (setq temp (vlax-get-property item prop)) (vl-catch-all-apply (function (lambda () (vlax-put-property item prop :vlax-false) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply (cons prop temp) ) ;_ end of lambda ) ;_ end of function '("freeze" "lock") ) ;_ end of mapcar ) ;_ end of cons res ) ;_ end of cons ) ;_ end of setq ) ;_ end of vlax-for res ) ;_ end of defun (defun fun_restore-layer-status (layers) ;| * Восстановление статуса слоев * Параметры вызова: layers ; список типа '((<vla-указатель на слой> ("freeze" . <Заморожен слой>) ("lock" . <Слой заблокирован>) ...) |; (foreach item layers (foreach prop (cdr item) (vl-catch-all-apply (function (lambda () (vlax-put-property item (car prop) (cdr prop)) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of foreach ) ;_ end of foreach ) ;_ end of defun (defun fun_make-block-picket (doc name / blk_def layers height att_def) ;| * Создание блока для расстановки * Параметры вызова: doc ; указатель на документ, в котором создается блок name ; имя создаваемого блока |; (if (/= (type (setq blk_def (vl-catch-all-apply (function (lambda () (vla-item (vla-get-blocks doc) name) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'vla-object ) ;_ end of /= (progn (setq layers (fun_save-layer-status doc) height 1.25 ) ;_ end of setq (setq blk_def (vla-add (vla-get-blocks doc) (vlax-3d-point '(0. 0. 0.)) name)) (vla-addline blk_def (vlax-3d-point (list 0. (* height -0.5))) (vlax-3d-point (list 0. (* height 0.5))) ) ;_ end of vla-addline (setq att_def (vla-addattribute blk_def height acattributemodeverify "Пикет" (vlax-3d-point '(0.5 0.5 0.)) "picket" "" ) ;_ end of vla-addattribute ) ;_ end of setq (vla-put-stylename att_def "Standard") (vlax-for ent blk_def (vla-put-layer ent "0") (vla-put-lineweight ent aclnwtbyblock) (vla-put-color ent 0) (vla-put-linetype ent "ByBlock") ) ;_ end of vlax-for (fun_restore-layer-status layers) ) ;_ end of progn ) ;_ end of if blk_def ) ;_ end of defun Код не проверял, если что. 1 Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 добавлено через 2 минуты теперь блок picket предлагает (в окне редактора блоков), но после установки его (блока) в начальную точку процесс не идет. Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 В общем, нужно полностью уходить от использования (command ... Тогда есть шанс, что взлетит в 5.1. Если руки дойдут до переделки, то пригодятся и наводки от @kpblc Отлаживать в режиме сообщений на форуме слишком напряжно. Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 kpblc. Ещё раз объясните тугодуму. Скопировал код в блокнот - переименовал в .lsp - загрузил приложение... А какой командой его вызвать? PIKET вызывает старую версию. добавлено через 1 минуту EdwardSt в любом случае - спасибо за участие! Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 19 Report Share Posted May 19 Мой код предназначался @EdwardSt, каюсь. Там, грубо говоря, служебные функции, которые можно использовать в написании кода. Quote Link to comment Share on other sites More sharing options...
Иван_ Posted May 19 Report Share Posted May 19 kpblc а-а-а, лезу "вперед батьки" 2 Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted May 19 Report Share Posted May 19 (edited) 1 час назад, kpblc сказал: Некомандный метод создания блока (Показать контент) (defun fun_save-layer-status (doc / res) ;| * Сохранение статуса слоев. * Параметры вызова: doc ; активный документ, в котором надо работать |; (vlax-for item (vla-get-layers doc) (setq res (cons (cons item (mapcar (function (lambda (prop / temp) (setq temp (vlax-get-property item prop)) (vl-catch-all-apply (function (lambda () (vlax-put-property item prop :vlax-false) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply (cons prop temp) ) ;_ end of lambda ) ;_ end of function '("freeze" "lock") ) ;_ end of mapcar ) ;_ end of cons res ) ;_ end of cons ) ;_ end of setq ) ;_ end of vlax-for res ) ;_ end of defun (defun fun_restore-layer-status (layers) ;| * Восстановление статуса слоев * Параметры вызова: layers ; список типа '((<vla-указатель на слой> ("freeze" . <Заморожен слой>) ("lock" . <Слой заблокирован>) ...) |; (foreach item layers (foreach prop (cdr item) (vl-catch-all-apply (function (lambda () (vlax-put-property item (car prop) (cdr prop)) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of foreach ) ;_ end of foreach ) ;_ end of defun (defun fun_make-block-picket (doc name / blk_def layers height att_def) ;| * Создание блока для расстановки * Параметры вызова: doc ; указатель на документ, в котором создается блок name ; имя создаваемого блока |; (if (/= (type (setq blk_def (vl-catch-all-apply (function (lambda () (vla-item (vla-get-blocks doc) name) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'vla-object ) ;_ end of /= (progn (setq layers (fun_save-layer-status doc) height 1.25 ) ;_ end of setq (setq blk_def (vla-add (vla-get-blocks doc) (vlax-3d-point '(0. 0. 0.)) name)) (vla-addline blk_def (vlax-3d-point (list 0. (* height -0.5))) (vlax-3d-point (list 0. (* height 0.5))) ) ;_ end of vla-addline (setq att_def (vla-addattribute blk_def height acattributemodeverify "Пикет" (vlax-3d-point '(0.5 0.5 0.)) "picket" "" ) ;_ end of vla-addattribute ) ;_ end of setq (vla-put-stylename att_def "Standard") (vlax-for ent blk_def (vla-put-layer ent "0") (vla-put-lineweight ent aclnwtbyblock) (vla-put-color ent 0) (vla-put-linetype ent "ByBlock") ) ;_ end of vlax-for (fun_restore-layer-status layers) ) ;_ end of progn ) ;_ end of if blk_def ) ;_ end of defun Код не проверял, если что. Можно значительно короче и без COM (проверка наличия существующего описания вынесена за пределы функции) (defun b_piket ( / el h) (setq h 1.25) (setq el '((0 . "BLOCK") (2 . "piket") (70 . 2) (10 0.0 0.0 0.0))) (entmakex el) (setq el (list '(0 . "LINE") '(8 . "0") '(6 . "ByBlock") '(62 . 0) (list 10 0.0 (* h -0.5) 0.0) (list 11 0.0 (* h 0.5) 0.0))) (entmakex el) (setq el (list '(0 . "ATTDEF") '(8 . "0") '(62 . 0) (cons 40 h) '(1 . "") '(7 . "Standard") (list 10 0.0 0.0 0.0) '(3 . "Пикет") '(2 . "PICKET") '(70 . 8) '(280 . 0))) (entmakex el) (setq el '((0 . "ENDBLK"))) (entmakex el) ) Не столь академически тяжеловесно, но очень наглядно. ИМХО Edited May 19 by EdwardSt Quote Link to comment Share on other sites More sharing options...
kpblc Posted May 19 Report Share Posted May 19 Можно, не спорю. Я просто DXF и entmake[x] методы не очень жалую. Тяжелое детство, мина в кроватке, VBA в полный рост... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.