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

わんくま同盟

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

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

■103821 / 20階層)  Visual Basicで簡易CADを作成
□投稿者/ 魔界の仮面弁士 (3886回)-(2025/08/05(Tue) 20:39:45)
No103819 (shiro さん) に返信
> Pillarは地下の杭などに使われます。
> 上部構造の柱はcolumnが使われます。

勉強になります! ( ..)φ


> Type	Index	X          	Y          	Stiff		
> C   	    1	40         	40         	     		
> C   	    2	40         	80         	     		
> C   	    3	80         	80         	     		
> C   	    4	80         	40         	     		
> W   	    1	{X=0,Y=0}  	{X=0,Y=0}  	2.5  
> W   	    2	{X=0,Y=0}  	{X=0,Y=0}  	2.5  
> W   	    3	{X=0,Y=0}  	{X=0,Y=0}  	2.5  
> W   	    4	{X=0,Y=0}  	{X=0,Y=0}  	2.5  
> W   	    5	{X=40,Y=40}	{X=40,Y=80}	2.5  
> W   	    6	{X=40,Y=80}	{X=80,Y=80}	2.5  
> W   	    7	{X=80,Y=80}	{X=80,Y=40}	2.5  
> W   	    8	{X=80,Y=40}	{X=40,Y=40}	2.5  

Point 構造体のまま出力すると、「{x,y}」形式のカンマ付き文字列が生成されるので、
タブ区切りテキストならまだしも、CSV(カンマ区切りテキスト)とは相性が悪いかと思います。

このフォーマットにするなら、ヘッダー行は
 writer.WriteLine("Type,Index,X,Y,Stiff")
ではなく、
 writer.WriteLine("Type,Index,X1,Y1,X2,Y2,Stiff")
に変更することを提案します。


データ部については
  For Each pillar In pillarList
    writer.WriteLine($"C,{pillar.Index},{pillar.X},{pillar.Y}")
  Next
  For Each wall In wallList
    writer.WriteLine($"W,{wall.Index},{wall.StartPoint},{wall.EndPoint},{wall.Stiffness}")
  Next
ではなく、
  For Each pillar In pillarList
    writer.WriteLine($"C,{pillar.Index},{pillar.X},{pillar.Y},,,")
  Next
  For Each wall In wallList
    writer.WriteLine($"W,{wall.Index},{wall.StartPoint.X},{wall.StartPoint.Y},{wall.EndPoint.X},{wall.EndPoint.Y},{wall.Stiffness}")
  Next
のように空値の列を追加することで、すべての行で列数を同一に揃えます。


Type=W の方は列数が多いので、まとめて一行で示す代わりに
  For Each wall In wallList
    writer.Write($"W,{wall.Index}")
    writer.Write($",{wall.StartPoint.X},{wall.StartPoint.X}")
    writer.Write($",{wall.EndPoint.X},{wall.EndPoint.X}")
    writer.Write($",{wall.Stiffness}")
    writer.WriteLine()
  Next
のように分けて記述すると言う手もあるかと。



> ' ファイルパスを指定
> Dim filePath As String = "export.csv"
> Using writer As New StreamWriter(filePath)
カレントディレクトリによって、出力先がぶれることになるので、
実際の運用では、フルパスが渡されるようにした方が良いかも。


> 気になるのがWの1〜4が出力されていることでした。
> 関係ない出力だと思うのですが。
恐らく、wallList の中身が 4 件ではなく、8 件あったというだけのことだと思います。

その処理において、wallList.Add(newWall) は何回呼び出されていますか?

たとえば、MouseUp は「壁」モードだけでなく「柱」モードでも発生しますが、
壁モードでは無い時にまで、wallList に Add していないか確認してみてください。

また、ExportToCSV の処理にブレークポイントを貼って一時停止させ、
出力時点での wallList 変数の中身をデバッガで確認してみましょう。
(ローカルウィンドウ、ウォッチ、イミディエイトなど)



<蛇足情報>
Double 値を文字列として出力する場合、書式指定子を付けておかないと
 ・OS の地域設定によって、小数点記号などが異なる
という問題があります。

たとえば欧州圏では、小数に「.」ではなく「,」を使う国が多いため(fr-FR など)、
CSV との相性が悪く、そのままだとトラブルの元になりかねません。

OS 設定によって、ファイル処理が変化してしまうことを避けるため、
地域依存の無い書式指定として
  'writer.Write($",{wall.Stiffness}") '標準書式(地域設定に依存)
  writer.Write($",{wall.Stiffness:R}") 'ラウンドトリップ書式
を使うか、あるいはアプリの既定のカルチャを、明示的に InvariantCulture に
設定すると言ったことが行われます。

ただし R 書式は、.NET Core 3.0 以下や .NET Framework で用いた場合、
正確な復元に失敗する可能性があることが知られています。(変換効率も比較的低め)

そのため、値の厳密性を求めるアプリケーションにおいては、
「Double 型では、代わりに G17 書式指定子を使う」
「Single 型では、代わりに G9 書式指定子を使う」
ことが、より望ましいとされています。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings#RFormatString

ただし、小数点記号や負数記号などといった、カルチャ依存性は残ってしまうため、入出力時のカルチャを固定化する
(InvariantCulture、あるいはアプリで定めた特定のカルチャ(ja-JP など)にする)ことが必要となります。

値によっては指数表記で出力されるという問題もありますが、
このあたりの仕様をどうすべきかは、案件次第といったところ。
</蛇足情報>

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[19]: Visual Basicで簡易CADを作成 /shiro →Re[21]: 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
                                      └ Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/05(Tue) 20:39) #103821 ←Now
                                        └ 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

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