Показать сообщение отдельно
Старый 22.04.2019, 17:27   #1124
Ovsyanicov
Местный
 
Регистрация: 30.11.2013
Адрес: Кишинев
Сообщений: 734
Сказал(а) спасибо: 1,529
Поблагодарили 884 раз(а) в 376 сообщениях
Вес репутации: 403
Ovsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордится
По умолчанию

Более свежая версия, в которой:
// - оптимизировано отображение пунктов на панели свойств в зависимости от выбранного режима работы скрипта и активированных чекбоксов
// - функция AdditionalInfo переименована в SizesInfo
// - добавлен учет направления текстуры панели
// - добавлен вариант Имя, Позиция, Размер от Ozimko
// - добавлена возможность отключения отображения толщины панели в размерах
// - добавлена константа prefix в которой можно задать символ перед позицией (задается в коде скрипта)
// - доработана функция "Поз. в наименование": если позиция не задана, то наименование не перезаписывается
// - оптимизировано использование префикса перед позицией: если позиция не задана, то префикс тоже не появляется

PHP код:
// Разделитель между наименованием и позицией
const separator ' ';
// Префикс перед позицией
const prefix '№';

function 
CheckObject(obj) {
    switch (
processingType.ItemIndex) {
        case 
0:
            return 
true;
        case 
1:
            return 
obj.Selected;
        case 
2:
            return 
obj.Selected && obj.List;
    }
}

// Функция обхода всех объектов в блоке и вызова переданной функции для их
// обработки
function forEachInList(list, func) {
    if (!
func)
        return;
    for (var 
0< list.Counti++) {
        var 
obj = list.Objects[i];
        if (
CheckObject(obj)) {
            
func(obj);
            if (
obj.List) {
                
forEachInList(obj.AsList(), func);
            }
        }
    }
}

//функция округления размеров панелей с учетом заданной точности
function GetObjSize(size){
    switch (
sizeAccuracy.ItemIndex)  {
        case 
0:
            return 
Math.round(size);
        case 
1:
            return 
Math.trunc(Math.round(size 10)) / 10;
        case 
2:
            return 
Math.trunc(Math.round(size 100)) / 100;
        case 
3:
            return 
Math.trunc(Math.round(size 1000)) / 1000;
    }
}

//функция вывода наименования панелей
function GetObjName(namestrLength){
    if(!
shortenName.Value || strLength >= name.length || strLength == 0){
        return 
name;
    } else if(
shortenName.Value){
        return 
name.slice(0strLength);
    }
}

//функция вывода размеров панелей
function SizesInfo(obj){
    var 
result '';
    var 
round sizeAccuracy.ItemIndex;
    if (
addSize.Value){
        switch(
obj.TextureOrientation){
            case 
0:
                
result += ' ' obj.GSize.x.toFixed(round) + '*' obj.GSize.y.toFixed(round);
                break;
            case 
1:
                
result += ' ' obj.GSize.x.toFixed(round) + '*' obj.GSize.y.toFixed(round);
                break;
            case 
2:
                
result += ' ' obj.GSize.y.toFixed(round) + '*' obj.GSize.x.toFixed(round);
                break;
        }
        if (
result.length && showThickness.Value){
            
result += '*' obj.GSize.z.toFixed(round);
        }
    }
    return 
result;
}

// имя в поз
function NameToPos(obj) {
    
obj.ArtPos GetObjName(obj.NamenameLength.Value) + SizesInfo(obj);
}
// поз в имя
function PosToName(obj) {
    
obj.Name = (obj.ArtPos.length obj.ArtPos SizesInfo(obj) : obj.Name);
}
// имя и поз
function NameAndPos(obj) {
    var 
value GetObjName(obj.NamenameLength.Value) + (obj.ArtPos.length separator prefix obj.ArtPos '') + SizesInfo(obj);
    
obj.Name value;
    
obj.ArtPos value;
}
// размеры в поз
function SizeToPos(obj) {
    
obj.ArtPos = (obj.ArtPos.length prefix obj.ArtPos '') + SizesInfo(obj);
}
// имя, позиция, размер
function NameAndPosAndSize(obj) {
    var 
value GetObjName(obj.NamenameLength.Value) + (obj.ArtPos.length separator prefix obj.ArtPos '') + SizesInfo(obj);
    
obj.ArtPos value;
}
// вызов продолжения скрипта после того, как весь код отработает.

Action.Continue();
// Комбобокс для выбора типа выполнения скрипта
var combo Action.Properties.NewCombo('Тип',
'Наименование в поз.\nПоз. в наименование\nОбъединить наименование и поз.\nРазмеры в поз.\nИмя, позиция, размер');
var 
shortenName Action.Properties.NewBool('Сократить наименование');
    
shortenName.OnValueChange = function(){
        if(
shortenName.Value == true){
            
nameLength.Enabled true
        
} else if (shortenName.Value == false){
            
nameLength.Enabled false
        
}
    }
var 
nameLength Action.Properties.NewNumber('Количество символов наименования');
    
nameLength.Enabled false;
var 
addSize Action.Properties.NewBool('Добавлять размеры');
    
addSize.OnValueChange = function(){
        if(
addSize.Value == true){
            
sizeAccuracy.Enabled true;
            
showThickness.Visible true;
        } else if (
addSize.Value == false){
            
sizeAccuracy.Enabled false;
            
showThickness.Visible false;
        }
    }
var 
sizeAccuracy Action.Properties.NewCombo('Точность размеров''0\n1\n2\n3');
    
sizeAccuracy.Enabled false;
var 
showThickness Action.Properties.NewBool('Указывать толщину панелей');
    
showThickness.Visible false;
var 
processingType Action.Properties.NewCombo('Тип обработки',
    
'Все объекты\nВыделенные объекты\nВыделенные блоки');
Action.Properties.Load('props4.xml');


combo.OnChange = function () {
    switch(
combo.ItemIndex) {
        case 
0:
            
shortenName.Visible true;
            
shortenName.Enabled true;
            
nameLength.Visible true;
            
nameLength.Enabled false;
            
addSize.Visible true;
            
addSize.Value true;
            
addSize.Enabled true;
            
sizeAccuracy.Enabled true;
            break;
        case 
1:
            
shortenName.Visible true;
            
shortenName.Enabled true;
            
nameLength.Visible true;
            
nameLength.Enabled false;
            
addSize.Visible true;
            
addSize.Value true;
            
addSize.Enabled true;
            
sizeAccuracy.Enabled true;
            break;
        case 
2:
            
shortenName.Visible true;
            
shortenName.Enabled true;
            
nameLength.Visible true;
            
nameLength.Enabled false;
            
addSize.Visible true;
            
addSize.Value true;
            
addSize.Enabled true;
            
sizeAccuracy.Enabled true;
            break;
        case 
3:
            
shortenName.Visible false;
            
nameLength.Visible false;
            
addSize.Value true;
            
addSize.Visible false;
            
sizeAccuracy.Enabled true;
            
showThickness.Visible true;
            break;
        case 
4:
            
shortenName.Visible true;
            
shortenName.Enabled true;
            
nameLength.Visible true;
            
nameLength.Enabled false;
            
addSize.Visible false;
            
addSize.Value true;
            
addSize.Enabled true;
            
sizeAccuracy.Enabled true;
            break;
    }
}

// Кнопка запуска основного кода скрипта
Action.Properties.NewButton('Применить').OnClick = function () {
    
// переменная для хранения функции, которая будет обрабатывать объекты
    
var func;
    
// Запись в историю, что скрипт собирается менять модель и все объекты,
    // находящиеся в ней
    
Undo.RecursiveChanging(Model);
    
// В зависимости от выбранного типа назначаем нужную функцию для обработки
    // объектов
    
switch (combo.ItemIndex) {
        case 
0:
            
func NameToPos;
            break;
        case 
1:
            
func PosToName;
            break;
        case 
2:
            
func NameAndPos;
            break;
        case 
3:
            
func SizeToPos;
            break;
        case 
4:
            
func NameAndPosAndSize;
            break;
    }
    
// запускаем обход всех объектов в модели с нужной функцией обработки
    
forEachInList(Modelfunc);
    
// Вызов завершения скрипта
    
Action.Properties.Save('props4.xml');
    
Action.Finish();


Последний раз редактировалось Ovsyanicov; 23.04.2019 в 11:53.
Ovsyanicov вне форума   Ответить с цитированием Вверх
16 пользователя(ей) сказали cпасибо: