kojacek

Użytkownik forum
  • Postów

    252
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    35

Treść opublikowana przez kojacek

  1. Właśnie o tym mówiłem (PPR). Rzutnię można później przyciąć do "normalengo" prostokąta poleceniem CLIP.
  2. PPR (Przekręć Pan Rzutnię) 😉
  3. 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:
  4. 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ć.
  5. 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. (?)
  6. 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...
  7. 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...
  8. Można lekko przerobic: https://kojacek.wordpress.com/2021/05/08/dimstyle-reactor/
  9. 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
  10. 😉 takie coś można wydziobać albo wydrapać... blok dynamiczny sterowany dynamicznie z okna dialogowego:
  11. 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... 😉
  12. 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.
  13. 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:
  14. 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.
  15. 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.
  16. kojacek

    Start

    Zapraszam do czytania mojego bloga na: https://kojacek.wordpress.com
  17. LISP-em, najprościej użyć funkcji startapp. Zobacz tutaj: https://kojacek.wordpress.com/2016/07/31/pliki-szybki-dostep/
  18. Może tak (czując się wywołanym linkiem): Uproszczony kod: ; -------------------------------------------------------------------------------------- ; ; 2021 by kojacek (defun C:LPOLY (/ GetObjectID getObj l b v i) (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)) ) ) (defun getObj (/ e) (if (setq e (car (entsel "\nWybierz obiekt do zmierzenia: "))) (if (member (cdr (assoc 0 (entget e))) (list "LINE" "ARC" "LWPOLYLINE") ) e ) ) ) (defun GetBlk (BlkList Att / e d a) (if (setq e (car (entsel "\nWybierz blok opisuący: "))) (if (and (setq d (entget e)) (setq a (mapcar '(lambda (%)(cdr (assoc 2 (entget %)))) (cd:BLK_GetAttEntity e) ) ) (= "INSERT" (cdr (assoc 0 d))) (member (cdr (assoc 2 d)) BlkList ) (member Att a) ) e ) ) ) (if (and (setq l (getObj)) (setq b (GetBlk (list "KABEL" "OBIEKT_OCHRONNY") "MEASURED_LENGTH" ) ) ) (progn (setq v (GetObjectID (vlax-ename->vla-object l) (cd:ACX_ADoc) ) i (strcat "%<\\AcObjProp Object(%<\\_ObjId " v ">%).Length \\f \"%lu2%pr2\">%" ) ) (cd:SYS_UndoBegin) (cd:BLK_SetAttValueVLA b "MEASURED_LENGTH" i ) (vla-Regen (cd:ACX_ADoc) acActiveViewport) (cd:SYS_UndoEnd) ) (princ "\nZły wybór") ) (princ) ) ; -------------------------------------------------------------------------------------------- ; Wymagane jest załadowanie CADPL-Pack'a: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ Nazwy bloków, tagi atrybutów i format Field-a, trezba sobie "podkręcić" po swojemu.
  19. Najprostszym rozwiązaniem byłoby wstawianie bloku (w formie owego prostokata) w modelu, który byłby na podstawie jego punktu wstawienia, obrotu (+ informacji o skali) reprezentowany (rzutnią) w osobnym Layoucie. To bylo juz klepane na cad.pl parę lat temu.
  20. Tak nieco inaczej podchodząc do tematu: https://kojacek.wordpress.com/2021/01/30/lisp-a-klawisze/
  21. Przyznam że nie rozumiem idei tegoż, jak też i zamysłu całości. Po co tak obrac bloki? Ale się nie znam pewnie.
  22. Po paru nawiasach? Nie zniechęcaj się... jeszcze za wcześnie... ;) Są gorsze języki programowania... :)
  23. Byłoby dziwne gdyby wpółpracował. Lista z tblsearch nie jest poprawną listą dla entmod. Użyj tu formy entget + tblobjname. Zobacz: (setq e (tblobjname "layer" "zbrojenie_linie" )) (setq d (entget e)) (entmod (subst (cons 62 -8)(assoc 62 d) d)) a to prowadzić może do bardziej ogólnej funkcji: (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) ) ) ) Funkcja steruje widocznością warstwy podanej jako jej argument tak jak przełącznik, wywołaj kolejno: (LayOnOff "zbrojenie_linie")