Section Modulus

If I establish a cross section shape for a structural beam, how can I use Rhino to give me a section modulus?

This is what I get from the ‘area moments’ command;

Area = 2.14778953 (+/- 1e-09) square feet
Area Centroid = 48.7607237,-0.116125533,4.10834046 (+/- 1e-08,1e-10,5.5e-09)
Area Moments:
First Moments
x: 104.727772 (+/- 1e-07)
y: -0.249413205 (+/- 1e-10)
z: 8.82385063 (+/- 1.2e-08)
Second Moments
xx: 5107.30953 (+/- 1e-06)
yy: 0.0289632414 (+/- 1e-11)
zz: 37.0935158 (+/- 1.4e-07)
Product Moments
xy: -12.1615684 (+/- 1e-08)
yz: -1.02467436 (+/- 1.4e-09)
zx: 430.238757 (+/- 6.2e-07)
Area Moments of Inertia about World Coordinate Axes
Ix: 37.1224791 (+/- 1.4e-07)
Iy: 5144.40304 (+/- 1e-06)
Iz: 5107.33849 (+/- 1e-06)
Area Radii of Gyration about World Coordinate Axes
Rx: 4.15740778 (+/- 8.1e-09)
Ry: 48.940864 (+/- 1e-08)
Rz: 48.76424 (+/- 1e-08)
Area Moments of Inertia about Centroid Coordinate Axes
Ix: 0.842133304 (+/- 4.8e-08)
Iy: 1.54970531 (+/- 8.4e-08)
Iz: 0.707572002 (+/- 3.5e-08)
Area Principal Moments of Inertia about Centroid and Principal Axes
I1: 0.705052224 , Direction ( 0.990933965, 0 ,-0.13434983)
I2: 1.26764532e-34 , Direction ( 0, 1 ,0)
I3: 0.844653082 , Direction ( 0.13434983, 0 ,0.990933965)
Area Radii of Gyration about Centroid Coordinate Axes
Rx: 0.626173322 (+/- 1.8e-08)
Ry: 0.849432159 (+/- 2.3e-08)
Rz: 0.573970351 (+/- 1.4e-08)

Hi Jody - Elastic Section Modulus or Plastic Section Modulus??

-Pascal

2 Likes

omg @pascal the Holy Grail screenshot here made me laugh so hard…

Elastic, Plastic? Reminds me of the old surfboard company called the ‘Plastic Fantastic’.

 I went to the Wiki and read that same thing but I think I need the elastic section modulus. Hopefully we don't deform our beam to the point of being elastic. I think that I found the value I'm looking for in the Rhino cut and paste from the first post.

Iy: 5144.40304 (+/- 1e-06)

Since this is for a crossbeam member is a sailing catamaran I need the figure in the atwartship direction that resists the mast compression created by the shroud loads. That would be the y direction as my boat is sailing East along the x axis. I have a proposed section and values from an engineer that I can compare against as the sections are fairly close in area and configuration. I'll show you a comparison of the two.

I’m using Scan and Solve for FEA on this beam and having problems distilling that down into plain and simple old school beam theory for the Coast Guard. Hopefully as long as I ‘meet or exceed’ the cross-sectional areas that the engineer gives me that he deems necessary to satisfy the CG we will be OK. I just would like to be able to cull what I need directly from the model using the Rhino data. Here is a screenshot of the FEA run that just finished.

A few little 'hot spots' to chase down but I'm getting close.

BTW. Where did you get that photo of me? I have suggested to the developers of Scan & Solve that they use the slogan 'FEA software so easy to use, even a Caveman can do it!'

Of course, now I had to find the keeper of the Bridge of Death… Thanks :stuck_out_tongue_winking_eye:
Just FWIW - it’s at about 1:07:00.

You need to ask your engineer.

I wrote a python script to find “total moment of inertia” and section modulus of multiple surfaces regarding to a specified vertical or horizontal axis. Maybe someone need it to find elastic section modulus. I tried it on Rhino-7, i guess it will work in previous versions of rhino.

import rhinoscriptsyntax as rs


warning = "1) All parts must be surface, not polysurface or closed curve! \n "
warning += "2) All parts must be planar. \n"
warning += "3) You have to work in TOP view, XY-axis \n\n"
warning += "View screen will be turn to TOP-view now!  " 
rs.MessageBox(warning,0,"Warning")
rs.CurrentView("Top")


surfaces = rs.GetObjects("Select Surfaces" , preselect=True , filter=8)

if surfaces : 
    TotalAreaMomentAxis = 0 
    TotalAreaMX = 0
    TotalAreaMY = 0
    TotalAreaMZ = 0
    TotalArea = 0 
    
    for x in surfaces :
        area = rs.Area(x)
        areaCenter = rs.SurfaceAreaCentroid(x)[0]
        areaCenterX = areaCenter[0]
        areaCenterY = areaCenter[1]
        areaCenterZ = areaCenter[2]
        
        TotalAreaMX = TotalAreaMX + (area * areaCenterX)
        TotalAreaMY = TotalAreaMY + (area * areaCenterY)
        TotalAreaMZ = TotalAreaMZ + (area * areaCenterZ)
        TotalArea = TotalArea + area 
    totalCenterX = TotalAreaMX / TotalArea
    totalCenterY = TotalAreaMY / TotalArea
    totalCenterZ = TotalAreaMZ / TotalArea
    TotalCenter = (totalCenterX,totalCenterY,totalCenterZ)
    
    
    
    BB = rs.BoundingBox(surfaces)
    x_kucuk=BB[0][0] ; x_buyuk=BB[0][0] ; y_kucuk=BB[0][1] ; y_buyuk=BB[0][1] ; z_kucuk=BB[0][2] ; z_buyuk=BB[0][2]
    
    for y in BB :
        if y[0] < x_kucuk : x_kucuk = y[0]
        if y[0] > x_buyuk : x_buyuk = y[0]
        if y[1] < y_kucuk : y_kucuk = y[1]
        if y[1] > y_buyuk : y_buyuk = y[1]
        if y[2] < z_kucuk : z_kucuk = y[2]
        if y[2] > z_buyuk : z_buyuk = y[2]
    
    axis = rs.ListBox(("X axis select","Y axis select","X-Neutral Axis","Y-Neutral Axis"), "Select the axis for section modules" , "Axis" , default=0)
    if axis == "X axis select" :
        axispoint = rs.GetPoint ("Select a point on X-Axis you want to see moments")
    if axis == axis == "Y axis select" :
        axispoint = rs.GetPoint ("Select a point on Y-Axis you want to see moments")
    
    if axis == "X axis select" :
        axis_line = rs.AddLine((x_kucuk,axispoint[1],z_kucuk) , (x_buyuk,axispoint[1],z_kucuk ) )
    elif axis == "Y axis select" :
        axis_line = rs.AddLine((axispoint[0],y_kucuk,z_kucuk ) , (axispoint[0],y_buyuk,z_kucuk ) )
    elif axis == "X-Neutral Axis" : axis_line = rs.AddLine((x_kucuk,totalCenterY,z_kucuk) , (x_buyuk,totalCenterY,z_kucuk ) )
    elif axis == "Y-Neutral Axis" : axis_line = rs.AddLine((totalCenterX,y_kucuk,z_kucuk ) , (totalCenterX,y_buyuk,z_kucuk ) )
    else: print "No axis selected" ; exit()
    
    
    
    for x in surfaces :
        areaMomentCentroid = rs.SurfaceAreaMoments(x)[10]
        if axis == "X axis select" or axis == "X-Neutral Axis" : areaMomentCentroid = areaMomentCentroid[0]
        elif axis == "Y axis select" or axis == "Y-Neutral Axis"  : areaMomentCentroid = areaMomentCentroid[1]
        else : print "Axis is not correct" ; exit() 
        area = rs.Area(x)
        areaCenter = rs.SurfaceAreaCentroid(x)[0]
        ClosestPoint = rs.PointClosestObject(areaCenter,axis_line)[1]
        distance = rs.Distance(ClosestPoint,areaCenter)
        round(distance,2)
        round(area)
        round(areaMomentCentroid,2)
        areaMomentAxis = areaMomentCentroid + (area * distance * distance)
        TotalAreaMomentAxis = TotalAreaMomentAxis + areaMomentAxis 
        
    #section modulus
    
    
    
    ClosestPoint = rs.PointClosestObject(TotalCenter,axis_line)[1]
    Distance = round (rs.Distance(ClosestPoint,TotalCenter),2)
    #rs.AddPoint(TotalCenter)
    print "distance " + str(Distance)
    if Distance != 0 : 
        SectionModulus = round((TotalAreaMomentAxis / Distance) ,1)
    else : 
        SectionModulus = "--infinity--"
    axeCenter = rs.CurveMidPoint(axis_line)
    
    text = "Total Moment of inertia on axis = " + str(round(TotalAreaMomentAxis,1)) + " mm4 \n Total Elastic Section modulus for axis = " + str(SectionModulus)+ " mm3"
    result = rs.AddText(text, axeCenter, height=3, font=None, font_style=0 )
    rs.ObjectLinetype(axis_line , "Center")
    rs.ObjectColor(axis_line,(255,0,0))
    rs.ObjectColor(result,(255,0,0))
    print text 
else :  print "No surface selected"


1 Like

will bump up the topic.
the script works, it marks the position of the NA but SM is “infinity”

where is the catch?
rhino7