kojacek

Użytkownik forum
  • Postów

    236
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    26

Treść opublikowana przez kojacek

  1. Nie ma technicznych przeszkód, uniemożliwiających dołączenie kolejnej opcji typu Edytuj (pozwalającej zmienić dane istniejącego wymiaru XDIM), wydaje się jednak że powinno to odpowiadać rzeczywistemu zapotrzebowaniu użytkowników. Myślę że, jeśli zachodzi (nawet rzadko) taka konieczność, łatwiej jest [1] uzgodnić wymiar, lub [2] usunąć stary i narysować nowy. Chyba że istnieje takie zapotrzebowanie - wtedy można rozważyć rozszerzenie narzędzia. Początkowo przecież myślałem że te zabawy z wymiarem są jakąś marginalną i niszową sprawą, a okazało się że rozwiązanie może być przydatne. Co cieszy :)
  2. Wymiary XDIM po przeskalowaniu nie zmieniają wartości. Opcja Aktualizuj polecenia -XDIM, nadaje wymiarowi poprawną wartość (współczynnik / stała). Aby nadać nową wartość (współczynnik / stała) wymiarowi XDIM, można użyć opcji Uzgodnij, pobierając dane z innego wymiaru.
  3. Zatem papróbujta teraz. Zmiany: Zmienione zgłoszenie przy podaniu współczynnika Pobieranie ilości miejsc po przecinku ze stylu rysowanego wymiaru Poprawione działanie skalowania - bez względu na współczynnik skali w stylu wymiarowania, XDIM uwzględnia tylko rzeczywistą długość wymiaru Nadal bez obsługi błędów... ; =========================================================================================== ; ; XDim.lsp by kojacek ; ver. 16-06-2014 ; Wymaga biblioteki: CADPL-Pack-v1.lsp <http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html> ; =========================================================================================== ; (if (not cd:ACX_ADoc)(load (findfile "CADPL-Pack-v1.lsp"))) ; ------------------------------------------------------------------------------------------- ; (defun C:-XDIM (/ m k) (setq m (_MsgData t) k (cd:USR_GetKeyWord (strcat "\nWymiar skażony " m) '("Rysuj" "Uzgodnij" "Aktualizuj" "Przywróć" "uStawienia" "Wyjdź") (if (not *XDIMDATA*) "Rysuj" (caddr *XDIMDATA*)) ) ) (cond ( (= k "Wyjdź")(princ "\nAnulowano. ")) ( (= k "Rysuj")(C:XDIM)) ( (= k "Uzgodnij")(C:XDIMMAT)) ( (= k "Aktualizuj")(C:XDIMREG)) ( (= k "uStawienia") (_SetupDim)) ( (= k "Przywróć")(C:XDIMRES)) (t (princ "\nAnulowano. ")) ) (if (/= k "Wyjdź") (setq *XDIMDATA* (if *XDIMDATA* (list (car *XDIMDATA*)(cadr *XDIMDATA*) k) ) ) ) (princ) ) ; ------------------------------------------------------------------------------------------- ; (defun C:XDIMRES ()(_RestoreTextDim 0)(princ)) (defun C:XDIMREG ()(_RestoreTextDim 1)(princ)) (defun C:XDIMMAT ()(_MatchDim)(princ)) (defun C:XDIM ()(_DrawDynDim)(princ)) ; ------------------------------------------------------------------------------------------- ; (defun _MsgData (Val / s) (setq s (cdr (assoc 271 (entget (tblobjname "DIMSTYLE" (getvar "DIMSTYLE")))))) (if (listp Val) (strcat "(Stała = " (cd:CON_Real2Str (cdr (assoc 1040 Val)) 2 s) " / Współczynnik = " (cd:CON_Real2Str (cdr (assoc 1041 Val)) 2 s) ")" ) (if *XDIMDATA* (strcat "(Stała = " (cd:CON_Real2Str (car *XDIMDATA*) 2 s) " / Współczynnik = " (cd:CON_Real2Str (cadr *XDIMDATA*) 2 s) ")" ) "(Brak ustawień)" ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _SetupDim (/ s m l k) (setq s (null (ssget "_x" '((0 . "DIM*") (-3 ("xDimTextReplacment"))))) m (_MsgData T) l (if (= m "(Brak ustawień)")'("Zmień") '("Zmień" "Resetuj")) k (cd:USR_GetKeyWord (strcat "\nUstawienia wymiaru skażonego " m ": ") (if s (append l '("Wyjdź"))(append l '("Pobierz z wymiaru" "Wyjdź"))) "Wyjdź" ) ) (cond ( (= k "Wyjdź")(princ "\nAnulowano. ")) ( (= k "Zmień")(setq *XDIMDATA* nil)(_SetGlobalData "uStawienia")) ( (= k "Resetuj")(setq *XDIMDATA* nil)) ( (= k "Pobierz")(_FromDimData)) (t (princ "Anulowano. ")) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _FromDimData (/ i) (if (null (setq i (_GetSourceDim))) nil (progn (setq i (car i)) (setq *XDIMDATA* (list (cdr (assoc 1040 i))(cdr (assoc 1041 i))(caddr *XDIMDATA*) ) ) (princ (strcat "\nUstawienia: " (_MsgData t))) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _MatchDim (/ i e d m sel en x) (if (null (setq i (_GetSourceDim))) nil (progn (setq e (last i) d (car i) m (_MsgData d) ) (redraw e 3) (while (and (setq sel (entsel (strcat "\n" m " Wybierz wymiar docelowy: "))) (not (null (setq en (car sel)))) (= (cdr (assoc 0 (entget en))) "DIMENSION") ) (_PutXDimData en (cdr (assoc 1040 d))(cdr (assoc 1041 d))) (setq x (cdr (cd:XDT_GetXData en "xDimTextReplacment"))) (_UpdateDimText nil en (cdr (assoc 1040 x))(cdr (assoc 1041 x))) (princ "Uzgodniono wymiar. ") ) (redraw e 4) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _GetSourceDim (/ sel e d) (while (and (setq sel (entsel "\nWybierz wymiar źródłowy: ")) (not (null (setq e (car sel)))) (not (setq d (cdr (cd:XDT_GetXData e "xDimTextReplacment")))) ) ) (cond ( (not e) (princ "Nic nie wskazano. ") nil) ( (not d) (princ "Niewłaściwy obiekt. ") nil) (t (list d e)) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _RestoreTextDim (Mode / sel e d) (while (and (setq sel (entsel "\nWybierz wymiar: ")) (not (null (setq e (car sel)))) ) (if (setq d (cdr (cd:XDT_GetXData e "xDimTextReplacment"))) (progn (cond ( (= Mode 0)(_UpdateDimText t e nil nil)) ( (= Mode 1)(_UpdateDimText nil e (cdr (assoc 1040 d))(cdr (assoc 1041 d)))) (t nil) ) (princ (cond ( (= Mode 0) "Przywrócono pierwotny wymiar. ") ( (= Mode 1) "Zaktualizowano wymiar. ") (t nil) ) ) ) (if (= (cdr (assoc 0 (entget e))) "DIMENSION") (princ "Wymiar nie jest skażony. ") (princ "To nie jest wymiar. ") ) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _UpdateDimText (Mode Ent Con Fac / d x s l n nd) (setq d (entget Ent) x (entget (tblobjname "DIMSTYLE" (cdr (assoc 3 d)))) s (cdr (assoc 271 x)) l (_GetDimLin x (cdr (assoc 42 d))) ) (if Mode (progn (cd:XDT_RemoveXData Ent "xDimTextReplacment") (setq nd (subst (cons 1 "")(assoc 1 d) d)) ) (setq n (+ Con (* Fac l)) nd (subst (cons 1 (cd:CON_Real2Str n 2 s))(assoc 1 d) d) ) ) (entmod nd) ) ; ------------------------------------------------------------------------------------------- ; (defun _GetDimLin (Data Len / f) (setq f (cdr (assoc 144 Data)) f (if (not f) 1.0 f) ) (* (/ 1.0 f) Len) ) ; ------------------------------------------------------------------------------------------- ; (defun _PutXDimData (Ent VCon VFac) (cd:XDT_PutXData Ent "xDimTextReplacment" (list (cons 1040 VCon) (cons 1041 VFac) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _SetGlobalData (Key / v1 v2) (if (not *XDIMDATA*) (progn (initget (+ 1 2 4)) (if (setq v1 (getreal "\nPodaj stałą wymiaru: ")) (progn (initget (+ 1 2 4)) (setq v2 (getreal "\nPodaj współczynnik: ")) (setq *XDIMDATA* (list v1 (if (not v2) 1.0 v2)(if Key Key "Rysuj")) ) ) ) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _DrawDynDim (/ pt Cmd e el d n) (_SetGlobalData nil) (if (setq pt (getpoint "\nOkreśl początek pierwszej pomocniczej linii wymiarowej: ") ) (progn (setq Cmd (getvar "CmdEcho") e (entlast) ) (setvar "CmdEcho" 0) (command "_.DimLinear" pt) (setvar "CmdEcho" Cmd) (while (= 1 (logand (getvar "CmdActive") 1)) (command "\\") ) (if (eq (setq el (entlast)) e) (princ "Anulowano. ") (progn (_PutXDimData el (car *XDIMDATA*)(if (not (cadr *XDIMDATA*)) 1.0 (cadr *XDIMDATA*))) (setq d (cdr (cd:XDT_GetXData el "xDimTextReplacment"))) (_UpdateDimText nil el (cdr (assoc 1040 d))(cdr (assoc 1041 d))) ) ) ) (princ "Anulowano. ") ) ) ; ------------------------------------------------------------------------------------------- ; (princ "\nPolecenie -XDIM") (princ) Nowym kodem, należy zastąpić stary w całości.
  4. Masz rację - jest tak jak mówisz, to ja czegoś chyba nie dopatrzyłem, gdy sprawdzałem. Powtórnie przeanalizowałem i jest tak jak na malunku. Rozumiem tedy że powinno być zawsze tak: długość rzeczywista * współczynnik XDIM + stała XDIM Zatem to trzeba będzie poprawić. Druga rzecz to ilość miejsc po przecinku, tu wezmę ze stylu wymiarowania rzeczonego wymiaru, i trzecia - jeśli nie zdecydujecie inaczej, pozostanę przy niepomijaniu zer kończących. Tak?
  5. To można zrobić - ustawić tak jak ma styl wymiarowania. Inny problem w tej sytuacji to pomijanie zer kończących. Zwykle się je pomija, z tego co wiem przy tego typu "wymiarach skażonych", często się je zostawia. Więc powiedzcie jak to zrobić. Tylko ilość miejsc z wymiaru i niepomijanie zer (tak jak teraz) czy coś kombinujemy ponadto? Nie uważam tego za błąd - a wręcz przeciwnie. Wydaje mi się że użytkownik powinien zadbać o to aby wymiarować XDIM-em, wykorzystując styl bez skalowania długości. Albowiem sytuacja gdzie, rzeczywista długość jest już mnożona jednym współczynnikiem (ze stylu), a następnie kolejny raz mnożona przez nastawy użytkownika (w XDIM) może rodzić niejednoznaczności. Dlatego, jako zasadę przyjmuję że styl dla XDIM powinien mieć z natury współczynnik 1. Ale - jeśli uważacie że powinno się to zmienić - popatrzę ewentualnie jak to zmienić.
  6. Jestem nieprzekonany jeszcze bardziej... ;) Wrzuć proszę (jeśli to nie problem) nawet ten jeden mały malunek (dwg) który pokazałeś na zrzutach. Jeżeli jest tak jak się domyślam, to w wolnej chwili spróbuję zrobić proste narzędzie, ilustrujące to o czym mówię. Jak się uda tak jak o tym myślę, potestujemy i zobaczymy co dalej.
  7. W mojej opinii nie. Mało tego, uważam że nie jest to dobry pomysł, w żadnej formie, a ten przedstawiony na obrazkach jest przykładem wręcz, jak tego nie robić. Uważam że powielanie tych samych danych, jest niepotrzebne a nawet szkodliwe. Domyślam się że "szpilki" mają osobne atrybuty na warstwie niedrukowalnej, wypełnione tymi danymi. Zastanówmy się co się będzie dziać gdy takich samych okiem mamy 100, i (nadal jednakowych) drzwi 200? Ano - mamy do każdego takiego samego (powtarzam) elementu dodatkowych 8 linii tekstu o takiej samej treści. Czas zadać pytanie - po co? Zasadą powinno być jedynie odwołanie do jednego miejsca (np. Xrecord, w danych niegraficznych). Tych danych w rysunku (dla mojego przykładu) byłyby wtedy 2 typy 1 x okno + 1 x drzwi... zamiast 300 (100 okien + 200 drzwi)... Wystarczy zdefiniować polecenie do "odpytania" wymiaru/okna/drzwi/czegokolwiek...
  8. No fakt, czasem można nie zauważyć, bowiem bajer jest o tyle chytry że, pojawia się jedynie gdy można go zastosować... Gdy w rysunku nie ma żadnych wymiarów skażonych, bajer nie jest widoczny... :)
  9. Aktualna stała i współczynnik, wykorzystywane są do bieżącego rysowania wymiarów i są w rysunku rzeczą ulotną. Po utworzeniu wymiaru dane są przypięte do obiektu. Po zamknięciu dokumentu, i ponownym otwarciu, konieczne jest ponowne ustawienie parametrów do rysowania, natomiast istniejące wymiary "pamiętają" swoje nastawy. W celu ustawienia parametrów do rysowania w oparciu o istniejące obiekty służy opcja Pobierz z wymiaru, w Ustawieniach. Pozwala to rysować skażone wymiary, z takimi samymi danymi co wymiar wskazany, po godzinie, miesiąciu, czy roku... ;)
  10. 1) W poprzedniej wersji (zapomnijmy o niej na marginesie) rzeczywiście zamiast współczynnika można było podać ENTER (domyślnie 1). W tej usunąłem ten mechanizm i wymagane jest podanie zawsze wartości. Pozostał jedynie poprzedni monit, które trzeba będzie poprawić - to moje niedopatrzenie. Chyba że chcecie w tej wersji mieć poprezdnie rozwiązanie. Decydujcie. 2) Należy odróżnić dwie opcje AKTUALIZUJ i UZGODNIJ. Pierwsza ma zastosowanie do wymiaru (zawsze skażonego) ale takiego, który w wyniku jakiejś edycji został zmieniony (np. rozciągnięty uchwytami). Program pobiera jego dane (współczynnik i stałą), ponownie odczytuje jego rzeczywistą długość, uwzględnia te dane i zmienia tekst wymiaru (aktualizuje) na oczekiwany. Druga zaś opcja ma zastosowanie w przypadku gdy w rysunku mamy wymiary o różnych współczynnikach (albo stałych). Pozwala ona przenościć te cechy (uzgadniać) z jednego wymiaru na drugi.
  11. Zatem jest już coś, co działa chyba dobrze. Brakuje jeszcze obsługi błędów, ale to zawsze na koniec po testach, najlepiej dodać. Przede wszystkim na początek: 1) Potrzebna jest bliblioteka CADPL-Pack, którą można pobrać stąd: http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html 2) Powinna ona znajdować się w ścieżce poszukiwań 3) Kod należy skopiować do pliku (XDim.lsp) i załadować 4) Dostępne jest główne polecenie -XDIM (oraz dla wygody polecenia: XDIM, XDIMRES, XDIMREG, XDIMMAT 5) Program testowany przezemnie na AutoCAD-zie, zatem nie ma pewności, czy w całości tak będzie pod ZwCAD. Mam nadzieję że tak. Testujcie. Wywołując polecenie -XDIM, macie do wyboru wiele opcji. Działanie ich wszystkich jest (mam nadzieję) intuicyjne. Poniżej kod: ; =========================================================================================== ; ; XDim.lsp by kojacek ; 11-06-2014 ; Wymaga biblioteki: CADPL-Pack-v1.lsp <http://forum.cad.pl/cadpl-pack-v1-lsp-t78161.html> ; =========================================================================================== ; (if (not cd:ACX_ADoc)(load (findfile "CADPL-Pack-v1.lsp"))) ; ------------------------------------------------------------------------------------------- ; (defun C:-XDIM (/ k) (setq m (_MsgData t)) (setq k (cd:USR_GetKeyWord (strcat "\nWymiar skażony " m) '("Rysuj" "Uzgodnij" "Aktualizuj" "Przywróć" "uStawienia" "Wyjdź") (if (not *XDIMDATA*) "Rysuj" (caddr *XDIMDATA*)) ) ) (cond ( (= k "Wyjdź")(princ "\nAnulowano. ")) ( (= k "Rysuj")(C:XDIM)) ( (= k "Uzgodnij")(C:XDIMMAT)) ( (= k "Aktualizuj")(C:XDIMREG)) ( (= k "uStawienia") (_SetupDim)) ( (= k "Przywróć")(C:XDIMRES)) (t (princ "\nAnulowano. ")) ) (if (/= k "Wyjdź") (setq *XDIMDATA* (if *XDIMDATA* (list (car *XDIMDATA*)(cadr *XDIMDATA*) k) ) ) ) (princ) ) ; ------------------------------------------------------------------------------------------- ; (defun C:XDIMRES ()(_RestoreTextDim 0)(princ)) (defun C:XDIMREG ()(_RestoreTextDim 1)(princ)) (defun C:XDIMMAT ()(_MatchDim)(princ)) (defun C:XDIM ()(_DrawDynDim)(princ)) ; ------------------------------------------------------------------------------------------- ; (defun _MsgData (Val) (if (listp Val) (strcat "(Stała = " (cd:CON_Real2Str (cdr (assoc 1040 Val)) 2 2) " / Współczynnik = " (cd:CON_Real2Str (cdr (assoc 1041 Val)) 2 2) ")" ) (if *XDIMDATA* (strcat "(Stała = " (cd:CON_Real2Str (car *XDIMDATA*) 2 2) " / Współczynnik = " (cd:CON_Real2Str (cadr *XDIMDATA*) 2 2) ")" ) "(Brak ustawień)" ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _SetupDim (/ l m k s) (setq s (null (ssget "_x" '((0 . "DIM*") (-3 ("xDimTextReplacment"))))) m (_MsgData T) l (if (= m "(Brak ustawień)")'("Zmień") '("Zmień" "Resetuj")) k (cd:USR_GetKeyWord (strcat "\nUstawienia wymiaru skażonego " m ": ") (if s (append l '("Wyjdź"))(append l '("Pobierz z wymiaru" "Wyjdź"))) "Wyjdź" ) ) (cond ( (= k "Wyjdź")(princ "\nAnulowano. ")) ( (= k "Zmień")(setq *XDIMDATA* nil)(_SetGlobalData "uStawienia")) ( (= k "Resetuj")(setq *XDIMDATA* nil)) ( (= k "Pobierz")(_FromDimData)) (t (princ "Anulowano. ")) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _FromDimData (/ i) (if (null (setq i (_GetSourceDim))) nil (progn (setq i (car i)) (setq *XDIMDATA* (list (cdr (assoc 1040 i))(cdr (assoc 1041 i))(caddr *XDIMDATA*) ) ) (princ (strcat "\nUstawienia: " (_MsgData t))) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _MatchDim (/ i e d m sel en x) (if (null (setq i (_GetSourceDim))) nil (progn (setq e (last i) d (car i) m (_MsgData d) ) (redraw e 3) (while (and (setq sel (entsel (strcat "\n" m " Wybierz wymiar docelowy: "))) (not (null (setq en (car sel)))) (= (cdr (assoc 0 (entget en))) "DIMENSION") ) (_PutXDimData en (cdr (assoc 1040 d))(cdr (assoc 1041 d))) (setq x (cdr (cd:XDT_GetXData en "xDimTextReplacment"))) (_UpdateDimText nil en (cdr (assoc 1040 x))(cdr (assoc 1041 x))) (princ "Uzgodniono wymiar. ") ) (redraw e 4) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _GetSourceDim (/ sel e d) (while (and (setq sel (entsel "\nWybierz wymiar źródłowy: ")) (not (null (setq e (car sel)))) (not (setq d (cdr (cd:XDT_GetXData e "xDimTextReplacment")))) ) ) (cond ( (not e) (princ "Nic nie wskazano. ") nil) ( (not d) (princ "Niewłaściwy obiekt. ") nil) (t (list d e)) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _RestoreTextDim (Mode / sel e) (while (and (setq sel (entsel "\nWybierz wymiar: ")) (not (null (setq e (car sel)))) ) (if (setq d (cdr (cd:XDT_GetXData e "xDimTextReplacment"))) (progn (cond ( (= Mode 0)(_UpdateDimText t e nil nil)) ( (= Mode 1)(_UpdateDimText nil e (cdr (assoc 1040 d))(cdr (assoc 1041 d)))) (t nil) ) (princ (cond ( (= Mode 0) "Przywrócono pierwotny wymiar. ") ( (= Mode 1) "Zaktualizowano wymiar. ") (t nil) ) ) ) (if (= (cdr (assoc 0 (entget e))) "DIMENSION") (princ "Wymiar nie jest skażony. ") (princ "To nie jest wymiar. ") ) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _UpdateDimText (Mode Ent Con Fac / d n nd) (setq d (entget Ent)) (if Mode (progn (cd:XDT_RemoveXData Ent "xDimTextReplacment") (setq nd (subst (cons 1 "")(assoc 1 d) d)) ) (setq n (+ Con (* Fac (cdr (assoc 42 d)))) nd (subst (cons 1 (cd:CON_Real2Str n 2 2))(assoc 1 d) d) ) ) (entmod nd) ) ; ------------------------------------------------------------------------------------------- ; (defun _PutXDimData (Ent VCon VFac) (cd:XDT_PutXData Ent "xDimTextReplacment" (list (cons 1040 VCon) (cons 1041 VFac) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _SetGlobalData (Key / v1 v2) (if (not *XDIMDATA*) (progn (initget (+ 1 2 4)) (if (setq v1 (getreal "\nPodaj stałą wymiaru: ")) (progn (initget (+ 1 2 4)) (setq v2 (getreal "\nPodaj współczynnik (lub ENTER): ")) (setq *XDIMDATA* (list v1 (if (not v2) 1.0 v2)(if Key Key "Rysuj")) ) ) ) ) ) ) ; ------------------------------------------------------------------------------------------- ; (defun _DrawDynDim (/ pt Cmd e el d n nd) (_SetGlobalData nil) (if (setq pt (getpoint "\nOkreśl początek pierwszej pomocniczej linii wymiarowej: ") ) (progn (setq Cmd (getvar "CmdEcho") e (entlast) ) (setvar "CmdEcho" 0) (command "_.DimLinear" pt) (setvar "CmdEcho" Cmd) (while (= 1 (logand (getvar "CmdActive") 1)) (command "\\") ) (if (eq (setq el (entlast)) e) (princ "Anulowano. ") (progn (_PutXDimData el (car *XDIMDATA*)(if (not (cadr *XDIMDATA*)) 1.0 (cadr *XDIMDATA*))) (setq d (cdr (cd:XDT_GetXData el "xDimTextReplacment"))) (_UpdateDimText nil el (cdr (assoc 1040 d))(cdr (assoc 1041 d))) ) ) ) (princ "Anulowano. ") ) ) ; ------------------------------------------------------------------------------------------- ; (princ "\nPolecenie -XDIM") (princ) Mówcie jak działa.
  12. Jak rozumiem, brak zainteresowania - nie ma potrzeby rozwijania tematu?
  13. A co powiecie na coś takiego? Rysując wymiar skażony dane (stała i współczynnik) przypisane są do wymiaru. Pozwala to mieć w rysunku różne wymiary z różnymi danymi. I teraz, takie polecenie -XDIM, ma następujące opcje: Rysuj - rysuje wymiar zmieniając tekst (tak jak wcześniejsze XDIM) Uzgodnij - przypisuje dowolnie wskazanym wymiarom ustawienia (stała i współczynnik) z wymiaru źródłowego. Aktualizuj - po rozciągnięciu wymiaru skażonego, pozwala go zaktualizować. Przywróć - usuwa "skażenie" - przywraca wymiar o długości normalnej Ustawienia - ustawienia współczynnika i skali Idziemy w tym kierunku?
  14. Nie ma potrzeby tworzenia wariantu polegającego na usuwaniu czekokolwiek. Wystarczy zdefiniować nowe polecenie np. XDIM2, w taki sposób: (defun C:XDIM2 ()(setq *XDIMDATA* nil)(C:XDIM)(princ)) Zaletą takiego rozwiązania jest wykorzystywanie wcześniej zdefiniowanej funkcji (polecenia) C:XDIM, bez niepotrzebnego kopiowania (w efekcie dublowania) kodu. Wbrew pozorom (rzekomej nieszkodliwości) ma to głęboki sens, w utrzymaniu spójności i "czystości" rozwiązań.
  15. Tak. Wystarczy w linii poleceń wpisać: (setq *XDIMDATA* nil) Ponowne wywołanie polecenia XDIM, odpyta o nowe dane. Oczywiście nowe ustawienia zadziałają tylko dla nowych wymiarów, Można pomysleć o jakimś reaktorze, dla takich wymiarów (aby nadać im dynamiki), ale chyba narzędzie jest zbyt niszowe, by się w to bawić (?) Edyta: Inna opcja to "przywiązanie" danych (współczynnika i stałej) do wymiaru. Taki zabieg pozwoliłby sprawdzić wartości i nawet je modyfikować.
  16. Zmień kod na poniższy i sprawdź teraz: ; ------------------------------------------------------------------------------------------- ; ; by kojacek 2014 ; ------------------------------------------------------------------------------------------- ; (defun C:XDIM (/ pt Cmd v1 v2 e el d n nd) (if (not *XDIMDATA*) (progn (initget (+ 1 2 4)) (setq v1 (getreal "\nPodaj stałą wymiaru: ") v2 (getreal "\nPodaj współczynnik (lub ENTER): ") ) (setq *XDIMDATA* (list v1 v2)) ) ) (if (setq pt (getpoint "\nOkreśl początek pierwszej pomocniczej linii wymiarowej: ") ) (progn (setq Cmd (getvar "CmdEcho") e (entlast) ) (setvar "CmdEcho" 0) (command "_.DimLinear" pt) (setvar "CmdEcho" Cmd) ; (command "'_.SetVar" "CmdEcho" Cmd) (while (= 1 (logand (getvar "CmdActive") 1)) (command "\\") ) (if (eq (setq el (entlast)) e) (princ "\nAnulowano. ") (progn (setq d (entget el) n (cdr (assoc 42 d)) n (* (if (not (cadr *XDIMDATA*)) 1 (cadr *XDIMDATA*)) n) n (+ (car *XDIMDATA*) n) nd (subst (cons 1 (rtos n 2 2))(assoc 1 d) d) ) (entmod nd) ) ) ) (princ "\nAnulowano. ") ) (princ) )
  17. Pobadajcie takiego lispa. Działa w ten sposób: Jeśli nie ma zdefiniowanej zmiennej globalnej *XDIMDATA*, prosi o podanie stałej (dodawanej do wymiaru) oraz współczynnika skalowania długości (tutaj można dać ENTER (wtedy bez współczynnika). Potem należy wskazać pierwszy punkt wymiaru, potem drugi. W konsekwencji malowany jest wymiar z nadpisanym tekstem wymiarowym o wartości WYMIAR x WSPÓŁCZYNNIK + STAŁA. Po załadowaniu lisp-a, polecenie XDIM ; ------------------------------------------------------------------------------------------- ; ; by kojacek 2014 ; ------------------------------------------------------------------------------------------- ; (defun C:XDIM (/ pt Cmd v1 v2 e el d n nd) (if (not *XDIMDATA*) (progn (initget (+ 1 2 4)) (setq v1 (getreal "\nPodaj stałą wymiaru: ") v2 (getreal "\nPodaj współczynnik (lub ENTER): ") ) (setq *XDIMDATA* (list v1 v2)) ) ) (if (setq pt (getpoint "\nOkreśl początek pierwszej pomocniczej linii wymiarowej: ") ) (progn (setq Cmd (getvar "CmdEcho") e (entlast) ) (setvar "CmdEcho" 0) (command "_.DimLinear" pt) (command "'_.SetVar" "CmdEcho" Cmd) (while (= 1 (logand (getvar "CmdActive") 1)) (command "\\") ) (if (eq (setq el (entlast)) e) (princ "\nAnulowano. ") (progn (setq d (entget el) n (cdr (assoc 42 d)) n (* (if (not (cadr *XDIMDATA*)) 1 (cadr *XDIMDATA*)) n) n (+ (car *XDIMDATA*) n) nd (subst (cons 1 (rtos n))(assoc 1 d) d) ) (entmod nd) ) ) ) (princ "\nAnulowano. ") ) (princ) ) Sprawdźcie czy działa...
  18. Jeśli dobrze zrozumiałem ZwCAD obsługuje FIELD-y ale (jednocześnie) nie obsługuje formuł? Jeśli zaś obsługuje, to proste narzędzie można przecież wykrzesać lisp-em, nieszczególnie skomplikowanym. Rozwiązanie które proponuję, właśnie dodaje dowolną wartość do (rzeczywistego) tekstu wymiarowego, w sposób dynamiczny (rozciągnięcie wymiaru nadąża za zmianami).
  19. Jeśli ZwCAD obsługuje obiekty typu FIELD, jest to jak najbardziej możliwe. W AutoCAD zrobiłem to tak: Utworzyłem obiekt tekstowy typu field, z przypisaną formułą typu 100 + <wartość wskazanego wymiaru>. Następnie, edytując ten wymiar, zamiast <> wprowadzam field z wartością tego tekstu. W efekcie wartość pokazywana przez wymiar pokazuje owe 100 + jego długość. Oczywiście edycja wymiaru uchwytami (rozciągnięcie) i regeneracja, nadążają za zmianami.
  20. Zależy w jakim banku masz (to konto)... ;) Jeżeli zaś chodzi o polilinie, jej długości etc. Tutaj jest parę różności: http://forum.cad.pl/wiczenie-lisp-lwpolyline-t74939.html O kątach segmentów nie ma chyba nic, niemniej uważny czytelnik na podstawie tej lektury powinien sobie z tym dać spokojnie radę. Przy sprawdzaniu kątów swgmentów, dodatkowo (dla tekstów) należy zwrócić uwagę, na ich prwidłową orientację. Przykładowo pionowy odcinek może mieć kąt 90 stopni, jak i 180, zatem powinno się je trakować tożsamo - tekst zaś powinien mieć w obu przypadkach jedną orientację. Zabawy (z obrotem) dowolnego wymiaru liniowego dobrze to ilustrują. kojacek
  21. Prawda i nie(cała)prawda. Rzeczywiście (i tu prawda) textbox ma zastosowanie tylko dla obiektów typu TEXT. Dla tekstów wielowieszowych zaś (obiekty MTEXT), vla-getboundingbox, zwraca ramkę określającą obszar samego obiektu (nie zaś obszar dla rzeczywistej treści). Przypadki gdy szerokość tekstu wielowierszowego jest wielokrotnie większa niźli szerokość jego treści, są dość powszechne. kojacek
  22. Zagadnienie nie jest szczególnie skomplikowane, oczywiście mówię o VisualLISP-ie: http://forum.cad.pl/autolisp-czytanie-strony-www-t80597.html kojacek
  23. Ja odniosłem takie wrażenie parę postów wcześniej, ale w odwrotną stronę... ;) Umówmy się jednak że rozróżnimy funkcjonalność programu od formatu pliku. W pełnym i LT tenże ostatni niczym się nie różni. Zatem nie ma o czym gadać. Na marginesie zaś - argument typu: "Wprawdzie u nas nie wszystko jest ok, aly wy Murzynów bijecie..." jest taki sobie... ;) Hmmm... a co co ja mam z tym wspólnego? Każdy może mieć zdanie na każdy temat. Ja uważam że zgodność powinna być jak najdalej idąca. Cały czas mówię o zgodności pliku, nie programów. To drugie to rzecz raczej wtórna według mnie. Jak wyżej, nie zgadzam się z taką opinią - jednak zbyt wiele trzeba by o tym mówić, a to nie jest ten temat. No i dotarlismy wreszcie do sedna. Opublikuj jakiś plik z tymi nowymi filtrami, z ciekawości pobadam jak to wygląda.kojacek
  24. 1) Moim zdaniem powinno wam zależeć na 100% zgodności zawsze, bowiem nie żyjecie tylko w swoim światku - prawdopodobnie pracujecie (czy spotkacie się) na plikach które mogą "przechodzić" przez różne aplikacje, poczawszy od AutoCAD-a, ZwCAD-y wszelkiej maści po wszystkie inne, zapisujące ogólnie dwg. Jak najszersza zgodność jest jak najbardziej pożądana. 2) Wobec powyzszej mojej opinii, wydaje mi się że brnięcie przez producenta ZwCAD-a, w filtry własnego pomysłu (ICAD_LAYERFILTERS) jest pomysłem złym. Zwłaszcza że funkcjonalnie, rozwiązaniem nie lepszym a jak widać raczej gorszym. Prędzej czy później (obawiam się że później jednak) przyjąć będzie musiał (powinien) jednak standard filtrów adesk-owy. 3) Póki co, (myslę że małym kosztem) możecie sobie wyLISPować coś na kształt nieudokumentowanego polecenia jakie jest w AutoCAD-zie, mianowicie +LAYER. Wygląda ono tak: czyli z listy dostępnych filtrów w aktualnym rysunku, tworzy listę słów kluczowych, a po wybraniu dowolnego z nich uruchamia menadzera warstw z włączonym określonym filtrem. LISP-owo wyglądać to może tak że wystarczy zrobić funkcję z argumentem w postaci nazwy filtra (jeden z istniejących w rysunku), która dokonywałaby zapisu w rejestrze i uruchamiała menadzera warstw. Sprawny LISP-acz mógły zrobić to pewnie w 10-15 minut. kojacek