kojacek

Użytkownik forum
  • Postów

    236
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    26

Ostatnia wygrana kojacek w dniu 7 Kwietnia

Użytkownicy przyznają kojacek punkty reputacji!

Profile Information

  • Gender
    Male

Ostatnie wizyty

2 659 wyświetleń profilu

Osiągnięcia kojacek

Nowicjusz

Nowicjusz (2/6)

49

Reputacja

  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...