Zobrazit plnou verzi příspěvku: Popis místnosti
Dobrý den, jsem začátečník v LISPu a potřeboval bych pomoci. Potřebuji vložit blok c_mistnosti, kdy se mi před vložením zeptá AutoCAD na křivku, já ji vyberu, nastaví se proměnné obvod, plocha a posléze aby jsem byl vyzván na název místnosti a blok se vložil s tímto názvem a do atributů se zapsal příslušný obvod a plocha zjištěná z vybrané křivky, ve formátu převedeném na m2? Vím, že toho chci hodně, ale nejedná se o žádnou domácí úlohu, snažím se jen ulehčit práci sobě a jiným :)
V příloze přikládám to co jsme zatím vytvořil... děkuji moc za návrhy a případnou pomoc.
2006-02-21_201029_Mistnost.zip
pavelstyl
22.02.2006, 09:53
Co třeba takhle, není to sice úplně podle mých představ, ale snad to pomůže.Jo a dejte si pozor na lokální/globální proměnné.
[CODE] ;=========================================================== ==============; Mistnost.lsp Popis místnosti; (c) Copyright 2006 PepaR; from: www.? ? ?.com ;----------------------------------------------------------- --------------; Description:;; Zjistí plochu a obvod místnosti a zapíše jej jako atributy do bloku;; Command options:; "MISTNOST" Výšková kóta; "VKO" Oprava hodnoty výškové kóty ;=========================================================== =================
(defun prid_poly () (command "_area" "_e" en) (setq celk_obvod (+ celk_obvod (getvar "perimeter"))) (setq celk_plocha (+ celk_plocha (getvar "area"))) (ssdel en ss))
(defun mistnost_zjisti (/ celk_obvod celk_plocha) (setq celk_obvod 0.0) (setq celk_plocha 0.0) (prompt "\nVyberte køivku(y) místnosti: ") (setq ss (ssget)) (while (> (sslength ss) 0) (setq en (ssname ss 0)) (setq ed (entget en)) (setq e_type (cdr (assoc '0 ed))) (cond ((= e_type "POLYLINE") (prid_poly)) ((= e_type "LWPOLYLINE") (prid_poly)) ((or (/= e_type "POLYLINE") (/= e_type "LWPOLYLINE") ) (ssdel en ss) ) ) ) (setq plocha (rtos (/ celk_plocha (* 1000.0 1000.0)) 2 2)) ;;; Prevod na mm^2 -> m^2 (setq obvod (rtos (/ celk_obvod 1000.0) 2 2)) &nb sp; ;;; Prevod na mm -> m)
(defun mistnost_zapis (entl naz / e eg) (setq e (entnext entl)) (while e (setq eg (entget e)) (if (= (cdr (assoc 0 eg)) "ATTRIB") (progn
(if (= (cdr (assoc 2 eg)) "PLOCHA") (progn (setq eg (subst (cons 1 plocha) (assoc 1 eg) eg)) (entmod eg) ) ) (if (= (cdr (assoc 2 eg)) "OBVOD") (progn (setq eg (subst (cons 1 obvod) (assoc 1 eg) eg)) (entmod eg) ) ) (if (= (cdr (assoc 2 eg)) "NAZEV") (progn (setq eg (subst (cons 1 naz) (assoc 1 eg) eg)) (entmod eg) ) ) ) ) (setq e (entnext e)) ) (princ)
)
;;; Pozor, entlast za urcitych okolnosti nevraci posledni entitu (je-li jako posledni entita napr. blok s atributy nebo polyline)(defun entlast1 (/ e en) (setq en (entlast)) (while en (setq e en) (setq en (entnext en)) ) e)
(defun C:MISTNOST (/ entl entl1 attrq naz) (setq attrq (getvar "ATTREQ")) (setvar "ATTREQ" 0) (setq entl1 (entlast1)) (setq entl (entlast)) (mistnost_zjisti) (setq naz (getstring "\nNazev mistnosti: ")) (prompt "\nUrèete bod vložení oznaèení místnosti :") (command "_-INSERT" "c_mistnosti" pause (getvar "dimscale")(getvar "dimscale") pause) (mistnost_zapis entl1 naz) (entupd entl)
(setvar "ATTREQ" attrq)
(command "_DDATTE" entl) (princ))[/CODE]
Dobrý den, lisp mi po vykonání vždy vyvolá editaci atributu, místo toho aby se ukncil, co s tím? Potřeboval bych jěště vyřešit nahrazení . za ,
Šlo by to třeba přes vl-string-subst "," "." ale nevím jak to tam přesně zakomponovat....
Moc děkuji za pomoc
možná to není ideální, já jsem to řešil takhle:
(setq promenna1 (vl-string-subst "," "." promenna2)) ; změna tečky výšky na čárku
pavelstyl
22.02.2006, 15:30
Opravte si tento kousek kódu (výměna "." za ",")
[CODE] (setq plocha (vl-string-subst "," "." (rtos (/ celk_plocha (* 1000.0 1000.0)) 2 2))) ;;; Prevod na mm^2 -> m^2 (setq obvod (vl-string-subst "," "." (rtos (/ celk_obvod 1000.0) 2 2))) ;;; Prevod na mm -> m[/CODE]
Smažte na konci řádek (zrušení dialogu pro editacic atributů)
[CODE](command "_DDATTE" entl)
[/CODE]
Pavel Štyl
Funguje to baječně, avšak pokud chci přikaz opakovat, tak to vymaže předchozí blok a začíná to odznova...
Přikládám poslední verzi:
2006-02-22_180540_Mistnost5.lsp
pavelstyl
23.02.2006, 08:44
Já jsem původně chtěl co nejvíce zachovat vašeho kódu a řešil jsem jenom to naplnění atributů hodnotami. Teď jsem to musel trošku přepsat (snad to bude pochopitelné).
Pavel Štyl
[CODE] ;=========================================================== ==============; Mistnost.lsp Popis místnosti; (c) Copyright 2006 PepaR; from: www.? ? ?.com ;----------------------------------------------------------- --------------; Description:;; Zjistí plochu a obvod místnosti a zapíše jej jako atributy do bloku;; Command options:; "MISTNOST" Výšková kóta; "VKO" Oprava hodnoty výškové kóty ;=========================================================== =================
(defun mistnost_zjisti (/ celk_obvod celk_plocha plocha obvod i ss) (setq celk_obvod 0.0) (setq celk_plocha 0.0) (prompt "\nVyberte křivku(y) místnosti: ") (setq ss (ssget (list (cons -4 "<OR") (cons 0 "POLYLINE") (cons 0 "LWPOLYLINE") (cons -4 "OR>") )) i 0) (while (< i (sslength ss)) (command "_area" "_e" (ssname ss i)) (setq celk_obvod (+ celk_obvod (getvar "perimeter"))) (setq celk_plocha (+ celk_plocha (getvar "area"))) (setq i (1+ i)) ) (setq plocha (vl-string-subst "," "." (rtos (/ celk_plocha (* 1000.0 1000.0)) 2 2))) ;;; Prevod na mm^2 -> m^2 (setq obvod (vl-string-subst "," "." (rtos (/ celk_obvod 1000.0) 2 2))) &n bsp; ;;; Prevod na mm -> m (list plocha obvod))
(defun mistnost_zapis (entl naz pl obv / e eg) (setq e (entnext entl)) (while e (setq eg (entget e)) (if (= (cdr (assoc 0 eg)) "ATTRIB") (progn
(if (= (cdr (assoc 2 eg)) "PLOCHA") (progn (setq eg (subst (cons 1 pl) (assoc 1 eg) eg)) (entmod eg) ) ) (if (= (cdr (assoc 2 eg)) "OBVOD") (progn (setq eg (subst (cons 1 obv) (assoc 1 eg) eg)) (entmod eg) ) ) (if (= (cdr (assoc 2 eg)) "NAZEV") (progn (setq eg (subst (cons 1 naz) (assoc 1 eg) eg)) (entmod eg) ) ) ) ) (setq e (entnext e)) ) (princ)
)
;;; Pozor, entlast za urcitych okolnosti nevraci posledni entitu (je-li jako posledni entita napr. blok s atributy nebo polyline)(defun entlast1 (/ e en) (setq en (entlast)) (while en (setq e en) (setq en (entnext en)) ) e)
(defun C:MISTNOST (/ entl entl1 attrq naz param) (setq attrq (getvar "ATTREQ")) (setvar "ATTREQ" 0) (setq entl1 (entlast1)) (setq entl (entlast)) (setq param (mistnost_zjisti)) (setq naz (getstring "\nNazev mistnosti: ")) (prompt "\nUrčete bod vložení označení místnosti :") (command "_-INSERT" "c_mistnosti" pause (getvar "dimscale")(getvar "dimscale") pause) (mistnost_zapis entl1 naz (car param) (cadr param)) (entupd entl)
(setvar "ATTREQ" attrq) (princ))[/CODE]
Děkuji moc, jsem Vám všem zavázán. Jen tak pro zajímavost jsem si zkoušel přidat do kódu ještě jednu položku atributu pro zadání a to číslo místnosti. Lisp proběhne v pořádku, ale pro aktualizaci zadaných hodnot (čísla) je nutné výkres regenerovat. Myslel jsem, že to řeší právě entupd avšak asi jsem se mýlil nebo se pletu...
pavelstyl
24.02.2006, 11:36
Aha, možná jsem udělal chybku. Zkuste to entupd opravit takto:
[CODE](entupd (entlast))[/CODE]
Pavel Štyl
Ano, nyní to již aktualizuje avšak při nezadaní názvu místnosti (tzn. hodnoty parametru) se blok nevloží... každopádně mockrát díky za péči, kterou mi věnujete.
pavelstyl
27.02.2006, 08:37
Mě to funguje tak, že pokud na výzvu "Nazev mistnosti" zadám ENTER (tzn. nezadám název místnosti), tak se blok normálně vloží. Pokud bych dal ESC, tak se program samozřejmě ukončí a blok se nevloží.
Pokud vám to nefunguje ani přes ten ENTER, zkuste opravit řádek
[CODE](if (= (cdr (assoc 2 eg)) "NAZEV")[/CODE]
takto
[CODE](if (and (= (cdr (assoc 2 eg)) "NAZEV") naz)[/CODE]
Pavel Štyl
Bohužel beze změny, jakmile nezadam nazev a číslo, tak se blok vubec nevloží...
pavelstyl
28.02.2006, 08:09
Dejte sem váš aktuální zdroják a přesný popis toho, co na jakou výzvu zmáčknete za klávesu. Pokusím se to nasimulovat.
A co máte za AutoCAD?
Pavel Štyl
Testovano na ACADu 2005.
2006-02-28_184122_Mistnost9.lsp
pavelstyl
01.03.2006, 13:17
Moje úvaha:Jestliže nezadám název (jediná viditelná entita bloku), tak po vložení bloku nic nevidím. Divné je, že nic nevidím ani po zapnutí QTEXTu. ale jestliže zadám příkaz _EXPLODE _ALL, tak se ten blok rozbije. Tudíž tam musí být.
Jako řešení mě napadá jedině doplnit ten blok třeba nějakou čárou, aby vždycky bylo něco viditené.
Asi to nějak souvisí s problémy typu výběr mimo obrazovku, není nalezen průsečík čárkovaných čar protínajících se v díře, šrafovaná plocha musí být na obrazovce apod. Ale to je jenom můj odhad.
Pavel Štyl
To nevadí, i tak děkuji mnohokráte za pomoc a čas který jste mi věnoval. Zkusím to s tou čarou, přijde mi to jako nejschůdnější řešení...