Funkce reaktorů

Přehled informací

Co jsou reaktory

První přiblížení zní - reaktory jsou nové objekty AutoCADu, které umožňují reagovat na různé akce vyvolané v AutoCADu. Jiný pohled na reaktory je ten, že se jedná o vazbu mezi událostí a obslužnou funkcí.

Například ve Vaší aplikaci potřebujete informovat uživatele při uložení výkresu (uzavření výkresu) o době, kterou strávil prací nad výkresem. Není nic jednoduššího pověsíte reaktor na akci uložení (zavření) výkresu a zobrazíte dialog s informací.

Reaktor vyvolá reakci na událost pomocí funkce - tzv. callback (obslužné) funkce, která je přiřazena danému reaktoru.

Typy reaktorů a událostí

Typy reaktorů

V AutoCADu můžete použít velké množství reaktorů. Reaktory je možné rozdělit do následujících kategorii:

Poznámka: kromě reaktorů editoru obsahuje každá kategorie pouze jeden typ reaktorů. Reaktory editoru jsou dále děleny do dalších kategorií(viz referenční příručka).

Události reaktorů

Každý reaktor reaguje na velké množství událostí. Správnou funkci reaktoru zajistíte důkladným zvážením a určením události, na kterou má reaktor reagovat. Po aktivací reaktoru událostí, reaktor spustí obslužnou funkci.

Pokud potřebujete zjistit všechny události daného reaktoru můžete použít v okně konzole VLISPu příkaz: vlr-reaction-names. Před spuštěním tohoto příkazu nezapomeňte aktivovat funkce ActiveX příkazem vl-load-com, jinak bude zobrazena chybová zpráva.

Příklad vypsání všech událostí reaktoru :VLR-linker-reactor

  _$ (vl-load-com) ; aktivace funkcí ActiveX a reaktorů
  _$ (vlr-reaction-names :VLR-DocManager-Reactor)
  (:VLR-documentCreated :VLR-documentToBeDestroyed 
   :VLR-documentLockModeWillChange :VLR-documentLockModeChangeVetoed
   :VLR-documentLockModeChanged :VLR-documentBecameCurrent 
   :VLR-documentToBeActivated :VLR-documentToBeDeactivated)

Postup při použití reaktorů v AutoLISPu

Používání reaktorů ve výkresu je jednoduché. Při používání reaktorů musíte postupovat následujícím způsobem:

V programu AutoLISPu musí být také obslužná funkce nahrána dříve než samotný reaktor. V opačném případě by mohlo dojít k situaci, kdy událost aktivuje reaktor, který se pokusí zavolat neexistující obslužnou funkci. Program skončí s chybovou hláškou, že obslužná funkce XY neexistuje.

Vytvoření obslužné funkce

Obslužné funkce reaktoru jsou normální funkce AutoLISPu vytvořené pomocí příkazu defun. Při tvorbě obslužné funkce musíme dodržet několik omezení:

Tvar obslužné funkce pro reaktory

Všechny reaktory mimo Object reaktor používají následující tvar obslužné funkce. V obslužné funkci musíme definovat dva vstupní parametry:

Obecný tvar obslužné funkce

  (defun jméno_funkce 
     (volající_reaktor parametry_od_autocadu / lokální_proměnné)
    (vl-load-com)
     . . .          ; zpracující akce
    (princ)
  )

Příklad obslužné funkce zobrazInfo

Funkce zobrazInfo vypíše do příkazového řádku uloženého souboru a velikost souboru. Funkce je navázána na reaktor DWG editor - událost uložení výkresu:

  (defun zobrazInfo 
     (volajici_reaktor parametry_od_autocadu 
      / jmenodwg cesta velikost_souboru cas_modifikace) 
    (vl-load-com)    
    (alert
      (strcat "Velikost souboru " (cadr parametry_od_autocadu) " 
         je " (cadr (itoa (vl-file-size jmenodwg))) " bytů."
      )
    )
    (princ)
  )

Funkce zobrazInfo je volána se dvěmi parametry:

Na začátku funkce je nahrána podpora funkcí ActiveX a reaktoru. Následně je zobrazen dialogový box se zprávou. Ve zprávě je zobrazeno jméno souboru a velikost souboru v bytech. Nakonec je zavolána funkce (princ), která zobrazí prázdný řádek do příkazového řádku, aby obslužná funkce nevracela žádné hodnoty.

Definice obslužné funkce object reaktorů

Obslužné funkce reaktorů objekt mají specifický tvar. V obslužné funkci musí být definované tři vstupní parametry:

Obecný tvar obslužné funkce pro reaktor object

  (defun jméno_funkce 
     (spoustecí_objekt volající_reaktor parametry_od_autocadu
      / lokální_proměnné)
    (vl-load-com)
      . . .         ; zpracující akce
    (princ)
  )

Příklad obslužné funkce vypisPolomer

Obslužná funkce vypisPolomer zobrazí nový poloměr kružnice, jako reakci na změnu poloměru u kružnice ve výkresu:

  (defun vypisPolomer 
     (spousteci_objekt volajici_reaktor parametry_od_autocadu)
    (vl-load-com)     ; aktivace podpory ActiveX
    (if (vlax-property-available-p spousteci_objekt "Radius")
      (progn
        (princ "Poloměr kružnice je  ")
        (princ (vla-get-radius spousteci_objekt))
      )
    )
  )

