Zobrazit plnou verzi příspěvku: Akce poklepáním

BenaCZ
02.10.2006, 22:48
Poraďte mi prosím jak přiřadit v nastavení Akce poklepáním u každé funkce jinou akci? Konkrétně se mi jedná o to, aby např. při kliknutí na úsečku se mi aktivovala funkce úsečky a při kliknutí na kótu se aktivovala funkce kóty. Když jsem to u jedné funkce nastavil, tak ta samá akce se pak dělala i u jiné funkce. Pak bych nechápal smysl těchto akcí... Nejlepší by bylo, kdyby se při kliknutí na objekt z něho převzali vlastnosti a spustila se daná funkce. To by se ale asi muselo spojit pomocí lispu do jedné funkce a tu pak přiřadit této akci, je to tak?
Díky za radu Bena

Vladimír Michl
03.10.2006, 08:45
Pokud chcete přebírat vlastnosti, bude potřeba nějaká LISP/VBA/ARX/.NET utilita. Pokud jen chcete spouštět příkaz v závislosti na typu poklepané entity, stačí vám na to standardní funkce v dialogu CUI (sekce "Akce poklepáním") - nastavíte typ entity a požadovaný příkaz, resp. makro.

BenaCZ
03.10.2006, 09:05
Přes rozhraní CUI to dělám, jenže když změním např. pro úsečku akci poklepání na ^C^C_LINE změní se to u všech příkazů. Tzn. že se mi pak při poklepání např. na kótu aktivuje úsečka. Původní nastavení bylo ^C^C_Properties.
Nemůže být problém v tom ^C^C ? Nevím totiž jaký to má význam v tom příkazu. Bena

Mrázek
03.10.2006, 09:09
V tom opravdu problém není. Je to ekvivalent dvojího stisku Esc (první pro zrušení voleb, druhé pro vyběhnutí z příkazu). Zajišťuje to rozeběhnutí nového příkazu z "čistého" prostředí.

BenaCZ
03.10.2006, 09:18
Aha díky. Nemohl byste to někdo s tím poklepáním vyzkoušet? Jestli dělám něco špatně nebo jestli to prostě nefunguje? Díky

Vladimír Michl
03.10.2006, 09:41
Funguje to normálně - k entitě LINE přiřadím příkaz Úsečka a při poklepání na úsečku začnu kreslit úsečku.
Zdá se, že upravujete příkaz Vlastnosti - je třeba k dané akci přiřadit (přetáhnout) jiný příkaz.

BenaCZ
03.10.2006, 10:06
Aha. Teď je mi to jasné. Funguje to , Díky moc.
Můžu se ještě zeptat na 2. část otázky, a to na to převzetí vlastností? Našel jsem na fóru lisp na převzetí tl. čar.
;sets current LineWeight - www.aac-solutions.cz
(defun C:CURLWT ()
(setq ent (entsel "Select entity to make its lineweight current: "))
(if ent
(progn
(setq edata (assoc 370 (entget(car ent))))
(if edata
   (setvar "CELWEIGHT" (cdr edata))
   (setvar "CELWEIGHT" -1); lineweight by LAYER
)
))
)

Jak bych měl toto upravit aby to převzalo i ostatní vlastnosti? Díky za radu Bena

Seiner
03.10.2006, 10:38
Úprava tohoto kódu by neměla být až tak složitá. Je jen třeba si najít jaká je to systémová proměnná a jaké číslo pro příslušnou vlastnost. Z hlavy vím, snad, že pro hladinu je to třeba CLAYER a 8.
Názvy proměnných viz referenční příručka (všechny začínají na C jako current). Skupinové kódy jsou v referenční příručce  DXF.
 

Seiner
03.10.2006, 12:01
Ten kód by mohl pro ty hlavní vlastnosti asi vypadat nějak takhle:
(defun C:CURR () (setq ent (entsel "Vyber entitu pro nastavení vlastností: ")) (if ent (progn ;tloustka cary(setq edata (assoc 370 (entget(car ent)))) (if edata    (setvar "CELWEIGHT" (cdr edata))    (setvar "CELWEIGHT" -1); lineweight by LAYER );hladina(setq edata (assoc 8 (entget(car ent))))
   (setvar "CLAYER" (cdr edata))   ;barva(setq edata (assoc 62 (entget(car ent)))) (if edata    (setvar "CECOLOR" (ITOA(cdr edata)))    (setvar "CECOLOR" "256");  by LAYER ) ;typ čáry(setq edata (assoc 6 (entget(car ent)))) (if edata    (setvar "CELTYPE" (cdr edata))    (setvar "CELTYPE" "DLEHLAD");  by LAYER ))) )
 
