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

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

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

Visual Basicで簡易CADを作成 [2]

[トピック内 51 記事 (41 - 51 表示)]  << 0 | 1 | 2 >>

■103844 / inTopicNo.41)  Re[34]: Visual Basicで簡易CADを作成
  
□投稿者/ shiro (20回)-(2025/08/09(Sat) 19:18:17)
No103843 (魔界の仮面弁士 さん) に返信
> 2025/08/09(Sat) 14:34:39 編集(投稿者)
>
> ■No103842 (shiro さん) に返信

魔界の仮面弁士 様

>>この時、柱を1本配置し、右クリックをしても黄色になりません。
>
> IsSelected を変更した後の再描画依頼を投げ忘れているからですね。

Invalidateを実施したところ正しく動きました。
有難うございます。

削除機能も追加され平屋建てとしては簡易CADとして取り合えず動かせますが、
2階建ても対応できるように進めたいと思います。

まずはcomboboxで1,2階を選択できる機能を追加させてみます。

初めてのGUI操作でしたが実際に動かせて勉強になりました。

引用返信 編集キー/
■103847 / inTopicNo.42)  Re[23]: Visual Basicで簡易CADを作成
□投稿者/ shiro (21回)-(2025/08/18(Mon) 12:41:14)
No103825 (魔界の仮面弁士 さん) に返信
> ■No103822 (shiro さん) に返信

魔界の仮面弁士 様


Dictionaryや新しいFloorクラスを設定するなど、混乱しそうでしたので次のように処理してみました。

Form1でコンボボックスで階を切り替えるようにし、1,2階用にListを分けました。
また、下記の計算のため、braceListも追加しました。Wallクラスを使用してみました。
新たにBraceクラスを設けるか悩みました。

    '1階用

    Private pillarList As New List(Of Pillar)
    Private wallList As New List(Of Wall)
    Private braceList As New List(Of Wall)

    '2階用

    Private pillarList2 As New List(Of Pillar)
    Private wallList2 As New List(Of Wall)
    Private braceList2 As New List(Of Wall)

elementにbraceを追加し、MouseUPでWallと違うStiff値2.0を設定しました。

                        Dim newWall As New Wall(startPoint, endPoint, 2.0) '新しい壁を準備
                        braceList.Add(newWall) 'それを壁一覧に加える

                        Dim newWall2 As New Wall(startPoint, endPoint, 2.0) '新しい壁を準備
                        braceList2.Add(newWall2) 'それを壁一覧に加える

出力でWallとBraceのStiffの違いに応じた結果を出力できました。

W	1	40	40	80	40	2.5
W	2	120	40	200	40	2.5
W	3	200	40	240	40	2.5
W	4	240	40	320	40	2.5
B	5	320	120	280	120	2
B	6	40	40	40	80	2
B	7	40	240	40	200	2
B	8	200	240	200	200	2

以上により、初歩的ですが階毎に図面が切り替わり、また1つ目の計算したい内容も正しく計算出来ました。

2つめの計算したい内容について、どのように処理すれば上手く計算できるかご知見を頂ければ有難いです。
実施したい内容は下記のとおりです。

A1,A2の係数で、筋かいの場合は補正した数値としなければならず、そのため、Wallとは別にBraceを設けました。
先の事例では、Stiff=2とした場合(筋交い45*90)です。
対象とする柱の片側だけに筋交いが付く場合、柱頭なら+0.5,柱脚なら-0.5を2に加算します。

処理的には次のような方法が考えられます。

 @各階で壁倍率(Stiff)の差Aの算出:検討する柱の両側に取り付く耐力壁の倍率の差Aを求める。
 A補正値の決定(筋かいの場合)
 B係数B、Lの決定:柱が出隅かどうかを確認し、係数B、Lを決定する。
 C1階の耐力壁を持つ柱の上に、2階の耐力壁を持つ柱があるか探す。
 D2階がある場合、1階のみの場合に分けて計算式に当てはめてN値を算出。:一つの柱についてX・Y両方向のN値を求め、大きい方を選ぶ。
 E柱頭・柱脚の接合金物の選択:Dで求めたN値以上の許容耐力を持つ接合金物等を選ぶ。

下記の「計算事例」にあるとおり計算自体は簡単です。
ExcelなどではVlookupなどを使用して計算を実施していました。

しかしVBで実施するとなると処理が大変そうだと感じました。
最初に、Pillarクラスに「出隅かその他」を判別するために、「sumi」を設け、
出隅なら1,その他なら0としてelementで設定出来るようにした方が良いのかなど。

そして、

 For Each pillar In pillarList ループで、

    pillarListの座標と、wallListのstartPoint座標が合致すれば、柱の右側にStiffが存在、
              endPoint座標が合致すれば、柱の左側にStiffが存在、とするなど。
          同様に、braceListのstartPoint座標が合致すれば、柱脚に接続。
              endPoint座標が合致すれば、柱頭に接続とするなど。
              ただこの場合、向きが左側と右側の2通りあるため処理が難しそうです。
            
     そして、2階部分の柱も検索し、計算を実施しないといけません。

ボタンをクリックすると計算が実行されるようにしたいです。

手計算では分かり易いですが柱の数が多く煩雑です。
Excelでは計算可能ですがテキスト入力のため操作性が乏しいです。

VBの簡易CADだと、柱や壁を配置するだけで、ボタンを押すと計算が実行され便利です。
さらに、削除や追加による検討が容易で便利です。


        記

・N値計算

  https://kakunin-shinsei.com/n-value-calculation-method/

・計算事例

https://stmaki.com/2025kaberyou-005/#:~:text=%E5%80%A4%E8%A8%88%E7%AE%97%E5%81%8F%EF%BC%89-,%EF%BC%AE%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%AE%E6%89%8B%E9%A0%86,%E5%8F%B7%E3%81%8B%E3%82%89%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82



引用返信 編集キー/
■103848 / inTopicNo.43)  Re[24]: Visual Basicで簡易CADを作成
□投稿者/ kiku (487回)-(2025/08/20(Wed) 15:09:27)
No103847 (shiro さん) に返信
> ■No103825 (魔界の仮面弁士 さん) に返信
>>■No103822 (shiro さん) に返信

> 処理的には次のような方法が考えられます。
>
>  @各階で壁倍率(Stiff)の差Aの算出:検討する柱の両側に取り付く耐力壁の倍率の差Aを求める。
>  A補正値の決定(筋かいの場合)
>  B係数B、Lの決定:柱が出隅かどうかを確認し、係数B、Lを決定する。
>  C1階の耐力壁を持つ柱の上に、2階の耐力壁を持つ柱があるか探す。
>  D2階がある場合、1階のみの場合に分けて計算式に当てはめてN値を算出。:一つの柱についてX・Y両方向のN値を求め、大きい方を選ぶ。
>  E柱頭・柱脚の接合金物の選択:Dで求めたN値以上の許容耐力を持つ接合金物等を選ぶ。
>
> 下記の「計算事例」にあるとおり計算自体は簡単です。
> ExcelなどではVlookupなどを使用して計算を実施していました。
>
> しかしVBで実施するとなると処理が大変そうだと感じました。
> 最初に、Pillarクラスに「出隅かその他」を判別するために、「sumi」を設け、
> 出隅なら1,その他なら0としてelementで設定出来るようにした方が良いのかなど。

計算例の部分を見てみましたが
正直に申し上げまして、素人には理解不能でした。
用語の定義から理解を深めないと厳しそうです。

よって、業務経験が必要な部分はご自身で判断し、
プログラム部分に特化した部分のみをご質問されると
回答が付きやすいと思いました。

具体的には、どういうことかと申しましと、
「出隅」か「その他」を判別するという記述がありますが、
これは既存の情報のみで、プログラムを駆使すれば、判定が可能であれば、その判定方法を
どうすれば良いかという話になりますし、
既存の情報のみで判定できないのであるならば、情報が足りていないということになると
思うため、GUIとしてその情報を入力してあげる必要が生じます。
この場合、どのように入力するのかという話になると思います。

例えば、GUIとして追加の情報を入力する方法として
書いた柱を選択すると、画面の別部分に、その柱のプロパティ情報を
表示できるようにし、そのプロパティを変更できるようにする機能をつくれば
できそうです。

例えば、既存情報で計算可能であるならば、
具体的に、既存情報をどのように判定するかのロジックを提示いただければ
回答が付きやすいのではと考えます。

引用返信 編集キー/
■103849 / inTopicNo.44)  Re[25]: Visual Basicで簡易CADを作成
□投稿者/ shiro (22回)-(2025/08/20(Wed) 18:35:48)
No103848 (kiku さん) に返信
> ■No103847 (shiro さん) に返信
>>■No103825 (魔界の仮面弁士 さん) に返信
> >>■No103822 (shiro さん) に返信

kiku 様

> 計算例の部分を見てみましたが
> 正直に申し上げまして、素人には理解不能でした。
> 用語の定義から理解を深めないと厳しそうです。
>
> よって、業務経験が必要な部分はご自身で判断し、
> プログラム部分に特化した部分のみをご質問されると
> 回答が付きやすいと思いました。
>
> 具体的には、どういうことかと申しましと、
> 「出隅」か「その他」を判別するという記述がありますが、
> これは既存の情報のみで、プログラムを駆使すれば、判定が可能であれば、その判定方法を
> どうすれば良いかという話になりますし、
> 既存の情報のみで判定できないのであるならば、情報が足りていないということになると
> 思うため、GUIとしてその情報を入力してあげる必要が生じます。
> この場合、どのように入力するのかという話になると思います。

ご指摘のとおりです。

この間、テキストデーターからconsole版での計算を実装して、事例通り正しく計算されることを確認できました。
ですが、やはりCAD入力からの一貫計算を実装したいです。

出隅については、ToolStripMenuItemで、

'柱

Case "colsumi"

を追加し、出隅の場合は1とする設定を、Pillar Classに追加したいと考えています。
長方形の平面図ですと、4隅の4点のみが出隅になります。

コンソール版で成功した概要は、wallの合板2.5倍と、筋交いの2.0倍を、
bai1、Bai2として、同じ座標に存在するならば、bai3=bai1+Bai2として格納しました。

よって、FORM1上でcsvファイルにWall Classのsutiffを止めて、

bai1の場合、menzaiに該当する構造材の番号を、
bai2には筋交いのINDEXとして、jiku、jikusの2つを追加したいです。

よって、Wallクラスに、INDEX startPoint, endPoint、 menzai、 jiku、 jikus
となるようにしたいです。

ただ、ToolStripMenuItemで壁と筋交いを設定した場合、同じ座標の場合に(MouseDown,move,UP)、
どうすればWallクラスにADDして格納できるかが分かりませんでした。

引用返信 編集キー/
■103850 / inTopicNo.45)  Re[26]: Visual Basicで簡易CADを作成
□投稿者/ kiku (488回)-(2025/08/21(Thu) 09:03:52)
> ただ、ToolStripMenuItemで壁と筋交いを設定した場合、同じ座標の場合に(MouseDown,move,UP)、
> どうすればWallクラスにADDして格納できるかが分かりませんでした。

質問したいことは上記の部分でしょうか?

操作が良くわかりませんでした。
・オブジェクトを1つ選択する
・メニューから設定する
・WallクラスにADDされる

上記の流れだと仮定すると、
なぜ同じ座標となるのかがわかりませんでした。
なぜならば、オブジェクトは1つのみ選択していると思われるからです。

