kojacek

Użytkownik forum
  • Postów

    252
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    35

Treść opublikowana przez kojacek

  1. Rozwiązania widzę co najmniej dwa, a właściwie trzy (jako mariaż pierwszego i drugiego): Wspomniana wcześniej funkcja CADPL-Pack,owa, do "ogolenia" ssget'a z elementów nie będących częścią definicji edytowanego bloku. To rozwiązuje sprawę na poziomie elementarnym. Utworzenie zbioru wskazań za pomocą bardziej złożonego wywołania funkcji ssget - np. z wykluczeniem nazw pewnych bloków, obiektów, obiektów na warstwie itp. Np. "kulturalnie" zdefiniowany blok ma obiekty na warstwie "0" (w definicji). Zachowując higieniczność w malowaniu (nic nigdy nie jest na warstwie "0"), podczas edycji bloku, dobieramy się do jego obiektów w definicji, czyli na warstwie "0", właśnie. Oczywiście to mógłby być jeden z warunków, może być ich więcej. Kombinacja tych powyższych: inteligentny ssget, potwierdzony (czy zweryfikowany) listą.
  2. Przyznam że nie rozumiem. Jeśli klikacz siedzi i klika (czyli wybiera) to skąd problem z ssget-em? Niech klika i wybierze w końcu. W AutoCAD jest zmienna REFEDITNAME która zwraca nazwę bloku (ZOdn) edytowanego, lub "". Jeżeli blok jest edytowany w edytorze bloków, to o jego stanie informuje zmienna BLOCKEDITOR (0 lub 1)
  3. W tym przypadku polecam (jak zwykle) CADPL-Pack (https://kojacek.wordpress.com/cadpl-pack/). Tutaj będzie to funkcja o nazwie cd:BLK_GetEntity. Tworzy ona listę obiektów tworzących blok. W wywołaniu repeat (ale dlaczego? - użyłbym foreach), wystarczy wtedy porównać czy obiekt ze zbioru wskazań znajduje się na liście (i wtedy wykonać jakąś operację), czy nie (i wtedy nic z nim nie robić). Na marginesie, dlaczego takie zabawy? - zmian w bloku można dokonać przecież lispem "po cichu", bez użytkownika, czyli bez edycji bloku, bez ssget'ów, itp. i innych problemów.
  4. Dodaj do pliku definicję funkcji DXF, której to właśnie brakuje: (defun DXF (code elist)(cdr (assoc code elist))) Na marginesie. Fajna jest zabawa kodami DXF obiektów, by na końcu użyć... command, A i dopiero teraz zauważyłem. Te reversy to po co są? Kto to pisał?
  5. Rozważmy teraz (na początek) zakończenie typu 1 - parallel to Global XY. Nieco teorii przybliży prosty malunek. Oto mamy wyciągnięty profil z bloku. Wstawienie w punkcie P1, wyciągnięcie w kierunku punktu P2 (niewidocznego na rysunku). Powinniśmy teraz utworzyć kolejne wyciągnięcie profilu, ale w odwrotnym kierunku (o długości odcinka a). Po utworzeniu takiej bryły należy ją przeciąć płaszczyzną równoległą do X0Y przechodzącą przez P1. "Dolną" część usunąć, "górną" zestalić z profilem typu 0. Musimy znać: - wysokość profilu , także jego szerokość - kąt alfa czyli kąt punktów P1 P2 tworzących ścieżkę w przestrzeni - pozostałe boki trójkąta [a] - długość wyciągnięcia zakończenia, oraz [c] czyli długość P1 A. Oczywiście, obliczeń dokona AutoLISP. My wstawimy tylko parę nawiasów... ;)
  6. To kombinowanie z kawałkowaniem i ze sztukowaniem też mi się nie podoba, przyznam. W kontekście tego malunku co wrzuciłeś (Type of ending...), przyjąć można że punkt bazowy naszych bloków powinien być nie w punkcie symetrycznym dolnej krawędzi zarysu, jak jest teraz, a w samym środeczku profilu. Tak jest właśnie na tym rysunku. I wtedy nasz już istniejący B3D, realizowałby zakończenie Type 0-Normal. Z dwóch stron, bo jak rozumiem, docelowym optymalnym rozwiązaniem, powinna być mozliwość aby określać dowolne (z trzech) zakończenie dla każego końca niezależnie, już na etapie wskazywania punktów, wyboru skali i profilu. Z automatu następowałoby wydłużenie w odpowiednich kierunkach linii z punktów definiujących, wyrysowanie bryły (większej z końcami 0-Normal), oraz albo ucięcie płaszczyzną, albo domalowanie jakiejś kosteczki i jej odjęcie.
  7. Osadzenie nawet na łuku dla wytrawnych lispaczy nie będzie problemem... ;) Problemem jest czas, a właściwie jego brak, na takie zabawy... ale spokojnie. Damy radę.
  8. Opcja z dwoma punktami jest najprostsza. Wydaje się że też najbardziej naturalna (mam jakieś przeczucie, że w wymyślny sposób gięte profile, w konstrukcjach występują z mniejszą intensywnością, niźli proste). Wyciąganie po wskazanej ścieżce jest też jak najbardziej możliwe. Problemem z jakim się pewnie zetkniemy, a które będzie trudno rozwiązać (albo rozwiązać w sposób stosunkowo rozbudowany) będą: 1) Bryła będzie jedna dla całej ścieżki. Zwykle oczekiwalibyśmy dopasowanych do siebie ale jednak kilka brył. 2) Zbyt małe kąty, czy promienie zaokrągleń, potrzebne do prawidłowego wyciągnięcia (zbyt dużego) profilu.Tego nie będzie można prawdopodobnie kontrolować przed wykonaniem operacji. 3) Ustawienie orientacji profili w początku ścieżki. O ile dla profilu będącym rurą okrągłą, nie ma to szczególnie znaczenia, dla innych może mieć (np. ścieżka oparta na polilinii 2d jest w istocie dwuwymiarowa. Pytanie - czy określamy każdorazowo w jaki sposób względem płaszczyzny na której leży ścieżka ustawiamy np. dwuteownik? Półka równolegle? prostopadle? Inaczej? Dla polilini 3d jest podobnie. Oczywiście coś tam potestujemy, zobaczymy jak to wygląda.
  9. E no, jak ja coś zrobię, to działa... ;) Nie kopiuj fragmentów, używaj Pack-a tak jak tu opisałem: https://kojacek.wordpress.com/cadpl-pack/ Jeśli patrzyłeś tu obok, na harce z wyciąganiem profili, zauważysz że z 30% (na oko) kodu jest pack-owego, niektóre zadania nawet w 100% (okna dialogowe i ich obsługa).
  10. Tak, metodą ActiveX - GetBoundingBox można otrzymać współrzędne przekątnej prostokąta opisującego obiekt. Tak samo dla wstawienia bloku (AcadBlockReference) jak też dla każdej entycji w definicji bloku.
  11. Próbowałeś: cd:ACX_LoadLineType z: http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html ?
  12. Wy tu sobie testujcie póki co, dajcie znać jak macie jakieś uwagi, a ja sobie powoli przemyślę innych parę pomysłów, bo coś bym tu jeszcze ewentualnie zmienił...
  13. Kolejne wcielenie do testowania. Zmiany są takie:. 1) Na samym początku można ustawić skalę wstawianego bloku (w konsekwencji profilu). Zakres od 0,001 do 100, ustawiane w oknie. 2) Słowo kluczowe Nazwa do wpisania z ręki nazwy bloku. 3) Poprawki różne Kod: ; =========================================================================================== ; (if (not cd:ACX_ADoc)(load "CADPL-Pack-v1.lsp" -1)) ; =========================================================================================== ; (defun C:B3D ()(b3d:ExtrIns)(princ)) ; =========================================================================================== ; ; ExtrudeProfile.lsp by kojacek 2015 / ; =========================================================================================== ; (defun b3d:ExtrIns (/ l n s e p o x) (if (not (setq l (b3d:BlockProfileList))) (princ "\nW rysunku nie zdefiniowano bloków dla profili. ") (progn (if (not *B3D-Settings*)(setq *B3D-Settings* (list (car l) 1.0))) (if (setq s (vl-catch-all-apply 'b3d:GetPointProfile (list nil))) (if (and (listp s) (setq e (vl-catch-all-apply 'b3d:GetPointProfile (list s))) ) (if (listp e) (if (and (setq n (vl-catch-all-apply 'b3d:GetBlockProfileName (list l))) (= (type n) 'STR) ) (progn (setq x (cadr *B3D-Settings*)) (cd:SYS_UndoBegin) (setq o (cd:BLK_InsertBlock s n (list x x x) 0 T)) (b3d:SetInsertZOrient (b3d:NewVect s e) (setq o (vlax-vla-object->ename o)) ) (setq p (cd:ENT_MakeLine (getvar "CTAB") s e T)) (b3d:ExtrudeProfile (vlax-ename->vla-object o) p) (cd:SYS_UndoEnd) ) ) ) ) ) ) ) ) ; =========================================================================================== ; (defun b3d:GetBlockProfileName (LProf / f k s) (setq f (car *B3D-Settings*) s (car (mapcar '(lambda (%)(cd:STR_ReParse LProf %))(list " "))) ) (initget (strcat "Lista Wybierz Nazwa")) (setq k (vl-catch-all-apply 'getkword (list (strcat "\nProfil [Lista/Wybierz/Nazwa] lub podaj nazwę <" f ">: ")) ) ) (if (not k) f (if (= (type k) 'STR) (cond ( (= k "Lista")(b3d:ProfileDlg LProf)) ( (= k "Wybierz")(b3d:SelectBlock LProf)) ( (= k "Nazwa")(b3d:SelectName LProf)) (t k) ) ) ) ) ; =========================================================================================== ; (defun b3d:SetGlobal (Mode Val) (if (zerop Mode) (setq *B3D-Settings* (list Val (cadr *B3D-Settings*))) (setq *B3D-Settings* (list (car *B3D-Settings*) Val)) ) ) ; =========================================================================================== ; (defun b3d:SelectName (Lst / r) (if (and (setq r (getstring "\nNazwa: ")) (member (strcase r)(mapcar 'strcase Lst)) ) (progn (b3d:SetGlobal 0 r) r) (b3d:GetBlockProfileName Lst) ) ) ; =========================================================================================== ; (defun b3d:ProfileDlg (BlkL / r p) (setq r (cd:DCL_StdListDialog BlkL (vl-position (car *B3D-Settings*) BlkL) "Profile" "Wybierz:" 25 12 2 12 (list "&Ok" "&Anuluj") nil T T nil) ) (if r (progn (setq p (nth r BlkL))(b3d:SetGlobal 0 p))) p ) ; =========================================================================================== ; (defun b3d:SelectBlock (Lst / e d s) (if (and (setq e (entsel "\nWybierz blok: ")) (setq d (entget (car e))) (= "INSERT" (cdr (assoc 0 d))) (member (strcase (setq s (cdr (assoc 2 d)))) (mapcar 'strcase Lst) ) ) (progn (b3d:SetGlobal 0 s) s) (b3d:GetBlockProfileName Lst) ) ) ; =========================================================================================== ; (defun b3d:ExtrudeProfile (Blk Lin / p c r d) (vla-explode Blk) (setq p (entlast)) (vla-delete Blk) (if (cond ( (= "LWPOLYLINE" (cdr (assoc 0 (entget p)))) (setq c (vlax-make-safearray vlax-vbObject '(0 . 0))) (vlax-safearray-put-element c 0 (vlax-ename->vla-object p)) (setq r (vla-AddRegion (cd:ACX_ASpace) c)) ) ( (= "REGION" (cdr (assoc 0 (entget p)))) (setq r (vlax-ename->vla-object p)) ) (t nil) ) (progn (vla-AddExtrudedSolidAlongPath (cd:ACX_ASpace) (if (= (type r)'VLA-OBJECT) r (setq d (vlax-safearray-get-element (vlax-variant-value r) 0)) ) (vlax-ename->vla-object Lin) ) (if d (vla-delete d)) (foreach % (list Lin p)(entdel %)) ) ) ) ; =========================================================================================== ; (defun b3d:NewVect (p1 p2 / d q s m v) (setq d (mapcar '- p2 p1) q (mapcar '* d d) s (apply '+ q) m (sqrt s) v (mapcar '/ d (list m m m)) ) ) ; =========================================================================================== ; (defun b3d:SetInsertZOrient (ExtrVec Ename / e b) (setq e (entget Ename) b (trans (cdr (assoc 10 e)) Ename ExtrVec) e (subst (cons 10 b)(assoc 10 e) e) e (subst (cons 50 0.0)(assoc 50 e) e) e (subst (cons 210 ExtrVec)(assoc 210 e) e) ) (entmod e) ) ; =========================================================================================== ; (defun b3d:BlockProfile-p (Name / l d) (if (= 1 (length (setq l (cd:BLK_GetEntity Name nil)))) (progn (setq d (entget (car l))) (or (and (= (cdr (assoc 0 d)) "LWPOLYLINE") (= 1 (logand 1 (cdr (assoc 70 d)))) ) (= (cdr (assoc 0 d)) "REGION") ) ) ) ) ; =========================================================================================== ; (defun b3d:BlockProfileList (/ l) (if (setq l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))) (acad_strlsort (vl-remove-if-not '(lambda (%)(b3d:BlockProfile-p %)) l)) ) ) ; =========================================================================================== ; (defun b3d:GetPointProfile (Pt / m r) (setq r (if Pt (progn (initget 1) (getpoint Pt "\nKoniec ścieżki: ") ) (progn (setq m (strcat "\nProfil (" (car *B3D-Settings*) " skala=" (cd:CON_Real2Str (cadr *B3D-Settings*) 2 (getvar "LUPREC")) ") [Skala] lub wskaż pierwszy punkt ścieżki: " ) ) (initget 1 "Skala") (getpoint m) ) ) ) (if (= r "Skala")(b3d:SetProfileScale) r) ) ; =========================================================================================== ; (defun b3d:SetProfileScale ( / f l r) (setq f (cadr *B3D-Settings*) l (getvar "LUPREC") ) (if (setq r (cd:DCL_StdEditBoxDialog (list 3 (list (cons 1 "Wprowadź liczbę rzeczywistą") (cons 2 "Liczba nie może być zerem") (cons 8 "Spacje są niedozwolone") (cons 16 "To nie jest liczba") (cons 32 "Liczba jest za mała") (cons 64 "Liczba jest za duża") ) (cd:CON_Real2Str f 2 l) 0.001 100 2 l ) "Skala" "Wartość: " 25 12 (list "&OK" "&Anuluj") T nil ) ) (b3d:SetGlobal 1 (read r)) ) (b3d:GetPointProfile nil) ) ; =========================================================================================== ; (princ "\nZaładowano polecenie: B3D ") (princ) Testujcie!
  14. To już lepiej nie brać do listy takich bloków, ale... mam mieszane uczucia czy to dobry sposób. Nakładanie zbyt dużo ograniczeń, też nie jest dobrą drogą. Na razie myślę zrobię z tą Nazwą jako słowo kluczowe, i zobaczymy jak to działa.
  15. Nie o LUW, z LUW-em nie ma problemu - tu się wstawi zabezpieczenie że ma być w globalnym i jest po krzyku. Chodzi o nazwy bloków zawierające podkreślnik lub spację. Aby można było wybrać blok z "wolnej ręki", lista bloków przekazywana jest do initget. To zaś powoduje że nazwy są "rozrywane" (podkreślnik służy do lokalizowania nazw, spacej to separatory). Są dwa rozwiązania: 1) Rezygnacja z wpisywania ręcznego (jest wybierz, i wybór z listy, oraz enter jako ostatni) 2) Dodanie słowa kluczowego do wpisu czyli zgłoszenie typu: Profil [Lista/Wybierz/Nazwa]<IPE500>: czyli Lista - wiadomo, Wybierz - wiadomo, i trzeba dodatkowo Nazwa, aby podać nazwę bloku (tu już bez initgeta, tylko zakres listy), enter - wiadomo To jest dodatkowe wydłużenie operacji
  16. Niestety jest jeden dość duży błąd, ujawniający się w pewnych okolicznościach. Póki co pracuję nad tym... :(
  17. Kolejny etap do testowania... Jeśli chodzi powinien: 1) Rozpoznawać prawidłowe bloki 2) "Urozmaicić wybór", poprzez: podanie nazwy z ręki / wybranie z listy / wskazanie bloku 3) Zapamiętywać ostatnie ustawienia 4) No i polecenie ma skrócone - teraz jest B3D Kod: ; =========================================================================================== ; (load "CADPL-Pack-v1.lsp" -1) ; =========================================================================================== ; (defun C:B3D ()(ExtrIns)(princ)) ; =========================================================================================== ; (defun ExtrIns (/ LBlk InsName StartP EndP PathEnt InsObj) (if (not (setq LBlk (BlockProfileList))) (princ "\nW rysunku nie zdefiniowano bloków dla profili. ") (progn (if (not *B3D-Settings*)(setq *B3D-Settings* (list (car LBlk) 1.0))) (if (setq StartP (getpoint "\nPierwszy punkt linii definiującej ścieżkę: ")) (if (setq EndP (getpoint StartP "\nKoniec ścieżki: ")) (if (setq InsName (GetBlockProfileName LBlk)) (progn (cd:SYS_UndoBegin) (setq InsObj (cd:BLK_InsertBlock StartP InsName '(1 1 1) 0 T)) (SetInsertZOrient (NewVect StartP EndP) (setq InsObj (vlax-vla-object->ename InsObj)) ) (setq PathEnt (cd:ENT_MakeLine (getvar "CTAB") StartP EndP T)) (ExtrudeProfile (vlax-ename->vla-object InsObj) PathEnt) (cd:SYS_UndoEnd) ) ) ) ) ) ) ) ; =========================================================================================== ; (defun GetBlockProfileName (LProf / f k s) (setq f (car *B3D-Settings*) s (car (mapcar '(lambda (%)(cd:STR_ReParse LProf %))(list " "))) ) (initget (strcat "Lista Wybierz " s)) (setq k (vl-catch-all-apply 'getkword (list (strcat "\nProfil [Lista/Wybierz] lub podaj nazwę <" f ">: ")) ) ) (if (not k) f (if (= (type k) 'STR) (cond ( (= k "Lista")(ProfileDlg LProf)) ( (= k "Wybierz")(SelectBlock LProf)) (t k) ) ) ) ) ; =========================================================================================== ; (defun ProfileDlg (BlkL / r p) (setq r (cd:DCL_StdListDialog BlkL (vl-position (car *B3D-Settings*) BlkL) "Profile" "Wybierz:" 25 12 2 12 (list "&Ok" "&Anuluj") nil T T nil) ) (if r (progn (setq p (nth r BlkL)) (setq *B3D-Settings* (list p (cadr *B3D-Settings*)))) ) p ) ; =========================================================================================== ; (defun SelectBlock (Lst / e d s) (if (and (setq e (entsel "\nWybierz blok: ")) (setq d (entget (car e))) (= "INSERT" (cdr (assoc 0 d))) (member (strcase (setq s (cdr (assoc 2 d)))) (mapcar 'strcase Lst) ) ) (progn (setq *B3D-Settings* (list s (cadr *B3D-Settings*))) s ) ) ) ; =========================================================================================== ; (defun ExtrudeProfile (Blk Lin / Prf Crv Reg Del) (vla-explode Blk) (setq Prf (entlast)) (vla-delete Blk) (if (cond ( (= "LWPOLYLINE" (cdr (assoc 0 (entget Prf)))) (setq Crv (vlax-make-safearray vlax-vbObject '(0 . 0))) (vlax-safearray-put-element Crv 0 (vlax-ename->vla-object Prf)) (setq Reg (vla-AddRegion (cd:ACX_ASpace) Crv)) ) ( (= "REGION" (cdr (assoc 0 (entget Prf)))) (setq Reg (vlax-ename->vla-object Prf)) ) (t nil) ) (progn (vla-AddExtrudedSolidAlongPath (cd:ACX_ASpace) (if (= (type Reg )'VLA-OBJECT) Reg (setq Del (vlax-safearray-get-element (vlax-variant-value Reg) 0)) ) (vlax-ename->vla-object Lin) ) (if Del (vla-delete Del)) (foreach % (list Lin Prf)(entdel %)) ) ) ) ; =========================================================================================== ; (defun NewVect (p1 p2 / dt sq sm um uv) (setq dt (mapcar '- p2 p1) sq (mapcar '* dt dt) sm (apply '+ sq) um (sqrt sm) uv (mapcar '/ dt (list um um um)) ) ) ; =========================================================================================== ; (defun SetInsertZOrient (ExtrVec Ename / e b) (setq e (entget Ename) b (trans (cdr (assoc 10 e)) Ename ExtrVec) e (subst (cons 10 b)(assoc 10 e) e) e (subst (cons 50 0.0)(assoc 50 e) e) e (subst (cons 210 ExtrVec)(assoc 210 e) e) ) (entmod e) ) ; =========================================================================================== ; (defun BlockProfile-p (Name / l d) (if (= 1 (length (setq l (cd:BLK_GetEntity Name nil)))) (progn (setq d (entget (car l))) (or (and (= (cdr (assoc 0 d)) "LWPOLYLINE") (= 1 (logand 1 (cdr (assoc 70 d)))) ) (= (cdr (assoc 0 d)) "REGION") ) ) ) ) ; =========================================================================================== ; (defun BlockProfileList (/ l) (if (setq l (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))) (acad_strlsort (vl-remove-if-not '(lambda (%)(BlockProfile-p %)) l)) ) ) ; =========================================================================================== ; (princ "\nZaładowano polecenie: B3D ") (princ)
  18. Wg moich testów - dwie listy: bloków wszystkich i dobrych czyli tych które akceptujemy (polilinia zamknięta lub region). Jak widać B2 jest skutecznie odfiltrowany: Przecież nie jest zabronione wykorzystanie LISP-a z funkcją (autoreklama): jk:LWP_CorrectStartEndPoint pokazaną na (autoreklama) https://kojacek.wordpress.com/polilinia-zamknieta/
  19. Ale samo zamknięcie to połowa sukcesu. W tym przypadku "niehigieniczne" jest przecież także pokrywanie się pierwszego i ostatniego wierzchołka. Jeśli dobrze pamiętam regiony w AutoCAD-zie były dostępne chyba już w wersji 12 (z AME) czyli w ~ 1992 roku! :)
  20. Halo, halo panie Martin_S... Niechże mnie ktoś poprawi, ale czy nie jest tak że w blokach o nazwach IPE500 i IPE600, które gdzieś tutaj istnieją w przykładowych plikach, polilinie są OTWARTE, a nie (jak być powinno) zamknięte? Mylę się? O poliliniach otwartych a wyglądających jak zamknięte można przeczytać (autoreklama) tutaj: https://kojacek.wordpress.com/polilinia-zamknieta/
  21. A teraz moi mili, w następnym kroku niechże zrobi ktoś dwg-a, w którym niech sobie będzie z 5-10 bloków z profilami z LWPOLYLINE, kilka z REGION-ami, oraz kilka całkiem innych różnych bloczków. Po co? Otóż chcę przerobić wybieranie bloków na: 1) przez nazwę "z ręki" 2) przez nazwę z listy 3) przez wybór entycji (leży sobie gdzieś obok i się wskazuje) Całą "chytrość" wyboru chcę oprzeć na tym że sprawdzana jest zawartość bloku tak, aby np. liście (punkt 2) znalazło się tylko np. 10 bloków, (spełniających warunki) a pozostał (np. 20) - już nie.
  22. Hmm. W definicji bloku ma znajdować się jeden obiekt. Czyli w twoim przypadku nie dwa regiony a tylko jeden. Musi on być utworzony tak że w definicji bloku od większego regionu odejmujesz mniejszy. Wtedy jest jeden obiekt - definiowany przez (tutaj) dwa profile.
  23. Wprowadziłem na razie takie zmiany: 1) Rysowany jest profil bez użycia command. To jest wielokrotnie szybsze 2) Profil w bloku może być zamkniętą polilinią lub regionem. Oczywiście CADPack musi byc załadowany. Sprawdźcie czy to chodzi na ZW, bo nie miałem okazji próbować. Na Ac hula bez zarzutu. Oto kod: ; =========================================================================================== ; (defun C:EXTRINS (/ InsName StartP EndP PathEnt InsObj) (if (setq StartP (getpoint "\nPierwszy punkt linii definiującej ścieżkę: ")) (if (setq EndP (getpoint StartP "\nKoniec ścieżki: ")) (if (and (setq InsName (getstring "\nPodaj nazwe bloku: ")) (member (strcase InsName) (mapcar 'strcase (cd:SYS_CollList "BLOCK" (+ 1 2 4 8))) ) ) (progn (cd:SYS_UndoBegin) (setq InsObj (cd:BLK_InsertBlock StartP InsName '(1 1 1) 0 T)) (SetInsertZOrient (NewVect StartP EndP) (setq InsObj (vlax-vla-object->ename InsObj) ) ) (setq PathEnt (cd:ENT_MakeLine (getvar "CTAB") StartP EndP T)) (ExtrudeProfile (vlax-ename->vla-object InsObj) PathEnt) (cd:SYS_UndoEnd) ) ) ) ) (princ) ) ; =========================================================================================== ; (defun ExtrudeProfile (Blk Lin / Prf Crv Reg Del) (vla-explode Blk) (setq Prf (entlast)) (vla-delete Blk) (if (cond ( (= "LWPOLYLINE" (cdr (assoc 0 (entget Prf)))) (setq Crv (vlax-make-safearray vlax-vbObject '(0 . 0))) (vlax-safearray-put-element Crv 0 (vlax-ename->vla-object Prf)) (setq Reg (vla-AddRegion (cd:ACX_ASpace) Crv)) ) ( (= "REGION" (cdr (assoc 0 (entget Prf)))) (setq Reg (vlax-ename->vla-object Prf)) ) (t nil) ) (progn (vla-AddExtrudedSolidAlongPath (cd:ACX_ASpace) (if (= (type Reg )'VLA-OBJECT) Reg (setq Del (vlax-safearray-get-element (vlax-variant-value Reg) 0)) ) (vlax-ename->vla-object Lin) ) (if Del (vla-delete Del)) (foreach % (list Lin Prf)(entdel %)) ) ) ) ; =========================================================================================== ; (defun NewVect (p1 p2 / dt sq sm um uv) (setq dt (mapcar '- p2 p1) sq (mapcar '* dt dt) sm (apply '+ sq) um (sqrt sm) uv (mapcar '/ dt (list um um um)) ) ) ; =========================================================================================== ; (defun SetInsertZOrient (ExtrVec Ename / e b) (setq e (entget Ename) b (trans (cdr (assoc 10 e)) Ename ExtrVec) e (subst (cons 10 b)(assoc 10 e) e) e (subst (cons 50 0.0)(assoc 50 e) e) e (subst (cons 210 ExtrVec)(assoc 210 e) e) ) (entmod e) ) ; =========================================================================================== ; (princ)
  24. Co do bloków. Blokiem jest łatwiej operować: obrót, obrót 3d, skalowanie itp. Ma punkt bazowy, a definicja bloku determinuje kierunki, orientację itp. Ponadto ma nazwę, więc wybór profilu nie jest przypadkowy. Narysowana każdorazowo polilinia może nie spełniać zawsze wszystkich warunków.