;; ===================================================================== ;; Numeruj.lsp - numerowanie elementow w wybranym kierunku ;; Polecenia: NUMERUJ, NUMERUJ_PREFIX (numery z prefiksem, np. P-1) ;; AutoCAD / GstarCAD (AutoLISP). Opis i instalacja: ;; https://fixcontrol.pl/narzedzia/skrypty-autocad ;; ===================================================================== (defun c:NUMERUJ () (setq entities_list '()) (princ "\nNumerowanie elementow wedlug kierunku") (princ "\nZaznacz elementy do numerowania...") ; Zbierz wszystkie elementy do numerowania (setq ss (ssget)) (if ss (progn ; Konwertuj selection set na liste (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq entities_list (cons ent entities_list)) (setq i (1+ i)) ) (setq entities_list (reverse entities_list)) (princ (strcat "\nZaznaczono " (itoa (length entities_list)) " elementow")) ; Wybor kierunku numerowania (princ "\nWybierz kierunek numerowania:") (princ "\n1 - os X: od lewej do prawej (->)") (princ "\n2 - os X: od prawej do lewej (<-)") (princ "\n3 - os Y: od dolu do gory (^)") (princ "\n4 - os Y: od gory do dolu (v)") (princ "\n5 - wedlug linii okreslonej dwoma punktami") (setq choice (getint "\nPodaj opcje (1-5): ")) (cond ((= choice 1) (setq sorted_entities (sort_by_x entities_list)) ) ((= choice 2) (setq sorted_entities (reverse (sort_by_x entities_list))) ) ((= choice 3) (setq sorted_entities (sort_by_y entities_list)) ) ((= choice 4) (setq sorted_entities (reverse (sort_by_y entities_list))) ) ((= choice 5) (setq pt1 (getpoint "\nPodaj pierwszy punkt linii kierunkowej: ")) (setq pt2 (getpoint pt1 "\nPodaj drugi punkt linii kierunkowej: ")) (setq sorted_entities (sort_by_line entities_list pt1 pt2)) ) (t (princ "\nNiepoprawna opcja. Uzyto domyslnej (1 - X od lewej do prawej).") (setq sorted_entities (sort_by_x entities_list)) ) ) ; Pobierz parametry tekstu (setq text_height (getreal "\nPodaj wysokosc tekstu <1.0>: ")) (if (not text_height) (setq text_height 1.0)) (setq text_layer (getstring "\nPodaj nazwe warstwy dla numerow <0>: ")) (if (= text_layer "") (setq text_layer "0")) (setq start_num (getint "\nPodaj numer poczatkowy <1>: ")) (if (not start_num) (setq start_num 1)) ; Numeruj posortowane elementy (setq counter start_num) (foreach ent sorted_entities (setq ent_data (entget ent)) (setq ent_type (cdr (assoc 0 ent_data))) (setq center_point (get_center_point ent ent_data ent_type)) (if center_point (progn (entmake (list '(0 . "TEXT") (cons 10 center_point) (cons 40 text_height) (cons 1 (itoa counter)) (cons 8 text_layer))) (princ (strcat "\nDodano numer " (itoa counter) " do elementu " ent_type)) (setq counter (1+ counter)) ) (princ (strcat "\nNie mozna okreslic srodka dla elementu " ent_type)) ) ) (redraw) (princ "\nNumerowanie zakonczone!") ) (princ "\nNie zaznaczono zadnych elementow") ) (princ) ) ; Funkcja sortowania wedlug osi X (defun sort_by_x (entities_list) (vl-sort entities_list (function (lambda (e1 e2) (setq pt1 (get_sort_point e1)) (setq pt2 (get_sort_point e2)) (if (and pt1 pt2) (< (car pt1) (car pt2)) t ) )) ) ) ; Funkcja sortowania wedlug osi Y (defun sort_by_y (entities_list) (vl-sort entities_list (function (lambda (e1 e2) (setq pt1 (get_sort_point e1)) (setq pt2 (get_sort_point e2)) (if (and pt1 pt2) (< (cadr pt1) (cadr pt2)) t ) )) ) ) ; Funkcja sortowania wedlug linii (defun sort_by_line (entities_list line_pt1 line_pt2) (setq line_vector (mapcar '- line_pt2 line_pt1)) (setq line_length (sqrt (+ (* (car line_vector) (car line_vector)) (* (cadr line_vector) (cadr line_vector))))) (if (> line_length 0.001) (progn (setq unit_vector (mapcar '/ line_vector (list line_length line_length))) (vl-sort entities_list (function (lambda (e1 e2) (setq pt1 (get_sort_point e1)) (setq pt2 (get_sort_point e2)) (if (and pt1 pt2) (progn (setq proj1 (dot_product (mapcar '- pt1 line_pt1) unit_vector)) (setq proj2 (dot_product (mapcar '- pt2 line_pt1) unit_vector)) (< proj1 proj2) ) t ) )) ) ) entities_list ) ) ; Funkcja obliczania iloczynu skalarnego (defun dot_product (v1 v2) (+ (* (car v1) (car v2)) (* (cadr v1) (cadr v2))) ) ; Funkcja do pobierania punktu sortowania (defun get_sort_point (ent) (setq ent_data (entget ent)) (setq ent_type (cdr (assoc 0 ent_data))) (get_center_point ent ent_data ent_type) ) ; Funkcja do okreslania srodka roznych typow elementow (defun get_center_point (ent ent_data ent_type) (cond ; Linia ((= ent_type "LINE") (setq pt1 (cdr (assoc 10 ent_data))) (setq pt2 (cdr (assoc 11 ent_data))) (list (/ (+ (car pt1) (car pt2)) 2.0) (/ (+ (cadr pt1) (cadr pt2)) 2.0) 0.0) ) ; Okrag ((= ent_type "CIRCLE") (cdr (assoc 10 ent_data)) ) ; Luk ((= ent_type "ARC") (cdr (assoc 10 ent_data)) ) ; Polilinia ((or (= ent_type "POLYLINE") (= ent_type "LWPOLYLINE")) (get_polyline_center ent) ) ; Prostokat/Wielokat ((= ent_type "SOLID") (get_solid_center ent_data) ) ; Tekst ((or (= ent_type "TEXT") (= ent_type "MTEXT")) (cdr (assoc 10 ent_data)) ) ; Blok ((= ent_type "INSERT") (cdr (assoc 10 ent_data)) ) ; Elipsa ((= ent_type "ELLIPSE") (cdr (assoc 10 ent_data)) ) ; Punkt ((= ent_type "POINT") (cdr (assoc 10 ent_data)) ) ; Domyslnie - sprobuj pobrac pierwszy punkt (t (setq pt (cdr (assoc 10 ent_data))) (if pt pt nil) ) ) ) ; Funkcja do obliczania srodka polilinii (defun get_polyline_center (ent) (setq sum_x 0.0) (setq sum_y 0.0) (setq point_count 0) ; Pobierz wszystkie wierzcholki (setq ent_data (entget ent)) ; Przejdz przez wszystkie punkty (foreach item ent_data (if (= (car item) 10) (progn (setq sum_x (+ sum_x (cadr item))) (setq sum_y (+ sum_y (caddr item))) (setq point_count (+ point_count 1)) ) ) ) ; Oblicz srednia (if (> point_count 0) (list (/ sum_x point_count) (/ sum_y point_count) 0.0) nil ) ) ; Funkcja do obliczania srodka solid/trace (defun get_solid_center (ent_data) (setq pt1 (cdr (assoc 10 ent_data))) (setq pt2 (cdr (assoc 11 ent_data))) (setq pt3 (cdr (assoc 12 ent_data))) (setq pt4 (cdr (assoc 13 ent_data))) (if (and pt1 pt2 pt3) (list (/ (+ (car pt1) (car pt2) (car pt3)) 3.0) (/ (+ (cadr pt1) (cadr pt2) (cadr pt3)) 3.0) 0.0) nil ) ) ; Funkcja pomocnicza do numerowania z prefiksem (defun c:NUMERUJ_PREFIX () (setq entities_list '()) (princ "\nNumerowanie elementow z prefiksem wedlug kierunku") (princ "\nZaznacz elementy do numerowania...") ; Zbierz wszystkie elementy do numerowania (setq ss (ssget)) (if ss (progn ; Konwertuj selection set na liste (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq entities_list (cons ent entities_list)) (setq i (1+ i)) ) (setq entities_list (reverse entities_list)) (princ (strcat "\nZaznaczono " (itoa (length entities_list)) " elementow")) ; Pobierz prefiks (setq prefix (getstring "\nPodaj prefiks dla numerow: ")) (if (= prefix "") (setq prefix "")) ; Wybor kierunku numerowania (princ "\nWybierz kierunek numerowania:") (princ "\n1 - os X: od lewej do prawej (->)") (princ "\n2 - os X: od prawej do lewej (<-)") (princ "\n3 - os Y: od dolu do gory (^)") (princ "\n4 - os Y: od gory do dolu (v)") (princ "\n5 - wedlug linii okreslonej dwoma punktami") (setq choice (getint "\nPodaj opcje (1-5): ")) (cond ((= choice 1) (setq sorted_entities (sort_by_x entities_list)) ) ((= choice 2) (setq sorted_entities (reverse (sort_by_x entities_list))) ) ((= choice 3) (setq sorted_entities (sort_by_y entities_list)) ) ((= choice 4) (setq sorted_entities (reverse (sort_by_y entities_list))) ) ((= choice 5) (setq pt1 (getpoint "\nPodaj pierwszy punkt linii kierunkowej: ")) (setq pt2 (getpoint pt1 "\nPodaj drugi punkt linii kierunkowej: ")) (setq sorted_entities (sort_by_line entities_list pt1 pt2)) ) (t (princ "\nNiepoprawna opcja. Uzyto domyslnej (1 - X od lewej do prawej).") (setq sorted_entities (sort_by_x entities_list)) ) ) ; Pobierz parametry tekstu (setq text_height (getreal "\nPodaj wysokosc tekstu <1.0>: ")) (if (not text_height) (setq text_height 1.0)) (setq text_layer (getstring "\nPodaj nazwe warstwy dla numerow <0>: ")) (if (= text_layer "") (setq text_layer "0")) (setq start_num (getint "\nPodaj numer poczatkowy <1>: ")) (if (not start_num) (setq start_num 1)) ; Numeruj posortowane elementy (setq counter start_num) (foreach ent sorted_entities (setq ent_data (entget ent)) (setq ent_type (cdr (assoc 0 ent_data))) (setq center_point (get_center_point ent ent_data ent_type)) (if center_point (progn (entmake (list '(0 . "TEXT") (cons 10 center_point) (cons 40 text_height) (cons 1 (strcat prefix (itoa counter))) (cons 8 text_layer))) (setq counter (1+ counter)) ) ) ) (redraw) (princ "\nNumerowanie z prefiksem zakonczone!") ) (princ "\nNie zaznaczono zadnych elementow") ) (princ) ) (princ "\nZaladowano komendy:") (princ "\nNUMERUJ - numeruje elementy wedlug kierunku") (princ "\nNUMERUJ_PREFIX - numeruje elementy z prefiksem wedlug kierunku") (princ "\nOpcje numerowania:") (princ "\n 1 - os X: od lewej do prawej") (princ "\n 2 - os X: od prawej do lewej") (princ "\n 3 - os Y: od dolu do gory") (princ "\n 4 - os Y: od gory do dolu") (princ "\n 5 - wzdluz wskazanej linii") (princ)