|
|
|
|
|
13.01.2014, 13:22
|
|
Скрипты. Готовые решения для БМ8-2023
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
13.01.2014, 13:22
Рейтинг:
()
Этот раздел предназначен для размещения готовых скриптов.
Здесь находятся ТОЛЬКО готовые скрипты. Для обсуждения есть отдельная тема: Обсуждение готовых скриптов.
Авторам: - Давать уникальные названия скриптам (не совпадающие с названием уже выложенных скриптов, за исключением обновлений скрипта)
- Указывать работоспособность в разных версиях БМ.
- Общее описание работы скрипта.
- Если презентованный скрипт платный указывать стоимость, условия и контакты для приобретения.
Версии, указанные модератором, как прошедшие проверку:
8 - Демо-версия 8.0.7.9649
8н - "народная" 8.0.12.12765
9 - Демо-версия 9.0.8.18908
10 - Демо-версия 10.0.0.21602
Последний раз редактировалось AlexBolton; 03.03.2023 в 21:03..
|
Просмотров: 545399
|
13 пользователя(ей) сказали cпасибо:
|
|
14.10.2020, 20:59
|
#71
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
Подсчёт кромки и площади
8н
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок всей модели, или выделенного (подсвеченная фурнитура включительно).
Скрытый текст
Код:
/*
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок
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 в 21:55.
|
|
|
13 пользователя(ей) сказали cпасибо:
|
|
14.10.2020, 21:22
|
#72
|
Местный
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 104
Сказал(а) спасибо: 56
Поблагодарили 276 раз(а) в 63 сообщениях
Вес репутации: 212
|
скрипт из двух форм генерирующий название видов покраски и красящий детали согласно ценовой группе. Внимание скрипт определяет ценовую группу по цифрам артикула материала.
для каждой ценовой группы свой список расцветок и эффектов покраски.
Скрытый текст
покраска
PHP код:
//форма выбора набора красок и эффектов
function Ztifr(txt, n) { // функция возвращает цифры из куска строки // ch - число // n - количество знаков слева var ets = txt.substring(0, n); //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 = {kras: kraska, effe: effekt }; 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(5, 42, 206, 22); Window2.Combo1.ComboItems = Materials;
Window2.Label1 = Props.NewLabel("выверите ценовую гриппу"); Window2.Label1.SetLayout(5, 20, 319, 22); //-- window Window2 events
//-- window Window2 ends Window2.Form.ShowModal(); var _k = Ztifr(Window2.Combo1.Value, 3) ; // 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(24, 16, 294, 22); Window1.Combo1.ComboItems = GetKrask(_k).kras; Window1.Combo2 = Props.NewCombo("эффекты",""); Window1.Combo2.SetLayout(24, 51, 294, 22); Window1.Combo2.ComboItems = GetKrask(_k).effe; Window1.usl = Props.NewBool("выбрать панели вручную",false); Window1.usl.SetLayout(23, 108, 295, 22); //-- window Window1 events
//-- window Window1 ends
Window1.Form.ShowModal();
var Pan; var ruch = Window1.usl.Value; //значение ручного выбора var _n = Window2.Combo1.Value; //значение ценовой группы _n = Ztifr( _n, 5); 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(plastMat, true); 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(plastMat, true); 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(obj, nGr) { var artiqul = ExtractMatCode(obj.MaterialName); //извлекаем артикул из названия материала var tzGr = Ztifr(artiqul, 100); //извлекаем цифры из артикула материала if (tzGr == nGr) { return true; } else {return false; } }
[свернуть]
скрипт может быть интересен, если вам нужно создавать формы-пользователя с динамически обновляемыми списками.
работает в 10 и 11 версиях
__________________
С уважением Кузнецов Александр
|
|
|
15.10.2020, 04:47
|
#73
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
ключи - значения объекта
8н
Выводит в свойства ключи - значения объекта, значения можно изменить и применить. Если значение является объектом, можно перейти к нему по ссылке. Можно переходить к родительскому объекту, и возвращаться обратно.
Если у функции есть параметры, сначала появятся поля для ввода параметров и кнопка 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; 15.10.2020 в 23:20.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
19.10.2020, 01:16
|
#74
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
ключи - значения объекта
8н
Скрытый текст
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 в 19:36.
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
21.10.2020, 15:52
|
#75
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
Подсчёт кромки и площади
8н
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок всей модели, или выделенного (подсвеченная фурнитура включительно).
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 в 00:56.
|
|
|
12 пользователя(ей) сказали cпасибо:
|
|
26.10.2020, 00:24
|
#76
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
Изменение размера выделенных панелей
8н
Изменяет размер выделенных панелей. Полезно для кромлёных панелей.
Можно установить нужный размер, или добавить или отнять от текущего размера каждой панели.
Также это удобно и для некромлёных панелей, при изменении нескольких панелей с разными размерами.
Толщина - если -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.
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
05.11.2020, 19:33
|
#77
|
Пользователь
Регистрация: 22.07.2014
Адрес: Sochi
Сообщений: 83
Сказал(а) спасибо: 143
Поблагодарили 135 раз(а) в 36 сообщениях
Вес репутации: 154
|
Скрыть/Показать Элементы v1.05.11.2020
Код
PHP код:
Model.forEach(function(obj) { if (obj.Name.includes("Фас")) { obj.Visible = !obj.Visible; } });
Model.forEach(function(obj) { if (obj.Name.includes("Штапик")) { obj.Visible = !obj.Visible; } }); Model.forEach(function(obj) { if (obj.Name.includes("Ручк")) { obj.Visible = !obj.Visible; } }); Model.forEach(function(obj) { if (obj.Name.includes("Вставк")) { obj.Visible = !obj.Visible; } }); Model.forEach(function(obj) { if (obj.Name.includes("Цок")) { obj.Visible = !obj.Visible; } });
[свернуть]
Версии:
БМ: 8 - N/A.
БМ: 9 - N/A.
БМ: 10 - N/A.
БМ: 11 - ✅
Общее описание работы скрипта.
Уникальность кода в дополнительном фильтре поиск по "маске", где в имени элементов состоящие в модели возможны дополнительные слова.
К примеру: Фасад, Фасад с фрезеровкой, Фасад под стекло.
Т.е. в коде фильтр задан "Фас" и может работать самостоятельно без привязки к заданным словам.
Алгоритм работы скрыть/показать.
Фасад ...
Штапик ...
Ручка ...
Вставка ...
Цоколь ...
Ps: Спасибо за помощь в поддержке написания идеи Каскевич Н. В, Alexandr Ovseanicov.
Последний раз редактировалось Анатолий.ru; 05.11.2020 в 19:38.
Причина: Автора
|
|
|
7 пользователя(ей) сказали cпасибо:
|
|
05.11.2020, 20:13
|
#78
|
Пользователь
Регистрация: 17.12.2016
Сообщений: 89
Сказал(а) спасибо: 27
Поблагодарили 50 раз(а) в 30 сообщениях
Вес репутации: 108
|
[QUOTE=Анатолий.ru;502109]
Код
PHP код:
Model.forEach(function(obj) {
if (obj.Name.includes("Фас")) {
obj.Visible = !obj.Visible;
}
});
[свернуть]
Версии:
БМ: 8 - N/A.
БМ: 9 - N/A.
БМ: 10 - N/A.
БМ: 11 - ✅
Для 8-ки немного переделать:
Model.forEach(function(obj) {
if (obj.Name.indexOf('Фас')>0)
obj.Visible = !obj.Visible;
});
И будет работать...
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
05.11.2020, 21:32
|
#79
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
Тогда уже чтобы совпадения были в списке, и чтобы с них начиналось имя, и без привязки к регистру.
Скрытый текст
Код:
Pat = ['Фас', 'Ручк', 'Вставк', 'Цок', 'Штапик']
Model.forEach(function(obj) {
for (var key in Pat) {
if (obj.Name.match(new RegExp('^' + Pat[key], 'i')))
obj.Visible = !obj.Visible;
};
});
[свернуть]
|
|
|
7 пользователя(ей) сказали cпасибо:
|
|
14.11.2020, 15:40
|
#80
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
|
Редактор 3D размеров
8н
Изменяет, округляет надписи размеров изменяя или не изменяя по выбору (верхнее Combo) фактический размер.
Не нашёл настройки округления размеров, если кто знает подскажите, потому не редко в надписи появляются сотые доли которые совсем не нужны.
Также может быть удобно если надо отправить картинку с новыми размерами, прежний размер можно восстановить из фактического (нижняя кнопка).
По какой то причине часто при запуске скрипта размеры визуально увеличиваются, это может быть полезно для фото.
Ещё не нашёл как изменить размер шрифта, кто в теме, а также про округление из коробки, прошу отписаться в обсуждении.
Скрытый текст
Код:
/*
http://promebelclub.ru/forum/showthread.php?p=502395#post502395
Редактор размеров.
Изменяет, округляет надписи размеров изменяя или не изменяя по выбору фактический размер.
Работает с выделенными или всеми объектами.
Кнопка - Установить реальные размеры округлённые до 1 для всех
Установка надписи из фактического размера.
*/
var AddHidden = 0 // нужно ли добавлять скрытые в результаты
// -------------------------------------------------
var Selected = Model.SelectionCount;
var Buffer = [];
var ReSize = 0
var Prop = Action.Properties;
Prop.Visible = 0
ComboReSize = Prop.NewCombo(' ', 'Не изменять длинну\nИзменять длинну')
ComboReSize.OnChange = OnChangeReSize
t = Prop.NewButton('Округлить все')
t.OnClick = OnClickRoundAll.bind(this, 0)
t.Name = (!AddHidden ? '\nСкрытые не учтены!' : '')
Prop.NewButton('Округлить все до 10').OnClick = OnClickRoundAll.bind(this, -1)
Prop.NewButton('Округлить все до 100').OnClick = OnClickRoundAll.bind(this, -2)
for (var i = 0; i < Model.Count; ++i) {
recurse(Model.Objects[i])
};
if (!Object.keys(Buffer).length) {
alert('Не найдены размеры в '
+ (Selected ? 'выделенном!' : 'модели!')
+ (!AddHidden ? '\nСкрытые не учтены!' : ''))
Action.Finish();
}
Prop.Visible = 1
Prop.NewString('', '').ReadOnly = true
Prop.NewButton('Убрать подсвечивание').OnClick = function() {
Model.UnHighlightAll()
};
Prop.NewButton('Установить реальные размеры округлённые до 1 для всех').OnClick = OnClickSizeAll
Prop.NewButton('Закончить').OnClick = function() {
Action.Finish();
};
StartEditing(Model);
Action.Continue();
function AddItem(obj) {
a = Prop.NewString(obj.Name, obj.Value)
b = Prop.NewButton('округлить')
b.Name = ' Length: ' + obj.Size
b.OnClick = OnClickRound.bind(b, a, obj, 0, b)
a.OnChange = OnChange.bind(a, obj, b)
return [a, b]
}
function OnClickRound(edit, obj, round, sizename) {
Value = Number(parseFloat(edit.Value).toFixed(round))
SetSize(obj, Value, sizename)
edit.Value = obj.Value
}
function OnClickRoundAll(round) {
for (var key in Buffer) {
OnClickRound(Buffer[key][1][0], Buffer[key][0], round, Buffer[key][1][1])
};
}
function OnClickSizeAll() {
for (var key in Buffer) {
edit = Buffer[key][1][0]
sizename = Buffer[key][1][1]
obj = Buffer[key][0]
Value = Number(parseFloat(sizename.Name.substr(16)).toFixed(0))
SetSize(obj, Value, sizename)
edit.Value = obj.Value
};
}
function OnChange(obj, sizename) {
if (isNaN(Number(this.Value)))
Value = this.Value
else
Value = parseFloat(this.Value)
SetSize(obj, Value, sizename)
this.Value = obj.Value
}
function SetSize(obj, Value, sizename) {
obj.Value = Value
if (ReSize)
obj.Size = Value, sizename.Name = ' Length: ' + obj.Size
obj.Build()
Action.Commit();
obj.Highlighted = 1
}
function OnChangeReSize() {
ReSize = ComboReSize.Value == 'Не изменять длинну' ? 0 : 1
}
function recurse(obj, sel) {
if ((!obj.Visible && !AddHidden) || (!obj.List && obj.toString() !== '[object TSize3D]'))
return
if (!obj.List) {
if (!sel)
sel = !!((Selected) && (obj.Selected || obj.Highlighted))
if (Selected && !sel)
return
Buffer.push([obj, AddItem(obj)])
} else {
var blocksel = !!((Selected) && (sel || obj.Selected || obj.Highlighted))
for (var i = 0; i < obj.Count; i++) {
recurse(obj[i], blocksel)
}
}
}
// -------------------------------------------------
[свернуть]
Последний раз редактировалось sergio1982; 14.11.2020 в 16:47.
|
|
|
7 пользователя(ей) сказали cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 06:10. Часовой пояс GMT +3.
|