Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   Скрипты и функции для МПЛ и Б-Салона 10-11 (https://промебельклуб.рф/forum/showthread.php?t=15377)

АлКузнецов 05.05.2020 20:37

Скрипты и функции для МПЛ и Б-Салона 10-11
 
Доброго дня коллеги.
Как показала практика применения скриптов для Б-Салона v10-11 имеет свои особенности написания и нюансы отладки.

Предлагаю использовать эту ветку для обмена опытом и готовыми решениями.

Добавлено через 15 минут

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

Необходимые функции для работы
PHP код:


  
function okrugl(chn) {
  
// функция округления числа с заданной точностью
  // ch - число
  // n - количество знаков
    
if(isNaN(ch) || isNaN(n)) return false;
    var 
Math.pow(10,n);
  return 
Math.round(ch*m)/m;
}

/** цикл перебора всех элементов модели
 * @param {List3D} list
 * @param {(obj: Object3)=>{}} func
 */
function forEachInList(list, func){
    if (!
func)
        return;
    for (var 
0< list.Counti++){
        var 
obj = list.Objects[i];
        
func(obj);
        if (
obj.List){
            
forEachInList(obj.AsList(), func);
        }
    }


[свернуть]


PHP код:


/*
Функция определяет левое или правое исполнения модуля, которому в МПЛ разрешена симметрия.
Для работы нужен список названий деталей, которые функция определяется как "левая боковина".
*/
function razvorot()
{
var 
0;
var 
pp 0;
forEachInList(TovarItems.TovarModel, function(obj)
{
        switch (
true)
        {
        case 
obj.Name == 'Бок левый':
        
//alert(obj.Name + '' + obj.GMin.x);
        
obj.GMin.x/100;
        
pp okrugl(p0); //устраняем погрешность установки
        
break;
        case 
obj.Name == 'Бок_Б':
        
//alert(obj.Name);
        
obj.GMin.x/100;
        
pp okrugl(p0);    //устранением погрешность установки
        
break;
        }
});
  var 
usl pp == 0;
  
//alert(usl);
 
if(pp == 0)
 {
//alert("L");
 
return "L";}
 else
 {
//alert("R");
 
return "R";}
}

//alert( razvorot()+ " проверен"); //тест функции 

Добавлено через 10 минут
Генерируя артикулы "резиновых" модулей, постоянно требуется не только выбор высоты, но и набор свойств ( в том числе логических) позволяющий подобрать ближайший больший артикул штатный из множества имеющихся

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

высота модуля
PHP код:


/*
функция определения высоты модуля
входящий параметр hY необязателен дает поправку в см на высоту модуля при подборе артикула
Возвращает объект со свойствами
{
chek: true,        // совпадение значения со штатной сеткой размеров
n_: 24,            // назначенная штатная высота 
h_: "X",               // обозначение штатной высоты
rem: ''            // пояснение к артикулу высоты
}

*/
function yM(hY)
{     
//yM: ['X', 'Y', 'Z', 'E', 'B', 'C', 'F', 'G', 'H'];
if (hY<0||hY>0) {var lY hY*1;} else {var lY 0;}   //если у фукции не будет аргумента она равна 0
//alert(lY);
var y_M = {chekfalsen_0h_''rem''};

if (
lY==0){
lY Math.round((TovarItems.TovarModel.GSize.y)/10); // габарит модулия по высоте в см
}else{
lY    lY Math.round((TovarItems.TovarModel.GSize.y)/10); // габарит модуля по высоте в см
}


    switch (
lY){
        case 
24:
        return 
y_M = {chektruen_24h_"X"rem''};
    break;
        case 
36:
        return  
y_M = {chektruen_36h_"Y"rem''};
    break;
        case 
48:
        return 
y_M = {chektruen_48h_"Z"rem''};
    break;
        case 
60:
        return 
y_M = {chektruen_60h_"E"rem''};
    break;
        case 
72:
        return  
y_M = {chektruen_72h_"B"rem''};
    break;
        case 
96:
        return  
y_M = {chektruen_96h_"C"rem''};
    break;
        case 
120:
       return  
y_M = {chektruen_120h_"F"rem''};
    break;
        case 
132:
        return  
y_M = {chektruen_132h_"G"rem''};
    break;
        case 
204:
        return 
y_M = {chektruen_204h_"H"rem''};
    break;
    default:
            switch (
true)
        {
            case 
lY 24:
                return 
y_M = {chekfalsen_24h_"X"rem' уменьшение высоты X'};
            break;
            case 
lY 24 && lY 36:
                return 
y_M = {chekfalsen_36h_"Y"rem' уменьшение высоты Y'};
            break;
            case 
lY 36 && lY 48:
                return 
y_M = {chekfalsen_48h_"Z"rem' уменьшение высоты Z'};
            break;
            case 
lY 48 && lY 60:
                return 
y_M = {chekfalsen_60h_"E"rem' уменьшение высоты E'};
            break;
            case 
lY 60 && lY 72:
                return 
y_M = {chekfalsen_72h_"B"rem' уменьшение высоты B'};
            break;
            case 
lY 72 && lY 96:
                return 
y_M = {chekfalsen_96h_"C"rem' уменьшение высоты C'};
            break;
            case 
lY 96 && lY 120:
                return 
y_M = {chekfalsen_120h_"F"rem' уменьшение высоты F'};
            break;
            case 
lY 120 && lY 132:
                return 
y_M = {chekfalsen_132h_"G"rem' уменьшение высоты G'};
            break;
            case 
lY 132 && lY 204:
                return 
y_M = {chekfalsen_204h_"H"rem' уменьшение высоты H'};
            break;
            default:
            
alert("высота " lY +" технически невыполнима");
        }
    break;
    }

}

//alert("высота " + yM(-2).n_ + " штатная " + " " + yM(-2).h_+  yM(-2).chek + " " +yM(-2).rem ); 

[свернуть]


функция подбора ширины

PHP код:


/*
функция определения ширины модуля
входящий параметр lX необязателен дает поправку в см на ширину модуля при подборе артикула
Возвращает объект со свойствами
{
chek: true,        // совпадение значения со штатной сеткой размеров
n_: 0,            // назначенная штатная ширина 
rem: ''            // пояснение к артикулу ширины
}

*/

function xM(lX)
{     
// xM: [15, 20, 24, 25, 30, 35, 40, 45, 60, 80, 90, 100, 105, 110, 120]
if (lX<0||lX>0) {var __x  lX*1;} else {var __x 0;}   //если у фукции не будет аргумента она равна 0
var x_M = {chekfalsen_0rem''};

if (
__x==0){
__x Math.round((TovarItems.TovarModel.GSize.x)/10); // габарит модулия по ширине в см
}else{
__x    __x Math.round((TovarItems.TovarModel.GSize.x)/10); // габарит модуля по ширине в см
}

    switch (
__x){
        case 
15:
        return 
x_M = {chektruen_15rem''};
    break;
        case 
20:
        return  
x_M = {chektruen_20rem''};
    break;
        case 
24:
        return 
x_M = {chektruen_24rem''};
    break;
        case 
25:
        return 
x_M = {chektruen_25rem''};
    break;
        case 
30:
        return  
x_M = {chektruen_30rem''};
    break;
        case 
35:
        return  
x_M = {chektruen_35rem''};
    break;
        case 
40:
       return  
x_M = {chektruen_40rem''};
    break;
        case 
45:
        return  
x_M = {chektruen_45rem''};
    break;
        case 
60:
        return 
x_M = {chektruen_60rem''};
    break;
        case 
80:
        return 
x_M = {chektruen_80rem''};
    break;
        case 
90:
        return  
x_M = {chektruen_90rem''};
    break;
        case 
100:
        return 
x_M = {chektruen_100rem'?'};
    break;
        case 
105:
        return 
x_M = {chektruen_105rem''};
    break;
        case 
110:
        return  
x_M = {chektruen_110rem''};
    break;
        case 
120:
        return  
x_M = {chektruen_120rem''};
    break;
    default:
            switch (
true)
        {
            case 
__x 15:
                return 
x_M = {chekfalsen_15rem' уменьшение ширины ' +15};
            break;
            case 
__x 15 && __x 20:
                return 
x_M = {chekfalsen_20,  rem' уменьшение ширины'+20};
            break;
            case 
__x 20 && __x 25:
                return 
x_M = {chekfalsen_25rem' уменьшение ширины '+25};
            break;
            case 
__x 25 && __x 30:
                return 
x_M = {chekfalsen_30rem' уменьшение ширины '+30};
            break;
            case 
__x 30 && __x 35:
                return 
x_M = {chekfalsen_30rem' уменьшение ширины '+35};
            break;
            case 
__x 35 && __x 40:
                return 
x_M = {chekfalsen_40rem' уменьшение ширины '+40};
            break;
            case 
__x 40 && __x 45:
                return 
x_M = {chekfalsen_45rem' уменьшение ширины '+45};
            break;
            case 
__x 45 && __x 60:
                return 
x_M = {chekfalsen_60rem' уменьшение ширины '+60};
            break;
            case 
__x 60 && __x 80:
                return 
x_M = {chekfalsen_80rem' уменьшение ширины '+80};
            break;
            case 
__x 80 && __x 90:
                return 
x_M = {chekfalsen_90rem' уменьшение ширины '+90};
            break;
            case 
__x 90 && __x 100:
                return 
x_M = {chekfalsen_100rem' уменьшение ширины '+100};
            break;
            case 
__x 100 && __x 120:
                return 
x_M = {chekfalsen_120rem' уменьшение ширины '+120};
            break;
            default:
            
alert("ширина " __x +" техниески невыполнима");
        }
    break;
    }

}

//alert("ширина " + xM(0).n_ + " штатная " + " " +  xM(0).chek + " - " +xM(0).rem ); //тест функции 

[свернуть]


Функция подбора глубины



/*
функция определения глубины модуля
входящий параметр lZ необязателен дает поправку в см на ширину модуля при подборе артикула
Возвращает объект со свойствами
{
chek: true, // совпадение значения со штатной сеткой размеров
n_: 0, // назначенная штатная глубина
rem: '' // пояснение к артикулу глубины
}

*/
function zM(lZ)
{ //zM: [31, 33, 38, 40, 43, 45, 50, 54, 55, 57, 58, 59, 60, 65];
if (lZ<0||lZ>0) {var __z = lZ*1;} else {var __z = 0;} //если у фукции не будет аргумента она равна 0
var z_M = {chek: false, n_: 0, rem: ''};

if (__z==0){
__z = Math.round((TovarItems.TovarModel.GSize.z)/10); // габарит модулия по глубине в см
}else{
__z = __z + Math.round((TovarItems.TovarModel.GSize.z)/10); // габарит модулия по глубине в см
}

switch (__z){
case 31:
return z_M = {chek: true, n_: 31, rem: ''};
break;
case 33:
return z_M = {chek: true, n_: 33, rem: ''};
break;
case 38:
return z_M = {chek: true, n_: 38, rem: ''};
break;
case 40:
return z_M = {chek: true, n_: 40, rem: ''};
break;
case 43:
return z_M = {chek: true, n_: 43, rem: ''};
break;
case 45:
return z_M = {chek: true, n_: 45, rem: ''};
break;
case 50:
return z_M = {chek: true, n_: 50, rem: ''};
break;
case 54:
return z_M = {chek: true, n_: 54, rem: ''};
break;
case 55:
return z_M = {chek: true, n_: 55, rem: ''};
break;
case 57:
return z_M = {chek: true, n_: 57, rem: ''};
break;
case 58:
return z_M = {chek: true, n_: 58, rem: ''};
break;/**/
case 59:
return z_M = {chek: true, n_: 59, rem: ''};
break;
case 60:
return z_M = {chek: true, n_: 60, rem: ''};
break;
case 65:
return z_M = {chek: true, n_: 65, rem: ''};
break;
default:
switch (true)
{
case __z < 31:
return z_M = {chek: false, n_: 31, rem: ' уменьшение глубины ' +31};
break;
case __z > 31 && __z < 33:
return z_M = {chek: false, n_: 33, rem: ' уменьшение глубины'+33};
break;
case __z > 33 && __z < 45:
return z_M = {chek: false, n_: 45, rem: ' уменьшение глубины '+45};
break;
case __z > 45 && __z < 59:
return z_M = {chek: false, n_: 59, rem: ' уменьшение глубины '+59};
break;
case __z > 59 && __z < 65:
return z_M = {chek: false, n_: 65, rem: ' уменьшение глубины '+65};
break;
default:
alert("глубина " + __z +" каталогом не предусморенна");
}
break;
}

}

//alert("глубина " + zM().n_ + " штатная " + " " + zM().chek + " - " +zM().rem ); //тест функции
[свернуть]

Vanya2012 19.11.2021 09:01

Почему эта тема пустая? Что ни кого не волнует Салон?

bars73 19.11.2021 09:28

Мы работаем в нём. По всем интересующим нас вопросом общаемся с ТП.

3Dkrevetka 22.12.2021 16:05

Всем привет.
Я немного переделал под себя скрипт, прописывающий размеры изделия.
Все бы хорошо, но мне нужно указывать глубину корпуса изделия, а не его общую глубину.
Заднюю стенку и фасад я могу вычесть без проблем, поскольку это фиксированное число.
Но что делать с ручками? Они все разного размера.
Я вижу два пути (конкретно в моем случае):
1) Вычислять габариты ручек и потом вычитать их глубину из общей глубины изделия;
2) Просто указывать глубину самого корпуса (он у меня отдельным блоком настроен).

