Skrypt AutocadLISP do rysowania rozwinięcia kanalizacji sanitarnej


Rekomendowane odpowiedzi

Cześć,

Próbuje opracować skrypt który:

1. Rozpoznaje zaznaczone napisy/bloki i wstawia potem przypisane do nich bloki w odpowiedniej kolejności.

-Jeśli blok/napis jest nie zdefiniowany w zestawieniu skryptu to prosi o podanie nazwy która sprawdzi z zestawieniem. Jesli jest poprawna to ją akceptuje jako rozpoznaną, jeśli nie jest prosi ponownie o wpisanie nazwy.
2. Bloki wstawiają się w wybranym punkcie, przy czym każdy kolejny zaznaczony obiekt jest odsunięty o pewną wartość od poprzedniego.

Stworzyłem kilka wersji i w każdej jest pewien problem 😕

1. Działa rozpoznawanie obiektów, ale pyta o nazwę nie znanego bloku dopiero gdy zakończę 
wybór zamiast odrazu gdy trafi się jakiś nie znany obiekt

 

(defun c:drawcircle()
(setq selectionList (list))
(setq selection (entsel "Wybierz napis lub blok: "))
(while selection
(setq selectionList (append selectionList (list (car selection))))
(setq selection (entsel "Wybierz kolejny napis lub blok lub zakończ wybór: "))
)
(if selectionList
(progn
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(setq offset 0)
(foreach selection selectionList
(setq entType (cdr (assoc 0 (entget selection))))
(setq entName (if (equal entType "TEXT") (cdr (assoc 1 (entget selection))) (cdr (assoc 2 (entget selection)))))
(setq found nil)
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setq found t)
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
(command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 2000))
(setvar "ATTDIA" 1)
)
)
)
(if (not found)
(while (not found)
(setq insBlok (getstring "Podaj nazwę bloku dla napisu/bloku: "))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal insBlok (car relation))
(progn
(setq found t)
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
(command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 2000))
(setvar "ATTDIA" 1)
)
)
)
(if (not found) (alert "Nie ma takiego bloku w relacjach, spróbuj ponownie."))
)
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")


2. Nie rozpoznaje tekstu ani bloków zawsze pyta co to jest i wstawia je w odpowiedniej kolejności.

(defun c:drawcircle()
    (setq selectionList (list))
    (setq selection (entsel "Wybierz napis lub blok: "))
    (while selection
        (setq entName (cdr (assoc 2 (entget (car selection)))))
        (setq found nil)
        (foreach relation '(("bidet" . "svp_bidet") ("centrala" . "svp_centrala"))
            (if (equal entName (car relation))
                (setq found t)
            )
        )
        (if (not found)
            (while (not found)
                (setq entName (getstring "Podaj nazwę napisu/bloku: "))
                (foreach relation '(("bidet" . "svp_bidet") ("centrala" . "svp_centrala"))
                    (if (equal entName (car relation))
                        (setq found t)
                    )
                )
                (if (not found) (alert "Nie ma takiego napisu/bloku w relacjach, spróbuj ponownie."))
            )
        )
        (setq selectionList (append selectionList (list entName)))
        (setq selection (entsel "Wybierz kolejny napis lub blok lub zakończ wybór: "))
    )
    (if selectionList
        (progn
            (setq p1 (getpoint "Wybierz punkt wstawienia: "))
            (setq offset 0)
            (foreach entName selectionList
(foreach relation '(("bidet" . "svp_bidet") ("centrala" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
(command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 1000))
)
)
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")

3. Rozpoznaje czy napis/blok jest zdefiniowany, prosi o podanie nazwy bloku jeśli nie jest. Niestety jednak  niczego nie wstawia.
 

(defun c:drawcircle()
(setq selectionList (list))
(setq selection (entsel "Wybierz napis lub blok: "))
(while selection
(setq entType (cdr (assoc 0 (entget (car selection)))))
(setq currEntName (if (equal entType "TEXT") (cdr (assoc 1 (entget (car selection)))) (cdr (assoc 2 (entget (car selection))))))
(setq found nil)
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal currEntName (car relation))
(setq found t)
)
)
(if (not found)
(while (not found)
(setq currEntName (getstring "Podaj nazwę napisu/bloku: "))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal currEntName (car relation))
(setq found t)
)
)
(if (not found) (alert "Nie ma takiego napisu/bloku w relacjach, spróbuj ponownie."))
)
)
(setq selectionList (append selectionList (list (car selection))))
(setq selection (entsel "Wybierz kolejny napis lub blok lub zakończ wybór: "))
)
(if selectionList
(progn
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(setq offset 0)
(foreach selection selectionList
(setq entType (cdr (assoc 0 (entget selection))))
(setq entName (if (equal entType "TEXT") (cdr (assoc 1 (entget selection))) (cdr (assoc 2 (entget selection)))))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
(command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 1000))
(setvar "ATTDIA" 1)
)
)
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")

