1 /*------------------------------------------------------------\
7 | Authors : Jacomme Ludovic |
10 \------------------------------------------------------------*/
28 #include "XYA_place.h"
29 #include "XYA_object.h"
30 #include "XYA_cgvfig.h"
32 #include "XYA_error.h"
34 xyagfig_list
*XyagFigure
= NULL
;
36 /*------------------------------------------------------------\
38 \------------------------------------------------------------*/
46 figure
= (xyagfig_list
*)mbkalloc(sizeof(xyagfig_list
));
49 for (i
=0; i
<XYAG_MAX_LAYER
; i
++) {
50 figure
->OBJECT
[i
] = NULL
;
60 object
= (xyagobj_list
*)mbkalloc(sizeof(xyagobj_list
));
74 /*------------------------------------------------------------\
76 \------------------------------------------------------------*/
79 XyagFreeFigure(Figure
)
86 XyagFreeObject(Object
)
92 /*------------------------------------------------------------\
94 \------------------------------------------------------------*/
97 XyagAddCircle(X
, Y
, R
, Layer
)
103 xyagobj_list
*Object
;
105 Object
= XyagAllocObject();
106 Object
->TYPE
= XYAG_OBJECT_CIRCLE
;
107 Object
->LAYER
= Layer
;
108 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
111 Object
->DX
= (R
<< 1);
112 Object
->DY
= (R
<< 1);
114 XyagFigure
->OBJECT
[Layer
] = Object
;
118 /*------------------------------------------------------------\
120 \------------------------------------------------------------*/
123 XyagAddLine(X1
, Y1
, X2
, Y2
, LayerFrom
, LayerTo
)
131 xyagobj_list
*Object
;
133 Object
= XyagAllocObject();
134 Object
->LAYER
= LayerFrom
;
135 Object
->TYPE
= XYAG_OBJECT_LINE
;
136 Object
->NEXT
= XyagFigure
->OBJECT
[LayerTo
];
139 SetXyagLineLeft(Object
);
142 Object
->DX
= X1
- X2
;
146 Object
->DX
= X2
- X1
;
150 SetXyagLineDown(Object
);
153 Object
->DY
= Y1
- Y2
;
157 Object
->DY
= Y2
- Y1
;
160 XyagFigure
->OBJECT
[LayerTo
] = Object
;
165 /*------------------------------------------------------------\
167 \------------------------------------------------------------*/
170 XyagAddArrow(X1
, Y1
, X2
, Y2
, LayerFrom
, LayerTo
)
178 xyagobj_list
*Object
;
180 Object
= XyagAllocObject();
181 Object
->LAYER
= LayerFrom
;
182 Object
->TYPE
= XYAG_OBJECT_ARROW
;
183 Object
->NEXT
= XyagFigure
->OBJECT
[LayerTo
];
186 SetXyagLineLeft(Object
);
189 Object
->DX
= X1
- X2
;
193 Object
->DX
= X2
- X1
;
197 SetXyagLineDown(Object
);
200 Object
->DY
= Y1
- Y2
;
204 Object
->DY
= Y2
- Y1
;
207 XyagFigure
->OBJECT
[LayerTo
] = Object
;
212 /*------------------------------------------------------------\
213 | XyagAddUserDefined |
214 \------------------------------------------------------------*/
217 XyagAddUserDefined(ptmotif
,X
, Y
, DX
, DY
, Layer
)
218 symbol_list
*ptmotif
;
225 xyagobj_list
*Object
;
227 Object
= XyagAllocObject();
228 Object
->TYPE
= XYAG_OBJECT_SLIB
;
229 Object
->LAYER
= Layer
;
230 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
235 Object
->SYMBOL
= ptmotif
;
237 XyagFigure
->OBJECT
[Layer
] = Object
;
242 /*------------------------------------------------------------\
244 \------------------------------------------------------------*/
247 XyagAddTriangle(X
, Y
, DX
, DY
, Layer
)
254 xyagobj_list
*Object
;
256 Object
= XyagAllocObject();
257 Object
->TYPE
= XYAG_OBJECT_TRIANGLE
;
258 Object
->LAYER
= Layer
;
259 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
265 XyagFigure
->OBJECT
[Layer
] = Object
;
269 /*------------------------------------------------------------\
271 \------------------------------------------------------------*/
274 XyagAddCell(X
, Y
, DX
, DY
, Layer
)
281 xyagobj_list
*Object
;
283 Object
= XyagAllocObject();
284 Object
->TYPE
= XYAG_OBJECT_CELL
;
285 Object
->LAYER
= Layer
;
286 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
292 XyagFigure
->OBJECT
[Layer
] = Object
;
298 /*------------------------------------------------------------\
300 \------------------------------------------------------------*/
303 XyagAddRectangle(X
, Y
, DX
, DY
, Layer
)
310 xyagobj_list
*Object
;
312 Object
= XyagAllocObject();
313 Object
->TYPE
= XYAG_OBJECT_RECTANGLE
;
314 Object
->LAYER
= Layer
;
315 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
321 XyagFigure
->OBJECT
[Layer
] = Object
;
326 /*------------------------------------------------------------\
328 \------------------------------------------------------------*/
331 XyagAddText(X
, Y
, Type
, Name
, Layer
, scale
)
339 xyagobj_list
*Object
;
342 Width
= strlen(Name
) * scale
* XYAG_UNIT
* 2 / 3;
344 if (Type
== XYAG_OBJECT_TEXT_CENTER
) {
345 X
= X
- (Width
>> 1);
348 if (Type
== XYAG_OBJECT_TEXT_LEFT
) {
352 Object
= XyagAllocObject();
353 Object
->LAYER
= Layer
;
355 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
356 Object
->NAME
= namealloc(Name
);
362 XyagFigure
->OBJECT
[Layer
] = Object
;
367 /*------------------------------------------------------------\
369 \------------------------------------------------------------*/
372 XyagAddHexagon(X
, Y
, DX
, DY
, Layer
)
379 xyagobj_list
*Object
;
381 Object
= XyagAllocObject();
382 Object
->TYPE
= XYAG_OBJECT_HEXAGON
;
383 Object
->LAYER
= Layer
;
384 Object
->NEXT
= XyagFigure
->OBJECT
[Layer
];
390 XyagFigure
->OBJECT
[Layer
] = Object
;
395 /*------------------------------------------------------------\
397 \------------------------------------------------------------*/
402 XyagFigure
= XyagAllocFigure();
403 XyagFigure
->NAME
= XyagFigureCgv
->NAME
;
405 XyagFigureCgv
->data2
=XyagFigure
;
407 XyagTraceFigure(XyagFigureCgv
);
412 /*------------------------------------------------------------\
414 \------------------------------------------------------------*/
416 chain_list
*OPEN_STACK
=NULL
;
419 XyagLoadFigure(char *FileName
)
423 cgvfig_list
*old
=XyagFigureCgv
;
425 strcpy(temp
, FileName
);
426 if ((c
=mbkIsLofigExt(FileName
,"cns"))!=NULL
)
429 XyagFigureCgv
= Xyaggetcgvfig(FileName
, CGV_FROM_CNS
, temp
);
431 if (XyagFigureCgv
!= NULL
)
433 OPEN_STACK
=addchain(OPEN_STACK
, XyagFigureCgv
);
434 if (CGV_WAS_PRESENT
==0)
439 XyagEditBehBefig
= Xyaggetbefig(FileName
);
440 XyagCleanErrorMessage();
445 DisplayMessage("Failed to open file !");
450 if ((c
=mbkFileIsLofig(FileName
))!=NULL
)
452 char ext
[50], savelo
[10];
454 strcpy(savelo
, IN_LO
);
456 if ((c
=strchr(ext
,'.'))!=NULL
) *c
='\0';
458 XyagFigureCgv
= Xyaggetcgvfig(FileName
, CGV_FROM_LOFIG
, temp
);
459 strcpy(IN_LO
, savelo
);
460 if (XyagFigureCgv
!= NULL
)
462 OPEN_STACK
=addchain(OPEN_STACK
, XyagFigureCgv
);
463 if (CGV_WAS_PRESENT
==0)
471 DisplayMessage("Failed to open file !");
475 DisplayMessage("Can not handle this file !");
478 int XyagLoadFigureByType(char *Name
, int type
, int silent
)
480 cgvfig_list
*old
=XyagFigureCgv
;
485 XyagFigureCgv
= Xyaggetcgvfig(Name
, CGV_FROM_CNS
, NULL
);
487 if (XyagFigureCgv
!= NULL
&& CGV_WAS_PRESENT
==0)
491 if (XyagFigureCgv
!= NULL
)
493 XyagEditBehBefig
= Xyaggetbefig(Name
);
494 XyagCleanErrorMessage();
497 if (XyagFigureCgv
==NULL
)
500 if (!silent
) DisplayMessage("Failed to open file !");
504 OPEN_STACK
=addchain(OPEN_STACK
, XyagFigureCgv
);
508 XyagFigureCgv
= Xyaggetcgvfig(Name
, CGV_FROM_LOFIG
, NULL
);
509 if (XyagFigureCgv
!= NULL
&& CGV_WAS_PRESENT
==0)
514 if (XyagFigureCgv
==NULL
)
517 if (!silent
) DisplayMessage("Failed to open file !");
521 OPEN_STACK
=addchain(OPEN_STACK
, XyagFigureCgv
);
525 DisplayMessage("This file type is not handled !");
531 void XyagGetCone(cone_list
*cn
)
533 XyagFigureCgv
=getcgvfig_from_cone(cn
);
534 if (CGV_WAS_PRESENT
==0)
538 OPEN_STACK
=addchain(OPEN_STACK
, XyagFigureCgv
);
540 /*------------------------------------------------------------\
542 \------------------------------------------------------------*/
547 xyagobj_list
*ScanObject
;
548 xyagobj_list
*DelObject
;
551 if (XyagFigure
== (xyagfig_list
*) NULL
) return;
553 for (Layer
= 0; Layer
< XYAG_MAX_LAYER
; Layer
++) {
554 ScanObject
= XyagFigure
->OBJECT
[Layer
];
556 while (ScanObject
!= (xyagobj_list
*) NULL
) {
557 DelObject
= ScanObject
;
558 ScanObject
= ScanObject
->NEXT
;
559 XyagFreeObject(DelObject
);
563 XyagFreeFigure(XyagFigure
);
564 rmvcgvfig(XyagFigureCgv
);
566 XyagFigureCgv
= NULL
;