Modified the "label" and "setlabel" commands, giving "setlabel" an

extra option "-default" that allows defaults to be set for any
label property other than text or port-related properties.
Subsequently, the command "label <text>" will apply the given
defaults to the label.  This allows a simpler way to create
rendered labels from the command line without remembering all of
the arguments to the extended "label" command.
This commit is contained in:
Tim Edwards 2021-03-16 13:37:15 -04:00
parent f790ea7589
commit 7757384355
3 changed files with 241 additions and 59 deletions

View File

@ -1 +1 @@
8.3.140
8.3.141

View File

@ -50,6 +50,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
void CmdPaintEraseButton();
/* See the SetLabel command */
extern Label *DefaultLabel;
/*
* ----------------------------------------------------------------------------
@ -169,8 +172,8 @@ CmdLabel(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
TileType type;
int pos, font = -1, size = 0, rotate = 0, offx = 0, offy = 0;
TileType type = (TileType)(-1);
int pos = -1, font = -1, size = 0, rotate = 0, offx = 0, offy = 0;
bool sticky = FALSE;
int option;
char *p;
@ -185,6 +188,22 @@ CmdLabel(w, cmd)
p = cmd->tx_argv[1];
/*
* If the "setlabel" command has been used to set defaults, pick up
* the default values from DefaultLabel.
*/
if (DefaultLabel != NULL)
{
pos = DefaultLabel->lab_just;
font = DefaultLabel->lab_font;
size = DefaultLabel->lab_size;
rotate = DefaultLabel->lab_rotate;
offx = DefaultLabel->lab_offset.p_x;
offy = DefaultLabel->lab_offset.p_y;
sticky = (DefaultLabel->lab_flags & LABEL_STICKY) ? 1 : 0;
type = DefaultLabel->lab_type;
}
/*
* Find and check validity of position.
*/
@ -220,13 +239,14 @@ CmdLabel(w, cmd)
else
pos = GeoTransPos(&RootToEditTransform, pos);
}
else pos = -1;
if (font >= 0)
{
char *yp = NULL;
size = DBLambda[1];
if (DefaultLabel == NULL)
size = DBLambda[1];
if (cmd->tx_argc > 3)
if (StrIsNumeric(cmd->tx_argv[3]))
size = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, TRUE, 8);
@ -304,7 +324,7 @@ CmdLabel(w, cmd)
TxError("Unknown layer: %s\n", cmd->tx_argv[cmd->tx_argc - 1]);
return;
}
} else type = -1;
}
CmdLabelProc(p, font, size, rotate, offx, offy, pos, sticky, type);
}

View File

@ -54,6 +54,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
extern void DisplayWindow();
/* Used by CmdSetLabel() */
Label *DefaultLabel;
/*
* ----------------------------------------------------------------------------
*
@ -1892,8 +1895,7 @@ cmdLabelFontFunc(label, cellUse, transform, font)
* Query or change properties of a (selected) label in the edit cell
*
* Usage:
* setlabel option [name]
*
* setlabel [-default] option [name]
*
* Option may be one of:
* text
@ -1913,6 +1915,11 @@ cmdLabelFontFunc(label, cellUse, transform, font)
* "setlabel font <name>" can be used without any select to load fonts
* from a startup script.
*
* Use with "-default" causes the DefaultLabel structure to be created
* (if not existing already) and set with the given value. Subsequent
* use of the "label" command will start with the given defaults, then
* apply whatever non-default values are specified in the command.
*
* ----------------------------------------------------------------------------
*/
@ -1933,10 +1940,12 @@ CmdSetLabel(w, cmd)
TxCommand *cmd;
{
int pos = -1, font = -1, size = 0, rotate = 0, flags = 0;
int locargc, argstart = 1;
char **msg;
Point offset;
TileType ttype;
int option;
bool doDefault = FALSE;
#ifdef MAGIC_WRAPPER
Tcl_Obj *lobj;
#endif
@ -1959,10 +1968,34 @@ CmdSetLabel(w, cmd)
NULL
};
if (cmd->tx_argc < 2 || cmd->tx_argc > 4)
locargc = cmd->tx_argc;
if (locargc > 2)
{
if (!strncmp(cmd->tx_argv[1], "-def", 4))
{
if (DefaultLabel == NULL)
{
DefaultLabel = (Label *)mallocMagic(sizeof(Label));
/* Set default defaults (lab_text is ignored) */
DefaultLabel->lab_just = -1;
DefaultLabel->lab_size = 0;
DefaultLabel->lab_font = -1;
DefaultLabel->lab_rotate = 0;
DefaultLabel->lab_flags = 0;
DefaultLabel->lab_offset.p_x = 0;
DefaultLabel->lab_offset.p_y = 0;
DefaultLabel->lab_type = (TileType)(-1);
}
doDefault = TRUE;
locargc--;
argstart++;
}
}
if (locargc < 2 || locargc > 4)
option = SETLABEL_HELP;
else
option = Lookup(cmd->tx_argv[1], cmdLabelSetOption);
option = Lookup(cmd->tx_argv[argstart], cmdLabelSetOption);
switch (option)
{
@ -1981,20 +2014,27 @@ CmdSetLabel(w, cmd)
break;
case SETLABEL_TEXT:
if (EditCellUse)
if (doDefault)
{
TxError("Cannot set a default label text.\n");
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelTextFunc, (cmd->tx_argc == 3) ?
(ClientData)cmd->tx_argv[2] : (ClientData)NULL);
cmdLabelTextFunc, (locargc == 3) ?
(ClientData)cmd->tx_argv[argstart + 1] : (ClientData)NULL);
}
break;
case SETLABEL_FONT:
if (cmd->tx_argc >= 2 && cmd->tx_argc <= 4)
if (locargc >= 2 && locargc <= 4)
{
if ((cmd->tx_argc == 3) && StrIsInt(cmd->tx_argv[2]))
/* This option is used to see the font name corresponding
* to a font number.
*/
if ((locargc == 3) && StrIsInt(cmd->tx_argv[argstart + 1]))
{
int font = atoi(cmd->tx_argv[2]);
int font = atoi(cmd->tx_argv[argstart + 1]);
if (font < -1 || font >= DBNumFonts)
{
if (DBNumFonts == 0)
@ -2008,67 +2048,118 @@ CmdSetLabel(w, cmd)
else
TxPrintf("%s\n", DBFontList[font]->mf_name);
}
else if ((cmd->tx_argc == 3 || cmd->tx_argc == 4) &&
!StrIsInt(cmd->tx_argv[2]))
else if ((locargc == 3 || locargc == 4) &&
!StrIsInt(cmd->tx_argv[argstart + 1]))
{
font = DBNameToFont(cmd->tx_argv[2]);
font = DBNameToFont(cmd->tx_argv[argstart + 1]);
if (font < -1)
{
float scale = 1.0;
if ((cmd->tx_argc == 4) && StrIsNumeric(cmd->tx_argv[3]))
scale = (float)atof(cmd->tx_argv[3]);
if (DBLoadFont(cmd->tx_argv[2], scale) != 0)
TxError("Error loading font \"%s\"\n", cmd->tx_argv[2]);
font = DBNameToFont(cmd->tx_argv[2]);
if ((locargc == 4) && StrIsNumeric(cmd->tx_argv[argstart + 2]))
scale = (float)atof(cmd->tx_argv[argstart + 2]);
if (DBLoadFont(cmd->tx_argv[argstart + 1], scale) != 0)
TxError("Error loading font \"%s\"\n", cmd->tx_argv[argstart + 1]);
font = DBNameToFont(cmd->tx_argv[argstart + 1]);
if (font < -1) break;
}
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
font = DefaultLabel->lab_font;
if (font == -1)
#ifdef MAGIC_WRAPPER
Tcl_SetResult(magicinterp, "default", TCL_VOLATILE);
#else
TxPrintf("default\n");
#endif
else
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewStringObj(DBFontList[font]->mf_name, -1));
#else
TxPrintf("%s\n", DBFontList[font]->mf_name);
#endif
}
else
DefaultLabel->lab_font = font;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelFontFunc, (cmd->tx_argc == 3) ?
cmdLabelFontFunc, (locargc == 3) ?
(ClientData)&font : (ClientData)NULL);
}
}
break;
case SETLABEL_JUSTIFY:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
pos = GeoNameToPos(cmd->tx_argv[2], FALSE, TRUE);
pos = GeoNameToPos(cmd->tx_argv[argstart + 1], FALSE, TRUE);
if (pos < 0) break;
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewStringObj(GeoPosToName(DefaultLabel->lab_just),
-1));
#else
TxPrintf("%s\n", GeoPosToName(DefaultLabel->lab_just));
#endif
}
else
DefaultLabel->lab_just = pos;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelJustFunc, (cmd->tx_argc == 3) ?
cmdLabelJustFunc, (locargc == 3) ?
(ClientData)&pos : (ClientData)NULL);
}
break;
case SETLABEL_SIZE:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
if (StrIsNumeric(cmd->tx_argv[2]))
size = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8);
if (StrIsNumeric(cmd->tx_argv[argstart + 1]))
size = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8);
if (size <= 0) break;
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewIntObj(DefaultLabel->lab_size));
#else
TxPrintf("%d\n", DefaultLabel->lab_size);
#endif
}
else
DefaultLabel->lab_size = size;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelSizeFunc, (cmd->tx_argc == 3) ?
cmdLabelSizeFunc, (locargc == 3) ?
(ClientData)&size : (ClientData)NULL);
}
break;
case SETLABEL_OFFSET:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
char *yp;
if ((yp = strchr(cmd->tx_argv[2], ' ')) != NULL)
if ((yp = strchr(cmd->tx_argv[argstart + 1], ' ')) != NULL)
{
offset.p_x = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8);
offset.p_x = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8);
offset.p_y = cmdScaleCoord(w, yp, TRUE, FALSE, 8);
}
else
@ -2077,67 +2168,138 @@ CmdSetLabel(w, cmd)
return;
}
}
else if (cmd->tx_argc == 4)
else if (locargc == 4)
{
offset.p_x = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8);
offset.p_y = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, FALSE, 8);
offset.p_x = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8);
offset.p_y = cmdScaleCoord(w, cmd->tx_argv[argstart + 2], TRUE, FALSE, 8);
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_Obj *lobj;
Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, lobj,
Tcl_NewIntObj(DefaultLabel->lab_offset.p_x));
Tcl_ListObjAppendElement(magicinterp, lobj,
Tcl_NewIntObj(DefaultLabel->lab_offset.p_y));
Tcl_SetObjResult(magicinterp, lobj);
#else
TxPrintf("%d %d\n", DefaultLabel->lab_offset.p_x,
DefaultLabel->lab_offset.p_y);
#endif
}
else
DefaultLabel->lab_offset = offset;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelOffsetFunc, (cmd->tx_argc != 2) ?
cmdLabelOffsetFunc, (locargc != 2) ?
(ClientData)&offset : (ClientData)NULL);
}
break;
case SETLABEL_ROTATE:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
if (StrIsInt(cmd->tx_argv[2]))
rotate = atoi(cmd->tx_argv[2]);
if (StrIsInt(cmd->tx_argv[argstart + 1]))
rotate = atoi(cmd->tx_argv[argstart + 1]);
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewIntObj(DefaultLabel->lab_rotate));
#else
TxPrintf("%d\n", DefaultLabel->lab_rotate);
#endif
}
else
DefaultLabel->lab_rotate = rotate;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelRotateFunc, (cmd->tx_argc == 3) ?
cmdLabelRotateFunc, (locargc == 3) ?
(ClientData)&rotate : (ClientData)NULL);
}
break;
case SETLABEL_STICKY:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
option = Lookup(cmd->tx_argv[2], cmdLabelYesNo);
option = Lookup(cmd->tx_argv[argstart + 1], cmdLabelYesNo);
if (option < 0)
{
TxError("Unknown sticky option \"%s\"\n", cmd->tx_argv[2]);
TxError("Unknown sticky option \"%s\"\n", cmd->tx_argv[argstart + 1]);
break;
}
flags = (option <= 3) ? 0 : LABEL_STICKY;
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewBooleanObj((DefaultLabel->lab_flags &
LABEL_STICKY) ? TRUE : FALSE));
#else
TxPrintf("%d\n", (DefaultLabel->lab_flags & LABEL_STICKY) ? 1 : 0);
#endif
}
else
DefaultLabel->lab_flags = flags;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelStickyFunc, (cmd->tx_argc == 3) ?
cmdLabelStickyFunc, (locargc == 3) ?
(ClientData)&flags : (ClientData)NULL);
}
break;
case SETLABEL_LAYER:
if (cmd->tx_argc == 3)
if (locargc == 3)
{
if (!strcasecmp(cmd->tx_argv[2], "default"))
if (!strcasecmp(cmd->tx_argv[argstart + 1], "default"))
ttype = -1;
else
{
ttype = DBTechNoisyNameType(cmd->tx_argv[2]);
ttype = DBTechNoisyNameType(cmd->tx_argv[argstart + 1]);
if (ttype < 0) break;
}
}
if (EditCellUse)
if (doDefault)
{
if (locargc == 2)
{
if (DefaultLabel->lab_type == (TileType)(-1))
#ifdef MAGIC_WRAPPER
Tcl_SetResult(magicinterp, "default", TCL_VOLATILE);
#else
TxPrintf("default\n");
#endif
else
#ifdef MAGIC_WRAPPER
Tcl_SetResult(magicinterp,
DBTypeLongNameTbl[DefaultLabel->lab_type],
TCL_VOLATILE);
#else
TxPrintf("%s\n", DBTypeLongNameTbl[DefaultLabel->lab_type]);
#endif
}
else
DefaultLabel->lab_type = ttype;
}
else if (EditCellUse)
{
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelLayerFunc, (cmd->tx_argc == 3) ?
cmdLabelLayerFunc, (locargc == 3) ?
(ClientData)&ttype : (ClientData)NULL);
}
break;
@ -2151,7 +2313,7 @@ CmdSetLabel(w, cmd)
break;
default:
TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[1]);
TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[argstart]);
break;
}
}