程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 從DWG到XAML (III)

從DWG到XAML (III)

編輯:關於.NET

.NET中的 XPS Packaging類庫及一個DWFx Packaging類庫的實現

DocumentViewer

其實復雜的事情原本可以很簡單. 你想要的那個輪子, 也許別人早就為你造好了. 在這裡也是如此. 比如全部你想要的, 就是在你的系 統前端可以直接查看DWG文件, 那麼全部需要做的, 僅僅是簡單的從DWG導出為DWFx文件, 然後使用WPF的DocumentViewer控件打開這個文件 就可以了. 這個示例程序可以從這裡獲取.

XAML

1.  <DocumentViewer Name="docViewer" />

Code-Behind : Load DWFx

1.  XpsDocument xpsDocument = null;
2.
3.  if (dlg.ShowDialog() ==  System.Windows.Forms.DialogResult.OK)
4. {
5.      // If there's an existing document open, close  it.
6.      if (xpsDocument != null)
7.          xpsDocument.Close();
8.
9.      //  Create an XpsDocument for the file specified by the user.
10.      try
11.     {
12.           xpsDocument = new
13.              XpsDocument(dlg.FileName,  System.IO.FileAccess.Read);
14.     }
15.     catch (UnauthorizedAccessException)
16.      {
17.         System.Windows.MessageBox.Show(
18.             String.Format("Unable to  access {0}", dlg.FileName ) );
19.         return;
20.     }
21.
22.     // For  optimal performance the XPS document should be remain
23.     // open while its FixedDocumentSequence  is active in the
24.     // DocumentViewer control.  When the XPS document is opened
25.      // with the XpsDocument constructor ("new XpsDocument" above) a
26.     // reference to it is  automatically added to the PackageStore.
27.     // The PackStore is a static application collection  that contains
28.     // a reference to each open package along the package's URI as
29.      // a key.  Adding a reference of the XPS package to the
30.     // PackageStore keeps the package  open and avoids repeated opens
31.     // and closes while the document content is being accessed  by
32.     // DocumentViewer control.  The XpsDocument.Dispose() method
33.     // automatically  removes the package from the PackageStore after
34.     // the document is removed from the  DocumentViewer control and
35.     // is no longer in use.
36.     docViewer.Document =  xpsDocument.GetFixedDocumentSequence();

DocumentViewer是 WPF專為呈現XPS文件內容准備的控件. 它所呈現的內容叫做FixedDocument, 這完全符合XPS的標准. 我們的DWFx格 式文件是與XPS兼容的, 所以也可以被DocumentViewer直接載入和顯示.我們用DocumentViewer直接打開一個DWFx文件並仔細對比, 你會發 現它所呈現出來的內容和在AutoCAD中精確地相同.

這一特點, 取決於DWG文件導出到DWFx文件的過程中所采取的處理方式. 在轉化的過程中, 所有的圖形地理信息, 包括直接描述和圖塊 信息引用, 都被原地還原被進行相應的變換(比如旋轉, 縮放), 然後將最終的圖形信息全部寫入到FixedPage文件中. 采取這樣的行為, 保 證了轉換前後的呈現精確問題, 並且這種精確性的實現不依賴於轉換後容器的特性.

凡事有一利必有一弊. 這裡面有個問題.  我們知道, 如果我們手裡有圖形的原信息, 有變換公式, 那麼我們很容易就能得到變換後的 圖形. 反之, 如果我們有變換後的圖形和變換公式, 雖然可能麻煩一些, 但是大多數情況下我們能得到圖形的源信息. 但是, 如果我們有 圖形的源信息和變換後的圖形, 那麼在大多數情況下猜測變換公式是極其困難的; 如果我們僅有變換後的圖形, 那麼還願圖塊的圖形信息 引用, 是根本不可能的. 現在我們得到的DWFx這個包, 就讓我們處在了這個比較囧的處境中 - 我們有變換後的圖形信息(都在FixedPage中 ), 除此之外, 關於圖形的一切其他細節, 比如它是經過什麼變換來的, 它和另外一個圖塊是不是同一類圖形等這些信息, 什麼都沒有 了.

好吧, 這實在是夠麻煩的. 不過我們可以有一些折中的辦法, 比如, 在設計時, 相同的圖塊, 我們給它定義一些自定義屬性,來標記這 些圖塊原本指代了同一類實體, 比如都指代了電腦. 我們有這些自定義屬性就夠了. 自定義的屬性是可以被獲得的, 這些屬性都保存在 DWFx包中的Object definition file文件中.

自定義屬性才是這個系統能夠自動化的關鍵!

比如我們要建設一個網吧自動管理系統. 我們的DWG文件就是包括電腦擺放位置在內的網吧布局設計. 我們的期待能交互的實體是DWG文 件中擺放的一台台電腦. 我們期待這個管理系統能自動讀入DWG/DWFx文件來表示網吧電腦的陳列位置, 然後我能在這些電腦上點擊選擇操 作, 比如殺毒, 比如下載設置文件等. 要達到這個目的, 我們依賴自定義屬性就可以了. 我們可以要求設計廠商在DWG文件中對每一台電腦 加上一個電腦編號. 到我們的系統中, 我們可以讀出這個自定義屬性, 從而實現自動化. DWG/DWFx文件標示了實體的位置, 自定義屬性標 示了實體的唯一標記並實現系統的互動.

上一篇文章已經詳細分析了DWFx包內各個文件的含義. 所以讀取這些文件的內容是相對容易的. 不過看起來, 我們首先需要一個標尺類 庫, 來標示我們應該如何去讀取,怎麼讀.

XPS Packaging類庫

.NET Framework在System.Windows.Xps.Packaging命名空間下, 提供了一系列的類型和方法來幫助我們顯示和操作XPS文檔. 雖然我們 的DWFx文件格式上兼容XPS, 但是顯然XPS Packaging這個類庫是Generic的, 是為所有的XPS文件設計的, 所以不太可能使用這個類庫來直 接操作我們的DWFx文件內容(從上文的文件內部組織形式也能體現這種差異). 不過作為微軟提供的類庫, 它應該是我們想要實現的DWFx類 庫的最好的標桿.

您可以從這個鏈接來查看和學習XPS Packaging類庫: http://msdn.microsoft.com/en- us/library/system.windows.xps.packaging.aspx. 可以注意的幾個類是XPSDocument, xxxSequenceReader/Writer, xxxDocumentReader/Writer, xxxPageReader/Writer. 聰明的你一定注意到了, 這幾個類的名字幾乎正好對應了上文分析的XPS文檔的組織 形式. 所以如果我們來寫DWFx Packaging Library, 也要清楚的顯示出DWFx文件內部的層次形式.

DWFx Packaging & Converting Library的實現

廢話不多說了, 點擊這裡下載筆者創建的一個DWFx Packaging & Converting 類庫的實現. 這個類庫一共包含了4個項目:

JeffreySun.Dwfx : 基礎項目, 包含了一些DWFx的基本信息, 以及錯誤處理等;

JeffreySun.Dwfx.Packing : Packaging類庫, 實現讀取DWFx文件包內容的功能;

JeffreySun.Dwfx.Converting : Converting類庫, 將讀取的DWFx文件包內容鏈接並轉化為XAML + 自定義屬性

JeffreySun.DWFX2XAMLConverter : 一個簡單的示例程序.

您一定要注意這段重要聲明! 這一類庫僅以學習目的發布, 你可以在你的項目中直接使用, 但是作者不保證該類庫的完整性, 也不保證 該類庫中沒有問題, 並且不提供任何技術支持. 作者強烈建議您在研究DWFx格式規范後實現自己的DWFx類庫.

至少, 您得改一下類庫的名字吧...不然老板會踢你的屁股的 :)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved