Files
autocad-mcp-pro/discovery/aliases.py
T
Umut CANandClaude Opus 5 3c0babfef1 fix(pid): signal lines carry no fabricated number; a bubble exits towards the first waypoint
An ISA-5.1 signal line has no pipe line number, yet every pneumatic /
electric line got the bare sequence as its number and a label, and ate a
process sequence number. Signal classes now leave line_number None (a
verbatim one is still honoured), seq None, no label. A radial port aimed
at the far end even with waypoints, so the first segment cut through the
bubble; aim_points (lines.py) aims at the first/last waypoint for both
draw_line and the dry run.

Merge note: benchmarks/adapters/autocad_mcp_pro.py (final group's file)
had its two _task_pid_roundtrip assertion lines moved to the new truth —
the signal row is unnumbered, the connector row is 3.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
2026-09-21 22:24:03 +03:00

1452 lines
45 KiB
Python

"""AutoCAD command / natural-language alias corpus for tool discovery.
FastMCP's ``BM25SearchTransform`` builds its index from tool name, tool
description, parameter names and parameter descriptions only (see
``fastmcp/server/transforms/search/base.py::_extract_searchable_text``). Not one
of this server's ~131 tool descriptions mentions an AutoCAD command name, so a
drafter who searches the way drafters actually think -- ``BPOLY``, ``PEDIT``,
``WBLOCK``, ``QSELECT``, ``MATCHPROP`` -- scores df=0 and gets nothing back.
There are no synonyms either: "hole" never reaches ``entity_create_circle`` and
"bill of materials" reaches nothing at all.
That is a *data* gap, not a tuning gap: no serializer and no BM25 parameter can
invent vocabulary that is absent from the index. This module supplies the
missing vocabulary as plain data so a search transform can fold it into the
indexed text.
Field contract
--------------
``acad``
AutoCAD command name(s) a drafter would actually type for this operation --
uppercase, no spaces, two characters or more (single-letter aliases like
``L`` or ``C`` are omitted as pure noise). **Empty when there is genuinely
no AutoCAD equivalent.** A wrong alias actively misroutes a search, so
accuracy beats volume here: engineering meta-tools, the premium planning
and critique gates, and the transaction wrappers all ship an empty ``acad``
on purpose.
``synonyms``
Lowercase natural-language phrases a user would search for -- shop-floor
vocabulary ("hole", "bore", "round the corner", "parts list", "title
block"), not restatements of the tool name.
Deliberately kept free of I/O, ``fastmcp``, ``ezdxf`` and config parsing so it
stays trivially importable and testable in isolation.
"""
from __future__ import annotations
from dataclasses import dataclass
__all__ = [
"SHARED_ACAD_COMMANDS",
"TOOL_ALIASES",
"ToolAliases",
"alias_text",
"aliases_for",
]
@dataclass(frozen=True, slots=True)
class ToolAliases:
"""Search vocabulary for a single registered tool."""
acad: tuple[str, ...] = ()
synonyms: tuple[str, ...] = ()
# AutoCAD commands that legitimately route to more than one tool.
#
# ARRAY, LAYER, LAYOUT, MEASUREGEOM, ZOOM -- option/dialog-driven umbrella
# commands in AutoCAD itself; this server splits each into discrete tools.
# SETVAR -- one command both reads and writes a system variable; the server
# splits read and write.
# ERASE, INSERT -- the server genuinely exposes one operation through more
# than one tool (single vs. batch delete; block insert vs. block-reference
# creation vs. the P&ID catalogue insert), so each is a correct destination.
# QSELECT -- AutoCAD's Quick Select dialog is both "filter by properties"
# (selection_filter) and "find things like this one"
# (entity_select_smart); a drafter typing it could mean either.
# BLOCK -- one command makes a definition either from selected objects
# (block_create_from_entities) or from scratch with attribute
# definitions (block_define); a drafter typing it could mean either.
# PLINE -- a raw polyline (entity_create_polyline) or a P&ID line run
# between two ports (pid_line_draw), which is an LWPOLYLINE with a
# class, a number and markers; a drafter typing it could mean either.
#
# Every other AutoCAD command must map to exactly one tool.
SHARED_ACAD_COMMANDS: frozenset[str] = frozenset(
{
"ARRAY",
"BLOCK",
"ERASE",
"INSERT",
"LAYER",
"LAYOUT",
"MEASUREGEOM",
"PLINE",
"QSELECT",
"SETVAR",
"ZOOM",
}
)
TOOL_ALIASES: dict[str, ToolAliases] = {
# ── Analysis & query ────────────────────────────────────────────────────
"analysis_bounding_box": ToolAliases(
synonyms=(
"bounding box",
"drawing extents",
"overall size",
"how big is the drawing",
"outer envelope",
),
),
"analysis_entity_stats": ToolAliases(
synonyms=(
"entity count",
"how many objects",
"drawing statistics",
"breakdown by type",
"object inventory",
),
),
"analysis_find_in_region": ToolAliases(
synonyms=(
"crossing window",
"what is in this area",
"entities inside a rectangle",
"window selection",
"objects in a region",
),
),
"analysis_layer_stats": ToolAliases(
synonyms=(
"layer statistics",
"entities per layer",
"which layers are used",
"layer usage report",
),
),
# AREA/MEASUREGEOM belong to the ENTITY tool: a drafter typing AREA picks
# objects on screen, they do not retype coordinates. Routing those commands
# at the points-based tool sent "what is the area of this polyline" to the
# one tool that cannot look at the polyline.
"analysis_measure_area": ToolAliases(
synonyms=(
"area of a polygon i will type out",
"area from coordinates",
"shoelace",
"area of a list of points",
),
),
"analysis_measure_entity": ToolAliases(
acad=("AREA", "MEASUREGEOM"),
synonyms=(
"area",
"surface area",
"how much area",
"square millimetres",
"polygon area",
"area of this entity",
"area of that polyline",
"perimeter",
"circumference",
"how long is this polyline",
"measure the part i just drew",
),
),
"analysis_measure_distance": ToolAliases(
acad=("DIST", "DI", "MEASUREGEOM"),
synonyms=(
"distance",
"how far apart",
"length between two points",
"measure a gap",
"spacing",
),
),
"analysis_select_by_layer": ToolAliases(
synonyms=(
"everything on a layer",
"entities on a layer",
"select by layer",
"layer contents",
),
),
"analysis_select_by_type": ToolAliases(
synonyms=(
"all the circles",
"all the lines",
"entities of one type",
"select by object type",
"filter by type",
),
),
# ── Batch execution ─────────────────────────────────────────────────────
#
# No ``acad``: AutoCAD's nearest equivalent is SCRIPT, which runs a file of
# command lines and maps to nothing this server exposes. Claiming it would
# misroute every SCRIPT search into a tool that cannot open a .scr file.
"cad_batch": ToolAliases(
synonyms=(
"run several tools at once",
"do it all in one call",
"chain tool calls",
"sequence of operations",
"one round trip",
"macro",
),
),
# ── Blocks ──────────────────────────────────────────────────────────────
"block_create_from_entities": ToolAliases(
acad=("BLOCK", "BMAKE", "WBLOCK"),
synonyms=(
"make a block",
"define a block",
"group entities into a symbol",
"save a selection as a block",
"reusable symbol",
),
),
"block_define": ToolAliases(
acad=("BLOCK", "BEDIT", "ATTDEF"),
synonyms=(
"define a block",
"make a symbol",
"block with attributes",
"attribute definition",
"create a block definition from scratch",
),
),
"block_explode": ToolAliases(
acad=("EXPLODE", "BURST"),
synonyms=(
"explode",
"break a block apart",
"ungroup",
"split a block into entities",
"flatten a symbol",
"burst a block",
"explode and keep the attribute text",
),
),
"block_find_references": ToolAliases(
acad=("BCOUNT",),
synonyms=(
"where is this block used",
"block instances",
"find the inserts",
"count block references",
),
),
"block_get_attributes": ToolAliases(
synonyms=(
"read block attributes",
"attribute values",
"title block fields",
"tag values",
),
),
"block_insert": ToolAliases(
acad=("INSERT",),
synonyms=(
"insert a block",
"place a symbol",
"stamp a block",
"add a block instance",
),
),
"block_list": ToolAliases(
synonyms=(
"list blocks",
"block definitions",
"what blocks exist",
"available symbols",
),
),
"block_set_attributes": ToolAliases(
acad=("EATTEDIT", "ATTEDIT"),
synonyms=(
"edit block attributes",
"fill in the title block",
"set attribute values",
"update the tags",
),
),
# ── Construction geometry ───────────────────────────────────────────────
"construction_clear": ToolAliases(
synonyms=(
"delete the construction lines",
"remove the scaffolding",
"clean the construction layer",
"wipe the guides",
),
),
"construction_xline": ToolAliases(
acad=("XLINE", "XL"),
synonyms=(
"construction line",
"infinite line",
"guide line",
"reference axis",
"scaffolding line",
),
),
# ── GD&T ────────────────────────────────────────────────────────────────
"datum_feature": ToolAliases(
synonyms=(
"datum",
"datum symbol",
"datum triangle",
"datum reference",
"reference feature",
),
),
"gd_frame": ToolAliases(
acad=("TOLERANCE",),
synonyms=(
"feature control frame",
"geometric tolerance",
"gd&t",
"flatness",
"perpendicularity",
"true position",
),
),
# ── Dimensions ──────────────────────────────────────────────────────────
"dimension_aligned": ToolAliases(
acad=("DIMALIGNED", "DAL"),
synonyms=(
"aligned dimension",
"true length dimension",
"dimension along a slope",
"slanted dimension",
),
),
"dimension_angular": ToolAliases(
acad=("DIMANGULAR", "DAN"),
synonyms=(
"angle dimension",
"angular dimension",
"measure an angle",
"included angle",
),
),
"dimension_auto": ToolAliases(
acad=("QDIM", "DIMCONTINUE", "DIMBASELINE", "DIMORDINATE"),
synonyms=(
"dimension everything",
"chain dimensions",
"baseline dimensions",
"ordinate dimensions",
"quick dimension",
),
),
"dimension_diameter": ToolAliases(
acad=("DIMDIAMETER", "DDI"),
synonyms=(
"diameter dimension",
"hole size",
"bore diameter",
"dimension a hole",
),
),
"dimension_linear": ToolAliases(
acad=("DIMLINEAR", "DLI"),
synonyms=(
"dimension",
"linear dimension",
"horizontal dimension",
"vertical dimension",
"size tolerance",
"h7 fit",
),
),
"dimension_radius": ToolAliases(
acad=("DIMRADIUS", "DRA"),
synonyms=(
"radius dimension",
"corner radius callout",
"dimension an arc",
"fillet radius",
),
),
# ── Drawing management ──────────────────────────────────────────────────
"drawing_apply_iso_layers": ToolAliases(
synonyms=(
"iso layers",
"standard layer set",
"set up drafting layers",
"layer standard",
"bootstrap the layers",
),
),
"drawing_audit": ToolAliases(
acad=("AUDIT",),
synonyms=(
"audit",
"fix drawing errors",
"integrity check",
"repair the file",
"corrupt drawing",
),
),
"drawing_close": ToolAliases(
acad=("CLOSE",),
synonyms=("close the drawing", "shut the file", "finish with this drawing"),
),
"drawing_critique": ToolAliases(
synonyms=(
"review the drawing",
"quality review",
"what is wrong with this drawing",
"drafting mistakes",
"check before finalising",
),
),
"drawing_deliver": ToolAliases(
synonyms=(
"delivery bundle",
"package the drawing",
"hand off the drawing",
"final deliverable",
),
),
"drawing_export_dxf": ToolAliases(
acad=("DXFOUT",),
synonyms=("export dxf", "save as dxf", "interchange file", "dxf output"),
),
"drawing_export_pdf": ToolAliases(
acad=("PLOT", "PRINT", "EXPORTPDF"),
synonyms=("print", "plot", "export pdf", "pdf output", "paper copy"),
),
"drawing_finalize": ToolAliases(
synonyms=(
"finish the drawing",
"validate and save",
"final check",
"completion gate",
"the drawing is done",
),
),
"drawing_info": ToolAliases(
acad=("DWGPROPS", "STATUS"),
synonyms=(
"drawing info",
"file properties",
"drawing metadata",
"what is in this drawing",
),
),
"drawing_new": ToolAliases(
acad=("NEW", "QNEW"),
synonyms=("new drawing", "start a drawing", "blank sheet", "create a file"),
),
"drawing_open": ToolAliases(
acad=("OPEN",),
synonyms=("open a drawing", "load a dwg", "read a dxf file", "open a file"),
),
"drawing_plan": ToolAliases(
synonyms=(
"plan the drawing",
"drawing plan",
"decide what to draw",
"drawing intent",
),
),
"drawing_preflight": ToolAliases(
synonyms=(
"preflight",
"check the requirements",
"validate the brief",
"normalise the requirements",
),
),
"drawing_purge": ToolAliases(
acad=("PURGE", "PU"),
synonyms=(
"purge",
"remove unused layers",
"clean out unused blocks",
"slim the file",
),
),
"drawing_redo": ToolAliases(
acad=("REDO", "MREDO"),
synonyms=("redo", "reapply the change", "undo the undo"),
),
"drawing_refine": ToolAliases(
acad=("OVERKILL",),
synonyms=(
"fix the issues",
"auto repair",
"clean up the drawing",
"remove duplicate entities",
"repair loop",
),
),
"drawing_save": ToolAliases(
acad=("QSAVE", "SAVE"),
synonyms=("save", "save the drawing", "write the file", "keep my changes"),
),
"drawing_save_as": ToolAliases(
acad=("SAVEAS",),
synonyms=(
"save as",
"save a copy",
"write to a new file",
"save as a template",
),
),
"drawing_settings": ToolAliases(
acad=("UNITS", "DDUNITS", "OSNAP", "DSETTINGS", "LTSCALE", "DIMSCALE"),
synonyms=(
"drawing units",
"millimetres or inches",
"decimal precision",
"dimension scale",
"linetype scale",
"object snap settings",
),
),
"drawing_undo": ToolAliases(
acad=("UNDO",),
synonyms=("undo", "take that back", "revert the last change", "step back"),
),
# ── Entity creation ─────────────────────────────────────────────────────
"entity_create_arc": ToolAliases(
acad=("ARC",),
synonyms=("arc", "curved segment", "part of a circle", "bend", "sweep"),
),
"entity_create_block_ref": ToolAliases(
acad=("INSERT",),
synonyms=(
"block reference",
"place a block",
"insert a symbol instance",
"drop in a symbol",
),
),
"entity_create_circle": ToolAliases(
acad=("CIRCLE",),
synonyms=("circle", "hole", "bore", "round hole", "pitch circle", "disc"),
),
"entity_create_ellipse": ToolAliases(
acad=("ELLIPSE", "EL"),
synonyms=("ellipse", "oval", "elliptical shape", "squashed circle"),
),
"entity_create_hatch": ToolAliases(
acad=("HATCH", "BHATCH"),
synonyms=(
"hatch",
"fill a region",
"section hatching",
"crosshatch",
"shade an area",
"ansi31",
),
),
"entity_create_line": ToolAliases(
acad=("LINE",),
synonyms=("line", "straight segment", "edge", "connect two points"),
),
"entity_create_mtext": ToolAliases(
acad=("MTEXT",),
synonyms=(
"paragraph text",
"multiline text",
"note block",
"wrapped text",
"general notes",
),
),
"entity_create_point": ToolAliases(
acad=("POINT", "PO"),
synonyms=("point", "node", "marker", "dot", "reference point"),
),
"entity_create_polyline": ToolAliases(
# BOUNDARY/BPOLY moved to boundary_trace in v1.5.0 — they were parked
# here only because nothing traced a boundary yet.
acad=("PLINE", "PL"),
synonyms=(
"polyline",
"connected segments",
"outline",
"closed profile",
"boundary",
"contour",
),
),
"entity_create_rectangle": ToolAliases(
acad=("RECTANG", "REC"),
synonyms=("rectangle", "box", "square", "plate outline", "four sided shape"),
),
"entity_create_spline": ToolAliases(
acad=("SPLINE", "SPL"),
synonyms=("spline", "smooth curve", "freeform curve", "nurbs", "fit points"),
),
"entity_create_table": ToolAliases(
acad=("TABLE", "TB"),
synonyms=(
"table",
"parts list",
"bill of materials",
"bom",
"schedule",
"revision table",
),
),
"entity_create_text": ToolAliases(
acad=("TEXT", "DTEXT"),
synonyms=("text", "label", "single line text", "caption", "annotate"),
),
"entity_batch_create": ToolAliases(
synonyms=(
"create many entities",
"bulk create",
"draw several things at once",
"batch draw",
),
),
"entity_batch_modify": ToolAliases(
synonyms=(
"bulk edit",
"modify many entities",
"batch changes",
"apply edits at once",
),
),
# ── Entity modification ─────────────────────────────────────────────────
"entity_array_polar": ToolAliases(
acad=("ARRAYPOLAR", "ARRAY"),
synonyms=(
"polar array",
"circular pattern",
"bolt circle",
"repeat around a centre",
"radial pattern",
),
),
"entity_array_rectangular": ToolAliases(
acad=("ARRAYRECT", "ARRAY"),
synonyms=(
"rectangular array",
"grid of copies",
"rows and columns",
"repeat in a grid",
),
),
"entity_chamfer": ToolAliases(
acad=("CHAMFER", "CHA"),
synonyms=(
"chamfer",
"bevel a corner",
"break the edge",
"45 degree corner",
"cut the corner off",
),
),
"entity_copy": ToolAliases(
acad=("COPY", "CO", "CP"),
synonyms=("copy", "duplicate", "clone an entity", "make another one"),
),
"entity_delete": ToolAliases(
acad=("ERASE",),
synonyms=("delete", "erase", "remove an entity", "get rid of it"),
),
"entity_delete_many": ToolAliases(
acad=("ERASE",),
synonyms=(
"delete several",
"erase many",
"bulk delete",
"remove a list of entities",
),
),
"entity_edit_geometry": ToolAliases(
acad=("LENGTHEN", "PEDIT"),
synonyms=(
"change the radius",
"move an endpoint",
"resize a circle",
"edit geometry in place",
"adjust the arc angles",
),
),
"entity_edit_text": ToolAliases(
acad=("DDEDIT", "TEXTEDIT"),
synonyms=(
"change the text",
"rename a label",
"edit the wording",
"fix a typo",
"retitle",
),
),
"entity_extend": ToolAliases(
acad=("EXTEND", "EX"),
synonyms=(
"extend",
"lengthen to meet",
"stretch to the boundary",
"reach the other line",
),
),
"entity_fillet": ToolAliases(
acad=("FILLET",),
synonyms=(
"fillet",
"round the corner",
"rounded corner",
"radius the corner",
"tangent arc corner",
),
),
"entity_mirror": ToolAliases(
acad=("MIRROR", "MI"),
synonyms=("mirror", "flip", "reflect", "symmetry", "mirrored copy"),
),
"entity_move": ToolAliases(
acad=("MOVE",),
synonyms=("move", "shift", "translate", "relocate", "nudge"),
),
"entity_offset": ToolAliases(
acad=("OFFSET",),
synonyms=(
"offset",
"parallel copy",
"wall thickness",
"concentric copy",
"inset",
),
),
"entity_rotate": ToolAliases(
acad=("ROTATE", "RO"),
synonyms=("rotate", "turn", "spin", "reorient", "set the angle"),
),
"entity_scale": ToolAliases(
acad=("SCALE", "SC"),
synonyms=("scale", "resize", "enlarge", "shrink", "make it bigger"),
),
"entity_set_properties": ToolAliases(
acad=("PROPERTIES", "CHPROP", "CHANGE", "MATCHPROP", "PR"),
synonyms=(
"change the colour",
"move to another layer",
"set the linetype",
"set the lineweight",
"match properties",
"hide an entity",
),
),
"entity_get_xdata": ToolAliases(
acad=("XDLIST",),
synonyms=("extended data", "read xdata", "entity metadata", "registered application data"),
),
"entity_set_xdata": ToolAliases(
acad=("XDATA",),
synonyms=("attach extended data", "write xdata", "tag an entity with metadata"),
),
"entity_trim": ToolAliases(
acad=("TRIM", "TR"),
synonyms=(
"trim",
"cut back",
"clean up the overshoot",
"cut to the intersection",
"remove the excess",
),
),
# ── Entity query & selection ────────────────────────────────────────────
"entity_get": ToolAliases(
acad=("LI",), # LIST moved to analysis_list_properties, which is the real dump
synonyms=(
"entity properties",
"what is this object",
"inspect an entity",
"details for a handle",
),
),
"entity_list": ToolAliases(
synonyms=(
"list the entities",
"what is in the drawing",
"browse the objects",
"all the handles",
),
),
"entity_select_smart": ToolAliases(
acad=("QSELECT", "FILTER", "SELECTSIMILAR"),
synonyms=(
"select by property",
"find every matching entity",
"smart selection",
"quick select",
"pick everything that is",
),
),
"selection_get": ToolAliases(
synonyms=(
"current selection",
"what the user selected",
"picked entities",
"highlighted objects",
"pickfirst",
),
),
# ── Engineering primitives ──────────────────────────────────────────────
"gear_draw_helical_front_view": ToolAliases(
synonyms=(
"helical gear",
"gear front view",
"involute teeth",
"toothed wheel",
"helix gear",
),
),
"gear_draw_section_aa": ToolAliases(
synonyms=(
"gear section",
"section a-a",
"cross section of a gear",
"cut view of a gear",
),
),
"gear_draw_spur_front_view": ToolAliases(
synonyms=(
"spur gear",
"straight tooth gear",
"involute gear",
"gear front view",
),
),
"keyway_draw_keyed_bore": ToolAliases(
synonyms=(
"keyway",
"keyed bore",
"key slot",
"shaft keyway",
"din 6885 key",
"hub bore",
),
),
"keyway_draw_section": ToolAliases(
synonyms=(
"keyway section",
"keyed bore side view",
"key slot cross section",
),
),
"titleblock_apply_iso_a3": ToolAliases(
synonyms=(
"title block",
"drawing frame",
"sheet border",
"iso 7200",
"a3 sheet",
"drawing header",
),
),
# ── Layers & linetypes ──────────────────────────────────────────────────
"layer_create": ToolAliases(
acad=("LAYER", "LA"),
synonyms=("new layer", "add a layer", "create a layer", "layer with a colour"),
),
"layer_delete": ToolAliases(
acad=("LAYDEL",),
synonyms=("delete a layer", "remove a layer", "get rid of a layer"),
),
"layer_freeze": ToolAliases(
acad=("LAYFRZ",),
synonyms=("freeze a layer", "freeze", "stop regenerating a layer"),
),
"layer_hide": ToolAliases(
acad=("LAYOFF",),
synonyms=("turn a layer off", "hide a layer", "make a layer invisible"),
),
"layer_isolate": ToolAliases(
acad=("LAYISO",),
synonyms=(
"isolate a layer",
"show only one layer",
"hide everything else",
"layer isolation",
),
),
"layer_list": ToolAliases(
acad=("LAYER",),
synonyms=("list the layers", "what layers exist", "layer table", "layer overview"),
),
"layer_lock": ToolAliases(
acad=("LAYLCK",),
synonyms=("lock a layer", "protect a layer", "make a layer read only"),
),
"layer_modify": ToolAliases(
acad=("LAYER",),
synonyms=(
"change a layer colour",
"edit a layer",
"set the layer linetype",
"set the layer lineweight",
),
),
"layer_set_current": ToolAliases(
acad=("CLAYER", "LAYMCUR"),
synonyms=(
"current layer",
"draw on this layer",
"set the active layer",
"switch layer",
),
),
"layer_show": ToolAliases(
acad=("LAYON",),
synonyms=("turn a layer on", "show a layer", "unhide a layer"),
),
"layer_thaw": ToolAliases(
acad=("LAYTHW",),
synonyms=("thaw a layer", "unfreeze a layer", "bring a layer back"),
),
"layer_unlock": ToolAliases(
acad=("LAYULK",),
synonyms=("unlock a layer", "allow editing on a layer"),
),
"linetype_list": ToolAliases(
synonyms=(
"list the linetypes",
"which linetypes are loaded",
"available dash patterns",
),
),
"linetype_load": ToolAliases(
acad=("LINETYPE", "LTYPE", "LT"),
synonyms=(
"load a linetype",
"dashed line",
"centre line linetype",
"hidden linetype",
"phantom linetype",
),
),
"template_apply_layers": ToolAliases(
acad=("LAYTRANS",),
synonyms=(
"apply a layer template",
"standard layers",
"architectural layers",
"mechanical layers",
"translate the layers",
),
),
"template_list": ToolAliases(
synonyms=(
"available templates",
"what layer templates exist",
"list the templates",
),
),
# ── Layouts & paper space ───────────────────────────────────────────────
"layout_create": ToolAliases(
acad=("LAYOUT",),
synonyms=("new layout", "paper space tab", "create a sheet", "add a layout"),
),
"layout_list": ToolAliases(
synonyms=(
"list the layouts",
"what sheets exist",
"layout tabs",
"model and paper space",
),
),
"layout_set_current": ToolAliases(
acad=("LAYOUT", "PSPACE"),
synonyms=(
"switch to a layout",
"activate a sheet",
"go to paper space",
"open a layout tab",
),
),
"selection_window": ToolAliases(
acad=("SSGET",),
synonyms=(
"select in a box",
"window selection",
"crossing selection",
"pick everything in this rectangle",
),
),
"selection_polygon": ToolAliases(
acad=("WPOLYGON",),
synonyms=(
"select inside a polygon",
"lasso selection",
"pick everything in this shape",
),
),
"selection_filter": ToolAliases(
acad=("QSELECT",),
synonyms=(
"select by properties",
"find all the red circles",
"everything on this layer",
"quick select",
),
),
"boundary_trace": ToolAliases(
acad=("BOUNDARY", "BPOLY"),
synonyms=(
"trace the boundary",
"outline this area",
"closed polyline around this point",
"pick an internal point",
),
),
"boundary_from_entities": ToolAliases(
synonyms=(
"join these into a closed shape",
"make a loop from these lines",
"chain entities into a boundary",
),
),
"analysis_list_properties": ToolAliases(
# LIST is the property *dump*; entity_get keeps LI, and PROPERTIES
# stays with the tool that writes them.
acad=("LIST",),
synonyms=(
"list the properties",
"show me everything about this entity",
"dump the dxf attributes",
"what are this object's properties",
),
),
"hatch_set_gradient": ToolAliases(
acad=("GRADIENT",),
synonyms=(
"gradient fill",
"fade from one colour to another",
"colour ramp fill",
),
),
"hatch_edit": ToolAliases(
acad=("HATCHEDIT",),
synonyms=(
"change the hatch pattern",
"rescale a hatch",
"island detection style",
"edit a hatch",
),
),
"hatch_add_boundary": ToolAliases(
synonyms=(
"add a boundary to a hatch",
"hatch boundary with arcs",
"another island in the hatch",
),
),
"entity_create_wipeout": ToolAliases(
acad=("WIPEOUT",),
synonyms=(
"wipeout",
"mask what is behind",
"hide the drawing underneath",
"white out an area",
),
),
"entity_create_revcloud": ToolAliases(
acad=("REVCLOUD",),
synonyms=(
"revision cloud",
"cloud this area",
"mark a revision",
"circle the change",
),
),
"text_set_background": ToolAliases(
acad=("BACKGROUNDMASK",),
synonyms=(
"text background mask",
"make the text readable over hatch",
"opaque box behind text",
"background fill for mtext",
),
),
"text_find_replace": ToolAliases(
acad=("FIND",),
synonyms=(
"find and replace text",
"replace text everywhere",
"search and replace",
"change all the labels",
),
),
"layout_delete": ToolAliases(
acad=("LAYOUT",),
synonyms=(
"delete a layout",
"remove a sheet tab",
"get rid of a layout",
"drop a paper space tab",
),
),
"layout_rename": ToolAliases(
acad=("LAYOUT", "RENAME"),
synonyms=(
"rename a layout",
"rename a sheet tab",
"change the layout name",
"retitle a sheet",
),
),
"layout_copy": ToolAliases(
acad=("LAYOUT",),
synonyms=(
"copy a layout",
"duplicate a sheet",
"clone a layout tab",
"another sheet like this one",
),
),
"viewport_create": ToolAliases(
acad=("MVIEW", "MV", "VPORTS"),
synonyms=(
"viewport",
"scaled window on a sheet",
"model view on paper",
"paper space window",
),
),
# No AutoCAD command lists viewports: the drafter reads them off the sheet
# or the Properties palette. Synonyms only, like layout_list.
"viewport_list": ToolAliases(
synonyms=(
"list the viewports",
"what viewports are on this sheet",
"viewport scales",
"show the windows on the layout",
),
),
"viewport_set_scale": ToolAliases(
# The classic way to scale a viewport is ZOOM nXP from inside it.
acad=("ZOOM",),
synonyms=(
"set the viewport scale",
"make this viewport 1:50",
"rescale a viewport",
"zoom xp",
),
),
"viewport_lock": ToolAliases(
synonyms=(
"lock a viewport",
"unlock a viewport",
"stop the viewport scale changing",
"display locked",
),
),
"viewport_delete": ToolAliases(
synonyms=(
"delete a viewport",
"remove a viewport",
"get rid of the window on the sheet",
),
),
"entity_change_space": ToolAliases(
acad=("CHSPACE",),
synonyms=(
"change space",
"move to paper space",
"move to model space",
"move this onto the sheet",
),
),
# ── Leaders ─────────────────────────────────────────────────────────────
"leader_create_mleader": ToolAliases(
acad=("MLEADER", "MLD", "QLEADER", "LEADER"),
synonyms=(
"leader",
"callout",
"arrow with a note",
"pointer note",
"balloon",
),
),
# ── Snap points ─────────────────────────────────────────────────────────
"point_from_snap": ToolAliases(
synonyms=(
"endpoint",
"midpoint",
"centre point",
"quadrant",
"perpendicular foot",
"object snap",
"osnap",
"exact coordinate",
),
),
"point_intersection": ToolAliases(
synonyms=(
"intersection",
"where two lines cross",
"crossing point",
"meeting point",
),
),
"point_tangent": ToolAliases(
synonyms=(
"tangent point",
"tangency",
"touch point on a circle",
"tangent from a point",
),
),
# ── 3D solids ───────────────────────────────────────────────────────────
"solid_boolean": ToolAliases(
acad=("UNION", "SUBTRACT", "INTERSECT"),
synonyms=(
"boolean",
"union of solids",
"subtract a solid",
"cut a pocket",
"combine solids",
),
),
"solid_box": ToolAliases(
acad=("BOX",),
synonyms=("3d box", "cuboid", "solid block", "rectangular solid"),
),
"solid_cylinder": ToolAliases(
acad=("CYLINDER",),
synonyms=("3d cylinder", "solid shaft", "round solid", "pin"),
),
"solid_extrude": ToolAliases(
acad=("EXTRUDE",),
synonyms=(
"extrude",
"pull a profile into 3d",
"give it thickness",
"solid from a profile",
),
),
"solid_revolve": ToolAliases(
acad=("REVOLVE",),
synonyms=(
"revolve",
"turn a profile around an axis",
"lathe",
"solid of revolution",
),
),
# ── System ──────────────────────────────────────────────────────────────
"system_about": ToolAliases(
acad=("ABOUT",),
synonyms=(
"about",
"what can this server do",
"capabilities overview",
"version information",
),
),
"system_capabilities": ToolAliases(
synonyms=(
"what is supported",
"backend capabilities",
"feature support",
"can it do this",
),
),
"system_get_variable": ToolAliases(
acad=("SETVAR",),
synonyms=(
"read a system variable",
"get a sysvar",
"current variable value",
),
),
"system_run_command": ToolAliases(
synonyms=(
"run an autocad command",
"command line",
"send a command string",
"macro",
"raw command",
),
),
"system_run_lisp": ToolAliases(
synonyms=("autolisp", "lisp", "run a lisp expression", "vlisp", "script it"),
),
"system_set_variable": ToolAliases(
acad=("SETVAR",),
synonyms=(
"set a system variable",
"change a sysvar",
"configure an autocad variable",
),
),
"system_status": ToolAliases(
synonyms=(
"server status",
"is autocad connected",
"backend status",
"health check",
),
),
# ── Transactions ────────────────────────────────────────────────────────
"transaction_begin": ToolAliases(
synonyms=(
"start a transaction",
"undo mark",
"checkpoint",
"savepoint",
"begin a safe edit",
),
),
"transaction_commit": ToolAliases(
synonyms=("commit", "keep the changes", "end the transaction", "accept the edits"),
),
"transaction_rollback": ToolAliases(
synonyms=(
"rollback",
"discard the changes",
"revert the transaction",
"undo back to the checkpoint",
),
),
# ── Validation ──────────────────────────────────────────────────────────
"validation_check": ToolAliases(
synonyms=(
"quality check",
"find duplicates",
"empty layers",
"zero length lines",
"sanity check the drawing",
),
),
# ── View & screenshot ───────────────────────────────────────────────────
"view_screenshot": ToolAliases(
synonyms=(
"screenshot",
"picture of the drawing",
"render an image",
"preview",
"what does it look like",
),
),
"view_zoom_and_screenshot": ToolAliases(
acad=("ZOOM",),
synonyms=(
"show me the drawing",
"zoom then capture",
"fit and screenshot",
"visual check",
),
),
"view_zoom_extents": ToolAliases(
acad=("ZOOM",),
synonyms=("zoom to fit", "fit the drawing on screen", "see everything"),
),
"view_zoom_window": ToolAliases(
acad=("ZOOM",),
synonyms=("zoom into a region", "close up of an area", "magnify a rectangle"),
),
# ── P&ID ────────────────────────────────────────────────────────────────
"pid_symbol_list": ToolAliases(
acad=(),
synonyms=(
"p&id symbols",
"pid symbol catalogue",
"which valves can i draw",
"instrument bubble types",
),
),
"pid_symbol_insert": ToolAliases(
acad=("INSERT",),
synonyms=(
"p&id symbol",
"insert a valve",
"place a pump",
"draw a vessel",
"instrument bubble",
"control valve",
"off-page connector",
"process equipment symbol",
),
),
"pid_line_draw": ToolAliases(
acad=("PLINE",),
synonyms=(
"process line",
"pipe run",
"signal line",
"connect equipment",
"instrument line",
"line number",
"connect the pump to the vessel",
"pneumatic signal",
"unnumbered signal line",
"route a line through waypoints",
),
),
"pid_graph": ToolAliases(
acad=(),
synonyms=(
"p&id connectivity",
"what is connected to",
"trace the line",
"read the p&id",
"dangling lines",
"instrument loop graph",
"process graph",
),
),
"pid_instrument_index": ToolAliases(
acad=(),
synonyms=("instrument index", "instrument list", "loop list", "tag list"),
),
"pid_line_list": ToolAliases(
acad=(),
synonyms=("line list", "pipe list", "line schedule", "line numbers"),
),
"pid_equipment_list": ToolAliases(
acad=(),
synonyms=("equipment list", "equipment schedule", "valve list"),
),
"pid_from_spec": ToolAliases(
acad=(),
synonyms=(
"whole p&id in one call",
"p&id from json",
"draw the process from a spec",
"batch p&id",
),
),
"pid_tag_parse": ToolAliases(
acad=(),
synonyms=(
"what does fic mean",
"isa 5.1 tag",
"instrument tag letters",
"decode the tag",
"loop number",
),
),
}
def aliases_for(tool_name: str) -> ToolAliases | None:
"""Return the alias record for ``tool_name``, or ``None`` if it has none."""
return TOOL_ALIASES.get(tool_name)
def alias_text(tool_name: str) -> str:
"""Return the alias vocabulary for ``tool_name`` as one whitespace-joined string.
Suitable for appending to the text a search index builds from a tool. Returns
an empty string for unknown tools so callers can concatenate unconditionally.
"""
record = TOOL_ALIASES.get(tool_name)
if record is None:
return ""
return " ".join((*record.acad, *record.synonyms))