Более свежая версия, в которой:
// - оптимизировано отображение пунктов на панели свойств в зависимости от выбранного режима работы скрипта и активированных чекбоксов
// - функция 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 i = 0; i < list.Count; i++) {
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(name, strLength){
if(!shortenName.Value || strLength >= name.length || strLength == 0){
return name;
} else if(shortenName.Value){
return name.slice(0, strLength);
}
}
//функция вывода размеров панелей
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 > 1 && showThickness.Value){
result += '*' + obj.GSize.z.toFixed(round);
}
}
return result;
}
// имя в поз
function NameToPos(obj) {
obj.ArtPos = GetObjName(obj.Name, nameLength.Value) + SizesInfo(obj);
}
// поз в имя
function PosToName(obj) {
obj.Name = (obj.ArtPos.length > 0 ? obj.ArtPos + SizesInfo(obj) : obj.Name);
}
// имя и поз
function NameAndPos(obj) {
var value = GetObjName(obj.Name, nameLength.Value) + (obj.ArtPos.length > 0 ? separator + prefix + obj.ArtPos : '') + SizesInfo(obj);
obj.Name = value;
obj.ArtPos = value;
}
// размеры в поз
function SizeToPos(obj) {
obj.ArtPos = (obj.ArtPos.length > 0 ? prefix + obj.ArtPos : '') + SizesInfo(obj);
}
// имя, позиция, размер
function NameAndPosAndSize(obj) {
var value = GetObjName(obj.Name, nameLength.Value) + (obj.ArtPos.length > 0 ? 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(Model, func);
// Вызов завершения скрипта
Action.Properties.Save('props4.xml');
Action.Finish();
}