Тема: Настройка листа

Как создавать лист и делать его текущим я разобрался. Но как в этом листе поставить лист A4 альбомной ориентации или, если возможно, то лист произвольного размера, например, 200х400 я так и не понял.
вот тот кусок, что уже есть

AcApLayoutManager *layManager = (AcApLayoutManager *) acdbHostApplicationServices()->layoutManager();
if (!layManager) return;
AcDbObjectId lauoutId;
AcDbObjectId blockTableRecId;
AcDbEntity *pEnt;
layManager->createLayout(_T("Мой лист"),lauoutId,blockTableRecId); // создали лист
layManager->setCurrentLayoutId(lauoutId); // сделали текущим
layManager->setShowPaperMargins(Adesk::kFalse); // убрали рамку принтера
AcDbLayout *curLayout = layManager->findLayoutNamed(_T("Мой лист"),FALSE); // лист открыт для чтения
if (curLayout)
{
[b]
// интуитивно понимаю, что писать надо где-то здесь :)
// но вот что писать?[/b]
  AcDbObjectIdArray ids = curLayout->getViewportArray();
  for (int i = 0; i < ids.length(); i++)
    if (acdbOpenObject(pEnt, ids.at(i), AcDb::kForWrite) == Acad::eOk)
    {
      pEnt->erase();
      pEnt->close();
    }
}

Re: Настройка листа

Попробуй посмотреть:
класс AcDbPlotSettings и AcDbPlotSettingsDictionary.
Функцию getPlotSettingsDictionary

Re: Настройка листа

> sync02
ну да, вот только есть проблемка - там GET, а надо SET.

Re: Настройка листа

вроде разобрался. получается где-то так:

...
AcDbLayout *curLayout = layManager->findLayoutNamed(_T("Мой лист"),TRUE); // лист открыт для чтения
if (curLayout)
{
  AcDbPlotSettingsValidator *pPlotValid;
  pPlotValid = acdbHostApplicationServices()->plotSettingsValidator();
  pPlotValid->setCanonicalMediaName(curLayout,_T("A3"));
  pPlotValid->setPlotPaperUnits(curLayout, AcDbPlotSettings::PlotPaperUnits:: kMillimeters);
  pPlotValid->setPlotType(curLayout,AcDbPlotSettings::PlotType::kLayout) ;
  pPlotValid->setStdScaleType (curLayout,AcDbPlotSettings::StdScaleType::k1_1) ;
  pPlotValid->setPlotCentered(curLayout,true);
  curLayout->setPrintLineweights(true);
  curLayout->setPlotHidden (false);
  curLayout->close();
...
}

Re: Настройка листа

Доброго времени суток!
А никто не разбирался ли, как настроить лист, используя шаблон?
Наверное, проще было бы решить проблему, использовав acedCommand("-layout template ...")и тд,
но мне этим не воспользоваться ввиду моего смешанного кода. На ARX попытка выглядит так:

 AcDbObjectId pLayoutID;
      AcDbDatabase *pDWTdb = new AcDbDatabase(false);  // База файла шаблона

      if (Acad::eOk == pDWTdb->readDwgFile(TemplFName )){ //  читаю файл *.dwt
           AcDbDictionary *pDict = NULL;
           pDWTdb->getLayoutDictionary(pDict,AcDb::kForRead);
              AcDbObject *pObj = NULL;
              AcDbLayout *pSrcLayout = NULL;  // Layout - источник из  *.dwt
              AcDbLayout *pNewLayout = NULL;  // создаваемый Layout
              es = pDict->getAt(TemplDescr, pObj,AcDb::kForWrite);  // TemplDescr - имя Layout'а в  *.dwt
             
              if (es == Acad::eOk){
                 pSrcLayout = AcDbLayout::cast(pObj);
                 AcApLayoutManager *pLayoutMan = (AcApLayoutManager*)acdbHostApplicationServices()->layoutManager();
                 AcDbObjectId pBTRId;
                 // Создаем новый layout
                 pLayoutMan->createLayout(LayoutName,pLayoutID,pBTRId,0);
                 pLayoutMan->copyLayout( TemplDescr, LayoutName);  // Копируем из источника в новый
                  //     pNewLayout->copyFrom(pSrcLayout);   // так тоже пробовал
                 pNewLayout = pLayoutMan->findLayoutNamed(LayoutName,TRUE);
                 pLayoutMan->setCurrentLayoutId(pLayoutID); // сделали текущим
           
                 pNewLayout->close(); pObj->close();
                 pSrcLayout->close();
                 pLayoutMan->updateLayoutTabs();

                
             pDict->close();
}

Да вот, похоже, где-то накосячил, ибо в результате имею просто белый лист, шаблоном и не пахнет.
Чувствую, без внимания более опытных собратьев мне не выйти на чистую воду...
Подскажите, что в коде не так?

Re: Настройка листа

Максим Маланичев пишет:

pLayoutMan->copyLayout( TemplDescr, LayoutName);// Копируем из источника в новый

Это будет работать только в пределах одного чертежа. Чтобы копировать объекты между чертежами нужно воспользоваться методом AcDbDatabase::wblockCloneObjects

Re: Настройка листа

Спасибо, Александр, только вот опять затык.
Вот код:

if (Acad::eOk == pDWTdb->readDwgFile(TemplFName )){ // TemplFName = "test.dwt"
           AcDbDictionary *pDict = NULL;
           AcDbObject *pObj = NULL; 
           pDWTdb->getLayoutDictionary(pDict,AcDb::kForRead);
         
          if ((es = pDict->getAt(TemplDescr, pSourceLayoutID))!= Acad::eOk) {
                acutPrintf(_T("\n\ ошибка :%s"),acadErrorStatusText(es));
           }
              pDict->close();
          
              AcDbLayout *pSrcLayout = NULL;
              AcDbLayout *pNewLayout = NULL;
             AcApLayoutManager *pLayoutMan = (AcApLayoutManager*)acdbHostApplicationServices()->layoutManager();
             AcDbObjectId pBTRId;

    // Создаем новый layout
     pLayoutMan->createLayout(LayoutName,pLayoutID,pBTRId,0);
     pLayoutMan->setCurrentLayout(LayoutName);
     pNewLayout = pLayoutMan->findLayoutNamed(LayoutName, false);
             
        AcDbObjectIdArray ids;
    AcDbIdMapping idMap;
        ids.append(pSourceLayoutID);                                    
   if ((es = pDWTdb->wblockCloneObjects(ids, pNewLayout->ownerId(),idMap,AcDb::kDrcReplace)) != Acad::eOk) {
    acutPrintf(_T("\n\tОшибка при копировании :%s"),acadErrorStatusText(es));
           }
           pDictCur->close();
           ........
}

Никак в толк не возьму, что должно быть на месте  owner (второй аргумент wblockCloneObjects() )
Перепробовав разные варианты, так ничего и не добился. (при pNewLayout->ownerId()  говорит Ошибка при копировании :eIllegalEntityType)

Re: Настройка листа

Всё не так. В качестве owner должно быть acdbCurDwg()->layoutDictionaryId(); Но этого недостаточно.
Попробуй код функции copyLayout отсюда.

Re: Настройка листа

Спасибо за ссылочку, Александр! Заработало!