From fa48e115134998f2b2ba21e3c92b86c82e28f0da Mon Sep 17 00:00:00 2001 From: g-battaglia Date: Tue, 13 Aug 2024 12:54:50 +0200 Subject: [PATCH] draw_planets clean up complete, should be better --- kerykeion/charts/draw_planets.py | 20 +++ kerykeion/charts/kerykeion_chart_svg.py | 136 ++++++++---------- kerykeion/charts/templates/chart.xml | 2 +- kerykeion/kr_types/chart_types.py | 1 - kerykeion/kr_types/settings_models.py | 8 +- .../John Lennon - ExternalNatal Chart.svg | 2 +- ...hn Lennon - Heliocentric - Natal Chart.svg | 2 +- ...n - House System Morinus - Natal Chart.svg | 2 +- tests/charts/John Lennon - Natal Chart.svg | 2 +- tests/charts/John Lennon - Synastry Chart.svg | 2 +- ...ohn Lennon - Topocentric - Natal Chart.svg | 2 +- tests/charts/John Lennon - Transit Chart.svg | 2 +- ...Lennon - True Geocentric - Natal Chart.svg | 2 +- .../John Lennon DeLuce - Natal Chart.svg | 2 +- ...ohn Lennon Fagan-Bradley - Natal Chart.svg | 2 +- .../John Lennon J2000 - Natal Chart.svg | 2 +- .../John Lennon Lahiri - Natal Chart.svg | 2 +- 17 files changed, 101 insertions(+), 90 deletions(-) diff --git a/kerykeion/charts/draw_planets.py b/kerykeion/charts/draw_planets.py index 4051aa6..2cac79b 100644 --- a/kerykeion/charts/draw_planets.py +++ b/kerykeion/charts/draw_planets.py @@ -18,6 +18,26 @@ def draw_planets( chart_type: ChartType, second_subject_available_kerykeion_celestial_points: Union[list[KerykeionPointModel], None] = None, ): + """ + Draws the planets on a chart based on the provided parameters. + + Args: + radius (int): The radius of the chart. + available_kerykeion_celestial_points (list[KerykeionPointModel]): List of celestial points for the main subject. + available_planets_setting (list[KerykeionSettingsCelestialPointModel]): Settings for the celestial points. + third_circle_radius (Union[int, float]): Radius of the third circle. + main_subject_first_house_degree_ut (Union[int, float]): Degree of the first house for the main subject. + main_subject_seventh_house_degree_ut (Union[int, float]): Degree of the seventh house for the main subject. + chart_type (ChartType): Type of the chart (e.g., "Transit", "Synastry"). + second_subject_available_kerykeion_celestial_points (Union[list[KerykeionPointModel], None], optional): + List of celestial points for the second subject, required for "Transit" or "Synastry" charts. Defaults to None. + + Raises: + KerykeionException: If the second subject is required but not provided. + + Returns: + str: SVG output for the chart with the planets drawn. + """ TRANSIT_RING_EXCLUDE_POINTS_NAMES = get_args(Houses) if chart_type == "Transit" or chart_type == "Synastry": diff --git a/kerykeion/charts/kerykeion_chart_svg.py b/kerykeion/charts/kerykeion_chart_svg.py index 22166ba..e947f45 100755 --- a/kerykeion/charts/kerykeion_chart_svg.py +++ b/kerykeion/charts/kerykeion_chart_svg.py @@ -74,11 +74,11 @@ class KerykeionChartSVG: earth: float air: float water: float - c1: float - c2: float - c3: float + main_radius: float + first_circle_radius: float + second_circle_radius: float + third_circle_radius: float homedir: Path - xml_svg: Path width: Union[float, int] language_settings: dict chart_colors_settings: dict @@ -88,12 +88,6 @@ class KerykeionChartSVG: chart_settings: dict user: AstrologicalSubject available_planets_setting: List[KerykeionSettingsCelestialPointModel] - points_deg_ut: list - points_deg: list - points_retrograde: list - t_points_deg_ut: list - t_points_deg: list - t_points_retrograde: list height: float location: str geolat: float @@ -109,7 +103,6 @@ def __init__( new_settings_file: Union[Path, None] = None, ): # Directories: - DATA_DIR = Path(__file__).parent self.homedir = Path.home() self.new_settings_file = new_settings_file @@ -118,8 +111,6 @@ def __init__( else: self.output_directory = self.homedir - self.xml_svg = DATA_DIR / "templates/chart.xml" - self.parse_json_settings(new_settings_file) self.chart_type = chart_type @@ -147,7 +138,6 @@ def __init__( natal_aspects_instance = NatalAspects(self.user, new_settings_file=self.new_settings_file) self.aspects_list = natal_aspects_instance.relevant_aspects - # TODO: If not second should exit if self.chart_type == "Transit" or self.chart_type == "Synastry": if not second_obj: raise KerykeionException("Second object is required for Transit or Synastry charts.") @@ -155,6 +145,9 @@ def __init__( # Kerykeion instance self.t_user = second_obj + # Aspects + self.aspects_list = SynastryAspects(self.user, self.t_user, new_settings_file=self.new_settings_file).relevant_aspects + self.t_available_kerykeion_celestial_points = [] for body in available_celestial_points_names: self.t_available_kerykeion_celestial_points.append(self.t_user.get(body)) @@ -171,13 +164,30 @@ def __init__( self.geolat = self.user.lat self.geolon = self.user.lng - logging.info(f"{self.user.name} birth location: {self.location}, {self.geolat}, {self.geolon}") - if self.chart_type == "Transit": self.t_name = self.language_settings["transit_name"] self.template = None + + # Default radius for the chart + self.main_radius = 240 + + # Set circle radii based on chart type + if self.chart_type == "ExternalNatal": + self.first_circle_radius, self.second_circle_radius, self.third_circle_radius = 56, 92, 112 + else: + self.first_circle_radius, self.second_circle_radius, self.third_circle_radius = 0, 36, 120 + + # Initialize element points + self.fire = 0.0 + self.earth = 0.0 + self.air = 0.0 + self.water = 0.0 + + # Calculate element points from planets + self._calculate_elements_points_from_planets() + def set_output_directory(self, dir_path: Path) -> None: """ Sets the output direcotry and returns it's path. @@ -211,11 +221,10 @@ def _draw_zodiac_circle_slices(self, r): str: The SVG string representing the zodiac circle. """ sings = get_args(Sign) - output = "" for i, sing in enumerate(sings): output += draw_zodiac_slice( - c1=self.c1, + c1=self.first_circle_radius, chart_type=self.chart_type, seventh_house_degree_ut=self.user.houses_degree_ut[6], num=i, @@ -231,6 +240,7 @@ def _calculate_elements_points_from_planets(self): Calculate chart element points from a planet. TODO: Refactor this method. Should be completely rewritten. Maybe even part of the AstrologicalSubject class. + The points should include just the standard way of calculating the elements points. """ zodiac = ( @@ -296,9 +306,6 @@ def _draw_all_aspects_lines(self, r, ar): def _draw_all_transit_aspects_lines(self, r, ar): out = "" - - self.aspects_list = SynastryAspects(self.user, self.t_user, new_settings_file=self.new_settings_file).relevant_aspects - for aspect in self.aspects_list: out += draw_aspect_line( r=r, @@ -307,7 +314,6 @@ def _draw_all_transit_aspects_lines(self, r, ar): color=self.aspects_settings[aspect["aid"]]["color"], seventh_house_degree_ut=self.user.seventh_house.abs_pos ) - return out def _create_template_dictionary(self) -> ChartTemplateDictionary: @@ -317,52 +323,38 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: Returns: ChartTemplateDictionary: A dictionary with template data for the chart. """ - # Initialize element points - self.fire = 0.0 - self.earth = 0.0 - self.air = 0.0 - self.water = 0.0 - - # Calculate element points from planets - self._calculate_elements_points_from_planets() - - # Default rotation - rotation = "0" - # Initialize template dictionary template_dict: ChartTemplateDictionary = dict() # type: ignore - radius = 240 + + # Set chart dimensions + template_dict["chart_height"] = self.height + template_dict["chart_width"] = self.width + + # Set chart name + template_dict["stringName"] = f"{self.user.name}:" if self.chart_type in ["Synastry", "Transit"] else f'{self.language_settings["info"]}:' # Set viewbox based on chart type template_dict['viewbox'] = self.chart_settings["basic_chart_viewBox"] if self.chart_type in ["Natal", "ExternalNatal"] else self.chart_settings["wide_chart_viewBox"] - # Set circle radii based on chart type - if self.chart_type == "ExternalNatal": - self.c1, self.c2, self.c3 = 56, 92, 112 - else: - self.c1, self.c2, self.c3 = 0, 36, 120 - # Generate rings and circles based on chart type if self.chart_type in ["Transit", "Synastry"]: - template_dict["transitRing"] = draw_transit_ring(radius, self.chart_colors_settings["paper_1"], self.chart_colors_settings["zodiac_transit_ring_3"]) - template_dict["degreeRing"] = draw_transit_ring_degree_steps(radius, self.user.seventh_house.abs_pos) - template_dict["first_circle"] = draw_first_circle(radius, self.chart_colors_settings["zodiac_transit_ring_2"], self.chart_type) - template_dict["second_circle"] = draw_second_circle(radius, self.chart_colors_settings['zodiac_transit_ring_1'], self.chart_colors_settings['paper_1'], self.chart_type) - template_dict['third_circle'] = draw_third_circle(radius, self.chart_colors_settings['zodiac_transit_ring_0'], self.chart_colors_settings['paper_1'], self.chart_type) - template_dict["makeAspects"] = self._draw_all_transit_aspects_lines(radius, radius - 160) + template_dict["transitRing"] = draw_transit_ring(self.main_radius, self.chart_colors_settings["paper_1"], self.chart_colors_settings["zodiac_transit_ring_3"]) + template_dict["degreeRing"] = draw_transit_ring_degree_steps(self.main_radius, self.user.seventh_house.abs_pos) + template_dict["first_circle"] = draw_first_circle(self.main_radius, self.chart_colors_settings["zodiac_transit_ring_2"], self.chart_type) + 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) + 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) template_dict["makeAspectGrid"] = draw_aspect_transit_grid(self.language_settings["aspects"], self.aspects_list, self.planets_settings, self.aspects_settings) + + template_dict["makeAspects"] = self._draw_all_transit_aspects_lines(self.main_radius, self.main_radius - 160) else: template_dict["transitRing"] = "" - template_dict["degreeRing"] = draw_degree_ring(radius, self.c1, self.user.seventh_house.abs_pos, self.chart_colors_settings["paper_0"]) - template_dict['first_circle'] = draw_first_circle(radius, self.chart_colors_settings["zodiac_radix_ring_2"], self.chart_type, self.c1) - template_dict["second_circle"] = draw_second_circle(radius, self.chart_colors_settings["zodiac_radix_ring_1"], self.chart_colors_settings["paper_1"], self.chart_type, self.c2) - template_dict['third_circle'] = draw_third_circle(radius, self.chart_colors_settings["zodiac_radix_ring_0"], self.chart_colors_settings["paper_1"], self.chart_type, self.c3) - template_dict["makeAspects"] = self._draw_all_aspects_lines(radius, radius - self.c3) + 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"]) + 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) + 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) + 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) template_dict["makeAspectGrid"] = draw_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list) - # Set chart dimensions - template_dict["chart_height"] = self.height - template_dict["chart_width"] = self.width + template_dict["makeAspects"] = self._draw_all_aspects_lines(self.main_radius, self.main_radius - self.third_circle_radius) # Set chart title if self.chart_type == "Synastry": @@ -372,9 +364,6 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: else: template_dict["stringTitle"] = self.user.name - # Set chart name - template_dict["stringName"] = f"{self.user.name}:" if self.chart_type in ["Synastry", "Transit"] else f'{self.language_settings["info"]}:' - # Set bottom left corner information template_dict["bottomLeft0"] = f"{self.user.zodiac_type if self.user.zodiac_type == 'Tropic' else self.user.zodiac_type + ' ' + self.user.sidereal_mode}" template_dict["bottomLeft1"] = f"{self.user.houses_system_name}" @@ -431,11 +420,8 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: for aspect in self.aspects_settings: template_dict[f"orb_color_{aspect['degree']}"] = aspect['color'] - # Set configuration rotation - template_dict["cfgRotate"] = rotation - # Drawing functions - template_dict["makeZodiac"] = self._draw_zodiac_circle_slices(radius) + template_dict["makeZodiac"] = self._draw_zodiac_circle_slices(self.main_radius) # Draw houses grid and cusps if self.chart_type in ["Transit", "Synastry"]: @@ -448,15 +434,15 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: ) template_dict["makeHouses"] = draw_houses_cusps_and_text_number( - r=radius, + r=self.main_radius, first_subject_houses_list_ut=self.user.houses_degree_ut, standard_house_cusp_color=self.chart_colors_settings["houses_radix_line"], first_house_color=self.planets_settings[12]["color"], tenth_house_color=self.planets_settings[13]["color"], seventh_house_color=self.planets_settings[14]["color"], fourth_house_color=self.planets_settings[15]["color"], - c1=self.c1, - c3=self.c3, + c1=self.first_circle_radius, + c3=self.third_circle_radius, chart_type=self.chart_type, second_subject_houses_list_ut=self.t_user.houses_degree_ut, transit_house_cusp_color=self.chart_colors_settings["houses_transit_line"], @@ -471,15 +457,15 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: ) template_dict["makeHouses"] = draw_houses_cusps_and_text_number( - r=radius, + r=self.main_radius, first_subject_houses_list_ut=self.user.houses_degree_ut, standard_house_cusp_color=self.chart_colors_settings["houses_radix_line"], first_house_color=self.planets_settings[12]["color"], tenth_house_color=self.planets_settings[13]["color"], seventh_house_color=self.planets_settings[14]["color"], fourth_house_color=self.planets_settings[15]["color"], - c1=self.c1, - c3=self.c3, + c1=self.first_circle_radius, + c3=self.third_circle_radius, chart_type=self.chart_type, ) @@ -489,24 +475,23 @@ def _create_template_dictionary(self) -> ChartTemplateDictionary: available_kerykeion_celestial_points=self.available_kerykeion_celestial_points, available_planets_setting=self.available_planets_setting, second_subject_available_kerykeion_celestial_points=self.t_available_kerykeion_celestial_points, - radius=radius, + radius=self.main_radius, main_subject_first_house_degree_ut=self.user.houses_degree_ut[0], main_subject_seventh_house_degree_ut=self.user.houses_degree_ut[6], chart_type=self.chart_type, - third_circle_radius=self.c3, + third_circle_radius=self.third_circle_radius, ) else: template_dict["makePlanets"] = draw_planets( available_planets_setting=self.available_planets_setting, chart_type=self.chart_type, - radius=radius, + radius=self.main_radius, available_kerykeion_celestial_points=self.available_kerykeion_celestial_points, - third_circle_radius=self.c3, + third_circle_radius=self.third_circle_radius, main_subject_first_house_degree_ut=self.user.houses_degree_ut[0], main_subject_seventh_house_degree_ut=self.user.houses_degree_ut[6], ) - # Draw elements percentages template_dict["elements_percentages"] = draw_elements_percentages( self.language_settings['fire'], @@ -557,8 +542,11 @@ def makeTemplate(self, minify: bool = False) -> str: """Creates the template for the SVG file""" td = self._create_template_dictionary() + DATA_DIR = Path(__file__).parent + xml_svg = DATA_DIR / "templates/chart.xml" + # read template - with open(self.xml_svg, "r", encoding="utf-8", errors="ignore") as f: + with open(xml_svg, "r", encoding="utf-8", errors="ignore") as f: template = Template(f.read()).substitute(td) # return filename diff --git a/kerykeion/charts/templates/chart.xml b/kerykeion/charts/templates/chart.xml index ec79a91..bbd20f1 100755 --- a/kerykeion/charts/templates/chart.xml +++ b/kerykeion/charts/templates/chart.xml @@ -11,7 +11,7 @@ > $stringTitle | Kerykeion - + diff --git a/kerykeion/kr_types/chart_types.py b/kerykeion/kr_types/chart_types.py index ccff5a7..1306e7a 100644 --- a/kerykeion/kr_types/chart_types.py +++ b/kerykeion/kr_types/chart_types.py @@ -82,7 +82,6 @@ class ChartTemplateDictionary(TypedDict): orb_color_150: str orb_color_180: str - cfgRotate: str cfgTranslate: str makeZodiac: str makeHouses: str diff --git a/kerykeion/kr_types/settings_models.py b/kerykeion/kr_types/settings_models.py index 5331267..afb83f5 100644 --- a/kerykeion/kr_types/settings_models.py +++ b/kerykeion/kr_types/settings_models.py @@ -80,12 +80,14 @@ class KerykeionSettingsAspectModel(SubscriptableBaseModel): degree: int = Field(title="Aspect Degrees", description="The degree of the aspect") name: str = Field(title="Aspect Name", description="The name of the aspect") is_active: bool = Field(title="Aspect is Active", description="Is the aspect active?") - visible_grid: bool = Field(title="Aspect Visible Grid", description="Is the aspect visible in the grid?") is_major: bool = Field(title="Aspect is Major", description="Is the aspect major?") is_minor: bool = Field(title="Aspect is Minor", description="Is the aspect minor?") orb: int = Field(title="Aspect Orb", description="The orb of the aspect") color: str = Field(title="Aspect Color", description="The color of the aspect") + # Deprecated: Not used anymore + visible_grid: bool = Field(title="Aspect Visible Grid", description="Is the aspect visible in the grid?") + # Language Settings class KerykeionLanguageCelestialPointModel(SubscriptableBaseModel): @@ -145,9 +147,11 @@ class KerykeionLanguageModel(SubscriptableBaseModel): class KerykeionGeneralSettingsModel(SubscriptableBaseModel): axes_orbit: int = Field(title="Axes Orbit", description="The orbit of the axes in the chart") - planet_in_zodiac_extra_points: int = Field(title="Planet in Zodiac Extra Points", description="The extra points of the planet in the zodiac") language: str = Field(title="Language", description="The language of the chart") + # Deprecated: Should be removed + planet_in_zodiac_extra_points: int = Field(title="Planet in Zodiac Extra Points", description="The extra points of the planet in the zodiac") + class KerykeionChartSettingsModel(SubscriptableBaseModel): basic_chart_viewBox: str = Field(title="Basic Chart ViewBox", description="The viewbox of the basic chart") wide_chart_viewBox: str = Field(title="Wide Chart ViewBox", description="The viewbox of the wide chart") diff --git a/tests/charts/John Lennon - ExternalNatal Chart.svg b/tests/charts/John Lennon - ExternalNatal Chart.svg index fab6b8d..ee01f22 100644 --- a/tests/charts/John Lennon - ExternalNatal Chart.svg +++ b/tests/charts/John Lennon - ExternalNatal Chart.svg @@ -11,7 +11,7 @@ > John Lennon | Kerykeion - + diff --git a/tests/charts/John Lennon - Heliocentric - Natal Chart.svg b/tests/charts/John Lennon - Heliocentric - Natal Chart.svg index d9996d1..af9a50e 100644 --- a/tests/charts/John Lennon - Heliocentric - Natal Chart.svg +++ b/tests/charts/John Lennon - Heliocentric - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon - Heliocentric | Kerykeion - + diff --git a/tests/charts/John Lennon - House System Morinus - Natal Chart.svg b/tests/charts/John Lennon - House System Morinus - Natal Chart.svg index 3f9a1f7..0f64591 100644 --- a/tests/charts/John Lennon - House System Morinus - Natal Chart.svg +++ b/tests/charts/John Lennon - House System Morinus - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon - House System Morinus | Kerykeion - + diff --git a/tests/charts/John Lennon - Natal Chart.svg b/tests/charts/John Lennon - Natal Chart.svg index c2e93ea..300fdc4 100644 --- a/tests/charts/John Lennon - Natal Chart.svg +++ b/tests/charts/John Lennon - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon | Kerykeion - + diff --git a/tests/charts/John Lennon - Synastry Chart.svg b/tests/charts/John Lennon - Synastry Chart.svg index 27be90a..224d850 100644 --- a/tests/charts/John Lennon - Synastry Chart.svg +++ b/tests/charts/John Lennon - Synastry Chart.svg @@ -11,7 +11,7 @@ > John Lennon and Paul McCartney | Kerykeion - + diff --git a/tests/charts/John Lennon - Topocentric - Natal Chart.svg b/tests/charts/John Lennon - Topocentric - Natal Chart.svg index d9cdb2d..ab8c20f 100644 --- a/tests/charts/John Lennon - Topocentric - Natal Chart.svg +++ b/tests/charts/John Lennon - Topocentric - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon - Topocentric | Kerykeion - + diff --git a/tests/charts/John Lennon - Transit Chart.svg b/tests/charts/John Lennon - Transit Chart.svg index b6d0c8c..2f5a407 100644 --- a/tests/charts/John Lennon - Transit Chart.svg +++ b/tests/charts/John Lennon - Transit Chart.svg @@ -11,7 +11,7 @@ > Transits for 18/6/1942 | Kerykeion - + diff --git a/tests/charts/John Lennon - True Geocentric - Natal Chart.svg b/tests/charts/John Lennon - True Geocentric - Natal Chart.svg index 14942ba..657dcdd 100644 --- a/tests/charts/John Lennon - True Geocentric - Natal Chart.svg +++ b/tests/charts/John Lennon - True Geocentric - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon - True Geocentric | Kerykeion - + diff --git a/tests/charts/John Lennon DeLuce - Natal Chart.svg b/tests/charts/John Lennon DeLuce - Natal Chart.svg index 85ab938..6b800fe 100644 --- a/tests/charts/John Lennon DeLuce - Natal Chart.svg +++ b/tests/charts/John Lennon DeLuce - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon DeLuce | Kerykeion - + diff --git a/tests/charts/John Lennon Fagan-Bradley - Natal Chart.svg b/tests/charts/John Lennon Fagan-Bradley - Natal Chart.svg index 3a9d19d..a7cb07b 100644 --- a/tests/charts/John Lennon Fagan-Bradley - Natal Chart.svg +++ b/tests/charts/John Lennon Fagan-Bradley - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon Fagan-Bradley | Kerykeion - + diff --git a/tests/charts/John Lennon J2000 - Natal Chart.svg b/tests/charts/John Lennon J2000 - Natal Chart.svg index 372c8ce..b4bb300 100644 --- a/tests/charts/John Lennon J2000 - Natal Chart.svg +++ b/tests/charts/John Lennon J2000 - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon J2000 | Kerykeion - + diff --git a/tests/charts/John Lennon Lahiri - Natal Chart.svg b/tests/charts/John Lennon Lahiri - Natal Chart.svg index 490a6c1..0c4dd1d 100644 --- a/tests/charts/John Lennon Lahiri - Natal Chart.svg +++ b/tests/charts/John Lennon Lahiri - Natal Chart.svg @@ -11,7 +11,7 @@ > John Lennon Lahiri | Kerykeion - +