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

わんくま同盟

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

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

■103825 / 22階層)  Visual Basicで簡易CADを作成
□投稿者/ 魔界の仮面弁士 (3888回)-(2025/08/06(Wed) 14:42:11)
No103822 (shiro さん) に返信
>  タ゛フ゛ルクリック、或いは削除ボタンで実施出来れば良いと考えています。

掲示板投稿時の注意事項に、
>> 半角カナは使用しないでください。文字化けの原因になります。
とありますし、利用上の注意点としても明示されております。
http://bbs.wankuma.com/index.cgi?mode=man

掲示板(cgi)側の都合によるものではありますが、次回以降ご留意ください。


> 1.間違って配置した柱・壁を削除する
既にいくつかの案を提示していたかと思いますが、まずは Visual Basic 中学校にあったように、
それぞれに IsSelected プロパティを追加してみてはいかがでしょうか?

そうすれば、Paint 時の「For Each wall In wallList」ループの中で、
 If wall.IsSelected Then
で判定して、選択されているものとそうでない物とを、別の色で描画させることもできますね。

ついでに、削除処理によって「柱と接していない壁」が生じた場合に、
柱と接している壁と接していない壁を配置エラー扱いとし、別色で塗り分けるといったこともできそう。


>  イメージとしては、削除したい柱や壁を選択すると色が変わり、右クリックや
>  タ゛フ゛ルクリック、或いは削除ボタンで実施出来れば良いと考えています。
既存の element モードについて、"wall" / "col" に加えて
"sel" あるいは "del" を加えれば処理できませんか?

アイテムを配置するモードと、アイテムを選択するモードは分けた方が良いと思うのですよ。
Form1 に Button や Label を配置するモードと、それらを削除するモードでは
ツールボックスで選択するアイコンがそれぞれ異なりますよね。それと同じで。


自分が作るなら、設置済みのアイテム(柱や壁)にマウスをホバーさせた場合、
アイテムの塗色はそのままで枠線色が変わるようにし、
選択すると、アイテムの塗色が変わるようにするかな…。

でもって、キーボードから [Delete] キーを押すと抹消されるイメージ。

ホバー判定は MouseMove 、選択は MouseDown で。

Ctrl キーを押しながら MouseDown だと複数のアイテムを選択できるとか、
Esc キーを押すと選択状態が解除されるといった作り込みもできそう。


> 2.簡易CADで出力したcsvファイルから柱・壁情報を読み取って再壁画
>
>  変更等で柱・壁が増減したり面積の増減対応のためには、最初から配置するのではなく、
>  当初の図面に修正をした方が現実的です。また保存や管理上も有益なためです。

これらは、柱と壁の List(wallList 等のこと)をいったん Clear してから、
そこに、CSV から読み取った情報を Add していくだけで済みますね。
リストの更新が終わったら、Invalid すればできあがり。


CSV データは手動で編集される可能性があるので、読み取りに関しては、
データ異常に関する制御(ファイル形式が違いますエラーとか)も必要ですね。

・列数チェックは行った方が良い(別の CSV が指定されるなど、列数が異なっていた場合に対処するため)
・壁のStiffが未指定だった場合、エラーとするのか既定値として扱うのか
・Type 列が C,W 以外の未知の値だった場合、単に読み飛ばすのか、データエラーとして扱うのか
・Index の重複時にどうするか(そもそも、Index を CSV で保持する必要はあるのか)
・同じ座標に柱が複数配置されていた場合に、無視するか警告にとどめるかエラーとするか
・目標エリア外の座標が指定された場合はどうするか
・柱無しの単独壁を許可するか許容警告とするとか不許可エラーとするか


なお、文字列から数値への変換には、CInt や CDbl ではなく、
Integer.TryParse や Double.TryParse を使うのが良いでしょう。

また、現在は Index を自動採番としていますが、CSV 読み込み時は自動採番せずに CSV の Index を採用したい場合は
Index を明示指定できるよう、Sub New の引数に Index も指定できるオーバーロードを追加するべきでしょう。
その場合、CSV 読み込み後に追加されるアイテムの Index 値も調整可能な設計にしないといけませんね。



> 3.2階建てに対応させる
>
>  今回、初めてGUI操作に取り組んだため、1階だけの図面となっています。
>  そのため、PictureBox1だけの1画面となっています。
>
>  現実には2階建てが多く、フロア別(1階/2階など)に PictureBox もしくは TabControl を使って
>  柱や壁配置を切り替え表示したいです。

こちらですが、描画内容は List(Of ) コレクションで管理されているので、
PictureBox は一つだけで充分では無いでしょうか。
1階と2階を同時に表示する必要はなく、切り替えられれば良いのですよね?

たとえば、階層選択用の ComboBox を DropDownList スタイルで一つ用意しておき、
そこに階数を入れておきます。ComboBox の選択が変更された時に Invalidate を呼べば、
自動的にその階が描画されます。

このため、たとえば wallList を一次元配列あるいは Dictionary で管理してみます。
 Private wallList As New Dictionary(Of String, List(Of Wall))() '複数フロア版

フロアを追加する場合は、
 wallList("3F") = New List(Of Wall)()
のように書きます。フロアに壁を追加する処理は
 wallList("3F").Add( newWall )
という構文に変わります。

管理イメージとしては
 wallList("1F")(0) ならば 1 階 の壁A
 wallList("1F")(1) ならば 1 階 の壁B
 wallList("1F")(2) ならば 1 階 の壁C
 wallList("2F")(0) ならば 2 階 の壁A
 wallList("B1F")(0) ならば 地下1階 の壁A
といった具合です。
階数情報は、先ほどの ComboBox から得られます。

このように、Dictionary コレクションを使って管理することで
>  2階建てを想定した場合、2階用に「pillarList2F、wallList2F」などとして別に設け、
といった、個別の変数やクラスを作り直すことなく、任意数のフロアを制作できるでしょう。


>  Pillar、Wallクラスにも階ごとにも設定可能な「階数、階高」を追加した方が良いのかなど。
管理方法によっては

Public Class Floor
 Public Property Name As String
 Public ReadOnly Property Walls As List(Of Wall)
 Public ReadOnly Property Columns As List(Of Column)
 Public Sub New(name As String)
  Me.Name = name
  Me.Walls = New List(Of Wall)()
  Me.Columns = New List(Of Column)()
 End Sub
End Class

のようなクラスを作ってみるという手もあります。

この場合、Form1 の wallList 変数は廃止して
 Private floors As New List(Of Floor)()
あるいは
 Private floors As New Dictionary(Of String, Floor)()
などで管理するということです。


今までは、Form1 が直接、柱や壁を管理していましたが、
このパターンでは、Form1 が管理するのは Floor だけです。
そしてそれぞれの Floor が、その階にある壁や柱を管理するイメージ。

このような構造にしておくと、たとえば、
 柱や壁だけでなく、階段(Stairs)も管理できるようにする
 Floor ごとに、その階の床から天井までの高さを管理するプロパティを持たせる
 階によって基準剛性値を変更したいような場合、Floor ごとに DefaultStiffValue を持たせる
など、階固有の管理情報を加えたい場合にも拡張しやすくなります。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[21]: Visual Basicで簡易CADを作成 /shiro →Re[23]: Visual Basicで簡易CADを作成 /魔界の仮面弁士
→Re[23]: 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
                └ Re[9]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/01(Fri) 10:46) #103800
                  ├ 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
                                          └ Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 14:42) #103825 ←Now
                                            ├ 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

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