4 Wstawia wielokrotnie tylko ostatnio wprowadzony obiekt, ale rozpoznaje tekst, bloki i pyta o nie znane elementy
 

(defun c:drawcircle()
(setq selectionList (list))
(setq selection (entsel "Wybierz napis lub blok: "))
(while selection
(setq entType (cdr (assoc 0 (entget (car selection)))))
(setq entName (if (equal entType "TEXT") (cdr (assoc 1 (entget (car selection)))) (cdr (assoc 2 (entget (car selection))))))
(setq found nil)
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(setq found t)
)
)
(if (not found)
(while (not found)
(setq entName (getstring "Podaj nazwę napisu/bloku: "))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(setq found t)
)
)
(if (not found) (alert "Nie ma takiego napisu/bloku w relacjach, spróbuj ponownie."))
)
)
(setq selectionList (append selectionList (list (car selection))))
(setq selection (entsel "Wybierz kolejny napis lub blok lub zakończ wybór: "))
)
(if selectionList
(progn
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(setq offset 0)
(foreach selection selectionList
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
  (command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 1000))
(setvar "ATTDIA" 1)
)
)
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")

5. Robi w sumie wszystko jak należy ale pozwala wybrać tylko 1 obiekt zamiast zapętlać funkcje wyboru.
 

(defun c:drawcircle()
(setq selection (entsel "Wybierz napis lub blok: "))
(if selection
(progn
(setq entType (cdr (assoc 0 (entget (car selection)))))
(setq entName (if (equal entType "TEXT") (cdr (assoc 1 (entget (car selection)))) (cdr (assoc 2 (entget (car selection))))))
(setq found nil)
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setq found t)
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(command "_insert" insBlok p1 "1" "1" "0")
(setvar "ATTDIA" 1)
)
)
)
(if (not found)
(while (not found)
(setq insBlok (getstring "Podaj nazwę bloku dla napisu/bloku: "))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal insBlok (car relation))
(progn
(setq found t)
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(command "_insert" insBlok p1 "1" "1" "0")
(setvar "ATTDIA" 1)
)
)
)
(if (not found) (alert "Nie ma takiego bloku w relacjach, spróbuj ponownie."))
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")

 

Edytowane przez tomswons
Odnośnik do komentarza
Udostępnij na innych stronach

Udało się :) A przynajmniej na razie nie znalazłem żadnego błędu
Gdyby ktoś miał jakieś sugestie to chętnie się zapoznam 😉

 

(defun c:drawcircle()
(setq selectionList (list))
(setq selection (entsel "Wybierz napis lub blok: "))
(while selection
(setq entType (cdr (assoc 0 (entget (car selection)))))
(setq entName (if (equal entType "TEXT") (cdr (assoc 1 (entget (car selection)))) (cdr (assoc 2 (entget (car selection))))))
(setq found nil)
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(setq found t)
)
)
(if (not found)
(while (not found)
(setq entName (getstring "Podaj nazwę napisu/bloku: "))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(setq found t)
)
)
(if (not found) (alert "Nie ma takiego napisu/bloku w relacjach, spróbuj ponownie."))
)
)
(setq selectionList (append selectionList (list (cons entName (car selection)))))
(setq selection (entsel "Wybierz kolejny napis lub blok lub zakończ wybór: "))
)
(if selectionList
  (progn
(setq p1 (getpoint "Wybierz punkt wstawienia: "))
(setq offset 0)
(foreach selection selectionList
(setq entName (car selection))
(foreach relation '(("bidet" . "svp_bidet") ("A$C70EE3DDA" . "svp_centrala"))
(if (equal entName (car relation))
(progn
(setvar "cmdecho" 0)
(setvar "ATTDIA" 0)
(setq insBlok (cdr relation))
(setq pt (polar p1 0 offset))
(command "_insert" insBlok pt "1" "1" "0")
(setq offset (+ offset 1000))
(setvar "ATTDIA" 1)
)
)
)
)
)
(alert "Nie wybrano żadnego napisu lub bloku.")
)
(princ)
)
(princ "Polecenie DRAWCIRCLE wczytane.")

 

Odnośnik do komentarza
Udostępnij na innych stronach

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