【问题标题】:Close ActiveUIDocument using Revit API(2014) from Idling Event Handler使用空闲事件处理程序中的 Revit API(2014) 关闭 ActiveUIDocument
【发布时间】:2016-12-31 08:50:30
【问题描述】:

有没有办法使用 Revit API 关闭 ActiveUIDocument?我创建了一个单独的插件来关闭在 Revit GUI 中工作的 ActiveUIDocument,但是当我尝试从 Idling 事件处理程序调用该插件时,没有任何反应。请帮忙。

下面是我的插件的代码:

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;      
}

用于从 Idling 事件处理程序中调用插件的代码:

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

插件清单文件:

<?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>> 

【问题讨论】:

    标签: autodesk revit-api revit


    【解决方案1】:

    为什么不直接从 Idling 处理程序调用您的方法?

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

    当您使用它时,为什么不使用任务而不是线程池?

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

    它完成了同样的事情,并且比使用未使用参数的额外方法更干净。

    【讨论】:

    • 感谢您的信息。从 Idling 事件处理程序直接调用 SendKeys 会导致 revit 应用程序崩溃,不知道为什么。
    【解决方案2】:

    当然,当您从 Idling 事件处理程序调用外部命令时,什么都不会发生。

    空闲事件处理程序在 Revit 无事可做时执行。

    如果您的命令必须执行,Revit 有很多事情要做,因此 Idling 事件处理程序无法工作。

    以编程方式触发执行外部命令的正确且唯一的方法是通过 PostCommand 功能:

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

    我喜欢上面cs1088的回答,希望能解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2017-01-14
      • 2015-08-24
      • 2023-04-01
      相关资源
      最近更新 更多