//感谢高飞鸟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();

                   pEnt->close();

                }

            }

         }

      }

      if (rbOut!=NULL)

      {

         acutRelRb(rbOut);

      }

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

导入lisp为自定义资源

资源类型随意

下面是加载的代码

static bool  IsTextUTF8(const char* str,int length)

   {

      ;//UFT8可用1-6个字节编码,ASCII用一个字节

      unsigned char chr;

      bool bAllAscii=true; //如果全部都是ASCII, 说明不是UTF-8

      ; i<length; ++i)

      {

         chr= *(str+i);

          ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx

            bAllAscii= false;

         ) //如果不是ASCII码,应该是多字节符,计算字节数

         {

            if(chr>=0x80)

            {

                if(chr>=0xFC&&chr<=0xFD)

                   nBytes=;

                else if(chr>=0xF8)

                   nBytes=;

                else if(chr>=0xF0)

                   nBytes=;

                else if(chr>=0xE0)

                   nBytes=;

                else if(chr>=0xC0)

                   nBytes=;

                else

                   return false;

                nBytes--;

            }

         }

         else //多字节符的非首字节,应为 10xxxxxx

         {

            if( (chr&0xC0) != 0x80 )

                return false;

            nBytes--;

         }

      }

       ) //违返规则

         return false;

      if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8

         return false;

      return true;

   }

   static CString UTF82WCS(const char* szU8)

   {

      bool bIsUtf8=IsTextUTF8(szU8,strlen(szU8));

      //预转换,得到所需空间的大小;

      );

      //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间

      wchar_t* wszString = ];

      //转换

      ::MultiByteToWideChar(bIsUtf8 ? CP_UTF8 : CP_ACP, bIsUtf8 ? NULL:MB_PRECOMPOSED, szU8, strlen(szU8), wszString, wcsLen);

      //最后加上'\0'

      wszString[wcsLen] = '\0';

      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) ;

   }
05-11 17:32