Editor.GetEntity не ждет ввода пользователя (нажмите) - PullRequest
0 голосов
/ 04 октября 2018

У меня есть два файла 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 голосов
/ 10 октября 2018

Первый ответ правильный, SendCommand не может обрабатывать асинхронные команды. Здесь - это предлагаемое решение в .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();
}
0 голосов
/ 04 октября 2018

Вероятно, вам нужно дождаться завершения команды 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.Надеюсь, вы справитесь с этим.

...