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

> CB
После указания центра выносого элемента неизвестно, что делать дальше. Почему-то текстовые строки сдинуты вверх по вертикали относительно горизонтальной линии. Горизонтальная полка фиксированной длины - нехорошо, IMHO. Еще нехорошо, IMHO, то, что и в программе Евгения, и в вашей не учтена переменная DIMSCALE.

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

CB пишет:

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

Не устраивает команда "Leader" т.к. глюкавая со дня своего рождения. И диалог уж слишком занудный. А вот макрос ваш очень даже устраивает. Беру на вооружение. Спасибо.

> CB
Программа тоже хороша. И тоже берем на вооружение. Есть частная просьба. Сделать программу без "адреса узла". Ну и полку по умолчанию сделать в 5 единиц. Спасибо.

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

Извините что долго не отвечал - конец года, много работы...

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

После указания центра выносого элемента неизвестно, что делать дальше

После

(setq  p2 (getpoint "\nЦентр выносного элемента :"))

вставить

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

Почему-то текстовые строки сдинуты вверх по вертикали относительно горизонтальной линии.

Да здесь ошибка. Нужно в

(setq  p_txt2 (polar p_txt1 (* 1.5 pi) 6.5)) и в
(setq txt2 (subst (cons 11 (polar (cdr (assoc 11 txt1)) (* 1.5 pi) 6.5))

изменить 6.5 на 7.25.

Горизонтальная полка фиксированной длины

Как я говорил это решается легко. Длина горизонтальной полки равна

(+ (car (cadr (textbox (list (cons 1 txt1))))) 3.)

где 3 - суммарное расстояние отступа текста от краев полки (отступ по 1.5 мм).
И вообще я эту программу делал с одной целью (правда на конкретном примере) - проверить работу функции (grread) в условиях достаточно больших вычислений (не будет ли тормозить машина).

BigScrew пишет:

Есть частная просьба. Сделать программу без "адреса узла". Ну и полку по умолчанию сделать в 5 единиц.

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

(defun c:v_elem    (/ *error* current_dimstyle current_sysvar txt cen gr)
  (vl-load-com)
  (defun *error* (msg)
    (vla-EndUndoMark
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vl-cmdf "_.U")
    (princ "\nОтмена\n")
    (princ)
  )
  (if (not (tblsearch "dimstyle" "v_elem"))
    (vl-cmdf "dim1"    "save"     "v_elem"
         "dimblk"  "_None"
         "dimcen"  0
         "dimtoh"  1
         "dimtofl" 0
         "dimtix"  0
         "DIMTMOVE" 0
         "dim1" "save" "v_elem"  "y"
    )
    (vl-cmdf "dim1" "restore" "v_elem")
  )
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (setq current_dimstyle (getvar "dimstyle"))
  (setq    current_sysvar
     (mapcar 'getvar
         '("cmdecho"    "osmode"     "dimblk"      "dimcen"
           "dimtoh"    "dimtofl"    "dimtix"      "dimtmove"
          )
     )
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq txt (getstring
      "\nОбозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> ")
  )
  (if (= txt "")
    (setq txt "А")
  )
  (setq cen (getpoint "\nЦентр выносного элемента"))
  (princ "\n Радиус окружности: ")
  (vl-cmdf "_.circle" cen pause)
  (setq gr (cadr (grread 5)))
  (vl-cmdf "_.dimradius" gr "_t" (strcat "\\H1.4x;" txt) pause
       "dim1" "restore" "Standard")
  (mapcar 'setvar
      '("cmdecho"     "osmode"     "dimblk"       "dimcen"
        "dimtoh"     "dimtofl"    "dimtix"       "dimtmove"
       )
      current_sysvar
  )
    (vla-EndUndoMark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

Эту программу я делал для себя, на основе программы Дениса Флюстикова, которая выложена здесь :https://www.caduser.ru/forum/topic24200.html
Меня она не устроила тем, что боковая линия начинается из центра окружности, чего не должно быть. Но сама идея осталась...
Теперь просьба и от меня - все кто захочет попробовать работу программы, ответить как она работает на других машинах, т.к ее корректная работа зависит от состояния системных переменных в чертеже и я не знаю точно, достаточно ли введено системных переменных в новый размерный стиль "v_elem" для нормальной работы программы? И еще:
1. Почему то не срабатывает режим защиты от "бабушек" (обработчик ошибок) в момент выхода из программы по Esc когда рисуется окружность :

Центр выносного элемента
 Радиус окружности: *Cancel*
*Invalid selection*
Expects a single object.
*Invalid selection*
Expects a single object.
*Cancel*

хотя состояние системных переменных и восстанавливается.
2. Может кто подскажет - есть ли сист. переменная которая отвечает за отступ от полки выноски после текста?
Теперь по поводу предыдущей программы - есть ли смысл доводить ее до ума, единственным преимуществом которой является (ИМХО) отсутствие взаимодействия с системными переменными чертежа и как следствие нормальная работа в любом чертеже и на любой машине?

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

Только сейчас заметил, что делать список состояния системных переменных надо перед созданием нового размерного стиля:

(defun c:v_elem    (/ *error* current_dimstyle current_sysvar txt cen gr)
  (vl-load-com)
  (defun *error* (msg)
    (vla-EndUndoMark
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vl-cmdf "_.U")
    (princ "\nОтмена\n")
    (princ)
  )
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (setq    current_sysvar
     (mapcar 'getvar
         '("cmdecho"    "osmode"     "dimblk"      "dimcen"
           "dimtoh"    "dimtofl"    "dimtix"      "dimtmove"
          )
     )
  )
  (setq current_dimstyle (getvar "dimstyle"))
  (if (not (tblsearch "dimstyle" "v_elem"))
    (vl-cmdf "dim1"    "save"     "v_elem"
         "dimblk"  "_None"
         "dimcen"  0
         "dimtoh"  1
         "dimtofl" 0
         "dimtix"  0
         "DIMTMOVE" 0
         "dim1" "save" "v_elem"  "y"
    )
    (vl-cmdf "dim1" "restore" "v_elem")
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq txt (getstring
      "\nОбозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> ")
  )
  (if (= txt "")
    (setq txt "А")
  )
  (setq cen (getpoint "\nЦентр выносного элемента"))
  (princ "\n Радиус окружности: ")
  (vl-cmdf "_.circle" cen pause)
  (setq gr (cadr (grread 5)))
  (vl-cmdf "_.dimradius" gr "_t" (strcat "\\H1.4x;" txt) pause
       "dim1" "restore" "Standard")
  (mapcar 'setvar
      '("cmdecho"     "osmode"     "dimblk"       "dimcen"
        "dimtoh"     "dimtofl"    "dimtix"       "dimtmove"
       )
      current_sysvar
  )
    (vla-EndUndoMark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

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

> CB
В начальном варианте макрос что-то около того и выглядел. Но потом я немного изменил для удобства настройки размера стрелки. Сейчас в последней версии BricsCAD BonusTools я объединил в одном диалоговом окне параметры настройки вычерчивания символов условных обозначений. Для того, чтобы настроить размер той же одиночной стрелки не надо лезть в параметры размеров или менять значение системной переменной в ком.строке. Кнопкой открываем окно и вводим в соотвествующей строке нужный параметр размера символа или текста. Именно поэтому я и добавил пару лишних строк в макрос.

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

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

Еще нехорошо, IMHO, то, что и в программе Евгения, и в вашей не учтена переменная DIMSCALE.

Поскольку изначально пакет делался сугубо для внутреннего потребления в нашей организации (где, увы, использование DIMSCALE не прижилось)
то и связки с этой переменной у меня не было.  Сейчас BricsCAD BonusTools понемногу начинают использовать и другие пользователи BricsCAD (и не только), но в каждой фирме сложились свои стандарты и приемы черчения, что создавало определенные неудобства в работе с пакетом. С учетом этого в новой версии BricsCAD BonusTools 1.1.0015 (выложена по прежнему адресу http://sabit.com.ua/apps.php) введена поддержка переменной DIMSCALE для инструментов панелей "Условные обозначения" и "Таблицы". Кроме того для большей гибкости ввел, как уже писал для СВ, дополнительную функцию, работающую с диалоговым окном настройки параметров панели "Условных обозначений" и позволяющую управлять основными размерами элементов. Мне сдается это более удобным, чем создавать отдельную кнопку для каждого, например, размера стрелки, как предлагает BigScrew.
PS: Отдельное спасибо Владимиру Громову и СВ за предлагаемые варианты.
> CB
Если вы не возражаете, отдельные моменты из вашего кода я  попробую использовать и в BricsCAD BonusTools. Мне понравилось Ваше решение визуализации при отрисовке обозначения узла.
> BigScrew
Посмотрите возможности настройки параметров в новой версии пакета. Если такой подход для Вас  окажется неудобным, то тогда сделайте два макроса на две кнопки, поменяв в коде значение переменной в строке (setvar "DIMASZ" 5) на нужное. Если что в Акаде не будет работать - продолжим разбор полетов в этой теме. Как оказалось - тема вышла полезная не только для Вас но и для меня, поскольку лиспом занимаюсь относительно недавно и к советы специалистов я тоже беру на вооружение.

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

> Евгений
Обязательно продолжим. У меня сейчас загрузка большая. На днях попробуем перейти к "сварочным швам". Правда я что- то c математикой "подвис". Мне нужно не пpямjе линии, a что- то в виде дуг. Но как это дело параметризировать-  не могу сообразить. А тема полезная всегда, когда есть эффект в скорости или удобстве работы. :)

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

> CB
Проверил работу v_elem. С первым проблем вроде не обнаружил. Второй вариант не заработал. После задания точки вставки выноски все элементы пропадают.
Для команды обозначения узла из BricsCAD BonusTools я перовоначально тоже пробовал использовать выноску, но нам необходимо было вводить вторую строку (адрес узла)под выноской, поэтому пришлось отказаться от этого варианта.
Эту схему я использовал для команд "быстрых" выносок с точкой или стрелкой на конце. Для создания в чертеже необходимых размерных стилей
не стал вводить значения переменных, а использовал файлы блоков с уже заданными стилями, которые при необходимости вставляются и сразу удаляются из чертежа, создавая в нем необходимые размерные стили. Не знаю, какой вариант лучше, но мне так показалось удобнее.
Ниже привожу тексты для выносок со стрелкой и точкой.

;Отрисовка выноски со стрелкой на конце и строкой текста(For BricsCAD)
;Е.Сосновский, г.Мариуполь, 2006г.
;Макрос для кнопки ^C^C(if (not c:arlead) (load "arlead")) arlead
(defun c:arlead (/ tr1 tr2 ar1 ar2)
    ;;Функция отмены и выхода
    (defun *error* (msg)
    (if (= msg "quit / exit abort")
    (princ)
    );if
    );defun
    
        (setvar "cmdecho" 0)
        (setq    curlay         (getvar "CLAYER")
                curdim         (getvar "DIMSTYLE")
                    DS      (getvar "DIMSCALE"))
        
(setq ff (open (findfile "set.txt") "r"))
(setq     rz         (read-line  ff);масштаб символа разрыва
        poz        (read-line  ff);шрифт позиции
        arx        (read-line  ff);шрифт оси
        uz1        (read-line  ff);шрифт наименования узла (исх.)
        uz2        (read-line  ff);шрифт адреса узла (назн.)
        uz3        (read-line  ff);шрифт наименования узла (назн.)
        uz4        (read-line  ff);шрифт адреса узла (исх.)
        sl        (read-line  ff);размер одиночной стрелки
        otm        (read-line  ff);шрифт отметки
        ar1        (read-line  ff);шрифт однострочной выноски
        ar2        (read-line  ff);размер стрелки однострочной выноски
        arx2    (read-line  ff);отступ размера от оси для осевой сетки
        sec_h    (read-line  ff);шрифт сечения
)
(close ff )
        
        (setq     layobjname     (tblobjname "layer" "РАЗМЕР_0.13"))
        (setq     dimobjname     (tblobjname "dimstyle" "AR_LEAD"))
    (if (or (= layobjname nil) (= dimobjname nil))
    (progn
        (command "_insert" "ar_bl" (list 0 0) "" "" "")
        (setq     del (entdel (entlast)))
    );progn
    );if
        (command "_layer" "_s" "РАЗМЕР_0.13" "")
        (command "_dimstyle" "_r" "ar_lead" )
        (setq     tr1     (getpoint "\n\n Укажите точку начала выноски:"))
        (setq    tr2     (getpoint tr1 "\n\n Укажите конечную точку выноски:"))
        (command "_line" tr1 tr2 "")
        (setq     tl         (entlast))
        (setq     txt     (getstring t "\nВведите текст:"))
        (setq arsize (getvar "DIMASZ"))
        (setq txtsize (getvar "DIMTXT"))
        (setq gabsize (getvar "DIMGAP"))
        (setvar "DIMSCALE" DS)
        (setvar "DIMASZ"  (atof ar2))
        (setvar "DIMTXT"  (atof ar1))
        (setvar "DIMGAP" (* 0.3 (atof ar2)))
        (command "_leader" tr1 tr2 "_a" txt "")
        (entdel tl)
    (command "_redraw")
    (command "_layer" "_s" curlay "")
    (setvar "DIMASZ" arsize)
    (setvar "DIMTXT" txtsize)
    (setvar "DIMGAP" gabsize)
    (command "_dimstyle" "_r"  curdim)
    (setvar "DIMSCALE" DS)
    (princ)
);defun
;Отрисовка выноски с точкой на конце и строкой текста(For BricsCAD)
;Е.Сосновский, г.Мариуполь, 2006г.
;Макрос для кнопки ^C^C(if (not c:dotlead) (load "dotlead")) dotlead
(defun c:dotlead ()
;;Функция отмены и выхода
    (defun *error* (msg)
    (if (= msg "quit / exit abort")
    (princ)
    );if
    );defun
    
    (setvar "cmdecho" 0)
        (setq    curlay         (getvar "CLAYER"))
        (setq    curdim         (getvar "DIMSTYLE"))
        (setq DS     (getvar "DIMSCALE"))
        
(setq ff (open (findfile "set.txt") "r"))
        (setq     rz     (read-line  ff)
        poz    (read-line  ff)
        arx    (read-line  ff)
        uz1    (read-line  ff)
        uz2    (read-line  ff)
        uz3    (read-line  ff)
        uz4    (read-line  ff)
        sl    (read-line  ff)
        otm    (read-line  ff)
        ar1    (read-line  ff);размер стрелки
        ar2    (read-line  ff);высота текста
)
(close ff )
        
        (setq     layobjname     (tblobjname "layer" "РАЗМЕР_0.13"))
        (setq     dimobjname     (tblobjname "dimstyle" "DOT_LEAD"))
    (if (or (= layobjname nil) (= dimobjname nil))
    (progn
        (command "_insert" "dot_bl" (list 0 0) "" "" "")
        (setq     del (entdel (entlast)))
    );progn
    );if
        (command "_layer" "_s" "РАЗМЕР_0.13" "")
        (command "_dimstyle" "_r" "dot_lead" )
        (setq     tr1     (getpoint "\n\n Укажите точку начала выноски:"))
        (setq    tr2     (getpoint tr1 "\n\n Укажите конечную точку выноски:"))
        (command "_line" tr1 tr2 "")
        (setq     tl         (entlast))
        (setq     txt     (getstring t "\nВведите текст:"))
        (setq arsize (getvar "DIMASZ"))
        (setq txtsize (getvar "DIMTXT"))
        (setq gabsize (getvar "DIMGAP"))
        (setvar "DIMSCALE" DS)
        (setvar "DIMASZ"  (atof ar2))
        (setvar "DIMTXT"  (atof ar1))
        (setvar "DIMGAP" (* 0.3 (atof ar2)))
        (command "_leader" tr1 tr2 "_a" txt "")
        (entdel tl)
    (command "_redraw")
    (command "_layer" "_s" curlay "")
    (setvar "DIMASZ" arsize)
    (setvar "DIMTXT" txtsize)
    (setvar "DIMGAP" gabsize)
    (command "_dimstyle" "_r"  curdim)
    (setvar "DIMSCALE" DS)
    (princ)
);defun

Я не стал убирать фрагмент с чтением файла настроек. Даю этот код только как иллюстрацию варианта создания размерных стилей в чертеже.
Блоки "dot_bl" и "ar_bl" несут в себе необходимую информацию и могут быть использованы при необходимости и в других функциях.

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

Маленькое дополнение к предыдущему сообщению:
одновременно создаются на основе блока и недостающие слои при их отсутствии в чертеже.

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

> Евгений
А такой вариант работает?

(defun c:v_elem    (/ *error* current_dimstyle current_sysvar txt cen gr)
  (vl-load-com)
  (defun *error* (msg)
    (vla-EndUndoMark
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vl-cmdf "_.U")
    (princ "\nОтмена\n")
    (princ)
  )
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (setq    current_sysvar
     (mapcar 'getvar
         '("cmdecho"    "osmode"     "dimblk"      "dimcen"
           "dimtoh"    "dimtofl"    "dimtix"      "dimtmove"
          )
     )
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq current_dimstyle (getvar "dimstyle"))
  (if (not (tblsearch "dimstyle" "v_elem"))
    (vl-cmdf "dim1"    "save"     "v_elem"
         "dimblk"  "_None"
         "dimcen"  0
         "dimtoh"  1
         "dimtofl" 0
         "dimtix"  0
         "DIMTMOVE" 0
         "dim1" "save" "v_elem"  "y"
    )
    (vl-cmdf "dim1" "restore" "v_elem")
  )
  (setq txt (getstring
      "\nОбозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> ")
  )
  (if (= txt "")
    (setq txt "А")
  )
  (setq cen (getpoint "\nЦентр выносного элемента"))
  (princ "\n Радиус окружности: ")
  (vl-cmdf "_.circle" cen pause)
  (setq gr (cadr (grread 5)))
  (vl-cmdf "_.dimradius" gr "_t" (strcat "\\H1.4x;" txt) pause
       "dim1" "restore" current_dimstyle)
  (mapcar 'setvar
      '("cmdecho"     "osmode"     "dimblk"       "dimcen"
        "dimtoh"     "dimtofl"    "dimtix"       "dimtmove"
       )
      current_sysvar
  )
    (vla-EndUndoMark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

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

> CB
Не работает. Надо бы не забывать про подчерк "_" для русских версий.

Команда: V_ELEM
Неизвестная команда "V_ELEM".  Для вызова справки нажмите F1.
Неизвестная команда "V_ELEM".  Для вызова справки нажмите F1.
Неизвестная команда "Y".  Для вызова справки нажмите F1.
Обозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> *Прервано*
Отмена

Кстати, в этом коде есть еще pause без подсказки в командной строке.

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

> CB
Заработало в таком варианте.

(defun c:v_elem  (/ *error* current_dimstyle current_sysvar txt cen gr)
  (vl-load-com)
  (defun *error* (msg)
    (vla-EndUndoMark
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vl-cmdf "_.U")
    (princ "\nОтмена\n")
    (princ)
  )
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (setq  current_sysvar
   (mapcar 'getvar
     '("cmdecho"  "osmode"     "dimblk"    "dimcen"
       "dimtoh"  "dimtofl"    "dimtix"    "dimtmove"
      )
   )
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq current_dimstyle (getvar "dimstyle"))
  (if (not (tblsearch "dimstyle" "v_elem"))
    (vl-cmdf "dim1"    "save"   "v_elem"
       "dimblk"  "_None"
       "dimcen"  0
       "dimtoh"  1
       "dimtofl" 0
       "dimtix"  0
       "DIMTMOVE" 0
       "dim1" "save" "v_elem"  "y"
    )
    (vl-cmdf "dim1" "_restore" "v_elem")
  )
  (setq txt (getstring
    "\nОбозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> ")
  )
  (if (= txt "")
    (setq txt "А")
  )
  (setq cen (getpoint "\nЦентр выносного элемента"))
  (princ "\n Радиус окружности: ")
  (vl-cmdf "_.circle" cen pause)
  (setq gr (cadr (grread 5)))
  (vl-cmdf "_.dimradius" gr "_t" (strcat "\\H1.4x;" txt) pause
     "dim1" "_restore" current_dimstyle)
  (mapcar 'setvar
    '("cmdecho"   "osmode"     "dimblk"     "dimcen"
      "dimtoh"   "dimtofl"    "dimtix"     "dimtmove"
     )
    current_sysvar
  )
    (vla-EndUndoMark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

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

У меня заработало вот в таком виде (AutoCAD 2006 RUS):

(defun c:v_elem  (/ *error* current_dimstyle current_sysvar txt cen gr)
  (vl-load-com)
  (defun *error* (msg)
    (vla-EndUndoMark
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vl-cmdf "_.U")
    (princ "\nОтмена\n")
    (princ)
  )
  (vla-startundomark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (setq  current_sysvar
   (mapcar 'getvar
     '("cmdecho"  "osmode"     "dimblk"    "dimcen"
       "dimtoh"  "dimtofl"    "dimtix"    "dimtmove"
      )
   )
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq current_dimstyle (getvar "dimstyle"))
  (if (not (tblsearch "dimstyle" "v_elem"))
    (vl-cmdf "dim1"    "_save"   "v_elem"
       "dimblk"  "_None"
       "dimcen"  0
       "dimtoh"  1
       "dimtofl" 0
       "dimtix"  0
       "DIMTMOVE" 0
       "dim1" "_save" "v_elem"  "_y"
    )
    (vl-cmdf "dim1" "_restore" "v_elem")
  )
  (setq txt (getstring
    "\nОбозначение выносного элемента [А/Б/В/Г/Д/Е/Ж/]: <А> ")
  )
  (if (= txt "")
    (setq txt "А")
  )
  (setq cen (getpoint "\nЦентр выносного элемента"))
  (princ "\n Радиус окружности: ")
  (vl-cmdf "_.circle" cen pause)
  (setq gr (cadr (grread 5)))
  (princ "\n Конечная точка выноски: ")
  (vl-cmdf "_.dimradius" gr "_t" (strcat "\\H1.4x;" txt) pause
     "dim1" "_restore" current_dimstyle)
  (mapcar 'setvar
    '("cmdecho"   "osmode"     "dimblk"     "dimcen"
      "dimtoh"   "dimtofl"    "dimtix"     "dimtmove"
     )
    current_sysvar
  )
    (vla-EndUndoMark
    (vla-get-activedocument (vlax-get-acad-object))
  )
  (princ)
)

Все-таки, не хватало подчерков "_".

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

Да, старые грабли, на которые я пока не натыкался, т.к. все время работаю в английском ACAD'е. Но все-таки хотелось бы услышать рекомендации почему не срабатывает (defun *error* (msg)) при выходе по Esc когда рисуется окружность, чтобы правильно использовать ее в других программах...
Спасибо за отзывы!

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

> CB
Вот что написано в книге "VisualLisp и секреты адаптации AutoCAD" (Н.Полещук):
Нажатие клавиши <Esc> при работающей функции grread прервет действие всех функций языка AutoLISP (в том числе и самой grread), если не включен битовый флаг 8. Видимо, здесь прекращается и действие функции *error*. Но флаг 8 тоже ничего не дает.

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

Сделал на основе варианта СВ отрисовку обозначения узла для BricsCAD (с изменением длины полки, поддержкой DIMSCALE, в полном варианте подключается диалог и файл настройки для установки высоты шрифтов). Работает и в Акаде, хотя справедливости ради замечу, что в BricsCAD визуализация динамического контура окружности даже несколько лучше, чем в акаде.
Но при использовании в BricsCAD столкнулся с небольшой проблемкой: если в момент позиционирования полки выносного элемента выполнить масштабирование колесиком мыши, то позиционирование прерывается и полка с текстом вставляется в ту точку, где в момент начала масштабирования находился курсор. Надеюсь, что позже эту проблему удастся решить, а если кто-то из специалистов уже сталкивался с подобной задачкой - буду благодарен за совет.
Ниже привожу вариант программы:

 (defun C:vn_ds ( / txt1 txt2 tce rad gr line_1 line_2 p_txt1 p_txt2 )
;;Функция отмены и выхода
    (defun *error* (msg)
    (if (= msg "quit / exit abort")
    (princ)
    );if
    );defun
    
    (setvar "cmdecho"     0)
    (setq      curlay        (getvar "CLAYER"))
    (setq     DS             (getvar "DIMSCALE"))
    (setq     priv         (getvar "osmode"))
    (setvar "osmode"     0)
    (setq     uz1f (* DS 5)) ;высота шрифта номера узла
    (setq     uz2f (* DS 3.5)) ;высота шрифта адреса узла
    (setq  txt1 (getstring "\nВведите порядковый номер узла: <1> "))
    (if (= txt1 "") (setq txt1 "1"))
    (setq txt2 (getstring "\nВведите адрес узла: <1> "))
    (if (= txt2 "") (setq txt2 "1"))
    (setq llen (* 0.7 uz2f (strlen txt2)))
       (if
       (>= (strlen txt1) (strlen txt2))
    (setq llen (* 0.7 uz1f (strlen txt1)))
       );if
    
    (setq     layobjname         (tblobjname "layer" "РАЗМЕР_0.13"))
    (if (= layobjname nil)
        (command "_layer" "_m" "РАЗМЕР_0.13" "_c" 104 "" "_lw" 0.13 "" "")
        (command "_layer" "_s" "РАЗМЕР_0.13" "")
    );if
    
    (setq tce (getpoint "\n Укажите центр окружности, ограничивающей узел: "))
    (princ "\n Радиус окружности: ")
    (command "_circle" tce pause)
    
    (setq      rad (cdr (assoc 40 (entget (entlast))))
            gr  (cadr (grread 5))
    );setq
    (command "_line" gr (polar tce (angle tce gr) (+ rad 3.0)) "")
    (setq line_1 (entget (entlast)))
    (command "_line"
     (cdr (assoc 11 line_1))
     (polar (cdr (assoc 11 line_1))
      (if (minusp (cos (angle tce gr)))
        pi
        0
      )
      llen
     )
     ""
  )
  (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 (/ (* 0.8 uz1f) (* 0.5 llen )))
        )
     );abs
     (/ (* 0.8 uz1f) (sin (atan (/ (* 0.8 uz1f) (* 0.5 llen )))))
   )
  )
  (setq layobjname (tblobjname "layer" "ТЕКСТ_0.30"))
