Wymiar z dodaną stałą wartością


justyha

Rekomendowane odpowiedzi

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:

attachicon.gif-xdim.png

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?

 

Parę dni nie było - odpowiadam po czasie :)

 

Ja jestem zainteresowany rozwinięciem tego polecenia.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

Witam

Ja mam dwie rzeczy:

1. Po użyciu XDIM, pojawia się monit o podanie stałej wymiaru, wpisuję np. 100 oraz ENTER. Drugi monit, to prośba o podanie współ. (lub ENTER), ten ENTER nie wchodzi, potrzeba wpisać najpierw np. 1 i ENTER. Z tego co pamiętam w poprzedniej funkcji to działało.

2. W przypadku chęci aktualizacji wymiaru, polecenie można użyć tylko do wymiaru skażonego. W momencie, gdy jest zdefiniowana stała oraz współ. nic nie stoi na przeszkodzie, by użyć tego polecenia także do wymiaru nie skażonego np. gdy wymiar skażony został zresetowany (przywrócony). Według mnie nie ma sensu robić takiego ograniczenia.

 

PS. Aczkolwiek ograniczenie z pkt. 2, można w zasadzie zastąpić funkcją Uzgodnij.

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Witam

Ja mam dwie rzeczy:

1. Po użyciu XDIM, pojawia się monit o podanie stałej wymiaru, wpisuję np. 100 oraz ENTER. Drugi monit, to prośba o podanie współ. (lub ENTER), ten ENTER nie wchodzi, potrzeba wpisać najpierw np. 1 i ENTER. Z tego co pamiętam w poprzedniej funkcji to działało.

2. W przypadku chęci aktualizacji wymiaru, polecenie można użyć tylko do wymiaru skażonego. W momencie, gdy jest zdefiniowana stała oraz współ. nic nie stoi na przeszkodzie, by użyć tego polecenia także do wymiaru nie skażonego np. gdy wymiar skażony został zresetowany (przywrócony). Według mnie nie ma sensu robić takiego ograniczenia.

 

PS. Aczkolwiek ograniczenie z pkt. 2, można w zasadzie zastąpić funkcją Uzgodnij.

 

Pozdrawiam

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.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, dziękuję za wyjaśnienie. Wydawało mi się, że aktualizacja działa w oparciu o stałą i współczynnik aktualnie zdefiniowany. Jeśli każdy skażony wymiar "pamięta" stałą oraz współczynnik, to co innego. W tym wypadku dane te pobierane są z wymiaru skażonego. Zatem, funkcje według mnie działają OK ;)

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, dziękuję za wyjaśnienie. Wydawało mi się, że aktualizacja działa w oparciu o stałą i współczynnik aktualnie zdefiniowany. Jeśli każdy skażony wymiar "pamięta" stałą oraz współczynnik, to co innego. W tym wypadku dane te pobierane są z wymiaru skażonego. Zatem, funkcje według mnie działają OK ;)

Pozdrawiam

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

Edytowane przez kojacek
Odnośnik do komentarza
Udostępnij na innych stronach

Dzisiaj wypróbowywałem procedurę  wydaję się bardzo przydatna.

Mam kilka uwag:

- Wymiar opisuje się z dokładnością do 2 miejsc po przecinku co nie zawsze jest korzystne, lepiej by było że odczytywał dokładność z ze stylu, może być aktualnego.

- W opisie program uwzględnia współczynnik wymiaru z aktualnego wymiaru co jest raczej błędem. Mało prawdopodobne jest aby użytkownik podając skalę wymiaru, uwzględniał że już w stylach ma skale podaną.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzisiaj wypróbowywałem procedurę  wydaję się bardzo przydatna.

Mam kilka uwag:

- Wymiar opisuje się z dokładnością do 2 miejsc po przecinku co nie zawsze jest korzystne, lepiej by było że odczytywał dokładność z ze stylu, może być aktualnego.

- W opisie program uwzględnia współczynnik wymiaru z aktualnego wymiaru co jest raczej błędem. Mało prawdopodobne jest aby użytkownik podając skalę wymiaru, uwzględniał że już w stylach ma skale podaną.

 

  1. 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?
  2. 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ć.
Odnośnik do komentarza
Udostępnij na innych stronach

Z ty

 

 

  1. 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?
  2. 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ć.

 

 

1. Ja bardzo często wymiaruję w mm lub w cm wtedy wymiar powinien być bez miejsc  po przecinku, ( co prawda nie wiem czy takie narzędzie będzie mi potrzebne przy wymiarach w mm, ale by było bardziej uniwersalne) natomiast w [m] to oczywiście najlepiej  do 2 miejsc.

2. U minie tak nie działa

jeżeli wymiar aktualny skale ma ustawioną na 1 i Xdim na 10 to długość zmierzona 100 będzie 1000

jeżeli skala aktualnego stylu wymiaru będzie 0,1 to xdim będzie 100

jeżeli aktualna skala  jest na 10 to z xdim otrzymamy 10000.

Czyli za każdym razem xdim uwzględnia skalę aktualnego stylu wymiarowania.

Lepiej by było żeby nie uwzględniaj tzn że jak w xdim jest ustawiona na 10 to w każdym przypadku powinna być 1000.

Odnośnik do komentarza
Udostępnij na innych stronach

Z ty

 

 

1. Ja bardzo często wymiaruję w mm lub w cm wtedy wymiar powinien być bez miejsc  po przecinku, ( co prawda nie wiem czy takie narzędzie będzie mi potrzebne przy wymiarach w mm, ale by było bardziej uniwersalne) natomiast w [m] to oczywiście najlepiej  do 2 miejsc.

2. U minie tak nie działa

jeżeli wymiar aktualny skale ma ustawioną na 1 i Xdim na 10 to długość zmierzona 100 będzie 1000

jeżeli skala aktualnego stylu wymiaru będzie 0,1 to xdim będzie 100

jeżeli aktualna skala  jest na 10 to z xdim otrzymamy 10000.

Czyli za każdym razem xdim uwzględnia skalę aktualnego stylu wymiarowania.

Lepiej by było żeby nie uwzględniaj tzn że jak w xdim jest ustawiona na 10 to w każdym przypadku powinna być 1000.

 

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?

post-451-0-18944400-1402922513_thumb.png

Odnośnik do komentarza
Udostępnij na innych stronach

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?

 

Dla mnie te założenie odpowiadają.

Odnośnik do komentarza
Udostępnij na innych stronach

Zatem papróbujta teraz. Zmiany:

  1. Zmienione zgłoszenie przy podaniu współczynnika
  2. Pobieranie ilości miejsc po przecinku ze stylu rysowanego wymiaru
  3. 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.

Odnośnik do komentarza
Udostępnij na innych stronach

Gratulacje! U mnie wszystko chodzi jak chciałem. Wielkie dzięki!

 

Do poprzedniej wersji jest drobna różnica -xdim nie wchodzi od razu do ustawienia stałej i skali (czyli nie resetuje tych wartości) tylko w ustawienia procedury.

 

Ciekawe czy można by było zwykłe wymiary  i wymiary xdim przeskalowywać i dodawać (zmieniać) stałą?

Odnośnik do komentarza
Udostępnij na innych stronach

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 :)

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

 

http://forum.cad.info.pl/topic/1131-przechowywanie-danych-nierysunkowych-w-rysunku/

 

:)

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie