C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103800 / 9階層)  Visual Basicで簡易CADを作成
□投稿者/ 魔界の仮面弁士 (3876回)-(2025/08/01(Fri) 10:46:05)
2025/08/01(Fri) 14:32:02 編集(投稿者)

No103797 (shiro さん) に返信
> Dim pen7 As New Pen(Color.Blue, 5)
うーん。頑なに Dispose をサボってくれますねぇ…。
もう指摘するのは諦めました。


> 下記のとおりListで試したところ、Invalidate メソッドで壁も柱も

必要な手順を整理してみましょう。


A:PictureBox1 の MouseDown/MouseMove/MouseUp イベント群の仕事は主に 3 つ
 A1:配置しようとしている図形の位置情報(ドラッグ時などに描きたいラバーバンドの座標など)を更新すること
 A2:MouseUp などで配置が完了した際に、その図形(壁や柱)の情報を List(Of ) に追加していくこと
 A3:これらの位置情報を更新した場合、PictureBox1.Invalidate() を呼びだすこと

B:PictureBox1 の Paint イベントの仕事は主に 3 つ
 B1:方眼グリッドを描画すること
 B2:List(Of ) に保持させておいた図形群を、すべて描画していくこと
 B3:配置中図形(ドラッグ移動などによるラバーバンドなど)の状況を描画すること


A2・B2 で読み書きしている List コレクションに保持されている図形群とは、
「今までに配置してきた、『すべての』壁と柱の情報」のことを指します。
これは VB 中学校のサンプルで言うところの「Private polygons As New List(Of Polygon)」に当たります。

A1・B3 で読み書きしている配置中図形の情報とは、
「現在配置しようとしている、『いずれか 1 つ』のオブジェクト情報(壁 or 柱)」を指します。
VB 中学校のサンプルで言う「mouseDownPosition」「mouseDragPosition」などのことです。


ここまではよろしいですか?

※B1 は Paint イベントで毎回再描画する代わりに、方眼画像を描いた Bitmap を
 あらかじめ PictureBox1.BackgroundImage あるいは PictureBox1.Image に割り当てておく方が楽だと思います。


> 次の壁を書くと、直前に書いた壁が消えます。
「今の壁を描く時、それまで描いた壁を描いていないから」です。


まず、shiro さんが用意された pointList というのは、
「今までに配置してきた『すべての』壁の情報」ではなく
「現在配置しようとしている、『いずれか 1つ』の壁情報」に過ぎません。


VB中学校の「Private polygons As New List(Of Polygon)」は、配置済みのすべての矩形情報を保持していますが
shiro さんの「Private pointList As New List(Of Point)」が保持するのは、現在配置しようとしている element = "wall" の情報だけなのです。


もしも pointList を「配置済みのすべての壁情報」に変更したいのであれば、現在の MouseUp イベント内の
 pointList.Clear()
という行をコメントアウトしてください。そうすれば、過去の壁情報がすべて累積保持されます。

その場合、壁を 3 つ描いたとしたら、
 pointList(0) は、壁1の開始点
 pointList(1) は、壁1の終了点
 pointList(2) は、壁2の開始点
 pointList(3) は、壁2の終了点
 pointList(4) は、壁3の開始点
 pointList(5) は、壁3の終了点
のように管理されることになります。

すなわち、Paint イベントでは
 If isDragging Then
  e.Graphics.DrawLine(Pens.Blue, startPoint, endPoint)
 ElseIf pointList.Count = 2 Then
  e.Graphics.DrawLine(Pen7, pointList(0), pointList(1))
 End If
ではなく、
 For n = 0 To pointList.Count - 1 Step 2
  e.Graphics.DrawLine(Pen7, pointList(n + 0), pointList(n + 1))
 Next
 If isDragging Then
  e.Graphics.DrawLine(Pens.Blue, startPoint, endPoint)
 End If
にすれば良い、ということになります。
これにより、全ての壁が描かれるようになることでしょう。


正しく動作することを確認できたら、コメントアウトしていた pointList.Clear() していた行を復活させてみてください。
「最新の壁だけが描かれ、過去の壁は消えてしまう」状態に戻ってしまうことを体験できると思います。


そして先に述べた通り、pointList As List(Of Point) が保持しているのは
あくまで座標情報の集合にすぎません。

このままでは、蓄えていった座標が「壁」なのか「柱」なのかを区別できません。

壁の位置情報と、柱の位置情報を、それぞれ別々の List(Of Point) 変数で分けて管理することもできますが、
そのように個別の変数で管理していってしまうと、今後の機能拡張――たとえば、
それぞれの「壁の厚さ」や「柱の太さ」や「色」などをも指定・変更できるようにするとか、
新たに壁や柱以外のオブジェクト(扉など)を加えるなど――を実装する際、
管理が煩雑になり過ぎてしまいますし、デバッグも大変になってしまいます。


そのため、参考にしているサイト(Visual Basic 中学校)の例に倣って、
描画対象のオブジェクトごとに、管理用のクラス(Wall や Pillar など)を
用意されることを強くおすすめします。
その方が今後の拡張性が高くなり、メンテナンスも容易になりますよ。


そこからさらに、ポリモーフィズムな設計(基底クラスを Inherits するなど)を採用することで、
さらに管理が容易になるかと思いますが…そこまで組むにはオブジェクト指向設計の知識が
要求されますので、それは今後、経験をつんでからの課題ということで。



No103798 (kiku さん) に返信
> ドラック中は、ドラック中の線のみを描画し、
> ドラックしていないときは、保持した1本のみを描画しています。

drag (引きずる) にしても
drug (薬物) にしても、一般的には
「ドラック」ではなく
「ドラッグ」と表記します。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[8]: Visual Basicで簡易CADを作成 /shiro →Re[10]: Visual Basicで簡易CADを作成 /kiku
→Re[10]: Visual Basicで簡易CADを作成 /shiro
 
上記関連ツリー

Visual Basicで簡易CADを作成 / shiro (25/07/25(Fri) 20:50) #103783
Re[1]: Visual Basicで簡易CADを作成 / KOZ (25/07/27(Sun) 14:35) #103784
  └ Re[2]: Visual Basicで簡易CADを作成 / shiro (25/07/28(Mon) 20:17) #103785
    ├ Re[3]: Visual Basicで簡易CADを作成 / kiku (25/07/29(Tue) 08:49) #103786
    └ Re[3]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/29(Tue) 14:06) #103791
      └ Re[4]: Visual Basicで簡易CADを作成 / shiro (25/07/30(Wed) 12:22) #103792
        └ Re[5]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/30(Wed) 15:46) #103794
          └ Re[6]: Visual Basicで簡易CADを作成 / shiro (25/07/31(Thu) 07:34) #103795
            └ Re[7]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/31(Thu) 10:48) #103796
              └ Re[8]: Visual Basicで簡易CADを作成 / shiro (25/08/01(Fri) 06:15) #103797
                ├ Re[9]: Visual Basicで簡易CADを作成 / kiku (25/08/01(Fri) 08:47) #103798
                │└ Re[10]: Visual Basicで簡易CADを作成 / shiro (25/08/02(Sat) 03:40) #103803
                └ Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/01(Fri) 10:46) #103800 ←Now
                  ├ Re[10]: Visual Basicで簡易CADを作成 / kiku (25/08/01(Fri) 10:50) #103801
                  └ Re[10]: Visual Basicで簡易CADを作成 / shiro (25/08/02(Sat) 03:38) #103802
                    └ Re[11]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/03(Sun) 11:50) #103805
                      └ Re[12]: Visual Basicで簡易CADを作成 / shiro (25/08/04(Mon) 05:10) #103806
                        └ Re[13]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/04(Mon) 11:36) #103808
                          └ Re[14]: Visual Basicで簡易CADを作成 / shiro (25/08/04(Mon) 18:59) #103811
                            └ Re[15]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/04(Mon) 19:43) #103812
                              └ Re[16]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 12:42) #103814
                                └ Re[17]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 12:44) #103815
                                  └ Re[18]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/05(Tue) 18:02) #103817
                                    └ Re[19]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 19:28) #103819
                                      └ Re[20]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/05(Tue) 20:39) #103821
                                        └ Re[21]: Visual Basicで簡易CADを作成 / shiro (25/08/06(Wed) 12:22) #103822
                                          └ Re[22]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 14:42) #103825
                                            ├ Re[23]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 17:53) #103828
                                            │└ Re[24]: Visual Basicで簡易CADを作成 / shiro (25/08/06(Wed) 19:13) #103830
                                            │  ├ Re[25]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 19:44) #103832
                                            │  │└ Re[26]: Visual Basicで簡易CADを作成 / shiro (25/08/07(Thu) 07:06) #103834
                                            │  │  └ Re[27]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/07(Thu) 12:18) #103835
                                            │  │    └ Re[28]: Visual Basicで簡易CADを作成 / shiro (25/08/07(Thu) 19:14) #103836
                                            │  │      └ Re[29]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/07(Thu) 20:25) #103837
                                            │  │        ├ Re[30]: Visual Basicで簡易CADを作成 / shiro (25/08/08(Fri) 03:34) #103838
                                            │  │        └ Re[30]: Visual Basicで簡易CADを作成 / shiro (25/08/08(Fri) 07:29) #103839
                                            │  │          └ Re[31]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/08(Fri) 09:40) #103841
                                            │  │            └ Re[32]: Visual Basicで簡易CADを作成 / shiro (25/08/09(Sat) 05:05) #103842
                                            │  │              └ Re[33]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/09(Sat) 14:24) #103843
                                            │  │                └ Re[34]: Visual Basicで簡易CADを作成 / shiro (25/08/09(Sat) 19:18) #103844
                                            │  └ Re[25]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 19:53) #103833
                                            └ Re[23]: Visual Basicで簡易CADを作成 / shiro (25/08/18(Mon) 12:41) #103847
                                              └ Re[24]: Visual Basicで簡易CADを作成 / kiku (25/08/20(Wed) 15:09) #103848
                                                └ Re[25]: Visual Basicで簡易CADを作成 / shiro (25/08/20(Wed) 18:35) #103849
                                                  └ Re[26]: Visual Basicで簡易CADを作成 / kiku (25/08/21(Thu) 09:03) #103850
                                                    └ Re[27]: Visual Basicで簡易CADを作成 / shiro (25/08/21(Thu) 22:01) #103851
                                                      └ Re[28]: Visual Basicで簡易CADを作成 / kiku (25/08/22(Fri) 08:45) #103852
                                                        └ Re[29]: Visual Basicで簡易CADを作成 / shiro (25/08/22(Fri) 13:20) #103853
                                                          └ Re[30]: Visual Basicで簡易CADを作成 / kiku (25/08/22(Fri) 16:45) #103854
                                                            └ Re[31]: Visual Basicで簡易CADを作成 / shiro (25/08/22(Fri) 20:33) #103855
                                                              └ Re[32]: Visual Basicで簡易CADを作成 / kiku (25/08/25(Mon) 08:42) #103857

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信