Форум профессиональных мебельщиков PROMEBELclub
 
PROMEBELclub - Форум для мебельщиков: конструкторов, дизайнеров, мастеров, технологов и всех, кто имеет отношение к производству и изготовлению мебели. Программы для конструирования и дизайна мебели. Мебельная литература и обучающие пособия.
 
 

Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты


Реклама на портале PROMEBELclub
Реклама на портале PROMEBELclub

битрикс24 Мебель196. Мебельный интернет-магазин в Екатеринбурге.
Ответ
 
Опции темы Опции просмотра
Старый 13.01.2014, 12:22  
Скрипты. Готовые решения для БМ8-11.
 
Аватар для Igor_482
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 145

Сказал(а) спасибо: 31
Поблагодарили 639 раз(а) в 84 сообщениях
Версия для печати Отправить по электронной почте
Igor_482 Igor_482 вне форума 13.01.2014, 12:22
Рейтинг: (1 голосов - 5.00 средняя оценка)

Этот раздел предназначен для размещения готовых скриптов.
Здесь находятся ТОЛЬКО готовые скрипты. Для обсуждения есть отдельная тема: Обсуждение готовых скриптов.

Авторам:
  1. Давать уникальные названия скриптам (не совпадающие с названием уже выложенных скриптов, за исключением обновлений скрипта)
  2. Указывать работоспособность в разных версиях БМ.
  3. Общее описание работы скрипта.

Версии, указанные модератором, как прошедшие проверку:
8 - Демо-версия 8.0.7.9649
- "народная" 8.0.12.12765
9 - Демо-версия 9.0.8.18908
10 - Демо-версия 10.0.0.21602

Обратите внимание на полезные ответы в этой теме!


Последний раз редактировалось Letos; 11.05.2018 в 16:23..
Просмотров: 67912
Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Uncle (25.12.2017)
Старый 14.10.2020, 21:59   #71
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 91
Сказал(а) спасибо: 18
Поблагодарили 16 раз(а) в 7 сообщениях
Вес репутации: 27
sergio1982 на пути к лучшему
По умолчанию Подсчёт кромки и площади


Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок всей модели, или выделенного (подсвеченная фурнитура включительно).

Скрытый текст

Код:
/*
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок

http://promebelclub.ru/forum/showthread.php?p=501280#post501280
*/

var Selected = Model.SelectionCount
var string = '';
array = [];
Panels = [];
PanelsSquare = [];
Linears = [];
LinearsLenght = [];
Extrusion = [];
ExtrusionLenght = [];
Edges = [];
EdgesLength = [];
Fastener = [];
FastenerLenght = [];

for (var i = 0; i < Model.Count; ++i) {
    recurse(Model.Objects[i])
};

for (var i = 0; i < array.length; ++i) {
    CheckObj(array[i])
};

function CheckObj(obj) {
    if (!obj)
        return
    var objtype = obj.toString()
    if (obj.AsPanel) {
        MtName = obj.MaterialName.replace("\r", " арт. ");
        Butts = obj.Butts;
        Contour = obj.Contour;
        IsLinear = obj.MaterialWidth > 0 // погонный
        if (IsLinear)
            Index = Linears.indexOf(MtName);
        else
            Index = Panels.indexOf(MtName);
        if (Index < 0 && !IsLinear) {
            Index = Panels.push(MtName) - 1;
            PanelsSquare[Index] = 0;
        } else if (Index < 0 && IsLinear) {
            Index = Linears.push(MtName) - 1;
            LinearsLenght[Index] = 0;
        }
        if (IsLinear)
            LinearsLenght[Index] += (Contour.Width / 1000)
        else
            PanelsSquare[Index] += (Contour.Height * Contour.Width / 1000000);

        for (var i = 0; i < Butts.Count; ++i) {
            Sign = Butts[i].Material.replace("\r", " арт. ");
            Index = Edges.indexOf(Sign);
            if (Index < 0) {
                Index = Edges.push(Sign) - 1;
                EdgesLength[Index] = 0;
            }
            Length = GetButtLength(Butts[i], Contour);
            EdgesLength[Index] += Length;
        }
    } else if (objtype == '[object TFastener]') {
        MtName = obj.Name.replace("\r", " арт. ");
        Index = Fastener.indexOf(MtName);
        if (Index < 0) {
            Index = Fastener.push(MtName) - 1;
            FastenerLenght[Index] = 0;
        }
        FastenerLenght[Index] += 1
    } else if (objtype == '[object TExtrusionBody]') { // профиль
        MtName = obj.MaterialName.replace("\r", " арт. ");
        Contour = obj.Contour;
        Index = Extrusion.indexOf(MtName);
        if (Index < 0) {
            Index = Extrusion.push(MtName) - 1;
            ExtrusionLenght[Index] = 0;
        }
        ExtrusionLenght[Index] += (obj.GSize.z / 1000)
    }
}


if (Selected)
    string += 'ИНФО ТОЛЬКО О ВЫДЕЛЕННЫХ И ПОДСВЕЧЕННЫХ!!!\n\n'

if (Edges.length) {
    string += '\n\n              Кромка (метры):\n\n';
    for (var i = 0; i < Edges.length; ++i) {
        if ((EdgesLength[i] / 1000).toFixed(1) > 0)
            string += Edges[i] + '   =   ' + (EdgesLength[i] / 1000).toFixed(1) + '\n'
    };
}
if (Panels.length) {
    string += '\n\n              Панели (квадратные/метры):\n\n';
    for (var i = 0; i < Panels.length; ++i) {
        if (PanelsSquare[i].toFixed(1) > 0)
            string += Panels[i] + '   =   ' + PanelsSquare[i].toFixed(1) + '\n'
    };
}
if (Linears.length) {
    string += '\n\n              Погонные материалы (метры):\n\n';
    for (var i = 0; i < Linears.length; ++i) {
        if (LinearsLenght[i].toFixed(1) > 0)
            string += Linears[i] + '   =   ' + LinearsLenght[i].toFixed(1) + '\n'
    };
}
if (Extrusion.length) {
    string += '\n\n              Профили (метры):\n\n';
    for (var i = 0; i < Extrusion.length; ++i) {
        if (ExtrusionLenght[i].toFixed(1) > 0)
            string += Extrusion[i] + '   =   ' + ExtrusionLenght[i].toFixed(1) + '\n'
    };
}
if (Fastener.length) {
    string += '\n\n              Фурнитура (штуки):\n\n';
    for (var i = 0; i < Fastener.length; ++i) {
        string += Fastener[i] + '   =   ' + FastenerLenght[i] + '\n'
    };
}

if (!Edges.length && !Panels.length && !Linears.length && !Extrusion.length && !Fastener.length) {
    if (Selected)
        alert('Нет выделенных панелей!')
    else
        alert('Панели не обнаружены!')
} else
    alert(string)




function recurse(obj, sel) {
    if (!obj.List) {
        if (!sel)
            sel = !!((Selected) && (obj.Selected || obj.Highlighted))
        if (Selected && !sel)
            return
        array.push(obj)
    } else {
        var blocksel = !!((Selected) && (obj.Selected || obj.Highlighted))
        for (var i = 0; i < obj.Count; i++) {
            recurse(obj[i], blocksel)
        }
    }
}

function GetButtLength(butt, contour) {
    var index = butt.ElemIndex;
    var elem = contour.Objects[index];
    return elem.ObjLength();
}
[свернуть]

Последний раз редактировалось sergio1982; 14.10.2020 в 22:55.
sergio1982 вне форума   Ответить с цитированием Вверх
6 пользователя(ей) сказали cпасибо:
Старый 14.10.2020, 22:22   #72
АлКузнецов
Пользователь
 
Аватар для АлКузнецов
 
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 80
Сказал(а) спасибо: 42
Поблагодарили 226 раз(а) в 51 сообщениях
Вес репутации: 158
АлКузнецов - весьма и весьма положительная личностьАлКузнецов - весьма и весьма положительная личностьАлКузнецов - весьма и весьма положительная личность
По умолчанию

скрипт из двух форм генерирующий название видов покраски и красящий детали согласно ценовой группе. Внимание скрипт определяет ценовую группу по цифрам артикула материала.

для каждой ценовой группы свой список расцветок и эффектов покраски.

Скрытый текст

покраска
PHP код:
//форма выбора набора красок и эффектов


function Ztifr(txtn) {
  
// функция возвращает цифры из куска строки
  // ch - число
  // n - количество знаков слева
    
var ets txt.substring(0n);
    
//alert(ets);
    
return parseInt(ets.match(/d+/));
}

Materials = [];
PanelByMaterial = [];
var 
PanelChanged 0;


Model.forEachPanel(
    function(
Obj) {
    var 
MtName Ztifr(ExtractMatCode(Obj.MaterialName), 50);
    if (
MtName >=1)
    {}else{
MtName "";}
        var 
Index Materials.indexOf(MtName);
        if (
Index 0) {
            
Index Materials.push(MtName) - 1;
            var 
Panels = [];
            
PanelByMaterial.push(Panels);
        }
        
PanelByMaterial[Index].push(Obj);
    });

