第6講 AutoCAd內(nèi)部命令調(diào)用及用戶交互_第1頁
第6講 AutoCAd內(nèi)部命令調(diào)用及用戶交互_第2頁
第6講 AutoCAd內(nèi)部命令調(diào)用及用戶交互_第3頁
第6講 AutoCAd內(nèi)部命令調(diào)用及用戶交互_第4頁
第6講 AutoCAd內(nèi)部命令調(diào)用及用戶交互_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6講AutoCAD內(nèi)部命令調(diào)用及用戶交互2、使用AutoCAD內(nèi)部命令主要內(nèi)容3、和用戶交互4、選擇集1、C++類型轉(zhuǎn)換成C#類型1、C#調(diào)用dll時的類型轉(zhuǎn)換C++(Win32)C#char**作為輸入?yún)?shù)轉(zhuǎn)為char[],通過Encoding類對這個string[]進(jìn)行編碼后得到的一個char[]作為輸出參數(shù)轉(zhuǎn)為byte[],通過Encoding類對這個byte[]進(jìn)行解碼,得到字符串C++Dll接口:voidCplusplusToCsharp(inchar**AgentID,outchar**AgentIP);C#中的聲明:[DllImport("Example.dll")]publicstaticexternvoidCplusplusToCsharp(char[]AgentID,byte[]AgentIP);C#中的調(diào)用: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#調(diào)用dll時的類型轉(zhuǎn)換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#中導(dǎo)入該函數(shù):[DllImport("user32.dll")]publicstaticexternboolMessageBeep(BeepTypebeepType);C#中調(diào)用該函數(shù):

MessageBeep(BeepType.IconQuestion);1、C#調(diào)用dll時的類型轉(zhuǎn)換結(jié)構(gòu)轉(zhuǎn)換Win32:使用結(jié)構(gòu)指針作為參數(shù)的函數(shù):BOOLGetSystemPowerStatus(LPSYSTEM_POWER_STATUSlpSystemPowerStatus);Win32中該結(jié)構(gòu)體的定義:typedefstruct_SYSTEM_POWER_STATUS{BYTE

ACLineStatus;BYTE

BatteryFlag;BYTE

BatteryLifePercent;BYTE

Reserved1;DWORD

BatteryLifeTime;DWORD

BatteryFullLifeTime;}SYSTEM_POWER_STATUS,*LPSYSTEM_POWER_STATUS;1、C#調(diào)用dll時的類型轉(zhuǎn)換C#:用戶自定義相應(yīng)的結(jié)構(gòu)體:structSystemPowerStatus{

byteACLineStatus;

bytebatteryFlag;

bytebatteryLifePercent;

bytereserved1;

intbatteryLifeTime;

intbatteryFullLifeTime;}C#中導(dǎo)入該函數(shù):[DllImport("kernel32.dll")]publicstaticexternboolGetSystemPowerStatus(

refSystemPowerStatussystemPowerStatus);C#中調(diào)用該函數(shù):SystemPowerStatussps;….sps初始化賦值……GetSystemPowerStatus(refsps);1、C#調(diào)用dll時的類型轉(zhuǎn)換字符串對于字符串的處理分為以下幾種情況:1、字符串常量指針的處理(LPCTSTR),也適應(yīng)于字符串常量的處理,.net中的string類型是不可變的類型2、字符串緩沖區(qū)的處理(char*),即對于變長字符串的處理,.net中StringBuilder可用作緩沖區(qū)1、C#調(diào)用dll時的類型轉(zhuǎn)換--字符串實例Win32:BOOLGetFile(LPCTSTRlpRootPathName);C#:函數(shù)聲明:[DllImport("kernel32.dll",CharSet=CharSet.Auto)]staticexternboolGetFile(

[MarshalAs(UnmanagedType.LPTStr)]

stringrootPathName);函數(shù)調(diào)用:stringpathname;GetFile(pathname);備注:DllImport中的CharSet是為了說明自動地調(diào)用該函數(shù)相關(guān)的Ansi版本或者Unicode版本1、C#調(diào)用dll時的類型轉(zhuǎn)換--字符串實例變長字符串處理:C#:函數(shù)聲明:[DllImport("kernel32.dll",CharSet=CharSet.Auto)]publicstaticexternintGetShortPathName(

