示例#1
0
NetlistEditor *
netlist_editor_new_from_schematic_view (SchematicView *sv)
{
	NetlistEditor *editor;
	gchar *name = "/tmp/oregano.netlist";
	GError *error = 0;
	Schematic *sm;
	OreganoEngine *engine;

	sm = schematic_view_get_schematic (sv);

	engine = oregano_engine_factory_create_engine (oregano.engine, sm);
	oregano_engine_generate_netlist (engine, name, &error);
	g_object_unref (engine);

	if (error != NULL) {
		if (g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_NO_CLAMP) ||
			g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_NO_GND)   ||
			g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_IO_ERROR)) {
				oregano_error_with_title (_("Could not create a netlist"), error->message);
				g_clear_error (&error);
		} 
		else {
			oregano_error (_("An unexpected error has occurred"));
		}
		return NULL;
	}

	editor = netlist_editor_new_from_file (name);
	if (editor) {
		editor->priv->sv = sv;
	}

	return editor;
}
示例#2
0
void simulation_show (GtkWidget *widget, SchematicView *sv)
{
	GtkWidget *w;
	GtkBuilder *gui;
	GError *e = NULL;
	Simulation *s;
	Schematic *sm;

	g_return_if_fail (sv != NULL);

	sm = schematic_view_get_schematic (sv);
	s = schematic_get_simulation (sm);

	if ((gui = gtk_builder_new ()) == NULL) {
		log_append (s->logstore, _ ("Simulation"),
		            _ ("Could not create simulation dialog - Builder creation failed."));
		return;
	}
	gtk_builder_set_translation_domain (gui, NULL);

	// Only allow one instance of the dialog box per schematic.
	if (s->dialog) {
		gdk_window_raise (gtk_widget_get_window (GTK_WIDGET (s->dialog)));
		return;
	}

	if (gtk_builder_add_from_file (gui, OREGANO_UIDIR "/simulation.ui", &e) <= 0) {
		log_append_error (s->logstore, _ ("Simulation"), _ ("Could not create simulation dialog"),
		                  e);
		g_clear_error (&e);
		return;
	}

	w = GTK_WIDGET (gtk_builder_get_object (gui, "toplevel"));
	if (!w) {
		log_append (s->logstore, _ ("Simulation"),
		            _ ("Could not create simulation dialog - .ui file lacks widget "
		               "called \"toplevel\"."));
		return;
	}

	s->dialog = GTK_DIALOG (w);
	g_signal_connect (G_OBJECT (w), "delete_event", G_CALLBACK (delete_event_cb), s);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "progressbar"));
	s->progress = GTK_PROGRESS_BAR (w);
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (s->progress), 0.0);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "progress_label"));
	s->progress_label = GTK_LABEL (w);

	g_signal_connect (G_OBJECT (s->dialog), "response", G_CALLBACK (cancel_cb), s);

	gtk_widget_show_all (GTK_WIDGET (s->dialog));

	s->sv = sv;
	simulate_cmd (s);
}
示例#3
0
void
simulation_show (GtkWidget *widget, SchematicView *sv)
{
	GtkWidget *w;
	GladeXML *gui;
	Simulation *s;
	Schematic *sm;

	g_return_if_fail (sv != NULL);

	sm = schematic_view_get_schematic (sv);
	s = schematic_get_simulation (sm);

	/* Only allow one instance of the dialog box per schematic.  */
	if (s->dialog){
		gdk_window_raise (GTK_WIDGET (s->dialog)->window);
		return;
	}

	if (!g_file_test (OREGANO_GLADEDIR "/simulation.glade2",
		G_FILE_TEST_EXISTS)) {
		oregano_error (_("Could not create simulation dialog"));
		return;
	}

	gui = glade_xml_new (OREGANO_GLADEDIR "/simulation.glade2", "toplevel", NULL);

	if (!gui) {
		oregano_error (_("Could not create simulation dialog"));
		return;
	}

	w = glade_xml_get_widget (gui, "toplevel");
	if (!w) {
		oregano_error (_("Could not create simulation dialog"));
		return;
	}

	s->dialog = GTK_DIALOG (w);
	g_signal_connect (G_OBJECT (w), "delete_event", G_CALLBACK (delete_event_cb), s);

	w = glade_xml_get_widget (gui, "progressbar");
	s->progress = GTK_PROGRESS_BAR (w);
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (s->progress), 0.0);

	w = glade_xml_get_widget (gui, "progress_label");
	s->progress_label = GTK_LABEL (w);

	g_signal_connect (G_OBJECT (s->dialog), "response", G_CALLBACK (cancel_cb), s);

	gtk_widget_show_all (GTK_WIDGET (s->dialog));

	s->sv = sv;
	simulate_cmd (s);
}
示例#4
0
void
netlist_editor_simulate (GtkWidget * widget, NetlistEditor * nle)
{
	Schematic *sm;
	gchar *name;
	GtkTextView *tview;
	GtkTextBuffer *buffer;
	GtkTextIter start, end;
	FILE *fp;
	GError *error = 0;
	OreganoEngine *engine;

	// FIXME: OreganoEngine now override the netlist when start!
	return;

	tview = nle->priv->view;
	buffer = gtk_text_view_get_buffer (tview);

	gtk_text_buffer_get_start_iter (buffer, &start);
	gtk_text_buffer_get_end_iter (buffer, &end);

	sm = schematic_view_get_schematic (nle->priv->sv);
	//name = nl_generate (sm, NULL, &error);

	if (error != NULL) {
		if (g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_NO_CLAMP) ||
				g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_NO_GND) ||
				g_error_matches (error, OREGANO_ERROR, OREGANO_SIMULATE_ERROR_IO_ERROR)) {
			oregano_error_with_title (_("Could not create a netlist"), error->message);
			g_clear_error (&error);
		} else {
			oregano_error (
				_("An unexpected error has occurred"));
		}
		return;
	}

	/* Save TextBuffer to 'name' */
	fp = fopen (name, "wt");
	if (!fp) {
		gchar *msg;
		msg = g_strdup_printf (_("The file %s could not be saved"), name);
		oregano_error_with_title (_("Could not save temporary netlist file"), msg);
		g_free (msg);
		return;
	}
	
	fputs (gtk_text_buffer_get_text (buffer, &start, &end, FALSE), fp);
	fclose (fp);

	schematic_set_netlist_filename (sm, name);
	simulation_show (NULL, nle->priv->sv);
	g_free (name);
}
示例#5
0
static void
mouse_over_wire_cb (WireItem *item, SchematicView *sv)
{
	GList *wires;
	Wire *wire;
	NodeStore *store;
	Sheet *sheet;

	sheet = schematic_view_get_sheet (sv);

	if (sheet->state != SHEET_STATE_NONE)
		return;

	store = schematic_get_store (schematic_view_get_schematic (sv));

	node_store_node_foreach (store, (GHFunc *) node_foreach_reset, NULL);
	for (wires = store->wires; wires; wires = wires->next) {
		wire = wires->data;
		wire_set_visited (wire, FALSE);
	}

	wire = WIRE (sheet_item_get_data (SHEET_ITEM (item)));
	wire_traverse (wire);
}
示例#6
0
void
settings_show (GtkWidget *widget, SchematicView *sv)
{
	gint i;
	GtkWidget *engine_group = NULL;
	GtkWidget *w, *pbox, *toplevel;
	GtkBuilder *gui;
	GError *perror = NULL;
	gchar *msg;
	Settings *s;
	Schematic *sm;

	g_return_if_fail (sv != NULL);
	
	// If no engine available, stop oregano
	if ((g_find_program_in_path (engine[0]) == NULL) &&
	    (g_find_program_in_path (engine[1]) == NULL)) {
		gchar *msg;
		msg = g_strdup_printf (
		_("No engine allowing analysis is available.\n"
		  "You might install one, at least! \n"
		  "Either ngspice or gnucap."));
		oregano_error_with_title (_("Could not create settings dialog"), msg);
		g_free (msg);
		return;
	}
	
	g_return_if_fail (sv != NULL);

	if ((gui = gtk_builder_new ()) == NULL) {
		oregano_error (_("Could not create settings dialog"));
		return;
	} 
	gtk_builder_set_translation_domain (gui, NULL);

	sm = schematic_view_get_schematic (sv);
	s = schematic_get_settings (sm);

	// Only allow one instance of the property box per schematic.
	if (GTK_WIDGET (SETTINGS (s)->pbox)) {
		gdk_window_raise (gtk_widget_get_window (
		                   GTK_WIDGET (SETTINGS (s)->pbox)));
		return;
	}

	if (gtk_builder_add_from_file (gui, OREGANO_UIDIR "/settings.ui", &perror) <= 0) {
		msg = perror->message;
		oregano_error_with_title (_("Could not create settings dialog"), msg);
		g_error_free (perror);
		return;
	}

	w = toplevel = GTK_WIDGET (gtk_builder_get_object (gui, "toplevel"));
	if (!w) {
		oregano_error (_("Could not create settings dialog"));
		return;
	}
	g_signal_connect (G_OBJECT (w), "delete_event",
			  G_CALLBACK (delete_event_callback), s);

	pbox = toplevel;
	s->pbox = GTK_WIDGET (pbox);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "close_bt"));
	g_signal_connect (G_OBJECT (w), "clicked",
		G_CALLBACK (apply_callback), s);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "splash-enable"));
	s->w_show_splash = w;
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), oregano.show_splash);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "compress-enable"));
	s->w_compress_files = w;
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
								  oregano.compress_files);
	w = GTK_WIDGET (gtk_builder_get_object (gui, "log-enable"));
	s->w_show_log = w;
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), oregano.show_log);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "grid-size"));
	gtk_widget_set_sensitive (w, FALSE);
	w = GTK_WIDGET (gtk_builder_get_object (gui, "realtime-enable"));
	gtk_widget_set_sensitive (w, FALSE);

	w = GTK_WIDGET (gtk_builder_get_object (gui, "engine_table"));
	for (i = 0; i < OREGANO_ENGINE_COUNT; i++) {
		if (engine_group)
			button[i] = gtk_radio_button_new_with_label_from_widget (
			      GTK_RADIO_BUTTON (engine_group), engine[i]);
		else
			button[i] = engine_group = 
		          gtk_radio_button_new_with_label_from_widget (NULL, engine[i]);

		g_object_set_data (G_OBJECT (button[i]), "id", GUINT_TO_POINTER (i));

		gtk_grid_attach (GTK_GRID (w), button[i], 0, i, 1, 1);
		g_signal_connect (G_OBJECT (button[i]), "clicked", 
						  G_CALLBACK (set_engine_name), s);

	}
	
	// Is the engine available?
	// In that case the button is active
	if (g_find_program_in_path (engine[oregano.engine]) != NULL)
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button[oregano.engine]), 
		                              TRUE);
	// Otherwise the button is inactive
	else
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button[oregano.engine]), 
		                              FALSE);

	// If no engine available, stop oregano
	if ((g_find_program_in_path (engine[0]) == NULL) &&
	    (g_find_program_in_path (engine[1]) == NULL)) {
			gchar *msg;
			msg = g_strdup_printf (
			_("No engine allowing analysis is available.\n"
			  "You might install one, at least! \n"
			  "Either ngspice or gnucap."));
			oregano_error_with_title (_("Could not create settings dialog"), msg);
			g_free (msg);
	}

	gtk_widget_show_all (toplevel);
}
示例#7
0
/**
 * FIXME this code is an ugly piece of shit, fix it!
 */
void sim_settings_show (GtkWidget *widget, SchematicView *sv)
{
	int i;
	gboolean found;
	gint rc, active, index;
	GtkWidget *toplevel, *w, *w1, *pbox, *combo_box;
	GtkTreeView *opt_list;
	GtkCellRenderer *cell_option, *cell_value;
	GtkTreeViewColumn *column_option, *column_value;
	GtkListStore *opt_model;
	GtkTreeIter treeiter;
	GtkBuilder *builder;
	GError *e = NULL;
	SimSettings *s;
	GList *iter;
	GList *voltmeters = NULL;
	GList *voltmeters_with_type = NULL;
	GList *sources = NULL;
	GList *sources_ac = NULL;
	GtkComboBox *node_box;
	GtkListStore *node_list_store;
	gchar *text, *text2;
	gchar **node_ids;
	GSList *slist = NULL;

	g_return_if_fail (sv != NULL);

	Schematic *sm = schematic_view_get_schematic (sv);
	SimSettingsGui *s_gui = schematic_get_sim_settings_gui (sm);
	s = s_gui->sim_settings;

	// Only allow one instance of the property box per schematic.
	if (s_gui->pbox != NULL) {
		if (gtk_widget_get_visible (s_gui->pbox) == FALSE) {
			gtk_widget_set_visible (s_gui->pbox, TRUE);
		}
		GdkWindow *window = gtk_widget_get_window (s_gui->pbox);
		g_assert (window != NULL);
		gdk_window_raise (window);
		return;
	}

	if ((builder = gtk_builder_new ()) == NULL) {
		log_append (schematic_get_log_store (sm), _ ("SimulationSettings"),
		            _ ("Could not create simulation settings dialog"));
		return;
	}
	gtk_builder_set_translation_domain (builder, NULL);

	gtk_builder_add_from_file (builder, OREGANO_UIDIR "/sim-settings.ui", &e);
	if (e) {
		log_append_error (schematic_get_log_store (sm), _ ("SimulationSettings"),
		                  _ ("Could not create simulation settings dialog due to "
		                     "missing " OREGANO_UIDIR "/sim-settings.ui file"),
		                  e);
		g_clear_error (&e);
		return;
	}

	toplevel = GTK_WIDGET (gtk_builder_get_object (builder, "toplevel"));
	if (toplevel == NULL) {
		log_append (schematic_get_log_store (sm), _ ("SimulationSettings"),
		            _ ("Could not create simulation settings dialog due to missing "
		               "\"toplevel\" widget in " OREGANO_UIDIR "/sim-settings.ui file"));
		return;
	}

	pbox = toplevel;
	s_gui->pbox = pbox;
	s_gui->notebook = GTK_NOTEBOOK (gtk_builder_get_object (builder, "notebook"));
	g_signal_connect (G_OBJECT (pbox), "delete_event", G_CALLBACK (delete_event_cb), s_gui);

	//  Prepare options list
	s_gui->w_opt_value = GTK_ENTRY (gtk_builder_get_object (builder, "opt_value"));
	opt_list = GTK_TREE_VIEW (gtk_builder_get_object (builder, "option_list"));
	s_gui->w_opt_list = opt_list;

	//  Grab the frames
	s_gui->w_trans_frame = GTK_WIDGET (gtk_builder_get_object (builder, "trans_frame"));
	s_gui->w_ac_frame = GTK_WIDGET (gtk_builder_get_object (builder, "ac_frame"));
	s_gui->w_dcsweep_frame = GTK_WIDGET (gtk_builder_get_object (builder, "dcsweep_frame"));
	s_gui->w_fourier_frame = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_frame"));
	s_gui->w_noise_frame = GTK_WIDGET (gtk_builder_get_object (builder, "noise_frame"));

	// Create the Columns
	cell_option = gtk_cell_renderer_text_new ();
	cell_value = gtk_cell_renderer_text_new ();
	column_option =
	    gtk_tree_view_column_new_with_attributes (N_ ("Option"), cell_option, "text", 0, NULL);
	column_value =
	    gtk_tree_view_column_new_with_attributes (N_ ("Value"), cell_value, "text", 1, NULL);

	// Create the model
	opt_model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
	gtk_tree_view_set_model (opt_list, GTK_TREE_MODEL (opt_model));
	gtk_tree_view_append_column (opt_list, column_option);
	gtk_tree_view_append_column (opt_list, column_value);

	if (s->options == NULL) {
		// Load defaults
		for (i = 0; default_options[i].name; i++) {
			gtk_list_store_append (opt_model, &treeiter);
			gtk_list_store_set (opt_model, &treeiter, 0, default_options[i].name, -1);
		}
	} else {
		// Load schematic options

		for (iter = s->options; iter; iter = iter->next) {
			SimOption *so = iter->data;
			if (so) {
				gtk_list_store_append (opt_model, &treeiter);
				gtk_list_store_set (opt_model, &treeiter, 0, so->name, -1);
			}
		}
	}

	// Set the options already stored
	for (iter = s->options; iter; iter = iter->next) {
		SimOption *so = iter->data;
		if (so)
			set_options_in_list (so->name, so->value, opt_list);
	}

	g_signal_connect (G_OBJECT (opt_list), "button_release_event", G_CALLBACK (select_opt_callback),
	                  s);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "opt_accept"));
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (option_setvalue), s_gui);
	w = GTK_WIDGET (gtk_builder_get_object (builder, "opt_remove"));
	w = GTK_WIDGET (gtk_builder_get_object (builder, "add_option"));
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (option_remove), s_gui);
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (add_option), s_gui);

	// Creation of Close Button
	w = GTK_WIDGET (gtk_builder_get_object (builder, "button1"));
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (response_callback), sv);

	// Get the list of voltmeters (normal mode)
	rc = get_voltmeters_list(&voltmeters, sm, e, FALSE);
	if (rc) {
		sim_settings_set_dc(s, FALSE);
		sim_settings_set_fourier(s, FALSE);
	}

	// Get the list of voltmeters (AC mode, i.e. with measurement type)
	rc = get_voltmeters_list(&voltmeters_with_type, sm, e, TRUE);
	if (rc) {
		sim_settings_set_ac(s, FALSE);
	}

	// Get the list of sources (all types)
	rc = get_voltage_sources_list(&sources, sm, e, FALSE);
	if (rc) {
		sim_settings_set_dc(s, FALSE);
	}

	// Get the list of AC sources
	rc = get_voltage_sources_list(&sources_ac, sm, e, TRUE);
	if (rc) {
		sim_settings_set_noise(s, FALSE);
	}

	// Transient //
	// ********* //
	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_start"));
	s_gui->w_trans_start = w;
	if (s->trans_start)
		gtk_entry_set_text (GTK_ENTRY (w), s->trans_start);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_stop"));
	s_gui->w_trans_stop = w;
	if (s->trans_stop)
		gtk_entry_set_text (GTK_ENTRY (w), s->trans_stop);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_step"));
	s_gui->w_trans_step = w;
	if (s->trans_step)
		gtk_entry_set_text (GTK_ENTRY (w), s->trans_step);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_enable"));
	s_gui->w_trans_enable = w;
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (trans_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_enable);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_step_enable"));
	s_gui->w_trans_step_enable = w;
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (trans_step_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_step_enable);

	// get the gui element
	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_init_cond"));
	// save the gui element to struct
	s_gui->w_trans_init_cond = w;
	// Set checkbox enabled, if trans_init_cond equal true.
	// trans_init_cond could be set to true because
	// - user opened the settings dialog some seconds ago and has set the checkbox
	// - user opened old file in which there was set the checkbox state to true
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_init_cond);

	// get the gui element
	w = GTK_WIDGET (gtk_builder_get_object (builder, "trans_analyze_all"));
	// save the gui element to struct
	s_gui->w_trans_analyze_all = w;
	// Set checkbox enabled, if trans_analyze_all equal true.
	// trans_init_cond could be set to true because
	// - user opened the settings dialog some seconds ago and has set the checkbox
	// - user opened old file in which there was set the checkbox state to true
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->trans_analyze_all);

	// AC  //
	// *** //
	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_enable"));
	s_gui->w_ac_enable = w;
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (ac_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->ac_enable);

	w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid14"));

	// FIXME: Should enable more than just one output as in the Fourier analysis
	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_vout"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1);
	s_gui->w_ac_vout = combo_box;
	if (voltmeters_with_type) {
		index = 0;
		active = 0;
		for (iter = voltmeters_with_type; iter; iter = iter->next) {
			if (g_strcmp0 (iter->data, "VM(0)"))
				gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data);
			if (!g_strcmp0(s->ac_vout, iter->data))
				active = index;
			index++;
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s);

	// Initialisation of the various scale types
	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_type"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();
	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1);
	s_gui->w_ac_type = combo_box;

	{
		index = 0;
		active = 0;
		for (; scale_types_list[index] != NULL; index++) {
			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), scale_types_list[index]);
			if (!g_strcmp0(s->ac_type, scale_types_list[index]))
				active = index;
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_assert (GTK_IS_COMBO_BOX (combo_box));
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_npoints"));
	s_gui->w_ac_npoints = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->ac_npoints);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_start"));
	s_gui->w_ac_start = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->ac_start);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "ac_stop"));
	s_gui->w_ac_stop = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->ac_stop);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	//  DC   //
	// ***** //
	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_enable"));
	s_gui->w_dc_enable = w;
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (dc_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->dc_enable);

	w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid13"));
	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_vin"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1);
	s_gui->w_dc_vin = combo_box;
	if (sources) {
		index = 0;
		active = 0;
		for (iter = sources; iter; iter = iter->next) {
			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data);
			if (!g_strcmp0(s->dc_vin, iter->data))
				active = index;
			index++;
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s);

	// FIXME: Should enable more than just one output as in the Fourier analysis
	// FIXME: Should also allow to print currents through voltage sources
	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_vout"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1);
	s_gui->w_dc_vout = combo_box;
	if (voltmeters) {
		index = 0;
		active = 0;
		text = g_strdup_printf("V(%s)", s->dc_vout);
		for (iter = voltmeters; iter; iter = iter->next) {
			if (g_strcmp0 (iter->data, "V(0)"))
				gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data);
			if (!g_strcmp0(text, iter->data))
				active = index;
			index++;
		}
		g_free (text);
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_start"));
	s_gui->w_dc_start = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->dc_start);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_stop"));
	s_gui->w_dc_stop = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->dc_stop);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "dc_step"));
	s_gui->w_dc_step = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->dc_step);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	// Fourier //
	// ******* //
	g_print ("XXXXXXXXXXXXXXXX\n");
	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_enable"));
	s_gui->w_four_enable = w;
	g_print ("XXXXXXXXXXXXXXXX %p %s\n", w, s->fourier_enable ? "TRUE" : "FALSE");
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (fourier_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->fourier_enable);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_freq"));
	s_gui->w_four_freq = w;
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);
	gtk_entry_set_text (GTK_ENTRY (w), s->fourier_frequency);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_vout"));
	s_gui->w_four_vout = w;
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	// Get rid of inexistent output vectors
	text2 = NULL;
	if (voltmeters) {
		text = sim_settings_get_fourier_vout (s);
		node_ids = g_strsplit (text, " ", 0);
		g_free (text);
		for (i = 0; node_ids[i] != NULL; i++) {
			text = g_strdup_printf ("V(%s)", node_ids[i]);
			found = FALSE;
			for (iter = voltmeters; iter; iter = iter->next) {
				if (!g_strcmp0 (text, iter->data))
					found = TRUE;
			}	
			g_free (text);
			if (found) {
				if (text2) {
					text = text2;
					text2 = g_strdup_printf ("%s %s", text2, node_ids[i]);
					g_free (text);
				} else {
					text2 = g_strdup_printf ("%s", node_ids[i]);
				}
			}
		}
		if (!text2)
			text2 = g_strdup ("");
		sim_settings_set_fourier_vout (s, text2);
		g_free (text2);
		g_strfreev (node_ids);
	}

	text = NULL;
	slist = g_slist_copy (s->fourier_vout);
	if (slist) {
		if (slist->data && atoi (slist->data) > 0)
			text = g_strdup_printf ("V(%d)", atoi (slist->data));
		slist = slist->next;
	}
	while (slist) {
		if (slist->data && atoi (slist->data) > 0) {
			if (text) {
				text2 = text;
				text = g_strdup_printf ("%s V(%d)", text, atoi (slist->data));
				g_free (text2);
			} else {
				text = g_strdup_printf ("V(%d)", atoi (slist->data));
			}
		}
		slist = slist->next;
	}

	if (text)
		gtk_entry_set_text (GTK_ENTRY (w), text);
	else
		gtk_entry_set_text (GTK_ENTRY (w), "");

	g_slist_free_full (slist, g_free);

	// Present in the combo box the nodes of the schematic
	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_select_out"));
	gtk_widget_destroy (w); // FIXME wtf???

	w = GTK_WIDGET (gtk_builder_get_object (builder, "grid12"));
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w), combo_box, 2, 2, 1, 1);

	s_gui->w_four_combobox = combo_box;
	node_box = GTK_COMBO_BOX (combo_box);
	node_list_store = GTK_LIST_STORE (gtk_combo_box_get_model (node_box));
	gtk_list_store_clear (node_list_store);

	if (voltmeters) {
		for (iter = voltmeters; iter; iter = iter->next) {
			if (g_strcmp0 (iter->data, "V(0)"))
				gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (node_box), iter->data);
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (node_box), 0);
        }
	g_signal_connect (G_OBJECT (node_box), "changed", G_CALLBACK (entry_changed_cb), s);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_add"));
	s_gui->w_four_add = w;
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (fourier_add_vout_cb), s_gui);
	w = GTK_WIDGET (gtk_builder_get_object (builder, "fourier_rem"));
	s_gui->w_four_rem = w;
	g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (fourier_remove_vout_cb), s_gui);

	// Noise  //
	// *** //
	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_enable"));
	s_gui->w_noise_enable = w;
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (noise_enable_cb), s_gui);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), s->noise_enable);

	w1 = GTK_WIDGET (gtk_builder_get_object (builder, "grid1"));

	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_vin"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 0, 1, 1);
	s_gui->w_noise_vin = combo_box;
	if (sources_ac) {
		index = 0;
		active = 0;
		for (iter = sources_ac; iter; iter = iter->next) {
			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data);
			if (!g_strcmp0(s->noise_vin, iter->data))
				active = index;
			index++;
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s);

	// FIXME: Should enable more than just one output as in the Fourier analysis
	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_vout"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();

	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 1, 1, 1);
	s_gui->w_noise_vout = combo_box;
	if (voltmeters) {
		index = 0;
		active = 0;
		text = g_strdup_printf ("V(%s)", s->noise_vout);
		for (iter = voltmeters; iter; iter = iter->next) {
			if (g_strcmp0 (iter->data, "V(0)"))
				gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), iter->data);
			if (!g_strcmp0(text, iter->data))
				active = index;
			index++;
		}
		g_free (text);
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s);

	// Initialisation of the various scale types
	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_type"));
	gtk_widget_destroy (w); // FIXME wtf??
	combo_box = gtk_combo_box_text_new ();
	gtk_grid_attach (GTK_GRID (w1), combo_box, 1, 2, 1, 1);
	s_gui->w_noise_type = combo_box;

	{
		index = 0;
		active = 0;
		for (; scale_types_list[index] != NULL; index++) {
			gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), scale_types_list[index]);
			if (!g_strcmp0(s->noise_type, scale_types_list[index]))
				active = index;
		}
		gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), active);
	}
	g_assert (GTK_IS_COMBO_BOX (combo_box));
	g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_npoints"));
	s_gui->w_noise_npoints = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->noise_npoints);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_start"));
	s_gui->w_noise_start = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->noise_start);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	w = GTK_WIDGET (gtk_builder_get_object (builder, "noise_stop"));
	s_gui->w_noise_stop = w;
	gtk_entry_set_text (GTK_ENTRY (w), s->noise_stop);
	g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (entry_changed_cb), s_gui);

	gtk_widget_show_all (toplevel);

	trans_enable_cb (s_gui->w_trans_enable, s_gui);
	trans_step_enable_cb (s_gui->w_trans_step_enable, s_gui);
	ac_enable_cb (s_gui->w_ac_enable, s_gui);
	dc_enable_cb (s_gui->w_dc_enable, s_gui);
	fourier_enable_cb (s_gui->w_four_enable, s_gui);
	noise_enable_cb (s_gui->w_noise_enable, s_gui);

	g_list_free(sources);
	g_list_free(voltmeters);
	g_list_free(voltmeters_with_type);
}
示例#8
0
static void response_callback (GtkButton *button, SchematicView *sv)
{
	g_return_if_fail (sv != NULL);
	g_return_if_fail (IS_SCHEMATIC_VIEW (sv));
	g_return_if_fail (button != NULL);
	g_return_if_fail (GTK_IS_BUTTON (button));
	gint page;
	gchar *tmp = NULL;
	gchar **node_ids = NULL;

	Schematic *sm = schematic_view_get_schematic (sv);

	SimSettingsGui *s_gui = schematic_get_sim_settings_gui(sm);
	SimSettings *s = s_gui->sim_settings;

	g_object_get (s_gui->notebook, "page", &page, NULL);

	// Transient analysis
	s->trans_enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_trans_enable));

	g_free (s->trans_start);
	s->trans_start = gtk_editable_get_chars (GTK_EDITABLE (s_gui->w_trans_start), 0, -1);

	g_free (s->trans_stop);
	s->trans_stop = gtk_editable_get_chars (GTK_EDITABLE (s_gui->w_trans_stop), 0, -1);

	g_free (s->trans_step);
	s->trans_step = gtk_editable_get_chars (GTK_EDITABLE (s_gui->w_trans_step), 0, -1);

	s->trans_step_enable =
	    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_trans_step_enable));

	s->trans_init_cond =
	    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_trans_init_cond));

	s->trans_analyze_all =
	    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_trans_analyze_all));

	// DC
	s->dc_enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_dc_enable));

	g_free (s->dc_vin);
	s->dc_vin = NULL;
	tmp = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_dc_vin));
	if (tmp) {
		node_ids = g_strsplit (tmp, "V(", 0);
		tmp = g_strdup (node_ids[1]);
		g_strfreev (node_ids);
		if (tmp) {
			node_ids = g_strsplit (tmp, ")", 0);
			g_free (tmp);
			if (node_ids[0])
				s->dc_vin = g_strdup (node_ids[0]);
			else
				s->dc_vin = g_strdup("");
			g_strfreev (node_ids);
		}
	}
	if (s->dc_vin == NULL)
		s->dc_vin = g_strdup ("");

	g_free (s->dc_vout);
	s->dc_vout = NULL;
	tmp = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_dc_vout));
	if (tmp) {
		node_ids = g_strsplit (tmp, "V(", 0);
		tmp = g_strdup (node_ids[1]);
		g_strfreev (node_ids);
		if (tmp) {
			node_ids = g_strsplit (tmp, ")", 0);
			g_free (tmp);
			if (node_ids[0])
				s->dc_vout = g_strdup (node_ids[0]);
			else
				s->dc_vout = g_strdup("");
			g_strfreev (node_ids);
		}
	}
	if (s->dc_vout == NULL)
		s->dc_vout = g_strdup("");

	g_free (s->dc_start);
	s->dc_start = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_dc_start)));

	g_free (s->dc_stop);
	s->dc_stop = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_dc_stop)));

	g_free (s->dc_step);
	s->dc_step = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_dc_step)));

	// AC
	s->ac_enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_ac_enable));

	g_free (s->ac_vout);
	s->ac_vout = NULL;
	tmp = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_ac_vout));
	if (tmp) {
		node_ids = g_strsplit (tmp, "V(", 0);
		tmp = g_strdup (node_ids[1]);
		g_strfreev (node_ids);
		if (tmp) {
			node_ids = g_strsplit (tmp, ")", 0);
			g_free (tmp);
			if (node_ids[0])
				s->ac_vout = g_strdup (node_ids[0]);
			else
				s->ac_vout = g_strdup("");
			g_strfreev (node_ids);
		}
	}
	if (s->ac_vout == NULL)
		s->ac_vout = g_strdup("");

	g_free (s->ac_type);
	s->ac_type = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_ac_type));

	g_free (s->ac_npoints);
	s->ac_npoints = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_ac_npoints)));

	g_free (s->ac_start);
	s->ac_start = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_ac_start)));

	g_free (s->ac_stop);
	s->ac_stop = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_ac_stop)));

	// Fourier analysis
	s->fourier_enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_four_enable));

	g_free (s->fourier_frequency);
	s->fourier_frequency = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_four_freq)));

	// Noise
	s->noise_enable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (s_gui->w_noise_enable));

	g_free (s->noise_vin);
	s->noise_vin = NULL;
	tmp = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_noise_vin));
	if (tmp) {
		node_ids = g_strsplit (tmp, "V(", 0);
		tmp = g_strdup (node_ids[1]);
		g_strfreev (node_ids);
		if (tmp) {
			node_ids = g_strsplit (tmp, ")", 0);
			g_free (tmp);
			if (node_ids[0])
				s->noise_vin = g_strdup (node_ids[0]);
			else
				s->noise_vin = g_strdup("");
			g_strfreev (node_ids);
		}
	}
	if (s->noise_vin == NULL)
		s->noise_vin = g_strdup("");

	g_free (s->noise_vout);
	s->noise_vout = NULL;
	tmp = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_noise_vout));
	if (tmp) {
		node_ids = g_strsplit (tmp, "V(", 0);
		tmp = g_strdup (node_ids[1]);
		g_strfreev (node_ids);
		if (tmp) {
			node_ids = g_strsplit (tmp, ")", 0);
			g_free (tmp);
			if (node_ids[0])
				s->noise_vout = g_strdup (node_ids[0]);
			else
				s->noise_vout = g_strdup("");
			g_strfreev (node_ids);
		}
	}
	if (s->noise_vout == NULL)
		s->noise_vout = g_strdup("");

	g_free (s->noise_type);
	s->noise_type = g_strdup (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (s_gui->w_noise_type)));

	g_free (s->noise_npoints);
	s->noise_npoints = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_noise_npoints)));

	g_free (s->noise_start);
	s->noise_start = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_noise_start)));

	g_free (s->noise_stop);
	s->noise_stop = g_strdup (gtk_entry_get_text (GTK_ENTRY (s_gui->w_noise_stop)));

	// Options
	get_options_from_list (s_gui);
	gtk_widget_hide (GTK_WIDGET (s_gui->pbox));
	s_gui->pbox = NULL;
	s_gui->notebook = NULL;

	// Schematic is dirty now ;-)
	schematic_set_dirty (sm, TRUE);

	s->configured = TRUE;

	// The simulation settings configuration has
	// been triggered by an attempt to lauch the
	// simulation for the first time without
	// configuring it first.
	if (s->simulation_requested) {
		s->simulation_requested = FALSE;
		schematic_view_simulate_cmd (NULL, sv);
	}
}