Autocad .net сохраняет и извлекает идентификатор объекта без использования ObjectId

Я работаю над проектом AutoCAD .net, в котором я создаю шаблон MVVM для выбора и изменения объекта. Я хочу сохранить информацию/значения выбранного объекта в модели представления, изменить информацию/значения (через всплывающий пользовательский интерфейс WPF и мой код), а затем применить изменения к объекту.

Проблема в том, что если я хочу применить изменения к объекту, я должен знать, "какой" объект получит изменения. Таким образом, я хочу сохранить объект ObjectId и получить его позже БЕЗ использования структуры ObjectId из acdbmgd.dll AutoCAD, поскольку это сделает мой проект пользовательского интерфейса зависимым от конкретной версии AutoCAD (да, это ТРЕБОВАНИЕ, чтобы мой проект пользовательского интерфейса работал над только .net framework).

Есть ли способ сделать это? Я намереваюсь сохранить objectId в объекте, а затем вернуть его обратно в objecId, но это не сработало. Пожалуйста помоги. Большое спасибо.


person Thế Long    schedule 11.10.2017    source источник
comment
Каков тип ObjectId в базе данных?   -  person grek40    schedule 11.10.2017
comment
Мне жаль, что я не очень понимаю ваш вопрос. Просто чтобы прояснить ситуацию: 1. объект ObjectId - это идентификатор объекта, который я хочу внести изменения. 2. ObjectId имеет тип: Autodesk.AutoCAD.DatabaseServices.ObjectId. И это структура. Если это не то, что вы хотите знать, пожалуйста, объясните мне. Я новичок, поэтому многого не знаю.   -  person Thế Long    schedule 11.10.2017
comment
Если вы говорите, что ваш проект пользовательского интерфейса не может зависеть ни от чего, кроме .Net Framework, значит ли это, что проект пользовательского интерфейса может зависеть от проекта модели, а проект модели зависит от AutoCAD, если общедоступный интерфейс ModelProject не зависит от AutoCAD и, таким образом, проект пользовательского интерфейса не имеет прямой зависимости от AutoCAD? В противном случае я не очень понимаю, как будет работать передача данных между AutoCAD и пользовательским интерфейсом.   -  person grek40    schedule 11.10.2017


Ответы (2)


Как вы можете знать или не знать, каждый объект на чертеже можно получить тремя уникальными способами: ObjectID, Handle и указатель экземпляра. Идентификаторы объектов создаются для каждого объекта каждый раз при открытии базы данных чертежей, поэтому они уникальны только до закрытия текущего чертежа. После повторного открытия все ObjectID будут совершенно другими. Однако дескрипторы сохраняются между сеансами и, как заявил mavious, могут быть преобразованы в длинные и обратно. Не уверен, что вы хотите сохранить ссылку на объекты между сеансами, но это, по крайней мере, решает вашу проблему с типом данных. Поверьте, я полностью понимаю ваше желание отделить autodesk от вашей основной сборки. В этом сообщении будет вся информация, которую вы можете необходимость.

person Nik    schedule 12.10.2017
comment
спасибо за ваше предложение, я нашел решение для этого, сохранив дескриптор сущности как строковое поле в модели представления, а затем извлекая его позже, восстанавливая его ObjectId следующим образом: viewModel.EntityHandle = entity.Handle.ToString(); ObjectId цилиндрId = acDb.GetObjectId (false, новый дескриптор (Convert.ToInt64 (viewModel.EntityHandle, 16)), 0); Я никогда не использую дескриптор для непосредственного извлечения сущности. Будет ли это проще или лучше? Ваш совет очень ценится. Извините за сумбурный комментарий, все еще мучаюсь с разрывом строки. - person Thế Long; 12.10.2017
comment
Я не верю, что вы можете напрямую получить доступ к сущности с дескриптором. .Net API основан на использовании ObjectID практически для всего, что можно получить с помощью дескриптора. Одна из основных причин, по которой вам следует использовать дескриптор, состоит в том, чтобы иметь постоянную ссылку на определенные объекты в заданном чертеже между сеансами. - person Nik; 12.10.2017

Вместо ObjectId вы можете хранить значение дескриптора как (long). Вам по-прежнему нужно будет преобразовать значение дескриптора в дескриптор Autocad при извлечении объекта, но я не вижу способа избежать этого.

person mavios    schedule 11.10.2017