podmínka jména
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=3827
Datum vytištění: 13.kvě.2026 v 15:34
Téma: podmínka jména
Odeslal: Ferdinand
Předmět: podmínka jména
Datum odeslání: 25.led.2007 v 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...
------------- -FerTh-
|
Odpovědi:
Odeslal: Tomáš
Datum odeslání: 25.led.2007 v 09:23
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
------------- Konstruktér, projektant
Inventor 2008 SP2, AutoCAD 2008 SP2, XP Prof. SP2
ZPA Industry a.s.
|
Odeslal: Ferdinand
Datum odeslání: 25.led.2007 v 09:52
To není to pravé, já to chci do lispu, ne v makru (nebo - co to vůbec je?).
------------- -FerTh-
|
Odeslal: pavelstyl
Datum odeslání: 25.led.2007 v 10:05
|
Co třeba takhle ...
(if (tblsearch "LAYER" "MOJE_HLADINA")
(progn
(alert "Hladina existuje")
)
(progn
(alert "Hladina neexistuje")
)
)
Pavel Štyl
)
|
Odeslal: Vladimír Michl
Datum odeslání: 25.led.2007 v 10:06
třeba
(if (tblobjname "layer" LAY)
(command .....); je tam
(command .....); není tam
)
|
------------- Vladimír Michl (moderátor) ARKANCE CZ - https://arkance.world - arkance.world (podpora viz helpdesk.arkance-systems.cz)
|
Odeslal: Ferdinand
Datum odeslání: 25.led.2007 v 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 displeji
Hladinu HLA_OB* (ev. HLA_OB?) jsem na výkresu nenašel, byla nově vytvořena
ovšem název hladiny nemůže obsahovat znaky * ani ?, takže tyto hladiny vytvořeny defacto nebyly. Jak to lze ošetřit?
------------- -FerTh-
|
Odeslal: pavelstyl
Datum odeslání: 25.led.2007 v 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
|
Odeslal: Ferdinand
Datum odeslání: 26.led.2007 v 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) )
------------- -FerTh-
|
Odeslal: pavelstyl
Datum odeslání: 29.led.2007 v 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:
;;;############################################################### ;;; 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) )
|
Pavel Štyl
|
Odeslal: Ferdinand
Datum odeslání: 29.led.2007 v 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) ...

------------- -FerTh-
|
Odeslal: pavelstyl
Datum odeslání: 29.led.2007 v 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
;;;############################################################### ;;; 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) )
|
|
Odeslal: Ferdinand
Datum odeslání: 29.led.2007 v 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 ( ... )) ... )
------------- -FerTh-
|
Odeslal: pavelstyl
Datum odeslání: 29.led.2007 v 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) )
|
|