Копирование COGOPOINT из внешних ссылок.

Автор Тема: Копирование COGOPOINT из внешних ссылок.  (Прочитано 12784 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
zavor
У тебя в коде полный бред. Понять из него куда и что ты копируешь невозможно. Упрости его до предела.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Что вот это за ерунда:
Код - C# [Выбрать]
  1. using (var bt = (BlockTable)_trans.GetObject(_db.BlockTableId, OpenMode.ForWrite))
  2. using (_btr = (BlockTableRecord)_trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite))
???
Зачем всё открывать для записи? Ты же их не модифицируешь и при этом мешаешь работать другим методам,
которые не в состоянии открыть эти объекты для чтения, так как они уже открыты для записи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
1. А почему здесь, а не в разделе по Civil 3D?
2. Каковы условия работы приложения? Запускается в Civil 3D или в голом AutoCAD? Вставляется в чертеж AutoCAD или в чертеж Civil3D?
3. После копирования, COGO-точки физически присутствуют в базе чертежа, в который выполнялось копирование? Проверяется это не визуальным отображением, а в навигаторе.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. А почему здесь, а не в разделе по Civil 3D?
Логично. Тему переношу.

2. Каковы условия работы приложения? Запускается в Civil 3D или в голом AutoCAD? Вставляется в чертеж AutoCAD или в чертеж Civil3D?
В первом сообщении указано, что работа идёт в Civil 3D 2015.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Что вот это за ерунда:
Код - C# [Выбрать]
  1. using (var bt = (BlockTable)_trans.GetObject(_db.BlockTableId, OpenMode.ForWrite))
  2. using (_btr = (BlockTableRecord)_trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite))
???
Зачем всё открывать для записи? Ты же их не модифицируешь и при этом мешаешь работать другим методам,
которые не в состоянии открыть эти объекты для чтения, так как они уже открыты для записи.
+ использование using здесь лишнее, т.к. объекты открываются через транзакцию и она управляет ими.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
+ использование using здесь лишнее, т.к. объекты открываются через транзакцию и она управляет ими.
Полностью согласен.
zavor,
Что касается использования Database.WblockCloneObjects - следует сначала отобрать все ObjectId для объектов из одной внешней ссылки в одну ObjectIdCollection и вызвать Database.WblockCloneObjects для копирования всей этой коллекции примитивов в текущую базу данных.
Ну и выполнить такую операцию в цикле для всех баз внешних ссылок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я вообще бы наказывал за использование объектов Civil 3D во внешних ссылках. Внешние ссылки - это механизм AutoCAD, в Civil совместная работа выполняется через быстрые ссылки. Вы что,
 и поверхности, и трассы, и коридоры и характерные линии собираетесь перетаскивать таким образом? Сдается мне, что это очень проблемный сценарий...

/* Убрал тэг offtop, так как это очень по существу темы. Александр Ривилис */
« Последнее редактирование: 17-04-2017, 12:46:14 от Александр Ривилис »

Отмечено как Решение zavor 20-04-2017, 11:17:46

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Александр Наумович, понял идею :) Просто я посчитал, что к коду мои размышления не относятся, поэтому запрятал их.
Немного поясню, в чем я вижу проблему такого копирования. Многие объекты Civil 3D взаимосвязаны в чертеже и очень часто являются зависимыми от других объектов. Что будет происходить с ними при копировании - неизвестно.
На примере COGO-точек: У точки есть стиль, метки. У меток тоже есть стили. Эти стили могут зависеть от параметров чертежа, от других стилей. Это все - объекты базы данных чертежа. Копируя одну точку из чертежа в чертеж вы тянете весь этот "хвост" зависимостей. Реализовано ли это в методах API для AutoCAD - большой вопрос. Я сталкивался уже с тем, что с объектами Civil 3D не всегда такие "продвинутые" методы работали корректно.
Даже если Вам удастся все это наладить и все будет нормально внедряться, в целевом чертеже Вы получите полную кашу из настроек и стилей. Часть из них останется из исходного чертежа, часть придет из внешних ссылок. Потом очень трудно будет разобраться в этом месиве.
Я бы просто пропускал все объекты Civil 3D при внедрении ссылок. Либо взрывал бы их до объектов AutoCAD. Еще, как вариант - не копировать объекты, а создавать их заново в целевом чертеже. К примеру, нашли COGO-точку во внешней ссылке, прочитали все ее параметры, создали новую точку в целевом чертеже методами Civil 3D API и задали ей все нужные свойства. Но я не понимаю смысла этого перетаскивания объектов Civil из чертежа в чертеж.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще, как вариант - не копировать объекты, а создавать их заново в целевом чертеже. К примеру, нашли COGO-точку во внешней ссылке, прочитали все ее параметры, создали новую точку в целевом чертеже методами Civil 3D API и задали ей все нужные свойства.
Если всё это возможно средствами Civil 3D API (а я подозреваю, что это возможно), то мне это кажется оптимальным вариантом. Подозреваю, что часть ссылок SoftPointer и соответственно не будут копироваться при помощи WblockCloneObjects в другой чертеж. Как, например, не копируются группы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zavorАвтор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Постарался выкинуть все лишнее.

