Zamykanie obiektów w bloku


Rekomendowane odpowiedzi

Dzień dobry,

popełniłem lisp, którego zadaniem było uproszczone narysowanie grupy modułów zgodnie z zadanymi parametrami takimi jak wyokość, szerokość, kąt nachylenia itp. Chciałbym, aby wygenerowane obiekty stały się blokiem, którego punkt bazowy stanowić będzie zmienna PU oraz aby nazwa bloku wynosiła "Konstrukcja " wartość L" x " wartość R. Poniżej wersja lispu, zanim ją zepsułem. 
 

(DEFUN C:KONS ()
  (SETQ W (GETREAL "\nPodaj szerokosc modulu: "))
  (SETQ H (GETREAL "\nPodaj wysokosc modulu: "))
  (SETQ K (GETREAL "\nPodaj kat nachylenia konstrukcji (w stopniach): "))
  (SETQ O (GETREAL "\nPodaj odstep miedzy modulami: "))
  (SETQ L (fix (GETREAL "\nPodaj ilosc modulow w poziomie: ")))  ; Konwersja na typ całkowity
  (SETQ R (fix (GETREAL "\nPodaj ilosc modulow w pionie: ")))      ; Konwersja na typ całkowity
  (SETQ PU (GETPOINT "\nPodaj naroznik konstrukcji PV: "))

  ;; Obliczenie nowej wysokości
  (SETQ H_NEW (* H (COS (* K (/ PI 180.0)))))  ; Konwersja kąta na radiany

  ;; WYZNACZENIE PRZECIWLEGŁEGO NAROŻNIKA MODUŁU
  (SETQ X0 (CAR PU))
  (SETQ Y0 (CADR PU))
  (SETQ X_START X0)  ; Zapisanie początkowego X
  (SETQ Y_START Y0)  ; Zapisanie początkowego Y

  ;; RYSOWANIE MODUŁÓW
  (repeat L
    (progn
      (repeat R
        (progn
          (SETQ PU2 (list (+ X0 W) (+ Y0 H_NEW)))
          ;; RYSOWANIE PROSTOKĄTA
          (COMMAND "_RECTANG" PU PU2 "_C")
          ;; Przesunięcie w dół o wysokość i odstępu modułu
          (SETQ Y0 (+ Y0 H_NEW O))  ; Y0 zwiększamy o nową wysokość i odstęp
          (SETQ PU (list X0 Y0))  ; Nowy punkt startowy
        )
      )
      ;; Przesunięcie w prawo o szerokość modułu i  zadany odstęp
      (SETQ X0 (+ X0 W O))  ; X0 zwiększamy o szerokość i odstęp
      (SETQ Y0 Y_START)  ; Resetowanie Y0 do początkowej wartości
      (SETQ PU (list X0 Y0))  ; Nowy punkt startowy
    )
  )
)

Odnośnik do komentarza
Udostępnij na innych stronach

Hej,

Spojrzałem na Twój skrypt i chcę się upewnić czy dobrze rozumiem zamysł.

Chcesz, żeby pojedynczy moduł był blokiem?

Blok można stworzyć funkcją command "_block", wstawić przy pomocy command "_insert". 

Ponadto skrypt można odrobinę uprościć.

  • Kąt można wprowadzić używając "getangle".
  • Przekształcenie na liczbę całkowitą pominąć używając "getint".
  • Do odczytywania narysowanych elementów użyć "entlast".
  • Rysowanie warto wstawić do osobnej funkcji.
Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki za wskazówki, To moje początki z pisaniem lisp, ale nie widze tutaj zastosowania dla komendy "getangle", ponieważ wszystkie obiekty mają stanowić rzut płaski, a kąt stanowił tylko wyznacznik do skracania wysokości bazowej. (żeby osoba wprowadzająca nie zasmowała się wyliczaniem wysokości modułu w rzucie płaskim). W odpowiedzi na pytanie, chciałbym, aby wszystkie narysowane obiekty stanowiły jeden blok. 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeszcze:

1) sprawdzić czy trzeba cokolwiek robić (bo blok który chcemy stworzyć już istnieje)
2) deklarować zmienne lokalne (zawsze)
3) poznać funkcję initget dla getreal / getint / getangle / getpoint (ilość modułów = 0, a kąt 666...)
4) blok można tworzyć przez command / entmake / activeX (https://kojacek.wordpress.com/2017/11/22/programowe-tworzenie-bloku/)
5) alternatywnie pomysleć o szykach (https://kojacek.wordpress.com/2024/05/26/dostep-do-elementow-szyku/) albo MINSERT (https://kojacek.wordpress.com/2019/06/23/blok-5-rzeczy-o-ktorych-byc-moze-nie-wiesz/)

Odnośnik do komentarza
Udostępnij na innych stronach

Dodałem kilka linijek do twojego programu które tworzą blok.

Można podejść do sprawy na kilka sposobów, ja wybrałem dość podstawowy.

Współrzędne lewego dolnego rogu zapisałem w zmiennej PU0.

Po stworzeniu konstrukcji w zmiennej BlkName zostaje zapisana nazwa nowo utworzonego bloku według twojego opisu. Tutaj warto dodać jakieś wyróżnienie, w przypadku duplikatu program jest przerwany komunikatem.

Później blok zostaje stworzony ze zbioru wybranego funkcją ssget. "_W" zaznacza obiekty w oknie opisanym podobniej jak prostokąt, lewy dolny róg PU0 i prawy górny róg PU2.

Po utworzeniu blok jest wstawiony poleceniem _insert, ponieważ znika on z rysunku.

Kod programu poniżej 

(DEFUN C:KONS (/ W H K O L R PU H_NEW X0 Y0 X_START Y_START PU0 PU2 BlkName)
  (SETQ W (GETREAL "\nPodaj szerokosc modulu: "))
  (SETQ H (GETREAL "\nPodaj wysokosc modulu: "))
  (SETQ K (GETREAL "\nPodaj kat nachylenia konstrukcji (w stopniach): "))
  (SETQ O (GETREAL "\nPodaj odstep miedzy modulami: "))
  (SETQ L (fix (GETREAL "\nPodaj ilosc modulow w poziomie: ")))  ; Konwersja na typ całkowity
  (SETQ R (fix (GETREAL "\nPodaj ilosc modulow w pionie: ")))      ; Konwersja na typ całkowity
  (SETQ PU (GETPOINT "\nPodaj naroznik konstrukcji PV: "))

  ;; Obliczenie nowej wysokości
  (SETQ H_NEW (* H (COS (* K (/ PI 180.0)))))  ; Konwersja kąta na radiany

  ;; WYZNACZENIE PRZECIWLEGŁEGO NAROŻNIKA MODUŁU
  (SETQ X0 (CAR PU))
  (SETQ Y0 (CADR PU))
  (SETQ X_START X0)  ; Zapisanie początkowego X
  (SETQ Y_START Y0)  ; Zapisanie początkowego Y
  (SETQ PU0 (list X_START Y_START )) ;Zapisanie współrzędnych lewego dolnego rogu konstrukcji w zmiannej PU0

  ;; RYSOWANIE MODUŁÓW
  (repeat L
    (progn
      (repeat R
        (progn
          (SETQ PU2 (list (+ X0 W) (+ Y0 H_NEW)))
          ;; RYSOWANIE PROSTOKĄTA
          (COMMAND "_RECTANG" PU PU2)
          ;; Przesunięcie w dół o wysokość i odstępu modułu
          (SETQ Y0 (+ Y0 H_NEW O))  ; Y0 zwiększamy o nową wysokość i odstęp
          (SETQ PU (list X0 Y0))  ; Nowy punkt startowy
        )
      )
      ;; Przesunięcie w prawo o szerokość modułu i  zadany odstęp
      (SETQ X0 (+ X0 W O))  ; X0 zwiększamy o szerokość i odstęp
      (SETQ Y0 Y_START)  ; Resetowanie Y0 do początkowej wartości
      (SETQ PU (list X0 Y0))  ; Nowy punkt startowy
    )
  )
  (setq BlkName (strcat "Konstrukcja " (itoa L) " x " (itoa R))) ;Stworzenie nazwy nowego bloku i zapisanie jej w zmiennej BlkName
  (command "_Block" BlkName PU0 (ssget "_W" PU0 PU2) "") ;Stworzenie Bloku nazwanego BlkName z punktem bazowym w lewym dolnym rogu konstrukcji 
  (command "_Insert" BlkName PU0 "" "" "") ;Wstawienie bloku który znika po utworzeniu
)

 

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