zorro 22.12.2021 16:48

Вложений: 1
Посмотрите этот скрипт. Обратите внимание на расчет габаритов изделия без учета фурнитуры (ручек, навесов и т.д.) function GetGabLoc(obj)
Там считаются габариты только панелей типа TFurnPanel.


Может это поможет.

АлКузнецов 22.12.2021 21:55

новогодние подарки
 
ссылка на архив примеров функций для МПЛ

rtz пример оперативный массив базы материалов с доп. свойствами (и вообще подключаемого массива данных конвертируемой из exel-таблицы ).

причина написания


Пробовал создавать массив через SQL-запрос к базе:
возникает проблемма отладки: В МПЛ работает, но.. уже в Б-Салоне лично у меня, SQL-запрос — не работает. Вообще. Причину так и не понял.
С чем столкнулся истользуя такие эрзац-таблицы материалов:
  1. если в модели попадается отсуствующий в базе материал — уходит в бесконечный цикл.
  2. даже если все материалы 100% есть в базе, но модель большая и тяжелая... при запросе иногда виснет (наглухо). Ставте логи и таймер остановки скрипта.
  3. с "обрубком" базы в виде "bdMat[++id] ={}"если id меньше 255, скрипт в 99,9% случаев просто летает и стабильно работает. Если id больше 255 немного "тупит", но в любом случае работает.

