見出し画像

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

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

AutoCADの自動作図を目指して奮闘しています。
今回は、for文の復習をメインに いくつか図形を描きます。
あまり難しいことはせずに、解説多めで 緩くやっていきましょう。😁

今回描く図形は 次の3つ。
 ① 長方形
 ② 階段
 ③ 星☆

それでは始まりです。👏👏


13-1. いろいろな繰り返し図形

① 長方形

まず エクセルシートを作ります。

セルD2、D3が長方形のサイズです。


横 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  "

できました。😊

段数を増やしたりして 挙動を確認しましょう。

階段も完成しました。😊


③ 星☆

最後に星です。

まずはエクセル。
こんな感じ。

左側の図形を描くのが面倒でしたら、J列の数字だけでも大丈夫です。


まずは 円を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) & " "

まずは 角度の解説

Angle0は 後で使います。今は 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行は実行されません。

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


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

いいなと思ったら応援しよう!

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