vscode 使用 python 进行 UG 二次开发的 实现代码提示功能

用 VSCODE 进行 UG 二次开发的时候, 想要用代码提示的时候,可以用 pydev 插件, 但是,pydev 只有一个月的试用期,那到用 pylance 可不可以有相似的效果吗?

答案是可以。

方法是 自己生成 NXOpen.pyi 文件。


自已写了一段代码,用于简单的生成 这个 文件。

  • 先运行这个代码,生成 NXOpen 文件夹,
  • 再把这个文件夹移动到 NXBIN/python目录下。


__version__ = "0.0.4"
__author__ = "unmht"
from typing import Dict, Generator, List, Optional
import NXOpen
import types
import os
import re
from importlib import import_module ugii_base_dir = os.getenv("UGII_BASE_DIR") pp = os.path.join(str(ugii_base_dir), "nxbin", "python") imp_mds = {}
for root, dirs, files in os.walk(pp, topdown=True): if root != pp:
break for ff in files:
# print(ff)
if str(ff).startswith("NXOpen_") and str(ff).endswith(".pyd"):
module_name = str(ff)[:-4]
# print(module_name)
try:
ms = module_name.split("_")[-1]
imp_mds[ms] = import_module(module_name)
except Exception as e:
print("error:", module_name, e) class pyibase: ecpts = [
"NXObject",
"TaggedObject",
"INXObject",
] def __init__(self) -> None:
self.name: str = ""
self.doc: Optional[str] = ""
self.chdmdls: Dict = {}
self.chdtps: Dict = {}
self.MdDescriptor: Dict = {}
self.GSDescriptor: Dict = {}
self.unct: Dict = {}
self.nxc: Dict[str, "nxoClsAliasType | pyibase"] = {}
self.mthdorbutin: Dict = {}
self.mberDescriptor: Dict = {} self.tpsinvoke: Dict[str, List] = {}
self.nn: List[str] = [] def dcts(self) -> Generator["pyibase", None, None]:
for dc in [
self.chdmdls,
self.chdtps,
self.MdDescriptor,
self.GSDescriptor,
self.unct,
self.nxc,
self.mthdorbutin,
self.mberDescriptor,
]:
for v in dc.values():
yield v def addmember(self, m, dm: List[str] = None): dirm = dir(m)
if dm is not None:
dirm = [i for i in dirm if i not in dm]
for i in dirm:
if i == "GetSession":
print(i)
if not i.startswith("_"):
att = getattr(m, i)
self.nn.append(i)
if isinstance(att, types.ModuleType):
self.chdmdls[i] = nxoModuleType(att)
elif isinstance(att, type):
if i != att.__name__:
self.tpsinvoke[i] = [att.__module__, att.__name__]
elif i not in pyibase.ecpts:
self.chdtps[i] = nxoType(att)
elif isinstance(att, types.MethodDescriptorType):
self.MdDescriptor[i] = nxoMethodDescriptorType(att)
elif isinstance(att, types.GetSetDescriptorType):
self.GSDescriptor[i] = nxoGetSetDescriptorType(att)
elif isinstance(att, types.MemberDescriptorType):
self.mberDescriptor[i] = nxoMemberDescriptorType(att)
else:
_md = att.__class__.__module__
if "NXOpen" in str(_md):
self.nxc[i] = nxoClsAliasType(att, i)
elif i == "ValueOf":
self.mthdorbutin[i] = nxoBuiltinFunctionType(att)
elif isinstance(att, types.BuiltinFunctionType):
self.mthdorbutin[i] = nxoBuiltinFunctionType(
att, cname=self.name
)
else:
assert TypeError(i, att, type(att)) def docs(self, lv: int = 0, mx: int = 130):
dd = str(self.doc)
dd = dd.strip()
dd2 = dd.splitlines()
dd2 = [i.strip() for i in dd2] ll = mx - lv * 4
yield (lv + 1) * "\t" + "'''"
yield (lv + 1) * "\t" + f"### {self.__class__.__name__}" for i in dd2:
for k in range(0, len(i), ll):
yield (lv + 1) * "\t" + i[k : min(len(i), k + ll)]
yield (lv + 1) * "\t" + "'''" def toStr(self, lv: int = 0, mx: int = 130):
yield lv * "\t" + f"{self.name}:-->" class nxoModuleType(pyibase):
def __init__(self, m: types.ModuleType) -> None:
super().__init__()
assert isinstance(m, types.ModuleType)
self.doc = m.__doc__
self.name = m.__name__.split(".")[-1] self.addmember(m) def toStr(self, lv: int = 0, mx: int = 130):
yield lv * "\t" + f"class {self.name}:"
for i in self.docs(lv):
yield i
for dc in self.dcts():
for i in dc.toStr(lv + 1):
yield i
for i, v in self.tpsinvoke.items():
_a = ".".join(v)
yield "\t" + f"{i}={_a}" class basetps(pyibase):
def __init__(self, m: type, name="") -> None:
super().__init__()
assert name in pyibase.ecpts
self.name = name
self.doc = m.__doc__
self.mo = type.mro(m)
self.addmember(m) def toStr(self, lv=0, mx=130):
if self.name in ["TaggedObject", "INXObject"]:
yield lv * "\t" + f"class {self.name}(object):"
elif self.name == "NXObject":
yield lv * "\t" + f"class {self.name}(NXOpen.TaggedObject,NXOpen.INXObject):"
else:
yield lv * "\t" + f"class {self.name}(object):"
for i in self.docs(lv):
yield i
for v in self.dcts():
for ss in v.toStr(lv + 1):
yield ss
for i, v in self.tpsinvoke.items():
_a = ".".join(v)
yield lv * "\t" + "\t" + f"{i}={_a}" class nxoType(pyibase):
def __init__(self, m: type) -> None:
super().__init__()
assert isinstance(m, type)
self.doc = m.__doc__
self.name = m.__name__
self.mo = type.mro(m)
self.sp = self.mo[1]
ll = []
for k in self.mo[1:]:
for s in dir(k):
if not s.startswith("_"):
ll.append(s)
self.addmember(m, ll) def toStr(self, lv=0, mx=130): yield lv * "\t" + f"class {self.name}({str(self.sp)[8:-2]}):"
for i in self.docs(lv):
yield i for v in self.dcts():
for i in v.toStr(lv + 1):
yield i
for i, v in self.tpsinvoke.items():
_a = ".".join(v)
yield lv * "\t" + "\t" + f"{i}={_a}" pt1 = r":returns:[ \S]*[\n]?\s*:rtype: :py:class:`([\S]+)`"
p1 = re.compile(pt1)
pt2 = r":returns:[ \S]*[\n]?\s*:rtype: list of :py:class:`([\S]+)`"
p2 = re.compile(pt2)
pt3 = r":returns:[ \S]*[\n]?\s*:rtype: ([\S]+)"
p3 = re.compile(pt3)
pt4 = r":returns:[ \S]*[\n]?\s*:rtype: list of ([\S]+)"
p4 = re.compile(pt4) def findrtype(ss: str):
rtp = ""
r = p1.search(ss)
if r is not None:
rtp = r.groups()[0]
if rtp == "":
r = p2.search(ss)
if r is not None:
rtp = f"List[{r.groups()[0]}]"
if rtp == "":
r = p3.search(ss)
if r is not None:
rtp = r.groups()[0]
if rtp not in ["int", "str", "float", "bool"]:
rtp = ""
if rtp == "":
r = p4.search(ss)
if r is not None:
rtp = r.groups()[0]
if rtp not in ["int", "str", "float", "bool"]:
rtp = ""
else:
rtp = f"List[{rtp}]"
return rtp class nxoMethodDescriptorType(pyibase):
def __init__(self, m: types.MethodDescriptorType) -> None:
super().__init__()
assert isinstance(m, types.MethodDescriptorType)
self.doc = m.__doc__
self.name = m.__name__ def toStr(self, lv: int = 0, mx: int = 130):
rtp = findrtype(str(self.doc)) if rtp == "":
rr = ""
else:
rr = f"->{rtp}"
if self.name == "Dispose":
yield lv * "\t" + f"def {self.name}(self){rr}:"
else:
yield lv * "\t" + f"def {self.name}(self,*args,**kw){rr}:"
for i in self.docs(lv):
yield i
yield lv * "\t" + "\t" + "..." class nxoGetSetDescriptorType(pyibase):
def __init__(self, m: types.GetSetDescriptorType) -> None:
super().__init__()
assert isinstance(m, types.GetSetDescriptorType)
self.doc = m.__doc__
self.name = m.__name__ def toStr(self, lv: int = 0, mx: int = 130):
rtp = findrtype(str(self.doc)) yield lv * "\t" + f"@property"
if rtp == "":
yield lv * "\t" + f"def {self.name}(self):"
else:
yield lv * "\t" + f"def {self.name}(self)->{rtp}:"
for i in self.docs(lv):
yield i
yield lv * "\t" + "\t" + "..." yield lv * "\t" + f"@{self.name}.setter"
if rtp == "":
yield lv * "\t" + f"def {self.name}(self,value):..."
else:
yield lv * "\t" + f"def {self.name}(self,value:{rtp}):..."
yield "" class nxoMemberDescriptorType(pyibase):
def __init__(self, m: types.MemberDescriptorType) -> None:
super().__init__()
assert isinstance(m, types.MemberDescriptorType)
self.doc = m.__doc__
self.name = m.__name__
self._tp = type(m).__name__ def toStr(self, lv: int = 0, mx: int = 130):
yield lv * "\t" + f"{self.name}:{self._tp}=..."
for i in self.docs(lv):
yield i class nxoBuiltinFunctionType(pyibase):
def __init__(
self, m: "types.MemberDescriptorType |types.BuiltinMethodType", cname=""
) -> None:
super().__init__()
assert isinstance(m, types.BuiltinFunctionType) and isinstance(
m, types.BuiltinMethodType
)
self.doc = m.__doc__
self.name = m.__name__
self.cname = cname def toStr(self, lv: int = 0, mx: int = 130):
rtp = findrtype(str(self.doc))
yield lv * "\t" + f"@classmethod"
if self.name == "ValueOf":
yield lv * "\t" + f"def {self.name}(cls,value:int):"
elif rtp != "":
yield lv * "\t" + f"def {self.name}(cls,*args,**kw)->{rtp}:"
elif self.cname != "" and self.name == "Get" + self.cname:
if hasattr(NXOpen, self.cname):
yield lv * "\t" + f"def {self.name}(cls,*args,**kw)->NXOpen.{self.cname}:"
else:
yield lv * "\t" + f"def {self.name}(cls,*args,**kw)->{self.cname}:"
else:
yield lv * "\t" + f"def {self.name}(cls,*args,**kw):"
for i in self.docs(lv):
yield i
yield lv * "\t" + "\t" + "..." class nxoClsAliasType(pyibase):
def __init__(self, m, name="") -> None:
super().__init__()
_md = m.__class__.__module__
assert "NXOpen" in str(_md)
self.doc = m.__doc__
self.name = m.__name__ if hasattr(m, "__name__") else name
self.attp = str(m.__class__.__name__)
self.body = m def toStr(self, lv=0, mx=130):
nn = self.attp
if hasattr(NXOpen, nn):
att = getattr(NXOpen, nn)
if isinstance(att, type):
nn = f"NXOpen.{nn}"
else:
nn = self.body.__class__.__module__ + "." + self.body.__class__.__name__
if self.name == "KeyPerformanceInterface":
print(self.name, f"{self.name}:{nn}=...")
yield lv * "\t" + f"{self.name}:{nn}=..."
for i in self.docs(lv - 1):
yield i class mainModules(pyibase):
def __init__(
self,
) -> None:
super().__init__()
m = NXOpen
self.doc = m.__doc__
self.name = m.__name__
self.addmember(m)
for i in pyibase.ecpts:
self.chdtps[i] = basetps(getattr(NXOpen, i), i)
for k, v in imp_mds.items():
self.chdmdls[k] = nxoModuleType(v) def pyi(self):
mm = self
if not os.path.exists("./NXOpen/"):
os.mkdir("./NXOpen") if not os.path.exists("./NXOpen/clss/"):
os.mkdir("./NXOpen/clss/") p11 = "./NXOpen/"
p22 = os.path.join(p11, "clss/") with open(os.path.join(p11, "__init__.py"), "w", encoding="utf8") as f:
m: nxoModuleType
for v in mm.chdmdls.values():
m = v
mn = m.name.split(".")[-1]
mName = mn + ".pyi"
with open(os.path.join(p11, mName), "w") as f2:
f2.write("import NXOpen\n")
f2.write("from typing import List\n")
for _s in m.toStr():
f2.write(_s + "\n") f.write(f"from .{mn} import {mn} as {mn}" + "\n")
f.write(f"from ._nxopen import *\n") with open(os.path.join(p11, "_nxopen.pyi"), "w", encoding="utf8") as f2:
m2: nxoType
f2.write("import NXOpen\n")
f2.write("from typing import List\n") for k, v in mm.chdtps.items():
m2 = v
nn = m2.name
f2.write(f"from .clss.{nn} import {nn} as {nn}" + "\n")
with open(
os.path.join(p22, f"{nn}.pyi"), "w", encoding="utf8"
) as f3:
f3.write("import NXOpen\n")
f3.write("from typing import List\n")
for _s in m2.toStr():
f3.write(f"{_s}\n") if __name__ == "__main__": def main():
mainModules().pyi() main()

