-
Postów
286 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
45
Treść opublikowana przez kojacek
-
Kiedy dostajesz informację że "twój lisp nie działa..." (a w setkach czy tysiącach testów/praktycznych zastosowań jest ok...) Opis przypadku: Lisp wybiera bloki, filtruje anonimowe i pobiera EffectiveName. Od kilkunastu lat jest wszystko ok, chyba że używasz ZwCAD-a. Bo w tym momecie następuje wyjebka. Dowolny (nie klasyczny) szyk AutoCAD-a, jest w rzeczywistości blokiem anonimowym, natomiast czy jest szykiem można sprawdzić funkcją getpropertyvalue (właściwość ClassName). Opisałem to wiele lat temu: https://kojacek.wordpress.com/2018/04/20/typy-odniesien/ W ZwCAD (jak się okazuje) sprawa wygląda nieco inaczej: szyk jest również blokiem anonimowym (ObjectName=AcDbBlockReference) ale... nie ma właściwości EffectiveName (i również kilku innych). Tutaj także nie użyjesz getpropertyvalue bo jej w ZwCAD (po prostu nie ma). Na marginsie - ten badany tutaj szyk jest obiektem VLA typu IZcadAssocArrayRect, który w autocadowskim modelu ActiveX nie występuje. Jest obiektem który chyba właściwie "udaje" szyk AutoCAD-a. Ciekaw jestem (nie mam możliwości sprawdzić) czy mechanizm dostępu do elementów szyku (który opisałm kiedyś: https://kojacek.wordpress.com/2024/05/26/dostep-do-elementow-szyku/) będzie działał. Poniżej zrzuty dla tego samego obiektu (handle="286") w tym samym rysunku sprawdzone w AutoCAD: oraz ZwCAD: Czy ktoś używa innych klonów (IntelliCAD / BricsCAD / inne) i mógły sprawdzić jak to tam wygląda? P.S. Obejściem problemu który zastosowałem żeby LISP działał w ZwCAD jest: (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-EffectiveName (list Obj))) (cdr (assoc 2 (entget (vlax-vla-object->ename Obj)))) (vla-get-EffectiveName Obj) )
-
Zatem z czystym sumieniem mogę polecić (prawie 10 letnie) rozwiązanie (3 w jednym): https://kojacek.wordpress.com/2017/12/30/uproszczone-wyswietlanie-obiektow/
-
To jest ustawienie zmiennej FILLMODE, czy osobny wynalazek?
-
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
Ok. Blok jest w porządku. Niemniej podstawowym założeniem SLINE, było zredukowanie klikania do minimum. Wywołanie polecenia (1) opcja (2) wskazanie (3) dwóch punktów... W realnym świecie (swego czasu) zastosowanie w "schematologii i rurologii": -
Dlok dynamiczny - "dwukierunkowy"
kojacek odpowiedział(a) na Sami_1 temat w ZWCAD Standard i Professional
Nie jako blok dynamiczny - tylko wiązania parametryczne i nie w ZWCad tylko w AutoCAD. Wygląda to tak. Dwuelementowa polilinia z więzami geometrycznymi (prostopadłość i poziomość), oraz więzami wymiarowymi. Segment poziomy = różnica długości całkowitej (to wyrażenie - parametr użytkownika i jest do ustawienia, traktowane jako stała) i segmentu pionowego. Jego zmienna zadana długość, powoduje zmianę długości segmentu poziomego, zgodnie z wyrażeniem. Poniżej działanie tegoż: -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
Podsumowując - w ZwCAD 2026 PL wyrażenie (quote (eval SYM)) nie działa, ale ('eval SYM) jest ok. Czy tylko w tej wersji, czy w innych też? W AutoCAD jest ok - przynajmniej nie spotkałem się z tym problemem nawet w starych wersjach. To że quote w tym miejscu nie działa, jest dziwne, bowiem wydaje się że ' (apostrof) jest tylko skrótem od (czy do) quote, więc interpreter LISP-a w rzeczywistości wykorzystuje funkcję quote. -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
Jeżeli nie wprowadzałeś jakichś "ulepszeń" program powinien działać prawidłowo. Przetestuj w linii poleceń wywołania funkcji: (jk:SLN-GetKey) wybierając dostępne opcje. Wybrane słowo kluczowe (także każde ostatnie jako domyślne wybrane enterem) przypisywane jest do zmiennej globalnej o nazwie *SLN*. Jej wartość determinuje tryb rysowania. -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
-
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
-
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
Spróbuj tego tak jak na obrazie powyżej, zamień wyrażenie - (quote (eval %1)) na ('eval %1). To samo dla %2. -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
voila: https://kojacek.wordpress.com/2026/04/08/linie-lamane-2-czyli-jak-to-dziala/ -
Szukam kodu Lisp autorstwa Kojacek o nazwie "Linie łamane"
kojacek odpowiedział(a) na zonikpl temat w Wsparcie programistyczne LISP i VisualLISP
Myślę że coś (chyba) mam... 😉 potrzebuję jednak trochę czasu, bo nie mam tego przy sobie. -
Pobranie cech (właściwości) z obiektu
kojacek odpowiedział(a) na PiotrI temat w Wsparcie programistyczne LISP i VisualLISP
Ja jak zwykle polecam korzystanie z CADPL-Pack'a (https://kojacek.wordpress.com/2015/11/04/cadpl-pack/) - i z tamtąd funkcję: cd:ACX_GetProp. Przykładowe wywołanie: (cd:ACX_GetProp (entlast) '("LineType" "Color" "Layer" "Bla-bla")) Funkcja zwraca listę par kropkowych z dowolnymi własciwościami. Funkcja jest przyjazna, bo dla właściwości, których obiekt nie ma (lub błędnych nazw właściwości (przykładowe "Bla-bla")) nadal działa. Zwróci dla powyższego wywołania: (("LineType" . "ByLayer") ("Color" . 3) ("Layer" . "0") ("Bla" . :vlax-null)) Pozwala to zastosować na przykład jedną taką samą listę pobierania właściwości dla wielu obiektów. -
Blok ze statycznym punktem zaczepienia
kojacek odpowiedział(a) na snooper83 temat w ZWCAD Standard i Professional
Blok dynamiczny z parametrem rozciągania biegunowego. W tym przypadku pewnie będzie trzeba mieć 2 bloki ("lewy i prawy"), dlatego też wielolinia odniesienia z blokiem i atrybutami jednak lepiej zda egzamin. -
Długość polilinii
kojacek odpowiedział(a) na padon temat w Wsparcie programistyczne LISP i VisualLISP
-
Długość polilinii
kojacek odpowiedział(a) na padon temat w Wsparcie programistyczne LISP i VisualLISP
Voila! Musisz mieć wczytany CADPL-Pack. I ten kod: ; -------------------------------------------------------------------- ; ; MLELEN by kojacek 2026 ; -------------------------------------------------------------------- ; (defun C:MLELEN ()(jk:ACX_MLePlineLen)(princ)) ; -------------------------------------------------------------------- ; (defun jk:ACX_MLePlineLen (/ %e %o %s %f %l %m %a %v) (if (and (setq %s (car (setq %e (entsel "\nWskaz polilinie:")))) (= "LWPOLYLINE" (cdr (assoc 0 (entget %s)))) ) (if (setq %e (getpoint (setq %f (cadr %e)) "\nPunkt opisu:")) (progn (setq %l (strcat "%<\\AcObjProp Object(%<\\_ObjId " (GetObjectID (vlax-ename->vla-object %s)(cd:ACX_ADoc)) ">%).Length \\f \"%lu2%pr2\">%" ) %a (angle %f %e) ) (cd:SYS_UndoBegin) (setq %m (jk:ACX_AddMleader (cd:ACX_ASpace) %l %f %e 1) ) (vla-SetDogLegDirection %m 0 (vlax-3D-point (list (if (<= (car %f)(car %e)) 1 -1) 0 0) ) ) (vla-update %m) (vla-Regen (cd:ACX_ADoc) acActiveViewport) (cd:SYS_UndoEnd) ) ) ) ) ; -------------------------------------------------------------------- ; (defun jk:ACX_AddMleader (Space txt Ps Pe Dir / v vo) (if (= (length Ps) 2)(setq Ps (append Ps (list 0.0)))) (if (= (length Pe) 2)(setq Pe (append Pe (list 0.0)))) (setq v (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 5)) (apply 'append (list Ps Pe)) ) ) ) (setq vo (vla-addMleader Space v 0)) (if txt (vla-put-TextString vo txt)) (vla-SetDogLegDirection vo 0 (vlax-3D-point (list Dir 0.0 0.0 ) ) ) (vla-SetLeaderLineVertices vo 0 v) vo ) ; -------------------------------------------------------------------- ; (defun GetObjectID (obj doc) ;; Lee Mac (if (eq "64" (strcase (getenv "PROCESSOR_ARCHITECTURE"))) (vlax-invoke-method (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false) (itoa (vla-get-Objectid obj)) ) ) ; -------------------------------------------------------------------- ; A wygląda to tak: -
Długość polilinii
kojacek odpowiedział(a) na padon temat w Wsparcie programistyczne LISP i VisualLISP
https://kojacek.wordpress.com/2018/01/23/etykietowanie-polilinii/ -
Można szybko napisać krótkiego Lisp-a. Na przykład wykorzystując bibliotekę CADPL-Pack-v1.lsp (https://kojacek.wordpress.com/2015/11/04/cadpl-pack/). Funkcją cd:BLK_GetAtts zbierzesz wartości atrybutów bloku (dla każdego layout-u), następnie w dowolny sposób przeformatować listę tak jak potrzeba, i w końcu funkcją cd:SYS_WriteFile możesz zapisać wynik w pliku tekstowym. Zwykle takie rozwiązania są bardziej indywidulane (zależą od nazwy bloków, tagów atrybutów, kolejności wartości itp.) niż uniwersalne.
-
To problem stosunkowo prosty do rozwiązania, (oczywiście) za pomocą LISP-a. Poniżej krótki uproszczony kod programu. Wcześniej trzeba załadować bibliotekę CADPL-Pack-v1.lsp (https://kojacek.wordpress.com/2015/11/04/cadpl-pack/) Potem należy załadować dwie poniższe funkcje: ; -------------------------------------------------------------------- ; ; by kojacek 2025 (https://kojacek.wordpress.com) ; ; -------------------------------------------------------------------- ; (defun C:RENBLO (/ %o %n %l %i) (if (setq %l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))) (progn (if (and (setq %o (getstring T "\nPodaj początek nazwy bloku zmienianego:")) (setq %n (getstring T "\nPodaj przedrostek nowej nazwy:")) ) (if (snvalid %n 1) (progn (setq %i (strlen %o)) (cd:SYS_UndoBegin) (foreach % %l (if (wcmatch % (strcat %o "*")) (jk:BLK_Rename % (strcat %n (substr % (1+ %i) 300)) ) ) ) (cd:SYS_UndoEnd) ) (princ "\nNieprawidłowy ciąg znaków.") ) ) ) (princ "\nW rysunku nie ma bloków.") ) (princ) ) ; -------------------------------------------------------------------- ; (defun jk:BLK_Rename (OldName NewName / ) (if (and (snvalid NewName 1) (not (tblobjname "BLOCK" NewName)) ) (if (tblobjname "BLOCK" OldName) (vla-put-Name (vla-item (cd:ACX_Blocks) OldName) NewName ) ) ) ) ; -------------------------------------------------------------------- ; Następnie wywołać polecenie RENBLO, podać ciąg znaków początku nazwy bloków do zmiany, a potem ciąg znaków którymi będzie on zamieniony... Przykładowo: "OKNO_podwojne - O3_G_Balkonowe" zamieniasz na "0-OK" co ilustrują poniższe obrazy: Przed: oraz po zmianie przez RENBLO:
-
Właściwość DimTxtDirection
kojacek odpowiedział(a) na kojacek temat w Wsparcie programistyczne LISP i VisualLISP
Ok. Sprawdzę jak to działa - czyli podsumowując ten stan jest zapisywany w XData (podobnie jak inne nadpisania zmiennych wymiaru), a nie jak początkowo było mówione o kodzie 53 "zwykłych" danych DXF. Jak już jesteśmy przy ZwCAD-zie... Jak przypisać właściwość Annotative do tekstu/wymiaru/kreskowania/itp. pomijając ręczną zmianę we Właściwościach? W AutoCAD polecenie _CHPROP ma opcję Annotative, jednak jak słyszę ZwCAD tego nie ma. -
Właściwość DimTxtDirection
kojacek odpowiedział(a) na kojacek temat w Wsparcie programistyczne LISP i VisualLISP
(vla-put-DimTxtDirection Obj (Val-Invert (vla-get-DimTxtDirection Obj))) gdzie Val-Invert to funkcja która "odwraca" wartość (np 0 na 1 / false na true / nil na T itd (i odwrotnie))