Zobrazit plnou verzi příspěvku: Skript pro výběr více bloků a jejich smazání
Dobrý den,
potřebuji zapsat do skriptu sekvenci, která vybere blok A, blok B, blok C vymaže je a vyčistí výkres na bloky. Nejsem bohužel u AutoCADu a neznám nazpamět klíčová slova, pomůže někdo prosím?
Předem děkuji
Ferdinand
31.07.2007, 13:51
;;vyber vsech Bloku s nazvem AAA v hl. HL :(setq QS1 (ssget "X" '((0 . "insert") (2 . "AAA") (8 . "HL"))))
;;vyber dvou Bloku - A, B :(setq QS6 (ssget "X" '((0 . "INSERT") (-4 . "<OR")(2 . "A*")(2 . "B*")(-4 . "OR>") ) ))
;;vymaz Bloku A, B :
(command "_erase" QS6 "")
;;vycisteni Vykresu od Bloku A, B :
(command "_-purge" "_B" "" "_N")
Vladimír Michl
31.07.2007, 14:16
[QUOTE=Ferdinand]
;;vyber dvou Bloku - A, B :(setq QS6 (ssget "X" '((0 . "INSERT") (-4 . "<OR")(2 . "A*")(2 . "B*")(-4 . "OR>") ) ))[/QUOTE]
Lépe:(setq QS1 (ssget "_X" '((0 . "INSERT") (2 . "A*,B*"))))
Stále laboruji s tou výběrovou množinou, kdy mi to hlásí:
Příkaz: cisti_vn; chyba: chybný typ argumentu: stringp <Selection set: 32>
Pomůžete prosím?
[QUOTE=cisti_vn.lsp]
(defun c:cisti_vn ( / sezn_soub sez_togg sez_eb p_s CR I adr_es co_cistit KONEC vychozi_adresar)
****************************(setq vychozi_adresar "c:/" )****************************
(defun scri_pt ( / Pis_demo I )
(setvar "FILEDIA" 0)
(setq p_atr (cdr (nth 0 sez_eb)))(setq Pis_demo (open (strcat adr_es "cisti_vn.scr") "w")) (write-line (setq QS1 (ssget "_X" '((0 . "INSERT") (2 . "Podpis_*,Remes")))) Pis_demo) (write-line (strcat "_erase" QS1 "") Pis_demo)(write-line (strcat "_purge " co_cistit " * _n" ) Pis_demo)(write-line "_qsave" Pis_demo)
(setq I 1)(repeat (- (length sezn_soub) 1)
(if (= (cdr (nth I sez_togg)) "1") (progn (write-line (strcat "_open \"" adr_es (car (nth I sez_eb)) "\"") Pis_demo) (write-line (setq QS1 (ssget "_X" '((0 . "INSERT") (2 . "Podpis_*,Remes")))) Pis_demo) (write-line (strcat "_erase" QS1 "") Pis_demo) (write-line (strcat "_purge " co_cistit " * _n" ) Pis_demo) (write-line "_qsave" Pis_demo) (if (> (atoi(substr(getvar "ACADVER") 2 1)) 4) (write-line "_close" Pis_demo) ) ) ) (setq I (+ 1 I)))
(write-line "_new " Pis_demo)(write-line "FILEDIA 1 " Pis_demo)(write-line "" Pis_demo)
(close Pis_demo)
(command "_script" (strcat adr_es "cisti_vn.scr"))
);defun
[\QUOTE]
Vladimír Michl
01.08.2007, 10:15
Aha, to je principiální (ale zajímavá) chyba - nemůžete do scriptu dávat výsledek výběru (výběrovou množinu) - ten výběr (ssget) musíte provést až ve scriptu, tedy až v daném výkresu. Výběrová množina z jednoho výkresu nemá v jiném výkresu smysl.
Sakreš, nějak jsme si s tím neporadil. Jde o to, že v razítkách dávám bloky s podpisy, kdo který výkres vyhotovil (což je cca 20 bloků, které ovšem nejsou v každém výkrese). Jelikož výkresy pak potřebuji zazálohovat a zaslat dále bez podpisů, tak potřebuji aby se mi vytvořil skript, který vyběre ze zadaného seznamu názvů bloků podpisů ty které se ve výkrese nachází a pak výkres vyčistí i uloží.
Bohužel nejsem tak zdatný programátor abych to přidal do toho LISPu a na studování příručky momentálně taky není čas neboť termín odevzdání dokumentace neskutečně hoří ;) a práce je na ní habaděj.
Najde se prosím nějaká dobrá duše?
Vladimír Michl
26.08.2007, 13:21
Zásadní problém je v tom vytváření výběrové množiny - nemůžete do skriptu zapsat hodnotu proměnné, je potřeba tam dát onen LISP výraz (aby se vyhodnotil až při běhu scriptu). Tedy:
(write-line (setq QS1 ...
-->
(write-line "(setq QS1 ...
Když tak sem pošlete část obsahu výsledného SCR souboru - z něj se problém pozná nejsnadněji.
Nu, pokoušel jsme se to implenetovat jako další položku (radiobutton) do následujího LISPu (přikládám výchozí soubor):
uploads/20070826_155639_cisti_vn.zip
Ferdinand
16.10.2007, 09:47
Ještě bych se zeptal: jak vyselektuji blok určitého jména (v daném případě je to jméno uchováno v proměnné NPF), abych s vybraným blokem mohl provést nějakou operaci? Pokud napíšu
(setq QS1 (ssget "X" '((0 . "insert") (2 . NPF))))
tak mi hlásí
; error: bad SSGET list value
Řekl bych, že by to mohlo být něco jako
(if (tblsearch "block" NPF)...
ale nevím jak dál.
ten seznam se musí IMHO složit nějak jako
(ssget "X"(list(cons 0 "INSERT")(cons 2 NFP))))
Vladimír Michl
16.10.2007, 10:02
Ano, resp.:
(setq QS1 (ssget "_X" '((0 . "INSERT") (cons 2 NPF))))
Ferdinand
16.10.2007, 10:54
Nojo, mohlo mne to napadnout. Díky.
Ferdinand
18.10.2007, 18:09
[QUOTE=Vladimír Michl]Ano, resp.:
(setq QS1 (ssget "_X" '((0 . "INSERT") (cons 2 NPF))))[/QUOTE]
Podotýkám, že jsem se prvně přesvědčil, že ve výkresu opravdu existuje ten blok. Přesto:
Command: (setq QS1 (ssget "_X" '((0 . "INSERT") (cons 2 NPF)))); error: bad SSGET list
Ferdinand
18.10.2007, 18:14
[QUOTE=Seiner]ten seznam se musí IMHO složit nějak jako
(ssget "X"(list(cons 0 "INSERT")(cons 2 NFP))))[/QUOTE]
Podotýkám, že jsem se prvně přesvědčil, že ve výkresu opravdu existuje ten blok. Přesto:
Command: (setq QS1 (ssget "X"(list(cons 0 "INSERT")(cons 2 NPF))))nil
Ferdinand2007-10-18 18:15:15
Ferdinand
15.11.2007, 15:14
Nebudete tomu věřit, ale pořád s tím bojuji. Tak nějaký jiný nápad, prosím?
Martin Bielina
15.11.2007, 15:53
(setq QS1 (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (2 . "NPF") (-4 . "AND>"))))
Ferdinand
15.11.2007, 17:02
No to mne podržte - najednou je to OK!
Command: (setq NPF (cadr (fnsplitl (getvar "dwgname"))))
"POKUS8"
Command: (setq QS1 (ssget "X"(list(cons 0 "INSERT")(cons 2 NPF))))
<Selection set: 3>
To M.Bielina: To jsem zkoušel též, ale taky mi to nechtělo brát...
Command: (setq QS1 (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (2 . "NPF") (-4 . "AND>"))))nilFerdinand2007-11-15 17:04:54
Vladimír Michl
15.11.2007, 18:42
asi záleží na tom, na co se zrovna vyhodnotí symbol NPF...