Diskuzní fórum a databáze tipů a utilit pro AutoCAD, Inventor, Revit a další produkty Autodesk - od firmy Arkance Systems [www.cadforum.cz]
CZ | SK | EN | DE
Přihlášení
či registrace
   právě nás čte: 3654 
RSS kanál - CAD tipy RSS tipy
RSS diskuze

Diskuze Diskuzní fórum, poradna

 

NápovědaCAD diskuze, rady, výměna zkušeností

 
CAD Fórum - Homepage Veřejné diskuzní fórum k CAD aplikacím - ptejte se na libovolné otázky týkající se oboru CAx, podělte se o vaše znalosti a zkušenosti s programy AutoCAD, Inventor, Revit, Fusion 360, 3ds Max a s dalšími CAD aplikacemi. Zaregistrujte se nebo se přihlašte a zašlete váš příspěvek do odpovídajícího fóra. Viz další informace o CAD Fóru. Nechcete se registrovat? Zeptejte se v naší Facebook poradně.
Fórum nenahrazuje technický support firmy Arkance Systems (CAD Studio) - přímá podpora pro zákazníky funguje na helpdesk.cadstudio.cz
  FAQ FAQ  Prohledat fórum   Události   Registrovat Registrovat  Přihlásit Přihlásit

Téma uzavřenoVolanie funkcie z programu

 Odpovědět Odpovědět archiv
Autor
michaelflyer Zobrazit panel
Zasloužilý člen
Zasloužilý člen

Přihlášen: 05.úno.2007
Lokalita: Slovensko
Používám:
AutoCAD
Stav: Offline
Bodů: 105
Přímý odkaz na tuto zprávu Téma: Volanie funkcie z programu
    Zasláno: 25.dub.2008 v 07:54
Dobrý deň.
Mám pár otázok na volanie funkcii v lispe. Daný bod a hodnotu mi nechce zobrať do NIRO. Neviete poradiť?
V „NIROZAB“ sa to spracuje a volá program „NIRO“ aby niečo nakreslil. Potom pokračuje a zavolá ho 2x atď....

(defun c:NIROZAB (/)
(zadaj bod St_A)
(zadaj hodnoty St_AV)
(zadaj bod St_Z)
(zadaj hodnoty St_ZV)
.
.
.
.
(zadaj honoty St_? St_?V)
;;;odvolávka na PRVE hodnoty na vykreslenie
(setq v St_A)
(setq v (NIRO))
(setq r St_AV)
(setq r (NIRO))
;;;odvolávka na DRUHE hodnoty na vykreslenie
(setq v St_Z)
(setq v (NIRO))
(setq r St_ZV)
(setq r (NIRO))
;;;odvolávka na ĎALŠIE hodnoty na vykreslenie
(setq v St_?)
(setq v (NIRO))
(setq r St_?V)
(setq r (NIRO))
)

(defun NIRO (/)
;;; tu sa to má vykresliť
)


Upravil michaelflyer - 25.dub.2008 v 08:54
Zpět nahoru
Vladimír Michl Zobrazit panel
Moderátor
Moderátor
Avatar
Arkance Systems

Přihlášen: 09.zář.2004
Lokalita: ČR (JČ)
Používám:
Dodáváme produkty Autodesk
Stav: Offline
Bodů: 21493
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 08:49
Asi by to chtělo vidět skutečný LISP kód (ne pseudokód typu "zadaj bod"). Volání funkcí (ne "programů") z jiných funkcí je jinak naprosto běžný postup, to určitě funguje.
Vladimír Michl (moderátor)
Arkance Systems s.r.o. - www.arkance-systems.cz
(podpora viz hd.cads.cz)
Zpět nahoru
michaelflyer Zobrazit panel
Zasloužilý člen
Zasloužilý člen

Přihlášen: 05.úno.2007
Lokalita: Slovensko
Používám:
AutoCAD
Stav: Offline
Bodů: 105
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 09:00
No, upozorňujem je to dlhé... A ten príklad predtým som zjednodušoval. Je tam viac premenných.

Připojené souborylsp20080425_085757_NIRO_zabradlie.lsp


Vopred ďakujem za rady...
Zpět nahoru
Vladimír Michl Zobrazit panel
Moderátor
Moderátor
Avatar
Arkance Systems

Přihlášen: 09.zář.2004
Lokalita: ČR (JČ)
Používám:
Dodáváme produkty Autodesk
Stav: Offline
Bodů: 21493
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 10:52
To je opravdu dost dlouhé na nějakou zběžnou analýzu - jen obecně:
 
Pokud funkce nevrací hodnotu, není potřeba ji volat v (setq) - stačí jen (NIRO). Pro omezení problémů s přepsanými hodnotami doporučuji nadefinovat použité symboly jako lokální:
 
(defun NIRO ( / a b c ....)
 
Pro ladění použijte krokování ve VLIDE.
Vladimír Michl (moderátor)
Arkance Systems s.r.o. - www.arkance-systems.cz
(podpora viz hd.cads.cz)
Zpět nahoru
Jan Liska Zobrazit panel
Diskutér
Diskutér

Přihlášen: 01.říj.2004
Lokalita: Czech Republic
Používám:
Inventor,Producstream
Stav: Offline
Bodů: 65
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 11:06
Jednom doplním:
- ve funkci NIRO máte zbytečně progn (používá se především u if apod.)
- velmi často přepisujete hodnotu proměnné, např:
  (setq r rSt_A)
  (setq r (NIRO))
- funkce NIRO navíc nic nevrací
- nepoužíváte lokální proměnné. To sice lze ale problém je v tom, že může dojít k přepsání proměnné jinou funkci - velmi špatně se hledá.
Jan Liška
Autodesk Consulting
Zpět nahoru
Ferdinand Zobrazit panel
TOP uživatel
TOP uživatel

Přihlášen: 01.říj.2004
Lokalita: ČR (JM)
Používám:
AutoCAD2004 (EN) na Windows XP
Stav: Offline
Bodů: 1904
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 12:48
Prvně by se měla nadefinovat fce NIRO, aby pak následně se dala použít ("zavolat"). Nepoužívat v názvech hodnot či proměnných diakritiku - viz
...
 (command "_clayer" "koty")
  (setq v VšA)
  (setq v (NIRO))
...
 
-FerTh-
Zpět nahoru
michaelflyer Zobrazit panel
Zasloužilý člen
Zasloužilý člen

Přihlášen: 05.úno.2007
Lokalita: Slovensko
Používám:
AutoCAD
Stav: Offline
Bodů: 105
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 12:52
Pri tom krokovaní tochto príkazu
(r (NIRO))
mi to vyhodilo toto:
_$
3.24617
; error: bad argument type: numberp: nil
_$

Len neviem čo stým ďalej....

A čo sa týka toho (defun NIRO (/ v r a n k1 k2). Tak tomu stále nerozumiem. Mám síce literatúru, kde je to vysvetlené ale pointa mi stále uniká! Som asi lama... Ktoré, písmenka tam môžem dať a ktoré nie.


Upravil michaelflyer - 25.dub.2008 v 12:54
Zpět nahoru
Vladimír Michl Zobrazit panel
Moderátor
Moderátor
Avatar
Arkance Systems

Přihlášen: 09.zář.2004
Lokalita: ČR (JČ)
Používám:
Dodáváme produkty Autodesk
Stav: Offline
Bodů: 21493
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 13:53
"Písmenka" tam dejte taková, jaké lokální proměnné (symboly) v dané funkci používáte - viz popis funkce "(defun)"
 
Příkaz "(r (NIRO))" znamená: vyhodnoť uživatelskou funkci "r" s jedním parametrem, který je určen návratovou hodnotou funkce "NIRO". Existuje taková funkce?
Vladimír Michl (moderátor)
Arkance Systems s.r.o. - www.arkance-systems.cz
(podpora viz hd.cads.cz)
Zpět nahoru
michaelflyer Zobrazit panel
Zasloužilý člen
Zasloužilý člen

Přihlášen: 05.úno.2007
Lokalita: Slovensko
Používám:
AutoCAD
Stav: Offline
Bodů: 105
Přímý odkaz na tuto zprávu Zasláno: 25.dub.2008 v 20:14
Popravde, s týmto už nemám žiadne skúsenosti. (defun) teóriu už poznám, len tá praktická časť mi akosi nejde Neviem to využiť. Asi tomu nerozumiem (teda určite!)...

Chcel som dosiahnuť funkciou (r (NIRO)), aby mi hodnotu "r" načítalo do (defun NIRO (/ r v a n)... a tu ďalej s ňou pracovalo.
Čo som čítal, tak ono to berie iba jednu hodnotu. To znamená, keď bod "a" má dve súradnice, tak mi ho nenačíta?

Ďakujem za vašu ochotu mi pomôcť. Takisto aj ostaným ďakujme.
Zpět nahoru
predcis Zobrazit panel
Nováček
Nováček

Přihlášen: 18.srp.2005
Lokalita: Slovensko
Používám:
AutoCAD® Map 3D 2013
Stav: Offline
Bodů: 14
Přímý odkaz na tuto zprávu Zasláno: 28.dub.2008 v 10:18
Pokial som dobre pochopil, unika vam zmysel lokalnych a globalnych premennych a ich vymena medzi funkciami.
Odporucal by som nazyvat premenne podla svojho obsahu, cim sa zvysi prehladnost programov (clovek sa sice trochu viac napise, ale pri ladeni a hladani chyb sa mi to osvedcilo).
Mozno tiez pouzit zapis definicii premennych jednym setq :
t.j. namiesto :
(progn
    (setq x1 (* 18.5 (- 1 (cos (/ ALFA (/ 180 pi))))))
    (setq x2 (cos (/ ALFA (/ 180 pi))))
    (setq x (/ x1 x2))
    (princ x))


pouzit toto - pri prikazoch if sa "usetri" progn:
    (setq
        x1 (* 18.5 (- 1 (cos (/ ALFA (/ 180 pi)))))
        x2 (cos (/ ALFA (/ 180 pi)))
        x (/ x1 x2)
    )
    (princ x)

K tym premennym - je to jednoduche (a trochu ine ako vo VBA ci C). Kazda premenna definovana vo vnutri funkcie je globalna premenna, ktoru vidia vsetky funkcie, pokial tato premenna nebola definovana v hlavicke funkcie ako lokalna premenna.
Priklad :
(defun funkcia1()
     (setq
        Bod1 (getpoint "\Vyber bod 1: ")
        Bod2 (getpoint "\Vyber bod 2: ")
        Mierka 2.0
        Vzd   (vzdialenostBodov Bod1 Bod2)
     )
(testovanie)
)

(defun vzdialenostBodov(b1 b2 / dx dy dz dl)
    (setq
          dx (-
               (nth 0 b2)
               (nth 0 b1)
              )
          dy (-
               (nth 1 b2)
               (nth 1 b1)
              )
          dz (-
               (nth 2 b2)
               (nth 2 b1)
              )
          dl (sqrt
               (+
                  (* dx dx) (* dy dy) (* dz dz)
               )
              )
          Vysledok (* dl Mierka)
    )
(* dl Mierka)
)

(defun testovanie()
(princ Bod1)   ;bude zoznam suradnic
(princ Bod2)   ;bude zoznam suradnic
(princ Mierka) ;bude 2.0
(princ Vzd)    ;bude desatinne cislo
(princ Vysledok)    ;bude rovnake cislo ako Vzd
(princ dx)     ;bude nil
(princ dy)     ;bude nil     
(princ dz)     ;bude nil
(princ dl)     ;bude nil
(princ b1)     ;bude nil
(princ b2)     ;bude nil
)

Takze pokial ste chceli vediet odpoved na otazku :
Chcel som dosiahnuť funkciou (r (NIRO)), aby mi hodnotu "r" načítalo do (defun NIRO (/ r v a n)... a tu ďalej s ňou pracovalo.
Tak odpoved je ta, ze premenna sa odovzda do funkcie takymto zapisom :(NIRO r v a n)

Dufam, ze som vam trochu objasnil situaciu s premennymi a funkciami.
Zpět nahoru

Pro technickou podporu CAD
kontaktujte Helpdesk

Příbuzné CAD tipy:
Tip 685:VIPJak v AutoCADu nebo v LT nakreslit průběh matematické funkce nebo graf X-Y hodnot z tabulky (např. měření)?
Tip 2022:Jak nakreslit v AutoCADu parabolu nebo jinou matematickou křivku?
Tip 2552:VIP'Program provedl neplatnou operaci' při tisku z Volo View Express.
Tip 5490:Nelze instalovat VIZ 2008 do jiného než výchozího adresáře.
Tip 4475:Hlášení: Tento soubor byl uložen v jiném programu než je program Autodesku.
Tip 223:V české Rel.12 mi někdy nefungují dialogové příkazy zadané z klávesnice


 Odpovědět Odpovědět

Přejít na fórum Oprávnění fóra Zobrazit panel



Stránka byla vygenerována za 0,883 sekund.