|
|
|
|
|
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..
|
Просмотров: 543777
|
13 пользователя(ей) сказали cпасибо:
|
|
01.06.2018, 11:13
|
#51
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Цитата:
Сообщение от anb
Скрипт для подсчёта веса изделия без фурнитуры, т.е. выделяем блок или панели по отдельности. Получаем общий вес.
|
Прежде всего, хочу выразить благодарность wizardpnz за то, что он нашел модуль для работы с базой и сделал запрос, который выдает вес для материала. Скрипт находится на гугл диске . Обсуждение скрипта (что добавить, исправить и т.д.) просьба вести в выделенной для этого теме.
Для работы скрипта нужен Базис 10-й версии и выше
Как им пользоваться:
1. Скачать и распаковать в нужную папку.
2. В файле db.js у переменной options.database изменить значение на путь к нужной базе. Важно: модуль криво работает с кириллицей, поэтому путь к базе не должен содержать кириллицу.
3. Выделить объекты, вес которых надо вычислить и запустить db.js.
Особенности скрипта:
1. В свойствах модели отображается информация об объекте и его весе.
2. Вес считается (пока) только для панелей (с пластиком), профилей и блоков (если блок был выделен перед запуском скрипта).
3. Для панелей указывается суммарный вес вместе с пластиком, для блоков - суммарный вес элементов внутри него. Свойство с весом блока можно развернуть, чтобы посмотреть вес каждого элемента блока.
4. При активации свойства с весом объекта, объект выделяется.
И еще одно ограничение скрипта - вес панели может рассчитываться некорректно для непрямоугольных панелей, потому что на данный момент площадь панели рассчитывается как "Ширина * Длина".
Обновление 03.06.20
1. Поправил получение веса для материала без артикула.
2. Поправил возможное зависание, если материал не был найден в базе. Теперь в окне свойств две группы - список объектов и список не найденных в базе материалов.
3. Если запрос или подключение к базе происходит с ошибкой, информация об ошибке записывается в файл "errorList.json". Это должно ускорить понимание проблемы при возникновении ошибки.
Последний раз редактировалось Letos; 03.06.2020 в 01:19.
|
|
|
14 пользователя(ей) сказали cпасибо:
|
|
04.06.2018, 10:56
|
#52
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Скрипт, который добавляет к имени/позиции панели имя/позицию блока, в котором она находится. С учетом пожеланий товарища Uncle в скрипте есть настройки:
1. Настройка разделителя между идентификатором блока и имением панели.
2. Выбор идентификатора блока. Три варианта - "Только имя", "Только позиция" и "Позиция, а если ее нет, то имя"
3. Выбор, какие идентификаторы добавлять к имени панели - "Корневого блока" (самого высшего по иерархии), "блока, в который вложен объект" и "Всех блоков в иерархии".
4. Добавлена настройка - менять имя или позицию у панели в соответствии с пожеланием товарища volunka
Обновление 06.06.2018:
1. Исправлено название параметра с "К имени добавлять" на "Для формирования информации использовать" и этот параметр действует и на саму панель. Ранее всегда бралось имя панели.
2. Исправлено вычисление "корневого" блока. Теперь слой не учитывается и его информация не будет записываться.
Обновление 06.06.2018 №2:
Исправлен запуск скрипта в 9-й версии.
Обновление 27.12.2018:
Добавлен выбор типов объектов, которые будут обрабатываться скриптом - на данный момент можно включить/выключить обработку панелей и/или профилей
Если нашли ошибку, или есть предложения по усовершенствованию скрипта, просьба писать сюда
Последний раз редактировалось Letos; 27.12.2019 в 14:04.
Причина: Обновление
|
|
|
41 пользователя(ей) сказали cпасибо:
|
|
17.08.2018, 17:56
|
#53
|
Новичок
Регистрация: 15.08.2018
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 232 раз(а) в 6 сообщениях
Вес репутации: 0
|
Скрипт - Выделить все непрямоугольные панели
При запуске данный скрипт выделяет в файле 3д модели все непрямоугольные панели. После проектирования изделия часто требуется создать чертежи только на панели не прямоугольной формы. Этот скрипт не даст вам пропустить такие панели. 1) Запустили скрипт 2) нажали кнопку создать чертежи опция только на выделенные.
|
|
|
41 пользователя(ей) сказали cпасибо:
|
|
19.08.2018, 14:03
|
#54
|
Новичок
Регистрация: 15.08.2018
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 232 раз(а) в 6 сообщениях
Вес репутации: 0
|
Привет всем! Этот простой скрипт быстро устанавливает штангу в шкаф. При этом в панели свойств имеется выбор
Штанга круглая или овальная.
Держатель трубы да/нет.
Если держателя нет, то появляется поле ввода значения отступа штанги от верхней панели.
Последний раз редактировалось Igordiz; 19.08.2018 в 14:51.
|
|
|
65 пользователя(ей) сказали cпасибо:
|
|
21.08.2018, 22:31
|
#55
|
Новичок
Регистрация: 15.08.2018
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 232 раз(а) в 6 сообщениях
Вес репутации: 0
|
Скрипт - расставить полки
Есть не один такой скрипт. Хочу поделиться своим. Мне кажется он довольно удачный.
Описание: После указания необходимых панелей и границ, откроется окно свойств для ввода параметров.
Работает во всех версиях.
Особенность:
При изменении кол-ва полок или материала полок выводися информация расстояние между полок. Считаю это важным моментом, так как нам всегда хочется знать какое расстояние будет в итоге. Можно сразу подобрать нужный вариант.
Так же имеется выбор ставить полкодержатель или нет. Ставить доп отверстие или нет.
|
|
|
64 пользователя(ей) сказали cпасибо:
|
|
04.10.2018, 22:41
|
#56
|
Новичок
Регистрация: 15.08.2018
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 232 раз(а) в 6 сообщениях
Вес репутации: 0
|
Скрипт профиль для ДВП (задней стенки)
Этот скрипт быстро установит разделительный профиль для задней стенки. При этом задняя стенка будет поделена на две части.
|
|
|
18 пользователя(ей) сказали cпасибо:
|
|
25.11.2018, 16:51
|
#57
|
Пользователь
Регистрация: 22.07.2014
Адрес: Sochi
Сообщений: 83
Сказал(а) спасибо: 143
Поблагодарили 135 раз(а) в 36 сообщениях
Вес репутации: 154
|
Проекция V2.0
1) Проекция V2.0 Скрипт от Igor_482, исправлен ранее вызывал ошибки.
2) Базис 10.
3) Помогает развернуть камеру на заданный угол.
Скрытый текст
Action.DS.Camera.RotateTo(NewVector(0.4773502691896255,
0.39,
0.5773502655)); //Повернуть камеру
Action.Finish();
Action.Continue();
Action.Control.ViewAll(); //Показать все [свернуть]
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
21.03.2019, 16:48
|
#58
|
Местный
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 166
Сказал(а) спасибо: 57
Поблагодарили 244 раз(а) в 46 сообщениях
Вес репутации: 139
|
Угловые радиусные полки
Небольшой скрипт по установке открытых полок, срезанных или радиусом под углом, на вертикальную и заднюю фронтальную панель.
Работает в версии 8н в других не проверял
Скрытый текст
SetCamera(p3dFront);
panel = GetObject("Укажите боковую панель");
edge = GetEdge("Укажите боковую границу", AxisY).First.x;
Top = GetEdge('Укажите верхнюю границу', AxisX).First.y;
Bottom = GetEdge('Укажите нижнюю границу', AxisX).First.y;
SetCamera(p3dLeft);
panBac = GetObject('Укажите заднюю панель');
SetCamera(p3dFront);
FileOptions = 'SaveShelf.xml';
MakeProperties();
Action.Properties.Load(FileOptions);
Action.OnFinish = function() {
Action.Properties.Save(FileOptions);
}
NewBtn = NewButtonInput('Закончить');
NewBtn.OnChange = function() {
Action.Commit();
Action.Finish();
}
function MakeProperties() {
prop = Action.Properties;
shelfCount = prop.NewNumber('Количество полок',0);
lengAng = shelfCount.NewNumber('Длина среза',0);
angel = shelfCount.NewNumber('Угол среза',0);
radius = shelfCount.NewNumber('Радиус',0);
blockMat = shelfCount.NewMaterial('Материал полок');
butt = shelfCount.NewButt('Кромка полок');
blockFurn = shelfCount.NewFurniture('Крепеж жесткий');
inFurn = shelfCount.NewNumber ('Отступ с фурнитуры',0);
prop.OnChange = function() {
MakeShelf();
}
}
MakeShelf();
function MakeShelf(){
DeleteNewObjects();
blockMat.SetActive();
thick = ActiveMaterial.Thickness;
if(panel.GabMin.x < edge){
xP1 = panel.GabMax.x;
}else{
xP1 = panel.GabMin.x;
}
if(shelfCount.Value > 0 ){
//формула вычесления растояния полок
fshelf = Math.round(((Bottom - Top) - thick * 2 - thick * shelfCount.Value )/(+shelfCount.Value + 1));
shelfY = Top;
for (var k = 0; k < shelfCount.Value; k++){
shelfY += fshelf + thick;
shelf = AddHorizPanel(xP1,panBac.GabMax.z,edge , panel.GabMax.z, shelfY);
if(angel.Value > 0 && lengAng.Value > 0){
shelf.RotateX(90);
r = Math.abs(radius.Value); //радиус
x3 = shelf.GMax.x;
y3 = shelf.GMax.y;
hs = r - Math.sqrt((Math.pow(r,2))-(Math.pow(lengAng.Value,2)/4));//высота сегмента
ly = hs*(Math.sin(Math.PI/180*angel.Value));//сторона по гипотенузе *высота сегмента*
lx = hs*(Math.sin(Math.PI/180*(90-angel.Value)));//сторона по гипотенузе *высота сегмента*
y1 = shelf.GMin.y;
y2 = y1 + Math.round(lengAng.Value * Math.cos(Math.PI/180*angel.Value));
if(panel.GabMin.x > edge){
x1 = shelf.GMin.x ;
x2 = x1 + Math.round(lengAng.Value * Math.sin(Math.PI/180*angel.Value));
x4 = x1 + (x2 - x1)/2;
}else{
x1 = shelf.GMax.x ;
x2 = x1 - Math.round(lengAng.Value * Math.sin(Math.PI/180*angel.Value));
x4 = x2 + (x1 - x2)/2;
lx = -lx;
}
cd = shelf.Contour;
cont = NewContour();
y4 = y1 + (y2 - y1)/2;
if (radius.Value == 0){
cont.AddLine(x1,y1,x1,y2);
cont.AddLine(x1,y2,x2,y1);
cont.AddLine(x2,y1,x1,y1);
}else{
if (radius.Value > 0){
x4 = x4 - lx;
y4 = y4 - ly;
}else {
x4 = x4 + lx;
y4 = y4 + ly;
}
cont.AddLine(x1,y1,x1,y2);
cont.AddArc3(x1, y2 ,x4, y4,x2, y1);
cont.AddLine(x2,y1,x1,y1);
}
cd.Subtraction(cont);
shelf.RotateX(-90);
}
ShelfFurn (shelf);
shelf.Build();
}
}
}
function ShelfFurn (s) {
s.TextureOrientation = ftoHorizontal;
s.Name = 'Полка';
if (panel.GabMin.x > edge){
xf = panel.GabMin.x;
}
else {
xf = panel.GabMax.x;
}
s.AddButt(butt, 2);
s.AddButt(butt, 4);
s.AddButt(butt, 1);
blockFurn.Value.Mount(s, panel, xf, s.GabMin.y - thick/2, s.GabMin.z + inFurn.Value);
blockFurn.Value.Mount(s, panel, xf, s.GabMin.y - thick/2,s.GabMax.z - inFurn.Value);
blockFurn.Value.Mount(s, panBac, s.GabMin.x + inFurn.Value, s.GabMin.y - thick/2, panBac.GabMax.z);
blockFurn.Value.Mount(s, panBac, s.GabMax.x - inFurn.Value, s.GabMin.y - thick/2,panBac.GabMax.z);
}
Action.Continue(); [свернуть]
|
|
|
12 пользователя(ей) сказали cпасибо:
|
|
04.04.2019, 12:54
|
#59
|
Местный
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 166
Сказал(а) спасибо: 57
Поблагодарили 244 раз(а) в 46 сообщениях
Вес репутации: 139
|
Угловой радиусный кухонный шкаф
Наконец дописал скрипт на угловой радиусный кухонный шкаф. Конечно есть недоработки из-за моих небольших знаний. Основное это формулы для поиска точек для построения угла и радиуса. Долгая война на установку петель на радиусную дверь.Вогнутый радиус положительное число,выгнутый отрицательное число. К сожалению вариант угла 45* и -300 радиус, так и не довел до нормального. Может кому понадобиться.
Скрытый текст
PHP код:
var CurBlock;//блок для модели
var CurPos = NewVector(0, 0, 0);//позиция модели
var inFurn = 50;//отступ для фурнитуры
var shelf;// полки
var lx;// точка по x для построения угла
var ly;// точка по y для построения угла
var r;//для радиуса
var hs;//высота для построения радиуса (третья точка)
FileOptions = 'SaveAngel.xml';
MakeProperties();
Action.Properties.Load(FileOptions);
Action.OnFinish = function() {
Action.Properties.Save(FileOptions);
}
NewBtn = NewButtonInput('Закончить');
NewBtn.OnChange = function() {
Action.Commit();
Action.Finish();
}
NewBtn = NewButtonInput('Добавить еще одну');
NewBtn.OnChange = function() {
Action.Commit();
NewTumba();
block.Value++;
}
NewTumba();
Action.Continue();
function MakeProperties() {
prop = Action.Properties;
typeBlock = prop.NewCombo("Модуль", 'Верх');//\nНиз
blockType = typeBlock.NewCombo("Тип корпуса", 'Угловой');
locat = typeBlock.NewCombo('Расположение','Справа\nСлева');
angel = typeBlock.NewCombo('Угол','30\n45\n60\n90');
radius = typeBlock.NewNumber('Радиус','0');
block = prop.NewNumber ('Название \"Блок №\"', 1) ;
width = block.NewNumber('Ширина', 600);
heidht = block.NewNumber('Высота', 720);
depth = block.NewNumber('Глубина', 600);
blockCut = block.NewBool('Пазы');
//sink = block.NewBool('Мойка');
//sink.Visible = (typeBlock.ItemIndex == 1?true:false);
blockMat = block.NewMaterial('Материал корпуса');
butt = block.NewButt('Кромка корпуса');
blockFurnVis = block.NewFurniture('Крепеж корпуса');
blockHook = block.NewFurniture('Навес корпуса');
//blockHook.Visible = blockCut.Visible = (typeBlock.ItemIndex == 0?true:false);
backMat = block.NewMaterial('Материал задняя стенка');
face = prop.NewCombo('Петли фасада','Слева\nСправа\nНет дверей');
doorsLW = face.NewNumber('Ширина двери',402);
doorsRW = face.NewNumber('Ширина двери',0);
doorsRW.Visible = (angel.ItemIndex == 3?true:false);
faceTex = face.NewCombo ('Текстура фасада','Вертикально\nГоризонтально');
faseType = face.NewCombo ('Тип фасада','Обычный\nШесть окон\nЧетыре окна\nОдно окно\nАлюм. профиль');
faceMat = face.NewMaterial('Материал фасада');
glassMat = face.NewMaterial('Стекло витрины');
fuga = face.NewNumber('Зазор фасадов',2);
plank = prop.NewBool('Планки');
shelfCount = prop.NewCombo('Количество полок','0\n1\n2\n3');
shelfFront = shelfCount.NewNumber ('Заглубление',10);
prop.OnChange = function() {
//sink.Visible = (typeBlock.ItemIndex == 1?true:false);
//blockHook.Visible = blockCut.Visible = (typeBlock.ItemIndex == 0?true:false);
doorsRW.Visible = (angel.ItemIndex == 3?true:false);
Make();
}
}
function NewTumba() {
Make();
Action.ShowPoints = true;
Action.OnMove = function() {
CurBlock.Position = Action.Pos3;
CurPos = Action.Pos3; };
Action.OnClick = function() {
Action.OnMove = undefined;
Action.ShowPoints = false;
};
}
function Make(){
DeleteNewObjects();
W = width.Value;//ширина
H = heidht.Value;//высота
D = depth.Value;//глубина
inBack = (blockCut.Value == true)?17:0;//отступ с пазом от задней стенки до полки
c100 = (plank.Value == true)?100:0;//ширина планок
CurBlock = BeginBlock("Блок " + block.Value);
f = fuga.Value;
BlockAngel();
Door();
Shelf ();
EndBlock();
if(locat.ItemIndex == 1){
CurBlockL = AddSymmetry(CurBlock, NewVector(W/2, 0, 0), AxisX);//симметрия блока
DeleteObject(CurBlock);//удаление блока
CurBlock = CurBlockL;//копирование
CurBlock.Position = CurPos;//позиция блока
} else {
CurBlock.Position = CurPos;
}
}
function BlockAngel(){
backMat.SetActive();
inB = ((blockCut.Value)?9:1);//отступ задней по краям
back = AddFrontPanel( inB, inB ,W - inB - c100, H - inB, inBack - ActiveMaterial.Thickness);//задняя
BackContour (back);//функция выпилов под навесы
back.TextureOrientation = ftoVertical;//текстура
back.Build();
back.Name = 'Задняя ' + block.Value;
if(plank.Value){
backR = AddVertPanel(c100 + inB, inB ,D - inB, H - inB,W - inBack);//задняя если есть планки
backR.Build();
backR.TextureOrientation = ftoVertical;
backR.Name = 'Задняя ' + block.Value;
}
blockMat.SetActive();
thick = ActiveMaterial.Thickness;
panelB = AddHorizPanel(thick,0,W,D - thick,0); //дно
panelT = AddHorizPanel(thick,0,W,D - thick,H - thick);//крыша
AngRad(panelB);//редактирование дна под угол и радиус
panelB.AddButt(butt, 4);
AngRad(panelT);//редактирование крыши под угол и радиус
panelT.AddButt(butt, plank.Value?6:4);//кромка в зависимости от планок
if (angel.ItemIndex == 3){
panelB.AddButt(butt,5);
panelT.AddButt(butt, plank.Value?7:5);//кромка в зависимости от планок
}
panelB.TextureOrientation = panelT.TextureOrientation = ftoHorizontal;//текстура
lL = Math.round(panelT.Contour.Objects[0].ObjLength());//длина левой панели
lR = Math.round(panelT.Contour.Objects[1].ObjLength());//длина правой панели
if (locat.ItemIndex == 0){
Action.Hint = 'Сторона левая - ' + lL + ', правая - ' + lR;//текст с длиной для ориентира
}else{
Action.Hint = 'Сторона левая - ' + lR + ', правая - ' + lL;
}
panelL = AddVertPanel(0, 0, lL, H, 0);//левая панель
panelL.AddButt(butt, 1);
panelL.AddButt(butt, 2);
panelL.AddButt(butt, 0);
panelR = AddFrontPanel(W - lR, 0, W, H, D - thick);//правая панель(фронтальная)
panelR.AddButt(butt, 0);
panelR.AddButt(butt, 2);
panelR.AddButt(butt, 3);
panelL.TextureOrientation = panelR.TextureOrientation = ftoVertical;
if(plank.Value){
panelV = AddVertPanel(0, thick, c100 + thick, H - thick, W - c100 - thick );//планка
panelV.AddButt(butt, 1);
panelF = AddFrontPanel(W - c100 , thick, W, H - thick, c100 );//планка
panelV.TextureOrientation = panelF.TextureOrientation = ftoVertical;
if(blockCut.Value){
Cut (panelF);//паз для планки
}
panelF.Build();
panelV.Name = panelF.Name = 'Планка ' + block.Value;
//крепеж планок
blockFurnVis.Value.Mount(panelF,panelT,panelF.GabMin.x + inFurn,H-thick,thick/2);
blockFurnVis.Value.Mount(panelF,panelB,panelF.GabMin.x + inFurn,thick,thick/2);
blockFurnVis.Value.Mount(panelF,panelV,thick,H-thick-inFurn*2,thick/2);
blockFurnVis.Value.Mount(panelF,panelV,thick,thick+inFurn*2,thick/2);
}else{
panelV = AddVertPanel(0,thick,D - thick,H-thick,W - thick);//задняя из материала корпуса
panelV.TextureOrientation = ftoVertical;
panelV.Name = 'Задняя ' + block.Value;
//крепеж задней
blockFurnVis.Value.Mount(panelV,panelT,thick/2,H-thick,D - thick - inFurn);
blockFurnVis.Value.Mount(panelV,panelB,thick/2,thick,D - thick - inFurn);
blockFurnVis.Value.Mount(panelV,panelR,thick,H-thick-inFurn*2,thick/2);
blockFurnVis.Value.Mount(panelV,panelR,thick,thick+inFurn*2,thick/2);
}
if (blockCut.Value){//пазы для панелей
Cut (panelL);
Cut (panelV);
Cut (panelR);
Cut (panelT);
Cut (panelB);
}
blockFurnVis.Value.Mount(panelV,panelT,thick/2,H-thick,blockCut.Value?inFurn:inFurn-10);
blockFurnVis.Value.Mount(panelV,panelB,thick/2,thick,inFurn);
FurnMake(panelB);
FurnMake(panelT);
panelV.Build();
panelL.Build();
panelR.Build();
panelB.Build();
panelT.Build();
panelB.Name = panelT.Name = 'Полка ' + block.Value;
panelL.Name = panelR.Name = 'Стоев ' + block.Value;
blockHook.Value.Mount1 (panelL ,thick ,H - thick - 24,inBack + 37,0 );//навесы
blockHook.Value.Mount1 (panelV ,panelV.GabMin.x, H - thick - 24,inBack + 37,0 );//навесы
}
//Функция крепежа
function FurnMake(pan){
var y = pan.GabMin.y + thick/2;
blockFurnVis.Value.Mount(pan,panelL,thick,y,inFurn);
blockFurnVis.Value.Mount(pan,panelL,thick,y,lL - inFurn);
blockFurnVis.Value.Mount(pan,panelR,W - lR + inFurn,y,thick/2);
blockFurnVis.Value.Mount(pan,panelR,W - inFurn,y,thick/2);
}
//функция угла и радиуса
function AngRad(pan){
pan.RotateX(90);
var sf = 0;//для заглубления полок
var x1 = pan.GMin.x;
var y1 = pan.GMin.y;
//нахождение точек для построения
var y2 = y1 + Math.round(doorsLW.Value * Math.cos(Math.PI/180*angel.Value));
var x2 = x1 + Math.round(doorsLW.Value * Math.sin(Math.PI/180*angel.Value));
var x3 = pan.GMax.x;
var y3 = pan.GMax.y;
var ind = (blockCut.Value)?thick - inBack:thick;//если паз
var cd = pan.Contour;
var cont = NewContour();
r = Math.abs(radius.Value) + ((radius.Value < 0)?faceMat.Thickness:0); //радиус к положительному
hs = r - Math.sqrt((Math.pow(r,2))-(Math.pow(doorsLW.Value,2)/4));//высота сегмента(для третей точки)
ly = hs*(Math.sin(Math.PI/180*angel.Value));//сторона по гипотенузе *высота сегмента*
lx = hs*(Math.sin(Math.PI/180*(90-angel.Value)));//сторона по гипотенузе *высота сегмента*
//ищем среднюю точку дуги
var x4 = x1 + (x2 - x1)/2;
var y4 = y1 + (y2 - y1)/2;
if (plank.Value){//вырез под планки
switch(pan){
case panelT:
cont.AddRectangle(x3,y3,x3 - c100,y3 - c100);
break;
case shelf:
cont.AddRectangle(x3,y3,x3 - c100 - ind,y3 - c100 - ind);
sf = shelfFront.Value;
break;
}
}
if(angel.ItemIndex == 3){//для Г-ного построения
tt = faseType.ItemIndex == 4?20:faceMat.Thickness;//смещение от толщины фасада
y2 = y1 + doorsRW.Value + sf - thick + tt;//точка по у
x2 = x1 + doorsLW.Value + sf - thick + tt;// точка по х
cont.AddRectangle(x1,y1,x2,y2);//прямоугольник
}else{
if (radius.Value == 0){//угол
cont.AddLine(x1,y1,x1,y2+sf);//сторона по х
cont.AddLine(x1,y2+sf,x2+sf,y1);//гипотенуза
cont.AddLine(x2+sf,y1,x1,y1);//сторона по у
}else{
if (radius.Value > 0){//радиус выгнутый
x4 = x4 - lx;
y4 = y4 - ly;
}else {//радиус вогнутый
x4 = x4 + lx;
y4 = y4 + ly;
}
cont.AddLine(x1,y1,x1,y2);//сторона по х
cont.AddArc3(x1, y2 ,x4, y4,x2, y1);//дуга
cont.AddLine(x2,y1,x1,y1);//сторона по у
}
}
cd.Subtraction(cont);
pan.RotateX(-90);
}
//пазы
function Cut (pan){
var c0 = inB-1;//отступ до паза
var c1 = backMat.Thickness + 1;//ширина паза
var c2 = thick - c0;//глубина паза
var c3 = inBack - c1;//отступ от края до паза
var c4 = inBack;//размер для построения паза
var cut = pan.AddCut('Паз ('+c1+'х'+c2+'x'+c3+')'); // добавим паз
var traj = cut.Trajectory; // траектория фрезы
StartEditing(pan); // редактировать панель
switch (pan){
case panelT:
traj.AddLine(pan.GMin.x,- c4, pan.GMax.x, - c4); // горизонтальная линия
cut.Contour.AddRectangle(0, 0, c1, c2);
if (plank.Value) {
traj.AddLine(pan.GMax.x - c3,pan.GMin.y,pan.GMax.x - c3, pan.GMax.y); // горизонтальная линия
}
break;
case panelB:
traj.AddLine(pan.GMin.x,-c4, pan.GMax.x ,- c4); // горизонтальная линия
cut.Contour.AddRectangle(0,c0,c1 ,thick ); // нижний паз
if (plank.Value) {
traj.AddLine(pan.GMax.x - c4,pan.GMin.y,pan.GMax.x - c4, pan.GMax.y); // горизонтальная линия
}
break;
case panelL:
traj.AddLine(c4, 0, c4 , H); // вертикальная линия
cut.Contour.AddRectangle(0, 0, c1, c2); // левый паз
break;
case panelV:
traj.AddLine(c4, 0, c4 ,H); // вертикальная линия
cut.Contour.AddRectangle(c1, c0, 0, thick); // правый паз
break;
case panelR :
if(plank.Value){
traj.AddLine(pan.GMax.x - c3, 0,pan.GMax.x - c3 ,H); // вертикальная линия
cut.Contour.AddRectangle(0, 0, c1, c2); // правый паз
}
break;
case panelF:
traj.AddLine(pan.GMax.x - c3, 0,pan.GMax.x - c3 ,H); // вертикальная линия
cut.Contour.AddRectangle(c1, 8, 0, thick); // правый паз
break;
}
}
//вырезы под навесы
function BackContour (pan){
var bc = pan.Contour;
var bcont = NewContour();
var x1 = pan.GMin.x;
var x2 = pan.GMax.x;
var y1 = pan.GMin.y;
var y2 = pan.GMax.y;
var w = ((blockCut.Value)? 22:30);
var h = ((blockCut.Value)? 37:45);
bcont.AddRectangle (x1, y2,x1 + w , y2 - h);//левая сторона
bcont.AddRectangle (x2 , y2, x2 - w , y2 - h);//правая сторона
bc.Subtraction(bcont);
}
function Shelf (){
blockMat.SetActive();
if(shelfCount.Value > 0 ){
//формула вычесления растояния полок
var sF ;
var fshelf = Math.round((H - thick * 2 - thick * shelfCount.Value)/(+shelfCount.Value + 1));//между полками
var shelfY = 0;//точка установки
var x2 = (!plank.Value)?thick:inBack;
for (var k = 0; k < shelfCount.Value; k++){
shelfY += fshelf + thick;//до следующей полки
shelf = AddHorizPanel(thick,inBack, W - x2, D - thick, shelfY );//полка
shelf.TextureOrientation = ftoHorizontal;
shelf.Name = 'Полка ' + block.Value;
AngRad(shelf);
shelf.AddButt(butt,plank.Value?6:4);
if (angel.ItemIndex == 3){
shelf.AddButt(butt, plank.Value?7:5);
}
shelf.Build();
FurnMake(shelf);
}
}
}
//Двери
function Door (){
if(doorsLW.Value > 0 && face.ItemIndex != 2){
faceMat.SetActive();
thF = ActiveMaterial.Thickness;
blockD = BeginBlock('Дверь');
doorL = AddFrontPanel(0, 0,doorsLW.Value - f * 2, H - f * 2, 0);//левая дверь
doorsFurn = OpenFurniture('Петля.f3d');//можно изменить
DoorsFurn(doorL,doorsFurn);//установка петель
doorL.TextureOrientation = faceTex.ItemIndex == 0?ftoVertical:ftoHorizontal;
doorL.Name = 'Дверь '+ block.Value;
Milling(doorL); //фрезеровка
EndBlock();
var xT = thick + f;//сдвиг двери х
var zT = lL + f;//сдвиг двери по z
if (angel.ItemIndex == 3){
xT = f;
zT = lL;
blockDR = BeginBlock('Дверь');
faceMat.SetActive();
doorR = AddFrontPanel(0,0,doorsRW.Value - f *2,H - f * 2,0);//правая дверь
DoorsFurn(doorR,doorsFurn);
Milling(doorR);
doorR.Build();
doorR.Name = doorL.Name;
doorR.TextureOrientation = doorL.TextureOrientation;
EndBlock();
blockDR.RotateY(270); //поворот правой двери
blockDR.Translate(doorsLW.Value + thF,f,lL + f + thF);//сдвиг правой двери
}else {
if(radius.Value != 0){
c = NewContour();
c.Clear();
//расчет угла петли для радиусной двери
anFurn = (180 - (360/((2 * Math.PI * r)/42)))/2 - (Math.asin((r-hs)/r) * 180) / Math.PI;
xT = thick;
zT = lL;
if(radius.Value > 0){//выпуклая дверь
blockD.RotateY(-anFurn);//поворот блока для петли
doorL.RotateY(anFurn); //обратно только дверь
//дуга двери по радиусу по трем точкам
c.AddArc({x: 0, y: 0}, {x: doorsLW.Value, y: 0}, {x: doorsLW.Value/2, y: hs-r});
doorL.BentContour = c;
doorL.Bent = true;// Указываем, что панель гнутая
doorL.Contour.Clear();
doorL.Contour.AddRectangle(f, 0,c.ObjLength() - f, H - f * 2);// Задаём контур панели.
doorL.BentDirection = 0;
}else if(radius.Value < 0){
blockD.RotateY(anFurn);
doorL.RotateY(-anFurn);
c.AddArc({x: doorsLW.Value, y: 0}, {x: 0, y: 0}, {x: doorsLW.Value/2, y: r - hs});
doorL.BentContour = c;// Задаём траекторию
doorL.Bent = true;// Указываем, что панель гнутая
doorL.Contour.Clear();
doorL.Contour.AddRectangle(0, 0, c.ObjLength() , H - f * 2);// Ширина равна длине траектории гнутой панели
doorL.BentDirection = 1;
}
//условия для расположения петель справа для радиуса
if ((locat.ItemIndex == 0 && face.ItemIndex == 1) || (locat.ItemIndex == 1 && face.ItemIndex == 0)){
copy = AddSymmetry(blockD, NewVector(ld/2, 0, 0), AxisX);//симметрия двери
DeleteObject(blockD);//удаление
blockD = copy;//копия
}
}
blockD.RotateY(270 + (+angel.Value));//поворот двери под углом
}
doorL.Build();
blockD.Translate(xT,f,zT);//смещение левой двери
}
}
//фрезеровка
function Milling(door){
if (faseType.ItemIndex != 0 && radius.Value == 0 ){
var x1 = door.GMin.x;
var x2 = door.GMax.x;
var y1 = door.GMin.y;
var y2 = door.GMax.y;
var cd = door.Contour;
var cont = NewContour();
doorW = Math.abs(x1 - x2);//длина двери
doorH = (H - f * 2);//высота двери
switch (faseType.ItemIndex){
case 1: //шесть окон
rectW = Math.round(((doorW) - 150)/2);//ширина окошек
rectHC = Math.round((H - thick * 4) / 3 - thick/2); //высота середины полок
rectH = Math.round((H - f * 2 - rectHC - 180)/2);// высота крайних окошек
cont.AddRectangle (x1 + 60, y1 + 60, x1 + 60 + rectW, y1 + 60 + rectH);
cont.AddRectangle (x2 - 60, y1 + 60, x2 - 60 - rectW, y1 + 60 + rectH);
cont.AddRectangle (x1 + 60, y1 + 90 + rectH, x1 + 60 + rectW, y2 - 90 - rectH);
cont.AddRectangle (x2 - 60, y1 + 90 + rectH, x2 - 60 - rectW, y2 - 90 - rectH);
cont.AddRectangle (x1 + 60, y2 - 60, x1 + 60 + rectW, y2 - 60 - rectH);
cont.AddRectangle (x2 - 60, y2 - 60, x2 - 60 - rectW, y2 - 60 - rectH);
cd.Subtraction(cont);
Glass(x1 + 50,y1 + 50,x2 - 50,y2 - 50,0);
break;
case 2://четыре окна
rectW = Math.round(((doorW) - 150)/2);//ширина окошек
rectH = Math.round((H - f * 2 - 150)/2);// высота окошек
cont.AddRectangle (x1 + 60, y1 + 60, x1 + 60 + rectW, y1 + 60 + rectH);
cont.AddRectangle (x2 - 60, y1 + 60, x2 - 60 - rectW, y1 + 60 + rectH);
cont.AddRectangle (x1 + 60, y2 - 60, x1 + 60 + rectW, y2 - 60 - rectH);
cont.AddRectangle (x2 - 60, y2 - 60, x2 - 60 - rectW, y2 - 60 - rectH);
cd.Subtraction(cont);
Glass(x1 + 50,y1 + 50,x2 - 50,y2 - 50,0);
break;
case 3: //одно окно
cont.AddRectangle (x1 + 60, y1 + 60, x2 - 60, y2 -60);
Glass(x1 + 50,y1 + 50,x2 - 50,y2 - 50,0);
break;
case 4://алюминиевый профиль
DeleteObject(door);
cont = AddTrajectory('Траектория');
cont.Trajectory2D.AddRectangle(x1,y1,x2,y2);
file = 'Профиль F1-11.frw';
cont.Contour2D.Load(file);
cont.MaterialWidth = 45;//
cont.Name = 'Профиль F1-11';
cont.Build();
Glass(x1 + 3,y1 + 3,x2 - 3,y2 - 3,18);
break;
}
}
}
//установка петель
function DoorsFurn(door,furn){
var x;
if(radius.Value == 0 && ((locat.ItemIndex == 0 && face.ItemIndex == 1) || (locat.ItemIndex == 1 && face.ItemIndex == 0))){
x = door.GabMax.x - 21;
}else {
x = door.GabMin.x + 21;
}
furn.Mount1(door,x ,door.GabMin.y + inFurn * 2, door.GabMin.z,0);
furn.Mount1(door,x ,door.GabMax.y - inFurn * 2, door.GabMin.z,0);
}
//стекло для фрезеровок
function Glass(x1,y1,x2,y2,z){
glassMat.SetActive();
thickG = ActiveMaterial.Thickness;
glass = AddFrontPanel(x1,y1,x2,y2,z - thickG);
glass.Build();
glass.Name = 'Стекло';
}
[свернуть]
|
|
|
11 пользователя(ей) сказали cпасибо:
|
|
08.05.2019, 18:35
|
#60
|
Местный
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 166
Сказал(а) спасибо: 57
Поблагодарили 244 раз(а) в 46 сообщениях
Вес репутации: 139
|
Шип-паз
Увлекся лазерной резкой и для соединения деталей нужны "шип-паз", т.к нравиться работать в Базис-Мебельщик, соответственно написал небольшой скрипт для построения шип-паз двух перпендикулярных пересекающихся панелей. Если панели нужно под углом, то панели выставить как обычно, запустить скрип и потом вращать как нужно, например крыша домика.
Работает в Базис Мебельщик 8 (народная)
PHP код:
var pan1 = GetObject("Укажите первую панель");
var pan2 = GetObject("Укажите вторую панель");
if(pan1 == undefined){
pan1 = GetObject("Укажите первую панель");
}
var pan1Copy = AddCopy(pan1);
if(pan2 == undefined){
pan2 = GetObject("Укажите вторую панель");
}
var pan2Copy = AddCopy(pan2);
MakeProperties();
NewBtn = NewButtonInput('Закончить');
NewBtn.OnChange = function() {
DeleteObject(pan1Copy);
DeleteObject(pan2Copy);
Action.Commit();
Action.Finish();
}
function MakeProperties(){
prop = Action.Properties;
countSh = prop.NewNumber ('Количество', 2);
prop.OnChange = function() {
Make();
}
}
Make();
function Make(){
pan1.Contour.Clear();
pan1.Contour.Addition(pan1Copy.Contour);
pan2.Contour.Clear();
pan2.Contour.Addition(pan2Copy.Contour);
var minX1 = Math.round(pan1.GabMin.x);
var maxX1 = Math.round(pan1.GabMax.x);
var minY1 = Math.round(pan1.GabMin.y);
var maxY1 = Math.round(pan1.GabMax.y);
var minZ1 = Math.round(pan1.GabMin.z);
var maxZ1 = Math.round(pan1.GabMax.z);
var minX2 = Math.round(pan2.GabMin.x);
var maxX2 = Math.round(pan2.GabMax.x);
var minY2 = Math.round(pan2.GabMin.y);
var maxY2 = Math.round(pan2.GabMax.y);
var minZ2 = Math.round(pan2.GabMin.z);
var maxZ2 = Math.round(pan2.GabMax.z);
var pan1X1 = 0;
var pan1Y1 = 0;
var pan1X2 = 0;
var pan1Y2 = 0;
var pan2X1 = 0;
var pan2Y1 = 0;
var pan2X2 = 0;
var pan2Y2 = 0;
var min = 0;
var max = 0;
var cp1 = NewContour();
var k1 = Math.floor(countSh.Value/2);
var cp2 = NewContour();
var k2 = countSh.Value/2;
switch(pan1.Thickness){
case maxX1 - minX1://первая вертик
switch(pan2.Thickness){
case maxZ2 - minZ2://вторая фронт
if(minY1 >= minY2){
min = minY1;
pan2Y1 = minY1 - minY2;
} else {
min = minY2;
pan1Y1 = minY2 - minY1;
}
if (maxY1 >= maxY2){
max = maxY2;
} else{
max = maxY1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1X1 = minZ2 - minZ1;
pan1X2 = pan1X1 + pan2.Thickness;
pan1Y1 += rect;
Undo.Changing(pan1);
for (var i = 0; i < k1; i++) {
pan1Y2 = pan1Y1 + rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2 );
pan1Y1 = pan1Y2 + rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
pan2X1 = minX1 - minX2;
pan2X2 = pan2X1 + pan1.Thickness;
Undo.Changing(pan2);
for (var j = 0; j < k2; j++) {
pan2Y2 = pan2Y1 + rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2);
pan2Y1 = pan2Y2 + rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
case maxY2 - minY2://вторая горизонт
if(minZ1 >= minZ2){
min = minZ1;
} else {
min = minZ2;
pan2Y1 = minZ2 - minZ1;
}
if (maxZ1 >= maxZ2){
max = maxZ2;
pan1X1 = maxZ1 - maxZ2;
} else{
max = maxZ1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1Y1 = minY2 - minY1;
pan1Y2 = pan1Y1 + pan2.Thickness;
pan1X1 = pan1.GMax.x - pan1X1 - rect;
Undo.Changing(pan1);
for (var i = 0; i < k1; i++) {
pan1X2 = pan1X1 - rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2 );
pan1X1 = pan1X2 - rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
pan2X1 = minX1 - minX2;
pan2X2 = pan2X1 + pan1.Thickness;
Undo.Changing(pan2);
for (var j = 0; j < k2; j++) {
pan2Y2 = pan2Y1 + rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2);
pan2Y1 = pan2Y2 + rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
}
break;
case maxZ1 - minZ1 :// первая фронт
switch(pan2.Thickness){
case maxX2 - minX2://вторая вертик
if(minY1 >= minY2){
min = minY1;
pan2Y1 = minY1 - minY2;
} else {
min = minY2;
pan1Y1 = minY2 - minY1;
}
if (maxY1 >= maxY2){
max = maxY2;
} else{
max = maxY1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1X1 = minX2 - minX1;
pan1X2 = pan1X1 + pan2.Thickness;
pan1Y1 = pan1Y1 + rect;
Undo.Changing(pan1);
for (var j = 0; j < k1; j++) {
pan1Y2 = pan1Y1 + rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2);
pan1Y1 = pan1Y2 + rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
pan2X1 = minZ1 - minZ2;
pan2X2 = pan2X1 + pan1.Thickness;
Undo.Changing(pan2);
for (var i = 0; i < k2; i++) {
pan2Y2 = pan2Y1 + rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2 );
pan2Y1 = pan2Y2 + rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
case maxY2 - minY2://вторая горизонт
if(minX1 >= minX2){
min = minX1;
pan2X1 = minX1 - minX2;
}else{
min = minX2;
pan1X1 = minX2 - minX1;
}
if(maxX1 >= maxX2){
max = maxX2;
}else{
max = maxX1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1Y1 = minY2 - minY1;
pan1Y2 = pan1Y1 + pan2.Thickness;
pan1X1 += rect;
pan1X2 = rect;
Undo.Changing(pan1);
for (var j = 0; j < k1; j++) {
pan1X2 = pan1X1 + rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2);
pan1X1 = pan1X2 + rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
Undo.Changing(pan2);
pan2Y1 = maxZ2 - maxZ1;
pan2Y2 = pan2Y1 + pan1.Thickness;
for (var i = 0; i < k2; i++) {
pan2X2 = pan2X1 + rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2 );
pan2X1 = pan2X2 + rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
}
break;
case maxY1 - minY1://первая горизонт
switch(pan2.Thickness){
case maxX2 - minX2://вторая вертик
if(minZ1 >= minZ2){
min = minZ1;
pan1Y1 = minZ1 - minZ2;
} else {
min = minZ2;
}
if (maxZ1 >= maxZ2){
max = maxZ2;
} else{
max = maxZ1;
pan2X1 = maxZ2 - maxZ1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1X1 = minX2 - minX1;
pan1X2 = pan1X1 + pan2.Thickness;
pan1Y1 += rect;
pan1Y2 = pan1Y1 + rect;
Undo.Changing(pan1);
for (var j = 0; j < k1; j++) {
pan1Y2 = pan1Y1 + rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2);
pan1Y1 = pan1Y2 + rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
pan2Y1 = minY1 - minY2;
pan2Y2 = pan2Y1 + pan1.Thickness;
pan2X1 = pan2.GMax.x - pan2X1;
Undo.Changing(pan2);
for (var i = 0; i < k2; i++) {
pan2X2 = pan2X1 - rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2 );
pan2X1 = pan2X2 - rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
case maxZ2 - minZ2://вторая фронт
if(minX1 >= minX2){
min = minX1;
pan2X1 = minX1 - minX2;
}else{
min = minX2;
pan1X1 = minX2 - minX1;
}
if(maxX1 >= maxX2){
max = maxX2;
}else{
max = maxX1;
}
rect = Math.ceil((max - min)/countSh.Value);
pan1Y1 = maxZ2 - maxZ1;
pan1Y2 = pan1Y1 + pan2.Thickness;
pan1X1 += rect;
Undo.Changing(pan1);
for (var j = 0; j < k1; j++) {
pan1X2 = pan1X1 + rect;
cp1.AddRectangle(pan1X1, pan1Y1,pan1X2, pan1Y2);
pan1X1 = pan1X2 + rect;
}
pan1.Contour.Subtraction(cp1);
pan1.Build();
pan2Y1 = minY1 - minY2;
pan2Y2 = pan2Y1 + pan1.Thickness;
Undo.Changing(pan2);
for (var i = 0; i < k2; i++) {
pan2X2 = pan2X1 + rect;
cp2.AddRectangle(pan2X1, pan2Y1,pan2X2, pan2Y2 );
pan2X1 = pan2X2 + rect;
}
pan2.Contour.Subtraction(cp2);
pan2.Build();
break;
}
break;
}
}
Action.Continue();
|
|
|
17 пользователя(ей) сказали cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 09:55. Часовой пояс GMT +3.
|