Тема: Макро на кнопку "Линия с запасом"

Можно ли и как написать макро на кнопку для вычерчивания линии с запасом по 3 мм?

Re: Макро на кнопку "Линия с запасом"

Макросом, думаю, не получится, а лиспом - запросто. Щас код сделаю и выложу.

Re: Макро на кнопку "Линия с запасом"

> Forma
Не мешало бы уточнить исходные данные.
Если это частная задача, а именно:
линия - отрезок в режиме ОРТО,
то задача достаточно проста, только бы выяснить, 3 мм - это в единицах рисунка или бумаги?
Если не в режиме ОРТО - то задача усложняется.
Если под линией понимается любая линия (отрезок, полилиния с дуговыми сегментами, дуга, эллиптическая дуга, мультилиния, 3D-полилиния), т.е общий случай - то задача усложняется не знаю уж как.

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов
...только сущность: "линия" с включенным OSNAP...не выходя за рамки программирования на кнопке...если не получится задачу поставлю несколько по другому...3 мм ...не понял...частный случай: ось...

Re: Макро на кнопку "Линия с запасом"

Вот текст (код) программы:

;***********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" ("УВЕЛИЧИТЬ") выполняется через точки отрисовки отрезка, а эта точка может находиться и на другом объекте (особенно при большом количестве типов объектной привязки).

Re: Макро на кнопку "Линия с запасом"

Теперь вопрос:
Эта тема и этот код так и застрянут в разделе
Программирование :: Настройка меню и DIESEL
???

Re: Макро на кнопку "Линия с запасом"

Сбой в отрисовке линии (но не в цикле) произойдет, если из вредности задать величину удлинения со знаком минус большую по абс. величине, чем расстояние между исходными точками. В данном коде проверку этой "подлянки" сделать нельзя, т.к. величина удлинения задается раньше, чем указываются точки отрезка, однако, думаю, что добросовестные пользователи, как и Forma не будут так извращаться, а потом заявлять, что программа негодная (что любил делать Teodor_2000).

Re: Макро на кнопку "Линия с запасом"

На всякий случай аналогичная программа для отрисовки дуги:

;***********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)
)

Re: Макро на кнопку "Линия с запасом"

В предыдщей программе надо подправить начало функции:

(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)
)

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов
...поставил...попробовал...значит так....
...попробую обьяснить...эта программа нужна для ускорения работы...
пользователя...собственно эту тему надо бы поместить в раздел...  "Приемы работы"...но здесь спорно...
...короче, как у Владимира Света: "Чем меньше кликов- тем лучше"...в моей  вольной  редакции, конечно,...
Так :
1.   Ограничится  макросом на кнопку не удалось?
2.   3 мм по умолчанию и без диалога;
3.   Почему то эта программа не хочет работать с привязками "Nearest" и "Perpedicular";
4.   После выполнения задачи т.е. "построения линии с запасом 3 мм"- завершение работы;
5.   О "дуге с запасом"...потом...нет мыслей.

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов
"...программа удлинения существующего отрезка..."
Тоже надо время...не думал...неожиданная мысль...

Re: Макро на кнопку "Линия с запасом"

Я недаром спрашивал: 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 единицам рисунка.

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов

> 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)
)

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов
Спасибо. Именно так...Но, есть некий "глюк". Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься. За недостатком времени зависимость пока не уловил.

Re: Макро на кнопку "Линия с запасом"

> Владимир Громов
Обрати(те) внимание на "_none" перед указанием точек в (command ...) - это позволяет избавится от проблем с привязками.
И еще - величину удлинения можно задавать сразу с клавиатуры (меню, и т.д.) при запросе начальной точки, т.к. (initget 128 ...) позволяет выполнить произвольный ввод, а не только ввод заданного ключевого слова.

Re: Макро на кнопку "Линия с запасом"

Forma пишет:

Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься

Точно. Такой вариант возможен. sad
Исправил:

;***********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)
)

Re: Макро на кнопку "Линия с запасом"

> Александр Ривилис
Тот же самый "глюк". Удлиняется не вычерчиваемая линия, а обьект (в частном случае линия) к которой привязываешься.

Re: Макро на кнопку "Линия с запасом"

> Александр Ривилис
Ой ... опоздал...

Re: Макро на кнопку "Линия с запасом"

> Forma
Именно это я и имел в виду, когда писал о возможных сбоях. Моя программа слишком проста, зато позволила обойтись без функции "polar", о которой я сначала думал. Однако, отказ от цикла меня несколько удивляет, разве эту процедуру приходится выполнять лишь однократно?

> Александр Ривилис
Попробовал подправленную программу. Понравилась. С "_none" и с битом 128 согласен, просто не додумал еще. Все-таки, у меня остается сомнение в выборе объекта через точку, ведь "_LENGTHEN" предлагает выбрать объект с помощью прицела, а в указанной точке могут пересекаться или начинаться (заканчиваться) и другие объекты, т.е. выбор не очевиден. На экране нужный объект можно выбрать циклическим перебором, а в программе остается только надежда, что точка укажет на последний созданный объект.
Но вижу, что тема обновилась, надо вникнуть.

Re: Макро на кнопку "Линия с запасом"

Владимир Громов пишет:

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

Поэтому, вместо указания точки я передаю список, содержащий имя примитива и точку указания. Именно такой список, который возвращается функцией (entsel).

Re: Макро на кнопку "Линия с запасом"

> Александр Ривилис
Да, я туда же думал, пусть товарищ Forma теперь опробует.

Re: Макро на кнопку "Линия с запасом"

Все. Работает чисто. Прием с заменой величины удлинения очень хорош. Огромное спасибо.

Re: Макро на кнопку "Линия с запасом"

А вот теперь эта интересная программа и затеряется среди тысяч тем, блин ее забодай.

Re: Макро на кнопку "Линия с запасом"

Владимир Громов пишет:

Однако, отказ от цикла меня несколько удивляет

...не могу обьяснить пока, почему мне нужно было завершение работы программы...на интуитивном уровне принималось решение....

А вот теперь эта интересная программа и затеряется среди тысяч

Думаю нет...я постараюсь...

Re: Макро на кнопку "Линия с запасом"

> Forma
В дальнейшем, предлагаю открывать темы в форуме LISP если есть мимнимальные подозрение, что средствами DIESEL решить эту задачу нельзя.