Тема: Изменение параметров custom entity

Здравствуйте. Есть проблема с поворотом, и масштабированием custom entity. Перегрузил transformby(), поворот,перемещение и масштабирование там описаны. Вопрос вот чем : при повороте немасштабированного примитива все в порядке. Если я увеличиваю  размер (уже повернутого примитива) и пытаюсь варочать,автокад вылетает, причем при повороте увеличенного примитива из начального положения все тоже нормально. В чем хотя бы может быть дело??

Re: Изменение параметров custom entity

denis asd пишет:

В чем хотя бы может быть дело??

Наверное в твоем перегруженом методе transformby(). Лечить по фотографии не умею, так что пациента в студию. smile

Re: Изменение параметров custom entity

assertWriteEnabled();
    AcGeMatrix3d m;
    int des=1,d;
    int fl=0;
   
    d=(int)xform.scale();
    acutPrintf(_T("\nif(%d != %d)"),d,des);
   
    while(xform.scale()!=1. && !fl)
    {
        scale=xform.scale();
      
        fl=1;
    }
   while(xform(0,0)!=1. && !fl)
   {
       angle=acos(xform(0,0));
       if(xform(1,0)<0.)
           angle=-1*angle;
       fl=1;
      
   }
   
   
    while(xform(0,3)!=0. && xform(1,3)!=0. && !fl)
    {
        offset.x=xform(0,3);
        offset.y=xform(1,3);
        offset.z=xform(2,3);
        fl=1;
    }

Re: Изменение параметров custom entity

scale, angle, offset - поля мрего пользовательского класса

Re: Изменение параметров custom entity

Как видите просто запоминаю новые параметры матрицы. А потом в worlddraw применяю их. У меня BlockReference пробовал вызывать transform для него,вообще ничего не отображается

Re: Изменение параметров custom entity

Я тут вообще ничего не вижу. Вижу какой-то кусок неформатированного кода. Вижу сравнение плавающего числа != 0. и это у меня вызывает отрицательные эмоции. Не вижу ни начала, ни конца метода. Не вижу что такое xform...

Re: Изменение параметров custom entity

извините..вот

Acad::ErrorStatus xxx::transformBy(const AcGeMatrix3d &xform)
{
   assertWriteEnabled();
   int fl=0;

   while(xform.scale()!=1. && !fl) //происходит сравнение с элементами матрицы,так пытаюсь определить
                                   //какую команду  вызвал(поворот,масштаб,перемещение)
    {
          scale=xform.scale();
      fl=1;
    }

   while(xform(0,0)!=1. && !fl)
        {
       angle=acos(xform(0,0));
       if(xform(1,0)<0.)
           angle=-1*angle;
           fl=1;
      
        }
   
   
    while(xform(0,3)!=0. && xform(1,3)!=0. && !fl)
    {
        offset.x=xform(0,3);
        offset.y=xform(1,3);
        offset.z=xform(2,3);
        fl=1;
    }
   
    return Acad::eOk;
}

Re: Изменение параметров custom entity

Спасибо за критику,в универе все таки ничему толковому не научат :)

Re: Изменение параметров custom entity

Нельзя выполнять сравнение плавающего (действительного) числа на равенство и не равенство. Нужно проверять на попадание в диапазон. Например, вместо:

while(xform(0,3)!=0. && xform(1,3)!=0. && !fl) 

правильнее писать:

#define FUZZ 1e-6
if (fabs(xform(0,3)) > FUZZ) && fabs(xform(1,3)) > FUZZ) 

while я заменил на if, т.к. не смог понять зачем ты вообще использовал while - у меня от напряжения мозги закипели. Использование флага fl здесь вообще не разумно, т.к. в матрице xform может быть одновременно передано и масштабирование, и поворот, и перенос. Кстати, масштабирование может быть разным по разным осям, так что одним scale ты не отделаешься. Да и поворот может быть относительно разных направлений.
Но это все не существенно. В этом коде аварийного завершения быть не должно. Значит глючит какой-то другой метод. Возможно worldDraw().

Re: Изменение параметров custom entity

while это жутко,но if компилятор игнорирует(все равно заходит в цикл),правда это  наверное из-за сравения с плавающим числом,не знаю,попробую...А пытаюсь я изменять примитив по командам автокада( rotate ,move и.т.п.),а там вроде берется единичная матрица,и меняется что-то одно,либо масштаб,либо поворот,нет?

(изменено: Александр Ривилис, 16 декабря 2010г. 18:58:32)

Re: Изменение параметров custom entity

denis asd пишет:

а там вроде берется единичная матрица,и меняется что-то одно,либо масштаб,либо поворот,нет?

Нет. А команда _ALIGN ? А изменение свойств через панель свойств?

denis asd пишет:

но if компилятор игнорирует(все равно заходит в цикл),правда это наверное из-за сравения с плавающим числом

Жуть.

Re: Изменение параметров custom entity

Писать не быдлокод в том, в чем пишешь чуть -ли не наугад(objectArx), еще и при отсутствии опыта тяжеловато. .вот worldraw :
Adesk::Boolean xxx::worldDraw (AcGiWorldDraw *mode) {
    assertReadEnabled () ;
    myref->getTransformedCopy(m1,tmp);// myref это reference с которым работаю,его менять нельзя
        acutPrintf(_T("\nnorotation"));
        m1=m1.setToScaling(scale,AcGePoint3d(p[0],p[1],p[2])=AcGePoint3d::kOrigin);
        tmp->transformBy(m1);
        m1=m1.rotation(angle,AcGeVector3d(0.,0.,1.0));
        tmp->transformBy(m1);
        acutPrintf(_T("\nnoscale"));
        acutPrintf(_T("\nnomove"));
        m1=m1.translation(AcGeVector3d(p[0], p[1], p[2])+offset);
        tmp->transformBy(m1);
        mode->geometry().draw(tmp);
        delete tmp;
        return (AcDbEntity::worldDraw (mode));
   
}
метод кривоват,но надо ж с этим багом разобраться,чтобы дальше идти

Re: Изменение параметров custom entity

И ,кстати, насчет if-действительно не работает,просто не проверяет условие...Первый раз такое вижу

Re: Изменение параметров custom entity

denis asd пишет:

И ,кстати, насчет if-действительно не работает,просто не проверяет условие...

Условие какое?

Re: Изменение параметров custom entity

if(xform(0,0)!=1. && !fl) .Такое,например.Чудные вещи иногда происходят :D Вот честное слово,прогонял много раз,пытался понять почему,решил что духи :D Так что можете посоветовать насчет worlddraw ?

Re: Изменение параметров custom entity

denis asd пишет:

if(xform(0,0)!=1. && !fl) .Такое,например.Чудные вещи иногда происходят smile:D

Похоже ты не читаешь то, что я пишу. Жаль. Повторю в последний раз: сравнивать на равенство плавающие числа нельзя!

denis asd пишет:

Так что можете посоветовать насчет worlddraw ?

Без всего кода и отладки точно сказать в чем дело я не смогу. Одно могу посоветовать вместо всех твоих scale, angle и offset сохраняй матрицу из transformBy() и по ней выполняй преобразование своего tmp.
Ну и еще подучить C++, посмотреть готовые примеры (в том числе и в ObjectARX SDK)

Re: Изменение параметров custom entity

Спасибо

Re: Изменение параметров custom entity

Но матрицу я пытался сохранять.Поскольку мне tmp мое нельзя менять,у меня на вызов команд создается единичная матрица(такая какой первоначально вставил) в которой меняются только параметры которые изменяет команда(при масштабировании главная диагональ,например).Это я проверял.Когда я пытался сохранять матрицу,Автокад умирал сразу ,при повороте масштабированного изображения.Поэтому пришлось выдумывать этот донельзя странный способ со смещениями и углами. А за плавающие числа,каюсь,я вам просто пример неудачный привел.в if (fabs(xform(0,3)) > FUZZ) && fabs(xform(1,3)) > FUZZ) тоже не заходило.Создал новый проект скопипастил туда весь код,все стало нормально.Все равно спасибо :D