zwonko Opublikowano 24 Stycznia Zgłoś Opublikowano 24 Stycznia Mam taki kod w języku autolisp: (defun c:dellayers76_only6 ( / hms:LayerList* cla ech lay* laylst LayList cnt) (defun hms:LayerList* (path / LayName TblName TblNameList) (while (setq TblName (tblnext "Layer" (null TblName))) (if (wcmatch (setq LayName (strcase (cdr (assoc 2 TblName)))) (strcase path)) (setq TblNameList (cons LayName TblNameList)) ) ) (acad_strlsort TblNameList) );; hmsLayerList* (if (and (setq lay* "6 *,6_*") (setq LayList (hms:LayerList* lay*))) (progn ;; Filter LayList, to exclude "7 view" i "7_view" (setq LayList (vl-remove-if '(lambda (layer) (member (strcase layer) '("7 VIEW" "7_VIEW"))) LayList)) ;; Add operation on matched layers ; (command "_.-layer" "_U" lay* "_T" lay* "") (command "_.-layer" "_U" lay* "") (setq ech (getvar 'CMDECHO)) ;(setvar 'CMDECHO 0) ; (command "_.undo" "G") (command "_.undo" "M") (setq cla (strcase (getvar 'CLAYER))) (if (member cla LayList) (command "_.-layer" "_U" "0" "_T" "0" "_S" "0" "") ) (foreach l LayList (command "_.-laydel" "_N" l "" "_Y" "") ) (command "_.undo" "E") (setvar 'CMDECHO ech) ) (prompt "\n Layer Name not valid, or no matching layers... ") ) (princ) ) kod służy do usuwania warstw pomocniczych (są na niej elementy które niekoniecznie ma dostać końcowy odbiorca pliku). Problem jest taki, że: -gdy używam polecenia LAYDEL ręcznie, czyli wpisuje komendę laydel, 6 pomoc 01, wszystko jest okej -gdy polecenie jest wywoływane pośrednio przez lisp, elementy które były wewnątrz bloku, na warstwie 6 pomoc 01 nie są usuwane. Załączam przykładowy plik *.dwg. Po użyciu LISP należy użyć polecenia _regen i wtedy w chmurce rewizji pokażą się nieusunięte elementy, które były wewnątrz bloku, i program z jakiegoś powodu przeniósł na warstwę 0. dodatkowo nie bardzo mogę znaleźć obejście gdyż w AUTOLISP ZWCADa brakuje funkcji vla-delete. Miałem pomysł żeby dopisać troche kodu, który przeszukuje wszystkie bloki w rysunku pod kątem elementów na danych warstwach i usuwa je za pomocą entdel, ale niestety mi to nie wyszło. proszę o pomoc. Proponuje zgłosić do ZWSOFT brak funcji vla-delete w autolisp. W razie czego: vernum = "23.20_2023.12.28(#8735-3893c168c16)_x64" (read only) drawing_test2.dwg Cytuj
kruszynski Opublikowano 24 Stycznia Zgłoś Opublikowano 24 Stycznia Sprawdziłem w najnowszej wersji 2025. Tutaj działa poprawnie. Cytuj
RobS Opublikowano 24 Stycznia Zgłoś Opublikowano 24 Stycznia Hej, Sama funkcja _.-laydel działa bez problemu w wersji 2025. Spróbuj użyć takiego prostego skryptu u siebie. (defun c:dellayerstest (/ ) (setq l "6 pomoc 01") (command "_.-laydel" "_N" l "" "_Y" "") ) Problem w tym skrypcie leży raczej w zdefiniowaniu listy z nazwami warstw. pawmal 1 Cytuj
zwonko Opublikowano 24 Stycznia Autor Zgłoś Opublikowano 24 Stycznia (edytowane) @RobS faktycznie uproszczony kod działa prawidłowo w 2023. Co ciekawe gdy używamy wersji uproszczonej otrzymujemy komunikat: _.-laydel Selected layer(s): 6 pomoc 01 ******** WARNING ******** There are 1 block definition(s) referencing the layer(s) that you are deleting. The block(s) will be redefined and the entities that reference the layer(s) will be removed from the block definition(s). You are about to permanently delete the following layer(s) from this drawing: gdy używamy pierwszego kodu, który sam szuka warstw otrzymuje kominikat: Deleting layer: 6 POMOC 01_.-laydel Selected layer(s): 6 POMOC 01 ******** WARNING ******** You are about to permanently delete the following layer(s) from this drawing: 6 POMOC 01 Deleting the layer "6 POMOC 01". Czyli w wersji uproszocznej dostaje komunikat o blokach. W pierwszym kodzie nie ma tego komunikatu. Nazwa warstwy jest tutaj z dużej litery... moze tu jest problem? Edytowane 24 Stycznia przez zwonko Cytuj
zwonko Opublikowano 24 Stycznia Autor Zgłoś Opublikowano 24 Stycznia Faktycznie po zmianie w kodzie z: (if (wcmatch (setq LayName (strcase (cdr (assoc 2 TblName)))) (strcase path)) na bez srtcase (if (wcmatch (setq LayName (cdr (assoc 2 TblName))) (strcase path)) kod działa prawidłowo. Cytuj
RobS Opublikowano 24 Stycznia Zgłoś Opublikowano 24 Stycznia Sprawdziłem i nazwy warstw nie są "czułe" na wielkość liter. Cieszę się, że udało się doprowadzić skrypt do ładu 👌 Cytuj
zwonko Opublikowano 24 Stycznia Autor Zgłoś Opublikowano 24 Stycznia (edytowane) Być może były w ZWCAD 2023. Może nie wszędzie bo jako tako warstwa była usuwana. Ale obiekty wewnątrz bloku na tej warstwie już nie. MOże samo -LAYDEL które jest chyba poleceniem dodatkowym, było źle napisane. Ewidentnie teraz kod z pierwszego postu wyświetla 06 pomoc 01 (małe litery) i daje informacje ze są obiekty w blokach które usunie. Wcześniej wyświetlał 6 POMOC 01 i brak informacji o obiektach w blokach. tak samo jak gdy wywołam ręcznie -LAYDEL i wpisze 6 POMOC 01, to program nie wyświetla komunikatu o blokach i efekt jest ten sam co po pierwszym kodzie bez poprawki. Czyli warstwa ginie ale obiekty z bloku nie. Edytowane 24 Stycznia przez zwonko RobS 1 Cytuj
Rekomendowane odpowiedzi
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ą.