Opakované zapsání textu pod kótovací čáru pomocí VisualLISPu

Kategorie » téma: LISP

23.08.2010 09.40 | Jan Panoch | Komentáře: 0 komentářů | Přečteno: 10186x

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ě

Funkce je hotová můžeme si jí uložit pro pozdější využití. Načtení funkce lze mimo ikonu v editoru VisualLISPu provést přetažením ikony lsp souboru z Průzkumníku do kreslícího okna AutoCADu, nebo vybráním v dialogovém okně, které se objeví po zavolání příkazu _appload. Pokud si v tomto okně klepneme na tlačítko Contents... Můžeme vybráním souboru tento soubor zařadit do seznamu, který se bude načítat při každém spuštění AutoCADu a otevření jakéhokoliv výkresu. Nemusíme si pak dělat starosti s jejím načítáním a funkci můžeme rovnou používat. To je příjemný rozdíl oproti VBA.
 
Na načtení a spuštění funkce můžeme také vytvořit nástroj v paletě nástrojů. Z Autodesk Content Browser přetáhneme do palety nástrojů prázdný command tool.
 

Zde na něj klepneme pravým tlačítkem myši a vybereme Properties. Do kolonky Name zadáme příhodné jméno, které se bude objevovat na paletě nástrojů a k příkazu také můžeme vložit obrázek jako ikonu. Nejdůležitější je ovšem položka Command. Sem napíšeme sekvenci příkazů, které načtou a spustí naši funkci. Zde využijeme toho, že funkce LISPu lze zadávat přímo do příkazové řádky AutoCADu. Klepnutím na nástroj se totiž pole Command odešle do příkazové řádky. Načtení tedy provedeme Lispovskou funkcí load , za kterou napíšeme cestu k souboru s naší funkcí. Stejně jako v editoru VisualLISPu musí i zde být funkce uzavřena v závorkách. Za ukončující závorkou ponecháme mezeru a napíšeme příkaz, kterým se naše funkce spouští. V mém případě bude obsah pole command vypadat následovně:

(load "D:/ODCL/textdim.lsp") textdim

V tomto případě se jméno souboru shoduje se jménem funkce. To ovšem není podmínkou k tomu, aby funkce běžela. Jméno souboru se od jména funkce může lišit.

 

Funkci na zápis textu pod kótovací čáru s drobnými úpravami, kterou lze dále modifikovat si můžete stáhnout zde.

 

textdim.lsp

 

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.

Přidat komentář

 *
 *
 
 *

*) Povinné položky jsou označeny hvězdičkou.