Add the typed document facade and plugin IPC adapter. Prepare bulk edits before mutation, preserve undo and dirty state, keep profile elevations, validate numeric inputs and session bindings, and generate Python constructors with typed results. Reuse existing entity transforms and profile conversion. Compute mass properties and closed-surface bounds in cadkernel; pin its main revision 6a5e6fc2822f6af6b2611cd605b44437b35158f0. Keep plugin API metadata at version 6. Validation: 646 native application tests, 597 kernel tests, 12 document API tests, 91 plugin API tests, 3 Python tests, default/IPC feature builds and wasm32 check passed.
14 KiB
ocs_doc_api — API reference (auto-generated)
Envelope version: 1
Do NOT edit: regenerated by build.rs from spec/entities.toml.
Solid (acadrust Solid3D, collection solids)
B-rep solid. Host resolves bodies via the solid_models cache (lift-on-miss from ACIS SAT).
Constructors (doc.solids())
- create_cuboid(origin: [f64; 3], size: [f64; 3]) ->
Solid—CreateSolid; fixed primitive="Cuboid" - create_sphere(centre: [f64; 3], radius: f64) ->
Solid—CreateSolid; fixed primitive="Sphere" - create_cylinder(base: [f64; 3], radius: f64, height: f64) ->
Solid—CreateSolid; fixed primitive="Cylinder" - create_cone(base: [f64; 3], radius: f64, height: f64) ->
Solid—CreateSolid; fixed primitive="Cone" - create_torus(centre: [f64; 3], major_radius: f64, minor_radius: f64) ->
Solid—CreateSolid; fixed primitive="Torus" - create_wedge(origin: [f64; 3], size: [f64; 3]) ->
Solid—CreateSolid; fixed primitive="Wedge" - extrude(profile: EntityRef, direction: [f64; 3]) ->
Solid—Extrude - revolve(profile: EntityRef, pivot: [f64; 3], axis: [f64; 3], angle: f64) ->
Solid—Revolve - loft(profiles: &[EntityRef]) ->
Solid—Loft
Methods
- intersect(other: Solid) ->
Solid— opSolidBoolean; fixed erase_sources=true, op="Intersection" - union(other: Solid) ->
Solid— opSolidBoolean; fixed erase_sources=true, op="Union" - subtract(other: Solid) ->
Solid— opSolidBoolean; fixed erase_sources=true, op="Difference" - volume() ->
f64— queryGetVolume - centroid() ->
[f64; 3]— queryGetCentroid - intersects(other: Solid) ->
bool— queryGetIntersects
Line (acadrust Line, collection curves)
Constructors (doc.curves())
- create_line(start: [f64; 3], end: [f64; 3]) ->
Line—CreateCurve; fixed curve="Line"
Circle (acadrust Circle, collection curves)
Constructors (doc.curves())
- create_circle(centre: [f64; 3], radius: f64) ->
Circle—CreateCurve; fixed curve="Circle"
Polyline (acadrust LwPolyline, collection curves)
Constructors (doc.curves())
- create_polyline(points: &f64; 3, closed: bool) ->
Polyline—CreateCurve; fixed curve="Polyline"
Methods
- add_vertex(at: usize, point: [f64; 3]) ->
()— opAddVertex
Point (acadrust Point, collection curves)
Constructors (doc.curves())
- create_point(position: [f64; 3]) ->
Point—CreateCurve; fixed curve="Point" - create_points(positions: &f64; 3) ->
Vec<Point>(bulk op) —CreateMany; fixed curve="Point"
ArcCurve (acadrust Arc, collection curves)
Constructors (doc.curves())
- create_arc(centre: [f64; 3], radius: f64, start_angle: f64, end_angle: f64) ->
ArcCurve—CreateCurve; fixed curve="Arc"
Ellipse (acadrust Ellipse, collection curves)
Constructors (doc.curves())
- create_ellipse(centre: [f64; 3], major_axis: [f64; 3], ratio: f64, start: f64, end: f64) ->
Ellipse—CreateCurve; fixed curve="Ellipse"
Spline (acadrust Spline, collection curves)
Constructors (doc.curves())
- create_spline(degree: i32, control_points: &f64; 3, knots: &[f64], weights: &[f64]) ->
Spline—CreateCurve; fixed curve="Spline"
Ray (acadrust Ray, collection curves)
Constructors (doc.curves())
- create_ray(origin: [f64; 3], direction: [f64; 3]) ->
Ray—CreateCurve; fixed curve="Ray"
XLine (acadrust XLine, collection curves)
Constructors (doc.curves())
- create_xline(origin: [f64; 3], direction: [f64; 3]) ->
XLine—CreateCurve; fixed curve="XLine"
Text (acadrust Text, collection curves)
Single-line text annotation. content()/set_content() read+replace the value; transform moves insertion point.
Constructors (doc.curves())
- create_text(value: &str, insertion_point: [f64; 3], height: f64, rotation: f64) ->
Text—CreateText
Methods
- content() ->
String— queryGetTextContent - set_content(value: &str) ->
()— opSetTextContent
MText (acadrust MText, collection curves)
Multi-line text annotation. content()/set_content() read+replace the value; transform moves insertion point.
Constructors (doc.curves())
- create_mtext(value: &str, insertion_point: [f64; 3], height: f64) ->
MText—CreateMText
Methods
- content() ->
String— queryGetTextContent - set_content(value: &str) ->
()— opSetTextContent
Entity (acadrust Hatch, collection curves)
Filled region over a closed polyline boundary. boundary() returns the loops; bounds from boundary; generic delete.
Constructors (doc.curves())
- create_hatch(boundary: &f64; 2, solid: bool) ->
Entity—CreateHatch
Methods
- boundary() ->
Vec<Vec<[f64; 2]>>— queryGetHatchBoundary
Dimension (acadrust Dimension, collection curves)
Linear dimension between two measured points. measurement() reads the distance; bounds from the measured + definition points.
Constructors (doc.curves())
- create_dimension_linear(first_point: [f64; 3], second_point: [f64; 3], definition_point: [f64; 3]) ->
Dimension—CreateDimensionLinear - create_dimension_radius(center: [f64; 3], point: [f64; 3]) ->
Dimension—CreateDimensionRadius - create_dimension_diameter(center: [f64; 3], point: [f64; 3]) ->
Dimension—CreateDimensionDiameter - create_dimension_angular(vertex: [f64; 3], first_point: [f64; 3], second_point: [f64; 3], arc_location: [f64; 3]) ->
Dimension—CreateDimensionAngular - create_dimension_angular2ln(vertex: [f64; 3], first_point: [f64; 3], second_point: [f64; 3], arc_location: [f64; 3]) ->
Dimension—CreateDimensionAngular2Ln
Methods
- measurement() ->
f64— queryGetDimensionMeasurement
Entity (acadrust Insert, collection entities)
Block reference. Place an existing BlockRecord by name; transform moves its insert point.
Constructors (doc.entities())
- create_insert(block_name: &str, insert_point: [f64; 3], scale: f64, rotation: f64) ->
Entity—CreateInsert
Methods
- attributes() ->
Vec<(String, String)>— queryGetAttributes - set_attribute(tag: &str, value: &str) ->
()— opSetAttribute
Entity (acadrust AttributeDefinition, collection entities)
In-block attribute definition (ATTDEF): tag/prompt/default at an insertion point.
Constructors (doc.entities())
- create_attribute_definition(tag: &str, prompt: &str, default_value: &str, insertion_point: [f64; 3], height: f64, rotation: f64) ->
Entity—CreateAttributeDefinition
Entity (acadrust Viewport, collection entities)
Paper-space viewport: a width×height window at center looking at view_target with view_height zoom. bounds = center ± w/2,h/2; transform moves center.
Constructors (doc.entities())
- create_viewport(center: [f64; 3], width: f64, height: f64, view_target: [f64; 3], view_height: f64) ->
Entity—CreateViewport
Methods
- viewport_view() ->
([f64; 3], f64)— queryGetViewportView - set_view(view_target: [f64; 3], view_height: f64) ->
()— opSetViewportView
Entity (acadrust RasterImage, collection entities)
Raster image: create_raster_image(file_path, insertion, u, v, size) places an image (host auto-registers the ImageDefinition); bounds (4-corner bracket); delete.
Constructors (doc.entities())
- create_raster_image(file_path: &str, insertion_point: [f64; 3], u_vector: [f64; 3], v_vector: [f64; 3], size: [f64; 2]) ->
Entity—CreateRasterImage
Entity (acadrust Table, collection entities)
Table: create_table(insertion_point, data[row][col]) builds rows x columns of text cells; non-rectangular grid -> Validation; delete.
Constructors (doc.entities())
- create_table(insertion_point: [f64; 3], data: &[Vec]) ->
Entity—CreateTable
Generic methods (every handle)
Every typed handle (Solid, Line, Circle, Polyline, Point, ArcCurve,
Ellipse, Spline, Ray, XLine, Text, MText, Dimension, Entity) is a
Clone, Send, Sync token { ObjectId, session } and supports:
id()->ObjectId— the stable entity identity.bounds()->Aabb— coarse bounding box (solids lift-on-miss; 2D entities computed; later families may beUnsupported).transform(placement)— in-place rigid similarity (sameObjectId). v1: solids only.delete()— remove the entity (one undo step).
Entity additionally has view() (id + kind + bounds) and as_solid() (typed
downcast when kind == "Solid3D").
Collections & cross-cutting
DocApi— root:document(tab),active_tab(),alive().Document—solids()/curves()/entities()factories + lookup,revision(),assert_revision(rev)(read-guard),query_batch(|q| …)(read-only batch, one round-trip, no revision bump).EntityCollection—get(id) -> Entity,delete(id),transform_many(&ids, placement),delete_many(&ids).OpGroup— best-effort client-side failure cleanup (track/commit/compensate). Not a transaction: no atomicity, no rollback.
Bulk ops — single op, all-or-nothing, item-capped
CreateMany / TransformMany / DeleteMany are single write ops: one undo
step, one publish, and all-or-nothing via upfront validation (no rollback).
Item-capped at BULK_ITEM_CAP = 100_000 to bound host execution. Use them for
bulk data (N ≳ a few hundred); per-op autocommit is the right tool for
modeling-scale work.
Semantics
- Per-op autocommit, no write transactions. Every write op is ONE atomic host call = one undo step. Multi-op write transactions were removed (security/ integrity review).
- Per-op atomicity. Validate + compute geometry before any mutation; a
failed op applies nothing and records no undo step.
erase_sourcesbooleans run only on success. - Structured errors.
ApiError::{Validation, Geometry, UnknownId, Unsupported, Transport}; bulk validation names the failing index; a stale handle returnsUnknownId(never a panic).
Kernel mapping
| op | kernel call | returns |
|---|---|---|
| CreateSolid.Cuboid | cadkernel::brep::make::cuboid |
Option |
| CreateSolid.Sphere | cadkernel::brep::make::sphere |
Option |
| SolidBoolean | cadkernel::brep::combine |
Result<Body, Snag> |
| Transform | cadkernel::brep::transform |
Option |
| GetBounds | cadkernel::brep::body_bounds |
Option |
| GetVolume | cadkernel::brep::mesh_body + divergence |
computed |
Wire vocabulary
Every Operation is ONE atomic write op (one undo step); every Query is read-only (safe to batch). Variants are append-only (bincode discriminant stability). Requests ride DocApiEnvelope: Op(Operation) for a write, Queries(Vec<Query>) for a read batch.
Operation
CreateSolid(SolidPrimitive)CreateCurve(Curve2Spec)Extrude { profile: ObjectId, direction: [f64; 3] }Revolve { profile: ObjectId, axis: ([f64; 3], [f64; 3]), angle: f64 }Transform { id: ObjectId, placement: PlacementSpec }SolidBoolean { op: BoolOp, a: ObjectId, b: ObjectId, erase_sources: bool }AddVertex { id: ObjectId, at: usize, point: [f64; 3] }Delete { id: ObjectId }CreateMany(Vec<EntitySpec>)TransformMany { ids: Vec<ObjectId>, placement: PlacementSpec }DeleteMany(Vec<ObjectId>)CreateInsert(InsertSpec)CreateViewport(ViewportSpec)CreateText(TextSpec)CreateMText(MTextSpec)SetTextContent { id: ObjectId, value: String }CreateHatch(HatchSpec)CreateDimensionLinear(DimensionSpec)SetAttribute { id: ObjectId, tag: String, value: String }SetViewportView { id: ObjectId, view_target: [f64; 3], view_height: f64 }CreateRasterImage(RasterImageSpec)Loft { profiles: Vec<ObjectId> }CreateDimensionRadius(DimensionRadialSpec)CreateDimensionDiameter(DimensionRadialSpec)CreateDimensionAngular(DimensionAngularSpec)CreateAttributeDefinition(AttributeDefinitionSpec)CreateTable(TableSpec)CreateDimensionAngular2Ln(DimensionAngularSpec)
Query
GetEntity { id: ObjectId }GetBounds { id: ObjectId }GetCentroid { id: ObjectId }GetVolume { id: ObjectId }GetIntersects { a: ObjectId, b: ObjectId }GetGeometryRevisionGetTextContent { id: ObjectId }GetHatchBoundary { id: ObjectId }GetDimensionMeasurement { id: ObjectId }GetAttributes { id: ObjectId }GetBlockEntities { block_name: String }GetViewportView { id: ObjectId }
Errors (ApiError)
| Variant | Meaning |
|---|---|
Validation { op, reason } |
Input rejected before any document mutation. |
Geometry { kind, msg } |
The kernel failed (boolean refused, invalid input, ACIS lift/lower). |
UnknownId(ObjectId) |
The handle is stale / deleted / never existed (never a panic). |
Unsupported(String) |
Capability not supported for this entity or backend. |
Transport(String) |
The channel failed (disconnected / oversized / timeout). |
ApiError is serializable, so IPC returns the same structured error the in-process
executor produced.
Envelope & transport
DocApiEnvelope { version, body } — body is Op(Operation) (a single write) or
Queries(Vec<Query>) (a read batch). bincode-serialized; version is the crate's
envelope version (bridges must check it). Transports: InProcess (host) and
OcsPluginApiIpc (plugin over ocs_plugin_api), both behind the Transport: Send + Sync trait (apply(envelope) -> Receipt, alive()). Receipt carries
outcome (per-op result), query_results, and new_revision.