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

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie