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

      //分配空间要给‘\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) ;

   }

原文地址:https://www.cnblogs.com/mjgw/p/12424073.html

时间: 2024-10-08 02:26:58

objectARX加载lisp函数、源码的一种方式的相关文章

Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)

本文是在学习Openstack的过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正! 在Neutron-server服务加载与启动源码分析(二)中搞定模块功能的扩展和加载,我们就回到Neutron-server服务加载与启动源码分析(一)中的_run_wsgi函数 <span style="font-size:14px;">def _run_wsgi(app_name): app = config.load_paste_app(app_name) ifno

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i

Android Studio 3.5测试版加载SDK java源码

参考博客:http://blog.sina.com.cn/s/blog_c3eb50230102wt1g.html 1.下载adnroid-28的源码 在Android Studio中加载不到源码的下载链接,所在在Android Studio中下载不到源码. 所以,需要借助 android-sdk_r24.4.1-windows.zip 下载源码,这个zip的下载链接 https://dl.google.com/android/android-sdk_r24.4.1-windows.zip?ut

asp.net C# 获取网页源码的几种方式

1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text.Encoding.Default; Byte[] pageData = aWebClient.DownloadData(url); string nhtml = Encoding.GetEncoding("utf-8").GetString(pageData); 2方法 System.N

ios UI加载xib文件到控制器的两种方式(MS)

X-code6.3 创建xib文件 加载xib文件到控制器的两种方式(MS) // 1.第一种方式 //    NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"cell" owner:nil options:nil]; //    MyTableViewCell * cell = [array firstObject]; 其中cell为新建的xib文件名 // 2.第二种方式 UINib * nib = [UINib nib

别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.ClassLoader源码分析 11.自定义类加载器 12.加载类的三种方式 13.总结 14.特别注意 @ 前言 你是否真的理解java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了java的类加载机制,若结果出乎你的意料,那就很有必要来了解了解j

Android图片加载库Picasso源码分析

图片加载在Android开发中是非常重要,好的图片加载库也比比皆是.ImageLoader.Picasso.Glide.Fresco均是优秀的图片加载库. 以上提到的几种图片加载库各有特色.用法与比较,网上已经很多了. 出于学习的角度,个人认为从Picasso入手较好.代码量小,同时API优美,很适合我们学习. 今天笔者就Picasso的源码进行分析,抛出一些图片加载的技术细节供园友参考. PS:建议园友先大致看一下源码. 我们对图片加载的要求 1.加载速度要快 2.资源消耗要低 3.加载图片不

Android 图片加载框架Universal-Image-Loader源码解析

Universal-Image-Loader(项目地址)可以说是安卓知名图片开源框架中最古老.使用率最高的一个了.一张图片的加载对于安卓应用的开发也许是件简单的事,但是如果要同时加载大量的图片,并且图片用于ListView.GridView.ViewPager等控件,如何防止出现OOM.如何防止图片错位(因为列表的View复用功能).如何更快地加载.如何让客户端程序员用最简单的操作完成本来十分复杂的图片加载工作,成了全世界安卓应用开发程序员心头的一大难题,所幸有了Universal-Image-

Android应用setContentView与LayoutInflater加载解析机制源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 其实之所以要说这个话题有几个原因: 理解xml等控件是咋被显示的原理,通常大家写代码都是直接在onCreate里setContentView就完事,没怎么关注其实现原理. 前面分析<Android触摸屏事件派发机制详解与源码分析三(Activity篇)>时提到了一些关于布局嵌套的问题,当时没有深入解释. 所以接下来主要分析的就是View或者ViewGroup对象是如何添加至应用程