Zobrazit plnou verzi příspěvku: podíl vybraných čísel

Kackac
25.08.2007, 23:23
Dobrý den,napsala jsem si lisp, který vydělí dvě čísla, která coby text vyberu, a výsledkem přepíše třetí vybranou položku. Ale:1) mám pocit, že jdu s kanónem na mravence, šlo by to nějak jednodušeji?2) neumím na (entsel) aplikovat filtr na výběr textu, umím to jen na (ssget) pomocí (ssget ":s" '((0 . "TEXT"))), ale to mi u (entsel) hází "chyba: příliš mnoho argumentů". Když vyberu něco jiného, funkce se zhroutí. Ale (ssget) zase nechci použít, protože u něj neumím použít zadání výzvy, jestli to vůbec jde, jiný uživatel než já nebude vědět, co má vybrat, když ho autocad vyzve svým obecným "vyberte objekty". Tedy jak filtrovat výběr pomocí (entsel)?3) neumím ošetřit, aby mi funkce nespadla, když se s vybráním netrefím a kliknu do prázdna. Chtěla bych, aby mi program dával tak dlouho šanci, dokud se netrfím na text.4) nevím, jak a kde použít "blipmode", aby mi vysvítil vybranou hodnotu. Takhle má člověk pocit, že nic nevybral, když to není vidět.Pro programátora je to asi prkotina, ale já v tom pořád strašně tápu. Prosím poraďte...Zdrojový kód:;vypocte pomer dvou cisel pro efektivitu podlazi(defun c:pomer_ploch ();citatel  (setq cst (car (entsel "\nvyberte cistou plochu " ))) ;vybere jeden prvek  (setq e1data (entget cst)) ;data prvku  (setq e1sez (assoc 1 e1data)) ;podseznam - textova hodnota  (setq cista (cdr e1sez)) ;hodnota textoveho retezce  (setq ccista (atof cista)) ;prevede text na cislo  (princ (strcat "\ncista plocha je: " cista));jmenovatel  (setq zst (car (entsel "\nvyberte zastavenou plochu " ))) ;vybere jeden prvek  (setq e2data (entget zst)) ;data prvku  (setq e2sez (assoc 1 e2data)) ;podseznam - textova hodnota  (setq zast (cdr e2sez)) ;hodnota textoveho retezce  (setq czast (atof zast)) ;prevede text na cislo  (princ (strcat "\nzastavena plocha je: " zast));vypocet podilu  (setq pom (/ ccista czast)) ;vypocte pomer dvou cisel  (setq pomer (rtos pom 2 2)) ;prevede cislo na text  (princ (strcat "\nefektivita je: " pomer " %"));prepsani textu  (setq ef (car (entsel "\nvyberte text s efektivitou k prepsani " ))) ;vybere jeden prvek  (command "_change" ef "" "" "" "" "" "" pomer) ;kdyz to otaci text pridat "" (bude tam 6x "" )  ;__misto posledniho radku s prikazem "_change" lze pouzit nasledujicich 5 radek  ;(setq e3data (entget e3)) ;data prvniho prvku mnoziny  ;(setq oldtxt (assoc 1 e3data)) ;podseznam - textova hodnota  ;(setq ef (cons 1 pomer)) ;zkonstruovani noveho podseznamu klice 1  ;(setq e3data (subst ef oldtxt e3data)) ;nahrazeni stareho podseznamu novym (natoceni 0)  ;(entmod e3data) ;modifikace seznamu)

chlebovsky
26.08.2007, 21:41
u výběru můžete použít jak entsel s potřebnou hláškou kterou napíšete rovnou do příkazu (entsel "Hláška"), ale můžete tak vybrat cokoliv, pak je třeba napsat podmínku kdy kontrolujete parametr  0-nula v entget aby byl "TEXT", nebo "LINE" "CIRCLE".....
teď to dát do cyklu
(setq ent1 nil)(while (or (not ent1)(and ent1 (/= (cdr (assoc 0 (entget (car ent1)))) "TEXT")))(setq ent1 (entsel "\nVyber .....")))
ted máte zaručeno že máte vybraný text.
 
Pak je ještě ale druhý způsob pomocí Vašeho SSGET, jen je třeba před tento výběr na monitor vypsat hlášku o výběru čeho :
takže
(princ "\nZpráva")
(setq ent (ssget........))
to \n znamená na nový řádek
\r zase znamená na téže řádek....
to jestli máte zadanou hodnotu či né, je lehké ošetřit :
 
(setq ent (entsel......))
(if (not ent) ;;; když není ent
  (alert "Nebylo nic vybráno") ;;; dá hlášku
  (progn  ;;; tady pokračuje když je podmínka neplatná
     .....
     .....a tady může být další vložená podmínka
      (setq ent2 (entsel))
      (if (not ent2)
          (alert "Nebyla vybrána druhá entita")
          (progn
              ......
           )
      )
     .....
   )
)
 
to co jsem ale popisoval na začátku, ten malý lispek, tak ten nedovolí nevybrat, jedině když to zrušíte Escapem.
 
co se týče toho zvýraznění tak já používám :
(redraw ent 3)  zvýrazní
2 - vypne úplně viditelnost
1 - tu viditelnost vráti do viditelné podoby
3 - jakože vybere
4 - to vybrání zruší
 
a vložil bych to hned za cyklus while když už máte jasný výběr, ale pozor ent musí být jen jméno entity kód -1 takové to <Jméno entity: 7efc8dd8>
nikoliv celý seznam (entget ) takže (cdr (assoc -1 (entget (car entsel))))
 
Snad vše :-)
 
