#include "connor_cad.h" #include "k_util.h" #include #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include #pragma comment(lib, "ws2_32.lib") #pragma warning(disable:4996) #define ITK_err 919012 #include using namespace std; int ConvertPDF(tag_t rev, tag_t dataset, tag_t relation, const char* dir_path, const char* ref_name, const char* ext, bool remove_file, char* tz_path) { int ifail = ITK_ok; char* object_string = NULL, * object_name = NULL; char* origin_file_name = NULL; char temp_file[SS_MAXPATHLEN] = ""; string pdf_path, pdf_name, out_pdf_path; ITKCALL(ifail = AOM_ask_value_string(dataset, "object_string", &object_string)); Log("开始处理数据集:%s", (object_string)); tag_t spec_dataset_rev = NULLTAG, ref_object = NULLTAG, pdf_dataset = NULLTAG, pdf_dataset_type = NULLTAG, pdf_relation_tag = NULLTAG; AE_reference_type_t reference_type; ITKCALL(ifail = AE_ask_dataset_latest_rev(dataset, &spec_dataset_rev)); ITKCALL(ifail = AE_ask_dataset_named_ref2(spec_dataset_rev, ref_name, &reference_type, &ref_object)); if (reference_type == AE_PART_OF) { // 下载数据 ITKCALL(ifail = IMF_ask_original_file_name2(ref_object, &origin_file_name)); // char new_ds_name[WSO_name_size_c + 1] = ""; // char* new_file_name = USER_new_file_name(new_ds_name, ref_name, ext, 0); strcpy_s(temp_file, dir_path); strcat_s(temp_file, "\\"); strcat_s(temp_file, origin_file_name); ITKCALL(ifail = IMF_export_file(ref_object, temp_file)); if (ifail != ITK_ok) { goto end; } Log("导出到路径:%s", temp_file); // 调用接口 string request; request.append("PDF|").append(temp_file).append("|"); Log("发送请求:%s", request.c_str()); { int sock; int valread; const int BUF_SIZE = 1024; char buffer[BUF_SIZE] = { 0 }; struct sockaddr_in serv_addr; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { ITKCALL(ifail = EMH_store_error_s1(EMH_severity_error, ITK_err, ("创建Socket失败"))); ifail = ITK_err; goto end; } serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(PORT); // Convert IPv4 and IPv6 addresses from text to binary form if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { Log("连接失败,释放Socket"); closesocket(sock); //关闭套接字 //WSACleanup(); //释放套接字资源 Log("连接已关闭"); ITKCALL(ifail = EMH_store_error_s1(EMH_severity_error, ITK_err, ("无法连接到CAD服务"))); ifail = ITK_err; goto end; } const char* requestU = G2U(request.c_str()); send(sock, requestU, strlen(requestU), 0); Log("请求已发送"); recv(sock, buffer, BUF_SIZE, 0); Log("收到返回信息:%s", buffer); closesocket(sock); //关闭套接字 //WSACleanup(); //释放套接字资源 Log("连接已关闭"); if (strcmp("OFF", buffer) == 0) { goto end; } if (strcmp(SOCKET_SUCCESS, buffer) != 0) { ITKCALL(ifail = EMH_store_error_s2(EMH_severity_error, ITK_err, ("转PDF发生错误"), U2G(buffer))); ifail = ITK_err; goto end; } } // 上传文件 Log("执行完成,开始上传文件"); pdf_path.assign(temp_file); pdf_path = pdf_path.substr(0, pdf_path.length() - 4).append(".pdf"); out_pdf_path = pdf_path.substr(0, pdf_path.length() - 4).append("-1").append(".pdf"); Log("检查PDF文件:%s", (pdf_path.c_str())); if (!std::experimental::filesystem::exists((pdf_path.c_str()))) { ITKCALL(ifail = EMH_store_error_s1(EMH_severity_error, ITK_err, ("转PDF异常,文件不存在或者图纸"))); ifail = ITK_err; goto end; } pdf_name.assign(origin_file_name); pdf_name = pdf_name.substr(0, pdf_name.length() - 4).append(".pdf"); ITKCALL(ifail = AE_find_datasettype2("PDF", &pdf_dataset_type)); if (ifail != ITK_ok) { goto end; } ITKCALL(ifail = AOM_ask_value_string(dataset, "object_name", &object_name)); ITKCALL(ifail = AE_create_dataset_with_id(pdf_dataset_type, object_name, "", "", "A", &pdf_dataset)); ITKCALL(ifail = AOM_save(pdf_dataset)); ITKCALL(ifail = GRM_create_relation(rev, pdf_dataset, relation, NULL, &pdf_relation_tag)); ITKCALL(ifail = GRM_save_relation(pdf_relation_tag)); Log("新建数据集完成:%s", object_name); ITKCALL(ifail = AE_ask_dataset_latest_rev(pdf_dataset, &spec_dataset_rev)); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; char cmd[256] = ""; char* tc_root_dir = getenv("tc_root"); strcpy(cmd, "java -jar "); strcat(cmd, tc_root_dir); strcat(cmd, "\\bin\\HS_PDFSignoff.jar"); strcat(cmd, " \""); strcat(cmd, pdf_path.c_str()); strcat(cmd, "\" \""); strcat(cmd, out_pdf_path.c_str()); strcat(cmd, "\" \""); strcat(cmd, tz_path); strcat(cmd, "\""); printf("\n%s\n", cmd); system(cmd); ITKCALL(ifail = IMF_import_file(out_pdf_path.c_str(), NULL, SS_BINARY, &new_file_tag, &file_descriptor)); ITKCALL(ifail = AOM_lock(new_file_tag)); ITKCALL(ifail = IMF_set_original_file_name2(new_file_tag, pdf_name.c_str())); ITKCALL(ifail = IMF_close_file(file_descriptor)); ITKCALL(ifail = AOM_save(new_file_tag)); ITKCALL(ifail = AOM_unlock(new_file_tag)); ITKCALL(ifail = AOM_lock(spec_dataset_rev)); ITKCALL(ifail = AE_add_dataset_named_ref2(spec_dataset_rev, "PDF_Reference", AE_PART_OF, new_file_tag)); ITKCALL(ifail = AE_save_myself(spec_dataset_rev)); ITKCALL(ifail = AOM_unlock(spec_dataset_rev)); Log("上传完成"); } end: // 删除文件 if (remove_file && strlen(temp_file) > 0) { remove(temp_file); } if (remove_file && pdf_path.size() > 0) { remove(pdf_path.c_str()); } if (remove_file && out_pdf_path.size() > 0) { remove(out_pdf_path.c_str()); } if (remove_file && strlen(tz_path) > 0) { Log("删除图章文件"); remove(tz_path); } DOFREE(origin_file_name); DOFREE(object_string); DOFREE(object_name); return ifail; } int Connor_CAD_Convert_PDF(EPM_action_message_t msg) { int ifail = ITK_ok, att_cnt = 0, pref_cnt = 0; tag_t root_task = NULLTAG, * attachments = NULL, relation_tag = NULLTAG; char* object_string = NULL, * object_type = NULL, ** pref_values = NULL; string dataset_rel, dataset_type, dataset_ref; bool has_err = false; bool remove_file = true; tag_t current_task = msg.task; ITKCALL(ifail = EPM_ask_root_task(current_task, &root_task)); if (ifail != ITK_ok) { goto end; } Log("====================================================="); Log("Connor_CAD_Convert_PDF 开始执行"); Log("====================================================="); _sleep(2 * 1000);//延时1秒 //参数相关 int arg_cnt = 0; char* argflag = NULL, * argvalue = NULL, * arg = NULL; char TZ[16] = ""; arg_cnt = TC_number_of_arguments(msg.arguments); printf("参数个数为:%d\n", arg_cnt); if (arg_cnt > 0) { for (int i = 0; i < arg_cnt; i++) { arg = TC_next_argument(msg.arguments); ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue); if (stricmp(argflag, "type") == 0) { if (argvalue != NULL) { strcpy(TZ, argvalue); } } } if (argflag != NULL) { MEM_free(argflag); argflag = NULL; } } char* tz_uid; char tz_path[512] = ""; //ITKCALL(PREF_ask_char_values("HS_UNIT_CODE", &value_count, &values)); char tzs[64] = "HS2_TZ_"; Log("3.21图章参数: [%s]", TZ); strcat(tzs, TZ); ITKCALL(PREF_ask_char_value(tzs, 0, &tz_uid)); Log("3.21图章uid: [%s]", tz_uid); tag_t tz_target; ITK__convert_uid_to_tag(tz_uid, &tz_target); int target_count = 0; tag_t* target_tags = NULL; char* target_type; ITKCALL(AOM_ask_value_tags(tz_target, "ref_list", &target_count, &target_tags)); ITKCALL(AOM_ask_value_string(target_tags[0], "file_ext", &target_type)); strcat(tz_path, getenv("TEMP")); strcat(tz_path, TZ); strcat(tz_path, "TZ."); strcat(tz_path, target_type); IMF_export_file(target_tags[0], tz_path); Log("3.21图章模板路径: [%s]", tz_path); ITKCALL(ifail = EPM_ask_attachments(root_task, EPM_target_attachment, &att_cnt, &attachments)); if (att_cnt == 0) { Log("目标下无引用对象"); goto end; } set_bypass(true); ITKCALL(ifail = PREF_ask_logical_value(PREF_REMOVE_FILE, 0, &remove_file)); if (ifail != ITK_ok) { EMH_clear_last_error(ifail); } if (remove_file) { Log("不保留临时文件"); } else { Log("保留临时文件"); } // 解析上传配置 ITKCALL(ifail = PREF_ask_char_values(PREF_UPLOAD_FILE, &pref_cnt, &pref_values)); if (ifail != ITK_ok) { goto end; } if (pref_cnt < 3) { ITKCALL(ifail = EMH_store_error_s2(EMH_severity_error, ITK_err, ("首选项配置错误"), PREF_SIGNATURE)); ifail = ITK_err; goto end; } dataset_rel.assign(pref_values[0]); dataset_type.assign(pref_values[1]); dataset_ref.assign(pref_values[2]); Log("数据集配置: [%s][%s][%s]", dataset_rel.c_str(), dataset_type.c_str(), dataset_ref.c_str()); ITKCALL(ifail = GRM_find_relation_type(dataset_rel.c_str(), &relation_tag)); if (ifail != ITK_ok) { Log("关系未找到"); goto end; } DOFREE(pref_values); if (ifail != ITK_ok) { goto end; } for (int i = 0; i < att_cnt; i++) { DOFREE(object_string); DOFREE(object_type); tag_t target = attachments[i]; vector dataset_tags; string dir_path, dir_path2; ITKCALL(ifail = AOM_ask_value_string(target, "object_string", &object_string)); ITKCALL(ifail = WSOM_ask_object_type2(target, &object_type)); Log("%d. %s [%s]", i + 1, (object_string), object_type); if (!isType(target, "ItemRevision")) { continue; } // 查询数据集 ifail = GetDatasets(target, dataset_rel, dataset_type, dataset_tags); int dataset_cnt = dataset_tags.size(); Log("找到数据集数量:%d", dataset_cnt); if (dataset_cnt == 0) { continue; } // 创建临时文件夹 ifail = CreateTempFolder1(dir_path); //ifail = CreateTempFolder(dir_path2); if (ifail != ITK_ok) { ifail = ITK_err; ITKCALL(ifail = EMH_store_error_s1(EMH_severity_error, ITK_err, ("创建临时目录失败"))); goto end; } for (int j = 0; j < dataset_cnt; j++) { tag_t dataset_tag = dataset_tags[j]; ifail = ConvertPDF(target, dataset_tag, relation_tag, dir_path.c_str(), dataset_ref.c_str(), "dwg", remove_file, tz_path); if (ifail != ITK_ok) { has_err = true; } } // 清理文件 if (remove_file) { std::experimental::filesystem::remove_all(dir_path.c_str()); } // rmdir(dir_path.c_str()); } end: Log("====================================================="); Log("Connor_CAD_Convert_PDF 执行结束"); Log("====================================================="); set_bypass(false); if (has_err) { ifail = ITK_err; } DOFREE(pref_values); DOFREE(object_string); DOFREE(object_type); DOFREE(attachments); return ifail; }