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č?
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".
Zkousel jsem to v MAPu 2006 a prvni moznost funguje. Druha ne.
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í.
[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