[UG 二次开发 python] 导出BOM表(包含图片)
只导出最底层的零件,零件的属性已经设置好,零件的截图生成后,放在零件的同一个文件夹下
用到了 xlsxwriter
# nx: threaded
# 导出BOM表
__version__ = "0.0.1"
__author__ = "unmht"
__blog__ = "https://www.cnblogs.com/unm001/"
from dataclasses import dataclass
from typing import Dict, List
import os
import NXOpen
import NXOpen.BlockStyler
import NXOpen.UF
import xlsxwriter
import NXOpen.Assemblies
from support import msgError
os.chdir(os.path.dirname(os.path.abspath(__file__)))
def getImgPath(p: NXOpen.Part):
path = os.path.dirname(p.FullPath)
name = p.Name
return os.path.join(path, f"{name}.jpg")
@dataclass
class itm:
p文件名称: str
p图号: str = ""
p名称: str = ""
p数量: int = 0
p材料: str = ""
p规格: str = ""
p备注: str = ""
p图片: str = ""
@classmethod
def _props(cls):
return ["文件名称"] + [i[1:] for i in cls.__dict__ if not i.startswith("_")]
def findallchild(
ss: NXOpen.Session,
ps: NXOpen.PartCollection,
rtcom: NXOpen.Assemblies.Component,
names: List[str],
items: Dict[str, itm],
):
coms = rtcom.GetChildren()
if len(coms) > 0:
for i in coms:
chcoms = i.GetChildren()
if len(chcoms) > 0:
findallchild(ss, ps, i, names, items)
else:
iname = i.Name
ipart = ps.FindObject(iname)
if iname not in names:
names.append(iname)
items[iname] = itm(iname)
items[iname].p数量 += 1
pic = getImgPath(ipart)
items[iname].p图片 = pic
try:
items[iname].p图号 = ipart.GetUserAttribute(
"图号", NXOpen.NXObjectAttributeType.String, -3
).StringValue
except:
pass
try:
items[iname].p名称 = ipart.GetUserAttribute(
"名称", NXOpen.NXObjectAttributeType.String, -3
).StringValue
except:
pass
try:
items[iname].p材料 = ipart.GetUserAttribute(
"材料", NXOpen.NXObjectAttributeType.String, -3
).StringValue
except:
pass
try:
items[iname].p规格 = ipart.GetUserAttribute(
"规格", NXOpen.NXObjectAttributeType.String, -3
).StringValue
except:
pass
try:
items[iname].p备注 = ipart.GetUserAttribute(
"备注", NXOpen.NXObjectAttributeType.String, -3
).StringValue
except:
pass
def main(fpath):
try:
theSession = NXOpen.Session.GetSession()
work = theSession.Parts.Work
ps = theSession.Parts
com = work.ComponentAssembly.RootComponent
if com is not None:
names = []
items: Dict[str, itm] = {}
findallchild(theSession, ps, com, names, items)
# fpath = "d://bom.xlsx"
if os.path.exists(fpath):
os.remove(fpath)
f = xlsxwriter.Workbook(fpath)
ws1 = f.add_worksheet("bom")
tts = itm._props()
parm = {"x_scale": 0.05, "y_scale": 0.05}
for i in range(len(tts)):
ws1.write(0, i, tts[i])
for i in range(len(names)):
iname = names[i]
iitm = items[iname]
ws1.write(i + 1, 0, iitm.p文件名称)
ws1.write(i + 1, 1, iitm.p图号)
ws1.write(i + 1, 2, iitm.p名称)
ws1.write(i + 1, 3, iitm.p数量)
ws1.write(i + 1, 4, iitm.p材料)
ws1.write(i + 1, 5, iitm.p规格)
ws1.write(i + 1, 6, iitm.p备注)
if iitm.p图片 != "" and os.path.exists(iitm.p图片):
ws1.insert_image(i + 1, 7, iitm.p图片, parm)
f.close()
# info(f.filename)
except Exception as e:
msgError(e)
if __name__ == "__main__":
xlsxPath = os.path.join(os.getcwd(), "bom.xlsx")
main(xlsxPath)
if os.path.exists(xlsxPath):
os.system(xlsxPath)
[UG 二次开发 python] 导出BOM表(包含图片)的更多相关文章
- AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层
AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层 AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层我理解的图层的作用大概是把 ...
- php导出word(可包含图片)
为大家介绍一个 php 生成 导出word(可包含图片)的代码,有需要的朋友可以参考下. 之前介绍过php生成word的例子,只是不能包含图片与链接. 今天 为大家介绍一个 php 生成 导出word ...
- 【转】Jenkins 二次开发 - Python
马克,备用: Jenkins 二次开发 https://testerhome.com/topics/14988?locale=zh-TW python-jenkins api 文档:https://p ...
- UG二次开发-CAM-获取修改路径参数
项目中要获取路径参数,网上大多是C++的例子,而本项目是用C#写的,探索了下,记录下. 以获取某条路径的刀具号为例,其他参数依此类推. using System; using System.Colle ...
- 导出BOM表
1.Report->Bill of Materials for Project 将Value拖上左上角的Grouped Columns 2.在Excel表中全选器件,右键设置"设置单元 ...
- NX二次开发-NXOPEN导出STEP Step214Creator *step214Creator1;
没有什么可以看的,NXOPEN直接录制一下导出STEP就可以了.录制出来自己挑需要的代码拿过来改一下. NX9+VS2012 #include <NXOpen/Part.hxx> #inc ...
- 【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data
获取blockUI 体收集器选择的体,导出x_t: std::vector<TaggedObject*>objects = bodySelect0->GetSelectedObjec ...
- 【UG二次开发】获取系统信息UF_ask_system_info
获取系统信息可以使用这个函数UF_ask_system_info 下面是例子: 1 extern DllExport void ufsta(char *param, int *returnCode, ...
- UG二次开发-CAM-执行方式
以C#开发为例,通常先用[操作记录]功能录制关键代码,得到一个.cs文件. (1)可以直接使用[播放操作记录]的方式执行该.cs文件. (2)可以建立一个C#的类库工程,将上述.cs文件加载进去,添加 ...
- NX二次开发 批量导出X_T(包括部件里的装配体)
VS2019 NX1946 UF_initialize(); string filepath = strDir + "\\";//拼接路径 //获取图层过滤 PropertyLis ...
随机推荐
- VMware之系统复制
目录 功能描述 复制centos7-1文件夹 载入复制的系统 设置配置 启动系统 修改网卡配置 刷新配置 测试上网 功能描述 复制已经安装好的centOs7.6 复制centos7-1文件夹 1.系统 ...
- Lua热更学习--使用toLua中的协程
[6] C#访问调table类中的成员变量和函数 访问table中的变量和函数 lua中可以使用table作为class,因此对table中的函数访问调用是必要的根据前面对table访问和functi ...
- Java面试题:线程池内“闹情绪”的线程,怎么办?
在Java中,线程池中工作线程出现异常的时候,默认会把异常往外抛,同时这个工作线程会因为异常而销毁,我们需要自己去处理对应的异常,异常处理的方法有几种: 在传递的任务中去处理异常,对于每个提交到线程池 ...
- C语言:如何删除在可视化网页中未可见的内容(网页txt)
我这个代码仅仅限制于在chrome浏览器中下载china daliy的网页中实现删除可视化内容,因为每个网页的超链接或者文本主内容分布不一样,但是学会了删除一个网页类型的不可视化内容之后,修改其他网页 ...
- EasyUI框架Datagrid(数据表格)的实现,以及Datagrid的分页显示(详解)
在前端页面中使用EasyUI框架时,通常会使用EasyUI自带的datagrid(数据表格)样式,下面我们对datagrid样式进行简单的介绍,并且会对datagrid的分页显示进行详细的介绍. Ea ...
- golang http client 长连接vs短连接基准测试
package main import ( "io/ioutil" "net/http" "strings" "testing&q ...
- Android 13 - Media框架(28)- MediaCodec(三)
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们了解到 ACodec 执行完 start 流程后,会把所有的 input buffer 都提交给 MediaCodec 层,MediaCo ...
- 机器学习策略篇:详解理解人的表现(Understanding human-level performance)
理解人的表现 人类水平表现这个词在论文里经常随意使用,但现在告诉这个词更准确的定义,特别是使用人类水平表现这个词的定义,可以帮助推动机器学习项目的进展.还记得上个博客中,用过这个词"人类水平 ...
- js布尔类型
<!-- 禁用 --> <input type="text" disabled> <!-- 只读 --> & ...
- kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战
1.MQTT介绍 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,设计用于连接低带宽.高延迟或不可靠网络的设备. MQTT 是基于发布 ...