“ 作为一个ABAQUS二次开发者, 肯定少不了批量建立工况名称, Job名称之类的操作, 而从csv以及Excel文件导进来的字符串并不能很好地符合ABAQUS标准, 所以才有了这个小工具的面世。”
01
—
标准化思路
我们先在ABAQUS中随便创建一个不符合命名规定的step, 将报错窗口截图如下:
Names must be 1-38 characters long, may not begin with a number, may not begin or end with space or an underscore, and may not contain double quotes, periods, backward slashes, or non-printable characters.
译文如下:
无效的名称:
名称必须长度为1-38个字符,不能以数字开头,不能以空格或下划线开头或结尾,不能包含双引号、句号、反斜杠或不可打印的字符。
再建立一个不符合要求的Job, 报错如下:
Invalid name:
Names must be 1-80 characters long, may not begin or end with an underscore, and may not begin with a dash, and may not contain double quotes, periods, backward slashes, or non-printable characters or the following characters:......
译文如下:
无效的名称:
名称必须长度为1-38个字符,不能以下划线开头或结尾,不能以破折号开头,不能包含双引号、句号、反斜杠或不可打印字符或以下字符:......
为了简化处理这个问题, 我建议将所有规则做一个并集, 在符合该规则的情况下可以为所有ABAQUS的前处理进行命名.
暂时以这两个为例, 总结一下命名规则:
may not be begin or end with:
数字(0123456789)
空格(" ")
下划线("_")
破折号("-")
may not contain: . $ & * ~ ! ( ) [ ] { } | ; : ' ` " < > ? / \
总长度不超过38
这些不符合规定的字符串, 我们都有转换为符合规定的字符串, 这些不符合规定的字符串大多数都是起着链接的作用, 我找了一圈, 发现加号(+)是一个不错的代替者, 所以我将所有不能使用的字符均代替为"+"
接下来按照惯例, 我们整理一下流程:
输入的变量必须判断类型.
解决中英文符号的问题, 并将多空格转换为单空格.
将may not contain中的字符串全部转为"+".
判断字符串长度是否超过需求, 若超过则截断.
将may not be begin or end with中的字符串转换为"+"
返回结果字符串
02
—
源代码
import re
def standard_str(s, length=20, flag='+'):
"""
为防止出现不标准的名称导致错误, 将所有字符串进行标准化.
该方法应根据已知的ABAQUS命名规则编写, 并在日常使用中进行丰富和扩展.
:return: s
"""
"""
输入的变量必须判断类型
"""
if s is None:
s = ''
elif not isinstance(s, str):
s = str(s.encode("utf-8"))
"""
解决中英文符号的问题, 并将多空格转换为单空格.
"""
# 中英文符号统一
s = s.replace('(', '(').replace(')', ')').replace('【', '[').replace('】', ']'). \
replace(',', ',').replace('。', '.').replace(';', ';').replace('\n', '')
# 多个空格替换为1个空格
s = re.sub(' +', ' ', s)
"""
将may not contain中的字符串全部转为"+".
"""
chars = [".", "$", "&", "*", "~", "!", "(", ")", "[", "]", "{", "}", "|", ";", "'", "\"", "`", "<", ">", "?",
"\\", "/"]
for char in chars:
s = s.replace(char, flag)
"""
判断字符串长度是否超过需求, 若超过则截断.
"""
if len(s) > length:
s = s[:length]
"""
将may not be begin or end with中的字符串转换为"+"
"""
s = re.sub('(^[-_\d ])|([-_\d ]$)', flag, s)
return s.lower()
由于我们并没有将所有的ABAQUS命名规则找出来, 所以该工具以后还可以工具个人的使用情况做升级. 如发现新的may not contain则在charts里面添加, 如发现新的may not be begin or end with则更改第48行的正则表达式.