最近在后台收到读者来信,这位朋友想在
SCDM
中识别圆柱孔,然后使用填充工具批量填充,他编写了如下图所示的代码,但是代码执行过程中出现问题,执行出错。
上面问题简单概括起来有如下三个方面,也是后台咨询最多的问题,非常具备代表性:
(
1
)如何在
Python
中正确地创建循环操作?
(
2
)在
SCDM
中如何循环遍历得到几何对象?
(
3
)如何选择满足特定特征的几何对象?
那么今天小田老师就接着上面三个问题,详细和大家聊聊如何在
SCDM
中正确地循环遍历。
首先,我们需要明确
Python
中
for
循环和
C
、
C#
、
Java
语言中的
for
是不一样的,它功能类似
foreach
:即遍历给定可迭代对象中的每一个元素。
所以,遍历的对象要是可迭代的
(
实现
__iter__
方法
)
,我们常见的列表
(list)
,字典
(dict)
、集合
(set)
、元组
(tuple)
等数据结构都是可迭代对象。同样,
SCDM
中几何对象
(body, face, edge)
都是可迭代的对象,详细查看《
SCDM
二次开发系列:
Doc
对象详解
》。
然后,对应上面问题
的
代码中,直接遍历一个不可迭代的整形
(int)变量是错误的
,在
Python
中需要通过
range(int)
生成可迭代的对象,所以上面代码可以改成:
但是上面代码更像
C
语言、
C#
等中的写法,通过列表的索引访问元素,不够
Pythonic
;更
Python
的写法如下:
从上面代码我们可以发现,通过简单粗暴的双重循环就可以得到所有面;
在
Python
中还有一种更简单的方式获取,也就是列表推导式,一行代码就能搞定,而且相比直接双重循环速度更快,代码如下:
如果,你有翻看过SCDM的开发文档,会发现所有的Doc对象都有一个如下方法:
所以,访问得到根目录下的所有的子孙面,采用内置的
API
方法可以这么写:
现在,我们知道如何遍历获得所有几何对象,那么该如何获取满足特定特征的对象呢?
这就需要配合
if判断
语句,简要概括下代码框架:循环遍历
(for)
---->
判断特征(if)
----->
引用对象。
接下来,我们针对上面的第
3
个问题,演示如何获得小于
8mm
的圆柱孔,然后批量填充操作,代码如下:
![981d1b2025d65b7c23bba6ff50e16592.png](https://img-blog.csdnimg.cn/img_convert/981d1b2025d65b7c23bba6ff50e16592.png)
![66c26e51d28ea830747a7a51188e80cf.png](https://img-blog.csdnimg.cn/img_convert/66c26e51d28ea830747a7a51188e80cf.png)
![11025fd47b74ea1bbbf826d22dfa6439.png](https://img-blog.csdnimg.cn/img_convert/11025fd47b74ea1bbbf826d22dfa6439.png)
![636bc9d6c07edd596c0c70ab3b2eb519.png](https://img-blog.csdnimg.cn/img_convert/636bc9d6c07edd596c0c70ab3b2eb519.png)
![cf7621a05342bde4cce7e7ad02316712.png](https://img-blog.csdnimg.cn/img_convert/cf7621a05342bde4cce7e7ad02316712.png)
![e5ae75d6b4b954b8c04584e794a51c74.png](https://img-blog.csdnimg.cn/img_convert/e5ae75d6b4b954b8c04584e794a51c74.png)
![d4d8efdc1d92165ff24d7ca74233f8b5.png](https://img-blog.csdnimg.cn/img_convert/d4d8efdc1d92165ff24d7ca74233f8b5.png)
但是,上面的方法在存在很多几何面的几何中,运行效率不够高效,这时候可以通过智能选择(PowerSelection)功能,直接查找满足特征的几何对象,会让脚本代码更高效,详细参考《SCDM二次开发系列:智能选择》,代码如下:
以上,就是本期的所有内容,关于如何在SCDM中进行循环遍历,你学会了吗?欢迎大家留言参与讨论。
点击,立即学习《Python语言在ANSYS的应用52讲》,掌握SCDM脚本建模及ANSYS二次开发能力。