2016-08-24 54 views
1

有什麼方法可以使用Revit API關閉ActiveUIDocument?我創建了一個單獨的插件來關閉從Revit GUI工作的ActiveUIDocument,但是當我嘗試從Idling事件處理程序調用該插件時,沒有任何反應。請幫忙。使用來自怠速事件處理程序的Revit API(2014)關閉ActiveUIDocument

下面是我的插件代碼:

private void CloseDoc(object obj) 
{ 
    SendKeys.SendWait("^{F4}"); 
} 

public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements) 
{ 
    Threadpool.QueueUserWorkItem(new WaitCallback(Close)); 
    return Result.Succeeded;  
} 

代碼用於從怠速事件處理程序中調用插件:

 RevitCommandId id_built_in = RevitCommandId.LookupPostableCommandId(PostableCommand.SheetIssuesOrRevisions); 
    RevitCommandId addinID = RevitCommandId.LookupCommandId("1869A8A1-A239-41CF-9A79-96234D92DEF4"); 
    app.PostCommand(addinID); 

Addinn清單文件:

<?xml version="1.0"?> 
<RevitAddIns> 
    <AddIn Type="Command"> 
    <Assembly>AddinExternalLauncher.dll</Assembly> 
    <ClientId>1869A8A1-A239-41CF-9A79-96234D92DEF4</ClientId> 
    <FullClassName>AddinExternalLauncher.AddinLauncher</FullClassName> 
    <Text>Addin External Launcher</Text> 
    <Description></Description> 
    <VisibilityMode>AlwaysVisible</VisibilityMode> 
    <VendorId>ADSK</VendorId> 
    <VendorDescription>Autodesk, www.autodesk.com</VendorDescription> 
    </AddIn> 
</RevitAddIns> 

最後幾調用插件後的日誌輸出行:

' 1:< total bytes expanded: 35414988 
' 1:< ;EES;0;0;86;0;0;0;0;0;14; 
' 1:< 0 ModelServerState "Destroyed": Current server = "Not Queried", Model server = "", Model server state = "Not Applicable" 
' 1:< System (MB) [Available/Total ] [Revit Memory Usage (MB) ] 
' 1:< RAM Statistics:  3385/ 8040  623=InUse  629=Peak 
' 1:< VM Statistics: 8384617/8388607  536=InUse  542=Peak 
' 1:< ::9:: Delta VM: Avail -13 -> 8384597 MB, Used +28 -> 564 MB, Peak +21 -> 564 MB; RAM: Avail -26 -> 3360 MB, Used +41 -> 664 MB, Peak +36 -> 665 MB 
'E 24-Aug-2016 15:02:28.961; 1:< 
' [Jrn.File Input Information] COMMON.FILE_INPUT.FILE_TYPE: .rvt 013144064.000000 
' 0:< The Idling event callback used 53 seconds 
' 3:< ::10:: Delta VM: Avail -20 -> 8384577 MB, Used +6 -> 570 MB, Peak +6 -> 570 MB; RAM: Avail -2 -> 3358 MB, Used +3 -> 667 MB, Peak +1 -> 667 MB 
' 0.114085  4:<<From Parking Area: ;PERF;MISC;generating greps 
' 0:< ::10:: Delta VM: Avail +5 -> 8384583 MB, Used -13 -> 558 MB; RAM: Avail +2 -> 3361 MB, Used -7 -> 661 MB, Peak +0 -> 668 MB 
' 0.372841 1:<<;PERF;MISC;drawing/ALL_GAPS 0.258756/TurnOff_GAPs 74% 
'C 24-Aug-2016 15:02:29.386; 0:< idle0_doc 
'H 24-Aug-2016 15:02:29.386; 0:< 
Jrn.Directive "AllowPressAndDrag" _ 
     , 1 
' 0:< <<Begin build CT>> 
' 
'Edit mode: IDR_COMMON 
'Command: ID_BUTTON_SELECT 
'Category: 0 
'Bar list: 
' Dialog_Revit_DynamicLabelDBar 
' Dialog_Essentials_FilterSelectionNew 
'Presenter list: 
' PP_DebugTab_Binding_Demo 
'Product: Architecture 
' 
' 
'*********************************************************** 
'*********************************************************** 
'<<End build CT>> 

回答

1

爲什麼不直接從怠速處理程序調用你的方法?

private void ApplicationOnIdling(object sender, IdlingEventArgs idlingEventArgs) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Close)); 
} 

雖然你在它,爲什麼不使用任務而不是ThreadPool?

Task.Run(() => SendKeys.SendWait("^{F4}")); 

它完成同樣的事情,並且比具有未使用參數的額外方法更清潔。

+0

感謝您的信息。直接從怠速事件處理程序調用SendKeys崩潰的Revit應用程序不知道爲什麼。 – amit

1

當您從Idling事件處理程序調用外部命令時,當然沒有任何反應。

怠速事件處理程序在Revit沒有其他操作時執行。

如果您的命令必須執行,Revit有一些重要的事情,因此Idling事件處理程序無法工作。

的正確和唯一的以編程方式觸發一個外部命令的執行是通過在postcommand功能:

http://thebuildingcoder.typepad.com/blog/2013/10/programmatic-custom-add-in-external-command-launch.html

我喜歡上面cs1088的答案,並希望解決問題爲您服務。

相關問題