|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
22.09.2003, 10:37 | #1 | |
Макрос, вычерчивающий стрелку
Штаб
Регистрация: 21.08.2003
Сообщений: 943
|
||
Просмотров: 10414
|
|
||||
Примерно так.
(defun c:strelka() (setq w1 0) (setq w2 1) (setq len 2.5) (setq po1 (getpoint "\nStart point :")) (if po1 (progn (setq po2 (getpoint po1 "\nDirection :")) (if po2 (progn (setq po3 (polar po1 (angle po1 po2) len)) (command "PLINE" po1 "w" w1 w2 po3 "w" 0 0 "") )) )) (princ) ) |
||||
|
||||
Держи два варианта.
В первом всегда идет запрос в начале макро. Но если значения не изменились то нужно только нажать три раза ввод. Но я так не люблю - в большинстве случаев парметры не меняют часто, поэтому второй вариант. Во втором варианте в запросе на вторую точкуможно также менять параметры. Терерь насчет progn и princ progn: (if (= a b) (setq c 1) (setq c 2) ) В первом примере нет progn и если условие выполнилось то сработает первое выражение (setq c 1), а если нет то второе (setq c 2) (if (= a b)(progn (setq c 1) (setq d (+ c 2)) );; end of progn (setq c 2) );; end of if Во втором примере нужно было усложнить первое выражение , и для корректной работы if все что является первым выражением взято в (progn .... ) То есть все что в (progn .... ) с точки зрения if - единое выражение princ: - это оператор вывода в командную строку. Применяется в конце макро для чисного выхода программы - (без nil) (defun c:strelka() (if (not w1)(setq w1 0)) (setq tmp (getreal (strcat "\nFirst Width <" (rtos w1 2 2) ">:"))) (if tmp (setq w1 tmp)) (if (not w2)(setq w2 1)) (setq tmp (getreal (strcat "\nSecond Width <" (rtos w2 2 2) ">:"))) (if tmp (setq w2 tmp)) (if (not len)(setq len 2.5)) (setq tmp (getreal (strcat "\nArrow Length <" (rtos len 2 2) ">:"))) (if tmp (setq len tmp)) (setq po1 (getpoint "\nStart point :")) (if po1 (progn (setq po2 (getpoint po1 "\nDirection :")) (if po2 (progn (setq po3 (polar po1 (angle po1 po2) len)) (command "PLINE" po1 "w" w1 w2 po3 "w" 0 0 "") )) )) (princ) ) (defun c:strelka2() (if (not w1)(setq w1 0)) (if (not w2)(setq w2 1)) (if (not len)(setq len 2.5)) (setq po1 (getpoint "\nStart point :")) (if po1 (progn (setq po2 T) (while po2 (initget 128 "Width Length") (setq po2 (getpoint po1 (strcat "\nWidth (" (rtos w1 2 2) ";" (rtos w2 2 2) ")/Length(" (rtos len 2 2) ")/Direction :"))) (print po2) (if po2 (progn (cond ((= po2 "Width") (setq tmp (getreal (strcat "\nFirst Width <" (rtos w1 2 2) ">:"))) (if tmp (setq w1 tmp)) (setq tmp (getreal (strcat "\nSecond Width <" (rtos w2 2 2) ">:"))) (if tmp (setq w2 tmp)) ) ((= po2 "Length") (setq tmp (getreal (strcat "\nArrow Length <" (rtos len 2 2) ">:"))) (if tmp (setq len tmp)) ) ((= (type po2) 'LIST) (setq po3 (polar po1 (angle po1 po2) len)) (command "PLINE" po1 "w" w1 w2 po3 "w" 0 0 "") (setq po2 nil) ) ) ;; end of cond )) ) ;; end of while )) (princ) ) |
||||
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
|
Отключение привязки - обычное правило при выполнении различных (command ....) для автоматизированной отрисовки, перемещения и т.п. Если привязку не отключать, то она будет действовать, цепляясь за все подряд, к чему только может прицепиться в зоне отрисовки. Если нужно в одной команде например первую точку указывать используя привязку, а вторую без привязки, то можно перед указанием второй точки поставить "_non" - не привязывать.
Впрочем, использование привязок в (command...) годится только для интерактивной работы с pause (ИМХО). |
|||
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
1. Судя по заданию, вы работаете в листе, а не в модели, а это уже не раз горячо обсуждалось на форумах. Выводы всегда такие: работать надо в модели, за редким исключением.
2. Почему не используется Qleader? Это же типичная выноска. 3. По существу вопроса. Уточним задание: а) Стрелка может быть направлена в любую сторону. б) Длина прямой линии от кончика стрелки задается пользователем, то есть каждый раз разная. в) не должно быть изломов между головкой и линией. г) должна получиться единая конструкция в виде полилинии, чтобы можно было удлинять-укорачивать. Все это сделает такой макрос: ^C^C_osnap;off;_L;\'_cal;p1=@;\;_cal;p3=@;_cal;p2=pld(p1,@,2.5);_e;_l;;_pl;'_cal;p1;w;0;1;'_cal;p2;_w;0;;'_cal;p3;;^z Здесь несколько упрощенно - отключаются привязки, затем восстанавливаются вручную. Для восстановления режима надо чуть-чуть усложнить. Для начала попробуй убрать отключение привязок, удали «_osnap;off;» Может и так будет хорошо. Если бы работал в модели, с разномасштабными экранами, последовала бы еще добавка. Иногда мне кажется, писать LISP для несложных задач это как-бы стрелять из пушки по воробьям. LISP могут освоить единицы. А такие коды-любой продвинутый пользователь. (Arkady, это не камень в Ваш огород, это мое мнение в споре сравнения возможностей. LISP безусловно значительно сильней. Но и топориком можно сработать неплохо.) |
|||
|
||||
Регистрация: 16.09.2003
Москва
Сообщений: 91
|
TO VOVA:
На кончике стрелки рисуется линия нулевой длины. Это видно при выделении стрелки в свойствах. 2 объекта - стрелка (полилиния) и линия. При переносе стрелки линия остается на месте. Можно ли от этого избавиться? (от линии) |
|||
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,268
|
Цитата:
_pline <point> _w 0 <толщина_стрелки> <point> _w 0 0 <point> <Enter> А вообще-то даже подобные несложные вещи уже лучше программировать не в макросе а в Лиспе. |
|||
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
|
2Vova:
1. я работаю в модели 2. qleader по сравнению с одной полилинией - это сложно (я не говорю, что лидеры вообще не надо использовать, просто в данном случае мне удобнее использовать полилинию) 3. спасибо за макрос 2niko: привет, человеку, помогающего другим летать! 2all: всем спасибо! Задача решена! Особенно 2Arkady! |
|||
|
||||
Engineer Регистрация: 05.09.2003
New-York
Сообщений: 10,288
|
Niko> Теперь точка не образуется. ^C^C_osnap;off;_Cal;p1=cur;\_L;@;\;_cal;p3=@;_cal;p2=pld(p1,@,2.5);_e;_l;;_pl;'_cal;p1;w;0;1;'_cal;p2;_w;0;;'_cal;p3;;^Z
Здесь точка не образуется Pilot> Почему лучше в LISP? Каждый выбирает тот способ, которым владеет. Овладеть LISPoм труднее. В данном случае получилась всего одна строка в меню, а LISP занял целый файл, да плюс строка в меню, если хочешь иметь кнопку. В вашей библиотеке, наверное , сотни и сотни Lisp'ов, новые и старые наслаиваются. На одном из сайтов известный в мире LISP'a А. Оконечников дал статью «Умные кнопки» Он с удивлением обнаружил, что можно и без LISP'a обойтись, то есть специалист по LISP сделал для себя открытие. |
|||
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,268
|
2Vova
Вот почему Лисп: 1. Лисп гибче чем макрос. 2. В Лиспе несложно организовать команду, а макрос целиком не повторяется. Повторяется только сама команда на которой он построен. 3. Комнде можно дать очень короткое (2-3 буквы) имя и вызывать с клавы. И не нужны никакие кнопки. 4. Ни к чему каждую прогу на лиспе записывать в отдельный файл. Да, у меня десятки программ всего в 9 файлах *.lsp. 5. Рано или поздно, но Лисп изучать придется. После макросов все к этому приходят. Я в том числе - тоже с макросов начинал. Но некоторые макрухи живы до сих пор. Изредка и новые пишу. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как запустить макрос без снятия выделения с объектов? | Автон | Программирование | 15 | 20.08.2012 16:31 |
Нужен макрос (поворот на 90 предварительно выделенного) | dextron3 | Программирование | 20 | 10.07.2007 21:36 |
Кнопка макрос для включения слоя? | dextron3 | Программирование | 13 | 09.04.2007 12:44 |
Не работает макрос изменяющий цвет | Джин | Программирование | 10 | 21.11.2006 16:53 |
Печать МАКРОС | Piton | Программирование | 28 | 21.06.2005 11:55 |