Skip to content

Commit 3bfe14c

Browse files
committed
Initial sect calculations.
1 parent 41f48fe commit 3bfe14c

3 files changed

Lines changed: 125 additions & 66 deletions

File tree

immanuel/charts.py

Lines changed: 81 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
from immanuel.classes import wrap
2323
from immanuel.classes.localize import _
24-
from immanuel.const import chart, names
25-
from immanuel.reports import aspect, pattern
24+
from immanuel.const import calc, chart, names
25+
from immanuel.reports import aspect, dignity, pattern, weighting
2626
from immanuel.setup import settings
2727
from immanuel.tools import calculate, convert, date, ephemeris, forecast, midpoint, position
2828

@@ -50,6 +50,19 @@ def __init__(self, type: int, aspects_to: 'Chart' = None) -> None:
5050
self.type = _(names.CHART_TYPES[type])
5151
self._type = type
5252
self._aspects_to = aspects_to
53+
54+
self._native: Subject
55+
self._obliquity: float
56+
self._diurnal: bool
57+
self._moon_phase: int
58+
self._triad: dict = {
59+
chart.SUN: None,
60+
chart.MOON: None,
61+
chart.ASC: None,
62+
}
63+
self._objects: dict
64+
self._houses: dict
65+
5366
self.generate()
5467
self.wrap()
5568

@@ -60,14 +73,9 @@ def house_for(self, object: wrap.Object) -> int:
6073
return position.house(object.longitude.raw, self._houses)['index']
6174

6275
def generate(self) -> None:
63-
""" Generating the raw data is each descendant class's responsibility,
64-
but placeholders for properties common to all charts are set here. """
65-
self._native: Subject = None
66-
self._obliquity: float = None
67-
self._diurnal: bool = None
68-
self._moon_phase: int = None
69-
self._objects: dict = {}
70-
self._houses: dict = {}
76+
""" Generating the raw data is each descendant class's
77+
responsibility. """
78+
pass
7179

