Poniższy przykład zilustruje w jaki sposób można przyciąć bryłę oraz jak uzyskać przekrój z wybranej bryły (bez jej modyfikacji)
Jeśli uruchomiona zostanie funkcja testowa: Przekroj, jedna bryła zostanie podzielona na dwie i dodatkowo utworzony zostanie przekrój płaszczyzną zdefiniowaną przez 3 punkty.

 

Przekrój bryły

 

Polecenie do uruchomienia skryptu LISP: Przekroj

 

Kod źródłowy z opisem

 

;;; Przekroje brył
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: Przekroj
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/223-przekroje-bryl.html
(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))
(setq *Rysunek* (vla-get-activedocument *ZWCAD* ))
(setq *Model* (vla-get-Modelspace *Rysunek* ))
(defun XEntSel (tex / SelObj Sel)
(setq Sel(vl-catch-all-apply 'entsel (list tex))) ; prosi Użytkownika o wybranie jednego obiektu
; jeśli wystąpi błąd w czasie wybierania, np Użytkownik anuluje polecenie, zdażenie takie zostanie przechwycone i pozwoli na dalsze działanie programu
(if Sel (progn
(if (vl-catch-all-error-p Sel) ; zwraca t, jeśli wystąpiło przerwanie
(progn
(prompt (vl-catch-all-error-message Sel)) ; wyświetla komunikat błędu
(setq SelObj nil )
)
(progn
(setq SelObj (vlax-ename->vla-object(car Sel))) ; zamienia wybrany obiekt typu entity na obiekt
)
)
))
SelObj
)
(defun XGetpoint (tresc P0 domyslny / Pt Wynik )
(if (not(null P0))
(setq Pt(vl-catch-all-apply 'getpoint (list P0 tresc ))) ;wykonanie funkcji getpoint proszącej o wskazanie punktu) zwraca współrzędne punktu lub obiekt błędu
(setq Pt(vl-catch-all-apply 'getpoint (list tresc )))
)
(if (vl-catch-all-error-p Pt) ; sprawdzenie czy zwrócony został obiekt błędu
(progn ; wystąpił błąd
(prompt (vl-catch-all-error-message Pt)) ;wyświetla w pasku poleceń komumikat błędu
(setq Wynik nil )
)
(progn ; Użytkownik wskazał punkt lub [ENTER]/[SPACE]
(if (null Pt)
(setq Wynik domyslny )
(setq Wynik Pt)
)
)
)
Wynik
)
(defun C:Przekroj ( / )
(setq P1 (XGetpoint "Wskaż pierwszy punkt przekroju" nil nil )) ; funkcja prosi Użytkownika o wskazanie pierwszego punktu wzdłuż przekroju
(setq P2 (XGetpoint "Wskaż drugi punkt przekroju" P1 nil )) ; funkcja prosi Użytkownikaa o wskazanie drugiego punktu wzdłuż
(setq P3 (list (car P1 ) (cadr P1) (+ (caddr P1) 1) )) ; obliczenie trzeciego punktu potrzebnego do określenia płaszczyzny tnącej.
; w tym przypadku płaszczyzna tnąca będzie równoległa do osi Z układu współrzędnych.
; Zadaniem dla ambitnych może być obliczenie punktu na linii wzdłuż kierunku aktualnego widoku
(setq SelSolid (XEntSel "Wskaż bryłę do przecięcia" )) ; funkcja poprosi Użytkwnika o wskazanie bryły, której przekrój ma być utworzony.
(setq Section(vlax-invoke-method SelSolid 'SectionSolid (vlax-3d-point P1 ) (vlax-3d-point P2 ) (vlax-3d-point P3 )))
; metoda SectionSolid tworzy obiekt typu Region, będący rzeczywistym przekrojem wybranej bryły płaszczyzną określoną przez 3 punkty
; wzorcowa bryła nie zostanie zmodyfikowana.
(setq Slice(vlax-invoke-method SelSolid 'SliceSolid (vlax-3d-point P1 ) (vlax-3d-point P2 ) (vlax-3d-point P3 ) :vlax-true))
; metoda SliceSolid przycina wybraną bryłę określoną płaszczyną.
; jeśli ostatni argument jest :vlax-true zaostanie utworzona dodatkowa bryła będąca uzupełnieniem pryły po przycięciu
; jeśli ostatni argument jest :vlax-false nie powstanie dodatkowa bryła. Jedynie przycięta zostanie bryła wzorcowa
)

 

Wykonanie w ZWCAD 2023

przekroj

 

Wykonanie w ZWCAD 2015

LISP Przekroj 2015

* Lisp nie jest kompatybilny z ZWCAD Classic