Форум профессиональных мебельщиков 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..
Просмотров: 66365
Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Uncle (25.12.2017)
Старый 14.10.2020, 21:59   #71
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 89
Сказал(а) спасибо: 18
Поблагодарили 14 раз(а) в 6 сообщениях
Вес репутации: 25
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 сообщениях
Вес репутации: 157
АлКузнецов - весьма и весьма положительная личностьАлКузнецов - весьма и весьма положительная личностьАлКузнецов - весьма и весьма положительная личность
По умолчанию

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

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

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

покраска
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
Сообщений: 89
Сказал(а) спасибо: 18
Поблагодарили 14 раз(а) в 6 сообщениях
Вес репутации: 25
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
Сообщений: 89
Сказал(а) спасибо: 18
Поблагодарили 14 раз(а) в 6 сообщениях
Вес репутации: 25
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
Сообщений: 89
Сказал(а) спасибо: 18
Поблагодарили 14 раз(а) в 6 сообщениях
Вес репутации: 25
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 вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
andronf (21.10.2020), kostiaarh (21.10.2020), rostder (Вчера), sibmebel (21.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


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


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