👏

RevitのMacroでC#はじめよう

2021/01/30に公開1

Revitのプラグインを作りたい人向け、まずはマクロで!

Dynamoをしたり、pyRevitでツールを作ったり、開発といっても誰でも手軽に進められるようになりました。
ただ組織でやるには、もう一歩先のRevitプラグインを独自につくるというところが必要になる場面が出てくると思います。

  1. コードのメンテナンスやコードの質をレビューして組織的に開発を進めたい
  2. ソースコードを他社に見られずに開発したツールを配りたい
  3. サードパーティーのライブラリを使って、高度な技術を使いたい

など理由は沢山あげることができます。

ただまだ始めるにはハードルが、、、、そんな方はまずはマクロではじめましょう。Visual StudioやVisual Studio Codeなど、ツールを入れずにRevitだけで、気軽に始められます。

早速 Hello World!

壁のカテゴリだけを選択する

public void SetSelectedElements()
		{
			var uidoc = this.ActiveUIDocument;
			var doc = this.ActiveUIDocument.Document;
			var walls = new FilteredElementCollector(doc).OfClass(typeof(Wall)).ToElementIds();
			var wallsbyCategory = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).ToElementIds();
			uidoc.Selection.SetElementIds(wallsbyCategory);
		}

Lineの長さを測る

public void GetLineLength()
		{
			var doc = this.ActiveUIDocument.Document;
			var uidoc = this.ActiveUIDocument;
			var ids = uidoc.Selection.GetElementIds();
			
			var elements = ids.Select(q => doc.GetElement(q));
			
			var total = 0.0;
			
			foreach (Element e in elements)
			{
				var lengthParam = e.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH);
				if (lengthParam == null)
					continue;
				var length = lengthParam.AsDouble();
				total += length;
			}
			
			var doubleConverted = UnitUtils.ConvertFromInternalUnits(total, doc.GetUnits().GetFormatOptions(UnitType.UT_Length).DisplayUnits);
			
			TaskDialog.Show("Total Length", "Feet: " + total.ToString() + Environment.NewLine + "Millimeter: " + doubleConverted);
		
		}

Elementを選んで情報を取得する

public void FindElements()
		{
			var doc = this.ActiveUIDocument.Document;
			var info = "";
			
			var doorFilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
			var windowFilter = new ElementCategoryFilter(BuiltInCategory.OST_Windows);
			
			var catList = new List<BuiltInCategory>();
			catList.Add(BuiltInCategory.OST_Doors);
			catList.Add(BuiltInCategory.OST_Windows);
			var multiCatFilter = new ElementMulticategoryFilter(catList);
			
			
			var wallWindowsInstances = new FilteredElementCollector(doc, doc.ActiveView.Id).OfClass(typeof(FamilyInstance)).WherePasses(multiCatFilter);
			
			var familySymbolName = "0406 x 0610mm";
			
			var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Where( x => x.Name == familySymbolName );
			
			foreach(FamilyInstance fi in instances)
			{
				FamilySymbol fs = fi.Symbol;
				Family family = fs.Family;
				
				info += family.Name + " : " + fs.Name + ": " + fi.Name + Environment.NewLine;
				
			}
			
			TaskDialog.Show("Element Information : ", info);
		}

Discussion

Yushi KatoYushi Kato

Revit 2021での単位変換になります!!
UnitUtils.ConvertFromInternalUnits(Length, UnitTypeId.Millimeters)