Zobrazit plnou verzi příspěvku: Problé s načítaním DCL panela

michaelflyer
17.08.2007, 21:14
Dobrý deň.
Prosím vás, potreboval by som poradiť s lisp-om, konkrétne s dcl panelom. Ako si tomu nerozumiem . V lsp mám asi kdesi chybu lebo to nechce robiť to, čo chcem a vôbec mi nezobrazí dcl panel. Chcem vkladať hodnoty do dcl panela a aby mi aj vypľulo výsledok (tiež v tom istom dcl panely).
Vopred ďakujem za odpovede.

Zdrojový kód lsp:
; Program na výpočet rozteč stĺpikov na priamke
;;;Výpočty
(defun Výpočty ()
(setq n1 (- x 120))
(setq n2 (+ d 120))
(setq n (/ n1 n2))
(prompt "\nVysledok n=")
(princ n (set_tile "nN" (strcat " " nN)))
(setq e1 (+ x d))
(setq e2 (+ 1 (+ 1 (fix n))))
(setq e (/ e1 e2))
(prompt "\nVysledok e=")
(princ e (set_tile "eE" (strcat " " eE)))
)
;;;
(defun C:ENst ()
(start_dialog)
(setq     dcl_id (load_dialog "ENst.dcl")
     (new_dialog "ENst" dcl_id)
      (set_tile "d"
             (st
               (set_tile "dD")
             )
      )
     (setq x     (subst
           (set_tile "xX")
          )
     )
      (action_tile "accept" "(Výpočty)")
     (done_dialog "cancel")
)
)

Zdrojový kód dcl:
UDAJE : dialog {
label = "Počet stĺpikov na zadanej dĺžke";
: row {
label = "Michal MUCHA";
}

: row {
: column {
: boxed_column {
label = "Priemer stĺpiku:";
: edit_box { //Priemer stĺpiku
label = "d:";
key = "dD:";
edit_width = 10;
}
}
: boxed_column {
label = "Dĺžka priamky (vzdialenosť):";
: edit_box { //Dĺžka priamky (vzdialenosť)
label = "x:";
key = "xX:";
edit_width = 10;
}
}
: boxed_column {
label = "Výsledky:";
: edit_box { //Počet stĺpikov
label = "n:";
key = "nN:";
edit_width = 10;
}
}
: boxed_column {
label = "Vzdialenosti medzi stlpikmi:";
: edit_box { //Vzdialenosti medzi St.
label = "e:";
key = "eE:";
edit_width = 10;
}
}
: boxed_column {
label = "Schéma:";
: image { //grafický obrázok
label = "POKUS";
alignment = top;
key = "pokus";
width = 50;
height = 6;
color = -2;
allow_accept = true;
}
}
}
}

: row {
: button { //Vypočítaj
key = "vysledok";
label = "Vypočítaj";
is_default = true;
width = 25;
alignment = centered;
}
: button { //Zrušiť
label = "Zrušiť";
is_cancel = true;
key = "cancel";
width = 25;
alignment = centered;
}
:spacer {width = 1;}
}
}

chlebovsky
19.08.2007, 15:54
Ten dialog vypadá že je v pořádku, jen název by měl být ENst a né UDAJE.
Pak v tom lispu je spousta chyb, téměř nefunkční.
Hned na začátku jsou úplně špatně řádky.... zpřeházené
 
