该工程为在保存时执行开发的功能,函数入口点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 <string> 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         // 导出PDF121         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         // 打开PDF129         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 }