мой ВЫВОД (как практика, могу быть неправ):
Для использования в Б-Салоне и МПЛ, проще и надёжнее подготовить подключаемый файл js выгрузкой exel-таблицы по образцу, чем через SQL-запрос. К тому же некоторые свойства материала нельзя получить из БМ-Сметы "*.FDB" (например: "плотность", или "Модуль упругости" для прочностных расчётов).
[свернуть]


raschetNST функция расчёта стоимости нестандартного изделия изменённого или собранного из "полуфабрикатов" в редакторе Б-Салона.

применение

Считает подетальную стоимость и массу изделия из модели прайс менеджера. Применяется при "ручном" изменении материалов модели. Может применяться в Б-Мебельщике (нужно заменить "TovarItems.TovarModel"* на "Model")
Готовые результаты использовались на производстве через экспортируемые XLS-файлы.
пример работы — картинки в рахиве raschetNST.note1.jpg и raschetNST.note2.jpg
https://promebelclub.ru/forum/pictur...pictureid=5284
https://promebelclub.ru/forum/pictur...pictureid=5285
[свернуть]


PriceList пример подключаемого прайс-листа изделий.

применение


, например: есть утверждённый каталог "стандартных модулей", а вшитый через МПЛ скрипт изделия должен назначить изделию (эластичному модулю растянутому за флажки), цену — ориентируясь на данный прайс-лист и сгенерированный "артикул изделия".
  1. "ручная цена" эластичных модулей. Необходим,к огда цены модулей назначены политической волей руководства компании, согласно понятным для отдела продаж правилам и алгоритмам ценообразования.
    (С ценами рассчитанными по смете, они не совпадают, как вариант — по политическим мотивам).
  2. цена изделия в зависимости от ( набора материалов, комплекта фурнитуры, образца покраски, дилерской скидке —*т.д. и т.п. (нужное вписать)) имеет несколько комбинаций "стандартной стоимости".
  3. Секретность. Можно легко передать на торговую точку один зашифрованный файл (по №ключа), чтобы обновить цены.
    Кража файла прайс-листа '*.bmz' для Б-салона уже ничего не даёт.
[свернуть]


usefully_MPL — подключаемый сборник полезных функций для МПЛ, чтобы не писать "километровые" скрипты в каждое конкретное изделие. Упрощает отладку усложняет воровство готовых кодов.
Все вопросы "зачем?" и "для чего?" используется та или иная функция — в личку.
// все важные шаги закомментированы (орфографию и громатику пояснений не проверял*PARDON*)

D..._...[...]L пример скрипта для МПЛ записываемый в конкретное изделие

что делает

  1. генерирует артикул изделия, ориентируясь на габарит растянутого за флажки модель изделия.
  2. ведёт "историю надругательств продавца над изделием" в графе "комментарий" .
  3. если артикул стандартный назначает стандартную цену.
  4. пересчитывает цену изделия, если материалы панелей или фурнитура заменялись на более дорогие.
  5. пересчитывает цену изделия, если изделие нестандартное
PS. (важно) для работы модуля нужны все указанные выше файлы.* Проверенные и настроенные
[свернуть]

bazis_noob 22.01.2023 22:27

а как запустить скрипт в салоне? например перебрать все панели в модели.


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

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL