Показать сообщение отдельно
Старый 22.05.2018, 16:25   #154
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,033 раз(а) в 367 сообщениях
Вес репутации: 345
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Kartuz Посмотреть сообщение
Есть у меня скриптик. Он расставляет поровну полки по высоте. Но если полки присажены, то крепёж остаётся на месте, а полки расставляются. Нужно сделать , чтобы с крепежём перемещалось.
Добавил перемещение крепежа с комментариями. Кстати, функция поиска крепежа, соединённого с панелью, может не найти крепеж, поставленный неправильно.

Код

Код:
MinY = 1e10; // низ нижней полки
MaxY = -1e10; // верх верхней полки
SumThickness = 0; // суммарна толщина панелей
Count = 0; // количество панелей

/**
 * Поиск объекта крепежа (блок схемы крепежа, например), в который вложен 
 * текущий крепёж
 * @param {Object3} obj текущий крепеж
 */
function FindFastenerOwner(obj){
    var result = obj;
    var owner = obj.Owner;
    while (owner){
        //проверка по типу монтирования - если он существуети не равен типу "секция"
        if ((owner.DatumMode > DatumMode.None) && (owner.DatumMode != DatumMode.Box)){
            result = owner;
        }
        owner = owner.Owner;
    }
    return result;
}

for (k = 0; k < Model.SelectionCount; k++) {
    obj = Model.Selections[k];
    if (obj.Thickness > 1) {
        if (obj.GabMin.y < MinY)
            MinY = obj.GabMin.y;
        if (obj.GabMax.y > MaxY)
            MaxY = obj.GabMax.y;
        SumThickness += obj.Thickness;
        Count = Count + 1;
    }
}

// нужное расстояние между полками
var SpaceBetween = Math.floor((MaxY - MinY - SumThickness) / (Count - 1));

var CurY = MinY;
for (var k = 0; k < Model.SelectionCount; k++) {
    var obj = Model.Selections[k];
    if (obj.Thickness > 1) {
        Undo.Changing(obj);
        var yShift = CurY - obj.GabMin.y;
        // Весь крепёж, соединенный с панелью 
        // достаём до сдвига панели      
        var fasts = obj.FindConnectedFasteners();
        obj.Translate(0, yShift, 0);
        // список уже сдвинутого крепежа
        var translatedFasts = [];
        for (var i = 0; i < fasts.length; i++) {
            // ищем "самый корневой" крепёж
            var curFast = FindFastenerOwner(fasts[i]);
            // Если текущего крепежа нет в списке сдвинутых
            if (translatedFasts.indexOf(curFast) < 0){
                Undo.Changing(curFast);
                // сдвигаем крепёж
                curFast.Translate(0, yShift, 0);
                // и записываем в список сдвинутых
                translatedFasts.push(curFast);
            }
        }
        CurY = CurY + SpaceBetween + obj.Thickness;
    }
}
[свернуть]
Letos вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Kartuz (22.05.2018)