Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alxd от 18-05-2016, 16:30:36

Название: Аналог acedRedraw в C#?
Отправлено: Alxd от 18-05-2016, 16:30:36
Кто знает аналог acedRedraw в C#?
Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 18-05-2016, 16:31:26
На выбор: Editor.DrawVector и Editor.DrawVectors
Неправильно понял вопрос. :(
Название: Re: Аналог acedRedraw в C#?
Отправлено: Alxd от 18-05-2016, 16:32:21
Не то!
Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 18-05-2016, 16:33:36
Стоп. Полного аналога нет. Можно конечно через P/Invoke. Какой вариант тебя интересует?
Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 18-05-2016, 16:39:01
Один из вариантов с P/Invoke здесь: http://through-the-interface.typepad.com/through_the_interface/2013/12/moving-text-in-an-autocad-block-using-net-part-3.html
Название: Re: Аналог acedRedraw в C#?
Отправлено: Alxd от 19-05-2016, 06:30:53
О! Решение с импортом функции вполне подходит.
Очередной раз убеждаюсь, что написание приложений под AutoCAD на С++ гибче, чем на C#. Ээх... модные тенденции... :)
Название: Re: Аналог acedRedraw в C#?
Отправлено: Alxd от 14-07-2016, 12:34:11
Непонятно, как из C# вызвать acedRedraw(NULL,1);
Попробовал передать созданный с помощью оператора new пустой ads_name, функция возвращает 5100, типа перерисовала, но на самом деле ничего не перерисовала. Не стирается ранее нарисованное с помощью ed.DrawVector.
Беда :(
Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 14-07-2016, 12:39:50
А Editor.UpdateScreen тебе не подходит?
Название: Re: Аналог acedRedraw в C#?
Отправлено: Alxd от 14-07-2016, 12:52:14
Может быть я что-то не так делаю?
Есть функции:
Код - C# [Выбрать]
  1. private void drawPoint(Editor ed, Point3d center, double size, int color)
  2.         {
  3.             ed.DrawVector(center - new Vector3d(size/2, 0, 0), center + new Vector3d(size/2, 0, 0), color, false);
  4.             ed.DrawVector(center - new Vector3d(0, size / 2, 0), center + new Vector3d(0, size / 2, 0), color, false);
  5.         }
  6.  
  7.         private void redrawPoints(Document doc, ObjectId objId1, ObjectId objId2, double size, bool switched)
  8.         {
  9.             using (OpenCloseTransaction tr = doc.TransactionManager.StartOpenCloseTransaction())
  10.             {
  11.                 Curve curve1 = (Curve)tr.GetObject(objId1, OpenMode.ForRead);
  12.                 Curve curve2 = (Curve)tr.GetObject(objId2, OpenMode.ForRead);
  13.  
  14.                 drawPoint(doc.Editor, curve1.StartPoint, size, 3);
  15.                 drawPoint(doc.Editor, switched ? curve2.EndPoint : curve2.StartPoint, size, 4);
  16.  
  17.                 tr.Commit();
  18.             }
  19.         }
  20.  

вызываю redrawPoints из основной функции

Код - C# [Выбрать]
  1. double pointSize = 1.0;
  2. redrawPoints(doc, objId1, objId2, pointSize, false);
  3. ed.UpdateScreen();
  4.  

Все отрисовалось, думаю и и без UpdateScreen. Далее следует цикл обработки ввода пользователя, и если он вызывает из команды нужную опцию, то опять вызываю:

Код - C# [Выбрать]
  1. redrawPoints(doc, objId1, objId2, pointSize, _switched);
  2. ed.UpdateScreen();
  3.  

Но в итоге на экране остается и прежняя ранее нарисованные крестики, и новые. Почему старые не стираются, не пойму.
Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 14-07-2016, 12:53:58
Попробуй так:

Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl)]
  2. private static extern int acedRedraw(IntPtr name, int mode);
  3. [CommandMethod("MyRedraw")]
  4. public void MyRedraw()
  5. {
  6.   Editor ed =
  7.     Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  8.   ed.DrawVector(new Point3d(0, 0, 0),
  9.     new Point3d(10000, 10000, 0), 1, false);
  10.   ed.GetString("\nНажмите ввод!");
  11.   acedRedraw(IntPtr.Zero, 1);
  12. }

Название: Re: Аналог acedRedraw в C#?
Отправлено: Александр Ривилис от 14-07-2016, 13:19:16
Далее следует цикл обработки ввода пользователя, и если он вызывает из команды нужную опцию, то опять вызываю:
Ты же вызываешь очистку экрана сразу после отрисовки. Думаешь если бы экран очищался, то ты что-нибудь увидел бы?
Очистку нужно ставить после запроса у пользователя.