• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

    2015-02-25 21:12:18
    現(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)方法參照當(dāng)前的空間進行對齊調(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值拷貝過程,唯一的不同之處是,這里通過當(dāng)前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)用對象
    神秘來電
    睿士(2023年2期)2023-03-02 02:01:09
    核電項目物項調(diào)用管理的應(yīng)用研究
    LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
    唐氏綜合征是因為“拷貝”走樣了
    攻略對象的心思好難猜
    意林(2018年3期)2018-03-02 15:17:24
    基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
    基于熵的快速掃描法的FNEA初始對象的生成方法
    區(qū)間對象族的可鎮(zhèn)定性分析
    利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
    文件拷貝誰最“給力”
    德清县| 永善县| 类乌齐县| 延长县| 涞源县| 定边县| 六盘水市| 定远县| 比如县| 曲靖市| 英山县| 额尔古纳市| 阜城县| 丰城市| 北川| 黄浦区| 柘荣县| 新绛县| 四平市| 深圳市| 山东省| 莱芜市| 汉中市| 色达县| 东方市| 天镇县| 宁晋县| 临洮县| 浦县| 巩留县| 临桂县| 陵水| 宜君县| 涟源市| 峨眉山市| 布拖县| 女性| 灵武市| 郑州市| 兴山县| 凤翔县|