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(); void CmdPaintEraseButton();
/* See the SetLabel command */
extern Label *DefaultLabel;
/* /*
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
@ -169,8 +172,8 @@ CmdLabel(w, cmd)
MagWindow *w; MagWindow *w;
TxCommand *cmd; TxCommand *cmd;
{ {
TileType type; TileType type = (TileType)(-1);
int pos, font = -1, size = 0, rotate = 0, offx = 0, offy = 0; int pos = -1, font = -1, size = 0, rotate = 0, offx = 0, offy = 0;
bool sticky = FALSE; bool sticky = FALSE;
int option; int option;
char *p; char *p;
@ -185,6 +188,22 @@ CmdLabel(w, cmd)
p = cmd->tx_argv[1]; 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. * Find and check validity of position.
*/ */
@ -220,13 +239,14 @@ CmdLabel(w, cmd)
else else
pos = GeoTransPos(&RootToEditTransform, pos); pos = GeoTransPos(&RootToEditTransform, pos);
} }
else pos = -1;
if (font >= 0) if (font >= 0)
{ {
char *yp = NULL; char *yp = NULL;
size = DBLambda[1]; if (DefaultLabel == NULL)
size = DBLambda[1];
if (cmd->tx_argc > 3) if (cmd->tx_argc > 3)
if (StrIsNumeric(cmd->tx_argv[3])) if (StrIsNumeric(cmd->tx_argv[3]))
size = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, TRUE, 8); 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]); TxError("Unknown layer: %s\n", cmd->tx_argv[cmd->tx_argc - 1]);
return; return;
} }
} else type = -1; }
CmdLabelProc(p, font, size, rotate, offx, offy, pos, sticky, type); 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(); 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 * Query or change properties of a (selected) label in the edit cell
* *
* Usage: * Usage:
* setlabel option [name] * setlabel [-default] option [name]
*
* *
* Option may be one of: * Option may be one of:
* text * text
@ -1913,6 +1915,11 @@ cmdLabelFontFunc(label, cellUse, transform, font)
* "setlabel font <name>" can be used without any select to load fonts * "setlabel font <name>" can be used without any select to load fonts
* from a startup script. * 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; TxCommand *cmd;
{ {
int pos = -1, font = -1, size = 0, rotate = 0, flags = 0; int pos = -1, font = -1, size = 0, rotate = 0, flags = 0;
int locargc, argstart = 1;
char **msg; char **msg;
Point offset; Point offset;
TileType ttype; TileType ttype;
int option; int option;
bool doDefault = FALSE;
#ifdef MAGIC_WRAPPER #ifdef MAGIC_WRAPPER
Tcl_Obj *lobj; Tcl_Obj *lobj;
#endif #endif
@ -1959,10 +1968,34 @@ CmdSetLabel(w, cmd)
NULL 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; option = SETLABEL_HELP;
else else
option = Lookup(cmd->tx_argv[1], cmdLabelSetOption); option = Lookup(cmd->tx_argv[argstart], cmdLabelSetOption);
switch (option) switch (option)
{ {
@ -1981,20 +2014,27 @@ CmdSetLabel(w, cmd)
break; break;
case SETLABEL_TEXT: case SETLABEL_TEXT:
if (EditCellUse) if (doDefault)
{
TxError("Cannot set a default label text.\n");
}
else if (EditCellUse)
{ {
SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelTextFunc, (cmd->tx_argc == 3) ? cmdLabelTextFunc, (locargc == 3) ?
(ClientData)cmd->tx_argv[2] : (ClientData)NULL); (ClientData)cmd->tx_argv[argstart + 1] : (ClientData)NULL);
} }
break; break;
case SETLABEL_FONT: 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 (font < -1 || font >= DBNumFonts)
{ {
if (DBNumFonts == 0) if (DBNumFonts == 0)
@ -2008,67 +2048,118 @@ CmdSetLabel(w, cmd)
else else
TxPrintf("%s\n", DBFontList[font]->mf_name); TxPrintf("%s\n", DBFontList[font]->mf_name);
} }
else if ((cmd->tx_argc == 3 || cmd->tx_argc == 4) && else if ((locargc == 3 || locargc == 4) &&
!StrIsInt(cmd->tx_argv[2])) !StrIsInt(cmd->tx_argv[argstart + 1]))
{ {
font = DBNameToFont(cmd->tx_argv[2]); font = DBNameToFont(cmd->tx_argv[argstart + 1]);
if (font < -1) if (font < -1)
{ {
float scale = 1.0; float scale = 1.0;
if ((cmd->tx_argc == 4) && StrIsNumeric(cmd->tx_argv[3])) if ((locargc == 4) && StrIsNumeric(cmd->tx_argv[argstart + 2]))
scale = (float)atof(cmd->tx_argv[3]); scale = (float)atof(cmd->tx_argv[argstart + 2]);
if (DBLoadFont(cmd->tx_argv[2], scale) != 0) if (DBLoadFont(cmd->tx_argv[argstart + 1], scale) != 0)
TxError("Error loading font \"%s\"\n", cmd->tx_argv[2]); TxError("Error loading font \"%s\"\n", cmd->tx_argv[argstart + 1]);
font = DBNameToFont(cmd->tx_argv[2]); font = DBNameToFont(cmd->tx_argv[argstart + 1]);
if (font < -1) break; 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelFontFunc, (cmd->tx_argc == 3) ? cmdLabelFontFunc, (locargc == 3) ?
(ClientData)&font : (ClientData)NULL); (ClientData)&font : (ClientData)NULL);
} }
} }
break; break;
case SETLABEL_JUSTIFY: 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 (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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelJustFunc, (cmd->tx_argc == 3) ? cmdLabelJustFunc, (locargc == 3) ?
(ClientData)&pos : (ClientData)NULL); (ClientData)&pos : (ClientData)NULL);
} }
break; break;
case SETLABEL_SIZE: case SETLABEL_SIZE:
if (cmd->tx_argc == 3) if (locargc == 3)
{ {
if (StrIsNumeric(cmd->tx_argv[2])) if (StrIsNumeric(cmd->tx_argv[argstart + 1]))
size = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8); size = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8);
if (size <= 0) break; 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelSizeFunc, (cmd->tx_argc == 3) ? cmdLabelSizeFunc, (locargc == 3) ?
(ClientData)&size : (ClientData)NULL); (ClientData)&size : (ClientData)NULL);
} }
break; break;
case SETLABEL_OFFSET: case SETLABEL_OFFSET:
if (cmd->tx_argc == 3) if (locargc == 3)
{ {
char *yp; 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); offset.p_y = cmdScaleCoord(w, yp, TRUE, FALSE, 8);
} }
else else
@ -2077,67 +2168,138 @@ CmdSetLabel(w, cmd)
return; 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_x = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8);
offset.p_y = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, FALSE, 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelOffsetFunc, (cmd->tx_argc != 2) ? cmdLabelOffsetFunc, (locargc != 2) ?
(ClientData)&offset : (ClientData)NULL); (ClientData)&offset : (ClientData)NULL);
} }
break; break;
case SETLABEL_ROTATE: case SETLABEL_ROTATE:
if (cmd->tx_argc == 3) if (locargc == 3)
{ {
if (StrIsInt(cmd->tx_argv[2])) if (StrIsInt(cmd->tx_argv[argstart + 1]))
rotate = atoi(cmd->tx_argv[2]); 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelRotateFunc, (cmd->tx_argc == 3) ? cmdLabelRotateFunc, (locargc == 3) ?
(ClientData)&rotate : (ClientData)NULL); (ClientData)&rotate : (ClientData)NULL);
} }
break; break;
case SETLABEL_STICKY: 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) 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; break;
} }
flags = (option <= 3) ? 0 : LABEL_STICKY; 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelStickyFunc, (cmd->tx_argc == 3) ? cmdLabelStickyFunc, (locargc == 3) ?
(ClientData)&flags : (ClientData)NULL); (ClientData)&flags : (ClientData)NULL);
} }
break; break;
case SETLABEL_LAYER: 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; ttype = -1;
else else
{ {
ttype = DBTechNoisyNameType(cmd->tx_argv[2]); ttype = DBTechNoisyNameType(cmd->tx_argv[argstart + 1]);
if (ttype < 0) break; 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, SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL,
cmdLabelLayerFunc, (cmd->tx_argc == 3) ? cmdLabelLayerFunc, (locargc == 3) ?
(ClientData)&ttype : (ClientData)NULL); (ClientData)&ttype : (ClientData)NULL);
} }
break; break;
@ -2151,7 +2313,7 @@ CmdSetLabel(w, cmd)
break; break;
default: default:
TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[1]); TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[argstart]);
break; break;
} }
} }