程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Building Coder(Revit 二次開發)- 在兩條線之間創建尺寸

Building Coder(Revit 二次開發)- 在兩條線之間創建尺寸

編輯:C#入門知識

如何創建尺寸是一個經常被問及的問題。我最近花了點兒時間研究並找到了一個解決方案,順帶糾正了 RevitLookup 中一個相關的錯誤。

問題

我嘗試用編程的方式創建詳細的圖紙,特別是使用 ItemFactoryBase.NewDimension() 方法。我根據牆元素的幾何特征在草圖視圖中繪制細節線(Detail Line),然後想插入相關的尺寸。但問題是我如何獲取用於 NewDimension() 方法的屬於細節線(Reference)的引用對象呢?

Jeremy

我建議在遇到 Revit 二次開發的問題時,首先研究如下的資料:
The Revit API 幫助文檔(RevitAPI.chm)
The Revit API 開發指南(2013開始沒有PDF版本了,只能在 Autodesk WikiHelp 浏覽)
              譯者注:個人認為 2012 版的也夠用了。Revit API 從 2011 到 2012 有了較大改變,但是 2012 到 2013 改動不大。
The Revit SDK 例程
其實我也是這麼做的。結果發現 RevitLookup 中就有相關的實現:

[csharp] 
XYZ location1 = GeomUtils.kOrigin; 
XYZ location2 = new XYZ( 20.0, 0.0, 0.0 ); 
XYZ location3 = new XYZ( 0.0, 20.0, 0.0 ); 
XYZ location4 = new XYZ( 20.0, 20.0, 0.0 ); 
 
Curve curve1 = m_revitApp.Application.Create.NewLine( location1, location2, true ); 
Curve curve2 = m_revitApp.Application.Create.NewLine( location3, location4, true ); 
 
DetailCurve dCurve1 = null; 
DetailCurve dCurve2 = null; 
 
if( !doc.IsFamilyDocument ) 

  dCurve1 = doc.Create.NewDetailCurve( doc.ActiveView, curve1 ); 
  dCurve2 = doc.Create.NewDetailCurve( doc.ActiveView, curve2 ); 

else 

 // 只有基於細節(Detail)的族文檔才能創建細節曲線(Detail Curve) 
  if( null != doc.OwnerFamily 
    && null != doc.OwnerFamily.FamilyCategory ) 
  { 
    if( !doc.OwnerFamily.FamilyCategory.Name.Contains( "Detail" ) ) 
    { 
      MessageBox.Show( 
        "Please make sure you open a detail based family template.", 
        "RevitLookup", MessageBoxButtons.OK, 
        MessageBoxIcon.Information ); 
 
      return; 
    } 
  } 
  dCurve1 = doc.FamilyCreate.NewDetailCurve( doc.ActiveView, curve1 ); 
  dCurve2 = doc.FamilyCreate.NewDetailCurve( doc.ActiveView, curve2 ); 

 
Line line = m_revitApp.Application.Create.NewLine( location2, location4, true ); 
 
ReferenceArray refArray = new ReferenceArray(); 
 
refArray.Append( dCurve1.GeometryCurve.Reference ); 
refArray.Append( dCurve2.GeometryCurve.Reference ); 
 
if( !doc.IsFamilyDocument ) 

  doc.Create.NewDimension( doc.ActiveView, line, refArray ); 

else 

  doc.FamilyCreate.NewDimension( doc.ActiveView, line, refArray ); 

你可以通過 Add-Ins > Revit Lookup > Test Framework... > Object Hierarchy > APIObject > Element > Dimension 來調用 DimensionHardWired 外部命令。它實現了上面這段代碼。不過這裡 RevitLookup 有個小 BUG:沒有為以上這段代碼添加事務。所以你需要在上面這段代碼外圍添加如下代碼才能正確運行:


[csharp] 
using( Transaction tx = new Transaction( doc ) ) 

  tx.Start( "DimensionHardWired" ); 
...... 
  tx.Commit(); 


New dimension

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