《第6讲-AutoCAd内部命令调用及用户交互PPT学习课件.ppt》由会员分享,可在线阅读,更多相关《第6讲-AutoCAd内部命令调用及用户交互PPT学习课件.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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+(Win32)C#char*作为输入参数转为char,通过Encoding类对这个string进行编码后得到的一个ch
2、ar作为输出参数转为byte,通过Encoding类对这个byte进行解码,得到字符串4国家制造业信息化工程重大项目-CAD二次开发二次开发C+Dll接口:接口:voidCplusplusToCsharp(inchar*AgentID,outchar*AgentIP);C#中的声明:DllImport(Example.dll)publicstaticexternvoidCplusplusToCsharp(charAgentID,byteAgentIP);C#中的调用:中的调用:Encodingencode=Encoding.Default;bytetAgentID;bytetAgentIP;s
3、tringAgentIP;tAgentID=newbyte100;tAgentIP=newbyte100;CplusplusToCsharp(encode.GetChars(tAgentID),tAgentIP);AgentIPi=encode.GetString(tAgentIP,i*Length,Length);5国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换HandleIntPtrHwndIntPtrint*refintint&refintvoid*IntPtrunsignedchar*refbyteBOOLboolDWORDint或u
4、int(int更常用一些)6国家制造业信息化工程重大项目-CAD二次开发二次开发枚举类型枚举类型Win32:BOOLMessageBeep(UINTuType/声音类型声音类型);其中的其中的声音类型为枚举类型中的某一值。声音类型为枚举类型中的某一值。C#:用户需要自己定义一个枚举类型:publicenumBeepTypeSimpleBeep=-1,IconAsterisk=0 x00000040,IconExclamation=0 x00000030,IconHand=0 x00000010,IconQuestion=0 x00000020,Ok=0 x00000000,C#中导入该函数:中
5、导入该函数:DllImport(user32.dll)publicstaticexternboolMessageBeep(BeepTypebeepType);C#中调用该函数:中调用该函数:MessageBeep(BeepType.IconQuestion);7国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换结构结构转换转换Win32:使用结构指针作为参数的函数:BOOLGetSystemPowerStatus(LPSYSTEM_POWER_STATUSlpSystemPowerStatus);Win32中该结构体的定义:中该结构体的定义:ty
6、pedefstruct_SYSTEM_POWER_STATUSBYTEACLineStatus;BYTEBatteryFlag;BYTEBatteryLifePercent;BYTEReserved1;DWORDBatteryLifeTime;DWORDBatteryFullLifeTime;SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS;8国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换C#:用户自定义相应的结构体:用户自定义相应的结构体:structSystemPowerStatusbyteACLine
7、Status;bytebatteryFlag;bytebatteryLifePercent;bytereserved1;intbatteryLifeTime;intbatteryFullLifeTime;C#中导入该函数:中导入该函数:DllImport(kernel32.dll)publicstaticexternboolGetSystemPowerStatus(refSystemPowerStatussystemPowerStatus);C#中调用该函数:中调用该函数:SystemPowerStatussps;.sps初始化赋值GetSystemPowerStatus(refsps);9国
8、家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换字符串字符串对于字符串的处理分为以下几种情况:1、字、字符串常量指针的处符串常量指针的处理理(LPCTSTR),也也适应于字符串常量的处理,适应于字符串常量的处理,.net中的中的string类型是不可变的类类型是不可变的类型型2、字、字符串缓冲区的处理(符串缓冲区的处理(char*),即),即对于变长字符串的处理,对于变长字符串的处理,.net中中StringBuilder可用作缓冲可用作缓冲区区10国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换
9、-字符字符串串实实例例Win32:BOOLGetFile(LPCTSTRlpRootPathName);C#:函数声明:DllImport(kernel32.dll,CharSet=CharSet.Auto)staticexternboolGetFile(MarshalAs(UnmanagedType.LPTStr)stringrootPathName);函数调用:函数调用:stringpathname;GetFile(pathname);备注:备注:DllImport中的CharSet是为了说明自动地调用该函数相关的Ansi版本或者Unicode版本11国家制造业信息化工程重大项目-CAD二
10、次开发二次开发1、C#调用调用dll时的类型转换时的类型转换-字符串字符串实实例例变长字符串处理:变长字符串处理:C#:函数声明:DllImport(kernel32.dll,CharSet=CharSet.Auto)publicstaticexternintGetShortPathName(MarshalAs(UnmanagedType.LPTStr)stringpath,MarshalAs(UnmanagedType.LPTStr)StringBuildershortPath,intshortPathLength);函数调用:函数调用:StringBuildershortPath=newS
11、tringBuilder(80);intresult=GetShortPathName(d:test.jpg,shortPath,shortPath.Capacity);strings=shortPath.ToString();12国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换struct具有内嵌字符数组的结构:具有内嵌字符数组的结构:Win32:typedefstruct_TIME_ZONE_INFORMATIONLONGBias;WCHARStandardName32;SYSTEMTIMEStandardDate;LONGStandard
12、Bias;WCHARDaylightName32;SYSTEMTIMEDaylightDate;LONGDaylightBias;TIME_ZONE_INFORMATION,*PTIME_ZONE_INFORMATION;13国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换C#:StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)structTimeZoneInformationpublicintbias;MarshalAs(UnmanagedType.ByValTStr,Siz
13、eConst=32)publicstringstandardName;DateTimestandardDate;publicintstandardBias;MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)publicstringdaylightName;SystemTimedaylightDate;publicintdaylightBias;14国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换具有回调的函数Win32:BOOLEnumDesktops(HWINSTAhwinsta,/窗口实例的句柄E
14、NUMDESKTOPPROClpEnumFunc,/回调函回调函数数LPARAMlParam/用于回调函数的值);回调函数DESKTOPENUMPROC的声明:BOOLCALLBACKEnumDesktopProc(LPTSTRlpszDesktop,/桌面名称LPARAMlParam/用户定义的值);15国家制造业信息化工程重大项目-CAD二次开发二次开发1、C#调用调用dll时的类型转换时的类型转换C#:将回调函数的声明转化为委托:delegateboolEnumDesktopProc(MarshalAs(UnmanagedType.LPTStr)stringdesktopName,int
15、lParam);该函数在C#中的声明:DllImport(user32.dll,CharSet=CharSet.Auto)staticexternboolEnumDesktops(IntPtrwindowStation,EnumDesktopProccallback,intlParam);16国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型17国家制造业信息化工程重大项目-CAD二次开发二次开发2、使用、使用AutoC
16、AD内部命令内部命令n方式一:使用方式一:使用SendStringToExecuten方式二:使用方式二:使用P/Invoke18国家制造业信息化工程重大项目-CAD二次开发二次开发使用使用SendStringToExecutenSendStringToExecute方法将单个字符串发送到命方法将单个字符串发送到命令行。该字符串必须包含提供给所执行命令的参数,令行。该字符串必须包含提供给所执行命令的参数,并依照该命令的提示顺序所要求的次序排列这些参数并依照该命令的提示顺序所要求的次序排列这些参数n使用使用SendStringToExecute执行命令是异步的,直执行命令是异步的,直到到.NET
17、命令结束,否则不会被调用命令结束,否则不会被调用19国家制造业信息化工程重大项目-CAD二次开发二次开发使用使用P/Invoke方式方式n在在ObjectARX编程中,可以使用以下函数来执行编程中,可以使用以下函数来执行AutoCAD内部的命令内部的命令acedCommandacedCmd20国家制造业信息化工程重大项目-CAD二次开发二次开发acedCommand函数函数nC+acedCommand函数的定义为:函数的定义为:intacedCommand(intrtype,.unnamed);21国家制造业信息化工程重大项目-CAD二次开发二次开发22国家制造业信息化工程重大项目-CAD二次
18、开发二次开发acedCommand函数函数n.NET中调用中调用acedCommand函数函数实例:绘制圆实例:绘制圆23国家制造业信息化工程重大项目-CAD二次开发二次开发效果效果24国家制造业信息化工程重大项目-CAD二次开发二次开发acedCommand函数函数n创建将块生成创建将块生成ICON命令命令BlockIcon25国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC+中,中,acedCmd函数的定义为:函数的定义为:intacedCmd(conststructresbuf*rbp);n该函数的参数是一个该函数的参数是一个resbuf类型的指针,这里需要
19、的结果缓冲类型的指针,这里需要的结果缓冲区可以由区可以由acutBuildList函数生成。由于函数生成。由于acedCommand函数函数实质上也是为要执行的命令构造了一个实质上也是为要执行的命令构造了一个resbuf结构,因此结构,因此acedCmd函数和函数和acedCommand函数完全能够实现相同的功函数完全能够实现相同的功能能26国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数unionads_u_valads_realrreal;ads_realrpoint3;shortrint;/Mustbedeclaredshort,notint.char*rstr
20、ing;longrlname2;longrlong;structads_binaryrbinary;structresbufstructresbuf*rbnext;/Linkedlistpointershortrestype;unionads_u_valresval;27国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC#中使用中使用acedCmd函数函数创建创建Zoom实例实例28国家制造业信息化工程重大项目-CAD二次开发二次开发acedCmd函数函数nC#中使用中使用acedCmd函数函数创建创建Circle实例实例29国家制造业信息化工程重大项目-CAD二次
21、开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型30国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互nAutoCAD中命令提示中命令提示如在如在AutoCAD中执行中执行PLINE命令时,能够得到如下的命令时,能够得到如下的命令提示:命令提示:命令命令:_pline指定起点指定起点:当前线宽为当前线宽为0.0000指定下一个点或指定下一个点或圆弧圆弧(A)/半宽半宽(H)/长度长度(L)/放弃放弃(U)/宽度宽度(W):指定下一
22、点或指定下一点或圆弧圆弧(A)/闭合闭合(C)/半宽半宽(H)/长度长度(L)/放弃放弃(U)/宽度宽度(W):其中的提示其中的提示“指定下一个点或指定下一个点或 圆弧圆弧(A)/半宽半宽(H)/长长度度(L)/放弃放弃(U)/宽度宽度(W):”就将提示用户输入点和关就将提示用户输入点和关键字结合在一起。键字结合在一起。31国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互nC+ObjectARX中提供了多个提示用户输入的全局函数,包括中提供了多个提示用户输入的全局函数,包括acedGetString、acedGetPoint、acedGetInt、acedGetK
23、word和和acedGetReal等等nC#命名空间:命名空间:Autodesk.AutoCAD.EditorInputGetString、GetPoint、GetInt、GetKword和和GetReal等等输入提示并获取输入结果模板输入提示并获取输入结果模板输入提示输入提示PromptXXXOptionspOptions=newPromptXXXOptions(“”)获得输入结果获得输入结果(1)有指定类型返回结果)有指定类型返回结果PromptXXXResultpResult=ed.GetXXX(pOptions);(2)没有指定类型返回结果()没有指定类型返回结果(string型型)P
24、romptResultpResult=ed.GetXXX(pOptions);(3)得到具体结果,如)得到具体结果,如stringDK=pResult.StringResult.Trim();32国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互n输入提示抽象类:输入提示抽象类:PromptOptions,所有具体提示,所有具体提示输入类都继承了该类输入类都继承了该类33国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n读入字符串读入字符串34国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例
25、实例n读入读入Double型数据型数据35国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n读入读入Point36国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n拾取实体拾取实体37国家制造业信息化工程重大项目-CAD二次开发二次开发3、和用户交互、和用户交互-实例实例n打开打开dwg文件(文件(usingAutodesk.AutoCAD.Windows;)38国家制造业信息化工程重大项目-CAD二次开发二次开发2 2、使用、使用AutoCADAutoCAD内部命令内部命令主要内容3 3、和用户交互、和用户交互4
26、 4、选择集、选择集1 1、C+C+类型转换成类型转换成C#C#类型类型39国家制造业信息化工程重大项目-CAD二次开发二次开发4、选择集、选择集n1)获得)获得PickFirst选择集选择集 n2)在图形区域中选择对象)在图形区域中选择对象 n3)添加或合并多个选择集)添加或合并多个选择集 n4)定义选择集过滤规则)定义选择集过滤规则 n5)从选择集中移除对象)从选择集中移除对象 40国家制造业信息化工程重大项目-CAD二次开发二次开发4.1、获得获得PickFirst选择集选择集 nPickFirst选择集是在先选择对象后启动命令的时候创建的选择集是在先选择对象后启动命令的时候创建的n为了
27、获得为了获得PickFirst选择集的对象,必须满足:选择集的对象,必须满足:PICKFIRST系统变量必须设置为系统变量必须设置为1必须给命令定义必须给命令定义UsePickSet命令标记,用以通知命令要使用命令标记,用以通知命令要使用Pickfirst选择集选择集调用调用SelectImplied方法获得方法获得PickFirst选择集选择集41国家制造业信息化工程重大项目-CAD二次开发二次开发4.2、在图形区域中选择对象在图形区域中选择对象 n允许用户从图形中选择对象的函数:允许用户从图形中选择对象的函数:GetSelection:提示用户从屏幕中拾取对象提示用户从屏幕中拾取对象Sel
28、ectAll:在当前空间中选择所有对象,但不包括锁在当前空间中选择所有对象,但不包括锁定或冻结的定或冻结的SelectCrossingPolygon:选择与通过指定点定义的多选择与通过指定点定义的多边形内部和相交的对象。多边形可以是任何形状但不边形内部和相交的对象。多边形可以是任何形状但不能与它自己相交或接触能与它自己相交或接触SelectCrossingWindow:选择与通过两个点定义的区选择与通过两个点定义的区域内部和相交的对象域内部和相交的对象SelectFence:选择与选择栅格相交的所有对象。栅格选择与选择与选择栅格相交的所有对象。栅格选择与多边形相交选择是相似的,不同的是栅格不能
29、封闭,而且栅格可多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可以与自己相交以与自己相交42国家制造业信息化工程重大项目-CAD二次开发二次开发4.2、在图形区域中选择对象在图形区域中选择对象SelectLast:选择当前空间中最后创建的对象:选择当前空间中最后创建的对象SelectPrevious:选择在前一个选择对象提示时选择的所:选择在前一个选择对象提示时选择的所有对象有对象SelectWindow:选择完全包含在通过两个点定义的矩形:选择完全包含在通过两个点定义的矩形内部的所有对象内部的所有对象SelectWindowPolygon:选择完全包含在通过点定义的多:选择完全包含在
30、通过点定义的多边形里面的对象。多边形可以是任何形状但不能与它自己边形里面的对象。多边形可以是任何形状但不能与它自己相交或接触相交或接触SelectAtPoint:选择经过给定点的对象并将它们放到活动:选择经过给定点的对象并将它们放到活动选择集中去选择集中去SelectByPolygon:选择栅格内部的对象并将它们放到活:选择栅格内部的对象并将它们放到活动选择集中去动选择集中去43国家制造业信息化工程重大项目-CAD二次开发二次开发44国家制造业信息化工程重大项目-CAD二次开发二次开发4.3、添加或合并多个选择集、添加或合并多个选择集n用户可以合并多个选择集,需要创建一个用户可以合并多个选择集
31、,需要创建一个ObjectIdCollection对象,然后向其中添加多个选择集的对对象,然后向其中添加多个选择集的对象的象的ObjectID45国家制造业信息化工程重大项目-CAD二次开发二次开发4.4、定义选择集过滤规则、定义选择集过滤规则n选择集过滤规则类型:选择集过滤规则类型:使用选择集过滤器定义选择集规则使用选择集过滤器定义选择集规则在选择集过滤器中指定多个条件在选择集过滤器中指定多个条件添加复杂的过滤器列表条件添加复杂的过滤器列表条件在选择器过滤器条件中使用通配符在选择器过滤器条件中使用通配符过滤扩展数据过滤扩展数据46国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1
32、、使用选择集过滤器定义选择集规则使用选择集过滤器定义选择集规则n常用过滤器的常用过滤器的DXF组码组码47国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1、使用选择集过滤器定义选择集规则使用选择集过滤器定义选择集规则n过滤器类过滤器类SelectionFilter48国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.1、使用选择集过滤器定义选择集规则使用选择集过滤器定义选择集规则n实例:使用过滤器选择圆图形实体实例:使用过滤器选择圆图形实体49国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.2、在选择集过滤器中指定多个条件在选择集过滤器中指定多个条件n示例,
33、给定两个选择对象的过滤条件:示例,给定两个选择对象的过滤条件:对象必须是圆,并且必对象必须是圆,并且必须在图层须在图层0上上50国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.3、添加复杂的过滤器列表条件添加复杂的过滤器列表条件n指定多个选择条件的方式:指定多个选择条件的方式:对于数字项,用户可以指定关系运算(例如,圆的半对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于径必须大于或等于5.0)对于所有项,用户可以指定逻辑运算(例如对于所有项,用户可以指定逻辑运算(例如Text或或Mtext)51国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.3、添加复杂的
34、过滤器列表条件添加复杂的过滤器列表条件n实例实例1:选择半径大于或等于选择半径大于或等于5.0的圆的圆52国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.3、添加复杂的过滤器列表条件添加复杂的过滤器列表条件n实例实例2:选择选择Text或或Mtext对象对象53国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.4、在选择器过滤器条件中使用通配符在选择器过滤器条件中使用通配符n主要通配符主要通配符注:使用单引号注:使用单引号()表示下一个字符不是通配符,而是普通字符。例如,表示下一个字符不是通配符,而是普通字符。例如,要指定仅将命名为要指定仅将命名为“*U2”的匿名块包含在
35、选择集中,请使用的匿名块包含在选择集中,请使用“*U2”。54国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.4、在选择器过滤器条件中使用通配符在选择器过滤器条件中使用通配符n实例:实例:选择所有文字字符串中出现选择所有文字字符串中出现“The”的多行文字的多行文字55国家制造业信息化工程重大项目-CAD二次开发二次开发4.4.5、过滤扩展数据过滤扩展数据n外部应用程序可以向外部应用程序可以向AutoCAD对象附加数据,例如文字字符对象附加数据,例如文字字符串、数值、三维点、距离和图层名。这种数据称为外部数据或串、数值、三维点、距离和图层名。这种数据称为外部数据或Xdata56国家
36、制造业信息化工程重大项目-CAD二次开发二次开发n实例:实例:查找出包含通过查找出包含通过“MY_APP”应用程序添加的外部数据的应用程序添加的外部数据的圆圆57国家制造业信息化工程重大项目-CAD二次开发二次开发4.5、从选择集中移除对象、从选择集中移除对象n创建选择集之后,用户可以使用选定对象的创建选择集之后,用户可以使用选定对象的ObjectID列表列表n选择集不允许从它里面添加或删除选择集不允许从它里面添加或删除ObjectID,但可以使用一个但可以使用一个ObjectIDCollection对象合并多个选择集并将它当作一个对对象合并多个选择集并将它当作一个对象使用象使用n可以从可以从ObjectIDCollection对象上添加和移除对象上添加和移除ObjectID,使,使用用Remove或或RemoveAt方法从一个方法从一个ObjectIDCollection对象中移除对象中移除ObjectID58国家制造业信息化工程重大项目-CAD二次开发二次开发谢谢!谢谢!