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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 25-05-2019, 19:45:08

Название: Получить последний добавленный примитив
Отправлено: Алексей (IdeaSoft) от 25-05-2019, 19:45:08
Как получить последний добавленный в базу данных примитив?

Нужно ли для этого открыть таблицу примитивов и получить доступ к последней записи
или есть свойство у Database которое возвращает последний ObjectID.
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 25-05-2019, 19:56:34
Нужно ли для этого открыть таблицу примитивов
И что же такое таблица примитивов???
есть свойство у Database которое возвращает последний ObjectID
Нет. Хотя через lisp (entlast) или ObjectARX (acdbEntLast) или P/Invoke (acdbEntLast) можно получить.
Впрочем это может быть не примитив (Entity), а объект (DBObject). Например, если последней операцией создан новый слой.
Название: Re: Получить последний добавленный примитив
Отправлено: Алексей (IdeaSoft) от 25-05-2019, 21:45:12
Это u
И что же такое таблица примитивов???
Вот такая
Код - F# [Выбрать]
  1.  CAD_DBS.BlockTable bt = (CAD_DBS.BlockTable)tr.GetObject(db.BlockTableId, CAD_DBS.OpenMode.ForRead);
  2.                 CAD_DBS.BlockTableRecord btr =
  3.                    (CAD_DBS.BlockTableRecord)tr.GetObject(bt[CAD_DBS.BlockTableRecord.ModelSpace], CAD_DBS.OpenMode.ForWrite, false, true);
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 25-05-2019, 23:27:16
Вот такая
Это ты сам придумал такой термин. Вообще-то это называется Пространство модели.
Название: Re: Получить последний добавленный примитив
Отправлено: Привалов Дмитрий от 27-05-2019, 07:48:31
Как получить последний добавленный в базу данных примитив?

Нужно ли для этого открыть таблицу примитивов и получить доступ к последней записи
или есть свойство у Database которое возвращает последний ObjectID.

А что хочешь отследить, если не секрет?

Возможно тебе стоит подписаться на событие Database.ObjectAppended Event.
The event indicates that an object has been added to the database.

или подобное, и следить за "последними объектами", может их несколько создается.

Чтобы меньше путаться с "таблицами примитивов" в коде и голове, могу посоветовать другое именование.
CAD_DBS.BlockTableRecord modelSpace =
                   (CAD_DBS.BlockTableRecord)tr.GetObject(bt[CAD_DBS.BlockTableRecord.ModelSpace], CAD_DBS.OpenMode.ForWrite, false, true);

я также использую:
paperSpace
currentSpace
block
и т.д.

btr не самое удачное название, привязанное к типу данных, который никогда не совпадает с "термином".

bt при этом норм, т.к. тип данных и "термин" совпадают. (сам предпочитаю полное название blockTable)
Название: Re: Получить последний добавленный примитив
Отправлено: Алексей (IdeaSoft) от 28-05-2019, 21:09:39
А что хочешь отследить, если не секрет?
Да нет, просто выполняется команда, к примеру _offset,
и мне нужно получить доступ к смещенному объекту (если он конечно будет последним?)
ну и сделать с ним что-то, например, поместить в нужный мне слой или еще что-то.
Название: Re: Получить последний добавленный примитив
Отправлено: Алексей (IdeaSoft) от 28-05-2019, 21:10:31
Возможно тебе стоит подписаться на событие Database.ObjectAppended Event.
Ну вообще можно попробовать и так.
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 28-05-2019, 21:12:49
Возможно тебе стоит подписаться на событие Database.ObjectAppended Event.
Ну вообще можно попробовать и так.
Только нужно проверять, что объект (примитив) добавляется в ModelSpace
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 28-05-2019, 21:15:03
А что хочешь отследить, если не секрет?
Да нет, просто выполняется команда, к примеру _offset,
и мне нужно получить доступ к смещенному объекту (если он конечно будет последним?)
ну и сделать с ним что-то, например, поместить в нужный мне слой или еще что-то.

Сделай по аналогии с этим: http://adn-cis.org/raschlenenie-vlozhennyix-blokov-s-pomoshhyu-.net.html
Название: Re: Получить последний добавленный примитив
Отправлено: Evgenia от 17-09-2020, 08:00:51
Доброе утро. Подскажите, пожалуйста, а если все-таки нужно получить последний объект в пространстве модели, как это сделать?
Я вставляю в чертеж блок, который нужно разбить и у полученного блока изменить значения атрибутов. Всё получается сделать кроме получения блока после разбивки.
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 17-09-2020, 08:47:49
Перебрать все примитивы в пространстве модели и найти последний. Хотя возможно есть значительно более простой способ, если знать как вставляется и расчленяется блок в вашем случае.
Название: Re: Получить последний добавленный примитив
Отправлено: Evgenia от 17-09-2020, 09:06:12
Используя этот кусочек кода я вставляю файл, в котором один блок, и разбиваю его. Может этот блок можно разбить по другому, чтобы получить ID не перебором?

Код - C# [Выбрать]
  1.             App.Document doc = cad.DocumentManager.MdiActiveDocument;
  2.             Db.Database db = doc.Database;
  3.             Ed.Editor ed = doc.Editor;
  4.             Ed.PromptPointOptions pPtOpts;
  5.             pPtOpts = new Ed.PromptPointOptions("\nSpecify insertion point: ");
  6.             var pPtRes = doc.Editor.GetPoint(pPtOpts);
  7.             if (pPtRes.Status != Ed.PromptStatus.OK)
  8.                 return;
  9.             var ptStart = pPtRes.Value;
  10.             using (Db.Transaction tr = db.TransactionManager.StartTransaction())
  11.             {
  12.                 Db.BlockTable bt = tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;
  13.                 Db.BlockTableRecord model =
  14.                   tr.GetObject(bt[Db.BlockTableRecord.ModelSpace], Db.OpenMode.ForWrite) as Db.BlockTableRecord;
  15.                 // Путь к файлу чертежа
  16.                 string BlockPath;
  17.                 BlockPath = "C:\\Remark leader R3.dwg";
  18.  
  19.                 // Создаем новую базу
  20.                 using (Db.Database db1 = new Db.Database(false, false))
  21.                 {
  22.                     // Получаем базу чертежа-донора
  23.                     db1.ReadDwgFile(BlockPath, System.IO.FileShare.Read, true, null);
  24.                     // Получаем ID нового блока
  25.                     Db.ObjectId BlkId = db.Insert(BlockPath, db1, false);
  26.                     Db.BlockReference bref = new Db.BlockReference(ptStart, BlkId);
  27.                     // Дефолтные свойства блока (слой, цвет и пр.)
  28.                     bref.SetDatabaseDefaults();
  29.                     // Добавляем блок в модель
  30.                     model.AppendEntity(bref);
  31.                     // Добавляем блок в транзакцию
  32.                     tr.AddNewlyCreatedDBObject(bref, true);
  33.                     // Расчленяем блок
  34.                     bref.ExplodeToOwnerSpace();
  35.                     bref.Erase();
  36.                     // Закрываем транзакцию
  37.                     tr.Commit();
  38.                 }
  39.                
  40.             }
Название: Re: Получить последний добавленный примитив
Отправлено: Lemieux от 17-09-2020, 09:13:47
Если мне не изменяет память, то так
Код - C# [Выбрать]
  1. using System.Linq;
  2. ...
  3. ...
  4. ...
  5. BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  6. var lastObjectId = ms.OfType<ObjectId>().Last();

Хотя мне непонятна вот эта часть сообщения.
Цитировать
Я вставляю в чертеж блок, который нужно разбить и у полученного блока
Название: Re: Получить последний добавленный примитив
Отправлено: Александр Ривилис от 17-09-2020, 10:27:12
Evgenia,
Подозреваю, что нужен не "последний вставленный примитив", а все примитивы, которые получились в результате
Код - C# [Выбрать]
  1. bref.ExplodeToOwnerSpace();
А их может быть "воз и малая тележка".
В этой статье описано решение: https://adn-cis.org/raschlenenie-vlozhennyix-blokov-s-pomoshhyu-.net.html
Название: Re: Получить последний добавленный примитив
Отправлено: Evgenia от 18-09-2020, 08:02:52
Спасибо большое! Буду пробовать.

Если мне не изменяет память, то так
Код - C# [Выбрать]
  1. using System.Linq;
  2. ...
  3. ...
  4. ...
  5. BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  6. var lastObjectId = ms.OfType<ObjectId>().Last();

    Я вставляю в чертеж блок, который нужно разбить и у полученного блока

У меня в чертеже есть один динамический блок, который мне нужен. Поэтому вставляю чертеж как блок и разбиваю его для дальнейшей работы с ним))
Хотя мне непонятна вот эта часть сообщения.
Название: Re: Получить последний добавленный примитив
Отправлено: Evgenia от 18-09-2020, 08:04:19
Спасибо! Я проверила, после вставки и разбивки - я получаю блок, который мне нужен  :).
Подозреваю, что нужен не "последний вставленный примитив", а все примитивы, которые получились в результате