Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 11 в этой теме.
Новшества Базис Мебельщик версии 11:
..... 6. Работоспособность скриптов, созданных в более ранних версиях, не гарантируется в версии БАЗИС 11.
.....
52. Разработана панель инструментов для скриптов, на которую можно вывести, например, часто используемые скрипты, со своими иконками, хинтами и т.д.
53. Добавлена возможность автозапуска выбранного скрипта на любое из двух событий – Загрузка модели, и/или Сохранение модели.
.....
Новшества Базис Мебельщик версии 2021:
16. Отладчик скриптов.
VISUAL CODE
Код:
Примеры скриптов из видео
Вес панелей.js
Выделить панели без облицовки.js
Панель по 3 точкам.js
Прифуговка кромки.js
Любые вопросы по любому системному и мебельному софту, любые конвертации, настройки и т.д.>сюда< (кроме озвученных в мануалах, инструкциях и темах форума) ...
Последний раз редактировалось AlexBolton; 09.01.2024 в 11:56..
Здравствуйте.Помогите, пожалуйста, разобраться с работой с файлами. В таблице Excel есть список фрагментов и их кол-во , которые должны присутствовать на сцене. Как с помощью скрипта поставить их в модель? Все фрагменты лежат в одной папке. Больше интересует работа (чтение /запись) с таблицей.
Цитата:
Сообщение от kos100pudov
...Ну раз все молчат, значит корректного решения для работы с файлами эксель до сих пор нет. Скрипт для вашей задачи не представляет никакой сложности, кроме багов при работе с эксель. Если вы готовы пересохранять ваш эксель в тот же csv или "текстовый с табуляцией", то скрипт под эти файы я вам для примера набросаю, это просто. Кидайте csv или txt и на словах какие данные нам из этих файлов нужны.
Цитата:
Сообщение от Ильдар43
Спасибо за ответ. Мне надо из файла считать артикул (второй столбик) и два последних столбца (это габариты).
забирайте.
в начале скрипта необходимые настройки, поправите под себя.
читает файлы txt с табуляцией (как вы выкладывали) и файлы csv с разделителем "точка с запятой".
путь к фрагментам и какие столбцы нужно читать.
Скрытый текст
Код HTML:
//папка с фрагментами для загрузки.слэш должен быть правый
var frag_dir = 'блабла/блабла/фрагменты/';
//настройки номеров столбцов для чтения. отсчет начинается с нуля
var col_name = 1; //номер столбца "имя фрагмента"
var col_count = 3; //номер столбца "количество"
var col_width = 4; //номер столбца "ширина" - для игнорирования укажите отрицательное значение
var col_height = -1; //номер столбца "высота" - для игнорирования укажите отрицательное значение
var col_depth = 5; //номер столбца "глубина" - для игнорирования укажите отрицательное значение
//*****************************************************************************
var frag_bias = 0;
var frag_count = 0;
var file_full_name = system.askFileName(); //вызываем диалог выбора файла - получаем полный путь и имя файла
var file_ext = file_full_name.split('.'); //разбиваем на части через точку
file_ext = file_ext[file_ext.length - 1]; //берем последнюю часть, т.е. расширение файла
var file = system.readTextFile(file_full_name).split('\r\n'); //открываем файл
if (file_ext == 'txt') {
for (var i = 0; i < file.length; ++i) {
file[i] = file[i].split('\t');
}
} else if (file_ext == 'csv') {
for (var i = 0; i < file.length; ++i) {
file[i] = file[i].split(';');
}
} else {
alert('ошибка выбора файла\r\nперезапустите скрипт и выберите файл\r\nв формате ".txt" или ".csv"');
Action.Finish();
}
for (var i = 0; i < file.length; ++i) {
var frag_file = frag_dir + file[i][col_name] + '.fr3d';
if (system.fileExists(frag_file)) { //если существует файл с названием из файла
var frag = OpenFurniture(frag_file); //загружаем фрагмент
for (var r = 0; r < file[i][col_count]; ++r) {
if (frag) {
var obj = frag.Make(0, 0);
obj.Owner = Model.Temp;
obj.Build();
obj.ElasticResize({
x: file[i][col_width] || obj.GSize.x,
y: file[i][col_height] || obj.GSize.y,
z: file[i][col_depth] || obj.GSize.z
});
obj.Translate({
x: frag_bias
});
obj.Build();
frag_bias += obj.GSize.x + 500;
frag_count += 1;
}
}
}
}
Action.Commit();
alert('загружено ' + frag_count + ' объектов');
[свернуть]
__________________ Оно поди конечно если, а как коснись чего-нибудь, так вот те на пожалуйста..
kos100pudov, СПАСИБО тебе огромное. Почти весь код написал, я некоторые вещи не просил - хотел сам потренироваться, но ты профессионал и доводишь дела до конца.
А с текстовым файлом, действительно, не так сложно получилось. Спасибо
Устанавливаю схему крепежа через MountScheme. Есть проблема, при повторном запуске скрипта схема крепежа не устанавливается, хотя значения в поле NewFurniture прописано, если заного выбираю устанавливается. Это только у меня так не сохраняется или так и работает, постоянно нужно выбирать схему? И есть ли решение?
Цитата:
Сообщение от Максим Геннадьевич
Устанавливаю схему крепежа через MountScheme. Есть проблема, при повторном запуске скрипта схема крепежа не устанавливается, хотя значения в поле NewFurniture прописано, если заного выбираю устанавливается. Это только у меня так не сохраняется или так и работает, постоянно нужно выбирать схему? И есть ли решение?
Код в котором не сохраняется установка схемы крепежа.
PHP код:
var p1 = AddHorizPanel(0,0,1000,1000,1000);
var p2 = AddVertPanel(0,0,1000,p1.GabMin.y,0);
var FileOptions = 'cupboard.xml';
var prop = Action.Properties;
Action.OnStart = function (){
prop.Load(FileOptions);
} ;
var scheme = prop.NewFurniture('схема');
prop.OnChange = function (){
scheme.Value.MountScheme(p1, p2, FurniturePosition.Inside, NewVector(0, 0, 0));
Action.Commit();
prop.Save(FileOptions);
Action.Finish();
}
Action.Continue();
.IsAssemblyUnit - true/false - читается и назначается
также блок, фрагмент и схема крепежа с точки зрения скриптов один и тот же объект TFurnBlock. различить можно через свойство DatumMode
.DatumMode = 0 - блок
.DatumMode = 1....6 - фрагмент, цифра обозначает тип фрагмента, тип позиционирования/установки
.DatumMode = 7 - схема крепежа
DatumMode так же принудительно назначается при необходимости.
допустим выделив обычный блок и сделав Model.Selected.DatumMode=1; мы преобразуем его во фрагмент))
допустим есть красивый фрагмент с отверстиями, но отверстия нельзя отредактировать. Есть способ разрушить фрагмент на тела и отверстия?
допустим есть красивый фрагмент с отверстиями, но отверстия нельзя отредактировать. Есть способ разрушить фрагмент на тела и отверстия?
можно скриптом заменить отв в вашем фрагменте на нужные, только надо изменить диапазон, чтобы нашлись те которые есть во фрагменте, и прописать диаметр и глубину новых. см. скрипт, даже я понял, и периодически пользуюсь, прописывая разные диаметры для разных производств.
допустим есть красивый фрагмент с отверстиями, но отверстия нельзя отредактировать. Есть способ разрушить фрагмент на тела и отверстия?
Как вариант, у меня есть скрипт который добавляет в модель отверстия с теми же параметрами что и у найденой фурнитуры(фрагмента). Саму фурнитуру удаляет, но это отключается.
т.е. по сути заменяет фурнитуру на набор не связанных между собой отверстий.
Такое подойдёт?
Пришли этот красивый фрагмент, гляну что в нем особенного)
__________________ Оно поди конечно если, а как коснись чего-нибудь, так вот те на пожалуйста..
немного доработал предыдущий скрипт.
теперь можно вращать вокруг любого указанного ребра.
запускаем скрипт - указываем панель - указываем ребро - вводим угол поворота.
возможны повороты в обратную сторону если ребро не параллельно глобальным осям (под ипанутым углом) - тут сложно понять где начало и конец ребра, в какую сторону направлено, и естественно как вокруг него вращать, с какой точки зрения....
Скрытый текст
Код HTML:
//заменяем запятые на точку
function CommaToPoint(text) {
var out_text = '';
for (var i = 0; i < text.length; ++i) {
if (text[i] == ',') {
out_text += '.';
} else {
out_text += text[i];
}
}
return out_text;
}
//***********************************************************************//
var panel = GetPanel('Укажите панель');
var edge = GetEdge('Укажите ребро для поворота', Model);
var angle = CommaToPoint(prompt('Укажите угол поворота'));
//зацикливаем пока пользователь не введет корректное число - исключаем ввод текста
while (!+angle) {
angle = CommaToPoint(prompt('Укажите угол поворота ТОЛЬКО ЦИФРА с точкой или запятой'));
}
StartEditing(Model);
//составляем массив пересекающей панель фурнитуры
var fasts = panel.FindConnectedFasteners();
//перезаписываем массив фурнитуры, добавляем для каждой фурнитуры инфу о ее "родителе"
for (var i = 0; i < fasts.length; ++i) {
fasts[i] = [fasts[i], fasts[i].Owner];
}
//добавляем в массив саму панель и ее "родителя"
fasts[fasts.length] = [panel, panel.Owner];
//создаем временный блок
var temp_block = AddBlock();
temp_block.Build();
Action.Commit();
temp_block = Model.Objects[Model.Count - 1];
//задаем блоку позицию равную начальной точке указанного ребра
temp_block.Position = edge.GFirst;
//переносим все объекты массива в блок
for (var i = 0; i < fasts.length; ++i) {
fasts[i][0].ReTransform(fasts[i][0].Owner, temp_block);
fasts[i][0].Owner = temp_block;
}
//поворачиваем весь блок вокруг указанного ребра
//при повороте вокург Х угол поворота обратный - особенности СК Базиса
//вычисляем к какой из осей ребро наиболее "параллельно"
//если ребро максимально вытянуто вдоль оси Х ГСК
if ((Math.abs(edge.GDir().x) > Math.abs(edge.GDir().y)) && (Math.abs(edge.GDir().x) > Math.abs(edge.GDir().z))) {
//простейшая проверка на начало и конец ребра, работает корректно только для "правильных" ребер
if ((edge.GFirst.x + edge.GFirst.y + edge.GFirst.z) < (edge.GLast.x + edge.GLast.y + edge.GLast.z)) {
temp_block.Rotate(edge.GDir(), -angle);
} else {
temp_block.Rotate(edge.GDir(), angle);
}
}
//если ребро максимально вытянуто вдоль оси Y или Z ГСК
else {
//простейшая проверка на начало и конец ребра, работает корректно только для "правильных" ребер
if ((edge.GFirst.x + edge.GFirst.y + edge.GFirst.z) < (edge.GLast.x + edge.GLast.y + edge.GLast.z)) {
temp_block.Rotate(edge.GDir(), angle);
} else {
temp_block.Rotate(edge.GDir(), -angle);
}
}
temp_block.Build();
//переносим все объекты из блока в их прежних "родителей"
for (var i = 0; i < fasts.length; ++i) {
fasts[i][0].ReTransform(fasts[i][0].Owner, fasts[i][1]);
fasts[i][0].Owner = fasts[i][1];
}
//удаляем блок
DeleteObject(temp_block);
Action.Commit();
[свернуть]
p.s. работает в 21. в 8-ке точно не сработает из-за ".FindConnectedFasteners()" - как его эмулировать я писал как то ранее... может еще что то вылезет, не проверял..
спасибо, теперь осталось сделать поворот всех панелей во фронтальную плоскость, нужно для выгрузки векторного изображения для схем сборок
спасибо, теперь осталось сделать поворот всех панелей во фронтальную плоскость, нужно для выгрузки векторного изображения для схем сборок
давайте уточните с самого начала, что нужно.
я подозреваю, что вам нужно повернуть панели во фронтальную плоскость вместе с фурнитурой. но тогда возникает вопрос. если две панели соединены одним уголком или конфирматом, то после поворота каждой из этих панелей, вместе с какой из них должен повернуться (остаться) уголок или конфирмат??
или для начала необходимо разбить фурнитуру на отдельные отверстия, чтоб у каждой панели были свои отверстия, которые повернуться вместе с панелью. а сама фурнитура останется "в воздухе" или вообще удалится.
опишите подробнее что конкретно нужно и что должно произойти.
__________________ Оно поди конечно если, а как коснись чего-нибудь, так вот те на пожалуйста..