Zobrazit plnou verzi příspěvku: Zoznam cyklicky pridávaný do zoznamu a kótovanie

michaelflyer
03.07.2008, 16:00
Dobrý deň.

Potreboval by som poradiť. Mám zoznam čísel v stĺpci (sú uložené v txt súbore). Potreboval by som ich dať do zoznamu.

(setq a (read-line f))
(while (>= a nil) ;tu chcem aby to opakovalo a pridávalo čísla do zoznamu
           (setq a (atof (read-line f)))
           (setq a (append a n)) ;tu neviem ako ďalej. Chcel som, aby mi vyhodil zoznam a znovu pridal ďalšie číslo do zoznamu až dokedy a = nil.
           (princ a)
           )
            )

Ako by sa dalo zadať kótovanie dielca (nejakého štvor, päť, šesťuholníka) tak aby nešla kóta do dielca ale iba po obvode (okrem uhlov). To čo som sem dal to je dosť idealizované. Málo kedy mám takýto dielec a môže byť akokoľvek otočený.

alfred
03.07.2008, 17:09
a co takhle?(setq radek (read-line ff))(while (/= radek nil)   (setq a (append a (list (atof radek))))   (setq radek (read-line ff))   (print a));while

alfred
03.07.2008, 17:15
Jinak jeste vysvetlim proc Vam to neslo. (setq a (atof (read-line f)))
nacte string a zmeni na cislo, v "a" je tedy realne cisloa to nemuzete pouzit v prikazu append, ktery spojuje listy.Navic jste ve Vasem prikladu prisel o prvni radek (ctete ho pred while a hned ctete radek druhy) a pri cteni konce souboru nastala chyba protoze prevadite na relne cislo nil.

michaelflyer
03.07.2008, 18:38
Ďakujem za pomoc a aj vysvetlenie. Tu mi však nastáva problém. Ako stým zoznamom ďalej pracovať. Nejako som to nedomyslel!!!
Mám zoznam a myslel som si, že keď zadám:

(max a)

tak mi vypľuje číslo. No namiesto toho sa mi dostalo eror-u... Skúšal som aj nejako včleniť max do list-u:

(setq x (append (max) (a)))


ale márne...


Viem že problém robia zátvorky. Potrebujem dosiahnuť to, aby tam neboli.
michaelflyer2008-07-03 18:44:11

alfred
03.07.2008, 19:26
Co vlastne potrebujete? Pracovat se souborem, nebo zjistit maximum?
Funkce max nepracuje s listem ale se zadanymi cisly, musel by jste je do toho max z listu vytahnout...

Pokud potrebujete nejvetsi cislo ze souboru tak pri cteni cisel porovnavejte kazdou novou hodnotu s "rekordem" a pokud je hodnota vetsi zvetsite "rekord".

Pokud uz list mate, tak pouzijte
(last (vl-sort a '<))

kde "a" je list.

alfred
03.07.2008, 19:29
Jinak jeste doporucuji si projit v napovede VisualLispu cast "List Manipulation Functions", kde je pekny prehled funkci na praci s listy, coz je vec ktere se v LISPu nevyhnete...

michaelflyer
03.07.2008, 20:25
Chcel som získať súradnice max x, max y, min x a min y. Mám dielec a chcel som napríklad zakótovať jeho max rozmery, alebo urobiť okolo neho obdĺžnik. Pôvodná myšlienka bola uloženie do txt súboru súradnice x a y a program mi nájde max. a min. súradnice.

alfred
03.07.2008, 20:59
Pak asi bude lepsi moznost s tim listem. Jeden pro X a druhy pro Y. Seradit podle oba velikosti a zjistit prvni a posledni hodnotu listu. Praci se souborem bych se uplne vyhnul.

chlebovsky
03.07.2008, 21:24
Pokud mohu vstoupit do Vaší debaty, tach bych Váš problém rozdělil do dvou částí.
 
a) načtení souboru do seznamu
b) práce se seznamem
 
