Added Wheel component

* Bug on second Wheel canvas
This commit is contained in:
dbroqua 2018-07-29 10:26:45 +02:00
parent 4a7bc6d9c2
commit 190bc1547f
20 changed files with 12954 additions and 1 deletions

3
.eslintrc.js Normal file
View file

@ -0,0 +1,3 @@
module.exports = {
"extends": "airbnb"
};

21
.gitignore vendored Normal file
View file

@ -0,0 +1,21 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.
# dependencies
/node_modules
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

View file

@ -1,3 +1,19 @@
# car-tools # car-tools
Quelques outils pour vous aider dans votre bricoles auto Quelques outils pour vous aider dans votre bricoles auto
## Outils
### Roues
Cet outils vous permet de calculer la différence entre vos roues d'origines et vos nouvelles roues (largeur, diamètre, erreur au compteur...)
### Boite de vitesse
Cet outils vous permet de calculer votre régime moteur en fonction de votre vitesse.
Il vous permet aussi de calculer l'étalage de votre nouvelle boite si vous décidez d'en monter une qui n'est pas celle d'origines
### Résistance
Cet outils vous permet de calculer la valeur de la résistance qu'il vous faudra en fonction de votre alimentation et la led choisie.

11687
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

26
package.json Normal file
View file

@ -0,0 +1,26 @@
{
"name": "car-tools",
"version": "0.1.0",
"private": true,
"dependencies": {
"bootstrap": "^4.1.3",
"react": "^16.4.1",
"react-dom": "^16.4.1",
"react-router-dom": "^4.3.1",
"react-scripts": "1.1.4",
"reactstrap": "^6.3.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"devDependencies": {
"eslint": "^4.19.1",
"eslint-config-airbnb": "^17.0.0",
"eslint-plugin-import": "^2.13.0",
"eslint-plugin-jsx-a11y": "^6.1.1",
"eslint-plugin-react": "^7.10.0"
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

40
public/index.html Normal file
View file

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

15
public/manifest.json Normal file
View file

@ -0,0 +1,15 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
}
],
"start_url": "./index.html",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

43
src/App.css Normal file
View file

@ -0,0 +1,43 @@
.hidden {
display: none;
}
.clear{
clear: both;
}
.container {
margin-top: 16px;
}
.table>thead>tr>th,
.table-centered>tbody>tr>td{text-align:center}
figure{
margin:10px;
padding:10px;
background:#fff;
border:1px solid #dadada;
text-align:center
}
figcaption{
margin-top:5px;
padding:5px;
background:#f4f4f4;
border:1px dotted #dadada;
text-align:center
}
.result>figure{
float:left
}
.table>thead>tr>th.error{
color:#ce4844
}
.table>thead>tr>th.ok{
color:#1b809e
}
.table>thead>tr>th.default{
color:#aa6708
}

77
src/App.js Normal file
View file

@ -0,0 +1,77 @@
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
import {
Collapse,
Navbar,
NavbarToggler,
NavbarBrand,
Nav,
NavItem,
NavLink,
} from 'reactstrap';
import Home from './components/Home';
import Wheels from './components/Wheels';
import Gearbox from './components/Gearbox';
import Leds from './components/Leds';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
isOpen: false,
};
}
toggle() {
this.setState({
isOpen: !this.state.isOpen,
});
}
render() {
return (
<Router>
<div className="App">
<Navbar color="dark" dark expand="md">
<NavbarBrand href="/">
Car tools
</NavbarBrand>
<NavbarToggler onClick={this.toggle} />
<Collapse isOpen={this.state.isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem>
<NavLink tag={Link} to="/Wheels">
Roues
</NavLink>
</NavItem>
<NavItem>
<NavLink tag={Link} to="/Gearbox">
Boite de vitesse
</NavLink>
</NavItem>
<NavItem>
<NavLink tag={Link} to="/Leds">
Résistances
</NavLink>
</NavItem>
</Nav>
</Collapse>
</Navbar>
<div>
<Route exact path="/" component={Home} />
<Route exact path="/wheels" component={Wheels} />
<Route exact path="/Gearbox" component={Gearbox} />
<Route exact path="/Leds" component={Leds} />
</div>
</div>
</Router>
);
}
}
export default App;

9
src/App.test.js Normal file
View file

@ -0,0 +1,9 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
ReactDOM.unmountComponentAtNode(div);
});

15
src/components/Gearbox.js Normal file
View file

@ -0,0 +1,15 @@
import React, { Component } from 'react';
class Gearbox extends Component {
render() {
return (
<div>
{' '}
Gearbox
{' '}
</div>
);
}
}
export default Gearbox;

15
src/components/Home.js Normal file
View file

@ -0,0 +1,15 @@
import React, { Component } from 'react';
class Home extends Component {
render() {
return (
<div>
{' '}
Home
{' '}
</div>
);
}
}
export default Home;

15
src/components/Leds.js Normal file
View file

@ -0,0 +1,15 @@
import React, { Component } from 'react';
class Leds extends Component {
render() {
return (
<div>
{' '}
Leds
{' '}
</div>
);
}
}
export default Leds;

View file

@ -0,0 +1,251 @@
import React, { Component } from 'react';
import { Container, Row, Col, Table, FormGroup, Input, Button } from 'reactstrap';
import Result from "./results"
import 'bootstrap/dist/css/bootstrap.min.css';
import '../../App.css';
class Wheels extends Component {
state = {};
constructor(props) {
super(props);
const sizes = [];
for (let i = 10; i <= 24; i += 1) {
sizes.push(i);
}
this.state = {
sizes,
showResult: false,
oldWheelDiameter: 14,
oldWheelWidth: 6.5,
oldWheelET: 37,
oldTyreWidth: 175,
oldTyreHeight: 65,
newWheelDiameter: 15,
newWheelWidth: 7,
newWheelET: 42,
newTyreWidth: 195,
newTyreHeight: 50,
};
this.handleChange = this.handleChange.bind(this);
this.submit = this.submit.bind(this);
}
handleChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value,
showResult: false
});
}
submit() {
this.setState({
showResult: true
})
console.log('compute!')
}
render() {
return (
<Container>
<h1>
Calculez vos futures jantes et futurs pneus en ligne
</h1>
<Table bordered>
<thead>
<tr>
<th></th>
<th>Diamètre</th>
<th>Jante</th>
<th>Pneu</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Actuel</th>
<td>
<FormGroup>
<Input
type="select"
name="oldWheelDiameter"
value={this.state.oldWheelDiameter}
onChange={this.handleChange}>
{ this.state.sizes.map( item => (
<option value={item} key={`select_old_diametre_${item}`}>
{`${item}"`}
</option>
))}
</Input>
</FormGroup>
</td>
<td>
<Row>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="oldWheelWidth"
placeholder="Largeur"
step="0.1"
value={this.state.oldWheelWidth}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="oldWheelET"
placeholder="ET"
step="1"
value={this.state.oldWheelET}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
</Row>
</td>
<td>
<Row>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="oldTyreWidth"
placeholder="Largeur"
step="5"
value={this.state.oldTyreWidth}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="oldTyreHeight"
placeholder="Hauteur"
step="5"
value={this.state.oldTyreHeight}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
</Row>
</td>
</tr>
<tr>
<th scope="row">Nouveau</th>
<td>
<FormGroup>
<Input
type="select"
name="newWheelDiameter"
value={this.state.newWheelDiameter}
onChange={this.handleChange}>
{ this.state.sizes.map( item => (
<option value={item} key={`select_new_diametre_${item}`}>
{`${item}"`}
</option>
))}
</Input>
</FormGroup>
</td>
<td>
<Row>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="newWheelWidth"
placeholder="Largeur"
step="0.1"
value={this.state.newWheelWidth}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="newWheelET"
placeholder="ET"
step="1"
value={this.state.newWheelET}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
</Row>
</td>
<td>
<Row>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="newTyreWidth"
placeholder="Largeur"
step="5"
value={this.state.newTyreWidth}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
<Col xs="12" md="6">
<FormGroup>
<Input
type="number"
name="newTyreHeight"
placeholder="Hauteur"
step="5"
value={this.state.newTyreHeight}
onChange={this.handleChange}
/>
</FormGroup>
</Col>
</Row>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colSpan="4">
<Button onClick={this.submit}>Submit</Button>
</td>
</tr>
</tfoot>
</Table>
{
this.state.showResult ?
<Result
oldWheelDiameter={this.state.oldWheelDiameter}
oldWheelWidth={this.state.oldWheelWidth}
oldWheelET={this.state.oldWheelET}
oldTyreWidth={this.state.oldTyreWidth}
oldTyreHeight={this.state.oldTyreHeight}
newWheelDiameter={this.state.newWheelDiameter}
newWheelWidth={this.state.newWheelWidth}
newWheelET={this.state.newWheelET}
newTyreWidth={this.state.newTyreWidth}
newTyreHeight={this.state.newTyreHeight}
/>
:
(null)
}
</Container>
);
}
}
export default Wheels;

