Zobrazit plnou verzi příspěvku: b.lsp

Ferdinand
24.04.2008, 17:01
Vracím se k lispu b.lsp (od Pavla). Potřebuji zakomponovat do lispu, ve kterém používám vygenerovaný script z b.lsp, výběr pouze některých bloků. V b.lsp je to řešeno ručním výběrem, což v mém případě nejde - chtěl bych tam dostat výběrovou množinu bloků se specifickou částí názvu  - tj. aby ten výběr byl možný bez ručního zásahu (bez dialogu). Abych byl konkrétní:
;;vyber vsech Bloku s retezcem "_C" v nazvu(setq B_C (ssget "X"(list(cons 0 "INSERT")(cons 2 "*_C"))))
nyní script je ve tvaru
;;puv.barva=6(magenta), nova.barva=ByBlock
(block_edit 2 6  0 0 "" "" 0 "" "")
což se provede na celý výkres...

pavelstyl
25.04.2008, 08:57
Jestli tomu dobře rozumím, tak by jste chtěl funkci
[CODE](block_edit_ss B_C 2 6  0 0 "" "" 0 "" "")[/CODE]
 
Jestli ano, tak to bude mít jeden háček. Představ te si, že máte ve výkrese vložen jeden blok dvakrát. A do toho výběru zahrnete jenom jednu instanci. Potom ten program ale změní obě dvě, protože obě ty instance mají stejnou definici.
 
Pavel Štyl

Ferdinand
25.04.2008, 12:38
To je OK - to by mi nevadilo, ale mne zajímá, zda to lze takhle provést (tj. konkrétně na výb. mn. B_C)?

Ferdinand
20.05.2008, 09:09
Jde o to, že chci v blocích zachovat 3 druhy čar a 3 barvy, kterými jsou charakteristické typové bloky s názvem obsahujícím příponu _C. Pokud na to pustím ten lisp, tak ten provede změnu všech entit najednou - a to mi nevyhovuje. Chtělo by to tam vpašovat výběrový filtr dle vlastnosti entit... Příklad: Chci změnit vlastnosti pouze těch entit bloku, které jsou nakresleny typem čáry Center a mají barvu buď ByLayer anebo ByBlock (tj. blok má i další entity s jinými vlastnostmi) a to tak, aby pak výsledné vlastnosti byly Linetype=ByBlock, Color=ByBlock.

Martin Bielina
20.05.2008, 09:24
Já používám třeba takovýto způsob filtrování v lispu

;výběr entit k záměně (úsečka ležící v jedné ze tří určených hladin)
(setq ent_sel (ssget "_X" '((-4 . "<AND")
                                (0 . "LINE")
                                (-4 . "<OR")
                                  (8 . "HLADINA 1")
                                  (8 . "HLADINA 2")
                                  (8 . "HLADINA X...")
                                (-4 . "OR>")
                             (-4 . "AND>")
                             )
                            )
                          )

Kombinovat se dají i jiné typy požadavků (barva, název entity, souřadnice atd. viz referenční příručka nápovědě). Toto je jen příklad, který přímo Váš problém nevyřeší, bude to potřeba trochu upravit na konkrétní požadavky.

Ferdinand
20.05.2008, 10:00
To je OK, filtrované výběry samostatních entit (mimo blok) běžně používám taky. Ale jak na ty bloky? V podstatě jde o jakýsi přepis dialogového příkazu refedit do lispové podoby (což už jsme probírali v jiném mnou založeném tématu myslím že se to jmenovalo hromadný refedit) - vzešlo z toho skvělá pomůcka od Pavla a zda by ji o tuto možnost (pokud je to možné) rozšířil.Ferdinand2008-05-20 10:07:33

pavelstyl
20.05.2008, 10:00
Dobrý den, píši to z hlavy bez odzkoušení. Zkuste do b.lsp přidat následující procedurku viz níže. První parametr je výběrová množina, ve které by měly být bloky.
Pavel Štyl
 
