EaBIM

标题: 在你的对话框上查看Revit模型的各个视图 [打印本页]

作者: 萧闫子    时间: 2014-1-15 12:02
标题: 在你的对话框上查看Revit模型的各个视图

转载请复制以下信息:
原文链接: http://blog.csdn.net/joexiongjin/article/details/8123505
作者:  叶雄进 , Autodesk ADN


接到这样一个提问:

REVIT的视图能不能用于对话框上图形的临时显示?API编程如何实现?我没有看到相关教程。


在Revi 2013 中提供了一个PreviewControl WPF控件,用于在你的自己的对话框上显示一个Rvt/rfa/rft文件中的视图。这个Rvt/rfa/rft文件无需在当前的Revit里面打开,可以是一个在硬盘或局域网上的一个文件。但是这个对话框必须是在Revit里面的,不能使脱离Revit软件环境。


如下面的这个视图所示:


                               
登录/注册后可看大图


这个控件是一个WPF控件。 还可以选择让这个控件显示Rvt中的那个视图。

请看下面的实现代码。


1. Revit命令,弹出对话框

  1. [csharp] view plaincopy
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6.   
  7. using Autodesk.Revit.DB;  
  8. using Autodesk.Revit.UI;  
  9. using RApplication = Autodesk.Revit.ApplicationServices.Application;  
  10.   
  11.   
  12. namespace AddInIntegrationSample  
  13. {  
  14.    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]  
  15.    public class PreviewCommand : IExternalCommand  
  16.    {  
  17.       public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)  
  18.       {  
  19.          _dbdocument = commandData.Application.ActiveUIDocument.Document;  
  20.   
  21.   
  22.          TransactionGroup outerGroup = new TransactionGroup(_dbdocument, "preview control");  
  23.          outerGroup.Start();  
  24.   
  25.          try  
  26.          {  
  27.             PreviewModel form = new PreviewModel(commandData.Application.Application, new ElementId(-1));  
  28.             form.ShowDialog();  
  29.          }  
  30.          catch (Exception e)  
  31.          {  
  32.             throw e;  
  33.          }  
  34.          finally  
  35.          {  
  36.             outerGroup.RollBack();  
  37.          }  
  38.   
  39.          return Result.Succeeded;  
  40.       }  
  41.   
  42.   
  43.       private Document _dbdocument = null;  
  44.    }  
  45.   
  46. }  
