断面係数算定コード

コード表示のテスト代わりに、断面性能を算定する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

    修正履歴:

  1. 2011’ 05/12 ~ 吉田さんのご指摘を受けて、50,51行目の断面係数算出処理部の分母(MaxXDist、MaxYDist)を入れ替えました
  2. 2012/11/28 ~ 内田さんのご指摘を受けて、図形が何処にあっても正しく計算されるよう31,32行目のコードを修正しました。
    あわせて、画面上で図芯位置を確認できるよう、図芯座標に点を描画するコードを追加しました(53~56行)。
カテゴリー: AutoCad タグ: パーマリンク

断面係数算定コード への12件のフィードバック

  1. 吉田 のコメント:

    はじめまして。吉田といいます。
    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

    申し訳ありませんが、教えてください。

    • supermab のコメント:

      吉田さん

       はじめまして、ご来店ありがとうございます(笑)
      同じ条件でやってみると・・・結果はこうなりました↓
      「断面算定スクリーンショット」
      で、
      吉田さんの算定結果のうち断面係数が手計算の結果と異なる原因は、おそらく図芯のずれだと思います。上のスクリーンショットをご覧いただくとお分かり頂けると思いますが、図芯座標が、X座標・Y座標ともに0(ゼロ)になっていますね^^

      そこで、解決策としてはこうなります↓

      1.適当な位置に作図して、
      2.一旦断面算定を行い、
      3.図芯の位置に「点」を打ち、
      4.図形と点を、原点(0,0)に移動してから
      5.もう一度算定する。

      ちょっと面倒ですが・・・
      お試しください。

  2. 吉田 のコメント:

    早速の回答ありがとうございました。解決しました。
    図芯がずれているときも同様の作業をすれば大丈夫でした。
    図芯が原点に移動するマクロがあれば大変助かりますが、それは、ぼちぼち勉強してみます。
    どうもありがとうございました。

    • supermab のコメント:

      >解決しました。

      よかったです^^

      >図芯が原点に移動するマクロがあれば大変助かりますが ・・・

       そうですね~♪ 何処に作図したものでも正しい断面係数を算出するように、マクロをいじった方が良いかもしれませんね^^ 求める図形の図芯に一時的にUCSの原点を設定して、断面算出処理が終わったらもとに戻すとか・・・。
       もしかしたら、「計算がおかしい!」 って思った方もおられたり・・・、でたらめな断面係数で設計してしまった方が・・・(怖っ!)
      ・・・
      と考えると
      ・・・
      やはりコードに手を入れるべきですね^^ 
      上手い方法が見つかったら、あらためてPOSTします^^

  3. 吉田 のコメント:

    たびたび申し訳ありません。
    今度は長方形でb=30 h=50で計算させた場合
    断面係数が手計算ではZy=12500 Zx=7500
    cadではZy=20833.333 Zx=4500.0となります。
    正方形は問題ありませんでした。
    申し訳ありませんが、よろしくお願いします。

    • supermab のコメント:

      あ・・・
      コード記載をミスってました^^
      50行目と、51行目 の分母を入れ替えてください!
      座標が、XYひっくり返ってました ><;

  4. 吉田 のコメント:

    どうもありがとうございました。
    本当に助かりました。

    • supermab のコメント:

      こちらこそ、ご指摘ありがとうございました。
      おかげさまでコードを修正することが出来ました。

  5. 内田 のコメント:

    はじめまして内田と申します。

    断面系数算定コードを使わせてもらっている者です。

    リージョンの図芯を原点になるよう移動させた上マクロを実施していますが、
    結構手間がかかります。

    任意の座標で計算出来ないかと思い、VBAコードを下記のようにいじってみましたら
    上手くいったように思います。

    31行・32行の “centroid(0)”及び “centroid(1)”を削除する。
    (centroidは移動前の図芯では?)

    AutoCAD API については全く知りませんので、これで良いのかどうかは
    分かりません。

    ご確認いただければ嬉しく思います。

    よろしくお願いいたします。

    • supermab のコメント:

      内田さん
       はじめまして^^
      ご指摘ありがとうございます。
      確認したところ、異なる座標系で正しく計算可能ですね♪

      記事中のコードも併せて修正させていただきます。
      正しく計算されていることを画面上で確認出来るように、
      図芯に点を描画するコードも追加いたしますのでご利用ください。

  6. 西 のコメント:

    はじめまして。
    昔の記事にコメント失礼いたします。
    上記コードなのですが、修正2にある 図形が何処にあっても~
    という部分が当方ではうまく機能しません。(図形の座標位置によって断面係数の値が異なる)
    修正前のように一旦VBS実行後、図形の図芯を原点となるよう移動して再度実行するとうまく計算できます。
    AutoCAD2015環境です。

  7. 西 のコメント:

    何度も申し訳ありません。
    あと、計算結果のIy、Ix等のyとxが逆になっていると思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です