[CODE](defun block_edit_ss (ss co1 co2 co3 lt1 lt2 lt3 la1 la2 la3 / b i eg) (setq _BLOCK_CO_TYP co1) (setq _BLOCK_CO_2 co2) (setq _BLOCK_CO_3 co3) (setq _BLOCK_LT_TYP lt1) (setq _BLOCK_LT_2 lt2) (setq _BLOCK_LT_3 lt3) (setq _BLOCK_LA_TYP la1) (setq _BLOCK_LA_2 la2) (setq _BLOCK_LA_3 la3)  (setq _BLOCK_LIST nil i 0) (while (< i (sslength ss))  (setq eg (entget (ssname ss i)))  (if (= (cdr (assoc 0 eg)) "INSERT")   (setq _BLOCK_LIST (append _BLOCK_LIST (list (cdr (assoc 2 eg)))))  )  (setq i (1+ i)) ) (block_change)
 (command "_regen"))[/CODE]

Ferdinand
20.05.2008, 10:13
Projeví se to nějak i v dialogu / ve skriptu ?

Ferdinand
30.05.2008, 14:52
Potřebuji pomoct s provedením následujících (pro sjednocení vzhledu bloků v naší nadstavbové databázi - cca. 1200 souborů) - tj. aplikovat "hromadný" _refedit :
1- najdi v akt. výkresu bloky, které mají ve svém názvu řetězec *_C-*
- vyber jejich entity, které mají současně tyto vlastnosti:
-- mají barvu "ByBlock"
-- mají typ čáry "center"
- změň vlastnosti těchto entit na:
-- barva=ByBlock
-- typ čáry=ByBlock
- nastav vlastnosti těchto bloků na:

-- barva=6
-- typ čáry=center
 
2- najdi v akt. výkresu bloky, které neobsahují ve svém názvu řetězec  *_C-*
- vyber jejich entity s těmito vlastnostmi:
-- mají barvu "ByLayer"
-- mají typ čáry "ByLayer"

- změň vlastnosti těchto entit na:
-- barva=ByBlock
-- typ čáry=ByBlock

- nastav vlastnosti těchto bloků na:

-- barva=ByBlock
-- typ čáry=ByBlock
 
Potíž je v tom, že Pavlův program b.lsp řeší vlastnosti všech bloků, a to globálně.

pavelstyl
02.06.2008, 06:59
No vždyť kvůli tomu jsem posílal tu funkci "block_edit_ss", jejíž první parametr je výběrová množina. Potom to přebarvení se provede jenom na bloky v té výběrové množině.
 
Podle mě by stačilo něco jako:
[CODE](setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 "*_C-*"))))
(block_edit_ss ss ......)
[/CODE]
 
PS: Jestli plácám nesmysly, tak se omlouvám. Právě jsem se vrátil z dovolené :-)
 
Pavel Štyl

Ferdinand
03.06.2008, 15:48
Je to nějak zacyklovaný - pořád to dělá ten 1 a samý výkres (v uzavřeném cyklu) a CAD musím sestřelit TaskManagerem...

Seiner
03.06.2008, 15:54
Omlouvám se, nesledoval jsem. Ale jak chcete otevírat další výkresy? V lispu to já teda neumím. Na to požívám scripty (demo) a generátor scriptů.

Ferdinand
04.06.2008, 08:09
Je to řešeno formou
(defun S::STARTUP ()
(již jsem o tom psal v minulosti na jiném místě...)
pak se sestaví seznam dwg v akt. adresáři a pak z něj se berou výkres za výkresem (je to práce kolegy, takže podrobnosti musím vynechat).Ferdinand2008-06-04 08:10:37

Seiner
04.06.2008, 09:18
No to jste mi toho moc nesdělil. Pak (se) nechtějte radit. Předpokládám, že máte nějakou uživatelskou funkci, která dělá, co chcete. Je celkem zbytečné dělat ji jako startatup. Jestliže ji odladíte na jednom výkrese a funguje, je druhým krokem aplikovat to na nějaký seznam výkresů. A já jsem toho názoru, že tady je cesta jen přes script. A ten není nutné psát ručně, ale je možné použít generátor.
  Já používám svůj generátor a tajnosti s ním nedělám http://www2.chrudim.cz/seiner/programy/Davka.zip