RevitからTwinMotionFBXを自動で書き出す

3 min read読了の目安(約3400字

Revitのマクロでプラグインのコマンドをどう呼び出すか

まずはじめに、 RevitのコマンドのIDを知るために、ジャーナルファイルをつくることから始めます。
今回は、Revitを開き3Dビューに行き、TwinmotionのExportを押します。そしてRevitファイルを保存します。
そうすると、Journalファイルが自動で生成されます。以下のコマンドを見つけられます。

"CustomCtrl_%CustomCtrl_%Twinmotion 2020%Twinmotion Direct Link%ExportButton"

これをRevitCommandId.LookupCommandIdの引数に入れてあげると、RevitコマンドIDを探すことができます。

RevitCommandId.LookupCommandId(name);

それをuiapp.PostCommand(id_addin);でコマンドを呼んでいくのが流れです。

今回は、パネルを出してから、Enterキーなどのキーも自動で読むことで、Exportボタンを押してからパネルを閉じるまでの流れを自動化しています。

次回は、複数のファイルをフォルダから指定してRevitを開き、このExportをしてから、Revitを閉じるというところまでをやりたいと思います。

System.Windows.FormsをReferenceに追加します。

using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Events;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Text;


namespace TwinMotion
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId("1D1D7C97-4450-43CA-A675-22C2FCC465D5")]
	public partial class ThisApplication
	{
    	
		private void Module_Startup(object sender, EventArgs e)
		{

		}

		private void Module_Shutdown(object sender, EventArgs e)
		{

		}
		

		#region Revit Macros generated code
		private void InternalStartup()
		{
			this.Startup += new System.EventHandler(Module_Startup);
			this.Shutdown += new System.EventHandler(Module_Shutdown);
		}
		#endregion
	

		
		void OnDialogBoxShowing(object sender, DialogBoxShowingEventArgs args )
		{
			//DialogBoxShowingEventArgs args
			TaskDialogShowingEventArgs e2 = args as TaskDialogShowingEventArgs;
		
			e2.OverrideResult((int)TaskDialogResult.Ok);

		}

		static async void RunCommands(UIApplication uiapp,RevitCommandId id_addin){
			uiapp.PostCommand(id_addin);
			await Task.Delay(400);
			SendKeys.Send("{ENTER}");
			await Task.Delay(400);
			SendKeys.Send("{ENTER}");
			await Task.Delay(400);
			SendKeys.Send("{ENTER}");
			await Task.Delay(400);
			SendKeys.Send("{ESCAPE}");
			await Task.Delay(400);
			SendKeys.Send("{ESCAPE}");
			
		}
		public void myMacro()
		{
			Document doc = this.ActiveUIDocument.Document;   
            //Application app = doc.Application;

            //UIApplication uiapp = new UIApplication(app);
            UIApplication uiapp = new UIApplication(Application);
            
            try
            {
            	
            	
                //RevitCommandId id = RevitCommandId.LookupPostableCommandId(PostableCommand.ViewRange);
                RevitCommandId id = RevitCommandId.LookupPostableCommandId(PostableCommand.PlaceAComponent);
                string name = "CustomCtrl_%CustomCtrl_%Twinmotion 2020%Twinmotion Direct Link%ExportButton";
				RevitCommandId id_addin = RevitCommandId.LookupCommandId(name);
                if (id_addin != null)
                    {
                    RunCommands(uiapp, id_addin);
                    }
            }
 
             
            catch
            {
                TaskDialog.Show("Test", "error");
            }
            finally{
            	
            	
            	uiapp.DialogBoxShowing -= new EventHandler<DialogBoxShowingEventArgs>(OnDialogBoxShowing );
    			
            }

		}

	}
}

このコマンドを走らせている間は、PCを触らないでください。触るとRevitが落ちます。