vscode 使用 python 进行 UG 二次开发 实现代码提示功能的更多相关文章

  1. SkylineDemoForWeb JavaScript二次开发示例代码

    SkylineDemoForWeb JavaScript二次开发示例代码 http://files.cnblogs.com/files/yitianhe/SkylineDemoForWeb.zip

  2. Python什么是二次开发的意义?python在.net项目采用

    任何人都知道python在.net该项目是做什么的啊? 辅助用途,用作"二次开发"..net站点的话python主要是CGI才用.能够用python编写B/S程序. 解释一下二次开 ...

  3. Autocad中使用命令来调用python对Autocad二次开发打包后的exe程序

    在Autocad中直接调用Python二次开发程序是有必要的,下面介绍一种方法来实现这个功能: 其基本思路是:先将二次开发的程序打包为可执行程序exe,然后编写lsp文件,该文件写入调用exe程序的语 ...

  4. destoon二次开发基础代码

    标签调用规则 http://help.destoon.com/develop/22.html 数据字典 http://help.destoon.com/dict.php destoon各类调用汇总 h ...

  5. AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)

    /* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ----------------------------------------------- ...

  6. python之saltstack二次开发

    一.salt的概念 salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行).一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选 ...

  7. UG二次开发-CAM-获取修改路径参数

    项目中要获取路径参数,网上大多是C++的例子,而本项目是用C#写的,探索了下,记录下. 以获取某条路径的刀具号为例,其他参数依此类推. using System; using System.Colle ...

  8. 【UG二次开发】获取系统信息UF_ask_system_info

    获取系统信息可以使用这个函数UF_ask_system_info 下面是例子: 1 extern DllExport void ufsta(char *param, int *returnCode, ...

  9. UG二次开发-CAM-执行方式

    以C#开发为例,通常先用[操作记录]功能录制关键代码,得到一个.cs文件. (1)可以直接使用[播放操作记录]的方式执行该.cs文件. (2)可以建立一个C#的类库工程,将上述.cs文件加载进去,添加 ...

  10. 【UG二次开发】 UF_OBJ_ask_name 获取对象名字

    代码 char name[256]; UF_OBJ_ask_name(objTag, name);

随机推荐

  1. 如何基于surging跨网关跨语言进行缓存降级

    概述 surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解 ...

  2. C#.Net筑基-基础知识

    01.C#基础概念 1.1.C#简介 C# (读作C Sharp)是由微软公司开发的一种面向对象.类型安全.高效且简单的编程语言,最初于 2000 年发布,并随后成为 .NET 框架的一部分.所以学习 ...

  3. C数据结构线性表:实现顺序表的增删改查&完整篇

    文章目录 ①前言 顺序表结构体的定义 ②初始化顺序表 ③插入新的元素 插入的时候需要特别注意的几点 ④删除元素 第一个删除元素功能实现 第二个删除元素功能实现 对代码下面中**i- -**的说明(第二 ...

  4. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(12.A)- uSDHC eMMC启动时间(RT1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 uSDHC eMMC启动时间. 本篇是 i.MXRT1170 启动时间评测第五弹,前四篇分别给大家评测了 ...

  5. 撤销 git commit

    目录 文章目录 目录 场景1:撤回 commit,不撤销 git add .,保留代码 场景2:撤回 commit,撤销 git add .,保留代码 场景3:撤销 commit,撤销 git add ...

  6. OpenStack 的 SR-IOV 虚拟机热迁移

    目录 文章目录 目录 前言列表 前言 SR-IOV Pass-through 虚拟机热迁移的问题 基于 macvtap 层的 SR-IOV 虚拟机热迁移 Workaround SR-IOV Pass- ...

  7. CodePen 的国内替代「笔.COOL」,一个功能完备、使用便捷的在线HTML/CSS/JS编辑器和作品分享平台

    笔.COOL,是一个最近在国内崭露头角的在线HTML/CSS/JS编辑器和作品分享平台. 笔.COOL 提供了一个在线的 HTML.CSS 和 JavaScript 代码编辑器.无需任何安装,你只需打 ...

  8. 带你深入领略 Proxy 的世界

    Proxy 是 es2015 标准规范加入的语法,很可能你只是听说过,但并没有用过,毕竟考虑到兼容的问题,不能轻易地使用 Proxy 特性. 但现在随着各个浏览器的更新迭代,Proxy 的支持度也越来 ...

  9. C#简易商城收银系统v1.0(2-1)

    C#简易商城收银系统v1.0(2-1) 当初: 面向编程对象的好处及应用简单工厂模式(继承,多态) 现在: 制作一个简易的收银窗体应用程序 可以参考之前的 计算器 随笔 创建窗体程序 客户端代码 us ...

  10. ALL IN AI | 第六届金蝶云·苍穹追光者开发大赛正式启动报名!

    2024年5月,第六届金蝶云·苍穹追光者开发大赛x第十三届"中国软件杯"金蝶赛道正式启动报名! 当下,人工智能正以其空前的速度.广度和深度,引领着新一轮科技革命和产业变革,重塑着经 ...