|
|
|
|
05.05.2020, 20:37
|
#1
|
Скрипты и функции для МПЛ и Б-Салона 10-11
АлКузнецов
Местный
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 104
Сказал(а) спасибо: 56
Поблагодарили 276 раз(а) в 63 сообщениях
05.05.2020, 20:37
Рейтинг:
()
Доброго дня коллеги.
Как показала практика применения скриптов для Б-Салона v10-11 имеет свои особенности написания и нюансы отладки.
Предлагаю использовать эту ветку для обмена опытом и готовыми решениями.
Добавлено через 15 минут
Скрытый текст
Необходимые функции для работы
PHP код:
function okrugl(ch, n) { // функция округления числа с заданной точностью // ch - число // n - количество знаков if(isNaN(ch) || isNaN(n)) return false; var m = 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 i = 0; i < list.Count; i++){ var obj = list.Objects[i]; func(obj); if (obj.List){ forEachInList(obj.AsList(), func); } } }
[свернуть]
PHP код:
/* Функция определяет левое или правое исполнения модуля, которому в МПЛ разрешена симметрия. Для работы нужен список названий деталей, которые функция определяется как "левая боковина". */ function razvorot() { var p = 0; var pp = 0; forEachInList(TovarItems.TovarModel, function(obj) { switch (true) { case obj.Name == 'Бок левый': //alert(obj.Name + '' + obj.GMin.x); p = obj.GMin.x/100; pp = okrugl(p, 0); //устраняем погрешность установки break; case obj.Name == 'Бок_Б': //alert(obj.Name); p = obj.GMin.x/100; pp = okrugl(p, 0); //устранением погрешность установки 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 = {chek: false, n_: 0, h_: '', 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 = {chek: true, n_: 24, h_: "X", rem: ''}; break; case 36: return y_M = {chek: true, n_: 36, h_: "Y", rem: ''}; break; case 48: return y_M = {chek: true, n_: 48, h_: "Z", rem: ''}; break; case 60: return y_M = {chek: true, n_: 60, h_: "E", rem: ''}; break; case 72: return y_M = {chek: true, n_: 72, h_: "B", rem: ''}; break; case 96: return y_M = {chek: true, n_: 96, h_: "C", rem: ''}; break; case 120: return y_M = {chek: true, n_: 120, h_: "F", rem: ''}; break; case 132: return y_M = {chek: true, n_: 132, h_: "G", rem: ''}; break; case 204: return y_M = {chek: true, n_: 204, h_: "H", rem: ''}; break; default: switch (true) { case lY < 24: return y_M = {chek: false, n_: 24, h_: "X", rem: ' уменьшение высоты X'}; break; case lY > 24 && lY < 36: return y_M = {chek: false, n_: 36, h_: "Y", rem: ' уменьшение высоты Y'}; break; case lY > 36 && lY < 48: return y_M = {chek: false, n_: 48, h_: "Z", rem: ' уменьшение высоты Z'}; break; case lY > 48 && lY < 60: return y_M = {chek: false, n_: 60, h_: "E", rem: ' уменьшение высоты E'}; break; case lY > 60 && lY < 72: return y_M = {chek: false, n_: 72, h_: "B", rem: ' уменьшение высоты B'}; break; case lY > 72 && lY < 96: return y_M = {chek: false, n_: 96, h_: "C", rem: ' уменьшение высоты C'}; break; case lY > 96 && lY < 120: return y_M = {chek: false, n_: 120, h_: "F", rem: ' уменьшение высоты F'}; break; case lY > 120 && lY < 132: return y_M = {chek: false, n_: 132, h_: "G", rem: ' уменьшение высоты G'}; break; case lY > 132 && lY < 204: return y_M = {chek: false, n_: 204, h_: "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 = {chek: false, n_: 0, rem: ''};
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 = {chek: true, n_: 15, rem: ''}; break; case 20: return x_M = {chek: true, n_: 20, rem: ''}; break; case 24: return x_M = {chek: true, n_: 24, rem: ''}; break; case 25: return x_M = {chek: true, n_: 25, rem: ''}; break; case 30: return x_M = {chek: true, n_: 30, rem: ''}; break; case 35: return x_M = {chek: true, n_: 35, rem: ''}; break; case 40: return x_M = {chek: true, n_: 40, rem: ''}; break; case 45: return x_M = {chek: true, n_: 45, rem: ''}; break; case 60: return x_M = {chek: true, n_: 60, rem: ''}; break; case 80: return x_M = {chek: true, n_: 80, rem: ''}; break; case 90: return x_M = {chek: true, n_: 90, rem: ''}; break; case 100: return x_M = {chek: true, n_: 100, rem: '?'}; break; case 105: return x_M = {chek: true, n_: 105, rem: ''}; break; case 110: return x_M = {chek: true, n_: 110, rem: ''}; break; case 120: return x_M = {chek: true, n_: 120, rem: ''}; break; default: switch (true) { case __x < 15: return x_M = {chek: false, n_: 15, rem: ' уменьшение ширины ' +15}; break; case __x > 15 && __x < 20: return x_M = {chek: false, n_: 20, rem: ' уменьшение ширины'+20}; break; case __x > 20 && __x < 25: return x_M = {chek: false, n_: 25, rem: ' уменьшение ширины '+25}; break; case __x > 25 && __x < 30: return x_M = {chek: false, n_: 30, rem: ' уменьшение ширины '+30}; break; case __x > 30 && __x < 35: return x_M = {chek: false, n_: 30, rem: ' уменьшение ширины '+35}; break; case __x > 35 && __x < 40: return x_M = {chek: false, n_: 40, rem: ' уменьшение ширины '+40}; break; case __x > 40 && __x < 45: return x_M = {chek: false, n_: 45, rem: ' уменьшение ширины '+45}; break; case __x > 45 && __x < 60: return x_M = {chek: false, n_: 60, rem: ' уменьшение ширины '+60}; break; case __x > 60 && __x < 80: return x_M = {chek: false, n_: 80, rem: ' уменьшение ширины '+80}; break; case __x > 80 && __x < 90: return x_M = {chek: false, n_: 90, rem: ' уменьшение ширины '+90}; break; case __x > 90 && __x < 100: return x_M = {chek: false, n_: 100, rem: ' уменьшение ширины '+100}; break; case __x > 100 && __x < 120: return x_M = {chek: false, n_: 120, rem: ' уменьшение ширины '+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 ); //тест функции
[свернуть]
__________________
С уважением Кузнецов Александр
|
Просмотров: 12866
|
5 пользователя(ей) сказали cпасибо:
|
|
19.11.2021, 09:01
|
#2
|
Новичок
Регистрация: 25.10.2016
Адрес: Люберцы
Сообщений: 4
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
|
Почему эта тема пустая? Что ни кого не волнует Салон?
|
|
|
19.11.2021, 09:28
|
#3
|
Новичок
Регистрация: 19.08.2012
Адрес: Ульяновск
Сообщений: 6
Сказал(а) спасибо: 85
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
|
Мы работаем в нём. По всем интересующим нас вопросом общаемся с ТП.
__________________
С наилучшими пожеланиями bars73
|
|
|
22.12.2021, 16:05
|
#4
|
Новичок
Регистрация: 23.09.2021
Сообщений: 5
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
|
Всем привет.
Я немного переделал под себя скрипт, прописывающий размеры изделия.
Все бы хорошо, но мне нужно указывать глубину корпуса изделия, а не его общую глубину.
Заднюю стенку и фасад я могу вычесть без проблем, поскольку это фиксированное число.
Но что делать с ручками? Они все разного размера.
Я вижу два пути (конкретно в моем случае):
1) Вычислять габариты ручек и потом вычитать их глубину из общей глубины изделия;
2) Просто указывать глубину самого корпуса (он у меня отдельным блоком настроен).
|
|
|
22.12.2021, 16:48
|
#5
|
VIP
Регистрация: 18.01.2008
Сообщений: 1,047
Сказал(а) спасибо: 2,864
Поблагодарили 1,854 раз(а) в 435 сообщениях
Вес репутации: 697
|
Посмотрите этот скрипт. Обратите внимание на расчет габаритов изделия без учета фурнитуры (ручек, навесов и т.д.) function GetGabLoc(obj)
Там считаются габариты только панелей типа TFurnPanel.
Может это поможет.
|
|
|
Пользователь сказал cпасибо:
|
|
22.12.2021, 21:55
|
#6
|
Местный
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 104
Сказал(а) спасибо: 56
Поблагодарили 276 раз(а) в 63 сообщениях
Вес репутации: 213
|
новогодние подарки
ссылка на архив примеров функций для МПЛ
rtz пример оперативный массив базы материалов с доп. свойствами (и вообще подключаемого массива данных конвертируемой из exel-таблицы ).
причина написания
Пробовал создавать массив через SQL-запрос к базе:
возникает проблемма отладки: В МПЛ работает, но.. уже в Б-Салоне лично у меня, SQL-запрос — не работает. Вообще. Причину так и не понял.
С чем столкнулся истользуя такие эрзац-таблицы материалов: - если в модели попадается отсуствующий в базе материал — уходит в бесконечный цикл.
- даже если все материалы 100% есть в базе, но модель большая и тяжелая... при запросе иногда виснет (наглухо). Ставте логи и таймер остановки скрипта.
- с "обрубком" базы в виде "bdMat[++id] ={}"если id меньше 255, скрипт в 99,9% случаев просто летает и стабильно работает. Если id больше 255 немного "тупит", но в любом случае работает.
мой ВЫВОД (как практика, могу быть неправ):
Для использования в Б-Салоне и МПЛ, проще и надёжнее подготовить подключаемый файл js выгрузкой exel-таблицы по образцу, чем через SQL-запрос. К тому же некоторые свойства материала нельзя получить из БМ-Сметы "*.FDB" (например: "плотность", или "Модуль упругости" для прочностных расчётов).
[свернуть]
raschetNST функция расчёта стоимости нестандартного изделия изменённого или собранного из "полуфабрикатов" в редакторе Б-Салона.
применение
Считает подетальную стоимость и массу изделия из модели прайс менеджера. Применяется при "ручном" изменении материалов модели. Может применяться в Б-Мебельщике (нужно заменить "TovarItems.TovarModel"* на "Model")
Готовые результаты использовались на производстве через экспортируемые XLS-файлы.
пример работы — картинки в рахиве raschetNST.note1.jpg и raschetNST.note2.jpg
[свернуть]
PriceList пример подключаемого прайс-листа изделий.
применение
, например: есть утверждённый каталог "стандартных модулей", а вшитый через МПЛ скрипт изделия должен назначить изделию (эластичному модулю растянутому за флажки), цену — ориентируясь на данный прайс-лист и сгенерированный "артикул изделия". - "ручная цена" эластичных модулей. Необходим,к огда цены модулей назначены политической волей руководства компании, согласно понятным для отдела продаж правилам и алгоритмам ценообразования.
(С ценами рассчитанными по смете, они не совпадают, как вариант — по политическим мотивам).
- цена изделия в зависимости от ( набора материалов, комплекта фурнитуры, образца покраски, дилерской скидке —*т.д. и т.п. (нужное вписать)) имеет несколько комбинаций "стандартной стоимости".
- Секретность. Можно легко передать на торговую точку один зашифрованный файл (по №ключа), чтобы обновить цены.
Кража файла прайс-листа '*.bmz' для Б-салона уже ничего не даёт.
[свернуть]
usefully_MPL — подключаемый сборник полезных функций для МПЛ, чтобы не писать "километровые" скрипты в каждое конкретное изделие. Упрощает отладку усложняет воровство готовых кодов.
Все вопросы "зачем?" и "для чего?" используется та или иная функция — в личку.
// все важные шаги закомментированы (орфографию и громатику пояснений не проверял)
D..._...[...]L пример скрипта для МПЛ записываемый в конкретное изделие
что делает
- генерирует артикул изделия, ориентируясь на габарит растянутого за флажки модель изделия.
- ведёт "историю надругательств продавца над изделием" в графе "комментарий" .
- если артикул стандартный назначает стандартную цену.
- пересчитывает цену изделия, если материалы панелей или фурнитура заменялись на более дорогие.
- пересчитывает цену изделия, если изделие нестандартное
PS. (важно) для работы модуля нужны все указанные выше файлы.* Проверенные и настроенные
[свернуть]
__________________
С уважением Кузнецов Александр
Последний раз редактировалось АлКузнецов; 22.12.2021 в 22:35.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
22.01.2023, 22:27
|
#7
|
Новичок
Регистрация: 18.12.2020
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
|
а как запустить скрипт в салоне? например перебрать все панели в модели.
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 17:57. Часовой пояс GMT +3.
|