Dokončení příkladu použití reaktorů

Přehled informací

Hlavní funkce reaktorKruznice()

Funkce reaktorKruznice() definuje nový příkaz AutoCADu reaktorKruznice. Zadá-li uživatel tento příkaz do příkazové řádky, je zobrazen dialog pro zadání hodnot od uživatele. Po jejich zodpovězení je zobrazen určený obrazec. Uživatel má možnost změnit hranici obrazce, ten je poté překonfigurován a znovu vykreslen.

Hlavní části funkce:

V těle funkce je nejprve definovaná proměnná obsahující asociační seznam s uloženým nastavením všech inicializačních hodnot nastavení pro vykreslení výsledných obrazců. Následuje zavolání funkce kr:dialog pro zadání hodnot uživatelem. Funkce kr:dialog() vrací v případě správného zadání parametrů hodnotu T (v případě jakékoliv chyby hodnotu nil). Vrácená hodnota je otestována a rovná-li se T je zavolána funkce kr:kresli_kruznici(), která vykreslí daný obrazec, v opačném případě dojde k ukončení aplikace.

Vlastní kód funkce:

  (defun c:reaktorKruh ()
        ;;; definice nové funkce, která bude vyvolána příkazem  reaktorKruh
    (setq gl_pam_hodnoty
        ;;; globální proměnná uchovávající jednotlivá nastavení
      (list
        (cons "stredkex" "0.0")      ;;; x souř. středu soustř. kružnic
        (cons "stredkey" "0.0")      ;;; y souř. středu soustř. kružnic
        (cons "stredkez" "0.0")      ;;; z souř. středu soustř. kružnic
        (cons "polomerke" "1")       ;;; poloměr kružnice (editbox)
        (cons "polomerks" "1")       ;;; poloměr kružnice (slider)
        (cons "vzdalenostke" "1")    ;;; vzdálenost mezi kružnicemi (editbox)
        (cons "vzdalenostks" "1")    ;;; vzdálenost mezi kružnicemi
        (cons "kruz_stred_but" "0")  ;;; tlačítko - stred kruznice
      )
    )
    
        ;;; zadání hodnot pomocí dialogového boxu
    (if (= (kr:dialog) T)
      (kr:kresli_kruznici)
        ;;; vykreslení požadovaného objektu, v případě že byly zadány hodnoty
    )
    )
   
    (vlr-dwg-Reactor nil '((:vlr-saveComplete . vypisInformaci)))
    (princ "Funkce reaktor kruh dokončila činnost")
        ;;; informace o ukončení funkce
    (princ)
   )

Funkce kr:nastav_stred(stred / stredx stredy stredz)

Funkce kr:nastav_stred(stred / stredx stredy stredz) je volána s parametrem stred (souřadnice středu obrazce). Jednotlivé souřadnice (x, y, z) jsou převedeny na řetězce. Poté funkce uloží souřadnice středu do položek asociačního seznamu gl_pam_hodnoty.

Hlavní části funkce:

Vlastní kód funkce:

  (defun nastav_stred (stred / stredx stredy stredz)
        ;;; funkce pro nastavení hodnot souřadnic středu
        ;;; do globální proměnné gl_pam_hodnoty
    (setq stredx (strcat (vl-princ-to-string (car stred))))
    (setq stredy (strcat (vl-princ-to-string (cadr stred))))
    (setq stredz (strcat (vl-princ-to-string (caddr stred))))

    (setq gl_pam_hodnoty
      (subst 
        (cons "stredkex" stredx) 
        (assoc "stredkex" gl_pam_hodnoty)
        gl_pam_hodnoty
      )
    )
    (setq gl_pam_hodnoty
      (subst 
        (cons "stredkey" stredy) 
        (assoc "stredkey" gl_pam_hodnoty)
        gl_pam_hodnoty
      )
    )
    (setq gl_pam_hodnoty
      (subst 
        (cons "stredkez" stredz) 
        (assoc "stredkez" gl_pam_hodnoty)
        gl_pam_hodnoty
      )
    )
  )

Funkce kr:kresli_kruznici()

Funkce kr:kresli_kruznici() zajistí vykreslení soustředných kružnic. Nejprve ve funkci musí být zpřístupněny objekty Application AutoCAD, aktivní dokument a modelový prostor. V dalším kroku funkce načte hodnoty jednotlivých souřadnic středu kružnic ("strednex", "stredney" a "strednez"), tyto hodnoty jsou převedeny z řetězce na hodnoty typu reálné číslo, sdruženy do tečka trojice (formát zadání bodu) a uloženy do proměnné stred_kr. Z asociačního seznamu jsou získány hodnoty zadané uživatel a dopočítány doplňkové informace pro kreslení. Následuje vykreslení jednotlivých kružnic. V cyklu je vždy kreslená kružnice přidána do seznamu, aby mohla být snadno vymazána. Po vykreslení výplně je nakreslena hraniční kružnice a vytvořen objekt reaktoru. Při tvorbě reaktoru si všimněte přidání dat výplně k reaktoru (pomocí vložení proměnné seznamu objektyKruznice do reaktoru). V obslužné funkci je možné s těmito daty pracovat pomocí funkcí vlr-data a vlr-data-set.

Hlavní části funkce:

Vlastní kód funkce:

  (defun kresli_kruznici ( 
       / stred_kr polomer pol_kresl pocet vzdalenost objektyKruznice)
        ;;; vykreslení kružnice
        ;;;; stred_kr - souř. středu (3 x real.číslo)
        ;;;; polomer - real.číslo poloměr první kružnice
        ;;;; pol_kresl - real.číslo poloměr vykreslované kružnice
        ;;;; pocet - celé číslo počet kreslených soustředných kružnic
        ;;;; vzdalenost - real.číslo vzdálenost mezi kružnicemi

    (setq acadObjekt (vlax-get-acad-object)) 
    (setq acadDokument (vla-get-ActiveDocument acadObjekt))
    (setq modelProstor (vla-get-ModelSpace acadDokument)) 

    (setq stred_kr
      (list
        (atof (cdr (assoc "stredkex" gl_pam_hodnoty)))
        (atof (cdr (assoc "stredkey" gl_pam_hodnoty)))
        (atof (cdr (assoc "stredkez" gl_pam_hodnoty)))
      )
    )   ;;; převod tří řetězců reprezentujících souřadnice
        ;;; do proměnné stred (položky stred jsou typu float)
    (setq polomer (atof (cdr (assoc "polomerke" gl_pam_hodnoty))))
        ;;; získání poloměru první kružnice
    (setq vzdalenost (atof (cdr (assoc"vzdalenostke" gl_pam_hodnoty))))
        ;;; získání vzdálenosti mezi kružnicemi
    (setq pocet 1)
        ;;; získání počtu kreslených kružnic z asoc. seznamu gl_pam_hodnoty

    (command)	;;; ukončení všech předchozích příkazů

    (while (> polomer (* vzdalenost pocet))	;;; dokud je co kreslit opakuj
      (setq pol_kresl (* vzdalenost pocet))	;;; nastav aktuální poloměr
      (setq objektyKruznice
        (cons 
          (vla-addCircle modelProstor (vlax-3d-point stred_kr) pol_kresl)
           objektyKruznice
        )
      )
      (setq pocet (+ pocet 1))  ;;; zmenši počet kružnic o 1
    )

    (setq hranicniKruh
     (vla-addCircle modelProstor
      (vlax-3d-point stred_kr) polomer
     )
    )

    (setq kruhReaktor   (vlr-object-reactor (list hranicniKruh)
	     objektyKruznice '((:vlr-modified . zmenKruh)))
	 )
    (command "_zoom" "M")
  )

Funkce kr:vazba_prvku()

Funkce kr:vazba_prvku() realizuje svázání prvků editbox a slider, aby zobrazovaly odpovídající hodnoty. Funkce kr:vazba_prvku() nejprve otestuje jestli akce v dialogovém boxu byla typu 1 nebo 2 (vybrání prvku nebo opuštění editboxu). Jestli ano tak je hodnota získaná z dialogového prvku převedena na hodnotu typu reálné číslo a uložena v proměnné edit_hodnota. Následně jsou zkontrolovány rozsahy zadávaných hodnot, případně nastaveny na správné hodnoty. Po provedení korekcí jsou již správné hodnoty uloženy do asociačního seznamu a nastaveny v dialogovém panelu.

Vlastní kód funkce:

  (defun kr:vazba_prvku (val why editbox slider)
        ;;; funkce pro nastavení odpovídajících prvků na stejné hodnoty
        ;;; příklad editbox1 a slider1 atd.
        ;;; val - nastavovaná hodnota
        ;;; why - určuje jaká akce uživatele vyvolala akci dialogového prvku
        ;;; editbox - jméno prvku typu editbox
        ;;; slider - jméno odpovídajícího prvku typu slider
    (if (or (= why 2) (= why 1))
        ;;; zjištení jaká akce uživatele způsobila akci dialogu
        ;;; 2 = opuštění editboxu
        ;;; 1 = uživatel vybral prvek (příklad ENTREM)
      (progn
        (setq edit_hodnota (atof val))
        ;;; převedení řetězce reprezentujícího nastavenou hodnotu na číslo
  
        (if (> edit_hodnota 5000)
          (setq val "5000")
        ;;; je-li číslo mimo rozsah prvku, proveď korekci
        )
        (if (< edit_hodnota 0)
          (setq val "0")
        ;;; je-li číslo mimo rozsah prvku, proveď korekci
        )
        (set_tile editbox val)      ;;; nastavení editboxu na správnou hodnotu
        (set_tile slider val)       ;;; nastavení slideru na správnou hodnotu
        (setq gl_pam_hodnoty
          (subst 
            (cons editbox val) 
            (assoc editbox gl_pam_hodnoty) 
            gl_pam_hodnoty
          )
        )
        (setq gl_pam_hodnoty
          (subst 
            (cons slider val)
            (assoc slider gl_pam_hodnoty)
            gl_pam_hodnoty
          )
        )
      )
    )
  )

Zdrojové kódy příkladu