Rekomendowane odpowiedzi

Opublikowano

Powiedzmy, że mamy jakiś odcinek oznaczający np. zakres gdzie jest element o stałym rozstawie. Chciał bym podać rozstaw oraz wymiar całkowity odcinka na jednej linii wymiarowej tak jak to pokazano na screenie.

Normalnie robię to ręcznie wpisując w polu tekstu wymiarowego "n x rozstaw = <>"

Zastanawia mnie czy ktoś z Was natknął się na nakładkę albo skrypt lisp pozwalający generować taki wymiar automatycznie. tzn tworzę tylko jedną linię wymiarową od poczatku do końca zakresu a potem wpisuję "n" i program sam generuje tekst "n x rozstaw = <>"?

image.thumb.png.35026a1c4fccaaf355d7d7e883a44d62.png

 

Opublikowano

Taka wędka do samodzielnej przeróbki na rybę 😉 

(defun c:ww ( / ent n entlist dimvalue section newtext)
    (while (= nil ent)
        (progn
            (prompt "\nWskaz wymiar do zmiany: ")
            (setq ent (car (entsel)))
        )
    )
    (setq 
        n (getint "\nPodaj liczbe odcinkow: ")
  		entlist (entget ent)
        section (/ (cdr (assoc 42 entlist)) n)
 		newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 2) ")") 
 		entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist)
    )
   (entmod entlist)
   (princ)
)

 

Opublikowano (edytowane)

A co mi tam. Napisałem rybę. Mi się też przyda

(defun c:ww1 ( / ent)
    (while (= nil ent)
        (progn
            (prompt "\nWskaz wymiar do zmiany: ")
            (setq ent (car (entsel)))
        )
    )
    (if (= (cdr (assoc 0 (entget ent))) "DIMENSION")
        (multipledimsection (entget ent))
    )
)

(defun c:ww2 ( / )
    (command "_dimlinear" pause pause pause)
    (multipledimsection (entget (entlast)))
) 

(defun multipledimsection ( entlist / n section newtext)
    (setq 
        n (getint "\nPodaj liczbe odcinkow: ")
        section (/ (cdr (assoc 42 entlist)) n)
 		newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 2) ")") 
 		entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist)
    )
    (entmod entlist)
    (princ)
)
(princ)

 

Edytowane przez perlon
Opublikowano

W między czasie jak jeszcze mogłem posta zedytować dorzuciłem warunek sprawdzający czy faktycznie wskazany obiekt jest wymiarem czego nie ma w podlinkowanym pliku lsp:

    ;c:ww1()
	;[...]
	(if (= (cdr (assoc 0 (entget ent))) "DIMENSION")
		(multipledimsection (entget ent))
		(princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym")
	)

 

Opublikowano (edytowane)

czy jest mozliwe uproszczenie np. jesli wymiarowanie jest w dwg w mm to zaokrąglanie jest proste do pełnych mm np. 1000 jako 5x200 a nie 5x200.00

w przypadku cm 100 jako 5x20.00 w Polsce lepiej z przecinkiem wg standaryzacji 5x20,0
w m 1 jako 5x0,200

ps. fajny pomysł do zastosowań niestandardowych, np. strzemiona w belkach i słupach😉

Edytowane przez Martin_S
korekta
Opublikowano (edytowane)

Zapewne jest możliwe, ale nie wiem jak odczytać tę właściwość.

UNITS daje takie okno:

783590141_2019-01-2112_37_11-ZWCAD2019ProfessionalEdition-Drawing1_dwg.png.036e8e9873dc91fc4049228d46c2be9c.png

 W autocad jest coś takiego jak -DWGUNITS (polecenie zewnętrzne w arx) ale w ZwCAD nie zadziała. Nie wiem jaka zmienna trzyma aktualną jednostkę rysunkową.

Nic innego w temacie jednostek mi nie przychodzi do głowy, chyba że nakładki, ale to inna bajka bo każda nakładka trzyma jednostki po swojemu.

Edytowane przez perlon
Opublikowano

warto by było "sprzężyc" z bieżącym stylem wymiarowania
INSUNITS mówi o jednostce w rys. ,  a ja wyżej o stopniu dokładności wzgl. jednostki: mm 1 ; cm 0,1 ; m 0,001
wym02.jpg.e1e8ddbf12766c825f94a39922a39bd9.jpg

dla mm ogólnie jest tak:
wym01.jpg.2fb28329cc82e01d750b32ba8a68fe94.jpg

można obok we właściwościach wyedytować i skasować te .00 ale to zajmuje jakiś czas 😉 i po problemie
 

Opublikowano (edytowane)

voila

(defun c:dimagregatemod ( / ent entlist)
    (while (= nil ent)
        (progn
            (prompt "\nWskaz wymiar do zmiany: ")
            (setq ent (car (entsel)))
        )
    )
    (if (= (cdr (assoc 0 (entget ent))) "DIMENSION")
        (pr:multipledimsection (entget ent))
        (princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym")
    )
    (princ)
)

(defun c:dimagregate ( / )
    (command "_dimlinear" pause pause pause)
    (pr:multipledimsection (entget (entlast)))
    (princ)
) 

(defun pr:multipledimsection ( entlist / n section newtext)
    (setq 
        n (getint "\nPodaj liczbe odcinkow: ")
        section (* (getvar "DIMRND") (atoi (rtos (/ (/ (float (cdr (assoc 42 entlist))) (float n)) (getvar "DIMRND")) 2 0)))
 		newtext (strcat "<>\\X(" (itoa n) "x" (rtos section 2 (getvar "DIMDEC")) ")") 
 		entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist)
    )
    (entmod entlist)
)

(princ)

 

Edytowane przez perlon
Opublikowano (edytowane)

Trzeba jeszcze było uodpornić lispa na DIMRND=0 bo wywalał dzielenie przez 0. I jeszcze zamiana kropki na znak  oddzielenia części dziesiętnej wg stylu wymiarowego. Wersja po poprawkach:

(vl-load-com)

(defun c:dimagregatemod ( / ent)
    (while (= nil ent)
        (progn
            (prompt "\nWskaz wymiar do zmiany: ")
            (setq ent (car (entsel)))
        )
    )
    (if (= (cdr (assoc 0 (entget ent))) "DIMENSION")
        (pr:multipledimsection (entget ent))
        (princ "\nBlad: Wskazany obiekt nie jest wymiarem liniowym")
    )
    (princ)
)

(defun c:dimagregate ( / )
    (command "_dimlinear" pause pause pause)
    (pr:multipledimsection (entget (entlast)))
    (princ)
) 

(defun pr:multipledimsection ( entlist / n section newtext rnd)
    (setq 
        n (getint "\nPodaj liczbe odcinkow: ")
        section (/ (float (cdr (assoc 42 entlist))) (float n))
	rnd (getvar "DIMRND")
    )
    (if 
        (not (= rnd 0)) 
        (setq section (* rnd (atoi (rtos (/ section rnd) 2 0))))
    )
    (setq
 	newtext (strcat "<>\\X(" (itoa n) "x" (vl-string-translate "." (getvar "DIMDSEP") (rtos section 2 (getvar "DIMDEC"))) ")") 
 	entlist (subst (cons 1 newtext) (assoc 42 entlist) entlist)
    )
    (entmod entlist)
)

(princ)

 

Edytowane przez perlon
  • 2 tygodnie później...

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