Zobrazit plnou verzi příspěvku: Hromadné otočení textů (objektů) o zadaný úhel
Přátelé jdu k vám pro radu, jestli lze nějakým způsobem hromadně otočit texty (případně jiné objekty) o zadaný úhel (např. 180°) kolem svých řídících bodů. Pochopitelně se mi jedná o texty s různým natočením, jinak by to nebyl problém... Předem děkuji za rady!
Ferdinand
07.04.2009, 14:48
Podle mne to půjde jenom nějakým lispem:
- vyber objekty dle druhu (dle volby)
- dej je do seznamu
- na každý prvek tohoto seznamu aplikuj:
-- zjisti aktuální úhel otočení
-- změň tento úhel o 180 st.Ferdinand2009-04-07 14:52:09
A pokud to nejde jinak, než nějakým takovýmto lispem, někdo by ho uměl stvořit?
Martin Bielina
07.04.2009, 17:20
Pokud by stačilo aby se otáčely jen jednoduché prvky jako jsou texty, mtexty a bloky tak by to mohlo vypadat třeba takhle. Spouští se příkazem rot180 a otočí najednou všechny bloky texty a mtexty ve výkresu/souboru o 180°.
(defun C:rot180 ( / i n sel_length ent_sel ent entseznam uhel)
(setq ent_sel (ssget "_X" '((-4 . "<OR")
(0 . "INSERT")
(0 . "TEXT")
(0 . "MTEXT")
(-4 . "OR>")
)
)
)
(setq i 0)
(if (= ent_sel nil)
(setq sel_length 0)
(setq sel_length (SSLENGTH ent_sel))
)
(princ)
(princ (strcat (rtos sel_length 2 0) " OBJEKTŮ VE VÝBĚRU K OTÁČENÍ"))
(princ)
(while (/= i sel_length)
(setq ent (ssname ent_sel i))
(setq entseznam (entget ent));načte list
(setq uhel (cdr (assoc 50 entseznam)))
(setq entseznam (subst (cons 50 (+ uhel pi)) (assoc 50 entseznam) entseznam))
(entmod entseznam)
(entupd ent)
(setq i (+ i 1))
)
(print)
)
v.straka
07.04.2009, 20:34
Prikaz torient z express.
Martin Bielina: Děkuji, to je ono! Hezké by ještě bylo mít tam volbu pro zadání úhlu otočení , kdyby jste se náhodou nudil , ale i tak moc děkuji!!!v.straka: Příkaz torient bohužel otáčí jen na absolutní úhel (jestli se nepletu) a ne o nějaký úhel. Ale i tento příkaz občas využiji zvláště otočení na "Most Readable". I tak díky.
Martin Bielina
08.04.2009, 09:06
[QUOTE=Venca80] Martin Bielina: Děkuji, to je ono! Hezké by ještě bylo mít tam volbu pro zadání úhlu otočení , kdyby jste se náhodou nudil , ale i tak moc děkuji!!!
[/QUOTE]
V dolní čtvrtině kódu jsem vám zvýraznil výraz pi což je právě ten úhel v radiánech o který se vše otáčí. Není problém doplnit do kódu ještě požadavek na zadání úhlu a otáčet pak právě o něj. V tom případě by mě pak zajímalo, v jakých úhlových jednotkách si to přejete zadávat (°, rad nebo třeba g). Nerad bych ještě dodělával rozhodovací cyklus na jednotky ... A další problém který to přinese je směr otáčení, protože ten je nastavitelný systémovou proměnou, zpravidla na CCW tj. proti směru hodinových ručiček s čímž mívají především praváci problém. Rotace o 180° je ta nejjednodušší, protože se těmito drobnostmi prostě nemusí člověk zabývat.Martin Bielina2009-04-08 09:08:27
Martin Bielina
08.04.2009, 17:18
Na přání zakladatele tohoto vlákna přidávám modifikaci, která umí otáčet s prvky ve výběru o libovolný úhel.
(defun C:rotx ( / i n sel_length ent_sel ent entseznam uhel rotuhel)
(princ "\nVyberte objekty k otočení")
(setq ent_sel (ssget '((-4 . "<OR")
(0 . "INSERT")
(0 . "TEXT")
(0 . "MTEXT")
(-4 . "OR>")
)
)
)
(setq i 0)
(if (= ent_sel nil)
(setq sel_length 0)
(setq sel_length (SSLENGTH ent_sel))
)
(princ)
(princ (strcat (rtos sel_length 2 0) " OBJEKTŮ VE VÝBĚRU K OTÁČENÍ"))
(princ)
(setq rotuhel (getreal "\nZadejte ve stupních hodnotu úhlu pro otáčení <180> "))
(if (= rotuhel nil)
(setq rotuhel pi)
(setq rotuhel (* rotuhel (/ pi 180)))
)
(while (/= i sel_length)
(setq ent (ssname ent_sel i))
(setq entseznam (entget ent))
(setq uhel (cdr (assoc 50 entseznam)))
(setq entseznam (subst (cons 50 (+ uhel rotuhel)) (assoc 50 entseznam) entseznam))
(entmod entseznam)
(entupd ent)
(setq i (+ i 1))
)
(print)
)
Vladimír Michl
09.04.2009, 11:00
Dovolili jsme si kód trochu začistit a ošetřit případy, kdy text takto otočit nelze - viz RotX na stránce Download.