Vytisknout stránku | Zavřít okno

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...Embarrassed


-------------
-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 Shocked. Není třeba tam (kde?) použít onu funkci
(if (tblobjname "layer" LAY)
...
Question


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

 




Vytisknout stránku | Zavřít okno