Otrzymaliśmy zapytanie od klienta o możliwość wykonania skryptu, który rozbije projekt na wiele plików DXF, gdzie w każdym z nich będzie tylko jeden element z pliku źródłowego. Skrypt taki może być użyty np. do generowania ścieżek dla maszyn numerycznych. Skrypt może być interesującym przykładem wykorzystania funkcji WBlock. Ważne jest by po użyciu skrytptu wybrać plik, na podstawie którego zostaną stworzone nowe pliki.

 

Rozdzielanie rysunku na wiele plików dxf

 

Polecenie do uruchomienia skryptu LISP: ExZapis

 

Kod źródłowy z opisem

 

;;; Rozdzielanie rysunku na wiele plików DXF
;;; zwcad.pl
;;; Polecenie do uruchomienia skryptu LISP: ExZapis
;;; Opis: https://www.zwcad.pl/materialy-edukacyjne/kurs-lisp/przyklady-lisp/337-rozdzielenie-rysunku-na-wiele-plikow-dxf.html
(vl-load-com)
(setq *ZWCAD* (vlax-get-acad-object))
(setq *docs* (vla-get-documents *ZWCAD*))
(defun sel2list (selset / Wynik ileelementow i)
;----------------------------------------------------------
; funkcja zamienia zbiór wskazań na listę obiektów
; Argumenty: zbiór wskazań (selectionset)
; Wynik: lista
;----------------------------------------------------------
(setq ileelementow(sslength selset) )
(setq i 0 )
(repeat ileelementow
(setq Wynik (append Wynik (list (vlax-ename->vla-object(ssname selset i) ) )))
(setq i (1+ i ))
)
Wynik
)
(defun XSSGet (tresc / selElems elementy )
(setq selElems(ssgetfirst ))
(if (car selElems)
(setq elementy (sel2list (car selElems)))
(progn
;(princ tresc )
(setq elementy(vl-catch-all-apply 'ssget (list )))
(if (not(vl-catch-all-error-p elementy))
(progn
(setq elementy (sel2list elementy ))
)
)
)
)
elementy
)
(defun C:ExZapis ( / )
; zapisz
(setq Elementy (XSSGet "Wskaż elementy do zapisu"))
(if Elementy (progn
(setq katalogZapisu (getfiled "Wskaż katalog gdzie zapisać pliki" "Wskaż katalog" "" 32) )
; funkcja prosi Użytkownika o wskazanie katalogu, w którym zapisywane będą docelowe pliki
(if katalogZapisu (progn ; obsługa sytuacji gdy Użytkownik nie wskaże żadnego katalogu i kliknie "Anuluj" albo "x"
(setq katalogZapisu(vl-filename-directory katalogZapisu)) ; wydzielenie ścieżki katalogu ze wskazanego elementu
(setq NazwaPliku 1 ) ;
(setq lastcmdecho (getvar "cmdecho")) ; zapis starej zmiennej dla potrzeb późniejszego przywrócenia
(setvar "cmdecho" 0) ; blokujemy wyświetlanie historii poleceń w pasku ZWCADa
(foreach % Elementy ; dla każdego zaznaczonego elementu
(setq SciezkaPliku (strcat katalogZapisu "\\" (itoa NazwaPliku ) ".dxf" )); wygenerowanie pełnej ścieżki dostępu do pliku
(while (findfile SciezkaPliku) ; weryfikajca czy taki plik już istnieje (generowanie unikatowej nazwy)
(setq NazwaPliku (1+ NazwaPliku ) )
(setq SciezkaPliku (strcat katalogZapisu "\\" (itoa NazwaPliku ) ".dxf" ))
)
(zapiszElement % SciezkaPliku)
(setq NazwaPliku (1+ NazwaPliku ) )
)
(setvar "cmdecho" lastcmdecho) ; przywrócenie poprzedniej wartości zmiennej, by nic nie zmieniać w środowisku Klienta
))
))
(princ)
)
(defun zapiszElement (% SciezkaPliku / )
(print SciezkaPliku) ; wyświetlamy nazwę tworzonego pliku
(command "_-WBLOCK" SciezkaPliku "" "0,0,0" (vlax-vla-object->ename %) "" ) ; zapis do zewnętrznego pliku usuwa
; element z modelu co nie jest pożądane
(command "_oops" ) ; przywrócenie elementów usuniętych w poprzedniej funkcji, by nie zmieniać rysunku źródłowego
)

 

Wykonanie w ZWCAD 2023

dzielenie na kilka plikow

 

Wykonanie w ZWCAD 2015

LISP ExZapis 2015

* Lisp nie jest kompatybilny z ZWCAD Classic