Skrypt AutocadLISP do rysowania rozwinięcia kanalizacji sanitarnej


Recommended Posts

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.")

 

Edited by tomswons
Link to comment
Share on other sites

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.")

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...