Robot Structural Analysis Forum
Welcome to Autodesk’s Robot Structural Analysis Forums. Share your knowledge, ask questions, and explore popular Robot Structural Analysis topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

[EC8 & Python code]

25 REPLIES 25
Reply
Message 1 of 26
xroguiez
1260 Views, 25 Replies

[EC8 & Python code]

Hello
I am trying to transform VBA code into Python from the example provided here: https://forums.autodesk.com/t5/robot-structural-analysis-forum/api-seismic-case-definition/m-p/33578...
But I can't access the GetAnalysisParams() methods :

 

caseEdX = structure.Cases.CreateSimple(6, "Ed+X",
RobotOM.IRobotCaseNature.I_CN_SEISMIC ,
RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_SEISMIC)

num_EdX1 = caseEdX.GetSeismicCode #is empty
#doesn't work num_EdX1 = caseEdX.Records.New(RobotOM.IRobotSeismicAnalysis_EC8_General_Params) #a validate
EC8params = caseEdX.GetAnalysisParams #is empty too

Can someone help me?
Thanks for any help

Xavier

25 REPLIES 25
Message 2 of 26

Hi @xroguiez 

You must declare your variable types

Best regards 

Message 3 of 26

Hello

I agree with you but how to do it (in Python) ? I couldn't do it

Thanks

Xavier

Message 4 of 26

> To declare a variable

Variable = Type_of_Variable (Class / Interface)

Example:

thData = IRobotThicknessData

 

> To Cast

Variable_0 = Type_of_Variable(Variable_1)

 

b = 125.3
print(int(b))
Output
125

Example:

label = RobotLabel(labels.Create(IRobotLabelType.I_LT_PANEL_THICKNESS,"25mm"))

 

therefore, you must declare the types of variables when necessary and check the output types of the functions according to the variables types to perform the casts

 

Best Regards

Message 5 of 26
Message 6 of 26

Hi

Thank you for all your advice.

 

I took the example in the link on the first 4 lines

VBA Source :

 

Dim ECParams As RobotSeismicAnalysis_EC8_General_Params

Set EQLoad = Robapp.Project.Structure.Cases.CreateSimple(200, "EarthQuake+X", I_CN_SEISMIC, I_CAT_DYNAMIC_SEISMIC)
Set ECParams = EQLoad.GetAnalysisParams
ECParams.Ag = Foglio2.Range("F9")

 

 

And then a partial version of Python transcription that works perfectly:

 

ECParams = RobotOM.RobotSeismicAnalysis_EC8_General_Params
ModalParams = RobotOM.RobotModalAnalysisParams
#I'm using different namespaces, but it's the same syntax
EQLoad = structure.Cases.CreateSimple(6, "Ed+X", 
                                    RobotOM.IRobotCaseNature.I_CN_SEISMIC ,
                                    RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_SEISMIC)

 

 The console proof, :

 

>>> dir(ECParams)
['Ag', 'B', 'BehaviorFactor', 'Direction', 'DirectionType', 'ExcitationDir', 'Filter', 'ResidualMode', 'S', 'Spectrum', 'Tb', 'Tc', 'Td', '__doc__', '__repr__']
dir(EQLoad)
['AnalizeType', 'CreateObjRef', 'Equals', 'GetAnalysisParams', 'GetHashCode', 'GetLifetimeService', 'GetSeismicCode', 'GetType', 'InitializeLifetimeService', 'IsAuxiliary', 'MainMode', 'MemberwiseClone', 'ModesCount', 'Name', 'Nature', 'NatureName', 'Number', 'Records', 'ReferenceEquals', 'SetAnalysisParams', 'SetNatureExt', 'TimeStepCount', 'ToString', 'Type', 'UniqueId', 'UserId', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'label']

 

 But the next point is completely blocking, i don't understand how to cast :, in this attempt, the intial variable is erasing

 

