Editor.GetEntity不等待用户输入(单击)

时间:2018-10-04 06:48:48

标签: vb.net autocad autocad-plugin

我有两个dwg文件:PID.dwg和3D.dwg

用例是先在PID.dwg上运行一个函数,然后在3D.dwg上运行,特别是按此顺序。

下面的SendCommand中使用的命令来自一个单独的DLL文件,在执行此函数之前,我使用NETLOAD加载了该文件。

Dim app As AcadApplication = CType(Application.AcadApplication, AcadApplication)
' Ctype( Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication, 
'        Autodesk.AutoCAD.Interop.AcadApplication )

If isPidAnd3dOpened() Then
    ' Activate PID document
    app.ActiveDocument = acDocPid
    'acDocPid.Activate()
    acDocPid.SendCommand("DOSOMETHINGONPID" & vbCrLf)

    ' Activate 3D document
    app.ActiveDocument = acDoc3d
    'acDoc3d.Activate()
    acDoc3d.SendCommand("DOSOMETHINGON3D" & vbCrLf)
End If

"DOSOMETINGON3D"的功能需要用户使用Editor.GetEntity进行输入。

但是,当执行acDoc3d.SendCommand("DOSOMETHINGON3D" & vbCrLf)时,它不会暂停以等待用户输入。

我想念什么?

2 个答案:

答案 0 :(得分:0)

可能您必须等待命令DOSOMETHINGONPID完成。

在ARX中,将是这样的:

CString activeCMDName = _T("DOSOMETHINGONPID");
bool EOL = false;
while (!EOL)
{
    CString cmds = Variable::Get(_T("CMDNAMES") );      
    if (cmds.Find( activeCMDName ) > 0 )    {
        Command::Wait();
    }
    else    {
        EOL = true;
    }
}

其中

CString Variable::Get( CString name )
{
    CString OutVal;
    resbuf rb ;
    acedGetVar(name, &rb);
    OutVal.SetString(rb.resval.rstring);
    acutDelString(rb.resval.rstring);   
    return OutVal ;
}

void Command::Wait()
{
    ResBuf rb;
    rb.Add(RTSTR , _T("\\"));
    int ret = acedCmd(rb.GetFirst());
}

抱歉,.net中没有此代码。希望您能解决这个问题。

答案 1 :(得分:0)

第一个答案是正确的,SendCommand无法处理异步命令。 Here是.Net中的建议解决方案:

//Create AutoCAD instance, then...

acadApp.ActiveDocument.SendCommand("(command \"NETLOAD\""+@"""C:\\acad\\networkdll\\SecondAssembly.dll"") ");
acadApp.ActiveDocument.SendCommand("#MYCOMMAND 0 ");

//Register EndCommand handler.
_DAcadApplicationEvents_EndCommandEventHandler handler = new  
    _DAcadApplicationEvents_EndCommandEventHandler(CommandEnded);

acadApp.EndCommand += handler;
waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
waitHandle.WaitOne();
acadApp.EndCommand -= handler;

//Close the startup drawing (this requires waiting @ SendCommand) because
//Drawing will cause a COMException otherwise.  'Drawing is busy'
//Mostly likely since the ActiceDocument is the startup drawing.

事件处理程序:

public void CommandEnded(string globalCommandName)
{
    System.Windows.MessageBox.Show(globalCommandName + " just ended.");
    waitHandle.Set();
}