(изменено: Михаил Панов, 29 августа 2014г. 14:56:20)

Тема: Карта соответствия скопированных-вставленных объектов

Можно ли каким-то образом получить карту, из которой по AcDbObjectId скопированных объектов (блоков, примитивов) можно было бы получить соответствующие AcDbObjectId их вставленных на чертеж копий?

1) Попробовал через AcEditorReactor::endDeepClone, ожидал, что смогу построить всю цепочку преобразований, но не складывается что-то. Приходят последовательно карты идентификаторов с DeepCloneType == kDcWblock, kDcInsert и kDcExplode, я их запротоколировал, но отследить, как последовательно из, скажем, блока с хэндлом 2b4 получается его копия с хэндлом 3dd, не выходит.

Может, протокол собираю неправильно и что-то упускаю?

void MyEdReactor::endDeepClone( AcDbIdMapping& idMapping )
{
    Acad::ErrorStatus es;    
    AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
    AcDbDatabase* pOrig;
    AcDbDatabase* pDest;
    idMapping.origDb(pOrig);
    idMapping.destDb(pDest);
    AcDb::DeepCloneType dcc = idMapping.deepCloneContext();
    AcDbObject* objKey;
    AcDbObject* objVal;
    AcDbIdPair idPair;
    AcDbHandle hKey, hVal;
    AcDbIdMappingIter mapIter(idMapping);
    MyOutputDebugString(_T("--------------\ndcc = %d, pDbOrig=%x, pDbDest=%x, pDb=%x\n"),dcc,pOrig,pDest,pDb);
    for (mapIter.start(); !mapIter.done(); mapIter.next()) 
    {
        if (mapIter.getMap(idPair)) 
        {
            es = acdbOpenAcDbObject(objKey, idPair.key(), AcDb::kForRead);
            if (es == Acad::eOk)
            {
                objKey->getAcDbHandle(hKey);
                es = acdbOpenAcDbObject(objVal, idPair.value(), AcDb::kForRead);
                if(es == Acad::eOk)
                {                    
                    objVal->getAcDbHandle(hVal);
                    MyOutputDebugString(_T("pair: %ld [%x]  -->  %ld [%x]\n"),idPair.key(),MyGetHandleValue(hKey),idPair.value(),MyGetHandleValue(hVal));
                    objVal->close();
                }else
                {
                    MyOutputDebugString(_T("err open Val: %ld [%x]  -->  %ld    %s\n"),idPair.key(),MyGetHandleValue(hKey),idPair.value(),objKey->desc()->name());
                }
                objKey->close();
            }else
            {
                MyOutputDebugString(_T("err open Key: %ld \n"),idPair.key());
            }
        }
    }
}

2) Попробовал зайти с другого боку - обработать AcEditorReactor::commandEnded, чтобы на COPYCLIP и COPYBASE собрать выделенные через acedGetCurrentSelectionSet, но возникает вопрос - а что собирать и как сопоставлять на PASTECLIP? (кроме того отдельно приходится что-то придумать для drag'n'drop)

Re: Карта соответствия скопированных-вставленных объектов

Здесь этот вопрос решался: http://adn-cis.org/forum/index.php?topi … 82#msg3482

Re: Карта соответствия скопированных-вставленных объектов

Спасибо, прочитаю.

Re: Карта соответствия скопированных-вставленных объектов

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

1)Копирую один блок.

_LIST показывает хэндлы оригинала и копии соответственно 341 -> 3b5
протокол:
09:59:06------endDeepClone--------
map->dcc = 7, map->pDbOrig=2ad5bde0, map->pDbDest=2b110740, pWorkingDb=2ad5bde0
09:59:06pair Id's: -10389360 [341]  -->  -10371664 [5b]   AcDbObject
09:59:13------endDeepClone--------
map->dcc = 6, map->pDbOrig=2ac94b40, map->pDbDest=2ad5bde0, pWorkingDb=2ad5bde0
09:59:14pair Id's: -10371664 [397]  -->  -10388112 [397]   AcDbObject
09:59:16------endDeepClone--------
map->dcc = 1, map->pDbOrig=2ad5bde0, map->pDbDest=2ad5bde0, pWorkingDb=2ad5bde0
09:59:16pair Id's: -10388112 [397]  -->  -10387632 [3b5]   AcDbObject

Цепочка прослеживается однозначно.

2) Копирую несколько блоков:

Хэндлы: 341 -> 416 , 2b4 -> 40b , 242 -> 402

протокол (два блока из трех отслеживаются нормально, а с третьим что-то не то, выделил цветом):
10:04:06------endDeepClone--------
dcc = 7, map->pDbOrig=2ad5bde0, map->pDbDest=2b0e2c70, pWorkingDb=2ad5bde0
10:04:06pair Id's: -10425440 [242]  -->  -10404432 [5b]   AcDbObject
10:04:06pair Id's: -10424640 [2b4]  -->  -10404000 [76]   AcDbObject
10:04:06pair Id's: -10389360 [341]  -->  -10309168 [95]   AcDbObject
10:04:08------endDeepClone--------
dcc = 6, map->pDbOrig=2b16d980, map->pDbDest=2ad5bde0, pWorkingDb=2ad5bde0
10:04:08pair Id's: -10404432 [3d0]  -->  -10329728 [3d0]   AcDbObject
10:04:08pair Id's: -10404000 [3d9]  -->  -10329584 [3d9]   AcDbObject
10:04:08pair Id's: -10378800 [3e4]  -->  -10329408 [3e4]   AcDbObject
10:04:12------endDeepClone--------
dcc = 1, map->pDbOrig=2ad5bde0, map->pDbDest=2ad5bde0, pWorkingDb=2ad5bde0
10:04:12pair Id's: -10329728 [3d0]  -->  -10328928 [402]   AcDbObject
10:04:12pair Id's: -10329584 [3d9]  -->  -10328784 [40b]   AcDbObject
10:04:12pair Id's: -10329408 [3e4]  --> -10328608 [416]   AcDbObject

Т.е. после Wblock я ожидаю в Insert увидеть id -10309168, но его там нет. Обратным ходом от ожидаемого результата вижу, что на Insert "ниоткуда" появился id -10378800, из которого я и получил интересующий меня блок после Explode. Но вот как -10309168 стал -10378800 - не могу понять.

Re: Карта соответствия скопированных-вставленных объектов

Создай на том форуме (в разделе ObjectARX) тему, выложи свой код (проект - если он большой, то создай новый и вычлени в него необходимый кусок), выложи чертеж на котором проверяешь, опиши четкую последовательность действий.

Re: Карта соответствия скопированных-вставленных объектов

создал

http://adn-cis.org/forum/index.php?topi … 89#msg4089