#### here is my main cast problem...
ECParams = EQLoad.GetAnalysisParams
>>> ECParams = EQLoad.GetAnalysisParams
>>> dir(ECParams)
['Equals', 'GetHashCode', 'GetType', 'MemberwiseClone', 'ReferenceEquals', 'ToString', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

 

Another clumsy attempt :

 

>>> EQLoad.SetAnalysisParams(ECParams)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Le cast spécifié n'est pas valide.
>>> EQLoad.SetAnalysisParams(ECParams())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cannot create instances of RobotSeismicAnalysis_EC8_General_Params because it is abstract
>>> ECParams.Ag = 1.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: static property 'Ag' of 'IRobotSeismicAnalysis_EC8_General_Params' can only be assigned to through a type, not an instance

 

 

To be honest, i don't know in this how to cast it ? Could you help me ?

Thanks for all

Xavier

Message 7 of 26

How did you define EQLoad ?  EQLoad = RobotSimpleCase ?

Message 8 of 26
xroguiez
in reply to: xroguiez

Hi again

 

Anothers attempts of casting :

>>> ECParams = RobotOM.IRobotSeismicAnalysis_EC_8_General_Params(caseEdX.GetAnalysis())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: attribute 'IRobotSeismicAnalysis_EC_8_General_Params' of 'namespace#' object is read-only
>>> ECParams = RobotOM.RobotSeismicAnalysis_EC_8_General_Params(caseEdX.GetAnalysis)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: attribute 'RobotSeismicAnalysis_EC_8_General_Params' of 'namespace#' object is read-only

The thing i don't really understand is the main difference between the two path... for the modal load, it's works :

caseMod = loads.CreateSimple(5, "Modale", 
                                RobotOM.IRobotCaseNature.I_CN_EXPLOATATION ,
                                RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_MODAL)
num_Mod1 = caseMod.Records.New(RobotOM.IRobotLoadRecordType.I_LRT_SPECTRUM_VALUE) #a valider
#loadRec = caseMod.Records.Get(num_Mod) #pas utile ici on l'applique au projet
modParams = caseMod.GetAnalysisParams()
modParams.Mode = RobotOM.IRobotModalAnalysisMode.I_MAM_MODAL
modParams.ModesCount = 50
modParams.Damping = 5e-2
...
caseMod.SetAnalysisParams(modParams)

These commands worked in Robot for the modal analysis and not for the seismic analysis

 

Xavier

Message 9 of 26

Hello

Like this ?

EQLoad = structure.Cases.CreateSimple(6, "Ed+X", 
                                    RobotOM.IRobotCaseNature.I_CN_SEISMIC ,
                         RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_SEISMIC)

Is it right ?

Xavier

Message 10 of 26
xroguiez
in reply to: xroguiez

Hi

I've used the following shortcuts

robApp.Project.New(RobotOM.IRobotProjectType.I_PT_SHELL)

project = robApp.Project
## IRobotStructure

structure = project.Structure  #IRobotStructure
Message 11 of 26

Before answer to other post

Code fail ↓

 

 

ECParams = EQLoad.GetAnalysisParams

 

 

3 possible reasons :

- EcParams not defined as IRobotSeismicAnalysis_EC_8_General_Params type

- EqLoad not defined as a RobotSimpleCase type

 

 

EQLoad = RobotSimpleCase
EQLoad = structure.Cases.CreateSimple(6, "Ed+X", 
                         RobotOM.IRobotCaseNature.I_CN_SEISMIC ,
                         RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_SEISMIC)

 

 

- Try also

ECParams = EQLoad.GetAnalysisParams()

try to set preferences by SetActiveCode function as explain by cris.bac

 

there is also a remarks by Rafal Gaweda in your link

aaa = RCase.GetSeismicCode ' this is check only line, for EC codes there is no name returned here

'RobotSeismicAnalysis_EC_8_Params refers to ENV 1998-1-1:1994 DAN francaise, which is currently unused - if you are interested I can tell you how to enable this unused code

 

Best regards

 

Message 12 of 26

Hello

Thanks again for your help

 

If I understand correctly for the first point, it works for me ?

 

>>> ECParams = RobotOM.RobotSeismicAnalysis_EC8_General_Params

 

- EcParams not defined as IRobotSeismicAnalysis_EC_8_General_Params type, it seems to be right ?

 

>>> dir(ECParams)
['Ag', 'B', 'BehaviorFactor', 'Direction', 'DirectionType', 'ExcitationDir', 'Filter', 'ResidualMode', 'S', 'Spectrum', 'Tb', 'Tc', 'Td', '__doc__', '__repr__']

 

- EqLoad not defined as a RobotSimpleCase type, same conclusion ?

 

>>> EQLoad = RobotOM.RobotSimpleCase
>>> dir(EQLoad)
['AnalizeType', 'CreateObjRef', 'Equals', 'GetAnalysisParams', 'GetHashCode', 'GetLifetimeService', 'GetSeismicCode', 'GetType', 'InitializeLifetimeService', 'IsAuxiliary', 'MainMode', 'MemberwiseClone', 'ModesCount', 'Name', 'Nature', 'NatureName', 'Number', 'Records', 'ReferenceEquals', 'SetAnalysisParams', 'SetNatureExt', 'TimeStepCount', 'ToString', 'Type', 'UniqueId', 'UserId', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'label']
>>> EQLoad = structure.Cases.CreateSimple(inumC, "Ed+X",
... RobotOM.IRobotCaseNature.I_CN_SEISMIC ,
... RobotOM.IRobotCaseAnalizeType.I_CAT_DYNAMIC_SEISMIC)
>>> dir(EQLoad)
['AnalizeType', 'CreateObjRef', 'Equals', 'GetAnalysisParams', 'GetHashCode', 'GetLifetimeService', 'GetSeismicCode', 'GetType', 'InitializeLifetimeService', 'IsAuxiliary', 'MainMode', 'MemberwiseClone', 'ModesCount', 'Name', 'Nature', 'NatureName', 'Number', 'Records', 'ReferenceEquals', 'SetAnalysisParams', 'SetNatureExt', 'TimeStepCount', 'ToString', 'Type', 'UniqueId', 'UserId', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'label']

 

-Try Also

Attempt 1 :the structure of ECParams has been deleted

 

>>> ECParams = EQLoad.GetAnalysisParams
>>> dir(ECParams)
['Equals', 'GetHashCode', 'GetType', 'MemberwiseClone', 'ReferenceEquals', 'ToString', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

 

Attempt 2 :the structure of ECParams has also been deleted

 

>>> ECParams = RobotOM.RobotSeismicAnalysis_EC8_General_Params
>>> ECParams = EQLoad.GetAnalysisParams()
>>> dir(ECParams)
['Equals', 'GetHashCode', 'GetType', 'MemberwiseClone', 'ReferenceEquals', 'ToString', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

 

Attempt 3 : the structure of ECParams has also been deleted

 

>>> ECParams = RobotOM.RobotSeismicAnalysis_EC8_General_Params
>>> aaa = EQLoad.GetSeismicCode
>>> ECParams = EQLoad.GetAnalysisParams()
>>> dir(ECParams)
['Equals', 'GetHashCode', 'GetType', 'MemberwiseClone', 'ReferenceEquals', 'ToString', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

 

 

Thanks for all

Xavier

Message 13 of 26

Is that works ? 

could you write the correct integral sequence ?

Attempt 1, 2, 3 not working ? 

Message 14 of 26

Hello

Sorry it doesn't works.

But what do you mean with the integral sequence ? I've posted all the code and the console return

Xavier

Message 15 of 26

yes all code in one thread please to resume because it's hard to follow for @JacquesGaudin, @cool.stuff, @1234eddie, @Rafal.Gaweda, @napooil.

.

Is this conclusion still true? with Python ? 

https://forums.autodesk.com/t5/robot-structural-analysis-forum/api-seismic-case-definition/m-p/33578...

 

 

Message 16 of 26

Hello

 

Sorry for this stream of unstructured information. I put everything in a single script ECM.txt (extension is not accepted). Is it ok ?

 

I'm running the script in IronPython2.7.12 and with Robot 2023. Do you have a solution to set the seismic parameters ?

 

Thanks for all

Xavier

 

 

 

Message 17 of 26
JacquesGaudin
in reply to: xroguiez

With the line below, you can make sure that you are using the right default:

 

Robapp.Project.Preferences.SetActiveCode(I_CT_SEISMIC_LOADS, "EN 1998-1:2004/A1:2013-General")

 

The type of seismic params depends on this setting. If you put this line before defining the seismic load case, you should get the correct type of params.

 

Note: In Python, you need the brackets to call a function. Without brackets, you are referring to the function / method object.

 

Message 18 of 26

To obtain codes numbers and names

 

Preferences = RobotOM.RobotProjectPreferences
Preferences = robApp.Project.Preferences
#Preferences.SetActiveCodeNumber(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS, 000)
#Preferences.SetActiveCode(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS, "XXX")
CodeNumber = Preferences.GetActiveCodeNumber(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS)
      Code = Preferences.GetActiveCode(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS)

 

Table (to be continued) to match seismic codes and Params

 

# Nbr ! Code                                          ! Params
# ----+-----------------------------------------------+-----------------------------
# 136 : "EN 1998-1:2004/A1:2013"                      ! RobotSeismicAnalysis_EC8_Params
# 137 : "EuroCode 8 2003 (General)"                   ! RobotSeismicAnalysis_EC8_General_Params
# 137 : "EN 1998-1:2004/A1:2013-General"              ! RobotSeismicAnalysis_EC8_General_Params
# 148 : "NF EN 1998-1/NA:2007 19.juil.2011"           ! ???
# 162 : "NF EN 1998-1/NA:2013 DÉCEMBRE 2013"          ! ???
# 163 : "NF EN 1998-1/Nice PPR/NA:2007 19 juil. 2011" ! ???
# TBC :                                               ! 

 

Tags (2)
Message 19 of 26

Hi

 

Here are the 2 codes I got

 

>>> preferences = robApp.Project.Preferences
>>> CodeNumber = preferences.GetActiveCodeNumber(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS)
>>> Code = preferences.GetActiveCode(RobotOM.IRobotCodeType.I_CT_SEISMIC_LOADS)
>>> print(CodeNumber, Code)
(162, u'NF EN 1998-1/NA:2013 D\xc9CEMBRE 2013')

 

I was not able to access the objects by trying the 2 methods

>>> EC8 = RobotOM.RobotSeismicAnalysis_EC8_General_Params
>>> EC8.BehaviorFactor = 1.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: static property 'BehaviorFactor' of 'IRobotSeismicAnalysis_EC8_General_Params' can only be assigned to through a type, not an instance
>>> EC8 = RobotOM.RobotSeismicAnalysis_EC8_Params
>>> EC8.BehaviorFactor = 1.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: static property 'BehaviorFactor' of 'IRobotSeismicAnalysis_EC8_Params' can only be assigned to through a type, not an instance

Thanks for any help

Xavier

 

Message 20 of 26

as indicated in the correspondence table, code 162 does not seem to have a functional interface among the three available

 

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Technology Administrators


Autodesk Design & Make Report