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


    该工程为在保存时执行开发的功能,函数入口点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         // 导出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动图展示:

     

  • 相关阅读:
    关于我博客付费专栏:写给粉丝的致歉信
    中位数的题
    排序算法之归并排序
    树莓派编写GPIO驱动程序(详细教程)
    [附源码]Python计算机毕业设计Django校园疫情防范管理系统
    Linux下lt9611调试总结资料分享
    Redis简介
    linux入门---信号的理解
    Postman和Jmeter的区别
    K8S(七):关于Volume,PersistentVolume(PV),persistentVolumeClaim(PVC)
  • 原文地址:https://www.cnblogs.com/huangym1/p/17253411.html