Как рефереру найти список / кортеж в скрипте abaqus python - PullRequest
0 голосов
/ 24 ноября 2018

Для abaqus я пишу скрипт, который использует точки из разных файлов для создания структуры.Чтобы создать набор в abaqus, используется команда findAt. * ​​1001 *

    db.models['Model-1'].parts['Part-1'].Set(edges=
mdb.models['Model-1'].parts['Part-1'].edges.findAt(tensionList), name='Tension')

tensionList:

    tensionList = [([0.75, 1.25, 0.0], ()), ([0.25, 0.75, 0.0], ()), ([0.75, 0.25, 0.0], ()), ([0.5, 2.0, 0.0], ()), ([0.0, 1.5, 0.0], ()), ([0.25, 1.75, 0.0], ()), ([1.0, 1.5, 0.0], ())]

При запуске этого скрипта в abaqus возникает следующая ошибка:

"TypeError: arg1; слишком много аргументов; ожидается 1, получено 7"

Однако при удалении внешних скобок [] изtensionList и размещении его непосредственно в скрипте скрипт работает:

    mdb.models['Model-1'].parts['Part-1'].Set(edges=
mdb.models['Model-1'].parts['Part-1'].edges.findAt(([0.75, 1.25, 0.0], ()), ([0.25, 0.75, 0.0], ()), ([0.75, 0.25, 0.0], ()), ([0.5, 2.0, 0.0], ()), ([0.0, 1.5, 0.0], ()), ([0.25, 1.75, 0.0], ()), ([1.0, 1.5, 0.0], ())), name='Tension')        

(Script не работает с вставкой всего в сценарии с внешними скобками [], но также возникает та же ошибка, если внешние скобки удаляются вtensionList и ссылаются как в примере 1)

Как я мог решить эту проблему, не имея необходимости копировать прошлое?(процесс будет иметь много итераций и очень длинные списки)

РЕДАКТИРОВАТЬ: Решено с помощью обходного пути с краевыми индексами (все еще интересно, как это можно было бы решить с помощью findAt)

    index =0
    while index < (len(compressiveMembersIndex)+len(tensileMembersIndex)):
         mdb.models['Model-1'].parts['Part-1'].Set(edges=
              mdb.models['Model-1'].parts['Part-1'].edges[index:index+1], 
              name=aSetCreating[index])
         index +=1

1 Ответ

0 голосов
/ 05 декабря 2018

Я думаю, что у вас есть дополнительный набор скобок в нескольких местах ... Мой код ниже работает для меня в показанном формате, это принимает входные данные как один x, y, z.

findAt((x, y, z),)

Возможный обходной путь для вас может состоять в том, чтобы составить список координат xyz и ссылаться на список, используя findAt, используя цикл?

x=[1,2,3]
y=[4,5,6]
z[7,8,9]
edgeslist=[]
numedges=5
    for i in xrange(numedges)
        edgeslist.append( findAt((x[i], y[i], z[i]),) )

В качестве альтернативы, если ваши ребра лежат на удобном пути, вы всегда можетеиспользуйте findAt, чтобы получить одно ребро, затем используйте getEdgesByEdgeAngle (...)

...