;; ===================================================================== ;; CountSymbols.lsp - zliczanie symboli tekstowych i wpisanie ilosci ;; do tabeli ;; Polecenie: COUNTSYMBOLS ;; AutoCAD / GstarCAD (AutoLISP). Opis i instalacja: ;; https://fixcontrol.pl/narzedzia/skrypty-autocad ;; ;; Tabela: pierwszy wiersz = naglowki, kolumna z naglowkiem SYMBOL ;; zawiera symbole; kolumna COUNT / QTY / ILOSC dostaje ilosci ;; (gdy jej brak, skrypt dodaje kolumne ILOSC na koncu). ;; ===================================================================== (defun c:CountSymbols (/ *error* acadDoc tableObj ss symDict symCol cntCol i ent txt entry symName symCnt rowCount colCount colIndex headerText checkValue) (vl-load-com) (defun *error* (msg) (if (and acadDoc (equal (type acadDoc) 'VLA-OBJECT)) (vla-endundomark acadDoc) ) (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*,*QUIT*")) (princ (strcat "\nBlad: " msg)) ) (princ) ) (setq acadDoc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark acadDoc) ;; 1. wybor tabeli (prompt "\nWybierz tabele do aktualizacji: ") (setq ent (car (entsel))) (if (not ent) (progn (alert "Nie wybrano tabeli!") (exit)) ) (setq tableObj (vlax-ename->vla-object ent)) (if (not (wcmatch (vla-get-objectname tableObj) "*Table")) (progn (alert "Nie wybrano tabeli!") (exit)) ) ;; 2. kolumny SYMBOL i ILOSC (setq symCol -1) (setq cntCol -1) (setq rowCount (vla-get-rows tableObj)) (setq colCount (vla-get-columns tableObj)) (princ "\n=== ANALIZA TABELI ===") (princ (strcat "\nWierszy: " (itoa rowCount) ", Kolumn: " (itoa colCount))) (setq colIndex 0) (repeat colCount (setq headerText (strcase (vla-gettext tableObj 0 colIndex))) (princ (strcat "\nKolumna " (itoa colIndex) ": '" headerText "'")) (cond ((wcmatch headerText "*SYMBOL*") (setq symCol colIndex) (princ " -> KOLUMNA SYMBOLI")) ((or (wcmatch headerText "*COUNT*") (wcmatch headerText "*QTY*") (wcmatch headerText "*ILOSC*")) (setq cntCol colIndex) (princ " -> KOLUMNA LICZNIKA")) ) (setq colIndex (1+ colIndex)) ) (if (= symCol -1) (progn (alert "Nie znaleziono kolumny z symbolami (SYMBOL)!") (exit)) ) ;; brak kolumny licznika - nowa kolumna ILOSC (szerokosc 80) na koncu (if (= cntCol -1) (progn (vla-insertcolumns tableObj colCount 1 80.0) (setq cntCol colCount) (vla-settext tableObj 0 cntCol "ILOSC") (vla-setcolumnwidth tableObj cntCol 80.0) (princ (strcat "\nUtworzono nowa kolumne ILOSC na pozycji: " (itoa cntCol))) ) (princ (strcat "\nUzywam istniejacej kolumny ILOSC na pozycji: " (itoa cntCol))) ) ;; 3. teksty do zliczenia (prompt "\nZaznacz teksty do zliczenia: ") (setq ss (ssget '((0 . "TEXT,MTEXT")))) (if (null ss) (progn (alert "Nie zaznaczono tekstow!") (exit)) ) ;; 4. zliczanie (setq symDict '()) (setq i (sslength ss)) (while (> i 0) (setq i (1- i)) (setq txt (cdr (assoc 1 (entget (ssname ss i))))) (if (setq entry (assoc txt symDict)) (setq symDict (subst (cons txt (1+ (cdr entry))) entry symDict)) (setq symDict (cons (cons txt 1) symDict)) ) ) ;; 5. wpisanie ilosci do tabeli (wiersz 0 = naglowki) (princ "\n=== AKTUALIZACJA TABELI ===") (setq i 1) (while (< i rowCount) (setq symName (vla-gettext tableObj i symCol)) (if (and symName (/= symName "")) (progn (setq symCnt (cdr (assoc symName symDict))) (if (not symCnt) (setq symCnt 0)) (vl-catch-all-apply 'vla-settext (list tableObj i cntCol (itoa symCnt))) (setq checkValue (vla-gettext tableObj i cntCol)) (princ (strcat "\nWiersz " (itoa i) ": '" symName "' -> " checkValue)) (if (/= checkValue (itoa symCnt)) (princ " UWAGA: zapis sie nie powiodl!") ) ) (princ (strcat "\nWiersz " (itoa i) ": pusty symbol, pomijam")) ) (setq i (1+ i)) ) (vla-endundomark acadDoc) (princ "\n=== PODSUMOWANIE ===") (princ (strcat "\nZnaleziono " (itoa (length symDict)) " roznych tekstow:")) (foreach item symDict (princ (strcat "\n " (car item) ": " (itoa (cdr item)) " szt.")) ) (princ) ) (princ "\nCOUNTSYMBOLS loaded. Type COUNTSYMBOLS to run.") (princ)