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
賺錢方法
捕魚
主站蜘蛛池模板: 69av免费视频| 欧美色图久久| 日韩精品成人网页视频在线| 亚洲永久色| 91成人试看福利体验区| 国产福利一区二区在线观看| a毛片在线播放| 欧美精品综合视频一区二区| 狠狠做深爱婷婷久久一区| 日韩在线永久免费播放| 色综合久久无码网| 天天做天天爱天天爽综合区| 国产经典三级在线| 97国内精品久久久久不卡| 99久久精品国产综合婷婷| 成年人福利视频| 国产视频久久久久| 国产精品人成在线播放| 国产精品色婷婷在线观看| 国内自拍久第一页| 国产91精选在线观看| 国产欧美高清| av在线手机播放| 亚洲二三区| 在线免费观看a视频| 91色综合综合热五月激情| 97亚洲色综久久精品| 91小视频在线观看| 国产精品亚洲一区二区三区在线观看| 国产福利影院在线观看| 激情乱人伦| 国产成人高清亚洲一区久久| 欧美成一级| 全免费a级毛片免费看不卡| 久久免费看片| 99er这里只有精品| 国产精品免费p区| 国产导航在线| 欧美一级片在线| 国产老女人精品免费视频| 日韩久草视频| 亚洲精品中文字幕午夜| 青青青伊人色综合久久| 久久综合九九亚洲一区 | 亚洲三级电影在线播放| 久久美女精品| 欧美影院久久| 成年片色大黄全免费网站久久| 久久精品嫩草研究院| 亚洲欧美在线看片AI| 国产91全国探花系列在线播放| 97精品国产高清久久久久蜜芽 | 日韩欧美中文亚洲高清在线| 毛片在线播放网址| 中文字幕无码制服中字| 亚洲精品成人片在线观看| 91福利在线观看视频| 国产欧美日韩在线一区| 亚洲精品另类| 精品国产美女福到在线直播| 欧美三级视频在线播放| 婷婷午夜天| 国产精品亚洲一区二区三区在线观看 | 99re在线观看视频| 亚洲视频色图| 国产欧美精品一区二区| 亚洲男人的天堂视频| 亚洲成综合人影院在院播放| 四虎永久免费网站| 在线国产毛片| 日本亚洲国产一区二区三区| 四虎影视无码永久免费观看| 婷婷亚洲视频| 一本久道久综合久久鬼色| 亚洲综合色婷婷中文字幕| 亚洲成a人片7777| 国产剧情伊人| 黄色三级网站免费| 在线观看网站国产| 中文字幕欧美日韩高清| 婷婷六月激情综合一区| 国产女人喷水视频|