Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations KootK on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

ETABs API - FrameObj.GetSection

Status
Not open for further replies.

sticksandtriangles

Structural
Apr 7, 2015
472
I am trying to retrieve the section properties of specific frame elements with python; it seems like this should be really easy.
Sample code is shown below:

Python:
Frame = "33"
PropName = ""
SAuto = ""
x = SapModel.FrameObj.GetSection(Frame, SAuto, PropName)

This is the error that I get:

Python:
Traceback (most recent call last):
  File "C:/______/Desktop/Python/v1_Get_Section_Property.py", line 16, in <module>
    x = SapModel.FrameObj.GetSection(Frame, SAuto, PropName)
  File "C:\Users\____\AppData\Local\Continuum\anaconda3\lib\site-packages\comtypes\__init__.py", line 655, in call_with_inout
    rescode = func(self_, *args, **kw)
_ctypes.COMError: (-2147417851, 'The server threw an exception.', (None, None, None, 0, None))

After receiving this error, ETABs proceeds to crash and shut down, any ideas on how to solve?

Thanks!



S&T
 
Replies continue below

Recommended for you

unsure why it would crash, if looking to get sections properties for a given frame (unique id='33'). I would try the following:

I wrote this a while back, it may be worth going thru. After getting the assigned section for frame '33', you need to get the type of section given by a CSi enumerator, such as 'rectangle', 'circle' 'I'. And from that you can get the section properties. There is a basic function that will extract the basic data SapModel.PropFrame.GetGeneral(name), this function will give you the general section properties.

Python:
def getAllFrameProps(SapModel):
    """
    @returns frameProps
    """
    allFrameProps=SapModel.PropFrame.GetAllFrameProperties()
    frameProps=[]
    propTypeEnum=['I','Channel','T','Angle','DblAngle','Box','Pipe',
                  'Rectangular','Circle','General','DbChannel','Auto','SD',
                  'Variable','Joist','Bridge','Cold_C','Cold_2C','Cold_Z',
                  'Cold_L','Cold_2L','Cold_Hat','BuiltupICoverplate',
                  'PCCGirderI','PCCGirderU','BuiltupIHybrid','BuiltupUHybrid',
                  'Concrete_L','FilledTube','FilledPipe','EncasedRectangle',
                  'EncasedCircle','BucklingRestrainedBrace','CoreBrace_BRB',
                  'ConcreteTee','ConcreteBox','ConcretePipe','ConcreteCross',
                  'SteelPlate','SteelRod']
    matTypeEnum=['Steel','Concrete','NoDesign','Aluminum','ColdFormed','Rebar',
                 'Tendon','Masonry']
    for i in range(allFrameProps[0]):
        propName=allFrameProps[1][i]
        propType=allFrameProps[2][i]  
        propTypeStr=propTypeEnum[propType-1]
        if(propTypeStr=='Rectangular'):
            propParam=SapModel.PropFrame.GetRectangle(propName)
            propMat=propParam[1]
            propDimX=propParam[2]
            propDimY=propParam[3]
        elif(propTypeStr=='Circle'):
            propParam=SapModel.PropFrame.GetCircle(propName)
            propMat=propParam[1]
            propDimX=propParam[2]
            propDimY=0
        elif(propTypeStr=='I'):
            propParam=SapModel.PropFrame.GetISection(propName)
            propMat=propParam[1]
            propDimX='stdSect'
            propDimY='stdSect'
        else:
            propMat=SapModel.PropFrame.GetMaterial(propName)[0]#.value
        mat=SapModel.PropMaterial.GetMaterial(propMat)
        matType=mat[0]
        matTypeStr=matTypeEnum[matType-1]
        if(matTypeStr=='Concrete'):
            matLocal=SapModel.PropMaterial.GetOConcrete(propMat)
            matGrade=matLocal[0]
        elif(matTypeStr=='Steel'):
            matLocal=SapModel.PropMaterial.GetOSteel(propMat)
            matGrade=matLocal[0]
        elif(matTypeStr=='NoDesign' and 'GLT' in propName):
            matTypeStr='Wood'
            propNameSplit=re.split("[ Xx]",propName)
            propDimX=int(propNameSplit[0])
            propDimY=int(propNameSplit[1])
            matGrade=propNameSplit[2]
        frameProps+=[[propName,propTypeStr,matTypeStr,matGrade,propDimX,propDimY]]
    return frameProps;
 
Thanks rscassar, that helps me in the future.
For now, I am still stuck as I can not identify the section property of frame object '33', in my case a W18x35

Is there any other API function that takes unique name and returns section property?

I am at a loss on why
Python:
x = SapModel.FrameObj.GetSection(Frame, SAuto, PropName)
throws an error to me.

CSI technical support has been of little help [banghead]

S&T
 
Seems like I always find a solution right after I have admitted defeat... the LineElm.GetProperty function does the trick for me.

Still curious why the first function does not work

S&T
 
Damn, I take it back, LineElm.GetProperty only works if the beam is a simple span beam, girders do not seem to have output...

S&T
 
Try only input the frame id '33'.

Python:
SAuto, PropName, ret = SapModel.FrameObj.GetSection(Frame)

If you look thru the cFrameObj methods, you'll come to GetSection. The only input that is the frame name. 'PropName', 'SAuto and 'pRetVal' will be returned as output.

