今回は、前回の [12] Excelとの連携②-5 指定画層にOffset で作成したWorkBookの改訂版で、ハッチングを検討しました。
合わせて、作図終了時の、Excel画面の最前面表示についても検討しました。
前回のWorkBookの使いまわしで、名前を変更して作成しました。
ThisWorkBookのWorkbook_Open()のコードは同じです。
Module2は、解放して削除し、Module1のコードを変更しています。
WorkSheetは、Sheet2を削除し、Sheet1を以下にしました。
5行目のパターン名は、E列に入力したパターン名のデーターから入力規制でリスト選択にしました。
Rectangとcirclehaは図形選択でハッチング、Plineは図形内選択でハッチングした例です。
Module1のVBAコード
Option Explicit ''Sleep関数 Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 ''指定されたウィンドウをZオーダーのトップ位置に移動。 Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long Sub AddHatch() ''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 CurLyr = BcadDoc.ActiveLayer.Name ''ハッチング用画層名を取得 Dim SelLyr As String SelLyr = ActiveSheet.ComboBox1.Value ''作図方法 Dim SelMethod As Boolean SelMethod = ActiveSheet.OptionButton1.Value '' BricsCADのキャプションを取得 Dim BcadCaption As String BcadCaption = BcadDoc.Application.Caption '' Excelのキャプションを取得 Dim xlApp As String xlApp = Excel.Application.Caption '' Excelのハンドルを取得 Dim XLhWnd As Long XLhWnd = FindWindow(vbNullString, xlApp) Dim SelectObj As AcadObject Dim pt() As Double '' BricsCADの画面をアクティブ AppActivate BcadCaption On Error Resume Next Do If SelMethod = True Then Call BcadDoc.Utility.GetEntity(SelectObj, pt(), "図形を選択: ") If Err Then Exit Do Dim hatchObj As AcadHatch Dim patternType As AcPatternType Dim patternName As String Dim bAssociativity As Boolean patternType = acHatchPatternTypePreDefined '定義されているパターン名から選択。 patternName = Cells(5, 2).Value 'パターン名 bAssociativity = True Set hatchObj = BcadDoc.ModelSpace.AddHatch _ (patternType, patternName, bAssociativity) ''ファイル定義パターン 、 パターン名 、 自動調整する Dim outerLoop(0 To 0) As AcadEntity Set outerLoop(0) = SelectObj hatchObj.AppendOuterLoop (outerLoop) hatchObj.PatternScale = Cells(6, 2).Value hatchObj.PatternAngle = Cells(7, 2).Value * 4 * Atn(1) / 180 ''Offset画層に変更 hatchObj.Layer = SelLyr hatchObj.Evaluate BcadDoc.Regen True Else '' 作図始点 pt() = BcadDoc.Utility.GetPoint(, "図形内をクリック : ESCで終了 ") If Err Then Exit Do Dim objHatch As AcadHatch Dim Hatpat As String Dim HatSca As String Dim HatAng As String ''パターン名 Hatpat = Cells(5, 2).Value HatSca = Cells(6, 2).Value HatAng = Cells(7, 2).Value ''画層をハッチング用画層に変更する BcadDoc.SetVariable "CLAYER", SelLyr If Hatpat = "SOLID" Then BcadDoc.SendCommand "-BHATCH" & vbCr & "P" & vbCr & Hatpat & vbCr & pt(0) & "," & pt(1) & vbCr & vbCr Else BcadDoc.SendCommand "-BHATCH" & vbCr & "P" & vbCr & Hatpat & _ vbCr & HatSca & vbCr & HatAng & vbCr & pt(0) & "," & pt(1) & vbCr & vbCr End If ''画層を現在画層に戻す BcadDoc.SetVariable "CLAYER", CurLyr End If ''図面を更新 BcadDoc.Application.Update Loop Err.Clear On Error GoTo 0 Set BcadApp = Nothing Set BcadDoc = Nothing Sleep 30 ''Excelの画面をアクティブ Call BcadActive(WshShell, XLhWnd, xlApp) Set WshShell = Nothing 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) ''フォアグランドタイトルがBricsCADの場合 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
以下続く・・・・
Excelのウインドウが、作図終了後で、AppActivate で最前面にならず、タクスバーのアイコンがテカテカ点滅する場合が有ります。
GetForegroundWindow で、現在フォアグラウンド(最前面)になっているウィンドウハンドルを取得し、GetWindowText で、そのウィンドウハンドルからタイトルバーテキスト(=キャプション)を取得すると・・・
フォアグラウンドのウィンドウが、Excelではなく、BricsCADになっている場合、AppActivate でExcelが最前面になりません。
SetForegroundWindowで、Zオーダーのトップ位置になりますが、最前面表示されないので、さらにSendKeys “%{tab}”,のウインドウ切り替えで、ようやく最前面表示できました。
SendKeysを使って以前検討していた時に、NUMLOCKがOFFになる現象について気付いていましたので、WSHShellでNUMLOCKを送っています。
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」Length measurement
BricsCAD VBAを使ってみよう[15] Excelとの連携②-8 画層状態コントロール
「Excel VBA to BricsCAD」layer control
以下検討中です。
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
「この特集記事の内容につきましては、
こちらの環境のみの検討結果です。
動作保証は出来かねますため、ご参考
資料としてお扱いください。
Windows10(64bit)
BricsCAD pro V21(64bit)
Office2019(64bit)
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