【ごまかんぱちの挑戦】エクセルで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. 階数を増やす
もう 目的は達成しました。
これからは お遊びです。
繰り返し処理で 階数を増やしてみましょう。
まずは、エクセルの方に 階数と倍率の入力欄を作ります。
コードは先ほどのものを 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
今回はここまで。👍
次回もお楽しみに。😊
「役に立った!」「助かった!」と感じたらサポートいただけると嬉しいです。😊