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.
- kerykeion/__init__.py +56 -11
- kerykeion/aspects/__init__.py +7 -4
- kerykeion/aspects/aspects_factory.py +568 -0
- kerykeion/aspects/aspects_utils.py +86 -13
- kerykeion/astrological_subject_factory.py +1901 -0
- kerykeion/backword.py +820 -0
- kerykeion/chart_data_factory.py +552 -0
- kerykeion/charts/__init__.py +2 -2
- kerykeion/charts/chart_drawer.py +2794 -0
- kerykeion/charts/charts_utils.py +1066 -309
- kerykeion/charts/draw_planets.py +602 -351
- kerykeion/charts/templates/aspect_grid_only.xml +337 -193
- kerykeion/charts/templates/chart.xml +441 -240
- kerykeion/charts/templates/wheel_only.xml +365 -211
- kerykeion/charts/themes/black-and-white.css +148 -0
- kerykeion/charts/themes/classic.css +107 -76
- kerykeion/charts/themes/dark-high-contrast.css +145 -107
- kerykeion/charts/themes/dark.css +146 -107
- kerykeion/charts/themes/light.css +146 -103
- kerykeion/charts/themes/strawberry.css +158 -0
- kerykeion/composite_subject_factory.py +408 -0
- kerykeion/ephemeris_data_factory.py +443 -0
- kerykeion/fetch_geonames.py +81 -21
- kerykeion/house_comparison/__init__.py +6 -0
- kerykeion/house_comparison/house_comparison_factory.py +103 -0
- kerykeion/house_comparison/house_comparison_utils.py +126 -0
- kerykeion/kr_types/__init__.py +66 -6
- kerykeion/kr_types/chart_template_model.py +20 -0
- kerykeion/kr_types/kerykeion_exception.py +15 -9
- kerykeion/kr_types/kr_literals.py +14 -106
- kerykeion/kr_types/kr_models.py +14 -179
- kerykeion/kr_types/settings_models.py +15 -152
- kerykeion/planetary_return_factory.py +805 -0
- kerykeion/relationship_score_factory.py +301 -0
- kerykeion/report.py +750 -65
- kerykeion/schemas/__init__.py +106 -0
- kerykeion/schemas/chart_template_model.py +367 -0
- kerykeion/schemas/kerykeion_exception.py +20 -0
- kerykeion/schemas/kr_literals.py +181 -0
- kerykeion/schemas/kr_models.py +603 -0
- kerykeion/schemas/settings_models.py +188 -0
- kerykeion/settings/__init__.py +20 -1
- kerykeion/settings/chart_defaults.py +444 -0
- kerykeion/settings/config_constants.py +152 -0
- kerykeion/settings/kerykeion_settings.py +36 -61
- kerykeion/settings/translation_strings.py +1499 -0
- kerykeion/settings/translations.py +74 -0
- kerykeion/sweph/ast136/s136108s.se1 +0 -0
- kerykeion/sweph/ast136/s136199s.se1 +0 -0
- kerykeion/sweph/ast136/s136472s.se1 +0 -0
- kerykeion/sweph/ast28/se28978s.se1 +0 -0
- kerykeion/sweph/ast50/se50000s.se1 +0 -0
- kerykeion/sweph/ast90/se90377s.se1 +0 -0
- kerykeion/sweph/ast90/se90482s.se1 +0 -0
- kerykeion/sweph/sefstars.txt +1602 -0
- kerykeion/transits_time_range_factory.py +302 -0
- kerykeion/utilities.py +626 -125
- kerykeion-5.1.9.dist-info/METADATA +1793 -0
- kerykeion-5.1.9.dist-info/RECORD +63 -0
- {kerykeion-4.18.3.dist-info → kerykeion-5.1.9.dist-info}/WHEEL +1 -1
- kerykeion/aspects/natal_aspects.py +0 -143
- kerykeion/aspects/synastry_aspects.py +0 -113
- kerykeion/astrological_subject.py +0 -818
- kerykeion/charts/kerykeion_chart_svg.py +0 -894
- kerykeion/enums.py +0 -51
- kerykeion/ephemeris_data.py +0 -178
- kerykeion/kr_types/chart_types.py +0 -88
- kerykeion/relationship_score/__init__.py +0 -2
- kerykeion/relationship_score/relationship_score.py +0 -175
- kerykeion/relationship_score/relationship_score_factory.py +0 -275
- kerykeion/settings/kr.config.json +0 -721
- kerykeion-4.18.3.dist-info/LICENSE +0 -661
- kerykeion-4.18.3.dist-info/METADATA +0 -396
- kerykeion-4.18.3.dist-info/RECORD +0 -42
- kerykeion-4.18.3.dist-info/entry_points.txt +0 -3
- /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()
|