Zobrazit plnou verzi příspěvku: Zjištění jména přerušené entity

Mantlík
23.02.2005, 17:32
Dobrý den vespolek
Potřeboval bych zjistit, zda je následující myšlenkový pochod možno realizovat pomocí lispu.
1) mám z dřívějška funkci, v níž si "sáhnu" na úsečku a programově zjistím jméno entity (spolu s dalšími hodnotami), což použiji k výpočtům a grafickému výstupu    .. dobře, funguje
2) tuto funkci jsem ještě rozšířil  o automatické přerušení této úsečky ve spočítaném bodě  ...  opět funguje
3) ale teď bych chtěl jednu část této přerušené úsečky např. přesunout do jiné hladiny, ANIŽ bych na ni musel sahat. To je opět možné např přes jméno entity (nebo i jinak??) - ale jak získat jméno této entity (tj. např.  vždycky "pravé" poloviny původní úsečky)
Pokud někoho něco napadne, děkuji předem. V tomto případě má svůj význam i odpověď, že to nejde..
 
Díky

Ondrejd
23.02.2005, 18:24
Podle mých zkušeností to musíte udělat jinak:
Vybranou úsečku nepřerušujte. Modifikujte kód 10 nebo 11 tak, abyste dostal úsečku požadované délky.
Potom použijte (entmake) s hodnotami vybrané úsečky.
Novou úsečku Vám vrátí entmake nebo se na ni dostanete přes entlast. U nové úsečky modofikujte kód 10 a 11 - vrcholy, a kód 8 - hladina.
Ondřej Doležal

Seiner
24.02.2005, 08:13
Jenom pro případ, že baste náhodou vynalézal vynalezené :-)
;--------- ZAKRYJ.LSP   Simon Jones   Sept 1987
;     Toto makro provádí příkaz "_TRIM" na vybraných entitách;    a převádí "odřezky" do speciální hladiny, definované uživatelem.;    Toto může být použito pro hladinu se speciální typ čáry,;    např. pro ilustrování části zakrytého pohledu.
;    Pokud vybraná entita neprotíná hranici, je na ní provedena;    "_CHANGE" hladiny - je přesunuta do speciální hladiny.
;    Makro spolupracuje pouze s entitami typu ÚSEČKA, OBLOUK a KRUŽNICE.;    Ostatní entity budou ignorovány.
;    K ukončení příkazu zadejte nulovou odpověď na výzvu;    k vybrání objektů.
; Funkce ukládající systémové proměnné(defun MODES (a)   (setq MLST '())   (repeat (length a)      (setq MLST (append MLST (list (list (car a) (getvar (car a))))))      (setq a (cdr a))))
; Funkce k nastavení systémových proměnných(defun MODER ()   (repeat (length MLST)      (setvar (caar MLST) (cadar MLST))      (setq MLST (cdr MLST))   ))
; Funkce k zpracování oblouků(defun XARC (/ cen r)    (command "_LAYER" "_S" $ln "")    (setq a (cdr (assoc 50 e1)))    (setq b (cdr (assoc 51 e1)))    (setq cen (cdr (assoc 10 e1)))    (setq r (cdr (assoc 40 e1)))    (command "_TRIM" ss "" (cadr e) "")    (setq e2 (entget (car e)))    (setq c (cdr (assoc 50 e2)))    (setq d (cdr (assoc 51 e2)))    (cond ((equal e1 e2)           (command "_CHANGE" (cdar e1) "" "_P" "_LA" $ln "")          )          ((and (equal a c) (/= b d) (equal el (entlast)))           (command "_ARC" (polar cen d r)                             "_C" cen                             (polar cen b r)           )          )          ((and (equal b d) (/= a c) (equal el (entlast)))           (command "_ARC" (polar cen a r)                             "_C" cen                             (polar cen c r)           )          )          (T           (setq x (cdr (assoc 50 (entget (entlast)))))           (setq y (cdr (assoc 51 (entget (entlast)))))           (cond ((and (equal a c) (equal b y))                    (command "_ARC" (polar cen d r)                                     "_C" cen                                     (polar cen x r)                    )                   )           )          )    )    (command "_LAYER" "_S" cl ""))
; Funkce k zpracování kružnic(defun XCIRCLE (/ cen r)    (command "_LAYER" "_S" $ln "")    (setq el (entlast))    (setq cen (cdr (assoc 10 e1)))    (setq r (cdr (assoc 40 e1)))    (command "_TRIM" ss "" (cadr e) "")    (setq e2 (entget (car e)))    (cond  ((equal e1 e2)              (command "_CHANGE" (cdar e1) "" "_P" "_LA" $ln "")           )           ((= (cdr (assoc 0 e2)) "ARC")              (setq r (cdr (assoc 40 e2)))              (setq cen (cdr (assoc 10 e2)))              (setq a (polar cen (cdr (assoc 50 e2)) r))              (setq b (polar cen (cdr (assoc 51 e2)) r))              (command "_ARC" b "_C" cen A)           )    )    (command "_LAYER" "_S" cl ""))
; Funkce k zpracování úseček(defun XLINE ()    (command "_LAYER" "_S" $ln "")    (setq a (cdr (assoc 10 e1)))    (setq b (cdr (assoc 11 e1)))    (command "_TRIM" ss "" (cadr e) "")    (setq e2 (entget (car e)))    (setq c (cdr (assoc 10 e2)))    (setq d (cdr (assoc 11 e2)))    (cond ((equal e1 e2)           (command "_CHANGE" (cdar e1) "" "_P" "_LA" $ln "")          )          ((and (equal a c) (/= b d) (equal el (entlast)))           (command "_LINE" d b "")          )          ((and (equal b d) (/= a c) (equal el (entlast)))           (command "_LINE" a c "")          )          (T           (setq x (cdr (assoc 10 (entget (entlast)))))           (setq y (cdr (assoc 11 (entget (entlast)))))           (cond ((and (equal a c) (equal b y))                    (command "_LINE" d x "")                   )           )          )    )    (command "_LAYER" "_S" cl ""))
(defun C:ZAKRYJ2 (/ cen r e el e1 e2 a b c cl d ln ss yn x y)
  (modes '("CMDECHO" "BLIPMODE" "HIGHLIGHT"))  (setq cmd (getvar "CMDECHO")        blip (getvar "BLIPMODE")        higl (getvar "HIGHLIGHT")        osm (getvar "OSMODE"))  (setvar "CMDECHO" 0)  (setvar "BLIPMODE" 0)  (setvar "OSMODE" 0)  (setq cl (getvar "CLAYER"))  (PROMPT"\n  ")  (SETQ SS1 NILL)  (SETQ SS1 (SSGET "X" '((0 . "LINE"))))  (if ss1 (prompt" ")(SETQ SS1 (SSGET "X" '((0 . "CIRCLE")))))  (if ss1 (prompt" ")(SETQ SS1 (SSGET "X" '((0 . "ARC")))))  (IF SS1       (PROGN        (if (null $ln) (setq $ln cl))        (while (null ln)                 (setq ln "SKRYTE")                 (if (= ln "") (setq ln $ln))                 (if (not (tblsearch "LAYER" ln))                      (progn                       (setq yn "Ano")                       (if (= yn "Ano")                           (command "_LAYER" "_M" ln "_C" 2 ln "_L" "Čárkovaná" ln "_S" cl "")                           (setq ln nil)                       )                      )                 )        )
        (setq $ln ln)        (prompt "\nVyberte hranice ořezání: ")        (setq ss (ssget))        (setvar "HIGHLIGHT" 0)        (setq e (entsel "\nVyberte objekty určené k přemístění na přenosovou hladinu"))        (while e          (setq e1 (entget (car e)))          (setq el (entlast))          (cond  ((= (cdr (assoc 0 e1)) "LINE")                    (xline)                   )                   ((= (cdr (assoc 0 e1)) "ARC")                    (xarc)                   )                   ((= (cdr (assoc 0 e1)) "CIRCLE")                    (xcircle)                   )                   (T (prompt "\nVybrána nevhodná entita. "))          )          (setq e (entsel "\nVyberte entity určené k přemístění na hladinu přenosu:"))        )       )       (PROMPT (strcat " .. NEJSOU VHODNÉ ENTITY VE VÝKRESE !!!!"))  )  (setvar "CMDECHO" cmd)  (setvar "BLIPMODE" blip)  (setvar "HIGHLIGHT" higl)  (setvar "OSMODE" osm)  (moder)  (princ))

Mantlík
24.02.2005, 09:19
Ne, že bych chtěl vynalézat již vynalezené, ale všichni víme, jak to chodí ....
Tuhle rutinu znám, pokusil jsem se ji před několika roky upravit pro zaoblení s tím, že se oříznou přečnívající tečny a přesunou do jiné hladiny. Tenkrát se mi to zdálo poněkud kostrbaté s množstvím ukazování, hlavní problém byl ale spíš v tom, že se to vždy nepovedlo. Někdy to tečnu přerušilo, ale někdy taky ne a převedlo to do jiné hladiny celou úsečku, někdy na jedné straně oblouku, jindy na druhé, ale občas i obě. Zkusím se do toho zpětně ponořit
Ale abych se vrátil k původnímu problému. Všechno jede samo až k přerušení úsečky ve spočteném bodě. A nakonec si vymyslím přesun jedné její části do zvolené hladiny bez jakéhokoliv ukazování. Pokud to nejde, nic se nestane, nejjednodušší je použít funkci, již mohu nazvat např. "přesun do hladiny na jejíž jednu entitu ukážu"
 
Teď mne ale napadlo, že pokud mám původní úsečku (a tedy i její počáteční  A a koncový bod B) a pak bod přerušení C, bude asi jednodušší programově původní úsečku A-B smazat a nakreslit místo ní dvě jiné A-C a C-B, každou v požadované hladině. Nebo ne?
 

Seiner
24.02.2005, 09:36
Ale tak Vám to přece radil p. Doležal a když se podíváte do toho kodu, tak je to tam podobně udělané - na úsečce se udělá TRIM, zbytku se zmení hladina a to odříznuté se znova nakreslí. Způsobů, jak to udělat je samozřejmě víc, ale princik je stejný.

Mantlík
24.02.2005, 10:06
Děkuji
Lisp není můj denní chleba, to se jen občas "zblázním" a pokusím se něco vymyslet. O soustavném studiu lispu nemůže tedy být ani řeči - spíš se snažím pochopit, co by se dalo zrovna použít (což taky není správný přístup, ale většinou se to povede ... a nebo taky ne a pak toho nechám) Takže pouhé nahlédnutí do kódu mi nic neřekne - musím si to doma v klidu trochu zesrozumitelnit (ještě, že se mi podařilo uchránit příručku uživatelských úprav k R13 v češtině). Vaše připomínky mi v tom pomohou)