直線とポリラインのみですが、長さを取得する用向きが有りましたので作成しました。
今回もExcelVBAで、WorkSheetをコントロール画面に使用しています。
計測する線をクリックして、長さの値をExcelに取得していきます。
クリック位置に連番を付けて、Excelに計測値とクリック位置の座標を残します。(確認でスクロールできるようにしようと思っていますが未処理です)
1,VBAコードの概要
GetEntityメソッドで取得します。
Call BcadDoc.Utility.GetEntity(objEnt, GetPt, “図形を選択:終了ESC “)
objEnt:選択した図形AcDbPolyline、AcDbLineを返します
GetPt,:ピックボックス選択での座標値(のため図形直上の点ではありません)
今回は、補助連番用のSubNo画層は事前に作成しておきます。
図面作図単位は㎜で、取得した値をmに換算しています。
線色はbylayerとし、計測済みは線色を変えれるようにしました。
2,長さ計測用のプロシージャ
Option Explicit
''Win32API宣言(64bit)
''スレッドの一時待機
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
''どのキーが押されたのかを取得
Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
''クラス名またはキャプションタイトルからウィンドウハンドルを取得
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
''フォアグラウンドウィンドウのハンドルを取得。
Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long
''指定されたウィンドウのハンドルからキャプションタイトルを取得。
Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
''指定されたウィンドウを最前面に移動。
Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
Sub GetLength()
''NUMLOCK用
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
''【BricsCADのオブジェクト変数を宣言】
Dim BcadApp As BricscadApp.AcadApplication
Dim BcadDoc As BricscadApp.AcadDocument
''現在開いているBricsCADを取得する
Set BcadApp = GetObject(, "BricscadApp.AcadApplication")
BcadApp.Visible = True
Set BcadDoc = BcadApp.ActiveDocument
''画層名の変数を宣言
Dim CurLyr As String, SubNoLyr As String
''補助連番画層名を変数に格納
SubNoLyr = Cells(2, 2).Text
''補助連番文字高を変数に格納
Dim SubNoHi As Long
SubNoHi = Cells(3, 2).Value
''計測後の線色変更
Dim Chcol As Boolean
Chcol = ActiveSheet.CheckBox1.Value
Dim Colno As Integer
Colno = Cells(5, 4).Value
''文字の変数を宣言
Dim objText As AcadText
''図形スナップモードの変数を宣言
Dim OSM As Integer
OSM = BcadDoc.GetVariable("OSMODE")
''クワッドの変数の宣言と値の格納
Dim QDP As Integer
QDP = BcadDoc.GetVariable("QUADDISPLAY")
''RTの変数の宣言と値の格納
Dim RTP As Integer
RTP = BcadDoc.GetVariable("ROLLOVERTIPS")
''現在の画層名を変数に格納
CurLyr = BcadDoc.ActiveLayer.Name
'' BricsCADのキャプションの変数の宣言と値の格納
Dim BcadCapt As String
BcadCapt = BcadDoc.Application.Caption
'' Excelのキャプションの変数の宣言と値の格納
Dim xlApp As String
xlApp = Excel.Application.Caption
'' Excelのハンドルの変数の宣言と値の格納
Dim XLhWnd As Long
XLhWnd = FindWindow(vbNullString, xlApp)
''====================================
''========== 【長さを取得】===========
''====================================
'' 計測カウント用の変数を宣言
Dim GetCnt As Integer
'' カウント開始Noを取得
GetCnt = Cells(6, 2).Text
'' BricsCADの画面をアクティブ
AppActivate BcadCapt
''クワッドを無効にする
BcadDoc.SetVariable "QUADDISPLAY", -1 * QDP
''RTを無効にする
BcadDoc.SetVariable "ROLLOVERTIPS", 0
'' OSMODEを無効にする
'BcadDoc.SetVariable "OSMODE", 0
Dim objEnt As AcadEntity
Dim GetPt As Variant
Dim objLen As Double
Do
On Error Resume Next
Call BcadDoc.Utility.GetEntity(objEnt, GetPt, "図形を選択:終了ESC ")
''ESCキーの場合は終了
If GetAsyncKeyState(vbKeyEscape) Then
GoTo ErrLine
''図形選択の場合
ElseIf GetPt <> "" Then
''直線もしくはポリラインのみ計測
If objEnt.EntityName = "AcDbLine" Or objEnt.EntityName = "AcDbPolyline" Then
''長さを取得
objLen = objEnt.Length
''計測済み図形を色変更する場合
If Chcol = True Then objEnt.Color = Colno
''画層を"SubNo"に変更する
BcadDoc.SetVariable "CLAYER", SubNoLyr
''補助連番を記入する
Set objText = BcadDoc.ModelSpace.AddText(GetCnt, GetPt, SubNoHi)
objText.Alignment = acAlignmentMiddleCenter
objText.TextAlignmentPoint = GetPt
''Excelへ面積値を記入する
Dim DataRow As Integer
DataRow = GetCnt + 7
Cells(DataRow, 1).Value = GetCnt
Cells(DataRow, 2).Value = Format(objLen / 1000)
Cells(DataRow, 2).NumberFormatLocal = "0.00"
''クリックした座標値を残す
Cells(DataRow, 3).Value = GetPt(0)
Cells(DataRow, 4).Value = GetPt(1)
'Cells(DataRow, 5).Value = objEnt.EntityName
''計測カウントをカウントアップする
GetCnt = GetCnt + 1
Cells(6, 2).Value = GetCnt
End If
End If
Loop
ErrLine:
''画層を元に戻す
BcadDoc.SetVariable "CLAYER", CurLyr
''図形スナップモードを元に戻す
'BcadDoc.SetVariable "OSMODE", OSM
''クワッドの設定を元に戻す
BcadDoc.SetVariable "QUADDISPLAY", QDP
''RTの設定を元に戻す
BcadDoc.SetVariable "QUADDISPLAY", RTP
Sleep 300
''Excelの画面をアクティブ
Call BcadActive(WshShell, XLhWnd, xlApp)
Set WshShell = Nothing
Err.Clear
On Error GoTo 0
Set objText = Nothing
Set BcadDoc = Nothing
Set BcadApp = Nothing
Exit Sub
End Sub
Public Function BcadActive(WshShell, XLhWnd As Long, xlApp As String) As Boolean
''フォアグランドのタイトル
Dim FGtitle As String
''現在フォアグラウンドになっているウィンドウハンドルを取得
Dim FGHwnd As Long
FGHwnd = GetForegroundWindow
''フォアグラウンドのタイトルバーテキストを格納
FGtitle = String(100, Chr(0))
GetWindowText FGHwnd, FGtitle, Len(FGtitle)
''フォアグランドタイトルがExcelではない場合
If FGtitle <> xlApp Then
''フォアグランドタイトルをExcelにする
SetForegroundWindow (XLhWnd)
''「ALT+TAB」キーストロークを送りExcelを最前面にする
Application.SendKeys "%{tab}", True
''NUMLOCK
WshShell.SendKeys "{NUMLOCK}"
Else
AppActivate xlApp
End If
End Function
Sub DataClear()
If Cells(6, 2).Value > 1 Then
''取得データーを全てクリア
Dim LastDataRow As Long
LastDataRow = Cells(Rows.Count, 1).End(xlUp).Row
ActiveSheet.Range(Rows(8), Rows(LastDataRow)).ClearContents
Cells(6, 2).Value = 1
Range("A8").Activate
End If
End Sub
標準モジュールを作成し、その中に上記VBAコードを記述します。
GetLengthを長さ計測ボタンに、DataClearをクリアボタンにマクロ登録して使用します。
Windows10(64bit)からWindows11(64bit)へアップグレードしましたので、現在の作業環境は以下です。
Windows11(64bit)
BricsCAD pro V21(64bit)
Office2019(64bit)
Windows11へのアップグレードは、まだ当分いいかと思っていましたが、いつの間にやらダウンロード済みになり、起動時にアップグレードのキャンセルが分からなく、成り行きで、ごくごくごくっと自然にWindows11へアップグレードされました><;
BricsCAD VBAを使ってみよう INDEX
BricsCAD VBAを使ってみよう[1] VBAのインストール
BricsCAD VBAを使ってみよう[2] UserFormその1
「BricsCAD VBA 」Creating UserForm
BricsCAD VBAを使ってみよう[3] UserFormその2
「BricsCAD VBA 」SerialNumber drawing with UserForm
BricsCAD VBAを使ってみよう[4] VBAの基本コード①
BricsCAD VBAを使ってみよう[5] VBAの基本コード②
BricsCAD VBAを使ってみよう[6] Excelとの連携①
「BricsCAD VBA to Excel」Get_CoordinateValues
BricsCAD VBAを使ってみよう[7] Excelとの連携②
「Excel VBA to BricsCAD」Get_Area
BricsCAD VBAを使ってみよう[8] Excelとの連携②-2
「Excel VBA to BricsCAD」Draw_ChannelSteel
BricsCAD VBAを使ってみよう[9] TABLEの自動作成と値入力
「BricsCAD VBA 」AutomaticCreation of TABLE
BricsCAD VBAを使ってみよう[10] Excelとの連携②-3
「Excel VBA to BricsCAD」SerialNumber_Ⅱ
BricsCAD VBAを使ってみよう[11] Excelとの連携②-4
「Excel VBA to BricsCAD」Draw_Rectang
BricsCAD VBAを使ってみよう[12] Excelとの連携②-5 指定画層にOffset
「Excel VBA to BricsCAD」Continuous Offset to Specified Layer
BricsCAD VBAを使ってみよう[13] Excelとの連携②-6 指定画層にHATCH
「Excel VBA to BricsCAD」Continuous Hatch to Specified Layer
BricsCAD VBAを使ってみよう[14] Excelとの連携②-7 長さ計測
「Excel VBA to BricsCAD」Get Length
BricsCAD VBAを使ってみよう[15] Excelとの連携②-8 画層状態コントロール
「Excel VBA to BricsCAD」layer contr
以下検討中です。
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
「この特集記事の内容につきましては、
こちらの環境のみの検討結果です。
動作保証は出来かねますため、ご参考
資料としてお扱いください。
Windows11(64bit)
BricsCAD pro V21(64bit)
Office2019(64bit)
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇



