亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于ObjectARX的AutoCAD塊替換的實現

        2015-02-25 21:12:18
        現代機械 2015年6期
        關鍵詞:拷貝調用對象

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

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

        1 ObjectARX簡介

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

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

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

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

        2 定義程序功能需求

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

        1)替換簡單塊的函數;

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

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

        3 程序架構

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

        創(chuàng)建一個命名空間,類命名為BlockReplace,創(chuàng)建三個函數,分別處理簡單塊的替換、單屬性塊的替換和多屬性塊的替換。為了能夠通過鍵盤命令調用這些函數,為他們添加命令方法屬性[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 具體實現

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

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

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

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

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

        4.1 選擇舊塊引用

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

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

        4.2 選擇新塊引用

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

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

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

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

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

        2)拷貝Properties值和Attributes值;

        3)刪除舊塊引用。

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

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

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

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

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

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

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

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

        對此,預先在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,調用ObjectId的GetObject()方法,使用as關鍵字把對象引用轉換成AttributeDefinition對象引用并賦值給一個AttributeDefinition類型的變量,如果該變量不為空,那我們就找到了舊塊的一個AttributeDefinition。訪問這個AttributeDefinition的Tag,調用ToString()方法,把返回的字符串添加到oldBlockAttributeTagList。

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

        現在創(chuàng)建一個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對話框返回之后,正式開始多屬性塊的替換。

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

        Dictionary oldTagValuePairs = new Dictionary();

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

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

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

        5 結語

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

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

        [2] Karli Watson, Christian Nagel. C#入門經典:第5版[M]. 齊立波,譯. 北京:清華大學出版社,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

        猜你喜歡
        拷貝調用對象
        神秘來電
        睿士(2023年2期)2023-03-02 02:01:09
        核電項目物項調用管理的應用研究
        LabWindows/CVI下基于ActiveX技術的Excel調用
        測控技術(2018年5期)2018-12-09 09:04:46
        唐氏綜合征是因為“拷貝”走樣了
        攻略對象的心思好難猜
        意林(2018年3期)2018-03-02 15:17:24
        基于系統(tǒng)調用的惡意軟件檢測技術研究
        基于熵的快速掃描法的FNEA初始對象的生成方法
        區(qū)間對象族的可鎮(zhèn)定性分析
        利用RFC技術實現SAP系統(tǒng)接口通信
        文件拷貝誰最“給力”
        中文字幕成人精品久久不卡| 真人作爱免费视频| 国产av国片精品| 无码区a∨视频体验区30秒 | 亚洲专区路线一路线二网| 日韩内射美女片在线观看网站| 国产天美传媒性色av| 精品人妻无码中文字幕在线| 人妻av不卡一区二区三区| 久久精品人妻少妇一二三区| 欧美日韩精品一区二区三区高清视频| 久久精品波多野结衣中文字幕| 午夜天堂精品一区二区| 日韩一区二区三区精品视频| 野外亲子乱子伦视频丶| 亚洲精品免费专区| 青青自拍视频成人免费观看| 免费久久久一本精品久久区| 亚洲av无码一区二区乱孑伦as| 国产jk在线观看| 东京热东京道日韩av| 欲香欲色天天天综合和网| 无码人妻丰满熟妇区五十路百度| 黑人巨大精品欧美在线观看| 国产精品国产三级国产an不卡| 国产成人av在线免播放观看新| 又硬又粗又大一区二区三区视频 | 久久久国产精品无码免费专区| 国産精品久久久久久久| 欧美日韩免费一区中文字幕| 国产一区二区不卡av| 国产果冻豆传媒麻婆精东| 天堂а√在线最新版中文| 中文字幕一区二区人妻痴汉电车| 国语淫秽一区二区三区四区| 少妇私密会所按摩到高潮呻吟| 国模精品二区| 国语对白自拍视频在线播放| 私人vps一夜爽毛片免费| 国产精品 视频一区 二区三区 | 精品亚洲一区二区99|