复制代码
下面是对话框类里面的实现代码。

  1. [csharp] view plaincopy
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.ComponentModel;  
  5. using System.Data;  
  6. using System.Drawing;  
  7. using System.Linq;  
  8. using System.Text;  
  9. using System.Windows.Forms;  
  10.   
  11. using Autodesk.Revit.DB;  
  12. using Autodesk.Revit.UI;  
  13. using Autodesk.Revit.Collections;  
  14. using RView = Autodesk.Revit.DB.View;  
  15. using RApplication = Autodesk.Revit.ApplicationServices.Application;  
  16.   
  17. namespace AddInIntegrationSample  
  18. {  
  19.     public partial class PreviewModel : System.Windows.Forms.Form  
  20.     {  
  21.         public PreviewModel(RApplication application, ElementId viewId)  
  22.         {  
  23.             InitializeComponent();  
  24.             _application = application;  
  25.             _uiApplication = new UIApplication(application);  
  26.             _dbDocument = _uiApplication.ActiveUIDocument.Document;  
  27.   
  28.             updateDocumentList(_dbDocument);  
  29.             updateViewsList(_uiApplication.ActiveUIDocument.ActiveView.Id);  
  30.         }  
  31.   
  32.         private void updateViewsList(ElementId viewId)  
  33.         {  
  34.             // fill the combobox with printable views <name + id>  
  35.             FilteredElementCollector collecotr = new FilteredElementCollector(_dbDocument);  
  36.             collecotr.OfClass(typeof(Autodesk.Revit.DB.View));  
  37.             IEnumerable<Autodesk.Revit.DB.View> secs = from Element f in collecotr where (f as Autodesk.Revit.DB.View).CanBePrinted == true select f as Autodesk.Revit.DB.View;  
  38.             _cbViews.Items.Clear();  
  39.             DBViewItem activeItem = null;  
  40.             foreach (Autodesk.Revit.DB.View dbView in secs)  
  41.             {  
  42.                 if (viewId == null || viewId.IntegerValue < 0)  
  43.                 {  
  44.                     activeItem = new DBViewItem(dbView, _dbDocument);  
  45.                     viewId = dbView.Id;  
  46.                 }  
  47.                 if (dbView.Id == viewId)  
  48.                 {  
  49.                     activeItem = new DBViewItem(dbView, _dbDocument);  
  50.                     _cbViews.Items.Add(activeItem);  
  51.                 }  
  52.                 else  
  53.                     _cbViews.Items.Add(new DBViewItem(dbView, _dbDocument));  
  54.             }  
  55.             _cbViews.SelectedItem = activeItem;  
  56.         }  
  57.   
  58.         private void updateDocumentList(Document selectedDocument)  
  59.         {  
  60.             // fill the documents to the comboxbox _cbDocuments.  
  61.             DBDocumentItem activeItem = null;  
  62.             _cbDocuments.Items.Clear();  
  63.             DocumentSetIterator docIter = _application.Documents.ForwardIterator();  
  64.             docIter.Reset();  
  65.             while (docIter.MoveNext())  
  66.             {  
  67.                 Document dbDoc = docIter.Current as Document;  
  68.                 String documentName = null;  
  69.                 DBDocumentItem item = null;  
  70.                 if (dbDoc != null)  
  71.                 {  
  72.                    if (dbDoc.IsFamilyDocument)  
  73.                    {  
  74.                       item = new DBDocumentItem(dbDoc.PathName, dbDoc);  
  75.                    }  
  76.                    else  
  77.                    {  
  78.                       String projName = dbDoc.ProjectInformation.Name;  
  79.                       if (String.IsNullOrEmpty(projName) || projName.ToLower().CompareTo("project name") == 0)  
  80.                       {  
  81.                          if (String.IsNullOrEmpty(dbDoc.PathName))  
  82.                             documentName = projName;  
  83.                          else  
  84.                             documentName = new System.IO.FileInfo(dbDoc.PathName).Name;  
  85.                       }  
  86.                       else  
  87.                          documentName = projName;  
  88.   
  89.                       item = new DBDocumentItem(documentName, dbDoc);  
  90.   
  91.                    }  
  92.                    if (dbDoc.Equals(selectedDocument))  
  93.                    {  
  94.                       _dbDocument = selectedDocument;  
  95.                       activeItem = item;  
  96.                    }  
  97.                     _cbDocuments.Items.Add(item);  
  98.                 }  
  99.             }  
  100.             _cbDocuments.Items.Add(new DBDocumentItem());  
  101.             _cbDocuments.SelectedItem = activeItem;  
  102.         }  
  103.   
  104.         private void cbViews_SelIdxChanged(object sender, EventArgs e)  
  105.         {  
  106.             System.Windows.Forms.ComboBox cb = sender as System.Windows.Forms.ComboBox;  
  107.             if (cb == null)  
  108.                 return;  
  109.   
  110.             DBViewItem dbItem = cb.SelectedItem as DBViewItem;  
  111.             if (dbItem == null)  
  112.                 return;  
  113.   
  114.             PreviewControl vc = _elementHostWPF.Child as PreviewControl;  
  115.             if (vc != null)  
  116.                 vc.Dispose();  
  117.             _elementHostWPF.Child = new PreviewControl(_dbDocument, dbItem.Id);  
  118.             _currentDBViewId = dbItem.Id;  
  119.         }  
  120.   
  121.   
  122.         private ElementId _currentDBViewId = null;  
  123.         private Document _dbDocument = null;  
  124.         private RApplication _application = null;  
  125.         private UIApplication _uiApplication = null;  
  126.   
  127.         private void cbDocs_SelIdxChanged(object sender, EventArgs e)  
  128.         {  
  129.             DBDocumentItem documentItem = _cbDocuments.SelectedItem as DBDocumentItem;  
  130.             if (documentItem.Document == _dbDocument)  
  131.                 return;  
  132.   
  133.             if (documentItem.IsNull)  
  134.             {  
  135.                 OpenFileDialog ofd = new OpenFileDialog();  
  136.                 ofd.DefaultExt = "rvt";  
  137.                 ofd.Filter = "Revit project files (*.rvt)|*.rvt|Revit family files (*.rfa)|*.rfa|Revit family template files (*.rft)|*.rft";  
  138.                 if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)  
  139.                 {  
  140.                    try  
  141.                    {  
  142.                       _dbDocument = _application.OpenDocumentFile(ofd.FileName);  
  143.                    }  
  144.                    catch (System.Exception)  
  145.                    {  
  146.                      
  147.                    }  
  148.                     if (_dbDocument != null)  
  149.                     {  
  150.                         updateDocumentList(_dbDocument);  
  151.                         updateViewsList(null);  
  152.                     }  
  153.                 }  
  154.                 else  
  155.                 {  
  156.                     // the combobox should show the current document item.  
  157.                     String documentName;  
  158.                     String projName = _dbDocument.ProjectInformation.Name;  
  159.                     if (String.IsNullOrEmpty(projName) || projName.ToLower().CompareTo("project name") == 0)  
  160.                     {  
  161.                         if (String.IsNullOrEmpty(_dbDocument.PathName))  
  162.                             documentName = projName;  
  163.                         else  
  164.                             documentName = new System.IO.FileInfo(_dbDocument.PathName).Name;  
  165.                     }  
  166.                     else  
  167.                         documentName = projName;  
  168.   
  169.                     foreach (DBDocumentItem dbItem in _cbDocuments.Items)  
  170.                     {  
  171.                         if (dbItem.Name.ToLower().CompareTo(documentName.ToLower()) == 0)  
  172.                         {  
  173.                             _cbDocuments.SelectedItem = dbItem;  
  174.                             break;  
  175.                         }  
  176.                     }  
  177.                 }  
  178.             }  
  179.             else  
  180.             {  
  181.                 _dbDocument = documentItem.Document;  
  182.                 updateViewsList(null);  
  183.             }  
  184.         }  
  185.     }  
  186.   
  187.   
  188.     public class DBViewItem  
  189.     {  
  190.         public DBViewItem(RView dbView, Document dbDoc)  
  191.         {  
  192.             ElementType viewType = dbDoc.GetElement(dbView.GetTypeId()) as ElementType;  
  193.             Name = viewType.Name + " " + dbView.Name;  
  194.             Id = dbView.Id;  
  195.             UniqueId = dbView.UniqueId;  
  196.         }  
  197.   
  198.         public override String ToString()  
  199.         {  
  200.             return Name;  
  201.         }  
  202.   
  203.         public String Name { get; set; }  
  204.   
  205.         public ElementId Id { get; set; }  
  206.   
  207.         public String UniqueId { get; set; }  
  208.     }  
  209.   
  210.   
  211.     public class DBDocumentItem  
  212.     {  
  213.         public DBDocumentItem(String name, Document doc)  
  214.         {  
  215.             Name = name;  
  216.             Document = doc;  
  217.             IsNull = false;  
  218.         }  
  219.   
  220.         public DBDocumentItem()  
  221.         {  
  222.             IsNull = true;  
  223.         }  
  224.   
  225.         public override string ToString()  
  226.         {  
  227.             if (IsNull)  
  228.                 return "<Open Document...>";  
  229.             return Name;  
  230.         }  
  231.   
  232.         public bool IsNull { get; set; }  
  233.         public String Name { get; set; }  
  234.         public Document Document { get; set; }  
  235.     }  
  236.   
  237. }<span style="background-color: inherit; color: black; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px; font-size: 9px; ">m.Collections.Generic;  </span>
复制代码

最关键的是这句话:将文档以及视图ID传给控件。            _elementHostWPF.Child = new PreviewControl(_dbDocument, dbItem.Id);

这样你就可以浏览任意的族文件,rvt文件。
作者:叶雄进文章来源:http://blog.csdn.net/joexiongjin/article/category/782739



作者: 沧海冷月    时间: 2014-2-20 14:17
路过!!! 帮顶……




欢迎光临 EaBIM (https://eabim.net/) Powered by Discuz! X3.2