Есть подходящий метод для перемещения объектов из сети в другую сеть: http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/html/90ba51f0-38b7-09c2-6285-c093f9a61271.htm
Проверку имени сети и другие условия нужно будет описать отдельно.
рубы и колодцы особо искать не нужно - есть специальные методы у сети GetPipeIds, GetStructureIds.
Есть подходящий метод для перемещения объектов из сети в другую сеть: http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/html/90ba51f0-38b7-09c2-6285-c093f9a61271.htm
Ну я не буду там второй раз отвечать, ОК?
Part does not belong to the network.Элемент не принадлежит сети. Это если в ObjectIdCollection оказался какой-то ObjectId элемента не из этой сети.
Что бы это могло означать? Я не силён в Civil-е.
Элемент не принадлежит сети. Это если в ObjectIdCollection оказался какой-то ObjectId элемента не из этой сети.
Может быть я их как-то неправильно построил на основе полилинии?Может быть. Надо код смотреть.
Я просто думал, что раз я использую GetPipeIds для указанной сети, то это означает, что все эти ObjectId принадлежат этой сети. Я не прав в своих размышлениях?Прав. Такой ошибки не должно быть.
Может быть. Надо код смотреть.
А транзакция закрывалась после создания новых объектов сети?
С учётом того, что я использовал Using... End Using, наверное да :)Этого недостаточно. Нужно еще и подтвердить транзакцию, т.е. вызвать Transaction.Commit()
Transaction.Commit()
Ну смотря как получены эти ObjectId.
Цитата: Пашин Евгений от 22-01-2018, 15:11:06
Может быть я их как-то неправильно построил на основе полилинии?
Может быть. Надо код смотреть.
Код, в целом, в порядке. Но есть один момент, который может быть причиной ошибки. Та сеть, в которую перемещаются объекты, в метод передаётся по ObjectId. Значит, надо чтобы в момент запуска метода эта сеть не была открыта. А она открыта, да ещё и на запись. Вполне может быть, что это блокирует добавление в неё элементов. Надо переделать код таким образом, чтобы в момент вызова метода сеть-приёмник была закрыта.
Может сработает, но лучше вообще вторую сеть не открывать в момент работы метода передачи элементов.
Это можно сделать разными способами. Например - использовать две отдельные транзакции. Первая - для поиска ObjectId нужных сетей, вторая - для работы с сетью-источником.
Даже на чтение? Попробую.
Хм... Можно глянуть итоговый код? Попробую у себя.
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???
AllMovedPartsObjIds
Пашин Евгений,
Мне кажется, что здесь какая-то глупость написана:
Код - 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. Как так???
Согласен, что это кусок кода может сам себе противоречить, но пока не нашёл иного варианта.Шутишь???
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();
}
Код не проверял. Сравни со своим.
По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.
Может я их неправильно вручную создал???Возможно. Но это только Дмитрий Загорулькин сможет сказать.
Возможно. Но это только Дмитрий Загорулькин сможет сказать.
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.
Цитата: Пашин Евгений от 23-01-2018, 13:53:48
По моему эта конструкция у меня не сработала, но я попробую весь Ваш код. Отпишусь.
Возможно нужно поменять OpenMode.ForRead на OpenMode.ForWrite, так как производится модификация и исходной сети.
Ой, пропустил. Сейчас проверю.
Ты же должен переносить из fromNetworkObjectId в toNetworkObjectId, а у тебя фактически и там и там toNetworkObjectId. Как так???Да, там косяк именно в этом, скорее всего. Взята не та сеть.
Цитата: Александр Ривилис от 23-01-2018, 12:47:14Да, сеть-источник надо обязательно открывать на запись.
Код не проверял. Сравни со своим.
Увы, вообще фатальная ошибка выпала.
Если и этот код будет выдавать ошибки, значит, проблема в чертеже или настройках каталога труб и колодцев.
Если и этот код будет выдавать ошибки, значит, проблема в чертеже или настройках каталога труб и колодцев.
sourceNet.UpgradeOpen();
Значит я всё-таки как-то неверно создал сети. У меня вышла та же ошибка. Буду разбираться.Странно. Что там можно было сделать не так? Единственное предположение, которое у меня есть - отцепился нужный каталог труб и колодцев. Но тогда сеть вручную не построить. В общем, если будет чертёж, могу посмотреть, в чём там дело.
Эта строка желательна или обязательна?Если открывать сеть на чтение (ForRead) - обязательна, если сразу на запись (ForWrite) - не нужна.
В общем, если будет чертёж, могу посмотреть, в чём там дело.
Команда: _AUDIT
Исправить все обнаруженные ошибки? [Да/Нет] <Н>: Д
Проверка заголовка
Проверка таблиц
Проверка объектов, проход 1
Проход 1: проверено объектов: 3700 Труба (Сеть) eInvalidOwnerObject Standard
Проход 1: проверено объектов: 3800
Проверка объектов, проход 2
Проход 2: проверено объектов: 3500 Сеть (Труба) eWasErased Standard
Проход 2: проверено объектов: 3800
Проверка блоков
Проверено блоков: 29
Проверка AcDsRecords
Всего найдено ошибок: 2, исправлено: 2
Стерто 0 объектов
После этого ошибка пропала.
Да, чертёж битый. Сделал AUDIT:
Код: [Выделить]
Команда: _AUDIT
Исправить все обнаруженные ошибки? [Да/Нет] <Н>: Д
Проверка заголовка
Проверка таблиц
Проверка объектов, проход 1
Проход 1: проверено объектов: 3700 Труба (Сеть) eInvalidOwnerObject Standard
Проход 1: проверено объектов: 3800
Проверка объектов, проход 2
Проход 2: проверено объектов: 3500 Сеть (Труба) eWasErased Standard
Проход 2: проверено объектов: 3800
Проверка блоков
Проверено блоков: 29
Проверка AcDsRecords
Всего найдено ошибок: 2, исправлено: 2
Стерто 0 объектов
После этого ошибка пропала.
Наверняка это результат некорректного завершения транзакции.
Наверняка это результат некорректного завершения транзакции.Наверняка Network.MoveParts внутри себя использует механизм Open/Close, и это накладывается на работу внутри транзакции.