From 2d93bca14039b22a861571de6360c46fbfe2f11f Mon Sep 17 00:00:00 2001 From: "Gergely POLONKAI (W00d5t0ck)" Date: Wed, 18 Sep 2013 00:29:13 +0200 Subject: [PATCH 01/18] Started generating chart SVG --- src/ag-chart.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ag-chart.h | 1 + src/ag-window.c | 1 + 3 files changed, 103 insertions(+) diff --git a/src/ag-chart.c b/src/ag-chart.c index b9a9c94..0b5c299 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "ag-chart.h" @@ -652,3 +653,103 @@ ag_chart_save_to_file(AgChart *chart, GFile *file, GError **err) xmlFreeDoc(save_doc); } +void +ag_chart_create_svg(AgChart *chart) +{ + xmlDocPtr doc = create_save_doc(chart); + xmlNodePtr root_node = NULL, + ascmcs_node = NULL, + houses_node = NULL, + bodies_node = NULL, + node = NULL; + gchar *value; + GList *houses, + *house, + *planets, + *planet; + GError *err = NULL; + const GswePlanetData *planet_data; + + root_node = xmlDocGetRootElement(doc); + + // gswe_moment_get_house_cusps() also calculates ascmcs data, so call it this early + houses = gswe_moment_get_house_cusps(GSWE_MOMENT(chart), NULL); + + // Begin node + ascmcs_node = xmlNewChild(root_node, NULL, BAD_CAST "ascmcs", NULL); + + node = xmlNewChild(ascmcs_node, NULL, BAD_CAST "ascendant", NULL); + + planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_ASCENDENT, NULL); + value = g_malloc0(12); + g_ascii_dtostr(value, 12, planet_data->position); + xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); + g_free(value); + + node = xmlNewChild(ascmcs_node, NULL, BAD_CAST "mc", NULL); + + planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_MC, NULL); + value = g_malloc0(12); + g_ascii_dtostr(value, 12, planet_data->position); + xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); + g_free(value); + + node = xmlNewChild(ascmcs_node, NULL, BAD_CAST "vertex", NULL); + + planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_VERTEX, NULL); + value = g_malloc0(12); + g_ascii_dtostr(value, 12, planet_data->position); + xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); + g_free(value); + + // Begin node + houses_node = xmlNewChild(root_node, NULL, BAD_CAST "houses", NULL); + + for (house = houses; house; house = g_list_next(house)) { + GsweHouseData *house_data = house->data; + + node = xmlNewChild(houses_node, NULL, BAD_CAST "house", NULL); + + value = g_malloc0(3); + g_ascii_dtostr(value, 3, house_data->house); + xmlNewProp(node, BAD_CAST "number", BAD_CAST value); + g_free(value); + + value = g_malloc0(12); + g_ascii_dtostr(value, 12, house_data->cusp_position); + xmlNewProp(node, BAD_CAST "degree", BAD_CAST value); + g_free(value); + } + + // Begin node + bodies_node = xmlNewChild(root_node, NULL, BAD_CAST "bodies", NULL); + + planets = gswe_moment_get_all_planets(GSWE_MOMENT(chart)); + + for (planet = planets; planet; planet = g_list_next(planet)) { + planet_data = planet->data; + // TODO: HACK HACK HACK! SWE-GLib has a HUGE mistake here! + planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), planet_data->planet_id, &err); + + if ( + (planet_data->planet_id == GSWE_PLANET_ASCENDENT) + || (planet_data->planet_id == GSWE_PLANET_MC) + || (planet_data->planet_id == GSWE_PLANET_VERTEX) + ) { + continue; + } + + node = xmlNewChild(bodies_node, NULL, BAD_CAST "body", NULL); + + xmlNewProp(node, BAD_CAST "name", BAD_CAST planet_data->planet_info->name); + + value = g_malloc0(12); + g_ascii_dtostr(value, 12, planet_data->position); + xmlNewProp(node, BAD_CAST "degree", BAD_CAST value); + g_free(value); + } + + xmlSaveFormatFileEnc("-", doc, "UTF-8", 1); + xmlFreeDoc(doc); +} + diff --git a/src/ag-chart.h b/src/ag-chart.h index c8377a7..e7b56e4 100644 --- a/src/ag-chart.h +++ b/src/ag-chart.h @@ -42,6 +42,7 @@ void ag_chart_set_country(AgChart *chart, const gchar *country); gchar *ag_chart_get_country(AgChart *chart); void ag_chart_set_city(AgChart *chart, const gchar *city); gchar *ag_chart_get_city(AgChart *chart); +void ag_chart_create_svg(AgChart *chart); #define AG_CHART_ERROR (ag_chart_error_quark()) GQuark ag_chart_error_quark(void); diff --git a/src/ag-window.c b/src/ag-window.c index e78e0aa..2980d28 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -109,6 +109,7 @@ save_as_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) void ag_window_redraw_chart(AgWindow *window) { + ag_chart_create_svg(window->priv->chart); } void From e4033f0702db8b15b36188623c2b3f8a8431ec61 Mon Sep 17 00:00:00 2001 From: "Gergely POLONKAI (W00d5t0ck)" Date: Wed, 18 Sep 2013 22:30:40 +0200 Subject: [PATCH 02/18] Sanitized AgWindow - Removed timestamp member It can be retrieved from the Window's chart, and is rarely used --- src/ag-window.c | 61 ++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/ag-window.c b/src/ag-window.c index 2980d28..f6b7de7 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -36,7 +36,6 @@ struct _AgWindowPrivate { GtkWidget *tab_edit; GtkWidget *current_tab; - GsweTimestamp *timestamp; AgChart *chart; gchar *uri; }; @@ -145,42 +144,50 @@ chart_changed(AgChart *chart, AgWindow *window) static void recalculate_chart(AgWindow *window) { - AgWindowPrivate *priv = window->priv; - gint year = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->year)), - month = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->month)), - day = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->day)), - hour = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->hour)), - minute = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->minute)), - second = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(priv->second)); - gdouble longitude = gtk_spin_button_get_value(GTK_SPIN_BUTTON(priv->longitude)), - latitude = gtk_spin_button_get_value(GTK_SPIN_BUTTON(priv->latitude)); - gdouble south = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->south_lat)), - west = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->west_long)); + gint year, + month, + day, + hour, + minute, + second; + gdouble longitude, + latitude; + gboolean south, + west; + GsweTimestamp *timestamp; - if (south) { + g_debug("Recalculating chart data"); + + year = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->year)); + month = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->month)); + day = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->day)); + hour = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->hour)); + minute = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->minute)); + second = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(window->priv->second)); + longitude = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->priv->longitude)); + latitude = gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->priv->latitude)); + + if ((south = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->priv->south_lat)))) { latitude = 0 - latitude; } - if (west) { + if ((west = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->priv->west_long)))) { longitude = 0 - longitude; } // TODO: Set timezone according to the city selected! - if (priv->timestamp == NULL) { - priv->timestamp = gswe_timestamp_new_from_gregorian_full(year, month, day, hour, minute, second, 0, 1.0); + if (window->priv->chart == NULL) { + timestamp = gswe_timestamp_new_from_gregorian_full(year, month, day, hour, minute, second, 0, 1.0); + // TODO: make house system configurable + window->priv->chart = ag_chart_new_full(timestamp, longitude, latitude, 380.0, GSWE_HOUSE_SYSTEM_PLACIDUS); + g_signal_connect(window->priv->chart, "changed", G_CALLBACK(chart_changed), window); } else { - gswe_timestamp_set_gregorian_full(priv->timestamp, year, month, day, hour, minute, second, 0, 1.0, NULL); + timestamp = gswe_moment_get_timestamp(GSWE_MOMENT(window->priv->chart)); + gswe_timestamp_set_gregorian_full(timestamp, year, month, day, hour, minute, second, 0, 1.0, NULL); } - if (priv->chart == NULL) { - // TODO: make house system configurable - priv->chart = ag_chart_new_full(priv->timestamp, longitude, latitude, 380.0, GSWE_HOUSE_SYSTEM_PLACIDUS); - ag_chart_set_name(priv->chart, gtk_entry_get_text(GTK_ENTRY(priv->name))); - g_signal_connect(priv->chart, "changed", G_CALLBACK(chart_changed), window); - ag_window_update_from_chart(window); - } else { - gswe_moment_set_timestamp(GSWE_MOMENT(priv->chart), priv->timestamp); - } + ag_chart_set_name(window->priv->chart, gtk_entry_get_text(GTK_ENTRY(window->priv->name))); + ag_window_redraw_chart(window); } static void @@ -196,7 +203,6 @@ tab_changed_cb(GdStack *stack, GParamSpec *pspec, AgWindow *window) // Note that priv->current_tab is actually the previously selected tab, not the real active one! if (window->priv->current_tab == window->priv->tab_edit) { - g_debug("Recalculating chart data"); recalculate_chart(window); } @@ -219,7 +225,6 @@ ag_window_init(AgWindow *window) window->priv = priv = GET_PRIVATE(window); - priv->timestamp = NULL; priv->chart = NULL; priv->uri = NULL; From cda22746ffd4c93ee0e22a7b81cdd9465a92abd5 Mon Sep 17 00:00:00 2001 From: "Gergely POLONKAI (W00d5t0ck)" Date: Wed, 18 Sep 2013 22:31:14 +0200 Subject: [PATCH 03/18] Finished base XML generation code --- src/ag-chart.c | 78 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index 0b5c299..60fd3f8 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -661,14 +661,20 @@ ag_chart_create_svg(AgChart *chart) ascmcs_node = NULL, houses_node = NULL, bodies_node = NULL, + aspects_node = NULL, + antiscia_node = NULL, node = NULL; gchar *value; GList *houses, *house, - *planets, - *planet; - GError *err = NULL; + *planet, + *aspect, + *antiscion; const GswePlanetData *planet_data; + const GsweAspectData *aspect_data; + GEnumClass *planets_class, + *aspects_class, + *antiscia_class; root_node = xmlDocGetRootElement(doc); @@ -724,12 +730,11 @@ ag_chart_create_svg(AgChart *chart) // Begin node bodies_node = xmlNewChild(root_node, NULL, BAD_CAST "bodies", NULL); - planets = gswe_moment_get_all_planets(GSWE_MOMENT(chart)); + planets_class = g_type_class_ref(GSWE_TYPE_PLANET); - for (planet = planets; planet; planet = g_list_next(planet)) { + for (planet = gswe_moment_get_all_planets(GSWE_MOMENT(chart)); planet; planet = g_list_next(planet)) { planet_data = planet->data; - // TODO: HACK HACK HACK! SWE-GLib has a HUGE mistake here! - planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), planet_data->planet_id, &err); + GEnumValue *enum_value; if ( (planet_data->planet_id == GSWE_PLANET_ASCENDENT) @@ -741,7 +746,8 @@ ag_chart_create_svg(AgChart *chart) node = xmlNewChild(bodies_node, NULL, BAD_CAST "body", NULL); - xmlNewProp(node, BAD_CAST "name", BAD_CAST planet_data->planet_info->name); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), planet_data->planet_id); + xmlNewProp(node, BAD_CAST "name", BAD_CAST enum_value->value_name); value = g_malloc0(12); g_ascii_dtostr(value, 12, planet_data->position); @@ -749,6 +755,62 @@ ag_chart_create_svg(AgChart *chart) g_free(value); } + g_debug("Generating aspects table"); + + // Begin node + aspects_node = xmlNewChild(root_node, NULL, BAD_CAST "aspects", NULL); + + aspects_class = g_type_class_ref(GSWE_TYPE_ASPECT); + + for (aspect = gswe_moment_get_all_aspects(GSWE_MOMENT(chart)); aspect; aspect = g_list_next(aspect)) { + GEnumValue *enum_value; + aspect_data = aspect->data; + + if (aspect_data->aspect == GSWE_ASPECT_NONE) { + continue; + } + + node = xmlNewChild(aspects_node, NULL, BAD_CAST "aspect", NULL); + + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), aspect_data->planet1->planet_id); + xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); + + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), aspect_data->planet2->planet_id); + xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); + + enum_value = g_enum_get_value(G_ENUM_CLASS(aspects_class), aspect_data->aspect); + xmlNewProp(node, BAD_CAST "type", BAD_CAST enum_value->value_name); + } + + g_type_class_unref(aspects_class); + + g_debug("Generating antiscia table"); + + // Begin node + antiscia_node = xmlNewChild(root_node, NULL, BAD_CAST "antiscia", NULL); + antiscia_class = g_type_class_ref(GSWE_TYPE_ANTISCION_AXIS); + + for (antiscion = gswe_moment_get_all_antiscia(GSWE_MOMENT(chart)); antiscion; antiscion = g_list_next(antiscion)) { + GsweAntiscionData *antiscion_data = antiscion->data; + GEnumValue *enum_value; + + if (antiscion_data->axis == GSWE_ANTISCION_AXIS_NONE) { + continue; + } + + node = xmlNewChild(antiscia_node, NULL, BAD_CAST "antiscia", NULL); + + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), antiscion_data->planet1->planet_id); + xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); + + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), antiscion_data->planet2->planet_id); + xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); + + enum_value = g_enum_get_value(G_ENUM_CLASS(antiscia_class), antiscion_data->axis); + xmlNewProp(node, BAD_CAST "axis", BAD_CAST enum_value->value_name); + } + + g_type_class_unref(planets_class); xmlSaveFormatFileEnc("-", doc, "UTF-8", 1); xmlFreeDoc(doc); } From 86382faf6b4552c0d356d86b05237403303e93f8 Mon Sep 17 00:00:00 2001 From: "Gergely POLONKAI (W00d5t0ck)" Date: Thu, 19 Sep 2013 15:18:09 +0200 Subject: [PATCH 04/18] Fixed example chart data Longitude and latitude were exchanged --- data/examples/saved-chart.agc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/examples/saved-chart.agc b/data/examples/saved-chart.agc index 622da99..8b202c9 100644 --- a/data/examples/saved-chart.agc +++ b/data/examples/saved-chart.agc @@ -5,8 +5,8 @@ Hungary Budapest - 47.49801000 - 19.03990999 + 19.03990999 + 47.49801000 280