该工程为在保存时执行开发的功能,函数入口点ufput。其他还有新建、打开、另存等都可以加入开发的操作,具体看UF_EXIT下的介绍。

用户出口是一个可选特性,允许你在NX中某些预定义的位置(或出口)自动运行Open C API程序。如果你进入其中一个出口,NX会检查你是否定义了指向Open C API程序位置的指针。如果定义了指针,NX将运行Open C API程序。指针是一个环境变量。

注意:

一定要设置环境变量指向自己生成的DLL。例如:USER_FILE=E:\workspace\Infore\tcnx_project\application\tcnx_project.dll

  1 // Mandatory UF Includes
2 #include <uf.h>
3 #include <uf_object_types.h>
4 #include <uf_draw.h>
5 #include <uf_part.h>
6
7 // Internal+External Includes
8 #include <NXOpen/Annotations.hxx>
9 #include <NXOpen/Assemblies_Component.hxx>
10 #include <NXOpen/Assemblies_ComponentAssembly.hxx>
11 #include <NXOpen/Body.hxx>
12 #include <NXOpen/BodyCollection.hxx>
13 #include <NXOpen/Face.hxx>
14 #include <NXOpen/Line.hxx>
15 #include <NXOpen/NXException.hxx>
16 #include <NXOpen/NXObject.hxx>
17 #include <NXOpen/Part.hxx>
18 #include <NXOpen/PartCollection.hxx>
19 #include <NXOpen/Session.hxx>
20
21 #include <NXOpen/PrintPDFBuilder.hxx>
22 #include <NXOpen/PlotManager.hxx>
23 #include <NXOpen/Drawings_DrawingSheet.hxx>
24 #include <NXOpen/NXObjectManager.hxx>
25
26 // Std C++ Includes
27 #include <iostream>
28 #include <sstream>
29 #include <vector>
30 #include <string>
31 #include <algorithm>
32 #include <tchar.h>
33 #include <atlconv.h>
34 #include <shellapi.h>
35
36 #include <windows.h>
37 #undef CreateDialog
38 #pragma comment(lib,"shell32.lib")
39
40 using namespace NXOpen;
41 using std::string;
42 using std::exception;
43 using std::stringstream;
44 using std::endl;
45 using std::cout;
46 using std::cerr;
47
48
49 //------------------------------------------------------------------------------
50 // Unload Handler
51 //------------------------------------------------------------------------------
52 extern "C" DllExport int ufusr_ask_unload()
53 {
54 return (int)NXOpen::Session::LibraryUnloadOptionImmediately;// 调试用
55 //return (int)NXOpen::Session::LibraryUnloadOptionAtTermination;// 程序发布用
56 //return (int)NXOpen::Session::LibraryUnloadOptionExplicitly;
57 }
58
59 int exportDwg2PDF(double &xDimension, double &yDimension, std::string &waterRemark, tag_t &sheetTAG, std::string &exportPath, bool appendStatus)
60 {
61 try{
62 if (xDimension < 200 || yDimension < 200 || sheetTAG == NULL_TAG || exportPath.empty() == true)
63 return -1;
64
65 NXOpen::Session *theSession = NXOpen::Session::GetSession();
66 NXOpen::Part *workPart(theSession->Parts()->Work());
67 NXOpen::Part *displayPart(theSession->Parts()->Display());
68 NXOpen::PrintPDFBuilder *printPDFBuilder1;
69 printPDFBuilder1 = workPart->PlotManager()->CreatePrintPdfbuilder();
70
71 printPDFBuilder1->SetScale(1.0);
72 printPDFBuilder1->SetSize(NXOpen::PrintPDFBuilder::SizeOptionScaleFactor);
73 printPDFBuilder1->SetOutputText(NXOpen::PrintPDFBuilder::OutputTextOptionPolylines);
74 printPDFBuilder1->SetXDimension(xDimension);
75 printPDFBuilder1->SetYDimension(yDimension);
76 printPDFBuilder1->SetColors(NXOpen::PrintPDFBuilder::ColorBlackOnWhite);
77 printPDFBuilder1->SetWidths(NXOpen::PrintPDFBuilder::WidthCustomThreeWidths);
78 printPDFBuilder1->SetRasterImages(true);
79 printPDFBuilder1->SetImageResolution(NXOpen::PrintPDFBuilder::ImageResolutionOptionHigh);
80 printPDFBuilder1->SetAddWatermark(true);
81 printPDFBuilder1->SetWatermark(waterRemark.c_str());
82 printPDFBuilder1->SetAppend(appendStatus);
83
84 std::vector<NXOpen::NXObject *> sheets1(1);
85 NXOpen::Drawings::DrawingSheet *drawingSheet1(dynamic_cast<NXOpen::Drawings::DrawingSheet *>(NXOpen::NXObjectManager::Get(sheetTAG)));
86 sheets1[0] = drawingSheet1;
87 printPDFBuilder1->SourceBuilder()->SetSheets(sheets1);
88 printPDFBuilder1->SetFilename(exportPath);
89
90 NXOpen::NXObject *nXObject1;
91 nXObject1 = printPDFBuilder1->Commit();
92 printPDFBuilder1->Destroy();
93 return 0;
94 }
95 catch (const exception& e2){
96 UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
97 throw;
98 }
99 }
100
101 int getSheetInfos()
102 {
103 // 获取显示部件及图纸信息
104 int _errCode = 0;
105 tag_t dispTAG = UF_PART_ask_display_part();
106 char part_fspec[MAX_FSPEC_BUFSIZE] = { 0 };
107 if (_errCode = UF_PART_ask_part_name(dispTAG, part_fspec) != 0) return _errCode;
108
109 std::string strPartName(part_fspec);
110 transform(strPartName.begin(), strPartName.end(), strPartName.begin(), ::tolower);
111 if (strPartName.find("dwg") == string::npos) return -1;
112
113 int num_draws = 0;
114 tag_t *drawTAGs = nullptr;
115 if (_errCode = UF_DRAW_ask_drawings(&num_draws, &drawTAGs) != 0)
116 return _errCode;
117
118 string export_path = strPartName.substr(0, strPartName.find_last_of("."));
119 for (int idx = 0; idx < num_draws; idx++){
120 // 导出PDF
121 UF_DRAW_info_t drawInfos;
122 _errCode = UF_DRAW_ask_drawing_info(drawTAGs[0], &drawInfos);
123 double xDimension = drawInfos.size.custom_size[0];
124 double yDimension = drawInfos.size.custom_size[1];
125 _errCode = exportDwg2PDF(xDimension, yDimension, string("huangym1\r\n2023-03-25"), drawTAGs[idx], export_path + ".pdf", false);
126 string tempStr(export_path + ".pdf");
127
128 // 打开PDF
129 USES_CONVERSION;
130 const WCHAR * cLineChar = A2W(tempStr.c_str());
131
132 SHELLEXECUTEINFO sei;
133 ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空
134 sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似
135 sei.lpFile = cLineChar;
136 sei.nShow = SW_SHOW;
137 sei.lpVerb = _T("open");
138 BOOL bResult = ShellExecuteEx(&sei);
139 if (bResult)//执行成功
140 {
141 if (sei.hProcess)//指定 SEE_MASK_NOCLOSEPROCESS 并其成功执行,则 hProcess 将会返回执行成功的进程句柄
142 WaitForSingleObject(sei.hProcess, INFINITE);//等待执行完毕
143 }
144 }
145 if (drawTAGs){
146 UF_free(drawTAGs);
147 drawTAGs = nullptr;
148 }
149 return _errCode;
150 }
151
152 //========================
153 // 保存操作入口点函数
154 //========================
155 extern "C" DllExport void ufput()
156 {
157 try{
158 if (UF_initialize()) return;
159
160 getSheetInfos();
161
162 UF_terminate();
163 }
164 catch (const NXException& e1)
165 {
166 UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
167 }
168 catch (const exception& e2)
169 {
170 UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
171 }
172 catch (...)
173 {
174 UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
175 }
176 }

