You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "connor_cad.h"
#include "k_util.h"
#include <WinSock2.h>
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#include <experimental\filesystem>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
#define ITK_err 919012
#include <iostream>
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("|<EOF>");
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<tag_t> 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;
}