7280
def wrap(self) -> None:
7381
""" Loop through the required data and wrap each one with a custom
@@ -95,30 +103,54 @@ def set_wrapped_moon_phase(self) -> None:
95103

96104
def set_wrapped_objects(self) -> None:
97105
self.objects = {}
106+
98107
for index, object in self._objects.items():
99-
if 'jd' in object:
100-
object['date_time'] = date.to_datetime(
101-
dt=object['jd'],
102-
lat=self._native.latitude,
103-
lon=self._native.longitude,
104-
)
105-
self.objects[index] = wrap.Object(
108+
house = position.house(
106109
object=object,
107-
objects=self._objects,
108110
houses=self._houses,
109-
is_daytime=self._diurnal,
111+
)
112+
out_of_bounds = calculate.is_out_of_bounds(
113+
object=object,
110114
obliquity=self._obliquity,
111115
)
116+
in_sect = calculate.is_in_sect(
117+
object=object,
118+
is_daytime=self._diurnal,
119+
sun=self._triad[chart.SUN],
120+
) if object['index'] in (chart.SUN, chart.MOON, chart.MERCURY, chart.VENUS, chart.MARS, chart.JUPITER, chart.SATURN) else None
121+
dignity_state = dignity.all(
122+
object=object,
123+
objects=self._objects,
124+
is_daytime=self._diurnal,
125+
) if object['type'] == chart.PLANET and self._diurnal and calc.PLANETS.issubset(self._objects) else None
126+
date_time = date.to_datetime(
127+
dt=object['jd'],
128+
lat=self._native.latitude,
129+
lon=self._native.longitude,
130+
) if 'jd' in object else None
131+
132+
self.objects[index] = wrap.Object(
133+
object=object,
134+
date_time=date_time,
135+
house=house,
136+
out_of_bounds=out_of_bounds,
137+
in_sect=in_sect,
138+
dignity_state=dignity_state,
139+
)
112140

113141
def set_wrapped_houses(self) -> None:
114142
self.houses = {index: wrap.Object(object=house) for index, house in self._houses.items()}
115143

116144
def set_wrapped_aspects(self) -> None:
117145
aspects = aspect.all(self._objects) if self._aspects_to is None else aspect.synastry(self._objects, self._aspects_to._objects)
118-
self.aspects = {index: {object_index: wrap.Aspect(aspect=object_aspect, objects=self._objects) for object_index, object_aspect in aspect_list.items()} for index, aspect_list in aspects.items()}
146+
self.aspects = {index: {object_index: wrap.Aspect(aspect=object_aspect, active_name=self._objects[object_aspect['active']]['name'], passive_name=self._objects[object_aspect['passive']]['name']) for object_index, object_aspect in aspect_list.items()} for index, aspect_list in aspects.items()}
119147

120148
def set_wrapped_weightings(self) -> None:
121-
self.weightings = wrap.Weightings(self._objects, self._houses)
149+
self.weightings = wrap.Weightings(
150+
elements=weighting.elements(self._objects),
151+
modalities=weighting.modalities(self._objects),
152+
quadrants=weighting.quadrants(self._objects, self._houses),
153+
)
122154

123155

124156
class Natal(Chart):
@@ -131,18 +163,18 @@ def __init__(self, native: Subject, aspects_to: Chart = None) -> None:
131163
def generate(self) -> None:
132164
self._obliquity = ephemeris.obliquity(self._native.julian_date)
133165

134-
sun = ephemeris.planet(chart.SUN, self._native.julian_date)
135-
moon = ephemeris.planet(chart.MOON, self._native.julian_date)
136-
asc = ephemeris.angle(
166+
self._triad[chart.SUN] = ephemeris.planet(chart.SUN, self._native.julian_date)
167+
self._triad[chart.MOON] = ephemeris.planet(chart.MOON, self._native.julian_date)
168+
self._triad[chart.ASC] = ephemeris.angle(
137169
index=chart.ASC,
138170
jd=self._native.julian_date,
139171
lat=self._native.latitude,
140172
lon=self._native.longitude,
141173
house_system=settings.house_system,
142174
)
143175

144-
self._diurnal = calculate.is_daytime(sun, asc)
145-
self._moon_phase = calculate.moon_phase(sun, moon)
176+
self._diurnal = calculate.is_daytime(self._triad[chart.SUN], self._triad[chart.ASC])
177+
self._moon_phase = calculate.moon_phase(self._triad[chart.SUN], self._triad[chart.MOON])
146178
self._objects = ephemeris.objects(
147179
object_list=settings.objects,
148180
jd=self._native.julian_date,
@@ -177,18 +209,18 @@ def generate(self) -> None:
177209
house_system=settings.house_system,
178210
)
179211

180-
sun = ephemeris.planet(chart.SUN, self._solar_return_jd)
181-
moon = ephemeris.planet(chart.MOON, self._solar_return_jd)
182-
asc = ephemeris.angle(
212+
self._triad[chart.SUN] = ephemeris.planet(chart.SUN, self._solar_return_jd)
213+
self._triad[chart.MOON] = ephemeris.planet(chart.MOON, self._solar_return_jd)
214+
self._triad[chart.ASC] = ephemeris.angle(
183215
index=chart.ASC,
184216
jd=self._solar_return_jd,
185217
lat=self._native.latitude,
186218
lon=self._native.longitude,
187219
house_system=settings.house_system,
188220
)
189221

190-
self._diurnal = calculate.is_daytime(sun, asc)
191-
self._moon_phase = calculate.moon_phase(sun, moon)
222+
self._diurnal = calculate.is_daytime(self._triad[chart.SUN], self._triad[chart.ASC])
223+
self._moon_phase = calculate.moon_phase(self._triad[chart.SUN], self._triad[chart.MOON])
192224
self._objects = ephemeris.objects(
193225
object_list=settings.objects,
194226
jd=self._solar_return_jd,
@@ -250,18 +282,18 @@ def generate(self) -> None:
250282
)
251283
self._obliquity = ephemeris.obliquity(self._progressed_jd)
252284

253-
sun = ephemeris.planet(chart.SUN, self._progressed_jd)
254-
moon = ephemeris.planet(chart.MOON, self._progressed_jd)
255-
asc = ephemeris.armc_angle(
285+
self._triad[chart.SUN] = ephemeris.planet(chart.SUN, self._progressed_jd)
286+
self._triad[chart.MOON] = ephemeris.planet(chart.MOON, self._progressed_jd)
287+
self._triad[chart.ASC] = ephemeris.armc_angle(
256288
index=chart.ASC,
257289
armc=self._progressed_armc_longitude,
258290
lat=self._native.latitude,
259291
obliquity=self._obliquity,
260292
house_system=settings.house_system,
261293
)
262294

263-
self._diurnal = calculate.is_daytime(sun, asc)
264-
self._moon_phase = calculate.moon_phase(sun, moon)
295+
self._diurnal = calculate.is_daytime(self._triad[chart.SUN], self._triad[chart.ASC])
296+
self._moon_phase = calculate.moon_phase(self._triad[chart.SUN], self._triad[chart.MOON])
265297
self._objects = ephemeris.armc_objects(
266298
object_list=settings.objects,
267299
jd=self._progressed_jd,
@@ -373,7 +405,7 @@ def generate(self) -> None:
373405
)
374406

375407
if chart.ASC in self._objects:
376-
asc = self._objects[chart.ASC]
408+
self._triad[chart.ASC] = self._objects[chart.ASC]
377409
else:
378410
native_asc = ephemeris.angle(
379411
index=chart.ASC,
@@ -389,24 +421,24 @@ def generate(self) -> None:
389421
lon=self._partner.longitude,
390422
house_system=settings.house_system,
391423
)
392-
asc = midpoint.composite(native_asc, partner_asc, self._obliquity)
424+
self._triad[chart.ASC] = midpoint.composite(native_asc, partner_asc, self._obliquity)
393425

394426
if chart.SUN in self._objects:
395-
sun = self._objects[chart.SUN]
427+
self._triad[chart.SUN] = self._objects[chart.SUN]
396428
else:
397429
native_sun = ephemeris.planet(chart.SUN, self._native.julian_date)
398430
partner_sun = ephemeris.planet(chart.SUN, self._partner.julian_date)
399-
sun = midpoint.composite(native_sun, partner_sun, self._obliquity)
431+
self._triad[chart.SUN] = midpoint.composite(native_sun, partner_sun, self._obliquity)
400432

401433
if chart.MOON in self._objects:
402-
moon = self._objects[chart.MOON]
434+
self._triad[chart.MOON] = self._objects[chart.MOON]
403435
else:
404436
native_moon = ephemeris.planet(chart.MOON, self._native.julian_date)
405437
partner_moon = ephemeris.planet(chart.MOON, self._partner.julian_date)
406-
moon = midpoint.composite(native_moon, partner_moon, self._obliquity)
438+
self._triad[chart.MOON] = midpoint.composite(native_moon, partner_moon, self._obliquity)
407439

408-
self._diurnal = calculate.is_daytime(sun, asc)
409-
self._moon_phase = calculate.moon_phase(sun, moon)
440+
self._diurnal = calculate.is_daytime(self._triad[chart.SUN], self._triad[chart.ASC])
441+
self._moon_phase = calculate.moon_phase(self._triad[chart.SUN], self._triad[chart.MOON])
410442

411443
def set_wrapped_partner(self):
412444
self.partner = wrap.Subject(self._partner)
@@ -425,18 +457,18 @@ def __init__(self, latitude: float | list | tuple | str = settings.default_latit
425457
def generate(self) -> None:
426458
self._obliquity = ephemeris.obliquity(self._native.julian_date)
427459

428-
sun = ephemeris.planet(chart.SUN, self._native.julian_date)
429-
moon = ephemeris.planet(chart.MOON, self._native.julian_date)
430-
asc = ephemeris.angle(
460+
self._triad[chart.SUN] = ephemeris.planet(chart.SUN, self._native.julian_date)
461+
self._triad[chart.MOON] = ephemeris.planet(chart.MOON, self._native.julian_date)
462+
self._triad[chart.ASC] = ephemeris.angle(
431463
index=chart.ASC,
432464
jd=self._native.julian_date,
433465
lat=self._native.latitude,
434466
lon=self._native.longitude,
435467
house_system=settings.house_system,
436468
)
437469

438-
self._diurnal = calculate.is_daytime(sun, asc)
439-
self._moon_phase = calculate.moon_phase(sun, moon)
470+
self._diurnal = calculate.is_daytime(self._triad[chart.SUN], self._triad[chart.ASC])
471+
self._moon_phase = calculate.moon_phase(self._triad[chart.SUN], self._triad[chart.MOON])
440472
self._objects = ephemeris.objects(
441473
object_list=settings.objects,
442474
jd=self._native.julian_date,

immanuel/classes/wrap.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from datetime import datetime
1313

1414
from immanuel.const import calc, chart, dignities, names
15-
from immanuel.reports import dignity, weighting
15+
from immanuel.reports import dignity
1616
from immanuel.setup import settings
1717
from immanuel.tools import calculate, convert, date, ephemeris, position
1818
from immanuel.classes.localize import gender, _
@@ -39,9 +39,9 @@ def __str__(self) -> str:
3939

4040

4141
class Aspect:
42-
def __init__(self, aspect: dict, objects: dict) -> None:
43-
self._active_name = objects[aspect['active']]['name']
44-
self._passive_name = objects[aspect['passive']]['name']
42+
def __init__(self, aspect: dict, active_name: str, passive_name: str) -> None:
43+
self._active_name = active_name
44+
self._passive_name = passive_name
4545
self.active = aspect['active']
4646
self.passive = aspect['passive']
4747
self.type = _(names.ASPECTS[aspect['aspect']])
@@ -183,7 +183,16 @@ def __str__(self) -> str:
183183

184184

185185
class Object:
186-
def __init__(self, object: dict, objects: dict = None, houses: dict = None, is_daytime: bool = None, obliquity: float = None) -> None:
186+
# def __init__(self, object: dict, objects: dict = None, houses: dict = None, is_daytime: bool = None, obliquity: float = None) -> None:
187+
def __init__(
188+
self,
189+
object: dict,
190+
date_time: datetime = None,
191+
house: int = None,
192+
out_of_bounds: bool = None,
193+
in_sect: bool = None,
194+
dignity_state: dict = None,
195+
) -> None:
187196
self.index = object['index']
188197

189198
if object['type'] == chart.HOUSE:
@@ -195,8 +204,8 @@ def __init__(self, object: dict, objects: dict = None, houses: dict = None, is_d
195204
if 'eclipse_type' in object:
196205
self.eclipse_type = EclipseType(object['eclipse_type'])
197206

198-
if 'date_time' in object:
199-
self.date_time = DateTime(object['date_time'])
207+
if date_time is not None:
208+
self.date_time = DateTime(date_time)
200209

201210
if 'lat' in object:
202211
self.latitude = Angle(object['lat'], round_to=settings.angle_precision)
@@ -206,8 +215,8 @@ def __init__(self, object: dict, objects: dict = None, houses: dict = None, is_d
206215
self.sign = Sign(position.sign(object))
207216
self.decan = Decan(position.decan(object))
208217

209-
if houses is not None:
210-
self.house = House(position.house(object, houses))
218+
if house is not None:
219+
self.house = House(house)
211220

212221
if 'dist' in object:
213222
self.distance = object['dist']
@@ -220,17 +229,20 @@ def __init__(self, object: dict, objects: dict = None, houses: dict = None, is_d
220229
if 'dec' in object:
221230
self.declination = Angle(object['dec'], round_to=settings.angle_precision)
222231

223-
if object['type'] not in (chart.HOUSE, chart.ANGLE, chart.FIXED_STAR):
224-
self.out_of_bounds = calculate.is_out_of_bounds(object=object, obliquity=obliquity)
232+
if object['type'] not in (chart.HOUSE, chart.ANGLE, chart.FIXED_STAR):
233+
self.out_of_bounds = out_of_bounds
225234

226235
if 'size' in object:
227236
self.size = object['size']
228237

229-
if objects is not None and object['type'] == chart.PLANET and is_daytime is not None and calc.PLANETS.issubset(objects):
230-
dignity_state = dignity.all(object=object, objects=objects, is_daytime=is_daytime)
238+
if in_sect is not None:
239+
self.in_sect = in_sect
240+
241+
if dignity_state is not None:
231242
self.dignities = DignityState(object=object, dignity_state=dignity_state)
232243
self.score = dignity.score(dignity_state)
233244

245+
234246
def __str__(self) -> str:
235247
formatted = _('{name} {longitude} in {sign}').format(
236248
name=self.name,
@@ -310,10 +322,10 @@ def __str__(self) -> str:
310322

311323

312324
class Weightings:
313-
def __init__(self, objects: dict, houses: dict) -> None:
314-
self.elements = Elements(weighting.elements(objects))
315-
self.modalities = Modalities(weighting.modalities(objects))
316-
self.quadrants = Quadrants(weighting.quadrants(objects, houses))
325+
def __init__(self, elements: dict, modalities: dict, quadrants: dict) -> None:
326+
self.elements = Elements(elements)
327+
self.modalities = Modalities(modalities)
328+
self.quadrants = Quadrants(quadrants)
317329

318330
def __str__(self) -> str:
319331
return f'{self.elements}\n{self.modalities}\n{self.quadrants}'

immanuel/tools/calculate.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,21 @@ def relative_position(object1: dict | float, object2: dict | float) -> int:
113113
return calc.OCCIDENTAL if swe.difdegn(lon1, lon2) > 180 else calc.ORIENTAL
114114

115115

116+
def is_in_sect(object: dict, is_daytime: bool, sun: dict | float = None) -> bool:
117+
""" Returns whether the passed planet is in sect. """
118+
if object['index'] in (chart.SUN, chart.JUPITER, chart.SATURN):
119+
return is_daytime
120+
121+
if object['index'] in (chart.MOON, chart.VENUS, chart.MARS):
122+
return not is_daytime
123+
124+
if object['index'] == chart.MERCURY:
125+
sun_mercury_position = relative_position(sun, object)
126+
return sun_mercury_position == calc.ORIENTAL if is_daytime else sun_mercury_position == calc.OCCIDENTAL
127+
128+
return False
129+
130+
116131
def is_out_of_bounds(object: dict | float, jd: float = None, obliquity: float = None) -> bool:
117132
""" Returns whether the passed object is out of bounds either on the passed
118133
Julian date or relative to the passed obliquity. """

0 commit comments

Comments
 (0)