Implémenter l'orientation verticale Modifier l'effet de append Implementer RigidBody Implementer Flex et simplex Implémenter Push Implémenter Swap Implement MinMaxHeight without behaviors Fix Margin for Height Implement PositionReference Fix dimension vertical position inside children Add orientation change in form Implement sortChildren Implement Anchor Fix warning message on overlapping Fix minimap when root container is vertical #7287 #7288 #7289 #7290 #7291 #7292 #7294 #7295 #7296 #7297 #7298 #7299 #7300 #7301 #7302
267 lines
6.4 KiB
JavaScript
267 lines
6.4 KiB
JavaScript
// http.js
|
|
import { serve } from 'bun';
|
|
|
|
serve({
|
|
port: 5000,
|
|
async fetch(request) {
|
|
console.log(`${request.method}: ${request.url}`);
|
|
if (request.method === 'POST') {
|
|
const url = new URL(request.url);
|
|
let json;
|
|
if (url.pathname === '/GetSVGLayoutConfiguration') {
|
|
json = GetSVGLayoutConfiguration();
|
|
} else if (url.pathname === '/SetContainerList') {
|
|
const bodyParsed = await request.json();
|
|
console.log(bodyParsed);
|
|
switch (bodyParsed.Action) {
|
|
case 'FillHoleWithChassis':
|
|
json = FillHoleWithChassis(bodyParsed);
|
|
break;
|
|
case 'SplitRemplissage':
|
|
json = SplitRemplissage(bodyParsed);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (url.pathname === '/GetFeedback') {
|
|
const bodyParsed = await request.json();
|
|
console.log(bodyParsed);
|
|
json = {
|
|
messages: [
|
|
{
|
|
text: `${new Date()}`,
|
|
type: 3
|
|
}
|
|
]
|
|
}
|
|
} else {
|
|
// TODO: Return 404 rather than this
|
|
json = GetSVGLayoutConfiguration();
|
|
}
|
|
return new Response(JSON.stringify(json), {
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Headers': '*'
|
|
}
|
|
});
|
|
}
|
|
|
|
return new Response('Welcome to Bun!', {
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'text/plain',
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Headers': '*'
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
const GetSVGLayoutConfiguration = () => {
|
|
return {
|
|
AvailableContainers: [
|
|
{
|
|
Type: 'Chassis',
|
|
DisplayedText: 'Chassis?',
|
|
Whitelist: ["Trou"],
|
|
MaxWidth: 500,
|
|
MinWidth: 200,
|
|
Width: 200,
|
|
DefaultChildType: 'Trou',
|
|
Style: {
|
|
fillOpacity: 1,
|
|
strokeWidth: 2,
|
|
stroke: 'red',
|
|
fill: '#d3c9b7',
|
|
},
|
|
ShowSelfDimensions: true,
|
|
IsDimensionBorrower: true,
|
|
Category: "Stuff"
|
|
},
|
|
{
|
|
Type: 'Trou',
|
|
Blacklist: ["Chassis"],
|
|
Margin: {
|
|
left: 10,
|
|
bottom: 10,
|
|
top: 10,
|
|
right: 10,
|
|
},
|
|
DefaultChildType: 'Remplissage',
|
|
Style: {
|
|
fillOpacity: 1,
|
|
strokeWidth: 2,
|
|
stroke: 'green',
|
|
fill: 'white'
|
|
},
|
|
Category: "Stuff"
|
|
},
|
|
{
|
|
Type: 'Remplissage',
|
|
Category: "Other stuff",
|
|
CustomSVG: `
|
|
<rect width="{width}" height="{height}" style="{style}"></rect>
|
|
<rect width="{width}" height="{height}" stroke="black" fill-opacity="0"></rect>
|
|
<line x1="0" y1="0" x2="{width}" y2="{height}" stroke="black" style='{{ "transform":"scaleY(0.5)"}}'></line>
|
|
<line x1="{width}" y1="0" x2="0" y2="{height}" stroke="black" style='{userData.styleLine}'></line>
|
|
`
|
|
,
|
|
Actions: [
|
|
{
|
|
Id: "SplitRemplissage",
|
|
Action: "SplitRemplissage",
|
|
Label: "Diviser le remplissage",
|
|
Description: "Diviser le remplissage en insérant un montant",
|
|
CustomLogo: {
|
|
Base64Image: null,
|
|
Name: 'Image1',
|
|
Svg: null,
|
|
Url: ""
|
|
},
|
|
AddingBehavior: 2
|
|
}
|
|
],
|
|
Style: {
|
|
fillOpacity: 1,
|
|
strokeWidth: 1,
|
|
fill: '#bfdbfe'
|
|
},
|
|
UserData: {
|
|
styleLine: {
|
|
transform: "scaleY(0.5) translateY(100%)",
|
|
transformBox: "fill-box"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
Type: 'Montant',
|
|
Width: 10,
|
|
PositionReference: 1,
|
|
MarkPositionToDimensionBorrower: true,
|
|
Style: {
|
|
fillOpacity: 0,
|
|
strokeWidth: 2,
|
|
stroke: '#713f12',
|
|
fill: '#713f12',
|
|
}
|
|
},
|
|
{
|
|
Type: 'Dilatation',
|
|
Width: 4,
|
|
PositionReference: 1,
|
|
MarkPositionToDimensionBorrower: true,
|
|
Style: {
|
|
fillOpacity: 0,
|
|
strokeWidth: 2,
|
|
stroke: '#713f12',
|
|
fill: '#713f12',
|
|
}
|
|
},
|
|
{
|
|
Type: '200',
|
|
MaxWidth: 500,
|
|
MinWidth: 200,
|
|
Style: {
|
|
fillOpacity: 1,
|
|
strokeWidth: 2,
|
|
stroke: 'blue',
|
|
fill: 'blue',
|
|
}
|
|
},
|
|
{
|
|
Type: '400',
|
|
MaxWidth: 500,
|
|
MinWidth: 400,
|
|
Style: {
|
|
fillOpacity: 1,
|
|
strokeWidth: 2,
|
|
stroke: 'red',
|
|
fill: 'red',
|
|
}
|
|
}
|
|
],
|
|
AvailableSymbols: [
|
|
{
|
|
Width: 32,
|
|
Height: 32,
|
|
Image: {
|
|
Base64Image: null,
|
|
Name: 'Image1',
|
|
Svg: null,
|
|
Url: 'https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg'
|
|
},
|
|
Name: 'Poteau structure',
|
|
PositionReference: 1
|
|
},
|
|
{
|
|
Width: 32,
|
|
Height: 32,
|
|
Image: {
|
|
Base64Image: null,
|
|
Name: 'Image2',
|
|
Svg: null,
|
|
Url: 'https://e7.pngegg.com/pngimages/647/127/png-clipart-svg-working-group-information-world-wide-web-internet-structure.png'
|
|
},
|
|
Name: 'Joint de structure',
|
|
PositionReference: 0
|
|
}
|
|
],
|
|
Categories: [
|
|
{
|
|
Type: "Stuff",
|
|
DisplayedText: "Stuff made here"
|
|
},
|
|
{
|
|
Type: "Other stuff",
|
|
DisplayedText: "Stuff not made here"
|
|
}
|
|
],
|
|
Patterns: [],
|
|
MainContainer: {
|
|
Type: 'main',
|
|
Width: 800,
|
|
Height: 200
|
|
}
|
|
}
|
|
};
|
|
|
|
const FillHoleWithChassis = (request) => {
|
|
const maxWidthChassis = 3000;
|
|
const nbChassis = Math.ceil(request.ContainerAction.Width / maxWidthChassis);
|
|
const lstModels = [];
|
|
for (let i = 0; i <= nbChassis; i++) {
|
|
if (i === 1 && request.ContainerAction.ExistOnBefore) {
|
|
lstModels.push({ Type: 'Dilatation' });
|
|
}
|
|
lstModels.push({ Type: 'Chassis' });
|
|
if (i < nbChassis) {
|
|
lstModels.push({ Type: 'Dilatation' });
|
|
}
|
|
if (i === nbChassis && request.ContainerAction.ExistOnAfter) {
|
|
lstModels.push({ Type: 'Dilatation' });
|
|
}
|
|
}
|
|
return {
|
|
Containers: lstModels
|
|
};
|
|
};
|
|
|
|
const SplitRemplissage = (request) => {
|
|
const lstModels = [
|
|
{
|
|
Type: 'Remplissage'
|
|
},
|
|
{
|
|
Type: 'Montant'
|
|
},
|
|
{
|
|
Type: 'Remplissage'
|
|
},
|
|
];
|
|
|
|
return {
|
|
Containers: lstModels
|
|
};
|
|
};
|