Zobrazit plnou verzi příspěvku: Rychlé otočení

BenaCZ
06.10.2006, 11:00
Mohli byste mi prosím poradit co mám v kódu špatně?
Má to být lisp na funkci otočit (použít referenci, zadat střed otáčení, zadat 1.bod a 2. bod otáčení)
Ono se mi to ale otáčí o jiný úhel...

(defun otocrychle (selected_object / stredpt firstpt endpt)
(setq stredpt (getpoint "\nVyber stred otáčení:"))
(setq firstpt (getpoint "\nVyber 1. bod otáčení:"))
(setq endpt (getpoint "\nVyber 2. bod otáčení:"))
(command "_rotate" selected_object "" stredpt "R" "" stredpt firstpt endpt "")
)

(defun C:otocr (/ selected)
(terpri)
(setq selected (entsel "Vyber objekty:"))
(otocrychle selected)
)

P.S. Jsem začátečník

Díky Bena

Vladimír Michl
06.10.2006, 14:10
Na první pohled to vypadá v pořádku. Snad jen (nesouvisející) drobnosti - "objekt", ne "objekty" a "_R", ne "R".
Jste si vědom, že úhel zadáváte referencí (rozdílem) od stávajícího úhlu, ne absolutně? Drobné odchylky mohou být způsobeny též uchopovacími režimy, 3D, USS, apod.

Ferdinand
06.10.2006, 14:34
Já už pro jistotu píšu na začátek každého lispu(setq OSM (getvar "osmode"))(setq ORM (getvar "orthomode"))(setq SNM (getvar "snapmode"))(setvar "osmode" 0)(setvar "orthomode" 0)(setvar "snapmode" 0)a na konci obnovím na původní(setvar "osmode" OSM)(setvar "orthomode" ORM)
(setvar "snapmode" SNM)

BenaCZ
06.10.2006, 15:27
Doplnil jsem tam ty ortho a kroky. Změnil jsem to na vícenásobný výběr, ale pořád mi to nefunguje.
Jde mi o to, abych otočil objekty pomocí reference a aby střed otáčení byl stejný jako počátek, který určuje počáteční úhel. Pak bych chtěl kliknout na jeden bod (tím získat počáteční úhel) a pak na druhý bod a tím směrem objekt otočit. Tady je upravený kód:

(defun C:otocr (/ ORM SNM mysset counter stredpt firstpt endpt)
;nastaví orto a krok na 0
(setq ORM (getvar "orthomode"))
(setq SNM (getvar "snapmode"))
(setvar "orthomode" 0)
(setvar "snapmode" 0)
;násobný výběr
(setq mysset (ssget))
(setq counter 0)
(while (< counter (sslength mysset))
    (terpri)
    (setq counter (+ counter 1))
    )
;vlastní funkce
(setq stredpt (getpoint "\nVyber stred otáčení:"))
(setq firstpt (getpoint "\nVyber 1. bod otáčení:"))
(setq endpt (getpoint "\nVyber 2. bod otáčení:"))
(command "_rotate" mysset "" stredpt "_R" "" stredpt firstpt endpt)

; obnovuje původní orto a krok atd
(setvar "orthomode" ORM)
(setvar "snapmode" SNM)
)

Mám pocit, že mi nefunguje ten endpt a otáčí se mi to podle původně nastaveného referenčního úhlu. Nevíte proč?

Ferdinand
10.10.2006, 19:40
Hm, tak to tedy nevím.Zkusit to překontrolovat v lisp editoru ?Úhlové jednotky a smysl úhlu máte OK?Anebo nepomohlo by prvně změřit úhel od osy X (anebo Y ?) /tj. střed či počátek úhlu/  k zadanému bodu /tj. směr vektoru/ a teprve pak to tam mlasknout jako vybranou/zadanou hodnotu?

BenaCZ
10.10.2006, 22:18
Tak jsem to zdárně vyřešil. Asi jsem špatně chápal, jak to vlastně autocad při tom otáčení dělá. Tak jsem zkoumal jak to vlastně funguje při normálním otáčení a zapsal jsem pak tento kód:

;;; Otočí podle 3 bodů
(defun C:otocr (/        ORM           SNM               mysset
          counter        stredpt    firstpt      endpt         angle_new
          angle1        angle2     delta_x1      delta_y1   delta_x2
          delta_y2
            )
;;;nastaví orto a krok na 0
(setq ORM (getvar "orthomode"))
(setq SNM (getvar "snapmode"))
(setvar "orthomode" 0)
(setvar "snapmode" 0)
;;;násobný výběr
(setq mysset (ssget))
(setq counter 0)
(while (< counter (sslength mysset))
    (terpri)
    (setq counter (+ counter 1))
)
;;;vlastní funkce
(setq stredpt (getpoint "\nVyber stred otáčení:"))
(setq firstpt (getpoint "\nVyber 1. bod otáčení:"))
(setq endpt (getpoint "\nVyber 2. bod otáčení:"))
(setq delta_x1 (- (nth 0 firstpt) (nth 0 stredpt)))
(setq delta_y1 (- (nth 1 firstpt) (nth 1 stredpt)))
(setq angle1 (atan delta_y1 delta_x1))
(setq delta_x2 (- (nth 0 endpt) (nth 0 stredpt)))
(setq delta_y2 (- (nth 1 endpt) (nth 1 stredpt)))
(setq angle2 (atan delta_y2 delta_x2))
(setq angle_new (atof (angtos (- angle2 angle1) 0 2)))
(command "_rotate" mysset "" stredpt angle_new)

;;; obnovuje původní orto a krok
(setvar "orthomode" ORM)
(setvar "snapmode" SNM)
)


A to už funguje báječně. Bena

Ferdinand
11.10.2006, 10:25
Pořád ale mi nějak uniká smysl této procedury. V čem je to teda lepší/rychlejší? Proč nepoužívat raději ono klasické otáčení?

BenaCZ
11.10.2006, 10:31
No když otáčím klasicky, tak musím zadat nejdřív co otočit, pak střed otačení, pak dát R, pak znovu střed, koncový bod 1. směru a pak koncový bod 2. směru.

Zatímco v nové funkci dám co otočit, střed, koncový bod 1.směru a koncový bod 2. směru. Ušetřím tím několik kroků.

Ferdinand
13.10.2006, 13:52

Cituji příkazový řádek [+ komentáře]:Command: _rotateCurrent positive angle in UCS:  ANGDIR=counterclockwise  ANGBASE=0.00Select objects:   [pick1-CrossWindow/Window]  Specify opposite corner:   [pick2-CrossWindow/Window]  97 found  [anebo se vyfiltrují potřebné entity, případně se zadá _All]3 were on a locked la-yer.Select objects:  [Enter]Specify base point:  [pick3, anebo se zadá PočátečníBod]
Specify rotation angle or [Reference]:  [pick4, anebo se zadá HodnotaUhlu]
Ferdinand2006-10-13 13:54:44