[MarshalAs(UnmanagedType.LPTStr)]

stringpath,

[MarshalAs(UnmanagedType.LPTStr)]

StringBuildershortPath,

intshortPathLength);函數(shù)調(diào)用:StringBuildershortPath=newStringBuilder(80);intresult=GetShortPathName(@"d:\test.jpg",shortPath,shortPath.Capacity);strings=shortPath.ToString();1、C#調(diào)用dll時的類型轉(zhuǎn)換struct具有內(nèi)嵌字符數(shù)組的結(jié)構(gòu):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#調(diào)用dll時的類型轉(zhuǎn)換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#調(diào)用dll時的類型轉(zhuǎn)換具有回調(diào)的函數(shù)Win32:BOOLEnumDesktops(

HWINSTAhwinsta,

//

窗口實例的句柄ENUMDESKTOPPROClpEnumFunc,//

回調(diào)函數(shù)

LPARAMlParam

//

用于回調(diào)函數(shù)的值);回調(diào)函數(shù)DESKTOPENUMPROC的聲明:BOOLCALLBACKEnumDesktopProc(

LPTSTRlpszDesktop,

//

桌面名稱

LPARAMlParam

//

用戶定義的值);1、C#調(diào)用dll時的類型轉(zhuǎn)換C#:將回調(diào)函數(shù)的聲明轉(zhuǎn)化為委托:delegateboolEnumDesktopProc(

[MarshalAs(UnmanagedType.LPTStr)]

stringdesktopName,

intlParam);該函數(shù)在C#中的聲明:[DllImport("user32.dll",CharSet=CharSet.Auto)]

staticexternboolEnumDesktops(

IntPtrwindowStation,

EnumDesktopProccallback,

intlParam);2、使用AutoCAD內(nèi)部命令主要內(nèi)容3、和用戶交互4、選擇集1、C++類型轉(zhuǎn)換成C#類型2、使用AutoCAD內(nèi)部命令方式一:使用SendStringToExecute方式二:使用P/Invoke使用SendStringToExecuteSendStringToExecute方法將單個字符串發(fā)送到命令行。該字符串必須包含提供給所執(zhí)行命令的參數(shù),并依照該命令的提示順序所要求的次序排列這些參數(shù)使用SendStringToExecute執(zhí)行命令是異步的,直到.NET命令結(jié)束,否則不會被調(diào)用使用P/Invoke方式在ObjectARX編程中,可以使用以下函數(shù)來執(zhí)行AutoCAD內(nèi)部的命令acedCommandacedCmdacedCommand函數(shù)C++acedCommand函數(shù)的定義為:

intacedCommand(intrtype,...unnamed);

acedCommand函數(shù).NET中調(diào)用acedCommand函數(shù)實例:繪制圓效果acedCommand函數(shù)創(chuàng)建將塊生成ICON命令BlockIconacedCmd函數(shù)C++中,acedCmd函數(shù)的定義為:intacedCmd(conststructresbuf*rbp);該函數(shù)的參數(shù)是一個resbuf類型的指針,這里需要的結(jié)果緩沖區(qū)可以由acutBuildList函數(shù)生成。由于acedCommand函數(shù)實質(zhì)上也是為要執(zhí)行的命令構(gòu)造了一個resbuf結(jié)構(gòu),因此acedCmd函數(shù)和acedCommand函數(shù)完全能夠?qū)崿F(xiàn)相同的功能

acedCmd函數(shù)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函數(shù)C#中使用acedCmd函數(shù)創(chuàng)建Zoom實例acedCmd函數(shù)C#中使用acedCmd函數(shù)創(chuàng)建Circle實例2、使用AutoCAD內(nèi)部命令主要內(nèi)容3、和用戶交互4、選擇集1、C++類型轉(zhuǎn)換成C#類型3、和用戶交互AutoCAD中命令提示如在AutoCAD中執(zhí)行PLINE命令時,能夠得到如下的命令提示:命令:_pline指定起點:當(dāng)前線寬為0.0000指定下一個點或[圓弧(A)/半寬(H)/長度(L)/放棄(U)/寬度(W)]:指定下一點或[圓弧(A)/閉合(C)/半寬(H)/長度(L)/放棄(U)/寬度(W)]:其中的提示“指定下一個點或[圓弧(A)/半寬(H)/長度(L)/放棄(U)/寬度(W)]:”就將提示用戶輸入點和關(guān)鍵字結(jié)合在一起。3、和用戶交互C++ObjectARX中提供了多個提示用戶輸入的全局函數(shù),包括acedGetString、acedGetPoint、acedGetInt、acedGetKword和acedGetReal等C#命名空間:Autodesk.AutoCAD.EditorInputGetString、GetPoint、GetInt、GetKword和GetReal等輸入提示并獲取輸入結(jié)果模板輸入提示PromptXXXOptionspOptions=newPromptXXXOptions(“…”)獲得輸入結(jié)果

(1)有指定類型返回結(jié)果PromptXXXResultpResult=ed.GetXXX(pOptions);

(2)沒有指定類型返回結(jié)果(string型)PromptResultpResult=ed.GetXXX(pOptions);

(3)得到具體結(jié)果,如stringDK=pResult.StringResult.Trim();3、和用戶交互輸入提示抽象類:PromptOptions,所有具體提示輸入類都繼承了該類3、和用戶交互--實例讀入字符串3、和用戶交互--實例讀入Double型數(shù)據(jù)3、和用戶交互--實例讀入Point3、和用戶交互--實例拾取實體3、和用戶交互--實例打開dwg文件(usingAutodesk.AutoCAD.Windows;)2、使用AutoCAD內(nèi)部命令主要內(nèi)容3、和用戶交互4、選擇集1、C++類型轉(zhuǎn)換成C#類型4、選擇集1)獲得PickFirst選擇集2)在圖形區(qū)域中選擇對象3)添加或合并多個選擇集4)定義選擇集過濾規(guī)則5)從選擇集中移除對象4.1、獲得PickFirst選擇集PickFirst選擇集是在先選擇對象后啟動命令的時候創(chuàng)建的為了獲得PickFirst選擇集的對象,必須滿足:PICKFIRST系統(tǒng)變量必須設(shè)置為1必須給命令定義UsePickSet命令標(biāo)記,用以通知命令要使用Pickfirst選擇集調(diào)用SelectImplied方法獲得PickFirst選擇集4.2、在圖形區(qū)域中選擇對象允許用戶從圖形中選擇對象的函數(shù):

GetSelection:提示用戶從屏幕中拾取對象SelectAll:在當(dāng)前空間中選擇所有對象,但不包括鎖定或凍結(jié)的SelectCrossingPolygon:選擇與通過指定點定義的多邊形內(nèi)部和相交的對象。多邊形可以是任何形狀但不能與它自己相交或接觸

SelectCrossingWindow:選擇與通過兩個點定義的區(qū)域內(nèi)部和相交的對象SelectFence:選擇與選擇柵格相交的所有對象。柵格選擇與多邊形相交選擇是相似的,不同的是柵格不能封閉,而且柵格可以與自己相交4.2、在圖形區(qū)域中選擇對象SelectLast:選擇當(dāng)前空間中最后創(chuàng)建的對象SelectPrevious:選擇在前一個選擇對象提示時選擇的所有對象SelectWindow:選擇完全包含在通過兩個點定義的矩形內(nèi)部的所有對象SelectWindowPolygon:選擇完全包含在通過點定義的多邊形里面的對象。多邊形可以是任何形狀但不能與它自己相交或接觸SelectAtPoint:選擇經(jīng)過給定點的對象并將它們放到活動選擇集中去SelectByPolygon:選擇柵格內(nèi)部的對象并將它們放到活動選擇集中去4.3、添加或合并多個選擇集用戶可以合并多個選擇集,需要創(chuàng)建一個ObjectIdCollection對象,然后向其中添加多個選擇集的對象的ObjectID4.4、定義選擇集過濾規(guī)則選擇集過濾規(guī)則類型:使用選擇集過濾器定義選擇集規(guī)則在選擇集過濾器中指定多個條件添加復(fù)雜的過濾器列表條件在選擇器過濾器條件中使用通配符過濾擴(kuò)展數(shù)據(jù)4.4.1、使用選擇集過濾器定義選擇集規(guī)則常用過濾器的DXF組碼4.4.1、使用選

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論