(изменено: ash09, 8 февраля 2010г. 13:05:35)

Тема: Создание нового viewport в paper space

Добрый день!
Пожалуйста приведите пример, у кого есть, создания нового vieport в paper space, который бы отображал желаемую часть чертежа.  Или изменение дефолтного окна автокада в paper space в требуемые рамки.
Спасибо заранее.

Re: Создание нового viewport в paper space

ну где-то так:

static void smProject_mytest(void)
{
        // проверяем где мы находимся. должны в пространстве листа
    resbuf rbtl = {NULL,RTSHORT,0}; 
    acedGetVar(_T("TILEMODE"),&rbtl);
    if (rbtl.resval.rint == 1) return;// в пространстве модели

    ads_point pt1,pt2;
    AcDbBlockTable *pTable;
    AcDbBlockTableRecord *pPsBTR;
    AcDbViewTable *pViewTable;
    AcDbViewTableRecord *pViewTR;
    
    if (RTNORM != acedGetPoint(NULL, L"\nПервая точка рамки вьюпорта: ", pt1))return;
    if (RTNORM != acedGetCorner(pt1, L"\nВторая точка рамки вьюпорта: ", pt2))return;
    // создаем вьюпорт
    AcDbViewport *pViewport = new AcDbViewport;
    pViewport->setWidth(fabs(pt2[X] - pt1[X]));
    pViewport->setHeight(fabs(pt2[Y] - pt1[Y]));
    pViewport->setCenterPoint(AcGePoint3d(pt1[X] + (pt2[X] - pt1[X]) / 2, pt1[Y] + (pt2[Y] - pt1[Y]) / 2, pt1[Z]));

    // а это наши координаты в модели, которые будут видны
    AcGePoint2d max = AcGePoint2d(2000.0,1000.0);
    AcGePoint2d min = AcGePoint2d(200.0,300.0);
    pViewport->setViewCenter(AcGePoint2d((max[X]+min[X])/2,(max[Y]+min[Y])/2));
    pViewport->setViewHeight((max[Y]-min[Y])+0.5);

    // добавляем его в пространство листа
    if (Acad::eOk != acdbHostApplicationServices()->workingDat abase()->getBlockTable(pTable, AcDb::kForRead))
    {
        acutPrintf(L"\nНе вышло достучаться к BlockTable.");
        delete pViewport;
        return;
    }

    if (Acad::eOk != pTable->getAt(ACDB_PAPER_SPACE, pPsBTR, AcDb::kForWrite))
    {
        pTable->close();
        delete pViewport;
        return;
    }
    pTable->close();

    AcDbObjectId mViewPortId;
    if (Acad::eOk != pPsBTR->appendAcDbEntity(mViewPortId, pViewport))
    {
        pPsBTR->close();
        delete pViewport;
        return;
    }
    pPsBTR->close();

    pViewport->setOn();
    pViewport->close();
}

Re: Создание нового viewport в paper space

Николай, спасибо большое.

Re: Создание нового viewport в paper space

А как удалить дефолтный viewport?

Re: Создание нового viewport в paper space

Найти все AcDbViewport в ACDB_PAPER_SPACE (пройтись итератором по AcDbBlockTableRecord). Ну и удалить их.

Re: Создание нового viewport в paper space

Александр, спасибо большое.
Еще один вопрос в тему. Какая переменная в автокаде определяет единицы масштаба плота
(unit scale) при печати чтобы изменить с inch на мм при открытии автокада и как к ней добраться в
Object ARX ?

(изменено: Николай, 9 февраля 2010г. 14:28:26)

Re: Создание нового viewport в paper space

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

Re: Создание нового viewport в paper space

Нашел функцию AcDbPlotSettings::PlotPaperUnits plotPaperUnits() const
Возвращает kInches, kMillimeters, kPixels.
Вопрос теперь как задать формат текущего листа.
где-то должно быть в определениях AcApLayoutManager и AcDbPlotSettingsValidator...

Re: Создание нового viewport в paper space

посмотри в ObjectARX->samples\editor\AsdkPlotAPI\ (в ARX 2010 этого примера  уже нет, так что смотри в более ранних версиях)
если не разберешься, то спрашивай :)
а еще, эта тема уже обсуждалась на форуме.

Re: Создание нового viewport в paper space

да, нашел здесь
Спасибо!