(setq     dcl_id (load_dialog "ENst.dcl") (new_dialog "ENst" dcl_id) (start_dialog) 
tím se vám ten dialog otevře, teda za předpokladu že máte v konfigu ve vyhledávacích cestách nastavenou cestu na ten DCL, jinak bych doporučil ten název psát včetně cesty.
 
Pak ale ten lisp postrádá naprostý smysl.
 
Doporučil bych kdyby jste napsal co to vlastně má provádět, pak by se to dalo dát do kupy.
 
 
kdybych popsal nějaké chyby
(set_tile "dD")  tato funkce má dva parametry
(set_tile "dD" "text") kde "dD" je key-v dialogu a "TEXT" je text co se má vyplnit 
 
dále v dialogu je image, kde se má pravděpodobně něco kreslit, ale to tu vůbec není...
 
říkam napište co to má dělat, pak se s tím dá něco udělat.

michaelflyer
20.08.2007, 19:53
Dobrý deň.
Ten program má len vypočítať počet otvorov (n) na danej dĺžke (x) a rozteč medzi nimi (e) s ohľadom na priemer (d).
Základný program mám, ktorý mi aj funguje, len neviem doň vsunúť príkazy pre DCL panel.
A čo to má robiť. Chcel som o toho: zadám priamo do dcl panela hodnoty a on mi vypľuje výsledok po stlačení Vypočítaj. A keď chcem dcl ukončiť tak tlačitkom Zrušiť.

Základný LSP program:

     ; Progam na výpočet rozteče stĺpikov na priamke
(defun C:ENst ()
     ;zadávanie hodnot
(setq d (getreal "\nZadaj priemer stlpiku [d]: "))
(setq x (getreal "\nZadaj dlzku usecky [x]: "))
     ;Výpočet
     ;n stlpikov
(setq n1 (- x 120))
(setq n2 (+ d 120))
(setq n (/ n1 n2))
     ;e rozteč
(setq e1 (* d n))
(setq e2 (- x e1))
(setq e3 (+ n 1))
(setq e (/ e2 e3))
(prompt "\nVysledok n=")
(princ (fix n))
(prompt "\nVysledok e=")
(princ e)
(princ)
)

DCL panel sa nemení. Ten obrázok mám už nakreslený len som ho tam nevedel dostať, tak som sa na to vykašlal.
Ďakujem o váš záujem. michaelflyer2007-08-20 21:10:45

chlebovsky
20.08.2007, 21:09
Snad jsem pochopil co chcete, stáhněte si to z
 
www.vchlebovska.eu/martin/enst.zip
 
Kdyby něco tak klidně ještě napište.
 
Martin.

michaelflyer
21.08.2007, 11:08
Dobrý deň.
Ďakujem za vašu rýchlu odpoveď. Pochopil ste to správne. Museli ste už toho riadne veľa porobiť. Len mi to akosi nerobí dobrotu ten lisp. To zneprístupnenie výsledkového políčka mi vôbec nezobrazilo výsledok. Tak som ho v lispe vymazal.
A ešte ta hodnota „e“ pri výsledku nesmie byť väčšia ako 120. Ten program mi predtým fungoval správne. Trochu to nechápem prečo to teraz nefunguje.
Čo sa týka toho obrázku, tak som ho chcel len preto, aby som mohol robiť aj iné programy, ktoré však musia mať v sebe obrázok, pretože by nikto nepochopil čo ten program od neho chce.
Ešte raz ďakujem za pomoc.

Michal   

chlebovsky
21.08.2007, 19:29
a) Co se týče toho zda je výsledek přistupný či né tak je to pouze kosmetická úprava, takže vůbec není na škodu, že jste to smazal, jen to vypadá jakože nedodělané :-) když při zadání to nic neudělá :-)
 
b) Co se týče toho obrázku tak si myslím že zbytečně zabírá místo, stejně na jiný prográmek budete mít jiný dialog... teda asi... a tam klidně můžete ten obrázek mít. Navíc obrázek můžete vytvořit dvěmi cestami. 1) v cadu nakreslíte co chcete aby tam bylo a pomoci mslide z toho uděláte ***.sld soubor a ten se pak do tohoto načte, ale je naprosto statický a nic to nedělá, pak je druhá možnost, a to ta, že ten obrázek se automaticky mění dle zadaných hodnot, pak se ale musí vykreslovat v rámci samotného programu a je naprosto dinamický, což je někdy lepší.... ale více složité.
 
