DmitrMakeev commited on
Commit
6291860
·
verified ·
1 Parent(s): 6a70f45

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -35
app.py CHANGED
@@ -833,51 +833,22 @@ class NutrientCalculator:
833
  self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
834
  self.total_ec = 0.0
835
 
836
-
837
  # Веса компенсации с добавлением кальциевой селитры для NO3
838
  self.element_compensation_weights = {
839
- "POTASSIUM_SULFATE": {"weight": -0.18, "fert": "Калий сернокислый", "main_element": "K"},
840
- "MAGNESIUM_SULFATE": {"weight": -0.1, "fert": "Сульфат магния", "main_element": "Mg"},
841
- "MONOPOTASSIUM_PHOSPHATE": {"weight": -0.14, "fert": "Монофосфат калия", "main_element": "P"},
842
  "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
843
  "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "N (NO3-)"}
844
  }
845
 
846
- def calculate(self):
847
- try:
848
- # Вносим магний через компенсацию
849
- self._compensate_element("Mg")
850
-
851
- # Теперь вносим кальций через компенсацию, а не напрямую
852
- self._compensate_element("Ca")
853
-
854
- # Вносим фосфор через компенсацию
855
- self._compensate_element("P")
856
-
857
- # Вносим аммонийный азот напрямую
858
- self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
859
-
860
- # Компенсируем нитратный азот через компенсацию
861
- self._compensate_element("N (NO3-)")
862
-
863
- # Компенсируем серу через компенсацию
864
- self._compensate_element("S")
865
-
866
- # Компенсируем калий через компенсацию
867
- self._compensate_element("K")
868
-
869
- return self.results
870
- except Exception as e:
871
- print(f"Ошибка при расчёте: {str(e)}")
872
- raise
873
-
874
  def _compensate_element(self, element):
875
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
876
  if abs(needed) < 0.1: # Игнорируем незначительные отклонения
877
  return
878
 
879
  candidates = []
880
-
881
  # Для кальциевой селитры особый случай
882
  if element == "Ca":
883
  candidates.append({
@@ -907,15 +878,53 @@ class NutrientCalculator:
907
  'content': self.fertilizers[fert_name][element]
908
  })
909
 
 
910
  if not candidates:
911
  raise ValueError(f"Нет удобрений для элемента {element}")
912
 
913
- total_weight = sum(abs(c['weight']) for c in candidates)
 
 
 
 
 
914
  for candidate in candidates:
915
- share = abs(candidate['weight']) / total_weight
916
  ppm_to_apply = needed * share
917
  self._apply(candidate['name'], element, ppm_to_apply)
918
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
919
  def calculate_ec(self):
920
  return round(self.total_ec, 2)
921
 
 
833
  self.fertilizers = NUTRIENT_CONTENT_IN_FERTILIZERS
834
  self.total_ec = 0.0
835
 
 
836
  # Веса компенсации с добавлением кальциевой селитры для NO3
837
  self.element_compensation_weights = {
838
+ "POTASSIUM_SULFATE": {"weight": 0.18, "fert": "Калий сернокислый", "main_element": "K"},
839
+ "MAGNESIUM_SULFATE": {"weight": 0.1, "fert": "Сульфат магния", "main_element": "Mg"},
840
+ "MONOPOTASSIUM_PHOSPHATE": {"weight": 0.14, "fert": "Монофосфат калия", "main_element": "P"},
841
  "CALCIUM_NITRATE": {"weight": 0.25, "fert": "Кальциевая селитра", "main_element": "Ca"},
842
  "CALCIUM_NITRATE_NO3": {"weight": 0.15, "fert": "Кальциевая селитра", "main_element": "N (NO3-)"}
843
  }
844
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
845
  def _compensate_element(self, element):
846
  needed = self.target_profile[element] - self.actual_profile.get(element, 0)
847
  if abs(needed) < 0.1: # Игнорируем незначительные отклонения
848
  return
849
 
850
  candidates = []
851
+
852
  # Для кальциевой селитры особый случай
853
  if element == "Ca":
854
  candidates.append({
 
878
  'content': self.fertilizers[fert_name][element]
879
  })
880
 
881
+ # Проверяем, есть ли кандидаты
882
  if not candidates:
883
  raise ValueError(f"Нет удобрений для элемента {element}")
884
 
885
+ # Суммируем только положительные веса
886
+ total_weight = sum(max(c['weight'], 0) for c in candidates)
887
+ if total_weight == 0:
888
+ raise ValueError(f"Общий вес для элемента {element} равен нулю")
889
+
890
+ # Распределяем доли
891
  for candidate in candidates:
892
+ share = max(candidate['weight'], 0) / total_weight
893
  ppm_to_apply = needed * share
894
  self._apply(candidate['name'], element, ppm_to_apply)
895
 
896
+ # ... остальной код ...
897
+
898
+ def calculate(self):
899
+ try:
900
+ # Вносим магний через компенсацию
901
+ self._compensate_element("Mg")
902
+
903
+ # Теперь вносим кальций через компенсацию, а не напрямую
904
+ self._compensate_element("Ca")
905
+
906
+ # Вносим фосфор через компенсацию
907
+ self._compensate_element("P")
908
+
909
+ # Вносим аммонийный азот напрямую
910
+ self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
911
+
912
+ # Компенсируем нитратный азот через компенсацию
913
+ self._compensate_element("N (NO3-)")
914
+
915
+ # Компенсируем серу через компенсацию
916
+ self._compensate_element("S")
917
+
918
+ # Компенсируем калий через компенсацию
919
+ self._compensate_element("K")
920
+
921
+ return self.results
922
+ except Exception as e:
923
+ print(f"Ошибка при расчёте: {str(e)}")
924
+ raise
925
+
926
+
927
+
928
  def calculate_ec(self):
929
  return round(self.total_ec, 2)
930