kojacek

Użytkownik forum
  • Postów

    263
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    41

Treść opublikowana przez kojacek

  1. Zaczynamy zatem. Na początek ogólne uwagi. Nie wnikam w zasady działania nakładki wykonującej te zestawienia. Służą jedynie jako przykład. Niemniej uważam że, zastosowany przezeń model przechowywania pewnych danych, jest oględnie mówiąc zły. Z kilku powodów: Dane które nie są danymi graficznymi (lub nie są wymagane jako elementy rysunku (wymiary/opisy)) są powielane wielokrotnie. To "nieekonomiczne" i całkowicie bezużyteczne. Nadmiarowość tych samych informacji jest szkodliwa ze swej natury. Z uwagi na [1] dane mogą nie być spójne. Atrybuty w każdym wstawieniu bloku można w istocie przeedytować, w końcowym efekcie, traci się kontrolę nad tym które informacje są prawdziwe, aktualne, właściwe a które nie. Pomimo tego że, dane przechowywane są w edytowalnych atrybutach bloków, ich świadoma edycja jest utrudniona (np. zmiana jednego opisu), wymaga (aby uniknąć [2]) przeedytowania wszystkich wystąpień. "Atrybutyzacja" danych jest nieelastyczna. Sztywność polegająca na skończonej i ograniczonej liczbie atrybutów, nie pozwala na efektywne zarządzanie danymi. Przedstawię tutaj sposoby przechowywania i manipulacji danymi niegraficznymi (takimi są tutaj opisy "szpilek" stolarki) w miejscach do tego przeznaczonych. Kolejno wygląda to tak: W kopii rysunku STOLARKA.DWG, "wyczyściłem" wszystkie bloki "szpilek" ze zbędnych (w samej istocie przykładu) atrybutów. Inne atrybuty pozostawiłem (choć co do obecności niektórych mam swoje zdanie - ale to inna bajka). Malunek poniżej ilustruje jak to wygląda:
  2. Pozostawiając wątek wymiarów XDIM do dalszej ewentualnej dyskusji, powrócę do pobocznego tematu jaki się tutaj przy okazji pojawił. Na przykładzie rzutów architektonicznych, zaprezentowanych przez Martin_S'a, rozpoczęliśmy dyskusję na temat przechowywania danych (nierysunkowych) w rysunku. Aby nie zaśmiecać dyskusji wymiarowej, Administratora czy Moderatora proszę o założenie nowego wątku na ten temat. Następnie o przeniesienie doń tego, oraz postów #37-#41 z tego wątku. Gdy taki wątek powstanie, rychło przedstawię alternatywny (do przezentowanego) sposób zapisywania danych, wykorzystując do tego dane niegraficzne rysunkowej bazy danych. Według mnie sposób lepszy niż wielokrotne powielanie tych samych danych w atrybutach bloków. Manipulować danymi będziemy za pomocą (oczywiście) LISP-a.
  3. 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 :)
  4. 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.
  5. 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.
  6. 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?
  7. 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ć.
  8. 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.
  9. 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...
  10. 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... :)
  11. 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... ;)
  12. 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.
  13. 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.
  14. Jak rozumiem, brak zainteresowania - nie ma potrzeby rozwijania tematu?
  15. 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?
  16. 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ń.
  17. 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ć.
  18. 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) )
  19. 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...
  20. 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).
  21. 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.
  22. 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
  23. 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
  24. Zagadnienie nie jest szczególnie skomplikowane, oczywiście mówię o VisualLISP-ie: http://forum.cad.pl/autolisp-czytanie-strony-www-t80597.html kojacek
  25. wygląda znajomo ;)