Тема: Зуммирование программно
Привет!
Надо изменить масштаб чертежа из моей команды. Использовать acedCommand(RTSTR, "ZOOM",...) не всегда возможно. Как это сделать "напрямую", без отсылки команд с помощью acedCommand/acedCmd?
Заранее спасибо...
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Зуммирование программно
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Привет!
Надо изменить масштаб чертежа из моей команды. Использовать acedCommand(RTSTR, "ZOOM",...) не всегда возможно. Как это сделать "напрямую", без отсылки команд с помощью acedCommand/acedCmd?
Заранее спасибо...
Вот такой алгоритм предложил когда-то 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);
}
странно но в некоторых случаях на acedSetCurrentView зависает автокад. С чем это может быть связанно?
"В некоторых" - это в каких? Побольше конкретики...
Даже затрудняюсь в конкретике. В одной программе по фильтру нахожу точки в чертеже и к ним зуммирую- всё чудесно работает , в другой - беру координаты из текстового файла и зуммирование вылетает :(.
Даже
acedCommand(5005,"_.zoom",5005,"_all",5000);
ads_regen();
не срабатывает( но и не вылетает)
В обоих случаях программа работает в контексте документа? Какой код возврата функции acedCommand?
Все это сродни гаданию на кофейной гуже...
всё работает в контексте диалога. ошибка С00000005
всё работает в контексте диалога. ошибка С00000005
Контекст диалога - это что-то новенькое. Надо понимать что вызов происходит при открытом окне модального диалога? А ресурсы переключены на AutoCAD в момент вызова acedCommand?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Зуммирование программно
Форум работает на PunBB, при поддержке Informer Technologies, Inc