c) samotný algoritmus...  poslal jste dva odlišné algoritmy. první Výpočty ten se mi ale jeví špatně bo tam přičítáte do e2 1+ 1+ což je 2+ a to je špatně no spíš zaokrouhluje nahoru :-), ale ten druhý mi zase připadal správný, proto jsem ho použil. A vůbec nechápu z matematického hlediska jak vůbec dle tohoto algoritmu může být  ten rozpon E menší jak 120. To mi připadá naprostý nesmysl.
Když přeci vydělím tu vzdálenost (x - 120) / (d + 120) tak získám hodnotu kolik jich tam bude s přesnou roztečí 120mm, toto číslo je ale celé kladné, takže záleží na tom kam ho zaokrouhlíme, když dolů pak E bude > 120, když nahoru pak E bude < 120.... funkce fix ale zaokrouhluje tak že prostě
uřízne to co je za čárkou takže (fix 4.9) je  4. Proto musí být E >= 120. Jinak by se to muselo zaokrouhlovat jinak.  V tom Algoritmu se zaokrouhluje nahoru, což vypadá že může být správné, ale co když bude hodnota přesně n=5 pak e je přesně 120, ale tím že připočtete 1+ 1+ tak je n=6 a výsledek špatně... 
 
Asi jsem to zamotal že :-)
 
Záleží co je fixní, jestli počet prvků n, který se zaokrouhlí dolů, nebo rozpon E který musí být < 120, pak by se to celé muselo počítat jinak.
 
A jak píšete tak jsem toho opravdu veľa porobil, aj na slovensko...  :-) dělám v lispu cca od verze 12 což je 15let... a furt mám co dohánět, jsou tady ve fóru daleko výkonější :-) Kolikrát i já jdu za něma pro radu :-)

michaelflyer
22.08.2007, 21:08
Ešte raz ďakujem za rady.
Veľmi sa mi páčilo, ako ste mi to vtom lispe podrobne popísal. Takýto nejaký by som si predstavoval aj manuál k lisou. No žiadna literatúra nie je v SR k dispozícii či už po CZ alebo SK (ale zase vysokú cenu by som tiež nebol ochotný obetovať). A nepoznám nikoho, od koho by som sa mohol učiť. Jedine tu na fóre. Aspoň niečo.
a)
Ja som len chcel povedať, že ten výsledok mi tam vôbec nenapísalo, keď tie polia boli zaneprístupnené.
b)
Mne zatiaľ stačí len ten statický obrázok. Na tie dynamické obrázky som zatiaľ veľmi neskúsený, aby som to robil!
c)
Našiel som tú chybu, tak ako ste hovorili (teda písali), bola tam navyše jedna 1...

1)
Ešte by som sa chcel spýtať na podmienky if:
O čo sa mi jedná. Mám rovnicu, kde mi môže vzísť výsledok „n“ celé číslo (1, 2, 3,....) alebo reálne číslo (1.1, 1.2, 1.3,...)-teda s desatinou čiarkou.
Či mi stačí napísať príkaz:
(if (= n int)) ;n je rovné celému číslu
(počítaj „takto“)
(if (= n real)) ;n je rovné reálnemu číslu
( počítaj „takto“)
2)
Prosím vás ako sa dá navoliť hladina a typ čiary pre daný objekt, ktorý je zadaný v lispe. Napríklad obdĺžnik: chcem aby bola hladina nar: „obrys“ a aby čiara bola bodkočiarkovaná. Pritom táto hladina už existuje vo výkrese. A dá sa zmeniť aj hustota tej pobdkočiarkovanej čiary?
3)
Akým spôsobom sa dá zrotovať (otočiť) napr. obdĺžnik urobený z priamok, pod daným uhlo. Napríklad:
(setq d (getpoint))
(setq d "@0,0")
(command "_line" d "@70,0" "@0,140" "@-70,0" "c" "")
A teraz už ho len zrotovať podľa uhla A... (toto je ale len jednoduchý útvar. Budem používať zložitejšie útvary.)

Hádam toho nechcem priveľa :-/ Ale keď to nemám od koho zistiť...
Ale ďakujem za vašu trpezlivosť so mnou :-)