Funkce vypisPolomer používá funkci vlax-property-available-p pro zjištění zda objekt obsahuje vlastnost "Radius".

Testovací obslužné funkce

AutoCAD nabízí pro rychlé použití dvě předdefinované funkce:

Vytváření objektů reaktorů

Svázání reaktoru s obslužnou funkcí se automaticky vytvoří vazba mezi nimi. AutoLISP používá pro každý typ reaktoru speciální funkci. Tvar funkce je odvozen od jména reaktoru. Jedinou výjimku tvoří funkce pro tvorbu object reaktorů, které budou uvedeny dále.

Příklad vytvoření funkce pro reaktor databáze - funkce vlr-acdb-reactor atd.

Argumenty potřebné pro vytvoření reaktorů (mimo object reaktorů)

Příklad vytvoření reaktoru DWG editoru

Reaktor bude vyvolán událostí :vlr-saveComplete.

  (vlr-dwg-reactor nil '((:vlr-saveComplete . zobrazInfo)))

Z příkladu je patrné, že funkci vlr-dwg-reactor se předávají dva argumenty:

Pokud potřebujete zjistit výpis všech událostí, které dokáže daný reaktor využít zjistíte v referenční příručce.

Vytvoření objektu rektoru object

Při definování reaktoru objektů musíme ještě specifikovat objekt (entitu) AutoCADu, u které má být vlastnost hlídána. Argumenty potřebné při volání funkce pro vytvoření reaktoru object:

Příklad práce object reaktoru s čárou ve výkresu

Nejprve si vytvoříme jednoduchou funkci, která vykreslí pomocí funkcí ActiveX čáru. Ve funkci musíme nejdříve aktivovat podporu ActiveX funkcí pomocí příkazu vl-load-com. Dále musíme získat dva body ve výkresu - počáteční a koncový bod čáry. Souřadnice bodů získáme pomocí funkce getpoint a uložíme je do proměnných prvniBod a druhyBod. Poté musíme nastavit ukazatel do modelového prostoru. Pomocí ukazatele do modelového prostoru můžeme do výkresu přidat čáru (příkazem vla-addLine). V příkladu si všimněte převod souřadnic z formátu AutoLISP-u do formátu VLA-objektu. Poslední příkaz je vytvoření objektu reaktoru. Ukazatel na reaktor je uložen v proměnné lineReaktor. Při vytvoření reaktoru je nejprve uveden typ reaktoru vlr-object-reactor, této funkci přiřadíme ukazatel na objekty, které má hlídat (v našem případu pouze objekt mojeCara). Následují aplikačně specifická data reaktoru a nakonec seznam určující událost a její obslužnou funkci (formou seznamu tečka dvojic: událost . obslužná_funkce).

  (defun kresliCaruSReaktorem()
    (vl-load-com)
    (setq prvniBod (getpoint "\nZadej první bod čáry: "))
    (setq druhyBod (getpoint "\nZadej druhý bod čáry: "))
  
    (setq acadObjekt   (vlax-get-acad-object)) 
    (setq acadDokument (vla-get-ActiveDocument acadObjekt))
    (setq modelProstor (vla-get-ModelSpace acadDokument)) 
    (setq mojeCara
       (vla-addLine modelProstor
         (vlax-3d-point prvniBod) (vlax-3d-point druhyBod)
       )
    )

    (setq lineReaktor
      (vlr-object-reactor (list mojeCara)
	     "Line Reactor" '((:vlr-modified . vypisInformaci))
	   )
    )
  )

Pokud byste spustili funkci cara() nyní došlo by při vyvolání reaktoru k chybě, protože jsme nenapsali kód obslužné funkce vypisInformaci(). Hlavička funkce vypisInformaci bude obsahovat tři argumenty:

Dále ve funkci musíme zajistit, aby objekt, který vygeneroval událost odchytnutou reaktorem, obsahoval dotazovanou vlastnost (zajistí funkce vlax-property-available-p volaná se jménem vlastnosti). Pokud objekt vlastnost obsahuje, jsou vypsány informace do příkazové řádky.

  (defun vypisInformaci(volajObj reactorObj paramList)
    (vl-load-com)
    (if (vlax-property-available-p volajObj "Length")
      (progn
        (princ "\nPrávě jste změnil velikost čáry ve výkresu!
                \n Nová délka čáry je: \n"
        )
        (princ (vla-get-length volajObj))
      )
    )
  )

Pro vyzkoušení výše napsaných funkcí stačí nahrát soubor reactorCara.lsp. Načíst funkce v editoru Visual LISP. Spustit funkci cara, napsáním příkazu (cara) do okna konzole Visual LISPu. Po spuštění budete v AutoCADu dotázáni na zadání dvou bodů, následně se vykreslí čára. Změníte-li parametry čáry (např. protáhnete-li) bude vyvolána obslužná funkce vypisInformaci, která zobrazí informace do stavového řádku.

Poznámka: nezapomeňte nejdříve načíst obslužnou funkci a poté teprve funkci s reaktorem.