もし同じ座標に2つのオブジェクトが重なっていたとした場合、
それでも選択できるのは、上位のオブジェクト1つのみのはずで、
やはり1つしか選択できないのではないでしょうか?

このあたりもご説明頂けないと、質問そのものが伝わらないと思います。
引用返信 編集キー/
■103851 / inTopicNo.46)  Re[27]: Visual Basicで簡易CADを作成
□投稿者/ shiro (23回)-(2025/08/21(Thu) 22:01:16)
No103850 (kiku さん) に返信

kiku 様

1スパンに壁とブレース材を配置することはあります。
その場合、壁はwalllistに、ブレースはbracelistに格納しました。

次のように、W1とB2、W3とB4が同じ場所に配置されます。
この時、同じ座標ならば、座標を同じとし、W1とB2なら、

40 40 80 40 3 2 4

と、wallbai sujiku sujiikusを1つにまとめたいという意味でした。



Type Index X1 Y1 X2 Y2 wallbai sujiku sujiikus Stiff
C 1 40 40 0
C 2 40 80 0
C 3 80 80 0
C 4 80 40 0
W 1 40 40 80 40 3 2.5
W 3 40 40 40 80 3 2.5
B 2 40 40 80 40 2 4 2
B 4 40 40 40 80 4 4 2

引用返信 編集キー/
■103852 / inTopicNo.47)  Re[28]: Visual Basicで簡易CADを作成
□投稿者/ kiku (489回)-(2025/08/22(Fri) 08:45:51)
No103851 (shiro さん) に返信
> ■No103850 (kiku さん) に返信

> Type	Index	X1	Y1	X2	Y2	wallbai	sujiku	sujiikus	Stiff
> WA	1A	40	40	80	40	3	@	@	2.5A
> B	2	40	40	80	40	@	2	4	2

上記の場合

> Type	Index	X1	Y1	X2	Y2	wallbai	sujiku	sujiikus	Stiff
> WA	1A	40	40	80	40	3	2	4	2.5A

上記の結果になって欲しいということでしょうか?

なるぼど、ファイル出力するときの処理を変更したいということなのでしょうか?
それともやはり、メニューから操作したときの処理を変更したいということなのでしょうか?
どちらにしても、変更したい内容を明確にすれば
プログラムできることになります。

・不明点1
 @は必ず空白か?
 空白でない場合、どうしたいのか?
・不明点2
 合算する場合、AはWの行を優先するのか?


引用返信 編集キー/
■103853 / inTopicNo.48)  Re[29]: Visual Basicで簡易CADを作成
□投稿者/ shiro (24回)-(2025/08/22(Fri) 13:20:22)
No103852 (kiku さん) に返信
> ■No103851 (shiro さん) に返信
>>■No103850 (kiku さん) に返信

kiku 様


>>Type Index X1 Y1 X2 Y2 wallbai sujiku sujiikus Stiff
>>WA 1A 40 40 80 40 3 @ @ 2.5A
>>B 2 40 40 80 40 @ 2 4 2
>
> 上記の場合
>
>>Type Index X1 Y1 X2 Y2 wallbai sujiku sujiikus Stiff
>>WA 1A 40 40 80 40 3 2 4 2.5A
>
> 上記の結果になって欲しいということでしょうか?

その通りです。空欄が詰まってしまいました。

> なるぼど、ファイル出力するときの処理を変更したいということなのでしょうか?
> それともやはり、メニューから操作したときの処理を変更したいということなのでしょうか?
> どちらにしても、変更したい内容を明確にすれば
> プログラムできることになります。

コマンドプロンプトで動くコードは、上記の仕様で計算しました。
よって、一度CSVに出力させ、それをオープンして計算する方法を考えています。
ファイル出力でそのようになれば良いのですが。

> ・不明点1
>  @は必ず空白か?
>  空白でない場合、どうしたいのか?

0としていました。空白ではあれません。

> ・不明点2
>  合算する場合、AはWの行を優先するのか?

最後のSTIFFの列はその後の計算では使用しないため、どちらになってもかいませんし、
未出力でも問題ないです。



引用返信 編集キー/
■103854 / inTopicNo.49)  Re[30]: Visual Basicで簡易CADを作成
□投稿者/ kiku (490回)-(2025/08/22(Fri) 16:45:05)
2025/08/22(Fri) 16:45:59 編集(投稿者)

No103853 (shiro さん) に返信
>>・不明点1
>> @は必ず空白か?
>> 空白でない場合、どうしたいのか?
> 0としていました。空白ではあれません。
空白はあり得ないと理解しました。
では下記の場合はどのように動作するのですか?

パターン1
Type wallbai sujiku sujiikus
W 3 0 0
B 0 2 4
Type wallbai sujiku sujiikus
W 3 2 4

パターン2
Type wallbai sujiku sujiikus
W 3 5 0
B 0 2 4
Type wallbai sujiku sujiikus
W 3 @ 4
 上記@は、どうなるべきか?

パターン3
Type wallbai sujiku sujiikus
W 3 0 0
B 0 0 4
Type wallbai sujiku sujiikus
W 3 A 4
 上記Aは、どうなるべきか?

>>・不明点2
>> 合算する場合、AはWの行を優先するのか?
> 最後のSTIFFの列はその後の計算では使用しないため、どちらになってもかいませんし、
> 未出力でも問題ないです。

どちらでも良いということなので、
Wを優先すると理解しました。
※合算する場合、WへBを合算するイメージ

引用返信 編集キー/
■103855 / inTopicNo.50)  Re[31]: Visual Basicで簡易CADを作成
□投稿者/ shiro (25回)-(2025/08/22(Fri) 20:33:17)
No103854 (kiku さん) に返信
> 2025/08/22(Fri) 16:45:59 編集(投稿者)
>
> ■No103853 (shiro さん) に返信

kiku 様

> 空白はあり得ないと理解しました。
> では下記の場合はどのように動作するのですか?
>
> パターン1
> Type wallbai sujiku sujiikus
> W 3 0 0
> B 0 2 4
> Type wallbai sujiku sujiikus
> W 3 2 4
>
> パターン2
> Type wallbai sujiku sujiikus
> W 3 5 0
> B 0 2 4
> Type wallbai sujiku sujiikus
> W 3 @ 4
>  上記@は、どうなるべきか?
>
> パターン3
> Type wallbai sujiku sujiikus
> W 3 0 0
> B 0 0 4
> Type wallbai sujiku sujiikus
> W 3 A 4
>  上記Aは、どうなるべきか?

パターン1のとおり、Wはwallbai列のみ1以上の数字をとり、
Bの場合は隣2列だけの数字となります。

よって、列どうしの足し算による増減はありません。
位置の重複がない場合は、そのまま出力させます。

パターン2の5は常に0です。
パターンAは0となります。

> どちらでも良いということなので、
> Wを優先すると理解しました。
> ※合算する場合、WへBを合算するイメージ

そのようなイメージです。

引用返信 編集キー/
■103857 / inTopicNo.51)  Re[32]: Visual Basicで簡易CADを作成
□投稿者/ kiku (491回)-(2025/08/25(Mon) 08:42:21)
No103855 (shiro さん) に返信

> パターン2の5は常に0です。

0でない値で重複した場合、
常に0をセットするという意味ですか?
それとも5という数字に特別な意味があり
その場合のみ0にセットするという意味ですか?
5に特別な意味がある場合、その他のルールはどんなルールがありますか?

※過不足なくルールを決まっていないと
 プログラムできないので聞いています。
 自身で作成するプログラムなので、
 その意識で回答してください。
引用返信 編集キー/

このトピックをツリーで一括表示

<前の20件
トピック内ページ移動 / << 0 | 1 | 2 >>

このトピックに書きこむ