Цитата:
Сообщение от 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;
}
}
[свернуть]