Problém ale je, jak ho použít v akci na poklepání. Jak se do lispu převezme entita, na kterou bylo poklepáno?

BenaCZ
03.10.2006, 12:47
Kód takto funguje sám o sobe. Jak to spojit s akci poklepáním mě napadá jen takto: Udělat si novou funkci např ^C^C_line + funkci CURR a tyto 2 funkce spojit pomocí ´ aby mohli běžet souběžně. A výslednou funkci pak přiradit na kliknutí. V praxi by to pak bylo, tak ze bych kliknul např na úsečku aktivovala by se mi funkce kreslení úseček a zároveň CURR. Pak bych klikl ještě jednou na tu samou úsečku a tím bych z ní převzal vlastnosti a po skončení funkce CURR by byla nadále aktivní funkce úsečka. To by bylo možné ne? Nevím jen jak přesně napsat to spojení 2 funkcí. Bena

Seiner
03.10.2006, 13:07
Tok Vašich myšlenek nějak nedovedu sledovat :-)
Pokud tedy máme definovanou funkci CURR, které nastavuje některé vlastnosti podle vybrané entity, dalo by se dát na poklepání
^C^Ccurr \_line
Jenže to mi nepřijde vůbec praktické. Poklepu na úsečku, pak vyberu vzor vlastností a pak teprve se začne kreslit úsečka s příslušnými vlastnostmi.
Já bych si představoval, že poklepu a hned tvořím entitu podle té, na kterou jsem poklepal.

BenaCZ
03.10.2006, 13:23
Takto jak jste to napsal, to funguje na ty 3 kliknutí. Což není až tak špatné. Je to určitě rychlejší než mačkat na klavesnici zkratku pro převzetí vlastností a pak klikat na objekt. Moje původní představa byla taková jak jste to napsal, tzn. kliknu na objekt a z toho objektu se mi převezmou vlastnosti a začnu kreslit další.
Takto to totiž funguje v Allplanu (v tom jsem zatím kreslil). To by bylo úplně nejlepší. Jenže napsat takový lisp je asi dost složité, ne? Mě nenapadá jak by to mohlo jít , ale budu ještě přemýšlet. Pak by to byla úplná paráda . Bena

Seiner
03.10.2006, 13:47
Pracné by to být nemělo, pokud existuje nějaký způsob, jak zjistit v lispu, na kterou entitu bylo poklepáno. Akce při dblclick jsou pro mne nová věc a nevím, jestli tudy vede cesta.

Vladimír Michl
03.10.2006, 14:25
Spíše se asi používá opačná cesta - namalovat "nějakou" úsečku a pak přes Painter přenést požadované vlastnosti ze zdrojové entity, ale jde to i takto jak navrhujete.Do akce poklepáním zadáte LISP rutinu, která zjistí vlastnosti poklepané entity a nakreslí příbuznou entitu. Vlastnosti poklepané entity zjistíte např. přes:^C^C(entget(ssname (ssget"_I") 0));_LINE

BenaCZ
03.10.2006, 14:42
Jak mám nastavit, aby ty převzaté vlastnosti byly také aktuální? Zkoušel jsem to tam zadat a ono mi to vypíše v příkazovém řádku vlastnosti té poklepané entity, ale nenastaví je jako aktuální... Díky za radu Bena

Seiner
03.10.2006, 14:43
Pak je to snadné:
(defun C:CURR ()
(setq ent(ssname (ssget"_I")0) )(if ent (progn ;tloustka cary(setq edata (assoc 370 (entget ent))) (if edata    (setvar "CELWEIGHT" (cdr edata))    (setvar "CELWEIGHT" -1); lineweight by LAYER );hladina(setq edata (assoc 8 (entget ent)))
   (setvar "CLAYER" (cdr edata))   ;barva(setq edata (assoc 62 (entget ent))) (if edata    (setvar "CECOLOR" (ITOA(cdr edata)))    (setvar "CECOLOR" "256");  by LAYER ) ;typ čáry(setq edata (assoc 6 (entget ent))) (if edata    (setvar "CELTYPE" (cdr edata))    (setvar "CELTYPE" "DLEHLAD");  by LAYER ))) )  
a
 
^C^Ccurr _line

Seiner
03.10.2006, 14:44
A lisp curr dát do automatického načítání (soubor mnl)
(AUTOLOAD "CURR" '("CURR"))

Seiner
03.10.2006, 14:48
Ještě by bylo pěkné, aby se to po akci vrátilo na původní nastavení. Ale to by bylo asi poněkud pracnější. Hlavně pro úsečku, pokud se má nakreslit předem neznámý počet segmentů. Ale jde to taky.

BenaCZ
03.10.2006, 14:56
Supeeer takto je to parádní . I když máte pravdu, že kdyby se to pak vrátilo na původní nastavení, tak by to bylo úplně geniální. Kdyby jste na to přišli, napište to prosím sem. Díky moc Bena

Seiner
03.10.2006, 15:25
Třeba pro úsečku by to muselo vypadat nějak takhle:
 
na začátek Curr.lsp doplnit:
 
(defun C:CURR () (setq lastlayer (getvar "Clayer")      lastweight (getvar "CELWEIGHT")      lastcolor (getvar "CECOLOR")      lastltype (getvar "CELTYPE"))....
 
a místo _LINE použít nově definovanou funkci LINE1:
 
(Defun C:line1( )
(Setq a (getpoint "\nPočáteční bod:"))(While (/= a nil)
(Setq a1 (getpoint a "\nBod:"))(If (/= a1 nil)(Command "_line" a a1 ""))(setq a a1))(setvar "CLAYER" lastlayer)(setvar "CELWEIGHT" lastweight)(setvar "CECOLOR" lastcolor)(setvar "CELTYPE" lastltype)
)
Pozn.: je evidentní, že LINE1 je "hloupější", než _LINE, ale už se mi na tom nechce vyšívat.Seiner2006-10-03 15:26:16

pavelstyl
04.10.2006, 07:08
[QUOTE=Vladimír Michl] Pokud jen chcete spouštět příkaz v závislosti na typu poklepané entity, stačí vám na to standardní funkce v dialogu CUI (sekce "Akce poklepáním") - nastavíte typ entity a požadovaný příkaz, resp. makro.[/QUOTE]
Můžete být prosím trošku konkrétnější. Asi jsem slepý, ale v CUI dialogu žásnou sekci "Akce poklepáním" nevidím.
AutoCAD 2006 Mechanical EN
Děkuji Pavel Štyl

Seiner
04.10.2006, 07:11
To bude asi tím, že se tady celou dobu bavíme o 2007 :-)

pavelstyl
04.10.2006, 07:13
:-(

Seiner
04.10.2006, 07:52
Ještě obecnější dotaz, který mi při hraní si s touto fíčurou vystal:
 
Abych mohl do akcí, které se dějí na poklepání dát i návrat na původní nastavení, nemůžu použít normální volání příkazu např. _LINE, ale nějak to v listu obejít. Pokud bych chtěl zachovat plné možnosti příkazu (třeba u oblouku všechny možnosti zadání), bude to dost pracné a jistě i zdrojem chyb.
   Neví někdo, jak v menu zavolat standardní příkaz s předem neznámým počtem vstupů a pak se vrátit do menu a pokračovat nějakou akcí?

BenaCZ
04.10.2006, 08:06
Včera jsem to zkoušel definovat např pro křivku, polygon obdélník nebo kótu. U těchto objektů to nefunguje, Nechtěli se načíst vlastnosti těchto objektů. U kót by to chtělo ještě dopsat, aby to přebíralo i vlastnosti kótovacího stylu (buď čistě jen kótovací styl nebo podrobně všechny možné nastavení kóty). I když přepíšu v akci poklepáním tu funkci (u těchto objektů) tak se mi furt spouští ta původní akce. Co s tím? Bena

Vladimír Michl
04.10.2006, 08:07
To není úplně triviální a čistě přes menu to asi nepůjde. Ale třeba v LISPu to jde řešit třeba předáváním zadaných údajů přes (command) a testováním CMDACTIVE ve smyčce (jestli ještě příkaz běží), nebo třeba reaktorem.

Seiner
04.10.2006, 09:08
Myslel jsem ssamozřejmě v lispu. Až bude chvilka, zkusím Vaši radu.

Seiner
04.10.2006, 09:15
Já nevím, jestli do toho chcete investovat tu práci - ono to nebude úplně jednoduché. Např. Obdélník není podle mého extra entita, takže bude problém dosáhnout její tvorby tímto postupem.
  Určitý přehled o vlastnostech objektů získáte např. tak, že si napíšete na příkazovou řádku (entget(car (entsel))) a vyberete pořadovanou entitu. Podle toho by se potom upravoval lisp pro získání vlastností.

Seiner
04.10.2006, 09:21
Mimochodem, kód 370 jsem převzal bez přemýšlení z kódu, který jste zde uváděl, ale tloušťka čáry je podle mne 39. Co je ta 370?

BenaCZ
04.10.2006, 10:14
[QUOTE=Seiner] Já nevím, jestli do toho chcete investovat tu práci[/QUOTE]

Takováto pomůcka je určitě velmi užitečná. my jsme v kanceláři dělali v Allplanu, kde to takto fungovalo. Po přechodu na Autocad to všem velmi chybí. Možná, že lidem, kteří dělali vždy v Autocadu to nepřijde až tak dobrý, ale kdyby si to vyzkoušeli, tak si myslím že by jim to taky chybělo . To 370 jsem taky převzal z lispu, který jsem stáhnul.

Seiner
04.10.2006, 10:26
Podle seznamu skupinových kódů DXF by to měla být Lineweight - tedy ne tloušťka ale VÁHA čáry. Já vůbec netuším, co je to za vlastnost. :-(

Seiner
04.10.2006, 10:27
K užitečnosti: ano jde opravdu asi o zvyk. U nás se konstruktéři tvářili dost skepticky, když jsem jim to poslal. Dělali vždy v AutoCADu.

BenaCZ
04.10.2006, 10:34
Vyzkoušel jsem si tu funkci (entget(car (entsel)))
Už vím proč to u obdelníku a u kót nejde. Nevím ale jak to předefinovat, aby to fungovalo, když je to vlastně furt ten samý objekt. Takto jak to je bych uměl definovat, že při poklepu na kterýkoli typ kóty se mi spustí třeba přímá kóta... což není teda ideální.

Seiner
04.10.2006, 10:40
U kót by to ještě nějak v lispu mohlo jít rozhodnout, který příkaz se spustí. Kód 100 určuje druh kóty. Ale u toho polygonu nebo obdélníku, obávám se, řešení není. Příkazy prostě kreslí ozavřenou polylajnu a těžko z ní poznáte, jak byla vytvořena.

Seiner
04.10.2006, 10:51
Tak už je mi to snad jasné. Smotal jsem dohromady tloušťku a tloušťku čáry. Snad mi může být omluvou, že ani jednu, ani druhou vlastnost běžně nepoužíváme. Ten kód 370 je správně.

BenaCZ
04.10.2006, 10:51
Nemohl byste to prosím zkusit ještě napsat pro ty kóty? To bych určitě nezvládl. Jediné čím bych se mohl odvděčit jsou různé prográmky v excelu na stavařinu a statiku [IMG]smileys/smiley2.gif" align="middle" /> viz www.petrbenes.info , když by to někomu u vás pomohlo... Bena


P.S. Výkazy materiálu a databáze mám teď ještě vylepšené, tak bych je tam pak taky šoupnulBenaCZ2006-10-04 11:05:40

Seiner
04.10.2006, 11:51
Tak jsem do toho s vervou vlítnul, ale zase jsem se rychle odplazil s hanbou s bojiště. On tam je ten kód 100 3krát a já nevím, jak je získat všechny a rozlišit. ASSOC mi dá jen ten první.

Seiner
04.10.2006, 12:46
No třeba takhle nějak:
 
(DEFUN C:KOTAX();(setq ent(car (entsel)))(setq a "")(setq i 0)(while (< i (length (entget ent))) (If (=(car (nth i (entget ent))) 100)(setq a (strcat a (cdr(nth i (entget ent))))))(setq i (1+ i)))
(cond ((= a "AcDbEntityAcDbDimensionAcDbAlignedDimensionAcDbRotatedDimension")(Command "_DIMLINEAR"))      ((= a "AcDbEntityAcDbDimensionAcDbAlignedDimension")(Command "_dimaligned"))       ((= a "AcDbEntityAcDbDimensionAcDbDiametricDimension")(Command "_dimdiameter"))      ((= a "AcDbEntityAcDbDimensionAcDbRadialDimension")(Command "_dimradius"))))
 
Na poklepání na kótu pak bude příkaz ^C^Ccurr KOTAX
 
Vřele doporučuji neupravovat akce přímo v CUI Acad, ale vytvořit si částečnou nabídku třeba DBLCLICK a v ní experimentovat.

Seiner
04.10.2006, 12:58
Pro více druhů kó to bude:
(cond ((= a "AcDbEntityAcDbDimensionAcDbAlignedDimensionAcDbRotatedDimension")(Command "_DIMLINEAR"))      ((= a "AcDbEntityAcDbDimensionAcDbAlignedDimension")(Command "_dimaligned"))       ((= a "AcDbEntityAcDbDimensionAcDbDiametricDimension")(Command "_dimdiameter"))      ((= a "AcDbEntityAcDbDimensionAcDbRadialDimension")(Command "_dimradius"))      ((= a "AcDbEntityAcDbDimensionAcDb2LineAngularDimension")(Command "_dimangular"))      ((= a "AcDbEntityAcDbDimensionAcDbArcDimension")(Commnad "_dimarc")))

BenaCZ
04.10.2006, 13:05
Díky moc vyzkouším

BenaCZ
05.10.2006, 08:36
Tak to funguje. Ještě jsem si tam dopsal kód pro staničení. Když bych chtěl, aby mi to u kót přebíralo i vlastnosti kóty nebo alespon kotovací styl, tak by bylo asi nejlepší si vytvořit pro kóty jiný Curr a tam toto nastavit, ne?
Mohlo by to vypadat nějak takto?

(defun C:CURR KOTA ()
(setq ent(ssname (ssget"_I")0) )
(if ent
(progn
;kotovaci styl
(setq edata (assoc 3 (entget ent)))
(if edata
   (setvar "DIMSTYLE" (cdr edata))
)
))
)

+ Vlastnosti obecné jako v běžném Curr

Seiner
05.10.2006, 08:48
To můžete klidně doplnit do toho curr.lsp. Uplatní se to jen, pokud poklepete na kótu - pak by to mělo přepnout aktuální kótovací styl podle vybrané kóty. (Snad - nevím, jak je to s přepisy stylů)
  Truchu nedořešený je návrat k nastavením před akcí. Já bych to asi řešil definováním příkatu navrat a dal ho třeba na nějakou zrychlenou volbu.
  Aby to fungovalo, musíte si aktuální hodnotu dimstyle uložit do proměnné - obdobně jako jsem navrhoval u ostatních nastavení.

BenaCZ
05.10.2006, 09:26
Ono to právě nefunguje :( a já nevím jak to zprovoznit. Kdybyste někdo věděl, napište to prosím sem. Díky Bena

Seiner
05.10.2006, 09:51
Ono to bude tím, že proměnná DIMSTYLE je pouze pro čtení.
 
Musíte doplnit do curr:
 
;kotovaci styl(setq edata (assoc 3 (entget ent))) (if edata  (COMMAND "-DIMSTYLE" "O" (cdr edata))  )
 
V rozporu se zásadami je tam česká volba "O" (Obnov), protože momentálně nevím anglický ekvivalent. Pokud máte anglický AutoCAD, musíte si to upravit. A pokud trváte na návratu k aktuální hodnotě, je nutné DIMSTYLE uložit a v lispu pro obnovu řešit obdobně.