chlebovsky
22.08.2007, 23:02
obrázek v dialogu.
do dialogu DCL musíte vytvořit záznam o tom obrázku :
: image {key = "IMG";height = 10;width = 20;}
pak musíte vytvořit samotný obrázek, to si jej nakreslete v autocadu na obrazovce a pomoci příkazu _mslide sejmete obrazovku do souboru SLD, něco jako printscreen....
ten si uložte někam na disk.
dále do lispu mezi (new_dialog...)   a (start_dialog) napište definici pro doplnění toho obrázku
 
(start_image "IMG")  ;;; otevírám image pro editaci(fill_image 0 0 (dimx_tile "IMG") (dimy_tile "IMG") 0) ;;; image vybarvím barvou 0 = pozadí(slide_image 0 0 (dimx_tile "IMG") (dimy_tile "IMG") "I:\\LSP\\CadForum\\ENst.sld") ;;; do image dosadím obrázek sld kde dimx_tile a y je získání max. velikosti obrázku v pixelech je to vlastně rozměr odkud kam má být ten obrázek v tom image vložený(end_image) ;;; zavírá obrázek pro editaci
 
tak to je k tomu obrázku vše.
 
 
k IF :
samotná sintaxe je
 
(IF (podmínka)
  (progn

     (toto se provede když podmínka je TRUE)
     (toto se provede když podmínka je TRUE)

     (toto se provede když podmínka je TRUE)
  )

  (progn

     (toto se provede když podmínka je FALSE)
     (toto se provede když podmínka je FALSE) 
     (toto se provede když podmínka je FALSE)
     (toto se provede když podmínka je FALSE)
     (toto se provede když podmínka je FALSE)
     (toto se provede když podmínka je FALSE)
     (toto se provede když podmínka je FALSE)
   )

)
 
tím progn docílíte toho že můžete mít více kroků co se dá udělat.....
 
teď podmínka pokud požadujete zjistit zda je to celé číslo tak ta vaše
(= n int) nelze protože int není vůbec definováno a neznamená to integer....
pokud by to měla být funkce pak by byl zápis podmínky takový :
 
(int n) to by vracelo buď true nebo false ale musela by být někde definovaná funkce int
 
já ale používám toto :
 
(if (= 0 (- n (fix n)))
  (progn ;;; je celé
  )
  (progn ;;; je reálné
  )
)
funguje to tak že třeba )120.5 - (zaokr 120.5)) = 0.5 a to není 0 proto je to reálné
 
co se týče hladin a typů čar, tak záleží na tom jak vytváříte ty obdélníky. dle vaší zprávy vidím že používate komandovou metodu, což já už nepoužívám, je hodně nedokonalá... já používám (entmakex....) ale vysvětlím tu Vaší. to co nakreslíte je vždy nakresleno tak jak je nastaveno aktuálně třeba hladina, barva.....
 
teď jak to změnit :
barva :   (command "_cecolor" 125) kde 125 je barva
0 = dleblok
256 = dlehlad
v rgb "RGB:125,58,54" atd...
 
hladina :
totéž ale příkaz clayer
 
typčáry :
rovněž to samé ale příkaz celtype :
 
musí ale ta hladina a typ čáry existovat...
 
co se týče nakreslení obdélníku tak doporučuju toto
;;; zadání prvního bodu
(setq b1 (getpoint "\nZadej počáteční bod"))
 
;;; výpočet souřadnice b2 pomoci polárních souřadnic
(setq b2 (polar b1 0.0 70.0))
;;; kde polar je funkce, 0.0 je úhel 70.0 = délka
;;; pozor uhel je v radianech
 
;;; třetí bod spočítáme přídavkem od předchozího (např)
(setq b3 (list
              (car b2) ;;; získá x z bodu b2
              (+  (cadr b2) 140.0) ;;; získá y z bodu b2 a přičte 140)
))
;;; tady získáme bod složením pomoci list souřadnic (list x y z) kde x získáváme z b2, y z b2 + 140 a z je zbytečné.
 
;;; poslední souřadnici obdobně jako b3
(setq b4 (list (car b1)(cadr b3)))
;;; snad je to jasný, x získáme z b1 a y z b3
 
 
no a můžeme kreslit :
 
