Некорректно происходит поворот линии при угле более 180 градусов

andrey__chirkin
отредактировано 26 Aug Раздел: Модуль «СПДС»

Добрый день!

Реализована ручка поворота объекта вокруг точки вставки. От 0 до 180 градусов поворот происходит корректно. После 180 градусов, ручка вращается корректно, линия начинает отчет от 0 градусов. Исходники прилагаю.

Ответы

  • MCAD
    отредактировано 26 Aug

    Недавно выкладывал

    https://cloud.mail.ru/public/nF1c/cSF1bZvDL

    Так будет понятнее

    	if ( NMovingGrip==2) {
    vecGrip=pntGrip2-pntGrip0;
    rAng2=angleTwoPi(vecDirection,vecGrip);
    l2=vecLen(vecGrip)/rScl;
    };

  • Что означает rScl?

  • MCAD
    отредактировано 26 Aug

    Удалите просто /rScl

    rScl - текущий масштаб измерений (Вам можно пренебречь)

    rSymScl - текущий масштаб символов

    Например в uText для определения высоты текста

    UText(mp+oX*+oY*,DegToRad(0),hText*rSymScl/rScl,1,-10.0000,string(rLenght),0,2);

  • Прошу прислать эскиз к этому объекту.

  • Этому УГО лет 20 наверное.

    Я его искать неделю буду...

  • andrey__chirkin
    отредактировано 26 Aug

    Посмотрите, пожалуйста, правильно ли построен мой эскиз?

    Код в моем скрипте, который я изначально прислал, практически идентичен коду из Вашего примера, касаемо поворота на 360 градусов. Никак не могу найти ошибку. Одно из предположений - что-то не так в эскизе.

  • Завтра устроит?

  • Да, конечно

  • MCAD
    отредактировано 27 Aug

    Посмотрите, пожалуйста, правильно ли построен мой эскиз?

    Да, с эскизом все нормально. Но я его дополнил еще одним отрезком

    смотри пост ниже

    и задал условие в "Исполнении"

    Line(mp,node6,2,iff(rAngle<=180;1;0));
    Line(node7,mp,4,iff(rAngle<=180;0;1));

    Почему так не разобрался. Ссылку на пост отправил тестерам

    https://cloud.mail.ru/public/XigL/Snx966MQ5

  • Это не поможет. Я посмотрел "Исполнение" - оно руками редактировалось.

  • MCAD
    отредактировано 27 Aug

    Нашли решение для простого образмеривания геометрии:

    function OnMoveGripPoint
    {
    if (NMovingGrip == 0) {
    pntOrigin = pntGrip0;
    }
    if ( NMovingGrip==1) {
    vecGrip=pntGrip1-pntGrip0;
    rAngle=angleTwoPi(vecDirection,vecGrip);
    rL=vecLen(vecGrip);
    ShowMessage("rAngle :"+ rAngle);
    ShowMessage("rL :"+ rL);
    }

    https://cloud.mail.ru/public/XigL/Snx966MQ5

  • Спасибо!

  • Если еще нужно, чтобы вместе с линией вращался и квадрат под тем же углом. Нужно для каждой стороны квадрата прописать подобные зависимости - rL*cos(rAngle) и rL*sin(rAngle) ?

  • Если вы продолжите развивать свою технологию то ДА

    А вообще-то можно эти "Эскизы" сделать в разных "Исполнениях"

    Пример тут: https://cloud.mail.ru/public/aSEe/86mLMZbG8

  • xRef не относится к параметрическому и непараметрическому исполнению?

    Вся логика внутри заполняется вручную?

  • Что означают параметры в DrawReference?

    Через поиск в документации не нашел

  • MCAD
    отредактировано 28 Aug

    xRef

    Просто название исполнения. В данном случае исполнение, которое в

    function OnInitialization по умолчанию strDesignName = "xRef";

    В остальном это обычный скрипт, который принимает параметры из объекта, например

    if(ispRotate == 1)
    DrawReference(iff(typeImpl!=1;"Star";"Arc"),VFRONT,node3,vecDir,vecDirPerp,1,0,1);
    else
    DrawReference(iff(typeImpl!=1;"Star";"Arc"),VFRONT,node3,oX,oY,1,0,1);

    Каждое указанное исполнение может быть параметрическим или без параметров.

    Я Вам уже отправлял:

    https://cloud.mail.ru/public/Q3sb/8XRJYDDJJ https://cloud.mail.ru/public/WQFq/5jpvCZqeh

    Через поиск в документации не нашел

    Вообще-то это из другого продукта, а там они формируются "Мастерами"

    https://cloud.mail.ru/public/RZRf/eCQEE51V6

  • Почему здесь цикл на 15 итераций?

    Что означает переменная mp?

    ii=0; While(ii<15); note[ii]=mp; ii=ii+l; End While;

  • MCAD
    отредактировано 28 Aug

    Так это же обычное исполнение.

    Так же можно точки (руками) задавать. Нигде не описывалось

    Правда тут писали разные:

    Но давно это было…

    Позволяет внутри отрисовки одного вида добавлять отрисовку другого. Сильно упрощает образмеривание сложных видов. позволяется использовать сложные необразмеренные виды в отрисовке и поворачивать их с помощью гриппоинтов.
    DesignName="SysViewName";
    DrawReference(DesignName, VFRONT, pnt, vecDir, vecPlane, scale, bDisableCache = FALSE, iReplaceLineType= -1,  bCutPrevius = FALSE);
    bDisableCache по умолчанию кэширование включено, выключать надо если вид параметрический.
    iReplaceLineType если -1, то ничего не делается, если же отлично, то заменяет тип линии 1 на iReplaceLineType.
    bCutPrevius , если TRUE то будет вырезать из всей предыдущей отрисовки, контуром из этого референса.
    Распознование с чертежа:
    вставка блока содержащаяя линию+текст, образмеривать нужно линию, длина линии не будет учитыватся, но образмерить ее придется.
    текст должен быть в таком виде:
    DrawReference(DesignName, VFRONT, 1.0);
    или
    DrawReference(DesignName, VFRONT, 1.0,FALSE, -1, FALSE);
    т.е. координатная составляющая будет подставлена автоматически. остальные параметры пойдут в команду отрисовки.
    Для указания вектора vecPlane референса в блок нужно включить вторую линию, перпендикулярную первой. Если второй линии не будет, то направление вида будет браться по-умолчанию.

  • Почему именно 15 итераций?

  • Скопировал из другого исполнения.

    И не отредактировал.

    Кстати, надо проверить, оно тут нужно вообще?

  • andrey__chirkin
    отредактировано 28 Aug

    Вот так работает. В DrawReference используется переменная mp. Не понятно откуда она берется.

  • Вот были это сервисные функции, так и надо было их скрытыми оставлять.

    mp начало координат объекта

    В каждом исполнении есть:

  • mp не совпадает с pntOrigin?

  • Это разные вещи. Совсем