začnu tou dvojkou, je to jednodušší.
 
Řekněme že náš seznam bude vypadat :
( (x1 y1) (x2 y2) (x3 y3) (.............) ..............)
 
vytvořím si pomocný například takto :
(setq sez (list (list 0 0)(list 1 0)(list 2 5)))
 
pak jak získat z toho x souradnice :
(setq x (mapcar 'car sez))
 
a obdobně y souřadnice

(setq y (mapcar 'cadr sez))
 
pak jak získat minimum z x
(setq minx (eval (cons 'min x)))
 

pak jak získat minimum z y
(setq miny (eval (cons 'min y)))
 
s maximi je to stejné ale místo min bude max
 
teď je dobré někdy znát počet členů v seznamu
(setq pocet (length sez))
 
pak 1. člen je (car sez)

pak 2. člen je (cadr sez)
pak 3. člen je (caddr sez) přidává se d ale někdy to musí skončit
proto existuje funkce nth
 
takže i-tý člen je (nth i sez)  pozor začíná se 0 takže 1 člen je vlastně
(nth 0 sez)
 
máme tedy řekněme druhý člen
(setq clen (nth 1 sez))
 
x získáme (setq x1 (car clen))
y získáme (setq y1 (cadr clen))
 
celé se to může hodit do ciklu a budeme mít nějaké pocitadlo i a pak projití všech členu bude
(nth i sez) a i bude každým krokem o 1 větší
 
takže toto byl popsaný v rychlosti seznam, já si na něj zvykl a moc se mi líbí :-) je však spousta dalších funkcí, ale toto jsou ty úplně nejzákladnější
 
a k tomu souboru, další zpráva :-)
 

chlebovsky
03.07.2008, 21:39
A ted k tomu nactení ze souboru.
Soubor může obsahovat klidně jak x tak y souřadnice, vše záleží na samotné syntaxi toho souboru, může být prováděna i kontrola zda nechybí souřadnice... zda jsou to čísla atd...
 
ale začnu tím nejjednodušším
soubor bude tvořený každou souřadnicí ale i x a y zvlášť na každém řádku
pak bude vypadat takto :
x1
y1
x2
y2
x3
y3
možno klidně i z
pak samotné načítání se zdvojuje :
(setq x (atof (read-line file)))...

(setq y (atof (read-line file)))...
stačí kontrolovat to x protože pak by měla vždy následovat y souřadnice
a to zacyklid dokud není nil
ale v každém kroku načítat oba řádky a seznam pak tvořit
takto :
(setq sez nil)
(... cyklus....
     (setq sez (append sez (list (list x y))))
)
 
je to nejjednodušší.
 
pak ale je možné psát to ve přesně daném formátu s přesně definovanými počty čísel např. souřadnice před tečkou 4místa+tečka+2místa
 

(xxxx.xx yyyy.yy)
(xxxx.xx yyyy.yy)
(xxxx.xx yyyy.yy)
 
např takto :
(0010.15 0000.00)
(0020.00 0010.45)
...atd...
prostě přesně strukturovaný
pak načtu řádek (setq radek (read-line file))
(while (/= radek nil)

  (setq x (atof (substr radek 1 7)))
  (setq y (atof (substr radek 9 7)))

  (setq sez (append sez (list (list x y)))) (setq radek (read-line file))
)
 
a zase máme seznam.....
 
nejhorší a nejsložitější je varianta když se používá oddělovač a to třeba , a není znám počet znaků
pak soubor může vypadat takto :
 
(125.125,-89654.12589)
(12,0)
(-478.1258985425,985.256)
 
tam je třeba načíst opět řádek
(setq radek (read-......)) stejně jako předtím
když není nil tak bude provádět cyklus a tam bude :
 
1) musí být kontrola že první znak textu radek je "("
2) pak bude cyklus po celé délce textu od pozice 1 tak dlouho dokud nenarazí na , to bude načítat do textové proměnné X tu pak převede na x číselnou, to samo zase pokračovat dokud nenajde ")"
dále tam může být kontrola že tam jsou znaky 0-9 a maximálně jedna . a jen jedno minus.... a další kontroly, ale to už je opravdu velice složitý idělat, to spíš vytvořím a pošlu....
 
já bych ale doporučil to dělat tou druhou variantou, protože stejně jako 0 se chová i mezera, a pokud vím tak třeba excel dokáže krásně vyexportovat do txt souboru přesný počet míst.... a doplní mezerama....
 
takže ta druhá varianta je snad nejlepší, a nejrychlejší na vytvoření.
 
Ta třetí zase nejlepší na obsluhu zvenčí :-)
 
Když tak napište a něco sesmolím :-)

michaelflyer
04.07.2008, 09:51
p. Chlebovsky :
Pokud mohu vstoupit do Vaší debaty
Kedykoľvek....

Nenapadlo ma, že to môžem nahádzať hneď do list-u... To sa mi páči. Nemusím čítať zo zoznamu, a takto je program kratší a hlavne prehladnejší!

Mám ešte pár otázok:
1)máme tedy řekněme druhý člen – Trošku som nepochopil na čo ho budem potrebovať.... Nechápem to...
(setq clen (nth 1 sez))

x získáme (setq x1 (car clen))
y získáme (setq y1 (cadr clen))

celé se to může hodit do ciklu a budeme mít nějaké pocitadlo i a pak projití všech členu bude
(nth i sez) a i bude každým krokem o 1 větší

2)ten zoznam by bolo dobré nejako vyčistiť. Keď vyberiem prvý dielec, tak mi urobí obrys dobre. Potom vyberiem druhý dielec a min (poprípade max) súradnice si zapamätá s prvého obrysu. Vtedy urobí zle obrys...

Takto som to spackal:
(defun C:OBR (/)

(PRINC "\nVyber dielec:")
(setq ent (ssget ))
(setq cislo_posled_entity (sslength ent))
;;;nájde poradové číslo posled entity (treba očítať 1)
(setq meno_posled_entity (ssname ent (1- cislo_posled_entity)))

(setq n 0)

(while (<= n (1- cislo_posled_entity))

    (setq entita (ssname ent n))
    (setq zoznam_entity (entget entita))
    (setq surad_bodu_a (cdr (assoc 10 zoznam_entity)))
    (setq surad_bodu_b (cdr (assoc 11 zoznam_entity)))

    (setq surad_x_y (append surad_x_y (list surad_bodu_a surad_bodu_b)))

    (print surad_x_y)
    (setq n (1+ n))
    (princ n)
);while

;;;pak jak získat z toho x souradnice :
(setq x (mapcar 'car surad_x_y));;;a obdobně y souřadnice
(setq y (mapcar 'cadr surad_x_y))
(setq minx (eval (cons 'min x)));;;pak jak získat minimum z x
(setq maxx (eval (cons 'max x)))
(setq miny (eval (cons 'min y)));;;pak jak získat minimum z y
(setq maxy (eval (cons 'max y)))

(setq bod_a (list minx miny)
     bod_b (list maxx miny)
     bod_c (list maxx maxy)
     bod_d (list minx maxy))

(setq pocet (length surad_x_y));;;teď je dobré někdy znát počet členů v seznamu

;;; vykreslenie obdĺžnika okolo dielca
(setq ent1 (entmakex (list      (cons 0 "line")
                     (cons 8 "podorys stena")
                    (cons 10 bod_a)
                     (cons 11 bod_b))))
(setq ent2 (entmakex (list      (cons 0 "line")
                     (cons 8 "podorys stena")
                    (cons 10 bod_b)
                     (cons 11 bod_c))))
(setq ent3 (entmakex (list      (cons 0 "line")
                     (cons 8 "podorys stena")
                    (cons 10 bod_d)
                     (cons 11 bod_c))))
(setq ent4 (entmakex (list      (cons 0 "line")
                     (cons 8 "podorys stena")
                    (cons 10 bod_d)
                     (cons 11 bod_a))))
)

Ďakujem vám obom za pomoc.

chlebovsky
04.07.2008, 11:42
k té 1) jsem chtěl jen jakoby vysvětlit, že ze seznamu jdou vytáhnout i jednotlivé části, jen jakoby na ukázku, pro vás to samozřejmně v tomto případě význam nemá, ale do budoucna, např, první člen může být něčím specifický, třeba nějaký popis... tak tímto ho dostanete :-) takže jen na ukázku.
 
tak teď k 2)
a) chápu to dobře že máte nakreslené úsečky a z nich čerpáte body, protože kdyby to byly křivky neměl by jste všechny boby..... atd, kružnice měl by jste střed, proto by to chtělo do toho ssget-u dát filtr na usečky
a to takto :
(setq ent (ssget (list (cons 0 "LINE"))))
 
b) pak tam máte cyklus, trošku zbytečně složitý, k tomuto účelu bych použil repeat :
  (setq poc (sslength ent))   (setq n 0 surad_x_y nil)
  (repeat poc
  ....
  ....
     (setq n (1+ n))
  ) 
 
c) ten seznam surad_x_y by bylo dobre na zacatku nilovat, aby nedoslo k plnění nějaké staré verze seznamu.... dělám to před cyklem
 
d) ten print a princ my připadá naprosto zbytečný, teda pokud nepotřebujete vidět, jak se seznam tvoří, ale strašně to vypisování zdržuje program :-) takže doporučuju nedělat :-)
 
e) pak by bylo dobré tu hranici třeba tvořit né usečkama ale křivkou :
 
takže pak prográmek bude :
(defun C:OBR (/ ent poc n entita zoznam_entity surad_bodu_a surad_bodu_b surad_x_y x y minx miny maxx maxy bod_a bod_b bod_c bod_d ent1 ent2 ent3 ent4 obvod)   (PRINC "\nVyber dielec:")   (setq ent (ssget (list (cons 0 "LINE"))))   (setq poc (sslength ent))   (setq n 0 surad_x_y nil)  (repeat poc ;;; repeat (1)    (setq entita (ssname ent n))     (setq zoznam_entity (entget entita))     (setq surad_bodu_a (cdr (assoc 10 zoznam_entity)))     (setq surad_bodu_b (cdr (assoc 11 zoznam_entity)))     (setq surad_x_y (append surad_x_y (list surad_bodu_a surad_bodu_b)))     (setq n (1+ n))   ) ;;; konec repeat (1)
  (setq x (mapcar 'car surad_x_y))  ;;; získá x - souřadnice  (setq y (mapcar 'cadr surad_x_y)) ;;; získá y - souřadnice  (setq minx (eval (cons 'min x)))  ;;; minimum z x  (setq maxx (eval (cons 'max x)))  ;;; maximum z x  (setq miny (eval (cons 'min y)))  ;;; minimum z y  (setq maxy (eval (cons 'max y)))  ;;; maximum z y
  (setq bod_a (list minx miny)         bod_b (list maxx miny)         bod_c (list maxx maxy)         bod_d (list minx maxy))
  ;;; vykreslenie obdĺžnika okolo dielca   (setq obvod (entmakex (list (cons 0 "LWPOLYLINE")(cons 67 0)(cons 100 "AcDbEntity")(cons 8 "podorys stena")(cons 100 "AcDbPolyline")(cons 90 4)(cons 70 1)(cons 43 0.0)(cons 38 0.0)(cons 39 0.0)         (cons 10 bod_a)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_b)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_c)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_d)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))))
 

alfred
04.07.2008, 12:10
Pokud to chcete jeste zlepsit, tak pridejte test na prazdny vyber usecek - ted to pri prazdnem vybery spadne. To delalo to while a repeat nedela. Nicmene i s while by to pri prazdnem vyberu spadlo pozdeji.

Jinak ja osobne bych preferoval vykresleni prikazem command. Podle me je to "blbovzdornejsi" pro pristi verze cadu a taky pochopitelnejsi. Navic to obdelnik vykresli s aktualnim nastavenim kreslicich nastroju (hladina, cara, ...), coz povazuji za vyhodu.

chlebovsky
04.07.2008, 12:33
jasný, s tím hlídáním to je naprostá pravda :-)
takže byla by podmínka za ssgetem :
 
(setq ent (ssget (list (cons 0 "LINE")))) 
(if ent
  (progn    (setq poc (sslength ent))

    ....
    ....
    ....
    ....
    ....
(setq obvod (entmakex (list (cons 0 "LWPOLYLINE")(cons 67 0)(cons 100 "AcDbEntity")(cons 8 "podorys stena")(cons 100 "AcDbPolyline")(cons 90 4)(cons 70 1)(cons 43 0.0)(cons 38 0.0)(cons 39 0.0)         (cons 10 bod_a)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_b)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_c)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)         (cons 10 bod_d)(cons 40 0.0)(cons 41 0.0)(cons 42 0.0))))   ) ;;; zavira progn
 ) ;;; zavira if
) ;;; zavira defun
 
A ted command vs entmakex - něco má své pro, něco proti....
Když jste v jiném souřadném systému než globále, tak pomoci entget načtete global souřadnice, a comandem by jste vložil obdelník úplně jinam, musel by se provest, mám dojem (trans.....) a nějaké parametry, pak command se chytá na uchopy.... ale zase přebírá aktuální nastavení hladit, typů.... atd..
 
nicméně entmakex je složitější na tvorbu, ale nikdy nezklame, a vždy v globálu¨, a co se týče parametrů hladin... atd není nic jednoduššího než psát
(cons 8 (getvar "clayer"))(cons 62 (getvar "cecolor")).... a je to to samé....
anebo to natvrdo přiřadit.
Pokud by jste chtěl danou křivku nakreslit pomoci comandu, v jiné hladině, musíte napřed přednastavit tu hladinu, hlídat zda existuje.... entmakex ji automaticky vytvoří když není.... atd....
 
záleží ze které strany se na to díváte :-)
 
Já třeba propadl víc tomu vnitřnímu tvoření.... ale občas i command je potřebný, třeba pro vložení bloku :-)
 
Takže určitě oba způsoby jsou správné.

alfred
04.07.2008, 13:31
Me se vzdycky to "vnitrni tvoreni" zdalo zbytecne slozite.
Obaval jsem se toho, ze mezi verzemi CADu pridaji k zaznamu entity dalsi vlastnost. Zkousel jste si porovnavat jak jsou kompatibilni definice u jednotlivych verzi CADu?

Taky jsem se obaval, ze si nejakou chybou v utilite zanesu chybu do databaze vykresu.

chlebovsky
04.07.2008, 14:12
Dělám v Cadu od 12 do 2007 a přechody z nižší do vyšší nikdy, žádný problém nebyl..... (no dos a win :-) ,prostě nová vždy pracuje se starou, opačně jsem to ještě neskoušel :-) Ale spousta nových parametrů jako reaktory.... skupiny..... se ukládají v tabulkách pod nějakým názvem entity a na ten se naše tvořená jen odkazuje kodem 330 většinou, takže když člověk nezachází opravdu do extrémů, mezi xrecordy a reaktory, aby to vše spolupůsobilo, tak k ničemu nedochází.....
 
já právě řeším program na tvorbu terénu, 3d model, vrstevnice, řezy terénem, načítání bodů ze souboru... pak návrh železniční tratě, vyhýbky, stanice, a pak následně příčné řezy se statickým výpočtem podloží, a celé 3d vykreslení tělesa i s kolejnicemi, řeší to více lidí na fakultě a já jsem jedním z nich, takže né sám, a řešíme to opravdu do extrému, že když někde změním jeden bod terénu, tak to musí kompletně samo překreslit dotčené trasy, příčné řezy ...... a naopak.
 
a to už pak jsou reaktory, xrecordy a jiné záznamy v tabulkách které jsou trošičku odlišné verze od verze, ale opět fungují vždy nahoru bezvadně, proto je dobré to vyvýjet vždy v té nejnižší co to podporuje, a máte jistotu že nahoru to bude fungovat.
 
u comandu je to zase jednodušší v tom že stačí dát _prikaz a funguje.... ale vytvoříte jen základnáí kreslící prvky.... nic víc.
 
Rozšířená data k tomu už třeba nedoplníte. Což třeba používám u bodů. Vytvořím bod v prostoru x.y.z klasický POINT a v jeho rozšířených datech mám uložené jeho číslo, třeba 50, vedle toho 51.
Pak mám definovanou usečku spojnice bodů 50 a 51. A tam nahozené reaktory. Takže když posunu bod, celý se to překreslí.... i včetně všech těch spojnic, kterých jde do bodu třeba 10.... atd,..... atd... a to už commandama nejde, proto jsem si na to tak hodně navykl a oblíbil si to. A command vypustil.
 
Ale tím nechci od něj odrazovat. Na začátku jsem to taky takhle řešil. :-)

alfred
04.07.2008, 14:32
zkousel jsem si to
(cons 62 (getvar "cecolor"))
a nechodi to.
getvar vrati string a ja potrebuji cislo, coz neni problem u barev 1-255. Narazim ale u DLEHLAD, RGB barev, kde pri prevodu stringu na cislo dostanu nulu - tedy DLEBLOK.
Je to vec nazoru a mozna ze pro slozite veci se tomu clovek nevyhne, ale ja zustavam u command...
:-D

michaelflyer
04.07.2008, 14:47
p. Chlebovsky
No bol by som rád keby som to naprogramoval, aby bralo do úvahy aj oblúky. Ale na to nemám, tak sa radšej do toho ani nehrniem... Ale ak by ste mi chcel s tým pomôcť, tak som samé ucho, teda oko....
Inak skadiaľ chodíte na tie nápady...
(setq minx (eval (cons 'min x)))
na to by som neprišiel... Mám síce veľmi málo skúseností, tak je to pochopiteľné...

p. Alfred:
Ja používam tiež rozšírené dáta pre vytvorenie čohokoľvek. Je to stabilnejšie ako command...
A čo sa týka nastavenia hladín, typu čiary a pod., tak to je len vecou nastavenia. Stačí len do lispu nahrať aktuálne hodnoty a tie použiť pri vytváraní rozšíreného zoznamu...

chlebovsky
04.07.2008, 15:24
jojo jasný, já to psal trochu všeobecně, je tam třeba testovat když je to :
BYLAYER "DLEHLAD" pak to bude 256
BYBLOCK "DLEBLOK"  pak to bude 0
pokud je to RGB nastavuje se "RGB:XXX,XXX,XXX"
jinak je to 1-255
jenže do 62 se ukládá jenom 0-255
v případě 256 = dlehlad se prostě položka 62 vypouští nebo uvede 62.256
 
a co se týče RGB :
tak do 62 se ukládá podobná barva a do kodu 420 se uloží binární kod RGB barvy a to takto
256*256*R + 256*G + B takže v případě 210,219,36 bude
(62.52)(420.1318660)
 
Jinak na dotaz p. michaelflyer kde na to chodím :-)
to jsou léta praxe cca 15let, a jak člověm narazí na jakýkoliv problém, tak radí různé fóra, jak americe tak tady naše nejlepší Cad Forum :-) a když zklame naprosto všecko tak poradí někdy to, že se obrátím přímo na toho nejvyššího z tohoto fora, tam je jistota, ten poradí vždycky :-) a to je p. Michl :-)
 
Kdysy jsem natrefil na jednu knížku o lispu na verzi 11. velmi jednoduchá, ale právě takovéto vychytávky tam jsou, a zrovna ta s tím eval tam je na tomto příkladě :-) takže já nééé :-) napadlo mně jí někdy naskenovat a tady nabídnout, ale nevím zda to vůbec můžu udělat. Každopádně, není problém naskenit, a poslat v pdf na vytištění (autor promine, snad, když je z roku já nevím kolik před naším letopočtem) ale je to jen základ.... bez novinek....
 
 

michaelflyer
08.07.2008, 23:01
Prosím vás, ako by som sa zbavil nil-ových hodnôt z list-u? Viem, že max_arc_bod2 a max_arc_bod3 sú nil-ové. Ale chcem aby ich nebralo (nezapisovalo) do zoznamu (teda tie nil-ové hodnoty). Platí to pre každú premennú.

(setq surad_x_y (append surad_x_y (list bod_arc_a bod_arc_b max_arc_bod1 max_arc_bod2 max_arc_bod3 max_arc_bod4)))
Výpis súradníc:
((4323.11 3287.45) (4197.1 3967.82) (4236.03 3970.01) nil nil (4582.87 3623.18))michaelflyer2008-07-08 23:03:24

michaelflyer
09.07.2008, 13:28
Skúšal som to vymeniť za medzeru ale nefungovalo to.
(setq surad_x_y (subst (cons nil " ") (assoc nil surad_x_y) surad_x_y))
(entmod surad_x_y)
Už ma nič nenapadá. Nemá niekto ničo v zálohe?

chlebovsky
09.07.2008, 13:39
Vyhodit nil ze seznamu je špatný, to se musí dělat cyklem přez všechny položky, tam test zda je nil nebo není, když není ukládá do druhého seznamu, a tím pak přepíše ten první.
 
Ideální je ten nil do toho seznamu rovnou nepřidávat :

(if bod_arc_a (setq surad_x_y (append surad_x_y (list bod_arc_a))))
(if bod_arc_b (setq surad_x_y (append surad_x_y (list bod_arc_b))))
..
..
..

(if max_arc_bod4 (setq surad_x_y (append surad_x_y (list max_arc_bod4))))
 
prostě to do seznamu nedávat :-) a položky načítat postupně

michaelflyer
09.07.2008, 14:25
SUPER!!!!

Skúšal som aj obrysu arc-u (už ho len implementovať do pôvodného obrysu). Poviem vám, že žiadna sranda (predtým som sa asi podceňoval)!!!! Program má veľkosť 8kB. No možno som išiel na to veľmi zložito...
(if bod_arc_a (setq surad_x_y (append surad_x_y (list bod_arc_a))))
Inak nechápem ako to funguje. Ako to, že funkcia if (ak je nil-ová) nezapíše do zoznamu premennú...

alfred
09.07.2008, 15:19
pozorne si prectete napovedu k IF...

(if podminka ano ne)
"ano" se provede kdyz podminka NENI NIL
"ne" se provede kdyz podminka JE NIL

kdyz je podminka NIL a neni definovano "ne", tak funkce vrati NIL


chlebovsky
09.07.2008, 15:30
funkce if je vlastně založená na principu nějakého porovnání a vrací jeden ze dvou ukolů dle toho jak dopadne podmínka.



 
if podminka ukol1 ukol2
 
samotná podmínka vrací bud NIL nebo TRUE takže když celou podmínku nahradíte touproměnnou tak vlastně dle toho se chová ten if
 
Takže když je
(IF POD UK1)
tak pokud je POD zadáno, provede se UK1 jinak se má provést UK2 ale když není zadaný nic se neudělá.
 
Proto testuju tu proměnnou
 
(if bod_arc_a
když je tak proveď
(setq surad_x_y (append surad_x_y (list bod_arc_a)))
 
)
 

michaelflyer
10.07.2008, 08:02
"alfred": Nevedel som, že if dokáže pracovať aj len s jednou možnosťou. A ani neviem prečo to tak mám zafixované...

Ďakujem vám obom za pomoc.   

Kackac
12.07.2008, 22:18


[QUOTE=chlebovsky]Kdysy jsem natrefil na jednu knížku o lispu
na verzi 11. velmi jednoduchá, ale právě takovéto vychytávky tam jsou,
a zrovna ta s tím eval tam je na tomto příkladě :-) takže já nééé :-)
napadlo mně jí někdy naskenovat a tady nabídnout, ale nevím zda to
vůbec můžu udělat. Každopádně, není problém naskenit, a poslat v pdf na vytištění (autor promine, snad, když je z roku já nevím kolik před naším letopočtem) ale je to jen základ.... bez novinek....[/QUOTE]Jéje, kdyby autor prominul a vy jste byl té dobroty, moc bych vás o to prosila a byla vám posléze neskonale vděčná. Email posílám na PM.Kackac2008-07-12 22:23:44

michaelflyer
17.01.2009, 23:19
Prosím vás dá sa nejako vyfiltrovať z ssget zoznamu iba napríklad "LINE"? Ale z iného zoznamu ssget:
(setq vsetko (ssget))
(setq vyber_LINE_z_vsetko (ssget "_P" '((0 . "LINE"))))
Viem, že to červeným je asi blbosť... Ide mi o to aby vo "vyber_LINE_z_vsetko" boli iba "LINE". Chcem posunúť (move) všetky vybrané objekty, ale aby v zozname "vyber_LINE_z_vsetko" boli iba "LINE" s ktorým ďalej pracujem.
Dá sa to aj inak???

alfred
19.01.2009, 06:46
Napriklad tak, ze v cyklu projedete vyber "vsetko", u kazde entity mrknete na to co je zac a pokud je to LINE tak ji funkci "ssadd" pridate do "vyber_LINE_z_vsetko".

michaelflyer
20.01.2009, 07:35
Urobil som to cez repeat, ale to je nepodstatné. Mám problém s pochopením zápisu "ssadd":
(repeat poc_vyber_vsetko
    (setq meno_ent (ssname vyber_vsetko i))
    (setq zoznam_entity (entget meno_ent))
    (setq zisti_line (cdr (assoc 0 zoznam_entity)))
    (if     (= zisti_line "LINE")
      (progn
     (setq vyber (ssadd meno_ent))
     (princ vyber)
      )
    )
    (setq i (1+ i))
)
Označené červenou mi vyhlási error. Ako to má správne vyzerať?

alfred
20.01.2009, 08:59
poprve se da:
(setq vyber (ssadd jmeno_entity))

pak se dava:
(setq vyber (ssadd jmeno_dalsi_entity vyber))

Funkce ssadd ma dva parametry, pricemz druhy (nazev vybery ke kteremu se pridava) je nepovinny.

michaelflyer
20.01.2009, 23:35
Ďakujem za pomoc. Ale stále mi to zapisovalo iba dve entity

alfred
21.01.2009, 06:51
ten Vas priklad by mohl vypadat takhle:(setq vyber nil) ;to jen pro poradek...(setq vyber_vsetko (ssget))(setq poc_vyber_vsetko (sslength vyber_vsetko))(setq i 0)(setq vyber (ssadd))(repeat poc_vyber_vsetko    (setq meno_ent (ssname vyber_vsetko i))    (if     (= (cdr (assoc 0 (entget meno_ent))) "LINE")      (progn        (setq vyber (ssadd meno_ent vyber));prikaz ssadd ma dva parametry!!!            (princ "pridano, celkem vybrano: ")        (princ (sslength vyber))        (print)      )    )    (setq i (1+ i)))(princ "Konec, celkem vybrano: ")(princ (sslength vyber))(print)

michaelflyer
21.01.2009, 20:43
Hmmm.. no už viem, kde som robil chybu
A ani som nevedel, že to čo ja mám rozpísané na troch riadkoch sa dá zistiť podstatne kratšie (pomocou entget).
Veľmi pekne ďakujem za pomoc.