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