Completed the small set of command extensions to make sure all
commands that make use of the pointer position have an equivalent command that operates solely on layout coordinates, or otherwise avoids needing a pointer position. Added the command option "down <instance>" to avoid using the pointer to disambiguate selections. Added the command option "select ... at x y" to do paint or cell selections at a specific coordinate instead of the pointer position.
This commit is contained in:
parent
d3b314d877
commit
3890181ebe
|
|
@ -3773,7 +3773,7 @@ CmdDelete(w, cmd)
|
||||||
* new edit cell into the window containing the point tool.
|
* new edit cell into the window containing the point tool.
|
||||||
*
|
*
|
||||||
* Usage:
|
* Usage:
|
||||||
* down
|
* down [<instname>]
|
||||||
*
|
*
|
||||||
* Results:
|
* Results:
|
||||||
* None.
|
* None.
|
||||||
|
|
@ -3795,11 +3795,23 @@ CmdDown(w, cmd)
|
||||||
MagWindow *w;
|
MagWindow *w;
|
||||||
TxCommand *cmd;
|
TxCommand *cmd;
|
||||||
{
|
{
|
||||||
|
CellUse *use = NULL;
|
||||||
Rect area, pointArea;
|
Rect area, pointArea;
|
||||||
int cmdEditRedisplayFunc(); /* External declaration. */
|
int cmdEditRedisplayFunc(); /* External declaration. */
|
||||||
int cmdDownEnumFunc(); /* Forward declaration. */
|
int cmdDownEnumFunc(); /* Forward declaration. */
|
||||||
|
|
||||||
if (cmd->tx_argc > 1)
|
if ((w != NULL) && (cmd->tx_argc == 2))
|
||||||
|
{
|
||||||
|
CellUse *rootUse;
|
||||||
|
SearchContext scx;
|
||||||
|
|
||||||
|
rootUse = (CellUse *)w->w_surfaceID;
|
||||||
|
bzero(&scx, sizeof(SearchContext));
|
||||||
|
DBTreeFindUse(cmd->tx_argv[1], rootUse, &scx);
|
||||||
|
use = scx.scx_use;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((use == NULL) && (cmd->tx_argc > 1))
|
||||||
{
|
{
|
||||||
TxError("Usage: edit\nMaybe you want the \"load\" command\n");
|
TxError("Usage: edit\nMaybe you want the \"load\" command\n");
|
||||||
return;
|
return;
|
||||||
|
|
@ -3822,8 +3834,18 @@ CmdDown(w, cmd)
|
||||||
|
|
||||||
(void) ToolGetPoint((Point *) NULL, &pointArea);
|
(void) ToolGetPoint((Point *) NULL, &pointArea);
|
||||||
cmdFoundNewDown = FALSE;
|
cmdFoundNewDown = FALSE;
|
||||||
(void) SelEnumCells(FALSE, (bool *) NULL, (SearchContext *) NULL,
|
|
||||||
cmdDownEnumFunc, (ClientData) &pointArea);
|
if (use == NULL)
|
||||||
|
{
|
||||||
|
SelEnumCells(FALSE, (bool *) NULL, (SearchContext *) NULL,
|
||||||
|
cmdDownEnumFunc, (ClientData) &pointArea);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EditCellUse = use;
|
||||||
|
EditRootDef = use->cu_def;
|
||||||
|
cmdFoundNewDown = TRUE;
|
||||||
|
}
|
||||||
if (!cmdFoundNewDown)
|
if (!cmdFoundNewDown)
|
||||||
TxError("You haven't selected a new cell to edit.\n");
|
TxError("You haven't selected a new cell to edit.\n");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -786,7 +786,7 @@ CmdSelect(w, cmd)
|
||||||
};
|
};
|
||||||
static char *cmdSelectMsg[] =
|
static char *cmdSelectMsg[] =
|
||||||
{
|
{
|
||||||
"[more | less | nocycle] [layers]\n"
|
"[more | less | nocycle] [layers] [at x y]\n"
|
||||||
" [de]select paint chunk/region/net under\n"
|
" [de]select paint chunk/region/net under\n"
|
||||||
" cursor, or [de]select subcell if cursor\n"
|
" cursor, or [de]select subcell if cursor\n"
|
||||||
" over space",
|
" over space",
|
||||||
|
|
@ -845,13 +845,14 @@ CmdSelect(w, cmd)
|
||||||
CellUse *use;
|
CellUse *use;
|
||||||
CellDef *rootBoxDef;
|
CellDef *rootBoxDef;
|
||||||
Transform trans, rootTrans, tmp1;
|
Transform trans, rootTrans, tmp1;
|
||||||
Point p, rootPoint;
|
Point p, rootPoint, atPoint;
|
||||||
Rect r, selarea;
|
Rect r, selarea;
|
||||||
ExtRectList *rlist;
|
ExtRectList *rlist;
|
||||||
int option;
|
int option;
|
||||||
int feedstyle;
|
int feedstyle;
|
||||||
bool layerspec;
|
bool layerspec;
|
||||||
bool degenerate;
|
bool degenerate;
|
||||||
|
bool doat = FALSE;
|
||||||
bool more = FALSE, less = FALSE, samePlace = TRUE;
|
bool more = FALSE, less = FALSE, samePlace = TRUE;
|
||||||
unsigned char labelpolicy = SEL_DO_LABELS;
|
unsigned char labelpolicy = SEL_DO_LABELS;
|
||||||
#ifdef MAGIC_WRAPPER
|
#ifdef MAGIC_WRAPPER
|
||||||
|
|
@ -939,6 +940,20 @@ CmdSelect(w, cmd)
|
||||||
"cell", strlen(cmd->tx_argv[2])))
|
"cell", strlen(cmd->tx_argv[2])))
|
||||||
optionArgs = &cmd->tx_argv[2];
|
optionArgs = &cmd->tx_argv[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doat = FALSE;
|
||||||
|
if ((cmd->tx_argc > 3) && !strcmp(cmd->tx_argv[cmd->tx_argc - 3], "at"))
|
||||||
|
{
|
||||||
|
Point editPoint;
|
||||||
|
|
||||||
|
doat = TRUE;
|
||||||
|
editPoint.p_x = cmdParseCoord(w, cmd->tx_argv[cmd->tx_argc - 2],
|
||||||
|
FALSE, TRUE);
|
||||||
|
editPoint.p_y = cmdParseCoord(w, cmd->tx_argv[cmd->tx_argc - 1],
|
||||||
|
FALSE, FALSE);
|
||||||
|
GeoTransPoint(&EditToRootTransform, &editPoint, &atPoint);
|
||||||
|
cmd->tx_argc -= 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the option for validity. */
|
/* Check the option for validity. */
|
||||||
|
|
@ -1247,11 +1262,12 @@ CmdSelect(w, cmd)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
case SEL_DEFAULT:
|
case SEL_DEFAULT:
|
||||||
if (cmd->tx_argc > 2) goto usageError;
|
|
||||||
if (cmd->tx_argc == 2)
|
if (cmd->tx_argc == 2)
|
||||||
layerspec = TRUE;
|
layerspec = TRUE;
|
||||||
else
|
else
|
||||||
layerspec = FALSE;
|
layerspec = FALSE;
|
||||||
|
|
||||||
goto Okay;
|
goto Okay;
|
||||||
case SEL_CELL:
|
case SEL_CELL:
|
||||||
layerspec = FALSE;
|
layerspec = FALSE;
|
||||||
|
|
@ -1284,6 +1300,15 @@ Okay:
|
||||||
scx.scx_area.r_ytop = scx.scx_area.r_ybot + 1;
|
scx.scx_area.r_ytop = scx.scx_area.r_ybot + 1;
|
||||||
degenerate = TRUE;
|
degenerate = TRUE;
|
||||||
}
|
}
|
||||||
|
else if (doat)
|
||||||
|
{
|
||||||
|
scx.scx_area.r_xbot = atPoint.p_x;
|
||||||
|
scx.scx_area.r_ybot = atPoint.p_y;
|
||||||
|
scx.scx_area.r_xtop = atPoint.p_x + 1;
|
||||||
|
scx.scx_area.r_ytop = atPoint.p_y + 1;
|
||||||
|
windCheckOnlyWindow(&w, DBWclientID);
|
||||||
|
window = w;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
window = CmdGetRootPoint((Point *) NULL, &scx.scx_area);
|
window = CmdGetRootPoint((Point *) NULL, &scx.scx_area);
|
||||||
|
|
@ -1305,17 +1330,34 @@ Okay:
|
||||||
* same space WILL cause a crash).
|
* same space WILL cause a crash).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!GEO_ENCLOSE(&cmd->tx_p, &lastArea)
|
if (doat)
|
||||||
|| ((lastCommand + 1) != TxCommandNumber))
|
|
||||||
{
|
{
|
||||||
samePlace = FALSE;
|
if (!GEO_ENCLOSE(&scx.scx_area.r_ll, &lastArea)
|
||||||
lastUse = NULL;
|
|| ((lastCommand + 1) != TxCommandNumber))
|
||||||
}
|
{
|
||||||
|
samePlace = FALSE;
|
||||||
|
lastUse = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
lastArea.r_xbot = cmd->tx_p.p_x - MARGIN;
|
lastArea.r_xbot = scx.scx_area.r_xbot - MARGIN;
|
||||||
lastArea.r_ybot = cmd->tx_p.p_y - MARGIN;
|
lastArea.r_ybot = scx.scx_area.r_ybot - MARGIN;
|
||||||
lastArea.r_xtop = cmd->tx_p.p_x + MARGIN;
|
lastArea.r_xtop = scx.scx_area.r_xbot + MARGIN;
|
||||||
lastArea.r_ytop = cmd->tx_p.p_y + MARGIN;
|
lastArea.r_ytop = scx.scx_area.r_ybot + MARGIN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!GEO_ENCLOSE(&cmd->tx_p, &lastArea)
|
||||||
|
|| ((lastCommand + 1) != TxCommandNumber))
|
||||||
|
{
|
||||||
|
samePlace = FALSE;
|
||||||
|
lastUse = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastArea.r_xbot = cmd->tx_p.p_x - MARGIN;
|
||||||
|
lastArea.r_ybot = cmd->tx_p.p_y - MARGIN;
|
||||||
|
lastArea.r_xtop = cmd->tx_p.p_x + MARGIN;
|
||||||
|
lastArea.r_ytop = cmd->tx_p.p_y + MARGIN;
|
||||||
|
}
|
||||||
lastCommand = TxCommandNumber;
|
lastCommand = TxCommandNumber;
|
||||||
|
|
||||||
/* If there's material under the cursor, select some paint.
|
/* If there's material under the cursor, select some paint.
|
||||||
|
|
|
||||||
|
|
@ -20,20 +20,22 @@
|
||||||
|
|
||||||
<H2>down</H2>
|
<H2>down</H2>
|
||||||
<HR>
|
<HR>
|
||||||
Load selected cell into a window
|
Load selected or indicated cell into a window
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<H3>Usage:</H3>
|
<H3>Usage:</H3>
|
||||||
<BLOCKQUOTE>
|
<BLOCKQUOTE>
|
||||||
<B>down</B>
|
<B>down</B> [<I>instance</I>]
|
||||||
</BLOCKQUOTE>
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
<H3>Summary:</H3>
|
<H3>Summary:</H3>
|
||||||
<BLOCKQUOTE>
|
<BLOCKQUOTE>
|
||||||
The <B>down</B> command loads the currently selected cell into the
|
With no arguments, the <B>down</B> command loads the currently
|
||||||
window. If more than one cell is selected, the one closest to the
|
selected cell into the window. If more than one cell is selected,
|
||||||
cursor (pointer) position will be used, or at worst, one will be
|
the one closest to the cursor (pointer) position will be used, or at
|
||||||
selected arbitrarily.
|
worst, one will be selected arbitrarily. <BR><BR>
|
||||||
|
With one argument <I>instance</I>, the cell of the instance named
|
||||||
|
<I>instance</I> will be loaded into the window.
|
||||||
</BLOCKQUOTE>
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
<H3>Implementation Notes:</H3>
|
<H3>Implementation Notes:</H3>
|
||||||
|
|
|
||||||
|
|
@ -47,13 +47,14 @@ create a new cell definition from a selection.
|
||||||
<BLOCKQUOTE>
|
<BLOCKQUOTE>
|
||||||
where <I>option</I> may be one of the following:
|
where <I>option</I> may be one of the following:
|
||||||
<DL>
|
<DL>
|
||||||
<DT> [<B>more</B> | <B>less</B>] [<I>layers</I>]
|
<DT> [<B>more</B> | <B>less</B>] [<I>layers</I>] [<B>at</B> <I>x y</I>]
|
||||||
<DD> [De]select material under cursor, or
|
<DD> [De]select material under cursor or indicated position, or
|
||||||
[de]select a subcell if the cursor is over space.
|
[de]select a subcell if the cursor or indicated position is over
|
||||||
<DT> <B>nocycle</B> [<I>layers</I>]
|
space.
|
||||||
|
<DT> <B>nocycle</B> [<I>layers</I>] [<B>at</B> <I>x y</I>]
|
||||||
<DD> Select material without cycling through different tile
|
<DD> Select material without cycling through different tile
|
||||||
types when "select" is called from the same cursor position
|
types when "select" is called from the same cursor position
|
||||||
more than once.
|
or indicated coordinate more than once.
|
||||||
<DT> [<B>do</B> | <B>no</B> | <B>simple</B>] <B>labels</B>
|
<DT> [<B>do</B> | <B>no</B> | <B>simple</B>] <B>labels</B>
|
||||||
<DD> Set policy for copying labels during a network selection.
|
<DD> Set policy for copying labels during a network selection.
|
||||||
<DT> [<B>more</B> | <B>less</B>] <B>area</B> [<I>layers</I>] [<I>pattern</I>]
|
<DT> [<B>more</B> | <B>less</B>] <B>area</B> [<I>layers</I>] [<I>pattern</I>]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue