| ■103806 / ) |
Re[12]: Visual Basicで簡易CADを作成 |
□投稿者/ shiro (8回)-(2025/08/04(Mon) 05:10:00)
|
■No103805 (魔界の仮面弁士 さん) に返信 > ■No103802 (shiro さん) に返信 >>図形の削除はPolygonではないので、紹介して頂いたような方法では出来ないのでしょうか。
魔界の仮面弁士 様
いつもご丁寧な回答有難うございます。 休日、酷暑の中感謝致します。
> つまり、図形を保持しているのは、いずれも「List(Of 型パラメータ) クラス」です。 > > 柱が3本立っていた場合、 > 柱A = snappedRectangles(0) > 柱B = snappedRectangles(1) > 柱C = snappedRectangles(2) > なわけですが、このうち、柱Bを削除したければ、 > snappedRectangles.RemoveAt(1) > を呼び出せばよいことになります。これにより、残った柱は > 柱A = snappedRectangles(0) > 柱C = snappedRectangles(1) > と変化します。 > > 削除するごとにインデックス番号がズレますので、もしも複数の要素をまとめて削除する場合は > For ループは 0 から最終番号に向けて昇順列挙しながら RemoveAt するのではなく、 > For ループを最終番号から 0 にむけて降順列挙しながら RemoveAt するようにします。 > No103794 のコードもそうなっていますよね? > > > 削除部の手順は、上記の通りさほど難しくもありませんし、既に回答済みでもあります。 > 問題となるのは、その柱Bを「どうやってユーザーに選択させるか」という点でしょうか? > > > No103794 では、削除対象のオブジェクトを選択させる手段について > >> ダブルクリックで削除する方式では操作しにくいという場合は、別途、削除ボタンを用意し、 > >> それを押したときに IsSelected = True なものを取り除く方式にしても良いでしょう。 > >> あるいは、右クリックやコンテキストメニューなどで指示する手法を採用することもできますね。 > という素案を述べています。
分かりやすい説明でした。番号がズレるのですね。
> たとえば、柱の一覧を扱うための ListBox を用意しておき、 > snappedRectangles.Add する際には、それと同時に、柱用の ListBox にも .Items.Add しておくのです。 > Add する内容は、それぞれの柱を識別できる情報になっていれば、ひとまずなんでも良いです。 > "柱1"、"柱2" といった連番情報でも良いですし、 > 柱のグリッド行列番号でも良いですし、 > 柱の Rectangle を .ToString() した座標情報でも良いです。 > > そのうえで、ユーザーは ListBox から削除したい柱を選択してもらいます。 > > snappedRectangles と ListBox のアイテム番号を常に同期させてておくことで、 > ListBox の .SelectedIndex プロパティから「消したい柱のインデックス」が得られますので、 > それを snappedRectangles と ListBox の両方から RemoveAt すればよいのです。 > > これは、複数の柱をまとめて削除したい場合にも使えます。 > Do Until ListBox1.SelectedIndex = -1 > snappedRectangles.RemoveAt(ListBox1.SelectedIndex) > ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) > Loop > > > あるいは ListBox に頼らず、描画済みの壁や柱を直接クリックして選択させたり、 > 周囲の背景をドラッグして囲むことで範囲内の図形を選択状態にするといった > ユーザーインターフェイスにしてもよいでしょう。 > > その場合、選択中のアイテムは色を変えて表現するなどの必要があるでしょうから、 > Paint イベントで色を変えて描画するために、各アイテムが「選択中かどうか」を > 管理するための変数が必要になってきます。これについては、現状の > Private snappedRectangles As New List(Of Rectangle)() > Private pointList As New List(Of Point)() > だけでは、それぞれのアイテムの「位置とサイズ」しか分からず、「選択状態かどうか」を管理できません。 > > 上記の ListBox のように、「選択されているアイテムの番号」を別管理する方法でも良いですが、 > お奨めされるのは、先に何度も提案している通り、「柱クラス」や「壁クラス」を自作して、 > それぞれのクラスに、座標情報だけでなく VB中学校の例のような「IsSelected プロパティ」を設けることです。
ここら辺の連動した処理が難しそうだと感じました。 座標情報も保存するとなると、やはりクラスを使用しないと難しいのでしょうね。 今まで、subだけで処理していましたが、少し勉強してみます。
> ファイルの読み書きの方法が分からない、ということでしょうか。 > その場合、まずは読み書きの方法を習得することから始めましょう。 > それを CAD に組み込むのはその後の話になりますね。 > > ファイルの読み書きの基礎となるのは、System.IO 名前空間のクラス群です。 > たとえば、ファイル全体を一括読み取りするなら、System.IO.File.ReadAllLines など。 > > データ量が多い場合は、全体をまとめて読み取るとメモリ消費量が増えてしまうため、 > 一行ずつ読み取って順次変換していく方法が採用されることもあります。 > > ファイル操作については、ひとまず、この辺りを参考にしてみださい。 > http://rucio.o.oo7.jp/main/dotnet/shokyu/standard30.htm > https://dobon.net/vb/dotnet/file/index.html
今までsubだけでデータの入出力はcsvやテキストで実施していました。 やはり保存や読み込みは同様に実施し、グリッド上に座標をスナップさせ、 柱は四角形で、壁はPointで線を繋ぐ逆の処理をし、再度、図形を描かせるということでしょうか。
図形の削除、ファイルへの入出力等、少し時間をかけて実施してみます。
|
|