Извините что долго не отвечал - конец года, много работы...
Владимир Громов пишет:После указания центра выносого элемента неизвестно, что делать дальше
После
(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. Может кто подскажет - есть ли сист. переменная которая отвечает за отступ от полки выноски после текста?
Теперь по поводу предыдущей программы - есть ли смысл доводить ее до ума, единственным преимуществом которой является (ИМХО) отсутствие взаимодействия с системными переменными чертежа и как следствие нормальная работа в любом чертеже и на любой машине?