Поправил привязку вч загрузки, сделал модальное окно.
This commit is contained in:
@@ -447,27 +447,96 @@ def get_vch_load_from_html(file, sat: Satellite) -> None:
|
||||
sigma_load.save()
|
||||
|
||||
|
||||
def get_frequency_tolerance_percent(freq_range_mhz: float) -> float:
|
||||
"""
|
||||
Определяет процент погрешности центральной частоты в зависимости от полосы частот.
|
||||
|
||||
Args:
|
||||
freq_range_mhz (float): Полоса частот в МГц
|
||||
|
||||
Returns:
|
||||
float: Процент погрешности для центральной частоты
|
||||
|
||||
Диапазоны:
|
||||
- 0 - 0.5 МГц (0 - 500 кГц): 0.1%
|
||||
- 0.5 - 1.5 МГц (500 кГц - 1.5 МГц): 0.5%
|
||||
- 1.5 - 5 МГц: 1%
|
||||
- 5 - 10 МГц: 2%
|
||||
- > 10 МГц: 5%
|
||||
"""
|
||||
if freq_range_mhz < 0.5:
|
||||
return 0.005
|
||||
elif freq_range_mhz < 1.5:
|
||||
return 0.01
|
||||
elif freq_range_mhz < 5.0:
|
||||
return 0.02
|
||||
elif freq_range_mhz < 10.0:
|
||||
return 0.05
|
||||
else:
|
||||
return 0.1
|
||||
|
||||
|
||||
def compare_and_link_vch_load(
|
||||
sat_id: Satellite, eps_freq: float, eps_frange: float, ku_range: float
|
||||
):
|
||||
item_obj = ObjItem.objects.filter(parameters_obj__id_satellite=sat_id)
|
||||
vch_sigma = SigmaParameter.objects.filter(id_satellite=sat_id)
|
||||
"""
|
||||
Привязывает SigmaParameter к Parameter на основе совпадения параметров.
|
||||
|
||||
Погрешность центральной частоты определяется автоматически в зависимости от полосы частот:
|
||||
- 0-500 кГц: 0.1%
|
||||
- 500 кГц-1.5 МГц: 0.5%
|
||||
- 1.5-5 МГц: 1%
|
||||
- 5-10 МГц: 2%
|
||||
- >10 МГц: 5%
|
||||
|
||||
Args:
|
||||
sat_id (Satellite): Спутник для фильтрации
|
||||
eps_freq (float): Не используется (оставлен для обратной совместимости)
|
||||
eps_frange (float): Погрешность полосы частот в процентах
|
||||
ku_range (float): Не используется (оставлен для обратной совместимости)
|
||||
|
||||
Returns:
|
||||
tuple: (количество объектов, количество привязок)
|
||||
"""
|
||||
# Получаем все ObjItem с Parameter для данного спутника
|
||||
item_obj = ObjItem.objects.filter(
|
||||
parameter_obj__id_satellite=sat_id
|
||||
).select_related('parameter_obj', 'parameter_obj__polarization')
|
||||
|
||||
vch_sigma = SigmaParameter.objects.filter(
|
||||
id_satellite=sat_id
|
||||
).select_related('polarization')
|
||||
|
||||
link_count = 0
|
||||
obj_count = len(item_obj)
|
||||
for idx, obj in enumerate(item_obj):
|
||||
vch_load = obj.parameters_obj.get()
|
||||
if vch_load.frequency == -1.0:
|
||||
obj_count = item_obj.count()
|
||||
|
||||
for obj in item_obj:
|
||||
vch_load = obj.parameter_obj
|
||||
|
||||
# Пропускаем объекты с некорректной частотой
|
||||
if not vch_load or vch_load.frequency == -1.0:
|
||||
continue
|
||||
|
||||
# Определяем погрешность частоты на основе полосы
|
||||
freq_tolerance_percent = get_frequency_tolerance_percent(vch_load.freq_range)
|
||||
|
||||
# Вычисляем допустимое отклонение частоты в МГц
|
||||
freq_tolerance_mhz = vch_load.frequency * freq_tolerance_percent / 100
|
||||
|
||||
# Вычисляем допустимое отклонение полосы в МГц
|
||||
frange_tolerance_mhz = vch_load.freq_range * eps_frange / 100
|
||||
|
||||
for sigma in vch_sigma:
|
||||
if (
|
||||
abs(sigma.transfer_frequency - vch_load.frequency) <= eps_freq
|
||||
and abs(sigma.freq_range - vch_load.freq_range)
|
||||
<= vch_load.freq_range * eps_frange / 100
|
||||
and sigma.polarization == vch_load.polarization
|
||||
):
|
||||
# Проверяем совпадение по всем параметрам
|
||||
freq_match = abs(sigma.transfer_frequency - vch_load.frequency) <= freq_tolerance_mhz
|
||||
frange_match = abs(sigma.freq_range - vch_load.freq_range) <= frange_tolerance_mhz
|
||||
pol_match = sigma.polarization == vch_load.polarization
|
||||
|
||||
if freq_match and frange_match and pol_match:
|
||||
sigma.parameter = vch_load
|
||||
sigma.save()
|
||||
link_count += 1
|
||||
|
||||
return obj_count, link_count
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user