kojacek

Użytkownik forum
  • Postów

    236
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    26

Treść opublikowana przez kojacek

  1. Błędnym założeniem jest że ktokolwiek będzie wiedział skąd się wzięły i jak są zbudowane bloki na komputerze swazy'ego, po zaprezentowaniu obrazka właściwości. Pewnie inaczej sprawy by się miały, gdyby został udostępniony plik dwg.
  2. Szyki jeśli mówimy o ich geometrycznej reprezentacji są (jak (powszechnie) wiadomo) blokami. Blokami anonimowymi. Ich struktura jest dwupoziomowa i wygląda tak: z obiektów które są powielane tworzone są bloki anonimowe. Następnie już w bloku szyku (również anonimowym) te bloki są układane w szyku prostokatnym, biegunowym lub po ścieżce, w odpowiedniej ilości. Progra(mistycznie) trzeba w pierwszej kolejności: wybrać blok, ma być on anonimowy, i reprezentować szyk (bo nie każdy blok anonimowy nim jest). Tu mozna skorzystać z mojej funkcji jk:BLK_getInsertType (którą znajdziesz TUTAJ). Następnie mając wybrany blok szyku trzeba zbadać jego wszystkie obiekty będą to (rzecz jasna) bloki anonimowe. Tu można skorzystać z funkcji CADPL_Pack-a, o nazwie cd:BLK_GetEntity. Tak na szybko ten proces wykonuje funkcja: ; getinsidearray - by kojacek (defun getinsidearray (Ename / %a) (if (and (setq %a (jk:BLK_getInsertType Ename)) (wcmatch %a "ACDBASSOC*ARRAY") ) (cd:BLK_GetEntity (cdr (assoc 2 (entget Ename))) nil ) (prompt "\nTo nie szyk.") ) ) To może wyglądać tak: Funkcję cd:BLK_GetEntity możesz użyć do zbadania każdego bloku anonimowego w szyku. Druga rzecz: Możliwe, acz (uważam) nie warte zachodu. Można tu wykorzystać taki sam mechanizm tworzenia osnap'ów jak dla funkcji grread. Jak wiadomo funkcja ta nie obsługuje trybów lokalizacji więc... jest w sieci kilka różnych rozwiązań (mniej lub bardziej skomplikowanych), które to symulują.
  3. Natomiast tutaj: https://kojacek.wordpress.com/2017/11/13/zamiana-mline-na-lwpolyline/ zamiana podwójnej (tylko) multilinii na polilinię z szerokością (taką jak odstępy między segmentami:
  4. Błędów jest więcej. Już w pierwszej linii - nie deklarujesz zmiennych lokalnych. W drugiej - nie warunkujesz utworzenia listy, Twoje wywołanie zadziała tylko w jednym przypadku - gdy blok istnieje. Potem już z górki... Warunek (if (= (cdr (assoc 2 (entget POM ))) (nth n LISTA )) jest właściwie losowy... Z drugiej strony nie rozumiem tych podwójnych repeat. Zbiór wskazań bloków dynamicznych uzyskasz przecież (w uproszczeniu) tak: (ssget "x" (list (cons 0 "INSERT") (cons 2 (cd:STR_ReParse (cd:BLK_GetDynBlockNames "<Nazwa bloku>") ",`" ) ) ) )
  5. Możesz użyć funkcji cd:BLK_GetDynamicProps z biblioteki CADPL-Pack-v1.lsp, tak jak na animacji poniżej dla bloku dynamicznego ścian wielowarstwowych. Ma to zastosowanie dla AutoCAD w wersji 2004 i wyższych, dla ZwCAD - nie wiem niestety.
  6. Ok - niemniej, cały czas jestem przekonany że cztery kliknięcia to mniej niż pięć... 😉
  7. W AutoCAD-zie mam 4 kliki: (1) klik - zaznaczam prostokąt (2) klik - zaznaczam prawy górny wierzchołek (3) klik - po przesunięciu klikam środek górnego boku (4) klik - zanaczam lewy dolny uchwyt. Tu już wiecej nie klikam (przesuwam kursor), a z klawiatury wpisuję 50 i voila (i jeszcze ESC (z klawiatury)):
  8. Z mojej strony takie coś: ; -------------------------------------------------------------------------------------------- ; ; by kojacek 2022 ; -------------------------------------------------------------------------------------------- ; (defun C:MOD_WAR (/ d) (if (setq d (cd:SYS_ReadFile nil (findfile "warstwy.dat"))) (if (setq d (vl-remove-if '(lambda (%)(/= (substr % 1 1) "*")) d) ) (progn (cd:SYS_UndoBegin) (foreach % d (LayChProp %)) (cd:SYS_UndoEnd) ) ) ) (princ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayChProp (Data / d s c v p g x y cl :color :tcolor :lweight) (defun :lweight (/ %1 %2 %3) (vl-remove-if 'minusp (if (setq %1 (vl-sort (vl-remove-if-not '(lambda (%2)(wcmatch %2 "ACLNWT*")) (atoms-family 1) )'< ) ) (mapcar '(lambda (%3) (eval (read %3))) %1 ) ) ) ) (defun :tcolor () (vla-getinterfaceobject (vlax-get-acad-object) (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2) ) ) ) (defun :color (i m / r) (if (<= (strlen i) 3) (progn (setq r (abs (atoi i))) (if m (if (and (>= r 0)(<= r 256)) r) (if (and (>= r 1)(<= r 255)) r) ) ) (progn (setq r (cd:STR_Parse i "," t)) (if (and (listp r)(= 3 (length r))) (mapcar 'atoi r) ) ) ) ) (setq d (cd:STR_Parse Data ";" t) l (substr (car d) 2) ) (if (= 5 (length d)) (if (tblobjname "LAYER" l) (progn (setq s (cadr d) ; lay-on-off v (vlax-ename->vla-object (tblobjname "LAYER" l)) ; lay-vlaxobj c (:color (caddr d) nil) ; lay-color p (cadddr d) ; lay-ltype g (atoi (car (cddddr d))) ; lay-lwght x (ssget "_x" (list (cons 8 l) (cons 410 (getvar "CTAB")) ) ) ) (if (member s '("0" "1")) (if (zerop (read s)) (LayOnOff l) ) ) (if c (if (= (type c) 'INT) (vla-put-Color v c) (progn (setq cl (:tcolor)) (vla-SetRGB cl (car c)(cadr c)(caddr c)) (vla-put-TrueColor v cl) ) ) ) (if (tblobjname "LTYPE" p) (vla-put-Linetype v p) ) (if (and g (member g (:lweight))) (vla-put-LineWeight v g) ) (if x (progn (setq x (cd:SSX_Convert x 1)) (foreach % x (vla-put-Color % 256) (vla-put-LineType % "ByLayer") (vla-put-LineWeight % -1) ) ) ) ) ) ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayOnOff (Lay / e d) (if (setq e (tblobjname "LAYER" Lay)) (progn (setq d (entget e)) (setq d (subst (cons 62 (* -1 (cdr (assoc 62 d))) ) (assoc 62 d) d) ) (entmod d) ) ) ) ; -------------------------------------------------------------------------------------------- ; (princ) Potrzebne będą: 1) Załadowany plik CADPL-Pack-v1.lsp (tutaj info: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/) 2) plik o nazwie warstwy.dat i poniższej strukturze: ;;;*name,status,layercolor,layelinetype,layerlineweight *jezdnia (powierzchnia);1;7;Continous;30 *krawężnik (linia);1;1;Continous;30 *plac (powierzchnia);1;147,39,143;%;% *chodnik (powierzchnia);1;147,39,143;%;% *219-linia granicy;1;3;218-500;%;% *211- Nr działki;1;3;%;% *238-Punkt adresowy budynku;1;7;%;% *238-Punkt adresowy;1;7;%;% *994-Nazwa ulicy;1;27;%;30 Działa to wszystko tak: - wywołujemy polecenie MOD_WAR (trzeba załadowac wczesniej kod i Pack-a) - jezeli zostanie znaleziony plik tekstowy warswtwy,dat, to dla danych z kazdej linii wykonywane sa zmiany dla warstw. Skladnia pliku jest prosta: - brane sa pod uwage tylko linie rozpoczynajace sie od * (gwiazdki) - po niej nastepuje nazwa warstwy, - separatorami sa znaki "srednika" ; - po warstwie wystepuja koleno dane: stan warstwy (jezeli jest to 0 warstwa jest ukrywana) dopuszczalne wartosci to 0 i 1 - potem jest kolor warstwy - liczba (od 1 do 255) lub RGB formatu rrr,ggg,bbb (separatorem jest przecinek) - po kolejnym sredniku jest nazwa rodzaju linii, jezeli zostanie znaleziony w rysunku zostanie przypisany do warstwy - na koncu jest szerokosc linii. Tylko dopuszczalne szerokosci, (zobacz: https://kojacek.wordpress.com/2015/11/26/szerokosc-linii/) ogólnie dla wartosci dla których nic nie zmieniamy wstawiamy znak procent (%). program kontroluje poprawnosc dla czesci danych, wtedy je pomija. Plik dat trzeba sobie rozbudowac o kolejne wpisy,
  9. Wrzuć "kawałek" rysunku z tymi warstwami jakie są i dla kilku tych warstw napisz jakie chcesz mieć właściwości. To pozwoli coś "zlispować" na szybko jako przykład. Tych parę linijek kodu można napisać w końcu za free. Właśnie jako przykład. Jeszcze jak potwierdzisz że dzięki temu zszedłeś z 2 godzin pracy na 20 sekund... 😉
  10. Właśnie o tym mówiłem (PPR). Rzutnię można później przyciąć do "normalengo" prostokąta poleceniem CLIP.
  11. W Ac (od wersji 2010) można zastosować parametryczność. Boki kwadratu trzeba ograniczyć więzami geometrycznymi (równoległość i jednakowa odległość). Dodatkowy parametr wymiarowy, określający długość boku pozwala ją zmienić w dowolnej chwili:
  12. Proszę zapoznać się z dwoma zmiennymi systemowymi AutoCAD-a: 1) IMAGEFRAME - wartości 0 / 1 - jeżeli jest zero ramka obrazu nie jest wyświetlana (ale pomimo tego obiekt można zeskalować), oraz 2) FRAMESELECTION - 0 / 1 - jezeli =0, nie można wybierać (zatem skalować, przesuwać, rozciągać) obrazów, wipeout-ów i przyciętych (CLIP-em) bloków (lub XRef). Podsumowując - ustawić dla tych zmiennych 0 i powinno działać.
  13. Temat filtrów warstw w AutoCAD/ZwCAD oraz dostęp (lub jego brak) LISP-em, był już tutaj omawiany blisko 10 lat temu... ( ). Pomimo upływu czasu wydaje się że niewiele się tutaj zmieniło. (?)
  14. Można też "rozbijać" polilinie na poszczególne segmenty nie tracąc ich szerokosci. Tutaj :: https://kojacek.wordpress.com/2015/11/01/rozbijanie-polilinii/ program lisp-owy, który powstał przeszło 20 lat temu...
  15. Napisałem że lekko przerobić. I zasada nie nie jest zgoła inna. Tu (po tej lekkiej przeróbce) zmiana dowolnego stylu wymiarowania na (np.) A, automatycznie ustawiałoby styl wymiarowania na (np.) B. W konsekwencji (przy włączonym reaktorze) nigdy nie byłoby możliwe ustawienie stylu A...
  16. Można lekko przerobic: https://kojacek.wordpress.com/2021/05/08/dimstyle-reactor/
  17. W tym pliku lampy są jednak blokami. Anonimowymi (wprawdzie) ale blokami. Zamiana bloku anonimowego na nieanonimowy szczególnie trudnym zadaniem nie jest. (Tutaj) problem jest jednak innej natury. Każde wstawienie lampy jest innym blokiem (właśnie anonimowym). Oznacza to że np. 10 wstawień tej samej lampy, tworzy 10 wstawień różnych bloków (a nie jednego) jak być powinno. Rozwiązaniem byłoby: - po wskazaniu dowolnego bloku anonimowego, jego zamiana na nieanonimowy (czyli z nazwą)(,)(oraz)(następnie) - dla każdego wtawienia bloku anonimowego sprawdzenie jego elementów czy są zgodne z definicją tegoż poprzedniego (czyli czy wszystkie obiekty są takie same (ale nie te same)) - jeżeli byłaby zgodność, blok anonimowy zastępowany jest tym z nazwą... Kiedyś się czym podobnym bawiłem (choć w innym celu). Jeśli będzie jakaś wolna chwila coś wrzucę. Być może będzie przydatne
  18. 😉 takie coś można wydziobać albo wydrapać... blok dynamiczny sterowany dynamicznie z okna dialogowego:
  19. Przedstawiony kod dotyczy tak zwanej "lekkiej polilinii" czyli obiektu typu LWPOLYLINE, a makro oczywiście (i rzeczywiście) "omija" segmenty łukowe. Polilinia której segmenty są splajnami, jest automatycznie konwertowana na ("stary") obiekt i jest typu POLYLINE, więc na tych obiektach kod nie działa. Krótko (ale mam nadzieję) w jasny sposób parę słów o polilinich znajdziesz (reklama) tu: https://kojacek.wordpress.com/2015/09/18/polilinie-2d/ Jeśli chodzi o rozwój przedstawionego rozwiązania. Sugerowałbym aby blok grota, był blokiem dynamicznym (z kilkoma trybami widoczności), co uprościłoby wszelkie zabawy z tymże - zamiast przebierać w setkach (możliwych przecież) bloków w rysunku, brać jeden i wybierać potrzebny stan widoczności. Idea bloków dynamicznych właśnie (choć nie tylko) sprawdza się doskonale w takich sytuacjach. PS. w avatarze jest wrona, nie wilk... 😉
  20. Zadanie z tych banalnych raczej... Można rozwiązać tak: ; ---------------------------------------------------------------------------- ; (defun c:testuj ()(InsBlkInPolySeg (car (entsel)) "arrow1" 20.0 15.0)(princ)) ; ---------------------------------------------------------------------------- ; ; funkcja zwraca liste segmentow LWPOLY typu: ((p1 bulge1 p2)(p2 bulge2 p3)...); ; ---------------------------------------------------------------------------- ; (defun jk:LWP_GetSegments (e / p d r) (setq d (entget e) p (if (= 1 (logand (cdr (assoc 70 d)) 1)) (cdr (assoc 10 d)) ) d (mapcar 'cdr (vl-remove-if-not '(lambda (%)(member (car %) '(10 42))) d ) ) ) (if p (setq d (append d (list p))) ) (while (> (length d) 2) (setq r (cons (list (car d) (cadr d) (caddr d) ) r ) d (cddr d) ) ) (reverse r) ) ; ---------------------------------------------------------------------------- ; (defun InsBlkInPolySeg (Poly Block Scale MinLength / d b n a p) (if (not (tblobjname "BLOCK" Block)) (princ (strcat "\nBłąd: w rysunku nie ma bloku " (strcase Block) "." ) ) (if (not (setq d (jk:LWP_GetSegments Poly)) ) (princ "\nBłąd - niepoprawna polilinia.") (if (not (setq d (vl-remove-if-not '(lambda (%)(zerop (cadr %))) d) ) ) (princ "\nBłąd - polilinia składa sie z samych łuków.") (if (not (setq d (vl-remove-if '(lambda (%) (< (distance (car %)(caddr %)) MinLength) ) d ) ) ) (princ "\nBłąd - segmenty polilinii są za krótkie.") (progn (cd:SYS_UndoBegin) (foreach % d (setq a (angle (car %)(caddr %)) p (polar (car %) a (/ (distance (car %)(caddr %)) 2.0)) ) (cd:BLK_InsertBlock p Block (list Scale Scale Scale) a nil) ) (cd:SYS_UndoEnd) ) ) ) ) ) ) ; ---------------------------------------------------------------------------- ; Polecenie TESTUJ, wywołuje funkcję InsBlkInPolySeg, dla której jednak kluczem jest funkcja jk:LWP_GetSegments. Dla całości trzeba CADPL-Pack-a który opisywałem kiedyś tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ . W uproszczeniu - groty strzałek w postaci bloku (argument Block) wstawiane są na liniowych segmentach wskazanej polilinii (argument Block - tutaj trzeba wstawić jeszcze jakieś testowanie wyboru), których długość jest większa niż argument MinLength.
  21. LISP-em można sterować parametrami bloku dynamicznego podczas aktywności okna dialogowego. Pozwala to kontrolować wizualnie dokonane zmiany. Tutaj na szybko tylko jeden parametr:
  22. Ustalenie koloru (choć nie tylko) na JakWarstwa dla elementów bloków uważam (nie tylko ja zresztą) raczej za wadę a nie zaletę. Sposób tworzenia bloków (warstwa "0" / kolor / rodzaj linii / szerokość linii ByBlock itd.) to osobny duży temat. O kolorach (i nie tylko) ByLayer i ByBlock pisałem TUTAJ. Zaś z przemianami cech wszelkich elementów bloków, w sposób masowy (czy też jednostkowy) można zapoznać się TU.
  23. Mam dwie uwagi. 1) AutoCAD-we SETBYLAYER zmienia więcej właściwości niźli tylko kolor: 2) Jeżeli zaś chodzi o kolor tylko, mam wrażenie że to można załatwić używając amunicji mniejszego kalibru, Wystarczy wiedzieć że w danych DXF obiektu kod 62 odpowiada za jego kolor. I tak jeśli kod 62 ma wartość 256 (lub w danych nie ma tego kodu) to obiekt ma kolor logiczny jakwarstwa. Wynika z tego że wystarczy manipulować wartością kodu 62 danych DXF obiektu. Klasycznie entmodem, bez żdnych com... vla-... etc. Tak samo można w inteligentny sposób wybierać obiekty do zmiany (po co wybierać te które już są JakWarstwa?). Poniższy kod wystarczy aby wybrać obiekty z niezamknietych warstw i które nie mają koloru JakWarstwa i takimi je uczynić: (if (setq ss (ssget "_:L" '((-4 . "/=")(62 . 256))) ) (foreach % (cd:SSX_Convert ss 0) (cd:ENT_SetDXF % 62 256) ) ) Wykorzystuję tu dwie funcje biblioteczne CADPL-Pack-a, który krótko przedstawiam tutaj.
  24. kojacek

    Start

    Zapraszam do czytania mojego bloga na: https://kojacek.wordpress.com