50 lines
1.2 KiB
Swift
50 lines
1.2 KiB
Swift
//
|
||
// PipeRoute.swift
|
||
// GasTankAR
|
||
//
|
||
// Created by Dennis Nemec on 28.08.26.
|
||
//
|
||
|
||
import Foundation
|
||
import simd
|
||
|
||
/// Eine Rohrführung als geordnete Folge von Wegpunkten (Welt-Koordinaten), die zu einem
|
||
/// zusammenhängenden Pfad verbunden werden – visualisiert die geplante Rohrverlegung.
|
||
struct PipeRoute {
|
||
private(set) var waypoints: [SIMD3<Float>] = []
|
||
|
||
var count: Int { waypoints.count }
|
||
|
||
/// Gesamtlänge des Pfads über alle Segmente in Metern.
|
||
var totalLength: Float {
|
||
guard waypoints.count > 1 else { return 0 }
|
||
return zip(waypoints, waypoints.dropFirst())
|
||
.reduce(0) { $0 + simd_distance($1.0, $1.1) }
|
||
}
|
||
|
||
var formattedLength: String {
|
||
String(format: "%.2f m", totalLength)
|
||
}
|
||
|
||
mutating func add(_ waypoint: SIMD3<Float>) {
|
||
waypoints.append(waypoint)
|
||
}
|
||
|
||
@discardableResult
|
||
mutating func removeLast() -> SIMD3<Float>? {
|
||
waypoints.isEmpty ? nil : waypoints.removeLast()
|
||
}
|
||
|
||
mutating func clear() {
|
||
waypoints.removeAll()
|
||
}
|
||
}
|
||
|
||
/// Ablaufphasen beim Erstellen einer Rohrführung.
|
||
enum PipeRoutingPhase: Equatable {
|
||
/// Kein Rohr-Routing aktiv.
|
||
case idle
|
||
/// Wegpunkte werden gesetzt.
|
||
case placing
|
||
}
|