public static void SendCommand(string CommadName) { //через COM так как там есть объект nanoCAD.State - по нему можно определить занят NC или нет nanoCAD.Application NC = null; GetAcadApplication.GetNC(ref NC); if (NC == null) { //Обработка ошибки COM if (Application.DocumentManager.Count == 0) { return; } var doc0 = Application.DocumentManager.MdiActiveDocument; var ed0 = doc0.Editor; ed0.WriteMessage("Не удалось получить nanoCAD.Application. Операция прекращена"); //остановка таймера AutosaveCycle.Stop(); return; } nanoCAD.Document doc = null; if (NC.Documents.Count > 0) { doc = NC.ActiveDocument; } if (doc != null) { //тут надо запускать таймер на предеьное время ожидания, и выходить если оно превышено if (WaitIdleNc(ref NC, 300)) //дожидаемся когда NC освободится, 5 минут максимум { doc.SendCommand(CommadName); } else { //ждали больше 5 мин и приложение так и не освободилось } } }
public static bool WaitIdleNc(ref nanoCAD.Application NC, int MaxWaitTime) { var StartTime = DateTime.Now; var State = (nanoCAD.State)NC.GetState(); while (!State.IsQuiescent) { Thread.Sleep(100); var WorkTime = DateTime.Now; TimeSpan ts = WorkTime - StartTime; int c = ts.Seconds; if (c > MaxWaitTime) { return(false); //если превышено максимальное время ожидания } } return(true); //дождались }