Тема: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Как уствновить область просмотра во внешнем чертеже (new AcDbDatabase)? Без создания документа.
Т.е. задача примерно следующая:
v   Cоздаём новую базу данных.
v   Добавляем объекты.
v   Сохраняем Preview с помощью LoadLibrary("acblock.arx").
?   Устанавливаем окно просмотра таким образом, чтобы при открытии пользователь сразу увидел что нарисовано, а не вызывал ZOOM Extents, чтобы найти.
v   Сохраняем.
Внимание, вопрос: как быть с зумом?
Если можно, кусок кода, пожалуйста.

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

> samdurak
Можно поподробней начиная с третьего пункта?

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Необходимо во внешнем чертеже нарисовать несколько объектов. Если это сделать и сохранить базу данных, то сразу после открытия объекты не видны, т.к. находятся, скажем, в точке (0,0,0), а окно просмотра, к примеру, оказывается в прямоугольнике с точками (780,490,0)-(800,500,0)
Вот и спрашивается, как, зная реальные границы своих только что вставленных в новую базу данных объектов, программно установить Viewport таким образом, чтобы при открытии этого чертежа, пользователь увидел всё, что находится на чертеже, а не искал, где оно находится.

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Установить Viewport пространства модели в нужное положение можно при помощи изменения свойств класса AcDbViewportTableRecord*:

//.......................................................
es = acdbHostApplicationServices()->workingDatabase()->getViewportTable(pSSymbTable,AcDb::kForRead);
    if(es!=Acad::eOk)
        return;
    
    AcDbViewportTable* pvPortTable=(AcDbViewportTable*)pSSymbTable;
    AcDbViewportTableRecord* pViewport;    
    
    es = pvPortTable->getAt("*ACTIVE",pViewport,AcDb::kForWrite);
    pvPortTable->close();
    if(es!=Acad::eOk)
        return;
//.......................................................
    pViewport->setElevation(0);
    pViewport->setViewTwist(0);
    pViewport->setViewDirection(vcDirection);    
    pViewport->setTarget(targetPoint);
    pViewport->setCenterPoint(AcGePoint2d(0.0,0.0));
    pViewport->setSnapEnabled(true);
    pViewport->setSnapIncrements(AcGePoint2d(1.0,1.0));
    
    if(bUpdateUCS)
    {
        AcGePlane surfPlane(zeroPoint,vcViewDir);
        AcGeVector3d xAxis(surfPlane,AcGeVector2d(1,0));
        AcGeVector3d yAxis(surfPlane,AcGeVector2d(0,1));
        pViewport->setUcs(zeroPoint,xAxis,yAxis);
    }    
    
    pViewport->close();
    
    acedVportTableRecords2Vports();    

Область, занимаемая выбранным набором примитивов, может быть получена вызовом для каждого примитива getGeomExtents.

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Сорри, пропустил фрагмент сразу после открытия pViewport:

double fVpAspectRatio=(right!=left)&&(bottom!=top)?double(top-bottom)/double(right-left):1.0;
    double fSurfAspectRatio=vpHeight/vpWidth;
    
    if(fSurfAspectRatio>=fVpAspectRatio)
    {
        pViewport->setHeight(vpHeight);
        pViewport->setWidth(vpHeight/fVpAspectRatio);        
    }else
    {
        pViewport->setWidth(vpWidth);
        pViewport->setHeight(vpWidth*fVpAspectRatio);
    }

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Огромный СЭНКС!
Вот только если б ещё понять, как здесь используются AcGePoint2d и что они собой представляют... пространство ведь вроде ТРЁХмерное... Т.е. по идее надо AcGePoint3d, или я чего-то не понимаю?

Re: Как уставновить область просмотра во внешнем чертеже (new AcDbDatabase)?

Про двумерные точки: см. документацию ObjectARX по AcDbAbstractViewTableRecord. Дело в том, что там, где они используются, используется координатная система проекции модели.