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

わんくま同盟

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

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

■103842 / 32階層)  Visual Basicで簡易CADを作成
□投稿者/ shiro (19回)-(2025/08/09(Sat) 05:05:04)
No103841 (魔界の仮面弁士 さん) に返信
> 

魔界の仮面弁士 様

>>それでも、柱・壁が混在すると柱と壁が同時に選択されてしまいます。
> はい。ゆえにそうした点に対処するために、ヒットテスト領域をより厳密にするなど
>  ・柱なら、円柱や角柱の領域をヒットテストエリアにする ( No103835 )
>  ・壁なら、線分をヒットテストエリアにする ( No103828 )
>  ・交点や重複配置点などで複数のアイテムが候補にあった場合の仕組みを検討する ( No103837 )
>  ・クリック以外でも選択できる機能を検討する ( No103805 )
> などといった、さまざまな提案をしてきたつもりです。

線分との距離でヒットすることにさせ柱との重複問題が解消されました。
下記のFunctionのとおりです。

また、左クリック時のみ柱・壁を作図させ、右クリックのみ黄色にし、削除ボタンで削除させました。

この時、柱を1本配置し、右クリックをしても黄色になりません。
2本目の柱を配置すると、最初の1本目の柱が黄色になり1回で削除できます。
壁も同様に、2回目に配置すると1回目が黄色になり削除できます。

つまり1回遅れて黄色になり削除できます。
重複は避けれたのですが、なぜか1回遅れる原因が分かりません。

          記

MouseDown


        If e.Button.HasFlag(MouseButtons.Left) Then


            Select Case element

                Case "col"

                    Dim newPillar As New Pillar(SnapToGrid(e.Location))

                    pillarList.Add(newPillar)

                    PictureBox1.Invalidate() ' 再描画

              Case "wall"

                    startPoint = SnapToGrid(e.Location)

                   isPlacing = True

            End Select

        End If


        If e.Button.HasFlag(MouseButtons.Right) Then

            For Each pillar In pillarList
                pillar.IsSelected = pillar.Contains(e.Location)
            Next

        End If


MouseMove

      If e.Button.HasFlag(MouseButtons.Left) Then

            Select Case element

                Case "wall"
 
                    If isPlacing Then

                        endPoint = SnapToGrid(e.Location)

                        PictureBox1.Invalidate()

                    End If

            End Select

        End If

MouseUp

        If e.Button.HasFlag(MouseButtons.Left) Then

            Select Case element

            Case "wall"

                isPlacing = False

                    Dim newWall As New Wall(startPoint, endPoint) '新しい壁を準備

                    wallList.Add(newWall) 'それを壁一覧に加える

                    PictureBox1.Invalidate()

            End Select

        ElseIf e.Button.HasFlag(MouseButtons.Right) Then

            For Each wall In wallList
                wall.IsSelected = wall.Contains(e.Location)
            Next

        End If

 
Paint

        For Each pillar In pillarList

            If pillar.IsSelected Then

                e.Graphics.FillRectangle(Brushes.Yellow, pillar.X - rectangleSize \ 2, pillar.Y - rectangleSize \ 2, rectangleSize, rectangleSize)

                g.DrawRectangle(Pens.Black, pillar.X - rectangleSize \ 2, pillar.Y - rectangleSize \ 2, rectangleSize, rectangleSize)

            Else
 
                e.Graphics.FillRectangle(Brushes.Red, pillar.X - rectangleSize \ 2, pillar.Y - rectangleSize \ 2, rectangleSize, rectangleSize)

            g.DrawRectangle(Pens.Black, pillar.X - rectangleSize \ 2, pillar.Y - rectangleSize \ 2, rectangleSize, rectangleSize)

            End If

        Next

 
        For Each wall In wallList
            Dim p = If(wall.IsSelected, pen9, pen7) '選択状態に合わせて Pen を切り替える
            e.Graphics.DrawLine(p, wall.startPoint, wall.endPoint)
        Next

削除ボタン

        Dim selectedPillar As Pillar = pillarList.FirstOrDefault(Function(p) p.IsSelected)
        If selectedPillar IsNot Nothing Then
            '選択済みの矩形があれば削除
            pillarList.Remove(selectedPillar)
            PictureBox1.Invalidate() 'PictureBoxを強制的に再描画する
        End If

        Dim selectedWall As Wall = wallList.FirstOrDefault(Function(p) p.IsSelected)
        If selectedWall IsNot Nothing Then
            '選択済みの矩形があれば削除
            wallList.Remove(selectedWall)
            PictureBox1.Invalidate() 'PictureBoxを強制的に再描画する
        End If


Wall Class

Function


       If Math.Abs((Me.endPoint.Y - Me.startPoint.Y) * p.X - (Me.endPoint.X - Me.startPoint.X) * p.Y + Me.endPoint.X * Me.startPoint.Y - Me.endPoint.Y * Me.startPoint.X) / Math.Sqrt((Me.endPoint.X - Me.startPoint.X) ^ 2 + (Me.endPoint.Y - Me.startPoint.Y) ^ 2) < 5 Then

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[31]: Visual Basicで簡易CADを作成 /魔界の仮面弁士 →Re[33]: Visual Basicで簡易CADを作成 /魔界の仮面弁士
 
上記関連ツリー

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
                                          └ 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
                                            │  │            └ Visual Basicで簡易CADを作成 / shiro (25/08/09(Sat) 05:05) #103842 ←Now
                                            │  │              └ 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

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