WblockClone ()
Имеются три версии AcDbDatabase:: wblock ():
1 WBLOCK*
Acad:: ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& POutputDatabase)
2 WBLOCK определяемого пользователем блока
Acad:: ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& POutputDatabase, AcDbObjectId nObjId)
3 WBLOCK набора выборов
Acad:: ErrorStatus
AcDbDatabase::wblock(AcDbDatabase*& POutputDatabase, const AcDbObjectIdArray& PIdSet, const AcGePoint3d& PPoint3d)
Одно из основных внутренних различий между этими тремя версиями wblock - их обработка пространства модели и пространства листа AcDbBlockTableRecords. Поскольку полная база данных клонируется в одной версии, все примитивы в пространстве модели и пространстве листа клонированы наряду с их содержащей бумагой и пространством модели AcDbBlockTableRecords. Однако, в версиях два и три, намерение должно клонировать только отобранный набор примитивов. Хотя пространство модели и пространство листа AcDbBlockTableRecords обработаны, они используют “ поверхностный клон, ”, который в свою очередь не клонирует все примитивы, содержащиеся в пространстве модели и пространстве листа.
Даже при том, что пространство модели и блоки пространства листа были клонированы в версиях два и три, они пусты. Поэтому, не только приемлемо вызвать AcDbBlockTableRecord:: AppendAcDbEntity () чтобы разместить клонированные примитивы в них, необходимо делать так. (Это - исключение к использованию AcDbBlocKTableRecord:: AppendAcDbEntity () на AcDbBlockTableRecords, чей ID - в состоянии непрерывного изменения). Также, в обеих версиях два и три, примитивы будут иметь набор isPrimary к Adesk:: kTrue, когда они получают их wblockClone () запрос.
Это - то, потому что внутренний код индивидуально клонирует примитивы набора выборов, или примитивов отобранного AcDbBlockTableRecord. Это не клонирует AcDbBlockTableRecord непосредственно. (Примитивы во вложенных блоках, однако, будут все еще иметь набор isPrimary к Adesk:: kFalse). Это поведение полезно, как будет замечено в следующей секции в случае 1. Это сохраняет приложения от необходимости знать, что какая операция WBLOCK встречается.
Имеются несколько основных правила, чтобы иметь в виду:
1 Никогда не использовать AcDbBlocKTableRecord::AppendAcDbEntity() в течение WBLOCK*. Если Вы создали новые примитивы, Вы должны сохранить их в памяти, наряду с ID их будущего владельца, и затем добавлять их после AcEdItorReactor::endDeepClone(). Это также применяется к добавлению в конец объектов к AcDbDictionaries, ломаным линиям, polyfacemeshes, polygonmeshes, и блок-ссылкам.
2 В других двух формах WBLOCK, только используют AcDbBlocKTableRecord::ApPendAcDbEntity() при добавлении в конец к пространству модели или пространству листа. Но с тем исключением, все другие ограничения, упомянутые для WBLOCK* все еще применяются.