View file

@ -0,0 +1,583 @@
import React, { Component } from 'react';
class Results extends Component {
state = {};
constructor(props) {
super(props);
this.state = {
oldWheelDiameter: this.props.oldWheelDiameter,
oldWheelWidth: this.props.oldWheelWidth,
oldWheelET: this.props.oldWheelET,
oldTyreWidth: this.props.oldTyreWidth,
oldTyreHeight: this.props.oldTyreHeight,
newWheelDiameter: this.props.newWheelDiameter,
newWheelWidth: this.props.newWheelWidth,
newWheelET: this.props.newWheelET,
newTyreWidth: this.props.newTyreWidth,
newTyreHeight: this.props.newTyreHeight,
diffET: null,
}
}
componentDidMount () {
// Rim
const _ETOld=(2.54*Number(this.state.oldWheelWidth)/2)+Number(this.state.oldWheelET)/10;
const _ETNew=(2.54*Number(this.state.newWheelWidth)/2)+Number(this.state.newWheelET)/10;
const _wayOld=(2.54*Number(this.state.oldTyreWidth)/2)-Number(this.state.oldWheelET)/10;
const _wayNew=(2.54*Number(this.state.newWheelWidth)/2)-Number(this.state.newWheelET)/10;
const diffET=(_ETNew-_ETOld)*10;
const diffWay=(_wayNew-_wayOld)*10;
// Tyres
const diamRimOld=Number(this.state.oldWheelDiameter)*2.54;
const tyreHOld=Number(this.state.oldTyreWidth)*(Number(this.state.oldTyreHeight))/1000;
const diamWheelOld=diamRimOld+2*Number(this.state.oldTyreWidth)*(Number(this.state.oldTyreHeight))/1000;
const diamRimNew=Number(this.state.newWheelDiameter)*2.54;
const tyreHNew=Number(this.state.newTyreWidth)*(Number(this.state.newTyreHeight))/1000;
const diamWheelNew=diamRimNew+2*Number(this.state.newTyreWidth)*(Number(this.state.newTyreHeight))/1000;
const diffDiam=diamWheelNew-diamWheelOld;
const diffRayon=diffDiam/2;
const tolerance=tyreHOld*0.03;
const limitDown=diamWheelOld*0.97;
const limitUp=diamWheelOld*1.03;
// Wheel
let libelleColA='';
let libelleColB='';
let libelleColC='';
let libelleColD='';
let diamColA=0;
let diamColB=0;
let diamColC=0;
let diamColD=0;
let clsColA='';
let clsColB='';
let clsColC='';
let clsColD='';
const horsTolerance="Diamètre hors tolérance";
const ToleranceBasse="Tolérance mini autorisée";
const ToleranceHaute="Tolérance maxi autorisée";
const DiametreOrigine="Diamètre origine";
const DiametreNew="Nouveau diamètre";
if(diamWheelNew<limitDown){
libelleColA=horsTolerance;
libelleColB=ToleranceBasse;
libelleColC=DiametreOrigine;
libelleColD=ToleranceHaute;
diamColA=diamWheelNew;
diamColB=limitDown;
diamColC=diamWheelOld;
diamColD=limitUp;
clsColA="error";
clsColC="default";
}else if(diamWheelNew>limitUp){
libelleColA=ToleranceBasse;
libelleColB=DiametreOrigine;
libelleColC=ToleranceHaute;
libelleColD=horsTolerance;
diamColA=limitDown;
diamColB=diamWheelOld;
diamColC=limitUp;
diamColD=diamWheelNew;
clsColD="error";
clsColB="default";
}else{
if(diamWheelNew<diamWheelOld){
libelleColA=ToleranceBasse;
libelleColB=DiametreNew;
libelleColC=DiametreOrigine;
libelleColD=ToleranceHaute;
diamColA=limitDown;
diamColB=diamWheelNew;
diamColC=diamWheelOld;
diamColD=limitUp;
clsColB="ok";
clsColC="default";
}else{
libelleColA=ToleranceBasse;
libelleColB=DiametreOrigine;
libelleColC=DiametreNew;
libelleColD=ToleranceHaute;
diamColA=limitDown;
diamColB=diamWheelOld;
diamColC=diamWheelNew;
diamColD=limitUp;
clsColB="default";
clsColC="ok";
}
}
// SPeed
const pi=Math.PI;
const speed=90;
const rayonOld=(diamWheelOld*10);
const rayonNew=(diamWheelNew*10);
const tpm=speed/(pi*rayonOld);
const vitesseNew=(pi*rayonNew*tpm);
// Set state
this.setState({
diffET: diffET,
diffWay: diffWay,
diffDiam: diffDiam,
diffRayon: diffRayon,
tolerance: tolerance,
limitDown: limitDown,
limitUp: limitUp,
libelleColA: libelleColA,
libelleColB: libelleColB,
libelleColC: libelleColC,
libelleColD: libelleColD,
diamColA: diamColA,
diamColB: diamColB,
diamColC: diamColC,
diamColD: diamColD,
clsColA: clsColA,
clsColB: clsColB,
clsColC: clsColC,
clsColD: clsColD,
speed: speed,
vitesseNew: vitesseNew
});
this.drawWheel(diamWheelOld,diamWheelNew,diamRimOld,diamRimNew);
this.drawET(diamRimOld,diamRimNew,tyreHOld,tyreHNew);
}
toFixedFix(n,prec){
var k=Math.pow(10,prec);
return''+(Math.round(n*k)/k).toFixed(prec);
}
number_format(number,decimals,dec_point,thousands_sep){
number=(number+'').replace(/[^0-9+\-Ee.]/g,'');
const n=!isFinite(+number)?0:+number;
const prec=!isFinite(+decimals)?0:Math.abs(decimals);
const sep=(typeof thousands_sep==='undefined')?',':thousands_sep;
const dec=(typeof dec_point==='undefined')?'.':dec_point;
let s='';
s=(prec?this.toFixedFix(n,prec):''+Math.round(n)).split('.');
if(s[0].length>3){
s[0]=s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,sep);
}
if((s[1]||'').length<prec){
s[1]=s[1]||'';
s[1]+=new Array(prec-s[1].length+1).join('0');
}
return s.join(dec);
}
drawWheel(diamWheelOld,diamWheelNew,diamRimOld,diamRimNew){
let c = this.refs.roue_face;
var ctx=c.getContext("2d");
var scalling=2;
var YText=c.height-15;
var YArcOld=c.height-20-diamWheelOld*scalling;
var YArcNew=c.height-20-diamWheelNew*scalling;
var YTopWheelOld=c.height-20-diamWheelOld*scalling*2;
ctx.clearRect(0,0,c.width,c.height);
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(0,c.height);
ctx.lineTo(c.width,c.height);
ctx.lineTo(c.width,0);
ctx.lineTo(0,0);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=2;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(0,c.height-20);
ctx.lineTo(c.width,c.height-20);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=2;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(0,YTopWheelOld);
ctx.lineTo(c.width,YTopWheelOld);
ctx.strokeStyle="red";
ctx.setLineDash([8,3]);
ctx.lineWidth=2;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
var XAncien=diamWheelOld*scalling+20;
ctx.arc(XAncien,YArcOld,diamWheelOld*scalling,0,Math.PI*2,true);
ctx.setLineDash([0]);
ctx.strokeStyle="black";
ctx.fillStyle="black";
ctx.fill();ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.arc(XAncien,YArcOld,diamRimOld*scalling,0,Math.PI*2,true);
ctx.setLineDash([0]);
ctx.strokeStyle="white";
ctx.fillStyle="white";
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.font="10pt Verdana";
ctx.textAlign="center";
ctx.textBaseline="top";
ctx.fillStyle="#333";
ctx.fillText('Ancienne roue',XAncien,YText);
var imageAncienneWheel=new Image();
imageAncienneWheel.src='jante-face.png';
imageAncienneWheel.onload=function(){
var centreOldWheel=c.height-20-(diamWheelOld-diamRimOld)*scalling-diamRimOld*scalling*2;
ctx.drawImage(this,XAncien-diamRimOld*scalling,centreOldWheel,diamRimOld*scalling*2,diamRimOld*scalling*2);
};
ctx.beginPath();
var XNew=diamWheelOld*scalling*2+40+diamWheelNew*scalling;
ctx.arc(XNew,YArcNew,diamWheelNew*scalling,0,Math.PI*2,true);
ctx.setLineDash([0]);
ctx.strokeStyle="black";
ctx.fillStyle="black";
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.arc(XNew,YArcNew,diamRimNew*scalling,0,Math.PI*2,true);
ctx.setLineDash([0]);
ctx.strokeStyle="white";
ctx.fillStyle="white";
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.font="10pt Verdana";
ctx.textAlign="center";
ctx.textBaseline="top";
ctx.fillStyle="#333";
ctx.fillText('Nouvelle roue',XNew,YText);
var image=new Image();
image.src='jante-face.png';
image.onload=function(){
var centreNouvelleWheel=c.height-20-(diamWheelNew-diamRimNew)*scalling-diamRimNew*scalling*2;
ctx.drawImage(this,XNew-diamRimNew*scalling,centreNouvelleWheel,diamRimNew*scalling*2,diamRimNew*scalling*2);
};
}
drawET(diamRimOld,diamRimNew,tyreHOld,tyreHNew){
var c = this.refs.roue_profil;
var ctx=c.getContext("2d");
var scalling=5;
var YOld=c.height-50;
var YNew=c.height-50;
var XmoyeuOld=120;
var XmoyeuNew=395;
var actuel_jante_largeur=Number(this.state.oldWheelWidth);
var actuel_jante_ET=Number(this.state.oldWheelET);
var actuel_tyre_largeur=Number(this.state.oldTyreWidth);
var nouveau_jante_largeur=Number(this.state.newWheelWidth);
var nouveau_jante_ET=Number(this.state.newWheelET);
var nouveau_tyre_largeur=Number(this.state.newWheelWidth);
ctx.clearRect(0,0,c.width,c.height);
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(0,c.height);
ctx.lineTo(c.width,c.height);
ctx.lineTo(c.width,0);
ctx.lineTo(0,0);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=2;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(20,0);
ctx.lineTo(20,c.height);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=4;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(20,YOld);
ctx.lineTo(XmoyeuOld,YOld);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=16;
ctx.stroke();
ctx.closePath();
var largeurRimOld=scalling*(2.54*actuel_jante_largeur);
var rebordInterneOld=largeurRimOld/2+scalling*actuel_jante_ET/10;
var demiRimOld=scalling*diamRimOld/2;
ctx.beginPath();
ctx.moveTo(XmoyeuOld-rebordInterneOld,YOld-8);
ctx.lineTo(XmoyeuOld-rebordInterneOld,YOld-demiRimOld);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="#959595";
ctx.lineWidth=1;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(XmoyeuOld-rebordInterneOld,YOld-demiRimOld);
ctx.lineTo(XmoyeuOld+largeurRimOld-rebordInterneOld,YOld-demiRimOld);
ctx.lineTo(XmoyeuOld+largeurRimOld-rebordInterneOld,YOld-demiRimOld+10);
ctx.lineTo(XmoyeuOld,YOld-10);
ctx.lineTo(XmoyeuOld,YOld+10);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="#959595";
ctx.lineWidth=6;
ctx.stroke();
ctx.closePath();
var largeurPneuOld=actuel_tyre_largeur/10;
var ETPneuOld=((2.54*actuel_jante_largeur)-largeurPneuOld)/2;
var Y=YOld;
if(tyreHOld>largeurPneuOld){
Y=Math.sqrt(ETPneuOld*ETPneuOld-tyreHOld*tyreHOld);
}else{
Y=Math.sqrt(tyreHOld*tyreHOld-ETPneuOld*ETPneuOld);
}
ctx.beginPath();
ctx.moveTo((XmoyeuOld-rebordInterneOld),YOld-demiRimOld);
ctx.lineTo((XmoyeuOld-rebordInterneOld+ETPneuOld*scalling),(YOld-demiRimOld-Y*scalling));
ctx.lineTo((XmoyeuOld-rebordInterneOld+ETPneuOld*scalling+largeurPneuOld*scalling),(YOld-demiRimOld-Y*scalling));
ctx.lineTo(XmoyeuOld+largeurRimOld-rebordInterneOld,YOld-demiRimOld);
ctx.setLineDash([0]);
ctx.lineJoin="round";
ctx.lineCap="round";
ctx.strokeStyle="#000";
ctx.lineWidth=6;
ctx.stroke();
ctx.closePath();
ctx.font="10pt Verdana";
ctx.textAlign="center";
ctx.textBaseline="top";
ctx.fillStyle="#333";
ctx.fillText('Ancienne roue',XmoyeuOld,c.height-15);
ctx.beginPath();
ctx.moveTo(XmoyeuOld-115,YOld);
ctx.lineTo(XmoyeuOld+15,YOld);
ctx.setLineDash([8,3,4,3]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="red";
ctx.lineWidth=1;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(c.width/2+20,0);
ctx.lineTo(c.width/2+20,c.height);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=4;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(c.width/2+20,YNew);
ctx.lineTo(XmoyeuNew,YNew);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="black";
ctx.lineWidth=16;
ctx.stroke();
ctx.closePath();
var largeurRimNew=scalling*(2.54*nouveau_jante_largeur);
var rebordInterneNew=largeurRimNew/2+scalling*nouveau_jante_ET/10;
var demiRimNew=scalling*diamRimNew/2;
ctx.beginPath();
ctx.moveTo(XmoyeuNew-rebordInterneNew,YNew-8);
ctx.lineTo(XmoyeuNew-rebordInterneNew,YNew-demiRimNew);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="#959595";
ctx.lineWidth=1;
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(XmoyeuNew-rebordInterneNew,YNew-demiRimNew);
ctx.lineTo(XmoyeuNew+largeurRimNew-rebordInterneNew,YNew-demiRimNew);
ctx.lineTo(XmoyeuNew+largeurRimNew-rebordInterneNew,YNew-demiRimNew+10);
ctx.lineTo(XmoyeuNew,YNew-10);
ctx.lineTo(XmoyeuNew,YNew+10);
ctx.setLineDash([0]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="#959595";
ctx.lineWidth=6;
ctx.stroke();
ctx.closePath();
console.log("== Information nouvelle jante ==");
console.log("Largeur : "+(2.54*nouveau_jante_largeur));
console.log("ET : "+nouveau_jante_ET/10);
console.log("Position rebord interne : "+rebordInterneNew);
console.log("== END ==");
var largeurPneuNew=nouveau_tyre_largeur/10;
var ETPneuNew=((2.54*nouveau_jante_largeur)-largeurPneuNew)/2;Y=YNew;
if(tyreHNew>largeurPneuNew){
Y=Math.sqrt(ETPneuNew*ETPneuNew-tyreHNew*tyreHNew);
}else{
Y=Math.sqrt(tyreHNew*tyreHNew-ETPneuNew*ETPneuNew);
}
ctx.beginPath();
ctx.moveTo((XmoyeuNew-rebordInterneNew),YNew-demiRimNew);
ctx.lineTo((XmoyeuNew-rebordInterneNew+ETPneuNew*scalling),(YNew-demiRimNew-Y*scalling));
ctx.lineTo((XmoyeuNew-rebordInterneNew+ETPneuNew*scalling+largeurPneuNew*scalling),(YNew-demiRimNew-Y*scalling));
ctx.lineTo(XmoyeuNew+largeurRimNew-rebordInterneNew,YNew-demiRimNew);
ctx.setLineDash([0]);
ctx.lineJoin="round";
ctx.lineCap="round";
ctx.strokeStyle="#000";
ctx.lineWidth=6;
ctx.stroke();
ctx.closePath();
ctx.font="10pt Verdana";
ctx.textAlign="center";
ctx.textBaseline="top";
ctx.fillStyle="#333";
ctx.fillText('Nouvelle roue',XmoyeuNew,c.height-15);
ctx.beginPath();
ctx.moveTo(XmoyeuNew-115,YNew);
ctx.lineTo(XmoyeuNew+15,YNew);
ctx.setLineDash([8,3,4,3]);
ctx.lineJoin="bevel";
ctx.lineCap="butt";
ctx.strokeStyle="red";
ctx.lineWidth=1;
ctx.stroke();
ctx.closePath();
}
render() {
return (
<div>
<h1>Résultat</h1>
<h2>Jante</h2>
<p>
{ this.state.diffET > 0 ?
(
"Vos nouvelles jantes seront plus proches de votre pivot de " + this.number_format(this.state.diffET,2,',',' ') + " mm."
)
:
(
"Vos nouvelles jantes seront plus éloignées de votre pivot de " + this.number_format(this.state.diffET,2,',',' ') + " mm."
)
}
<br />
{
this.state.diffWay > 0 ?
(
"Vos nouvelles jantes ressortiront de " + this.number_format( this.state.diffWay, 2, ',', ' ' ) + " mm par rapport à l'origine."
)
:
(
"Vos nouvelles jantes rentreront de " + this.number_format(-(this.state.diffWay), 2, ',', ' ' ) + " mm par rapport à l'origine."
)
}
</p>
<h2>Pneu</h2>
<p>
{ this.state.diffDiam > 0 ?
(
<span>
{`Votre nouveau pneu aura un diamètre plus petit de ${this.number_format(- (this.state.diffDiam),2,',',' ')} cm.`}
<br />
{`Votre véhicule sera ainsi rabaissé de ${this.number_format(- (this.state.diffRayon),2,',',' ')} cm.`}
</span>
)
:
(
<span>
{`Votre nouveau pneu aura un diamètre plus grand de ${this.number_format( this.state.diffDiam,2,',',' ')} cm.`}
<br />
{`Votre véhicule sera ainsi réhaussé de ${this.number_format( this.state.diffRayon,2,',',' ')} cm.`}
</span>
)
}
<br />
<span className='glyphicon glyphicon-link' aria-hidden='true'></span>
<a href={`http://tyrestretch.com/${this.number_format(this.state.newWheelWidth,1,'.','')}-${this.state.newTyreWidth}-${this.state.newTyreHeight}-R${this.state.newWheelDiameter}/`} target='_blank'>Aperçu</a> (Il se peut qu'il n'y ai aucun aperçu pour cette dimension)
</p>
<h2>Vitesse</h2>
<p>
Quand votre compteur indique <strong>{this.state.speed} km/h</strong> vous roulez en réalité à <strong>{this.number_format(this.state.vitesseNew,2,',',' ')} km/h</strong>
</p>
<h2>Roue</h2>
<table className='table table-bordered table-condensed table-centered'>
<thead>
<tr>
<th className={this.state.clsColA}>{this.state.libelleColA}</th>
<th className={this.state.clsColB}>{this.state.libelleColB}</th>
<th className={this.state.clsColC}>{this.state.libelleColC}</th>
<th className={this.state.clsColD}>{this.state.libelleColD}</th>
</tr>
</thead>
<tbody>
<tr>
<td className='col-xs-3'>{this.number_format(this.state.diamColA,2,',',' ')}</td>
<td className='col-xs-3'>{this.number_format(this.state.diamColB,2,',',' ')}</td>
<td className='col-xs-3'>{this.number_format(this.state.diamColC,2,',',' ')}</td>
<td className='col-xs-3'>{this.number_format(this.state.diamColD,2,',',' ')}</td>
</tr>
</tbody>
</table>
<figure>
<canvas width="550" height="300" ref="roue_face">
Votre navigateur ne prends pas en charge la gestion des Canvas. Vous ne pourrez pas visualer le rendu de votre nouvelle roue.
</canvas>
<figcaption>Comparaison ancienne et nouvelle roue, vue de face</figcaption>
</figure>
<figure>
<canvas width="550" height="300" ref="roue_profil">
Votre navigateur ne prends pas en charge la gestion des Canvas. Vous ne pourrez pas visualer le rendu de votre nouvelle roue.
</canvas>
<figcaption>Comparaison ancienne et nouvelle roue, demie vue de profil</figcaption>
</figure>
</div>
);
}
}
export default Results;
/*
*/

5
src/index.css Normal file
View file

@ -0,0 +1,5 @@
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}

8
src/index.js Normal file
View file

@ -0,0 +1,8 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

7
src/logo.svg Normal file
View file

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
<g fill="#61DAFB">
<path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
<circle cx="420.9" cy="296.5" r="45.7"/>
<path d="M520.5 78.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,117 @@
// In production, we register a service worker to serve assets from local cache.
// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on the "N+1" visit to a page, since previously
// cached resources are updated in the background.
// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
// This link also includes instructions on opting out of this behavior.
const isLocalhost = Boolean(
window.location.hostname === 'localhost' ||
// [::1] is the IPv6 localhost address.
window.location.hostname === '[::1]' ||
// 127.0.0.1/8 is considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
export default function register() {
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
if (publicUrl.origin !== window.location.origin) {
// Our service worker won't work if PUBLIC_URL is on a different origin
// from what our page is served on. This might happen if a CDN is used to
// serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
return;
}
window.addEventListener('load', () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
if (isLocalhost) {
// This is running on localhost. Lets check if a service worker still exists or not.
checkValidServiceWorker(swUrl);
// Add some additional logging to localhost, pointing developers to the
// service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => {
console.log(
'This web app is being served cache-first by a service ' +
'worker. To learn more, visit https://goo.gl/SC7cgQ'
);
});
} else {
// Is not local host. Just register service worker
registerValidSW(swUrl);
}
});
}
}
function registerValidSW(swUrl) {
navigator.serviceWorker
.register(swUrl)
.then(registration => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
installingWorker.onstatechange = () => {
if (installingWorker.state === 'installed') {
if (navigator.serviceWorker.controller) {
// At this point, the old content will have been purged and
// the fresh content will have been added to the cache.
// It's the perfect time to display a "New content is
// available; please refresh." message in your web app.
console.log('New content is available; please refresh.');
} else {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
console.log('Content is cached for offline use.');
}
}
};
};
})
.catch(error => {
console.error('Error during service worker registration:', error);
});
}
function checkValidServiceWorker(swUrl) {
// Check if the service worker can be found. If it can't reload the page.
fetch(swUrl)
.then(response => {
// Ensure service worker exists, and that we really are getting a JS file.
if (
response.status === 404 ||
response.headers.get('content-type').indexOf('javascript') === -1
) {
// No service worker found. Probably a different app. Reload the page.
navigator.serviceWorker.ready.then(registration => {
registration.unregister().then(() => {
window.location.reload();
});
});
} else {
// Service worker found. Proceed as normal.
registerValidSW(swUrl);
}
})
.catch(() => {
console.log(
'No internet connection found. App is running in offline mode.'
);
});
}
export function unregister() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(registration => {
registration.unregister();
});
}
}