明日には出口にたどり着けそう。長かった・・・。
少し前に行った作業で、類似した作業を何度もやることになった為
急遽作ったマクロです。
指定したボディをアセンブルで子供にするだけのマクロです。
えぇ大した事無いです。 具体的に示すとこんな事です。
このボディー.2を
ボディー.3にこんな感じでぶら下げるだけです。
循環更新を避けたり、ワンクッション入れたかったする為です。
もちろん、これだけであればマクロを作らずに手動でやってしまいます。
マクロの起動時間も考えれば、その方が速いです。
実際の作業で行っていたのは、
このfugaを
子ボディにしつつ、ボディの名前を子ボディに関係するようにしていました。
手動でやる場合、Alt+Enterでプロパティを表示させ、タブを切り替え・・・
が、面倒だったんです。
で、作ったコードがこちら
'vba using-'KCL' Private Const Header = "piyo_" Private Const Footer = "_hoge" Sub CATMain() Dim Msg$: Msg = "Bodyを選択して下さい : ESCキー 終了" Dim SelElem As SelectedElement Do Set SelElem = KCL.SelectElement(Msg, Array("Body")) If KCL.IsNothing(SelElem) Then Exit Do Dim BodyOj As Body: Set BodyOj = SelElem.Value Dim Pt As Part: Set Pt = KCL.GetParent_Of_T(BodyOj, "Part") 'パーツボディチェック If IsMainBody(BodyOj, Pt) Then MsgBox "パーツボディは出来ません" GoTo Continue End If '子ボディチェック If BodyOj.InBooleanOperation = 1 Then 'Boolean型だけどTrueじゃNG MsgBox "既に子ボディの為出来ません" GoTo Continue End If Call InitNewBody(BodyOj, Pt) Pt.Update Continue: Loop End Sub Private Sub InitNewBody(ByVal Bdy As Body, ByVal Pt As Part) Dim BdyName$: BdyName = Bdy.Name Dim Fact As ShapeFactory: Set Fact = Pt.ShapeFactory Dim NewBdy As Body: Set NewBdy = Pt.Bodies.Add() NewBdy.Name = Header + BdyName + Footer Dim Assem As Assemble: Set Assem = Fact.AddNewAssemble(Bdy) Call Pt.UpdateObject(Assem) End Sub Private Function IsMainBody(ByVal Bdy As Body, ByVal Pt As Part) As Boolean IsMainBody = IIf(KCL.GetInternalName(Pt.MainBody) = KCL.GetInternalName(Bdy), _ True, False) End Function
定数は 'Header' 'Footer' は実際に利用する文字にしておく必要があります。
又、マクロ実行中にPart・Productファイルを切り替えるとエラーになります。
'アセンブル' じゃなくて '和' が良いよ って方は、InitNewBody関数内を
ちょこっと修正すればOKです。