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的更改.
