Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
И еще.

Можно, конечно, организовать вставку форматки и в указанную точку.

Именно это! Т.к. я и большинство моих коллег работают по схеме "Один файл- много чертежей",хотелось бы контролировать процесс вставки форматок, бланков и т.п.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
Попробуйте такой вариант.
Для упрощения замены я привожу полностью новый вариант файла upsk_frm.mnl

;;; Вызов и обработка диалога UPSK_FRM.DCL
(defun upsk_dialog ()
    (setq     fr_blk     "upsk_data")
    (setq     fr_ori     "land")
    (setq     dcl_id     (load_dialog "BonusTools/upsk_frm.dcl"))
    (if (not (new_dialog "upsk_box" dcl_id))
    (exit)
    );if
  (action_tile "data" "(setq fr_blk \"upsk_data\")")
  (action_tile "km" "(setq fr_blk \"upsk_km\")")
  (action_tile "mo" "(setq fr_blk \"upsk_mo\")")
  (action_tile "kmd" "(setq fr_blk \"upsk_kmd\")")
  (action_tile "rasch1" "(setq fr_blk \"upsk_rasch1\")")
  (action_tile "rasch2" "(setq fr_blk \"upsk_rasch2\")")
  (action_tile "form_port" "(setq fr_ori \"port\")")
  (action_tile "form_land" "(setq fr_ori \"land\")")
  (action_tile "accept" "(setq idblk fr_blk) (done_dialog)")
  (start_dialog)
  (unload_dialog dcl_id)
  )
