Session 022: Migrate Lts/Tools (72 submodules) to Qt6

- Copied complete Lts/Tools directory from qt5-before to qt6-after
- Updated 32 CMakeLists.txt files (Qt5:: → Qt6::)
- Tools subdirectory already included in parent Lts/CMakeLists.txt
- All 72 tool submodules now present in qt6-migrated-legatus
- Includes: Adler, ArAssets, ConfigX, DBAdministration, DBUpdate,
  DdsView, InfrastructureManagement, and 67 more tools
- C++17 standard (RTI 7.7.0 compatibility maintained)
- Tests deferred until final validation phase

Migration progress:
✅ Lts/Application (68 files)
✅ Lts/DDS (verified Qt6-ready)
✅ Lts/Plugins (60 submodules, verified)
✅ Lts/Projects (5 submodules, verified)
✅ Lts/Proxies (13 submodules, verified)
✅ Lts/Services (47 submodules, verified)
✅ Lts/Tools (72 submodules, copied + CMake updated)
✅ Lts/Viewer (LtsFileDialog, LtsReportDisplay, SituationMap)
🟡 TetraIF (partial)
🟡 Z (partial: nglwidgets, QtSingleApplication, qsql_informix, WMS_Interface)
This commit is contained in:
torsten committed 2026-08-25 14:07:20 +02:00
1 parent 01dce5fe52
commit d5c13033e2
1792 files changed
+982018

No files matched your search

@@ -0,0 +1,41 @@
import { useEffect, useCallback } from 'react'
import { useSelector, useDispatch } from 'react-redux'
import '../styles/errorpopup.css'
import { exerciseError } from '../store/exerciseSlice'
import { participantError } from '../store/participantSlice';
import { partyDataError } from '../store/partySlice';
export function ErrorPopup() {
const message = useSelector((state) => state.participants.errorMessage || state.exercise.errorMessage || state.party.errorMessage)
const isError = useSelector((state) => state.participants.isError || state.exercise.isError || state.party.isError)
const dispatch = useDispatch();
const resetStates = useCallback(() => {
dispatch(exerciseError(''));
dispatch(participantError(''));
dispatch(partyDataError(''));
}, [dispatch]);
useEffect(() => {
let timer;
if (isError) {
timer = setTimeout(() => {
resetStates();
}, 5000); // Setzt den Timer auf 5 Sekunden
}
return () => clearTimeout(timer); // Bereinigt den Timer, wenn die Komponente unmountet wird oder isError sich ändert
}, [isError, dispatch, resetStates]);
return (
<>
{isError &&
<div className="popup-error">
<button className="popup-error-button" onClick={() => resetStates()}>X</button>
<p>{message}</p>
</div>
}
</>
)
}
@@ -0,0 +1,106 @@
import React, { useState } from "react";
import { MapContainer, TileLayer, FeatureGroup, Marker, Tooltip, Polyline } from 'react-leaflet';
import { EditControl } from "react-leaflet-draw";
import { connect, useDispatch } from "react-redux";
import L from 'leaflet';
import MapEvents from '../helper/mapEvent.js';
import '../styles/map.css';
import 'leaflet/dist/leaflet.css';
import 'leaflet-draw/dist/leaflet.draw.css';
import icon from 'leaflet/dist/images/marker-icon.png';
import iconShadow from 'leaflet/dist/images/marker-shadow.png';
import { setWalkingPath } from "../store/participantSlice.js";
import { completedDrawing } from "./participantList.js";
import { addLayers, deleteLayers } from "../store/layerSlice.js";
let DefaultIcon = L.icon({
iconUrl: icon,
shadowUrl: iconShadow,
iconSize: [25, 41],
iconAnchor: [12.5, 41]
});
L.Marker.prototype.options.icon = DefaultIcon;
function MapBox({ mapPosition, participants, currentParticipant, layers }) {
const [position, setPosition] = useState({ lat: 0, lng: 0 });
const [clickPosition, setClickPosition] = useState({ lat: 0, lng: 0 });
const dispatch = useDispatch();
return (
<div>
<p className="map-position-center">Center : {position.lat.toFixed(3)} | {position.lng.toFixed(3)}</p>
<p className="map-position-click">Clicked : {clickPosition.lat.toFixed(3)} | {clickPosition.lng.toFixed(3)}</p>
<MapContainer
key={mapPosition.toString()}
center={mapPosition}
zoom={14.5}
scrollWheelZoom={true}
attributionControl={false}
>
<TileLayer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<FeatureGroup>
<EditControl key={currentParticipant}
onCreated={(e) => {
if (e.layerType === 'polyline') {
localStorage.setItem(currentParticipant, true)
dispatch(deleteLayers(currentParticipant))
dispatch(setWalkingPath({ equipmentNumber: currentParticipant, path: JSON.parse(JSON.stringify(e.layer.getLatLngs())) }))
completedDrawing()
var newObject = {
layers: [],
participant: currentParticipant
}
newObject.layers.push(JSON.parse(JSON.stringify(e.layer.getLatLngs())))
dispatch(addLayers(newObject))
e.layer.remove()
}
}}
position='topright'
edit={{
edit: false,
remove: false,
}}
draw={{
rectangle: false,
circle: false,
circlemarker: false,
polygon: false
}}
/>
</FeatureGroup>
{/* Display the participants on the map */}
{participants.map((participant, i) => (
<Marker key={i} position={[participant.currentPosition[0], participant.currentPosition[1]]}>
<Tooltip>{participant.equipmentNumber}</Tooltip>
</Marker>
))}
{layers.map((layer, i) => (
<Polyline key={i} positions={layer.layers} />
))}
<MapEvents setPosition={setPosition} mapPosition={mapPosition} setClickPosition={setClickPosition} />
</MapContainer>
</div>
);
}
const mapStateToProps = (state) => {
return {
mapPosition: state.map,
participants: state.participants.data,
currentParticipant: state.participants.currentParticipantWalkPathEq,
layers: state.layer
};
};
export default connect(mapStateToProps)(MapBox);
@@ -0,0 +1,134 @@
import React, { useState } from 'react';
import "../styles/participantList.css"
import logo from "../assets/group-svgrepo-com.svg"
import { useDispatch } from 'react-redux'
import { changeMapPosition } from '../store/mapSlice';
import { useSetAbcProtection, select, setCurrentWalkParticipant } from '../store/participantSlice';
import { useCalculation } from '../helper/walkingPathCaclulation';
import { sleep } from '../helper/sleep';
import { changeHoldingPathValue } from './sideBar';
let isFinishedDrawing = false;
export function completedDrawing() {
isFinishedDrawing = true;
}
export function startDrawing() {
isFinishedDrawing = false;
}
export default function ParticipantList(participant) {
const [buttonState, setButtonState] = useState(false);
const calculate = useCalculation()
const dispatch = useDispatch()
// Handels value of checkbox input
const useHandleChange = (e) => {
let checkStatus = participant.participant.abcProtection
dispatch(useSetAbcProtection({ equipmentNumber: participant.participant.equipmentNumber, newAbcProtection: !checkStatus }))
};
// Opens Collapsible
function buttonPressed() {
setButtonState(!buttonState);
}
async function drawingPath() {
dispatch(setCurrentWalkParticipant({ currentParticipantWalkPathEq: participant.participant.equipmentNumber }))
let drawButton = document.getElementsByClassName("leaflet-draw-draw-polyline")[0];
await sleep(10)
drawButton.click()
}
function patrouille() {
localStorage.setItem(participant.participant.equipmentNumber.toString(), false)
calculate(participant.participant.path, participant.participant.equipmentNumber, participant.participant, "Patrouille")
startDrawing()
}
function oneTimeUsePath() {
localStorage.setItem(participant.participant.equipmentNumber.toString(), false)
calculate(participant.participant.path, participant.participant.equipmentNumber, participant.participant, "OTUP")
startDrawing()
}
function hold() {
localStorage.setItem(participant.participant.equipmentNumber.toString(), false)
calculate(participant.participant.path, participant.participant.equipmentNumber, participant.participant, "Hold")
startDrawing()
changeHoldingPathValue(true)
}
return (
<div className='collapsible-div'>
<button className={buttonState ? 'collapsible-active' : 'collapsible'} onClick={buttonPressed}>
<img src={logo} alt="Group" className='group-icon' />
<div className='participant-text'>
<p style={{ color: participant.participant.party }} > {participant.participant.equipmentNumber} | {participant.participant.type}</p>
</div>
</button>
{buttonState &&
<div className="content">
{/* Table of Participants Information */}
<table className='participants-table'>
<tbody>
<tr>
<td>
<h4>Group:</h4>
</td>
<td>{participant.participant.party}</td>
</tr>
<tr>
<td>
<h4>Typ:</h4>
</td>
<td>{participant.participant.type}</td>
</tr>
<tr>
<td>
<h4>Equip. No.:</h4>
</td>
<td>{participant.participant.equipmentNumber}</td>
</tr>
<tr>
<td>
<h4>Position:</h4>
</td>
<td>{participant.participant.currentPosition[0].toFixed(3)} | {participant.participant.currentPosition[1].toFixed(3)}</td>
</tr>
<tr>
<td>
<h4>ABC Protection:</h4>
</td>
<td><input type="checkbox" value={participant.participant.abcProtection} onChange={useHandleChange}></input></td>
</tr>
<tr>
<td>
<h4>Status:</h4>
</td>
<td>{participant.participant.status}</td>
</tr>
</tbody>
</table>
{/* Buttons for the Participants */}
<div className='collapsible-button-div'>
<button onClick={() => dispatch(changeMapPosition(participant.participant.currentPosition))} className="collapsible-button">GO TO</button>
<button className='collapsible-button' onClick={() => dispatch(select({ participant: participant.participant }))}>SET POS</button>
<button className='collapsible-button' onClick={() => drawingPath()}>EMULATE RUN</button>
{isFinishedDrawing && (
<div className='choose-popup'>
<button className='collapsible-button' onClick={() => patrouille()}>Patrouille</button>
<button className='collapsible-button' onClick={() => oneTimeUsePath()}>One time use path</button>
<button className='collapsible-button' onClick={() => hold()}>Hold Path</button>
</div>
)}
</div>
</div>
}
</div>
);
}
@@ -0,0 +1,123 @@
import React, { useCallback, useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux'
import { useCheckIfParticipantIsValid } from '../websocket/checkIfParticipantIsValid'
import "../styles/popup.css"
import { useGetPartyData } from '../websocket/getPartyData';
import { clearPartyData } from '../store/partySlice';
import { setCurrentExerciseId } from '../store/exerciseSlice';
export default function Popup({ createPopupState, setPopupState }) {
const [equipmentNumber, setEquipmentNumber] = useState('');
const [selectedExerciseId, setSelectedExerciseId] = useState('');
const [isExerciseIdSelected, setIsExerciseIdSelected] = useState(false);
const [partyId, setPartyId] = useState(2);
const partyList = useSelector((state) => state.party.partyData);
const dispatch = useDispatch()
const excerciseIds = useSelector((state) => state.exercise.exerciseIds);
// Add participant to the store
function useHandleClick() {
useCheckIfParticipantIsValid(equipmentNumber, selectedExerciseId, dispatch, partyList, partyId);
dispatch(clearPartyData([]))
setIsExerciseIdSelected(false)
}
function useHandleExerciseIdSubmit() {
useGetPartyData(selectedExerciseId, dispatch)
setIsExerciseIdSelected(!isExerciseIdSelected)
setPartyId(2)
dispatch(setCurrentExerciseId(selectedExerciseId))
setPopupState(false)
}
function handlePartyNameChange(event) {
setPartyId(event.target.value)
}
// Handle input change
const handleInputChange = (event) => {
setEquipmentNumber(event.target.value);
};
// Handle exerciseId change
const handleExerciseIdChange = (event) => {
setSelectedExerciseId(event.target.value);
};
// Close popup when ESC key is pressed
const handleKeyDown = useCallback((event) => {
if (event.keyCode === 27) {
setPopupState(false);
}
}, [setPopupState]);
// Add event listener when popup is open
useEffect(() => {
if (createPopupState) {
document.addEventListener("keydown", handleKeyDown);
return () => {
document.removeEventListener("keydown", handleKeyDown);
};
}
}, [createPopupState, handleKeyDown]);
return (
<>
{createPopupState && (
<div className='popup-blur'>
<div className="popup">
<p className="popup-text">SELECT EXERCISE ID</p>
</div>
<div className='select-party'>
<form className='select-party-form'>
<select value={selectedExerciseId} onChange={handleExerciseIdChange} className='select-party-form-select'>
{excerciseIds.map((exerciseId) => (
<option key={exerciseId} value={exerciseId}>{exerciseId}</option>
))}
</select>
</form>
<div className="select-party-text">ID :</div>
<div className="select-party-dropdown"></div>
</div>
<div className="popup-buttons">
<button className="popup-cancel" onClick={() => setPopupState(false)}>Cancel</button>
<button onClick={useHandleExerciseIdSubmit} className="popup-submit">Submit</button>
</div>
</div>
)}
{isExerciseIdSelected && (
<div className='popup-blur'>
<div className="popup">
<p className="popup-text">ADD A PARTICIPANT</p>
</div>
<div className="select-party">
<form className='select-party-form'>
<select id="group" name="group" className='select-party-form-select' onChange={handlePartyNameChange}>
{partyList.map((item, index) => (
<option key={index} value={item.id} style={{ color: item.color }}>{item.party}</option>
))}
</select>
</form>
<div className="select-party-text">Group :</div>
<div className="select-party-dropdown"></div>
</div>
<div className='select-number'>
<input className='select-number-inputfield' type="number" value={equipmentNumber} onChange={handleInputChange}></input>
<div className="select-number-text">Number :</div>
<div className="select-number-inputfield-div"></div>
</div>
<div className="popup-buttons">
<button className="popup-cancel" onClick={() => setIsExerciseIdSelected(false)}>Cancel</button>
<button className="popup-submit" onClick={useHandleClick}>Submit</button>
</div>
</div>
)}
</>
)
}
@@ -0,0 +1,119 @@
import React, { useState } from 'react';
import "../styles/sideBar.css";
import logo from "../assets/Rheinmetall_Logo_2021.svg";
import ParticipantList from './participantList';
import { useDispatch, useSelector } from "react-redux";
import { getAllParticipants } from "../websocket/getAllParticipants";
import { setWalkingPath } from '../store/participantSlice';
import { generateRandomPath } from '../helper/generateRandomPath';
import { useCalculation } from '../helper/walkingPathCaclulation';
import { addLayers } from '../store/layerSlice';
import { sleep } from '../helper/sleep';
import { getStateFromLocalStorage, saveStateToLocalStorage } from '../helper/localStorageUsage';
let isHoldingPaths = false;
export function changeHoldingPathValue(value) {
isHoldingPaths = value;
}
export default function SideBar({ createPopupStateChanger }) {
const [hasParticipants, setHasParticipants] = useState(false)
const [startedStressTest, setStartedStressTest] = useState(false)
const participantList = useSelector((state) => state.participants.data);
const partyList = useSelector(state => state.party.partyData)
const excerciseId = useSelector(state => state.exercise.currentExerciseId) ? 0 : 42
const calculate = useCalculation()
const dispatch = useDispatch();
function useStartStressTest() {
const lowerRight = [53.019, 8.995]
const topLeft = [53.128, 8.730]
for (var participant of participantList) {
var newObject = {
layers: [],
participant: participant
}
var path = generateRandomPath(lowerRight, topLeft, participant.currentPosition);
newObject.layers.push(path)
localStorage.setItem(participant.equipmentNumber.toString(), false)
dispatch(setWalkingPath({ equipmentNumber: participant.equipmentNumber, path: path }))
dispatch(addLayers(newObject))
calculate(path, participant.equipmentNumber, participant, "OTUP")
}
setHasParticipants(false)
setStartedStressTest(true)
}
async function useGetAllParticipants() {
getAllParticipants(excerciseId || 42, dispatch, partyList)
await sleep(500)
setHasParticipants(true)
}
function startAllPaths() {
var pathObjectArray = [];
for (var singleParticipant of participantList) {
var pathObject = {
equipmentNumber: singleParticipant.equipmentNumber,
path: singleParticipant.path
}
if (singleParticipant.path && singleParticipant.path.length > 0) {
localStorage.setItem(singleParticipant.equipmentNumber.toString(), false)
calculate(singleParticipant.path, singleParticipant.equipmentNumber, singleParticipant, "OTUP")
pathObjectArray.push(pathObject)
}
}
saveStateToLocalStorage("paths", pathObjectArray)
getStateFromLocalStorage("paths")
changeHoldingPathValue(false)
}
return (
<div className="sidebar">
<div className="sidebar-header">
<img src={logo} alt="Rheinmetall Logo" className='logo' />
</div>
<div className="participant-list">
<p className="participant-list-text">Participant list</p>
<div className="addButton-div" onClick={() => createPopupStateChanger(true)}>
<div className="addButton"><p className="addButton-text">+</p></div>
</div>
</div>
<div className="sidebar-content">
{
participantList.map((participant, i) => {
return <ParticipantList key={i} participant={participant} participantList={participantList} />
})
}
</div>
<div className='sidebar-footer'>
<button onClick={useGetAllParticipants}>Get all Participants</button>
{hasParticipants &&
<button onClick={useStartStressTest}>Start Stress Test</button>
}
{startedStressTest &&
<div className='sidebar-startStop-container'>
<button>Start</button>
<button>Pause</button>
<button>Stop</button>
</div>
}
{isHoldingPaths > 0 && (
<div className='startingpath-popup'>
<button className='collapsible-button' onClick={() => startAllPaths()}>Start all Paths</button>
</div>
)}
</div>
</div>
);
}