(if (= layobjname nil)
  (command "_layer" "_m" "ТЕКСТ_0.30" "_c" 34 "" "_lw" 0.30 "" "")
  (command "_layer" "_s" "ТЕКСТ_0.30" "")
);if
  (command "_text" "J" "MC" p_txt1 uz1f 0 txt1)
  (setq txt1 (entget (entlast)))
  (setq  p_txt2 (polar p_txt1 (* 1.5 pi) (+ (* 1.1 uz1f) (* 0.5 uz2f))))
  (command "_text" "J" "MC" p_txt2 uz2f 0 txt2)
  (setq txt2 (entget (entlast)))
  (modification)
  (setvar "osmode" priv)
  (princ)
)
(defun modification ()
  (while (and (setq gr (grread 5)) (= (car gr) 5))
;;;line_1
    (setq line_1 (subst  (cons 10 (polar tce (angle tce (cadr gr)) rad))
      (assoc 10 line_1)
      line_1
     )
    )
    (setq line_1
     (subst
       (cons 11
       (polar (cdr (assoc 10 line_1))
        (angle tce (cadr gr))
        (max 3.0 (- (distance (cadr gr) tce) 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 tce (cadr gr))))
        pi
         0
             )
             llen
      )
      )
      (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 (/ (* 0.8 uz1f) (* 0.5 llen )))
    )
            );abs
            (/ (* 0.8 uz1f) (sin (atan (/ (* 0.8 uz1f) (* 0.5 llen )))))
      )
      )
      (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) (+ (* 1.1 uz1f) (* 0.5 uz2f))))
    (assoc 11 txt2)
    txt2
    )
    )
    (entmod txt2)
    (entupd (cdr (assoc -1 txt2)))
  ) ;_while
)

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

OOPS!!!
В конце описания основной функции vn_ds
забыл вставить восстановление слоя:

  (setvar "osmode" priv)
  (command "_layer" "_s" curlay "")
  (princ)

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

Вся проблема, скорее всего, сидит в неадекватной реакции скандально-известной и порой непредсказуемой функции GRREAD на среднюю кнопку-колесико мыши. При ее задействовании (в BricsCAD) код прерывается.

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

> Евгений
Рекомендую такой вариант вычисления длины горизонтальной полки, будет красивше (ИМХО)

(setq llen (+ 2.
      (apply 'max
         (mapcar '(lambda (x y)
                (setvar "textsize" x)
                (car (cadr (textbox (list (cons 1 y)))))
              )
             (list uz1f uz2f)
             (list txt1 txt2)
         )
      )
           )
)

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

> Евгений
Я задавал вопрос про обработчик ошибок в функции (defun c:v_elem) - там нет (grread). Обсуждение этого вопроса было здесь http://www.arcada.com.ua/forum/viewtopi … cc1f42079c

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

Вернее (grread) есть, но к рисованию окружности он не имеет никакого отношения, т.к. используется в функции (vl-cmdf "_.dimradius"...) для выбора уже нарисованной окружности

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

> CB
Спасибо за вариант. Он действительно более правильный и красивый, поскольку решается проблема "широких" шрифтов и длина полки определяется более корректно. Я пытался изначально делать что-то похожее, но у меня в BricsCAD тогда не сработало, поэтому сделал менее "красивый" вариант (хотя для гостовских шрифтов он вполне подходит). Попробовал вариант СВ - тоже не пошло. Работает пока только в Акаде. Но я еще раз попробую все-таки покопать с учетом варианта СВ. Но это уже более интересно пользователям BricsCAD, на которых в первую очередь и ориентирован пакет BonusTools. А акадовцы при необходимости могут использовать любой из предложенных здесь вариантов отрисовки узла, одиночной стрелки и т.д.

Я задавал вопрос про обработчик ошибок в функции (defun c:v_elem) — там нет (grread).

Когда я писал о (grread), то имел в виду не ваш вопрос, а ту проблемку, которая возникла у меня при использовании этой функции в BricsCAD (зум и пан средней кнопкой (колесиком) мыши во время позиционирования полки выноски прерывает выполнение grread). Пока работает в варианте таком: чтобы продолжить позиционирование после зума или пана щелкаю левой кнопкой и тяну выноску с текстом в другое место, а для вставки жму правую кнопку. В принципе тоже вполне приемлемо. Но если есть какая-то идейка по этому поводу - буду благодарен.
А что касается варианта использования "_.dimradius"  в качестве выноски
то идея тоже хорошая. Единственное - для BricsCAD попробую сделать все в чистом лиспе.
И как недостаток - необходимость создания дополнительного размерного стиля и отсутствие второй строки. Но, как говорится, - красота требует жертв ;)

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

А если попробовать вместо (grread) использовать нечто наподобие:

(if (and (setq start_point (getpoint "\nНачало : "))
(setq end_point (getpoint start_point "\nКонец : ")))
(progn
;; Погнали основной код
)
(progn
;; Ошибка
)
)

Скобки только проверьте ;)
И насчет _.dimradius: А если попробовать после первой строки использовать "\X"?

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

