NX二次开发:保存时导出PDF并打开

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

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

注意:

一定要设置环境变量指向自己生成的DLL。例如:USER_FILE=E:workspaceInforetcnx_projectapplicationtcnx_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("huangym1rn2023-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并打开

 

发表评论

相关文章