;;; Отрисовка рамок листа, вставка штампа
(defun format (w h / p0 p1 p2 p3 pt ce)
;;; w - ширина листа
;;; h - высота листа
;;; p0 - точка вставки внешней рамки
;;; p1 - верхний левый угол внутренней рамки
;;; p2 - верхний правый угол внутренней рамки
;;; p3 - нижний правый угол внутренней рамки
;;; pt, ce - для временного хранения данных
  (setq ce (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (upsk_dialog)
  (if (= fr_ori "port")
    (setq pt w
          w  h
          h  pt
    )
  )                                               
  (command "_layer" "_s" "DEFPOINTS" "")
  (setq p0 (getpoint "\nУкажите точку вставки <Enter для вставки в начало координат>:"))
  (if (= p0 nil) (setq p0 (list 0 0)))
  (command "_rectang" p0 (list (+ (nth 0 p0) w) (+ (nth 1 p0)h)))
  (setq p1 (list (+ (nth 0 p0) 20) (- (+ (nth 1 p0) h) 5)))
  (setq p2 (list (- (+ (nth 0 p0) w) 5) (- (+ (nth 1 p0)h) 5)))
  (setq p3 (list (- (+ (nth 0 p0) w) 5) (+ (nth 1 p0)5)))
  (command "_layer" "_s" "ОСНОВНАЯ_0.40" "")
  (command "_line" (list (+ (nth 0 p0) 20) (+ (nth 1 p0)5))
   p1 p2 p3 (list (+ (nth 0 p0) 20) (+ (nth 1 p0)5)) "")
  (command "-insert" "*BonusTools/upsk_bok" (list (+ (nth 0 p0) 20)
  (+ (nth 1 p0)5)) "1" "0")
  (command "-insert" (strcat "*BonusTools/" fr_blk) p3 "1" "0")
  (command "_zoom" "_e")
  (setvar "CMDECHO" ce)
  (princ)
)

После выбора типа формата и его ориентации можно будет указать точку вставки формата (левый нижний угол) или нажать Enter для вставки в начало координат.
Если не используете шаблон из BricsCAD BonusTools, то для корректной работы поменяйте названия слоев на свои или задокументируйте строку  (command "_layer" "_s" "ОСНОВНАЯ_0.40" "")

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
По поводу "стрелки" не обнаружил описанной Вами проблемы. Либо не совсем правильно понял ее суть. Опишите поподробнее. Эта проблема у вас возникает в AutoCADe (какой версии) или BricsCADe? Пробовал на 2004 акаде - привязки работают нормально.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
В предыдущем варианте после вставки формата масштабирование выполняется с выводом на экран всех объектов. Если надо масштабировать только по границам нового формата, используйте следующий вариант файла upsk_frm.dcl:

;;; Вызов и обработка диалога UPSK_FRM.DCL
(defun upsk_dialog ()
    (setq     fr_blk     "upsk_data")
    (setq     fr_ori     "land")
    (setq     dcl_id     (load_dialog "BonusTools/upsk_frm.dcl"))
    (if (not (new_dialog "upsk_box" dcl_id))
    (exit)
    );if
  (action_tile "data" "(setq fr_blk \"upsk_data\")")
  (action_tile "km" "(setq fr_blk \"upsk_km\")")
  (action_tile "mo" "(setq fr_blk \"upsk_mo\")")
  (action_tile "kmd" "(setq fr_blk \"upsk_kmd\")")
  (action_tile "rasch1" "(setq fr_blk \"upsk_rasch1\")")
  (action_tile "rasch2" "(setq fr_blk \"upsk_rasch2\")")
  (action_tile "form_port" "(setq fr_ori \"port\")")
  (action_tile "form_land" "(setq fr_ori \"land\")")
  (action_tile "accept" "(setq idblk fr_blk) (done_dialog)")
  (start_dialog)
  (unload_dialog dcl_id)
  )
;;; Отрисовка рамок листа, вставка штампа
(defun format (w h / p0 p1 p2 p3 pt ce)
;;; w - ширина листа
;;; h - высота листа
;;; p0 - точка вставки внешней рамки
;;; p1 - верхний левый угол внутренней рамки
;;; p2 - верхний правый угол внутренней рамки
;;; p3 - нижний правый угол внутренней рамки
;;; p4 - верхний правій угол внешней рамки
;;; pt, ce - для временного хранения данных
  (setq ce (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (upsk_dialog)
  (if (= fr_ori "port")
    (setq pt w
          w  h
          h  pt
    )
  )                                               
  (command "_layer" "_s" "DEFPOINTS" "")
  (setq p0 (getpoint "\nУкажите точку вставки <Enter для вставки в начало координат>:"))
  (if (= p0 nil) (setq p0 (list 0 0)))
  (setq p4 (list (+ (nth 0 p0) w) (+ (nth 1 p0)h)))
  (command "_rectang" p0 p4)
  (setq p1 (list (+ (nth 0 p0) 20) (- (+ (nth 1 p0) h) 5)))
  (setq p2 (list (- (+ (nth 0 p0) w) 5) (- (+ (nth 1 p0)h) 5)))
  (setq p3 (list (- (+ (nth 0 p0) w) 5) (+ (nth 1 p0)5)))
  (command "_layer" "_s" "ОСНОВНАЯ_0.40" "")
  (command "_line" (list (+ (nth 0 p0) 20) (+ (nth 1 p0)5))
   p1 p2 p3 (list (+ (nth 0 p0) 20) (+ (nth 1 p0)5)) "")
  (command "-insert" "*BonusTools/upsk_bok" (list (+ (nth 0 p0) 20)
  (+ (nth 1 p0)5)) "1" "0")
  (command "-insert" (strcat "*BonusTools/" fr_blk) p3 "1" "0")
  (command "_zoom" "_w" p0 p4)
  (setvar "CMDECHO" ce)
  (princ)
)
  

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
А upsk_frm.dcl вы не будете здесь приводить?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Владимир Громов
Ну кроме upsk_frm.dcl там задействованы еще ряд файлов. Все они сидят в пакете, на который я уже давал ссылку http://sabit.com.ua/apps.php
По просьбе BigScrew выложил только измененный файл. По Вашей просьбе выкладываю и файл upsk_frm.dcl, но в том же варианте, как и в пакете.

/* UPSK_FRM.DCL - диалог для UPSK_FRM.MNL*/
upsk_box: dialog {
   label = "Основная надпись";
/* Выбор варианта основной надписи */
   : radio_column {
      label = "Форма основной надписи";
      : radio_button {
         label = "Общие данные - КМ, АР, АС, КМД, МО";
         key = "data";
         value = "1"; /* по умолчанию */
      }
      : radio_button {
         label = "Рабочие чертежи - КМ, КЖ, АР";
         key = "km";
      }
      : radio_button {
         label = "Материалы обследования - МО";
         key = "mo";
      }
      : radio_button {
         label = "Рабочие чертежи - КМД, АС";
         key = "kmd";
      }
      : radio_button {
         label = "Задание на расчет";
         key = "rasch1";
      }
         : radio_button {
         label = "Расчеты";
         key = "rasch2";
      }
   }
/* Выбор ориентации листа */
   : boxed_radio_row {
   label = "Ориентация листа";
      : radio_button {
         label = "Книжная";
         key = "form_port";
      }
      : radio_button {
         label = "Альбом";
         key = "form_land";
         value = 1; /* по умолчанию */
      }
   }
ok_only;
}

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
Что же Вы так: ставите вопрос, я на него отвечаю, переделываю код, задаю свой встречный уточняющий вопрос - а вы куда-то пропадаете. Мне действительно было интересно уточнить детали по проблеме с работой "стрелки", поскольку мне не удалось смоделировать описанную вами ситуацию.
Поэтому не знаю, что именно надо исправить в программке.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Вышла новая версия BricsCAD BonusTools 1.1.0014.
Скачать ее можно там же на http://sabit.com.ua/apps.php
Добавил несколько функций, кое-что исправил с учетом пожеланий "трудящихся", в том числе и ваших, доработал создание таблиц. Ввел поддержку основных групп сортамента при создании спецификаций КМД и по ф.7. Теперь при наборе спецификаций по мере заполнения строк они автоматически перемещаются вверх, так что набираемая строка всегда отображается на экране. Вобщем посмотрите, если интересно. В AutoCAD не проверял,но если что опять не заработает - попробуем переделать.
Напомню еще раз, что для корректной работы и ознакомления с функциями лучше загрузить шаблон UPSK.dwg, который идет с пакетом. При необходимости можно любую программку переделать под конкретный шаблон.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Интересная явление форум :) Одним я надоел хуже горькой редьки, другие спрашивают о том куда я пропал :) Молчал т.к. не хотел быть назойливым. Короче. С "стрелкой" плохо. Не работают привязки Midpoint и Nearest. Острие стрелки прыгает в привязку EndPoint. Приходится потом вручную стрелку поворачивать. Но это в любом случае лучше, чем пользоваться штатным Leader.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Забыл написать. В BricsCAD-е проверял. Там все нормально с привязками.

Re: Комплект полезных утилит из BricsCad в AutoCAD

BigScrew пишет:

С "стрелкой" плохо. Не работают привязки Midpoint и Nearest. Острие стрелки прыгает в привязку EndPoint.

Еще раз проверил. Поставил специально 2004-й акад (он быстрее устанавливается:) ). Описанной Вами проблемы не обнаружил. А на каком акаде Вы работаете?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
А проблему с отрисовкой в акаде динамического контура окружности выбора объектов узла так решить и не удалось? Специалисты пока молчат?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
У меня AutoCAD-2006. С отрисовкой тоже не получается. Но, для меня это не существенно. Сам домысливаю :) И еще было бы не плохо сделать две кнопки , которые бы передавали значения переменных для стрелки с 2.5 и стрелки 5. А затем, если есть желание и возможность, перейдем на сектор с обозначением сварных швов. Там очень интересно...

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Ваш модифицированный вариант:

