gruzin

Użytkownik forum
  • Postów

    493
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    18

Treść opublikowana przez gruzin

  1. Jest pewna niezgodność w parametrach warstw: Dla testu taki kod: (defun c:ttt () (vl-load-com) (princ "\n*********************************************\n") (foreach % (mh:GetLayers "*") (setq MyLayer (vla-item (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))) %)) (princ (strcat % "\t layeron \t" (vl-princ-to-string (vla-get-layeron MyLayer)) "\n")) (princ (strcat % "\t lock \t" (vl-princ-to-string (vla-get-lock MyLayer)) "\n")) (princ (strcat % "\t freeze \t" (vl-princ-to-string (vla-get-freeze MyLayer)) "\n \n")) ) );defun Zwcad zwraca coś takiego: Natomiast Autocad: Moje pytanie jest takie: czemu Zwcad zwraca cyfry a nie opcje :vlax-false lub :vlax-true ?
  2. Pisanie stopnia każdy inżynier powinien mieć w malym paluszku. W każdym programie działa: - przy wciśniętym lewym "ALT" kolejno klawisze z klawiatury numerycznej "0" "1" "7" "6" - skrót %%d działa tylko w Zwcadzie (i innych cadach), nie korzystam bo Alt+0176 działa w każdym programie znak x lepiej wygląda pisany tak 2×45°, krzyżyk po środku to Alt+0215 (nie w każdej czcionce jest ten znak) --- więcej o skrótach można znaleźć w tablicy znaków windowsa (start/programy/akcesoria/narzędzia systemowe/tablica znaków)
  3. Wyszła nowa wersja nakładki PROFILEK (wersja z dnia 2012.01.22) zmiany w nowej wersji: * dodana mozliwość rysowania rur w [mm] lub [m], zmienione okienka dialogowe poleceń z paska "PROFILEK RURY" * dodane polecenie do generowania punktów charakterystycznych (współrzędnych punktów) na ZUD * dodano zapamietywanie zaznaczenia przy przesuwaniu widoku poleceniami paska "PROFILEK KOPIUJ/PRZESUŃ" - poprawiono zapamietywanie zmiennych odpowiedzialnych za zmianę skali rysowanego poziomu terenu z klikanych punktów na rzutach lub PZT - poprawiona obsługa zmiennych lokalnych wszystkich poleceń z paska "PROFILEK RURY" - przepisane od nowa polecenie do poprawiania parametrów warstw z programów InstaSoftu (zmieniony Lisp na VisualLisp i przyspieszenie działania polecenia) - przepisane od nowa polecenie do zmiany koloru warstw typu: "Druk" lub "Praca", do drukowania bez styli wydruków (zmieniony Lisp na VisualLisp i przyspieszenie działania polecenia) - poprawiono wyświetlanie slajdów w poleceniach do wstawiania bloków (teraz nie musza byc zrobione slajdy ze wszystkich plików, żeby mozliwe było wyświetlenie podglądu) Paski nakładki wyglądają teraz tak: Wersja testowa (30 dni) nakładki do ściągnięcia na stronie: http://www.profilek.net Na stronie zaktualizowałem również opis wszystkich poleceń nakładki.
  4. Pięknie działa (chociaż trochę wolno i inaczej niż w AC). Po moich poprawkach w funkcji SetByLayer kod wygląda tak: (defun c:SetByLayer (/ lista_z_1 lista_z_ss) (foreach blk (jk:BLK_GetBlocks nil) (setq lista_z_1 (jk:BLK_Get-DefEnt blk nil)) (foreach % lista_z_1 (cd:ENT_SetDXF % 62 256)(cd:ENT_SetDXF % 370 -1)) ) (setq lista_z_ss (zk:SSZbr->List (ssget "_x" (list (cons 0 "INSERT"))))) (foreach % lista_z_ss (foreach %1 (jk:BLK_Get-InsAtts %) (progn (cd:ENT_SetDXF %1 62 256)(cd:ENT_SetDXF %1 370 -1))) ) (setq lista_z_ss (zk:SSZbr->List (ssget "_x"))) (foreach % lista_z_ss (cd:ENT_SetDXF % 62 256)(cd:ENT_SetDXF % 370 -1) ) (command "_regen") ) ;;--------------------------------=={ jk:BLK_GetBlocks }==----------------------------------;; ;; Autor: Jacek Kożuszek, www.kojacek.republika.pl ;; ;; Funkcja zwraca liste blokow (bez xref, zaleznych od xref, anonimowych wymiarow i tabel) ;; ;; Argument [mode] jesli T - dodatkowo bloki anonimowe *U... ;; ;;------------------------------------------------------------------------------------------;; ;; (jk:BLK_GetBlocks nil) ;| lub |; (jk:BLK_GetBlocks T) ;; ;;------------------------------------------------------------------------------------------;; (defun jk:BLK_GetBlocks (mode / bl res m %) (setq m "`*D*,`*X*,`*T*,*|*" bl (tblnext "BLOCK" T) ) (while bl (setq % (cdr (assoc 2 bl))) (if (not (wcmatch % (if mode m (strcat "`*U*," m)) ) ) (setq res (append res (list %))) ) (setq bl (tblnext "BLOCK")) ) res ) ; =========================================================================================== ; ; Zwraca liste ename obiektow definicji bloku okreslonego typu lub wszystkich gdy nil ; =========================================================================================== ; (defun jk:BLK_Get-DefEnt (Name EntType / en ed res) (setq en (tblobjname "BLOCK" Name)) (while (and (setq en (entnext en)) (setq ed (entget en)) (/= "ENDBLK" (cdr (assoc 0 ed))) ) (if (if EntType (= (cdr (assoc 0 ed))(strcase EntType)) (cdr (assoc 0 ed)) ) (setq res (cons (cdr (assoc -1 ed)) res ) ) ) ) res ) ; =========================================================================================== ; ; zwraca liste ename atrybutow wstawionego bloku ; ; =========================================================================================== ; (defun jk:BLK_Get-InsAtts (InsEnt / en ed res) (setq en InsEnt) (while (and (setq en (entnext en)) (setq ed (entget en)) (/= "SEQEND" (cdr (assoc 0 ed))) ) (if (= (cdr (assoc 0 ed)) "ATTRIB") (setq res (cons (cdr (assoc -1 ed)) res ) ) ) ) res ) (defun zk:SSZbr->List (ssZbr / % lista) (repeat (setq % (sslength ssZbr)) (setq % (1- %) lista (cons (ssname ssZbr %) lista)) ) ) ; =========================================================================================== ; ; Zmiana danych DXF obiektu / Set the DXF data of object ; ; Ename [ENAME] - nazwa elementu / entity name ; ; Code [iNT] - kod pary DXF / code of dotted pair ; ; Val [list/INT/REAL/STR/ENAME] - wartosc / value ; ; ------------------------------------------------------------------------------------------- ; ; (cd:ENT_SetDXF (entlast) 70 129) ; ; =========================================================================================== ; (defun cd:ENT_SetDXF (Ename Code Val / dt new) (setq new (if (not (assoc Code (setq dt (entget Ename)))) (append dt (list (cons Code Val))) (subst (cons Code Val) (assoc Code dt) dt ) ) ) (entmod new) )
  5. No własnie. A takich plików do wyczyszczenia jest 12 sztuk. Codziennie. Funkcja SETBYLAYER jest do tego idealna. Wieczorkiem zobacze te funkcje na ZW. Dzięki W AC używam czegoś takiego (trochę prymitywne ale nie ma zbędnego klikania) i plik jest zdatny do użycia: (defun c:ppp () (command "_-SCALELISTEDIT" "_r" "_y" "_e") (command "_setbylayer" "_all" "" "_y" "_y") (command "_audit" "_y") (command "_purge" "_a" "" "_n") (command "_save" "" "_y") (command "_close") )
  6. Swoją droga nie wiedziałem że można vlx podczytać do AWCADA dopuki nie spróbowałem.
  7. Przykładowo pracuję teraz w pliku do którego podczytuję jako 12 plików (jeden z nich w załączniku) jako odnośniki. Codziennie dostaję nowe wersje tych 12 plików i muszę je codziennie obrobić (wyczyścic, naprawić, usunąć zbędne skale i zrobić wszystko JAK WARSTWA aby po podczytaniu móc zmieniać kolory i grubości warstw odnośników). Zrobiłem sobie oczywiście lispa który to za mnie robi, ale w ZW nie ma funkcji SETBYLAYER i musze to robić na innym kompie na którym jest taka funkcja. OBR_PB_ZAM_+3.dwg
  8. Niedokładnie się wyraziłem. Chodzi mi o zmianę właściwości obiektów wewnątrz bloków. W SETBY LAYER w AC jest taka opcja. jeżeli w pliku który podczytuje jako odnośnik (Xref) jest kilkaset takich kolorowych bloków to ciężko się odnaleźć bez SETBYLAYER.
  9. Assgarth a dużo to roboty żeby hurtowo lispem pozmieniac definicie blokow na jak warstwa? Jak dla mnie to kolor i grubośc linii wystarczy. stylu linii nigdy nie poprawiam bo wole żeby był taki jak u architekta, nawet jak jest narzucony recznie?
  10. Żadna z tych metod nie jest tak dobra jak oryginalne SETBYLAYER W oryginale działa to tak że możemy zmienic na "jakwarstwa" w wybranych elementach określone cechy np kolor, grubość itp. Najlepsze jest to że wewnątrz bloków również wszystkie elementy zmieniają się na JAKWARSTWA. Jest to konieczne jeżeli podczytujemy sobie plik dwg jako Xref i chcemy nadać warstwom tego pliku określone cechy np szary kolor podkładu od architekta. Jeżeli architekt nadał ścianom kolor np czerwony (ścianom a nie warstwie) to u nas w pliku nie da się tego zmienić bez poprawy pliku np poleceniem SETBYLAYER. Zwcad 2012 ma kilka pochodnych funkcji SETBYLAYER w narzędziach "Express" -> "Block"
  11. Chciałem to mieć w jakiejś liście entityname bo zamierzam coś pokombinować z tworzeniem bloków (jeszcze programowo tego nie robiłem ale niedługo przyjdzie na to pora)
  12. Mam w swojej nakładce funkcje która zmienia widok o określona wielkośc w lewo prawo itp. Robiąc projekt budowlany budynku wielokondygnacyjnego muszę szybko przełączać widok między kondygnacjami. To juz miałem więc mogłem szybko sprawdzać czy na kondygnacjach pokrywaja sie szachty instalacyjne, kanalizacyjne itp. Miałem tez funkcję do kopiowania o określoną odległość (czyli między kondygnacjami). Teraz mogę przesuwając widok z kondygnacji na kondygnację zaznaczyć jakies elementy i np je skasować razem lub zrobić z nich blok lub grupę i przesuwać wspólnie na wszystkich pietrach.
  13. użyj tego - przed uzyciem zaznacz elementy lub nie (defun c:aaa ( / widok pozx pozy pozz MHSelMember) (setq MHSelMember (mh:SYS_GetSelection)) ;(mh:ustzap) (setq widok (getvar "VIEWCTR") pozx (nth 0 widok) pozy (nth 1 widok) pozz (nth 2 widok) pozy (+ pozy 100.0)) (command "_.zoom" "_c" (list pozx pozy pozz) "") ;(mh:ustprzywr) (mh:SYS_SetSelection MHSelMember) );defun
  14. Mam juz i działa ;========================================================================= (defun mh:SYS_GetSelection () ;Zwraca listę Entity Name zaznaczonych obiektów lub nil jeżeli nic nie było zaznaczone (if (not (= nil (ssget "I"))) (zk:LST_SS->List (ssget "I")) nil ) ) ;========================================================================= ;========================================================================= (defun mh:SYS_SetSelection ( listEN /) ;listEN - lista entity name (if (not (= nil listEN)) (sssetfirst nil (mh:List->LST_SS listEN)) ) ) ;========================================================================= ;========================================================================= ; Ze zbioru SS-GET tworzy listę Entity Name (defun zk:LST_SS->List (SSsel / % listEName) (repeat (setq % (sslength SSsel)) (setq % (1- %) listEName (cons (ssname SSsel %) listEName) ) ) ) ;========================================================================= ;========================================================================= ; Ze listy Entity Name tworzy zbiór wskasań SSGet (defun mh:List->LST_SS (listEName / % SSzbior) (setq SSzbior (ssadd)) (repeat (setq % (vl-list-length listEName)) (setq % (1- %)) (ssadd (nth % listEName) SSzbior) ) SSzbior ) ;========================================================================= Wywołanie tego np. tak: (setq MHSelMember (mh:SYS_GetSelection)) ;zaznaczenie elementów (mh:SYS_SetSelection MHSelMember) ; przywrócenie zaznaczenia
  15. mam tyle: ;========================================================================= (defun c:aaa () (setq temp (zk:LST_SS->List (ssget))) ) (defun c:bbb () (sssetfirst nil (mh:List->LST_SS temp)) ;(mh:List->LST_SS temp) ) ;========================================================================= ; Ze zbioru SS-GET tworzy listę Entity Name (defun zk:LST_SS->List (SSsel / % listEName) (repeat (setq % (sslength SSsel)) (setq % (1- %) listEName (cons (ssname SSsel %) listEName) ) ) ) ;========================================================================= ;========================================================================= ; Ze listy Entity Name tworzy zbiór wskasań SSGet (defun mh:List->LST_SS (listEName / % SSzbior) (setq SSzbior (ssadd)) (repeat (setq % (vl-list-length listEName)) (setq % (1- %)) (ssadd (nth % listEName) SSzbior) ) SSzbior ) ;========================================================================= mysle nad wykozystaniem ssget bo vla-get-ActiveSelectionSet jakoś nie dam rady
  16. hmmm. Te dwie funkcje sa identyczne. Teraz robota się zwaliła, wieczorkiem to dokładniej przeanalizuje.
  17. Udzielił, musze tylko przemysleć sobie jak zrobić dobrze dwie funcje 1. zapamiętującą co jest aktualnie zaznaczone i czy czy wogule jest coś zaznaczone 2. przywracającą zaznaczenie o ile takie było
  18. Prubuję uporac się z zaznaczeniami w lispie. 1. Wybieram zaznaczone elementy: (vl-load-com) (setq mh_CadObj (vlax-get-acad-object)) (setq mh_acd_doc (vla-get-activedocument mh_CadObj)) (setq mh_activselection (vla-get-ActiveSelectionSet mh_acd_doc)) 2. wykonuje dalszą cześć funkcji w lispie 3. Chciałbym aby po wykonaniu polecenia przywrócić zaznaczenie. Da się to jakoś zrobić? Mógłby mnie ktoś nakierować, czego i gdzie szukać, jakiej funkcji użyć?
  19. Start udno i endundo mam w funkcjach : (mh:ustzap) (mh:ustprzywr) tutaj jako komentarz z zamknięciem pliku i ESC coś jeszcze podumam.
  20. dziękli za uwagi zmieniłem trochę inaczej: ;============================================================= (setq mh_textstyles (vla-get-textstyles mh_acd_doc)) ;============================================================= (if (null (tblsearch "Style" "IS_SIMPLEX")) (progn (setq newtextstyle (vla-add mh_textstyles "IS_SIMPLEX")) (vla-put-fontfile newtextstyle "simplex.shx") (vla-put-width newtextstyle 0.7) );progn (setq newtextstyle (vla-item mh_textstyles "IS_SIMPLEX")) );if (vla-put-activetextstyle mh_acd_doc newtextstyle) ;============================================================= ;============================================================= (setq mh_LayerTable (vla-get-layers mh_acd_doc)) ;============================================================= (if (null (tblsearch "Layer" "IS_Opis_Znaczników")) (progn (setq newlayer (vla-add mh_LayerTable "IS_Opis_Znaczników")) (vla-put-Color newlayer 41) (vla-put-LineType newlayer "Continuous") (vla-put-LineWeight newlayer 13) ) (setq newlayer (vla-item mh_LayerTable "IS_Opis_Znaczników")) );if (vla-put-activeLayer mh_acd_doc newlayer) ;=============================================================
  21. Jakby ktoś chciał to cała procedura do przetestowania poniżej: (defun c:mh_xyz( / mh_CadObj mh_acd_doc mh_model_space mh_textstyles newtextstyle mh_LayerTable newlayer WSKAZ_PUNKT PrefixPunktu WSPÓŁRZEDNA_Y WSPÓŁRZEDNA_X LINIA Numer NazwaPlikuTxt ZnacznikPunktu WysZnacznika PlikTxt WysText) ;(mh:ustzap) ;========================================================================= ; PODFUNKCJE (defun mh:PiszText ( / PunktTextu newtext ) (setq PunktTextu (polar WSKAZ_PUNKT (* pi 0.25) (* WysZnacznika 0.7))) (vla-AddText mh_model_space (strcat PrefixPunktu "-" (itoa Numer)) (vlax-3d-point PunktTextu) WysText) (entupd (entlast)) ;odświeżenie teksty, żeby był widoczny (to błąd zwcada, w AC jest widoczny od razu) );defun (defun mh:RysujPunkt (/ p1 p2 p3 p4) (setq p1 (polar WSKAZ_PUNKT (* pi 0.5) WysZnacznika) p2 (polar WSKAZ_PUNKT (* pi 1.5) WysZnacznika) p3 (polar WSKAZ_PUNKT 0.0 WysZnacznika) p4 (polar WSKAZ_PUNKT pi WysZnacznika) ) (vla-AddLine mh_model_space (vlax-3d-point p1) (vlax-3d-point p2)) (vla-AddLine mh_model_space (vlax-3d-point p3) (vlax-3d-point p4)) );defun ;========================================================================= ;============================================================= (vl-load-com) (setq mh_CadObj (vlax-get-acad-object) mh_acd_doc (vla-get-activedocument mh_CadObj) mh_model_space (vla-get-ModelSpace mh_acd_doc) ) ;============================================================= (setq mh_textstyles (vla-get-textstyles mh_acd_doc)) ;============================================================= (if (null (tblsearch "Style" "IS_SIMPLEX")) (progn (setq newtextstyle (vla-add mh_textstyles "IS_SIMPLEX")) (vla-put-fontfile newtextstyle "simplex.shx") (vla-put-width newtextstyle 0.7) );progn );if (vla-put-activetextstyle mh_acd_doc newtextstyle) ;============================================================= ;============================================================= (setq mh_LayerTable (vla-get-layers mh_acd_doc)) ;============================================================= (if (null (tblsearch "Layer" "IS_Opis_Znaczników")) (progn (setq newlayer (vla-add mh_LayerTable "IS_Opis_Znaczników")) (vla-put-Color newlayer 41) (vla-put-LineType newlayer "Continuous") (vla-put-LineWeight newlayer 13) ) );if (vla-put-activeLayer mh_acd_doc newlayer) ;============================================================= (initget (+ 1 2 4)) (setq Numer (getint "\nPodaj numer pierwszego punktu:")) (setq WysText 90.0 ;wysokosc tekstu =90 PrefixPunktu (mh:GetChoisText "\Wybierz prefix punktu" '("S" "D" "SC" "G" "W") "S") WysZnacznika (* WysText 1.1) ; wielkość krzyża NazwaPlikuTxt (getfiled "Wpisz nazwe pliku z współrzędnymi punktów" "" "txt" 1) ZnacznikPunktu (mh:GetChoisText "\Czy wstawiać znacznik punktu?" '("Tak" "Nie") "Tak") PlikTxt (open NazwaPlikuTxt "W")) (WRITE-line (strcat "Nr" ";" "X" ";" "Y" ) PlikTxt) (while (setq WSKAZ_PUNKT (getpoint "\nWskaz punkt")) (setq WSPÓŁRZEDNA_Y (rtos (cadr WSKAZ_PUNKT) 2 2) WSPÓŁRZEDNA_X (rtos (car WSKAZ_PUNKT) 2 2) LINIA (strcat PrefixPunktu "-" (itoa Numer) ";" WSPÓŁRZEDNA_X ";" WSPÓŁRZEDNA_Y ) ) (WRITE-line LINIA PlikTxt) (if (= ZnacznikPunktu "Tak") (progn (mh:RysujPunkt) (mh:PiszText) ) (mh:PiszText) ) (setq Numer (1+ Numer)) );WHILE (close PlikTxt) ;(mh:ustprzywr) );defun (defun mh:GetChoisText (msg opcje DefVal / msg2 msg3 SelDist OutVal) ;========================================================================= ; msg = tekst zapytania ; opcje = LISTA tekstów możliwych do wyboru ; DefVal = wartość TEKSTU wybierana domyślnie ; example: (mh:GetChoisText "\nPodaj wartosc?" '("aaa" "bbb" "ccc" "ddd" "eee") "ddd") ;========================================================================= (setq msg2 "") (foreach % opcje (setq msg2 (strcat msg2 % " ")) );foreach (setq msg2 (substr msg2 1 (- (strlen msg2) 1))) ;usunięcie oststniej spacji (setq msg3 "") (foreach % opcje (setq msg3 (strcat msg3 % "/")) );foreach (setq msg3 (substr msg3 1 (- (strlen msg3) 1))) ;usunięcie oststniego ukośnika "/" (initget 0 msg2) (setq SelDist (vl-catch-all-apply 'getkword (list (strcat msg " [" msg3 "] <" DefVal ">: ")))) (if (not (vl-catch-all-error-p SelDist)) (progn (if SelDist (setq OutVal SelDist) (setq OutVal DefVal) );if );progn );if OutVal );defun mh:GetChoisText
  22. (entupd (entlast)) to jest dobre :-) dzięki za podpowiedź
  23. Tak, regen rozwiązuje problem, ale tylko częściowo. Funkcja rysuje po kliknięciu w kolejne punkty krzyżyk w tych punktach oraz "tekstem" wpisuje numer tego punktu (którego nie widać dopóki nie zrobi się regen). Jednocześnie do pliku tekstowego zapisywane są współrzędne punktów. Wywołanie regen na końcu nie spowoduje że w trakcie działania funkcji będą pojawiały sie teksty na ekranie, a regen po klknięciu kazdego punktu odpada. Chyba w tym przypadku zostanę przy tradycyjnym "command".
  24. Piszę program który w pewnym momencie wpisuje na modelu "text". Problem jest w tym że Zwcad nie wyswietla wstawionego tekstu dopuki nie odświezy sie rzutni (regen). Czy jest na to jakas rada? Jakieś odświeżenie tylko nowego textu, albo sposób na to aby byl od razu widoczny? Linie wstawiane podobnym sposobem wyświetlają sie od razu po wstawieniu. (vla-AddLine mh_model_space (vlax-3d-point p1) (vlax-3d-point p2)) ;ta linia jest widoczna od razu (defun mh:PiszText ( / PunktTextu newtext ) (setq PunktTextu (polar WSKAZ_PUNKT (* pi 0.25) (* WysZnacznika 0.7)) newtext (vla-AddText mh_model_space (itoa Numer) (vlax-3d-point PunktTextu) WysText)) );defun ;ten tekst widoczny dopiero po odświeżeniu rzutni
  25. Funkcję w której występował ten błąd przepisałem na visual lispa (bez command). Działa poprawnie i dużo szybciej.