|
|
|
|
|
25.12.2017, 23:12
|
|
Обсуждение готовых скриптов
Letos
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,034 раз(а) в 367 сообщениях
25.12.2017, 23:12
Рейтинг:
()
Здесь можно обсуждать скрипты из темы Готовые решения для БМ8-2021.
Обратите внимание на полезные ответы в этой теме!
Последний раз редактировалось Uncle; 04.07.2021 в 15:03..
|
Просмотров: 231517
|
29.04.2020, 14:25
|
#111
|
Пользователь
Регистрация: 31.01.2014
Адрес: г. Одесса
Сообщений: 58
Сказал(а) спасибо: 84
Поблагодарили 28 раз(а) в 17 сообщениях
Вес репутации: 136
|
Добрый день.
Существует готовый скрипт облицовки видимых панелей:
Butt = Action.Properties.NewButt('Кромка');
Btn = Butt.NewButton('Накатать').OnClick = function() {
Model.forEachPanel(
function(Obj) {
if (Obj.Butts.Count === 1) {
for (var i = 0; i < Obj.Contour.Count; i++) {
if (Obj.IsButtVisible(i, 5)) {
StartEditing(Obj)
Obj.AddButt(Butt, i);
}
}
}
})
Action.Finish();
}
Action.Continue();
Если к примеру, присутствует ДВП, которое полностью закрывает торец детали, то такой торец считается невидимым, и при выполнении скрипта, кромка на него не наносится. Но, если ДВП накладывается не полностью, к примеру 1 мм торца виден, то эта панель уже считается видимой. Скажите, пожалуйста, что надо дописать в скрипте, чтобы можно было выбирать эти самые критерии , по которым бы определялось видимый торец или нет? Спасибо.
|
|
|
29.04.2020, 15:17
|
#112
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,034 раз(а) в 367 сообщениях
Вес репутации: 346
|
Цитата:
Сообщение от Alexnail
Скажите, пожалуйста, что надо дописать в скрипте, чтобы можно было выбирать эти самые критерии , по которым бы определялось видимый торец или нет? Спасибо.
|
В вызове функции
Код:
Obj.IsButtVisible(i, 5)
нужно 5 поменять на нужно число. Этот параметр отвечает за максимальную дистанцию от кромки до объекта, при которой кромка считается закрытой.
|
|
|
Пользователь сказал cпасибо:
|
|
30.04.2020, 10:19
|
#113
|
Пользователь
Регистрация: 31.01.2014
Адрес: г. Одесса
Сообщений: 58
Сказал(а) спасибо: 84
Поблагодарили 28 раз(а) в 17 сообщениях
Вес репутации: 136
|
Цитата:
Сообщение от Letos
В вызове функции
Код:
Obj.IsButtVisible(i, 5)
нужно 5 поменять на нужно число. Этот параметр отвечает за максимальную дистанцию от кромки до объекта, при которой кромка считается закрытой.
|
Спасибо. Но немного не то. Указанная функция отвечает за то, на сколько удаленная от торца детали, деталь которая с ней соприкасается (т.е. за дистанцию от кромки до объекта, при которой кромка считается закрытой.) (Рис.1). А вот в моем вопросе немного по - другому. Как дать понять программе, что этот торец считается невидимым? (Рис.2)
|
|
|
30.04.2020, 15:42
|
#114
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,034 раз(а) в 367 сообщениях
Вес репутации: 346
|
Цитата:
Сообщение от Alexnail
А вот в моем вопросе немного по - другому. Как дать понять программе, что этот торец считается невидимым?
|
Только вручную. Дополнил ваш код тремя функциями - проверка числа на нахождение в заданном отрезке значений, проверка закрыта ли кромка отдельной панелью и проверка, закрыта ли кромка вообще. Также изменил условие проверки кромок. Проверка примитивная - проверяются только элементы-линии и может некорректно работать, если панели расположены не ортогонально (т.е. не под углом 90°)
Новый код
PHP код:
function InRange(value, min, max) {
//Точность
const eps = 0.1;
return value > min - eps && value < max + eps;
}
/**
* Проверка, накрывает ли панель определённую кромку другой панели
* @param {number} elemindex Индекс элемента контура
* @param {Panel} buttPanel Панель, которой принадлежит элемент
* @param {Panel} checkPanel Панель, которая может накрывать кромку
*/
function IsButtClosedWithPanel(elemindex, buttPanel, checkPanel) {
var checkMin = buttPanel.ToObject(checkPanel.GabMin);
var checkMax = buttPanel.ToObject(checkPanel.GabMax);
// Проверяем, находится ли панель кромки на одном уровне с другой панелью.
// То есть, находятся ли локальные мин/макс панели по оси Z (толщина) между
// граничными габаритами другой панели
if (InRange(buttPanel.LowZ, checkMin.z, checkMax.z) && InRange(buttPanel.LowZ, checkMin.z, checkMax.z)) {
// Элемент контура, индекс которого берётся из кромки
var elem = buttPanel.Contour.Objects[elemindex];
if (elem.IsLine()) {
var elemMin = {
x: Math.min(elem.Pos1.x, elem.Pos2.x),
y: Math.min(elem.Pos1.y, elem.Pos2.y)
}
var elemMax = {
x: Math.max(elem.Pos1.x, elem.Pos2.x),
y: Math.max(elem.Pos1.y, elem.Pos2.y)
}
// Результат - находятся ли обе точки линии кромки в пределах габаритов панели
return InRange(elemMin.x, checkMin.x, checkMax.x) &&
InRange(elemMin.y, checkMin.y, checkMax.y) &&
InRange(elemMax.x, checkMin.x, checkMax.x) &&
InRange(elemMax.y, checkMin.y, checkMax.y)
}
}
// Если не вернули true раньше - значит результат false
return false;
}
/**
* Проверка, накрывает ли кромка панели
* @param {number} elemindex Индекс элемента контура
* @param {Panel} buttPanel Панель, которой принадлежит элемент
*/
function IsButtClosed(elemindex, buttPanel) {
var result = false;
Model.forEachPanel(function (p){
if (IsButtClosedWithPanel(elemindex, buttPanel, p))
result = true;
})
return result;
}
Butt = Action.Properties.NewButt('Кромка');
Btn = Butt.NewButton('Накатать').OnClick = function () {
Model.forEachPanel(
function (Obj) {
if (Obj.Butts.Count === 1) {
for (var i = 0; i < Obj.Contour.Count; i++) {
if (Obj.IsButtVisible(i, 5) && !IsButtClosed(i, Obj)) {
StartEditing(Obj)
Obj.AddButt(Butt, i);
}
}
}
})
Action.Finish();
}
Action.Continue();
[свернуть]
|
|
|
30.04.2020, 17:56
|
#115
|
Пользователь
Регистрация: 31.01.2014
Адрес: г. Одесса
Сообщений: 58
Сказал(а) спасибо: 84
Поблагодарили 28 раз(а) в 17 сообщениях
Вес репутации: 136
|
Я правильно понял, что надо Вашим кодом полностью заменить тот старый код, что был в файле скрипта?
Пока попробовал, но никаких действий вообще не происходит. Может я что-то не то делаю.
|
|
|
30.04.2020, 19:12
|
#116
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,034 раз(а) в 367 сообщениях
Вес репутации: 346
|
Цитата:
Сообщение от Alexnail
Я правильно понял, что надо Вашим кодом полностью заменить тот старый код, что был в файле скрипта?
Пока попробовал, но никаких действий вообще не происходит. Может я что-то не то делаю.
|
может быть из-за этого условия:
Код:
if (Obj.Butts.Count === 1) {
Мне оно показалось странным - зачем накатывать кромки при условии, что в панели всего лишь одна кромка, но решил оставить, раз так было изначально (кто знает, какой изначальный замысел был). Попробуйте убрать это условие (если оно вам не нужно), и посмотрите, заработает ли.
|
|
|
05.05.2020, 12:03
|
#117
|
Новичок
Регистрация: 31.05.2018
Сообщений: 8
Сказал(а) спасибо: 4
Поблагодарили 3 раз(а) в 1 сообщении
Вес репутации: 0
|
Цитата:
Сообщение от TProject
Есть аналогичный скрипт, который работает как в 8, так и в 10 версии, выделяет криволинейные детали и детали с пазами.
PHP код:
//// Выделение криволинейных деталей
Model.forEachPanel(function(obj) {
if (!obj.IsContourRectangle)
obj.Selected = true;
});
/// Выделение деталей с пазами
Model.forEachPanel(function(obj) {
if (obj.Cuts.Count != 0)
obj.Selected = true;
});
});
|
can i select the panel with hole?
I'm foreigner so sorry of using English here
|
|
|
05.05.2020, 12:09
|
#118
|
Пользователь
Регистрация: 31.01.2014
Адрес: г. Одесса
Сообщений: 58
Сказал(а) спасибо: 84
Поблагодарили 28 раз(а) в 17 сообщениях
Вес репутации: 136
|
К сожалению, не заработало. Если до удаления этой функции хотя-бы предлагалось накатать кромку, но ничего не происходило, то после удаления реакция на скрипт вообще ноль.
|
|
|
05.05.2020, 16:33
|
#119
|
Местный
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 104
Сказал(а) спасибо: 56
Поблагодарили 276 раз(а) в 63 сообщениях
Вес репутации: 213
|
Коллеги доброго дня
Обращаю особое внимание всех кто пишет скрипты для Б-Салона в Менеджере прайс листов.
Ни в коем случае не используйте функцию "forEach()" в выражениях типа
Код:
TovarItems.TovarModel.forEach(function(obj) {
/*инструкция функции*/
}
Функция будет без нареканий работать в МПЛ, но после экспорта в прайс-лист: уже в Салоне работать не будет.
К большому сожалению это выяснялось в самый неприятный момент. Нащупал баг опытным путем: почти случайно.
Выражаю свою огромную благодарность Letos за этот пост.
Цитата:
Сообщение от Letos
Попробуйте попользоваться таким вариантом:
Код:
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);
}
}
}
forEachInList(TovarItems.TovarModel, function(obj) {
/*инструкция функции*/
})
Если с этим скриптом всё будет нормально и моё предположение верно, то проблема в функции TovarItems.TovarModel.forEach.
|
Используйте функцию "forEachInList()". В Салоне всё работает.
__________________
С уважением Кузнецов Александр
Последний раз редактировалось АлКузнецов; 05.05.2020 в 17:32.
|
|
|
Пользователь сказал cпасибо:
|
|
05.05.2020, 18:16
|
#120
|
Пользователь
Регистрация: 17.12.2016
Сообщений: 89
Сказал(а) спасибо: 28
Поблагодарили 50 раз(а) в 30 сообщениях
Вес репутации: 109
|
Цитата:
Сообщение от meg87
can i select the panel with hole?
I'm foreigner so sorry of using English here
|
Для панелей с круглым отверстием:
Model.forEachPanel(function(obj) {
if (obj.Contour.Count == 5)
obj.Selected = true;
});
Для панелей с вырезом любой формы:
Model.forEachPanel(function(obj) {
if (obj.Contour.Count != 4)
obj.Selected = true;
});
P.S. Только это при условии, что панели прямоугольные. Для панелей другой формы нужно будет играть со значением obj.Contour.Count.
С Уважением, Михаил.
|
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 05:50. Часовой пояс GMT +3.
|