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