diff ueda/uschem-print/decor.c @ 0:cd92449fdb51

initial import of ueda and ifctf-part-lib from ifctfvax CVS
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 20 Jul 2015 00:24:37 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ueda/uschem-print/decor.c	Mon Jul 20 00:24:37 2015 +0000
@@ -0,0 +1,172 @@
+/*
+ * Printing object decorations
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <strings.h>
+#include "../libueda/mcl.h"
+#include "../libuschem/schemstruct.h"
+#include "../libuschem/graphsym.h"
+
+extern char *get_comp_attr();
+extern struct graphsym_pininst *find_comp_pininst();
+
+extern struct schem *schem_being_printed;
+
+extern char *gschem_text_halign[9];
+extern char *gschem_text_valign[9];
+
+static int decor_font_ptsize;
+
+char *
+pull_attr_from_obj(obj, attrname)
+	register struct schemobj *obj;
+	register char *attrname;
+{
+	register struct decoration *decor;
+
+	if (obj->obj_type == OBJTYPE_COMPINST) {
+		if (!strcmp(attrname, "refdes"))
+			return(obj->compobj_mclcomp->name);
+		if (!strcmp(attrname, "instname"))
+			return(obj->compobj_instname);
+	}
+	for (decor = obj->obj_decorations; decor; decor = decor->decor_next)
+		if (decor->decor_type == DECOR_TYPE_ATTR &&
+		    !strcmp(decor->decorattr_name, attrname))
+			return(decor->decorattr_value);
+	if (obj->obj_type == OBJTYPE_COMPINST)
+		return(get_comp_attr(obj->compobj_mclcomp, attrname));
+	else
+		return(NULL);
+}
+
+reset_decor_font()
+{
+	decor_font_ptsize = 0;
+}
+
+print_obj_decors(obj)
+	struct schemobj *obj;
+{
+	register struct decoration *decor;
+	register char *dispval;
+
+	for (decor = obj->obj_decorations; decor; decor = decor->decor_next)
+	switch (decor->decor_type) {
+	case DECOR_TYPE_DISPLAYATTR:
+		dispval = pull_attr_from_obj(obj, decor->decordisp_attr);
+		if (dispval)
+			print_textdisp_decor(decor, dispval);
+		else
+			fprintf(stderr,
+			"%s: line %d: DisplayAttr: attribute %s unknown\n",
+				schem_being_printed->orig_filename,
+				decor->decor_lineno, decor->decordisp_attr);
+		continue;
+	case DECOR_TYPE_DISPLAYNETNAME:
+		if (obj->obj_type != OBJTYPE_GRAPHNET) {
+			fprintf(stderr,
+	"%s: line %d: DisplayNetName invalid in objects other than GraphNet\n",
+				schem_being_printed->orig_filename,
+				decor->decor_lineno);
+			continue;
+		}
+		dispval = obj->netobj_netname;
+		if (dispval)
+			print_textdisp_decor(decor, dispval);
+		else
+			fprintf(stderr,
+			"%s: line %d: DisplayNetName on an unnamed GraphNet\n",
+				schem_being_printed->orig_filename,
+				decor->decor_lineno);
+		continue;
+	case DECOR_TYPE_SYMONPIN:
+		if (obj->obj_type != OBJTYPE_COMPINST) {
+			fprintf(stderr,
+	"%s: line %d: SymOnPin invalid in objects other than components\n",
+				schem_being_printed->orig_filename,
+				decor->decor_lineno);
+			continue;
+		}
+		print_symonpin(obj, decor);
+		continue;
+	case DECOR_TYPE_GRAPHBLOCK:
+		print_graphblock(decor->decorgraph_body);
+		continue;
+	}
+}
+
+print_textdisp_decor(decor, dispval)
+	register struct decoration *decor;
+	char *dispval;
+{
+	if (decor->decordisp_alignment < 0 || decor->decordisp_alignment > 8) {
+		fprintf(stderr,
+		"%s: line %d: display decoration: alignment %d is invalid\n",
+			schem_being_printed->orig_filename,
+			decor->decor_lineno, decor->decordisp_alignment);
+		return;
+	}
+	if (decor_font_ptsize != decor->decordisp_ptsize) {
+		decor_font_ptsize = decor->decordisp_ptsize;
+		printf("/Helvetica %d selisofnt\n", decor_font_ptsize);
+	}
+	emit_ps_string(dispval);
+	printf(" %s %s %d %d %d Tshow\n",
+		gschem_text_halign[decor->decordisp_alignment],
+		gschem_text_valign[decor->decordisp_alignment],
+		decor->decordisp_rotate,
+		decor->decordisp_x, decor->decordisp_y);
+}
+
+print_symonpin(comp, symdec)
+	struct schemobj *comp;
+	struct decoration *symdec;
+{
+	struct graphsym *sop_gs;
+	register struct graphsym_pindef *sop_pindef;
+	register char *soughtpin;
+	int bynum;
+	register struct graphsym_pininst *hostpin;
+	struct schemobj fakeobj;
+
+	sop_gs = symdec->decorpinsym_gs;
+	if (sop_gs->gs_npins > 1) {
+		fprintf(stderr,
+		"%s: line %d: SymOnPin symbols may not have more than 1 pin\n",
+			schem_being_printed->orig_filename,
+			symdec->decor_lineno);
+		return;
+	}
+	sop_pindef = sop_gs->gs_pins;
+	soughtpin = symdec->decorpinsym_pin;
+	if (soughtpin[0] == '#') {
+		bynum = 1;
+		soughtpin++;
+	} else
+		bynum = 0;
+	hostpin = find_comp_pininst(comp, soughtpin, bynum);
+	if (!hostpin) {
+		fprintf(stderr, "%s: line %d: SymOnPin: %s pin %s not found\n",
+			schem_being_printed->orig_filename,
+			symdec->decor_lineno, comp->compobj_instname,
+			symdec->decorpinsym_pin);
+		return;
+	}
+	/* everything located, do it */
+	bzero(&fakeobj, sizeof fakeobj);
+	fakeobj.obj_type = OBJTYPE_GRAPHSYM;
+	fakeobj.obj_lineno = symdec->decor_lineno;
+	fakeobj.compobj_graphsym = sop_gs;
+	fakeobj.compobj_x = -sop_pindef->gspd_x;
+	fakeobj.compobj_y = -sop_pindef->gspd_y;
+	if (symdec->decorpinsym_mirror) {
+		fakeobj.compobj_mirror = 1;
+		fakeobj.compobj_x = -fakeobj.compobj_x;
+	}
+	fakeobj.compobj_x += hostpin->x;
+	fakeobj.compobj_y += hostpin->y;
+	print_graph_compinst(&fakeobj);
+}