Crear vigas personalizadas en Autodesk Robot usando Python nodes in Dynamo

Crear vigas personalizadas en Autodesk Robot usando Python nodes in Dynamo

Anonymous
No aplicable
1.296 Vistas
9 Respuestas
Mensaje 1 de 10

Crear vigas personalizadas en Autodesk Robot usando Python nodes in Dynamo

Anonymous
No aplicable

Hola, buenos dias, gracias por crear este foro dado que necesito saber si me pueden ayudar con una aplic...

 

Necesito crear tipos de vigas personalizadas en (Ix, Iy, Mx....) en Autodesk Robot. Sin embargo, necesito crearlas usando la aplicación Dynamo for Robot para despues poder editar mediante un archivo excel su modulo de inercia. El problema es que los nodos existentes en Dynamo for Robot son limitados para esta aplicación. Por ende, habia pensado en usar nodos en Python para crear y editar las secciones. Sin embargo, no tengo experiencia usando este lenguaje de programación. Podrías ayudarme o recomendar una solución al respecto. Quizás algún nodo ya realizado que me ayude a hacer esta aplicación.

0 Me gusta
Soluciones aceptadas (3)
1.297 Vistas
9 Respuestas
Respuestas (9)
Mensaje 2 de 10

EduardoMeruvia
Collaborator
Collaborator
Solución aceptada

Hola @Anonymous, 

 

Creo que vi y respondi a tu post en el forum Ingles, pero paso el link de ejemplos en de Robot por Python por aqui tambien. 

 

https://forums.autodesk.com/t5/robot-structural-analysis-forum/how-to-enter-robot-api-through-python...

 

Una sugerencia, viendo que la intencion es editar/crear las propiedades de las vigas (Ix, Iy, Mx, etc) via excel... por que no usar VBA dentro de excel y haci hacer el use de Robot API directamente desde Excel.

Eso te aliviaria leer los datos de excel en Dynamo --> Manipular los Datos en Dynamo --> Crear un Nodo personalisado en Python para luego crear/modificar las vigas en Robot. 

0 Me gusta
Mensaje 3 de 10

Anonymous
No aplicable

Muchas gracias por tu sugerencia, intentaré hacerlo con la solución que me haz recomendado, queria hacerlo mediante programación visual porque mi tesis doctoral trata sobre generar automatización de procesos BIM mediante este tipo de programación. Por ende, queria saber si existía alguna solución en Python. Sin embargo, observando el código del link que me recomendaste, no veo dónde se definen los valores de modulos de inercia, torsionalidad, area u otros valores que se definen en las vigas personalizadas. Por lo que veo los scripts crean secciones principalmente usando nombres de la biblioteca de barras de Robot y de ahí el software les asigna parámetros structurales.

 

Encontré un ejemplo de definir un tipo de support con Python. Pensé que quizás cambiando los argumento hacia la creación de una sección podría generar vigas personalizadas. Por ende, diseñe un script adaptado a ese caso pero me indica un error inesperado de tipo: "unexpected token from". Te envio el script para ver si podrías ayudarme con eso, de verdad te lo agradeceria.

 

# Load the Python Standard and DesignScript Libraries
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# add Robot Structural Analysis API reference
from System import Environment
#get the current user folder i.e C:\Users\<you>\AppData\Roaming
user = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
# add the reference to the interop file shipped with the package
clr.AddReferenceToFileAndPath("C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2022\Dynamo\2.11\Rsa\Package\SAD\bin\RSA"

# add needed import to be able to use Robot Structural Analysis objects
from RobotOM import *
from System import Object

dataEnteringNode = IN
# get input data
# the section name will go to the input[0]
nodeSectionName = IN[0]
# the section name will go to the input[1]
nodeSectionData = IN[1]

# Connect to the running instance of Robot Structural Analysis
application = RobotApplicationClass()
# Get a reference of the current project
project = application.Project
# Get a reference of the current model
structure = project.Structure
# Get a reference of the label server
labels = structure.Labels

# create a new label of type support node with the name passed as parameter
out = labels.Create(IRobotLabelType.I_LT_BAR_SECTION, nodeSectionName)

# assign the section definition to the Robot Structural Analysis object
out.Data.Iy = nodeSectionData[1]

# store the new created label in the open document
labels.Store(out)

# Assign the name to the OUT variable
OUT = out.Name

 

0 Me gusta
Mensaje 4 de 10

EduardoMeruvia
Collaborator
Collaborator
Solución aceptada

@Anonymous, el codigo que te mande en el vinculo era mas para darte la 'inicialisacion' del syntax requerido en la lengua Python con el API de Robot. 

 

Una vez echa la connection con el API de Robot dentro de Python en Dynamo, lo que seguiria es programar los modulos que tu quisiera automizar segun la libreria/servidores del API de robot. 

 

Ejemplo; 

# Los comandos sys y clr son para cargar y vincular las librerias de Robot API en Python dentro de Dynamo
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Incluir la direction fisica de Robot API para conseguir el vinculo
from System import Environment
#get the current user folder i.e C:\Users\<you>\AppData\Roaming
user = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
# add the reference to the interop file shipped with the package
clr.AddReferenceToFileAndPath("C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2022\Dynamo\2.11\Rsa\Package\SAD\bin\RSA"

# Comando para obtener permiso de usar los modulos/elementos de Robot via API
from RobotOM import *
from System import Object

 

Una vez que Robot este cargado/vinculado con Python dentro de Dynamo, entonces puedes luego proseguir en usar el API de Robot dentro de Python pero obivamente usando el Syntax de python. 

 

Mas informacion sobre el API de Robot:

https://forums.autodesk.com/t5/robot-structural-analysis-forum/api-tutorial/td-p/3939601

0 Me gusta
Mensaje 5 de 10

Anonymous
No aplicable

Muchas gracias por tu resumen de funciones, de hecho no sabia la lógica detrás de las primeras lineas de comando. Ahora las entiendo mejor. Seguiré estudiando el uso de la API de robot.

Saludos

0 Me gusta
Mensaje 6 de 10

Anonymous
No aplicable

Hola @EduardoMeruvia , buenos días, espero estés bien. Me gustaría comentarte lo siguiente. He estado diseñando un script en python para crear vigas personalizadas (Ix, Iy, My...). El ejemplo lo extraje de una script similar de un foro de autodesk. Sin embargo, me sale como error el siguiente mensaje:

Construccincivil_0-1654212137094.png

 Si cambio el motor a CPython3 me aparece el siguiente error:

Construccincivil_1-1654212219017.png

 Te adjunto el script porque queria solicitarte si podrías indicarme que estoy haciendo mal, dado que no encuentro muchas respuestas ni en los foros ni en internet. De antemano gracias.

 

# Load the Python Standard and DesignScript Libraries
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# add Robot Structural Analysis API reference
from System import Environment
#get the current user folder i.e C:\Users\<you>\AppData\Roaming
user = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
# add the reference to the interop file shipped with the package
clr.AddReferenceToFileAndPath("C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2022\Dynamo\2.11\Rsa\Package\SAD\bin\RSA"

# add needed import to be able to use Robot Structural Analysis objects
from RobotOM import *
from System import Object

# The inputs to this node will be stored as a list in the IN variables

# Define inputs
SectionName = IN[0]
SectionIy = IN[1]
SectionMaterial = IN[2]

# Connect to the running instance of Robot Structural Analysis
application = RobotApplicationClass()
project = application.Project
structure = project.Structure
labels = structure.Labels
ProjectsPrefs = project.Preferences
bars = structure.Bars

# Create user-defined section
 lab_serv = IRobotLabelServer
 lab_serv = labels
 sec = IRobotLabel
 sec = lab_serv.create(IRobotLabelType.I_LT_BAR_SECTION, SectionName)
 data = sec.data
 data.Type = IRobotBarSectionType.I_BST_STANDARD
 data.ShapeType = IRobotBarSectionType.I_BSST_UNKNOWN
 nonst_data = IRobotBarSectionNonstdData
 nonst_data = data.CreateNonstd(0)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AX, 0)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AY, 0)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AZ, 0)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IX, 1)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IY, SectionIy)
 nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IZ, 2)
 data.MaterialName = SectionMaterial
 data.CalcNonstdGeometry()
 lab_serv.Store(sec)
 
# Assign the name to the OUT variable
OUT = ok

0 Me gusta
Mensaje 7 de 10

EduardoMeruvia
Collaborator
Collaborator
Solución aceptada

@Anonymous, CPython 3 es otra version diferente al IronPython (Python 2), por hecho el syntax del lenguaje no es identico y varia lo suficiente que codigo hecho en IronPython mas probably no funcionara en CPython 3. Mi recomendacion aqui es de mantener todo en IronPython si estas trabajando con Robot, ya que Autodesk aun no saco la documentacion actualizada de Robot con CPython 3 (estarias trabajando a lo ciego por decir si empiezas/continuas con Cpython 3). 

 

En respecto al los errores que salen, corregi los errorers

 

 

import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('DSCoreNodes')

clr.AddReferenceToFileAndPath(r"C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2022\Exe\Interop.RobotOM.dll")
from RobotOM import *

dataEnteringNode = IN

SectionName = IN[0]
Sectionly = IN[1]
SectionMaterial = IN[2]

robapp = RobotApplicationClass()
rproject = robapp.Project

rproject.New(IRobotProjectType.I_PT_SHELL)

rstructure = rproject.Structure
rlabelserver = rstructure.Labels
rselectionfactory = rstructure.Selections
rloadcaseserver = rstructure.Cases

sectionlabel = rlabelserver.Create(IRobotLabelType.I_LT_BAR_SECTION, SectionName)
sectionlabeldata = sectionlabel.Data
datatype = IRobotBarSectionType.I_BST_STANDARD
sectiontype = IRobotBarSectionType.I_BSST_UNKNOWN

rlabelserver.Store(sectionlabel)
nonst_data = IRobotBarSectionNonstdData
nonst_data = sectionlabeldata.CreateNonstd(0)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AX, 0)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AY, 0)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_AZ, 0)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IX, 1)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IY, SectionIy)
nonst_data.SetValue(IRobotBarSectionNonstdDataValuedata.I_BSDV_IZ, 2)
data.MaterialName = SectionMaterial

rlabelserver.Store(sectionlabel)

OUT = SectionName, SectionIy, SectionMaterial

 

0 Me gusta
Mensaje 8 de 10

Anonymous
No aplicable

Estimado @Anonymous Meruvia:

Muchisimas gracias por tu increible ayuda en serio, acabas de salvar mi 3 articulo y mi tesis. Quería preguntarte si no molestaría que colocará tu nombre entre los agradecimientos o referenciarte en el posterior paper colocando algún trabajo tuyo que hayas publicado.

 

Recibi la respuesta durante la madrugada así que durante el día estaré usando la solución corregida que me entregaste, de verdad te lo agradesco mucho. Seguiré tomando cursos de Python de ahora en adelante.

 

Saludos cordiales

0 Me gusta
Mensaje 9 de 10

EduardoMeruvia
Collaborator
Collaborator

@Anonymous, de nada y no hay lio, puedes colocar mi nomber (mismo nombre de usuario) 👍.

Lamentablemente no tengo trabajos publicados en el dominio de Dynamo o Robot en sentido academico, pero tengo varias publicaciones de respuesta en este forum, no se si eso podrioa servirte. 

 

Saludos

0 Me gusta
Mensaje 10 de 10

Anonymous
No aplicable

Estimado @EduardoMeruvia:

Buenas días

Espero que te encuentres bien

Estuve usando el script que corregiste en el último mensaje en mi pc, pero Dynamo indicaba que existian ciertos errores. No te preocupes eran más que nada relacionados a usar funciones más actuales descritas en el manual de la API 2021 de Autodesk Robot. Por ende, he corregido un poco el script para que el nodo de Dynamo ya no estuviera en color amarillo. La sección personalizada (AX, IX, IY....) se logra crear, pero los valores de modulo de inercia y tipo de material no son llevados a la interfaz de definición del perfil en el software autodesk Robot, al chequear la interfaz, estos valores aún aparecen en 0. A pesar que en el script, estos valores son definidos con valores distinto a cero.

 

Podrías indicarme por favor dónde podría estar el error, he estado practicando cada vez, pero aún soy novato en saber que podría estar mal. 

 

Te ajdjunto imagen que muestra el algoritmo de programación visual existente hasta ahora:

Construccincivil_0-1654568272469.png

 

La siguiente imagen muestra como se crea la sección con nombre "S3", pero los valores de modulo de inercia aparecen en cero. Además, asigna como material predeterminado el aluminio, cuando en el script se especifica que sea de acero (BS, BSST).

Construccincivil_1-1654568373904.png

 

Finalmente, te adjunto el script de python actualmente usado.

 

import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('DSCoreNodes')

clr.AddReferenceToFileAndPath(r"C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2022\Exe\Interop.RobotOM.dll")
from RobotOM import *

dataEnteringNode = IN

SectionName = IN[0]
SectionIy = IN[1]
SectionMaterial = IN[2]

robapp = RobotApplicationClass()
rproject = robapp.Project
rstructure = rproject.Structure
rlabelserver = rstructure.Labels
rselectionfactory = rstructure.Selections
rloadcaseserver = rstructure.Cases

sectionlabel = rlabelserver.Create(IRobotLabelType.I_LT_BAR_SECTION, SectionName)
sectionlabeldata = sectionlabel.Data
datatype = IRobotBarSectionType.I_BST_STANDARD
sectiontype = IRobotBarSectionShapeType.I_BSST_UNKNOWN

rlabelserver.Store(sectionlabel)
nonst_data = IRobotBarSectionNonstdDataValue
nonst_data = sectionlabeldata.CreateNonstd(0)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_AX, 0)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_AY, 0)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_AZ, 0)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_IX, 1)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_IY, SectionIy)
nonst_data.SetValue(IRobotBarSectionDataValue.I_BSDV_IZ, 2)
MaterialName = SectionMaterial

rlabelserver.Store(sectionlabel)

OUT = SectionName, SectionIy, SectionMaterial

 

 

De antemano muchas gracias por tu contribución.

Saludos cordiales

 

0 Me gusta