GIF动图展示:

NX二次开发:保存时导出PDF并打开的更多相关文章

  1. NX二次开发-NXOPEN工程图导出CAD图纸DxfdwgCreator *dxfdwgCreator1;

    没有什么可以看的,NXOPEN直接录制一下导出CAD就可以了.录制出来自己挑需要的代码拿过来改一下. NX9+VS2012 #include <NXOpen/Part.hxx> #incl ...

  2. NX二次开发-UFUN将工程图转成CGM和PDF文件UF_CGM_export_cgm

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  3. NX二次开发-UFUN获取NX系统默认导出CGM的选项设置UF_CGM_ask_default_export_options

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  4. NX二次开发-UFUN获取当前导出CGM选项设置UF_CGM_ask_session_export_options

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  5. NX二次开发-UFUN修改当前导出CGM文件选项设置UF_CGM_set_session_export_options

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  6. C#进行Visio二次开发之文件导出及另存Web页面

    在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过 ...

  7. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条

    半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...

  8. 【NX二次开发】按层查找工作部件中的对象 UF_LAYER_cycle_by_layer

    第一次调用 :返回第一个启用层中的第一个对象. 第二次调用 :返回下一个已启用层中的下一个对象. 最后一次调用:当所有对象都被耗尽时,将返回object_tag = NULL_TAG. 在循环数据库时 ...

  9. 【NX二次开发】查找部件中的对象 UF_OBJ_cycle_objs_in_part

    返回所有层上指定类型部件中的所有对象,不管它们的当前显示状态如何.这个例程不返回表达式.指定对象.临时(系统创建的)对象或休眠对象.休眠对象指的是从模型中删除的对象例如,如果你混合了一条边,那么这条边 ...

  10. 【NX二次开发】大开眼界,DLL还可以这么调!

    NX二次开发应用程序有交互式.批处理和远程3中模式.交互模式的应用程序(.dll)在NX界面环境下运行.dll以动态链接库的方式被加载到NX的进程空间中.dll可以通过下列几种方式执行. 1.直接激活 ...

