Vytisknout stránku | Zavřít okno

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-



Vytisknout stránku | Zavřít okno