Zobrazit plnou verzi příspěvku: podmínka jména
Ferdinand
25.01.2007, 09:06
Potřebuji s tím pohnout:...(setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ));;pokud ve výkresu hladina jménem LAY není, tak proveď(command "_vplayer""_N" LAY "_F" LAY "_A" "");;pokud ve výkresu hladina jménem LAY už je, tak proveď(command "_vplayer" "_V" LAY "_T" "_T" LAY "_A" "")Jak se správně napíše tato podmínka?(if (not (8 . LAY))...je asi nesmysl, že...
Ferdinand2007-01-25 09:08:34
Já to řeším např. takhle:
Sub VytvorHlad()
'Vytvoří hladiny "PID_CHECK_START" a "PID_AUDIT" (pokud neexistují)
Dim col As AcadAcCmColor
Dim lrs As AcadLayers
Dim lr As AcadLayer
Set lrs = ThisDrawing.Layers
Set col = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
Call col.SetRGB(255, 0, 0)
'přidání hladiny "PID_CHECK_START"
On Error Resume Next
If IsEmpty(lrs.Item("PID_CHECK_START")) Then
On Error GoTo 0
MsgBox "hladina PID_CHECK_START neexistuje a bude vytvořena"
lrs.Add "PID_CHECK_START"
Set lr = lrs.Item("PID_CHECK_START")
lr.TrueColor = col
lr.Lineweight = acLnWt050
lr.Lock = True
End If
Call col.SetRGB(0, 255, 0)
'přidání hladiny "PID_AUDIT"
On Error Resume Next
If IsEmpty(lrs.Item("PID_AUDIT")) Then
On Error GoTo 0
MsgBox "hladina PID_AUDIT neexistuje a bude vytvořena"
lrs.Add "PID_AUDIT"
Set lr = lrs.Item("PID_AUDIT")
lr.TrueColor = col
lr.Lineweight = acLnWtByLwDefault
lr.Lock = True
End If
'MsgBox "KonecA"
End Sub
Ferdinand
25.01.2007, 09:52
To není to pravé, já to chci do lispu, ne v makru (nebo - co to vůbec je?).
pavelstyl
25.01.2007, 10:05
Co třeba takhle ...
(if (tblsearch "LAYER" "MOJE_HLADINA")
(progn
(alert "Hladina existuje")
)
(progn
(alert "Hladina neexistuje")
)
)
Pavel Štyl
)
Vladimír Michl
25.01.2007, 10:06
třeba
[CODE]
(if (tblobjname "layer" LAY)
(command .....); je tam
(command .....); není tam
)
[/CODE]
Ferdinand
25.01.2007, 10:46
Děkuji, tento příkaz jsem neznal.Ještě jedna věc: Když používám filtr pro výběr názvů hladin které obsahují shodný řetězec (např. HLA_OB1, HLA_OB2, ... HLA_OBn), tj. na výzvu(setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ))bude zadáno HLA_OB* (anebo HLA_OB?), tak po vykonání příkazu(ů) _vplayer naskočí nadefinovaný (alert (strcat "Hladinu " "\n "" " LAY " "" " "\n jsem ve výkresu nenašel, byla nově vytvořena") )což je na displejiHladinuHLA_OB* (ev. HLA_OB?)jsem na výkresu nenašel, byla nově vytvořenaovšem název hladiny nemůže obsahovat znaky * ani ?, takže tyto hladiny vytvořeny defacto nebyly. Jak to lze ošetřit?Ferdinand2007-01-25 10:49:40
pavelstyl
25.01.2007, 10:58
Na to bych 3el asi takto ...
(setq lay (getstring "\nHladina: "))(setq hl (tblnext "LAYER" "T"))(while hl (setq jmeno (cdr (assoc 2 hl))) (if (wcmatch jmeno lay) (progn (prompt (strcat "\nZpracuj hladinu " jmeno)) ) ) (setq hl (tblnext "LAYER")))(princ)
Pavel Štyl
Ferdinand
26.01.2007, 15:36
Pavle, tak jsem to zkoušel:"lay" - zadám z klávesnice např. HLA_OB*"hl" - vrací: ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))"jmeno" - vrací: "0" (tj. zjistí název aktuální hladiny)Prompt "Zpracuj hladinu " se na p.ř. vůbec neobjevuje. Celá citovaná sekvence mi vrací nil.Původně jsem celý lisp měl takhle:;;;###############################################################;;; po zadání jména hladin(y), se ty(a)to hladiny(a) rozmrazí (=budou aktivní) ve všech rozvrženích výkresu(defun c:lay1 (/ LAY TM) (setq TM (getvar "tilemode")) (setvar "tilemode" 0) (setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ) ) (if (tblobjname "layer" LAY) (command "_vplayer" "_V" LAY "_T" "_T" LAY "_A" "") (command "_vplayer" "_N" LAY "_T" LAY "_A" "") ) (alert (strcat "Hladinu " "\n "" " LAY " "" " "\n jsem ve výkresu nenašel, byla nově vytvořena") ) ;tady nechci aby mi to hlasilo nesmysly v pripade filtru (napr. HLA_OB*, HLA_OB?) (setvar "tilemode" TM) (princ))
pavelstyl
29.01.2007, 12:34
Chápu-li to dobře, tak mohou nastat dvě situace:
1. Zadám název hladiny (bez zástupných znaků). Pokud ta hladina existuje, provedu rozmražení, pokud neexistuje, tak ji vytvořím.
2. Zádám-li název hladiny se zástupnými znaky (*, ?), tak musím projít všechny hladiny ve výkrese a ta která vyhovuje, tak ji rozmrazím.
Pochopil-li jsem to dobře, tak bych to udělal takto:
[CODE]
;;;###############################################################;;; po zadání jména hladin(y), se ty(a)to hladiny(a) rozmrazí (=budou aktivní) ve všech rozvrženích výkresu
(defun c:lay1 (/ LAY TM jmeno hl)
(setq TM (getvar "tilemode"))
(setvar "tilemode" 0) (setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ) )
(if (or (vl-string-search "*" lay) (vl-string-search "?" lay))
(progn ;V nazvu hladiny je zastupny znak
(setq hl (tblnext "LAYER" "T")) (while hl (setq jmeno (cdr (assoc 2 hl))) (if (wcmatch jmeno lay) (progn (command "_vplayer" "_V" jmeno "_T" "_T" jmeno "_A" "") (prompt (strcat "\nZpracovavam hladinu " jmeno)) ) ) ; if (setq hl (tblnext "LAYER")) ) ; while
) ;progn
(progn ;;; Nazev hladiny je zadan bez zastupnych znaku (if (tblsearch "LAYER" LAY) (progn (command "_vplayer" "_V" LAY "_T" "_T" LAY "_A" "") ) (progn (command "_vplayer" "_N" LAY "_T" LAY "_A" "") (alert (strcat "Hladinu " "\n "" " LAY " "" " "\n jsem ve výkresu nenašel, byla nově vytvořena") ) ;tady nechci aby mi to hlasilo nesmysly v pripade filtru (napr. HLA_OB*, HLA_OB?) ) ; progn ) ; if
) ; progn
) ; if
(setvar "tilemode" TM) (princ))
[/CODE]
Pavel Štyl
Ferdinand
29.01.2007, 15:21
Jeto jaxi pomätený... Úvaha správná, ale nedělá mi to nic . Není třeba tam (kde?) použít onu funkci(if (tblobjname "layer" LAY)...
pavelstyl
29.01.2007, 15:51
Tu funkci tblobjname jsem neradil já. Ani ji neznám. Na zjišťování existence hladiny vždy (10 let) používám formuli (if (tblsearch "LAYER" "hladina_1") ...
Zakomentářoval jsem výkonné příkazy (vplayer) a doplnil jsem nějaké alerty. Možná ještě zlobily velká/malá písmena u porovnávání názvů hladin, tak jsem to také upravil.
U mě níže uvedené funguje takto:
- mám výkres s hladinami: Hladina1, Hladina2, Hladina3
- Zavolám LAY, zadám Hladina1, našel ji
- Zavolám LAY, zadám Hladina5, nenašel ji, bude vytvářet
- Zavolám LAY, zadám H*, zahlásí zadání *, a vypíše zpracování Hladina1, Hladina2 a Hladina3
Pokus tohleto chování je OK, tak už zbývá pouze dodělat ten VPLAYER (ale tady nemohu sloužit, neb ten příkaz neznám, výkresový prostor totiž nepoužíváme)
Pavel Štyl
[CODE]
;;;###############################################################;;; po zadání jména hladin(y), se ty(a)to hladiny(a) rozmrazí (=budou aktivní) ve všech rozvrženích výkresu
(defun c:lay1 (/ LAY TM jmeno hl)
(setq TM (getvar "tilemode"))
(setvar "tilemode" 0) (setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ) )
(if (or (vl-string-search "*" lay) (vl-string-search "?" lay))
(progn ;V nazvu hladiny je zastupny znak
(alert "Zadana * nebo ?, tudiz prochazim existujici hladiny ...") (setq hl (tblnext "LAYER" "T")) (while hl (setq jmeno (cdr (assoc 2 hl))) (if (wcmatch (strcase jmeno) (strcase lay)) (progn; (command "_vplayer" "_V" jmeno "_T" "_T" jmeno "_A" "") (alert (strcat "Zpracovavam hladinu " jmeno)) ) ) ; if (setq hl (tblnext "LAYER")) ) ; while
) ;progn
(progn ;;; Nazev hladiny je zadan bez zastupnych znaku (if (tblsearch "LAYER" LAY) (progn; (command "_vplayer" "_V" LAY "_T" "_T" LAY "_A" "") ) (alert (strcat "Hladina " LAY " existuje, pouze ji zmodifikuji ... ")) (progn; (command "_vplayer" "_N" LAY "_T" LAY "_A" "") (alert (strcat "Hladinu " "\n "" " LAY " "" " "\n jsem ve výkresu nenašel, byla nově vytvořena")) ) ; progn ) ; if
) ; progn
) ; if
(setvar "tilemode" TM) (princ))
[/CODE]
Ferdinand
29.01.2007, 16:09
Fuřt nic Díval jsem se na to v lisp editoru, kde mi hlásí; error: too many arguments: (IF (TBLSEARCH "LAYER" LAY) (PROGN ( ... )) (ALERT ( ... )) ... )
Ferdinand2007-01-29 16:10:33
pavelstyl
29.01.2007, 16:16
Jedna závorka se ztratila, snad už je to OK.
;;;###############################################################;;; po zadání jména hladin(y), se ty(a)to hladiny(a) rozmrazí (=budou aktivní) ve všech rozvrženích výkresu
(defun c:lay1 (/ LAY TM jmeno hl)
(setq TM (getvar "tilemode"))
(setvar "tilemode" 0) (setq LAY (getstring "\nZadejte hladiny, které budou ROZMRAŽENY /aktivní/ ve všech rozvrženích : " ) )
(if (or (vl-string-search "*" lay) (vl-string-search "?" lay))
(progn ;V nazvu hladiny je zastupny znak
(alert "Zadana * nebo ?, tudiz prochazim existujici hladiny ...") (setq hl (tblnext "LAYER" "T")) (while hl (setq jmeno (cdr (assoc 2 hl))) (if (wcmatch (strcase jmeno) (strcase lay)) (progn; (command "_vplayer" "_V" jmeno "_T" "_T" jmeno "_A" "") (alert (strcat "Zpracovavam hladinu " jmeno)) ) ) ; if (setq hl (tblnext "LAYER")) ) ; while
) ;progn
(progn ;;; Nazev hladiny je zadan bez zastupnych znaku (if (tblsearch "LAYER" LAY) (progn; (command "_vplayer" "_V" LAY "_T" "_T" LAY "_A" "") ) (alert (strcat "Hladina " LAY " existuje, pouze ji zmodifikuji ... ")) ) (progn; (command "_vplayer" "_N" LAY "_T" LAY "_A" "") (alert (strcat "Hladinu " "\n "" " LAY " "" " "\n jsem ve výkresu nenašel, byla nově vytvořena")) ) ; progn ) ; if
) ; progn
) ; if
(setvar "tilemode" TM) (princ))