Zdravím

Kackac
29.08.2007, 23:13
To je paráda, ono to funguje! Dokonce se mi povedlo i ošetření výběru čísla a ne slova, při slovech
to padalo na dělení nulou. Sice mi těch pět řádků trvalo asi hodinu a
půl, než to bylo funkční, ale teď se z toho raduju o to víc[QUOTE=chlebovsky] (while (or (not ent1)(and ent1 (/= (cdr (assoc 0 (entget (car ent1)))) "TEXT")))[/QUOTE]Tady mi to házelo chybu qůli tomu car, ale když jsem ho vyhodila a nechala tam jen (entget ent1), tak je to v pohodě. Akorát se nějak nemůžu vyznat ve významu AND, NOT a OR. Mám sice u ruky knížečku, kde je napsáno, co to dělá, ale když se snažím přeložit ten řádek v citaci, hrozně se do toho zamotám. Nemohl byste mi ještě, prosím, nějak jednoduše přechroustat tu sekvenci?

Vladimír Michl
30.08.2007, 00:05
V "člověčině" je to:
Opakuj pokud je ent1 prázdná nebo pokud typ ent1 není TEXT

chlebovsky
30.08.2007, 08:32
Jo je to tak, ale ještě bych doplnil :
Opakuj (pokud je ent1 prázdná) nebo (pokud ent1 je vybrána a je různá od text)
 
a závorkově :
(nebo (ent1 je prázdná)(a (ent1 je vybrána)(ent1 není text)))
 
Tímto si ale nedovoluju opravovat předešlý mejlík... nechtěl bych učit orla létat

Kackac
28.09.2007, 23:26
Omlouvám se za odmlku, nějak nebyl čas...Vysvětlení p. Chlebovského je to co jsem potřebovala; to co psal p. Michl jsem tak nějak celkově chápala, nešly mi samostatně ty závorky, knížka totiž o AND, OR, NOT pojednává způsobem, že popíše v kterých případech jaký příkaz vrátí TRUE a kdy NIL a to pro neprogramátora je naprostá španělština, takže mě vůbec nenapadlo to chápat doslova přeloženo jako spojky a s konvencí matematických operací:)Tedy díky

Ferdinand
09.10.2007, 14:31
[QUOTE=Kackac]...když ho autocad vyzve svým obecným "vyberte objekty". ...[/QUOTE]
Lze použít vlastní výzvy  (pokud nastavíte cmdecho=0)
...a před výkonem funkce lze napsat (prompt "\nMojevýzva1...")