Тема: Макро на кнопку "Линия с запасом"
Можно ли и как написать макро на кнопку для вычерчивания линии с запасом по 3 мм?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макро на кнопку "Линия с запасом"
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Можно ли и как написать макро на кнопку для вычерчивания линии с запасом по 3 мм?
Макросом, думаю, не получится, а лиспом - запросто. Щас код сделаю и выложу.
> Forma
Не мешало бы уточнить исходные данные.
Если это частная задача, а именно:
линия - отрезок в режиме ОРТО,
то задача достаточно проста, только бы выяснить, 3 мм - это в единицах рисунка или бумаги?
Если не в режиме ОРТО - то задача усложняется.
Если под линией понимается любая линия (отрезок, полилиния с дуговыми сегментами, дуга, эллиптическая дуга, мультилиния, 3D-полилиния), т.е общий случай - то задача усложняется не знаю уж как.
> Владимир Громов
...только сущность: "линия" с включенным OSNAP...не выходя за рамки программирования на кнопке...если не получится задачу поставлю несколько по другому...3 мм ...не понял...частный случай: ось...
Вот текст (код) программы:
;***********l_line.lsp - Отрисовка отрезка с последующим ; удлинением его на заданную величину. ; Freeware. Автор Владимир Громов. Август 2005 г. ; ; Если величину удлинения задать со знаком минус (-), то ; вместо удлинения получим укорочение. (defun C:L_LINE ( / tn tk delta flag) (setvar "CMDECHO" 0) (setq delta (getreal "\n Величина удлинения линии (ENTER-отказ): ")) (if delta (progn (setq flag T) (while flag (initget 6) (setq tn (getpoint "\n Начальная точка линии (ENTER-завершение): ")) (if tn (progn (setq tk (getpoint tn "\n Конечная точка линии: ")) (command "_LINE" tn tk "") (command "_LENGTHEN" "_delta" delta tn tk "") ); progn (setq flag nil) ); if ); while ); progn (princ "\n Отказ.") ); if (princ) )
Файл "l_line.lsp" можно поместить в папку "Support" или в любую другую (например, "LISP"), прописанную в путях доступа AutoCAD'а.
Макрос для кнопки может иметь вид:
^C^C^P(if (null C:L_LINE) (load "l_line")) L_LINE
Программа достаточно простая, поэтому возможны сбои, т.к. выбор объекта для команды "_LENGTHEN" ("УВЕЛИЧИТЬ") выполняется через точки отрисовки отрезка, а эта точка может находиться и на другом объекте (особенно при большом количестве типов объектной привязки).
Теперь вопрос:
Эта тема и этот код так и застрянут в разделе
Программирование :: Настройка меню и DIESEL
???
Сбой в отрисовке линии (но не в цикле) произойдет, если из вредности задать величину удлинения со знаком минус большую по абс. величине, чем расстояние между исходными точками. В данном коде проверку этой "подлянки" сделать нельзя, т.к. величина удлинения задается раньше, чем указываются точки отрезка, однако, думаю, что добросовестные пользователи, как и Forma не будут так извращаться, а потом заявлять, что программа негодная (что любил делать Teodor_2000).
На всякий случай аналогичная программа для отрисовки дуги:
;***********l_arc.lsp - Отрисовка дуги с последующим ; удлинением ее на заданную величину. ; Freeware. Автор Владимир Громов. Август 2005 г. ; ; Если величину удлинения задать со знаком минус (-), то ; вместо удлинения получим укорочение. (defun C:L_ARC ( / tn tk delta flag) (setvar "CMDECHO" 0) (setq delta (getreal "\n Величина удлинения дуги (ENTER-отказ): ")) (if delta (progn (setq flag T) (while flag (initget 6) (setq tn (getpoint "\n Начальная точка дуги (ENTER-завершение): ")) (if tn (progn (setq t2 (getpoint tn "\n Вторая точка дуги: ")) (setq tk (getpoint t2 "\n Конечная точка дуги: ")) (command "_ARC" tn t2 tk) (command "_LENGTHEN" "_delta" delta tn tk "") ); progn (setq flag nil) ); if ); while ); progn (princ "\n Отказ.") ); if (princ) )
В предыдщей программе надо подправить начало функции:
(defun C:L_ARC ( / tn t2 tk delta flag)
Вот еще на всякий случай программа удлинения существующего отрезка:
;***********l_l.lsp - Удлинение отрезка в обе стороны ; на заданную величину. ; Freeware. Автор Владимир Громов. Август 2005 г. ; ; Если величину удлинения задать со знаком минус (-), то ; вместо удлинения получим укорочение. (defun C:L_L ( / tn tk delta flag ob line) (setvar "CMDECHO" 0) (setq delta (getreal "\n Величина удлинения линии (ENTER-отказ): ")) (if delta (progn (setq flag T) (while flag (setq ob (entsel "\n Выберите отрезок (ENTER-завершить): ")) (if ob (progn (setq line (entget (car ob))) (if (= (cdr (assoc 0 line)) "LINE") (progn (setq tn (cdr (assoc 10 line))) (setq tk (cdr (assoc 11 line))) (command "_LENGTHEN" "_delta" delta tn tk "") ); progn ); if ); progn (setq flag nil) ); if ); while ); progn (princ "\n Отказ.") ); if (princ) )
> Владимир Громов
...поставил...попробовал...значит так....
...попробую обьяснить...эта программа нужна для ускорения работы...
пользователя...собственно эту тему надо бы поместить в раздел... "Приемы работы"...но здесь спорно...
...короче, как у Владимира Света: "Чем меньше кликов- тем лучше"...в моей вольной редакции, конечно,...
Так :
1. Ограничится макросом на кнопку не удалось?
2. 3 мм по умолчанию и без диалога;
3. Почему то эта программа не хочет работать с привязками "Nearest" и "Perpedicular";
4. После выполнения задачи т.е. "построения линии с запасом 3 мм"- завершение работы;
5. О "дуге с запасом"...потом...нет мыслей.
> Владимир Громов
"...программа удлинения существующего отрезка..."
Тоже надо время...не думал...неожиданная мысль...
Я недаром спрашивал: 3 мм - это в рисунке или на бумаге? Например, если я черчу план этажа и хочу распечатать его в масштабе 1:100, то 3 мм бумаги - это 300 мм рисунка.
Про макрос с помощью DIESEL я и не думал, я думал о некоторой универсальности, потому и ввел запрос о величине удлинения и зациклил программу.
Привязки "_NEA" ("_БЛИ") и "_PER" ("НОР") у меня работают.
Если хочется упростить, то можно так:
(defun C:L_LINE ( / tn tk) (setvar "CMDECHO" 0) (initget 6) (setq tn (getpoint "\n Начальная точка линии: ")) (if tn (progn (setq tk (getpoint tn "\n Конечная точка линии: ")) (command "_LINE" tn tk "") (command "_LENGTHEN" "_delta" 3 tn tk "") ); progn ); if (princ) )
Удлинение отрезка выполняется на величину, равную 3 единицам рисунка.
> Владимир Громов
> Forma
Я думаю, что никто из вас не обидится, если я предложу немного подправленный вариант, который позволит задавать в случае необходимости величину удлинения. Причем это значение будет сохраняться в течении сеанса работы с данным чертежом). Ну и еще немного правочек...
;***********l_line.lsp - Отрисовка отрезка с последующим ; удлинением его на заданную величину. ; Freeware. Автор Владимир Громов. Август 2005 г. ; Небольшая правка. Александ Ривилис ; Если величину удлинения задать со знаком минус (-), то ; вместо удлинения получим укорочение. (defun C:L_LINE ( / p1 p2 flag_begin delta) (setvar "CMDECHO" 0) (if (null (numberp L_LINE_DELTA_EXTEND)) (progn ;; Задаем начальное значение для удлинения (setq L_LINE_DELTA_EXTEND 3.0) )) ;; (if (progn (while (null flag_begin) (initget 128 "У U _ U U") (setq p1 (getpoint (strcat "\nНачальная точка линии [Удлинение <" (rtos L_LINE_DELTA_EXTEND 2 0) ">] (ENTER - завершение): ")) ) (cond ((= p1 "U") (setq delta (getdist (strcat "\nУдлинение <" (rtos L_LINE_DELTA_EXTEND 2 0) ">: "))) (if delta (setq L_LINE_DELTA_EXTEND delta)) ) ((and (= (type p1) 'STR) (distof p1)) (setq L_LINE_DELTA_EXTEND (distof p1)) ) (T (setq flag_begin T) ) ) ;; (cond ) ;; endof (while (if p1 (progn (initget 6) (setq p2 (getpoint p1 "\nКонечная точка линии: ")) (command "_.LINE" "_none" p1 "_none" p2 "") (command "_.LENGTHEN" "_delta" L_LINE_DELTA_EXTEND "_none" p1 "_none" p2 "") )) (princ) )
> Владимир Громов
Спасибо. Именно так...Но, есть некий "глюк". Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься. За недостатком времени зависимость пока не уловил.
> Владимир Громов
Обрати(те) внимание на "_none" перед указанием точек в (command ...) - это позволяет избавится от проблем с привязками.
И еще - величину удлинения можно задавать сразу с клавиатуры (меню, и т.д.) при запросе начальной точки, т.к. (initget 128 ...) позволяет выполнить произвольный ввод, а не только ввод заданного ключевого слова.
Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься
Точно. Такой вариант возможен.
Исправил:
;***********l_line.lsp - Отрисовка отрезка с последующим ; удлинением его на заданную величину. ; Freeware. Автор Владимир Громов. Август 2005 г. ; Небольшая правка. Александр Ривилис. ; Если величину удлинения задать со знаком минус (-), то ; вместо удлинения получим укорочение. (defun C:L_LINE ( / p1 p2 flag_begin delta) (setvar "CMDECHO" 0) (if (null (numberp L_LINE_DELTA_EXTEND)) (progn ;; Задаем начальное значение для удлинения (setq L_LINE_DELTA_EXTEND 3.0) )) ;; (if (progn (while (null flag_begin) (initget 128 "У U _ U U") (setq p1 (getpoint (strcat "\nНачальная точка линии [Удлинение <" (rtos L_LINE_DELTA_EXTEND 2 0) ">] (ENTER - завершение): ")) ) (cond ((= p1 "U") (setq delta (getdist (strcat "\nУдлинение <" (rtos L_LINE_DELTA_EXTEND 2 0) ">: "))) (if delta (setq L_LINE_DELTA_EXTEND delta)) ) ((and (= (type p1) 'STR) (distof p1)) (setq L_LINE_DELTA_EXTEND (distof p1)) ) (T (setq flag_begin T) ) ) ;; (cond ) ;; endof (while (if p1 (progn (initget 6) (setq p2 (getpoint p1 "\nКонечная точка линии: ")) (command "_.LINE" "_none" p1 "_none" p2 "") (command "_.LENGTHEN" "_delta" L_LINE_DELTA_EXTEND "_none" (list (entlast) p1) "_none" (list (entlast) p2) "") )) (princ) )
> Александр Ривилис
Тот же самый "глюк". Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься.
> Александр Ривилис
Ой ... опоздал...
> Forma
Именно это я и имел в виду, когда писал о возможных сбоях. Моя программа слишком проста, зато позволила обойтись без функции "polar", о которой я сначала думал. Однако, отказ от цикла меня несколько удивляет, разве эту процедуру приходится выполнять лишь однократно?
> Александр Ривилис
Попробовал подправленную программу. Понравилась. С "_none" и с битом 128 согласен, просто не додумал еще. Все-таки, у меня остается сомнение в выборе объекта через точку, ведь "_LENGTHEN" предлагает выбрать объект с помощью прицела, а в указанной точке могут пересекаться или начинаться (заканчиваться) и другие объекты, т.е. выбор не очевиден. На экране нужный объект можно выбрать циклическим перебором, а в программе остается только надежда, что точка укажет на последний созданный объект.
Но вижу, что тема обновилась, надо вникнуть.
На экране нужный объект можно выбрать циклическим перебором, а в программе остается только надежда, что точка укажет на последний созданный объект.
Поэтому, вместо указания точки я передаю список, содержащий имя примитива и точку указания. Именно такой список, который возвращается функцией (entsel).
> Александр Ривилис
Да, я туда же думал, пусть товарищ Forma теперь опробует.
Все. Работает чисто. Прием с заменой величины удлинения очень хорош. Огромное спасибо.
А вот теперь эта интересная программа и затеряется среди тысяч тем, блин ее забодай.
Однако, отказ от цикла меня несколько удивляет
...не могу обьяснить пока, почему мне нужно было завершение работы программы...на интуитивном уровне принималось решение....
А вот теперь эта интересная программа и затеряется среди тысяч
Думаю нет...я постараюсь...
> Forma
В дальнейшем, предлагаю открывать темы в форуме LISP если есть мимнимальные подозрение, что средствами DIESEL решить эту задачу нельзя.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макро на кнопку "Линия с запасом"
Форум работает на PunBB, при поддержке Informer Technologies, Inc