收藏 分享(赏)

第6讲 AutoCAd内部命令调用及用户交互.ppt

上传人:gsy285395 文档编号:4479892 上传时间:2018-12-30 格式:PPT 页数:58 大小:852.50KB
下载 相关 举报
第6讲 AutoCAd内部命令调用及用户交互.ppt_第1页
第1页 / 共58页
第6讲 AutoCAd内部命令调用及用户交互.ppt_第2页
第2页 / 共58页
第6讲 AutoCAd内部命令调用及用户交互.ppt_第3页
第3页 / 共58页
第6讲 AutoCAd内部命令调用及用户交互.ppt_第4页
第4页 / 共58页
第6讲 AutoCAd内部命令调用及用户交互.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

1、,第6讲 AutoCAD内部命令调用及用户交互,主讲人:刘德儿,2、使用AutoCAD内部命令,主要内容,3、和用户交互,4、选择集,1、C+类型转换成C#类型,1、C#调用dll时的类型转换,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 =

2、Encoding.Default; byte tAgentID; byte tAgentIP; string AgentIP; tAgentID = new byte100; tAgentIP = new byte100; CplusplusToCsharp(encode.GetChars(tAgentID), tAgentIP); AgentIPi = encode.GetString(tAgentIP,i*Length,Length);,1、C#调用dll时的类型转换,1、C#调用dll时的类型转换,结构转换 Win32: 使用结构指针作为参数的函数: BOOL GetSystemPowe

3、rStatus( LPSYSTEM_POWER_STATUS lpSystemPowerStatus); Win32中该结构体的定义: typedef struct _SYSTEM_POWER_STATUS BYTE ACLineStatus; BYTE BatteryFlag; BYTE BatteryLifePercent; BYTE Reserved1; DWORD BatteryLifeTime; DWORD BatteryFullLifeTime; SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;,1、C#调用dll时的类型转换,C#:用户自定

4、义相应的结构体: struct SystemPowerStatus byte ACLineStatus;byte batteryFlag;byte batteryLifePercent;byte reserved1;int batteryLifeTime;int batteryFullLifeTime; C#中导入该函数: DllImport(“kernel32.dll“) public static extern bool GetSystemPowerStatus(ref SystemPowerStatus systemPowerStatus); C#中调用该函数: SystemPowerS

5、tatus sps; .sps初始化赋值 GetSystemPowerStatus(ref sps);,1、C#调用dll时的类型转换,1、C#调用dll时的类型转换-字符串实例,Win32: BOOL GetFile(LPCTSTR lpRootPathName); C#: 函数声明: DllImport(“kernel32.dll“, CharSet = CharSet.Auto) static extern bool GetFile (MarshalAs(UnmanagedType.LPTStr)string rootPathName); 函数调用: string pathname; G

6、etFile(pathname); 备注: DllImport中的CharSet是为了说明自动地调用该函数相关的Ansi版本或者Unicode版本,1、C#调用dll时的类型转换-字符串实例,变长字符串处理: C#: 函数声明: DllImport(“kernel32.dll“, CharSet = CharSet.Auto) public static extern int GetShortPathName(MarshalAs(UnmanagedType.LPTStr)string path,MarshalAs(UnmanagedType.LPTStr)StringBuilder short

7、Path,int shortPathLength); 函数调用: StringBuilder shortPath = new StringBuilder(80); int result = GetShortPathName( “d:test.jpg“, shortPath, shortPath.Capacity); string s = shortPath.ToString();,1、C#调用dll时的类型转换,1、C#调用dll时的类型转换,C#: StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode) struct Ti

8、meZoneInformation public int bias;MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)public string standardName;DateTime standardDate;public int standardBias;MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)public string daylightName;SystemTime daylightDate;public int daylightBias; ,1、C#调用dll时的类型转换,

9、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( IntPtr windowStation, EnumDesktopProc callback, int lParam);,2、使用AutoCAD内部命令,主要内

