Vytisknout stránku | Zavřít okno

Nepřesnost při cmd příkazech

Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=3492
Datum vytištění: 13.čer.2026 v 17:19


Téma: Nepřesnost při cmd příkazech
Odeslal: BenaCZ
Předmět: Nepřesnost při cmd příkazech
Datum odeslání: 23.lis.2006 v 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



Odpovědi:
Odeslal: Seiner
Datum odeslání: 23.lis.2006 v 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.


-------------
Vítězslav Seiner

Chrudim


Odeslal: BenaCZ
Datum odeslání: 23.lis.2006 v 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 :)


Odeslal: Seiner
Datum odeslání: 23.lis.2006 v 15:14
Myslím, že když se vypustí, použije se nastavení UNITS (Jednotky)

-------------
Vítězslav Seiner

Chrudim


Odeslal: Seiner
Datum odeslání: 23.lis.2006 v 15:16
Když jsem tam dal 16, tak už jsem se na nepřesnost "nedozoomoval"
 


-------------
Vítězslav Seiner

Chrudim


Odeslal: Seiner
Datum odeslání: 23.lis.2006 v 15:19
Opravuji - podle systemove promenne AUPREC


-------------
Vítězslav Seiner

Chrudim


Odeslal: BenaCZ
Datum odeslání: 23.lis.2006 v 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


Odeslal: Vladimír Michl
Datum odeslání: 23.lis.2006 v 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).


-------------
Vladimír Michl (moderátor)
ARKANCE CZ - https://arkance.world - arkance.world
(podpora viz emea.support.arkance.world)


Odeslal: hynekn
Datum odeslání: 11.pro.2006 v 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.

-------------
Hynek


Odeslal: Seiner
Datum odeslání: 11.pro.2006 v 08:39
Ale Hlho, to už sem psal pan Michl 23/11...

-------------
Vítězslav Seiner

Chrudim


Odeslal: johny
Datum odeslání: 18.pro.2006 v 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á.



Vytisknout stránku | Zavřít okno