UG二次开发 PYTHON 环境配置
NX 二次开发 PYTHON VSCODE 环境配置
我电脑上装的是WIN11 NX1988
- 
在电脑的UG的安装文件夹内找到 python 
 一般在 xx\NXBIN
 在所在的文件夹内,运行python 可以找到版本信息。
- 
在电脑上装版本高度相同的 python 
 包括大版本和小版本
- 
在UGii 文件夹下,找到 ugii_env.dat 用记事本打开 
 配置python的库的路径 (这个可以参考唐老师的文章 )
 UGII_PYTHONPATH=...
 注意:可以在电脑的环境变量里设置,但优先级没有在这里设置高。
- 
在vscode里,装上 pydev插件。- 设置 forcedBuiltins
 
 "python.pydev.forcedBuiltins": [
 "NXOpen",
 "NXOpen.ALP",
 "NXOpen.AME",
 "NXOpen.AnimationDesigner",
 "NXOpen.Annotations",
 "NXOpen.Appearance",
 "NXOpen.Assemblies",
 "NXOpen.AutomatedTesting",
 "NXOpen.AutomatedTestingCase",
 "NXOpen.BlockStyler",
 "NXOpen.BodyDes",
 "NXOpen.CableRouter",
 ...
 ]
 
 
- 
在VSCODE 里 实现代码补全和代码提示。(22.06.24 更新) 
 传送门
- 
小技巧 - 
在一个地方建一个文件夹,history history/ |- bmps/ |- dlx/ | |- zzz.dlx | |- zzz.py |- spt/ | |- __init__.py | |- yyy.py |- xxx.pyxxx.py 就是自己定义的命令 
 bmps 文件夹存放命令图标
 dlx 文件夹存放用户定义ui块
 spt 方件夹 用于存放自定义的一些常用函数
- 
在xxx.py 文件中, import os os.chdir(os.path.dirname(os.path.abspath(__file__)))这样,把工作目录更改到 history, 再 from spt import yyy 就不会找不到。 
- 
dlx文件夹中, 把 zzz.py打开, def __init__(self): try: self.theSession = NXOpen.Session.GetSession() self.theUI = NXOpen.UI.GetUI() self.theDlxFileName = "./dlx/zzz.dlx" ...原文是 self.theDlxFileName = "zzz.dlx", 加上./dlx/
 这样,在xxx.py 中,from dlx.zzz import zzz as _zzz可以正常工作 
- 
在xxx.py中, class zzz(_zzz): ...重载原来的 apply_cb(self)等函数,实现自己想要的功能。
- 
在xxx.py中,把zzz.py的一部分 复制过来 def main(): ... if __name__ == "__main__": main()加到文件最后 
- 
在UG 中新建用户命令,引用xxx.py,就可以执行了。 
- 
在spt文件夹里,加一个printer.py class Printer: theSession = None lw = None def __init__(self, session): self.theSession = session self.lw = self.theSession.ListingWindow self.lineLength = 130 def info(self, obj): if self.lw is None: self.lw = self.theSession.ListingWindow s = str(obj) l = len(s) if not self.lw.IsOpen: self.lw.Open() for i in range(l // self.lineLength + 1): self.lw.WriteLine( s[i * self.lineLength : i * self.lineLength + self.lineLength] )在 xxx.py中 from spt.printer import Printer info=Printer(NXOpen.Session.GetSession()).info可以用 info(xxx)打印一些提示信息。
 
- 
测试
/support/_base.py
import NXOpen
def gets():
    return NXOpen.Session.GetSession()
/support/_print.py
class Printer:
    theSession = None
    lw = None
    def __init__(self, session):
        self.theSession = session
        self.lw = self.theSession.ListingWindow
        self.lineLength = 130
    def info(self, obj):
        if self.lw is None:
            self.lw = self.theSession.ListingWindow
        s = str(obj)
        l = len(s)
        if not self.lw.IsOpen:
            self.lw.Open()
        for i in range(l // self.lineLength + 1):
            self.lw.WriteLine(
                s[i * self.lineLength : i * self.lineLength + self.lineLength]
            )
/suport/__init__.py
from ._printer import Printer
from ._base import gets
info = Printer(gets()).info
__all__ = ["info", "gets"]
sysinfo.py
# nx: threaded
# NX 1988
import sys
from support import info, gets
import os
import numpy as np
from PIL import Image as ig
import math
def main():
    info(sys.version)
    for i in sys.path:
        info(i)
    info(f"work dir: {os.getcwd()}")
    info(f"-->I will change the work dir.<--")
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    info(f"work dir: {os.getcwd()}")
    info(f"")
    info(f"--> test numpy   .<--")
    ar = np.array([i for i in range(12)], dtype=np.uint8)
    ar = np.reshape(ar, (3, 4))
    info(ar)
    info(ar.shape)
    info(ar.dtype)
    info(f"")
    info(f"--> session      .<--")
    info(gets())
    info(f"")
    info(f"--> test plt     .<--")
    img = np.zeros((300, 400), dtype=np.uint8)
    r = 50
    x0 = 150
    y0 = 200
    for i in range(-r, r + 1, 1):
        yx = round(math.sqrt(r * r - i * i))
        img[(x0 + i, y0 - yx)] = 255
        img[(x0 + i, y0 + yx)] = 255
        img[(x0 + i + yx, y0 + i)] = 255
        img[(x0 + i - yx, y0 + i)] = 255
    im = ig.fromarray(img)
    im.show()
if __name__ == "__main__":
    main()

22.03.31
后续
后来我又在另一台电脑上配置环境,在import numpy 时总是卡住,又仔细研究了下,发现了一些之前没注意的要点.
- ug里的python 是 python发行版的 embed 包. 它添加了一些 ug NXOpen 的 .pyd的包.如果在大版本相同的情况下,
 是可以用小版本不同的包来替换的.比如,3.8.8 改成3.8.10
- nxbin/python 目录内有一个 sitecostomize.py 的文件, 他内部定义了一个 加载器, 用于加载 NXOpen_XXX.pyd包.
 这是运用了python的加载机制.如果在另外的python.exe 要加载NXOpen相关的包时,要把这个文件复制过去.
- 如果用 nxbin/python 里的 python.exe 来做为执行器,那么要从网上下载get-pip.py,他会给这个加上pip的功能.(注意相关的环境变量的设置).
 同时,有一个python38._pth的文件,要把 #import site的 "#" 给取消了.这样在外部调用时,不会报错,同时,自动加载sitecostomize.py.
 如果要对sys.path有一些操作,可以在nxbin/python内新建一个usercostomize.py,进行必要的操作.
- 如果要加载numpy, 必须在自己写的.py文件第一行,加上"# nx: threaded",不然,import numpy as np时,UG的线程会卡住.
 用这种方式加载的代码,如果叫A.py ,他引用了同级的文件夹B内的BB.py,BB的内容应该是加载到线程中去的.如果改动BB.py而不重启UG
 UG 会忽略BB.py的更改.
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号