10、容,3、和用户交互,4、选择集,1、C+类型转换成C#类型,2、使用AutoCAD内部命令,方式一:使用SendStringToExecute 方式二:使用P/Invoke,使用SendStringToExecute,SendStringToExecute 方法将单个字符串发送到命令行。该字符串必须包含提供给所执行命令的参数,并依照该命令的提示顺序所要求的次序排列这些参数 使用 SendStringToExecute 执行命令是异步的,直到 .NET 命令结束,否则不会被调用,使用P/Invoke方式,在ObjectARX编程中,可以使用以下函数来执行AutoCAD内部的命令 acedComm

11、and acedCmd,acedCommand函数,C+ acedCommand函数的定义为: int acedCommand(int rtype, . unnamed);,acedCommand函数,.NET中调用acedCommand函数 实例:绘制圆,效果,acedCommand函数,创建将块生成ICON命令 BlockIcon,acedCmd函数,C+中,acedCmd函数的定义为: int acedCmd(const struct resbuf * rbp); 该函数的参数是一个resbuf类型的指针,这里需要的结果缓冲区可以由acutBuildList函数生成。由于acedComm

12、and函数实质上也是为要执行的命令构造了一个resbuf结构,因此acedCmd函数和acedCommand函数完全能够实现相同的功能,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_binary rbinary; ;struct resbuf struct resbuf *rbnext; / Linked list point

13、er short restype;union ads_u_val resval;,acedCmd函数,C#中使用acedCmd函数 创建Zoom实例,acedCmd函数,C#中使用acedCmd函数 创建Circle实例,2、使用AutoCAD内部命令,主要内容,3、和用户交互,4、选择集,1、C+类型转换成C#类型,3、和用户交互,AutoCAD中命令提示 如在AutoCAD中执行PLINE命令时,能够得到如下的命令提示:,命令: _pline 指定起点: 当前线宽为 0.0000 指定下一个点或 圆弧(A)/半宽(H)/长度(L)/放弃(U)/宽度(W): 指定下一点或 圆弧(A)/闭合(

14、C)/半宽(H)/长度(L)/放弃(U)/宽度(W):,其中的提示“指定下一个点或 圆弧(A)/半宽(H)/长度(L)/放弃(U)/宽度(W):”就将提示用户输入点和关键字结合在一起。,3、和用户交互,C+ ObjectARX中提供了多个提示用户输入的全局函数,包括acedGetString、acedGetPoint、acedGetInt、acedGetKword和acedGetReal等 C# 命名空间:Autodesk.AutoCAD.EditorInput GetString、GetPoint、GetInt、GetKword和GetReal等 输入提示并获取输入结果模板 输入提示Prom

15、ptXXXOptions pOptions =new PromptXXXOptions(“”) 获得输入结果(1)有指定类型返回结果PromptXXXResult pResult = ed.GetXXX(pOptions );(2)没有指定类型返回结果(string型)PromptResult pResult = ed.GetXXX(pOptions );(3)得到具体结果,如string DK = pResult .StringResult.Trim();,3、和用户交互,输入提示抽象类:PromptOptions,所有具体提示输入类都继承了该类,3、和用户交互-实例,读入字符串,3、和用户

16、交互-实例,读入Double型数据,3、和用户交互-实例,读入Point,3、和用户交互-实例,拾取实体,3、和用户交互-实例,打开dwg文件(using Autodesk.AutoCAD.Windows;),2、使用AutoCAD内部命令,主要内容,3、和用户交互,4、选择集,1、C+类型转换成C#类型,4、选择集,1)获得PickFirst选择集 2)在图形区域中选择对象 3)添加或合并多个选择集 4)定义选择集过滤规则 5)从选择集中移除对象,4.1、获得PickFirst选择集,PickFirst 选择集是在先选择对象后启动命令的时候创建的 为了获得 PickFirst 选择集的对象,

