前回の
BricsCAD VBAを使ってみよう[7] Excelとの連携②
からの続篇です
前回は、ExcelVBAでBricsCADと連携する場合で、図形の面積値をExcelのシートに取得するVBAを検討しました。
今回は、Excelのシートのデーターから作図を行うVBAで、チャンネル鋼(溝形鋼)の作図を検討しました。
1,基本設定
1-1,ExcelVBEでの設定
新たなWorkBookで作成する場合は、BricsCADのタイプライブラリを使えるように、ExcelのVBE画面で参照設定を行います。
「BricscadApp Type Library 20.0」と「BricscadDbApp Type Library 20.0
」の2か所をチェックし登録します。
2,エクセルシートから作図データー取得
2-1,溝形鋼作図用シート
概要
Excelシートの規格表の対象個所のセルをアクティブにして、作図実行ボタン。
(Noのセルかその行の規格数値のセルを選択)
閉じたポリラインで作図します。
Excelシートの規格値は必要なものだけですので、応じて追加してください。
2-2,溝形鋼作図のVBA
Option Explicit
Sub DrawChannelSteel()
''===================================================
''================ 溝形鋼作図 =====================
''===================================================
''【BricsCADのオブジェクト変数を宣言】
Dim BcadApp As BricscadApp.AcadApplication
Dim BcadDoc As BricscadApp.AcadDocument
On Error Resume Next
''【BricsCADを取得する】
Set BcadApp = GetObject(, "BricscadApp.AcadApplication")
''BricsCADが開かれていない場合は新規に作成する
If Err.Number <> 0 Then
''Errオブジェクトをクリア
Err.Clear
''新規にBricsCADのインスタンスを生成
Set BcadApp = CreateObject("BricscadApp.AcadApplication")
End If
BcadApp.Visible = True
Set BcadDoc = BcadApp.ActiveDocument
'' BricsCADのキャプションを取得
Dim BcadCaption As String
BcadCaption = BcadDoc.Application.Caption
'' BricsCADの画面をアクティブ
AppActivate BcadCaption
BcadDoc.SetVariable "FILLETRAD", 0
''現在のフィレット半径を取得
Dim CurFRad As Double
CurFRad = BcadDoc.GetVariable("FILLETRAD")
''回転角度
Dim RAng As Double
''回転中心座標
Dim RPt(0 To 2) As Double
''選択セルの行を取得
Dim Sr As Integer, Sc As Integer
Sr = Selection.Row
''アクティブセルが9行目以下の場合
If Sr < 10 Then MsgBox "規格表内を選択してください。": Exit Sub
''選択した規格値を取得
Dim H As Double, B As Double, t1 As Double, t2 As Double, r1 As Double, r2 As Double
H = Cells(Sr, 2).Value
B = Cells(Sr, 3).Value
t1 = Cells(Sr, 4).Value
t2 = Cells(Sr, 5).Value
r1 = Cells(Sr, 6).Value
r2 = Cells(Sr, 7).Value
''==================作図処理開始=========================
On Error Resume Next
''作図開始点を取得
Dim pt() As Double, Xs As Double, Ys As Double
pt = BcadDoc.Utility.GetPoint(, "図形挿入点をクリック:")
''キャンセルの場合
If Err.Number <> 0 Then
GoTo ErrLine
End If
''======Zoom======
Dim ZPt1(0 To 2) As Double
Dim ZPt2(0 To 2) As Double
ZPt1(0) = pt(0) - 10: ZPt1(1) = pt(1) - 10: ZPt1(2) = 0
ZPt2(0) = pt(0) + H + 10: ZPt2(1) = pt(1) + B + 10: ZPt2(2) = 0
ZoomWindow ZPt1, ZPt2
Dim LWPobj As AcadLWPolyline
Dim LinObj As AcadLine
''======①ライトウエイトポリライン作図=======
''1線目をポリラインで作図し以降はFILLETする
Dim LWpt(0 To 3) As Double
LWpt(0) = pt(0): LWpt(1) = pt(1)
LWpt(2) = pt(0): LWpt(3) = pt(1) + B
Set LWPobj = BcadDoc.ModelSpace.AddLightWeightPolyline(LWpt)
''=======②ライン作図========
Dim Pt2(0 To 2) As Double
Dim Pt3(0 To 2) As Double
Pt2(0) = pt(0): Pt2(1) = pt(1) + B: Pt2(2) = 0
Pt3(0) = pt(0) + t2: Pt3(1) = pt(1) + B: Pt3(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt2, Pt3)
''ライン①とライン②をフィレット
BcadDoc.SendCommand "_FILLET " & LWpt(0) & "," & (LWpt(1) + LWpt(3)) / 2 & vbCr & _
(Pt2(0) + Pt3(0)) / 2 & "," & Pt2(1) & vbCr
''=======③ライン作図========
Dim Pt4(0 To 2) As Double
Pt4(0) = pt(0) + t2: Pt4(1) = pt(1) + t1: Pt4(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt3, Pt4)
''回転
RAng = 5
''回転基点
RPt(0) = pt(0) + t2: RPt(1) = pt(1) + B / 2: RPt(2) = 0
''図形回転
LinObj.Rotate RPt, RAng * ((4 * Atn(1) / 180))
''ライン②とライン③をフィレット
BcadDoc.SetVariable "FILLETRAD", r2
BcadDoc.SendCommand "_FILLET " & pt(0) & "," & pt(1) + B & vbCr & _
RPt(0) & "," & RPt(1) & vbCr
BcadDoc.SetVariable "FILLETRAD", 0
''=======④ライン作図========
Dim Pt5(0 To 2) As Double
Pt5(0) = pt(0) + H - t2: Pt5(1) = pt(1) + t1: Pt5(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt4, Pt5)
''ライン③とライン④をフィレット
BcadDoc.SetVariable "FILLETRAD", r1
BcadDoc.SendCommand "_FILLET " & RPt(0) & "," & RPt(1) & vbCr & _
Pt4(0) + H / 2 & "," & Pt4(1) & vbCr
BcadDoc.SetVariable "FILLETRAD", 0
''=======⑤ライン作図========
Dim Pt6(0 To 2) As Double
Pt6(0) = pt(0) + H - t2: Pt6(1) = pt(1) + B: Pt6(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt5, Pt6)
''回転
RAng = -5
''回転基点
RPt(0) = pt(0) + H - t2: RPt(1) = pt(1) + B / 2: RPt(2) = 0
''図形回転
LinObj.Rotate RPt, RAng * ((4 * Atn(1) / 180))
''ライン④とライン⑤をフィレット
BcadDoc.SetVariable "FILLETRAD", r1
BcadDoc.SendCommand "_FILLET " & Pt5(0) - H / 2 & "," & Pt5(1) & vbCr & _
RPt(0) & "," & RPt(1) & vbCr
BcadDoc.SetVariable "FILLETRAD", 0
''=======⑥ライン作図========
Dim Pt7(0 To 2) As Double
Dim Pt8(0 To 2) As Double
Pt7(0) = pt(0) + H - t2: Pt7(1) = pt(1) + B: Pt7(2) = 0
Pt8(0) = pt(0) + H: Pt8(1) = pt(1) + B: Pt8(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt7, Pt8)
''ライン⑤とライン⑥をフィレット
BcadDoc.SetVariable "FILLETRAD", r2
BcadDoc.SendCommand "_FILLET " & RPt(0) & "," & RPt(1) & vbCr & _
Pt7(0) + t2 / 2 & "," & Pt7(1) & vbCr
BcadDoc.SetVariable "FILLETRAD", 0
''=======⑦ライン作図========
Dim Pt9(0 To 2) As Double
Dim Pt10(0 To 2) As Double
Pt9(0) = pt(0) + H: Pt9(1) = pt(1) + B: Pt9(2) = 0
Pt10(0) = pt(0) + H: Pt10(1) = pt(1): Pt10(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt9, Pt10)
''ライン⑥とライン⑦をフィレット
BcadDoc.SendCommand "_FILLET " & pt(0) + H - t2 / 5 & "," & pt(1) + B & vbCr & _
pt(0) + H & "," & pt(1) + B / 2 & vbCr
''=======⑧ライン作図========
Dim Pt11(0 To 2) As Double
Dim Pt12(0 To 2) As Double
Pt11(0) = pt(0): Pt11(1) = pt(1): Pt11(2) = 0
Pt12(0) = pt(0) + H: Pt12(1) = pt(1): Pt12(2) = 0
Set LinObj = BcadDoc.ModelSpace.AddLine(Pt11, Pt12)
''ライン⑦とライン⑧をフィレット
BcadDoc.SendCommand "_FILLET " & pt(0) + H & "," & pt(1) + B / 2 & vbCr & _
pt(0) + H / 2 & "," & pt(1) & vbCr
''フィレット半径を元に戻す
BcadDoc.SetVariable "FILLETRAD", CurFRad
''ポリラインを閉じる
LWPobj.Closed = True
''ポリライン図形を更新する
LWPobj.Update
ErrLine:
Range("A8").Activate
Err.Clear
On Error GoTo 0
Set LWPobj = Nothing
Set LinObj = Nothing
Set BcadDoc = Nothing
Set BcadApp = Nothing
Exit Sub
End Sub
概要
作図は、①で、まずポリラインを作図し、順次ラインを作図してフィレットしながら、連続したポリラインにします。
①②から順に②③、③④・・・とフィレットします。
作図図形が小さいと、特に⑥⑦ラインがフィレットされません。
その為、作図時に作図図形範囲にズームします。
次回は、CAD画面のTABLEを使って、前回の面積取得と同様にTABLEのセルに、取得した面積値を自動入力することを検討しました、
BricsCAD VBAを使ってみよう[9] TABLEの自動作成と値入力
今回は、以前のポリライン描画とは異なった方法の。出角・入角でR付きの連続したポリライン描画として、チャンネル鋼(溝形鋼)の作図を検討しました。
検討中はフィレット箇所が、にゃんこの手みたいになったり今一でしたが、作図範囲をZoomすると作図できました。
作図時のZoomは状況に応じて必要ですね。
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
以下検討中です。
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
「この特集記事の内容につきましては、
こちらの環境のみの検討結果です。
動作保証は出来かねますため、ご参考
資料としてお扱いください。
Windows10(64bit)
BricsCAD pro V20(64bit)
Office2019(64bit)
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇






