2013-12-22 62 views
0

我試圖從矢量格式的Visio項目中獲取形狀。可以從Visio UI執行此操作,但我無法以編程方式完成此操作。我的代碼如下所示:如何獲得矢量格式的Visio形狀

foreach (Visio.Master master in doc.Masters) 
{ 
    imageName = master.NameU; 
    string imageFileName = Path.Combine(@"c:\temp", imageName); 
    master.Export(imageFileName + ".svg"); 
} 

函數導出檢測到傳遞的文件擴展名和導出形狀爲此格式。它適用於任何光柵格式,如bmp png等。我可以將項目的形狀作爲無問題的光柵文件。如果我傳遞格式如emf或wmf,它也會保存所有文件,而且它們實際上是wmf/emf格式。但是他們嵌入了光柵圖像,所以實際上它們是光柵圖像。

最後一個驚喜 - 如果我傳遞svg擴展名,除了幾個之外,所有導出的文件都是空的。這些是真的不是空的svg,但他們顯示整個visio頁面!不是一個單一的形狀。每個項目頁面的一個svg文件。這不是我想要的。

所以請幫助我 - 如何以編程方式從visio中獲取矢量格式的所有形狀。

回答

0

我不確定Visio是否能夠將單個圖形導出爲SVG,但是您可以根據大小和位置創建頁面的副本,然後逐個複製每個圖形,然後導出頁面作爲SVG,它會給你形狀。

如果您對該標準足夠熟悉,您還可以逐步瀏覽形狀表中的幾何圖形並將其自動導出到SVG。

另一種選擇是使用Path.Points()方法將每個形狀導出到簡單的SVG路徑,該方法返回幾何圖形中每個筆劃路徑的XY點陣列。這將創建比干淨的SVG輸出更大的路徑,但它使Visio爲您提供指向路徑的路徑,因此您不需要處理弧線和樣條曲線等......

+0

謝謝你的意見!是的,Visio可以將每個主圖形從模板導出到svg。創建具有單一形狀的圖表的好主意,它可以是有幫助的。可能我會試試這個。作爲另一種選擇,我想嘗試將整個svg圖(我可以很容易地)分成幾個形狀。其他方式太難了。我不想深入研究地形圖,即使我設法得到形狀幾何,還有其他我需要的視覺屬性 - 樣式等。 – AlexandrS

1

「導出」方法用於「選擇「對象似乎對SVG工作得很好。所以你可以嘗試解決這個問題如下:

 foreach (Visio.Master master in doc.Masters) 
     { 
      string imageName = master.NameU; 
      string imageFileName = Path.Combine(@"c:\temp", imageName); 

      var selection = doc.Application.ActivePage.CreateSelection(Visio.VisSelectionTypes.visSelTypeEmpty); 
      foreach (Visio.Shape shp in master.Shapes) 
       selection.Select(shp, (short)Visio.VisSelectArgs.visSelect); 

      selection.Export(imageFileName + ".svg"); 
     } 
+0

它完美地工作!正是我需要的。非常感謝,對不起,我沒有足夠的聲譽,也無法宣傳答案(Ogromnoe spasibo! – AlexandrS