Показать сообщение отдельно
Старый 12.07.2018, 17:19   #196
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от wizardpnz Посмотреть сообщение
да,чтобы координаты считались как если бы мы их мерили руками на экране о начала координат и без разворотов

я понимаю что базис где то сам применяет свою матрицу но в других прогах такого нет

там просто координаты начала объекта XYZ и ШВГ
и строим в направлении X+ Y+ Z+

тут надо копать
http://grazit.ru/geometricheskie-pre...j-grafike.html
Сделал скрипт для настройки положения панели в точку по минимальным координатам. Использовать его просто: запускаете, указываете панель, и радуетесь (?) результату. Тестировал я его долго (после каждого исправления скрипта, приходилось проверять все варианты поворотов снова), заманался, поэтому довел до состояния "кажется, должно работать" и отдаю его вам. Если обнаружите ошибку, пришлите пример с панелью, которая неправильно преобразовывается, и я поправлю код.
Пока не забыл: В некоторых случаях для приведения позиции объекта к минимальным координатам используется сдвиг контура панели, что может плохо отразиться на элементах панели (например, на пазах).

Код скрипта

Код:
function NegateVector(v) {
    return {
        x: -v.x,
        y: -v.y,
        z: -v.z
    }
}

/**
 * 
 * @param {Object3} obj 
 */
function CorrectObject(obj) {
    StartEditing(obj);

    var minG = obj.ToObject(obj.GabMin);
    var curPos = obj.ToObject(obj.Owner.ToGlobal(obj.Position));
    var rot = obj.RotMatrix;
    var negate = {
        x: false,
        y: false,
        z: false
    }
    var x = {
        x: rot[0],
        y: rot[1],
        z: rot[2],
    }
    var y = {
        x: rot[4],
        y: rot[5],
        z: rot[6],
    }
    var z = {
        x: rot[8],
        y: rot[9],
        z: rot[10],
    }
    const eps = 0.001;
    if (minG.x > curPos.x + eps) {
        negate.x = true;
    }
    if (minG.y > curPos.y + eps) {
        negate.y = true;
    }
    if (minG.z > curPos.z + eps) {
        negate.z = true;
    }
    if (negate.x) {
        if (negate.y) {
            if (negate.z) {
                z = NegateVector(z);
                y = NegateVector(y);
                var shift = obj.NToGlobal({
                    x: obj.GSize.x,
                    y: obj.GSize.y,
                    z: obj.GSize.z
                });
                obj.Contour.Move(-obj.GSize.x, 0);
                obj.TranslateGCS(shift);
            } else {
                y = NegateVector(y);
                var shift = obj.NToGlobal({
                    x: obj.GSize.x,
                    y: obj.GSize.y,
                    z: 0
                });
                obj.TranslateGCS(shift);
            }
        } else if (negate.z) {
            z = NegateVector(z);
            var shift = obj.NToGlobal({
                x: obj.GSize.x,
                y: 0,
                z: obj.GSize.z
            });
            obj.TranslateGCS(shift);
        } else {
            obj.Contour.Move(-obj.GSize.x, 0);            
            var shift = obj.NToGlobal({
                x: obj.GSize.x,
                y: 0,
                z: 0
            });
            obj.TranslateGCS(shift);
        }
    }
    else if (negate.y) {
        if (negate.z) {
            z = NegateVector(z);
            y = NegateVector(y);
            var shift = obj.NToGlobal({
                x: 0,
                y: -obj.GSize.y,
                z: obj.GSize.z
            });
            obj.TranslateGCS(shift);
        }
        else {
            obj.Contour.Move(0, -obj.GSize.y);
            var shift = obj.NToGlobal({
                x: 0,
                y:  obj.GSize.y,
                z: 0
            });
            obj.TranslateGCS(shift);
        }
    } else if (negate.z) {
        z = NegateVector(z);
        var shift = obj.NToGlobal({
            x: 0,
            y: 0,
            z: obj.GSize.z
        });
        obj.Contour.Move(-obj.GSize.x, 0);
        obj.TranslateGCS(shift);
    }

    // Теперь ориентируем объект по осям Y и Z
    obj.Orient(z, y);
}

var obj = GetPanel('panel 1');
if (obj) {
    CorrectObject(obj);
}
[свернуть]


З.Ы. И, как всегда с опозданием, приходит еще одна умная мысль, которая может загубить на корню весь труд выше:
wizardpnz, а не проще ли взять минимальную точку объекта за позицию и вычислить размер панели, например так:
Код:
var pos = obj.GabMin;
var size = {
    x: obj.GabMax.x - obj.GabMin.x,
    y: obj.GabMax.y - obj.GabMin.y,
    z: obj.GabMax.z - obj.GabMin.z,
}
//или
size = obj.NToGlobal(obj.GSize);
З.З.Ы. Обдумал: этот вариант подходит только для ортогональных панелей.
Letos вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Ovsyanicov (12.07.2018)