Здравствуйте.
Столкнулся со следующей ситуацией: мне нужно получать клоны полигонов (MPolygon) и далее проводить с ними некоторые манипуляции (задавать штриховку и тд). Столкнулся изначально с тем, что Clone() мне возвращал клона без базы данных (null в поле Database), из-за чего в дальнейшем сбоил AddNewlyCreatedDBObject(). Отыскал на этом форуме много информации о том, что использовать Clone из всех вариантов клонирования наиболее небезопасный. Стал использовать DeepClone(), база данных у клона появилась, всё вроде бы замечательно, да только новая беда -- в MoveToBottom() передаются Id клонов, однако вылетает исключение eInvalidInput.
Всё проходит в рамках одной транзакции. В чём может быть проблема?
Прикрепляю небольшой кусочек кода, в котором происходит описанное выше (ключевые моменты: создание клона -- 12 строчка, AddNewlyCreatedDBObject -- 17 строчка, MoveToBottom -- 29 строчка, транзакция оборачивает эту логику в using'е).
foreach (var objectId in objectIds)
{
using (var polygon = SelectionHelper.GetCadPolygon(objectId, transaction, OpenMode.ForWrite))
{
if (polygon == null)
continue;
if (style == null)
continue;
var idMap = new IdMapping();
using (var clonePolygon = (Entity)polygon.DeepClone(blockTableRecord, idMap, false))
{
clonePolygon.SetDatabaseDefaults();
clonePolygon.Layer = layerNamePlan;
transaction.AddNewlyCreatedDBObject(clonePolygon, true);
objectIdCollection.Add(clonePolygon.ObjectId);
GeometryClassSetter.SetStyle(clonePolygon, classItem, Common.CadDatabase, transaction, Condition.ADDED_TO_PLAN);
GeometryClassSetter.SetLandType(clonePolygon, classItemPlan.ClassID, transaction);
}
}
}
if (objectIdCollection.Count > 0)
{
var drawOrderTable = (DrawOrderTable)transaction.GetObject(blockTableRecord.DrawOrderTableId, OpenMode.ForWrite);
drawOrderTable.MoveToBottom(objectIdCollection);
}