DmitrMakeev commited on
Commit
30c899b
·
verified ·
1 Parent(s): ef8678c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -50
app.py CHANGED
@@ -677,7 +677,6 @@ def view_image():
677
 
678
 
679
 
680
-
681
  from tabulate import tabulate
682
 
683
  # Константы
@@ -728,71 +727,78 @@ class NutrientCalculator:
728
  self._apply("Кальциевая селитра", "Ca", 84.0)
729
  self._apply("Калий фосфорнокислый", "P", 31.0)
730
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
 
 
 
 
 
 
 
 
 
 
731
  self._apply_k_sulfate()
732
- self._apply_k_nitrate()
 
 
 
 
 
733
  return self.results
734
 
735
  def _apply(self, fert_name, main_element, required_ppm):
 
 
 
736
  content = self.fertilizers[fert_name][main_element]
737
  grams = required_ppm * self.volume / (content * 1000)
738
- result = {
739
- 'граммы': round(grams, 3),
740
- 'миллиграммы': int(grams * 1000)
741
- }
742
-
 
 
 
 
 
 
 
 
743
  for element, percent in self.fertilizers[fert_name].items():
744
  added_ppm = grams * percent * 1000 / self.volume
745
- result[f'внесет {self._label(element)}'] = round(added_ppm, 1)
746
  self.actual_profile[element] += added_ppm
747
 
748
- self.results[fert_name] = result
749
-
750
  def _apply_k_sulfate(self):
751
  fert = "Калий сернокислый"
752
  k_def = self.target_profile['K'] - self.actual_profile['K']
753
  s_def = self.target_profile['S'] - self.actual_profile['S']
754
- k_content = self.fertilizers[fert]["K"]
755
- s_content = self.fertilizers[fert]["S"]
756
-
757
- grams_k = k_def * self.volume / (k_content * 1000) if k_content else 0
758
- grams_s = s_def * self.volume / (s_content * 1000) if s_content else 0
759
- grams = max(grams_k, grams_s)
760
-
761
- result = {
762
- 'граммы': round(grams, 3),
763
- 'миллиграммы': int(grams * 1000)
764
- }
765
-
766
- for el in ["K", "S"]:
767
- ppm = grams * self.fertilizers[fert][el] * 1000 / self.volume
768
- result[f"внесет {el}"] = round(ppm, 1)
769
- self.actual_profile[el] += ppm
770
-
771
- self.results[fert] = result
772
-
773
- def _apply_k_nitrate(self):
774
- fert = "Калий азотнокислый"
775
- k_def = self.target_profile['K'] - self.actual_profile['K']
776
- k_content = self.fertilizers[fert]["K"]
777
- grams = k_def * self.volume / (k_content * 1000)
778
-
779
- result = {
780
- 'граммы': round(grams, 3),
781
- 'миллиграммы': int(grams * 1000)
782
- }
783
-
784
- for el in ["K", "N (NO3-)"]:
785
- ppm = grams * self.fertilizers[fert][el] * 1000 / self.volume
786
- result[f"внесет {self._label(el)}"] = round(ppm, 1)
787
- self.actual_profile[el] += ppm
788
-
789
- self.results[fert] = result
790
 
791
  def _label(self, el):
792
  return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
793
 
794
  def calculate_ec(self):
795
- total_ppm = sum(self.target_profile.values())
796
  return round(total_ppm / 700, 2)
797
 
798
  def print_report(self):
@@ -809,16 +815,16 @@ class NutrientCalculator:
809
  print("\n" + "="*60)
810
  print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
811
  print("="*60)
812
- print(f"Общая концентрация: {round(sum(self.target_profile.values()), 1)} ppm")
813
  print(f"EC: {self.calculate_ec()} mS/cm")
814
 
815
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
816
  fert_table = []
817
  for fert, data in self.results.items():
818
- adds = [f"+{k}: {v} ppm" for k, v in data.items() if k.startswith('внесет')]
819
  fert_table.append([
820
  fert,
821
- data['граммы'],
822
  data['миллиграммы'],
823
  "\n".join(adds)
824
  ])
 
677
 
678
 
679
 
 
680
  from tabulate import tabulate
681
 
682
  # Константы
 
727
  self._apply("Кальциевая селитра", "Ca", 84.0)
728
  self._apply("Калий фосфорнокислый", "P", 31.0)
729
  self._apply("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
730
+
731
+ # Сначала покрываем NO3- из кальциевой селитры и аммонийной
732
+ current_no3 = self.actual_profile['N (NO3-)']
733
+ no3_needed = self.target_profile['N (NO3-)'] - current_no3
734
+
735
+ # Добавляем калий азотнокислый для покрытия оставшегося NO3-
736
+ if no3_needed > 0.1:
737
+ self._apply("Калий азотнокислый", "N (NO3-)", no3_needed)
738
+
739
+ # Затем покрываем калий и серу
740
  self._apply_k_sulfate()
741
+
742
+ # Проверяем и покрываем оставшийся калий калий азотнокислым
743
+ k_deficit = self.target_profile['K'] - self.actual_profile['K']
744
+ if k_deficit > 0.1:
745
+ self._apply("Калий азотнокислый", "K", k_deficit)
746
+
747
  return self.results
748
 
749
  def _apply(self, fert_name, main_element, required_ppm):
750
+ if required_ppm <= 0:
751
+ return
752
+
753
  content = self.fertilizers[fert_name][main_element]
754
  grams = required_ppm * self.volume / (content * 1000)
755
+
756
+ if fert_name not in self.results:
757
+ result = {
758
+ 'граммы': 0.0,
759
+ 'миллиграммы': 0
760
+ }
761
+ for element in self.fertilizers[fert_name]:
762
+ result[f'внесет {self._label(element)}'] = 0.0
763
+ self.results[fert_name] = result
764
+
765
+ self.results[fert_name]['граммы'] += grams
766
+ self.results[fert_name]['миллиграммы'] += int(grams * 1000)
767
+
768
  for element, percent in self.fertilizers[fert_name].items():
769
  added_ppm = grams * percent * 1000 / self.volume
770
+ self.results[fert_name][f'внесет {self._label(element)}'] += added_ppm
771
  self.actual_profile[element] += added_ppm
772
 
 
 
773
  def _apply_k_sulfate(self):
774
  fert = "Калий сернокислый"
775
  k_def = self.target_profile['K'] - self.actual_profile['K']
776
  s_def = self.target_profile['S'] - self.actual_profile['S']
777
+
778
+ if k_def <= 0 and s_def <= 0:
779
+ return
780
+
781
+ # Рассчитываем необходимое количество для покрытия дефицита серы
782
+ if s_def > 0.1:
783
+ s_content = self.fertilizers[fert]["S"]
784
+ grams_s = s_def * self.volume / (s_content * 1000)
785
+
786
+ k_content = self.fertilizers[fert]["K"]
787
+ k_from_s = grams_s * k_content * 1000 / self.volume
788
+
789
+ if k_from_s > k_def and k_def > 0.1:
790
+ # Если серы нужно больше, чем нужно для калия, ограничиваем
791
+ grams = k_def * self.volume / (k_content * 1000)
792
+ else:
793
+ grams = grams_s
794
+
795
+ self._apply(fert, "S", s_def)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
796
 
797
  def _label(self, el):
798
  return "NO3" if el == "N (NO3-)" else "NH4" if el == "N (NH4+)" else el
799
 
800
  def calculate_ec(self):
801
+ total_ppm = sum(self.actual_profile.values())
802
  return round(total_ppm / 700, 2)
803
 
804
  def print_report(self):
 
815
  print("\n" + "="*60)
816
  print(f"РАСЧЕТ ДЛЯ {self.volume} ЛИТРОВ РАСТВОРА")
817
  print("="*60)
818
+ print(f"Общая концентрация: {round(sum(self.actual_profile.values()), 1)} ppm")
819
  print(f"EC: {self.calculate_ec()} mS/cm")
820
 
821
  print("\nРЕКОМЕНДУЕМЫЕ УДОБРЕНИЯ:")
822
  fert_table = []
823
  for fert, data in self.results.items():
824
+ adds = [f"+{k}: {v:.1f} ppm" for k, v in data.items() if k.startswith('внесет')]
825
  fert_table.append([
826
  fert,
827
+ round(data['граммы'], 3),
828
  data['миллиграммы'],
829
  "\n".join(adds)
830
  ])