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))
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