Zobrazit plnou verzi příspěvku: Nalezení např. 1/6 mezi dvěmi body

chlebovsky
02.08.2007, 13:16
Zdravím. Někdy se mi stane že mám dva objekty a potřebuju mezi ně třeba do 1/6 nakopírovat něco. Vytvořil jsem si utilitku rozdel, ale volám ji vrámci příkazu. A ta mi to má provést. Ale mám problém s tím že mi ten výsledný bod sice dobře spočítá ale vždy přichytí k uchopovacím funkcím. Tak jsem tam nastavil vypnutí, teď to funguje bezvadně, ale vždy vypne uchop. Nevíte jak to opětovně zapnout? Problém je v tom že výsledkem funkce musí být (xyz)....
 
Tady je lsp:
 
(defun rozdel (dist / b1 b2 b)  (setq b1 (getpoint (getvar "LASTPOINT") "\nDefinuj první bod :"))  (setq b2 (getpoint (getvar "LASTPOINT") "\nDefinuj druhý bod :"))  (if (< (getvar "OSMODE") 16384)
       (setvar "OSMODE" (+ 16384 (getvar "OSMODE")))
  )  (setq b (polar b1 (angle b1 b2)(* dist (distance b1 b2)))))
 
Funguje takto, mám dva prvky. Vemu jeden, dám kopie, a teď určuju bod vložení a já napíšu : (rozdel 0.166666), spustí se funkce, zadám první bod, druhý bod, a prvek se nakreslí do 1/6 ale jak pak zapnout uchop ???
Vždy musím znovu f3.....

Kackac
03.08.2007, 01:00
mám v některých svých lispech:    (setq osold (getvar "OSMODE")) - na začátku programu    (command "_-osnap" "") - před vložením bloku, resp. ukázáním místa vložení    (setvar "OSMODE" osold) - na koncimožná to není nejhladší způsob, ale mělo by to fungovat i u toho vašeho lispu

Seiner
03.08.2007, 06:57
Nojo - to je notoricky známá věc, jejíž první část taky p.Chlebovský ve svém lispu (korektněji napsaný) má. Jenže jste si asi nevšimnul, že on chce zadat příkaz normálně (tlačítkem, zkratkou...) a někde uprostřed vkládání parametrů použít předdefinovanou funkci.
   Nějak mne nenapadá jiné řešení, něž napsat lispy, které by zahrnovaly i vlastní modifikační funkci (kopírování aj.). Pak není problém vrátit uchopovací mód zpátky. Ztrácí se tak ona flexibilita použití. Na druhou stranu si myslím, že vypisovat pořád "(rozdel 0.166666)" taky není příklad uživatelského konfortu :-)

chlebovsky
04.08.2007, 08:16
Použití zpětného nastavení osold, nelze, z důvodu jak zmiňuje i p. Seiner. Poněvadž kdybych použil na konci lispu nastavení (setvar osmode tak hodnota co funkce vrátí je číslo uchopu a nikoliv hodnota spočítaného bodu.
Samo že nevypisuju (rozdel.....) ale mám to defunované v ikoně.
Prostě kliknu na ikonu 1/6 a ta volá celou funkci.
Jen mě napadlo, jestli to co funkce vrátí by nemusel být celý bod, ale posloupnost příkázu
např
(setvar "OSMODE" 0)(list x y z)(setvar "OSMODE" old).... jenže nějak to nemůžu rozchodit.... prostě že výstupem bude celý proces nastavení i bodu...

Vladimír Michl
05.08.2007, 17:28
Nezkoušel jsem to, ale myslím, že by mohlo v tomto případě pomoci nastavení OSNAPCOORD na 1 - nemusíte pak OSMODE vůbec vypínat.

chlebovsky
06.08.2007, 13:37
pane Michl tak Vám jsem dával největší šanci, ale taky né. Taky to pořád chytá za uchopovací body....
 
To předělání funkcí (kopie, ....) dle p. Seinera moc nechci dělat...
 
Způsob že bych jako vrácenou hodnotu použil
(setvar "OSMODE" 0)(list x y z)(setvar "OSMODE" old) nelze taky protože to sice, vypne, nakreslí bod, a tapne, ale i ty dvě nastavení bere jako info o bodu, takže ve skutečnosti nakreslí 3 body.
 
Jen mě napadlo, kterou funkci vyvolává klávesa F3 jestli by se to nedalo řešit přímo takto :
(funkce F3)(list x y z)(funkce F3)  jen vědět co ta F3 spouští za funkci, a hlavně musí vracet nil..

Vladimír Michl
06.08.2007, 15:30
ne, to na to jdete špatně
 
zkuste do té vaší rutiny připsat na konec ještě převod na text:
 
  (strcat (rtos(car b)) "," (rtos (cadr b)))

pak bude chodit ten postup s OSNAPCOORD

Seiner
07.08.2007, 07:13
Hezké - ono to skutečně funguje. Logika mi sice uniká, ale pokusím si to zapamatovat :-)

Vladimír Michl
07.08.2007, 07:54
Logika je ta, že musíte AutoCAD přesvědčit že jde o "souřadnici zadanou pomocí klávesnice" - pak zabere nastavení OSNAPCOORD.

chlebovsky
13.08.2007, 16:39
Jo tak nakonec to funguje, moc moc díky všem.
A tady je teda výsledek :
 
(defun rozdel (dist / b1 b2 b)  (if (/= (getvar "OSNAPCOORD") 1)(setvar "OSNAPCOORD" 1))  (setq b1 (getpoint (getvar "LASTPOINT") "\nDefinuj první bod :"))  (setq b2 (getpoint (getvar "LASTPOINT") "\nDefinuj druhý bod :"))  (setq b (polar b1 (angle b1 b2)(* dist (distance b1 b2))))  (strcat (rtos(car b)) "," (rtos (cadr b))))
 
a pak mám dvě ikonky :
a v makru mám lispík : (rozdel 0.5)
a druhý (rozdel (/ 1.0 3.0))
 
díky.
 

Sedláček
13.08.2007, 17:02
Nebylo by to jednodušší pře geometrickou kalkulačku _CALC?
Já to sice nepoužívám (ani nemohu - mám LT) ale dle helpu by to mělo jít.

Seiner
13.08.2007, 17:12
BTW, tu polovinu teď už nemusíte řešit - uchopení _M2P.
(Ale takhle to máte jednotné a můžete případně přidávat další zlomky.)