国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ObjectARX的AutoCAD塊替換的實現(xiàn)

2015-02-25 21:12
現(xiàn)代機械 2015年6期
關(guān)鍵詞:拷貝調(diào)用對象

(炬威冶金技術(shù)(上海)有限公司,上海 200083)

塊是AutoCAD中的一個重要概念,它把相關(guān)的圖形和信息組織在一起。在實際的繪圖過程中,常常需要替換一個塊。AutoCAD自帶的簡單的、不完善的塊替換命令,把DWG文件中一個塊的所有塊引用替換為另一個塊的塊引用。塊替換命令的使用是有條件的,對于舊塊和新塊,它們必須都是沒有屬性的簡單塊,或者各個屬性Tag完全一致的屬性塊。如果有屬性Tag不一致的情況,那么在執(zhí)行塊同步命令后,屬性塊的屬性值會丟失。而為新塊重新輸入屬性值的工作即枯燥又繁重。本文將基于AutoCAD的ObjectARX二次開發(fā)技術(shù)建立一個可以對屬性定義不同的塊進行替換處理的擴展程序。

1 ObjectARX簡介

ObjectARX是Autodesk公司的一種編程環(huán)境,提供了面向?qū)ο蟮腃++、C#和VB.NET應(yīng)用編程接口,用于對AutoCAD和基于它的垂直產(chǎn)品進行二次開發(fā)。

ObjectARX編程環(huán)境包含了豐富而又靈活的工具集使得開發(fā)者可以充分利用AutoCAD軟件的開放架構(gòu)。同時還提供了直接訪問AutoCAD數(shù)據(jù)庫結(jié)構(gòu)、圖形系統(tǒng)和定義原生命令的方法。

利用ObjectARX技術(shù)可以開發(fā)出快速、高效、緊湊的AutoCAD應(yīng)用,使得設(shè)計人員可以從重復(fù)性的任務(wù)中解放出來。

ObjectARX有兩個版本,一個是原生接口,用于C++語言編程;一個是基于.NET環(huán)境的托管接口,用于C#和VB.NET編程[1]。

2 定義程序功能需求

根據(jù)可能出現(xiàn)的各種情況,程序需要實現(xiàn)三個函數(shù):

1)替換簡單塊的函數(shù);

2)替換只有一個屬性的屬性塊的函數(shù);

3)執(zhí)行期間指定映射關(guān)系并替換有多個屬性的屬性塊的函數(shù)。

3 程序架構(gòu)

程序的功能不復(fù)雜,在效率和空間占用上也沒有嚴格要求,在這里選擇C#程序設(shè)計語言,訪問托管版本ObjectARX進行程序設(shè)計和編寫。

創(chuàng)建一個命名空間,類命名為BlockReplace,創(chuàng)建三個函數(shù),分別處理簡單塊的替換、單屬性塊的替換和多屬性塊的替換。為了能夠通過鍵盤命令調(diào)用這些函數(shù),為他們添加命令方法屬性[1-2]。三個方法的聲明如下:

[CommandMethod("rb", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]

static public void RepalceBlock();

[CommandMethod("rsab", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]

static public void RepalceSingAttributeBlock();

[CommandMethod("rmab", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]

static public void RepalceMultiAttributeBlock();

最后需要彈出一個對話框來手動指定屬性名的映射,這個對話框命名為AttributeMapDialogue,聲明如下:

public partial class AttributeMapDialogue : Window;

按照ObjectARX的要求,這里不能使用常規(guī)的WinForm,必須采用基于WPF(Windows Presentation Foundation)的用戶界面[3]。所以AttributeMapDialogue類派生自System.Windows.Window類[4]。

4 具體實現(xiàn)

程序需要實現(xiàn)三個可以被AutoCAD命令行調(diào)用的三個函數(shù)來完成簡單塊的替換、單屬性塊的替換和多屬性塊的替換。這三個函數(shù)大體上都分為三個步驟:

1)選擇將要被替換的舊塊引用;

2)選擇用于替換的新塊引用;

3)用新塊引用替換舊塊引用。

下面分別解釋這三個步驟的實現(xiàn)。

4.1 選擇舊塊引用

在上面提到的三個函數(shù)中,分別要求被選擇的塊是無屬性的簡單塊、單屬性塊和多屬性塊。為此,在指定單實體選擇模式的基礎(chǔ)上,還需要指定被選擇對象的兩個屬性構(gòu)造選擇過濾器:一是實體的類型屬性應(yīng)該是“Insert”,也就是塊;二是有無跟隨屬性。

獲取選擇集之后,遍歷選擇集中的塊,確定它們擁有同一個名稱,否則,退出函數(shù)。

4.2 選擇新塊引用

創(chuàng)建PromptEntityOptions對象,調(diào)用AddAllowedClass()方法,設(shè)置允許選擇的對象類型為塊。

選擇之后對選擇結(jié)果進行檢查。對于無屬性簡單塊的替換,要求屬性集合的數(shù)量為0;對于單屬性塊的替換,要求屬性集合的數(shù)量為1;對于多屬性塊的替換,要求屬性集合的數(shù)量大于1。如果不滿足其中之一需重新選擇。

4.3 用新塊引用替換舊塊引用

這個步驟又分為三個小步驟:

1)創(chuàng)建新塊引用;

2)拷貝Properties值和Attributes值;

3)刪除舊塊引用。

為一個舊塊引用創(chuàng)建一個新塊引用的時候,需確定兩個參數(shù),一是舊塊引用的坐標,二是新塊的名稱。

拷貝Property值只需要在同名稱的Property之間進行賦值。

拷貝Attribute值的方法取決于替換的塊的類型。

a. 對于無屬性簡單塊的替換,不需要拷貝Attribute值。

b. 對于單屬性塊的替換,需拷貝一個Attribute值。訪問舊塊引用,生成屬性引用集合的枚舉,直接把第一個——實際上也是唯一的一個——屬性引用的值拷貝給一個字符串變量。之后遍歷新塊定義中的所有ObjectId,調(diào)用ObjectId的GetObject()方法,使用as關(guān)鍵字把對象引用轉(zhuǎn)換成AttributeDefinition對象引用并賦值給一個AttributeDefinition類型的變量,如果該變量不為空,那我們就找到了新塊的唯一一個AttributeDefinition[3]。

立即創(chuàng)建一個AttributeReference對象,調(diào)用SetAttributeFromBlock ( AttributeDefinition definition, Matrix3d blockTransform )方法從屬性定義中拷貝位置、尺寸和格式信息,然后設(shè)置屬性的位置變換和旋轉(zhuǎn)角度,接著調(diào)用AdjustAlignment (Application.DocumentManager.MdiActiveDocu-ment.Database)方法參照當前的空間進行對齊調(diào)整。

完成這些操作之后,向新塊引用的屬性集合添加剛才創(chuàng)建的AttributeReference對象,并且通知transaction對象執(zhí)行AddNewlyCreatedDBObject方法,把新塊引用添加到數(shù)據(jù)庫中。

c. 對于多屬性塊的替換,需拷貝不定數(shù)量的Attribute值,這里區(qū)別于單屬性塊的替換,要求Attribute必須不止一個。由于舊塊和新塊之間Attribute的Tag存在不同,在正式開始多屬性塊的替換之前,必須插入一個新的任務(wù),指定舊塊和新塊之間多個Attribute的對應(yīng)關(guān)系。

對此,預(yù)先在BlockReplace類中聲明:

兩個字符串類型的List對象分別儲存舊塊和新塊中所有Attribute的名稱;

一個Dictionary對象用來儲存Attribute映射表。

代碼如下:

public static List oldBlockAttributeTagList;

public static List newBlockAttributeTagList;

public static Dictionary attTagMap;

在選擇用于替換的新塊引用之后,創(chuàng)建兩個List對象:

oldBlockAttributeTagList = new List();

newBlockAttributeTagList = new List();

遍歷舊塊定義中的所有ObjectId,調(diào)用ObjectId的GetObject()方法,使用as關(guān)鍵字把對象引用轉(zhuǎn)換成AttributeDefinition對象引用并賦值給一個AttributeDefinition類型的變量,如果該變量不為空,那我們就找到了舊塊的一個AttributeDefinition。訪問這個AttributeDefinition的Tag,調(diào)用ToString()方法,把返回的字符串添加到oldBlockAttributeTagList。

遍歷新塊定義中的所有ObjectId,調(diào)用ObjectId的GetObject()方法,使用as關(guān)鍵字把對象引用轉(zhuǎn)換成AttributeDefinition對象引用并賦值給一個AttributeDefinition類型的變量,如果該變量不為空,那我們就找到了新塊的一個AttributeDefinition。訪問這個AttributeDefinition的Tag,調(diào)用ToString()方法,把返回的字符串添加到newBlockAttributeTagList。

現(xiàn)在創(chuàng)建一個Dictionary對象:

attTagMap = new Dictionary();

重載AttributeMapDialogue類的構(gòu)造函數(shù),把前面所述的兩個List對象和一個Dictionary對象作為形式參數(shù)[5]:

public AttributeMapDialogue ( List oldBlockAttributeTagList, List newBlockAttributeTagList, Dictionary attTagMap):this()

AttributeMapDialogue類也聲明了三個同類型的變量對應(yīng)構(gòu)造函數(shù)的三個形式參數(shù),為了方便,它們簡單地聲明為:

public static Dictionary attTagMap_Copy;

public static List oldBlockAttributeTagList_Copy;

public static List newBlockAttributeTagList_Copy;

重載的構(gòu)造函數(shù)需要儲存形式參數(shù)接受的對象引用:

oldBlockAttributeTagList_Copy = oldBlockAttributeTagList;

newBlockAttributeTagList_Copy = newBlockAttributeTagList;

attTagMap_Copy = attTagMap;

在AttributeMapDialogue對話框的界面上,可以調(diào)整舊塊和新塊的屬性的排列順序。

調(diào)整完畢后,把舊塊和新塊的屬性對應(yīng)關(guān)系存入Dictionary對象attTagMap_Copy。

從AttributeMapDialogue對話框返回之后,正式開始多屬性塊的替換。

創(chuàng)建一個新的Dictionary對象儲存舊塊引用的Attribute值:

Dictionary oldTagValuePairs = new Dictionary();

舊塊引用的AttributeCollection是一個ObjectId類型的集合,對每一個ObjectId調(diào)用GetObject()方法,使用as關(guān)鍵字把對象引用轉(zhuǎn)換成AttributeReference對象引用并賦值給一個AttributeReference類型的變量。把這個AttributeReference的Tag和字符串值儲存到oldTagValuePairs中[6]。

創(chuàng)建新塊引用,然后就像單屬性塊的替換過程一樣,遍歷新塊定義中的所有ObjectId,對每一個找到的AttributeDefinition,執(zhí)行相似的Attribute值拷貝過程,唯一的不同之處是,這里通過當前AttributeDefinition的Tag,在attTagMap中查找對應(yīng)的舊塊中的AttributeDefinition的Tag,緊接著在oldTagValuePairs中根據(jù)這個結(jié)果Tag查找到一個字符串值,把它賦值給新塊中的AttributeReference。

刪除舊塊引用是在創(chuàng)建完一個新塊引用之后,調(diào)用Erase()方法完成。

5 結(jié)語

創(chuàng)建的塊替換程序,可以方便地對各種簡單塊和屬性塊進行替換,特別是對屬性塊的替換可以手動指定塊之間屬性的映射關(guān)系,直接控制屬性值的傳遞,有效地提高了相關(guān)工作的作業(yè)效率。

[1] 曾洪飛,盧擇臨,張帆. AutoCAD VBA&VB.NET開發(fā)基礎(chǔ)與實例教程:第2版[M]. 北京:中國電力出版社,2013:1-22

[2] Karli Watson, Christian Nagel. C#入門經(jīng)典:第5版[M]. 齊立波,譯. 北京:清華大學(xué)出版社,2010:369-375

[3] 李冠億.深入淺出AutoCAD.NET二次開發(fā)[M]. 北京:中國建筑工業(yè)出版社,2012:313-357

[4] Microsoft Corporation. Visual C#[EB/OL]. http://msdn.microsoft.com/en-us/library/vstudio/kx37x362.aspx

[5] Kean Walmsley. The right way to show modal and modeless dialogs in AutoCAD using .NET[EB/OL]. http://through-the-interface.typepad.com/through_the_interface/2008/08/the-right-way-t.html

[6] Autodesk Inc. ObjectARX for AutoCAD 2013: Managed Class Reference[M/OL]. http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=78555

猜你喜歡
拷貝調(diào)用對象
涉稅刑事訴訟中的舉證責任——以納稅人舉證責任為考察對象
判斷電壓表測量對象有妙招
核電項目物項調(diào)用管理的應(yīng)用研究
唐氏綜合征是因為“拷貝”走樣了
攻略對象的心思好難猜
文化拷貝應(yīng)該如何“拷”
基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
區(qū)間對象族的可鎮(zhèn)定性分析
利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
基于硬盤還原卡的數(shù)據(jù)傳送技術(shù)在高校網(wǎng)絡(luò)機房中的應(yīng)用