From fb808c9bab45d6ac0322d96a7102256989b0db45 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Thu, 3 Jul 2025 16:44:23 +0800 Subject: [PATCH] qsort() the elines by id --- ses_ui.c | 66 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/ses_ui.c b/ses_ui.c index 27cc426..c2f1d09 100644 --- a/ses_ui.c +++ b/ses_ui.c @@ -1,5 +1,17 @@ #include"ses_ui.h" +static int eline_id_cmp(const void* v0, const void* v1) +{ + const ScfEline* el0 = *(const ScfEline**)v0; + const ScfEline* el1 = *(const ScfEline**)v1; + + assert(el0->id != el1->id); + + if (el0->id < el1->id) + return -1; + return 1; +} + static void ui_add_line(ses_ui_t* ui, ScfEline* el, ScfLine* l) { ScfEcomponent* c; @@ -214,6 +226,8 @@ static gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer user_data) gtk_render_background(context, cr, 0, 0, width, height); cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0); + cairo_set_line_width (cr, 2.0); + draw_VA(ui->V_wave, cr); cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0); @@ -627,13 +641,21 @@ static int button_add_eline(ses_ui_t* ui, ScfEline** pel, ScfLine** pl, int x0, return ret; } + long i; + for (i = 0; i < ui->f->n_elines; i++) { + if (i < ui->f->elines[i]->id) + break; + } + + el->id = i; + ret = scf_efunction__add_eline(ui->f, el); if (ret < 0) { ScfEline_free(el); return ret; } - el->id = ui->f->n_elines - 1; + qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp); *pel = el; *pl = l; @@ -1150,6 +1172,28 @@ static int ui_save_file(ses_ui_t* ui) if (!ui->f || !ui->save_path) return -EINVAL; + ScfEcomponent* c; + ScfEline* el; + ScfEpin* p; + + long i; + long j; + + for (i = 0; i < ui->f->n_elines; i++) { + el = ui->f->elines[i]; + + el->id = i; + + for (j = 0; j + 1 < el->n_pins; j += 2) { + + c = ui->f->components[el->pins[j]]; + p = c->pins [el->pins[j + 1]]; + + p->lid = el->id; + p->c_lid = el->id; + } + } + ScfEboard* b = scf_eboard__alloc(); if (!b) return -ENOMEM; @@ -1753,6 +1797,8 @@ static void undo_clicked(GtkButton* self, gpointer user_data) case UI_DEL_ELINE: scf_efunction__add_eline(ui->f, log->el); + qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp); + ui_add_eline(ui, log->el); break; @@ -1824,6 +1870,8 @@ static void redo_clicked(GtkButton* self, gpointer user_data) case UI_ADD_ELINE: scf_efunction__add_eline(ui->f, log->el); + qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp); + ui_add_eline(ui, log->el); break; @@ -1957,7 +2005,7 @@ static int add_wave_data(scf_vector_t** pvec, char* buf) if (va->size <= 0) { free(va); - va = NULL; + return 0; } int ret = scf_vector_add(vec, va); @@ -1973,21 +2021,7 @@ static int add_wave_data(scf_vector_t** pvec, char* buf) free(va); va = NULL; } -#if 0 - int i; - int j; - - for (i = 0; i < vec->size; i++) { - va = vec->data[i]; - fprintf(stderr, "i: %d, ", i); - - for (j = 0; j < va->size; j++) { - fprintf(stderr, "%lg ", va->data[j]); - } - fprintf(stderr, "\n"); - } -#endif return 0; } -- 2.25.1