Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос, вычерчивающий стрелку

Макрос, вычерчивающий стрелку

Ответ
Поиск в этой теме
Непрочитано 22.09.2003, 10:37 #1
Макрос, вычерчивающий стрелку
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Чтобы вычертить стрелку, выполняется следующее:

pline <ENTER>

Specify start point: <указываю острый конец стрелки>

Specify next point or [Arc/Halfwidth/Length/Undo/Width]: <w>
Specify starting width <1.0000>: <0>

Specify ending width <0.0000>: <1>

Specify next point or [Arc/Halfwidth/Length/Undo/Width]: <2.5> \\длина стрелки

Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]: <ENTER>

Вопрос:
Как будет выглядеть макрос, выполняющий выше приведенную последовательность?

(я не могу остановить макрос для ввода своих значений)
Просмотров: 10388
 
Непрочитано 22.09.2003, 11:29 Макрос, вычерчивающий стрелку
#2
Arkady

AutoCad Development and Support
 
Регистрация: 21.08.2003
Israel
Сообщений: 183
Отправить сообщение для Arkady с помощью Skype™


Примерно так.



(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)
)
Arkady вне форума  
 
Непрочитано 22.09.2003, 11:50
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Еси набор направлений фиксированный 0, 90, 180.... то на кнопки можно посадить такие макросы
^C^C_pline;\_w;0;1;@2.5<0;;
^C^C_pline;\_w;0;1;@2.5<90;;
^C^C_pline;\_w;0;1;@2.5<180;;
vk вне форума  
 
Автор темы   Непрочитано 22.09.2003, 12:18
#4
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


А как предоставить возможность пользователю самому вводить значения (т.е. не забивать их в макросе, а приостанавливать макрос и ожидать ввода пользователя (можно без подсказок))

2Arkady:
Объясни, пожалуйста, конструкцию "progn".
Torino вне форума  
 
Непрочитано 22.09.2003, 12:29
#5
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


На месте параметра, который должен указать пользователь надо поставить бэкслэш "\". В этом месте макрос тормознется и будет ждать ввода с клавы или мышки.
vk вне форума  
 
Непрочитано 22.09.2003, 12:41
#6
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Функция (progn ..... ..... ....) позволяет последовательно выполнить все функции, которые переданы ей как аргументы. В данном случае это нужно для правильной работы (if ....).
vk вне форума  
 
Непрочитано 22.09.2003, 13:03
#7
Мikhail


 
Сообщений: n/a


А не подскажите что это за команда princ?
 
 
Непрочитано 22.09.2003, 13:20
#8
Arkady

AutoCad Development and Support
 
Регистрация: 21.08.2003
Israel
Сообщений: 183
Отправить сообщение для Arkady с помощью Skype™


Держи два варианта.
В первом всегда идет запрос в начале макро.
Но если значения не изменились то нужно только нажать три раза ввод.
Но я так не люблю - в большинстве случаев парметры не меняют часто, поэтому второй вариант.
Во втором варианте в запросе на вторую точкуможно также менять параметры.

Терерь насчет 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)
)
Arkady вне форума  
 
Автор темы   Непрочитано 22.09.2003, 14:03
#9
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Спасибо всем за подробное объяснение!

2Arkady:

Нашел такой глюк: если Start point и Direction - есть точки одной прямой, то вычерчивается полилиния нулевой длины.

Почему так?
Torino вне форума  
 
Непрочитано 22.09.2003, 14:40
#10
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2 Torino
Скорее всего нужно на этот момент отключать (явно или программно) объектную привязку
Pilot вне форума  
 
Автор темы   Непрочитано 22.09.2003, 16:50
#11
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Действительно, отключение привязки при указании второй точки помогает.
А почему так происходит?
Torino вне форума  
 
Непрочитано 22.09.2003, 17:27
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Отключение привязки - обычное правило при выполнении различных (command ....) для автоматизированной отрисовки, перемещения и т.п. Если привязку не отключать, то она будет действовать, цепляясь за все подряд, к чему только может прицепиться в зоне отрисовки. Если нужно в одной команде например первую точку указывать используя привязку, а вторую без привязки, то можно перед указанием второй точки поставить "_non" - не привязывать.
Впрочем, использование привязок в (command...) годится только для интерактивной работы с pause (ИМХО).
vk вне форума  
 
Непрочитано 23.09.2003, 05:32
#13
Vova

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 безусловно значительно сильней. Но и топориком можно сработать неплохо.)
Vova вне форума  
 
Непрочитано 23.09.2003, 08:20 Стрелка
#14
niko


 
Регистрация: 16.09.2003
Москва
Сообщений: 91


TO VOVA:
На кончике стрелки рисуется линия нулевой длины. Это видно при выделении стрелки в свойствах. 2 объекта - стрелка (полилиния) и линия. При переносе стрелки линия остается на месте. Можно ли от этого избавиться? (от линии)
niko вне форума  
 
Непрочитано 23.09.2003, 09:30 Re: Стрелка
#15
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Цитата:
Сообщение от niko
TO VOVA:
2 объекта - стрелка (полилиния) и линия.
Можно как один объект:
_pline <point> _w 0 <толщина_стрелки> <point> _w 0 0 <point> <Enter>

А вообще-то даже подобные несложные вещи уже лучше программировать не в макросе а в Лиспе.
Pilot вне форума  
 
Автор темы   Непрочитано 23.09.2003, 12:35
#16
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


2Vova:
1. я работаю в модели
2. qleader по сравнению с одной полилинией - это сложно (я не говорю, что лидеры вообще не надо использовать, просто в данном случае мне удобнее использовать полилинию)
3. спасибо за макрос


2niko:
привет, человеку, помогающего другим летать!

2all:
всем спасибо! Задача решена!

Особенно 2Arkady!
Torino вне форума  
 
Непрочитано 23.09.2003, 14:37
#17
Vova

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 сделал для себя открытие.
Vova вне форума  
 
Непрочитано 23.09.2003, 15:14
#18
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2Vova
Вот почему Лисп:
1. Лисп гибче чем макрос.
2. В Лиспе несложно организовать команду, а макрос целиком не повторяется. Повторяется только сама команда на которой он построен.
3. Комнде можно дать очень короткое (2-3 буквы) имя и вызывать с клавы. И не нужны никакие кнопки.
4. Ни к чему каждую прогу на лиспе записывать в отдельный файл. Да, у меня десятки программ всего в 9 файлах *.lsp.
5. Рано или поздно, но Лисп изучать придется. После макросов все к этому приходят. Я в том числе - тоже с макросов начинал. Но некоторые макрухи живы до сих пор. Изредка и новые пишу.
Pilot вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос, вычерчивающий стрелку

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить макрос без снятия выделения с объектов? Автон Программирование 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