Rekomendowane odpowiedzi

Opublikowano

Mam plik z bazą boków elementów. Jest tych bloków bardzo dużo...

Moim zadaniem jest naniesienie zmian (jakichś opisów) na elementy (w bloku).

Chcę jednak zmienić im nazwy, żeby używane w starszych opracowaniach mogły być równolegle.

Chodzi o to, że jak blok nazywa się XYZ to chcę mu zmienić nazwę na _XYZ.

Wiem, że można to zrobić "ręcznie" przez rename albo menager bloków.

Jest to jednak bardzo dużo klikania a bloków jest setki.

Czy znacie jakiś sposób jak szybko zmienić nazwy wszystkich bloków z takim czy innym przedrostkiem?

Opublikowano

To problem stosunkowo prosty do rozwiązania, (oczywiście) za pomocą LISP-a. Poniżej krótki uproszczony kod programu. Wcześniej trzeba załadować bibliotekę CADPL-Pack-v1.lsp (https://kojacek.wordpress.com/2015/11/04/cadpl-pack/)
Potem należy załadować dwie poniższe funkcje:
 

; -------------------------------------------------------------------- ;
; by kojacek 2025 (https://kojacek.wordpress.com)                      ;
; -------------------------------------------------------------------- ;
(defun C:RENBLO (/ %o %n %l %i)
  (if
    (setq %l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8)))
    (progn
      (if
        (and
          (setq %o (getstring T "\nPodaj początek nazwy bloku zmienianego:"))
          (setq %n (getstring T "\nPodaj przedrostek nowej nazwy:"))
        )
        (if
          (snvalid %n 1)
          (progn
            (setq %i (strlen %o))
            (cd:SYS_UndoBegin)
            (foreach % %l
              (if
                (wcmatch % (strcat %o "*"))
                (jk:BLK_Rename %
                  (strcat %n (substr % (1+ %i) 300))
                )
              )
            )
            (cd:SYS_UndoEnd)
          )
          (princ "\nNieprawidłowy ciąg znaków.")
        )
      )
    )
    (princ "\nW rysunku nie ma bloków.")
  )
  (princ)
)
; -------------------------------------------------------------------- ;
(defun jk:BLK_Rename (OldName NewName / )
  (if
    (and
      (snvalid NewName 1)
      (not (tblobjname "BLOCK" NewName))
    )
    (if
      (tblobjname "BLOCK" OldName)
      (vla-put-Name
        (vla-item (cd:ACX_Blocks) OldName)
        NewName
      )
    )
  )
)
; -------------------------------------------------------------------- ;

Następnie wywołać polecenie RENBLO, podać ciąg znaków początku nazwy bloków do zmiany, a potem ciąg znaków którymi będzie on zamieniony...
Przykładowo:
"OKNO_podwojne - O3_G_Balkonowe" zamieniasz na "0-OK"
co ilustrują poniższe obrazy:
Przed:
image.png.9b04fe580095eab03d6a2f4e0be6bd62.png

oraz po zmianie przez RENBLO:

image.png.99fec7e75983b6b37c05d179e7fa27a6.png

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się