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.py
      

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM