国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET 開發AutoCAD2006指南(二)

2024-07-10 12:58:48
字體:
來源:轉載
供稿:網友
在上一篇文章中向大家簡單講了.net開發autocad的流程,其中介紹了我編寫的一個簡化程序開發的zhfarx庫。下面向大家介紹zhfarx庫中的主要函數及如何用它來編寫.net程序。關于zhfarx庫的所有函數的說明,請大家參考本章附件中的zhfarx幫助文檔。 
      在介紹zhfarx庫之前,讓我們首先來了解一下有關的基本概念。你可以把autocad看作為一個數據庫,而autocad中有關的東西都放在這個數據庫的相關表中。例如,你用line命令在autocad的模型空間中添加了一條直線,那么autocad會創建一個直線類的實例并把它加入到數據庫的模型空間塊表記錄中。在傳統的c++編寫objectarx程序的時候,你必須首先打開當前數據庫的塊表(因為模型空間是在塊表中的),然后打開模型空間對應的塊表記錄,在記錄中加入直線類的實例,然后分別關閉塊表和模型空間塊表記錄。而在.net程序中,相應的代碼編寫是這樣的:
database db= application.documentmanager.mdiactivedocument.database; 
//獲得當前數據庫 
dbtransman tm=db.transactionmanager; 
//獲取事務處理 
using(transaction trans=tm.starttransaction())//開始事務處理 

                   blocktable bt=(blocktable)tm.getobject(db.blocktableid,openmode.forread,false); 
//打開當前數據庫的塊表 
                   blocktablerecord btr=(blocktablerecord)tm.getobject(bt[blocktablerecord.modelspace],openmode.forwrite,false); 
//打開模型空間塊表記錄 
                   btr.appendentity(ent);//在記錄中加入實體 
                   tm.addnewlycreateddbobject(ent,true);// 
                   trans.commit();//提交事務 
              } 
從上面的代碼中可以看到,.net用事務處理代替了c++中的打開和關閉操作(當然你也可以像c++一樣使用相應的open和close函數來進行打開和關閉的操作,但objectarx托管封裝類已把這兩個函數標記成了過時的函數,也就是說不建議用戶使用它們)。
       有一點要大家注意的是,對象沒有被加入到autocad數據庫之前,你可以對它進行直接的操作(如改變顏色,移動,設置實體的幾何屬性等)。但一旦對象被加入到autocad數據庫中,你就必須使用事務處理來打開它然后進行相應的操作。比如說,你在autocad中加入了上面的直線,而你想改變這條直線的顏色,你不能直接調用直線的color或colorindex屬性來進行設置,你必須首先用事務處理的getobject()函數打開這個直線對象,然后你才能調用color或colorindex屬性來對直線設置顏色。
       zhfarx庫的作用正是為了簡化以上這些操作,有了它你在autocad中加入對象的時候就不必再打開autocad數據庫的表,也可以直接對已加入到數據庫中的對象進行操作,它還包括了以下這些功能:更為方便地創建autocad實體的構造函數,遍歷數據庫表,添加組和擴展字典及其它一些常用的函數。
       首先向大家介紹zhfarx庫中的tools類。這個類是zhfarx庫的主要類,上面介紹的zhfarx庫的主要功能都是在這個庫中實現的。下面介紹這個類中的主要成員(這個類的成員都是靜態的):
l         屬性
包括3個:database(獲取當前數據庫),editor(獲取autocad命令行),transactinmanager(獲取事務處理管理器)。通過這三個屬性,你就不要再輸入諸如application.documentmanager.mdiactivedocument.database這么長的代碼了,而只要簡單地寫為tools.database。
l         函數
按照函數的功能可以分為以下幾類:
1.       加入對象
包括以下幾個:
ø         public static objectid addentity(entity ent);
這個函數向autocad數據庫加入實體類對象(如直線、圓等),下面的代碼向數據庫加入一條直線:
line line;
…….
tools.addentity(line);
ø         public static objectid addsymboltablerecord(symboltablerecord str,objectid symboltableid)
這個函數向autocad數據庫加入符號表記錄,符號表是autocad數據庫中的一系列表如層、線型等。函數的輸入參數一個為要加入的符號表記錄對象(str),另一個是符號表記錄要加入的符號表的對象id(可以通過訪問數據庫的屬性獲得,如layertableid屬性就表示數據庫的層表)。下面的代碼向數據庫添加一個新層:
layertablerecord ltr;
……
tools.addsymboltablerecord(ltr,tools.database.layertableid);
 
ø         public static objectid adddictionaryobject(string searchkey)
加入字典對象。關于字典對象的有關介紹,請看我以后寫的文章。
ø         public static objectid adddictionaryobject(string searchkey,dbobject newvalue,objectid ownerid)
加入字典類對象,如擴展對象、組等。
2.       設置或讀取對象的通用屬性
通用屬性包括:顏色(color),顏色索引(colorindex),層(layer),線型(linetype),線型比例 (linetypescale),線寬(lineweight),打印樣式名(plotstylename)和可見性(visible)。
設置通用屬性的函數都以put開頭再加上對應的通用屬性名,如設置對象顏色的函數為putcolor。設置每一種通用屬性的函數都有兩種形式,下面以設置顏色的函數為例來進行說明。
第一種形式為putcolor(entity ent,color color),第一個參數為對象的實例,第二個參數則是要設置的值。
第二種形式為putcolor(objectid id,color color),第一個參數為對象實例的id,第二個參數則是要設置的值。
獲取通用屬性的函數都以get開頭再加上對應的通用屬性名,如獲取對象顏色的函數為getcolor。也有兩種形式,下面以獲取顏色的函數為例來進行說明。
第一種形式為getcolor(entity ent),輸入參數為對象的實例。
第二種形式為getcolor(objectid id),輸入參數為對象實例的id。
3.       變換操作
令人非常不解的是在objectarx 托管封裝類中,實體類(entity)沒有諸如旋轉、平移、縮放之類的函數,你只能通過實體類的transformby()函數來實現這些變化操作。而transformby()函數由于要使用到一個矩陣參數,用起來不是很方便。在zhfarx庫中,已經給大家重新編寫了用于變換操作的函數,你可以使用它們來方便地進行相關的變換操作。變換操作函數有兩種形式,區別是第一個輸入函數可以是實體對象的實例,也可以是實體對象的id,在下面的介紹中我只介紹輸入參數是實體對象的實例的那一種,對于另一種形式,你只要把相應的輸入參數改成實體對象的id就可以了。變換操作函數如下:
ø         public static void move(entity ent,point3d frompoint,point3d topoint)
把實體ent從點frompoint移動到點topoint
ø         public static void rotate(entity ent,point3d basepoint,double rotationangle)
以點basepoint為基準點,把實體ent旋轉rotationangle角度(為弧度值)。
ø         public static void scale(entity ent,point3d basepoint,double scalefactor)
以點basepoint為基準點,把實體ent縮放scalefactor倍(>1為放大,<1為縮小)。
ø         public static objectid mirror(entity ent,point3d mirrorpoint1,point3d mirrorpoint2,bool erasesourceobject)
對實體ent以由點mirrorpoint1和點mirrorpoint2組成的直線線進行鏡像拷貝,參數erasesourceobject表示是否刪除源對象。
4.       其它一些常用的操作函數
ø         public static objectid copy(entity ent)
對實體ent進行復制,還有一個重載函數,輸入參數為實體的id。
ø         public static void erase(entity ent)
刪除實體ent,還有一個重載函數,輸入參數為實體的id。
ø         public static entity getentity(objectid id)
通過對象id來獲得實體對象(而獲得實體的對象id,你只要訪問它的objectid屬性就可以了)。
ø         public static dbobject getdbobject(objectid id)
通過對象id來獲得非實體類對象。
ø         public static dbobjectcollection getiteratorforsymboltable(objectid id)
獲取用于遍歷符號表(由id表示)的遍歷器(對象集合)。
ø         public static objectidcollection getiteratorforsymboltableid(objectid id)
獲取用于遍歷符號表(由id表示)的遍歷器(對象id集合)。
ø         public static point3d getmidpoint(point3d pt1,point3d pt2)
獲取兩點表示的線段的中點。(呵呵,本來還想寫諸如求交點、判斷是否平行、垂直等的數學函數,但objectarx托管封裝類都有相關的函數,就沒有寫)。
終于介紹完了tools類的成員,再來介紹zhfarx庫中其它的類。tools類外的其它類都是一些對autocad實體類如直線、圓等的改寫,以方便.net程序的編寫。到目前的zhfarx版本為止,我改寫的實體類有:直線(line),圓(circle),圓弧(arc),橢圓(ellipse),多段線(polylines,這個多段線是二維的,也就輕量多段線),單行文本(dbtext,請大家注意,在objectarx托管封裝類中單行文本所在的類不是text,而是dbtext),多行文本(mtext),表格(table),填充(hatch),各種標注(包括對齊標注aligneddimension、直徑標注diametricdimension、角度標注lineangulardimension2、半徑標注radialdimension和旋轉標注rotateddimension)。改寫的實體類都是由這些實體類派生的,實體類的所有函數和屬性改寫類都可以使用。改寫類的名字為實體類原名后加上s,如改寫的直線類就是lines,而改寫的圓類就是circles。你可能要說了,改寫這些類有什么用?呵呵,答案有兩個。一個是為了方便創建實體,另外一個就是你可以方便地修改實體的屬性,不管它有沒有加入到數據庫中。objectarx的托管封裝類中創建autocad實體的函數,也就是構造函數,通常只有一種形式,如圓只能通過圓心、半徑還有一個基本上不需要使用的法向量來創建。而我們知道在autocad中有許多種創建圓的方式,如通過三點、通過二點的直徑來創建圓。在zhfarx庫的circles類中就包含了這些創建圓的構造函數。下面的例子說明了通過三點來創建一個圓:
circles circle=new circles(pt1,pt2,pt3);
關于這些構造函數的說明,大家可以參考附件中的幫助文檔,里面有詳細的說明。
通過前面的介紹,你已經知道加入到數據庫中的實體是不能直接訪問的,而這些改寫的類就可以。下面就以兩段代碼作比較來說明(以圓為例),首先來看一般的實體類:
circle circle=new circle (center,normal,radius);
circle.radius=1;//由于圓還沒有加入到數據庫中,改變圓的半徑屬性是允許的
tools.addentity(circle);//利用zhfarx庫的簡化函數把圓加入到數據庫中
circle. radius =2;
//這句是錯誤的,因為圓已經加入到數據庫中,你必須首先打開它,然后再進行相關
//的操作,不能這樣直接訪問圓
 
下面是改寫類的代碼:
       circles circle =new circles (center, radius);//呵呵,連構造函數也比上面的簡單了
       circle. radius =1;//在圓沒有加入到數據庫之前,改變圓的半徑屬性
       tools.addentity(circle);//利用zhfarx庫的簡化函數把圓加入到數據庫中
       circle. radius =2;// 圓雖然已加入到數據庫中,但你仍然可以直接修改它的屬性
還有一點大家要注意的是,對于諸如顏色、層等的通用屬性,請使用tools類的get類和put類函數(關于這些函數,請大家參考前面的內容),這些函數對于一般類和改寫類都是適用的。  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌江| 监利县| 宜宾市| 漳浦县| 巨野县| 孟州市| 通辽市| 江门市| 昌都县| 大名县| 密山市| 永平县| 滕州市| 洪江市| 台安县| 余江县| 南城县| 义马市| 黑山县| 昭苏县| 两当县| 庄浪县| 合山市| 定远县| 曲松县| 濮阳县| 英吉沙县| 馆陶县| 噶尔县| 镇江市| 云龙县| 二连浩特市| 巴青县| 平昌县| 呼图壁县| 麦盖提县| 衡山县| 锦州市| 聊城市| 巴林左旗| 许昌市|