第6讲 AutoCAd内部命令调用及用户交互_第1页
第6讲 AutoCAd内部命令调用及用户交互_第2页
第6讲 AutoCAd内部命令调用及用户交互_第3页
第6讲 AutoCAd内部命令调用及用户交互_第4页
第6讲 AutoCAd内部命令调用及用户交互_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1国家制造业信息化工程重大项目-CAD二次开发二次开发第第6讲讲 AutoCAD内部命令调用内部命令调用及用户交互及用户交互主讲人:刘德儿主讲人:刘德儿2国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型3国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换C+(Win 32)C#char*作为输入参数转为char,通过Encoding类对这个string进行编码后得到的一个

2、char作为输出参数转为byte,通过Encoding类对这个byte进行解码,得到字符串4国家制造业信息化工程重大项目-CAD二次开发二次开发C+ Dll接口:接口:void CplusplusToCsharp(in char* AgentID, out char* AgentIP);C#中的声明:DllImport(Example.dll)public static extern void CplusplusToCsharp(char AgentID, byte AgentIP);C#中的调用:中的调用:Encoding encode = Encoding.Default;byte tAg

3、entID;byte tAgentIP;string AgentIP;tAgentID = new byte100;tAgentIP = new byte100;CplusplusToCsharp(encode.GetChars(tAgentID), tAgentIP);AgentIPi = encode.GetString(tAgentIP,i*Length,Length);5国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换HandleIntPtrHwndIntPtrint*ref intint&ref intvoid*IntPtrunsig

4、ned char*ref byteBOOLboolDWORDint 或 uint(int 更常用一些)6国家制造业信息化工程重大项目-CAD二次开发二次开发枚举类型枚举类型Win32:BOOL MessageBeep(UINT uType / 声音类型声音类型); 其中其中的声音类型为枚举类型中的某一值。的声音类型为枚举类型中的某一值。C#:用户需要自己定义一个枚举类型:public enum BeepType SimpleBeep = -1, IconAsterisk = 0 x00000040, IconExclamation = 0 x00000030, IconHand = 0 x00

5、000010, IconQuestion = 0 x00000020, Ok = 0 x00000000,C#中导入该函数:中导入该函数:DllImport(user32.dll)public static extern bool MessageBeep(BeepType beepType);C#中调用该函数:中调用该函数: MessageBeep(BeepType.IconQuestion);7国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换结构结构转换转换Win32:使用结构指针作为参数的函数:BOOL GetSystemPowerStat

6、us(LPSYSTEM_POWER_STATUS lpSystemPowerStatus);Win32中该结构体的定义:中该结构体的定义:typedef struct _SYSTEM_POWER_STATUS BYTE ACLineStatus;BYTE BatteryFlag;BYTE BatteryLifePercent;BYTE Reserved1;DWORDBatteryLifeTime;DWORDBatteryFullLifeTime; SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;8国家制造业信息化工程重大项目-CAD二次开发二次开发1、C

7、#调用调用dll时的类型转换时的类型转换C#:用户自定义相应的结构体:用户自定义相应的结构体:struct SystemPowerStatus byte ACLineStatus; byte batteryFlag; byte batteryLifePercent; byte reserved1; int batteryLifeTime; int batteryFullLifeTime;C#中导入该函数:中导入该函数:DllImport(kernel32.dll)public static extern bool GetSystemPowerStatus( ref SystemPowerSta

8、tus systemPowerStatus);C#中调用该函数:中调用该函数:SystemPowerStatus sps;.sps初始化赋值GetSystemPowerStatus(ref sps);9国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换字符串字符串对于字符串的处理分为以下几种情况:1、字、字符串常量指针的处符串常量指针的处理理(LPCTSTR),也也适应于字符串常量的处理,适应于字符串常量的处理,.net中的中的string类型是不可变的类类型是不可变的类型型2、字、字符串缓冲区的处理(符串缓冲区的处理(char*),即),即对于

9、变长字符串的处理,对于变长字符串的处理,.net中中StringBuilder可用作缓冲可用作缓冲区区10国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换-字符字符串串实实例例Win32:BOOL GetFile(LPCTSTR lpRootPathName);C#:函数声明:DllImport(kernel32.dll, CharSet = CharSet.Auto)static extern bool GetFile (MarshalAs(UnmanagedType.LPTStr)string rootPathName);函数调用:函数调用

10、:string pathname;GetFile(pathname);备注:备注:DllImport中的CharSet是为了说明自动地调用该函数相关的Ansi版本或者Unicode版本11国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换-字符串字符串实实例例变长字符串处理:变长字符串处理:C#:函数声明:DllImport(kernel32.dll, CharSet = CharSet.Auto)public static extern int GetShortPathName( MarshalAs(UnmanagedType.LPTStr)

11、string path, MarshalAs(UnmanagedType.LPTStr) StringBuilder shortPath, int shortPathLength);函数调用:函数调用:StringBuilder shortPath = new StringBuilder(80);int result = GetShortPathName(d:test.jpg, shortPath, shortPath.Capacity);string s = shortPath.ToString();12国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时

12、的类型转换struct具有内嵌字符数组的结构:具有内嵌字符数组的结构:Win32:typedef struct _TIME_ZONE_INFORMATION LONG Bias;WCHARStandardName 32 ;SYSTEMTIME StandardDate;LONG StandardBias;WCHARDaylightName 32 ;SYSTEMTIME DaylightDate;LONG DaylightBias; TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION;13国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调

13、用dll时的类型转换时的类型转换C#:StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)struct TimeZoneInformation public int bias; MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32) public string standardName; DateTime standardDate; public int standardBias; MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3

14、2) public string daylightName; SystemTime daylightDate; public int daylightBias;14国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换具有回调的函数Win32:BOOL EnumDesktops(HWINSTA hwinsta, / 窗口实例的句柄ENUMDESKTOPPROC lpEnumFunc,/ 回调函回调函数数LPARAM lParam/ 用于回调函数的值);回调函数DESKTOPENUMPROC的声明:BOOL CALLBACK EnumDesktopPr

15、oc(LPTSTR lpszDesktop,/ 桌面名称LPARAM lParam/ 用户定义的值);15国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换C#:将回调函数的声明转化为委托:delegate bool EnumDesktopProc(MarshalAs(UnmanagedType.LPTStr) string desktopName, int lParam);该函数在C#中的声明:DllImport(user32.dll, CharSet = CharSet.Auto)static extern bool EnumDesktops

16、( IntPtr windowStation, EnumDesktopProc callback, int lParam);16国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型17国家制造业信息化工程重大项目-CAD二次开发二次开发2、使用、使用AutoCAD内部命令内部命令n方式一:使用方式一:使用SendStringToExecute n方式二:使用方式二:使用P/Invoke 18国家制造业信息化工程重大项目-C

17、AD二次开发二次开发使用使用SendStringToExecutenSendStringToExecute 方法将单个字符串发送到命方法将单个字符串发送到命令行。该字符串必须包含提供给所执行命令的参数,令行。该字符串必须包含提供给所执行命令的参数,并依照该命令的提示顺序所要求的次序排列这些参数并依照该命令的提示顺序所要求的次序排列这些参数 n使用使用 SendStringToExecute 执行命令是异步的,直执行命令是异步的,直到到 .NET 命令结束,否则不会被调用命令结束,否则不会被调用 19国家制造业信息化工程重大项目-CAD二次开发二次开发使用使用P/Invoke方式方式n在在Obj

18、ectARX编程中,可以使用以下函数来执行编程中,可以使用以下函数来执行AutoCAD内部的命令内部的命令acedCommandacedCmd20国家制造业信息化工程重大项目-CAD二次开发二次开发acedCommand函数函数nC+acedCommand函数的定义为:函数的定义为: int acedCommand(int rtype, . unnamed); 21国家制造业信息化工程重大项目-CAD二次开发二次开发22国家制造业信息化工程重大项目-CAD二次开发二次开发acedCommand函数函数n.NET中调用中调用acedCommand函数函数实例:绘制圆实例:绘制圆23国家制造业信息

19、化工程重大项目-CAD二次开发二次开发效果效果24国家制造业信息化工程重大项目-CAD二次开发二次开发acedCommand函数函数n创建将块生成创建将块生成ICON命令命令BlockIcon25国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC+中,中,acedCmd函数的定义为:函数的定义为: int acedCmd(const struct resbuf * rbp); n该函数的参数是一个该函数的参数是一个resbuf类型的指针,这里需要的结果缓类型的指针,这里需要的结果缓冲区可以由冲区可以由acutBuildList函数生成。由于函数生成。由于acedCo

