Тема: Зуммирование программно

Привет!
Надо изменить масштаб чертежа из моей команды. Использовать acedCommand(RTSTR, "ZOOM",...) не всегда возможно. Как это сделать "напрямую", без отсылки команд с помощью acedCommand/acedCmd?
Заранее спасибо...

Re: Зуммирование программно

Вот такой алгоритм предложил когда-то  Fernando Poinho Milard, достаточно крутой программист на ARX. На его базе можно реализовать любые модификации функции зуммирования.
void ArxZoom(ads_point pt, double magnf)
{
AcDbViewTableRecord view;
struct resbuf rb;
struct resbuf wcs, dcs, ccs; // acedTrans coord system flags
ads_point vpDir;
ads_point ptmax;
AcGeVector3d viewDir;
AcGePoint2d cenPt;
ads_real lenslength, viewtwist, frontz, backz;
ads_point target;
int /*viewmode,*/tilemode, cvport; // Get window to zoom to:

wcs.restype = RTSHORT; // WORLD coord system flag
wcs.resval.rint = 0;
ccs.restype = RTSHORT; // CURRENT coord system flag
ccs.resval.rint = 1;
dcs.restype = RTSHORT; // DEVICE coord system flag
dcs.resval.rint = 2; // Get the VPOINT' direction vector

acedGetVar("VIEWDIR", &rb);
acedTrans(rb.resval.rpoint, &ccs, &wcs, 0, vpDir);
viewDir.set(vpDir[X], vpDir[Y], vpDir[Z]);
acedTrans(pt, &ccs, &dcs, 0, ptmax);

// set center point of view
cenPt[X] = ptmax[X];
cenPt[Y] = ptmax[Y];
view.setCenterPoint(cenPt);
view.setHeight(magnf*1.2);
view.setWidth(magnf*1.2);
view.setViewDirection(viewDir);

// get and set other properties
acedGetVar("LENSLENGTH", &rb);
lenslength = rb.resval.rreal;
view.setLensLength(lenslength);

acedGetVar("VIEWTWIST", &rb);
viewtwist = rb.resval.rreal;
view.setViewTwist(viewtwist);

acedGetVar("FRONTZ", &rb);
frontz = rb.resval.rreal;

acedGetVar("BACKZ", &rb);
backz = rb.resval.rreal;
view.setPerspectiveEnabled(false);
view.setFrontClipEnabled(false);
view.setBackClipEnabled(false);
view.setFrontClipAtEye(false);

acedGetVar("TILEMODE", &rb);
tilemode = rb.resval.rint;

acedGetVar("CVPORT", &rb);
cvport = rb.resval.rint;

// Paperspace flag
bool paperspace = ((tilemode == 0) && (cvport == 1)) ? Adesk::kTrue:Adesk::kFalse;
view.setIsPaperspaceView(paperspace);
if (Adesk::kFalse == paperspace) {
view.setFrontClipDistance(frontz);
view.setBackClipDistance(backz);
}
else{
view.setFrontClipDistance(0.0);
view.setBackClipDistance(0.0);
}
acedGetVar("TARGET", &rb);
acedTrans(rb.resval.rpoint,&ccs, &wcs, 0, target);
view.setTarget(AcGePoint3d(target[X], target[Y], target[Z]));
// update view
acedSetCurrentView(&view, NULL);

}

Re: Зуммирование программно

странно но в некоторых случаях на acedSetCurrentView зависает автокад. С чем это может быть связанно?

Re: Зуммирование программно

"В некоторых" - это в каких? Побольше конкретики...

Re: Зуммирование программно

Даже затрудняюсь в конкретике. В одной программе по фильтру нахожу точки в чертеже и к ним зуммирую- всё чудесно работает , в другой - беру координаты из текстового файла и зуммирование вылетает :(.
Даже
    acedCommand(5005,"_.zoom",5005,"_all",5000);
    ads_regen();
не срабатывает( но и не вылетает)

Re: Зуммирование программно

В обоих случаях программа работает в контексте документа? Какой код возврата функции acedCommand?
Все это сродни гаданию на кофейной гуже...

Re: Зуммирование программно

всё работает в контексте диалога.  ошибка С00000005

Re: Зуммирование программно

olga wolk пишет:

всё работает в контексте диалога.  ошибка С00000005

Контекст диалога - это что-то новенькое. Надо понимать что вызов происходит при открытом окне модального диалога? А ресурсы переключены на AutoCAD в момент вызова acedCommand?