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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |