|
|
#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;
|
|
|
} |