(defun C:uzeln ( / llen tce tvn tvr tvl ttr ttr0 ttl tt0 tpl)
;;Функция отмены и выхода
(defun *error* (msg)
  (if (= msg "quit / exit abort")
  (princ)
  );if
);defun
(setvar "cmdecho" 0)
    (setq txt1 (getstring "\n\n Введите порядковый номер узла (<1>):"))
  (if
    (= txt1 "") (setq txt1 "1")
    );if
    (setq txt2 (getstring "\n\n Введите адрес узла (<1>):"))
  (if
    (= txt2 "") (setq txt2 "1")
    );if
       (setq llen (* 2.2 (strlen txt2)))
       (if
       (>= (strlen txt1) (strlen txt2))
       (setq llen (* 3.5 (strlen txt1)))
       );if
     (setq tce (getpoint "\n Укажите центр окружности, ограничивающей узел: "))
      (princ "\n Радиус окружности: ")
      (command "_circle" tce pause)
       (setq okr (entget (entlast))
             rokr (cdr(assoc 40 okr))
             tvn (getpoint tce "\n Укажите точку начала выноски: "))
       (command "_line" tce tvn "")
       (command "_lengthen" "_del" (- rokr) tce "")
     (setq priv (getvar "osmode"))
     (setvar "osmode" 0)
       (setq tvr  (polar tvn 0 llen)
             tvl  (polar tvn pi llen)
             ttr0 (polar tvn 0 (* 0.5 llen))
             ttr  (polar ttr0 (* 0.5 pi) 4)
             ttl0 (polar tvn pi (* 0.5 llen))
             ttl  (polar ttl0 (* 0.5 pi) 4)
             tpr  (polar ttr (* 1.5 pi) 7)
             tpl  (polar ttl (* 1.5 pi)7)
             ugr  (angle tce tvn))
    (if
    (and (> ugr 0) (<= ugr (* pi 0.5)))
            (command "_line" tvn tvr "")
    );if
    (if
    (and (> ugr (* pi 0.5)) (<= ugr pi))
            (command "_line" tvn tvl ""))
    (if
    (and (> ugr pi) (<= ugr (* 1.5 pi)))
            (command "_line" tvn tvl "")
    );if
    (if
    (and (> ugr (* 1.5 pi)) (<= ugr (* 2 pi)))
    (command "_line" tvn tvr "")
    );if
    (if
    (and (> ugr 0) (<= ugr (* pi 0.5)))
    (progn
    (command "_text" "_m" ttr 5 "0" txt1)
    (command "_text" "_m" tpr 3.5 "0" txt2)
    );progn
    );if
    (if
    (and (> ugr (* pi 0.5)) (<= ugr pi))
    (progn
    (command "_text" "_m" ttl 5 "0" txt1)
    (command "_text" "_m" tpl 3.5 "0" txt2)
    );progn
    );if
    (if
    (and (> ugr pi) (<= ugr (* pi 1.5)))
    (progn
    (command "_text" "_m" ttl 5 "0" txt1)
    (command "_text" "_m" tpl 3.5 "0" txt2)
    );progn
    );if
    (if (and (> ugr (* pi 1.5)) (<= ugr (* 2 pi)))
    (progn
    (command "_text" "_m" ttr 5 "0" txt1)
    (command "_text" "_m" tpr 3.5 "0" txt2)
    );progn
    );if
(setvar "osmode" priv)
(princ)
)

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Владимир Громов
Спасибо. Теперь работает как положено и в акаде.
Я там при переделке для акада еще и строчку текстовую при выборе радиуса случаем не ту загнал, только сейчас заметил.
Что значит свежий взгляд!
Вопрос, если не возражаете:
поясните в двух словах работу Вашей схемы отрисовки окружности:
(princ "\n Радиус окружности: ")
(command "_circle" tce pause)
Какую роль здесь играет пауза? Почему без нее отображение окружности не происходило?

