Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 11 в этой теме.
Новшества Базис Мебельщик версии 11:
..... 6. Работоспособность скриптов, созданных в более ранних версиях, не гарантируется в версии БАЗИС 11.
.....
52. Разработана панель инструментов для скриптов, на которую можно вывести, например, часто используемые скрипты, со своими иконками, хинтами и т.д.
53. Добавлена возможность автозапуска выбранного скрипта на любое из двух событий – Загрузка модели, и/или Сохранение модели.
.....
Новшества Базис Мебельщик версии 2021:
16. Отладчик скриптов.
VISUAL CODE
Код:
Примеры скриптов из видео
Вес панелей.js
Выделить панели без облицовки.js
Панель по 3 точкам.js
Прифуговка кромки.js
Любые вопросы по любому системному и мебельному софту, любые конвертации, настройки и т.д.>сюда< (кроме озвученных в мануалах, инструкциях и темах форума) ...
Последний раз редактировалось AlexBolton; 09.01.2024 в 11:56..
Проблема так все равно не решится. В один и тот же массив pat трижды переписываются значения в индексах с 0 по 2 (в цикле по i). А в массив FA каждый раз записывается ссылка на массив pat (в цикле по j).
Вы правы, каюсь)
Не обратил внимание на вывод в консоль содержимого FA, а только на pat.
Кстати, в консоли 11 версии вывод содержимого массивов выглядит более наглядным, чем в 10.
По сути, это будут точки минимум/максимум вложенных элементов (также, как и у блока). Разницы между GMin и GabMin у модели быть не должно, ибо её ЛСК равна ГСК (в теории, возможно изменить поворот всей модели, но на практике таких случаев я не встречал).
мне нужно именно габаритной рамки а там показывает больше если деталь вылезла за габарит
мне нужно именно габаритной рамки а там показывает больше если деталь вылезла за габарит
Тогда можно за основу брать габариты модели, а потом смотреть по модели, есть ли габрамка:
Код
PHP код:
var min = Model.GMin;
var max = Model.GMax;
for (var i = 0; i < Model.Count; i++){
if (Model.Objects[i] instanceof TModelLimits){
var lim = Model.Objects[i];
min = lim.GabMin;
max = lim.GabMax;
}
}
[свернуть]
P.S. Похоже имелись в виду те размеры, которые задаются в параметрах изделия. К ним не получилось достучаться через скрипты - в Article их точно нет.
Разобрался я в чем была причина. В процессе конвертации приходится часто использовать функцию eval() т.к о наличии переменных я узнаю в процессе чтения файла.
Мало того в этой переменной которую нужно было скопировать я использовал массив объектов. Получилось вот так:
pat1 = [ equi: [ 5 ], equin: [ 1 ], equis: [ 1 ] ]
picarr[1] = pat1;
pat1 = [ equi: [ 20 ], equin: [ 1 ], equis: [ 1 ] ]
picarr[2] = pat1;
результат:
[ <1 empty item>,
[ equi: [ 22 ], equin: [ 1 ], equis: [ 1 ] ],
[ equi: [ 22 ], equin: [ 1 ], equis: [ 1 ] ] ]
и как только не бился не получается скопировать правильно.
Пробовал pat1.concat() и pat1.slice(0). Не работают эти функции с массивом объектов.
С обычным массивом вида pat1[0] всё работает нормально.
p/s обнаружил что если создавать переменную используя eval(), то переменная находится в глобальной области видимости.
Написал небольшую рекурсивную функцию для просмотра xbs объектов (например, параметры эластичности в блоке):
PHP код:
function ViewNode(node, owner){
var nodeopt = owner.NewString(node.Name, node.Value || '');
for (var i = 0; i < node.Count; i++){
ViewNode(node[i], nodeopt);
}
}
Принимает на вход xbs объект и родительский компонент на панели свойств.
Небольшой пример по использованию - вывод информации о выделенном объекте(берётся свойство Params у объекта), с последующим запросом на выделение до отмены скрипта.
код
PHP код:
function ViewNode(node, owner){
var nodeopt = owner.NewString(node.Name, node.Value || '');
for (var i = 0; i < node.Count; i++){
ViewNode(node[i], nodeopt);
}
}
Action.Continue();
var props = Action.Properties;
var obj = Model.Selected || GetObject('Select object');
while (obj){
Model.UnSelectAll();
obj.Selected = true;
props.Clear();
ViewNode(obj.Params, props);
obj = GetObject('Select object');
}
Разобрался я в чем была причина. В процессе конвертации приходится часто использовать функцию eval() т.к о наличии переменных я узнаю в процессе чтения файла.
Мало того в этой переменной которую нужно было скопировать я использовал массив объектов. Получилось вот так:
pat1 = [ equi: [ 5 ], equin: [ 1 ], equis: [ 1 ] ]
picarr[1] = pat1;
pat1 = [ equi: [ 20 ], equin: [ 1 ], equis: [ 1 ] ]
picarr[2] = pat1;
результат:
[ <1 empty item>,
[ equi: [ 22 ], equin: [ 1 ], equis: [ 1 ] ],
[ equi: [ 22 ], equin: [ 1 ], equis: [ 1 ] ] ]
и как только не бился не получается скопировать правильно.
Пробовал pat1.concat() и pat1.slice(0). Не работают эти функции с массивом объектов.
С обычным массивом вида pat1[0] всё работает нормально.
p/s обнаружил что если создавать переменную используя eval(), то переменная находится в глобальной области видимости.
Если я правильно понял и вам нужно создать копию массива, в которой будут копии (а не ссылки) объектов, тогда можно создать новый массив и копировать в него объекты, например так:
код
PHP код:
var pat1 = {
abc : 5,
bca : 1
}
var pat2 = {
abc: 10,
bca: 1,
xyz: 1
}
var picarr = [pat1, pat2];
//Создание копии массива
var picarr2 = [];
for (var i = 0; i < picarr.length; i++){
var obj = new Object();
Object.assign(obj, picarr[i])
// изменяем свойства копии, чтобы убедиться, что у исходного ничего не меняется
obj.abc += 5;
obj.bca--;
picarr2.push(obj);
}
console.log(picarr2);
[свернуть]
Касательно приведённого вами кода - вы не определяете переменную (с помощью var/let), соответственно, при первом её упоминании, она создаётся в глобальном пространстве (даже если вы её задали в теле цикла).
P.S. Взял приведённый вами код, изменил определение pat1 (квадратные на фигурные, чтобы объект получился, а то так ошибки сыпет) и у меня заработало нормально:
Если я правильно понял и вам нужно создать копию массива, в которой будут копии (а не ссылки) объектов, тогда можно создать новый массив и копировать в него объекты, например так:
код
PHP код:
var pat1 = { abc : 5, bca : 1 } var pat2 = { abc: 10, bca: 1, xyz: 1 } var picarr = [pat1, pat2]; //Создание копии массива var picarr2 = []; for (var i = 0; i < picarr.length; i++){ var obj = new Object(); Object.assign(obj, picarr[i]) // изменяем свойства копии, чтобы убедиться, что у исходного ничего не меняется obj.abc += 5; obj.bca--; picarr2.push(obj); } console.log(picarr2);
[свернуть]
Да спасибо.
Создал пример моего кода в намного упрощенной версии. Там все нормально получается без всяких ухищрений.
В моем же коде, запросто, переменная никак не копировалась. Ваш код помог. Теперь буду остальные участки переделывать из массива в объекты.
Назрел ещё один вопрос. Использую форму/список при добавлении элементов в этот список на 11 версии базиса и запуске этой формы выходит вот такая ошибка:
cannot assign a nil to a tstringlist
Есть ли какие то изменения касаемые списков в 11 версии базиса или как програмно добавить в список элементы?
Назрел ещё один вопрос. Использую форму/список при добавлении элементов в этот список на 11 версии базиса и запуске этой формы выходит вот такая ошибка:
cannot assign a nil to a tstringlist
Есть ли какие то изменения касаемые списков в 11 версии базиса или как програмно добавить в список элементы?
Это косяк объекта типа Combo. программно можно обойти это так: вместо
Ещё подскажите пожалуйста как из формы выбрать деталь?
Т.е простая команда var panel = GetPanel("Укажите панель"); выполняемая из формы дает зависание всей системы.
Выбрать деталь не могу потому что события выполняются в форме и в форме нажать закрыть не могу потому что события переданы на сцену.