Rychlé otočení
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=3210
Datum vytištění: 13.čer.2026 v 13:35
Téma: Rychlé otočení
Odeslal: BenaCZ
Předmět: Rychlé otočení
Datum odeslání: 06.říj.2006 v 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
------------- Bena
|
Odpovědi:
Odeslal: Vladimír Michl
Datum odeslání: 06.říj.2006 v 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.
------------- Vladimír Michl (moderátor) ARKANCE CZ - https://arkance.world - arkance.world (podpora viz emea.support.arkance.world)
|
Odeslal: Ferdinand
Datum odeslání: 06.říj.2006 v 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)
------------- -FerTh-
|
Odeslal: BenaCZ
Datum odeslání: 06.říj.2006 v 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č?
------------- Bena
|
Odeslal: Ferdinand
Datum odeslání: 10.říj.2006 v 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?
------------- -FerTh-
|
Odeslal: BenaCZ
Datum odeslání: 10.říj.2006 v 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
------------- Bena
|
Odeslal: Ferdinand
Datum odeslání: 11.říj.2006 v 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í?
------------- -FerTh-
|
Odeslal: BenaCZ
Datum odeslání: 11.říj.2006 v 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ů.
------------- Bena
|
Odeslal: Ferdinand
Datum odeslání: 13.říj.2006 v 13:52
Cituji příkazový řádek [+ komentáře]:
Command: _rotate Current positive angle in UCS: ANGDIR=counterclockwise ANGBASE=0.00
Select 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]
------------- -FerTh-
|
|