Re: Комплект полезных утилит из BricsCad в AutoCAD

> BigScrew
Проверил стрелку и на 2006-м.
Работают все привязки.
По поводу кнопок с разными масштабами: я так понял вы хотите посадить на 3 кнопки 3 разных размера стрелки?
По сварным швам: пишите, что вас интересует.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Сначала я хотел воспользоваться программой Александра Ривилиса, которая описана здесь:
https://www.caduser.ru/forum/topic20171.html
но получилось бы, наверное, слишком громоздко. Тогда взял и попробовал вот такую конструкцию в  командной строке:

(command "_circle" pause pause)

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

(princ "\n Радиус окружности: ")

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Владимир Громов
Краткость-сестра таланта!;)
Спасибо еще раз! И за ссылку тоже.
Интересный материал.

Re: Комплект полезных утилит из BricsCad в AutoCAD

> Евгений
Нет, не работают привязки Midpoint и Nearest. Более того, если бы они только не работали, так нет же, программа устанавливает привязку EndPoint и стрелка прыгает в эту точку.

По сварным швам: пишите, что вас интересует

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

Re: Комплект полезных утилит из BricsCad в AutoCAD

Евгений пишет:

По поводу кнопок с разными масштабами: я так понял вы хотите посадить на 3 кнопки 3 разных размера стрелки?

Примерно так, только не с разными масштабами, а с разными размерами Arrow size. например, 2.5 и 5 единиц. Т.е. две кнопки с макросами на одну программу.

Re: Комплект полезных утилит из BricsCad в AutoCAD

BigScrew пишет:

Нет, не работают привязки Midpoint и Nearest. Более того, если бы они только не работали, так нет же, программа устанавливает привязку EndPoint и стрелка прыгает в эту точку.

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

;Отрисовка односегментной стрелки без надписи
(defun c:sleader (/ tn tk priv)
(setvar "cmdecho" 0)
(setq priv (getvar "osmode"))
     (setvar "osmode" 703)
  (setq tn (getpoint "\n\nУкажите точку начала стрелки"))
  (setq tk (getpoint tn "\n\nУкажите конечную точку стрелки"))
  (setq arsize (getvar "DIMASZ"))
(setvar "DIMASZ" 5)
  (command "_leader" tn tk "_a" "" "_n")
(setvar "DIMASZ" arsize)
(setvar "osmode" priv)
(princ)
);defun

Re: Комплект полезных утилит из BricsCad в AutoCAD

Евгений пишет:

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

Совершенно верно. Теперь с новой редакцией программы для отрисовки стрелки проблем нет. Спасибо.

Re: Комплект полезных утилит из BricsCad в AutoCAD

Если бы Вы чуток подробнее сразу описали характер глюка, уже давно все исправил бы
Не скупитесь на подробную информацию ;)

Re: Комплект полезных утилит из BricsCad в AutoCAD

А чем не устраивает просто команда _leader?

