|
[code]//先声明非公开函数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);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::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) ;
}[/code] |
|