Index: trunk/src/libcschem/cnc_grp.c =================================================================== --- trunk/src/libcschem/cnc_grp.c (revision 11151) +++ trunk/src/libcschem/cnc_grp.c (revision 11152) @@ -69,6 +69,7 @@ if (strcmp(str, "terminal") == 0) return CSCH_ROLE_TERMINAL; if (strcmp(str, "wire-net") == 0) return CSCH_ROLE_WIRE_NET; if (strcmp(str, "junction") == 0) return CSCH_ROLE_JUNCTION; + if (strcmp(str, "extobj-gfx") == 0) return CSCH_ROLE_EXTOBJ_GFX; return CSCH_ROLE_invalid; } Index: trunk/src/libcschem/cnc_obj.c =================================================================== --- trunk/src/libcschem/cnc_obj.c (revision 11151) +++ trunk/src/libcschem/cnc_obj.c (revision 11152) @@ -43,6 +43,7 @@ case CSCH_ROLE_HUB_POINT: return CSCH_DSPLY_HUBTERM; case CSCH_ROLE_TERMINAL: return CSCH_DSPLY_HUBTERM; case CSCH_ROLE_SYMBOL: return CSCH_DSPLY_SYMBOL; + case CSCH_ROLE_EXTOBJ_GFX: return CSCH_DSPLY_SYMBOL; case CSCH_ROLE_WIRE_NET: return CSCH_DSPLY_WIRE; case CSCH_ROLE_JUNCTION: return CSCH_DSPLY_WIRE; case CSCH_ROLE_empty: return obj->type == CSCH_CTYPE_POLY ? CSCH_DSPLY_BACKGROUND : CSCH_DSPLY_DECORATION; /* top level user grouping */ Index: trunk/src/libcschem/cnc_obj.h =================================================================== --- trunk/src/libcschem/cnc_obj.h (revision 11151) +++ trunk/src/libcschem/cnc_obj.h (revision 11152) @@ -262,6 +262,7 @@ case CSCH_ROLE_BUS_TERMINAL: case CSCH_ROLE_HUB_POINT: case CSCH_ROLE_TERMINAL: + case CSCH_ROLE_EXTOBJ_GFX: return 1; case CSCH_ROLE_SYMBOL: return !sheet->loose_sym; Index: trunk/src/libcschem/compile.c =================================================================== --- trunk/src/libcschem/compile.c (revision 11151) +++ trunk/src/libcschem/compile.c (revision 11152) @@ -761,6 +761,7 @@ case CSCH_ROLE_BUS_TERMINAL: case CSCH_ROLE_HUB_POINT: case CSCH_ROLE_JUNCTION: + case CSCH_ROLE_EXTOBJ_GFX: break; } } Index: trunk/src/libcschem/concrete.h =================================================================== --- trunk/src/libcschem/concrete.h (revision 11151) +++ trunk/src/libcschem/concrete.h (revision 11152) @@ -110,7 +110,10 @@ CSCH_ROLE_SYMBOL, CSCH_ROLE_TERMINAL, CSCH_ROLE_WIRE_NET, - CSCH_ROLE_JUNCTION + CSCH_ROLE_JUNCTION, + + /* extensions: not in the data model */ + CSCH_ROLE_EXTOBJ_GFX } csch_role_t; typedef struct csch_comm_str_s { Index: trunk/src/libcschem/extobj.c =================================================================== --- trunk/src/libcschem/extobj.c (revision 11151) +++ trunk/src/libcschem/extobj.c (revision 11152) @@ -31,6 +31,8 @@ #include #include +#include "cnc_grp.h" + #include "extobj.h" /* persistent copy of impl; both key and value are allocated; on unregister @@ -98,7 +100,37 @@ return i; } +csch_cgrp_t *csch_extobj_gfx_lookup(csch_cgrp_t *grp) +{ + htip_entry_t *e; + for(e = htip_first(&grp->id2obj); e != NULL; e = htip_next(&grp->id2obj, e)) { + csch_cgrp_t *gfx = (csch_cgrp_t *)e->value; + if (csch_obj_is_grp(&gfx->hdr) && (gfx->role == CSCH_ROLE_EXTOBJ_GFX)) + return gfx; + } + + return NULL; +} + +csch_cgrp_t *csch_extobj_gfx_clear(csch_sheet_t *sheet, csch_cgrp_t *grp) +{ + csch_cgrp_t *gfx = csch_extobj_gfx_lookup(grp); + + if (gfx == NULL) { /* create new empty */ + csch_source_arg_t *src = csch_attrib_src_c(NULL, 0, 0, NULL); + gfx = csch_cgrp_alloc(sheet, grp, csch_oid_new(sheet, &sheet->direct)); + csch_attrib_set(&gfx->attr, 0, "purpose", "extobj-gfx", src, NULL); + gfx->role = CSCH_ROLE_EXTOBJ_GFX; + csch_sheet_set_changed(sheet, 1); + return gfx; + } + + csch_cgrp_clear(gfx); + return gfx; +} + + void csch_extobj_init(void) { htsp_init(&extobjs_impls, strhash, strkeyeq); Index: trunk/src/libcschem/extobj.h =================================================================== --- trunk/src/libcschem/extobj.h (revision 11151) +++ trunk/src/libcschem/extobj.h (revision 11152) @@ -47,8 +47,17 @@ RND_INLINE void csch_extrobj_attr_edit_pre(csch_cgrp_t *grp, const char *key); RND_INLINE void csch_extrobj_attr_edit_post(csch_cgrp_t *grp, const char *key); +/*** for implementing extended objects ***/ -/* internal, do not call */ +/* return the extobj-gfx group within grp or NULL if not found */ +csch_cgrp_t *csch_extobj_gfx_lookup(csch_cgrp_t *grp); + +/* return the extobj-gfx group within grp after making sure it is empty + (creating or clearing it) */ +csch_cgrp_t *csch_extobj_gfx_clear(csch_sheet_t *sheet, csch_cgrp_t *grp); + + +/*** internal, do not call ***/ void csch_extobj_init(void); void csch_extobj_uninit(void); const csch_extobj_impl_t *csch_extobj_lookup(const char *name); Index: trunk/src/libcschem/util_grp.c =================================================================== --- trunk/src/libcschem/util_grp.c (revision 11151) +++ trunk/src/libcschem/util_grp.c (revision 11152) @@ -113,6 +113,7 @@ { switch(grp->role) { case CSCH_ROLE_SYMBOL: + case CSCH_ROLE_EXTOBJ_GFX: { static const char *def_pen_sym[] = {"sym-decor", "sheet-decor", NULL}; return def_pen_sym;