Wymiar z podziałem na "n" cześci


kma.s

Recommended Posts

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

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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)

 

Edited by perlon
Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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😉

Edited by Martin_S
korekta
Link to comment
Share on other sites

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.

Edited by perlon
Link to comment
Share on other sites

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
 

Link to comment
Share on other sites

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)

 

Edited by perlon
Link to comment
Share on other sites

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)

 

Edited by perlon
Link to comment
Share on other sites

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...