Тема: Не удаётся скопировать полилиню с ExtensionDictionary

Не удаётся скопировать полилиню с ExtensionDictionary.

AcDb3dPolyline *pPoly2 = new AcDb3dPolyline;
pPoly2->copyFrom(pPoly1->clone());

Сам словарь в клоне отсутствует. Что господа подскажите ?

Re: Не удаётся скопировать полилиню с ExtensionDictionary

Потому чтэээ... copyFrom заполняет данные только самой entity (AcDb3dPolyline).
Во первых AcDb3dPolyline - это комплексная entity - посему ее надо копировать с помощью deepClone (глубокое копирование).
Именно то же самое со словарями. Просто в copyFrom они не копируются, а ставиться NULL.
Если копировать на экране полилинию (Copy, Paste), то там вызывается глубокое копирование и ExtensionDictionary радостно дублируется...

Re: Не удаётся скопировать полилиню с ExtensionDictionary

Извини за наивный вопрос, но как заполнить AcDbIdMapping ? В хелпе я не нашёл примера для работы с deepClone.

Re: Не удаётся скопировать полилиню с ExtensionDictionary

> Требующий помощи
Если вам нужно просто сделать дубликат 3D-полилинии в чертеже - воспользуйтесь AcDbDatabase::deepCloneObjects()
Если нет - объясните подробнее что и как Вы собираетесь делать с копией. Это будет временная копия, которую в чертеж добавлять не нужно, или нет?
И еще примеры с clone и deepClone есть в ObjectARX SDK:
samples\database\clones
samples\database\deepclone_dg

Re: Не удаётся скопировать полилиню с ExtensionDictionary

Задача такова:
1) Скопировать одну полилинию.
2) Добавить копию к моделспейс.
3) Изменить некоторые точки.
Но! ExtensionDictionary из первой полилинии должен быть в наличии во второй полилинии(копии).
Мне не удалось воспользоватся deepClone, так как не совсем понимаю суть мапа. Как его правильно заполнить?
Описаная последовательность операций осуществляется при вводе пользователем команды. Пользователь выбирает полилинию а дальше я создаю её копию и модифицирую вертексы. В ExtensionDictionary находится важная информация, поэтому словарь должен быть скопирован в клон полилинии, а мне это не удаётся.

Re: Не удаётся скопировать полилиню с ExtensionDictionary

> Требующий помощи
Попробуй этот код:

  static void Copy3DPolyline(void)
  {
    // Add your code for command ArxProject11.Copy3DPolyline here
    AcDbDatabase *pDb = acdbCurDwg();
    ads_name en;
    ads_point p;
    AcDbObjectId objId;
    if (acedEntSel("\nУкажите полилинию для копирования: ",en,p) == RTNORM) {
      if (acdbGetObjectId(objId,en) == Acad::eOk) {
        AcDbObjectPointer<AcDb3dPolyline> p3dPoly(objId,AcDb::kForRead);
        if (p3dPoly.openStatus() == Acad::eOk) {
          p3dPoly->close();
          AcDbObjectIdArray aIDs; aIDs.append(objId);
          AcDbIdMapping idMap;
          if (pDb->deepCloneObjects(aIDs,pDb->currentSpaceId(),idMap) == Acad::eOk) {
            AcDbIdPair idPair(objId,AcDbObjectId::kNull,true);
            AcDbObjectId objcloneId;
            if (idMap.compute(idPair)) { // Вычисляем ObjectId для клона
              objcloneId = idPair.value();
              AcDbObjectPointer <AcDb3dPolyline> p3dclonePoly(objcloneId,AcDb::kForWrite);
              if (p3dclonePoly.openStatus() == Acad::eOk) {
                // Для примера сдвинем всю полилинию на 100 по X
                AcGeMatrix3d mat;
                mat.setToTranslation(AcGeVector3d(100,0,0));
                p3dclonePoly->transformBy(mat);
              } else {
                acutPrintf("\nНе удалось открыть копию на запись!!!");
              }
            } else {
              acutPrintf("\nНе удалось получить id новой полилинии!!!");
            }
          } else {
            acutPrintf("\nНе удалось скопировать!!!");
          }
        } else {
          acutPrintf("\nВыбрана не 3D-полилиния");
        }
      }
    }
  }

Re: Не удаётся скопировать полилиню с ExtensionDictionary

> Александр Ривилис
Теперь всё отлично. Я очень Вам благодарен за помощь. Спасибо.

Re: Не удаётся скопировать полилиню с ExtensionDictionary

smile Рад был помочь!