Opakované zapsání textu pod kótovací čáru pomocí VisualLISPu
Kategorie » téma: LISP
23.08.2010 09.40 | | Komentáře: 0 komentářů | Přečteno: 10738x
Příklad z předchozího příspěvku je sice funkční, práce s ním je však poněkud těžkopádná, protože vyžaduje při každém zápisu textu pod kótovací čáru opakované zadání požadovaných hodnot. Přitom ale například při zápisu výšky okna a výšky parapetu má většinou více oken tyto hodnoty shodné. Potřebujeme tedy do funkce přidat cyklus, který dokud budeme vybírat kóty bude do jejich jmenovatele zapisovat zadaný text. Pro opakované zapsání textu pod kótovací čáru použijeme cyklus while. Syntaxe funkce while je následující:
(while (podmínka)
(výraz)
)
Funkci si můžeme vysvětlit tak, že dokud bude platit (podmínka) bude se provádět (výraz). Cyklus while je podobný cyklu Do Loop, který je známý z Visual Basicu. Upravená funkce s použitím cyklu while bude vypadat následovně:
(defun c:textdim ()
(vl-load-com)
(setq textpodcarou (getstring t "\nZadejte text pod kótovací čarou: ")
textkoty (strcat "<>\X" textpodcarou)
kota (car (entsel "\nVyberte kótu:"))
)
(while (/= kota nil)
(setq vla-kota (vlax-ename->vla-object kota))
(vla-put-textoverride vla-kota textkoty)
(setq kota (car (entsel "\nVyberte kótu:")))
)
(princ)
)
První řádky jsou stejné jako v předchozí verzi v předešlém příspěvku. Do proměnné kota ale už nesmíme ukládat vybraný objekt převedený na vla-objekt. Tato proměnná bude totiž testována v podmínce následného cyklu while.
nil je prázdná hodnota
/= znamená není rovno
Protože VisualLISP používá takzvanou obrácenou nebo také polskou logiku píše se při zadávání nejprve funkce (zde /=) a pak argumenty
(while (/= kota nil) tedy znamená – dokud proměnná kota není prázdná prováděj následující řádky
Do proměnná vla-kota se uloží vybraný objekt převedený na vla-objekt.
Další řádek zapíše pod kótu zadaný text.
... a před ukončením cyklu je potřeba vybrat novou kótu, aby mohlo zapisování pokračovat. V případě, že klepneme mimo do prázdného prostoru, uloží se do proměnné kota prázdná hodnota nil a na základě podmínky se cyklus ukončí.
Poslední funkce (princ) , zde bez parametrů, zajistí takzvaný tichý odchod funkce. Jedná se pouze o kosmetickou záležitost. Bez zapsání tohoto řádku by funkce pouze skončila vypsáním nil do příkazové řádky, ale její funkčnost by se nezměnila.
Závorka na poslední řádce uzavírá funkci defun .
Nyní se tedy zadaný text objeví ve jmenovateli všech kót, které budeme postupně vybírat, dokud neklepneme do prázdné oblasti.
Poslední, co nám chybí v naší funkci ošetřit je případ, kdy uživatel vybere jiný objekt než je kóta. Pokud tak učiníme nyní, funkce zhavaruje, protože nenajde vlastnost textoverride -
ActiveX Server returned the error: unknown name: TextOverride
Ošetření správného vstupu vyřešíme dalším cyklem while, který bude uvnitř prvního cyklu ověřovat jméno vybrané entity – objectname.
V AutoCADu jsem našel celkem devět typů kót, které mají rozdílné názvy, ale možná, že jsem nějaký přehlédnul. Pomocí funkce and a /= ověříme, jestli vybraná entita není nositelem jednoho z devíti posuzovaných jmen. Pokud není objeví se v příkazové řádce nebo u kurzoru myši výzva “Vybraný objekt není kóta - vyberte kótu: “
Celá výsledná funkce tedy bude vypadat následovně:
(defun c:textdim ()
(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 vla-kota (vlax-ename->vla-object
(car (entsel "\nVybraný objekt není kóta - vyberte kótu:"))
)
)
; konec definice proměnné vla-kota
)
; 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)
)
Funkce and může mít libovolný počet argumentů a vrací nil v případě, že alespoň jeden z těchto argumentů má hodnotu nil. Pokud tedy alespoň jedna z podmínek u cyklu while není splněna – tedy jméno objektu odpovídá jednomu z uvedených jmen- ukončí se vnořený cyklus while a funkce pokračuje dál. Na základě stejného principu můžeme podmínku u prvního cyklu
(while (/= kota nil) ... klidně napsat také takto (while kota ... Funkce bude fungovat stejně
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.