Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / yagle / xyagle / XYA_object.c
1 /*------------------------------------------------------------\
2 | |
3 | Tool : XYAG |
4 | |
5 | File : Object.c |
6 | |
7 | Authors : Jacomme Ludovic |
8 | Lester Anthony |
9 | |
10 \------------------------------------------------------------*/
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <math.h>
15 #include <signal.h>
16 #include <string.h>
17 #include <setjmp.h>
18
19 #include MUT_H
20 #include SLB_H
21 #include BEH_H
22 #include MLO_H
23 #include CGV_H
24 #include CNS_H
25 #include XSB_H
26 #include XYA_H
27
28 #include "XYA_place.h"
29 #include "XYA_object.h"
30 #include "XYA_cgvfig.h"
31 #include "XME_beh.h"
32 #include "XYA_error.h"
33
34 xyagfig_list *XyagFigure = NULL;
35
36 /*------------------------------------------------------------\
37 | Alloc Functions |
38 \------------------------------------------------------------*/
39
40 xyagfig_list *
41 XyagAllocFigure()
42 {
43 xyagfig_list *figure;
44 int i;
45
46 figure = (xyagfig_list *)mbkalloc(sizeof(xyagfig_list));
47 figure->NEXT = NULL;
48 figure->NAME = NULL;
49 for (i=0; i<XYAG_MAX_LAYER; i++) {
50 figure->OBJECT[i] = NULL;
51 }
52 return figure;
53 }
54
55 xyagobj_list *
56 XyagAllocObject()
57 {
58 xyagobj_list *object;
59
60 object = (xyagobj_list *)mbkalloc(sizeof(xyagobj_list));
61 object->NEXT = NULL;
62 object->LINK = NULL;
63 object->NAME = NULL;
64 object->LAYER = 0;
65 object->TYPE = 0;
66 object->X = 0;
67 object->Y = 0;
68 object->DX = 0;
69 object->DY = 0;
70 object->USER = NULL;
71 return object;
72 }
73
74 /*------------------------------------------------------------\
75 | Free Functions |
76 \------------------------------------------------------------*/
77
78 void
79 XyagFreeFigure(Figure)
80 xyagfig_list *Figure;
81 {
82 mbkfree(Figure);
83 }
84
85 void
86 XyagFreeObject(Object)
87 xyagobj_list *Object;
88 {
89 mbkfree(Object);
90 }
91
92 /*------------------------------------------------------------\
93 | XyagAddCircle |
94 \------------------------------------------------------------*/
95
96 xyagobj_list *
97 XyagAddCircle(X, Y, R, Layer)
98 long X;
99 long Y;
100 long R;
101 short Layer;
102 {
103 xyagobj_list *Object;
104
105 Object = XyagAllocObject();
106 Object->TYPE = XYAG_OBJECT_CIRCLE;
107 Object->LAYER = Layer;
108 Object->NEXT = XyagFigure->OBJECT[Layer];
109 Object->X = X - R;
110 Object->Y = Y - R;
111 Object->DX = (R << 1);
112 Object->DY = (R << 1);
113
114 XyagFigure->OBJECT[Layer] = Object;
115 return (Object);
116 }
117
118 /*------------------------------------------------------------\
119 | XyagAddLine |
120 \------------------------------------------------------------*/
121
122 xyagobj_list *
123 XyagAddLine(X1, Y1, X2, Y2, LayerFrom, LayerTo)
124 long X1;
125 long Y1;
126 long X2;
127 long Y2;
128 short LayerFrom;
129 short LayerTo;
130 {
131 xyagobj_list *Object;
132
133 Object = XyagAllocObject();
134 Object->LAYER = LayerFrom;
135 Object->TYPE = XYAG_OBJECT_LINE;
136 Object->NEXT = XyagFigure->OBJECT[LayerTo];
137
138 if (X1 > X2) {
139 SetXyagLineLeft(Object);
140
141 Object->X = X2;
142 Object->DX = X1 - X2;
143 }
144 else {
145 Object->X = X1;
146 Object->DX = X2 - X1;
147 }
148
149 if (Y1 > Y2) {
150 SetXyagLineDown(Object);
151
152 Object->Y = Y2;
153 Object->DY = Y1 - Y2;
154 }
155 else {
156 Object->Y = Y1;
157 Object->DY = Y2 - Y1;
158 }
159
160 XyagFigure->OBJECT[LayerTo] = Object;
161
162 return (Object);
163 }
164
165 /*------------------------------------------------------------\
166 | XyagAddArrow |
167 \------------------------------------------------------------*/
168
169 xyagobj_list *
170 XyagAddArrow(X1, Y1, X2, Y2, LayerFrom, LayerTo)
171 long X1;
172 long Y1;
173 long X2;
174 long Y2;
175 short LayerFrom;
176 short LayerTo;
177 {
178 xyagobj_list *Object;
179
180 Object = XyagAllocObject();
181 Object->LAYER = LayerFrom;
182 Object->TYPE = XYAG_OBJECT_ARROW;
183 Object->NEXT = XyagFigure->OBJECT[LayerTo];
184
185 if (X1 > X2) {
186 SetXyagLineLeft(Object);
187
188 Object->X = X2;
189 Object->DX = X1 - X2;
190 }
191 else {
192 Object->X = X1;
193 Object->DX = X2 - X1;
194 }
195
196 if (Y1 > Y2) {
197 SetXyagLineDown(Object);
198
199 Object->Y = Y2;
200 Object->DY = Y1 - Y2;
201 }
202 else {
203 Object->Y = Y1;
204 Object->DY = Y2 - Y1;
205 }
206
207 XyagFigure->OBJECT[LayerTo] = Object;
208
209 return (Object);
210 }
211
212 /*------------------------------------------------------------\
213 | XyagAddUserDefined |
214 \------------------------------------------------------------*/
215
216 xyagobj_list *
217 XyagAddUserDefined(ptmotif,X, Y, DX, DY, Layer)
218 symbol_list *ptmotif;
219 long X;
220 long Y;
221 long DX;
222 long DY;
223 short Layer;
224 {
225 xyagobj_list *Object;
226
227 Object = XyagAllocObject();
228 Object->TYPE = XYAG_OBJECT_SLIB;
229 Object->LAYER = Layer;
230 Object->NEXT = XyagFigure->OBJECT[Layer];
231 Object->X = X;
232 Object->Y = Y;
233 Object->DX = DX;
234 Object->DY = DY;
235 Object->SYMBOL = ptmotif;
236
237 XyagFigure->OBJECT[Layer] = Object;
238
239 return (Object);
240 }
241
242 /*------------------------------------------------------------\
243 | XyagAddTriangle |
244 \------------------------------------------------------------*/
245
246 xyagobj_list *
247 XyagAddTriangle(X, Y, DX, DY, Layer)
248 long X;
249 long Y;
250 long DX;
251 long DY;
252 short Layer;
253 {
254 xyagobj_list *Object;
255
256 Object = XyagAllocObject();
257 Object->TYPE = XYAG_OBJECT_TRIANGLE;
258 Object->LAYER = Layer;
259 Object->NEXT = XyagFigure->OBJECT[Layer];
260 Object->X = X;
261 Object->Y = Y;
262 Object->DX = DX;
263 Object->DY = DY;
264
265 XyagFigure->OBJECT[Layer] = Object;
266 return (Object);
267 }
268
269 /*------------------------------------------------------------\
270 | XyagAddCell |
271 \------------------------------------------------------------*/
272
273 xyagobj_list *
274 XyagAddCell(X, Y, DX, DY, Layer)
275 long X;
276 long Y;
277 long DX;
278 long DY;
279 short Layer;
280 {
281 xyagobj_list *Object;
282
283 Object = XyagAllocObject();
284 Object->TYPE = XYAG_OBJECT_CELL;
285 Object->LAYER = Layer;
286 Object->NEXT = XyagFigure->OBJECT[Layer];
287 Object->X = X;
288 Object->Y = Y;
289 Object->DX = DX;
290 Object->DY = DY;
291
292 XyagFigure->OBJECT[Layer] = Object;
293
294 return (Object);
295 }
296
297
298 /*------------------------------------------------------------\
299 | XyagAddRectangle |
300 \------------------------------------------------------------*/
301
302 xyagobj_list *
303 XyagAddRectangle(X, Y, DX, DY, Layer)
304 long X;
305 long Y;
306 long DX;
307 long DY;
308 short Layer;
309 {
310 xyagobj_list *Object;
311
312 Object = XyagAllocObject();
313 Object->TYPE = XYAG_OBJECT_RECTANGLE;
314 Object->LAYER = Layer;
315 Object->NEXT = XyagFigure->OBJECT[Layer];
316 Object->X = X;
317 Object->Y = Y;
318 Object->DX = DX;
319 Object->DY = DY;
320
321 XyagFigure->OBJECT[Layer] = Object;
322
323 return (Object);
324 }
325
326 /*------------------------------------------------------------\
327 | XyagAddText |
328 \------------------------------------------------------------*/
329
330 xyagobj_list *
331 XyagAddText(X, Y, Type, Name, Layer, scale)
332 long X;
333 long Y;
334 long Type;
335 char *Name;
336 short Layer;
337 long scale;
338 {
339 xyagobj_list *Object;
340 long Width;
341
342 Width = strlen(Name) * scale * XYAG_UNIT * 2 / 3;
343
344 if (Type == XYAG_OBJECT_TEXT_CENTER) {
345 X = X - (Width >> 1);
346 }
347
348 if (Type == XYAG_OBJECT_TEXT_LEFT) {
349 X = X - Width;
350 }
351
352 Object = XyagAllocObject();
353 Object->LAYER = Layer;
354 Object->TYPE = Type;
355 Object->NEXT = XyagFigure->OBJECT[Layer];
356 Object->NAME = namealloc(Name);
357 Object->X = X;
358 Object->Y = Y;
359 Object->DX = Width;
360
361
362 XyagFigure->OBJECT[Layer] = Object;
363
364 return (Object);
365 }
366
367 /*------------------------------------------------------------\
368 | XyagAddHexagon |
369 \------------------------------------------------------------*/
370
371 xyagobj_list *
372 XyagAddHexagon(X, Y, DX, DY, Layer)
373 long X;
374 long Y;
375 long DX;
376 long DY;
377 short Layer;
378 {
379 xyagobj_list *Object;
380
381 Object = XyagAllocObject();
382 Object->TYPE = XYAG_OBJECT_HEXAGON;
383 Object->LAYER = Layer;
384 Object->NEXT = XyagFigure->OBJECT[Layer];
385 Object->X = X;
386 Object->Y = Y;
387 Object->DX = DX;
388 Object->DY = DY;
389
390 XyagFigure->OBJECT[Layer] = Object;
391
392 return (Object);
393 }
394
395 /*------------------------------------------------------------\
396 | XyagAddFigure |
397 \------------------------------------------------------------*/
398
399 xyagfig_list *
400 XyagAddFigure()
401 {
402 XyagFigure = XyagAllocFigure();
403 XyagFigure->NAME = XyagFigureCgv->NAME;
404
405 XyagFigureCgv->data2=XyagFigure;
406
407 XyagTraceFigure(XyagFigureCgv);
408
409 return (XyagFigure);
410 }
411
412 /*------------------------------------------------------------\
413 | XyagLoadFigure |
414 \------------------------------------------------------------*/
415
416 chain_list *OPEN_STACK=NULL;
417
418 void
419 XyagLoadFigure(char *FileName)
420 {
421 char *c;
422 char temp[200];
423 cgvfig_list *old=XyagFigureCgv;
424
425 strcpy(temp, FileName);
426 if ((c=mbkIsLofigExt(FileName,"cns"))!=NULL)
427 {
428 *c='\0';
429 XyagFigureCgv = Xyaggetcgvfig(FileName, CGV_FROM_CNS, temp);
430
431 if (XyagFigureCgv != NULL)
432 {
433 OPEN_STACK=addchain(OPEN_STACK, XyagFigureCgv);
434 if (CGV_WAS_PRESENT==0)
435 {
436 XyagAddFigure();
437 }
438
439 XyagEditBehBefig = Xyaggetbefig(FileName);
440 XyagCleanErrorMessage();
441 }
442 else
443 {
444 XyagFigureCgv=old;
445 DisplayMessage("Failed to open file !");
446 }
447
448 }
449 else
450 if ((c=mbkFileIsLofig(FileName))!=NULL)
451 {
452 char ext[50], savelo[10];
453 *c='\0';
454 strcpy(savelo, IN_LO);
455 strcpy(ext,c+1);
456 if ((c=strchr(ext,'.'))!=NULL) *c='\0';
457 strcpy(IN_LO, ext);
458 XyagFigureCgv = Xyaggetcgvfig(FileName, CGV_FROM_LOFIG, temp);
459 strcpy(IN_LO, savelo);
460 if (XyagFigureCgv != NULL)
461 {
462 OPEN_STACK=addchain(OPEN_STACK, XyagFigureCgv);
463 if (CGV_WAS_PRESENT==0)
464 {
465 XyagAddFigure();
466 }
467 }
468 else
469 {
470 XyagFigureCgv=old;
471 DisplayMessage("Failed to open file !");
472 }
473 }
474 else
475 DisplayMessage("Can not handle this file !");
476 }
477
478 int XyagLoadFigureByType(char *Name, int type, int silent)
479 {
480 cgvfig_list *old=XyagFigureCgv;
481 int bad=0;
482 switch(type)
483 {
484 case CGV_FROM_CNS:
485 XyagFigureCgv = Xyaggetcgvfig(Name, CGV_FROM_CNS, NULL);
486
487 if (XyagFigureCgv != NULL && CGV_WAS_PRESENT==0)
488 {
489 XyagAddFigure();
490 }
491 if (XyagFigureCgv != NULL)
492 {
493 XyagEditBehBefig = Xyaggetbefig(Name);
494 XyagCleanErrorMessage();
495 }
496
497 if (XyagFigureCgv==NULL)
498 {
499 XyagFigureCgv=old;
500 if (!silent) DisplayMessage("Failed to open file !");
501 bad=1;
502 }
503 else
504 OPEN_STACK=addchain(OPEN_STACK, XyagFigureCgv);
505 break;
506 case CGV_FROM_LOFIG:
507 {
508 XyagFigureCgv = Xyaggetcgvfig(Name, CGV_FROM_LOFIG, NULL);
509 if (XyagFigureCgv != NULL && CGV_WAS_PRESENT==0)
510 {
511 XyagAddFigure();
512 }
513
514 if (XyagFigureCgv==NULL)
515 {
516 XyagFigureCgv=old;
517 if (!silent) DisplayMessage("Failed to open file !");
518 bad=1;
519 }
520 else
521 OPEN_STACK=addchain(OPEN_STACK, XyagFigureCgv);
522 break;
523 }
524 default:
525 DisplayMessage("This file type is not handled !");
526 bad=1;
527 }
528 return bad;
529 }
530
531 void XyagGetCone(cone_list *cn)
532 {
533 XyagFigureCgv=getcgvfig_from_cone(cn);
534 if (CGV_WAS_PRESENT==0)
535 {
536 XyagAddFigure();
537 }
538 OPEN_STACK=addchain(OPEN_STACK, XyagFigureCgv);
539 }
540 /*------------------------------------------------------------\
541 | XyagDelFigure |
542 \------------------------------------------------------------*/
543
544 void
545 XyagDelFigure()
546 {
547 xyagobj_list *ScanObject;
548 xyagobj_list *DelObject;
549 short Layer;
550
551 if (XyagFigure == (xyagfig_list *) NULL) return;
552
553 for (Layer = 0; Layer < XYAG_MAX_LAYER; Layer++) {
554 ScanObject = XyagFigure->OBJECT[Layer];
555
556 while (ScanObject != (xyagobj_list *) NULL) {
557 DelObject = ScanObject;
558 ScanObject = ScanObject->NEXT;
559 XyagFreeObject(DelObject);
560 }
561 }
562
563 XyagFreeFigure(XyagFigure);
564 rmvcgvfig(XyagFigureCgv);
565 XyagFigure = NULL;
566 XyagFigureCgv = NULL;
567 }