Тема: Копирование AcDbRotatedDimension

Создаю новый чертеж (AcDbDatabase). Добавляю в него разные графические примитивы и размерные выноски. AcDbRotatedDimension при вставке создает анонимные блоки, с именами *D1, *D2, *D3, *D4.
С помощью метода insert копирую созданный чертеж в другой, чертеж скопировался, смотрю, какие анонимные блоки скопировались - *D2 – *D9. Причем выноскам теперь отвечают блоки с номерами *D6, *D7, *D8, *D9.
Дальнейшие манипуляции с выносками приводят к падению AutoCAD-а.
Как правильно скопировать AcDbRotatedDimension?

Re: Копирование AcDbRotatedDimension

> роман
Попробуй после создания чертежа (AcDbDatabase) перед добавлением в него AcDbRotatedDimension переключить на него workingDatabase(), а после его сохранения в файл вернуть workingDatabase() обратно. Должно помочь.

Re: Копирование AcDbRotatedDimension

Не помогло, при попытке перетянуть выноску получил Unhandled exception Access violation reading location 0x00000000.

Re: Копирование AcDbRotatedDimension

> роман
Думаю, что что-то ты не так сделал. Проблема в том, что когда создается AcDbRotatedDimension одновременно создается и реактор, и для того чтобы он создался правильно необходимо переключить рабочую базу на базу в которую он будет добавлен:
acdbHostApplicationServices()->setWorkingDatabase(pNewDb);
Приведи кусок кода, который у тебя это выполняет. Я посмотрю.

Re: Копирование AcDbRotatedDimension

Вот пример кода (обработка ошибок убрана):

// - AddRotDim
static void AddRotDim(void)
{
  ads_point p1,p2,p3;
  if (acedGetPoint(NULL,"\nУкажите первую точку размера: ",p1) != RTNORM ||
      acedGetPoint(p1,  "\nУкажите вторую точку размера: ",p2) != RTNORM ||
      acedGetPoint(p2,  "\nУкажите место выноски: ", p3)       != RTNORM)
    return;
  acdbUcs2Wcs(p1,p1,false); acdbUcs2Wcs(p2,p2,false); acdbUcs2Wcs(p3,p3,false);
  double rotang = AcGeVector2d(1,0).angleTo(asPnt2d(p2)-asPnt2d(p1));
  AcDbDatabase *pNewDb = new AcDbDatabase();
  AcDbDatabase *pOldDb = acdbHostApplicationServices()->workingDatabase();
  acdbHostApplicationServices()->setWorkingDatabase(pNewDb);
  {
    AcDbBlockTableRecordPointer pBTR(ACDB_MODEL_SPACE,pNewDb,AcDb::kForWrite);
    AcDbRotatedDimension *pEnt =
      new AcDbRotatedDimension(rotang,asPnt3d(p1),asPnt3d(p2),asPnt3d(p3));
    pBTR->appendAcDbEntity(pEnt);
    pBTR->close();
    pEnt->close();
    acdbHostApplicationServices()->setWorkingDatabase(pOldDb);
    pNewDb->saveAs("C:\\RotDim.dwg");
  }
  delete pNewDb;
}
// InsertDWG
static void InsertDWG(void)
{
  AcDbDatabase *pNewDb = new AcDbDatabase(false);
  pNewDb->readDwgFile("C:\\RotDim.dwg",_SH_DENYNO);
  AcDbDatabase *pCurDb = acdbHostApplicationServices()->workingDatabase();
  pCurDb->insert(AcGeMatrix3d::kIdentity,pNewDb,true);
  delete pNewDb;
}

Команда AddRotDim добавляет AcDbRotatedDimension в MODEL_SPACE новой базы и сохраняет ее в dwg-файле.
Команда InsertDWG вставляет примитивы из MODEL_SPACE этого dwg-файла в текущую базу. После этого операции по растягиванию/переносу и т.д. размера не разваливают AutoCAD. Можешь проверить.

Re: Копирование AcDbRotatedDimension

Огромное спасибо!
Дело действительно было в реакторах.