Zobrazit plnou verzi příspěvku: kód délky

Ferdinand
19.08.2009, 15:36
Lze nějak zjistit délku čáry (pro použití v lispu)? Potřebuji vytvořit výběrovou množinu všech čar, které mají délku=2 a ty pak např. přemístit do jiné hladiny anebo vymazat.
Příklad: asociační seznam jedné takové čáry (tj. co má délku=2) vypadá takhle
((-1 . <Entity name: 7effe7b0>) (0 . "LINE") (330 . <Entity name: 7efd2cc0>) (5 . "21C6") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (100 . "AcDbLine") (10 675.253 1.76795 0.0) (11 675.253 3.76795 0.0) (210 0.0 0.0 1.0))

johny
19.08.2009, 15:56



Jednoduše pomocí (distance pt1 pt2)  ... čili mezi dvěmi body pt1 pt2.V tom asociačním seznamu LINE jsou to položky 10 a 11)  (setq ed (entget (car (entsel)))  (setq pt1 (cdr (assoc '10 ed)))  (setq pt2 (cdr (assoc '11 ed)))  (setq line_len (distance pt1 pt2))Samozřejmě měl by jste testovat JENOM entity LINE, čili zbytek nějak vyloučit - nejjednodušeji už v ssget (setq ss (ssget '((0 . "LINE")))).Pokud chcete testovat na rovnost, tak je vhodné si zvolit nějakou přesnost.čili např. tisicinku(if (and (< line_len 2.001)            (> line_len 1.999)))
johny2009-08-19 16:01:00

Vladimír Michl
19.08.2009, 16:25
Ano, koncové body úsečky jsou skupiny 10 a 11. Čistější je asi řešit to přes vlax a vlastnost object.length (bude fungovat i na další typy čarových objektů).
Fuzzy porovnání se dělá přes funkci (equal):
[CODE](equal 0.999 1.01 0.2)[/CODE]

Ferdinand
20.08.2009, 10:11
Ideální by bylo, kdyby existoval jakýsi "ekvivalentní" způsob vyjádření možností rychlého výběru v dial. okně CADu pomocí lispu. V tom dialogu jsou přece různé možnosti kombinací, které jednoduše vyberu - aby to bylo proveditelné, nějak to přece musí "převést" do interního kódu či jazyka (?). V tomto konkrétním případě jsem se chtěl dopátrat, zda existuje kód XXX pro délku - něco jako (cons XXX 2). Docela bych uvítal i možnost výběru dle kritérií "linka o délce věší než 1.5 a menší než 2.5" což by mohl mít tvar (vím že to asi není správně)
;DL = zjištěná délka
(setq QS1 (ssget "_X"(list (cons -4 "<and") (cons 0 "LINE") (cons -4 "<or") (> DL 1.5) (< DL 2.5) (cons -4 "or>") (cons -4 "and>"))))

Vladimír Michl
20.08.2009, 10:22
Ne, takhle to nejde - musíte filtraci naprogramovat (naznačeným způsobem) v cyklu přes všechny vybrané objekty. QSelect používá podobné metody, ale přes objektové vlastnosti .

Sedláček
20.08.2009, 10:22
Můžete použít _QSELECT - v tomto případě ve dvou krocích.
1. krok _QSELEC úsečka délka >1,5 na celý výkres
2. krok _QSELEC úsečka délka <2,5 na předchozí výběr