2020-08-08 15:47:34 +02:00
|
|
|
/* File: select.c
|
2020-10-12 13:13:31 +02:00
|
|
|
*
|
2020-08-08 15:47:34 +02:00
|
|
|
* This file is part of XSCHEM,
|
2020-10-12 13:13:31 +02:00
|
|
|
* a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
|
2020-08-08 15:47:34 +02:00
|
|
|
* simulation.
|
|
|
|
|
* Copyright (C) 1998-2020 Stefan Frederik Schippers
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "xschem.h"
|
|
|
|
|
|
|
|
|
|
static int rot = 0;
|
|
|
|
|
static int flip = 0;
|
|
|
|
|
static double xx1,yy1,xx2,yy2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void symbol_bbox(int i, double *x1,double *y1, double *x2, double *y2)
|
|
|
|
|
{
|
|
|
|
|
int j;
|
2020-10-12 13:13:31 +02:00
|
|
|
xText text;
|
2020-08-31 02:25:41 +02:00
|
|
|
const char *tmp_txt;
|
2020-08-08 15:47:34 +02:00
|
|
|
int rot,flip;
|
|
|
|
|
double x0, y0 ;
|
|
|
|
|
double text_x0, text_y0;
|
|
|
|
|
int sym_rot, sym_flip;
|
|
|
|
|
double xx1,yy1,xx2,yy2;
|
|
|
|
|
|
2020-09-30 00:30:48 +02:00
|
|
|
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
int customfont;
|
|
|
|
|
#endif
|
|
|
|
|
/* symbol bbox */
|
2020-10-15 17:39:21 +02:00
|
|
|
flip = xctx->inst[i].flip;
|
|
|
|
|
rot = xctx->inst[i].rot;
|
|
|
|
|
x0=xctx->inst[i].x0;
|
|
|
|
|
y0=xctx->inst[i].y0;
|
|
|
|
|
ROTATION(0.0,0.0,(xctx->inst[i].ptr+ xctx->sym)->minx,
|
|
|
|
|
(xctx->inst[i].ptr+ xctx->sym)->miny,*x1,*y1);
|
|
|
|
|
ROTATION(0.0,0.0,(xctx->inst[i].ptr+ xctx->sym)->maxx,
|
|
|
|
|
(xctx->inst[i].ptr+ xctx->sym)->maxy,*x2,*y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
RECTORDER(*x1,*y1,*x2,*y2);
|
|
|
|
|
*x1+=x0;*y1+=y0;
|
|
|
|
|
*x2+=x0;*y2+=y0;
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->inst[i].xx1 = *x1; /* 20070314 added bbox without text */
|
|
|
|
|
xctx->inst[i].yy1 = *y1; /* for easier select */
|
|
|
|
|
xctx->inst[i].xx2 = *x2;
|
|
|
|
|
xctx->inst[i].yy2 = *y2;
|
2020-08-08 15:47:34 +02:00
|
|
|
dbg(2, "symbol_bbox(): instance=%d %.16g %.16g %.16g %.16g\n",i,*x1, *y1, *x2, *y2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-08-08 15:47:34 +02:00
|
|
|
/* strings bbox */
|
2020-10-15 17:39:21 +02:00
|
|
|
for(j=0;j< (xctx->inst[i].ptr+ xctx->sym)->texts;j++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
sym_flip = flip;
|
|
|
|
|
sym_rot = rot;
|
2020-10-15 17:39:21 +02:00
|
|
|
text = (xctx->inst[i].ptr+ xctx->sym)->text[j];
|
2020-10-12 13:13:31 +02:00
|
|
|
dbg(2, "symbol_bbox(): instance %d text n: %d text str=%s\n",
|
2020-08-08 15:47:34 +02:00
|
|
|
i,j, text.txt_ptr? text.txt_ptr:"NULL");
|
|
|
|
|
|
|
|
|
|
tmp_txt = translate(i, text.txt_ptr);
|
|
|
|
|
|
|
|
|
|
dbg(2, "symbol_bbox(): translated text: %s\n", tmp_txt);
|
|
|
|
|
ROTATION(0.0,0.0,text.x0, text.y0,text_x0,text_y0);
|
|
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
customfont=set_text_custom_font(&text);
|
|
|
|
|
#endif
|
2020-10-12 13:13:31 +02:00
|
|
|
text_bbox(tmp_txt, text.xscale, text.yscale,
|
2020-08-08 15:47:34 +02:00
|
|
|
(text.rot + ( (sym_flip && (text.rot & 1) ) ? sym_rot+2 : sym_rot)) &0x3,
|
2020-08-24 08:36:47 +02:00
|
|
|
sym_flip ^ text.flip, text.hcenter, text.vcenter,
|
2020-08-08 15:47:34 +02:00
|
|
|
x0+text_x0,y0+text_y0, &xx1,&yy1,&xx2,&yy2);
|
|
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
if(customfont) cairo_restore(cairo_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
if(xx1<*x1) *x1=xx1;
|
|
|
|
|
if(yy1<*y1) *y1=yy1;
|
|
|
|
|
if(xx2>*x2) *x2=xx2;
|
|
|
|
|
if(yy2>*y2) *y2=yy2;
|
|
|
|
|
dbg(2, "symbol_bbox(): instance=%d text=%d %.16g %.16g %.16g %.16g\n",i,j, *x1, *y1, *x2, *y2);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void del_rect_line_arc_poly(void)
|
|
|
|
|
{
|
2020-10-12 13:13:31 +02:00
|
|
|
xRect tmp;
|
2020-08-08 15:47:34 +02:00
|
|
|
int c, j, i;
|
|
|
|
|
|
|
|
|
|
for(c=0;c<cadlayers;c++)
|
|
|
|
|
{
|
2020-10-12 13:13:31 +02:00
|
|
|
j = 0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->rects[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->rect[c][i].sel == SELECTED)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-12 13:13:31 +02:00
|
|
|
j++;
|
2020-10-15 17:39:21 +02:00
|
|
|
bbox(ADD, xctx->rect[c][i].x1, xctx->rect[c][i].y1, xctx->rect[c][i].x2, xctx->rect[c][i].y2);
|
|
|
|
|
my_free(928, &xctx->rect[c][i].prop_ptr);
|
2020-08-08 15:47:34 +02:00
|
|
|
set_modify(1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
if(j)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rect[c][i-j] = xctx->rect[c][i];
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rects[c] -= j;
|
2020-08-08 15:47:34 +02:00
|
|
|
j = 0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->lines[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].sel == SELECTED)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
j++;
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].bus){
|
2020-09-07 13:12:34 +02:00
|
|
|
int ov, y1, y2;
|
2020-10-17 00:53:19 +02:00
|
|
|
ov = INT_BUS_WIDTH(xctx->lw);
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].y1 < xctx->line[c][i].y2) { y1 = xctx->line[c][i].y1-ov; y2 = xctx->line[c][i].y2+ov; }
|
|
|
|
|
else { y1 = xctx->line[c][i].y1+ov; y2 = xctx->line[c][i].y2-ov; }
|
|
|
|
|
bbox(ADD, xctx->line[c][i].x1-ov, y1 , xctx->line[c][i].x2+ov , y2 );
|
2020-09-07 13:12:34 +02:00
|
|
|
} else {
|
2020-10-15 17:39:21 +02:00
|
|
|
bbox(ADD, xctx->line[c][i].x1, xctx->line[c][i].y1 , xctx->line[c][i].x2 , xctx->line[c][i].y2 );
|
2020-09-07 13:12:34 +02:00
|
|
|
}
|
2020-08-08 15:47:34 +02:00
|
|
|
set_modify(1);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(929, &xctx->line[c][i].prop_ptr);
|
2020-08-08 15:47:34 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
if(j)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->line[c][i-j] = xctx->line[c][i];
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->lines[c] -= j;
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
j = 0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->arcs[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->arc[c][i].sel == SELECTED)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
j++;
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->arc[c][i].fill)
|
|
|
|
|
arc_bbox(xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, 0, 360,
|
2020-08-08 15:47:34 +02:00
|
|
|
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
|
|
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
arc_bbox(xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b,
|
2020-08-08 15:47:34 +02:00
|
|
|
&tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
|
|
|
|
|
bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(930, &xctx->arc[c][i].prop_ptr);
|
2020-08-08 15:47:34 +02:00
|
|
|
set_modify(1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if(j)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->arc[c][i-j] = xctx->arc[c][i];
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->arcs[c] -= j;
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
j = 0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->polygons[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->poly[c][i].sel == SELECTED)
|
2020-10-12 13:13:31 +02:00
|
|
|
{
|
2020-08-08 15:47:34 +02:00
|
|
|
int k;
|
|
|
|
|
double x1=0., y1=0., x2=0., y2=0.;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(k=0; k<xctx->poly[c][i].points; k++) {
|
|
|
|
|
if(k==0 || xctx->poly[c][i].x[k] < x1) x1 = xctx->poly[c][i].x[k];
|
|
|
|
|
if(k==0 || xctx->poly[c][i].y[k] < y1) y1 = xctx->poly[c][i].y[k];
|
|
|
|
|
if(k==0 || xctx->poly[c][i].x[k] > x2) x2 = xctx->poly[c][i].x[k];
|
|
|
|
|
if(k==0 || xctx->poly[c][i].y[k] > y2) y2 = xctx->poly[c][i].y[k];
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
j++;
|
|
|
|
|
bbox(ADD, x1, y1, x2, y2);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(931, &xctx->poly[c][i].prop_ptr);
|
|
|
|
|
my_free(932, &xctx->poly[c][i].x);
|
|
|
|
|
my_free(933, &xctx->poly[c][i].y);
|
|
|
|
|
my_free(934, &xctx->poly[c][i].selected_point);
|
2020-08-08 15:47:34 +02:00
|
|
|
/*fprintf(errfp, "bbox: %.16g %.16g %.16g %.16g\n", x1, y1, x2, y2); */
|
|
|
|
|
set_modify(1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if(j)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->poly[c][i-j] = xctx->poly[c][i];
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->polygons[c] -= j;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void delete(void)
|
|
|
|
|
{
|
2020-10-02 03:21:22 +02:00
|
|
|
int i, j, n;
|
|
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
int customfont;
|
|
|
|
|
#endif
|
2020-08-08 15:47:34 +02:00
|
|
|
|
2020-10-02 03:21:22 +02:00
|
|
|
dbg(3, "delete(): start\n");
|
|
|
|
|
j = 0;
|
|
|
|
|
bbox(BEGIN, 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
rebuild_selected_array();
|
2020-10-12 13:13:31 +02:00
|
|
|
if(lastselected) push_undo();
|
2020-09-30 00:30:48 +02:00
|
|
|
|
2020-09-30 23:55:07 +02:00
|
|
|
|
|
|
|
|
|
2020-10-02 03:21:22 +02:00
|
|
|
/* first calculate bbox, because symbol_bbox() needs translate (@#0:net_name) which needs prepare_netlist_structs
|
2020-10-15 17:39:21 +02:00
|
|
|
* which needs a consistent xctx->inst[] data structure */
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-03 04:33:52 +02:00
|
|
|
/* does not seem to be needed
|
2020-10-02 03:21:22 +02:00
|
|
|
prepared_netlist_structs=0;
|
|
|
|
|
prepared_hilight_structs=0;
|
2020-10-12 13:13:31 +02:00
|
|
|
*/
|
2020-10-02 03:21:22 +02:00
|
|
|
if(show_pin_net_names) {
|
|
|
|
|
prepare_netlist_structs(0);
|
|
|
|
|
}
|
|
|
|
|
for(i = 0; i < lastselected; i++) {
|
|
|
|
|
n = selectedgroup[i].n;
|
|
|
|
|
if(selectedgroup[i].type == ELEMENT) {
|
|
|
|
|
int p;
|
2020-10-17 12:01:05 +02:00
|
|
|
char *type = (xctx->inst[n].ptr + xctx->sym)->type;
|
2020-10-15 17:39:21 +02:00
|
|
|
symbol_bbox(n, &xctx->inst[n].x1, &xctx->inst[n].y1, &xctx->inst[n].x2, &xctx->inst[n].y2 );
|
|
|
|
|
bbox(ADD, xctx->inst[n].x1, xctx->inst[n].y1, xctx->inst[n].x2, xctx->inst[n].y2 );
|
2020-10-17 12:01:05 +02:00
|
|
|
if(show_pin_net_names && type && IS_LABEL_OR_PIN(type) ) {
|
|
|
|
|
for(p = 0; p < (xctx->inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) {
|
|
|
|
|
if( xctx->inst[n].node && xctx->inst[n].node[p]) {
|
|
|
|
|
find_inst_to_be_redrawn(xctx->inst[n].node[p]);
|
|
|
|
|
}
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if(show_pin_net_names && selectedgroup[i].type == WIRE && xctx->wire[n].node) {
|
|
|
|
|
find_inst_to_be_redrawn(xctx->wire[n].node);
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-05 13:29:57 +02:00
|
|
|
if(show_pin_net_names) {
|
|
|
|
|
find_inst_hash_clear();
|
|
|
|
|
}
|
2020-10-02 03:21:22 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-10-12 13:13:31 +02:00
|
|
|
/* already done above
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->instances;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[i].sel == SELECTED)
|
2020-10-02 03:21:22 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2);
|
|
|
|
|
bbox(ADD, xctx->inst[i].x1, xctx->inst[i].y1, xctx->inst[i].x2, xctx->inst[i].y2);
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
2020-09-30 00:30:48 +02:00
|
|
|
}
|
2020-10-03 04:33:52 +02:00
|
|
|
*/
|
2020-10-02 03:21:22 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->texts;i++)
|
2020-09-30 00:30:48 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->text[i].sel == SELECTED)
|
2020-10-02 03:21:22 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
rot = xctx->text[i].rot;
|
|
|
|
|
flip = xctx->text[i].flip;
|
2020-10-02 03:21:22 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-15 17:39:21 +02:00
|
|
|
customfont = set_text_custom_font(&xctx->text[i]);
|
2020-10-02 03:21:22 +02:00
|
|
|
#endif
|
2020-10-15 17:39:21 +02:00
|
|
|
text_bbox(xctx->text[i].txt_ptr, xctx->text[i].xscale,
|
|
|
|
|
xctx->text[i].yscale, rot, flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
|
|
|
|
|
xctx->text[i].x0, xctx->text[i].y0,
|
2020-10-02 03:21:22 +02:00
|
|
|
&xx1,&yy1, &xx2,&yy2);
|
|
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
if(customfont) cairo_restore(cairo_ctx);
|
2020-10-02 03:21:22 +02:00
|
|
|
#endif
|
|
|
|
|
bbox(ADD, xx1, yy1, xx2, yy2 );
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(935, &xctx->text[i].prop_ptr);
|
|
|
|
|
my_free(936, &xctx->text[i].font);
|
|
|
|
|
my_free(937, &xctx->text[i].txt_ptr);
|
2020-10-02 03:21:22 +02:00
|
|
|
set_modify(1);
|
|
|
|
|
j++;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if(j)
|
|
|
|
|
{
|
|
|
|
|
dbg(1, "select(); deleting string %d\n",i-j);
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->text[i-j] = xctx->text[i];
|
|
|
|
|
dbg(1, "select(); new string %d = %s\n",i-j,xctx->text[i-j].txt_ptr);
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->texts -= j;
|
2020-10-02 03:21:22 +02:00
|
|
|
j = 0;
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->instances;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[i].sel == SELECTED)
|
2020-10-02 03:21:22 +02:00
|
|
|
{
|
|
|
|
|
set_modify(1);
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[i].prop_ptr != NULL)
|
2020-10-02 03:21:22 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(938, &xctx->inst[i].prop_ptr);
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
|
|
|
|
delete_inst_node(i);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(939, &xctx->inst[i].name);
|
|
|
|
|
my_free(940, &xctx->inst[i].instname);
|
2020-10-02 03:21:22 +02:00
|
|
|
j++;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
if(j)
|
2020-10-02 03:21:22 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->inst[i-j] = xctx->inst[i];
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->instances-=j;
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-02 03:21:22 +02:00
|
|
|
if(j) {
|
2020-10-03 04:33:52 +02:00
|
|
|
prepared_hash_instances=0;
|
2020-10-02 03:21:22 +02:00
|
|
|
prepared_netlist_structs=0;
|
|
|
|
|
prepared_hilight_structs=0;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
j = 0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->wires;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].sel == SELECTED) {
|
2020-10-12 13:13:31 +02:00
|
|
|
j++;
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].bus){
|
2020-10-02 03:21:22 +02:00
|
|
|
int ov, y1, y2;
|
2020-10-17 00:53:19 +02:00
|
|
|
ov = INT_BUS_WIDTH(xctx->lw)> cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE;
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].y1 < xctx->wire[i].y2) { y1 = xctx->wire[i].y1-ov; y2 = xctx->wire[i].y2+ov; }
|
|
|
|
|
else { y1 = xctx->wire[i].y1+ov; y2 = xctx->wire[i].y2-ov; }
|
|
|
|
|
bbox(ADD, xctx->wire[i].x1-ov, y1 , xctx->wire[i].x2+ov , y2 );
|
2020-10-02 03:21:22 +02:00
|
|
|
} else {
|
|
|
|
|
int ov, y1, y2;
|
|
|
|
|
ov = cadhalfdotsize;
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].y1 < xctx->wire[i].y2) { y1 = xctx->wire[i].y1-ov; y2 = xctx->wire[i].y2+ov; }
|
|
|
|
|
else { y1 = xctx->wire[i].y1+ov; y2 = xctx->wire[i].y2-ov; }
|
|
|
|
|
bbox(ADD, xctx->wire[i].x1-ov, y1 , xctx->wire[i].x2+ov , y2 );
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
my_free(941, &xctx->wire[i].prop_ptr);
|
|
|
|
|
my_free(942, &xctx->wire[i].node);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-02 03:21:22 +02:00
|
|
|
set_modify(1);
|
|
|
|
|
continue;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-02 03:21:22 +02:00
|
|
|
if(j) {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->wire[i-j] = xctx->wire[i];
|
2020-10-02 03:21:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->wires -= j;
|
2020-10-02 03:21:22 +02:00
|
|
|
if(j) {
|
2020-10-03 04:33:52 +02:00
|
|
|
prepared_hash_wires=0;
|
2020-08-08 15:47:34 +02:00
|
|
|
prepared_netlist_structs=0;
|
|
|
|
|
prepared_hilight_structs=0;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-02 03:21:22 +02:00
|
|
|
del_rect_line_arc_poly();
|
|
|
|
|
update_conn_cues(0, 0);
|
|
|
|
|
lastselected = 0;
|
|
|
|
|
bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
draw();
|
|
|
|
|
bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
ui_state &= ~SELECTION;
|
|
|
|
|
if(event_reporting) {
|
|
|
|
|
printf("xschem delete\n");
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
}
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void delete_only_rect_line_arc_poly(void)
|
|
|
|
|
{
|
|
|
|
|
bbox(BEGIN, 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
del_rect_line_arc_poly();
|
|
|
|
|
lastselected = 0;
|
|
|
|
|
bbox(SET , 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
draw();
|
|
|
|
|
bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
|
|
|
|
|
ui_state &= ~SELECTION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void bbox(int what,double x1,double y1, double x2, double y2)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
2020-10-12 13:13:31 +02:00
|
|
|
static int bbx1, bbx2, bby1, bby2;
|
2020-08-08 15:47:34 +02:00
|
|
|
static int savew, saveh, savex1, savex2, savey1, savey2;
|
|
|
|
|
static int sem=0;
|
|
|
|
|
|
|
|
|
|
/* fprintf(errfp, "bbox: what=%d\n", what); */
|
|
|
|
|
switch(what)
|
|
|
|
|
{
|
|
|
|
|
case BEGIN:
|
|
|
|
|
if(sem==1) {
|
2020-10-12 13:13:31 +02:00
|
|
|
fprintf(errfp, "ERROR: rentrant bbox() call\n");
|
|
|
|
|
tcleval("alert_ {ERROR: reentrant bbox() call} {}");
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
bbx1 = 300000000;
|
|
|
|
|
bbx2 = 0;
|
2020-10-12 13:13:31 +02:00
|
|
|
bby1 = 300000000;
|
2020-08-08 15:47:34 +02:00
|
|
|
bby2 = 0;
|
|
|
|
|
savex1 = areax1;
|
|
|
|
|
savex2 = areax2;
|
|
|
|
|
savey1 = areay1;
|
|
|
|
|
savey2 = areay2;
|
|
|
|
|
savew = areaw;
|
|
|
|
|
saveh = areah;
|
|
|
|
|
sem=1;
|
|
|
|
|
break;
|
|
|
|
|
case ADD:
|
|
|
|
|
if(sem==0) {
|
2020-10-12 13:13:31 +02:00
|
|
|
fprintf(errfp, "ERROR: bbox(ADD) call before bbox(BEGIN)\n");
|
|
|
|
|
tcleval("alert_ {ERROR: bbox(ADD) call before bbox(BEGIN)} {}");
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
x1=X_TO_SCREEN(x1);
|
|
|
|
|
y1=Y_TO_SCREEN(y1);
|
|
|
|
|
x2=X_TO_SCREEN(x2);
|
|
|
|
|
y2=Y_TO_SCREEN(y2);
|
|
|
|
|
x1=CLIP(x1,savex1,savex2);
|
|
|
|
|
x2=CLIP(x2,savex1,savex2);
|
|
|
|
|
y1=CLIP(y1,savey1,savey2);
|
|
|
|
|
y2=CLIP(y2,savey1,savey2);
|
|
|
|
|
if(x1 < bbx1) bbx1 = (int) x1;
|
|
|
|
|
if(x2 > bbx2) bbx2 = (int) x2;
|
|
|
|
|
if(y1 < bby1) bby1 = (int) y1;
|
|
|
|
|
if(y2 > bby2) bby2 = (int) y2;
|
|
|
|
|
if(y2 < bby1) bby1 = (int) y2;
|
|
|
|
|
if(y1 > bby2) bby2 = (int) y1;
|
|
|
|
|
break;
|
|
|
|
|
case END:
|
|
|
|
|
areax1 = savex1;
|
|
|
|
|
areax2 = savex2;
|
|
|
|
|
areay1 = savey1;
|
|
|
|
|
areay2 = savey2;
|
|
|
|
|
areaw = savew;
|
|
|
|
|
areah = saveh;
|
|
|
|
|
xrect[0].x = 0;
|
|
|
|
|
xrect[0].y = 0;
|
2020-10-17 00:53:19 +02:00
|
|
|
xrect[0].width = areaw-4*INT_WIDTH(xctx->lw);
|
|
|
|
|
xrect[0].height = areah-4*INT_WIDTH(xctx->lw);
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
XSetClipMask(display, gctiled, None); /* 20171110 optimization, clipping already done in software */
|
|
|
|
|
|
2020-10-12 13:13:31 +02:00
|
|
|
for(i=0;i<cadlayers;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
XSetClipMask(display, gc[i], None); /* 20171110 optimization, clipping already done in software */
|
|
|
|
|
XSetClipMask(display, gcstipple[i], None); /* 20171110 optimization, clipping already done in software */
|
|
|
|
|
}
|
|
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
cairo_reset_clip(cairo_ctx);
|
|
|
|
|
cairo_reset_clip(cairo_save_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
sem=0;
|
|
|
|
|
break;
|
|
|
|
|
case SET:
|
|
|
|
|
if(sem==0) {
|
2020-10-12 13:13:31 +02:00
|
|
|
fprintf(errfp, "ERROR: bbox(SET) call before bbox(BEGIN)\n");
|
|
|
|
|
tcleval("alert_ {ERROR: bbox(SET) call before bbox(BEGIN)} {}");
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-17 00:53:19 +02:00
|
|
|
areax1 = bbx1-2*INT_WIDTH(xctx->lw);
|
|
|
|
|
areax2 = bbx2+2*INT_WIDTH(xctx->lw);
|
|
|
|
|
areay1 = bby1-2*INT_WIDTH(xctx->lw);
|
|
|
|
|
areay2 = bby2+2*INT_WIDTH(xctx->lw);
|
2020-08-08 15:47:34 +02:00
|
|
|
areaw = (areax2-areax1);
|
|
|
|
|
areah = (areay2-areay1);
|
|
|
|
|
|
2020-10-17 00:53:19 +02:00
|
|
|
xrect[0].x = bbx1-INT_WIDTH(xctx->lw);
|
|
|
|
|
xrect[0].y = bby1-INT_WIDTH(xctx->lw);
|
|
|
|
|
xrect[0].width = bbx2-bbx1+2*INT_WIDTH(xctx->lw);
|
|
|
|
|
xrect[0].height = bby2-bby1+2*INT_WIDTH(xctx->lw);
|
2020-08-08 15:47:34 +02:00
|
|
|
for(i=0;i<cadlayers;i++)
|
|
|
|
|
{
|
|
|
|
|
XSetClipRectangles(display, gc[i], 0,0, xrect, 1, Unsorted);
|
|
|
|
|
XSetClipRectangles(display, gcstipple[i], 0,0, xrect, 1, Unsorted);
|
|
|
|
|
}
|
|
|
|
|
XSetClipRectangles(display, gctiled, 0,0, xrect, 1, Unsorted);
|
2020-10-12 13:13:31 +02:00
|
|
|
dbg(1, "bbox(): bbox= %d %d %d %d\n",areax1,areay1,areax2,areay2);
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
cairo_rectangle(cairo_ctx, xrect[0].x, xrect[0].y, xrect[0].width, xrect[0].height);
|
|
|
|
|
cairo_clip(cairo_ctx);
|
|
|
|
|
cairo_rectangle(cairo_save_ctx, xrect[0].x, xrect[0].y, xrect[0].width, xrect[0].height);
|
|
|
|
|
cairo_clip(cairo_save_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
break;
|
2020-10-12 13:13:31 +02:00
|
|
|
default:
|
2020-08-08 15:47:34 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void unselect_all(void)
|
|
|
|
|
{
|
|
|
|
|
int i,c;
|
|
|
|
|
char str[PATH_MAX];
|
|
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
int customfont;
|
|
|
|
|
#endif
|
2020-10-12 13:13:31 +02:00
|
|
|
ui_state = 0;
|
2020-08-08 15:47:34 +02:00
|
|
|
lastselected = 0;
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->wires;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].sel)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->wire[i].sel = 0;
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].bus)
|
|
|
|
|
drawtempline(gctiled, THICK, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gctiled, ADD, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->instances;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[i].sel == SELECTED)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->inst[i].sel = 0;
|
2020-08-08 15:47:34 +02:00
|
|
|
for(c=0;c<cadlayers;c++)
|
|
|
|
|
draw_temp_symbol(ADD, gctiled, i, c,0,0,0.0,0.0);
|
2020-10-12 13:13:31 +02:00
|
|
|
if(event_reporting) {
|
2020-08-08 15:47:34 +02:00
|
|
|
char n[PATH_MAX];
|
2020-10-15 17:39:21 +02:00
|
|
|
printf("xschem search exact %d name %s\n", -1, escape_chars(n, xctx->inst[i].instname, PATH_MAX));
|
2020-08-08 15:47:34 +02:00
|
|
|
fflush(stdout);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->texts;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->text[i].sel == SELECTED)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->text[i].sel = 0;
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-15 17:39:21 +02:00
|
|
|
customfont = set_text_custom_font(& xctx->text[i]); /* needed for bbox calculation */
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
2020-10-15 17:39:21 +02:00
|
|
|
draw_temp_string(gctiled,ADD, xctx->text[i].txt_ptr,
|
|
|
|
|
xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
|
|
|
|
|
xctx->text[i].x0, xctx->text[i].y0,
|
|
|
|
|
xctx->text[i].xscale, xctx->text[i].yscale);
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
if(customfont) cairo_restore(cairo_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
}
|
2020-08-08 15:47:34 +02:00
|
|
|
for(c=0;c<cadlayers;c++)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->arcs[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->arc[c][i].sel)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->arc[c][i].sel = 0;
|
|
|
|
|
drawtemparc(gctiled, ADD, xctx->arc[c][i].x, xctx->arc[c][i].y,
|
|
|
|
|
xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->rects[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->rect[c][i].sel)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rect[c][i].sel = 0;
|
|
|
|
|
drawtemprect(gctiled, ADD, xctx->rect[c][i].x1, xctx->rect[c][i].y1,
|
|
|
|
|
xctx->rect[c][i].x2, xctx->rect[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->lines[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].sel)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->line[c][i].sel = 0;
|
|
|
|
|
if(xctx->line[c][i].bus)
|
|
|
|
|
drawtempline(gctiled, THICK, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-09-07 13:12:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gctiled, ADD, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->polygons[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->poly[c][i].sel)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
int k;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(k=0;k<xctx->poly[c][i].points; k++) xctx->poly[c][i].selected_point[k] = 0;
|
|
|
|
|
xctx->poly[c][i].sel = 0;
|
|
|
|
|
drawtemppolygon(gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
}
|
|
|
|
|
drawtemparc(gctiled, END, 0.0, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
drawtemprect(gctiled, END, 0.0, 0.0, 0.0, 0.0);
|
2020-08-08 15:47:34 +02:00
|
|
|
drawtempline(gctiled,END, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
ui_state &= ~SELECTION;
|
|
|
|
|
/*\statusmsg("",2); */
|
|
|
|
|
my_snprintf(str, S(str), "%s/%s", user_conf_dir, ".selection.sch"); /* 20161115 PWD->HOME */
|
|
|
|
|
xunlink(str);
|
|
|
|
|
if(event_reporting) {
|
|
|
|
|
printf("xschem unselect_all\n");
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_wire(int i,unsigned short select_mode, int fast)
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
2020-10-15 17:39:21 +02:00
|
|
|
/*my_strncpy(s,xctx->wire[i].prop_ptr!=NULL?xctx->wire[i].prop_ptr:"<NULL>",256); */
|
2020-08-08 15:47:34 +02:00
|
|
|
if( !fast )
|
|
|
|
|
{
|
|
|
|
|
my_snprintf(str, S(str), "selected wire: n=%d end1=%d end2=%d\nnode=%s",i,
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->wire[i].end1, xctx->wire[i].end2,
|
|
|
|
|
xctx->wire[i].prop_ptr? xctx->wire[i].prop_ptr: "(null)");
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",i, xctx->wire[i].x1, xctx->wire[i].y1,
|
|
|
|
|
xctx->wire[i].x2-xctx->wire[i].x1, xctx->wire[i].y2-xctx->wire[i].y1
|
2020-08-08 15:47:34 +02:00
|
|
|
);
|
|
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if( ((xctx->wire[i].sel|select_mode) == (SELECTED1|SELECTED2)) ||
|
|
|
|
|
((xctx->wire[i].sel == SELECTED) && select_mode) )
|
|
|
|
|
xctx->wire[i].sel = SELECTED;
|
2020-10-12 13:13:31 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->wire[i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
if(select_mode) {
|
2020-10-15 17:39:21 +02:00
|
|
|
dbg(1, "select(): wire[%d].end1=%d, ,end2=%d\n", i, xctx->wire[i].end1, xctx->wire[i].end2);
|
|
|
|
|
if(xctx->wire[i].bus)
|
|
|
|
|
drawtempline(gc[SELLAYER], THICK, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gc[SELLAYER], ADD, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
else {
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[i].bus)
|
|
|
|
|
drawtempline(gctiled, THICK, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gctiled, NOW, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_element(int i,unsigned short select_mode, int fast, int override_lock)
|
|
|
|
|
{
|
|
|
|
|
int c, j;
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "lock", 0), "true") &&
|
2020-08-08 15:47:34 +02:00
|
|
|
select_mode == SELECTED && !override_lock) return;
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->inst[i].prop_ptr!=NULL?xctx->inst[i].prop_ptr:"<NULL>",S(s));
|
2020-10-12 13:13:31 +02:00
|
|
|
if(event_reporting) {
|
2020-08-08 15:47:34 +02:00
|
|
|
char n[PATH_MAX];
|
2020-10-15 17:39:21 +02:00
|
|
|
printf("xschem search exact %d name %s\n", select_mode? 1:-1, escape_chars(n, xctx->inst[i].instname, PATH_MAX));
|
2020-08-08 15:47:34 +02:00
|
|
|
fflush(stdout);
|
|
|
|
|
}
|
|
|
|
|
if( !fast )
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "selected element %d: %s properties: %s", i, xctx->inst[i].name,s);
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,2);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "symbol name=%s", xctx->inst[i].name==NULL?"(null)":xctx->inst[i].name);
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,2);
|
|
|
|
|
/* 20190526 */ /*Why this? 20191125 only on small schematics. slow down on big schematics */
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->instances < 150) {
|
2020-09-30 00:30:48 +02:00
|
|
|
prepare_netlist_structs(0);
|
2020-10-15 17:39:21 +02:00
|
|
|
for(j=0;j< (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER] ;j++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[i].node && (xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-12 13:13:31 +02:00
|
|
|
my_snprintf(str, S(str), "pin:%s -> %s",
|
2020-08-08 15:47:34 +02:00
|
|
|
get_tok_value(
|
2020-10-15 17:39:21 +02:00
|
|
|
(xctx->inst[i].ptr+ xctx->sym)->rect[PINLAYER][j].prop_ptr,"name",0) ,
|
|
|
|
|
xctx->inst[i].node[j] ? xctx->inst[i].node[j] : "__UNCONNECTED_PIN__");
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",i, xctx->inst[i].xx1, xctx->inst[i].yy1,
|
|
|
|
|
xctx->inst[i].xx2-xctx->inst[i].xx1, xctx->inst[i].yy2-xctx->inst[i].yy1
|
2020-08-08 15:47:34 +02:00
|
|
|
);
|
|
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->inst[i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
if(select_mode) {
|
|
|
|
|
for(c=0;c<cadlayers;c++) {
|
|
|
|
|
draw_temp_symbol(ADD, gc[SELLAYER], i,c,0,0,0.0,0.0);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for(c=0;c<cadlayers;c++) {
|
|
|
|
|
draw_temp_symbol(NOW, gctiled, i,c,0,0,0.0,0.0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_text(int i,unsigned short select_mode, int fast)
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
int customfont;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if(!fast) {
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->text[i].prop_ptr!=NULL?xctx->text[i].prop_ptr:"<NULL>",S(s));
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "selected text %d: properties: %s", i,s);
|
|
|
|
|
statusmsg(str,2);
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g", i, xctx->text[i].x0, xctx->text[i].y0);
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->text[i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
#ifdef HAS_CAIRO
|
2020-10-15 17:39:21 +02:00
|
|
|
customfont = set_text_custom_font(&xctx->text[i]);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
if(select_mode)
|
2020-10-15 17:39:21 +02:00
|
|
|
draw_temp_string(gc[SELLAYER],ADD, xctx->text[i].txt_ptr,
|
|
|
|
|
xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
|
|
|
|
|
xctx->text[i].x0, xctx->text[i].y0,
|
|
|
|
|
xctx->text[i].xscale, xctx->text[i].yscale);
|
2020-08-08 15:47:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
draw_temp_string(gctiled,NOW, xctx->text[i].txt_ptr,
|
|
|
|
|
xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
|
|
|
|
|
xctx->text[i].x0, xctx->text[i].y0,
|
|
|
|
|
xctx->text[i].xscale, xctx->text[i].yscale);
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
if(customfont) cairo_restore(cairo_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_box(int c, int i, unsigned short select_mode, int fast)
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
if(!fast)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->rect[c][i].prop_ptr!=NULL?xctx->rect[c][i].prop_ptr:"<NULL>",S(s));
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "selected box : layer=%d, n=%d properties: %s",c-4,i,s);
|
|
|
|
|
statusmsg(str,2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
|
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",
|
2020-10-15 17:39:21 +02:00
|
|
|
i, xctx->rect[c][i].x1, xctx->rect[c][i].y1,
|
|
|
|
|
xctx->rect[c][i].x2-xctx->rect[c][i].x1, xctx->rect[c][i].y2-xctx->rect[c][i].y1
|
2020-08-08 15:47:34 +02:00
|
|
|
);
|
|
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
|
|
|
|
if(select_mode) {
|
|
|
|
|
if(select_mode==SELECTED) {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rect[c][i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
} else {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rect[c][i].sel |= select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtemprect(gc[SELLAYER], ADD, xctx->rect[c][i].x1, xctx->rect[c][i].y1,
|
|
|
|
|
xctx->rect[c][i].x2, xctx->rect[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
} else {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->rect[c][i].sel = 0;
|
|
|
|
|
drawtemprect(gctiled, NOW, xctx->rect[c][i].x1, xctx->rect[c][i].y1,
|
|
|
|
|
xctx->rect[c][i].x2, xctx->rect[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
if( xctx->rect[c][i].sel == (SELECTED1|SELECTED2|SELECTED3|SELECTED4)) xctx->rect[c][i].sel = SELECTED;
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void select_arc(int c, int i, unsigned short select_mode, int fast)
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
if(!fast)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->rect[c][i].prop_ptr!=NULL?xctx->rect[c][i].prop_ptr:"<NULL>",S(s));
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "selected arc : layer=%d, n=%d properties: %s",c-4,i,s);
|
|
|
|
|
statusmsg(str,2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g r = %.16g a = %.16g b = %.16g",
|
2020-10-15 17:39:21 +02:00
|
|
|
i, xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b);
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
|
|
|
|
if(select_mode) {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->arc[c][i].sel = select_mode;
|
|
|
|
|
drawtemparc(gc[SELLAYER], ADD, xctx->arc[c][i].x, xctx->arc[c][i].y,
|
|
|
|
|
xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b);
|
2020-08-08 15:47:34 +02:00
|
|
|
} else {
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->arc[c][i].sel = 0;
|
|
|
|
|
drawtemparc(gctiled, NOW, xctx->arc[c][i].x, xctx->arc[c][i].y,
|
|
|
|
|
xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
/*if( xctx->arc[c][i].sel == (SELECTED1|SELECTED2|SELECTED3|SELECTED4)) xctx->arc[c][i].sel = SELECTED; */
|
2020-08-08 15:47:34 +02:00
|
|
|
|
|
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_connected_nets(void)
|
|
|
|
|
{
|
|
|
|
|
int i, n;
|
|
|
|
|
char *str = NULL;
|
|
|
|
|
prepare_netlist_structs(0);
|
|
|
|
|
rebuild_selected_array();
|
|
|
|
|
for(i=0;i<lastselected;i++)
|
|
|
|
|
{
|
|
|
|
|
n = selectedgroup[i].n;
|
|
|
|
|
switch(selectedgroup[i].type)
|
|
|
|
|
{
|
|
|
|
|
case WIRE:
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->wire[n].sel==SELECTED) {
|
|
|
|
|
my_strdup(62, &str ,get_tok_value(xctx->wire[n].prop_ptr, "lab",0));
|
2020-08-08 15:47:34 +02:00
|
|
|
if(str && str[0]) {
|
|
|
|
|
search("lab", str,1, 1, NOW);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ELEMENT:
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->inst[n].sel==SELECTED) {
|
|
|
|
|
my_strdup(63, &str, get_tok_value(xctx->inst[n].prop_ptr, "lab",0));
|
2020-08-08 15:47:34 +02:00
|
|
|
if(str && str[0]) {
|
|
|
|
|
search("lab", str,1, 1, NOW);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
my_free(943, &str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_polygon(int c, int i, unsigned short select_mode, int fast )
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
if(!fast)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->poly[c][i].prop_ptr!=NULL?xctx->poly[c][i].prop_ptr:"<NULL>",S(s));
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "selected polygon: layer=%d, n=%d properties: %s",c-4,i,s);
|
|
|
|
|
statusmsg(str,2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
my_snprintf(str, S(str), "n=%4d x0 = %.16g y0 = %.16g ...", i, xctx->poly[c][i].x[0], xctx->poly[c][i].y[0]);
|
2020-08-08 15:47:34 +02:00
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->poly[c][i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
if(select_mode) {
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtemppolygon(gc[SELLAYER], NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtemppolygon(gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points);
|
2020-08-08 15:47:34 +02:00
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_line(int c, int i, unsigned short select_mode, int fast )
|
|
|
|
|
{
|
|
|
|
|
char str[1024]; /* overflow safe */
|
|
|
|
|
char s[256]; /* overflow safe */
|
|
|
|
|
if(!fast)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
my_strncpy(s,xctx->line[c][i].prop_ptr!=NULL?xctx->line[c][i].prop_ptr:"<NULL>",S(s));
|
2020-08-08 15:47:34 +02:00
|
|
|
my_snprintf(str, S(str), "selected line: layer=%d, n=%d properties: %s",c-4,i,s);
|
|
|
|
|
statusmsg(str,2);
|
2020-10-12 13:13:31 +02:00
|
|
|
|
|
|
|
|
my_snprintf(str, S(str), "n=%4d x = %.16g y = %.16g w = %.16g h = %.16g",
|
2020-10-15 17:39:21 +02:00
|
|
|
i, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2-xctx->line[c][i].x1, xctx->line[c][i].y2-xctx->line[c][i].y1
|
2020-08-08 15:47:34 +02:00
|
|
|
);
|
|
|
|
|
statusmsg(str,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if( ((xctx->line[c][i].sel|select_mode) == (SELECTED1|SELECTED2)) ||
|
|
|
|
|
((xctx->line[c][i].sel == SELECTED) && select_mode) )
|
|
|
|
|
xctx->line[c][i].sel = SELECTED;
|
2020-10-12 13:13:31 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->line[c][i].sel = select_mode;
|
2020-08-08 15:47:34 +02:00
|
|
|
if(select_mode) {
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].bus)
|
|
|
|
|
drawtempline(gc[SELLAYER], THICK, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-09-07 13:12:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gc[SELLAYER], ADD, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->line[c][i].bus)
|
|
|
|
|
drawtempline(gctiled, THICK, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-09-07 13:12:34 +02:00
|
|
|
else
|
2020-10-15 17:39:21 +02:00
|
|
|
drawtempline(gctiled, NOW, xctx->line[c][i].x1, xctx->line[c][i].y1,
|
|
|
|
|
xctx->line[c][i].x2, xctx->line[c][i].y2);
|
2020-08-08 15:47:34 +02:00
|
|
|
need_rebuild_selected_array=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 20160503 return type field */
|
|
|
|
|
unsigned short select_object(double mousex,double mousey, unsigned short select_mode, int override_lock)
|
|
|
|
|
{
|
|
|
|
|
Selected sel;
|
|
|
|
|
sel = find_closest_obj(mousex,mousey);
|
|
|
|
|
|
|
|
|
|
dbg(1, "select_object(): sel.n=%d, sel.col=%d, sel.type=%d\n", sel.n, sel.col, sel.type);
|
|
|
|
|
|
|
|
|
|
switch(sel.type)
|
|
|
|
|
{
|
|
|
|
|
case WIRE:
|
|
|
|
|
select_wire(sel.n, select_mode, 0);
|
|
|
|
|
break;
|
|
|
|
|
case xTEXT:
|
|
|
|
|
select_text(sel.n, select_mode, 0);
|
|
|
|
|
break;
|
|
|
|
|
case LINE:
|
|
|
|
|
select_line(sel.col, sel.n, select_mode,0);
|
|
|
|
|
break;
|
|
|
|
|
case POLYGON:
|
|
|
|
|
select_polygon(sel.col, sel.n, select_mode,0);
|
|
|
|
|
break;
|
|
|
|
|
case xRECT:
|
|
|
|
|
select_box(sel.col,sel.n, select_mode,0);
|
|
|
|
|
break;
|
|
|
|
|
case ARC:
|
|
|
|
|
select_arc(sel.col,sel.n, select_mode,0);
|
|
|
|
|
break;
|
|
|
|
|
case ELEMENT:
|
|
|
|
|
select_element(sel.n,select_mode,0, override_lock);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
} /*end switch */
|
|
|
|
|
|
|
|
|
|
drawtemparc(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0);
|
2020-10-12 13:13:31 +02:00
|
|
|
drawtemprect(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
2020-08-08 15:47:34 +02:00
|
|
|
drawtempline(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
|
|
|
|
|
if(sel.type) ui_state |= SELECTION;
|
|
|
|
|
return sel.type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_inside(double x1,double y1, double x2, double y2, int sel) /* 20150927 added unselect (sel param) */
|
|
|
|
|
{
|
|
|
|
|
int c,i;
|
|
|
|
|
double x, y, r, a, b, xa, ya, xb, yb; /* arc */
|
2020-10-12 13:13:31 +02:00
|
|
|
xRect tmp;
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
|
|
|
|
int customfont;
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->wires;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(RECTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2))
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
sel ? select_wire(i,SELECTED, 1): select_wire(i,0, 1);
|
2020-10-12 13:13:31 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_wire(i,SELECTED1, 1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_wire(i,SELECTED2, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->texts;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
rot = xctx->text[i].rot;
|
|
|
|
|
flip = xctx->text[i].flip;
|
2020-08-08 15:47:34 +02:00
|
|
|
#ifdef HAS_CAIRO
|
2020-10-15 17:39:21 +02:00
|
|
|
customfont = set_text_custom_font(&xctx->text[i]);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
2020-10-15 17:39:21 +02:00
|
|
|
text_bbox(xctx->text[i].txt_ptr,
|
|
|
|
|
xctx->text[i].xscale, xctx->text[i].yscale, rot, flip, xctx->text[i].hcenter, xctx->text[i].vcenter,
|
|
|
|
|
xctx->text[i].x0, xctx->text[i].y0,
|
2020-08-08 15:47:34 +02:00
|
|
|
&xx1,&yy1, &xx2,&yy2);
|
|
|
|
|
#ifdef HAS_CAIRO
|
2020-10-04 23:55:43 +02:00
|
|
|
if(customfont) cairo_restore(cairo_ctx);
|
2020-08-08 15:47:34 +02:00
|
|
|
#endif
|
|
|
|
|
if(RECTINSIDE(xx1,yy1, xx2, yy2,x1,y1,x2,y2))
|
|
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
sel ? select_text(i, SELECTED, 1): select_text(i, 0, 1);
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->instances;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(RECTINSIDE(xctx->inst[i].xx1, xctx->inst[i].yy1, xctx->inst[i].xx2, xctx->inst[i].yy2, x1,y1,x2,y2))
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
sel ? select_element(i,SELECTED,1, 0): select_element(i,0,1, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for(c=0;c<cadlayers;c++)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->polygons[c]; i++) {
|
2020-08-08 15:47:34 +02:00
|
|
|
int k, selected_points, flag;
|
|
|
|
|
|
2020-10-15 17:39:21 +02:00
|
|
|
polygon_bbox(xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, &xa, &ya, &xb, &yb);
|
2020-08-08 15:47:34 +02:00
|
|
|
if(OUTSIDE(xa, ya, xb, yb, x1, y1, x2, y2)) continue;
|
|
|
|
|
selected_points = 0;
|
|
|
|
|
flag=0;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(k=0; k<xctx->poly[c][i].points; k++) {
|
|
|
|
|
if(xctx->poly[c][i].sel==SELECTED) xctx->poly[c][i].selected_point[k] = 1;
|
|
|
|
|
if( POINTINSIDE(xctx->poly[c][i].x[k],xctx->poly[c][i].y[k], x1,y1,x2,y2)) {
|
2020-08-08 15:47:34 +02:00
|
|
|
flag=1;
|
2020-10-15 17:39:21 +02:00
|
|
|
xctx->poly[c][i].selected_point[k] = sel;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if(xctx->poly[c][i].selected_point[k]) selected_points++;
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
if(flag) {
|
|
|
|
|
if(selected_points==0) {
|
|
|
|
|
select_polygon(c, i, 0, 1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if(selected_points==xctx->poly[c][i].points) {
|
2020-08-08 15:47:34 +02:00
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_polygon(c, i, SELECTED, 1);
|
|
|
|
|
} else if(selected_points) {
|
2020-10-12 13:13:31 +02:00
|
|
|
if(sel && enable_stretch) select_polygon(c, i, SELECTED1,1); /* for polygon, SELECTED1 means partial sel */
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->lines[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(RECTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1,xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2))
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
sel? select_line(c,i,SELECTED,1): select_line(c,i,0,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
select_line(c, i,SELECTED1,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_line(c, i,SELECTED2,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->arcs[c];i++) {
|
|
|
|
|
x = xctx->arc[c][i].x;
|
|
|
|
|
y = xctx->arc[c][i].y;
|
|
|
|
|
a = xctx->arc[c][i].a;
|
|
|
|
|
b = xctx->arc[c][i].b;
|
|
|
|
|
r = xctx->arc[c][i].r;
|
2020-08-08 15:47:34 +02:00
|
|
|
xa = x + r * cos(a * XSCH_PI/180.);
|
|
|
|
|
ya = y - r * sin(a * XSCH_PI/180.);
|
|
|
|
|
xb = x + r * cos((a+b) * XSCH_PI/180.);
|
|
|
|
|
yb = y - r * sin((a+b) * XSCH_PI/180.);
|
|
|
|
|
arc_bbox(x, y, r, a, b, &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2);
|
|
|
|
|
if(RECTINSIDE(tmp.x1, tmp.y1, tmp.x2, tmp.y2, x1,y1,x2,y2)) {
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
sel? select_arc(c, i, SELECTED,1): select_arc(c, i, 0,1);
|
|
|
|
|
}
|
|
|
|
|
else if( sel && enable_stretch && POINTINSIDE(x, y, x1, y1, x2, y2) )
|
|
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
select_arc(c, i,SELECTED1,1);
|
|
|
|
|
}
|
|
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xb, yb, x1, y1, x2, y2) )
|
|
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
select_arc(c, i,SELECTED3,1);
|
|
|
|
|
}
|
|
|
|
|
else if( sel && enable_stretch && POINTINSIDE(xa, ya, x1, y1, x2, y2) )
|
|
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
select_arc(c, i,SELECTED2,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->rects[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
if(RECTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y1,xctx->rect[c][i].x2,xctx->rect[c][i].y2, x1,y1,x2,y2))
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION; /* set ui_state to SELECTION also if unselecting by area ???? */
|
|
|
|
|
sel? select_box(c,i, SELECTED, 1): select_box(c,i, 0, 1);
|
|
|
|
|
}
|
2020-10-12 13:13:31 +02:00
|
|
|
else {
|
2020-10-15 17:39:21 +02:00
|
|
|
if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y1, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{ /*20070302 added stretch select */
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_box(c, i,SELECTED1,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y1, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_box(c, i,SELECTED2,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y2, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_box(c, i,SELECTED3,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y2, x1,y1,x2,y2) )
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
ui_state |= SELECTION;
|
|
|
|
|
select_box(c, i,SELECTED4,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} /* end for i */
|
|
|
|
|
} /* end for c */
|
2020-10-12 13:13:31 +02:00
|
|
|
drawtemparc(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
drawtemprect(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
2020-08-08 15:47:34 +02:00
|
|
|
drawtempline(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void select_all(void)
|
|
|
|
|
{
|
|
|
|
|
int c,i;
|
|
|
|
|
|
|
|
|
|
ui_state |= SELECTION;
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->wires;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_wire(i,SELECTED, 1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->texts;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_text(i, SELECTED, 1);
|
2020-10-12 13:13:31 +02:00
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->instances;i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_element(i,SELECTED,1, 0);
|
|
|
|
|
}
|
|
|
|
|
for(c=0;c<cadlayers;c++)
|
|
|
|
|
{
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->polygons[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_polygon(c,i,SELECTED,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->lines[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_line(c,i,SELECTED,1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->arcs[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_arc(c,i, SELECTED, 1);
|
|
|
|
|
}
|
2020-10-15 17:39:21 +02:00
|
|
|
for(i=0;i<xctx->rects[c];i++)
|
2020-08-08 15:47:34 +02:00
|
|
|
{
|
|
|
|
|
select_box(c,i, SELECTED, 1);
|
|
|
|
|
}
|
|
|
|
|
} /* end for c */
|
2020-10-12 13:13:31 +02:00
|
|
|
drawtemparc(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
drawtemprect(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
2020-08-08 15:47:34 +02:00
|
|
|
drawtempline(gc[SELLAYER], END, 0.0, 0.0, 0.0, 0.0);
|
2020-10-03 04:33:52 +02:00
|
|
|
rebuild_selected_array();
|
2020-08-08 15:47:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|