Obslužný kód pro ovládací prvky OpenDCL
Kategorie » téma: LISP
13.09.2010 09.07 | | Komentáře: 0 komentářů | Přečteno: 11797x
Pro rekapitulaci uveďme celý kód lispovské funkce, který jsem tvořily v předchozích příspěvcích.
(princ "\nFunkce na zápis textu pod kótovací čáru")
(princ "\nSpuštění funkce \"textdim\"")
(princ "\n(c) K-DATA 2010")
(defun c:textdim ( / textpodcarou textkoty kota vla-kota)
(vl-load-com)
(setq textpodcarou (getstring t "\nZadejte text pod kótovací čarou: ")
textkoty (strcat "<>\X" textpodcarou)
kota (car (entsel "\nVyberte kótu:"))
)
; konec definování proměnných
; začátek posouzení, zda byl vybrán nějaká objekt
(while kota
(setq vla-kota (vlax-ename->vla-object kota))
;začátek posouzení jména vybraného objektu
(while (and (/= (vla-get-objectname vla-kota) "AcDbRotatedDimension")
(/= (vla-get-objectname vla-kota) "AcDbAlignedDimension")
(/= (vla-get-objectname vla-kota) "AcDb2LineAngularDimension")
(/= (vla-get-objectname vla-kota) "AcDbRadialDimension")
(/= (vla-get-objectname vla-kota) "AcDbRadialDimensionLarge")
(/= (vla-get-objectname vla-kota) "AcDbDiametricDimension")
(/= (vla-get-objectname vla-kota) "AcDbArcDimension")
(/= (vla-get-objectname vla-kota) "AcDbOrdinatedDimension")
(/= (vla-get-objectname vla-kota) "AcDb3PointAngularDimension")
)
; konec vnořeného cyklu while
(setq kota (car (entsel "\nVybraný objekt není kóta - vyberte kótu:")))
; test, zda bylo něco vybráno
(if kota
(setq vla-kota (vlax-ename->vla-object kota))
)
; konec funkce if
)
; konec vnořeného cyklu while
(vla-put-textoverride vla-kota textkoty)
(setq kota (car (entsel "\nVyberte kótu:")))
)
; konec prvního cyklu while
(princ)
)
lsp soubor s touto funkcí můžete stáhnout klepnutím na ikonu pod kódem. Oproti jednomu z předchozích příspěvků, kde jsme tuto funkci podrobně popisovali zde přibylo ještě několik řádků.
První tři řádky – funkce princ vypíší po načtení funkce do AutoCADu do příkazové řádky text napsaný v uvozovkách.
Do závorek za funkci defun byl dopsán seznam lokálních proměnných, které pozbudou hodnoty po ukončení funkce. Pokud bychom nechali závorky dál prázdné v podstatě by se nic nestalo. Pouze bude v paměti počítače i po ukončení funkce zbytečně obsazeno pár Bajtů. Kompletní syntaxe funkce defun je následující:
(defun jméno_funkce ([argumenty_potřebné_pro_chod_funkce] / lokální_proměnné)
tělo_funkce
)
Proměnné, které nejsou deklarovány jako lokální si podrží svoji hodnotu až do zavření výkresu, ve kterém byla funkce spuštěna. Hodnotu takové proměnné lze zjistit zapsáním vykřičníku a jména proměnné do příkazové řádky - !jmeno_promenne. AutoCAD vrátí hodnotou proměnné.
Poslední změnou je použití funkce if pro zjištění, zda po výběru entity, která není kótou nebyl proveden prázdný výběr. Syntaxe funkce if je následující:
(if (podmínka)
(výraz_který_se_provede_jestliže_je_podmínka_splněna)
(výraz_který_se_provede_jestliže_podmínka_splněna_není)
)
Výraz může být i další funkce. Jak je vidět na příkladu v tomto příspěvku, není druhý výraz, který se provede, když podmínka není splněna povinný.
První, co musíme do kódu funkce napsat, třeba hned za (vl-load-com), jestliže chceme používat možnosti OpenDCL je příkaz:
(command "_OPENDCL")
Teprve poté můžeme začít používat další funkce OpenDCL.
Následně je třeba napsat cestu k souboru, ve kterém je uložen dialogový panel. Zpětná lomítka se v tomto případě v LISPu nahrazují lomítky normálními. V mém případě vypadá řádka následovně:
(dcl_project_load "D:/ODCL/textdim" T)
Pokud se Vám dcl_form_show zobrazuje černě a ne modře, stačí do příkazové řádky AutoCADu zadat příkaz _opendcl.
Možná Vás to překvapí, ale zde můžeme naši funkci uzavřít. Celá funkce tedy bude vypadat následovně.
(defun c:textdim ( / textpodcarou textkoty kota vla-kota)
(vl-load-com)
(command "_OPENDCL")
(dcl_project_load "D:/ODCL/textdim" T)
(dcl_form_show textdim_PrepisTextuKoty)
)
Po zavolání příkazu textdim se načte openDCL, nastaví se cesta k souboru s dialogovým panelem a dialog se zobrazí. Další činnost funkce bude již ovládána z dialogového panelu. Proto si v našem dialogu v OpenDCL studiu klepneme na tlačítko Přepsat kótu a klepneme na kartu Events. Zde zatrhneme položku Ckicked. Ve spodní části karty se zobrazí syntaxe funkce, kterou si můžeme pomocí tlačítka uložit do schránky a vložit do lsp souboru v editoru VisualLISPu. Odmažeme část začínající dcl_messageBox...a necháme pouze poslední uzavírací závorku. K syntaxi funkce bychom se dostali stejně i přes Control Browser s panelu Properties. Nesmíme ovšem zapomenou zatrhnout položku Clicked na kartě Events.
(defun c:textdim_PrepisTextuKoty_BUTprepsatkotu_OnClicked (/)
)
Funkce je nyní prázdná. Nejprve musíme získat text zapsaný v textových polích našeho dialogového okna. K nim se dostaneme opět přes Control Browser. Text zapsaný v textových polích je celkem logicky uchováván pod vlastností pole Text.
Proměnnou textkoty tak můžeme na rozdíl od původní funkce definovat takto:
(setq textkoty (strcat (dcl_control_gettext textdim_PrepisTextuKoty_TBnadkotou)
"\X" (dcl_control_gettext textdim_PrepisTextuKoty_TBpodkotou))
Dále bude již funkce pokračovat úplně stejně jako v nedialogové verzi.
Úplně nakonec doplníme obslužný kód k tlačítku pro ukončení dialogu. V OpenDCL Studiu vybereme tlačítko Konec, na kartě Events klepneme na Clicked a zkopírujeme syntaxi ze spodní části panelu do editoru kódu VisualLISPu. |
|
||
Další syntaxe, kterou budeme potřebovat se týká uzavření celého dialogového okna. V openDCL Studiu tedy vybereme náš dialog a přes Control Browser získáme syntaxi metody Form_Close. Pozor neplést s událostí Close, která je hned vedle. |
|
||
S takto získaných syntaxí dáme dohromady funkci na uzavření dialogového okna. |
(defun c:textdim_PrepisTextuKoty_BUTkonec_OnClicked(/) (dcl_form_close textdim_PrepisTextuKoty) ) |
Celý lsp soubor s celkem třemi funkcemi bude tedy vypadat následovně:
(princ "\nFunkce na zápis textu pod kótovací čáru")
(princ "\nSpuštění funkce \"textdim\"")
(princ "\n(c) K-DATA 2010")
(defun c:textdim ( / textpodcarou textkoty kota vla-kota)
(vl-load-com)
(command "_OPENDCL")
(dcl_project_load "D:/ODCL/textdim" T)
(dcl_form_show textdim_PrepisTextuKoty)
)
(defun c:textdim_PrepisTextuKoty_BUTprepsatkotu_OnClicked (/)
(setq textkoty (strcat (dcl_control_gettext textdim_PrepisTextuKoty_TBnadkotou)"\X"
(dcl_control_gettext textdim_PrepisTextuKoty_TBpodkotou))
kota (car (entsel "\nVyberte kótu:"))
)
; konec definování proměnných
; začátek posouzení, zda byl vybrán nějaký objekt
(while kota
(setq vla-kota (vlax-ename->vla-object kota))
;začátek posouzení jména vybraného objektu
(while (and (/= (vla-get-objectname vla-kota) "AcDbRotatedDimension")
(/= (vla-get-objectname vla-kota) "AcDbAlignedDimension")
(/= (vla-get-objectname vla-kota) "AcDb2LineAngularDimension")
(/= (vla-get-objectname vla-kota) "AcDbRadialDimension")
(/= (vla-get-objectname vla-kota) "AcDbRadialDimensionLarge")
(/= (vla-get-objectname vla-kota) "AcDbDiametricDimension")
(/= (vla-get-objectname vla-kota) "AcDbArcDimension")
(/= (vla-get-objectname vla-kota) "AcDbOrdinatedDimension")
(/= (vla-get-objectname vla-kota) "AcDb3PointAngularDimension")
)
; konec vnořeného cyklu while
(setq kota (car (entsel "\nVybraný objekt není kóta - vyberte kótu:")))
; test, zda bylo něco vybráno
(if kota
(setq vla-kota (vlax-ename->vla-object kota))
)
; konec funkce if
)
; konec vnořeného cyklu while
(vla-put-textoverride vla-kota textkoty)
(setq kota (car (entsel "\nVyberte kótu:")))
)
; konec prvního cyklu while
(princ)
)
(defun c:textdim_PrepisTextuKoty_BUTkonec_OnClicked (/)
(dcl_form_close textdim_PrepisTextuKoty)
)
Oba soubory lsp i odcl uložíme a lsp soubor načteme do AutoCADu. Pokud jsme vše napsali správně, objeví se po zavolání příkazu textdim dialogové okno, do kterého může zapsat text kóty jak nad kótovací čarou, tak pod ní. |
|
||
Protože jsme dialog na začátku definovali jako Modeless, zůstane v okně výkresu viset tak dlouho, dokud ho neukončíme klepnutím na tlačítko konec. Mezi přepisováním kót tak můžeme volat i jiné příkazy nebo můžeme průběžně měnit texty, které se mají do vybraných kót zapsat. Cyklus přepisování kót ukončíme klepnutím do prázdné oblasti výkresu – mimo jakoukoliv entitu. |
|
Jan Panoch
Související články:
1) "Nástroj pro rychlé zjištění informací o entitě", Jan Panoch, 26.7.2010
2) "Přístup k objektům pomocí VisualLISPu", Jan Panoch, 2.8.2010
3) "Přístup k vlastnostem objektům pomocí VisualLISPu", Jan Panoch, 23.8.2010
4) "Zapsání textu pod kótovací čáru pomocí VisualLISPu", Jan Panoch, 23.8.2010
5) "Opakované zapsání textu pod kótovací čáru pomocí VisualLISPu", Jan Panoch, 23.8.2010
6) "OpenDCL", Jan Panoch, 3.9.2010
7) "Příklad vytvoření dialogu v OpenDCL Studiu", Jan Panoch, 6.9.2010
8) "Obslužný kód pro ovládací prvky OpenDCL", Jan Panoch, 13.9.2010
9) "Spojení lsp funkce a odcl dialogu v jeden soubor", Jan Panoch, 13.9.2010
10) "Co je třeba k běhu funkcí s ODCL dialogy", Jan Panoch, 13.9.2010
11) "Funkce na výpočet průřezových charakteristik s ODCL paletou", Jan Panoch, 13.9.2010
(odkazy se svolením autora článků doplnil JT)
Komentáře:
Tento článek zatím neobsahuje žádné komentáře.