ソリッドワークスはVBAが使える。
VBAはExcelで使ったことがあるのでなんとなくわかるがSolidWorksのオブジェクトの使い方を探さないといけない。使い方よりサンプルだ。
これ、相当以前からやりたかっがやっとできた。
あるフォルダにある全図をPDFにできるようになった。うれしい。
で、
何をしてできたのかというと、googleしたのだが、
・マクロの操作を保存する方法
・ソリッドワークスのライブラリのヘルプ場所、サンプル探し
・ファイル一覧の方法
思い出せないので随時。
準備
ツールのユーザー定義で以下のダイアログを表示し、マクロにチェックを入れる。
マクロにチェックを入れると以下が見えるようになる。
—————————————————————-
全部自分でプログラムを書くのは面倒なのでやりたいことを操作してプログラムを作れせる。
適当なSLDDRW拡張子のファイルを呼び込んでおく。
を押して、同じ名前でPDFファイルを保存する。(余計なこと、関係ないことをマウスで操作しないこと!!!。プログラムが煩雑になる)
以下が出来上がった。
を押すとマクロのファイルを指定して呼び出すことができる。
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Set swApp = _
Application.SldWorks
Set Part = swApp.ActiveDoc
Part.ViewZoomtofit2
longstatus = Part.SaveAs3(“C:\Users\tanaka\Desktop\図面1\maru1.PDF”, 0, 0)
End Sub
!!注意、フォントの関係で\は¥のこと。!!!!!
この中で”C:\Users\tanaka\Desktop\図面1\maru1.PDF”の文字列が作れればほぼ完成している。
ついでに、ツールの参照設定でsolidworks????あたりを参照しておくと、コードを書くときに変数宣言時やイミディエイトでメソッドの使い方を教えてくれたり、メンバを一覧表示してくれたりする。
やらなくても動くが、やっておこう。
—————————————————————–
今呼び込んでいる図面をPDFで保存するマクロは以下です。ファイル名の拡張子SLDDRWをPDFに変えるだけ。
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Set swApp = _
Application.SldWorks
Set Part = swApp.ActiveDoc
Part.ViewZoomtofit2
ss = Part.GetPathName’今呼び込んでいる図面のパス名+ファイル名をssに入れる
kk = Split(ss, “.”)’.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1)
longstatus = Part.SaveAs3(ss & “.PDF”, 0, 0)’拡張子はPDFとして保存
End Sub
この中で厄介なので現在の呼び込んでいるファイル名やパス名を取り出す方法。
これはマクロ記憶ではできない。
GetPathNameメソッドを探すのには苦労した。APIのドキュメントで見つけることができたが、使い方がわからず、サンプルを探して
Part.GetPathName がやっと見つかった。
あとは、
文字列の操作/処理。
http://www.geocities.jp/cbc_vbnet/function/mojireyu_function.html#instr
イミディエイトに入れながらすると文字列処理はなんとかなる。VBAの編集でイミディエイトが見えない場合は、Ctrl+d。
—————————————————————-
今、呼び込んでいる図面のパスにある全SLDDRWのファイルを順番に呼び込んでPDFで保存する。
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Set swApp = _
Application.SldWorks
Set Part = swApp.ActiveDoc
Part.ViewZoomtofit2
ss = Part.GetPathName ‘今呼び込んでいる図面のパス名+ファイル名をssに入れる
‘.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
kk = Split(ss, “.”)
‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1)
‘ssの確認。イミディエイトのウィンドウにssのデータが書かれる。イミディエイトが見えない場合は、Ctrl+d
Debug.Print ss
jj = Split(ss, “\”) ‘\文字で区切って、各文字列を配列に入れる。
‘ファイル名の取り出し。最後の配列のデータをfnameに入れる。jj(0)が先頭のデータ。
fname = jj(UBound(jj))
pname = Left(ss, Len(ss) – Len(fname)) ‘パスの文字列、最後の¥も含む
Debug.Print fname
Debug.Print pname
nn = Dir(pname)’1つ目のファイル名を取り出す。nnにファイル名が入る
Do Until nn = “” ‘Dir()は全ファイルを取り出し終えたら””を返す
If InStr(nn, “.SLDDRW”) Then ‘ファイル名に.SLDDRWを含む場合
Debug.Print TypeName(nn), nn ‘TypeName関数はカッコ内のデータの型を返す
‘open_savePDF sub/サブルーチンを呼び出す。サブルーチンにパス名+ファイル名を渡す
open_savePDF pname & nn ‘open_savePDFは自作のサブルーチン(関数のようなもの)
End If
nn = Dir()’次のファイル名を取り出す。
Loop
End Sub
‘引数はパス名+ファイル名を受け取る。これは自作サブルーチン。ほとんどがマクロ記憶で
Sub open_savePDF(pf)
Set swApp = _
Application.SldWorks
Set Part = swApp.ActiveDoc
‘受け取ったpfパス名+ファイル名で開く
Set Part = swApp.OpenDoc6(pf, 3, 0, “”, longstatus, longwarnings)
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 21
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
‘ swApp.ActivateDoc2 “maru3.kotae – シート1”, False, longstatus
ss = Part.GetPathName ‘今呼び込んでいる図面のパス名+ファイル名をssに入れる
‘.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
kk = Split(ss, “.”)
‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1)
Debug.Print ss
longstatus = Part.SaveAs3(ss & “.PDF”, 0, 0)
Set Part = swApp.ActiveDoc
Set Part = Nothing
swApp.CloseDoc pf ‘パス名でも終了指定できる
End Sub
dir(パス名)を一度するれば、dir()とカッコ内になにも入れないと次のファイルを得ることができる。
closedocの引数がパスでもいいのが分かったのがこれ。
https://forum.solidworks.com/thread/33487