Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Akctarus committed Nov 16, 2023
1 parent f4c12f9 commit 7c7639a
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import React, { useEffect, useState } from 'react';
import { WidgetProps } from '@rjsf/core';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
import { Point } from 'geojson';
import { TrackSectionEntity } from 'types';
import { calculateDistanceAlongTrack } from './tool-factory';

export const CustomPosition: React.FC<
WidgetProps & { value?: number; track: TrackSectionEntity; point: Point }
> = (props) => {
const { schema, onChange, title, value, track, point } = props;
const [, setLocalDistance] = useState(value);
const POINT_NAME = 'point-parameter';

useEffect(() => {
if (track && point) {
const calculatedDistance = calculateDistanceAlongTrack(track, point);
setLocalDistance(calculatedDistance);
}
}, [track, point]);
const handleInputChange = (e: any) => {
const newDistance = e.target.value;
setLocalDistance(newDistance);
onChange(newDistance);
};

return (
<div key={`${POINT_NAME}-${schema.description}`}>
<p>{title}</p>
<InputSNCF
name={POINT_NAME}
id={`${POINT_NAME}-${schema.description}`}
value={value}
onChange={handleInputChange}
type="number"
/>
</div>
);
};

export default CustomPosition;
27 changes: 20 additions & 7 deletions front/src/applications/editor/tools/pointEdition/components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useDispatch, useSelector } from 'react-redux';
import { Popup } from 'react-map-gl/maplibre';
import { useTranslation } from 'react-i18next';
import { featureCollection } from '@turf/helpers';
import { isEqual } from 'lodash';
import { cloneDeep, isEqual } from 'lodash';
import along from '@turf/along';
import { BiArrowFromLeft, BiArrowToRight } from 'react-icons/bi';
import { BsBoxArrowInRight } from 'react-icons/bs';
Expand All @@ -20,6 +20,8 @@ import {
TrackSectionEntity,
RouteEntity,
SignalEntity,
BufferStopEntity,
DetectorEntity,
} from 'types';
import { osrdEditoastApi } from 'common/api/osrdEditoastApi';
import EditorForm from 'applications/editor/components/EditorForm';
Expand All @@ -37,12 +39,17 @@ import {
import { getEditRouteState } from 'applications/editor/tools/routeEdition/utils';
import TOOL_TYPES from 'applications/editor/tools/toolTypes';
import { EditoastType } from 'applications/editor/tools/types';
import { Point } from 'geojson';
import { CustomFlagSignalCheckbox } from './CustomFlagSignalCheckbox';
import { PointEditionState } from './types';
import { formatSignalingSystems } from './utils';
import CustomPosition from './CustomPosition';
import { calculateDistanceAlongTrack } from './tool-factory';

export const POINT_LAYER_ID = 'pointEditionTool/new-entity';

type EditorPoint = BufferStopEntity | DetectorEntity | SignalEntity;

/**
* Generic component to show routes starting or ending from the edited waypoint:
*/
Expand Down Expand Up @@ -259,6 +266,9 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = <Entity extends
},
},
},
position: {
'ui:widget': CustomPosition,
},
}}
onSubmit={async (savedEntity) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down Expand Up @@ -293,7 +303,8 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = <Entity extends
});
}
}}
onChange={(entity: Entity | SignalEntity) => {
onChange={(entity: Entity | SignalEntity | EditorPoint) => {
const newEntity = cloneDeep(entity);
const additionalUpdate: Partial<Entity> = {};
const additionalPropertiesUpdate: Partial<SignalEntity['properties']> = {};
const newPosition = entity.properties?.position;
Expand All @@ -307,22 +318,24 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = <Entity extends
typeof oldPosition === 'number' &&
newPosition !== oldPosition
) {
const point = along(trackState.track, newPosition, { units: 'meters' });
const position = calculateDistanceAlongTrack(
trackState.track,
newEntity.geometry as Point
);
const point = along(trackState.track, position, { units: 'meters' });
additionalUpdate.geometry = point.geometry;
}

if (entity.objType === 'Signal' && entity.properties.logical_signals) {
additionalPropertiesUpdate.logical_signals = formatSignalingSystems(
entity as SignalEntity
);
}

setState({
...state,
entity: {
...(entity as Entity),
...(newEntity as Entity),
...additionalUpdate,
properties: { ...(entity as Entity).properties, ...additionalPropertiesUpdate },
properties: { ...(newEntity as Entity).properties, ...additionalPropertiesUpdate },
},
});
}}
Expand Down
17 changes: 10 additions & 7 deletions front/src/applications/editor/tools/pointEdition/tool-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ interface PointEditionToolParams<T extends EditorPoint> {
requiresAngle?: boolean;
}

export function calculateDistanceAlongTrack(track: Feature<LineString>, point: Point) {
const wrongPointOnTrack = nearestPointOnLine(track.geometry, point, { units: 'meters' });
return approximateDistanceWithEditoastData(
track as TrackSectionEntity,
wrongPointOnTrack.geometry
);
}

function getPointEditionTool<T extends EditorPoint>({
layer,
icon,
Expand Down Expand Up @@ -115,14 +123,9 @@ function getPointEditionTool<T extends EditorPoint>({

getEntity(infraID as number, newEntity.properties.track, 'TrackSection', dispatch).then(
(track) => {
const wrongPointOnTrack = nearestPointOnLine(
(track as Feature<LineString>).geometry,
newEntity.geometry as Point,
{ units: 'meters' }
);
const distanceAlongTrack = approximateDistanceWithEditoastData(
const distanceAlongTrack = calculateDistanceAlongTrack(
track as TrackSectionEntity,
wrongPointOnTrack.geometry
newEntity.geometry as Point
);
newEntity.properties.position = distanceAlongTrack;

Expand Down

0 comments on commit 7c7639a

Please sign in to comment.