kerykeion 4.18.3__py3-none-any.whl → 5.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kerykeion might be problematic. Click here for more details.

Files changed (76) hide show
  1. kerykeion/__init__.py +56 -11
  2. kerykeion/aspects/__init__.py +7 -4
  3. kerykeion/aspects/aspects_factory.py +568 -0
  4. kerykeion/aspects/aspects_utils.py +86 -13
  5. kerykeion/astrological_subject_factory.py +1901 -0
  6. kerykeion/backword.py +820 -0
  7. kerykeion/chart_data_factory.py +552 -0
  8. kerykeion/charts/__init__.py +2 -2
  9. kerykeion/charts/chart_drawer.py +2794 -0
  10. kerykeion/charts/charts_utils.py +1066 -309
  11. kerykeion/charts/draw_planets.py +602 -351
  12. kerykeion/charts/templates/aspect_grid_only.xml +337 -193
  13. kerykeion/charts/templates/chart.xml +441 -240
  14. kerykeion/charts/templates/wheel_only.xml +365 -211
  15. kerykeion/charts/themes/black-and-white.css +148 -0
  16. kerykeion/charts/themes/classic.css +107 -76
  17. kerykeion/charts/themes/dark-high-contrast.css +145 -107
  18. kerykeion/charts/themes/dark.css +146 -107
  19. kerykeion/charts/themes/light.css +146 -103
  20. kerykeion/charts/themes/strawberry.css +158 -0
  21. kerykeion/composite_subject_factory.py +408 -0
  22. kerykeion/ephemeris_data_factory.py +443 -0
  23. kerykeion/fetch_geonames.py +81 -21
  24. kerykeion/house_comparison/__init__.py +6 -0
  25. kerykeion/house_comparison/house_comparison_factory.py +103 -0
  26. kerykeion/house_comparison/house_comparison_utils.py +126 -0
  27. kerykeion/kr_types/__init__.py +66 -6
  28. kerykeion/kr_types/chart_template_model.py +20 -0
  29. kerykeion/kr_types/kerykeion_exception.py +15 -9
  30. kerykeion/kr_types/kr_literals.py +14 -106
  31. kerykeion/kr_types/kr_models.py +14 -179
  32. kerykeion/kr_types/settings_models.py +15 -152
  33. kerykeion/planetary_return_factory.py +805 -0
  34. kerykeion/relationship_score_factory.py +301 -0
  35. kerykeion/report.py +750 -65
  36. kerykeion/schemas/__init__.py +106 -0
  37. kerykeion/schemas/chart_template_model.py +367 -0
  38. kerykeion/schemas/kerykeion_exception.py +20 -0
  39. kerykeion/schemas/kr_literals.py +181 -0
  40. kerykeion/schemas/kr_models.py +603 -0
  41. kerykeion/schemas/settings_models.py +188 -0
  42. kerykeion/settings/__init__.py +20 -1
  43. kerykeion/settings/chart_defaults.py +444 -0
  44. kerykeion/settings/config_constants.py +152 -0
  45. kerykeion/settings/kerykeion_settings.py +36 -61
  46. kerykeion/settings/translation_strings.py +1499 -0
  47. kerykeion/settings/translations.py +74 -0
  48. kerykeion/sweph/ast136/s136108s.se1 +0 -0
  49. kerykeion/sweph/ast136/s136199s.se1 +0 -0
  50. kerykeion/sweph/ast136/s136472s.se1 +0 -0
  51. kerykeion/sweph/ast28/se28978s.se1 +0 -0
  52. kerykeion/sweph/ast50/se50000s.se1 +0 -0
  53. kerykeion/sweph/ast90/se90377s.se1 +0 -0
  54. kerykeion/sweph/ast90/se90482s.se1 +0 -0
  55. kerykeion/sweph/sefstars.txt +1602 -0
  56. kerykeion/transits_time_range_factory.py +302 -0
  57. kerykeion/utilities.py +626 -125
  58. kerykeion-5.1.9.dist-info/METADATA +1793 -0
  59. kerykeion-5.1.9.dist-info/RECORD +63 -0
  60. {kerykeion-4.18.3.dist-info → kerykeion-5.1.9.dist-info}/WHEEL +1 -1
  61. kerykeion/aspects/natal_aspects.py +0 -143
  62. kerykeion/aspects/synastry_aspects.py +0 -113
  63. kerykeion/astrological_subject.py +0 -818
  64. kerykeion/charts/kerykeion_chart_svg.py +0 -894
  65. kerykeion/enums.py +0 -51
  66. kerykeion/ephemeris_data.py +0 -178
  67. kerykeion/kr_types/chart_types.py +0 -88
  68. kerykeion/relationship_score/__init__.py +0 -2
  69. kerykeion/relationship_score/relationship_score.py +0 -175
  70. kerykeion/relationship_score/relationship_score_factory.py +0 -275
  71. kerykeion/settings/kr.config.json +0 -721
  72. kerykeion-4.18.3.dist-info/LICENSE +0 -661
  73. kerykeion-4.18.3.dist-info/METADATA +0 -396
  74. kerykeion-4.18.3.dist-info/RECORD +0 -42
  75. kerykeion-4.18.3.dist-info/entry_points.txt +0 -3
  76. /LICENSE → /kerykeion-5.1.9.dist-info/licenses/LICENSE +0 -0
@@ -1,894 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- This is part of Kerykeion (C) 2024 Giacomo Battaglia
4
- """
5
-
6
-
7
- import logging
8
- from typing import get_args
9
-
10
- from kerykeion.settings.kerykeion_settings import get_settings
11
- from kerykeion.aspects.synastry_aspects import SynastryAspects
12
- from kerykeion.aspects.natal_aspects import NatalAspects
13
- from kerykeion.astrological_subject import AstrologicalSubject
14
- from kerykeion.kr_types import KerykeionException, ChartType, KerykeionPointModel, Sign
15
- from kerykeion.kr_types import ChartTemplateDictionary
16
- from kerykeion.kr_types.kr_models import AstrologicalSubjectModel
17
- from kerykeion.kr_types.settings_models import KerykeionSettingsCelestialPointModel, KerykeionSettingsModel
18
- from kerykeion.kr_types.kr_literals import KerykeionChartTheme, KerykeionChartLanguage
19
- from kerykeion.charts.charts_utils import (
20
- draw_zodiac_slice,
21
- convert_latitude_coordinate_to_string,
22
- convert_longitude_coordinate_to_string,
23
- draw_aspect_line,
24
- draw_elements_percentages,
25
- draw_transit_ring_degree_steps,
26
- draw_degree_ring,
27
- draw_transit_ring,
28
- draw_first_circle,
29
- draw_second_circle,
30
- draw_third_circle,
31
- draw_aspect_grid,
32
- draw_houses_cusps_and_text_number,
33
- draw_transit_aspect_list,
34
- draw_transit_aspect_grid,
35
- draw_moon_phase,
36
- draw_house_grid,
37
- draw_planet_grid,
38
- )
39
- from kerykeion.charts.draw_planets import draw_planets # type: ignore
40
- from kerykeion.utilities import get_houses_list
41
- from pathlib import Path
42
- from scour.scour import scourString
43
- from string import Template
44
- from typing import Union, List, Literal
45
- from datetime import datetime
46
-
47
-
48
- class KerykeionChartSVG:
49
- """
50
- Creates the instance that can generate the chart with the
51
- function makeSVG().
52
-
53
- Parameters:
54
- - first_obj: First kerykeion object
55
- - chart_type: Natal, ExternalNatal, Transit, Synastry (Default: Type="Natal").
56
- - second_obj: Second kerykeion object (Not required if type is Natal)
57
- - new_output_directory: Set the output directory (default: home directory).
58
- - new_settings_file: Set the settings file (default: kr.config.json).
59
- In the settings file you can set the language, colors, planets, aspects, etc.
60
- - theme: Set the theme for the chart (default: classic). If None the <style> tag will be empty.
61
- That's useful if you want to use your own CSS file customizing the value of the default theme variables.
62
- - double_chart_aspect_grid_type: Set the type of the aspect grid for the double chart (transit or synastry). (Default: list.)
63
- - chart_language: Set the language for the chart (default: EN).
64
- """
65
-
66
- # Constants
67
- _BASIC_CHART_VIEWBOX = "0 0 772.2 546.0"
68
- _WIDE_CHART_VIEWBOX = "0 0 1060 546.0"
69
- _DEFAULT_HEIGHT = 546.0
70
- _DEFAULT_FULL_WIDTH = 1200
71
- _DEFAULT_NATAL_WIDTH = 772.2
72
- _PLANET_IN_ZODIAC_EXTRA_POINTS = 10
73
-
74
- # Set at init
75
- first_obj: Union[AstrologicalSubject, AstrologicalSubjectModel]
76
- second_obj: Union[AstrologicalSubject, AstrologicalSubjectModel, None]
77
- chart_type: ChartType
78
- new_output_directory: Union[Path, None]
79
- new_settings_file: Union[Path, None, KerykeionSettingsModel, dict]
80
- output_directory: Path
81
-
82
- # Internal properties
83
- fire: float
84
- earth: float
85
- air: float
86
- water: float
87
- main_radius: float
88
- first_circle_radius: float
89
- second_circle_radius: float
90
- third_circle_radius: float
91
- width: Union[float, int]
92
- language_settings: dict
93
- chart_colors_settings: dict
94
- planets_settings: dict
95
- aspects_settings: dict
96
- user: Union[AstrologicalSubject, AstrologicalSubjectModel]
97
- available_planets_setting: List[KerykeionSettingsCelestialPointModel]
98
- height: float
99
- location: str
100
- geolat: float
101
- geolon: float
102
- template: str
103
-
104
- def __init__(
105
- self,
106
- first_obj: Union[AstrologicalSubject, AstrologicalSubjectModel],
107
- chart_type: ChartType = "Natal",
108
- second_obj: Union[AstrologicalSubject, AstrologicalSubjectModel, None] = None,
109
- new_output_directory: Union[str, None] = None,
110
- new_settings_file: Union[Path, None, KerykeionSettingsModel, dict] = None,
111
- theme: Union[KerykeionChartTheme, None] = "classic",
112
- double_chart_aspect_grid_type: Literal["list", "table"] = "list",
113
- chart_language: KerykeionChartLanguage = "EN",
114
- ):
115
- # Directories:
116
- home_directory = Path.home()
117
- self.new_settings_file = new_settings_file
118
- self.chart_language = chart_language
119
-
120
- if new_output_directory:
121
- self.output_directory = Path(new_output_directory)
122
- else:
123
- self.output_directory = home_directory
124
-
125
- self.parse_json_settings(new_settings_file)
126
- self.chart_type = chart_type
127
-
128
- # Kerykeion instance
129
- self.user = first_obj
130
-
131
- self.available_planets_setting = []
132
- for body in self.planets_settings:
133
- if body['is_active'] == False:
134
- continue
135
-
136
- self.available_planets_setting.append(body)
137
-
138
- # Available bodies
139
- available_celestial_points_names = []
140
- for body in self.available_planets_setting:
141
- available_celestial_points_names.append(body["name"].lower())
142
-
143
- self.available_kerykeion_celestial_points: list[KerykeionPointModel] = []
144
- for body in available_celestial_points_names:
145
- self.available_kerykeion_celestial_points.append(self.user.get(body))
146
-
147
- # Makes the sign number list.
148
- if self.chart_type == "Natal" or self.chart_type == "ExternalNatal":
149
- natal_aspects_instance = NatalAspects(self.user, new_settings_file=self.new_settings_file)
150
- self.aspects_list = natal_aspects_instance.relevant_aspects
151
-
152
- if self.chart_type == "Transit" or self.chart_type == "Synastry":
153
- if not second_obj:
154
- raise KerykeionException("Second object is required for Transit or Synastry charts.")
155
-
156
- # Kerykeion instance
157
- self.t_user = second_obj
158
-
159
- # Aspects
160
- self.aspects_list = SynastryAspects(self.user, self.t_user, new_settings_file=self.new_settings_file).relevant_aspects
161
-
162
- self.t_available_kerykeion_celestial_points = []
163
- for body in available_celestial_points_names:
164
- self.t_available_kerykeion_celestial_points.append(self.t_user.get(body))
165
-
166
- # Double chart aspect grid type
167
- self.double_chart_aspect_grid_type = double_chart_aspect_grid_type
168
-
169
- # screen size
170
- self.height = self._DEFAULT_HEIGHT
171
- if self.chart_type == "Synastry" or self.chart_type == "Transit":
172
- self.width = self._DEFAULT_FULL_WIDTH
173
- else:
174
- self.width = self._DEFAULT_NATAL_WIDTH
175
-
176
- # default location
177
- self.location = self.user.city
178
- self.geolat = self.user.lat
179
- self.geolon = self.user.lng
180
-
181
- if self.chart_type == "Transit":
182
- self.t_name = self.language_settings["transit_name"]
183
-
184
- # Default radius for the chart
185
- self.main_radius = 240
186
-
187
- # Set circle radii based on chart type
188
- if self.chart_type == "ExternalNatal":
189
- self.first_circle_radius, self.second_circle_radius, self.third_circle_radius = 56, 92, 112
190
- else:
191
- self.first_circle_radius, self.second_circle_radius, self.third_circle_radius = 0, 36, 120
192
-
193
- # Initialize element points
194
- self.fire = 0.0
195
- self.earth = 0.0
196
- self.air = 0.0
197
- self.water = 0.0
198
-
199
- # Calculate element points from planets
200
- self._calculate_elements_points_from_planets()
201
-
202
- # Set up theme
203
- if theme not in get_args(KerykeionChartTheme) and theme is not None:
204
- raise KerykeionException(f"Theme {theme} is not available. Set None for default theme.")
205
-
206
- self.set_up_theme(theme)
207
-
208
- def set_up_theme(self, theme: Union[KerykeionChartTheme, None] = None) -> None:
209
- """
210
- Set the theme for the chart.
211
- """
212
- if theme is None:
213
- self.color_style_tag = ""
214
- return
215
-
216
- theme_dir = Path(__file__).parent / "themes"
217
-
218
- with open(theme_dir / f"{theme}.css", "r") as f:
219
- self.color_style_tag = f.read()
220
-
221
- def set_output_directory(self, dir_path: Path) -> None:
222
- """
223
- Sets the output direcotry and returns it's path.
224
- """
225
- self.output_directory = dir_path
226
- logging.info(f"Output direcotry set to: {self.output_directory}")
227
-
228
- def parse_json_settings(self, settings_file_or_dict: Union[Path, dict, KerykeionSettingsModel, None]) -> None:
229
- """
230
- Parse the settings file.
231
- """
232
- settings = get_settings(settings_file_or_dict)
233
-
234
- self.language_settings = settings["language_settings"][self.chart_language]
235
- self.chart_colors_settings = settings["chart_colors"]
236
- self.planets_settings = settings["celestial_points"]
237
- self.aspects_settings = settings["aspects"]
238
-
239
- def _draw_zodiac_circle_slices(self, r):
240
- """
241
- Generate the SVG string representing the zodiac circle
242
- with the 12 slices for each zodiac sign.
243
-
244
- Args:
245
- r (float): The radius of the zodiac slices.
246
-
247
- Returns:
248
- str: The SVG string representing the zodiac circle.
249
- """
250
- sings = get_args(Sign)
251
- output = ""
252
- for i, sing in enumerate(sings):
253
- output += draw_zodiac_slice(
254
- c1=self.first_circle_radius,
255
- chart_type=self.chart_type,
256
- seventh_house_degree_ut=self.user.seventh_house.abs_pos,
257
- num=i,
258
- r=r,
259
- style=f'fill:{self.chart_colors_settings[f"zodiac_bg_{i}"]}; fill-opacity: 0.5;',
260
- type=sing,
261
- )
262
-
263
- return output
264
-
265
- def _calculate_elements_points_from_planets(self):
266
- """
267
- Calculate chart element points from a planet.
268
- TODO: Refactor this method.
269
- Should be completely rewritten. Maybe even part of the AstrologicalSubject class.
270
- The points should include just the standard way of calculating the elements points.
271
- """
272
-
273
- ZODIAC = (
274
- {"name": "Ari", "element": "fire"},
275
- {"name": "Tau", "element": "earth"},
276
- {"name": "Gem", "element": "air"},
277
- {"name": "Can", "element": "water"},
278
- {"name": "Leo", "element": "fire"},
279
- {"name": "Vir", "element": "earth"},
280
- {"name": "Lib", "element": "air"},
281
- {"name": "Sco", "element": "water"},
282
- {"name": "Sag", "element": "fire"},
283
- {"name": "Cap", "element": "earth"},
284
- {"name": "Aqu", "element": "air"},
285
- {"name": "Pis", "element": "water"},
286
- )
287
-
288
- # Available bodies
289
- available_celestial_points_names = []
290
- for body in self.available_planets_setting:
291
- available_celestial_points_names.append(body["name"].lower())
292
-
293
- # Make list of the points sign
294
- points_sign = []
295
- for planet in available_celestial_points_names:
296
- points_sign.append(self.user.get(planet).sign_num)
297
-
298
- for i in range(len(self.available_planets_setting)):
299
- # element: get extra points if planet is in own zodiac sign.
300
- related_zodiac_signs = self.available_planets_setting[i]["related_zodiac_signs"]
301
- cz = points_sign[i]
302
- extra_points = 0
303
- if related_zodiac_signs != []:
304
- for e in range(len(related_zodiac_signs)):
305
- if int(related_zodiac_signs[e]) == int(cz):
306
- extra_points = self._PLANET_IN_ZODIAC_EXTRA_POINTS
307
-
308
- ele = ZODIAC[points_sign[i]]["element"]
309
- if ele == "fire":
310
- self.fire = self.fire + self.available_planets_setting[i]["element_points"] + extra_points
311
-
312
- elif ele == "earth":
313
- self.earth = self.earth + self.available_planets_setting[i]["element_points"] + extra_points
314
-
315
- elif ele == "air":
316
- self.air = self.air + self.available_planets_setting[i]["element_points"] + extra_points
317
-
318
- elif ele == "water":
319
- self.water = self.water + self.available_planets_setting[i]["element_points"] + extra_points
320
-
321
- def _draw_all_aspects_lines(self, r, ar):
322
- out = ""
323
- for aspect in self.aspects_list:
324
- out += draw_aspect_line(
325
- r=r,
326
- ar=ar,
327
- aspect=aspect,
328
- color=self.aspects_settings[aspect["aid"]]["color"],
329
- seventh_house_degree_ut=self.user.seventh_house.abs_pos
330
- )
331
-
332
- return out
333
-
334
- def _draw_all_transit_aspects_lines(self, r, ar):
335
- out = ""
336
- for aspect in self.aspects_list:
337
- out += draw_aspect_line(
338
- r=r,
339
- ar=ar,
340
- aspect=aspect,
341
- color=self.aspects_settings[aspect["aid"]]["color"],
342
- seventh_house_degree_ut=self.user.seventh_house.abs_pos
343
- )
344
- return out
345
-
346
- def _create_template_dictionary(self) -> ChartTemplateDictionary:
347
- """
348
- Create a dictionary containing the template data for generating an astrological chart.
349
-
350
- Returns:
351
- ChartTemplateDictionary: A dictionary with template data for the chart.
352
- """
353
- # Initialize template dictionary
354
- template_dict: ChartTemplateDictionary = dict() # type: ignore
355
-
356
- # Set the color style tag
357
- template_dict["color_style_tag"] = self.color_style_tag
358
-
359
- # Set chart dimensions
360
- template_dict["chart_height"] = self.height
361
- template_dict["chart_width"] = self.width
362
-
363
- # Set chart name
364
- template_dict["stringName"] = f"{self.user.name}:" if self.chart_type in ["Synastry", "Transit"] else f'{self.language_settings["info"]}:'
365
-
366
- # Set viewbox based on chart type
367
- template_dict['viewbox'] = self._BASIC_CHART_VIEWBOX if self.chart_type in ["Natal", "ExternalNatal"] else self._WIDE_CHART_VIEWBOX
368
-
369
- # Generate rings and circles based on chart type
370
- if self.chart_type in ["Transit", "Synastry"]:
371
- template_dict["transitRing"] = draw_transit_ring(self.main_radius, self.chart_colors_settings["paper_1"], self.chart_colors_settings["zodiac_transit_ring_3"])
372
- template_dict["degreeRing"] = draw_transit_ring_degree_steps(self.main_radius, self.user.seventh_house.abs_pos)
373
- template_dict["first_circle"] = draw_first_circle(self.main_radius, self.chart_colors_settings["zodiac_transit_ring_2"], self.chart_type)
374
- template_dict["second_circle"] = draw_second_circle(self.main_radius, self.chart_colors_settings['zodiac_transit_ring_1'], self.chart_colors_settings['paper_1'], self.chart_type)
375
- template_dict['third_circle'] = draw_third_circle(self.main_radius, self.chart_colors_settings['zodiac_transit_ring_0'], self.chart_colors_settings['paper_1'], self.chart_type, self.third_circle_radius)
376
-
377
- if self.double_chart_aspect_grid_type == "list":
378
- template_dict["makeAspectGrid"] = draw_transit_aspect_list(self.language_settings["aspects"], self.aspects_list, self.planets_settings, self.aspects_settings)
379
- else:
380
- template_dict["makeAspectGrid"] = draw_transit_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list, 550, 450)
381
-
382
- template_dict["makeAspects"] = self._draw_all_transit_aspects_lines(self.main_radius, self.main_radius - 160)
383
- else:
384
- template_dict["transitRing"] = ""
385
- template_dict["degreeRing"] = draw_degree_ring(self.main_radius, self.first_circle_radius, self.user.seventh_house.abs_pos, self.chart_colors_settings["paper_0"])
386
- template_dict['first_circle'] = draw_first_circle(self.main_radius, self.chart_colors_settings["zodiac_radix_ring_2"], self.chart_type, self.first_circle_radius)
387
- template_dict["second_circle"] = draw_second_circle(self.main_radius, self.chart_colors_settings["zodiac_radix_ring_1"], self.chart_colors_settings["paper_1"], self.chart_type, self.second_circle_radius)
388
- template_dict['third_circle'] = draw_third_circle(self.main_radius, self.chart_colors_settings["zodiac_radix_ring_0"], self.chart_colors_settings["paper_1"], self.chart_type, self.third_circle_radius)
389
- template_dict["makeAspectGrid"] = draw_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list)
390
-
391
- template_dict["makeAspects"] = self._draw_all_aspects_lines(self.main_radius, self.main_radius - self.third_circle_radius)
392
-
393
- # Set chart title
394
- if self.chart_type == "Synastry":
395
- template_dict["stringTitle"] = f"{self.user.name} {self.language_settings['and_word']} {self.t_user.name}"
396
- elif self.chart_type == "Transit":
397
- template_dict["stringTitle"] = f"{self.language_settings['transits']} {self.t_user.day}/{self.t_user.month}/{self.t_user.year}"
398
- else:
399
- template_dict["stringTitle"] = self.user.name
400
-
401
- # Set bottom left corner information
402
- template_dict["bottomLeft0"] = f"{self.user.zodiac_type if self.user.zodiac_type == 'Tropic' else str(self.user.zodiac_type) + ' ' + str(self.user.sidereal_mode)}"
403
- template_dict["bottomLeft1"] = f"{self.user.houses_system_name}"
404
- if self.chart_type in ["Natal", "ExternalNatal", "Synastry"]:
405
- template_dict["bottomLeft2"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get("day", "Day")} {self.user.lunar_phase.get("moon_phase", "")}'
406
- template_dict["bottomLeft3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.user.lunar_phase.moon_phase_name}'
407
- template_dict["bottomLeft4"] = f'{self.user.perspective_type}'
408
- else:
409
- template_dict["bottomLeft2"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get("day", "Day")} {self.t_user.lunar_phase.get("moon_phase", "")}'
410
- template_dict["bottomLeft3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.t_user.lunar_phase.moon_phase_name}'
411
- template_dict["bottomLeft4"] = f'{self.t_user.perspective_type}'
412
-
413
- # Draw moon phase
414
- template_dict['moon_phase'] = draw_moon_phase(
415
- self.user.lunar_phase["degrees_between_s_m"],
416
- self.geolat
417
- )
418
-
419
- # Set location string
420
- if len(self.location) > 35:
421
- split_location = self.location.split(",")
422
- if len(split_location) > 1:
423
- template_dict["stringLocation"] = split_location[0] + ", " + split_location[-1]
424
- if len(template_dict["stringLocation"]) > 35:
425
- template_dict["stringLocation"] = template_dict["stringLocation"][:35] + "..."
426
- else:
427
- template_dict["stringLocation"] = self.location[:35] + "..."
428
- else:
429
- template_dict["stringLocation"] = self.location
430
-
431
- # Set additional information for Synastry chart type
432
- if self.chart_type == "Synastry":
433
- template_dict["stringLat"] = f"{self.t_user.name}: "
434
- template_dict["stringLon"] = self.t_user.city
435
- template_dict["stringPosition"] = f"{self.t_user.year}-{self.t_user.month}-{self.t_user.day} {self.t_user.hour:02d}:{self.t_user.minute:02d}"
436
- else:
437
- latitude_string = convert_latitude_coordinate_to_string(self.geolat, self.language_settings['north'], self.language_settings['south'])
438
- longitude_string = convert_longitude_coordinate_to_string(self.geolon, self.language_settings['east'], self.language_settings['west'])
439
- template_dict["stringLat"] = f"{self.language_settings['latitude']}: {latitude_string}"
440
- template_dict["stringLon"] = f"{self.language_settings['longitude']}: {longitude_string}"
441
- template_dict["stringPosition"] = f"{self.language_settings['type']}: {self.chart_type}"
442
-
443
- # Set paper colors
444
- template_dict["paper_color_0"] = self.chart_colors_settings["paper_0"]
445
- template_dict["paper_color_1"] = self.chart_colors_settings["paper_1"]
446
-
447
- # Set planet colors
448
- for planet in self.planets_settings:
449
- planet_id = planet["id"]
450
- template_dict[f"planets_color_{planet_id}"] = planet["color"] # type: ignore
451
-
452
- # Set zodiac colors
453
- for i in range(12):
454
- template_dict[f"zodiac_color_{i}"] = self.chart_colors_settings[f"zodiac_icon_{i}"] # type: ignore
455
-
456
- # Set orb colors
457
- for aspect in self.aspects_settings:
458
- template_dict[f"orb_color_{aspect['degree']}"] = aspect['color'] # type: ignore
459
-
460
- # Drawing functions
461
- template_dict["makeZodiac"] = self._draw_zodiac_circle_slices(self.main_radius)
462
-
463
- first_subject_houses_list = get_houses_list(self.user)
464
-
465
- # Draw houses grid and cusps
466
- if self.chart_type in ["Transit", "Synastry"]:
467
- second_subject_houses_list = get_houses_list(self.t_user)
468
-
469
- template_dict["makeHousesGrid"] = draw_house_grid(
470
- main_subject_houses_list=first_subject_houses_list,
471
- secondary_subject_houses_list=second_subject_houses_list,
472
- chart_type=self.chart_type,
473
- text_color=self.chart_colors_settings["paper_0"],
474
- house_cusp_generale_name_label=self.language_settings["cusp"]
475
- )
476
-
477
- template_dict["makeHouses"] = draw_houses_cusps_and_text_number(
478
- r=self.main_radius,
479
- first_subject_houses_list=first_subject_houses_list,
480
- standard_house_cusp_color=self.chart_colors_settings["houses_radix_line"],
481
- first_house_color=self.planets_settings[12]["color"],
482
- tenth_house_color=self.planets_settings[13]["color"],
483
- seventh_house_color=self.planets_settings[14]["color"],
484
- fourth_house_color=self.planets_settings[15]["color"],
485
- c1=self.first_circle_radius,
486
- c3=self.third_circle_radius,
487
- chart_type=self.chart_type,
488
- second_subject_houses_list=second_subject_houses_list,
489
- transit_house_cusp_color=self.chart_colors_settings["houses_transit_line"],
490
- )
491
-
492
- else:
493
- template_dict["makeHousesGrid"] = draw_house_grid(
494
- main_subject_houses_list=first_subject_houses_list,
495
- chart_type=self.chart_type,
496
- text_color=self.chart_colors_settings["paper_0"],
497
- house_cusp_generale_name_label=self.language_settings["cusp"]
498
- )
499
-
500
- template_dict["makeHouses"] = draw_houses_cusps_and_text_number(
501
- r=self.main_radius,
502
- first_subject_houses_list=first_subject_houses_list,
503
- standard_house_cusp_color=self.chart_colors_settings["houses_radix_line"],
504
- first_house_color=self.planets_settings[12]["color"],
505
- tenth_house_color=self.planets_settings[13]["color"],
506
- seventh_house_color=self.planets_settings[14]["color"],
507
- fourth_house_color=self.planets_settings[15]["color"],
508
- c1=self.first_circle_radius,
509
- c3=self.third_circle_radius,
510
- chart_type=self.chart_type,
511
- )
512
-
513
- # Draw planets
514
- if self.chart_type in ["Transit", "Synastry"]:
515
- template_dict["makePlanets"] = draw_planets(
516
- available_kerykeion_celestial_points=self.available_kerykeion_celestial_points,
517
- available_planets_setting=self.available_planets_setting,
518
- second_subject_available_kerykeion_celestial_points=self.t_available_kerykeion_celestial_points,
519
- radius=self.main_radius,
520
- main_subject_first_house_degree_ut=self.user.first_house.abs_pos,
521
- main_subject_seventh_house_degree_ut=self.user.seventh_house.abs_pos,
522
- chart_type=self.chart_type,
523
- third_circle_radius=self.third_circle_radius,
524
- )
525
- else:
526
- template_dict["makePlanets"] = draw_planets(
527
- available_planets_setting=self.available_planets_setting,
528
- chart_type=self.chart_type,
529
- radius=self.main_radius,
530
- available_kerykeion_celestial_points=self.available_kerykeion_celestial_points,
531
- third_circle_radius=self.third_circle_radius,
532
- main_subject_first_house_degree_ut=self.user.first_house.abs_pos,
533
- main_subject_seventh_house_degree_ut=self.user.seventh_house.abs_pos
534
- )
535
-
536
- # Draw elements percentages
537
- template_dict["elements_percentages"] = draw_elements_percentages(
538
- self.language_settings['fire'],
539
- self.fire,
540
- self.language_settings['earth'],
541
- self.earth,
542
- self.language_settings['air'],
543
- self.air,
544
- self.language_settings['water'],
545
- self.water,
546
- )
547
-
548
- # Draw planet grid
549
- if self.chart_type in ["Transit", "Synastry"]:
550
- if self.chart_type == "Transit":
551
- second_subject_table_name = self.language_settings["transit_name"]
552
- else:
553
- second_subject_table_name = self.t_user.name
554
- template_dict["makePlanetGrid"] = draw_planet_grid(
555
- planets_and_houses_grid_title=self.language_settings["planets_and_house"],
556
- subject_name=self.user.name,
557
- available_kerykeion_celestial_points=self.available_kerykeion_celestial_points,
558
- chart_type=self.chart_type,
559
- text_color=self.chart_colors_settings["paper_0"],
560
- celestial_point_language=self.language_settings["celestial_points"],
561
- second_subject_name=second_subject_table_name,
562
- second_subject_available_kerykeion_celestial_points=self.t_available_kerykeion_celestial_points,
563
- )
564
- else:
565
- template_dict["makePlanetGrid"] = draw_planet_grid(
566
- planets_and_houses_grid_title=self.language_settings["planets_and_house"],
567
- subject_name=self.user.name,
568
- available_kerykeion_celestial_points=self.available_kerykeion_celestial_points,
569
- chart_type=self.chart_type,
570
- text_color=self.chart_colors_settings["paper_0"],
571
- celestial_point_language=self.language_settings["celestial_points"],
572
- )
573
-
574
- # Set date time string
575
- dt = datetime.fromisoformat(self.user.iso_formatted_local_datetime)
576
- custom_format = dt.strftime('%Y-%m-%d %H:%M [%z]')
577
- custom_format = custom_format[:-3] + ':' + custom_format[-3:]
578
- template_dict["stringDateTime"] = f"{custom_format}"
579
-
580
- return template_dict
581
-
582
- def makeTemplate(self, minify: bool = False) -> str:
583
- """Creates the template for the SVG file"""
584
- td = self._create_template_dictionary()
585
-
586
- DATA_DIR = Path(__file__).parent
587
- xml_svg = DATA_DIR / "templates" / "chart.xml"
588
-
589
- # read template
590
- with open(xml_svg, "r", encoding="utf-8", errors="ignore") as f:
591
- template = Template(f.read()).substitute(td)
592
-
593
- # return filename
594
-
595
- logging.debug(f"Template dictionary keys: {td.keys()}")
596
-
597
- self._create_template_dictionary()
598
-
599
- if minify:
600
- template = scourString(template).replace('"', "'").replace("\n", "").replace("\t","").replace(" ", "").replace(" ", "")
601
-
602
- else:
603
- template = template.replace('"', "'")
604
-
605
- return template
606
-
607
- def makeSVG(self, minify: bool = False):
608
- """Prints out the SVG file in the specified folder"""
609
-
610
- if not hasattr(self, "template"):
611
- self.template = self.makeTemplate(minify)
612
-
613
- self.chartname = self.output_directory / f"{self.user.name} - {self.chart_type} Chart.svg"
614
-
615
- with open(self.chartname, "w", encoding="utf-8", errors="ignore") as output_file:
616
- output_file.write(self.template)
617
-
618
- logging.info(f"SVG Generated Correctly in: {self.chartname}")
619
-
620
- def makeWheelOnlyTemplate(self, minify: bool = False):
621
- """Creates the template for the SVG file with only the wheel"""
622
-
623
- with open(Path(__file__).parent / "templates" / "wheel_only.xml", "r", encoding="utf-8", errors="ignore") as f:
624
- template = f.read()
625
-
626
- template_dict = self._create_template_dictionary()
627
- template = Template(template).substitute(template_dict)
628
-
629
- if minify:
630
- template = scourString(template).replace('"', "'").replace("\n", "").replace("\t","").replace(" ", "").replace(" ", "")
631
-
632
- else:
633
- template = template.replace('"', "'")
634
-
635
- return template
636
-
637
- def makeWheelOnlySVG(self, minify: bool = False):
638
- """Prints out the SVG file in the specified folder with only the wheel"""
639
-
640
- template = self.makeWheelOnlyTemplate(minify)
641
-
642
- self.chartname = self.output_directory / f"{self.user.name} - {self.chart_type} Chart - Wheel Only.svg"
643
-
644
- with open(self.chartname, "w", encoding="utf-8", errors="ignore") as output_file:
645
- output_file.write(template)
646
-
647
- logging.info(f"SVG Generated Correctly in: {self.chartname}")
648
-
649
- def makeAspectGridOnlyTemplate(self, minify: bool = False):
650
- """Creates the template for the SVG file with only the aspect grid"""
651
-
652
- with open(Path(__file__).parent / "templates" / "aspect_grid_only.xml", "r", encoding="utf-8", errors="ignore") as f:
653
- template = f.read()
654
-
655
- template_dict = self._create_template_dictionary()
656
-
657
- if self.chart_type in ["Transit", "Synastry"]:
658
- aspects_grid = draw_transit_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list)
659
- else:
660
- aspects_grid = draw_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list, x_start=50, y_start=250)
661
-
662
- template = Template(template).substitute({**template_dict, "makeAspectGrid": aspects_grid})
663
-
664
- if minify:
665
- template = scourString(template).replace('"', "'").replace("\n", "").replace("\t","").replace(" ", "").replace(" ", "")
666
-
667
- else:
668
- template = template.replace('"', "'")
669
-
670
- return template
671
-
672
- def makeAspectGridOnlySVG(self, minify: bool = False):
673
- """Prints out the SVG file in the specified folder with only the aspect grid"""
674
-
675
- template = self.makeAspectGridOnlyTemplate(minify)
676
-
677
- self.chartname = self.output_directory / f"{self.user.name} - {self.chart_type} Chart - Aspect Grid Only.svg"
678
-
679
- with open(self.chartname, "w", encoding="utf-8", errors="ignore") as output_file:
680
- output_file.write(template)
681
-
682
- logging.info(f"SVG Generated Correctly in: {self.chartname}")
683
-
684
-
685
- if __name__ == "__main__":
686
- from kerykeion.utilities import setup_logging
687
- setup_logging(level="debug")
688
-
689
- first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
690
- second = AstrologicalSubject("Paul McCartney", 1942, 6, 18, 15, 30, "Liverpool", "GB")
691
-
692
- # Internal Natal Chart
693
- internal_natal_chart = KerykeionChartSVG(first)
694
- internal_natal_chart.makeSVG()
695
-
696
- # External Natal Chart
697
- external_natal_chart = KerykeionChartSVG(first, "ExternalNatal", second)
698
- external_natal_chart.makeSVG()
699
-
700
- # Synastry Chart
701
- synastry_chart = KerykeionChartSVG(first, "Synastry", second)
702
- synastry_chart.makeSVG()
703
-
704
- # Transits Chart
705
- transits_chart = KerykeionChartSVG(first, "Transit", second)
706
- transits_chart.makeSVG()
707
-
708
- # Sidereal Birth Chart (Lahiri)
709
- sidereal_subject = AstrologicalSubject("John Lennon Lahiri", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="LAHIRI")
710
- sidereal_chart = KerykeionChartSVG(sidereal_subject)
711
- sidereal_chart.makeSVG()
712
-
713
- # Sidereal Birth Chart (Fagan-Bradley)
714
- sidereal_subject = AstrologicalSubject("John Lennon Fagan-Bradley", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="FAGAN_BRADLEY")
715
- sidereal_chart = KerykeionChartSVG(sidereal_subject)
716
- sidereal_chart.makeSVG()
717
-
718
- # Sidereal Birth Chart (DeLuce)
719
- sidereal_subject = AstrologicalSubject("John Lennon DeLuce", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="DELUCE")
720
- sidereal_chart = KerykeionChartSVG(sidereal_subject)
721
- sidereal_chart.makeSVG()
722
-
723
- # Sidereal Birth Chart (J2000)
724
- sidereal_subject = AstrologicalSubject("John Lennon J2000", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="J2000")
725
- sidereal_chart = KerykeionChartSVG(sidereal_subject)
726
- sidereal_chart.makeSVG()
727
-
728
- # House System Morinus
729
- morinus_house_subject = AstrologicalSubject("John Lennon - House System Morinus", 1940, 10, 9, 18, 30, "Liverpool", "GB", houses_system_identifier="M")
730
- morinus_house_chart = KerykeionChartSVG(morinus_house_subject)
731
- morinus_house_chart.makeSVG()
732
-
733
- ## To check all the available house systems uncomment the following code:
734
- # from kerykeion.kr_types import HousesSystemIdentifier
735
- # from typing import get_args
736
- # for i in get_args(HousesSystemIdentifier):
737
- # alternatives_house_subject = AstrologicalSubject(f"John Lennon - House System {i}", 1940, 10, 9, 18, 30, "Liverpool", "GB", houses_system=i)
738
- # alternatives_house_chart = KerykeionChartSVG(alternatives_house_subject)
739
- # alternatives_house_chart.makeSVG()
740
-
741
- # With True Geocentric Perspective
742
- true_geocentric_subject = AstrologicalSubject("John Lennon - True Geocentric", 1940, 10, 9, 18, 30, "Liverpool", "GB", perspective_type="True Geocentric")
743
- true_geocentric_chart = KerykeionChartSVG(true_geocentric_subject)
744
- true_geocentric_chart.makeSVG()
745
-
746
- # With Heliocentric Perspective
747
- heliocentric_subject = AstrologicalSubject("John Lennon - Heliocentric", 1940, 10, 9, 18, 30, "Liverpool", "GB", perspective_type="Heliocentric")
748
- heliocentric_chart = KerykeionChartSVG(heliocentric_subject)
749
- heliocentric_chart.makeSVG()
750
-
751
- # With Topocentric Perspective
752
- topocentric_subject = AstrologicalSubject("John Lennon - Topocentric", 1940, 10, 9, 18, 30, "Liverpool", "GB", perspective_type="Topocentric")
753
- topocentric_chart = KerykeionChartSVG(topocentric_subject)
754
- topocentric_chart.makeSVG()
755
-
756
- # Minified SVG
757
- minified_subject = AstrologicalSubject("John Lennon - Minified", 1940, 10, 9, 18, 30, "Liverpool", "GB")
758
- minified_chart = KerykeionChartSVG(minified_subject)
759
- minified_chart.makeSVG(minify=True)
760
-
761
- # Dark Theme Natal Chart
762
- dark_theme_subject = AstrologicalSubject("John Lennon - Dark Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
763
- dark_theme_natal_chart = KerykeionChartSVG(dark_theme_subject, theme="dark")
764
- dark_theme_natal_chart.makeSVG()
765
-
766
- # Dark High Contrast Theme Natal Chart
767
- dark_high_contrast_theme_subject = AstrologicalSubject("John Lennon - Dark High Contrast Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
768
- dark_high_contrast_theme_natal_chart = KerykeionChartSVG(dark_high_contrast_theme_subject, theme="dark-high-contrast")
769
- dark_high_contrast_theme_natal_chart.makeSVG()
770
-
771
- # Light Theme Natal Chart
772
- light_theme_subject = AstrologicalSubject("John Lennon - Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
773
- light_theme_natal_chart = KerykeionChartSVG(light_theme_subject, theme="light")
774
- light_theme_natal_chart.makeSVG()
775
-
776
- # Dark Theme External Natal Chart
777
- dark_theme_external_subject = AstrologicalSubject("John Lennon - Dark Theme External", 1940, 10, 9, 18, 30, "Liverpool", "GB")
778
- dark_theme_external_chart = KerykeionChartSVG(dark_theme_external_subject, "ExternalNatal", second, theme="dark")
779
- dark_theme_external_chart.makeSVG()
780
-
781
- # Dark Theme Synastry Chart
782
- dark_theme_synastry_subject = AstrologicalSubject("John Lennon - DTS", 1940, 10, 9, 18, 30, "Liverpool", "GB")
783
- dark_theme_synastry_chart = KerykeionChartSVG(dark_theme_synastry_subject, "Synastry", second, theme="dark")
784
- dark_theme_synastry_chart.makeSVG()
785
-
786
- # Wheel Natal Only Chart
787
- wheel_only_subject = AstrologicalSubject("John Lennon - Wheel Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
788
- wheel_only_chart = KerykeionChartSVG(wheel_only_subject)
789
- wheel_only_chart.makeWheelOnlySVG()
790
-
791
- # Wheel External Natal Only Chart
792
- wheel_external_subject = AstrologicalSubject("John Lennon - Wheel External Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
793
- wheel_external_chart = KerykeionChartSVG(wheel_external_subject, "ExternalNatal", second)
794
- wheel_external_chart.makeWheelOnlySVG()
795
-
796
- # Wheel Synastry Only Chart
797
- wheel_synastry_subject = AstrologicalSubject("John Lennon - Wheel Synastry Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
798
- wheel_synastry_chart = KerykeionChartSVG(wheel_synastry_subject, "Synastry", second)
799
- wheel_synastry_chart.makeWheelOnlySVG()
800
-
801
- # Wheel Transit Only Chart
802
- wheel_transit_subject = AstrologicalSubject("John Lennon - Wheel Transit Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
803
- wheel_transit_chart = KerykeionChartSVG(wheel_transit_subject, "Transit", second)
804
- wheel_transit_chart.makeWheelOnlySVG()
805
-
806
- # Wheel Sidereal Birth Chart (Lahiri) Dark Theme
807
- sidereal_dark_subject = AstrologicalSubject("John Lennon Lahiri - Dark Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="LAHIRI")
808
- sidereal_dark_chart = KerykeionChartSVG(sidereal_dark_subject, theme="dark")
809
- sidereal_dark_chart.makeWheelOnlySVG()
810
-
811
- # Wheel Sidereal Birth Chart (Fagan-Bradley) Light Theme
812
- sidereal_light_subject = AstrologicalSubject("John Lennon Fagan-Bradley - Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="FAGAN_BRADLEY")
813
- sidereal_light_chart = KerykeionChartSVG(sidereal_light_subject, theme="light")
814
- sidereal_light_chart.makeWheelOnlySVG()
815
-
816
- # Aspect Grid Only Natal Chart
817
- aspect_grid_only_subject = AstrologicalSubject("John Lennon - Aspect Grid Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
818
- aspect_grid_only_chart = KerykeionChartSVG(aspect_grid_only_subject)
819
- aspect_grid_only_chart.makeAspectGridOnlySVG()
820
-
821
- # Aspect Grid Only Dark Theme Natal Chart
822
- aspect_grid_dark_subject = AstrologicalSubject("John Lennon - Aspect Grid Dark Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
823
- aspect_grid_dark_chart = KerykeionChartSVG(aspect_grid_dark_subject, theme="dark")
824
- aspect_grid_dark_chart.makeAspectGridOnlySVG()
825
-
826
- # Aspect Grid Only Light Theme Natal Chart
827
- aspect_grid_light_subject = AstrologicalSubject("John Lennon - Aspect Grid Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
828
- aspect_grid_light_chart = KerykeionChartSVG(aspect_grid_light_subject, theme="light")
829
- aspect_grid_light_chart.makeAspectGridOnlySVG()
830
-
831
- # Synastry Chart Aspect Grid Only
832
- aspect_grid_synastry_subject = AstrologicalSubject("John Lennon - Aspect Grid Synastry", 1940, 10, 9, 18, 30, "Liverpool", "GB")
833
- aspect_grid_synastry_chart = KerykeionChartSVG(aspect_grid_synastry_subject, "Synastry", second)
834
- aspect_grid_synastry_chart.makeAspectGridOnlySVG()
835
-
836
- # Transit Chart Aspect Grid Only
837
- aspect_grid_transit_subject = AstrologicalSubject("John Lennon - Aspect Grid Transit", 1940, 10, 9, 18, 30, "Liverpool", "GB")
838
- aspect_grid_transit_chart = KerykeionChartSVG(aspect_grid_transit_subject, "Transit", second)
839
- aspect_grid_transit_chart.makeAspectGridOnlySVG()
840
-
841
- # Synastry Chart Aspect Grid Only Dark Theme
842
- aspect_grid_dark_synastry_subject = AstrologicalSubject("John Lennon - Aspect Grid Dark Synastry", 1940, 10, 9, 18, 30, "Liverpool", "GB")
843
- aspect_grid_dark_synastry_chart = KerykeionChartSVG(aspect_grid_dark_synastry_subject, "Synastry", second, theme="dark")
844
- aspect_grid_dark_synastry_chart.makeAspectGridOnlySVG()
845
-
846
- # Transit Chart With draw_transit_aspect_grid table
847
- transit_chart_with_table_grid_subject = AstrologicalSubject("John Lennon - TCWTG", 1940, 10, 9, 18, 30, "Liverpool", "GB")
848
- transit_chart_with_table_grid = KerykeionChartSVG(transit_chart_with_table_grid_subject, "Transit", second, double_chart_aspect_grid_type="table", theme="dark")
849
- transit_chart_with_table_grid.makeSVG()
850
-
851
- # Chines Language Chart
852
- chinese_subject = AstrologicalSubject("Hua Chenyu", 1990, 2, 7, 12, 0, "Hunan", "CN")
853
- chinese_chart = KerykeionChartSVG(chinese_subject, chart_language="CN")
854
- chinese_chart.makeSVG()
855
-
856
- # French Language Chart
857
- french_subject = AstrologicalSubject("Jeanne Moreau", 1928, 1, 23, 10, 0, "Paris", "FR")
858
- french_chart = KerykeionChartSVG(french_subject, chart_language="FR")
859
- french_chart.makeSVG()
860
-
861
- # Spanish Language Chart
862
- spanish_subject = AstrologicalSubject("Antonio Banderas", 1960, 8, 10, 12, 0, "Malaga", "ES")
863
- spanish_chart = KerykeionChartSVG(spanish_subject, chart_language="ES")
864
- spanish_chart.makeSVG()
865
-
866
- # Portuguese Language Chart
867
- portuguese_subject = AstrologicalSubject("Cristiano Ronaldo", 1985, 2, 5, 5, 25, "Funchal", "PT")
868
- portuguese_chart = KerykeionChartSVG(portuguese_subject, chart_language="PT")
869
- portuguese_chart.makeSVG()
870
-
871
- # Italian Language Chart
872
- italian_subject = AstrologicalSubject("Sophia Loren", 1934, 9, 20, 2, 0, "Rome", "IT")
873
- italian_chart = KerykeionChartSVG(italian_subject, chart_language="IT")
874
- italian_chart.makeSVG()
875
-
876
- # Russian Language Chart
877
- russian_subject = AstrologicalSubject("Mikhail Bulgakov", 1891, 5, 15, 12, 0, "Kiev", "UA")
878
- russian_chart = KerykeionChartSVG(russian_subject, chart_language="RU")
879
- russian_chart.makeSVG()
880
-
881
- # Turkish Language Chart
882
- turkish_subject = AstrologicalSubject("Mehmet Oz", 1960, 6, 11, 12, 0, "Istanbul", "TR")
883
- turkish_chart = KerykeionChartSVG(turkish_subject, chart_language="TR")
884
- turkish_chart.makeSVG()
885
-
886
- # German Language Chart
887
- german_subject = AstrologicalSubject("Albert Einstein", 1879, 3, 14, 11, 30, "Ulm", "DE")
888
- german_chart = KerykeionChartSVG(german_subject, chart_language="DE")
889
- german_chart.makeSVG()
890
-
891
- # Hindi Language Chart
892
- hindi_subject = AstrologicalSubject("Amitabh Bachchan", 1942, 10, 11, 4, 0, "Allahabad", "IN")
893
- hindi_chart = KerykeionChartSVG(hindi_subject, chart_language="HI")
894
- hindi_chart.makeSVG()