コード表示のテスト代わりに、断面性能を算定するVBAコード(AutoCad)を書いてみます。
Sub GetSectionProps() Dim RegionToCheck As AcadRegion: Dim ObjEnt As AcadEntity: Dim VarPick As Variant Dim MinPoint As Variant: Dim MaxPoint As Variant Dim Area As Double: Dim Centroid As Variant: Dim Inertia As Variant: Dim SectionModulus(1) As Double: Dim RadiusOfGyr As Variant: Dim Perimeter As Variant Dim OBJss As AcadSelectionSet Dim TempText As AcadText Dim MaxXDist As Double: Dim MaxYDist As Double Dim Ht As Double Dim DistX1 As Double: Dim DistX2 As Double: Dim DistY1 As Double: Dim DistY2 As Double On Error GoTo Done 'ターゲットオブジェクト(リージョン)選択 With ThisDrawing.Utility Set OBJss = ThisDrawing.SelectionSets.Add("TempName") OBJss.SelectOnScreen End With For Each RegionToCheck In OBJss Centroid = RegionToCheck.Centroid Dim Location(2) As Double Location(0) = Centroid(0): Location(1) = Centroid(1) Dim Origin(2) As Double RegionToCheck.Move Location, Origin RegionToCheck.GetBoundingBox MinPoint, MaxPoint Area = RegionToCheck.Area Inertia = RegionToCheck.MomentOfInertia RadiusOfGyr = RegionToCheck.RadiiOfGyration Perimeter = RegionToCheck.Perimeter DistX1 = Abs(MaxPoint(0)): DistX2 = Abs(Centroid(0)) ' 修正 DistY1 = Abs(MaxPoint(1)): DistY2 = Abs(Centroid(1)) ' 修正 If DistX1 > DistX2 Then MaxXDist = DistX1 Else MaxXDist = DistX2 End If If DistY1 > DistY2 Then MaxYDist = DistY1 Else MaxYDist = DistY2 End If ' Ht = (Abs(DistX1) + Abs(DistX2)) / 100 ' Ht = Area / 100 Ht = Perimeter / 100 SectionModulus(0) = Inertia(0) / MaxYDist ' 修正 SectionModulus(1) = Inertia(1) / MaxXDist ' 修正 ' 図芯に点を描画 Dim center(0 To 2) As Double center(0) = Centroid(0): center(1) = Centroid(1) ThisDrawing.ModelSpace.AddPoint (center) Set TempText = ThisDrawing.ModelSpace.AddText("面積 = " & Format(Area, "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("Iy = " & Format(Inertia(0), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("Ix = " & Format(Inertia(1), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("Zy = " & Format(SectionModulus(0), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("Zx = " & Format(SectionModulus(1), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("ry = " & Format(RadiusOfGyr(0), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("rx = " & Format(RadiusOfGyr(1), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("図芯座標 x = " & Format(Centroid(0), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("図芯座標 y = " & Format(Centroid(1), "0.0##"), Location, Ht) Location(1) = Location(1) - 1.25 * Ht Set TempText = ThisDrawing.ModelSpace.AddText("周長 = " & Format(Perimeter, "0.0##"), Location, Ht) Location(1) = Location(1) + 11.25 * Ht RegionToCheck.Move Origin, Location Next Done: If Not OBJss Is Nothing Then OBJss.Delete End Sub
- 修正履歴:
- 2011’ 05/12 ~ 吉田さんのご指摘を受けて、50,51行目の断面係数算出処理部の分母(MaxXDist、MaxYDist)を入れ替えました
- 2012/11/28 ~ 内田さんのご指摘を受けて、図形が何処にあっても正しく計算されるよう31,32行目のコードを修正しました。
あわせて、画面上で図芯位置を確認できるよう、図芯座標に点を描画するコードを追加しました(53~56行)。
はじめまして。吉田といいます。
AUTOCADで断面係数を出せるマクロを探していてここにたどり着きました。
早速、計算させましたが、Zx・Zyの値のみ手計算したのと違ってました。
私はマクロが全く理解できず、どこを変えれば良いかが分らない為、教えていただきたく連絡します。
計算した図形は外径30mm 内径20mmで
面積、断面2次モーメントは一致(A=392.699、Ix(Iy)=31906.8
断面係数(cad)Zx=190.781 Zy=175.133
断面係数(計算)Zx=2127.06 Zy=2127.06
申し訳ありませんが、教えてください。
吉田さん
はじめまして、ご来店ありがとうございます(笑)
同じ条件でやってみると・・・結果はこうなりました↓
「断面算定スクリーンショット」
で、
吉田さんの算定結果のうち断面係数が手計算の結果と異なる原因は、おそらく図芯のずれだと思います。上のスクリーンショットをご覧いただくとお分かり頂けると思いますが、図芯座標が、X座標・Y座標ともに0(ゼロ)になっていますね^^
そこで、解決策としてはこうなります↓
1.適当な位置に作図して、
2.一旦断面算定を行い、
3.図芯の位置に「点」を打ち、
4.図形と点を、原点(0,0)に移動してから
5.もう一度算定する。
ちょっと面倒ですが・・・
お試しください。
早速の回答ありがとうございました。解決しました。
図芯がずれているときも同様の作業をすれば大丈夫でした。
図芯が原点に移動するマクロがあれば大変助かりますが、それは、ぼちぼち勉強してみます。
どうもありがとうございました。
>解決しました。
よかったです^^
>図芯が原点に移動するマクロがあれば大変助かりますが ・・・
そうですね~♪ 何処に作図したものでも正しい断面係数を算出するように、マクロをいじった方が良いかもしれませんね^^ 求める図形の図芯に一時的にUCSの原点を設定して、断面算出処理が終わったらもとに戻すとか・・・。
もしかしたら、「計算がおかしい!」 って思った方もおられたり・・・、でたらめな断面係数で設計してしまった方が・・・(怖っ!)
・・・
と考えると
・・・
やはりコードに手を入れるべきですね^^
上手い方法が見つかったら、あらためてPOSTします^^
たびたび申し訳ありません。
今度は長方形でb=30 h=50で計算させた場合
断面係数が手計算ではZy=12500 Zx=7500
cadではZy=20833.333 Zx=4500.0となります。
正方形は問題ありませんでした。
申し訳ありませんが、よろしくお願いします。
あ・・・
コード記載をミスってました^^
50行目と、51行目 の分母を入れ替えてください!
座標が、XYひっくり返ってました ><;
どうもありがとうございました。
本当に助かりました。
こちらこそ、ご指摘ありがとうございました。
おかげさまでコードを修正することが出来ました。
はじめまして内田と申します。
断面系数算定コードを使わせてもらっている者です。
リージョンの図芯を原点になるよう移動させた上マクロを実施していますが、
結構手間がかかります。
任意の座標で計算出来ないかと思い、VBAコードを下記のようにいじってみましたら
上手くいったように思います。
31行・32行の “centroid(0)”及び “centroid(1)”を削除する。
(centroidは移動前の図芯では?)
AutoCAD API については全く知りませんので、これで良いのかどうかは
分かりません。
ご確認いただければ嬉しく思います。
よろしくお願いいたします。
内田さん
はじめまして^^
ご指摘ありがとうございます。
確認したところ、異なる座標系で正しく計算可能ですね♪
記事中のコードも併せて修正させていただきます。
正しく計算されていることを画面上で確認出来るように、
図芯に点を描画するコードも追加いたしますのでご利用ください。
はじめまして。
昔の記事にコメント失礼いたします。
上記コードなのですが、修正2にある 図形が何処にあっても~
という部分が当方ではうまく機能しません。(図形の座標位置によって断面係数の値が異なる)
修正前のように一旦VBS実行後、図形の図芯を原点となるよう移動して再度実行するとうまく計算できます。
AutoCAD2015環境です。
何度も申し訳ありません。
あと、計算結果のIy、Ix等のyとxが逆になっていると思います。