@mytec: iter1.6 ready for testing
This commit is contained in:
@@ -707,6 +707,8 @@ export default function App() {
|
||||
use_dominant_path: preset.use_dominant_path,
|
||||
use_street_canyon: preset.use_street_canyon,
|
||||
use_reflections: preset.use_reflections,
|
||||
use_water_reflection: preset.use_water_reflection,
|
||||
use_vegetation: preset.use_vegetation,
|
||||
});
|
||||
}
|
||||
}}
|
||||
@@ -754,6 +756,8 @@ export default function App() {
|
||||
{ key: 'use_dominant_path' as const, label: 'Dominant Path', disabled: false },
|
||||
{ key: 'use_street_canyon' as const, label: 'Street Canyon', disabled: false },
|
||||
{ key: 'use_reflections' as const, label: 'Reflections', disabled: false },
|
||||
{ key: 'use_water_reflection' as const, label: 'Water Reflection', disabled: false },
|
||||
{ key: 'use_vegetation' as const, label: 'Vegetation Loss', disabled: false },
|
||||
].map(({ key, label, disabled }) => (
|
||||
<label
|
||||
key={key}
|
||||
@@ -778,6 +782,27 @@ export default function App() {
|
||||
{label}
|
||||
</label>
|
||||
))}
|
||||
{/* Season selector (only relevant when vegetation is enabled) */}
|
||||
{settings.use_vegetation && (
|
||||
<div className="mt-1.5 pl-5">
|
||||
<label className="text-xs text-gray-500 dark:text-dark-muted">Season</label>
|
||||
<select
|
||||
value={settings.season || 'summer'}
|
||||
onChange={(e) =>
|
||||
useCoverageStore.getState().updateSettings({
|
||||
season: e.target.value as 'summer' | 'winter' | 'spring' | 'autumn',
|
||||
})
|
||||
}
|
||||
disabled={isCalculating}
|
||||
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
|
||||
>
|
||||
<option value="summer">Summer (full foliage)</option>
|
||||
<option value="autumn">Autumn (70%)</option>
|
||||
<option value="spring">Spring (60%)</option>
|
||||
<option value="winter">Winter (30%)</option>
|
||||
</select>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -171,6 +171,14 @@ export default memo(function CoverageStats({ points, resolution, stats, calculat
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{stats.points_with_vegetation_loss > 0 && (
|
||||
<div className="flex justify-between">
|
||||
<span className="text-gray-500 dark:text-dark-muted">Vegetation</span>
|
||||
<span className="font-medium text-gray-700 dark:text-dark-text">
|
||||
{stats.points_with_vegetation_loss}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -28,6 +28,9 @@ export interface ApiCoverageSettings {
|
||||
use_dominant_path?: boolean;
|
||||
use_street_canyon?: boolean;
|
||||
use_reflections?: boolean;
|
||||
use_water_reflection?: boolean;
|
||||
use_vegetation?: boolean;
|
||||
season?: 'summer' | 'winter' | 'spring' | 'autumn';
|
||||
}
|
||||
|
||||
export interface CoverageRequest {
|
||||
@@ -46,6 +49,7 @@ export interface ApiCoveragePoint {
|
||||
terrain_loss: number;
|
||||
building_loss: number;
|
||||
reflection_gain: number;
|
||||
vegetation_loss: number;
|
||||
}
|
||||
|
||||
export interface ApiCoverageStats {
|
||||
@@ -56,6 +60,7 @@ export interface ApiCoverageStats {
|
||||
points_with_buildings: number;
|
||||
points_with_terrain_loss: number;
|
||||
points_with_reflection_gain: number;
|
||||
points_with_vegetation_loss: number;
|
||||
}
|
||||
|
||||
export interface CoverageResponse {
|
||||
@@ -75,6 +80,8 @@ export interface Preset {
|
||||
use_dominant_path: boolean;
|
||||
use_street_canyon: boolean;
|
||||
use_reflections: boolean;
|
||||
use_water_reflection: boolean;
|
||||
use_vegetation: boolean;
|
||||
estimated_speed: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,9 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
|
||||
use_dominant_path: false,
|
||||
use_street_canyon: false,
|
||||
use_reflections: false,
|
||||
use_water_reflection: false,
|
||||
use_vegetation: false,
|
||||
season: 'summer',
|
||||
},
|
||||
heatmapVisible: true,
|
||||
error: null,
|
||||
@@ -101,6 +104,9 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
|
||||
use_dominant_path: settings.use_dominant_path,
|
||||
use_street_canyon: settings.use_street_canyon,
|
||||
use_reflections: settings.use_reflections,
|
||||
use_water_reflection: settings.use_water_reflection,
|
||||
use_vegetation: settings.use_vegetation,
|
||||
season: settings.season,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -115,6 +121,7 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
|
||||
terrain_loss: p.terrain_loss,
|
||||
building_loss: p.building_loss,
|
||||
reflection_gain: p.reflection_gain,
|
||||
vegetation_loss: p.vegetation_loss,
|
||||
})),
|
||||
calculationTime: response.computation_time,
|
||||
totalPoints: response.count,
|
||||
|
||||
@@ -9,6 +9,7 @@ export interface CoveragePoint {
|
||||
terrain_loss?: number; // dB terrain obstruction loss
|
||||
building_loss?: number; // dB building penetration loss
|
||||
reflection_gain?: number; // dB reflection signal gain
|
||||
vegetation_loss?: number; // dB vegetation attenuation
|
||||
}
|
||||
|
||||
export interface CoverageResult {
|
||||
@@ -29,6 +30,7 @@ export interface CoverageApiStats {
|
||||
points_with_buildings: number;
|
||||
points_with_terrain_loss: number;
|
||||
points_with_reflection_gain: number;
|
||||
points_with_vegetation_loss: number;
|
||||
}
|
||||
|
||||
export interface CoverageSettings {
|
||||
@@ -45,6 +47,9 @@ export interface CoverageSettings {
|
||||
use_dominant_path?: boolean;
|
||||
use_street_canyon?: boolean;
|
||||
use_reflections?: boolean;
|
||||
use_water_reflection?: boolean;
|
||||
use_vegetation?: boolean;
|
||||
season?: 'summer' | 'winter' | 'spring' | 'autumn';
|
||||
}
|
||||
|
||||
export interface GridPoint {
|
||||
|
||||
Reference in New Issue
Block a user