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

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

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги.

Подскажите, как можно осуществить объединение сетей между собой по имени? Или хоть каким-то более доступным способом.

Заранее благодарю.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Есть подходящий метод для перемещения объектов из сети в другую сеть: http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/html/90ba51f0-38b7-09c2-6285-c093f9a61271.htm
Проверку имени сети и другие условия нужно будет описать отдельно.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Есть подходящий метод для перемещения объектов из сети в другую сеть: http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/html/90ba51f0-38b7-09c2-6285-c093f9a61271.htm
Проверку имени сети и другие условия нужно будет описать отдельно.

Дмитрий спасибо.
Правильно ли я понимаю работу метода?:
1. Необходимо найти все трубы и колодцы (их ObjectId) одной сети, собрав их в коллекцию ObjectIdCollection.
2. Перенести их с помощью данного метода в другую сеть с его ObjectId.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, как-то так.
Трубы и колодцы особо искать не нужно - есть специальные методы у сети GetPipeIds, GetStructureIds.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
рубы и колодцы особо искать не нужно - есть специальные методы у сети GetPipeIds, GetStructureIds.

Вот ведь поспешил я, я создал новую тему по данному вопросу :) Думаю, лишним не будет.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну я не буду там второй раз отвечать, ОК? :)

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Есть подходящий метод для перемещения объектов из сети в другую сеть: http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/html/90ba51f0-38b7-09c2-6285-c093f9a61271.htm

Part does not belong to the network.

Что бы это могло означать? Может быть я их как-то неправильно построил на основе полилинии? :) Я не силён в Civil-е.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ну я не буду там второй раз отвечать, ОК?

Конечно же :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Part does not belong to the network.

Что бы это могло означать? Я не силён в Civil-е.
Элемент не принадлежит сети. Это если в ObjectIdCollection оказался какой-то ObjectId элемента не из этой сети.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Элемент не принадлежит сети. Это если в ObjectIdCollection оказался какой-то ObjectId элемента не из этой сети.

То есть нужна ещё и проверка: принадлежит ли ObjectId указанной сети? Я просто думал, что раз я использую GetPipeIds для указанной сети, то это означает, что все эти ObjectId принадлежат этой сети. Я не прав в своих размышлениях?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну смотря как получены эти ObjectId.
Может быть я их как-то неправильно построил на основе полилинии?
Может быть. Надо код смотреть.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я просто думал, что раз я использую GetPipeIds для указанной сети, то это означает, что все эти ObjectId принадлежат этой сети. Я не прав в своих размышлениях?
Прав. Такой ошибки не должно быть.
А транзакция закрывалась после создания новых объектов сети?

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Может быть. Надо код смотреть.

Покажу его уже завтра. Пора домой :)

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
А транзакция закрывалась после создания новых объектов сети?

С учётом того, что я использовал Using... End Using, наверное да :) Так и не получилось у меня включить режим отладки через acad.exe. Завтра точно решу эту проблему.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
С учётом того, что я использовал Using... End Using, наверное да :)
Этого недостаточно. Нужно еще и подтвердить транзакцию, т.е. вызвать Transaction.Commit()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

С этим всё в порядке :)
Про Commit я не забыл :)


Цель: «Сеть 2» объединить с «Сеть 1»!

Забыл показать свой код:

Код - C# [Выбрать]
  1.         [Autodesk.AutoCAD.Runtime.CommandMethod("C3D_JOINNETWORKS")]
  2.         public void C3D_JoinNetworks()
  3.         {
  4.             Autodesk.AutoCAD.ApplicationServices.Document adoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (adoc == null) return;
  6.             Autodesk.AutoCAD.DatabaseServices.Database db = adoc.Database;
  7.             Autodesk.Civil.ApplicationServices.CivilDocument cdoc = Autodesk.Civil.ApplicationServices.CivilDocument.GetCivilDocument(db);
  8.             Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection netIDs = cdoc.GetPipeNetworkIds();
  9.             List<string> networksNames = new List<string>();
  10.  
  11.             Autodesk.Civil.DatabaseServices.Network fromNetwork = null;
  12.             Autodesk.Civil.DatabaseServices.Network toNetwork = null;
  13.  
  14.             using (Autodesk.AutoCAD.DatabaseServices.Transaction tr = db.TransactionManager.StartTransaction())
  15.             {
  16.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId netId in netIDs)
  17.                 {
  18.                     Autodesk.Civil.DatabaseServices.Network net = (Autodesk.Civil.DatabaseServices.Network)tr.GetObject(netId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
  19.                     networksNames.Add(net.Name);
  20.                     if (net.Name == "Сеть 1")
  21.                     {
  22.                         fromNetwork = net;
  23.                     }
  24.  
  25.                     if (net.Name == "Сеть 2")
  26.                     {
  27.                         toNetwork = net;
  28.                     }
  29.                 }
  30.  
  31.                 Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection pipesFromNetwork = fromNetwork.GetPipeIds();
  32.                 Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection structuresFromNetwork = fromNetwork.GetStructureIds();
  33.  
  34.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId OI in structuresFromNetwork)
  35.                 {
  36.                     pipesFromNetwork.Add(OI);
  37.                 }
  38.  
  39.                 fromNetwork.MoveParts(pipesFromNetwork, toNetwork.ObjectId);
  40.                 tr.Commit();
  41.             }
  42.         }

Получаю: System.ArgumentException: Part does not belong to the network.




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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ну смотря как получены эти ObjectId.
Цитата: Пашин Евгений от 22-01-2018, 15:11:06
Может быть я их как-то неправильно построил на основе полилинии?
Может быть. Надо код смотреть.

Тут уточню: сети я построил вручную и сохранил чертёж. Сети программно я не создавал.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Код, в целом, в порядке. Но есть один момент, который может быть причиной ошибки. Та сеть, в которую перемещаются объекты, в метод передаётся по ObjectId. Значит, надо чтобы в момент запуска метода эта сеть не была открыта. А она открыта, да ещё и на запись. Вполне может быть, что это блокирует добавление в неё элементов. Надо переделать код таким образом, чтобы в момент вызова метода сеть-приёмник была закрыта.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Код, в целом, в порядке. Но есть один момент, который может быть причиной ошибки. Та сеть, в которую перемещаются объекты, в метод передаётся по ObjectId. Значит, надо чтобы в момент запуска метода эта сеть не была открыта. А она открыта, да ещё и на запись. Вполне может быть, что это блокирует добавление в неё элементов. Надо переделать код таким образом, чтобы в момент вызова метода сеть-приёмник была закрыта.

То есть одну сеть нужно открыть в транзакции на чтение, а вторую на запись. Интересно. Попробую.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Может сработает, но лучше вообще вторую сеть не открывать в момент работы метода передачи элементов.
Это можно сделать разными способами. Например - использовать две отдельные транзакции. Первая - для поиска ObjectId нужных сетей, вторая - для работы с сетью-источником.

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

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

Даже на чтение? Попробую.

Это можно сделать разными способами. Например - использовать две отдельные транзакции. Первая - для поиска ObjectId нужных сетей, вторая - для работы с сетью-источником.

Попробую и отпишусь.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Даже на чтение? Попробую.

Увы, пока ничего не изменилось. Всё та же ошибка.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Хм... Можно глянуть итоговый код? Попробую у себя.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Хм... Можно глянуть итоговый код? Попробую у себя.

Да, Дмитрий.

Код - C# [Выбрать]
  1.         [Autodesk.AutoCAD.Runtime.CommandMethod("C3D_JoinNetworks")]
  2.         public void Civil_Join_Networks()
  3.         {
  4.             Autodesk.AutoCAD.ApplicationServices.Document adoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             if (adoc == null)
  6.                 return;
  7.             Autodesk.AutoCAD.DatabaseServices.Database db = adoc.Database;
  8.             Autodesk.Civil.ApplicationServices.CivilDocument cdoc = Autodesk.Civil.ApplicationServices.CivilDocument.GetCivilDocument(db);
  9.             Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection netIDs = cdoc.GetPipeNetworkIds();
  10.             List<string> networksNames = new List<string>();
  11.             Autodesk.Civil.DatabaseServices.Network fromNetwork = null;
  12.             Autodesk.Civil.DatabaseServices.Network toNetwork = null;
  13.             Autodesk.AutoCAD.DatabaseServices.ObjectId toNetworkObjectId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
  14.             Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection AllMovedPartsObjIds = null;
  15.             using (Autodesk.AutoCAD.DatabaseServices.Transaction tr = db.TransactionManager.StartTransaction())
  16.             {
  17.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId netId in netIDs)
  18.                 {
  19.                     Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr.GetObject(netId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
  20.                     networksNames.Add(net.Name);
  21.                     if (net.Name == "Сеть 1")
  22.                     {
  23.                         fromNetwork = net;
  24.                     }
  25.  
  26.                     if (net.Name == "Сеть 2")
  27.                     {
  28.                         toNetwork = net;
  29.                         toNetworkObjectId = toNetwork.ObjectId;
  30.                     }
  31.                 }
  32.  
  33.                 Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection pipesFromNetwork = fromNetwork.GetPipeIds();
  34.                 Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection structuresFromNetwork = fromNetwork.GetStructureIds();
  35.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId OI in pipesFromNetwork)
  36.                 {
  37.                     AllMovedPartsObjIds.Add(OI);
  38.                 }
  39.  
  40.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId OI in structuresFromNetwork)
  41.                 {
  42.                     AllMovedPartsObjIds.Add(OI);
  43.                 }
  44.  
  45.                 tr.Commit();
  46.             }
  47.  
  48.             using (Autodesk.AutoCAD.DatabaseServices.Transaction tr2 = db.TransactionManager.StartTransaction())
  49.             {
  50.                 Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr2.GetObject(toNetworkObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
  51.                 net.MoveParts(AllMovedPartsObjIds, toNetworkObjectId);
  52.                 tr2.Commit();
  53.             }
  54.  
  55.             Autodesk.AutoCAD.EditorInput.Editor ed = adoc.Editor;
  56.             foreach (string netName in networksNames)
  57.             {
  58.                 ed.WriteMessage(netName + "; ");
  59.             }
  60.         }


Такое ощущение, что есть какая-то проблема с самими ObjectId труб и колодцев... Но я могу ошибаться. Без отладки мне трудно судить.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Пашин Евгений,
Мне кажется, что здесь какая-то глупость написана:
Код - C# [Выбрать]
  1.                 Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr2.GetObject(toNetworkObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
  2.                 net.MoveParts(AllMovedPartsObjIds, toNetworkObjectId);
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???

Согласен. Что-то не то. Но я пробовал и с разными ObjectId, результат был тот же.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
AllMovedPartsObjIds

Все эти объекты и есть из fromNetworkObjectId.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Пашин Евгений,
Мне кажется, что здесь какая-то глупость написана:
Код - C# [Выбрать]
                Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr2.GetObject(toNetworkObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
                net.MoveParts(AllMovedPartsObjIds, toNetworkObjectId);
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???

Согласен, что это кусок кода может сам себе противоречить, но пока не нашёл иного варианта.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Согласен, что это кусок кода может сам себе противоречить, но пока не нашёл иного варианта.
Шутишь???

Код - C# [Выбрать]
  1. [Autodesk.AutoCAD.Runtime.CommandMethod("C3D_JoinNetworks")]
  2. public void Civil_Join_Networks()
  3. {
  4.     Autodesk.AutoCAD.ApplicationServices.Document adoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.     if (adoc == null)
  6.         return;
  7.     Autodesk.AutoCAD.DatabaseServices.Database db = adoc.Database;
  8.     Autodesk.Civil.ApplicationServices.CivilDocument cdoc = Autodesk.Civil.ApplicationServices.CivilDocument.GetCivilDocument(db);
  9.     Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection netIDs = cdoc.GetPipeNetworkIds();
  10.     List<string> networksNames = new List<string>();
  11.     Autodesk.Civil.DatabaseServices.Network fromNetwork = null;
  12.     Autodesk.Civil.DatabaseServices.Network toNetwork = null;
  13.     Autodesk.AutoCAD.DatabaseServices.ObjectId toNetworkObjectId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
  14.     Autodesk.AutoCAD.DatabaseServices.ObjectId fromNetworkObjectId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
  15.     Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection AllMovedPartsObjIds = null;
  16.     using (Autodesk.AutoCAD.DatabaseServices.Transaction tr = db.TransactionManager.StartTransaction())
  17.     {
  18.         foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId netId in netIDs)
  19.         {
  20.             Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr.GetObject(netId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
  21.             networksNames.Add(net.Name);
  22.             if (net.Name == "Сеть 1")
  23.             {
  24.                 fromNetwork = net;
  25.                 fromNetworkObjectId = net.ObjectId;
  26.             }
  27.  
  28.             if (net.Name == "Сеть 2")
  29.             {
  30.                 toNetwork = net;
  31.                 toNetworkObjectId = toNetwork.ObjectId;
  32.             }
  33.         }
  34.  
  35.         Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection pipesFromNetwork = fromNetwork.GetPipeIds();
  36.         Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection structuresFromNetwork = fromNetwork.GetStructureIds();
  37.         foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId OI in pipesFromNetwork)
  38.         {
  39.             AllMovedPartsObjIds.Add(OI);
  40.         }
  41.  
  42.         foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId OI in structuresFromNetwork)
  43.         {
  44.             AllMovedPartsObjIds.Add(OI);
  45.         }
  46.  
  47.         tr.Commit();
  48.     }
  49.  
  50.     using (Autodesk.AutoCAD.DatabaseServices.Transaction tr2 = db.TransactionManager.StartTransaction())
  51.     {
  52.         Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr2.GetObject(fromNetworkObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
  53.         net.MoveParts(AllMovedPartsObjIds, toNetworkObjectId);
  54.         tr2.Commit();
  55.     }
  56.  
  57.     Autodesk.AutoCAD.EditorInput.Editor ed = adoc.Editor;
  58.     foreach (string netName in networksNames)
  59.     {
  60.         ed.WriteMessage(netName + "; ");
  61.     }
  62. }

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
    using (Autodesk.AutoCAD.DatabaseServices.Transaction tr2 = db.TransactionManager.StartTransaction())
    {
        Autodesk.Civil.DatabaseServices.Network net =(Autodesk.Civil.DatabaseServices.Network) tr2.GetObject(fromNetworkObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
        net.MoveParts(AllMovedPartsObjIds, toNetworkObjectId);
        tr2.Commit();
    }

По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.

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

  • 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
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь 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
  • Карма: 735
Я переделал и упростил код, в таком виде у меня в 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
  • Карма: 735
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???
Да, там косяк именно в этом, скорее всего. Взята не та сеть.

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

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

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

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

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


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

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



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


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


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

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

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


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



Проверка AcDsRecords


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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вообще, мне очень интересно, как так можно было сделать? Я до этого момента был уверен, что такое невозможно - труба принадлежит одной сети, но в её свойствах показано, что она в другой сети. Как она была создана? Что надо сделать, чтобы повторить такое?  :D

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

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

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

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



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


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


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

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

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


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



Проверка AcDsRecords


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

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

Странно, совершенно новый чертёж ))) Дмитрий, спасибо за информацию!

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Наверняка это результат некорректного завершения транзакции.

Вряд ли, после запуска плагина я никогда не пересохранял чертёж. Я просто закрывал его без сохранения.

Однако такой вариант можно проверить :)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Наверняка это результат некорректного завершения транзакции.
Наверняка Network.MoveParts внутри себя использует механизм Open/Close, и это накладывается на работу внутри транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение