Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 05-06-2017, 07:47:52

Название: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 07:47:52
Есть ли метод с помощью, которого можно
назначить Handle примитиву?

Или все же это противоречит
правилам назначения уникальных номеров.

Например был примитив с уникальным
номером 184AD, потом его удалили.
И если в чертеже с таким номером не окажется
другого примитива, то возможно ли назначить этот номер примитиву.



Название: Re: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 07:56:47
Или же попытаться решить задачу по другому.
Пользователь удалил примитив, но команду PURGE
не успел выполнить. Значит в таблице примитив еще жив.
 
Может еще не поздно восстановить примитив из таблицы?
 
Название: Re: Назначить примитиву свой номер
Отправлено: Александр Ривилис от 05-06-2017, 08:21:42
Есть ли метод с помощью, которого можно
назначить Handle примитиву?
Нет.
Может еще не поздно восстановить примитив из таблицы?
Да. Вызвать его метод Erase(false).
Название: Re: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 10:14:20
Да. Вызвать его метод Erase(false).

А как мне получить ссылку на объект чтобы вызвать метод Erase?
При попытке обратиться к бвзе пишет ошибку
eUnknownHandle

Handle примитива, который был удален я знаю.

Делаю так:

Код - vb.net [Выбрать]
  1.     Public Shared Sub acadnet_primitive_reanimate(ByVal Hndl As String)
  2.         If Hndl = "" Then Exit Sub
  3.         Dim doc As CAD_APS.Document = acadnet_document_Get()
  4.         If (doc Is Nothing) Then Exit Sub
  5.         Dim db = doc.Database
  6.         Using doc.LockDocument
  7.             Using trans As CAD_DBS.Transaction = db.TransactionManager.StartTransaction
  8.                 Dim ln As Long = Convert.ToInt64(Hndl, 16)
  9.                 Dim Hn = New CAD_DBS.Handle(ln)
  10.                 Dim ID = db.GetObjectId(False, Hn, 0)
  11.                 Dim dbObj = trans.GetObject(ID, CAD_DBS.OpenMode.ForWrite, True, True)
  12.                 If (dbObj.IsErased) Then
  13.                     dbObj.Erase(False)
  14.                     Dim ent = DirectCast(dbObj, CAD_DBS.Entity)
  15.                     ent.Visible = True
  16.                 End If
  17.                 trans.Commit()
  18.             End Using
  19.         End Using
  20.     End Sub
Название: Re: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 10:20:33
подправил тут

Код - vb.net [Выбрать]
  1. Dim ID = db.GetObjectId(True, Hn, 0)

ошибка: ePermanentlyErased

Значит ли это, примитив окончательно был удален?
Название: Re: Назначить примитиву свой номер
Отправлено: Александр Ривилис от 05-06-2017, 10:22:15
А как мне получить ссылку на объект чтобы вызвать метод Erase?
При попытке обратиться к бвзе пишет ошибку
eUnknownHandle
Значит этого примитива уже нет в базе. Такую операцию можно проводить только в течении одного сеанса работы с dwg-файлом. Если файл был сохранен, а затем открыт, то там этого примитива уже нет - при сохранении он не писался в dwg-файл.
Название: Re: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 10:23:57
Если файл был сохранен, а затем открыт
Да именно так и было файл уже был сохранен и потом открыт.
Название: Re: Назначить примитиву свой номер
Отправлено: Александр Ривилис от 05-06-2017, 10:26:58
Значит ли это, примитив окончательно был удален?
Да. И тут ты уже ничего не сделаешь.
Разве что будешь работать с dxf-файлом. Там можно назначать почти любые шестнадцатиричные метки объектов. Только будь осторожен - метки не должны повторяться.
Название: Re: Назначить примитиву свой номер
Отправлено: Алексей (IdeaSoft) от 05-06-2017, 10:37:59
Спасибо.
Теперь мне тут все понятно.

У меня есть запасный выход из ситуации.
Так как я праллельно хранил координаты примитива (в моем случае полилинии)
и другую нужную информацию в Xrecord, то буду
воссстанавливать данные из XRecord.