Python:
cFrameObj._methods_ = [
    COMMETHOD([dispid(38)], HRESULT, 'GetSection',
              ( ['in'], BSTR, 'Name' ),
              ( ['in', 'out'], POINTER(BSTR), 'PropName' ),
              ( ['in', 'out'], POINTER(BSTR), 'SAuto' ),
              ( ['out', 'retval'], POINTER(c_int), 'pRetVal' ))
 
So weird, still get the same error, I have not had any trouble with any other functions in the API.

Python:
import comtypes.client

ProgramPath = r"C:\Program Files\Computers and Structures\ETABS 18\ETABS.exe"
ModelPath = r"C:\Users\______\Desktop\ETABs Models\test shears\shear end rxns.EDB"
helper = comtypes.client.CreateObject('ETABSv1.Helper')
helper = helper.QueryInterface(comtypes.gen.ETABSv1.cHelper)
#create API helper object
ETABSObject = comtypes.client.GetActiveObject("CSI.ETABS.API.ETABSObject")
SapModel = ETABSObject.SapModel


frame = '33'
PropName = ""
SAuto = ""
ret = -1
SAuto, PropName, ret = SapModel.FrameObj.GetSection(frame, PropName, SAuto)

Error code:
Python:
runfile('C:/Users/aguter/Desktop/Python/v3_Get_Section_Property.py', wdir='C:/Users/aguter/Desktop/Python')
Traceback (most recent call last):

  File "C:\Users\______\Desktop\Python\v3_Get_Section_Property.py", line 18, in <module>
    SAuto, PropName, ret = SapModel.FrameObj.GetSection(frame, PropName, SAuto)

  File "C:\Users\______\Anaconda3\lib\site-packages\comtypes\__init__.py", line 655, in call_with_inout
    rescode = func(self_, *args, **kw)

COMError: (-2147417851, 'The server threw an exception.', (None, None, None, 0, None))



S&T
 
try just the frame as single input paramater

>> outputs = SapModel.FrameObj.GetSection(frame);

If that works than have a look at what is stored in outputs.
 
Still no dice, same error code.

Python:
frame = '33'
x = SapModel.FrameObj.GetSection(frame)

I appreciate all help rscassar, I will let you know what tecch support says when they get back to me.

S&T
 
Closing the loop on this case anyone else has this trouble, I upgraded from ETABs v18 to v19 and the issue has been resolved.

S&T
 
Hi
I have the same problem with some of the API methods such as: FrameObj.GetAllFrames(), FrameObj.GetDesignOrientation(), FrameObj.GetNameList() and so on
It is interesting that when I run my code on another Laptop, all are ok and no error occurs. here is some information about both laptops:
1) win 10, Lenovo Legion5 core i7 10th Gen, Using Etabs 18.1.1 (methods do not work on this one)
2) win 10, Samsung series5 core i2 3rd Gen, Using Etabs 18.1.1 (methods work well)

I wrote the code by second laptop and when try to test the .exe file on the first one, errors appears. I found that the second laptop can not get some parameters from the SapModel and then tried to test more methods and found that happens for lots of methods in FrameObj while some of them such as GetElm or GetGUID works well. I should mention that I tested the main code by VSCode on both laptops.

I am trying to figure it out, I will share my experience here and will be glad to here from you.
Regards
 
Hi again,

I have both etabs 19.0.2 and 18.1.1 on my laptop. I ran my code using ETABs 19.0.2 and surprisingly it worked while it didn't work before! I did nothing expect reinstalling comtypes version 1.1.10
my code has two part, it can start a new instance of Etabs or can get the active object since for complex models it takes some time to analyze the model. By this, If I analyze the model one time, I can run my code for that model several times without reanalyze. I can not find out why my code can not get information about frame objects when it uses existing Etabs object, while the same code works well by opening a new instance of Etabs. Wow! FrameObj.GetAllFrame() should work always! I'm confused.
After this experience I start to check Etabs version 18.1.1 again and every thing works well!!!! the code is doing well for both cases, even open new instance of Etabs or get the active object!

So as a result, I think that there is something with comtypes and windows. I will post more if I found anything especial.
Regrads
 
There has been some changes with the python in Etabs v19. They have put it in there release notes the EtabsAPI.chm now has a header for using python. I use this new function

Python:
def attachToInstance2019():
    AttachToInstance = True
    #create API helper object
    helper = comtypes.client.CreateObject('ETABSv1.Helper')
    helper = helper.QueryInterface(comtypes.gen.ETABSv1.cHelper)
    
    if AttachToInstance:
        #attach to a running instance of ETABS
        try:
            #get the active ETABS object
            myETABSObject = helper.GetObject("CSI.ETABS.API.ETABSObject") 
        except (OSError, comtypes.COMError):
            print("No running instance of the program found or failed to attach.")
            sys.exit(-1)
    else:
        sys.exit(-1)

    #create SapModel object
    SapModel = myETABSObject.SapModel
    return SapModel,myETABSObject,helper;
 
Thanks rscassar,
I still have problem with FrameObj.GetAllFrames() and FrameObj.GetDesignOrientation(frameName). I asked from support@csiamerica.com and will let you know if I get a proper response.
 
Hi again,
It is just required to re-register ETABS.
Here is what you need to do: (CSI response)

We suggest re-registering the ETABS API on your machine:
1. Close all instances of ETABS and any software accessing the ETABS API (e.g. Excel).
2. Open an administrative command prompt (open Command Prompt using right-click, “Run as administrator”).
3. Within the administrative command prompt, navigate to the directory of ETABS v18.1.1.
4. Within the administrative command prompt, run “UnregisterETABS.exe”.
5. Repeat steps 3 and 4 for all versions of ETABS installed on the machine.
6. Within the administrative command prompt, navigate to the installed ETABS v18.1.1.
7. Within the administrative command prompt, run “RegisterETABS.exe”.

Regrads,
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor