Zobrazit plnou verzi příspěvku: Skript pro výběr více bloků a jejich smazání

PepaR
30.07.2007, 15:13
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*"))))

PepaR
31.07.2007, 14:19
Děkuji mnohokráte.

PepaR
01.08.2007, 07:20
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.

PepaR
26.08.2007, 09:15
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.

PepaR
26.08.2007, 15:56
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.

Seiner
16.10.2007, 09:59
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...