Produkt: AutoCAD 2000i
Datum: 13.03.2001
Stáhnout VBA projekt (8 KByte)
Pro řešení tohoto problému použijeme VBA. Nejprve si "rozebereme" problém:
Tím, že provedeme změnu v definici bloku, dosáhneme toho, že se změna automaticky projeví u všech referencí.
Definici bloku získáme pomocí kolekce Blocks. Pro vyhledání bloku podle zadaného názvu použijeme výraz:
DimblkDefAs AcadBlockSetblkDef = ThisDrawing.Blocks.Item(jméno_bloku)
Pokud blok se zadaným názvem v kolekci bloků v aktuálním výkresu existuje, proměnná blkDef se naplní odpovídajícími údaji. V opačném případě systém ohlásí chybu:
Pro ošetření chyby použijeme výraz On Error. V našem případě budeme pokračovat dále v provádění kódu (díry výrazu Resume Next) a otestujeme hodnotu proměnné Err. Pokud není nulová, došlo k chybě. V našem případě použijeme v takovém případě výraz Exit Sub pro ukončení funkce.
Dále projdeme všechny entity uvnitř definice bloku a zkontrolujeme jejich hladinu. Nejjednodušší je použít cyklus For Each:
DimsubEntAs AcadEntityFor EachsubEntInblkDefIfsubEnt.Layer = hledaná_hladinaThensubEnt.Layer = nová_hladinaEnd IfNext
Spojením obou kódů získáme funkci ChangeBlockLayer:
SubChangeBlockEntLayer(blkNameAs String, oldLayerAs String, newLayerAs String)DimblkDefAs AcadBlockDimsubEntAs AcadEntityOn Error Resume Next' vynulovat chybuErr.ClearSetblkDef = ThisDrawing.Blocks.Item(blkName)IfErr.Number <> 0ThenExit SubEnd IfFor EachsubEntInblkDefIfsubEnt.Layer = oldLayerThensubEnt.Layer = newLayerEnd IfNextEnd Sub
Nakonec doplníme hlavní funkci. Ta bude požadovat výběr bloku, u kterého chceme měnit entity, zadání "nové" a staré hladiny. Pro otesvání správnosti zadaných názvů hladin použijeme volání funkce Item kolekce Layers.
SubMacro1()DimentAs ObjectDimptAs VariantDimoldLayerAs StringDimnewLayerAs StringDimlayAs AcadLayerOn Error Resume Next' vynulovat chybuErr.Clear ThisDrawing.Utility.GetEntity ent, pt,"Vyberte blok: "IfErr.Number <> 0ThenExit SubEnd IfIfent.EntityName <>"AcDbBlockReference"ThenMsgBox"Entita není blok !"Exit SubEnd IfoldLayer = ThisDrawing.Utility.GetString(True,"Stará hladina: ")IfErr.Number <> 0ThenExit SubEnd If' otestovat, zdali hladina skutečně ve výkrese existujeSetlay = ThisDrawing.Layers.Item(oldLayer)IfErr.Number <> 0ThenMsgBox"Hladina neexistuje !"Exit SubEnd IfnewLayer = ThisDrawing.Utility.GetString(True,"Nová hladina: ")IfErr.Number <> 0ThenExit SubEnd If' otestovat, zdali hladina skutečně ve výkrese existujeSetlay = ThisDrawing.Layers.Item(oldLayer)IfErr.Number <> 0ThenMsgBox"Hladina neexistuje !"Exit SubEnd If' nyní zavolat funkci pro změnu entitChangeBlockEntLayer ent.Name, oldLayer, newLayer' a nakonec zregenerovat výkresThisDrawing.Regen acAllViewportsEnd Sub
Na konci hlavní funkce nesmíme zapomenout zavolat metodu Regen s parametrem acAllViewports. To způsobí, že AutoCAD překreslí obsah všech výřezů - tzn. provedené změny v tabulce symbolů (bloků) se zobrazí ve výkrese.
Copyright © 2001 CAD Studio s.r.o.