NX二次开发:保存时导出PDF并打开
阅读原文时间:2023年07月09日阅读:2

该工程为在保存时执行开发的功能,函数入口点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
3 #include
4 #include
5 #include
6
7 // Internal+External Includes
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #include
20
21 #include
22 #include
23 #include
24 #include
25
26 // Std C++ Includes
27 #include
28 #include
29 #include
30 #include
31 #include
32 #include
33 #include
34 #include
35
36 #include
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 sheets1(1);
85 NXOpen::Drawings::DrawingSheet *drawingSheet1(dynamic_cast(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动图展示:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章