![見出し画像](https://assets.st-note.com/production/uploads/images/155115450/rectangle_large_type_2_a5daffc4ab587819eb94996f17f6a1e8.png?width=1200)
【ごまかんぱちの挑戦】エクセルでAutoCADの自動作図(その8)
こんにちは。ごまかんぱちです。🐟
AutoCADの自動作図を目指して奮闘しています。
第8回の今回は 、家らしきものを描いてみます。
8-1. 家を建てよう
まずは、エクセルで こんな感じのシートをつくります。
![](https://assets.st-note.com/img/1726581703-JgY78iLov4xF31pBQaMbk9Hn.png?width=1200)
黄色のセルには 好きな数値を入力します。
セル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") & " "
実行結果はこう。
![](https://assets.st-note.com/img/1726585597-yD5nBtPz8O7EAcp30UsjXvx6.png?width=1200)
これで 屋根の下側の線が描けました。
続いて 上側です。
さあ どうやって描きますか?
普通に作図する場合は、今 描いた線を選択して 200オフセットして…
という感じでしょうか。
しかし この自動作図の方法では、選択するという行為が非常に苦手なのです。
できたりできなかったりで、挙動がよくわかりません。
一応 オフセットのコードを紹介しますが、今回は 線分で描きます。
オフセットのコードと解説です。
Print #1, "offset " & Range("C7") & " " & 0 & "," & 0 & " " & 0 & "," & 100 & " " 'オフセット
![](https://assets.st-note.com/img/1726590546-DN0B8OhvydGStUeLIzoZnYwj.png?width=1200)
興味があれば 試してみてください。
では オフセットのことは忘れて、線分で屋根の上側を描いていきましょう。
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"))) & " "
ぐっ・・・ な 長い…😥
![](https://assets.st-note.com/img/1726656003-mQjAFBpvuo4MUJdfgrOyt0xN.png?width=1200)
一応 できました。😑
コレ 労力に見合ってるのか?
オフセットが いかに偉大かを痛感させられました。
続いて屋根の厚みの線を描きます。
もう 長いコードは書きたくないなぁ…😥
相対座標を使って ラクしちゃいましょう。
あの 長い長い座標が (@0,0)で完結します。😊
Print #1, "line @" & 0 & "," & 0 & " " & Range("F14") / 2 + Range("D14") & "," & -(Range("F14") / 2 + Range("D14")) * Range("C3") / Range("D2") & " "
![](https://assets.st-note.com/img/1726657830-STUkQg9rK254ilAfyDGBbdjR.png?width=1200)
できました。😊
続いて 左側です。
先ほどと同じ理由(選択するのが苦手)で、鏡像なんか使いません。
線分コマンドのみで 地道に書いていきます。
'屋根(左)
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座標をマイナスにするだけです。
![](https://assets.st-note.com/img/1726662380-38aV46WFRnHpETC5uJYtbj2c.png?width=1200)
できました。😊
あとは、壁やら床やらを描きます。
'壁
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 & " "
![](https://assets.st-note.com/img/1726670203-os2njBzcT4r7IOy0eAhM6EiC.png?width=1200)
ハイ できました。😊
続いて 寸法を入れます。
'◆寸法線
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
・・・
コレは…
ラクをするために 絶対座標と相対座標を使い分けていたのですが、全体的に理解しづらいコードになってしまいました
かなり反省です。
長くなろうとも 、すべて絶対座標で書いた方が わかりやすくはなっていたのかもしれません。
どうすればよかったのか 答を出すのが難しいです。
お好みで 使い分けてください。
![](https://assets.st-note.com/img/1726747397-rY59SFzZBcanlItbDLqympHj.png?width=1200)
実行結果は こうなりました。
これで 家らしきものが完成です。😊
8-2. 階数を増やす
もう 目的は達成しました。
これからは お遊びです。
繰り返し処理で 階数を増やしてみましょう。
まずは、エクセルの方に 階数と倍率の入力欄を作ります。
![](https://assets.st-note.com/img/1726835370-DWNEH4PFJnqKkzeoxp3RZ258.png?width=1200)
コードは先ほどのものを for文で繰り返すだけです。
「今回のまとめ」で後述します。
![](https://assets.st-note.com/img/1726869379-Z6qEfx4WTFU9MoeDSJbOCpRX.png)
できましたー 😊
セルB11の回数を増やして 繰り返し回数を多くすると…
![](https://assets.st-note.com/img/1726869822-QbHcOuPjlCsTd80ow57Y1R9g.png)
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
今回はここまで。👍
次回もお楽しみに。😊
いいなと思ったら応援しよう!
![ごまかんぱち](https://assets.st-note.com/production/uploads/images/150488286/profile_3399e231a3adf3e9e3b0e67f714b882c.png?width=600&crop=1:1,smart)