Показать сообщение отдельно
Старый 04.04.2019, 12:54   #59
Максим Геннадьевич
Местный
 
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 166
Сказал(а) спасибо: 57
Поблагодарили 244 раз(а) в 46 сообщениях
Вес репутации: 139
Максим Геннадьевич - весьма и весьма положительная личностьМаксим Геннадьевич - весьма и весьма положительная личностьМаксим Геннадьевич - весьма и весьма положительная личность
По умолчанию Угловой радиусный кухонный шкаф

Наконец дописал скрипт на угловой радиусный кухонный шкаф. Конечно есть недоработки из-за моих небольших знаний. Основное это формулы для поиска точек для построения угла и радиуса. Долгая война на установку петель на радиусную дверь.Вогнутый радиус положительное число,выгнутый отрицательное число. К сожалению вариант угла 45* и -300 радиус, так и не довел до нормального. Может кому понадобиться.

Скрытый текст

PHP код:
var CurBlock;//блок для модели
var CurPos NewVector(000);//позиция модели
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();
    
width.Value;//ширина
    
heidht.Value;//высота
    
depth.Value;//глубина
    
inBack = (blockCut.Value == true)?17:0;//отступ с пазом от задней стенки до полки
    
c100 = (plank.Value == true)?100:0;//ширина планок
    
CurBlock BeginBlock("Блок " block.Value);
    
fuga.Value;
    
BlockAngel();
    
Door();
    
Shelf ();    
    
EndBlock();    
    if(
locat.ItemIndex == 1){
        
CurBlockL AddSymmetry(CurBlockNewVector(W/200), AxisX);//симметрия блока
        
DeleteObject(CurBlock);//удаление блока
        
CurBlock CurBlockL;//копирование
        
CurBlock.Position CurPos;//позиция блока
    
} else {
        
CurBlock.Position CurPos;
    }
}

function 
BlockAngel(){ 
    
backMat.SetActive();
    
inB = ((blockCut.Value)?9:1);//отступ задней по краям 
    
back AddFrontPanelinBinB ,inB c100inBinBack ActiveMaterial.Thickness);//задняя 
    
BackContour (back);//функция выпилов под навесы
    
back.TextureOrientation ftoVertical;//текстура
    
back.Build();
    
back.Name 'Задняя ' block.Value;
    if(
plank.Value){
        
backR AddVertPanel(c100 inBinB ,inBinB,inBack);//задняя если есть планки
        
backR.Build();
        
backR.TextureOrientation ftoVertical;
        
backR.Name 'Задняя ' block.Value;
    }
    
blockMat.SetActive();
    
thick ActiveMaterial.Thickness;    
    
panelB AddHorizPanel(thick,0,W,thick,0);    //дно
    
panelT AddHorizPanel(thick,0,W,thick,thick);//крыша
    
AngRad(panelB);//редактирование дна под угол и радиус
    
panelB.AddButt(butt4);
    
AngRad(panelT);//редактирование крыши под угол и радиус    
    
panelT.AddButt(buttplank.Value?6:4);//кромка в зависимости от планок
    
if (angel.ItemIndex == 3){
        
panelB.AddButt(butt,5);
        
panelT.AddButt(buttplank.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(00lLH0);//левая панель
    
panelL.AddButt(butt1);
    
panelL.AddButt(butt2);
    
panelL.AddButt(butt0);
    
panelR AddFrontPanel(lR0WHthick);//правая панель(фронтальная)
    
panelR.AddButt(butt0);
    
panelR.AddButt(butt2);
    
panelR.AddButt(butt3);    
    
panelL.TextureOrientation panelR.TextureOrientation ftoVertical;    
    if(
plank.Value){        
        
panelV AddVertPanel(0thickc100 thickthickc100 thick );//планка
        
panelV.AddButt(butt1);        
        
panelF AddFrontPanel(c100 thickWthickc100 );//планка        
        
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.inFurn,H-thick,thick/2);
        
blockFurnVis.Value.Mount(panelF,panelB,panelF.GabMin.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,thick,H-thick,thick);//задняя из материала корпуса
        
panelV.TextureOrientation ftoVertical;
        
panelV.Name 'Задняя ' block.Value;        
        
//крепеж задней
        
blockFurnVis.Value.Mount(panelV,panelT,thick/2,H-thick,thick inFurn);
        
blockFurnVis.Value.Mount(panelV,panelB,thick/2,thick,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 ,thick 24,inBack 37,);//навесы
    
blockHook.Value.Mount1 (panelV ,panelV.GabMin.xthick 24,inBack 37,);//навесы
    
}
//Функция крепежа
function FurnMake(pan){
    var 
pan.GabMin.thick/2;
    
blockFurnVis.Value.Mount(pan,panelL,thick,y,inFurn);
    
blockFurnVis.Value.Mount(pan,panelL,thick,y,lL inFurn);
    
blockFurnVis.Value.Mount(pan,panelR,lR inFurn,y,thick/2);
    
blockFurnVis.Value.Mount(pan,panelR,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();
    
Math.abs(radius.Value) + ((radius.Value 0)?faceMat.Thickness:0); //радиус к положительному
    
hs 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(x1y2 ,x4y4,x2y1);//дуга
            
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,- c4pan.GMax.x, - c4);  // горизонтальная линия
            
cut.Contour.AddRectangle(00c1c2);
            if (
plank.Value) {
                
traj.AddLine(pan.GMax.c3,pan.GMin.y,pan.GMax.c3pan.GMax.y);  // горизонтальная линия
            
}
        break;
        case 
panelB:
            
traj.AddLine(pan.GMin.x,-c4pan.GMax.,- c4);  // горизонтальная линия
            
cut.Contour.AddRectangle(0,c0,c1 ,thick ); // нижний паз
            
if (plank.Value) {
                
traj.AddLine(pan.GMax.c4,pan.GMin.y,pan.GMax.c4pan.GMax.y);  // горизонтальная линия
        
}
        break;
        case 
panelL:
            
traj.AddLine(c40c4 H);     // вертикальная линия
            
cut.Contour.AddRectangle(00c1c2); // левый паз
        
break;
        case 
panelV:
            
traj.AddLine(c40c4 ,H);     // вертикальная линия
            
cut.Contour.AddRectangle(c1c00thick); // правый паз
        
break;
        case 
panelR :
            if(
plank.Value){
                
traj.AddLine(pan.GMax.c30,pan.GMax.c3 ,H); // вертикальная линия
            
cut.Contour.AddRectangle(00c1c2); // правый паз
            
}
            
        break;
        case 
panelF:
            
traj.AddLine(pan.GMax.c30,pan.GMax.c3 ,H); // вертикальная линия
            
cut.Contour.AddRectangle(c180thick); // правый паз
        
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 
= ((blockCut.Value)? 22:30);
    var 
= ((blockCut.Value)? 37:45);
    
bcont.AddRectangle (x1y2,x1 y2 h);//левая сторона
    
bcont.AddRectangle (x2 y2x2 y2 h);//правая сторона
    
bc.Subtraction(bcont);
}

function 
Shelf (){
    
blockMat.SetActive();
    if(
shelfCount.Value ){
        
//формула вычесления растояния полок
        
var sF ;
        var 
fshelf Math.round((thick thick shelfCount.Value)/(+shelfCount.Value 1));//между полками
        
var shelfY 0;//точка установки
        
var x2 = (!plank.Value)?thick:inBack;
            for (var 
0shelfCount.Valuek++){
                
shelfY += fshelf thick;//до следующей полки
                
shelf AddHorizPanel(thick,inBackx2thickshelfY );//полка
                
shelf.TextureOrientation ftoHorizontal;
                
shelf.Name 'Полка ' block.Value;
                
AngRad(shelf);
                
shelf.AddButt(butt,plank.Value?6:4);
                if (
angel.ItemIndex == 3){
                    
shelf.AddButt(buttplank.Value?7:5);
                }
                
shelf.Build();
                
FurnMake(shelf);
            }
    }
}
//Двери
function Door (){
    if(
doorsLW.Value && face.ItemIndex != 2){
        
faceMat.SetActive();
        
thF ActiveMaterial.Thickness;        
        
blockD BeginBlock('Дверь');
        
doorL AddFrontPanel(00,doorsLW.Value 220);//левая дверь        
        
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  *2,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 thF);//сдвиг правой двери                
        
}else {                        
            if(
radius.Value != 0){                                            
                
NewContour();
                
c.Clear();
                
//расчет угла петли для радиусной двери
                
anFurn = (180 - (360/((Math.PI r)/42)))/- (Math.asin((r-hs)/r) * 180) / Math.PI;                
                
xT thick;
                
zT lL;
                if(
radius.Value 0){//выпуклая дверь                    
                    
blockD.RotateY(-anFurn);//поворот блока для петли
                    
doorL.RotateY(anFurn);    //обратно только дверь        
                    //дуга двери по радиусу по трем точкам
                    
c.AddArc({x0y0}, {xdoorsLW.Valuey0}, {xdoorsLW.Value/2yhs-r});
                    
doorL.BentContour c;                        
                    
doorL.Bent true;// Указываем, что панель гнутая
                    
doorL.Contour.Clear();
                    
doorL.Contour.AddRectangle(f0,c.ObjLength() - f2);// Задаём контур панели.
                    
doorL.BentDirection 0;    
                }else if(
radius.Value 0){                    
                    
blockD.RotateY(anFurn);
                    
doorL.RotateY(-anFurn);
                    
c.AddArc({xdoorsLW.Valuey0}, {x0y0}, {xdoorsLW.Value/2yhs}); 
                    
doorL.BentContour c;// Задаём траекторию
                    
doorL.Bent true;// Указываем, что панель гнутая
                    
doorL.Contour.Clear();
                    
doorL.Contour.AddRectangle(00c.ObjLength() , 2);// Ширина равна длине траектории гнутой панели
                    
doorL.BentDirection 1;                    
                }
                
//условия для расположения петель справа для радиуса
                
if ((locat.ItemIndex == &&  face.ItemIndex == 1) || (locat.ItemIndex == &&  face.ItemIndex == 0)){
                        
copy AddSymmetry(blockDNewVector(ld/200), AxisX);//симметрия двери
                        
DeleteObject(blockD);//удаление
                        
blockD copy;//копия
                
}        
            }
            
blockD.RotateY(270 + (+angel.Value));//поворот двери под углом
        
}
        
doorL.Build();
        
blockD.Translate(xT,f,zT);//смещение левой двери
    
}
}
//фрезеровка
function Milling(door){
    if (
faseType.ItemIndex != && radius.Value == ){
        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 = (2);//высота двери
        
switch (faseType.ItemIndex){
            case 
1:      //шесть окон          
                
rectW Math.round(((doorW) - 150)/2);//ширина окошек
                
rectHC Math.round((thick 4) / thick/2);    //высота середины полок
                
rectH Math.round((rectHC 180)/2);// высота крайних окошек
                
cont.AddRectangle (x1 60y1 60x1 60 rectWy1 60 rectH);
                
cont.AddRectangle (x2 60y1 60x2 60 rectWy1 60 rectH);
                
cont.AddRectangle (x1 60y1 90 rectHx1 60 rectWy2 90 rectH);
                
cont.AddRectangle (x2 60y1 90 rectHx2 60 rectWy2 90 rectH);
                
cont.AddRectangle (x1 60y2 60x1 60 rectWy2 60 rectH);
                
cont.AddRectangle (x2 60y2 60x2 60 rectWy2 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((150)/2);// высота окошек
                
cont.AddRectangle (x1 60y1 60x1 60 rectWy1 60 rectH);
                
cont.AddRectangle (x2 60y1 60x2 60 rectWy1 60 rectH);
                
cont.AddRectangle (x1 60y2 60x1 60 rectWy2 60 rectH);
                
cont.AddRectangle (x2 60y2 60x2 60 rectWy2 60 rectH);
                
cd.Subtraction(cont);
                
Glass(x1 50,y1 50,x2 50,y2 50,0);
            break;
            case 
3//одно окно
                
cont.AddRectangle (x1 60y1 60x2 60y2 -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 == && ((locat.ItemIndex == && face.ItemIndex == 1) || (locat.ItemIndex == && face.ItemIndex == 0))){        
        
door.GabMax.21;    
    }else {
        
door.GabMin.21;
    }
    
furn.Mount1(door,,door.GabMin.inFurn 2door.GabMin.z,0);
    
furn.Mount1(door,,door.GabMax.inFurn 2door.GabMin.z,0);    


//стекло для фрезеровок
function Glass(x1,y1,x2,y2,z){
    
glassMat.SetActive();
    
thickG ActiveMaterial.Thickness;
    
glass AddFrontPanel(x1,y1,x2,y2,thickG);
    
glass.Build();
    
glass.Name 'Стекло';

[свернуть]
Вложения
Тип файла: rar Петля.rar (2.7 Кб, 211 просмотров)
Тип файла: rar Навес.rar (2.4 Кб, 235 просмотров)
Максим Геннадьевич вне форума   Ответить с цитированием Вверх
11 пользователя(ей) сказали cпасибо: