【ごまかんぱちの挑戦】エクセルでAutoCADの自動作図(その13)
こんにちは。ごまかんぱちです。🐟
AutoCADの自動作図を目指して奮闘しています。
今回は、for文の復習をメインに いくつか図形を描きます。
あまり難しいことはせずに、解説多めで 緩くやっていきましょう。😁
今回描く図形は 次の3つ。
① 長方形
② 階段
③ 星☆
それでは始まりです。👏👏
13-1. いろいろな繰り返し図形
① 長方形
まず エクセルシートを作ります。
横 100(セルD2)、縦 50(セルD3)の長方形を描きます。
コードはこんな感じ。
Print #1, "clayer Layer1" '画層の指定
Print #1, "rectang " & -Range("D2") / 2 & "," & -Range("D3") / 2 & " " & Range("D2") / 2 & "," & Range("D3") / 2
解説です。
座標1(0 , 0)
座標2(セルD2 , セルD3)
とすると わかりやすくていいのですが、
長方形の中心を原点に持ってきたいので、
座標1( -セルD2÷2 , -セルD3÷2)
座標2(セルD2÷2 , セルD3÷2)
としています。
結果はこうなります。
想定通り、横の長さ100、縦の長さ50の 長方形ができました。😊
このコードを少しいじって 繰り返し仕様に改造します。
Print #1, "clayer Layer1" '画層の指定
For i = 0 To Range("D5") - 1
Print #1, "rectang " & -Range("D2") / 2 * Range("D6") ^ i & "," & -Range("D3") / 2 * Range("D6") ^ i & " " & Range("D2") / 2 * Range("D6") ^ i & "," & Range("D3") / 2 * Range("D6") ^ i
Next
解説です。
[1行目]
for文の始まりです。
0から繰り返し回数-1まで(要は繰り返し回数だけ)2行目の文を繰り返す という書き出しです。
[2行目]
「-Range("D2") / 2」は1点目のX座標。for文を使う前、単体の長方形を描いたときにも出てきました。
「Range("D6")」は倍率。
繰り返すごとに セルD6の値(この場合は1.2)倍していこうという数字です。
つまり、「-Range("D2") / 2 * Range("D6") ^ i」は、
i=0のとき 「X座標×1.2⁰」⇒「X座標×1」
i=1のとき 「X座標×1.2¹」⇒「X座標×1.2」
i=2のとき 「X座標×1.2²」⇒「X座標×1.2²」
と3回繰り返す ということを意味しています。
繰り返すごとに1.2倍になっていますね。
[3行目]
for文の締めには「Next」と書きましょう。
実行結果は こうなりました。
思い通りに 描けています。😊
繰り返し回数を20回にしてみたり。
これで 長方形は完成です。😊
② 階段
続いて 階段です。
エクセルはこうなります。
Print #1, "clayer Layer1" '画層の指定
'地面
Print #1, "line " & -Range("F3") & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & 0 & " "
'壁
Print #1, "line " & Range("F3") * Range("C3") & "," & 0 & " " & Range("F3") * Range("C3") & "," & Range("C9") * Range("C3") & " "
'段
For i = 1 To Range("C3")
Print #1, "line " & Range("F3") * (i - 1) & "," & Range("C9") * i & " " & Range("F3") * i & "," & Range("C9") * i & " " '横
Print #1, "line " & Range("F3") * (i - 1) & "," & Range("C9") * (i - 1) & " " & Range("F3") * (i - 1) & "," & Range("C9") * i & " " '縦
Next
できました。😊
いきなり for文を使って書きました。
難しければ for文を使わずに、3段くらいの階段を描いてみて 挙動を確認すると わかりやすくなります。
細部を整えていきましょう。
まずは 寸法線。
'寸法線
Print #1, "clayer Layer2" '画層の指定
Print #1, "dimlinear " & 0 & "," & -50 & " " & Range("F3") * Range("C3") & "," & -50 & " h " & 0 & "," & -100
Print #1, "dimlinear " & Range("F3") * (Range("C3") + 1) & "," & 0 & " " & Range("F3") * Range("C3") & "," & Range("C9") * Range("C3") & " v " & Range("F3") * (Range("C3") + 1) + 50 & "," & 0
続いて ハッチング。
'ハッチング
Print #1, "-hatch p ansi31 10 0 w n " & -Range("F3") & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & -50 & " " & -Range("F3") & "," & -50 & " c "
できました。😊
段数を増やしたりして 挙動を確認しましょう。
階段も完成しました。😊
③ 星☆
最後に星です。
まずはエクセル。
こんな感じ。
まずは 円を2つ描きます。
この円は補助線の意味合いが強いので 後で消しますが、一旦描いてみましょう。
Print #1, "clayer Layer2" '画層の指定
Print #1, "circle " & 0 & "," & 0 & " " & Range("J3") '外形
Print #1, "circle " & 0 & "," & 0 & " " & Range("J4") '内径
円が2つできました。😊
続いて 星のかけらを描きます。
Angle0 = 90 * 4 * Atn(1) / 180
Angle1 = 360 / Range("J5") * 4 * Atn(1) / 180
Print #1, "clayer Layer1" '画層の指定
Print #1, "line " & Range("J3") * Cos(0) & "," & Range("J3") * Sin(0) & " " & Range("J4") * Cos(Angle1 / 2) & "," & Range("J4") * Sin(Angle1 / 2) & " "
Print #1, "line " & Range("J4") * Cos(Angle1 / 2) & "," & Range("J4") * Sin(Angle1 / 2) & " " & Range("J3") * Cos(Angle1) & "," & Range("J3") * Sin(Angle1) & " "
まずは 角度の解説
続いて 線分の解説
そして 実行結果はこちら。
うまくいきました。😊
これを 頂点の数(今回は5回)繰り返します。
For i = 1 To Range("J5")
Print #1, "line " & Range("J3") * Cos(Angle1 * (i - 1)) & "," & Range("J3") * Sin(Angle1 * (i - 1)) & " " & Range("J4") * Cos(Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle1 * (i - 1 / 2)) & " "
Print #1, "line " & Range("J4") * Cos(Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle1 * (i - 1 / 2)) & " " & Range("J3") * Cos(Angle1 * i) & "," & Range("J3") * Sin(Angle1 * i) & " "
Next
先ほど書いた 線分の2行を for文の中に組み込みました。
i=1のとき、i=2のとき、… と挙動を確認しておきましょう。
そして 実行結果はこちら。
いいですね。😊
各頂点が 外円と内円を通っていることが確認できましたので、このあたりで2つの円は消してしまいましょう。
行の頭に「'」を付けて コメントアウトします。
'Print #1, "circle " & 0 & "," & 0 & " " & Range("J3") '外形
'Print #1, "circle " & 0 & "," & 0 & " " & Range("J4") '内径
これで この2行は実行されません。
一応 これで完成したのですが、星がちょっと傾いているのが気になりますね。
下図をご覧ください。
現在 0°を基準に 絵を描いているので、星が傾いているように見えるのです。
これを 90°回転させてみましょう。
90°ということで、先ほど少し出てきた Angle0を使います。
For i = 1 To Range("J5")
Print #1, "line " & Range("J3") * Cos(Angle0 + Angle1 * (i - 1)) & "," & Range("J3") * Sin(Angle0 + Angle1 * (i - 1)) & " " & Range("J4") * Cos(Angle0 + Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle0 + Angle1 * (i - 1 / 2)) & " "
Print #1, "line " & Range("J4") * Cos(Angle0 + Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle0 + Angle1 * (i - 1 / 2)) & " " & Range("J3") * Cos(Angle0 + Angle1 * i) & "," & Range("J3") * Sin(Angle0 + Angle1 * i) & " "
Next
角度の部分すべてに「Angle0+」を付け加えるだけです。
簡単でしたね。😁
そして こうなりました。
はい、できました。
理想の星ができました。😊😊😊
あとは セルJ3~J5の数字を変えて 遊びましょう。
これで 星も完成です。😊
13-2. 今回のまとめ
それでは 今回のまとめです。
for文を使った繰り返しの復習を目的に、長方形、階段、星 とシンプルな図形を ひたすら繰り返してみました。
解説を多めにしたつもりでしたが いかがでしたか?
以下 今回のコードです。
【長方形】
Sub macro12()
Sakuzu = ThisWorkbook.Path & "\CAD_file.scr"
Open Sakuzu For Output As #1
Print #1, "osnap non"
'********↑前処理↑********
Print #1, "clayer Layer1" '画層の指定
For i = 0 To Range("D5") - 1
Print #1, "rectang " & -Range("D2") / 2 * Range("D6") ^ i & "," & -Range("D3") / 2 * Range("D6") ^ i & " " & Range("D2") / 2 * Range("D6") ^ i & "," & Range("D3") / 2 * Range("D6") ^ i
Next
'********↓後処理↓********
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"
'********↑前処理↑********
Print #1, "clayer Layer1" '画層の指定
'地面
Print #1, "line " & -Range("F3") & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & 0 & " "
'壁
Print #1, "line " & Range("F3") * Range("C3") & "," & 0 & " " & Range("F3") * Range("C3") & "," & Range("C9") * Range("C3") & " "
For i = 1 To Range("C3")
Print #1, "line " & Range("F3") * (i - 1) & "," & Range("C9") * i & " " & Range("F3") * i & "," & Range("C9") * i & " " '横
Print #1, "line " & Range("F3") * (i - 1) & "," & Range("C9") * (i - 1) & " " & Range("F3") * (i - 1) & "," & Range("C9") * i & " " '縦
Next
'寸法線
Print #1, "clayer Layer2" '画層の指定
Print #1, "dimlinear " & 0 & "," & -50 & " " & Range("F3") * Range("C3") & "," & -50 & " h " & 0 & "," & -100
Print #1, "dimlinear " & Range("F3") * (Range("C3") + 1) & "," & 0 & " " & Range("F3") * Range("C3") & "," & Range("C9") * Range("C3") & " v " & Range("F3") * (Range("C3") + 1) + 50 & "," & 0
'ハッチング
Print #1, "-hatch p ansi31 10 0 w n " & -Range("F3") & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & 0 & " " & Range("F3") * (Range("C3") + 1) & "," & -50 & " " & -Range("F3") & "," & -50 & " c "
'********↓後処理↓********
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"
'********↑前処理↑********
'Print #1, "clayer Layer2" '画層の指定
'Print #1, "circle " & 0 & "," & 0 & " " & Range("J3") '外形
'Print #1, "circle " & 0 & "," & 0 & " " & Range("J4") '内径
Angle0 = 90 * 4 * Atn(1) / 180
Angle1 = 360 / Range("J5") * 4 * Atn(1) / 180
Print #1, "clayer Layer1" '画層の指定
For i = 1 To Range("J5")
Print #1, "line " & Range("J3") * Cos(Angle0 + Angle1 * (i - 1)) & "," & Range("J3") * Sin(Angle0 + Angle1 * (i - 1)) & " " & Range("J4") * Cos(Angle0 + Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle0 + Angle1 * (i - 1 / 2)) & " "
Print #1, "line " & Range("J4") * Cos(Angle0 + Angle1 * (i - 1 / 2)) & "," & Range("J4") * Sin(Angle0 + Angle1 * (i - 1 / 2)) & " " & Range("J3") * Cos(Angle0 + Angle1 * i) & "," & Range("J3") * Sin(Angle0 + Angle1 * i) & " "
Next
'********↓後処理↓********
Print #1, "zoom e"
Print #1, "filedia 1"
Close #1
End Sub
今回はここまで。👍
次回もお楽しみに。😊