天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 63|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[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]

 

 

 

 

objectARX加载lisp函数、源码的一种方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:31 , Processed in 0.179258 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表