見出し画像

【ごまかんぱちの挑戦】エクセルでAutoCADの自動作図(その8)

こんにちは。ごまかんぱちです。🐟

AutoCADの自動作図を目指して奮闘しています。
第8回の今回は 、家らしきものを描いてみます。

8-1. 家を建てよう


まずは、エクセルで こんな感じのシートをつくります。

黄色のセルには 好きな数値を入力します。
セルI14には、緑色四角の式を入力してください。
要は セルD14とセルI14の値は同じ ということです。
セルD2の値は「10」で固定です。

まずは 屋根から。
屋根は 水平に10 (セルD2)、鉛直に4 (セルC3)行くような角度で描くので、コードはこうなります。

    Print #1, "line " & 0 & "," & 0 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "

実行結果はこう。

これで 屋根の下側の線が描けました。
続いて 上側です。
さあ どうやって描きますか?

普通に作図する場合は、今 描いた線を選択して 200オフセットして…
という感じでしょうか。

しかし この自動作図の方法では、選択するという行為が非常に苦手なのです。
できたりできなかったりで、挙動がよくわかりません。

一応 オフセットのコードを紹介しますが、今回は 線分で描きます。

オフセットのコードと解説です。

    Print #1, "offset " & Range("C7") & " " & 0 & "," & 0 & " " & 0 & "," & 100 & " "   'オフセット

興味があれば 試してみてください。
では オフセットのことは忘れて、線分で屋根の上側を描いていきましょう。

    Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) & " " & Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2"))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " "

ぐっ・・・  な 長い…😥

一応 できました。😑
コレ 労力に見合ってるのか?
オフセットが いかに偉大かを痛感させられました。

続いて屋根の厚みの線を描きます。
もう 長いコードは書きたくないなぁ…😥
相対座標を使って ラクしちゃいましょう。
あの 長い長い座標が (@0,0)で完結します。😊

    Print #1, "line @" & 0 & "," & 0 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "

できました。😊
続いて 左側です。

先ほどと同じ理由(選択するのが苦手)で、鏡像なんか使いません。
線分コマンドのみで 地道に書いていきます。

'屋根(左)
Print #1, "line " & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "
Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) & " " & -(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " "
Print #1, "line @" & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "

左右対称なので、ところどころ x座標をマイナスにするだけです。

できました。😊
あとは、壁やら床やらを描きます。

'壁
Print #1, "line " & Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") & " @" & 0 & "," & -Range("I9") & " "
Print #1, "line " & -Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") & " @" & 0 & "," & -Range("I9") & " "
    
'床
Print #1, "line @" & 0 & "," & 0 & " @" & Range("F14") & "," & 0 & " "

ハイ できました。😊

続いて 寸法を入れます。

'◆寸法線
Print #1, "clayer Layer2"       '画層の指定

'壁
Print #1, "dimlinear " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") & " h @" & 0 & "," & -500
Print #1, "dimlinear @" & 0 & "," & 500 & " @" & Range("F14") & "," & 0 & " h @" & 0 & "," & -500
    
'床
Print #1, "dimlinear @" & 0 & "," & 500 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " h " & 0 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") - 500

'屋根の厚み
Print #1, "dimaligned " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " @" & -500 & "," & 0

・・・
コレは…

ラクをするために 絶対座標と相対座標を使い分けていたのですが、全体的に理解しづらいコードになってしまいました
かなり反省です。

長くなろうとも 、すべて絶対座標で書いた方が わかりやすくはなっていたのかもしれません。
どうすればよかったのか 答を出すのが難しいです。
お好みで 使い分けてください。

実行結果は こうなりました。
これで 家らしきものが完成です。😊

8-2. 階数を増やす


もう 目的は達成しました。
これからは お遊びです。

繰り返し処理で 階数を増やしてみましょう。

まずは、エクセルの方に 階数と倍率の入力欄を作ります。

セルB11とB12に入力欄を追加しました。

コードは先ほどのものを for文で繰り返すだけです。
「今回のまとめ」で後述します。

できましたー 😊

セルB11の回数を増やして 繰り返し回数を多くすると…

20階建ての大御殿が立ちました~ 😁
苦労はしましたが、十分楽しめました。😊😊


8-3. 今回のまとめ


それでは 今回のまとめです。

今回は、家らしきものをテーマに、オフセットっぽいことを 線分オンリーでやってみました。

直線と直線の交点の座標を求める感じの 地道な作業が続きましたが、何とか形になりました。😁

・単体

Sub macro()

Sakuzu = ThisWorkbook.Path & "\CAD_file.scr"
Open Sakuzu For Output As #1
Print #1, "osnap non"

'********↑前処理↑********

'◆外形
Print #1, "clayer Layer1"       '画層の指定

'屋根(右)
Print #1, "line " & 0 & "," & 0 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "
Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) & " " & Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2"))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " "
Print #1, "line @" & 0 & "," & 0 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "
    
'屋根(左)
Print #1, "line " & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "
Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) & " " & -(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " "
Print #1, "line @" & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "

'壁
Print #1, "line " & Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") & " @" & 0 & "," & -Range("I9") & " "
Print #1, "line " & -Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") & " @" & 0 & "," & -Range("I9") & " "
    
'床
Print #1, "line @" & 0 & "," & 0 & " @" & Range("F14") & "," & 0 & " "

'◆寸法線
Print #1, "clayer Layer2"       '画層の指定

'壁
Print #1, "dimlinear " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") & " h @" & 0 & "," & -500
Print #1, "dimlinear @" & 0 & "," & 500 & " @" & Range("F14") & "," & 0 & " h @" & 0 & "," & -500
    
'床
Print #1, "dimlinear @" & 0 & "," & 500 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " h " & 0 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") - 500

'屋根の厚み
Print #1, "dimaligned " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " @" & -500 & "," & 0


'********↓後処理↓********

Print #1, "zoom e"
Print #1, "filedia 1"
Close #1

End Sub

・繰り返し

Sub macro()
Sakuzu = ThisWorkbook.Path & "\CAD_file.scr"
Open Sakuzu For Output As #1
Print #1, "osnap non"

'********↑前処理↑********

 
For i = 1 To Range("B11")
    S1 = Range("B12") ^ (i - 1)
    
    '◆外形
    Print #1, "clayer Layer1"       '画層の指定
    
    '屋根
    Print #1, "line " & 0 & "," & 0 & " " & (Range("F14") / 2 + Range("D14")) * S1 & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") * S1 & " "
    Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) * S1 & " " & (Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) * S1 & "," & (-(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2")))) * S1 & " "
        
    Print #1, "line @" & 0 & "," & 0 & " " & (Range("F14") / 2 + Range("D14")) * S1 & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") * S1 & " "
    
    Print #1, "line " & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) * S1 & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") * S1 & " "
    Print #1, "line " & 0 & "," & Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) * S1 & " " & (-(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2"))))) * S1 & "," & (-(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2")))) * S1 & " "
        
    Print #1, "line @" & 0 & "," & 0 & " " & -(Range("F14") / 2 + Range("D14")) * S1 & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") * S1 & " "
    
    
    '壁
    Print #1, "line " & Range("F14") / 2 * S1 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") * S1 & " @" & 0 & "," & -Range("I9") * S1 & " "
    Print #1, "line " & -Range("F14") / 2 * S1 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") * S1 & " @" & 0 & "," & -Range("I9") * S1 & " "
    
    If i = 1 Then
    
        '床
        Print #1, "line @" & 0 & "," & 0 & " @" & Range("F14") & "," & 0 & " "
        
        
        '◆寸法線
        Print #1, "clayer Layer2"       '画層の指定
        
        '壁
        Print #1, "dimlinear " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -Range("F14") / 2 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") & " h @" & 0 & "," & -500
        Print #1, "dimlinear @" & 0 & "," & 500 & " @" & Range("F14") & "," & 0 & " h @" & 0 & "," & -500
            
        '床
        Print #1, "dimlinear @" & 0 & "," & 500 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " h " & 0 & "," & -Range("F14") / 2 * Range("C3") / Range("D2") - Range("I9") - 500
    
        '屋根の厚み
        Print #1, "dimaligned " & -(Range("F14") / 2 + Range("D14")) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " " & -(Range("F14") / 2 + Range("D14") + Range("C7") * Range("C3") / Range("D2") * Cos(Atn(Range("C3") / Range("D2")))) & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") + Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) - Range("C7") * Range("C3") / Range("D2") * Sin(Atn(Range("C3") / Range("D2"))) & " @" & -500 & "," & 0
   
    End If
    
    Print #1, "ai_selall " & " "       '全選択
    Print #1, "move d" & " " & 0 & "," & -Range("I9") * Range("B12") ^ i - Range("C7") / Cos(Atn(Range("C3") / Range("D2"))) * Range("B12") ^ (i - 1)      '移動
    
Next


'********↓後処理↓********

Print #1, "zoom e"
Print #1, "filedia 1"
Close #1
End Sub

今回はここまで。👍
次回もお楽しみに。😊

「役に立った!」「助かった!」と感じたらサポートいただけると嬉しいです。😊