Загрузка данных


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