-
Postów
257 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
41
Treść opublikowana przez kojacek
-
vlax-ldata-.... a wersje ZWcad
kojacek odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Osobiście odradzam używania LDATA, czy to w samym AutoCAD-zie, czy w programach mu podobnych. Niezależnie, czy jest błąd w ZwCAD, sugerowałbym migrację danych do obiektów niegraficznych typu Dictionary (również Extension Dictionary), oraz do przechowywania dużej ilości danych różnego typu w obiekcie XRECORD. Parokrotnie poruszałem już ten temat tutaj: https://kojacek.wordpress.com/tag/obiekty-niegraficzne/ Dostęp do tego rodzaju struktur rysunkowej bazy danych, zapewnia VisualLISP. W razie czego mogę pomóc, jak to "ugryźć". -
Ja tam jestem zwolennikiem minimalizmu w kodzie: (ssget "_x" '((0 . "hatch")(-4 . "/=")(62 . 1)(-4 . "/=")(62 . 105))) 😉
-
Odmierzanie na polilinii
kojacek odpowiedział(a) na jacnightingale temat w ZWCAD Standard i Professional
Do wyznaczania punktu na krzywej w zadanej odległości od innego punktu na niej się znajdującego przedstawiam funkcję LISP-a: ; ================================================================== ; ; Zwraca punkt (lub nil) znajdujacy sie na krzywej <Curve> w ; ; odleglosci <Dist> od punktu <FromPt> ; ; Dodatnia wartosc <Dist> wyznacza punkt w kierunku zgodnym z ; ; przebiegiem krzywej, ujemna w kierunku przeciwnym ; ; ------------------------------------------------------------------ ; (defun jk:CAL_GetPointAtDist (Curve FromPt Dist / %) (if (setq % (vlax-curve-getDistAtpoint Curve FromPt)) (vlax-curve-getPointAtDist Curve (+ Dist %)) ) ) ; ------------------------------------------------------------------ ; Wymaga ona trzech argumentów: 1) obiektu 3) punktu na nim i 3) odległości. Zwraca punkt lub nil. Poniżej funkcja ilustrująca testowe działanie - po wskazaniu splajnu, punktu na nim (zielone kółko), rysuje 5 (czerwonych okręgów) w odległości 10 20 30 40 i 50 od niego. Kod: (defun C:TEST-A ( / e p) (if (and (setq e (car (entsel "\nKrzywa:"))) (setq p (getpoint "\nOd punktu:")) ) (foreach % '(10 20 30 40 50) (cd:ACX_AddCircle (cd:ACX_ASpace) (jk:CAL_GetPointAtDist e p %) 1 T ) ) ) ) Funkcja testująca wymaga CADPL-Pack'a (https://kojacek.wordpress.com/2015/11/04/cadpl-pack/) a aziałanie wygląda tak: -
Odmierzanie na polilinii
kojacek odpowiedział(a) na jacnightingale temat w ZWCAD Standard i Professional
No to ja trochę namieszałem. Ale to co chcesz też się da zrobić LISP-em. W wolnej chwili wrzucę w jaki sposób. -
Odmierzanie na polilinii
kojacek odpowiedział(a) na jacnightingale temat w ZWCAD Standard i Professional
A takie coś: https://kojacek.wordpress.com/2018/01/17/pomiar-dlugosci-krzywej/ LISP-em? -
Wyszukiwanie elementów blokujących warstwy [rozwiązany]
kojacek odpowiedział(a) na 2P temat w ZWCAD Standard i Professional
Tutaj trochę szerzej: https://kojacek.wordpress.com/2018/05/02/warstwy-bloki-purge/ -
Wyszukiwanie elementów blokujących warstwy [rozwiązany]
kojacek odpowiedział(a) na 2P temat w ZWCAD Standard i Professional
Przepraszam, zakładam ponownie temat, bowiem w mojej opinii został zbyt wcześnie zamknięty. Wydaje mi się że problem nie został jednak rozwiązany - patrząc na sam tytuł wątku. Nie przedłużając - do rzeczy. Przedstawiam poniżej funkcje LISP-a, które pozwalają znaleźć element(y) w definicji bloku, który nie znajduje się na warstwie "0". Zwykle takie właśnie obiekty tworzą opisywaną sytuacją - nie można "wypurgować" warstwy, pomimo tego że nie znajdują się na niej żadne (uchwytne w normalnej edycji) elementy. Poniżej dwie funkcje: ; ---------------------------------------------------------------- ; ; by kojacek [https://kojacek.wordpress.com] ; ; ---------------------------------------------------------------- ; ; Funkcja sprawdza wszystkie elementy bloku <BName>. Zwraca liste ; ; obiektow <ename> ktore znajduja sie na innej warstwie niz "0" ; ; lub nil ; ; ---------------------------------------------------------------- ; (defun jk:BLK_Find-NoStandardLay (BName) (vl-remove-if '(lambda (%) (= "0" (cdr (assoc 8 (entget %)))) ) (cd:BLK_GetEntity BName nil) ) ) ; ---------------------------------------------------------------- ; ; Funkcja dla listy nazw blokow <Blist>, sparawdza kazdy blok, czy ; ; znajduja sie w nim elementy na innych warstwach niz "0". Zwraca ; ; liste typu (("BName-1 <ename...><ename...> ... )) lub nil ; ; ---------------------------------------------------------------- ; (defun jk:BLK_InspectBlock (BList / r) (if (setq r (mapcar '(lambda (% / %1) (if (setq %1 (jk:BLK_Find-NoStandardLay %)) (append (list %) %1) ) ) BList ) ) (vl-remove 'nil r) ) ) ; ---------------------------------------------------------------- ; Korzystają z biblioteki CADPL-Pack (http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html) Przykładowe wywołanie: (jk:BLK_InspectBlock (cd:SYS_CollList "BLOCK" (+ 1 2))) może w konsoli VLIDE AutoCAD-a zwracać taką listę (tutaj dwa bloki z elementami leżącymi na innej niż "0" warstwa): Sposób ten jak widać pozwala wyłapać "niehigienicznie" tworzone bloki (i określone w nim obiekty) które mogą "wlec" ze sobą niepotrzebne warstwy. Mając tę wiedzę można już spokojnie przedefiniować blok (wyrażeniem LISP-a w jednej linii - ale to inna bajka 😉 ), a w konsekwencji wyczyścić rysunek z niepotrzebnych warstw. Co ważne - świadomie, bowiem wiemy co zostało zepsute, i potrafimy to naprawić. Uwaga: Przedstawione funkcje działają na 100% w AutoCAD-zie, proszę sprawdzić czy dają się z powodzeniem uruchomić na ZwCAD. Niestety nie mogę tego zweryfikować. -
Dokumentacja fotograficzna
kojacek odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Skorzystaj z gotowych narzędzi lispowych zwanych CADPL-Pack. Poczytaj tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ o nim, co to jest i jak używać. Potem jest już z górki: 1) Odczytanie pliku csv: (setq a (cd:SYS_ReadFile nil (findfile "GPS.csv"))) zwraca listę: ("D:\\Smietnik\\IMG_20180218_133113.jpg;51.269562;22.542074;22" "D:\\Smietnik\\IMG_20180218_133117.jpg;51.269562;22.542074;90" "D:\\Smietnik\\IMG_20180218_133144.jpg;51.269562;22.542074;180" "D:\\Smietnik\\IMG_20180221_190038.jpg;51.269558;22.542191;130") 2) Podział łańcuchów (elementów listy) na osobne listy: (setq b (mapcar '(lambda (%)(cd:STR_Parse % ";" T)) a)) zwraca: (("D:\\Smietnik\\IMG_20180218_133113.jpg" "51.269562" "22.542074" "22") ("D:\\Smietnik\\IMG_20180218_133117.jpg" "51.269562" "22.542074" "90") ("D:\\Smietnik\\IMG_20180218_133144.jpg" "51.269562" "22.542074" "180") ("D:\\Smietnik\\IMG_20180221_190038.jpg" "51.269558" "22.542191" "130")) 3) Utworzenie osobnych list na podstawie indeksu. Na poczatek krótka definicja funkcji do tego celu: (defun jk:LST_nth (Lst Idx) (mapcar '(lambda (%)(nth Idx %)) Lst) ) Teraz wywołania: (setq p (jk:LST_nth b 0)) zwraca ścieżki: ("D:\\Smietnik\\IMG_20180218_133113.jpg" "D:\\Smietnik\\IMG_20180218_133117.jpg" "D:\\Smietnik\\IMG_20180218_133144.jpg" "D:\\Smietnik\\IMG_20180221_190038.jpg") potem iksy: (setq x (jk:LST_nth b 1)) następnie igreki: (setq y (jk:LST_nth b 2)) na koniec kąty: (setq g (jk:LST_nth b 3)) oczywiście jeśli potrzeba zmień STR-ingi listy na liczby, tu dla igreków który wygląda tak: ("22.542074" "22.542074" "22.542074" "22.542191") wywołujesz: (mapcar 'read y) zwraca: (22.5421 22.5421 22.5421 22.5422) Powinno działać - w razie problemów daj znać. -
Wyciąganie atrybutów z bloków dynamicznych [Wprowadzono w ZWCAD 2020]
kojacek odpowiedział(a) na kruk pytanie w Propozycje nowych funkcji
Chodzi (jak rozumiem) nie o atrybuty tylko o właściwości. LISP-em, możesz wykorzystać funkcję biblioteczną z zestawu CADPL-Pack o nazwie cd:BLK_GetDynamicProps. Tutaj masz ogólnie o CADPL-Packu parę słów (co to jest i jak korzystać): https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ Tutaj różne tematy okołopack'owe: http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html A tutaj sam plik biblioteki: http://members.upcpoczta.pl/r.matula/Pack/v1/CADPL-Pack-v1.lsp -
Zapamiętywanie ostatniej wprowadzonej wartości
kojacek odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
W mojej subiektywnej opinii, pomysł nieco chybiony. Co będzie gdy w tym samym katalogu będzie więcej plików rysunkowych? Wszystkie będą się odwoływać do tego samego pliku tekstowego? A co jeśli przypadkowo plik zostanie usunięty? Nie wiemy czemu ma to służyć, niemniej widzę chyba lepsze rozwiązania: zapamiętanie danych w rysunku np. Zmienna USERRn (ulotne - niezapamiętywane w sesji), lub jako dane niegraficzne - słownik w namedobjdict, a w nim XRecord (zapamiętane na stałe). Ponadto XData przypięta do jakiegoś obiektu, itp. -
Ustawienia ZWCAD 2018 na serwerze sieciowym
kojacek odpowiedział(a) na tuss temat w ZWCAD Standard i Professional
W mojej opinii bardzo dobre rozwiązanie. Na serwerze: szablony + style wydruku + definicje kreskowań rodzajów linii (jeśli nietypowe) + lispy (i inne rozszerzenia) + biblioteki bloków + (opcja menu częściowe) Lokalnie: indywidualne własne menu + własne bloki + własne lispy Uprawnienia na serwerze R-O dla wszystkich + 1 (2) user-(ów) jako admini (mogą edytować, poprawiać, uzupełniać zasoby) -
Szablony i skrypty startowe ZWPack
kojacek odpowiedział(a) na dmatusz3 temat w ZWCAD Standard i Professional
Odnośnie polecenia C:ZZ (ze skryptu), przełączającego FILLMODE, polecam szersze rozwiązania: https://kojacek.wordpress.com/2017/12/30/uproszczone-wyswietlanie-obiektow/ -
Błąd w metodzie ZwCAD .net - formatowanie tekstu [rozwiązany]
kojacek odpowiedział(a) na Parikon temat w ZWCAD Standard i Professional
Utwórz tekst bez podkreślenia, tak jak sugerujesz. Potem do istniejącego już dodaj "%%u". -
entmod na wielu obiektach
kojacek odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Zobacz to: (setq NowyZ 152) (defun C:ZZ (/ ss :chFaceZ) (defun :chFaceZ (En Val / l d n p) (setq l '(10 11 12 13) d (entget En) n (vl-remove-if '(lambda (%)(member (car %) l)) d) p (vl-remove-if-not '(lambda (%)(member (car %) l)) d) p (mapcar '(lambda (%) (list (car %)(cadr %)(caddr %)(+ Val (cadddr %)))) p) ) (entmod (append n p)) ) (if (setq ss (ssget '((0 . "3DFACE")))) (foreach % (cd:SSX_Convert ss 0) (:chFaceZ % NowyZ) ) ) (princ) ) Dodaje wartość zmiennej globalnej NowyZ do składowej z każdego wierzchołka wybranych 3DFace. Wykorzystuje cd:SSX_Convert ze wspomnianego CADPL-Pack'a -
entmod na wielu obiektach
kojacek odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Prawie wszystko. Począwszy od: 1) braku zmiennych lokalnych (zobacz: https://kojacek.wordpress.com/2015/12/20/symbole-zmienne/). 2) Potem pomysł z mnożeniem wartości współrzędnej z. Operacje dodawania/odejmowania wydają się być chyba bardziej naturalne (sprawdź mnożenie 1 i 0 przez dowolną wartość). Na marginesie: zmiana składowej Z wszystkich punktów obiektu, o tę samą wartość, to w rzeczywistości przesunięcie go w przestrzeni - to można też robić prościej (command MOVE, lub vla-Move dla ActiveX) 3) Ponadto ja bym nie użył (ze względu na wydajność) repeat, tylko raczej foreach dla listy otrzymanej ze zbioru wskazań. 4) Tak samo zmieniłbym całą listę, i tylko raz wywołał entmod. Oczywiście dwa ostatnie punkty nie są szczególnymi błędami. Poczytaj też o: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ Jest tam parę dość użytecznych rzeczy. -
Punkt przecięcia podczas przesuwania [rozwiązany]
kojacek odpowiedział(a) na jacnightingale temat w ZWCAD Standard i Professional
Również działa poprawnie w każdej wersji AutoCAD-a, począwszy od wersji 13, czyli od...1994 roku. -
Pomysł w mojej opinii jest chybiony. Wynikać może z niezrozumienia idei i mechanizmu przechowywania grup. Grupy służą do łączenia kilku obiektów, w celu operowania nimi jako jedną jednostką. Jest tu istotna różnica w zastosowaniu grup i bloków. Te byty nie powinny być z założenia traktowane zamiennie. Innymi słowy grupy w rzeczywistości są zbiorami wskazań, dodatkowo posiadającymi rozszerzone możliwości, jak nazwa, czy możliwość zapamiętania. Najważniejszą zaś ich cechą, jest to że dowolny obiekt może należeć do więcej niż jednej grupy. Bloki nie posiadają takiej możliwości. Kopiowanie i wklejanie grupy z jednego rysunku do drugiego, choćby z tego powodu (i nie tylko tego jednego) jest pozbawione sensu. Do takich operacji idealnie nadają się właśnie bloki. Proces wstawiania bloków, przy wykorzystaniu np. DesignCenter (chyba że zwCAD go nie ma?), nie jest pracochłonny i trwa od ułamków, do paru sekund.
-
Associative Circle and Centerline
kojacek odpowiedział(a) na JasW temat w Wsparcie programistyczne LISP i VisualLISP
Przechowywanie uchwytu w kodzie DXF 1005 ma tę właściwość, że zostaną zachowane (przekształcone odpowiednio by zachować połączenia) symboliczne wskaźniki do obiektów, podczas takich operacji jak zapisywanie bloku, kopiowanie elementów do innego rysunku, dołączania jako xref itd. Proteza w postaci zapisu uchwytu w kodzie 1000 nigdy tego nie zagwarantuje. -
Tworzenie nowego układu
kojacek odpowiedział(a) na geo-tech temat w Wsparcie programistyczne LISP i VisualLISP
Nie ma problemu. Zainteresuj się CADPL-Pack'iem: http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html Potem, wczytaj go, oraz poniższą funkcję: (defun -MakeLayout (Start End Pref / i n l) (setq i Start l (layoutlist) ) (while (< i End) (progn (setq n (strcat Pref (itoa i))) (if (not (member n l)) (vla-Add (cd:ACX_Layouts) n) ) (setq i (1+ i) l (cons n l)) ) ) ) Ma ona trzy argumenty: Start - to liczba całkowita od jakiej zaczyna się licznik, End - to koniec, Pref to łańcuch tekstowy, nazwy układu. Wywołujesz ją w ten sposób: (-MakeLayout 1 201 "Szkic") i po chwili masz te Layouty... kojacek (https://kojacek.wordpress.com) -
To wszystko zależy z czym wiążesz przyszłość. Jeżeli masz ambicje być programistą i chcesz pisać aplikacje (nieważne czy pod CAD czy więcej), oczywiście idź w .NET + C#. Przy okazji możesz "dotknąć" też AutoLISP-a (czy VL), nie zaszkodzi, a może pomóc (inne spojrzenie). Jeśli zaś, będąc inżynierem (mechanikiem/elektrykiem/budowlańcem/etc.), i pracując w programach autocadopodobnych (czy w nim samym) chcesz tylko, (dużo dużo) więcej z niego "wycisnąć" (do tego małym kosztem) ucz się AutoLISP-a. Poszerzy twoje horyzonty dotyczące budowy i struktury rysunku (modelu), samej aplikacji. Taka wiedza może naprawdę poważnie zwiększyć codzienną wydajność, uprościć i ułatwić pracę, zmniejszyć ilość błędów, zautomatyzować wiele czynności. O swego rodzaju "frajdzie" nie wspomnę
-
Błąd vlax-ldata w wersji 2017
kojacek odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Jak coś ciekawego to wrzucaj. Jeśli się uda będziem prostować ;) -
Błąd vlax-ldata w wersji 2017
kojacek odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Dzięki . Cieszę się że mogłem pomóc. Podaj teraz jakie pary kropkowe zapisujesz i jak wygląda błąd. Może da się też coś zaradzić? -
Błąd vlax-ldata w wersji 2017
kojacek odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Spróbujmy jednak to naprawić - nieco naokolo. Zrób teraz tak: Załaduj CADPL-Pack'a Zapisz w 2017 LDATA - tak aby były zapisane źle Wywołaj: (cd:ENT_SetDXF (cd:DCT_GetDict (cd:DCT_GetDict (namedobjdict) "TEST") "T") 300 "(\"Abc Xyz\")") i następnie odczytaj dane. Jeżeli będzie ok, to w ten sposób będziesz mógl obejść ten problem, do czasu gdy żółte rączki go nie naprawią...