该工程为在保存时执行开发的功能,函数入口点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. CF960G

    首先我们考虑$n$的情况,显然以$n$为分界线可以将整个序列分成两部分,就像这样: . 那么我们考虑:在这个东西前面才会有前缀最大的统计,在这个东西后面才会有后缀最大的统计 这样就剩下了$n-1$个元 ...

  2. LeetCode系列之 (JavaScript) => 88. 合并两个有序数组

    题目描述: [Leetcode 题目链接]:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com) 解题思路分析: 在nums1中找到nums2 插入的位置,然后在 ...

  3. Xcode常用&开发常用

    p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...

  4. opencv实战之透视变换

    import cv2 import numpy as np import pytesseract def cv_show(imgname,img): cv2.imshow(imgname,img) c ...

  5. AIGC 至少能在两个方面改变当前的世界-纯银

    互联网圈一个正在形成的共识是,web3 只是金融领域的创新,还没有任何征兆能进入大众社会,但 AIGC 对世界的改变正在眼前发生.AIGC 至少能在两个方面改变当前的世界.1.对于缺乏创造力的(文字) ...

  6. vue+element el-table有关Checkbox的一些功能

    在做项目的时候会碰到一些表格操作的问题其中我归整了一下有关于多选功能的一些记录 一:默认选中其中一行 <el-table class="editTable" :data=&q ...

  7. go的相关包time、os、rand、fmt

    time 1.time包 2.time.Time类型, 用来表示时间 3.取当前时间, now := time.Now() 4.time.Now().Day(),time.Now().Minute() ...

  8. @Conditional注解分析,SpringBoot自动化配置的关键

    基于SpringBoot 2.1.5.RELEASE分析 @Conditional系列注解 @Conditional系列注解是SpringBoot自动化配置的核心要点之一,主要用于设定条件,在达到一定 ...

  9. thymeleaf依赖

    <!--thymeleaf模板--> <dependency> <groupId>org.thymeleaf</groupId> <artifac ...

  10. 正则爬取'豆瓣之乘风破浪的姐姐'的并存入excel文档

    import requests import re import pandas as pd def parse_page(url): headers = { 'User-Agent':'Mozilla ...