20、mmand函函数实质上也是为要执行的命令构造了一个数实质上也是为要执行的命令构造了一个resbuf结构,因此结构,因此acedCmd函数和函数和acedCommand函数完全能够实现相同的功函数完全能够实现相同的功能能26国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数union ads_u_val ads_real rreal; ads_real rpoint3; short rint; / Must be declared short, not int. char *rstring;long rlname2; long rlong; struct ads_bina

21、ry rbinary; ; struct resbuf struct resbuf *rbnext; / Linked list pointer short restype; union ads_u_val resval; ; 27国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC#中使用中使用acedCmd函数函数创建创建Zoom实例实例28国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC#中使用中使用acedCmd函数函数创建创建Circle实例实例29国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoC

22、ADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型30国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互nAutoCAD中命令提示中命令提示如在如在AutoCAD中执行中执行PLINE命令时,能够得到如下的命令时,能够得到如下的命令提示:命令提示: 命令命令: _pline 指定起点指定起点: 当前线宽为当前线宽为 0.0000 指定下一个点或指定下一个点或 圆弧圆弧(A)/半宽半宽(H)/长度长度(L)/放弃放弃(U)/宽度宽度(W): 指定下一点或指定下一点或 圆弧圆

23、弧(A)/闭合闭合(C)/半宽半宽(H)/长度长度(L)/放弃放弃(U)/宽度宽度(W): 其中的提示其中的提示“指定下一个点或指定下一个点或 圆弧圆弧(A)/半宽半宽(H)/长长度度(L)/放弃放弃(U)/宽度宽度(W):”就将提示用户输入点和关就将提示用户输入点和关键字结合在一起。键字结合在一起。31国家制造业信息化工程重大项目-CAD二次开发二次开发 3、和用户交互、和用户交互nC+ ObjectARX中提供了多个提示用户输入的全局函数,包括中提供了多个提示用户输入的全局函数,包括acedGetString、acedGetPoint、acedGetInt、acedGetKword和和ac

24、edGetReal等等nC#命名空间:命名空间:Autodesk.AutoCAD.EditorInputGetString、GetPoint、GetInt、GetKword和和GetReal等等输入提示并获取输入结果模板输入提示并获取输入结果模板输入提示输入提示 PromptXXXOptions pOptions = new PromptXXXOptions(“”)获得输入结果获得输入结果 (1)有指定类型返回结果)有指定类型返回结果 PromptXXXResult pResult = ed.GetXXX(pOptions ); (2)没有指定类型返回结果()没有指定类型返回结果(string

25、型型) PromptResult pResult = ed.GetXXX(pOptions ); (3)得到具体结果,如)得到具体结果,如 string DK = pResult .StringResult.Trim();32国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互n输入提示抽象类:输入提示抽象类:PromptOptions,所有具体提示,所有具体提示输入类都继承了该类输入类都继承了该类33国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n读入字符串读入字符串34国家制造业信息化工程重大项目-CAD二次开发二次开发3

26、、和用户交互、和用户交互-实例实例n读入读入Double型数据型数据35国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n读入读入Point36国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n拾取实体拾取实体37国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n打开打开dwg文件(文件(using Autodesk.AutoCAD.Windows;)38国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容

27、3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型39国家制造业信息化工程重大项目-CAD二次开发二次开发4、选择集、选择集n1)获得)获得PickFirst选择集选择集 n2)在图形区域中选择对象)在图形区域中选择对象 n3)添加或合并多个选择集)添加或合并多个选择集 n4)定义选择集过滤规则)定义选择集过滤规则 n5)从选择集中移除对象)从选择集中移除对象 40国家制造业信息化工程重大项目-CAD二次开发二次开发4.1、获得获得PickFirst选择集选择集 nPickFirst 选择集是在先选择对象后启动命令的时候创建的选择集是在先选

28、择对象后启动命令的时候创建的n为了获得为了获得 PickFirst 选择集的对象,必须满足:选择集的对象,必须满足:PICKFIRST 系统变量必须设置为系统变量必须设置为 1 必须给命令定义必须给命令定义 UsePickSet 命令标记,用以通知命令要使用命令标记,用以通知命令要使用 Pickfirst 选择集选择集 调用调用 SelectImplied 方法获得方法获得 PickFirst 选择集选择集 41国家制造业信息化工程重大项目-CAD二次开发二次开发4.2、在图形区域中选择对象在图形区域中选择对象 n允许用户从图形中选择对象的函数:允许用户从图形中选择对象的函数: GetSele

