Тема: Смена ObjectID при новом запуске Autocad

Проблема следующего характера: из чертежа в БД записываю определенную информацию, в том числе и ObjectID, для последующего редактирования и навигации по объектам чертежа. Бац, открываю на следующий день, а в чертеже все ObjectID поменялись, вся работа коту под хвост.
Можно ли сделать так, чтобы ObjectID не менялись? Или стоит привязываться к чему-то другому?

Re: Смена ObjectID при новом запуске Autocad

> Женя
У Вас неправильный подход - нужно привязываться к Handle - они сохраняются в чертеже и для конкретного чертежа уникальны.

Re: Смена ObjectID при новом запуске Autocad

Спасибо, вы спасли мой проект.

Re: Смена ObjectID при новом запуске Autocad

Мелкое уточнение для полноты картины:
ObjectID конкретного объекта является актуальным и может с успехом применяться лишь в пределах одного сеанса работы с чертежом.
Свойство Handle объекта сохраняется неизменным в пределах всего жизненного цикла данного документа (файла DWG). Поэтому именно Handle следует применять для обеспечения многосеансовой работы программы с чертежом.

Re: Смена ObjectID при новом запуске Autocad

> ALink
Тогда уж добавлю, что это не совсем точно. Т.е. для ObjectID все именно так, а вот если для чертежа выполнить _WBLOK * в то же имя файла, что и исходный чертеж (для удаления всего лишнего) - тут возможно (не всегда) изменение и Handle. Очень неприятный момент.

Re: Смена ObjectID при новом запуске Autocad

А подскажите пожалуйста: У меня есть текст с полем которое ссылается на некоторый объект... как мне узнать что это за объект? В окне с полем внизу прописывается ObjectId объекта... Есть ли какой нибудь способ (например свойство ActiveX) который бы позволил это узнать? Спасибо

Re: Смена ObjectID при новом запуске Autocad

> Laigh
Посмотри в Хэлп:
ObjectIdToObject
~'J'~

Re: Смена ObjectID при новом запуске Autocad

Используйте генератор GUID - уникальный идентификатор, проблемы отпадут.
'----------------------------------------------
Dim strGUID As String
Private Const GUID_OK As Long = 0
Private Const GUID_LENGTH As Long = &H26
Private Type GUID
    GUID1 As Long
    GUID2 As Integer
    GUID3 As Integer
    GUID4(0 To 7) As Byte
End Type
Private Declare Function CoCreateGuid Lib "ole32.dll" (pGUID As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32.dll" (pGUID As GUID, ByVal PointerToString As Long, ByVal MaxLength As Long) As Long
'----------------------------------------------
Public Function CreateNewGUID() As String
On Error Resume Next
    Dim lngResult As Long
    Dim uGUID As GUID
    lngResult = CoCreateGuid(uGUID)
    If lngResult <> GUID_OK Then
        Exit Function
    End If
    strGUID = Space(GUID_LENGTH)
    lngResult = StringFromGUID2(uGUID, StrPtr(strGUID), 1 + GUID_LENGTH)
    If lngResult = (1 + GUID_LENGTH) Then
        CreateNewGUID = strGUID
        MsgBox strGUID
    End If
End Function
'----------------------------------------------
'Вызов функции для создания GUID
Call CreateNewGUID

Re: Смена ObjectID при новом запуске Autocad

> Александр Ривилис
Спасибо, ценная иформация.

> radan
Как использовать? Как присвоить? Примерчик?
И... сохраняется ли полученный идентификатор между сеансами AutoCAD?

Re: Смена ObjectID при новом запуске Autocad

> LeonidSN
Три года прошло, а информация не устарела.. smile

Re: Смена ObjectID при новом запуске Autocad

> Александр Ривилис
Да... не обратил внимания. Тем не менее, не устарела.

Re: Смена ObjectID при новом запуске Autocad

При создании любого объекта генерим GUID и сохраняем его в расширенных данных. Можно прицепить к готовому объекту. Понятное дело, что между сеансами сохраняется. Так я по нему работаю с базой. Уникальность сгенерированного номера гарантируется самим Майкрософтом... Про GUID можно найти в любом поисковике.  Раньше пробовал все варианты идентефекации, пока не нашёл GUID, чего и Вам желаю.

Re: Смена ObjectID при новом запуске Autocad

> radan
Получить доступ по GUID в расширенных данных значительно проблематичней и медленней, чем по Handle.