设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 159|回复: 0

在LoadDwg时添加处理字体代码

[复制链接]
  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

    发表于 2020-12-29 15:48 | 显示全部楼层 |阅读模式
    1. 下载客户端后,可以在AutoCAD中,输入“APPLOAD”命令加载相应的Warrentech.FontCenter.Client.arx文件即可加载该插件。请注意AutoCAD不同版本应该加载不同的DLL,例如:AutoCAD 2008 32位,应加载2008_X86文件夹下的DLL。

    2. 主要代码:
    3. 一、在LoadDwg时添加处理字体代码
    4. 客户端使用C++编写,调用AutoCAD的ObjectARX C++ API,在AutoCAD的On_kLoadDwgMsg事件中使用多线程做字体的下载及上传,下面是主要的代码:

    5.     virtual AcRx::AppRetCode On_kLoadDwgMsg(void *pkt){
    6.         AcRx::AppRetCode retCode = AcRxArxApp::On_kLoadDwgMsg(pkt);

    7.         try {
    8.             acutPrintf(_T("正在检测该文件字体设置,若有缺失将自动下载...\n"));

    9.             HANDLE   hth1;
    10.             unsigned  threadID;
    11.             FontBLL *fontBLL = new FontBLL();
    12.             hth1 = (HANDLE)_beginthreadex(NULL, 0, FontBLL::run, fontBLL, CREATE_SUSPENDED, &threadID);

    13.             if (hth1 != 0) {
    14.                 ResumeThread(hth1);
    15.             }
    16.         }
    17.         catch (...) {}

    18.         return (retCode);
    19.     }
    20. 二、获取当前DWG文档需要的字体名称
    21. 使用ObjectARX接口获取AcDbTextStyleTableIterator,循环这个迭代器,将字体文档的字体名称、大字体名称都加入一个vector<wstring>中,以便后面和Font文件夹中的字体名称进行比较。

    22. 注意要对字体名称做一些处理,以及重复性检查,详见源代码。

    23.     Acad::ErrorStatus es;
    24.     AcApDocument* pDoc;
    25.     AcDbDatabase* pDb;
    26.     pDoc = acDocManager->curDocument();
    27.     pDb = pDoc->database();

    28.     AcDbTextStyleTable* pTextTbl;
    29.     AcDbTextStyleTableIterator *pTextIterator;
    30.     es = pDb->getTextStyleTable(pTextTbl, AcDb::kForRead);
    31.     pTextTbl->newIterator(pTextIterator);        //获取迭代器

    32.     vector<wstring> fontList;
    33.     for (pTextIterator->start(); !pTextIterator->done(); pTextIterator->step()) {
    34.         AcDbTextStyleTableRecord *pTextRecord;
    35.         es = pTextIterator->getRecord(pTextRecord, AcDb::kForRead);

    36.         TCHAR* pFontName = NULL;
    37.         es = pTextRecord->fileName(pFontName);   //获取字体名称
    38.         if (es == Acad::eOk) {
    39.             AddToFontList(pFontName, fontList);
    40.         }

    41.         es = pTextRecord->bigFontFileName(pFontName);   //获取大字体名称
    42.         if (es == Acad::eOk) {
    43.             AddToFontList(pFontName, fontList);
    44.         }
    45.     }
    46.     pTextTbl->close();
    47. 三、获取本地字体列表
    48. 获取本地AutoCAD安装目录下Font文件夹下已存在的字体列表。

    49.     vector<wstring> result;
    50.     _tfinddata64_t c_file;
    51.     intptr_t hFile;
    52.     wstring root;
    53.     root.append(path);        //路径
    54.     root.append(L"\\*");
    55.     root.append(ext);         //扩展名

    56.     hFile = _tfindfirst64(root.c_str(), &c_file);
    57.     if (hFile == -1)
    58.         return result;

    59.     do {
    60.         if (_tcslen(c_file.name) == 1 && c_file.name[0] == _T('.')
    61.             || _tcslen(c_file.name) == 2 && c_file.name[0] == _T('.') && c_file.name[1] == _T('.'))
    62.             continue;

    63.         result.push_back(c_file.name);

    64.     } while (_tfindnext64(hFile, &c_file) == 0);
    65.     _findclose(hFile);
    66. 四、下载缺失字体
    67. 插件使用curl类库做HTTP请求,到WEB服务器下载需要的文件。服务器上的字体文件全都是ZIP文件,所以下载下来后,需要解压。另外,如果没有下载到需要的字体,则会通过WEB服务器的report_missing_cad_font这个API,报告服务器。

    68.     CURL *curl;
    69.     CURLcode res;
    70.     FILE *fp;
    71.     wstring fullPath = FontBasicPath + L"\\" + fontName + L".zip";
    72.     _wfopen_s(&fp, fullPath.c_str(), L"wb");   //创建ZIP文件
    73.     if (fp == NULL) {
    74.         return false;
    75.     }
    76.     transform(fontName.begin(), fontName.end(), fontName.begin(), towlower);
    77.     bool result = false;
    78.     curl = curl_easy_init();
    79.     if (curl) {
    80.         curl_easy_setopt(curl, CURLOPT_URL, (DownloadCadFontUrl + "/" + WStringToUTF8(fontName.c_str()) + ".zip").c_str());
    81.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file_data);
    82.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    83.         res = curl_easy_perform(curl);      //请求服务器
    84.         if (CURLE_OK == res) {
    85.             fclose(fp);

    86.             char *ct;
    87.             res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
    88.             if ((CURLE_OK == res) && ct) {
    89.                 std::string contentType(ct);
    90.                 curl_easy_cleanup(curl);
    91.                 if (contentType == "application/zip") {    //判断下载文件的类型
    92.                     result = true;                           //如果不是"application/zip"类型,就说明服务器上也没有这个字体
    93.                 }
    94.                 else {
    95.                     CURL *reportCurl;
    96.                     reportCurl = curl_easy_init();
    97.                     curl_easy_setopt(reportCurl, CURLOPT_URL, ReportMissingCadFontUrl.c_str());
    98.                     string postData = "keyword=" + WStringToUTF8(fontName.c_str());
    99.                     curl_easy_setopt(reportCurl, CURLOPT_POSTFIELDS, postData.c_str());
    100.                     res = curl_easy_perform(reportCurl);
    101.                     curl_easy_cleanup(reportCurl);
    102.                 }
    103.             }
    104.         }
    105.     }
    106. 五、上传客户端字体到服务器
    107. 服务器端虽然预置了2000多种AutoCAD字体,但仍然不是最全面的,所以如果客户端存在服务器端没有的字体,插件就会上传该字体到服务器。

    108. 首先,将本地字体名称列表POST到服务器,服务器会比较服务器上的字体列表,并将需要上传的字体列表通过JSON数据返回。

    109. 然后,客户端收到字体列表后,将需要上传的字体压缩打包,通过WEB API上传到服务器端。

    110. bool upload_file(const wstring path)
    111. {
    112.     CURL *curl;
    113.     CURLcode res;
    114.     struct curl_httppost *formpost = NULL;
    115.     struct curl_httppost *lastptr = NULL;

    116.     curl_formadd(&formpost,
    117.                  &lastptr,
    118.                  CURLFORM_PTRNAME, "file",
    119.                  CURLFORM_FILE, WStringToString(path).c_str(),
    120.                  CURLFORM_END);
    121.     curl = curl_easy_init();
    122.     if (curl) {
    123.         curl_easy_setopt(curl, CURLOPT_URL, UploadCadFontUrl.c_str());
    124.         curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
    125.         res = curl_easy_perform(curl);
    126.         curl_easy_cleanup(curl);

    127.         _wremove(path.c_str());
    128.         return true;
    129.     }

    130.     _wremove(path.c_str());
    131.     return false;
    132. }
    复制代码
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