随机推荐

  1. 多线程—ThreadLocal

    一.ThreadLocal的含义 线程的变量副本(就像命名一样),每个线程隔离. 二.ThreadLocal的结构 每个Thread都有自己的ThreadLocalMap,ThreadLocalMap ...

  2. luogu 4886

    点分治好题 统计距离正常点分治统计即可,我们只需考虑何时达到最优 有两种情况: 第一:代价最大的询问两个端点在不同的两个子树中 因为这种情况下,无论根向那个子树移动都会等价地增加到达另一个端点的代价, ...

  3. egg框架学习笔记

    1.安装 npm i egg-init -g egg-init egg-example --type=simple cd egg-example yarn install npm run dev // ...

  4. Django基础篇 06-Django模板过滤器Filter和标签Tags

    一.Django模板的内置过滤器Filter 什么是模板(Template)? Django的Template是如何工作的 Django的模板是静态的html文件,它只决定了一个页面的样式或外观.它需 ...

  5. VMWare安装CentOS 7系统 & 操作系统优化

    1.准备工作 (1)VMWare 14:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.1.1-7 ...

  6. Centos8 中安装GitLab

    Centos8 中安装GitLab 1,安装依赖 yum install -y curl policycoreutils-python openssh-server centos8没有policyco ...

  7. 估计人数【最小路径重复点覆盖】【直接在(i,j)建一个新点】

    估计人数 题意 思路 用最少的人,走完这几条线.最小重复路径点覆盖问题 建图之后,跑一下二分图. 考虑建图:图中'1'连着完下.或者右走.我们把图中所有的1编号,然后建图,然后floly,然后匈牙利. ...

  8. 安卓手机qpython使用感觉

    我是写C#的,最佳一时兴起,下载了个qpython来玩儿,发现这东西写点简单的爬虫还行,配合sqlite,可以做一些简单的事情,于是乎想写一个有趣的东西,在qpython写一个脚本,去收蚂蚁森林的能量 ...

  9. .net Core5.0使用IdentityServer4 进行权限控制

    .net Core5.0使用IdentityServer4 进行权限控制 IdentityServer4  ASP.NET Core的一个包含OpenID Connect和OAuth 2.0协议的框架 ...

  10. Cross Site Scripting DOM (XSS) 攻击jQuery append() 的处理方法

    做安全红线使用Fortify工具进行扫描时,jquery append会报Cross Site Scripting DOM风险.解决该问题有两种办法. 一.原生dom方式 使用JavaScript原生 ...