Zobrazit plnou verzi příspěvku: výběr bloku v akt. prostoru

Ferdinand
09.09.2009, 15:58
Ve výkrese mám 2 rozvržení, v každém je vložen po 1 bloku RAZ--T1 (obsahuje atributy). Pro extrakci dat z hodnot atributů chci vybrat 1. blok a to právě v akt. prostoru (většinou je to Layout):
(setq AA (ssget "_X"(list (cons -4 "<AND")   (cons 0 "INSERT")   (cons 2 "RAZ--T*")   (cons 410 (getvar "ctab"))   (cons -4 "AND>"))))
což mi vrací
nil
- nemohu přijít na to, proč, když podmínky jsou splněny? V případě zápisu ve tvaru
(setq AA (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (2 . "RAZ--T*") (410 . (getvar "ctab")) (-4 . "AND>"))))
vrací
; error: bad SSGET list value
- proč?

alfred
09.09.2009, 19:39
nevim, zda se mi to dobre krome toho (getvar "ctab")Zkuste tam zapsat  primo hodnotu, nebo si to zjistete predem.

Vladimír Michl
09.09.2009, 21:45
V tom druhém zápise chybí (cons), ale ten první vypadá snad dobře. Nekomplikoval bych to tím AND - zřetězené podmínky jsou automaticky "and".

alfred
10.09.2009, 07:07
Zkousel jsem to v MAPu 2006 a prvni moznost funguje. Druha ne.

iand
10.09.2009, 09:18
Jakýkoli seznam, tedy i filtrační, lze zapsat dvěma způsoby:
1. pomocí apostrofu, např.
'((0 . "INSERT")(410 . "1")))
2. pomocí klíčového slova 'list', např.
(list (0 . "INSERT")(410 . (getvar "ctab")))
Pokud je byť i jediná hodnota v seznamu proměná nebo výraz, funguje pouze druhý způsob.

Vladimír Michl
10.09.2009, 09:26
Nikoliv. Symboly "list" a "'" jsou v tomto případě naprosto rovnocenné. Zápis dle druhého způsobu nelze použít (chybí cons) - s LISTem to nijak nesouvisí.

alfred
10.09.2009, 12:07

[QUOTE=Vladimír Michl]Nikoliv. Symboly "list" a "'" jsou v tomto případě naprosto rovnocenné. Zápis dle druhého způsobu nelze použít (chybí cons) - s LISTem to nijak nesouvisí.[/QUOTE]Neni to tak.pokud doplnim cons(cons 410 (getvar "ctab"))tak samotny tento vyraz mi vrati napr. (410 . "Model") pokud je to ale v celem vyrazu '((-4 . "<AND") (0 . "INSERT") (2 . "RAZ--T*") (cons 410 (getvar "ctab")) (-4 . "AND>"))vraci to ((-4 . "<AND") (0 . "INSERT") (2 . "RAZ--T*") (CONS 410 (GETVAR "ctab")) (-4 . "AND>")) coz je samozrejme spatneV listu '() nemohou byt promenneviz help "As an alternative to using the list function,
you can explicitly quote a list with the quote function if there are no variables or
undefined items in the list."Maly priklad:(setq a 5) (list 1 a) .......vrati (1 5) '(1 a)  ...........vrati (1 A)

Vladimír Michl
10.09.2009, 12:57
Aha, to je pravda. Zápis:
 
(4 . (getvar "ctab"))
 
je chybný v každém případě (chybí cons), ale použití funkce quote (tedy ') zneplatní i tu cons verzi.

Ferdinand
15.09.2009, 10:03
Takže výrazy
(setq VYB1 (ssget "X" '((0 . "insert"))))(setq VYB2 (ssget "_X" (list (cons 0 "insert"))))
nejsou jedno a totéž? Mně se ale v obou případech vytvoří stejná (identická) výběrová množina.
 
Ještě něco:
pokud to zapíšu jako 3. způsob tj.
(setq S1  (entget    (ssname (ssget "_X" (list (0 . "INSERT") (2 . "RAZ--*") (410 . (getvar "ctab"))))     0    )  )  )
tak mi to vrátí
; error: bad argument type: consp "INSERT"Ferdinand2009-09-15 11:33:18

Vladimír Michl
15.09.2009, 10:30
Jsou "jedno a totéž". Jen v tom prvním nesmí být místo konstanty "insert" použita žádná funkce.

Ferdinand
15.09.2009, 11:43
A pokud to přepíšu na
(setq S1  (entget    (ssname      (ssget        "_X"        (list (cons 0 "INSERT")       (cons 2 "RAZ--*")       (cons 410 (getvar "ctab"))        )      )      0    )  )  )
tak vrací
; error: bad argument type: lselsetp nil
a to i v případě, když dám namísto
       (cons 410 (getvar "ctab"))
       (cons 410 AP)kde předtím jsem nadefinoval
(setq AP (getvar "ctab"))
 

Vladimír Michl
15.09.2009, 13:12
Ten výběrový filtr je asi v pořádku - zřejmě jen není žádná entita, která by mu vyhovovala.

Ferdinand
15.09.2009, 13:57
V akt. prostoru (Rozvržení) je 100% přítomen blok s názvem RAZ--T1 anebo RAZ--T1n. Můžete to zkusit na nějaký Vaše 2 bloky, které mají podobný název?
Dále pak zjišťuji zda
(setq i 0)(while (< i (sslength S1)) (setq E (ssname S1 i)) (setq E1 E) (while   (/=     "SEQEND"     (cdr (assoc 0 (setq S2 (entget (setq E1 (entnext E1)))))     )   )    (setq PROM (cdr (assoc 2 S2)))
a podle toho se provede další operace
(cond      ((= PROM "DOCUMENTID")       (setq JM1 (cdr (assoc 1 S1)))      )
...
ale s hlášenýma error se nehnu dál...

Vladimír Michl
15.09.2009, 14:02
Vyzkoušeno - s výše uvedeným filtrem výběru to funguje normálně (blok musí být skutečně vložen v aktuálním rozvržení).

Ferdinand
15.09.2009, 15:48
Pro upřesnění: se kterým výběrem? S tím posledním?

Vladimír Michl
15.09.2009, 15:55
Ano, s tím vaším výběrovým filtrem (odesláno 11:43):
http://www.cadforum.cz/forum/forum_posts.asp?TID=9232&PID=46515#46515