kojacek

Użytkownik forum
  • Postów

    272
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    43

Treść opublikowana przez kojacek

  1. 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.
  2. Po edycji polilinii zaś (i REGEN) tak:
  3. 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:
  4. https://kojacek.wordpress.com/2018/01/23/etykietowanie-polilinii/
  5. 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...
  6. 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.
  7. 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:
  8. 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")
  9. 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.
  10. (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))
  11. 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.
  12. 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)
  13. 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 =
  14. 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?
  15. f*ck...tycznie. inny sposób
  16. pline-offset-align-trim
  17. Propozycja rozwiązania: https://kojacek.wordpress.com/2025/10/14/naroznik-wymiarow
  18. 2 x przesuń. Jednak jeśli POLARANG nie jest ustawiony, to ustawienie będzie dodatkową (trzecią) operacją:
  19. W Ac możemy wstawić zmienną do pola, pod warunkiem że Ac nie jest LT:
  20. W AC działa w dwie strony. Bez zarzutu. Jak przełącznik radiowy. Albo 0 albo 1.
  21. 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) ) ; -------------------------------------------------------------------------------------------- ;
  22. GETPROPERTYVALUE, SETPROPERTYVALUE oraz DUMPALLPROPERTIES są w AC pewnie już z 10 lat. Zatem z rzekomą zgodnością różnie bywa.
  23. 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