Leo_fmf,
В общем что я думаю по этому поводу
1) Метода для остановки рендеринга нет (косвенное доказательство -
http://forums.autodesk.com/t5/navisworks-api/api-control-for-autodesk-rendering-functionality/td-p/5114598). Даже если бы был, то мне кажется это не спасло бы ситуацию. Если камера меняется слишком часто, то в итоге получится что прорисовка осуществлялась бы в итоге только на последнем кадре.
2) Использование таймера в данном случае большой костыль. Правильнее было бы использовать Monitor.Pulse и Monitor.Exit. Но в данном случае вряд ли это является причиной тормозов.
3) Есть подозрение, что данный реализация метода изменения позиции камеры сама по себе в данном случае не совсем корректная. Она подходит для перехода на конкретный viewpoint, но не для плавного перемещения. Я имею ввиду метод oDoc.CurrentViewpoint.CopyFrom(CurVP); который по умолчанию вызывает синхронный рендеринг.
4) Возможно вот этот вариант поможет -
http://forums.autodesk.com/t5/navisworks-api/viewpoint-manipulation-and-threading-in-2013-net-api/td-p/3698250 Тут предлагается использовать COM объект и с помощью него явно задавать позицию камеры. Возможно поведение будет совсем другое.
public override int Execute(params string[] parameters)
{
System.Threading.Thread t = new System.Threading.Thread(this.moveCam);
t.Start();
while (!t.IsAlive) ;
return 0;
}
private void moveCam()
{
//Document doc = Autodesk.Navisworks.Api.Application.ActiveDocument;
//Viewpoint curVP = doc.CurrentViewpoint;
//Viewpoint copyVP = curVP.CreateCopy();
//double inc = 1;
//Point3D pos = new Point3D(copyVP.Position.X + inc,
// copyVP.Position.Y,
// copyVP.Position.Z);
//copyVP.Position = pos;
//doc.CurrentViewpoint.CopyFrom(copyVP);
ComApi.InwOpState10 state;
state = ComBridge.State;
ComApi.InwNvViewPoint NvViewPoint = state.CurrentView.ViewPoint;
ComApi.InwNvCamera NvCamera = NvViewPoint.Camera;
ComApi.InwLPos3f NvCamPos = NvCamera.Position;
NvCamPos.SetValue(NvCamPos.data1 + 10, NvCamPos.data2 + 10, NvCamPos.data3);
}
5) Если последний вариант не поможет, то придется пересматривать логику приложения. Т.е. игнорировать сообщения камеры, если предыдущий рендеринг еще не выполнился (не с помощью таймера, разумеется). Это придется делать в любом случае. Далее, можно, например, не перемещать камеру, если ее положение изменилось на небольшое расстояние от текущего положения камеры и в течении n секунд не было изменения позиции камеры. Расстояние и время подбирается опытным путем.