Zobrazit plnou verzi příspěvku: Nepřesnost při cmd příkazech

BenaCZ
23.11.2006, 14:46
Dobrý den,
všiml jsem si, že když se mi v lispu vyskytuje funkce "command" (např otočit), tak se do výsledku vnášejí chyby. Myslím tím že když dám něco otáčet v lispu pomocí command, tak se to otočí o trochu jiný úhel, než je ten spočtený. Přisuzuji to nějakému nastavení přesnosti při používání command příkazů v lispu. Ale přesnost v nastavení jednotek autocadu na to nemá vliv.
Nejsnáze pochopitelný je to na příkladu. Udělal jsem funkci "otocrychle", kde otáčím výběr pomocí 3 bodů. Z těchto 3 bodů si spočítám úhel o který se to má otočit. Když si to pak hodně přiblížím, zjistím, že to není otočené úplně přesně. Spočtený úhel je ale určitě správný. (když u jiného lispu podobně počítám úhel, který pak používám pro něco jiného, tak to funguje perfektně).
Tady je ten lisp, dyžtak si to vyzkoušejte:

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

Nevíte někdo jak to udělat, aby to fungovalo správně?
Díky za každou radu, Bena

Seiner
23.11.2006, 14:58
S nepřesností jsem se nikdy nesetkal. IMHO k ní není důvod.
Ten spočítaný úhel si zaokrouhlujete na 2 desetinná místa. Nemůže to být tím?
Jinak já bych asi pouřil v příkazu otáčení referenci úhly bych nemusel počítat.

BenaCZ
23.11.2006, 15:10
Aha, díky za upozornění. Toho jsem si nevšiml (tý dvojky) to bude určitě tím. Musím si najít v helpu jestli se to zaokrouhlení dá úplně vypustit nebo jestli tam musím nastavit jen více desetinných míst... nevíte to náhodou z hlavy? Díky Bena

P.S. tak nepřesnosti beru zpět :)

Seiner
23.11.2006, 15:14
Myslím, že když se vypustí, použije se nastavení UNITS (Jednotky)

Seiner
23.11.2006, 15:16
Když jsem tam dal 16, tak už jsem se na nepřesnost "nedozoomoval"
 

Seiner
23.11.2006, 15:19
Opravuji - podle systemove promenne AUPREC

BenaCZ
23.11.2006, 15:40
jj díky moc,taky jsem vyzkousel 16 a je to v poho... mam takovy pocit ze i excel jede na 16 desetinnych mist, tak to musi stacit :) Bena

Vladimír Michl
23.11.2006, 15:40
To je jedno - Jednotky nastavují AUPRES.
Hlavně je ale zbytečné převádět numerické hodnoty na stringy a tím pádem to komplikovat zaoukrouhleními a jednotkami - funkce (command) bere i normální numerické hodnoty (v plné přesnosti).

hynekn
11.12.2006, 08:34
Hlavně jsem nepochopil, proč úhel nejprve převádíte na řetězec a pak zpátky na float (číslo s desetinnou čárkou). Dvojice angtos - atof je nesmyslná. Pokud budete používat "nativní" původní čísla, jedete vždy v základní přesnosti AutoCADu, AUPREC a podobné spíše formátovací záležitosti můžete zapomenout a tentokrát se opravdu nedozoomujete.

Seiner
11.12.2006, 08:39
Ale Hlho, to už sem psal pan Michl 23/11...

johny
18.12.2006, 14:27
No myslim, že to je obyčejny referenčni otačení, takže se to da udělat i takto:
(defun C:O() ;Otoc------------OtRef  (command "vyber" pause)  (command "_rotate" "p" "" pause "r" "@" pause pause)  (princ))
Což používám já.