Местный
Регистрация: 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 = 'Стекло';
}
[свернуть]
|