> KonstantinM
Все очень точно объяснил. :)
> Alexey
От добавлю, что если использовать метод clone() для AcDb2dPolyline или AcDb3dPolyline, то создается копия только главного примитива, но не вершин полилинии. Аналогично для AcDbBlockReference не будут создаваться аттрибуты блока. Так что без deepClone не обойтись.
Немного подправил код. В определнных случаях слой мог присваиваться не всем субпримитивам основного примитива. Это в случае, если основной примитив ссылается не только на примитивы (AcDbEntity) , но и на объекты (AcDbObject):
static Acad::ErrorStatus DupComplexEntityOnLayer(AcDbObjectId orgId, AcDbObjectId layerid)
{
Acad::ErrorStatus es = Acad::eOk;
AcDbObjectPointer<AcDbObject> ent(orgId,AcDb::kForRead);
if ((es = ent.openStatus()) != Acad::eOk) return es;
AcDbDatabase *db = orgId.database();
AcDbObjectIdArray arId; arId.append(orgId);
AcDbIdMapping mapId;
if ((es = db->deepCloneObjects(arId,ent->ownerId(),mapId)) != Acad::eOk) {
return es;
}
AcDbIdMappingIter mapIdIter(mapId);
for (mapIdIter.start(); !mapIdIter.done(); mapIdIter.next()) {
AcDbIdPair pair; mapIdIter.getMap(pair);
AcDbObjectPointer<AcDbEntity> pCopy(pair.value(),AcDb::kForWrite);
if ((es = pCopy.openStatus()) == Acad::eOk) {
pCopy->setLayer(layerid);
}
}
return Acad::eOk;
}