Как осуществить объединение сетей по именам?

Автор Тема: Как осуществить объединение сетей по именам?  (Прочитано 20948 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Код не проверял. Сравни со своим.

Увы, вообще фатальная ошибка выпала.

После того как сделал это:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection AllMovedPartsObjIds = new Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection();
Результат стал тот же. Part does not belong to the network.

Подозреваю, что всё-таки есть проблема с этими ObjectId труб и колодцев. Может я их неправильно вручную создал???

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Может я их неправильно вручную создал???
Возможно. Но это только Дмитрий Загорулькин сможет сказать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Возможно. Но это только Дмитрий Загорулькин сможет сказать.

Эх, я новичок ещё ))) Поэтому уповаю на мнение экспертов.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.

Ой, пропустил. Сейчас проверю.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Цитата: Пашин Евгений от 23-01-2018, 13:53:48
По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.

Ой, пропустил. Сейчас проверю.

Увы, та же ошибка.

Отмечено как Решение Пашин Евгений 24-01-2018, 07:32:19

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Я переделал и упростил код, в таком виде у меня в 2016 и в 2017 версии работает без ошибок:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.Civil.ApplicationServices;
  6. using Autodesk.Civil.DatabaseServices;
  7.  
  8. namespace C3dTest
  9. {
  10.     public class JoinNets
  11.     {
  12.         [CommandMethod("TestJoinNetworks")]
  13.         public void Civil_Join_Networks()
  14.         {
  15.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  16.             if (adoc == null) return;
  17.             Editor ed = adoc.Editor;
  18.             Database db = adoc.Database;
  19.             CivilDocument cdoc = CivilDocument.GetCivilDocument(db);
  20.             ObjectIdCollection netIDs = cdoc.GetPipeNetworkIds();
  21.             if (netIDs.Count < 2)
  22.             {
  23.                 ed.WriteMessage("\nToo few networks");
  24.             }
  25.             ObjectId
  26.                 sourceNetId = netIDs[0],
  27.                 destNetId = netIDs[1];
  28.  
  29. #pragma warning disable CS0618 // Type or member is obsolete
  30.             using (Network sourceNet = sourceNetId.Open(OpenMode.ForRead) as Network)
  31. #pragma warning restore CS0618 // Type or member is obsolete
  32.             {
  33.                 ObjectIdCollection partIds = new ObjectIdCollection();
  34.                 foreach (ObjectId pipeId in sourceNet.GetPipeIds())
  35.                 {
  36.                     partIds.Add(pipeId);
  37.                 }
  38.                 foreach (ObjectId structId in sourceNet.GetStructureIds())
  39.                 {
  40.                     partIds.Add(structId);
  41.                 }
  42.                 if (partIds.Count > 0)
  43.                 {
  44.                     sourceNet.UpgradeOpen();
  45.                     sourceNet.MoveParts(partIds, destNetId);
  46.                 }
  47.             }            
  48.         }
  49.     }
  50. }
  51.  
Если и этот код будет выдавать ошибки, значит, проблема в чертеже или настройках каталога труб и колодцев.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???
Да, там косяк именно в этом, скорее всего. Взята не та сеть.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Цитата: Александр Ривилис от 23-01-2018, 12:47:14
Код не проверял. Сравни со своим.

Увы, вообще фатальная ошибка выпала.
Да, сеть-источник надо обязательно открывать на запись.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Если и этот код будет выдавать ошибки, значит, проблема в чертеже или настройках каталога труб и колодцев.

Дмитрий, спасибо. Значит я всё-таки как-то неверно создал сети. У меня вышла та же ошибка. Буду разбираться.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Если и этот код будет выдавать ошибки, значит, проблема в чертеже или настройках каталога труб и колодцев.

Проверил на рабочем чертеже. Работает!!! Но только вторую сеть не удаляет. Просто переносит трубы и колодцы. Надеюсь удаление сети после переноса - несложная задача :)

Дмитрий, спасибо!!! Адаптирую решение уже с учётом имён сетей.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
sourceNet.UpgradeOpen();

Эта строка желательна или обязательна?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Значит я всё-таки как-то неверно создал сети. У меня вышла та же ошибка. Буду разбираться.
Странно. Что там можно было сделать не так? Единственное предположение, которое у меня есть - отцепился нужный каталог труб и колодцев. Но тогда сеть вручную не построить. В общем, если будет чертёж, могу посмотреть, в чём там дело.
Эта строка желательна или обязательна?
Если открывать сеть на чтение (ForRead) - обязательна, если сразу на запись (ForWrite) - не нужна.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
В общем, если будет чертёж, могу посмотреть, в чём там дело.

Попробую приложить.


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, чертёж битый. Сделал AUDIT:
Команда: _AUDIT
Исправить все обнаруженные ошибки? [Да/Нет] <Н>: Д



Проверка заголовка


Проверка таблиц


Проверка объектов, проход 1

Проход 1: проверено объектов: 3700   Труба (Сеть)  eInvalidOwnerObject                       Standard
Проход 1: проверено объектов: 3800
Проверка объектов, проход 2

Проход 2: проверено объектов: 3500   Сеть (Труба)           eWasErased                       Standard
Проход 2: проверено объектов: 3800
Проверка блоков


 Проверено блоков: 29



Проверка AcDsRecords


Всего найдено ошибок: 2, исправлено: 2

Стерто 0 объектов
После этого ошибка пропала.