Код - C# [Выбрать]
  1. public void Action()
  2.                 {
  3.                         var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.                         var db = doc.Database;
  5.  
  6.                         using (var trans = db.TransactionManager.StartTransaction())
  7.                         using (var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite))
  8.                         using (var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite))
  9.                         {
  10.                                 foreach (var objId in btr)
  11.                                 {
  12.                                         using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForWrite))
  13.                                         {
  14.                                                 try
  15.                                                 {
  16.                                                         var bref = ent as BlockReference;
  17.                                                         if (bref != null)
  18.                                                         {
  19.                                                                 var bferEntities = new DBObjectCollection();
  20.                                                                 bref.Explode(bferEntities);
  21.                                                                 foreach (var brefEntity in bferEntities)
  22.                                                                 {
  23.                                                                         var entity = (Entity)brefEntity;
  24.                                                                         if (entity.Database == null)
  25.                                                                                 entity.SetDatabaseDefaults(db);
  26.                                                                        
  27.                                                                 }
  28.  
  29.                                                                 bref.Visible = false;
  30.                                                         }
  31.                                                 }
  32.                                                 catch (Exception e)
  33.                                                 {
  34.                                                 }
  35.                                         }
  36.                                 }
  37.  
  38.                                 trans.Commit();
  39.                         }
  40.                 }
  41.  

У меня возникает следующий вопрос: когда я делаю
Код - C# [Выбрать]
  1. var bferEntities = new DBObjectCollection();
  2. bref.Explode(bferEntities);
  3.  
то у меня появляется набор объектов из блокреференса. Но эти объекты имеют objectid равным {0}.



Как в таком случае использовать Database.DeepCloneObjects?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Постарался выкинуть все лишнее.
Ты похоже не читаешь то, что тебе пишут. По поводу ForWrite я уже писал. По поводу using тебе писал Дмитрий.
У меня возникает следующий вопрос: когда я делаю
Код - C# [Выбрать]

    var bferEntities = new DBObjectCollection();
    bref.Explode(bferEntities);
     
то у меня появляется набор объектов из блокреференса. Но эти объекты имеют objectid равным {0}.

Как в таком случае использовать Database.DeepCloneObjects?
1. Кто-то из нас советовал делать Explode?
2. Никак ты не сможешь использовать Database.DeepCloneObjects для этих объектов.

Перечитай еще раз советы мои и Дмитрия и начни с начала.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Для BlockReference ты должен найти его BlockTableRecord и определиться внешняя ссылка ли это или нет. Если не внешняя ссылка пропускаешь.
2. Для BlockTableRecord находишь ее базу: BlockTableRecord.GetXrefDatabase
3. Создаёшь ObjectIdCollection, проходишь по ModelSpace этой базы и отбираешь все (или нужные тебе объекты)
4. При помощи WblockCloneObjects копируешь выбранные в ObjectIdCollection объекты в ModelSpace текущего чертежа.
5. Возможно (если BlockReference.BlockTransform возвращает не единичную матрицу) придётся еще выполнить трансформацию всех скопированных объектов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zavorАвтор темы

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Хорошо, спасибо. Выполню  и отпишусь.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Подозреваю, что часть ссылок SoftPointer и соответственно не будут копироваться при помощи WblockCloneObjects в другой чертеж. Как, например, не копируются группы.
Только сейчас понял, что Вы, скорее всего, имели в виду группы объектов AutoCAD. Я подумал (в контексте обсуждения) что Вы про группы точек, и удивлялся Вашим познаниям Civil 3D :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
подумал (в контексте обсуждения) что Вы про группы точек, и удивлялся Вашим познаниям Civil 3D :)
:D
Речь конечно шла о группах (Group) AutoCAD: https://forums.autodesk.com/t5/net/wblockcloneobjects-and-groups/td-p/4712099
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение