• objectARX加载lisp函数、源码的一种方式


    //感谢高飞鸟highflybird版主的思路以及研究。

    //先声明非公开函数acedEvaluateLisp
    
    extern int  acedEvaluateLisp(const ACHAR*,struct resbuf *&);

    //直接使用源码的方式

    struct resbuf *rbOut=NULL;    
    
          int nRet= acedEvaluateLisp(_T("(defun sk_myline(/ ent)(setq ent(entmakex (list (cons 0 "line")(list 10 0 0 0)(list 11 100 100 0)))) ent)(sk_myline)"),rbOut);
    
          if (nRet == TRUE)
    
          {       
    
             if (rbOut->restype == RTENAME)
    
             { 
    
                AcDbObjectId objId=AcDbObjectId::kNull;
    
                acdbGetObjectId(objId,rbOut->resval.rlname);
    
                if (objId != AcDbObjectId::kNull)
    
                {
    
                    AcDbEntity *pEnt=NULL;
    
                    acdbOpenObject(pEnt,objId,AcDb::kForWrite);
    
                    if (pEnt!=NULL)
    
                    {
    
                       pEnt->setColorIndex(2);
    
                       pEnt->close();
    
                    }
    
                }
    
             }
    
          }    
    
          if (rbOut!=NULL)
    
          {
    
             acutRelRb(rbOut);
    
          }

    //添加lisp文件为资源文件的方式

    导入lisp为自定义资源

    资源类型随意

    下面是加载的代码

    static bool  IsTextUTF8(const char* str,int length) 
    
       { 
    
          int nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节 
    
          unsigned char chr; 
    
          bool bAllAscii=true; //如果全部都是ASCII, 说明不是UTF-8 
    
          for(int i=0; i<length; ++i) 
    
          { 
    
             chr= *(str+i); 
    
             if( (chr&0x80) != 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx 
    
                bAllAscii= false; 
    
             if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数 
    
             { 
    
                if(chr>=0x80) 
    
                { 
    
                    if(chr>=0xFC&&chr<=0xFD) 
    
                       nBytes=6; 
    
                    else if(chr>=0xF8) 
    
                       nBytes=5; 
    
                    else if(chr>=0xF0) 
    
                       nBytes=4; 
    
                    else if(chr>=0xE0) 
    
                       nBytes=3; 
    
                    else if(chr>=0xC0) 
    
                       nBytes=2; 
    
                    else 
    
                       return false;       
    
                    nBytes--; 
    
                } 
    
             } 
    
             else //多字节符的非首字节,应为 10xxxxxx 
    
             { 
    
                if( (chr&0xC0) != 0x80 ) 
    
                    return false;      
    
                nBytes--; 
    
             } 
    
          } 
    
          if( nBytes > 0 ) //违返规则 
    
             return false; 
    
          if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8 
    
             return false;       
    
          return true; 
    
       } 
    
       static CString UTF82WCS(const char* szU8)
    
       {
    
          bool bIsUtf8=IsTextUTF8(szU8,strlen(szU8));   
    
          //预转换,得到所需空间的大小;
    
          int wcsLen = ::MultiByteToWideChar(bIsUtf8 ? CP_UTF8 : CP_ACP, bIsUtf8 ? NULL:MB_PRECOMPOSED, szU8, strlen(szU8), NULL, 0);
    
          //分配空间要给''留个空间,MultiByteToWideChar不会给''空间
    
          wchar_t* wszString = new wchar_t[wcsLen + 1];
    
          //转换
    
          ::MultiByteToWideChar(bIsUtf8 ? CP_UTF8 : CP_ACP, bIsUtf8 ? NULL:MB_PRECOMPOSED, szU8, strlen(szU8), wszString, wcsLen);
    
          //最后加上''
    
          wszString[wcsLen] = '';
    
          CString unicodeString(wszString);
    
          delete[] wszString;
    
          wszString = NULL;
    
          return unicodeString;
    
       }
    
       // - sk_ArxTestCode20181101.mylispload command (do not rename)
    
       static void sk_ArxTestCode20181101mylispload(void)
    
       {
    
          // Add your code for command sk_ArxTestCode20181101.mylispload here
    
          HRSRC hResource = ::FindResource(_hdllInstance, MAKEINTRESOURCE(IDR_TXT3), _T("TXT"));
    
          if (!hResource)
    
             return ;
    
          DWORD imageSize = ::SizeofResource(_hdllInstance, hResource);
    
          if (!imageSize)
    
             return ;
    
          const void* pResourceData = ::LockResource(::LoadResource(_hdllInstance, hResource));
    
          if (!pResourceData)
    
             return ;
    
    //    CStringA szGetLispString=(BYTE*)pResourceData;
    
    //    CString szGetLispStringW;
    
    //    szGetLispStringW=szGetLispString;
    
          CString szGetLispStringW=UTF82WCS((const char*)pResourceData);
    
          struct resbuf *rbOut=NULL;
    
          //ads_queueexpr(szGetLispStringW);
    
          int nRet= acedEvaluateLisp(szGetLispStringW,rbOut);
    
       }
    
     

    添加virtual AcRx::AppRetCode On_kLoadDwgMsg (void *pkt)消息,让每个文档都加载一次,包括以后新建的文档。

      

     virtual AcRx::AppRetCode On_kLoadDwgMsg (void *pkt) {
    
          AcRx::AppRetCode retCode =AcRxArxApp::On_kLoadDwgMsg (pkt) ;
    
          sk_ArxTestCode20181101mylispload();
    
          return (retCode) ;
    
       }
  • 相关阅读:
    Jenkins+postman+Newman之API自动化测试
    python之路——迭代器和生成器
    文件操作
    函数
    python基础数据类型二
    dp的一种理解角度及[NOI2020]命运 题解
    从零开始“发明”Treap
    博客停更
    [转]Linux下C语言-RPC远程调用编程rpcgen用法
    一位编程小白的自述 —— 从小学到现在
  • 原文地址:https://www.cnblogs.com/mjgw/p/12424073.html
Copyright © 2020-2023  润新知