Sheet and fluent handles¶
Sheet is the declared authoring façade. Feature verbs return fluent handles; those handles
are documented here because they are part of normal use even though their Python names begin
with an underscore.
Sheet¶
Sheet
¶
Reference features, declare their drawing aspects, export.
Each declaration method mirrors a :mod:draftwright.model constructor: pass the
build123d object to read its geometry, or explicit values. :meth:hole returns a
chainable :class:_Hole (.through() / .depth()), :meth:diameter / :meth:step
a :class:_Dim, for their own aspects; :meth:pocket / :meth:slot / :meth:envelope
a :class:_Params (.tolerance(on=…)) which forwards unknown attributes to the
Sheet so those verbs still chain to any further declaration (preserving their prior
return-Sheet behaviour); the remaining verbs return the Sheet. :meth:build /
:meth:export hand the declared features to the engine with detection skipped.
features
property
¶
The declared IR features — mutable: override, drop or reorder before
:meth:build.
Each feature carries an identity token (#908), so a reorder via
:meth:~_FeatureView.reverse or :meth:~_FeatureView.sort moves every reference
with it — a handle, a tolerance, a GD&T origin, a section, an add_dimension
intent all follow their feature to its new position.
Assignment is not a move. features[i] = f and slice assignment mint a new
identity, because assignment cannot distinguish "move this feature here" from
"put a different feature here" — so references to the displaced feature fail
loudly rather than silently transferring to whatever replaced it. The same holds
for deletion. Use reverse/sort to reorder while keeping references.
from_part(part, **opts)
classmethod
¶
Seed the declared set from detection (the hybrid mode, ADR 0011 §3): start
from the model the detector recovers, then override specific features (edit the
list via :attr:features, or re-declare) before :meth:build.
This states the automatic dimension source (#874), because that is what asking for
detection means: you have asked for the engine's reading of the part, features and
dimensions alike. It is not the implicit default the breaking change removed — a
Sheet(part) still has to say — it is from_part's own meaning.
Because the choice is from_part's rather than a script line's, adding
dimension(...) declarations overrides it rather than conflicting: detect the
features, then declare exactly which of their measurements to draw. That is the
natural way to take over a detected drawing, and requiring the caller to redeclare
every feature by hand to reach it would be a poor trade (#921 review round 6). An
explicit auto_dimensions() still conflicts — there the script has said both things.
add(feature)
¶
Append a pre-built IR :class:~draftwright.model.Feature (escape hatch for
the constructors this façade does not surface directly, e.g. PMI).
Returns a handle, like every declaration verb (#922). It matters here more than it
looks: the ENVELOPE is emitted through this escape hatch rather than through
:meth:envelope, so while add returned the sheet, sheet.dimension(env, "width")
— ADR 0016's own worked example — could not be written against a generated script.
Naming would have been uniform across the verbs and silently absent for one feature
in the middle of the file, which is worse than being absent everywhere. A raw
ControlFrame or DatumRef may name a handle as its origin; add resolves
and token-binds that provenance exactly like the public GD&T verbs.
dimension(feature=_UNSET, role=_UNSET, *, axis=None, **removed)
¶
dimension(feature, role) — the ADR 0016 referential verb. See
:meth:_authored_dimension for the semantics.
The signature is the real one again (#720): the transitional call-shape dispatch to
:meth:measured_dimension was removed at 0.4.0, so dimension means one thing. That
restores most of what the @overload pair provided — the parameter names and the
DimensionIntent return a caller sees (#963) — without the dual shape.
One thing it does NOT restore: **removed means a type checker accepts any keyword
rather than rejecting an unknown one (Codex #720 r1). That is the price of catching the
legacy call at runtime to name its replacement; the alternative is a static error whose
text is about argument counts. Worth revisiting once the break is old news, at which
point **removed can go and the signature becomes exact.
feature/role default to a sentinel rather than being required so that a
keyword-only legacy call (dimension(kind=…, value=…)) reaches the message below
instead of a bare "missing 2 required positional arguments". The old shape never
appeared in a release, so this refusal is the only notice it gets — a documented
break (docs/deprecations.md).
measured_dimension(*, kind, value, label, dominant_axis, ref_pts, ref_bbox=None, at=None, axis=None, upper_tol=None, lower_tol=None, lower_bound=None, upper_bound=None, source='sheet', source_kind=None, source_id='')
¶
Declare a drafting dimension from explicit measured values.
Named for what it carries (ADR 0016 / #873). dimension is referential on
Drawing today and becomes so on :class:Sheet in #874 — it names a feature and a
role, and the engine reads the value off the geometry. The verb that carries a number of
its own needed a name saying so before that name could be reused. A measured dimension is
the one place a value does NOT come from the part.
This is the concept-shaped Sheet API used by generated AP242 scripts: the source file
may call the record PMI, but the editable script declares a dimension category, value,
label, referenced model points, and optional structured tolerances. For ordinary
geometry-backed edits prefer feature handles such as sheet.hole(...).tolerance(...).
lower_bound and upper_bound are the mutually exclusive alternative to
upper_tol/lower_tol for a limit range. source_id is the external record
identity retained by generated imported-PMI scripts; hand-authored dimensions normally
leave it blank.
Delegates to :func:draftwright.model.declare.measured_dimension (#704), so
build_drawing(model=…) callers can author the same feature without the façade.
of(ref)
¶
A decoratable handle onto an existing feature — the hybrid seam (#463).
ref is a fluent handle this sheet issued, a feature index, a :class:Feature already
in :attr:features (e.g. seeded by :meth:from_part), or the build123d object you
built (matched by ⌀ + in-plane position). Returns the same fluent handle the declaration
verbs do, so you can .fit(...) / .tolerance(...) — and, for a hole, .cbore(...)
— a feature you did not declare from scratch. Raises if the object matches no feature or
is ambiguous.
hole(obj=None, **kw)
¶
Declare a hole from the tool cylinder you subtracted (or explicit values).
Returns a fluent handle: .through() (default) / .depth(d).
double_d_bore(obj=None, **kw)
¶
Declare a double-D bore from its cutter or explicit major ⌀ and A/F values.
diameter(obj=None, **kw)
¶
Declare an external cylindrical diameter (a boss / OD) — the ⌀ is read off the
object. Returns a handle: chain .tolerance(...) for a ± on the ⌀ (P2a).
boss(obj=None, **kw)
¶
Alias of :meth:diameter — an external cylindrical boss / OD.
polygonal_boss(**kw)
¶
Declare a regular polygonal-prism boss sized across flats and by height.
polygonal_stock(**kw)
¶
Declare whole regular polygonal-prism stock sized A/F and axially.
external_spur_gear(**kw)
¶
Declare one complete metric external spur involute gear requirement.
step(obj=None, **kw)
¶
Declare one axial segment of a turned profile (its OD + length). A model with any
step renders as a turned part. Returns a handle: .tolerance(...) tolerances the
step length by default, .tolerance(..., on="diameter") its OD (P2a).
slot(obj=None, **kw)
¶
Declare a milled slot / reduced across-flats section (width + length).
pocket(obj=None, **kw)
¶
Declare a blind rectangular recess — a floored slot/pocket (width × length ×
depth). From an object the depth axis defaults to the shortest bbox span; pass
depth_axis= for a recess deeper than it is wide.
channel(**kw)
¶
Declare a full-span floored channel (wall-to-wall width only).
pad(obj=None, **kw)
¶
Declare a bounded rectangular raised pad (footprint + X/Y location).
Its Z height is shared with the prismatic level ladder, so it is not independently double-dimensioned.
chamfer(obj=None, **kw)
¶
Declare a chamfer (bevelled edge) — sheet.chamfer(bevel_face) reads axis, legs
and a point on the bevel off the oblique chamfer face, or explicit
sheet.chamfer(axis="z", leg=6, at=(x, y, z)). leg = equal-leg 45° (C{leg});
leg1/leg2 = asymmetric.
fillet(obj=None, **kw)
¶
Declare a fillet (rounded edge) — sheet.fillet(round_face) reads axis, radius
and a point on the round off the cylindrical blend face, or explicit
sheet.fillet(axis="z", radius=3, at=(x, y, z)). Called out R{radius} (grouped
n× R for equal radii).
flat(obj=None, **kw)
¶
Declare a machined flat on round stock (#148b) — sheet.flat(flat_face) reads the
leader point off the planar flat face (axis= and across= still required), or
fully explicit sheet.flat(axis="z", across=15, at=(x, y, z)). Called out
{across} A/F (across flats — flat-to-flat for a double-D / hex, the D height for a
lone flat).
groove(obj=None, **kw)
¶
Declare a turned / circlip groove on round stock (#148c) — sheet.groove(floor_face)
reads axis, width, diameter and the leader point off the reduced-OD floor face, or fully
explicit sheet.groove(axis="z", width=3, diameter=16, at=(x, y, z)). Called out
{width} WIDE × ø{diameter} (groove width + floor diameter).
plate(obj=None, **kw)
¶
Declare a thin slab's thickness (a base plate / wall / rib) — sheet.plate(slab_box)
reads the thin axis + extent + centre off the slab, or explicit sheet.plate(axis="z",
lo=0, hi=4, u=10, v=5). Only a multi-plate part dimensions plates (a single slab is
the envelope).
rotational(**kw)
¶
Declare a turned body's axial furniture — OD, rotation axis, concentric bores
(#945): sheet.rotational(od=30, bores=(16,), axis="z").
The last recognised kind without a declarative surface, which is why a generated script for a turned part could not declare its dimensions at all (#938).
Keyword-only, unlike its object-capable siblings — see
:func:draftwright.model.rotational for why an object form would disagree with
detection (#950).
step_level(obj=None, **kw)
¶
Declare a prismatic height ladder + step-position shoulders (a rebated / stepped
block) — sheet.step_level(part) reads base / interior levels / the (axis,
position) shoulders / datum off the part, or explicit sheet.step_level(base=0,
levels=(10,), shoulders=(("x", 30),)). A shoulder locates where a step changes
height along a horizontal axis, so a stepped block is fully constrained (#555/#578).
pattern(member, **kw)
¶
Declare a hole pattern (bolt circle / linear array / grid) — build the
member with :func:draftwright.model.hole.
pocket_pattern(member, **kw)
¶
Declare a linear/grid array of identical blind pockets (#841) — build the
representative member with :func:draftwright.model.pocket. Renders as one grouped
N× W × L × D DEEP callout + (n-1)× pitch dim(s), not N competing size dims.
slot_pattern(member, **kw)
¶
Declare a linear/grid array of identical milled slots (#841) — build the
representative member with :func:draftwright.model.slot. Renders as one grouped
N× SLOT W × L leader + (n-1)× pitch dim(s), not N competing size dims.
envelope(obj=None)
¶
Declare the overall bounding dimensions. Defaults to the whole part.
The no-argument form reuses an equal whole-part envelope already seeded by
:meth:from_part; its returned handle therefore decorates and dimensions that
detected feature instead of appending a duplicate. An explicit obj remains a
distinct declaration, including when another envelope is already present.
datum(letter, ref, *, view=None, side=None)
¶
Declare a datum feature symbol (ISO 5459). ref is a build123d planar face, or
a feature handle / :class:Feature / index for a feature's axis. The target view + strip
side are derived from the geometry; view/side override them (ADR 0011 P2c).
finish(ra, ref, *, view=None, side=None)
¶
Declare a surface-finish symbol (ISO 1302, Ra) on ref — a build123d planar face or
a feature. sheet.finish("3.2", top_face); view/side override the strip.
note(text, ref, *, view=None, side=None)
¶
Declare a free-text manufacturing note (#488) on a leader to ref — a build123d planar
face or a feature. The shop callouts detection can't infer: thread specs
(sheet.note("M3x0.5 TAP", bore)), DEBURR, chip-relief, knurl. Placed like the GD&T
items, clear of the views/title block; view/side override the derived strip.
section(feature=None, *, at=None)
¶
Request a full section A–A (#841) — the part-level verb behind the auto section.
A section fires automatically only when a Z-axis hole/pattern has a counterbore, spotface, or blind bottom; a blind pocket has no such driving hole, so its floor and depth stay hidden-line-only. This forces a cut so that internal profile reads.
The cut plane is normal to Y. feature — a fluent handle / :class:Feature /
index — cuts through that feature's centre (the natural "section through this
pocket"); at=<y> cuts at an explicit Y; bare section() cuts through the
part centre. The section renders last (its room check clears the right-of-side-view
band), so declare it after the per-feature verbs. Chainable.
detail()
¶
Ensure enlarged detail-view recovery is enabled (#42/#307/#841).
Automatic builds enable it by default; this verb is useful after constructing a
Sheet(..., detail_view=False) or when an emitted declaration should state the
choice explicitly. Adds a magnified crop of the step-height region when warranted
(a no-op otherwise). Chainable. Not feature-targeted — for a blind pocket's
floor/depth prefer :meth:section.
control(ref, *, view=None, side=None)
¶
A GD&T feature-control-frame builder on ref — a feature handle / :class:Feature /
index, or a build123d planar face. Chain one method per ISO 1101 characteristic
(.position(0.1, to="A B") …); each stacks a frame on the target. The target view +
strip are derived from the geometry; view/side override them (ADR 0011 P2c.2).
table(rows, *, prefer='tr', name=None, block_cols=None)
¶
Declare a corner-block data table — positioned at :meth:build by the engine's generic
auto-placer, clear of the views, title block, and annotations (the same machinery as the
hole table), and lint-checked. rows is a sequence of equal-length row sequences (row 0
the header); cells are stringified. prefer is the page corner to sit nearest
("tr"/"tl"/"br"/"bl"). A table with no free corner records a
table_dropped lint — it never overlaps. Revision blocks, BOMs and schedules all use
this; :meth:notes is the single-column convenience over it.
notes(lines, *, title='NOTES', number=True, prefer='tr')
¶
Declare a manufacturing NOTES block — a single-column :meth:table of lines with a
title header (None to omit) and optional 1 … auto-numbering::
sheet.notes(["BREAK ALL EDGES 0.3", "DEBURR", "M3x0.5 TAP"])
auto_dimensions()
¶
Soft deprecated (#1043) — prefer :meth:authored_dimensions in new code.
Supported, and not scheduled for removal: existing scripts keep working. But on this surface, authored dimensions are the right default, for three reasons:
- it is what draftwright itself emits —
--scriptwritesauthored_dimensions()with a line per dimension, so the automatic path is the only form the tool never produces; - omission means suppression (ADR 0016) only holds for an authored set. Under an automatic one you cannot express "not that one";
- an authored list is editable text. That is what makes "generate a script, then refine it" work, for a person or a model.
If you want the planner's choices as a starting point, generate them —
draftwright yourmodule:part --script — and edit the result, rather than asking
for them at runtime where they cannot be seen or changed.
Still asks for the planner's automatic set (ADR 0016). A build must say where its
dimensions come from rather than defaulting silently (#874), and this is one of the
two ways to say it. It is also what :meth:add_dimension augments.
build_drawing(part)'s automatic path is unaffected and carries no warning — that
is the detected front door, and being automatic is its whole point.
authored_dimensions()
¶
Declare that the :meth:dimension lines in this script ARE the complete set.
The other half of :meth:auto_dimensions, and until #933 it did not exist: the
authored source was entered implicitly, as a side effect of calling dimension() at
least once. That left one thing unsayable — the complete set is empty — because
absence of dimension(...) lines is also what a script with no source at all looks
like, which _check_dimension_source must reject. So a valid PartModel carrying
authored_dimensions=() built directly but could not be written as a script.
Calling dimension(...) still selects this source on its own; the verb only makes
the choice sayable when there is nothing else to say it. Emitted scripts write it
unconditionally, so an authored script states its source with a verb rather than with
a comment a reader has to trust (ADR 0016 / #874).
add_dimension(feature, role, *, axis=None)
¶
Augment the planner's set with one more measurement (ADR 0016 / #872).
feature is a declared-feature handle (what :meth:hole, :meth:boss, … return),
an index into :attr:features, or the IR feature itself. role names the
measurement — "bore.diameter", "grid_pitch", … — and carries no number: the
value is read from the geometry, so the size still lives in exactly one place.
Returns a :class:DimensionIntent.
Soft deprecated (#1043) — supported and not scheduled for removal, but it exists
only to augment :meth:auto_dimensions, which is itself discouraged here. To add a
measurement to an authored set, write a :meth:dimension line: same effect, and the
result is visible in the script rather than computed at runtime.
Requesting a measurement the planner already emits is a deliberate no-op, not an error: a script should be able to ask without first knowing the rule set's mind.
axis disambiguates a role a feature carries more than once — today a grid
pattern's two pitches. Omitting it there raises rather than picking one, because
a silent coin toss between the row and column pitch is the kind of wrong a reader
cannot see.
model()
¶
The IR the engine will draw (detection skipped) — for inspection. Wraps the
declared features into a :class:PartModel without rendering a drawing (#453):
the same wrapping :meth:build hands the engine (part bbox + corner datum + step-
inferred orientation + the P2a decorations), so inspection pays no projection/anno
cost and can't hit a layout/render failure. Wraps the solids body (as :func:_analyse
does), so the bbox/datum match what build() draws even when the part carries
bbox-extending non-solid geometry.
Gated on the dimension source like :meth:build (#874): this is the model the engine
WOULD draw, so a sheet that cannot be built must not hand one out — otherwise
build_drawing(part, model=sheet.model()) is a way around the check, and the two
public surfaces disagree about the same sheet (the #707 class of divergence).
build()
¶
Build the :class:~draftwright.drawing.Drawing — detection skipped; only the
declared features are drawn. Declared corner-block tables (:meth:table/:meth:notes)
are placed last, clear of everything already on the sheet.
export(stem=None, *, formats=('pdf',), dpi=150)
¶
Build the drawing and write the requested formats — a format name or an
iterable from ("svg", "dxf", "pdf", "png"), default PDF (matching the
CLI); return {format: path}. dpi sets the PNG raster resolution.
stem defaults to the drawing number, lower-cased.
formats=None means "unspecified", so it takes this method's default rather than
being forwarded. On :meth:Drawing.export a None selects the deprecated legacy
path, which would have returned a tuple — breaking the dict return documented above —
and raised its warning against this line instead of the caller's (#987, Codex r5). Same
attribution problem that moved make_drawing off that path.
Hole handle¶
_Hole
¶
Bases: _Nameable
A fluent handle for one declared hole — through vs blind (which changes the callout), and the P2a ± tolerance on its bore ⌀.
through()
¶
A through hole (the default) — ⌀ only.
depth(d)
¶
A blind hole d mm deep — adds a depth callout.
tolerance(lo, hi=None)
¶
A ± tolerance on the bore ⌀: symmetric .tolerance(0.05) (→ ±0.05) or a
limit pair .tolerance(0.0, 0.1) (→ +0.1 -0.0).
fit(code, *, show='class')
¶
An ISO 286 fit class on the bore ⌀ — .fit("H7") renders ø8 H7 (the class,
default) or, with show="deviation", the signed deviations ø8 +0.015/0 resolved
for the bore's nominal ⌀. Raises for a class/size outside the built-in table (#29).
cbore(obj=None, *, diameter=None, depth=None)
¶
A counterbore on this hole. .cbore(cbore_cyl) reads its ⌀ + depth off the
counterbore tool object (⌀ from the cylindrical face, depth from the part + tool along
the hole axis — no numbers restated), or pass explicit .cbore(diameter=…, depth=…).
An object supplies defaults; explicit kwargs override (#462).
spotface(obj=None, *, diameter=None, depth=None)
¶
A spotface on this hole — same as :meth:cbore but a shallow facing (#462).
countersink(obj=None, *, major=None, angle=None)
¶
A countersink on this hole (a flat-head screw seat, #575). .countersink(cone_tool)
reads the major ⌀ + included angle off the build123d Cone you subtracted, or explicit
.countersink(major=14, angle=90). Renders ⌵ Ø.. × ..° on the callout. An object
supplies defaults; explicit kwargs override (#451).
thread(spec)
¶
A thread/tap spec folded onto this hole's callout (#764). .thread("M3x0.5")
renders the tap/thread on the bore leader (e.g. ø2.5 THRU M3x0.5) — a structured
aspect that round-trips, so .thread(...).finish(...) gives Ra-on-thread. A
declaration-only aspect (threads are cosmetic, not modelled geometry — no recogniser).
finish(ra, *, view=None, side=None)
¶
A surface-finish symbol (Ra) on this hole's bore (ADR 0011 P2c). .finish("1.6")
— the roughness text; view/side override the derived strip.
note(text, *, view=None, side=None)
¶
A free-text manufacturing note on a leader to this hole (#488). .note("M3x0.5 TAP")
— the shop callout; view/side override the derived strip.
Diameter and step handle¶
_Dim
¶
Bases: _Nameable
A fluent handle for a declared dimension-bearing feature (a diameter / boss OD, or a
turned step), carrying the P2a .tolerance aspect. default_kind is the parameter a
bare .tolerance(...) targets — "diameter" for an OD, "length" for a step.
tolerance(lo, hi=None, *, on=None)
¶
A ± tolerance on this dimension: symmetric .tolerance(0.05) (→ ±0.05) or a
limit pair .tolerance(0.0, 0.1) (→ +0.1 -0.0). on picks the parameter for
a multi-dim feature — a step's "length" (default) vs its "diameter" (OD).
fit(code, *, show='class')
¶
An ISO 286 fit class on this feature's ⌀ (always the diameter — a fit is diametral,
so a step's fit is on its OD, not its length). .fit("h6") renders ø12 h6 (the
class, default) or show="deviation" the signed deviations ø12 0/-0.011 resolved
for the nominal ⌀. Raises for a class/size outside the built-in table (#29).
finish(ra, *, view=None, side=None)
¶
A surface-finish symbol (Ra) on this feature's surface (ADR 0011 P2c).
diameter(journal).finish("0.8"); view/side override the derived strip.
note(text, *, view=None, side=None)
¶
A free-text manufacturing note on a leader to this feature (#488).
diameter(knurl).note("KNURL 0.8 STRAIGHT"); view/side override the strip.
knurl(pitch, pattern='STRAIGHT', *, view=None, side=None)
¶
A knurl callout on this diameter (#765) — diameter(shaft).knurl("0.8") →
KNURL 0.8 STRAIGHT, or .knurl("0.8", "DIAMOND"). Named sugar over :meth:note
(canonical formatting + discoverability): knurl is a text callout on a leader, not
modelled geometry, so no IR/render — it flows through the same note path. view/
side override the derived strip.
thread(spec)
¶
An EXTERNAL thread spec appended to this OD's ⌀ callout (#859) — the turned analog of
:meth:_Hole.thread. step(shaft).thread("M3x0.5") renders ø3 M3x0.5; a structured
aspect on the feature, so .thread(...).finish(...) gives Ra-on-thread. Declaration-only
(threads are cosmetic, rarely modelled as geometry — no recogniser).
Multi-parameter handle¶
_Params
¶
Bases: _Nameable
A fluent handle for a declared MULTI-parameter feature — a pocket
(width/length/depth), slot (width/length) or envelope (width/height/depth) — whose
parameters share a KIND but have distinct ROLES. .tolerance(..., on=role)
tolerances ONE parameter by role (#746: e.g. a pocket's depth without touching its
width/length); a bare .tolerance(...) (no on) folds onto every parameter of
the feature (the back-compat kind-keyed form). on accepts the full role
("pocket_depth") or its short tail ("depth").
Every other attribute forwards to the owning :class:Sheet, so these verbs stay
chainable (sheet.pocket(...).hole(...).build()) despite returning a handle —
the module's declare-then-chain contract holds (#807 review).
tolerance(lo, hi=None, *, on=None)
¶
A ± tolerance: symmetric .tolerance(0.05) (→ ±0.05) or a limit pair
.tolerance(0.0, 0.1) (→ +0.1 -0.0). on targets ONE parameter by role
(on="depth" on a pocket → a role-keyed decoration); omit on to tolerance
every parameter of the feature alike (the kind-keyed form).
note(text, ref=None, *, view=None, side=None)
¶
A free-text manufacturing note (#841). With no ref the note anchors to THIS feature —
sheet.slot(...).note("5X OBROUND SLOT") — mirroring :meth:_Hole.note / :meth:_Dim.note
(previously this raised, because the forwarded Sheet.note needs a target). An explicit
ref (a face or feature) still forwards to :meth:Sheet.note, preserving the handle's
forwarding contract for sheet.slot(...).note("DEBURR", face). Returns the handle
(chainable); view/side override the derived strip.
GD&T control builder¶
_Control
¶
A fluent GD&T feature-control-frame builder (ADR 0011 P2c.2). One method per ISO 1101 characteristic — each appends a control frame on the same target, so chained calls stack::
sheet.control(bore).position(0.1, to="A B").perpendicularity(0.05, to="A")
to= names the referenced datum letter(s) ("A" / "A B" / ("A", "B"));
diameter= prefixes the zone with ⌀ (the default for position/concentricity);
modifier= a material-condition symbol ("M"/"L"/"P"). The target view + strip
are derived once (from the feature/face) when :meth:Sheet.control runs; view=/side=
there override them.
straightness(tol, *, modifier=None)
¶
Apply straightness tolerance tol; no datum reference is permitted.
flatness(tol, *, modifier=None)
¶
Apply flatness tolerance tol; no datum reference is permitted.
circularity(tol, *, modifier=None)
¶
Apply circularity tolerance tol; no datum reference is permitted.
cylindricity(tol, *, modifier=None)
¶
Apply cylindricity tolerance tol; no datum reference is permitted.
profile_line(tol, *, to=None, modifier=None)
¶
Apply line-profile tolerance tol, optionally relative to datum(s) to.
profile_surface(tol, *, to=None, modifier=None)
¶
Apply surface-profile tolerance tol, optionally relative to datum(s) to.
angularity(tol, *, to=None, modifier=None)
¶
Apply angularity tolerance tol relative to datum(s) to.
perpendicularity(tol, *, to=None, modifier=None)
¶
Apply perpendicularity tolerance tol relative to datum(s) to.
parallelism(tol, *, to=None, modifier=None)
¶
Apply parallelism tolerance tol relative to datum(s) to.
position(tol, *, to=None, diameter=True, modifier=None)
¶
Apply position tolerance tol relative to to; diameter selects the zone.
concentricity(tol, *, to=None, diameter=True, modifier=None)
¶
Apply concentricity tolerance tol relative to to; diameter selects the zone.
symmetry(tol, *, to=None, modifier=None)
¶
Apply symmetry tolerance tol relative to datum(s) to.
circular_runout(tol, *, to=None, modifier=None)
¶
Apply circular-runout tolerance tol relative to datum(s) to.
total_runout(tol, *, to=None, modifier=None)
¶
Apply total-runout tolerance tol relative to datum(s) to.