Vytisknout stránku | Zavřít okno

kód délky

Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=9109
Datum vytištění: 12.kvě.2026 v 08:37


Téma: kód délky
Odeslal: Ferdinand
Předmět: kód délky
Datum odeslání: 19.srp.2009 v 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))


-------------
-FerTh-



Odpovědi:
Odeslal: johny
Datum odeslání: 19.srp.2009 v 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)))



Odeslal: Vladimír Michl
Datum odeslání: 19.srp.2009 v 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):
(equal 0.999 1.01 0.2)


-------------
Vladimír Michl (moderátor)
ARKANCE CZ - https://arkance.world - arkance.world
(podpora viz helpdesk.arkance-systems.cz)


Odeslal: Ferdinand
Datum odeslání: 20.srp.2009 v 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>"))))


-------------
-FerTh-


Odeslal: Vladimír Michl
Datum odeslání: 20.srp.2009 v 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 .

-------------
Vladimír Michl (moderátor)
ARKANCE CZ - https://arkance.world - arkance.world
(podpora viz helpdesk.arkance-systems.cz)


Odeslal: Sedláček
Datum odeslání: 20.srp.2009 v 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



Vytisknout stránku | Zavřít okno