(command "_leader" pause pause "" "" "_n")

С использованием (setvar "cmdecho" 0) (или других setvar'ов)

(apply '(lambda    ()
      (setvar "cmdecho" 0)
      (command "_leader" pause pause "" "" "_n")
    )
       '()
)

Это можно сразу повесить на кнопку...

Re: Комплект полезных утилит из BricsCad в AutoCAD

Хочу привести вариант функции C:uzeln с "визуализацией":

(defun C:vn ( / txt1 txt2 p2 rad gr line_1 line_2 p_txt1 p_txt2 )
  (setq osm (getvar "osmode"))
  (setq txt_size (getvar "textsize"))
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setq    txt1 (getstring "\nВведите порядковый номер узла: <1> "))
    (if (= txt1 "") (setq txt1 "1"))
  (setq txt2 (getstring "\nВведите адрес узла: <1> "))
    (if (= txt2 "") (setq txt2 "1"))
  (setq    p2 (getpoint "\nЦентр выносного элемента :"))
  (vl-cmdf "_.circle" p2 pause)
  (setq    rad (cdr (assoc 40 (entget (entlast))))
    gr  (cadr (grread 5))
  )
  (vl-cmdf "_.line"
       gr
       (polar p2 (angle p2 gr) (+ rad 3.0))
       ""
  )
  (setq line_1 (entget (entlast)))
  (vl-cmdf "_.line"
       (cdr (assoc 11 line_1))
       (polar (cdr (assoc 11 line_1))
          (if (minusp (cos (angle p2 gr)))
            pi
            0
          )
          7.
       )
       ""
  )
  (setq line_2 (entget (entlast)))
  (setq    p_txt1
     (polar
       (cdr (assoc 10 line_2))
       (abs
         (-    (angle (cdr (assoc 10 line_2)) (cdr (assoc 11 line_2)))
        (atan (/ 4. 3.5))
         )
       )
       (/ 4. (sin (atan (/ 4. 3.5))))
     )
  )
  (vl-cmdf "_.text" "J" "MC" p_txt1 5 0 txt1)
  (setq txt1 (entget (entlast)))
  (setq    p_txt2 (polar p_txt1 (* 1.5 pi) 6.5))
  (vl-cmdf "_.text" "J" "MC" p_txt2 3.5 0 txt2)
  (setq txt2 (entget (entlast)))
  (modification)
  (setvar "osmode" osm)
  (setvar "textsize" txt_size)
  (princ)
)
(defun modification ()
  (while (and (setq gr (grread 5)) (= (car gr) 5))
;;;line_1
    (setq line_1 (subst    (cons 10 (polar p2 (angle p2 (cadr gr)) rad))
            (assoc 10 line_1)
            line_1
         )
    )
    (setq line_1
       (subst
         (cons 11
           (polar (cdr (assoc 10 line_1))
              (angle p2 (cadr gr))
              (max 3.0 (- (distance (cadr gr) p2) rad))
           )
         )
         (assoc 11 line_1)
         line_1
       )
    )
    (entmod line_1)
    (entupd (cdr (assoc -1 line_1)))
;;;line_2
    (setq line_2 (subst    (cons 10 (cdr (assoc 11 line_1)))
            (assoc 10 line_2)
            line_2
         )
    )
    (setq line_2
       (subst (cons    11
            (polar (cdr (assoc 11 line_1))
                   (if (minusp (cos (angle p2 (cadr gr))))
                 pi
                 0
                   )
                   7.
            )
          )
          (assoc 11 line_2)
          line_2
       )
    )
    (entmod line_2)
    (entupd (cdr (assoc -1 line_2)))
;;;txt1
    (setq txt1
       (subst (cons    11
            (polar (cdr (assoc 10 line_2))
                   (abs (- (angle (cdr (assoc 10 line_2))
                          (cdr (assoc 11 line_2))
                       )
                       (atan (/ 4. 3.5))
                    )
                   )
                   (/ 4. (sin (atan (/ 4. 3.5))))
            )
          )
          (assoc 11 txt1)
          txt1
       )
    )
    (entmod txt1)
    (entupd (cdr (assoc -1 txt1)))
;;;txt2
    (setq txt2 (subst (cons 11 (polar (cdr (assoc 11 txt1)) (* 1.5 pi) 6.5))
              (assoc 11 txt2)
              txt2
           )
    )
    (entmod txt2)
    (entupd (cdr (assoc -1 txt2)))
  ) ;_while
)

Правда горизонтальная полка здесь фиксированной длины, но можно сделать  чтобы она изменялась в зависимости от длины  вводимого текста (на мой взгляд этого не надо).