メモ‎ > ‎AutoCAD VBA‎ > ‎

VBAでコマンドとツールバーを追加するサンプル

2010/06/11 15:47 に mura が投稿   [ 2010/06/11 19:19 に更新しました ]
ポリラインの面積サンプルプログラムを使って、LispでVBAのコマンドを追加するサンプルとツールバーを追加、削除するコードを書いておきます。
VBAコマンドの追加には、「Sub AddAcCommand」を使い ポイントはLISPのコマンドからVBAを呼び出すところ。
「(defun C:mura_[AutoCADコマンド名]() (command "-vbarun" "[プロジェクト名].ThisDrawing.[VBAサブプロージャ名]")(princ))」 ツールバーの追加・削除は 「Sub DeleteVBAToolBar()」と「Function AddAcToolBar」「Sub CreateVBAToolBar」あたり。
どちらも基本なので難しくない?

面積を調べたり、文字を計算するのは割とよく使いたい機能なので、足し算と引き算。文字を選択セットで処理できると嬉しいかな・・・。
グリッドで処理できるともっと良いけど。
テキストボックスに一括して取り出すというのも簡単で使えるプログラムかも。
この周辺は、プログラムの精度を上げていくと可能性の広がる分野かな。
'-------------------------------------------------------------
' -ポリラインの面積サンプルプログラム
' - http://www.mura.sh/
' - (c) mura. 2004  All rights reserved
'-------------------------------------------------------------
  Const VBAMenuGroupName As String = "CUSTOM"
  Const VBAToolBarName As String = "Plineから面積の注釈を作成"
  Const ProjectName As String = "Pline2Area.ThisDrawing"

Public Sub AddField()
    Dim returnObj As AcadObject
    Dim basePnt As Variant
    Dim acPline As AcadLWPolyline
    Dim acMtext As AcadMText
    Dim strCode As String
    Dim width As Double

RETRY:
    On Error Resume Next
    '面積を調べるポリラインを選択
    ThisDrawing.Utility.GetEntity returnObj, basePnt, vbCr + "ポリラインを選択: "
    
    If Err <> 0 Then
        Debug.Print "Program ended. Err:" & Err
        'MsgBox "Program ended." & Err, , "VBA プログラム"
        Err.Clear
        Exit Sub
    Else
        If (returnObj.ObjectName = "AcDbPolyline") Then
            Set acPline = returnObj
            '計算
            strCode = Format(acPline.Area / 1000000, "##,##0.000 ㎡")
            'width = 1000
            'マルチテキストの作成位置を指定
            basePnt = ThisDrawing.Utility.GetPoint(, "マルチテキストの左上コーナーを指定: ")
            Set textObj = ThisDrawing.ModelSpace.AddMText(basePnt, width, strCode)
            acMtext.Update
            Exit Sub
        End If
    End If
    
    GoTo RETRY
End Sub

Public Sub CalcText()
    Dim returnObj As AcadObject
    Dim basePnt As Variant
    Dim acPline As AcadLWPolyline
    Dim acMtext As AcadMText
    Dim textObj As AcadMText
    Dim strCode As String
    Dim dubCode As Double
    Dim width As Double

RETRY:
    On Error Resume Next
    '計算する文字を選択
    ThisDrawing.Utility.GetEntity returnObj, basePnt, vbCr + "文字を選択: "
    
    If Err <> 0 Then
        'MsgBox "合計: " & dubCode, , "VBA プログラム"
        Err.Clear
        GoTo MTXT
        'Exit Sub
    Else
        If (returnObj.ObjectName = "AcDbMText") Then
            Set acMtext = returnObj
            'フィールド式の定義
            strCode = Left(acMtext.TextString, Len(acMtext.TextString) - 2)
            dubCode = dubCode + strCode
        End If
    End If
    
    GoTo RETRY
MTXT:
            'マルチテキストの作成位置を指定
            basePnt = ThisDrawing.Utility.GetPoint(, "マルチテキストの左上コーナーを指定: ")
            Set textObj = ThisDrawing.ModelSpace.AddMText(basePnt, width, dubCode & " ㎡")
            textObj.Update
            Exit Sub
    
End Sub

'-------------------------------------------
' ツールバーの追加/定義
'-------------------------------------------
Private Function AddAcToolBar(strGroupName, strTBarName As String) As AcadToolbar
    Dim objToolBars As AcadToolbars
    Dim objToolBar As AcadToolbar
    
    Set objToolBars = ThisDrawing.Application.MenuGroups.Item(VBAMenuGroupName).Toolbars
    
    On Error Resume Next
    Set AddAcToolBar = objToolBars.Add(strTBarName)
    If Err Then
        Set AddAcToolBar = objToolBars.Item(strTBarName)
'       MsgBox "'VBA ToolBar' already exists!!"
        Exit Function
    End If
    On Error GoTo 0
    'AddAcToolBar = objToolBar
End Function

'-------------------------------------------
' ボタンの追加/定義
'-------------------------------------------
Private Sub AddAcButton(objToolBar As AcadToolbar, _
                        vrIndex As Variant, _
                        stName, stHelpString, strCommand, srtSub, SmallIconName, LargeIconName As String)
    Dim objToolbarItem As AcadToolbarItem
    'VBAコマンドの定義
    Call AddAcCommand(strCommand, srtSub)    'strCommand:AutoCADのコマンド名 strVbaSub:VBAサブプロージャ名
    'ツールバーボタンの作成strVbaSub
    Set objToolbarItem = objToolBar.AddToolbarButton(vrIndex, stName, stHelpString, ".." & strCommand & vbCr)
    Call objToolbarItem.SetBitmaps(SmallIconName, LargeIconName)
End Sub

'-------------------------------------------
' VBAコマンドの追加/定義
'-------------------------------------------
Private Sub AddAcCommand(strCommand, strVbaSub As Variant)  'strCommand:AutoCADのコマンド名 strVbaSub:VBAサブプロージャ名
    Dim ExecCmd As String
    ExecCmd = Chr(34) & "-vbarun" & Chr(34) & " " & Chr(34) & ProjectName & "." & strVbaSub & Chr(34)
    ThisDrawing.SendCommand "(defun C:" & strCommand & "() (command " & ExecCmd & ")(princ))" & vbCr
End Sub

'-------------------------------------------------------------------------
'ツールバーの削除
'-------------------------------------------------------------------------
Sub DeleteVBAToolBar()
    Dim objToolBars As AcadToolbars
    Dim objToolBar As AcadToolbar
    Set objToolBars = ThisDrawing.Application.MenuGroups.Item(VBAMenuGroupName).Toolbars
    For Each objToolBar In objToolBars                              ' コレクションの各要素に対して繰り返します。
        If objToolBar.Name = VBAToolBarName Then      ' Text プロパティが "Hello" であれば、
            objToolBar.Delete                                       ' Found に True を設定します。
            Exit For                                                ' For ループから抜け出します。
        End If
    Next
End Sub

'-------------------------------------------------------------------------
'ツールバーの作成
'-------------------------------------------------------------------------
Sub CreateVBAToolBar()
    Dim objToolBar As AcadToolbar
    
    Set objToolBar = AddAcToolBar(VBAMenuGroupName, VBAToolBarName)
    Call AddAcButton(objToolBar, 0, "ツールバー削除", "VBAで作成したこのツールバーを削除", "mura_DeleteVBAToolBar", "DeleteVBAToolBar", "RCDATA_16_HLNK_STOP", "RCDATA_16_HLNK_STOP")
    Call AddAcButton(objToolBar, 0, "ポリラインの面積", "", "mura_af", "AddField", "RCDATA_16_AREA", "RCDATA_16_AREA")
    Call AddAcButton(objToolBar, 0, "面積の足し算", "", "mura_ct", "CalcText", "RCDATA_16_MTEXT", "RCDATA_16_MTEXT")
End Sub

(2005年1月 5日)
Comments