kojacek

Użytkownik forum
  • Postów

    268
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    43

Treść opublikowana przez kojacek

  1. Dla ścisłości. Całą poniższą zabawę: (setq laylist '()) ;; zbierz layouty (bez Model) (vlax-for lay lays (if (/= (strcase (vla-get-Name lay)) "MODEL") (setq laylist (append laylist (list (vla-get-Name lay)))) ) ) załatwia przecież samo: (layoutlist) o czem przecież mowa od samego początku jest...
  2. 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.
  3. 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:
  4. Co rozumiesz przez "zestawić listę layoutów"? Jeśli chodzi o same nazwy layoutów, funkcja AutoLISP o nazwie layoutlist załatwia sprawę. Przykładowo: (layoutlist) -> ("PIETRO 1-4" "PRZEKROJE")
  5. 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.
  6. (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))
  7. Ok, to znam. Jednak to nie załatwia sprawy. Potrzeba jest nieco inna: najpierw odczytać, a potem zmienić (lub nie). Stąd było pytanie o stan właściwości DimTxtDirection.
  8. Obawiam się że coś się nie zgadza... Na obrazie widać dwa wymiary (wyraźnie) różniące się położeniem i orientacją tekstu wymiarowego. Różnice są widoczne także w wartości właściwości DimTxtDirection - są to wartości logiczne odpowiednio :vlax-false ("normalny") i :vlax-true ("odwrócony"). Dla tychże wymiarów (różniących się przecież), kod 53 DXF jest liczbą rzeczywistą i wynosi jednakowo 0.0 (Przykład w AutoCAD, bo w ZwCAD właściwość DimTxtDirection nie ma wartości - co jest w końcu tematem wątku)
  9. Dzięki... Dla tego wymiaru (już z ciekawości przejrzałem) właściwości bez wartości jest więcej: AltSubUnitsFactor = AltSubUnitsSuffix = DimConstrDesc = DimConstrValue = DimTxtDirection = SubUnitsFactor = SubUnitsSuffix =
  10. LISP który działa normalnie w AC, nie działa w ZWCAD 2026. Zauważyłem że dla wymiaru właściwość DimTxtDirection nie ma wartości. To błąd czy umyślne zaniechanie?
  11. f*ck...tycznie. inny sposób
  12. pline-offset-align-trim
  13. Propozycja rozwiązania: https://kojacek.wordpress.com/2025/10/14/naroznik-wymiarow
  14. 2 x przesuń. Jednak jeśli POLARANG nie jest ustawiony, to ustawienie będzie dodatkową (trzecią) operacją:
  15. W Ac możemy wstawić zmienną do pola, pod warunkiem że Ac nie jest LT:
  16. W AC działa w dwie strony. Bez zarzutu. Jak przełącznik radiowy. Albo 0 albo 1.
  17. Zatem... Załaduj poniższych parę nieci innych nawiasów. Polecenie L-ANNO2 . Pack musi być. Przetestuj proszę. ; -------------------------------------------------------------------------------------------- ; ; Polecenie C:L-ANNO2 zmienia zmienna ANNOALLVISIBLE dla kazdego layoutu na wartosc przeciwna ; ; operujac na XDATA ; ; by kojacek 2024 ; ; -------------------------------------------------------------------------------------------- ; (defun C:L-ANNO2 (/ %n %i %l) (setq %n "AcadAnnoAV") (foreach % (layoutlist) (setq %i (vlax-vla-object->ename (vla-item (cd:ACX_Layouts) %) ) ) (setq %l (length (if (not (cd:XDT_GetXData %i %n) ) (cd:XDT_PutXData %i %n '((1070 . 1))) (cd:XDT_RemoveXData %i %n) ) ) ) (princ (strcat "\nDla układu " % " zmieniono ustawienie ANNOALLVISIBLE na " (if (< 10 %l) "1" "0") ) ) ) (princ) ) ; -------------------------------------------------------------------------------------------- ;
  18. GETPROPERTYVALUE, SETPROPERTYVALUE oraz DUMPALLPROPERTIES są w AC pewnie już z 10 lat. Zatem z rzekomą zgodnością różnie bywa.
  19. Tych parę nawiasów wraz z treścią umieszczoną pomiędzi nimi, zmienia wartosc tej zmiennej dla kazdego layoutu (bez modelu) na przeciwną. Potrzeba CADPL-Pack'a załadowanego wcześniej. ; -------------------------------------------------------------------------------------------- ; ; Polecenie C:L-ANNO zmienia zmienna ANNOALLVISIBLE dla kazdego layoutu na wartosc przeciwna ; ; by kojacek 2024 ; ; -------------------------------------------------------------------------------------------- ; (defun C:L-ANNO (/ %i :a) (defun :a (x)(getpropertyvalue x "AnnoAllVisible")) (foreach % (layoutlist) (setq %i (vlax-vla-object->ename (vla-item (cd:ACX_Layouts) %) ) ) (setpropertyvalue %i "AnnoAllVisible" (abs (1- (:a %i))) ) (princ (strcat "\nDla układu " % " zmieniono ustawienie ANNOALLVISIBLE na " (itoa (:a %i)) ) ) ) (princ) ) ; -------------------------------------------------------------------------------------------- ; W AC działa, nie wiem jak w jemu podobnych. kojacek
  20. WIdzę teraz, że odsunięcie ramki nie jest wyrażone w jednostkach, tylko jako jako współczynnik wysokości. Wartość 1 daje odsunięcie o wartości Height MTEXT-u.
  21. Potrzebujesz: 1) (załadowanego) CADPL-Pack'a (wiadomo) 2) funkcji z Express Tools: acet-geom-mtxtbox (oprócz AutoCAD-a jest w BricsCAD-zie i GStar'ze. Nie wiem jak jest w ZwCAD-ie) 3) Poniższego kawałka kodu: ;;; ramka MTEXTu (2024 by kojacek) (defun C:MTEST (/ %e %d %p %o %z) (if (and (setq %e (car (entsel "\Wybierz MTEXT:"))) (= "MTEXT" (cdr (assoc 0 (setq %d (entget %e))))) ) (progn (setq %p (acet-geom-mtxtbox %d 0.0) %z (cdr (assoc 210 %d)) %p (mapcar '(lambda (%) (trans % 1 %z) ) %p ) ) (setq %o (cd:ACX_AddLWPolyline (cd:ACX_ASpace) %p t)) (vla-TransformBy %o (cd:CON_TransMatrix 0)) ) (princ "\nZły wybór.") ) ) Z tego co na szybko przetestowałem, maluje prostokąt dla wskazanego MTEXT-u, niezależnie od aktywnego układu współrzednych. Funkcja acet-geom-mtxtbox, zwraca współrzędne prostokata opisującego rzeczywisty obszar MTEXT-u (porównaj z ramką MTEXT-u). Swego czasu poruszałem to tu: https://kojacek.wordpress.com/2017/10/08/wielkosc-obszaru-mtext-u/. Drugi argument funkcji (tutaj 0.0), to odsunięcie prostokąta. Pozwala to na rysowanie większego obramowania.
  22. Być może przyczyną jest funkcja entmod. Wprawdzie może ona modyfikować obiekty niegraficzne (tutaj LAYER), ale gdzieś czytałem że są wyjątki dla kodu 70 - nie pamiętam jednak czego dotyczyły. W autocadowskich "antycznychch" czasach (przed ActiveX (czyli przed 1999 )), pewnie bym użył command zamiast entmod… ale pewnie dlatego że byłoby łatwiej. Na marginesie - Twoje warunkowanie kodu 70 jest błędne - działa tylko w wyjątkowych sytuacjach. Kod 70 jest wartością bitową, więc na przykład 1 jest prawdziwe nie tylko dla 1, ale też 3 (2+1)... 5 (4+1)... 7 (2+4+1)... 9... etc. Teraz przykład z użyciem ActiveX (i CADPack'a). Krótko (i co ważniejsze) działa: (defun C:ODMROZWAR () (vlax-for % (cd:ACX_Layers) (if (and (= :vlax-true (vla-get-freeze %)) (wcmatch (vla-get-name %) "LS*") ; <- moj testowy filtr ) (vla-put-freeze % :vlax-false) ) ) (vla-regen (cd:ACX_ADoc) 0) (princ) )
  23. Jeszcze: 1) sprawdzić czy trzeba cokolwiek robić (bo blok który chcemy stworzyć już istnieje) 2) deklarować zmienne lokalne (zawsze) 3) poznać funkcję initget dla getreal / getint / getangle / getpoint (ilość modułów = 0, a kąt 666...) 4) blok można tworzyć przez command / entmake / activeX (https://kojacek.wordpress.com/2017/11/22/programowe-tworzenie-bloku/) 5) alternatywnie pomysleć o szykach (https://kojacek.wordpress.com/2024/05/26/dostep-do-elementow-szyku/) albo MINSERT (https://kojacek.wordpress.com/2019/06/23/blok-5-rzeczy-o-ktorych-byc-moze-nie-wiesz/)