2016-08-24 4 views
1

Revit API를 사용하여 ActiveUIDocument를 닫을 수있는 방법이 있습니까? Revit GUI에서 작동하는 ActiveUIDocument를 닫는 별도의 추가 기능을 만들었지 만 Idle 이벤트 핸들러에서 해당 추가 기능을 호출하려고하면 아무 일도 일어나지 않습니다. 도와주세요.Idle 이벤트 핸들러에서 Revit API (2014)를 사용하여 ActiveUIDocument를 닫으십시오.

 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> 

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

코드 공회전 이벤트 핸들러 내에서 추가 기능을 호출하는 데 사용 : 아래

내 추가 기능에 대한 코드입니다 addin 호출 후 저널 출력 라인 :

' 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

Idling 처리기에서 직접 메서드를 호출하지 않는 이유는 무엇입니까?

그리고 여기있는 동안 ThreadPool 대신 Task를 사용하지 않으시겠습니까?

동일한 작업을 수행하며 사용되지 않은 매개 변수가있는 추가 메서드를 사용하는 것보다 깔끔합니다.

+0

정보 주셔서 감사합니다. 유휴 이벤트 핸들러에서 직접 SendKeys를 호출하면 Revit 응용 프로그램이 왜 그 이유인지 알 수 없습니다. – amit

1

물론 Idling 이벤트 핸들러에서 외부 명령을 호출해도 아무 일도 일어나지 않습니다.

Idling 이벤트 핸들러는 Revit이 수행 할 작업이없는 동안 실행됩니다.

명령을 실행해야하는 경우 Revit은 무언가를 수행하므로 Idling 이벤트 핸들러가 작동하지 않을 수 있습니다.

프로그램 외부 명령의 실행을 트리거 할 수있는 적절하고 유일한 방법은 POSTCOMMAND 기능을 통해입니다 :

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

내가 당신을 위해 문제를 해결 cs1088의 위의 대답과 희망을 좋아합니다.

관련 문제