29、ction:提示用户从屏幕中拾取对象提示用户从屏幕中拾取对象 SelectAll:在当前空间中选择所有对象,但不包括锁在当前空间中选择所有对象,但不包括锁定或冻结的定或冻结的 SelectCrossingPolygon:选择与通过指定点定义的多选择与通过指定点定义的多边形内部和相交的对象。多边形可以是任何形状但不边形内部和相交的对象。多边形可以是任何形状但不能与它自己相交或接触能与它自己相交或接触 SelectCrossingWindow:选择与通过两个点定义的区选择与通过两个点定义的区域内部和相交的对象域内部和相交的对象SelectFence:选择与选择栅格相交的所有对象。栅格选择与选择与选

30、择栅格相交的所有对象。栅格选择与多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可以与自己相交以与自己相交42国家制造业信息化工程重大项目-CAD二次开发二次开发4.2、在图形区域中选择对象在图形区域中选择对象SelectLast:选择当前空间中最后创建的对象:选择当前空间中最后创建的对象 SelectPrevious:选择在前一个选择对象提示时选择的所:选择在前一个选择对象提示时选择的所有对象有对象 SelectWindow:选择完全包含在通过两个点定义的矩形内:选择完全包含在通过两个点定义的矩形内部的所有对象部的所有对象 Sel

31、ectWindowPolygon:选择完全包含在通过点定义的多:选择完全包含在通过点定义的多边形里面的对象。多边形可以是任何形状但不能与它自己边形里面的对象。多边形可以是任何形状但不能与它自己相交或接触相交或接触 SelectAtPoint:选择经过给定点的对象并将它们放到活动:选择经过给定点的对象并将它们放到活动选择集中去选择集中去 SelectByPolygon:选择栅格内部的对象并将它们放到活:选择栅格内部的对象并将它们放到活动选择集中去动选择集中去 43国家制造业信息化工程重大项目-CAD二次开发二次开发44国家制造业信息化工程重大项目-CAD二次开发二次开发4.3、添加或合并多个选择

32、集、添加或合并多个选择集 n用户可以合并多个选择集,需要创建一个用户可以合并多个选择集,需要创建一个 ObjectIdCollection 对象,然后向其中添加多个选择集的对对象,然后向其中添加多个选择集的对象的象的 ObjectID 45国家制造业信息化工程重大项目-CAD二次开发二次开发4.4、定义选择集过滤规则、定义选择集过滤规则 n选择集过滤规则类型:选择集过滤规则类型:使用选择集过滤器定义选择集规则使用选择集过滤器定义选择集规则 在选择集过滤器中指定多个条件在选择集过滤器中指定多个条件 添加复杂的过滤器列表条件添加复杂的过滤器列表条件 在选择器过滤器条件中使用通配符在选择器过滤器条件

33、中使用通配符 过滤扩展数据过滤扩展数据 46国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1、使用选择集过滤器定义选择集规使用选择集过滤器定义选择集规则则 n常用过滤器的常用过滤器的 DXF 组码组码 47国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1、使用选择集过滤器定义选择集规使用选择集过滤器定义选择集规则则n过滤器类过滤器类SelectionFilter48国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1、使用选择集过滤器定义选择集规使用选择集过滤器定义选择集规则则n实例:使用过滤器选择圆图形实体实例:使用过滤器选择圆图形实体49国家制造业信息

34、化工程重大项目-CAD二次开发二次开发4.4.2、在选择集过滤器中指定多个条件在选择集过滤器中指定多个条件 n示例,给定两个选择对象的过滤条件:示例,给定两个选择对象的过滤条件:对象必须是圆,并且对象必须是圆,并且必须在图层必须在图层 0 上上50国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.3、添加复杂的过滤器列表条件添加复杂的过滤器列表条件 n指定多个选择条件的方式:指定多个选择条件的方式:对于数字项,用户可以指定关系运算(例如,圆的半对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于径必须大于或等于 5.0)对于所有项,用户可以指定逻辑运算(例如对于所有项,用户可以指定逻辑运算(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论