文章目录
基于Python的UG二次开发入门
1 二次开发环境搭建
环境配置:
- NX12.0
- Python3.6.1
- Pycharm2023
1.1 安装UG
去微信公众号搜“软件安装管家”,在软件目录中找到UG12.0安装教程,一步步跟着安装就行,这里不多赘述。
1.2 安装Pycharm
下载地址:PyCharm: the Python IDE for Professional Developers by JetBrains。
网上关于Pycharm的安装教程也比较丰富,这里同样省略。
1.3 环境配置
-
获取NX对应的python版本。
访问NX安装路径下的
NXBIN
目录,找到python的动态库文件,右键属性->详细信息,获取对应的python版本,我的电脑中版本为python3.6.1。
-
运行Anaconda Prompt,新建python虚拟环境。conda create -n NXOpen_env python=3.6.1
失败了,找不到python3.6.1的包。
-
换一种方法,去python官网下载python3.6.1并安装。
下载地址:Python Release Python 3.6.1 | Python.org。一般选择下载Windows x86-64 executable installer。
-
新建三个系统环境变量。变量值UGII_BASE_DIRG:\NX12
(此处为UG安装目录)UGII_NXBIN_DIR%UGII_BASE_DIR%\NXBINUGII_ROOT_DIR%UGII_BASE_DIR%\UGII -
新建并运行bat脚本。
新建
NX_start_Pycharm.bat
文件(在任何地方新建都行),复制下面代码:rem the nx installation dir. if there are spaces in the path, it needs to be quoted like here - quotes around the whole equation SET UGII_BASE_DIR=G:\NX12 rem these two are not used by nx, just for setting the path SET UGII_ROOT_DIR=%UGII_BASE_DIR%\UGII SET UGII_NXBIN_DIR=%UGII_BASE_DIR%\NXBIN rem the installed python interpreter, version 3.6 for nx12 SET PYTHON=G:\MSTIFIY\local\Python\Python36 SET INTERPRETER=%PYTHON%;%PYTHON%\DLLs;%PYTHON%\Lib;%PYTHON%\Lib\site-packages SET PYTHONPATH=%INTERPRETER%;%UGII_BASE_DIR%\nxbin\python SET PATH=%PATH%;%UGII_NXBIN_DIR%;%UGII_ROOT_DIR% start "" "G:\MSTIFIY\software\pycharm\PyCharm Community Edition 2023.2.1\bin\pycharm64.exe"
这个脚本的作用为添加了一系列环境变量,并启动了pycharm。
其中需要修改的变量UGII_BASE_DIR(UG的安装目录)、PYTHON(Python的安装目录)以及最后pycharmd的启动路径。
1.4 测试
新建test.py,内容如下:
import NXOpen
session=NXOpen.Session.GetSession()
lw=session.ListingWindow
lw.Open()
lw.WriteLine('Hello World')
保存后,打开UG,Alt+F8
打开操作记录管理器,浏览选中test.py,接着点击管道通路运行脚本,结果如下:
2 NX Open介绍
NX Open是UG提供的一个API,可供用户编程自定义或者拓展UG。二次开发最直观的优势便是可以加速一些重复性的任务,提升工作效率。下面是NX Open提供的一些功能:
- 创建几何零件、装配体、工程图、CAE\CAM对象;
- 遍历零件文件中的各种对象,读取其信息或对其执行各种操作;
- 创建允许用户选择对象和输入数据的UI。
2.1 基础架构
NX 对象类的继承关系树如下:
2.1.1 Sessions and Parts
一般我们需要访问UG当前session中的零件时,需要进行下面的初始化。
import NXOpen
import NXOpen_UF
session = NXOpen.Session.GetSession() # 得到当前的NX session
parts = session.Parts # 得到属于该session的PartCollection
workPart = parts.Work # 得到工作零件
displayPart = parts.Display # 得到显示零件
ufSession = NXOpen_UF.UFSession.GetUFSession() # 得到UF session
Display = session.DisplayManager # 得到显示管理器对象
UI = NXOpen.UI.GetUI() # 得到UI对象
其中workPart即是当前工作零件。
2.1.2 Objects and Tags
NXOpen_UF模块中集成了大量有用的函数(这些函数在NXOpen中没有),为了使用这些函数,我们需要用到对象的标签(tags)。大致调用流程如下:
coord = [1.5, 2.5, 7.0]
pointTag = ufSession.Curve.CreatePoint(coord)
ufSession.Obj.SetLayer(pointTag, 30)
可以把tag对象理解为obj对象的id号,在NXOpen_UF模块中我们通过使用tag对象调用各种函数。在上面的例子中,CreatePoint函数返回的应该是一个Point对象,但此处返回的是一个tag对象,即NXOpen_UF的函数中obj对象的输入输出全部使用其对应的tag。我们通过调用NXOpen模块中的方法可实现相同的效果:
coordPt = NXOpen.Point3d(1.5, 2.5, 7.0)
myPoint = workPart.Points.CreatePoint(coordPt)
myPoint.Layer = 30
另外,tag和obj之间可以相互转化:
myPoint = workPart.Points.CreatePoint(coordPt)
pointTag = myPoint.Tag # obj->tag
ufSession.Obj.SetLayer(pointTag, 30)
关于tag到obj的转化,需要用到NXOpen.Utilitiess.NXObjectManager对象,但是在官网提供的API Reference中没有找到,所以怀疑没有这方面的接口,还有可能改名了?
2.1.3 Factory Objects(工厂对象)
在NX Open中,对象一般不通过构造函数生成,二是使用一些“工厂”。使用“工厂”对象新建对象的流程如下:
coordPt = NXOpen.Point3d(1.5, 2.5, 7.0) # 点坐标
pointFactory = workPart.Points # 得到工作零件的点集PointCollection(工厂对象)
p1 = pointFactory.CreatePoint(coordPt) # 创建点对象
工厂对象可以从NXOpen.Part
或者NXOpen.Session
对象中获取。
在上述例子中,变量pointFactory对类型为PointCollection
,一般名字中带collection
的对象我们都可以对其进行遍历,可以把它看作一个集合。
for pt in pointFactory:
pass
2.1.4 Builder Objects(生成器对象)
我们使用工厂对象能创建一些简单对象,当创建对象变得复杂(表现为需要大量输入参数)时,我们一般先创建一个Builder对象,然后借助其生成我们需要的对象。流程如下:
mySphereBuilder = workPart.Features.CreateSphereBuilder(Features.Sphere.Null) # 新建特征生成器
mySphereBuilder.Type = Features.SphereBuilder.Types.CenterPointAndDiameter
mySphereBuilder.CenterPoint = workPart.Points.CreatePoint(NXOpen.Point3d(1.5, 2.5, 7.0))
mySphereBuilder.Diameter.RightHandSide = "10.0"
mySphereBuilder.BooleanOption.Type = NXOpen_GeometricUtilities.BooleanOperation.BooleanType.Create
myObject = mySphereBuilder.CommitFeature() # 提交特征
mySphereBuilder.Destroy()
CreateSphereBuilder函数传入NULL对象时新建一个Sphere对象的生成器,否则在返回输入Sphere对象的生成器,即修改原对象。仔细观察发现,生成器对应于UG软件中的属性设置对话框。
2.1.5 导出NX Open脚本
在开发人员导航栏中,可以通过点击录制和停止录制,将用户的操作导出为python程序脚本。
2.2 位置, 向量和点
2.2.1 Point3d
Point3d对象表示一个在3D空间中的位置(坐标)。注意Point3d不是一个NX对象,只存在于NX Open程序中,程序结束后其内存将会销毁。
Point3d(x: float, y: float, z: float)
Point3d对象具有三个属性X、Y、Z,对应坐标的三个分量。(Vector3d类似)
2.2.2 Vector3d
Vector3d对象表示一个在3D空间中的方向或位移。和Point3d一样不是NX对象。
Vector3d(x: float, y: float, z: float)
目前NX Open在python环境中Vector3d不支持一般的向量运算。
2.2.3 Points
Point对象是一个NX对象,可通过工厂对象(PointCollection)创建。创建流程如下:
coord = NXOpen.Point3d(3., 5., 0.) # Define coordinates of point
p1 = workPart.Points.CreatePoint(coord) # Create the point
p1.SetVisibility(NXOpen.SmartObject.VisibilityOption.Visible) # Make it visible
NXOpen.Point对象派生自SmartObject对象,默认是不可见的,所以需要设置可见性。创建一个点的精简写法:
p1 = NXOpen.Session.GetSession.Parts.Work.Points.CreatePoint(NXOpen.Point3d(3., 5., 0.)) # Create the point
2.3 更多内容
入门部分差不多讲完了,后面主要是针对性地学习。学习推荐官方文档。
3 参考资料
[1] Getting Started with SNAP (siemens.com)
[2] NXOpen Python Reference Guide — NXOpen Python API Reference 12.0.0 documentation (siemens.com)