999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于ObjectARX的AutoCAD塊替換的實現

2015-02-25 21:12:18
現代機械 2015年6期
關鍵詞:方法

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

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

1 ObjectARX簡介

ObjectARX是Autodesk公司的一種編程環境,提供了面向對象的C++、C#和VB.NET應用編程接口,用于對AutoCAD和基于它的垂直產品進行二次開發。

ObjectARX編程環境包含了豐富而又靈活的工具集使得開發者可以充分利用AutoCAD軟件的開放架構。同時還提供了直接訪問AutoCAD數據庫結構、圖形系統和定義原生命令的方法。

利用ObjectARX技術可以開發出快速、高效、緊湊的AutoCAD應用,使得設計人員可以從重復性的任務中解放出來。

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

2 定義程序功能需求

根據可能出現的各種情況,程序需要實現三個函數:

1)替換簡單塊的函數;

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

3)執行期間指定映射關系并替換有多個屬性的屬性塊的函數。

3 程序架構

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

創建一個命名空間,類命名為BlockReplace,創建三個函數,分別處理簡單塊的替換、單屬性塊的替換和多屬性塊的替換。為了能夠通過鍵盤命令調用這些函數,為他們添加命令方法屬性[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的要求,這里不能使用常規的WinForm,必須采用基于WPF(Windows Presentation Foundation)的用戶界面[3]。所以AttributeMapDialogue類派生自System.Windows.Window類[4]。

4 具體實現

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

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

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

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

下面分別解釋這三個步驟的實現。

4.1 選擇舊塊引用

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

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

4.2 選擇新塊引用

創建PromptEntityOptions對象,調用AddAllowedClass()方法,設置允許選擇的對象類型為塊。

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

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

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

1)創建新塊引用;

2)拷貝Properties值和Attributes值;

3)刪除舊塊引用。

為一個舊塊引用創建一個新塊引用的時候,需確定兩個參數,一是舊塊引用的坐標,二是新塊的名稱。

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

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

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

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

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

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

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

對此,預先在BlockReplace類中聲明:

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

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

代碼如下:

public static List oldBlockAttributeTagList;

public static List newBlockAttributeTagList;

public static Dictionary attTagMap;

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

oldBlockAttributeTagList = new List();

newBlockAttributeTagList = new List();

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

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

現在創建一個Dictionary對象:

attTagMap = new Dictionary();

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

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

AttributeMapDialogue類也聲明了三個同類型的變量對應構造函數的三個形式參數,為了方便,它們簡單地聲明為:

public static Dictionary attTagMap_Copy;

public static List oldBlockAttributeTagList_Copy;

public static List newBlockAttributeTagList_Copy;

重載的構造函數需要儲存形式參數接受的對象引用:

oldBlockAttributeTagList_Copy = oldBlockAttributeTagList;

newBlockAttributeTagList_Copy = newBlockAttributeTagList;

attTagMap_Copy = attTagMap;

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

調整完畢后,把舊塊和新塊的屬性對應關系存入Dictionary對象attTagMap_Copy。

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

創建一個新的Dictionary對象儲存舊塊引用的Attribute值:

Dictionary oldTagValuePairs = new Dictionary();

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

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

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

5 結語

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

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

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

[3] 李冠億.深入淺出AutoCAD.NET二次開發[M]. 北京:中國建筑工業出版社,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

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 精品国产Av电影无码久久久| 国产区人妖精品人妖精品视频| 亚卅精品无码久久毛片乌克兰| 国产精品对白刺激| 欧美激情第一区| 亚洲第一av网站| 国产二级毛片| 亚洲无码精品在线播放 | jizz亚洲高清在线观看| 国产成人高清精品免费5388| 精品国产香蕉在线播出| 国产Av无码精品色午夜| 午夜激情福利视频| 亚洲国产欧美国产综合久久 | 十八禁美女裸体网站| 动漫精品啪啪一区二区三区| 国产乱视频网站| 福利一区在线| 青青草91视频| 亚洲一道AV无码午夜福利| 欧美一道本| 香蕉国产精品视频| 亚洲国产天堂久久综合| 亚洲一区免费看| 国产女人在线| 日本高清有码人妻| 为你提供最新久久精品久久综合| 免费女人18毛片a级毛片视频| AV无码国产在线看岛国岛| 亚洲aaa视频| 日韩在线成年视频人网站观看| 中国国语毛片免费观看视频| 国产成人免费手机在线观看视频| 91在线激情在线观看| 麻豆国产在线观看一区二区| 亚洲V日韩V无码一区二区| 看你懂的巨臀中文字幕一区二区| 亚洲高清日韩heyzo| 丁香六月激情综合| 手机精品视频在线观看免费| 99re视频在线| 婷婷六月色| 国产成人亚洲毛片| 91久久国产热精品免费| 国产亚洲美日韩AV中文字幕无码成人 | 色国产视频| 欧洲亚洲欧美国产日本高清| 日韩欧美色综合| 亚洲区第一页| 亚洲清纯自偷自拍另类专区| 亚洲欧美另类色图| 免费毛片a| 97视频精品全国免费观看| 亚洲国产日韩欧美在线| 欧美色99| 露脸国产精品自产在线播| 亚洲国产中文精品va在线播放| 99在线观看视频免费| 天堂网亚洲综合在线| 国产一级无码不卡视频| 国产高清在线精品一区二区三区| 又大又硬又爽免费视频| 亚洲码一区二区三区| 伊人激情综合| 国产成人久久777777| 欧美日韩激情| 青青热久免费精品视频6| 午夜无码一区二区三区| 国产尹人香蕉综合在线电影| 动漫精品啪啪一区二区三区| 97se亚洲综合在线天天| 黄色福利在线| 亚洲精品福利视频| 成人综合在线观看| 色综合成人| 亚洲手机在线| 伊人成色综合网| 成人国产精品2021| 四虎影视库国产精品一区| 成人午夜天| 国产在线第二页| 欧美午夜视频在线|