(defun c:SETDIMFIX ( / sel nested_ent blk_ref blk_name blk_def
cur_pre cur_suf new_pre new_suf new_name
src obj_dxf target_dim target_handle)
;; 1. Пользователь кликает ПРЯМО НА РАЗМЕР внутри блока
(setq sel (nentsel "
Кликните на размер внутри блока: "))
(if (null sel) (exit))
(setq nested_ent (car sel)) ; объект внутри блока (размер)
(setq blk_ref (last (caddr sel))) ; вхождение блока (INSERT)
;; Проверка — выбран именно размер
(if (/= (cdr (assoc 0 (entget nested_ent))) "DIMENSION")
(progn (princ "
Кликните именно на размер!") (exit)))
;; Проверка — выбран именно блок
(if (/= (cdr (assoc 0 (entget blk_ref))) "INSERT")
(progn (princ "
Объект не внутри блока!") (exit)))
;; 2. Запомнить handle целевого размера (для поиска при копировании)
(setq target_handle (cdr (assoc 5 (entget nested_ent))))
(setq blk_name (cdr (assoc 2 (entget blk_ref))))
;; 3. Текущие префикс/суффикс
(setq ddxf (entget nested_ent))
(setq cur_pre (if (assoc 3 ddxf) (cdr (assoc 3 ddxf)) ""))
(setq cur_suf (if (assoc 4 ddxf) (cdr (assoc 4 ddxf)) ""))
(princ (strcat "
Размер: " (rtos (cdr (assoc 42 ddxf)) 2 2)))
(princ (strcat " Преф: "" cur_pre "" Суфф: "" cur_suf """))
;; 4. Запросить новые значения
(setq new_pre (getstring T (strcat "
Префикс [" cur_pre "] (Enter=без изм.): ")))
(setq new_suf (getstring T (strcat "
Суффикс [" cur_suf "] (Enter=без изм.): ")))
(if (= new_pre "") (setq new_pre cur_pre))
(if (= new_suf "") (setq new_suf cur_suf))
;; Если ничего не изменилось — выход
(if (and (= new_pre cur_pre) (= new_suf cur_suf))
(progn (princ "
Изменений нет.") (exit)))
;; 5. Создать уникальную копию определения блока
(setq new_name (strcat blk_name "_" (substr (rtos (getvar "CDATE") 2 8) 9)))
(setq blk_def (tblobjname "BLOCK" blk_name))
(entmake (list '(0 . "BLOCK")
(cons 2 new_name)
'(70 . 0)
(assoc 10 (entget blk_def))))
;; 6. Копировать объекты, для целевого размера — подставить преф/суфф
(setq src (entnext blk_def))
(while (and src (/= (cdr (assoc 0 (entget src))) "ENDBLK"))
(setq obj_dxf (entget src))
;; Найти целевой размер по handle
(if (= (cdr (assoc 5 obj_dxf)) target_handle)
(progn
;; Обновить группу 3 (префикс)
(if (assoc 3 obj_dxf)
(setq obj_dxf (subst (cons 3 new_pre) (assoc 3 obj_dxf) obj_dxf))
(setq obj_dxf (append obj_dxf (list (cons 3 new_pre)))))
;; Обновить группу 4 (суффикс)
(if (assoc 4 obj_dxf)
(setq obj_dxf (subst (cons 4 new_suf) (assoc 4 obj_dxf) obj_dxf))
(setq obj_dxf (append obj_dxf (list (cons 4 new_suf)))))))
;; Убрать уникальные идентификаторы перед копированием
(setq obj_dxf (vl-remove-if '(lambda (x) (member (car x) '(-1 5 102 330))) obj_dxf))
(entmakex obj_dxf)
(setq src (entnext src)))
(entmake '((0 . "ENDBLK")))
;; 7. Переключить вхождение на новое определение
(setq ref_dxf (entget blk_ref))
(entmod (subst (cons 2 new_name) (assoc 2 ref_dxf) ref_dxf))
(entupd blk_ref)
(princ (strcat "
Готово! Вхождение теперь использует блок "" new_name """))
(princ))