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

下载本文档

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

文档简介

第6讲AutoCAD内部命令调用及用户交互2、使用AutoCAD内部命令主要内容3、和用户交互4、选择集1、C++类型转换成C#类型1、C#调用dll时的类型转换C++(Win32)C#char**作为输入参数转为char[],通过Encoding类对这个string[]进行编码后得到的一个char[]作为输出参数转为byte[],通过Encoding类对这个byte[]进行解码,得到字符串C++Dll接口:voidCplusplusToCsharp(inchar**AgentID,outchar**AgentIP);C#中的声明:[DllImport("Example.dll")]publicstaticexternvoidCplusplusToCsharp(char[]AgentID,byte[]AgentIP);C#中的调用:Encodingencode=Encoding.Default;byte[]tAgentID;byte[]tAgentIP;string[]AgentIP;tAgentID=newbyte[100];tAgentIP=newbyte[100];CplusplusToCsharp(encode.GetChars(tAgentID),tAgentIP);AgentIP[i]=encode.GetString(tAgentIP,i*Length,Length);1、C#调用dll时的类型转换HandleIntPtrHwndIntPtrint*refintint&refintvoid*IntPtrunsignedchar*refbyteBOOLboolDWORDint

uint(int

更常用一些)枚举类型Win32:BOOLMessageBeep(UINTuType//

声音类型);

其中的声音类型为枚举类型中的某一值。C#:用户需要自己定义一个枚举类型:publicenumBeepType{

SimpleBeep=-1,

IconAsterisk=0x00000040,

IconExclamation=0x00000030,

IconHand=0x00000010,

IconQuestion=0x00000020,

Ok=0x00000000,}C#中导入该函数:[DllImport("user32.dll")]publicstaticexternboolMessageBeep(BeepTypebeepType);C#中调用该函数:

MessageBeep(BeepType.IconQuestion);1、C#调用dll时的类型转换结构转换Win32:使用结构指针作为参数的函数:BOOLGetSystemPowerStatus(LPSYSTEM_POWER_STATUSlpSystemPowerStatus);Win32中该结构体的定义:typedefstruct_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#:用户自定义相应的结构体:structSystemPowerStatus{

byteACLineStatus;

bytebatteryFlag;

bytebatteryLifePercent;

bytereserved1;

intbatteryLifeTime;

intbatteryFullLifeTime;}C#中导入该函数:[DllImport("kernel32.dll")]publicstaticexternboolGetSystemPowerStatus(

refSystemPowerStatussystemPowerStatus);C#中调用该函数:SystemPowerStatussps;….sps初始化赋值……GetSystemPowerStatus(refsps);1、C#调用dll时的类型转换字符串对于字符串的处理分为以下几种情况:1、字符串常量指针的处理(LPCTSTR),也适应于字符串常量的处理,.net中的string类型是不可变的类型2、字符串缓冲区的处理(char*),即对于变长字符串的处理,.net中StringBuilder可用作缓冲区1、C#调用dll时的类型转换--字符串实例Win32:BOOLGetFile(LPCTSTRlpRootPathName);C#:函数声明:[DllImport("kernel32.dll",CharSet=CharSet.Auto)]staticexternboolGetFile(

[MarshalAs(UnmanagedType.LPTStr)]

stringrootPathName);函数调用:stringpathname;GetFile(pathname);备注:DllImport中的CharSet是为了说明自动地调用该函数相关的Ansi版本或者Unicode版本1、C#调用dll时的类型转换--字符串实例变长字符串处理:C#:函数声明:[DllImport("kernel32.dll",CharSet=CharSet.Auto)]publicstaticexternintGetShortPathName(

[MarshalAs(UnmanagedType.LPTStr)]

stringpath,

[MarshalAs(UnmanagedType.LPTStr)]

StringBuildershortPath,

intshortPathLength);函数调用:StringBuildershortPath=newStringBuilder(80);intresult=GetShortPathName(@"d:\test.jpg",shortPath,shortPath.Capacity);strings=shortPath.ToString();1、C#调用dll时的类型转换struct具有内嵌字符数组的结构:Win32:typedefstruct_TIME_ZONE_INFORMATION{

LONG

Bias;

WCHAR

StandardName[32];

SYSTEMTIMEStandardDate;

LONG

StandardBias;

WCHAR

DaylightName[32];

SYSTEMTIMEDaylightDate;

LONG

DaylightBias;}TIME_ZONE_INFORMATION,*PTIME_ZONE_INFORMATION;1、C#调用dll时的类型转换C#:[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]structTimeZoneInformation{

publicintbias;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]

publicstringstandardName;

DateTimestandardDate;

publicintstandardBias;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]

publicstringdaylightName;

SystemTimedaylightDate;

publicintdaylightBias;}1、C#调用dll时的类型转换具有回调的函数Win32:BOOLEnumDesktops(

HWINSTAhwinsta,

//

窗口实例的句柄ENUMDESKTOPPROClpEnumFunc,//

回调函数

LPARAMlParam

//

用于回调函数的值);回调函数DESKTOPENUMPROC的声明:BOOLCALLBACKEnumDesktopProc(

LPTSTRlpszDesktop,

//

桌面名称

LPARAMlParam

//

用户定义的值);1、C#调用dll时的类型转换C#:将回调函数的声明转化为委托:delegateboolEnumDesktopProc(

[MarshalAs(UnmanagedType.LPTStr)]

stringdesktopName,

intlParam);该函数在C#中的声明:[DllImport("user32.dll",CharSet=CharSet.Auto)]

staticexternboolEnumDesktops(

IntPtrwindowStation,

EnumDesktopProccallback,

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

intacedCommand(intrtype,...unnamed);

acedCommand函数.NET中调用acedCommand函数实例:绘制圆效果acedCommand函数创建将块生成ICON命令BlockIconacedCmd函数C++中,acedCmd函数的定义为:intacedCmd(conststructresbuf*rbp);该函数的参数是一个resbuf类型的指针,这里需要的结果缓冲区可以由acutBuildList函数生成。由于acedCommand函数实质上也是为要执行的命令构造了一个resbuf结构,因此acedCmd函数和acedCommand函数完全能够实现相同的功能

acedCmd函数unionads_u_val{

ads_realrreal;ads_realrpoint[3];shortrint;//Mustbedeclaredshort,notint.char*rstring;longrlname[2];longrlong;structads_binaryrbinary;};

structresbuf{

structresbuf*rbnext;//Linkedlistpointershortrestype;unionads_u_valresval;};

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

(1)有指定类型返回结果PromptXXXResultpResult=ed.GetXXX(pOptions);

(2)没有指定类型返回结果(string型)PromptResultpResult=ed.GetXXX(pOptions);

(3)得到具体结果,如stringDK=pResult.StringResult.Trim();3、和用户交互输入提示抽象类:PromptOptions,所有具体提示输入类都继承了该类3、和用户交互--实例读入字符串3、和用户交互--实例读入Double型数据3、和用户交互--实例读入Point3、和用户交互--实例拾取实体3、和用户交互--实例打开dwg文件(usingAutodesk.AutoCAD.Windows;)2、使用AutoCAD内部命令主要内容3、和用户交互4、选择集1、C++类型转换成C#类型4、选择集1)获得PickFirst选择集2)在图形区域中选择对象3)添加或合并多个选择集4)定义选择集过滤规则5)从选择集中移除对象4.1、获得PickFirst选择集PickFirst选择集是在先选择对象后启动命令的时候创建的为了获得PickFirst选择集的对象,必须满足:PICKFIRST系统变量必须设置为1必须给命令定义UsePickSet命令标记,用以通知命令要使用Pickfirst选择集调用SelectImplied方法获得PickFirst选择集4.2、在图形区域中选择对象允许用户从图形中选择对象的函数:

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

SelectCrossingWindow:选择与通过两个点定义的区域内部和相交的对象SelectFence:选择与选择栅格相交的所有对象。栅格选择与多边形相交选择是相似的,不同的是栅格不能封闭,而且栅格可以与自己相交4.2、在图形区域中选择对象SelectLast:选择当前空间中最后创建的对象SelectPrevious:选择在前一个选择对象提示时选择的所有对象SelectWindow:选择完全包含在通过两个点定义的矩形内部的所有对象SelectWindowPolygon:选择完全包含在通过点定义的多边形里面的对象。多边形可以是任何形状但不能与它自己相交或接触SelectAtPoint:选择经过给定点的对象并将它们放到活动选择集中去SelectByPolygon:选择栅格内部的对象并将它们放到活动选择集中去4.3、添加或合并多个选择集用户可以合并多个选择集,需要创建一个ObjectIdCollection对象,然后向其中添加多个选择集的对象的ObjectID4.4、定义选择集过滤规则选择集过滤规则类型:使用选择集过滤器定义选择集规则在选择集过滤器中指定多个条件添加复杂的过滤器列表条件在选择器过滤器条件中使用通配符过滤扩展数据4.4.1、使用选择集过滤器定义选择集规则常用过滤器的DXF组码4.4.1、使用选

温馨提示

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

评论

0/150

提交评论