17、必须满足: PICKFIRST 系统变量必须设置为 1 必须给命令定义 UsePickSet 命令标记,用以通知命令要使用 Pickfirst 选择集 调用 SelectImplied 方法获得 PickFirst 选择集,4.2、在图形区域中选择对象,允许用户从图形中选择对象的函数:GetSelection:提示用户从屏幕中拾取对象 SelectAll:在当前空间中选择所有对象,但不包括锁定或冻结的 SelectCrossingPolygon:选择与通过指定点定义的多边形内部和相交的对象。多边形可以是任何形状但不能与它自己相交或接触 SelectCrossingWindow:选择与通过两个点

18、定义的区域内部和相交的对象 SelectFence:选择与选择栅格相交的所有对象。栅格选择与多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可以与自己相交,4.2、在图形区域中选择对象,SelectLast:选择当前空间中最后创建的对象 SelectPrevious:选择在前一个选择对象提示时选择的所有对象 SelectWindow:选择完全包含在通过两个点定义的矩形内部的所有对象 SelectWindowPolygon:选择完全包含在通过点定义的多边形里面的对象。多边形可以是任何形状但不能与它自己相交或接触 SelectAtPoint:选择经过给定点的对象并将它们放到活动选择集中去 S

19、electByPolygon:选择栅格内部的对象并将它们放到活动选择集中去,4.3、添加或合并多个选择集,用户可以合并多个选择集,需要创建一个 ObjectIdCollection 对象,然后向其中添加多个选择集的对象的 ObjectID,4.4、定义选择集过滤规则,选择集过滤规则类型: 使用选择集过滤器定义选择集规则 在选择集过滤器中指定多个条件 添加复杂的过滤器列表条件 在选择器过滤器条件中使用通配符 过滤扩展数据,4.4.1、使用选择集过滤器定义选择集规则,常用过滤器的 DXF 组码,4.4.1、使用选择集过滤器定义选择集规则,过滤器类SelectionFilter,4.4.1、使用选择

20、集过滤器定义选择集规则,实例:使用过滤器选择圆图形实体,4.4.2、在选择集过滤器中指定多个条件,示例,给定两个选择对象的过滤条件:对象必须是圆,并且必须在图层 0 上,4.4.3、添加复杂的过滤器列表条件,指定多个选择条件的方式: 对于数字项,用户可以指定关系运算(例如,圆的半径必须大于或等于 5.0) 对于所有项,用户可以指定逻辑运算(例如 Text 或 Mtext),4.4.3、添加复杂的过滤器列表条件,实例1:选择半径大于或等于 5.0 的圆,4.4.3、添加复杂的过滤器列表条件,实例2:选择 Text 或 Mtext 对象,4.4.4、在选择器过滤器条件中使用通配符,主要通配符,注:

21、使用单引号 () 表示下一个字符不是通配符,而是普通字符。例如,要指定仅将命名为“*U2”的匿名块包含在选择集中,请使用“*U2”。,4.4.4、在选择器过滤器条件中使用通配符,实例:选择所有文字字符串中出现“The”的多行文字,4.4.5、过滤扩展数据,外部应用程序可以向 AutoCAD 对象附加数据,例如文字字符串、数值、三维点、距离和图层名。这种数据称为外部数据或 Xdata,实例:查找出包含通过“MY_APP”应用程序添加的外部数据的圆,4.5、从选择集中移除对象,创建选择集之后,用户可以使用选定对象的 ObjectID 列表 选择集不允许从它里面添加或删除 ObjectID,但可以使用一个 ObjectIDCollection 对象合并多个选择集并将它当作一个对象使用 可以从 ObjectIDCollection 对象上添加和移除 ObjectID,使用 Remove 或 RemoveAt 方法从一个 ObjectIDCollection 对象中移除 ObjectID,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 机械制造 > CAD/CAE/CAM

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报