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

Tomáš
25.01.2007, 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

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))