From fde072720de2918072854b3d99cd26b77cb8d1a3 Mon Sep 17 00:00:00 2001 From: Stefan Schippers Date: Mon, 7 Sep 2020 13:12:34 +0200 Subject: [PATCH] enable "bus=true" attribute for lines as wellas for wires. As a side effect LCC schematics with bussed wires will display thick buses --- src/draw.c | 13 ++++++++++--- src/editprop.c | 37 ++++++++++++++----------------------- src/move.c | 25 ++++++++++++++++++++----- src/save.c | 14 ++++++++++++++ src/select.c | 25 +++++++++++++++++++++---- src/store.c | 4 ++++ src/xschem.h | 1 + 7 files changed, 84 insertions(+), 35 deletions(-) diff --git a/src/draw.c b/src/draw.c index 3fa4c4fb..102dfe6c 100644 --- a/src/draw.c +++ b/src/draw.c @@ -517,7 +517,10 @@ void draw_symbol(int what,int c, int n,int layer,int tmp_flip, int rot, ROTATION(0.0,0.0,line.x1,line.y1,x1,y1); ROTATION(0.0,0.0,line.x2,line.y2,x2,y2); ORDER(x1,y1,x2,y2); - drawline(c,what, x0+x1, y0+y1, x0+x2, y0+y2, line.dash); + if(line.bus) + drawline(c,THICK, x0+x1, y0+y1, x0+x2, y0+y2, line.dash); + else + drawline(c,what, x0+x1, y0+y1, x0+x2, y0+y2, line.dash); } for(j=0;j< symptr->polygons[layer];j++) /* 20171115 */ { @@ -1565,8 +1568,12 @@ void draw(void) { if(draw_single_layer!=-1 && c != draw_single_layer) continue; /* 20151117 */ - for(i=0;i= 0? d : 0; } else line[c][n].dash = 0; - if(old_dash != line[c][n].dash) { - if(!drw) { - bbox(BEGIN,0.0,0.0,0.0,0.0); - drw = 1; - } - bbox(ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2); - } - } - if(drw) { - bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); - draw(); - bbox(END , 0.0 , 0.0 , 0.0 , 0.0); + if(line[c][n].y1 < line[c][n].y2) { y1 = line[c][n].y1-bus_width; y2 = line[c][n].y2+bus_width; } + else { y1 = line[c][n].y1+bus_width; y2 = line[c][n].y2-bus_width; } + bbox(ADD, line[c][n].x1-bus_width, y1 , line[c][n].x2+bus_width , y2 ); } + bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); + draw(); + bbox(END , 0.0 , 0.0 , 0.0 , 0.0); } my_free(726, &oldprop); } @@ -524,6 +519,7 @@ void edit_wire_property(void) { push_undo(); /* 20150327 */ set_modify(1); + bbox(BEGIN, 0.0 , 0.0 , 0.0 , 0.0); for(i=0; i cadhalfdotsize ? bus_width : CADHALFDOTSIZE; if(wire[k].y1 < wire[k].y2) { y1 = wire[k].y1-ov; y2 = wire[k].y2+ov; } else { y1 = wire[k].y1+ov; y2 = wire[k].y2-ov; } bbox(ADD, wire[k].x1-ov, y1 , wire[k].x2+ov , y2 ); wire[k].bus=1; - bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); - draw(); - bbox(END , 0.0 , 0.0 , 0.0 , 0.0); } else { if(oldbus){ /* 20171201 */ int ov, y1, y2; - bbox(BEGIN, 0.0 , 0.0 , 0.0 , 0.0); ov = bus_width> cadhalfdotsize ? bus_width : CADHALFDOTSIZE; if(wire[k].y1 < wire[k].y2) { y1 = wire[k].y1-ov; y2 = wire[k].y2+ov; } else { y1 = wire[k].y1+ov; y2 = wire[k].y2-ov; } bbox(ADD, wire[k].x1-ov, y1 , wire[k].x2+ov , y2 ); wire[k].bus=0; - bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); - draw(); - bbox(END , 0.0 , 0.0 , 0.0 , 0.0); } } } + bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); + draw(); + bbox(END , 0.0 , 0.0 , 0.0 , 0.0); } my_free(727, &oldprop); } diff --git a/src/move.c b/src/move.c index 58b1cb7c..48908a81 100644 --- a/src/move.c +++ b/src/move.c @@ -356,15 +356,24 @@ void draw_selection(GC g, int interruptable) ORDER(rx1,ry1,rx2,ry2); if(line[c][n].sel==SELECTED) { - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + if(line[c][n].bus) + drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + else + drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); } else if(line[c][n].sel==SELECTED1) { - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2, ry2); + if(line[c][n].bus) + drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2, ry2); + else + drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2, ry2); } else if(line[c][n].sel==SELECTED2) { - drawtempline(g, ADD, rx1, ry1, rx2+deltax, ry2+deltay); + if(line[c][n].bus) + drawtempline(g, THICK, rx1, ry1, rx2+deltax, ry2+deltay); + else + drawtempline(g, ADD, rx1, ry1, rx2+deltax, ry2+deltay); } break; case ARC: @@ -597,7 +606,10 @@ void copy_objects(int what) if(line[c][n].sel == SELECTED1) line[c][n].sel = SELECTED2; else if(line[c][n].sel == SELECTED2) line[c][n].sel = SELECTED1; } - drawline(k, ADD, rx1,ry1,rx2,ry2, line[c][n].dash); + if(line[c][n].bus) + drawline(k, THICK, rx1,ry1,rx2,ry2, line[c][n].dash); + else + drawline(k, ADD, rx1,ry1,rx2,ry2, line[c][n].dash); selectedgroup[i].n=lastline[c]; storeobject(-1, rx1, ry1, rx2, ry2, LINE, c, line[c][n].sel, line[c][n].prop_ptr); line[c][n].sel=0; @@ -1010,7 +1022,10 @@ void move_objects(int what, int merge, double dx, double dy) line[c][n].y1=ry1; line[c][n].x2=rx2; line[c][n].y2=ry2; - drawline(k, ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, line[c][n].dash); + if(line[c][n].bus) + drawline(k, THICK, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, line[c][n].dash); + else + drawline(k, ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, line[c][n].dash); break; case POLYGON: /* 20171115 */ diff --git a/src/save.c b/src/save.c index c1ea2841..6b784b59 100644 --- a/src/save.c +++ b/src/save.c @@ -705,6 +705,12 @@ static void load_line(FILE *fd) ptr[i].prop_ptr=NULL; ptr[i].sel=0; load_ascii_string( &ptr[i].prop_ptr, fd); + + if(!strcmp(get_tok_value(ptr[i].prop_ptr, "bus", 0), "true") ) + ptr[i].bus = 1; + else + ptr[i].bus = 0; + dash = get_tok_value(ptr[i].prop_ptr,"dash",0); if(strcmp(dash, "")) { int d = atoi(dash); @@ -1400,6 +1406,10 @@ int load_sym_def(const char *name, FILE *embed_fd) load_ascii_string( &ll[c][i].prop_ptr, lcc[level].fd); dbg(2, "l_d_s(): loaded line: ptr=%lx\n", (unsigned long)ll[c]); + if(!strcmp(get_tok_value(ll[c][i].prop_ptr,"bus", 0), "true") ) + ll[c][i].bus = 1; + else + ll[c][i].bus = 0; dash = get_tok_value(ll[c][i].prop_ptr,"dash", 0); if( strcmp(dash, "") ) { int d = atoi(dash); @@ -1595,6 +1605,10 @@ int load_sym_def(const char *name, FILE *embed_fd) load_ascii_string( &ll[WIRELAYER][i].prop_ptr, lcc[level].fd); dbg(2, "l_d_s(): loaded line: ptr=%lx\n", (unsigned long)ll[WIRELAYER]); ll[WIRELAYER][i].dash = 0; + if(!strcmp(get_tok_value(ll[WIRELAYER][i].prop_ptr, "bus", 0), "true")) + ll[WIRELAYER][i].bus = 1; + else + ll[WIRELAYER][i].bus = 0; ll[WIRELAYER][i].sel = 0; lastl[WIRELAYER]++; break; diff --git a/src/select.c b/src/select.c index bcb056d4..d8e5a8df 100644 --- a/src/select.c +++ b/src/select.c @@ -123,7 +123,15 @@ static void del_rect_line_arc_poly(void) if(line[c][i].sel == SELECTED) { j++; - bbox(ADD, line[c][i].x1, line[c][i].y1, line[c][i].x2, line[c][i].y2); + if(line[c][i].bus){ /* 20171201 */ + int ov, y1, y2; + ov = bus_width; + if(line[c][i].y1 < line[c][i].y2) { y1 = line[c][i].y1-ov; y2 = line[c][i].y2+ov; } + else { y1 = line[c][i].y1+ov; y2 = line[c][i].y2-ov; } + bbox(ADD, line[c][i].x1-ov, y1 , line[c][i].x2+ov , y2 ); + } else { + bbox(ADD, line[c][i].x1, line[c][i].y1 , line[c][i].x2 , line[c][i].y2 ); + } set_modify(1); my_free(929, &line[c][i].prop_ptr); continue; @@ -522,7 +530,10 @@ void unselect_all(void) if(line[c][i].sel) { line[c][i].sel = 0; - drawtempline(gctiled, ADD, line[c][i].x1, line[c][i].y1, line[c][i].x2, line[c][i].y2); + if(line[c][i].bus) + drawtempline(gctiled, THICK, line[c][i].x1, line[c][i].y1, line[c][i].x2, line[c][i].y2); + else + drawtempline(gctiled, ADD, line[c][i].x1, line[c][i].y1, line[c][i].x2, line[c][i].y2); } } for(i=0;i