Zobrazit plnou verzi příspěvku: Hromadné otočení textů (objektů) o zadaný úhel

Venca80
07.04.2009, 14:32
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

Venca80
07.04.2009, 17:05
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.

Venca80
08.04.2009, 08:46
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)
)

Venca80
09.04.2009, 10:21
Tleskám a děkuji!!! 

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.