Zobrazit plnou verzi příspěvku: Block za Block

SELM
04.01.2007, 16:04
Dostal jsem výkres, kde jsou stejné bloky uloženy vždy pod jiným ménem. Třeba jeden blok je tam 63x pod 63 jmény.
Jak ve VBA nahradit blok blokem.
Vím že bůžu projít všechny bloky, dokážu i jednotlivé bloky přejmenovat, potíž je v tom, že není možné přejmenovat na stéjné jméno více bloků (typů bloků) tím ho přepsat.
 
Jak na to?

musil
04.01.2007, 16:25
Zdravim selectoval bych body a posléze kopiroval jeden blok.
Ale vo VBA neporadim.

Vladimír Michl
04.01.2007, 16:52
Přejmenovat asi ne, ale nahradit bloky můžete pomocí BLOCKREPLACE - viz:
http://www.cadforum.cz/cadforum/qaID.asp?tip=1960

dazky
04.01.2007, 21:29

predpokladam, nechcete automaticky porovnavat
jednotlive bloky mezi sebou, a hledat ktere jsou si podobne
a nemate problem vytvorit seznam jak jednolive
bloky nahrazovat
 
ve vykrese (Model, Layouts) vyhledejte objekty
BlockReference
a nahradte je dle potreby asi takto, vycistenim
vykresu se pak zbavite nepotrebnych definic
 
Public Sub XXX()Dim BlockRefObj As
AcadEntityFor Each BlockRefObj In ThisDrawing.ModelSpace    If
BlockRefObj.ObjectName = "AcDbBlockReference" Then        If
BlockRefObj.Name = "63a" Then BlockRefObj.Name = "63"        If
BlockRefObj.Name = "63b" Then BlockRefObj.Name = "63"    End
IfNextEnd Sub

Chop
05.01.2007, 06:23
Zdravím, tak s tímhle jsem se taky setkal při podkladech z DGN jsem obdržel soubor se spoustou graficky stejných bloků s názvy např. strom$1, strom$2 až strom$1536.
V tomto případě nezabere ani BLOCKREPLACE protože umožní vybrat jen jeden název bloku pro nahrazení a dělat to 1536x …
Vytvořit ručně seznam pro nahrazení tolika bloků asi taky není moc příjemné.
Takže tady je makro pro nahrazení mnoha různých bloků blokem jedním.
Není úplně ošetřeno na chyby a tak postupujte takto:
1. spusťte makro
2. při běhu na obrazovce vyberte bloky, které chcete nahradit (výběr ukončete enter nebo PTM)
3. vyberte blok, kterým chcete vybrané bloky nahradit 
 
Sub Blok2Bloky()'provede nahrazení vybraných bloků novým blokemDim vybránblok As BooleanDim aktivobj As AcadEntityDim blok2 As AcadEntityDim Vklbod(0 To 2) As DoubleDim pomset As AcadSelectionSetDim aktset As AcadSelectionSetDim bodík As Variant
For Each pomset In ThisDrawing.SelectionSets    If pomset.Name = "ss1" Then        pomset.Delete 'čistě pro jistotu, pokud po nějakém zhroucení ještě výběr ss1 existuje        Exit For    End IfNext pomset    Set pomset = ThisDrawing.SelectionSets.Add("ss1") 'čistý výběr    ThisDrawing.Utility.Prompt "Vyberte bloky pro nahrazení"    Dim intType(0) As Integer    Dim varData(0) As Variant    intType(0) = 0    varData(0) = "INSERT"        pomset.SelectOnScreen intType, varData    ThisDrawing.Utility.Prompt ""        vybránblok = False    Do Until vybránblok        ThisDrawing.Utility.GetEntity blok2, bodík, "Vyberte blok pro nahrazení vybraných bloků. Blok nesmí být součástí výběru pro nahrazení."        If StrComp(blok2.ObjectName, "AcDbBlockReference", vbTextCompare) = 0 Then            vybránblok = True        Else            MsgBox "Vybraný objekt není blok! Zkuste výběr znovu", vbOKOnly            vybránblok = False        End If    LoopFor Each aktivobj In pomset
    On Error Resume Next     Select Case aktivobj.ObjectName    Case "AcDbBlockReference"      Dim br1 As AcadBlockReference      Dim Novyblk As AcadBlockReference      Set br1 = aktivobj      Set Novyblk = ThisDrawing.ModelSpace.InsertBlock(br1.InsertionPoint, blok2.Name, 1, 1, 1, br1.Rotation) 'na původní pozici a se stejnou rotací vloží nový blok      br1.Delete 'po nahrazení bloku smazat původní blok
    End SelectNext aktivobjThisDrawing.SelectionSets("ss1").DeleteEnd Sub
 Chop2007-01-05 06:36:00

Vladimír Michl
05.01.2007, 08:43
To je určitě užitečná funkce - jen pozor, neřeší řadu speciálních případů, ke kterým může běžně dojít (zamčené hladiny, vnořené bloky, atd.). Ty jsou právě ošetřeny v BLOCKREPLACE - ten lze spustit i řádkově (-BLOCKREPLACE) a také vybírat bloky ukázáním nebo jej zavolat ve smyčce se seznamem bloků.

topocad
22.02.2007, 10:45
jak udělat seznam, resp. smyčku pro seznam více bloků pro nahrazení jedním blokem
Máme převedené DGN a v něm blok 6.702 a jeho "klony" 6.702_10, ...202 atd. Abychom nemuseli nahrazovat blok po bloku