AeccPoint и классификатор Map 3D. AccessViolationException
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AeccPoint и классификатор Map 3D. AccessViolationException

AeccPoint и классификатор Map 3D. AccessViolationException

Ответ
Поиск в этой теме
Непрочитано 08.06.2015, 11:03 #1
AeccPoint и классификатор Map 3D. AccessViolationException
TAPRAA
 
до-диез
 
Томск
Регистрация: 15.02.2013
Сообщений: 20

Всем привет. Поставлена задача проклассифицировать коготочку с помощью кода. Я пытаюсь это сделать так:
Код:
[Выделить все]
public void Method()
{
	IAcadApplication acadApp = (IAcadApplication)Application.AcadApplication;
	Editor acadEditor = Application.DocumentManager.MdiActiveDocument.Editor;

	IAeccApplication civilApp = (IAeccApplication)acadApp.GetInterfaceObject("AeccXUiLand.AeccApplication.9.0");
	IAeccDocument civilDoc = (IAeccDocument)civilApp.ActiveDocument;

	AeccPoints points = civilDoc.Points;

	PromptPointOptions opt = new PromptPointOptions("\nPosition: ") { AllowNone = true };
	PromptPointResult pos = acadEditor.GetPoint(opt);
	if (pos.Status != PromptStatus.OK)
	{
		return;
	}

	AeccPoint newPoint = points.Add(pos.Value.ToArray());
	ObjectId objId = new ObjectId(new IntPtr(newPoint.ObjectID));

	HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify(objId, "Отметка высот", true, true);
}
Если метод выполняется в первый раз, то все нормально. При повторном вызове кидается AccessViolationException на строке
Код:
[Выделить все]
AeccPoint newPoint = points.Add(pos.Value.ToArray());
Подскажите, в чем может быть проблема. Это или я как-то не так это делаю? Может быть это баг автокада, и если да, то как его можно обойти?

.NET 4.0, C#, Autodesk Civil 3D 2012

Вложения
Тип файла: zip classifier.zip (721 байт, 23 просмотров)


Последний раз редактировалось TAPRAA, 08.06.2015 в 13:41. Причина: Добавлен архив с файлом классификатора.
Просмотров: 3861
 
Непрочитано 08.06.2015, 11:21
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Внесу свои 5 копеек.
1. Напрасно Вы все переменные объявляете с var, есть же необходимые типы, при написании с нормальными типами все становится куда понятнее.
2. Подозреваю, что строчка
var points = civilDoc.Points;
Создает в points коллекцию, в которую Вы добавляете выбранную точку, но не проверяете наличие выбранной точки в этой коллекции.
Что то типа:
Код:
[Выделить все]
 
Db.ObjectIdCollection Collection = new Db.ObjectIdCollection();
var sgh = Collection.Add(Db.ObjectId.Null);
if (Collection.Contains(Db.ObjectId.Null))
{

} 
Boxa вне форума  
 
Автор темы   Непрочитано 08.06.2015, 12:21
#3
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Подозреваю, что строчка
var points = civilDoc.Points;
Создает в points коллекцию, в которую Вы добавляете выбранную точку, но не проверяете наличие выбранной точки в этой коллекции.
Может я неправильно понял Ваш ответ, но следующая конструкция успешно выводит сообщение в консоль:
Код:
[Выделить все]
 
AeccPoints newPoint = points.Add(pos.Value.ToArray());
foreach (var point in points)
{
	if (ReferenceEquals(point, newPoint))
	{
		acadEditor.WriteMessage("Point contained in collection");
	}
}
Еще заметил такой случай, что если закомментировать последнюю строку в коде:
Код:
[Выделить все]
 HostMapApplicationServices.Application.ActiveProject.ClassificationManager.Classify(objId, "Отметка высот", true, true);
,
То метод начинает выполняться всегда и без фаталов.

Последний раз редактировалось TAPRAA, 08.06.2015 в 13:10.
TAPRAA вне форума  
 
Непрочитано 08.06.2015, 12:47
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Может это потому, что Вы передаете в эту строку новый ID? попробуйте передать существующий.
к тому же Ваша конструкция с foreach , идентична методу Contains
И пропишите нормально типы переменных, глаза ведь сломать можно.

ЗЫ.
Я не спец, да и цивил у меня нет...
Boxa вне форума  
 
Непрочитано 08.06.2015, 13:26
#5
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


По-моему, вы пытаетесь применить метод Map 3D к объекту совсем другого приложения - Civil 3D. Понятно, что к нему нет доступа.
P_S вне форума  
 
Автор темы   Непрочитано 08.06.2015, 13:36
#6
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Может это потому, что Вы передаете в эту строку новый ID? попробуйте передать существующий.
Ради эксперимента попробовал передать идентификатор объекта, созданного вне этой команды, результат прежний. Но здесь надо классифицировать именно новый объект. По принципу - "добавление-классификация, добавление-классификация, ..."

Цитата:
Сообщение от Boxa Посмотреть сообщение
к тому же Ваша конструкция с foreach , идентична методу Contains
Да, эта конструкция аналогична методу ICollection<T>.Contains(T obj), но класс AeccPoints не реализует этот интерфейс.

Цитата:
Сообщение от Boxa Посмотреть сообщение
И пропишите нормально типы переменных, глаза ведь сломать можно.
Сделано специально для Вас Но все же мне привычней использовать var.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от P_S Посмотреть сообщение
По-моему, вы пытаетесь применить метод Map 3D к объекту совсем другого приложения - Civil 3D. Понятно, что к нему нет доступа.
Да, но первый раз метод отрабатывает корректно, классифицирует объект и даже может выставить свойства. Падает с исключением и фаталом при втором вызове.
TAPRAA вне форума  
 
Непрочитано 08.06.2015, 14:58
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


нафига на dotNet использовать COM? Там NET API в разы лучше!
trir вне форума  
 
Автор темы   Непрочитано 08.06.2015, 15:03
#8
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от trir Посмотреть сообщение
нафига на dotNet использовать COM? Там NET API в разы лучше!
Мы бы и рады полностью перейти на .NET API, но некоторые вещи в цивиле можно сделать только через COM. Например, я не нашел как в 2012 цивиле можно добавить коготочку в чертеж.
TAPRAA вне форума  
 
Непрочитано 08.06.2015, 15:16
1 | #9
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


в 2013 так

у меня смутное подозрение, что где то сдесь должна быть транзакция... не?
trir вне форума  
 
Непрочитано 08.06.2015, 16:06
#10
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


trir, там проблема в том, что .NET API по COGO точкам в 2012 практически отсутствует, его с 2013 только добавил под нормальным именем...
Вот схожая тема, там это и выясняли. http://forum.dwg.ru/showthread.php?t=121002
Boxa вне форума  
 
Автор темы   Непрочитано 09.06.2015, 07:50
#11
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от trir Посмотреть сообщение
в 2013 так

у меня смутное подозрение, что где то сдесь должна быть транзакция... не?
Большое спасибо за ссылку Так как наша платформа собирается под все автокады, с 12 по 15, эта информация очень пригодится.

Вначале я даже и не думал не использовать транзакцию, так как через нее делается почти все. Но ее наличие/отсутствие никак не влияет на фатал. Да и из кода понятно, что ее никуда не применить, работа делается через интеропы и через Map API.

Последний раз редактировалось TAPRAA, 09.06.2015 в 08:02.
TAPRAA вне форума  
 
Непрочитано 09.06.2015, 12:10
#12
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Наобум, к чему все-таки нет доступа? Может, как-то теряется по ходу связь с файлом конфигурации, и нужно его принудительно ClassificationManager.AttachFeatureDefinitionFile()?
P_S вне форума  
 
Автор темы   Непрочитано 09.06.2015, 14:34
#13
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от P_S Посмотреть сообщение
Может, как-то теряется по ходу связь с файлом конфигурации
Непохоже чтобы связь как-то терялась, так как из менеджера можно получить кол-во определений классов.

Цитата:
Сообщение от P_S Посмотреть сообщение
и нужно его принудительно ClassificationManager.AttachFeatureDefinitionFile()
Это не вариант, так как у нас подгрузка полного файла определений занимает секунд 30.

----- добавлено через ~2 мин. -----
Вообще, тему можно закрывать. Здесь сказали что такое поведение цивила при вставке и классификации коготочки есть баг и ничего сделать нельзя.
TAPRAA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AeccPoint и классификатор Map 3D. AccessViolationException

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт длин 3D Solid Extrude или 3D Solid Sweep Малюк Программирование 1 11.10.2012 12:33
Как из 3d модели сделать 2d чертёж, связанный с 3d моделью? IKArus AutoCAD 16 11.06.2012 16:35
3D проектирование в нефтехимической промышленности. Программы? Опыт? Andrey.K Другие CAD системы 36 12.11.2010 13:43
Как тело построенное 3D Face превратить в 3D Solid? Bdod AutoCAD 37 03.08.2006 11:36