GripOverrule в C3D

Автор Тема: GripOverrule в C3D  (Прочитано 32580 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
GripOverrule в C3D
« : 22-12-2017, 03:01:39 »
Друзья, а кто-нибудь успешно применял переопределение ручек в C3D2018?
У меня имеется весьма странная ситуация: есть программа, в которой кроме всего прочего реализовано переопределение ручек для полилинии. В AutoCAD 2017 и C3D 2017 работает без каких либо замечаний; в AutoCAD 2018 так же работает все замечательно, а вот в C3D 2018, при попытке перенести переопределенную ручку вылазит фаталити:


************** Текст исключения **************
System.ArgumentException: Элемент с тем же ключом уже был добавлен.
   в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   в AcMgGripOverrule.getGripPoints(AcMgGripOverrule* , AcDbEntity* pSubject, AcArray<AcDbGripData \*\,AcArrayMemCopyReallocator<AcDbGripData \*> >* grips, Double curViewUnitSize, Int32 gripSize, AcGeVector3d* curViewDir, Int32 bitflags)

Именно такая ошибка у меня была, когда я пытался переопределить ручки трассы C3D, а потом узнал, что трассы переопределение ручек не поддерживают в принципе.
Данная проблема наблюдается на всех имеющихся проектах для AutoCAD, где имело место переопределение ручек. Неужели какие-то библиотеки C3D блокируют работу переопределенных ручек, даже для автокадовских объектов?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #1 : 22-12-2017, 11:22:39 »
Теоретически возможно это и баг, но без кода (а точнее готового примера проекта) как ты предлагаешь искать ошибку?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #2 : 22-12-2017, 11:27:01 »
Почитай вот эту тему: http://adn-cis.org/forum/index.php?topic=7814.0
Там ошибка один в один с твоей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #3 : 22-12-2017, 11:54:37 »

омагад!!!

У меня в том месте вот это:
Код - C# [Выбрать]
  1. using (OpenCloseTransaction trans = new OpenCloseTransaction())

Точно хакеры взломали мой компьютер и переписали этот кусок кода )))
Вечером буду менять транзакцию и проверять.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #4 : 23-12-2017, 03:30:57 »
Похоже, что все-таки парни из Автодеска сломали ручки в C3D2018, причем все - даже автокадовские  :(
Причем в C3D после первого перетаскивания, достаточно выбрать объект, чтобы словить фатальную ошибку.

Вот как работает простое приложение для переопределения ручек полилинии на AutoCAD 2018:


А вот так работает это же приложение в Civil 3D 2018:


Вот исходный код:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Gi = Autodesk.AutoCAD.GraphicsInterface;
  9. using Autodesk.AutoCAD.Colors;
  10.  
  11. namespace testgrips
  12. {
  13.     public class ImplementClass : IExtensionApplication
  14.     {
  15.         public void Initialize()
  16.         {
  17.             if (Application.DocumentManager.MdiActiveDocument == null)
  18.                 return;
  19.  
  20.             ObjectOverrule.AddOverrule(RXClass.GetClass(typeof(Polyline)), CableLineGripOverruleClass.Instance, true);
  21.         }
  22.  
  23.         public void Terminate() { }
  24.     }
  25.  
  26.     public class CableLineGripOverruleClass : GripOverrule
  27.     {
  28.         public static CableLineGripOverruleClass Instance = new CableLineGripOverruleClass();
  29.  
  30.         public override void GetGripPoints(Entity entity, GripDataCollection grips, double curViewUnitSize, int gripSize, Vector3d curViewDir, GetGripPointsFlags bitFlags)
  31.         {
  32.             Polyline pline = (Polyline)entity;
  33.  
  34.             if (pline.NumberOfVertices > 0)
  35.             {
  36.                 Point3d pnt1 = pline.StartPoint;
  37.                 MoveGripClass grip1 = new MoveGripClass(pnt1);
  38.                 grips.Add(grip1);
  39.  
  40.                 Point3d pnt2 = pline.EndPoint;
  41.                 MoveGripClass grip2 = new MoveGripClass(pnt2);
  42.                 grips.Add(grip2);
  43.             }
  44.         }
  45.  
  46.         public override void MoveGripPointsAt(Entity _ent, GripDataCollection grips, Vector3d offset, MoveGripPointsFlags bitFlags)
  47.         {
  48.             if (grips.Count == 0) return;
  49.  
  50.             Polyline pline = (Polyline)_ent;
  51.  
  52.             Point3d pnt = grips[0].GripPoint;
  53.             Point3d pntm = grips[0].GripPoint + offset;
  54.             Point2d pnt2 = new Point2d(pntm.X, pntm.Y);
  55.             int n = pline.NumberOfVertices;
  56.  
  57.             if (pnt == pline.StartPoint)
  58.                 pline.SetPointAt(0, pnt2);
  59.  
  60.             if (pnt == pline.EndPoint)
  61.                 pline.SetPointAt(n - 1, pnt2);
  62.         }
  63.     }
  64.  
  65.     public class MoveGripClass : GripData
  66.     {
  67.         public MoveGripClass(Point3d _point) : base()
  68.         {
  69.             GripPoint = _point;
  70.         }
  71.  
  72.         public override bool ViewportDraw(Gi.ViewportDraw _wd, ObjectId _entid, DrawType _type, Point3d? _imageGripPoint, int _gripSizeInPixels)
  73.         {
  74.             Point2d unit = _wd.Viewport.GetNumPixelsInUnitSquare(GripPoint);
  75.             double dR = 1 / unit.X;
  76.             double dr = dR / 3.0;
  77.  
  78.             Point3dCollection pnts = new Point3dCollection();
  79.             pnts.Add(new Point3d(GripPoint.X - 1, GripPoint.Y - 1, 0));
  80.             pnts.Add(new Point3d(GripPoint.X, GripPoint.Y + 1, 0));
  81.             pnts.Add(new Point3d(GripPoint.X + 1, GripPoint.Y - 1, 0));
  82.  
  83.             _wd.SubEntityTraits.FillType = Gi.FillType.FillAlways;
  84.             _wd.SubEntityTraits.Color = 1;
  85.             _wd.Geometry.Polygon(pnts);
  86.  
  87.             _wd.SubEntityTraits.FillType = Gi.FillType.FillNever;
  88.             _wd.SubEntityTraits.TrueColor = new EntityColor(0, 0, 0);
  89.             _wd.Geometry.Polygon(pnts);
  90.  
  91.             return true;
  92.         }
  93.     }
  94. }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #5 : 23-12-2017, 14:30:51 »
Второе видео похоже не полное. Во всяком случае я не понял чем это заканчивается. Ручка вроде перенеслась.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #6 : 23-12-2017, 17:58:18 »
Скринкаст от автодеска перестает записывать, когда автокад падает. Вот полное видео:
http://www.screencast.com/t/Wi5ZIhQIp

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #7 : 23-12-2017, 18:16:32 »
Скринкаст от автодеска перестает записывать, когда автокад падает. Вот полное видео:
http://www.screencast.com/t/Wi5ZIhQIp
Странно. У меня не перестаёт.
Ошибка e0434352h достаточно распространённая. Часто решается обновлением видеодрайвера/отключением аппаратного ускорения видео. Возможно к ручкам прямого отношения не имеет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #8 : 23-12-2017, 19:08:34 »
Отключил аппаратное ускорение - нет изменений. Установил наисвежейший драйвер видео от 20.12.2017 - нет изменений. Включал/отключал аппаратное ускорение с новым драйвером - нет изменений.
Заметил еще одно проявление этой ошибки: если после первого перетаскивания ручки попытаться перетащить вторую, то вся графика, кроме ручек, пропадает. После регенерации графика появляется, но на работу с ручками всегда реагирует одинаково. Если попытаться изменить свойство этой полилинии, появляется интересное сообщение: "Объект был открыт для чтения"
https://www.screencast.com/t/byJjDtWyohp

Эта проблема есть у меня и у моего клиента, который тестирует программу на C3D2018, т.е. это проблема в самом C3D, а не в настройках конкретной машины.
У Димы так же не работают ручки в C3D2018.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #9 : 23-12-2017, 20:21:04 »
Эта проблема есть у меня и у моего клиента, который тестирует программу на C3D2018, т.е. это проблема в самом C3D, а не в настройках конкретной машины.
У Димы так же не работают ручки в C3D2018.
Значит пиши в ADN DevHelp. Возможно какие-то их Overrule в Civil 3D конфликтуют.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #10 : 23-12-2017, 20:23:00 »
Если попытаться изменить свойство этой полилинии, появляется интересное сообщение: "Объект был открыт для чтения"
А это значит, что кто-то (или ты или C3D или какое-то стороннее приложение) открыло полилинию, но забыло её закрыть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #11 : 23-12-2017, 20:30:47 »
А это значит, что кто-то (или ты или C3D или какое-то стороннее приложение) открыло полилинию, но забыло её закрыть.
Вот это и очень странно: мое приложение (приведенное выше) вообще ничего не делает с полилинией. А это значит, что проблема в самом C3D2018, тем более, что это же приложение прекрасно работает на ACAD2018.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #12 : 23-12-2017, 20:35:12 »
А это значит, что проблема в самом C3D2018, тем более, что это же приложение прекрасно работает на ACAD2018.
Вполне возможно если нет еще какого-то приложения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GripOverrule в C3D
« Ответ #13 : 23-12-2017, 20:44:39 »
Вот это и очень странно: мое приложение (приведенное выше) вообще ничего не делает с полилинией.
Ну не совсем так. Кстати, ты нигде в коде не проверяшь можно ли её менять и вообще полилиния ли тебе на вход пришла. И я не вижу вызова base.MoveGripPointsAt. Так и задумано?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: GripOverrule в C3D
« Ответ #14 : 23-12-2017, 20:46:55 »
Так и задумано?
Да - это максимально упрощенный пример. В действительности у меня там много различных проверок.