> Евгений
Я не работал в BricsCAD'е, поэтому посоветовать ничего не могу.

но у меня в BricsCAD тогда не сработало, поэтому сделал менее "красивый" вариант (хотя для гостовских шрифтов он вполне подходит). Попробовал вариант СВ — тоже не пошло.

А что - BricsCAD не "понимает" функции AutoLisp'а? Было бы понятно если б использовались функции Visual Lisp...

А что касается варианта использования "_.dimradius" в качестве выноски
то идея тоже хорошая. Единственное — для BricsCAD попробую сделать все в чистом лиспе.

Так здесь все на чистом Lisp'е, только обровотчик ошибок сделан на VLisp, нужно только заменить (vla-startundomark(vla-get-activedocument(vlax-get-acad-object))) на (command "_undo" "BE"), а (vla-EndUndoMark(vla-get-activedocument (vlax-get-acad-object))) на (command "_undo" "E")(см. опции команды UNDO).

kpblc пишет:

И насчет _.dimradius: А если попробовать после первой строки использовать "\X"?

Если можно, то поподробнее о чем идет речь...

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

> CB
BricsCAD не понимает vl*-функций, насколько я понял.
И поподробнее :)
Если в радиусном (да и вообще в любом размере) в качестве TextOverride поставить нечто типа

<>\XВторая строка

то "Вторая строка" будет помещена "под" размерную линию. Другой вопрос, каково будет поведение такого размера после его перемещения или stretch'a.

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

CB пишет:

А что — BricsCAD не "понимает" функции AutoLisp'а? Было бы понятно если б использовались функции Visual Lisp...

BricsCAD понимает "чистый" LISP (а не AutoLisp -это ожидается вроде в новой версии). В целом при его использовании с лиспом проблем не возникает, но в отдельных случаях не все конструкции, работавшие в акаде срабатывают сразу и в BricsCAD (справедливости ради замечу и обратное - не все, работающее в BricsCAD сразу начинает работать в Акаде).
А с _.dimradius проблем у меня пока нет. Еще хочу поэкспериментировать с вариантом kpblc. Все-таки нужны две строки.
2 kpblc
Спасибо за советы, буду пробовать.