(command "_line" b1 b2 b3 b4 "_c" "")
doporučuju to "c" psát s podtržítkem
"c" funguje jen v ANG cadu
"_c" funguje všude ale to písmenko musí být z ang
nelze "_u" kde u=uzavřít... to nejde....
 
jak jsem zmínil před tím tak existuje i druhá metoda a ta by vypadala takto
(setq ent (entmakex (list
         (cons 0 "LINE")
         (cons 8 "HLADINA")
         (cons 62 BARVA)
         (cons 10 b1)
         (cons 11 b2)
)
;;; je to složitější ale naprosto ovladatelné a navíc mám jméno té entity v proměnné ent
takže (entdel ent) mi ju smaže
 
ten zápis a jak se tvoří doporučuju toto :
(entget (car (entsel))) a klikněte  na libovolnou entitu, vypíše vám seznam parametru....
 
co se týče té rotace tak to je trošku problém protože musíte určit co chcete rotovat, a odkud a o kolik.
 
a pokud používate command tak získáte jen poslední entitu....
 
ale když budete používat zadávání polární tak je to všecko vyřešené...
(setq uhel 0.15) ;;; v radianech uhel o kolik natočit
(setq stred (list 0.0 10.0 0.0)) je bod kolem kterého požaduji otočit
 
(setq b1 (list 10.0 20.0 0.0)) je libovolný bod na obdelníku
tak já ho teď přepočtu
(setq b1 (polar stred (+ uhel (angle stred b1)) (distance stred b1))) tím je už bod otočený jak potřebujete a obdelnik se rovnou otočeně kreslí....
 
a teď teprve (command "_line" b1 b2......)
 
pokud se chcete trošku naučit v lispu, doporučuju koukat do cadu na lsp soubory, a hlavně používejte editační prostředí.....
 
to vám hodně po,ůže.
v cadu napište VLIDE a jste v programování.... dost dobrý, kontroluje závorky, barevně odlišuje......
 
jinak klidně koukněte na mé stránky www.vchlebovska.eu do stahuj mám tam pár (3) drobnosti taky koukněte na lsp.... já se tak učit...
 
jo jinak v tom vlide je skvělej help.... F1
 
Jinak kdyby jste chtěl nějaké prográmky vytvořit, není problém, i nějaké školení bych dokázal provést.
 
Klidně se obraťte, mám na stránkách i email....
 
Zdravím Martin.

michaelflyer
02.09.2007, 20:01
Konečne som pochopil ten "entmakex" a funguje mi všetko správne :-) ... Jedine nechápem, keď chcem kreslit poliline alebo arc...
Ďakujem Vám za pomoc.

Poslal som Vám aj e-mail.
S pozdravom Michal.

Ferdinand
03.09.2007, 17:13
F1. Pokud si chcete zjednodušit práci s 2D geom. útvary, tak je kreslete pomocí příkazu _rectang (CZ: obdélník) anebo _polygon , anebo ty jednotl. entity (line, arc, polyline, ...) slučte pomocí příkazu _pljoin (z ET) - pak je to 1 entita a dá se s tím rozumněji manipulovat.
Příklad:
Chci-li nakreslit obdélník 120x40, provedu tohle (průběh na přík. ř., zeleně = zadávám z klávesnice):
Command: _rectangSpecify first corner point or [Chamfer/Elevation/Fillet/Thickness/Width]: (zadám počát. bod)Specify other corner point or [Dimensions]: @120,40 <Enter>
 
F2. S tím otáčením: není problém v lispu v patřičném místě nechat výzvu pro výběr Objektů, Počátečního bodu rotace, Úhel otočení (v podstatě je to dané průběhem funkce _rotate) - sledujte přík. řádek (fialové = pozn.):
Command: _rotateCurrent positive angle in UCS:  ANGDIR=counterclockwise  ANGBASE=0.00
Select objects:
Select objects:
Specify base point: _endp of (Shift+pravé myšítko)Specify rotation angle or [Reference]: 32 <Enter>Ferdinand2007-09-03 17:24:47