Тема: Проблема при transformBy

Написал функцию:
static int ads_rect(void)
    {
        struct resbuf *pArgs =acedGetArgs () ;
        AcGeMatrix3d matTr;
        AcGePoint3d ptDisp;
        AcGePoint2d pt0(0.0, 0.0);
        AcGePoint2d pt1(0.0, 500.0);
        AcGePoint2d pt2(100.0, 500.0);
        AcGePoint2d pt3(100.0, 0);
        AcDbPolyline *pLine = new AcDbPolyline(4);
        Acad::ErrorStatus es=pLine->addVertexAt(0,pt0);
        es=pLine->addVertexAt(1,pt1);
        es=pLine->addVertexAt(2,pt2);
        es=pLine->addVertexAt(3,pt3);
        pLine->setClosed(Adesk::kTrue);
        pLine->setColorIndex(2);
        // pArgs- точка переноса
        ptDisp.set(pArgs->resval.rpoint[0],pArgs->resval.rpoint[1],pArgs->resval.rpoint[2]);
       
        matTr.setToIdentity();
        matTr.setToTranslation(ptDisp.asVector());
        pLine->transformBy(matTr);
                // функция присоединяет примитив к текущей базе
        postToDwg(pLine);
        pLine->close();
        acedRetVoid () ;
        return (RSRSLT) ;
    }
Создает полилинию в плоскости XY и переносит её на указанный вектор
вызываю:
(rect '(20 0 0)) - Нормально, начальная точка полилинии проходит через '(20 0 0)
(rect '(5 0 0)) - Ненормально, начальная точка полилинии проходит через '(0 0 0)
(rect '(5.0 0 0)) - Нормально, начальная точка полилинии проходит через '(5.0 0 0)
Вопрос почему неправильно преобразуется с точкой '(5 0 0)?

Re: Проблема при transformBy

Писать нада правильно. Если нужно передать double, не изобретай велосипед (слава богу строку не затолкал :) ). Так чтоб совсем правильно, еще f добавляй (20.0f), а то следующий вопрос будет почему начало полилинии где-то рядом с точкой. У С++ бывают такие глюки, хотя и глюками это назвать сложно.

Re: Проблема при transformBy

Я вызываю из AutoLisp'a, передаю список, в ARX читаю его как точку (resval.rpoint[..]),т.е. как массив double:
typedef double   ads_real;
ads_real rpoint[3];
Почему тогда тип не double?
А даже если и не double, то что, при матричных вычисления класса AcGeMatrix3d
это не обрабатывается, и преобразование происходит неверно?

Re: Проблема при transformBy

> PrWork
Версия AutoCAD и ObjectARX? В AutoCAD и ObjectARX 2006 проверил - все работает нормально.

Re: Проблема при transformBy

и кстати typedef double ads_real;
как это тип не double?

Re: Проблема при transformBy

> PrWork
Все должно работать нормально. Проверь значение pArgs->restype - рано ли оно RT3DPOINT и какие значения в pArgs->resval.rpoint.
Возможны нюансы только с вложенными списками типа '((5 0 0)). Вот для них задавать '((5.0 0.0 0.0)) обязательно - это ограничение при передаче вложенных списков lisp->arx

Re: Проблема при transformBy

> Александр Ривилис
Спасибо, так я и сделал. И проблема свелась с обработке acedGetArgs()
Написал функцию:
    static int ads_testrb(void)
    {
        struct resbuf *pArgs =acedGetArgs () ;
        AcGePoint3d ptDisp;
        acutPrintf(_T("pArgs->restype=%d\n"),pArgs->restype);
        ptDisp.set(pArgs->resval.rpoint[0],pArgs->resval.rpoint[1],pArgs->resval.rpoint[2]);
        acutPrintf(_T("X=%f,Y=%f,Z=%f\n"),pArgs->resval.rpoint[0],pArgs->resval.rpoint[1],pArgs->resval.rpoint[2]);
        acedRetVoid () ;
        return (RSRSLT) ;
}
Теперь результаты вызовов:
Команда: (testrb '(5 1 2))
pArgs->restype=5009
X=5.000000,Y=1.000000,Z=2.000000 -> Как и ожидалось.
Команда: (testrb '(10 1 2))
pArgs->restype=10
X=1.000000,Y=2.000000,Z=0.000000 -> Неожиданно DXF point: не знал, что acedGetArgs () может считать, что передаются DXF коды.
Команда: (testrb '(10.0 1 2)) -> Вот теперь правильно.
pArgs->restype=5009
X=10.000000,Y=1.000000,Z=2.000000
Получается, что при вызове дале не вложенных списков обязательно первый элемент списка проверять на Double? Так ли это?
P.S. ACADVER = "17.0s (LMS Tech)", ObjectARX 2007

Re: Проблема при transformBy

Во избежание ошибок вцелом, рекомендую все передаваемые переменные заносить в таком виде, в котором они должны передаваться. Тогда подобных проблем не возникнет.