The AutoCAD User Interface will allow you to create a new layout based on a layout in a drawing template. You can replicate this behavior using ObjectARX. To do this, load the drawing template in memory and get the pointer to the required layout. The copyFrom()method of the AcDbLayout class is then used to copy the layout properties to a new layout in the current drawing.
The following code sample shows how to copy a layout named "Layout1" to the current drawing from a drawing template. Note that there is minimal error checking for code brevity:
void f_createLayoutFromDwt() { Acad::ErrorStatus mEs; AcDbDatabase *pDWTdb = new AcDbDatabase(false); if (Acad::eOk == pDWTdb->readDwgFile( L"D:\Autodesk\autocadmap4\Template\test.dwt")) { //get the layout dictionary AcDbDictionary *pDict = NULL; pDWTdb->getLayoutDictionary(pDict,AcDb::kForRead); AcDbObject *pObj = NULL; AcDbLayout *pSrcLayout = NULL; AcDbLayout *pNewLayout = NULL; //assuming you want to copy the layout //"Layout1" from the drawing template //or you can use the AcDbDictionaryIterator //to get the required AcDbLayout from the database mEs = pDict->getAt(L"Layout1",pObj,AcDb::kForWrite); //close the dictionary pDict->close(); if(mEs == Acad::eOk) { pSrcLayout = AcDbLayout::cast(pObj); //add new layout to the current document AcApLayoutManager *pLayoutMan = (AcApLayoutManager *)acdbHostApplicationServices()-> layoutManager(); AcDbObjectId pLayoutID,pBTRId; //get the name to create a new layout ACHAR* psName; psName = pLayoutMan->getNextNewLayoutName(); //create a new layout pLayoutMan->createLayout(psName,pLayoutID,pBTRId); pNewLayout = pLayoutMan->findLayoutNamed(psName,TRUE); //copy from the source layout in to the new layout pNewLayout->copyFrom(pSrcLayout); //open the new layout object to refresh the list //this required to refresh the device list pNewLayout->upgradeOpen(); AcDbPlotSettingsValidator *pPltValid = NULL; pPltValid = acdbHostApplicationServices()->plotSettingsValidator(); pPltValid->refreshLists(pNewLayout); //close the layouts pNewLayout->close(); pSrcLayout->close(); //update the layout tabs using the layout manager pLayoutMan->updateLayoutTabs(); } } delete pDWTdb; }

Leave a Reply