Rekomendowane odpowiedzi

Opublikowano

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

Opublikowano

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.
Opublikowano

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. 

Opublikowano

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/)

Opublikowano

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
)

 

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