function 
GetKrask(__k) {
    
// функция возвращает списки красски и отделки получив цифру ценовой группы
    
var kras = [];
    var 
effe = [];

        switch (
__k){
            case 
1:
            
kraska = ["""эмаль_АВОРИО""эмаль_АКВА""эмаль_АКВАМАРИН""эмаль_АНТРАЦИТ""эмаль_БАЗАЛЬТ""эмаль_БЕЖЕВЫЙ""эмаль_БЕЛЫЙ""эмаль_БОРДО""эмаль_ВАНИЛЬ""эмаль_ВОЛНА""эмаль_ГАВАНА""эмаль_ГЛИНЯНЫЙ""эмаль_ГОЛУБОЙ""эмаль_ГРАНАТ""эмаль_ГРИДЖИО""эмаль_ДИП БЛЕК""эмаль_ЕЖЕВИКА СО СЛИВКАМИ""эмаль_ЖЕЛТЫЙ""эмаль_ЗЕЛЕНЫЙ""эмаль_КАКАО""эмаль_КАППУЧИНО""эмаль_КВАРЦ""эмаль_КОРДА""эмаль_КОФЕ""эмаль_КРАСНЫЙ""эмаль_КРЕМ""эмаль_ЛАЙМ""эмаль_ЛАЙТ ГРЕЙ""эмаль_ЛАТТЕ""эмаль_МАРЕНГО""эмаль_МАСЛО""эмаль_МОЛОКО""эмаль_ОБЛАКО""эмаль_ОЛИВКОВО-СЕРЫЙ""эмаль_ОПАЛ""эмаль_ОРАНЖЕВЫЙ""эмаль_ПЕПЕЛЬНЫЙ""эмаль_ПЕТРОЛ""эмаль_РУБИНОВЫЙ""эмаль_СВЕТЛО-СЕРЫЙ""эмаль_СЕРО-БЕЖЕВЫЙ""эмаль_СЕРЫЙ""эмаль_СЕРЫЙ ЖЕМЧУГ""эмаль_СИНИЙ""эмаль_СИРЕНЬ""эмаль_СЛИВКИ""эмаль_СНЕЖНЫЙ""эмаль_ТЕМНО-СЕРЫЙ""эмаль_ТЕПЛЫЙ БЕЖ""эмаль_ТОПЛЕНОЕ МОЛОКО""эмаль_ТУРЕЦКАЯ ЛАЗУРЬ""эмаль_ФИСТАШКОВЫЙ""эмаль_ЧЕРНЫЙ""эмаль_ШОКОЛАД""эмаль_СЕРЕБРИСТЫЙ"];
            
effekt = [""'&матовая','&глянец','&Велюр','&X-matt'];
                break;
            case 
2:
            
kraska = ["""эмаль_АВОРИО""эмаль_АКВА""эмаль_АКВАМАРИН""эмаль_АНТРАЦИТ""эмаль_БАЗАЛЬТ""эмаль_БЕЖЕВЫЙ""эмаль_БЕЛЫЙ""эмаль_БОРДО""эмаль_ВАНИЛЬ""эмаль_ВОЛНА""эмаль_ГАВАНА""эмаль_ГЛИНЯНЫЙ""эмаль_ГОЛУБОЙ""эмаль_ГРАНАТ""эмаль_ГРИДЖИО""эмаль_ДИП БЛЕК""эмаль_ЕЖЕВИКА СО СЛИВКАМИ""эмаль_ЖЕЛТЫЙ""эмаль_ЗЕЛЕНЫЙ""эмаль_КАКАО""эмаль_КАППУЧИНО""эмаль_КВАРЦ""эмаль_КОРДА""эмаль_КОФЕ""эмаль_КРАСНЫЙ""эмаль_КРЕМ""эмаль_ЛАЙМ""эмаль_ЛАЙТ ГРЕЙ""эмаль_ЛАТТЕ""эмаль_МАРЕНГО""эмаль_МАСЛО""эмаль_МОЛОКО""эмаль_ОБЛАКО""эмаль_ОЛИВКОВО-СЕРЫЙ""эмаль_ОПАЛ""эмаль_ОРАНЖЕВЫЙ""эмаль_ПЕПЕЛЬНЫЙ""эмаль_ПЕТРОЛ""эмаль_РУБИНОВЫЙ""эмаль_СВЕТЛО-СЕРЫЙ""эмаль_СЕРО-БЕЖЕВЫЙ""эмаль_СЕРЫЙ""эмаль_СЕРЫЙ ЖЕМЧУГ""эмаль_СИНИЙ""эмаль_СИРЕНЬ""эмаль_СЛИВКИ""эмаль_СНЕЖНЫЙ""эмаль_ТЕМНО-СЕРЫЙ""эмаль_ТЕПЛЫЙ БЕЖ""эмаль_ТОПЛЕНОЕ МОЛОКО""эмаль_ТУРЕЦКАЯ ЛАЗУРЬ""эмаль_ФИСТАШКОВЫЙ""эмаль_ЧЕРНЫЙ""эмаль_ШОКОЛАД""эмаль_СЕРЕБРИСТЫЙ""эмаль_ЗОЛОТОЙ МЕТ.""эмаль_ШАМПАНЬ МЕТ."];
            
effekt = ["""&матовая""&глянец""&Велюр""&X-matt""&металлик"];
                break;
            case 
3:
            
kraska = ["""шпон_FL ВЕНГЕ""шпон_FL ВЕНГЕ РАДИАЛЬНЫЙ""шпон_FL ГРЕЦКИЙ ОРЕХ""шпон_FL ДЕРЕВО ЭБЕНОВОЕ""шпон_FL ДУБ КАКАО""шпон_FL ЗЕБРАНО ""шпон_FL ЗЕБРАНО ГРАФИТ""шпон_FL ИНДИЙСКИЙ ЭБЕН""шпон_FL ОРЕХ ФРАНЦУЗСКИЙ""шпон_FL ПАЛИСАНДР""шпон_FL ПАЛИСАНДР ОГНЕННЫЙ""шпон_FL ПАЛИСАНДР РИО""шпон_FL ТИК""шпон_ДУБ НАТУРАЛЬНЫЙ""шпон_АМЕРИКАНСКИЙ ОРЕХ""шпон_ЕВРОПЕЙСКИЙ ОРЕХ""шпон_ОЛИВКОВЫЙ ЯСЕНЬ""шпон_СЕРЫЙ ГРАБ""шпон_ТИГРОВЫЙ ЭБЕН""шпон_АМЕРИКАНСКИЙ ОРЕХ 3D""шпон_ДУБ ВИНТАЖ 3D""шпон_ДУБ НАТУРАЛЬНЫЙ 3D""шпон_ЭВКАЛИПТ 3D""шпон_ЭВКАЛИПТ МОРЕНЫЙ 3D"];
            
effekt = ["""&ЭКО""&матовый  Открытая пора""& полиэфир матовый""&глянец"];
                break;
            case 
4:
            
kraska = ["""шпон_ДУБ БЕЛОГО ЦВЕТА""шпон_ДУБ В ЦВЕТЕ ВЕНГЕ""шпон_ДУБ ГЛИНЯНОГО ЦВЕТА""шпон_ДУБ МАСЛЯННОГО ЦВЕТА""шпон_ДУБ ОЛИВКОВОГО ЦВЕТА""шпон_ДУБ СЕРЫЙ ЖЕМЧУГ""шпон_ДУБ ЧЕРНЫЙ""шпон_ДУБ КОНЬЯК 3D""шпон_ДУБ ЛЕН 3D""шпон_ДУБ ПЕПЕЛ 3D""шпон_ДУБ СЕРЫЙ 3D""шпон_ДУБ ТАБАККО 3D""шпон_ДУБ УМБРА 3D"];
            
effekt = ["""&окрашенный матовый"''];
                break;
            case 
5:
            
kraska = ["""эмаль_СИРЕНЕВЫЙ МЕТ.""эмаль_МЕТАЛЛ АНТИК""эмаль_МЕТАЛЛ""эмаль_БЕЛЫЙ ПЕРЛАМУТР""эмаль_БОЛОТНЫЙ МЕТ.""эмаль_ГОЛУБОЙ МЕТ.""эмаль_ЖЕМЧУГ""эмаль_ЗЕЛЕНЫЙ МЕТ. ""эмаль_РОЗОВО-БЕЖЕВЫЙ МЕТ.""эмаль_РОЗОВЫЙ МЕТ.""эмаль_САЛАТОВЫЙ МЕТ.""эмаль_СВЕТЛО-СИРЕНЕВЫЙ МЕТ.""эмаль_ГРАФФИТИ""эмаль_ЭЛЬДОРАДО ГОЛД"];
            
effekt = ["""&металлик""&cпецэффект"];
                break;
            case 
6:
            
kraska = ["""шпон_FL ВЕНГЕ""шпон_FL ВЕНГЕ РАДИАЛЬНЫЙ""шпон_FL ГРЕЦКИЙ ОРЕХ""шпон_FL ДЕРЕВО ЭБЕНОВОЕ""шпон_FL ДУБ КАКАО""шпон_FL ЗЕБРАНО ""шпон_FL ЗЕБРАНО ГРАФИТ""шпон_FL ИНДИЙСКИЙ ЭБЕН""шпон_FL ОРЕХ ФРАНЦУЗСКИЙ""шпон_FL ПАЛИСАНДР""шпон_FL ПАЛИСАНДР ОГНЕННЫЙ""шпон_FL ПАЛИСАНДР РИО""шпон_FL ТИК""шпон_ДУБ НАТУРАЛЬНЫЙ""шпон_АМЕРИКАНСКИЙ ОРЕХ""шпон_ЕВРОПЕЙСКИЙ ОРЕХ""шпон_ОЛИВКОВЫЙ ЯСЕНЬ""шпон_СЕРЫЙ ГРАБ""шпон_ТИГРОВЫЙ ЭБЕН"];
            
effekt = ["""&ЭКО""&матовый  Открытая пора ""& полиэфир матовый""& глянец"];
                break;
            case 
7:
            
kraska = ["""шпон_МАКАССАР - LIGHT""шпон_ДУБ БОРДО С МЕДНОЙ ПАТИНОЙ""шпон_ОЛИВА - LIGHT""шпон_ЗИРИКОТЕ - LIGHT""шпон_ДУБ ЧЕРНЫЙ С СЕРЕБРЯНОЙ ПАТИН""шпон_ВЕНГЕ НАТУРАЛЬНЫЙ""шпон_ПАЛИСАНДР ВОСТОЧНЫЙ""шпон_РЕД ГАМ""шпон_САНТОС ПАЛИСАНДР""шпон_ТИК НАТУРАЛЬНЫЙ""шпон_МАКАССАР"];
            
effekt = ["""&Натуральный матовый""&полиэфир матовый""&полиэфир глянец"];
                break;
            case 
8:
            
kraska = ["""шпон_ЗИРИКОТЕ - LIGHT""шпон_ДУБ АВОРИО С КОРИЧНЕВОЙ ПАТИНОЙ""шпон_ДУБ БОРДО С МЕДНОЙ ПАТИНОЙ""шпон_ДУБ ЧЕРНЫЙ С БОРДОВОЙ ПАТИНОЙ""шпон_ДУБ ЧЕРНЫЙ С ЗОЛОТОЙ ПАТИНОЙ""шпон_ДУБ ЧЕРНЫЙ С СЕРЕБРЯНОЙ ПАТИНОЙ"];
            
effekt = ["""&полиэфир матовый""&полиэфир глянец"];
                break;
            case 
9:
            
kraska = ["""шпон_ВЕНГЕ НАТУРАЛЬНЫЙ""шпон_ПАЛИСАНДР ВОСТОЧНЫЙ""шпон_РЕД ГАМ""шпон_САНТОС ПАЛИСАНДР""шпон_ТИК НАТУРАЛЬНЫЙ""шпон_ОЛИВА""шпон_МАКАССАР"];
            
effekt = ["""&ЭКО""&матовый  Открытая пора ""& полиэфир матовый""& глянец"];
                break;
            case 
10:
            
kraska = ["""нет данных"];
            
effekt = ["""нет эффектов"];
                break;
            case 
11:
            
kraska = ["""эмаль_БЕТОН АНТРАЦИТ""эмаль_БЕТОН ДЖАСП""эмаль_МЕДЬ АНТИК""эмаль_ЛАТУНЬ АНТИК""эмаль_СТАЛЬ""шпон_МАКАССАР""шпон_ОЛИВА"];
            
effekt = ["""&METALL""&бетон"];
                break;
            case 
12:
            
kraska = ["""шпон_ЗИРИКОТЕ"];
            
effekt = ["""&полиэфир матовый""&полиэфир глянец"];
                break;
        default:
        
alert'Вы не выбрали ценовую группу' );
        break;
                    }
    var 
otdelka = {kraskraskaeffeeffekt };
return 
otdelka;
};

//-- window Window2
Window2 = { Form NewForm() };
Props Window2.Form.Properties;
Window2.Form.Width 245;
Window2.Form.Height 150;
Window2.Form.Caption "Ценовая группа?";
Window2.Form.OKButton true;
Window2.Form.CancelButton false;
Window2.Form.Resizable true;
//-- window Window2 properties

Window2.Combo1 Props.NewCombo("ценовая группа","");
Window2.Combo1.SetLayout(54220622);
Window2.Combo1.ComboItems Materials;

Window2.Label1 Props.NewLabel("выверите ценовую гриппу");
Window2.Label1.SetLayout(52031922);
//-- window Window2 events

//-- window Window2 ends
Window2.Form.ShowModal();
        var 
_k Ztifr(Window2.Combo1.Value3) ;
      
// alert ("выбрана ценовая группа " + _k );
//-- window Window1
Window1 = { Form NewForm() };
Props Window1.Form.Properties;
Props Window1.Form.Properties;
Window1.Form.Width 400;
Window1.Form.Height 220;
Window1.Form.Caption "покраска";
Window1.Form.OKButton true;
Window1.Form.Resizable true;
Window1.Form.CancelButton false;
Window1.Form.MinHeight 180;

Window1.Form.CancelButton true;
Window1.Form.OKButton true;
//-- window Window1 properties

Window1.Combo1 Props.NewCombo("отделки","");
Window1.Combo1.SetLayout(241629422);
Window1.Combo1.ComboItems GetKrask(_k).kras;
Window1.Combo2 Props.NewCombo("эффекты","");
Window1.Combo2.SetLayout(245129422);
Window1.Combo2.ComboItems GetKrask(_k).effe;
Window1.usl Props.NewBool("выбрать панели вручную",false);
Window1.usl.SetLayout(2310829522);
//-- window Window1 events

//-- window Window1 ends

Window1.Form.ShowModal();


var 
Pan;
var 
ruch Window1.usl.Value//значение ручного выбора
var _n Window2.Combo1.Value//значение ценовой группы
    
_n Ztifr_n5);
var 
_i 0;         // счетчик окрашенных панелей

if (ruch//выбрать вручную окраску панелей
{

BtnStop NewButtonInput("Закончить");
var 
knop true;
var 
plastMat;
// выполняем выделение в бесконечном цикле
// при нажатии на отмену команды скрипт все равно завершится, т.к.
// он вызывает функцию GetObject()

while (knop) {
    
BtnStop.OnChange = function() {
    
//alert('Нажата Кнопка "Закончить"');
           
return knop false;
           }
    if (
knop) {
    
Pan GetPanel("Укажите панель");

    }else  {
        
alert('конец скрипта');
        }
    
// условие Pan.Plastics. проверяет,
    // что у выбранной не свойства пластик
        
if (ZcnGr(Pan_n)) {
    if (
Pan.Plastics.Count == 0) {
        
Pan.AddPlastic(plastMattrue);
        
plastMat Pan.Plastics.Plastics[0];
        
plastMat.Material Window1.Combo1.Value Window1.Combo2.Value;
        
plastMat.Thickness 0.1;
        ++
_i;
        
Pan.Color 100;
        
Pan.Selected true;
        }
     else  {
        
alert('Панель уже покрашена');
        }
    } else  {
        
alert('Панель другой ценовой группы');
        }

    }

}
else
{

Model.forEachPanel(function(Pan) {
    if (
ZcnGr(Pan_n))
    if (
Pan.Plastics.Count == 0) {
        
Pan.AddPlastic(plastMattrue);
        
plastMat Pan.Plastics.Plastics[0];
        
plastMat.Material Window1.Combo1.Value Window1.Combo2.Value;
        
plastMat.Thickness 0.1;
        
Pan.Color 200;
        
Pan.Selected true;
        ++
_i;
        }


});
alert("окрашено " _i +" панелей " _n +" цн.гр. ");
}


function 
ZcnGr(objnGr) {
    var 
artiqul ExtractMatCode(obj.MaterialName);    //извлекаем артикул из названия материала
    
var tzGr Ztifr(artiqul100);                    //извлекаем цифры из артикула материала
if (tzGr == nGr)
    { return 
true;
    }
else
    {return 
false;
    }

[свернуть]


скрипт может быть интересен, если вам нужно создавать формы-пользователя с динамически обновляемыми списками.

работает в 10 и 11 версиях
__________________
С уважением Кузнецов Александр
АлКузнецов вне форума   Ответить с цитированием Вверх
Старый 15.10.2020, 05:47   #73
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 91
Сказал(а) спасибо: 18
Поблагодарили 16 раз(а) в 7 сообщениях
Вес репутации: 27
sergio1982 на пути к лучшему
По умолчанию ключи - значения объекта


Выводит в свойства ключи - значения объекта, значения можно изменить и применить. Если значение является объектом, можно перейти к нему по ссылке. Можно переходить к родительскому объекту, и возвращаться обратно.
Если у функции есть параметры, сначала появятся поля для ввода параметров и кнопка Call - вызвать с указанными параметрами, Cancel - отменить вызов, иначе функция запустится сразу, будет выведен возврат функции, если функция вернёт объект, будет предложено перейти к нему.
Есть вывод результатов в файл и открытие файла в редакторе по умолчанию.

Скрытый текст



Код:
/*
http://promebelclub.ru/forum/showthread.php?p=501293#post501293

Просмотр свойств объекта

typeobject - объект исследования
    1 - выделенный
    2 - по указанию
    3 - указанный в переменной myobject

FunctionInclude - нужно ли отображать функции в результатах

Кнопки на панели инструментов
    Owner - перейти к родительскому объекту
    Return - вернутся к предыдущему
    Export - сохраняет данные в файл
*/

var typeobject = 2

if (typeobject == 3)
    var myobject = Action.Properties

var FunctionInclude = 1

// -------------------------------------------------

if (typeobject == 1 && !Model.Selected) {
    alert('Нужно выделить панели')
    Action.Finish();
}
if (typeobject == 1)
    var targetobject = Model.Selected
else if (typeobject == 2)
    var targetobject = GetObject("Укажите объект")
else if (typeobject == 3)
    var targetobject = myobject

if (!(targetobject instanceof Object))
    Action.Cancel();

var history = [];
var InputParam = [];
var argslenght = 0;
var text = '';
var Prop = Action.Properties;
parse();
NewButtonInput('Owner').OnChange = ButtonOwner
NewButtonInput('Return').OnChange = ButtonReturn
NewButtonInput('Update').OnChange = function () {parse()}
NewButtonInput('Export').OnChange = ButtonExport
NewButtonInput('Exit').OnChange = function () {Action.Finish()}
ButtonCall = NewButtonInput('Call')
ButtonCall.Visible = 0
ButtonCall.OnChange = OnButtonCall
ButtonCallCancel = NewButtonInput('Cancel')
ButtonCallCancel.Visible = 0
ButtonCallCancel.OnChange = CallBarHide
Action.Continue();


function parse() {
    text = targetobject + '\r\n\r\n';
    Prop.Capacity = 0
    Prop.NewString(targetobject)
    for (var key in targetobject) {
        obj = targetobject[key]
        if (!FunctionInclude && (obj instanceof Function))
            continue
        if ((obj instanceof Function)) {
            c = Prop.NewButton(obj)
            c.Name = key
            c.OnClick = OnClickFunction.bind(c, obj)
        } else if (obj instanceof Object) {
            c = Prop.NewButton(obj)
            c.Name = key
            c.OnClick = OnClick.bind(c, obj)
        } else {
            c = Prop.NewString(key, obj)
            c.OnChange = OnChange.bind(c, key)
        }
        text += key + '\t\t\t' + obj + '\r\n'
    }
}

function OnChange(key) {
    if (isNaN(Number(this.Value)))
        Value = this.Value
    else
        Value = parseFloat(this.Value)
    targetobject[key] = Value
    if (typeof targetobject.Build == 'function')
        targetobject.Build()
    Action.Commit();
}

function OnClick(obj) {
    history.push(targetobject)
    targetobject = obj
    parse();
}

function ButtonReturn() {
    if (!history.length)
        return alert('история пуста')
    targetobject = history.pop(targetobject)
    parse();
}

function ButtonOwner() {
    if (!targetobject.Owner)
        return alert('родительский объект отсутствует')
    history.push(targetobject)
    targetobject = targetobject.Owner
    parse();
}

function OnClickFunction(obj) {
    if (obj.length > 0)
        return CallBarShow(obj)
    argslenght = 0;
    FunctionCall(obj)
}

function FunctionCall(obj) {
    try {
        if (argslenght) {
            args = []
            for (var k = 0; k < argslenght; k++) {
                args.push(InputParam[k].Value)
            }
            r = obj.apply(targetobject, args);
        }
        else
            r = obj.call(targetobject)
    }
    catch (e) {
        alert(e)
        return 1
    }
    if (r instanceof Object) {
        b = confirm('Перейти к ' + r);
        if (b)
            return OnClick(r)
        return 1
    }
    alert(r)
}

function CallBarShow(obj) {
    CallBarObj = obj
    CallBarCheck(obj.length)
    for (var k = 0; k < obj.length; k++) {
        InputParam[k].Value = 0
        InputParam[k].Visible = 1;
    }
    ButtonCall.Visible = 1;
    ButtonCallCancel.Visible = 1;
}

function CallBarCheck(i) {
    argslenght = i;
    if (InputParam.length >= i)
        return
    for (var k = InputParam.length; k < i; k++) {
        InputParam[k] = NewNumberInput('arg ' + (k + 1));
        InputParam[k].Visible = 0;
    }
}

function CallBarHide() {
    for (var k = 0; k < InputParam.length; k++) {
        InputParam[k].Visible = 0
    }
    ButtonCall.Visible = 0
    ButtonCallCancel.Visible = 0
}

function OnButtonCall() {
    CallBarHide()
    FunctionCall(CallBarObj)
}

function ButtonExport() {
    shell = NewCOMObject('WScript.Shell')
    system.writeTextFile('export.txt', text);
    shell.run('explorer export.txt');
}
[свернуть]

Последний раз редактировалось sergio1982; 16.10.2020 в 00:20.
sergio1982 вне форума   Ответить с цитированием Вверх
Старый 19.10.2020, 02:16   #74
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 91
Сказал(а) спасибо: 18
Поблагодарили 16 раз(а) в 7 сообщениях
Вес репутации: 27
sergio1982 на пути к лучшему
По умолчанию ключи - значения объекта


Скрытый текст

2-я версия, добавлена поддержка перебора TJSIndexedProperty.
Иногда это не работает, или нет гарантии что выведен весь массив, у этого объекта неизвестно кол-во полей, обращение к несуществующему полю может привести к зависанию, отлов ошибки не работает. В таких случаях кол-во можно ввести в ручную, если массив уже открыт, можно нажать Update.
Предыдущий пост можно удалить.
[свернуть]


Выводит в свойства ключи - значения объекта, значения можно изменить и применить. Если значение является объектом, можно перейти к нему по ссылке. Можно переходить к родительскому объекту, и возвращаться обратно. Выводит путь в подсказке (но это не точно).
Если у функции есть параметры, сначала появятся поля для ввода параметров и кнопка Call - вызвать с указанными параметрами, Cancel - отменить вызов, иначе функция запустится сразу (к функциям без параметров в начале на кнопке добавлены ">>"), будет выведен возврат функции, если функция вернёт объект, будет предложено перейти к нему.
Есть вывод результатов в файл и открытие файла в редакторе по умолчанию.

CODE



Код:
/*
http://promebelclub.ru/forum/showthread.php?p=501450#post501450

Просмотр свойств объекта

typeobject - объект исследования
    1 - выделенный
    2 - по указанию
    3 - указанный в переменной myobject

FunctionInclude - нужно ли отображать функции в результатах

Элементы управления на панели инструментов
    Owner - перейти к родительскому объекту
    Return - вернутся к предыдущему
    Update - обновить данные о объекте
    Export - сохраняет данные в файл, и открывает его в редакторе по умолчанию
    Highlighted - подсветить объект
    Exit - завершить скрипт
    IPCount - кол-во элементов для TJSIndexedProperty.
        Если автоматически определяет неправильно, то можно указать своё значение.
*/

var typeobject = 3

if (typeobject == 3) {
    var myobject = Model
}
var FunctionInclude = 1

// -------------------------------------------------

if (typeobject == 1 && !Model.Selected) {
    alert('Нужно выделить панели')
    Action.Finish();
}
if (typeobject == 1)
    var targetobject = Model.Selected
else if (typeobject == 2)
    var targetobject = GetObject("Укажите объект")
else if (typeobject == 3)
    var targetobject = myobject


if (!(targetobject instanceof Object))
    Action.Cancel();

var history = [];
var InputParam = [];
var argslenght = 0;
var text = '';
var Path = []
var Prop = Action.Properties;

ViewPath(1, targetobject)
parse();

NewButtonInput('Owner').OnChange = ButtonOwner
NewButtonInput('Return').OnChange = ButtonReturn
NewButtonInput('Update').OnChange = function () {OnClickObject(targetobject, '', 1)}
NewButtonInput('Export').OnChange = ButtonExport
NewButtonInput('Highlighted').OnChange = OnHighlighted
NewButtonInput('Exit').OnChange = function () {Action.Finish()}
ButtonCallDelimiter = NewButtonInput(' | ')
IndexedCount = NewNumberInput('IPCount');
ButtonCallDelimiter = NewButtonInput(' | ')
ButtonCallDelimiter.Visible = 0
ButtonCallCancel = NewButtonInput('Cancel')
ButtonCallCancel.Visible = 0
ButtonCallCancel.OnChange = CallBarHide
ButtonCall = NewButtonInput('Call')
ButtonCall.Visible = 0
ButtonCall.OnChange = OnButtonCall
Action.Continue();

function AddItem(key, obj) {
    if (!FunctionInclude && (obj instanceof Function))
        return
    if ((obj instanceof Function)) {
        c = Prop.NewButton((!obj.length ? ' >> ' : ' ') + obj.toString().replace("\n", ""))
        c.Name = key
        c.OnClick = OnClickFunction.bind(c, obj)
    } else if (obj instanceof Object) {
        c = Prop.NewButton(obj)
        c.Name = key
        c.OnClick = OnClickObject.bind(c, obj, key, 0)
    } else {
        c = Prop.NewString(key, obj)
        c.OnChange = OnChange.bind(c, key)
    }
    text += key + '\t\t\t' + obj + '\r\n'
}

function parse(Count) {
    text = ''
    Prop.Capacity = 0
    cString = Prop.NewString(targetobject)
    cString.ReadOnly = 1
    if (Count) {
        for (var i = 0; i < Count; ++i) {
            AddItem('[' + i + (targetobject[i].Name === undefined || targetobject[i].Name == '' ? ']' : ' - ' + targetobject[i].Name + ']'), targetobject[i])
        }
    } else {
        Count = 0
        for (var key in targetobject) {
            ++Count
            AddItem(key, targetobject[key])
        }
    }
    text = targetobject + '    Count: ' + Count + '    Path: ' + Path.join('.') + '\r\n\r\n' + text
    cString.Value = 'Count: ' + Count
}

function OnChange(key) {
    if (isNaN(Number(this.Value)))
        Value = this.Value
    else
        Value = parseFloat(this.Value)
    targetobject[key] = Value
    if (typeof targetobject.Build == 'function')
        targetobject.Build()
    Action.Commit();
}

function OnClickObject(obj, name, nopath) {
    if (!(obj instanceof Object))
        return
    Count = 0
    try {
        _Count = (IndexedCount.Value || obj.___Count || targetobject[name.slice(0, -1) + 'Count']
            || targetobject[name + 'Count'] || targetobject['Count'])
        if ((obj instanceof TJSIndexedProperty) && _Count) {
            Count = _Count
            obj.___Count = Count
        }
    }
    catch (e) {}

    if (nopath !== 1) {
        ViewPath(1, name)
		history.push(targetobject)
		targetobject = obj
	}
    parse(Count)
}

function ButtonReturn() {
    if (!history.length)
        return alert('история пуста')
    targetobject = history.pop()
    ViewPath(0)
    if (targetobject.___Count)
        parse(targetobject.___Count)
    else
        parse();
}

function ButtonOwner() {
    if (!targetobject.Owner)
        return alert('родительский объект отсутствует')
    OnClickObject(targetobject.Owner, 'Owner', 0)
}

function OnClickFunction(obj) {
    CallBarHide()
    if (obj.length > 0)
        return CallBarShow(obj)
    argslenght = 0;
    FunctionCall(obj, this.Name)
}

function FunctionCall(obj, Name) {
    try {
        if (argslenght) {
            args = []
            for (var k = 0; k < argslenght; k++) {
                args.push(InputParam[k].Value)
            }
            r = obj.apply(targetobject, args);
        }
        else
            r = obj.call(targetobject)
    }
    catch (e) {
        alert(e)
        return 1
    }
    if (r instanceof Object) {
        b = confirm('Перейти к ' + r);
        if (b)
            return OnClickObject(r, Name + '()', 0)
        return 1
    }
    alert(r)
}

function CallBarShow(obj) {
    CallBarObj = obj
    CallBarCheck(obj.length)
    for (var k = 0; k < obj.length; k++) {
        InputParam[k].Value = 0
        InputParam[k].Visible = 1;
    }
    ButtonCallDelimiter.Visible = 1
    ButtonCall.Visible = 1;
    ButtonCallCancel.Visible = 1;
}

function CallBarCheck(i) {
    argslenght = i;
    if (InputParam.length >= i)
        return
    for (var k = InputParam.length; k < i; k++) {
        InputParam[k] = NewNumberInput('arg ' + (k + 1));
        InputParam[k].Visible = 0;
    }
}

function CallBarHide() {
    for (var k = 0; k < InputParam.length; k++) {
        InputParam[k].Visible = 0
    }
    ButtonCallDelimiter.Visible = 0
    ButtonCall.Visible = 0
    ButtonCallCancel.Visible = 0
}

function OnButtonCall() {
    CallBarHide()
    FunctionCall(CallBarObj)
}
function OnHighlighted() {
    Model.UnHighlightAll()
    targetobject.Highlighted = 1
}

function ButtonExport() {
    system.writeTextFile('export.txt', text);
    var file = '"' + Action.Properties.AbsolutePath() + 'export.txt"'
    NewCOMObject('WScript.Shell').run(file);
}

function ViewPath(add, key) {
    if (add)
        Path.push(key == '' ? targetobject : key)
    else
        Path.pop()
    Action.Hint = Path.join('.')
}
[свернуть]

Последний раз редактировалось sergio1982; 19.10.2020 в 20:36.
sergio1982 вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Старый 21.10.2020, 16:52   #75
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 91
Сказал(а) спасибо: 18
Поблагодарили 16 раз(а) в 7 сообщениях
Вес репутации: 27
sergio1982 на пути к лучшему
По умолчанию Подсчёт кромки и площади


Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок всей модели, или выделенного (подсвеченная фурнитура включительно).

2 версия
+ Добавлен общий вес и объём панелей. Смотрите функцию WeightAndVolumeCalc. В данном примере если в имени материала есть "стекло" (в любом регистре) - то используется коэффициент Q_STEKLO, иначе Q_LDSP.
Для вычисления коэффициента вводим в калькулятор веса мебельных фасадов 1000х1000х1000, после миллиард делим на полученные килограммы.
+ Добавлен вывод в файл, надо в сообщении нажать - "Нет", должно открыться в редакторе по умолчанию.
+ Выбор нужно ли добавлять артикул к имени материала.
+ Причесал код.

v2.03
bugfix - не считались вложенные блоки в выделенном.

v2.05

Добавлена возможность исключений в функции MyRules.



Пример: при добавлении ящика из мастера ящиков направляющие создаются в виде профиля, из материала 'Напр. п/в, DB 45 L 450\r9081 Направляющая правая' (или левая). Заменив код в MyRules, они считаются фурнитурой.

Код:
 
function MyRules(obj) {
    if (obj.toString() == '[object TExtrusionBody]'
    && (found = obj.MaterialName.match(/^Напр\. п\/в.*?L (\d*)\r\d* Направляющая (правая|левая)$/))) {
        if (found[2] == 'левая')
            return 1
        MtName = 'Направляющая ' + found[1]
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 1
        return 1
    }
    return 0
}

более общий пример

Код:
function MyRules(obj) {
    if (obj.toString() == '[object TExtrusionBody]'
    && (obj.MaterialName.match(/Направляющая (правая|левая)$/i))) {
        MtName = 'Направляющая ' + obj.Thickness
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 0.5
        return 1
    }
    return 0
}
[свернуть]


[свернуть]

код



Код:
/*
v2.10
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок

http://promebelclub.ru/forum/showthread.php?p=501567#post501567
*/

var AddArticul = 1  // нужно ли добавлять артикул к имени материала

var Q_LDSP = 1333333.333333
var Q_MDF = 1111111.111111
var Q_STEKLO = 400000

var Selected = Model.SelectionCount;
var Panels = [];
var Linears = [];
var Extrusions = [];
var Edges = [];
var Fasteners = [];
var WeightAndVolume = {Weight:0, Volume:0};
var Buffer = [];

for (var i = 0; i < Model.Count; ++i) {
    recurse(Model.Objects[i])
};

for (var key in Buffer) {
    CheckObj(Buffer[key])
};

function CheckObj(obj) {
    if (MyRules(obj))
        return
    var objtype = obj.toString()
    if (obj.AsPanel) {
        MtName = MaterialName(obj.MaterialName)
        Contour = obj.Contour;
        if (obj.MaterialWidth > 0) { // погонный
            CheckProp(Linears, MtName)
            Linears[MtName] += Math.max(Contour.Height, Contour.Width)
        }
        else {
            CheckProp(Panels, MtName)
            Panels[MtName] += (Contour.Height * Contour.Width)
            WeightAndVolumeCalc(Contour.Height * Contour.Width * obj.Thickness, MtName)
        }
        Butts = obj.Butts;
        for (var i = 0; i < Butts.Count; ++i) {
            MtName = MaterialName(Butts[i].Material)
            CheckProp(Edges, MtName)
            Edges[MtName] += GetButtLength(Butts[i], Contour)
        };
    }
    else if (objtype == '[object TFastener]') { // фурнитура
        MtName = MaterialName(obj.Name)
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 1
    }
    else if (objtype == '[object TExtrusionBody]') { // профиль
        MtName = MaterialName(obj.MaterialName)
        CheckProp(Extrusions, MtName)
        Extrusions[MtName] += obj.Thickness
    }
}

var string = '';
if (Object.keys(Edges).length) {
    string += '\n              Кромка (метры):\n\n';
    for (var key in Edges) {
        AddString(key, (Edges[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Panels).length) {
    string += '\n              Панели (квадратные метры):\n\n';
    for (var key in Panels) {
        AddString(key, (Panels[key] / 1000000).toFixed(2))
    };
}
if (Object.keys(Linears).length) {
    string += '\n              Погонные материалы (метры):\n\n';
    for (var key in Linears) {
        AddString(key, (Linears[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Extrusions).length) {
    string += '\n              Профили (метры):\n\n';
    for (var key in Extrusions) {
        AddString(key, (Extrusions[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Fasteners).length) {
    string += '\n              Фурнитура (штуки):\n\n';
    for (var key in Fasteners) {
        string += key + '   =   ' + Fasteners[key] + '\n'
    };
}
if (WeightAndVolume.Volume > 0) {
    string += '\n              Вес и объём (только панели):\n\n';
    string += (WeightAndVolume.Weight).toFixed(1) + ' килограмм\n'
    string += (WeightAndVolume.Volume / 1000000000).toFixed(3) + ' кубических метров'
}

if (string =='') {
    alert('Объекты не обнаружены!')
}
else {
    var isselstring = ''
    if (Selected)
        isselstring = 'ИНФО ТОЛЬКО О ВЫДЕЛЕННЫХ И ПОДСВЕЧЕННЫХ!!!\n\n'
    if (!confirm(isselstring + string + '\n\n\n              Чтобы вывести в файл нажмите "Нет"'))
        ButtonExport()
}
Action.Finish()

// -------------------------------------------------

function recurse(obj, sel) {
    if (!obj.List) {
        if (!sel)
            sel = !!((Selected) && (obj.Selected || obj.Highlighted))
        if (Selected && !sel)
            return
        Buffer.push(obj)
    } else {
        var blocksel = !!((Selected) && (sel || obj.Selected || obj.Highlighted))
        for (var i = 0; i < obj.Count; i++) {
            recurse(obj[i], blocksel)
        }
    }
}

function CheckProp(arr, key) {
    if (!arr.hasOwnProperty(key))
        arr[key] = 0
}

function ButtonExport() {
    system.writeTextFile('export.txt', string);
    Path = '"' + Action.Properties.AbsolutePath() + 'export.txt"'
    NewCOMObject('WScript.Shell').run(Path);
}

function GetButtLength(butt, contour) {
    return contour.Objects[butt.ElemIndex].ObjLength()
}

function AddString(key, value) {
    if (value > 0)
        string += key + '   =   ' + value + '\n'
}

function MaterialName(str) {
    if (AddArticul)
        return str.replace("\r", ". Артикул ")
    return str.replace(/\r.*/, '')
}

function WeightAndVolumeCalc(vol, name) {
    if (name.match(/стекло/i))
        Q = Q_STEKLO
    else
        Q = Q_LDSP
    WeightAndVolume.Weight += vol / Q
    WeightAndVolume.Volume += vol
}

function MyRules(obj) {
    return 0
}
[свернуть]

Последний раз редактировалось sergio1982; 22.10.2020 в 01:56.
sergio1982 вне форума   Ответить с цитированием Вверх
5 пользователя(ей) сказали cпасибо:
andronf (21.10.2020), kostiaarh (21.10.2020), rostder (24.10.2020), sibmebel (21.10.2020), v22884 (28.10.2020)
Старый 26.10.2020, 00:24   #76
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 91
Сказал(а) спасибо: 18
Поблагодарили 16 раз(а) в 7 сообщениях
Вес репутации: 27
sergio1982 на пути к лучшему
По умолчанию Изменение размера выделенных панелей


Изменяет размер выделенных панелей. Полезно для кромлёных панелей.
Можно установить нужный размер, или добавить или отнять от текущего размера каждой панели.
Также это удобно и для некромлёных панелей, при изменении нескольких панелей с разными размерами.
Толщина - если -1, то не изменять

Баг - Иногда изменяет положение панели. Закономерность бага не понятна.

Скрытый текст



Код:
/*
http://promebelclub.ru/forum/showthread.php?p=501720#post501720

Изменяет размер выделенных панелей. Полезно для кромлёных панелей.
Можно установить нужный размер, или добавить или отнять от текущего размера каждой панели.
Также это удобно и для некромлёных панелей, при изменении нескольких панелей с разными размерами.
Толщина - если -1, то не изменять
Баг - Иногда изменяет положение панели. Закономерность бага не понятна.
*/

if (Model.SelectionCount < 1) {
    alert('Нужно выделить панели')
    Action.Finish();
}
var stringLenght = [];
var stringWidth = [];
var stringThickness = [];

for (var i = 0; i < Model.SelectionCount; i++) {
    Recurse(Model.Selections[i], AddSize)
}
if (stringWidth.length < 1) {
    alert('Нужно выделить панели')
    Action.Finish();
}
Prop = Action.Properties;
Dir = Prop.NewCombo(' ', 'Установить\nПрибавить\nОтнять')
Prop.NewButton('Все равномерно').OnClick = function() {
    DirWidth.Value = 'Равномерно'
    DirLenght.Value = 'Равномерно'
}
Prop.NewString(stringLenght.join(';'), 'Длинна').ReadOnly = true
DirLenght = Prop.NewCombo('Направление изменения', 'Вверх\nВниз\nРавномерно')
newLenght = Prop.NewNumber(' ', 0);
Prop.NewString(stringWidth.join(';'), 'Ширина').ReadOnly = true
DirWidth = Prop.NewCombo('Направление изменения', 'Вправо\nВлево\nРавномерно')
newWidth = Prop.NewNumber(' ', 0);
Thickness = Prop.NewNumber('Толщина  ' + stringThickness.join(';'), 0);
Thickness.Value = -1

Prop.NewButton('Применить').OnClick = function() {
    for (var i = 0; i < Model.SelectionCount; i++) {
        Recurse(Model.Selections[i], MakePanel)
    }
    Action.Commit();
};

Prop.NewButton('Закончить').OnClick = function() {
    Action.Finish();
};

Action.Continue();

function Recurse(obj, fun) {
    if (obj.AsPanel) {
        fun.call(this, obj)
    } else if (obj.List) {
        for (var i = 0; i < obj.Count; i++) {
            Recurse(obj[i], fun)
        }
    }
}

function AddSize(p) {
    stringWidth.push(p.Contour.Width.toFixed(1))
    stringLenght.push(p.Contour.Height.toFixed(1))
    stringThickness.push(p.Thickness.toFixed(1))
}

function MakePanel(p) {
    StartEditing(p);
    if (Dir.Value == 'Установить') {
        Width = (newWidth.Value) ? newWidth.Value : p.Contour.Width;
        Lenght = (newLenght.Value) ? newLenght.Value : p.Contour.Height;
        if (Thickness.Value >= 0)
            p.Thickness = Thickness.Value
    } else if (Dir.Value == 'Прибавить') {
        Width = p.Contour.Width + newWidth.Value;
        Lenght = p.Contour.Height + newLenght.Value;
        if (Thickness.Value >= 0)
            p.Thickness = p.Thickness + Thickness.Value
    } else if (Dir.Value == 'Отнять') {
        Width = p.Contour.Width - newWidth.Value;
        Lenght = p.Contour.Height - newLenght.Value;
        if (Thickness.Value >= 0)
            p.Thickness = p.Thickness - Thickness.Value
    }
    xMove = (DirWidth.Value == 'Вправо') ? 0 : (DirWidth.Value == 'Влево') ? ((Width - p.Contour.Width) * -1) : (((Width - p.Contour.Width) / 2) * -1)
    yMove = (DirLenght.Value == 'Вверх') ? 0 : (DirLenght.Value == 'Вниз') ? ((Lenght - p.Contour.Height) * -1) : (((Lenght - p.Contour.Height) / 2) * -1)

    p.Contour.Fit(0, 0, Width, Lenght);
    p.Contour.Move(xMove, yMove);
};
[свернуть]

Последний раз редактировалось sergio1982; 26.10.2020 в 18:38.
sergio1982 вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Alexey.84 (26.10.2020)
Ответ

Нижняя навигация
Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАЗИС 9 - Скрипты Igor_482 Базис-мебельщик. Скрипты 1430 01.10.2020 19:32
БАЗИС 10 - Скрипты systland Базис-мебельщик. Скрипты 556 29.08.2020 22:17
Заявки на скрипты dr_john Система БАЗИС 37 01.03.2016 10:36


Текущее время: 22:33. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
© 2007-2020 PROMEBEL