Скринкаст от автодеска перестает записывать, когда автокад падает. Вот полное видео:Странно. У меня не перестаёт.
http://www.screencast.com/t/Wi5ZIhQIp
Эта проблема есть у меня и у моего клиента, который тестирует программу на C3D2018, т.е. это проблема в самом C3D, а не в настройках конкретной машины.Значит пиши в ADN DevHelp. Возможно какие-то их Overrule в Civil 3D конфликтуют.
У Димы так же не работают ручки в C3D2018.
Если попытаться изменить свойство этой полилинии, появляется интересное сообщение: "Объект был открыт для чтения"А это значит, что кто-то (или ты или C3D или какое-то стороннее приложение) открыло полилинию, но забыло её закрыть.
А это значит, что кто-то (или ты или C3D или какое-то стороннее приложение) открыло полилинию, но забыло её закрыть.Вот это и очень странно: мое приложение (приведенное выше) вообще ничего не делает с полилинией. А это значит, что проблема в самом C3D2018, тем более, что это же приложение прекрасно работает на ACAD2018.
А это значит, что проблема в самом C3D2018, тем более, что это же приложение прекрасно работает на ACAD2018.Вполне возможно если нет еще какого-то приложения.
Вот это и очень странно: мое приложение (приведенное выше) вообще ничего не делает с полилинией.Ну не совсем так. Кстати, ты нигде в коде не проверяшь можно ли её менять и вообще полилиния ли тебе на вход пришла. И я не вижу вызова base.MoveGripPointsAt. Так и задумано?
Так и задумано?Да - это максимально упрощенный пример. В действительности у меня там много различных проверок.
Так что единственный маршрут - отправлять в ADN DevHelp.Как раз этого я и хочу. Вы можете отправить такой запрос?
Могу. Но тебе нужно подготовить несколько вещей:Так что единственный маршрут - отправлять в ADN DevHelp.Как раз этого я и хочу. Вы можете отправить такой запрос?
Если в C3D 2018 он не работает - значит точно баг.Не самый лучший пример. Он в Сивиле вообще крайне плохо работает: ручки рисует где-то далеко в космосе от объекта :)
Дима, у тебя есть готовый проект, который можно с техподдержку заслать? Я смогу его подготовить только после НГ.Можешь не торопиться. У них тоже праздники.
А пример Алексей Терно у тебя тоже приводит к Fatal Error?С тем кодом такая ситуация:
просто глючитОт этого не легче - программа все равно становиться нерабочей.
Можешь не торопиться. У них тоже праздники.Можно вообще не торопиться. Моё последнее обращение в ADN уже третью неделю без ответа висит :(
От этого не легче - программа все равно становиться нерабочей.Согласен. Мне такое поведение тоже сильно не нравится. Придётся проверять версию Civil 3D и просто отключать Grip Overrule, если это 2018 версия. Потому что исправить это могут только разработчики Civil. А каких-то возможных обходных путей я лично не вижу.
Можно вообще не торопиться. Моё последнее обращение в ADN уже третью неделю без ответа виситЯ написал Ярославу Решетникову, чтобы он оказал помощь в проталкивании запроса по этой ошибку, но он вернется из отпуска только 8 января, так что, парни, курим бамбук :)
Придётся проверять версию Civil 3D и просто отключать Grip Overrule, если это 2018 версия.А что делать, если весь дополнительный функционал реализован через ручки? В этом случае приложение целиком теряет свою функциональность.
об этой проблеме Autodesk уже давно знаетТочно знает?
Это конфиденциальная информация, доступная только бета-тестерам. Даже здесь её не следует публиковать.Извините, вам запрещён просмотр содержимого спойлеров.
Это конфиденциальная информация, доступная только бета-тестерам. Даже здесь её не следует публиковать.Даже просто о существовании бета версий??
Exception thrown: 'System.ArgumentException' in mscorlib.dll
Additional information: Элемент с тем же ключом уже был добавлен. occurred
Полная трассировка исключения:mscorlib.dll!System.ThrowHelper.ThrowArgumentException(System.ExceptionResource resource) + 0x38 bytes
mscorlib.dll!System.Collections.Generic.Dictionary<System.IntPtr, System.Collections.Generic.List<Autodesk.AutoCAD.DatabaseServices.GripData>>.Insert(System.IntPtr key, System.Collections.Generic.List<Autodesk.AutoCAD.DatabaseServices.GripData> value, bool add) + 0x285 bytes
AcDbMgd.dll!<Module>.AcMgGripOverrule.getGripPoints + 0x013c bytes
Это исключение рушит работу AcDbMgd.dll и потом уже с помощью ручек объект не редактируется и исчезает при попытке переместить ручку - собственно, то самое поведение, которое есть на видео. Думаю, что если дальше продолжать работу после этого исключения, то в какой-то момент вылезет фатал.2. Цепляем ручку, перетаскиваем на новое место. Сразу после перемещения (когда ручка перемещена и кнопка мыши отпущена) происходят ещё два вызова GetGripPoints. При первом вызове не возникает проблем, при втором - при выходе из метода происходит исключение:А тоже самое в чистом AutoCAD 2018 тоже приводит к двум вызовам GetGripPoints?
Ну у меня чистого AutoCAD нет.https://knowledge.autodesk.com/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/Startup-switches-for-AutoCAD.html
То есть, просто игнорируем повторный вызов GetGripPoints после перемещения.Так. А bitFlags в обоих вызовах одинаков? Может быть на него можно ориентироваться?
А bitFlags в обоих вызовах одинаков?Да, к сожалению, одинаков: DynamicDimensionMode
То есть, просто игнорируем повторный вызов GetGripPoints после перемещения.Я только хотел предложить поставить счетчик на вызов этой процедуры ))
если запускать с флагом /product ACAD то теоретически должен запускаться чистый AutoCAD.Я попробовал - та же самая проблема возникает. Может быть, достаточно будет заменить AcDbMgd.dll на аналогичную из чистого AutoCAD?
Я попробовал - та же самая проблема возникает.Похоже грузятся еще какие-то arx/dbx/dll-файлы, которых нет в чистом AutoCAD.
Может быть, достаточно будет заменить AcDbMgd.dll на аналогичную из чистого AutoCAD?Думаю, что дело не в ней самой. Более того практически уверен, что они одинаковы, что в чистом AutoCAD, что в C3D. Видимо что-то формирует некорректные параметры для GetGripPoints.
Отсюда напрашивается вывод, что одновременно с GripOverrule для конкретного примитива может работать только одно приложение.Как-то это странно. Я всегда считал, что можно создать несколько GripOverrule для одного объекта и они будут спокойно сосуществовать. Но надо тестировать, и лучше это делать на голом автокаде.
А ведь есть второй метод:Что-то даже не соображу, как им воспользоваться.
Я только хотел предложить поставить счетчик на вызов этой процедуры ))Как оказалось, просто счётчик - это не совсем корректно. К примеру, выбрали объект несколько раз, но не перемещали точки - счётчик будет "крутить". Или выбрали несколько объектов, у которых ручки совпадают и перетащили за общую ручку - метод GetGripPoints работает тогда так: один раз по очереди для всех объектов, потом ещё раз по очереди для всех объектов. Исключение будет гарантировано словлено. И напоследок, код со счётчиком плохо работает в Civil 3D 2017 - после перемещения ручки пропадают. Подозреваю, что так же он отработает и в голом автокаде. Поэтому, счётчик надо привязывать к конкретному объекту, запускать только после MoveGripPoint и проверять, что работа выполняется именно в Civil 3D 2018. Ну и сам счётчик можно заменить булевым значением: вызывался метод или ещё нет. Я придумал такой костыль - использовать словарь <ObjectId, bool>. Расписывать долго, вот итоговый код:
Дима, спасибо! Возможно это будет единственным решением.
Как-то это странно. Я всегда считал, что можно создать несколько GripOverrule для одного объекта и они будут спокойно сосуществовать. Но надо тестировать, и лучше это делать на голом автокаде.Я еще раз пересмотрел код этого метода и понял, что был неправ и сделал поспешный вывод. Такая таблица вида [указатель на примитив, коллекция grips] создаётся для каждого GripOverrule. Так что исключение может возникнуть только при повторном вызове AcMgGripOverrule.getGripPoints для того же самого GripOverrule и Entity.
Что-то даже не соображу, как им воспользоваться.Вместо пары:
Я еще раз пересмотрел код этого метода и понял, что был неправ и сделал поспешный вывод. Такая таблица вида [указатель на примитив, коллекция grips] создаётся для каждого GripOverrule. Так что исключение может возникнуть только при повторном вызове AcMgGripOverrule.getGripPoints для того же самого GripOverrule и Entity.Я так понимаю, потому что в этой строке
Но возможностей у второй пары значительно меньше.Я посмотрел документацию, если ей верить, то обе IntegterCollection в параметрах метода GetGripPoints не используются (not currently in use). Получается, для задания ручек остаётся только Point3dCollection gripPoints. То есть, можно только указать, где будет новая ручка? И потом по её расположению в этой коллекции, в методе MoveGripPointsAt задавать действие? В принципе, если не нужно собственное отображение ручки, тогда это можно использовать. Если, конечно, я правильно понял принцип использования.
а если верхнюю точку перекинуть зеркально на другую сторону по вертикали/горизонтали, поведение ручек поменяется?Не понял...
Если по красной или по жёлтой стрелочке сместить конец полилинии а потом включить переопределение ручек, поменяются ли у ручек действия местами?Нет - точка растяжения всегда остается справа, как ни крути - pline.StartPoint.X + 2
Тогда другая гипотеза: по умолчанию первой точке назначается растяжение, второй - перемещение, третьей - поворот, четвёртой - масштабирование ... и т.д.Я думаю, что все гораздо проще:
Все последующие ручки игнорируются.Если не переопределять метод MoveGripPointsAt.
Такая таблица вида [указатель на примитив, коллекция grips] создаётся для каждого GripOverrule. Так что исключение может возникнуть только при повторном вызове AcMgGripOverrule.getGripPoints для того же самого GripOverrule и Entity.Александр Наумович, Вы натолкнули меня на одну шикарную идею, которую удалось реализовать! В таком виде код не привязывается ни к версии, ни к Civil (смотрите строки 37-51):