Selecting an entity refreshed the Properties panel but the Layer / Color /
Linetype / Lineweight dropdowns kept showing the creation-time defaults
— so they couldn't be used to inspect or edit a single object's settings.
refresh_properties() now also calls sync_ribbon_from_selection(), which
walks the current selection and mirrors common values into ribbon.active_*
fields. Mixed selections leave the prior value in place (no "*Varies*"
chip yet); an empty selection restores per-tab creation defaults.
Closes#17
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Commands receive click coordinates in local space (DXF coords minus
world_offset) for camera precision. Without correction, entities were
placed world_offset away from the clicked position in existing drawings
that have a non-zero centroid (e.g. UTM-coordinate drawings).
Re-add world_offset via acadrust::Transform::from_translation (f64
precision) in commit_entity before the entity is inserted into the
DXF document. Paper-space entities are exempt as they use sheet coords.
Fixes#11
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Grip points in paper space now use the 2-D linear to_px transform
(tx/ty/ortho_size) instead of the 3-D view_proj matrix, matching the
coordinate system used by PaperCanvas
- world_offset is no longer subtracted from paper-space entity grip
positions — paper-space coordinates are already unoffset (same rule
as wire tessellation in wires_for_block)
- MTEXT v_offset corrected for all attachment points: CXF glyphs sit
on the baseline and extend upward, so Top attachment needs v_offset=-h,
Bottom needs (n_lines-1)*line_h, Middle is the midpoint of the two
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Entity grips() return world-space coordinates (raw DXF values). After
the world_offset change the camera view_proj is in local space, so
projecting world-space grips through it gave wrong screen positions and
hit-test failures.
- refresh_selected_grips: subtract world_offset from every grip.world
so selected_grips are stored in local (camera) space
- Grip drag: cursor/snap positions are already local space; for
GripApply::Absolute add world_offset back before passing to entity
so entity coordinates stay in world space. Translate deltas are
identical in both spaces so no conversion is needed there.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
White paper fill was calculated from entity bounding boxes (paper_entity_extents),
so adding a viewport caused the paper to visually shrink to the viewport's bounds.
Now paper_limits() (layout min/max limits) is used directly, and the unused
paper_entity_extents() function is removed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- mline.rs: MLine renders center spine + two parallel offset lines at
±scale/2 using the vertex miter directions; vertex grips; scale,
closed and style-name properties
- tolerance.rs: Tolerance renders the GDT text string via font
tessellation at insertion_point with rotation from direction vector;
insertion grip and position properties
- properties.rs: Dimension entity's style_name EditText is upgraded to
a Choice dropdown when document.dim_styles is non-empty, enabling
point-and-click DimStyle assignment without a separate panel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- properties.rs: inject 'UCS Name' Choice property for viewports when
document.ucss is non-empty; resolves current handle to display name
- update.rs: intercept PropGeomChoiceChanged for 'vp_ucs_name'; clones
UCS origin/x_axis/y_axis into viewport and sets ucs_handle — no
trait signature change required
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Paper limits:
- Change A4 fallback from 12×9 to 297×210 mm in paper_limits()
Context menu:
- Translate layout context menu labels to English (Rename / Delete)
Viewport clipping:
- Replace AABB-only culling with proper Cohen-Sutherland line clipping
in viewport_content_wires(); each projected segment is now clipped at
the exact viewport boundary instead of being included or discarded whole
- Add cs_clip() and clip_polyline_to_rect() free functions in scene/mod.rs
Frozen layers per-viewport UI:
- Inject a "Frozen Layers" EditText property in the Properties panel for
viewport entities (layer names resolved from handles at display time)
- Handle "frozen_layers" in PropGeomCommit: parse comma-separated names,
resolve to layer handles, update vp.frozen_layers in-place
PDF export improvements:
- Add offset_x/offset_y params to export_pdf() for model-space normalization:
coordinates are shifted so the drawing origin maps to the page origin
- Model space export computes extents via model_space_extents() (now public)
and adds a 5 % margin; falls back to A4 landscape for empty drawings
- Skip __paper_boundary__ wire in PDF (white background covers it)
- Map yellow (active viewport border) → black and cyan (vp border) → dark
blue for print-friendly output
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add model_space_extents() to Scene: collects key_vertices from all
model-space entities to compute an AABB.
- Add auto_fit_viewport() to Scene: sets view_target to model centroid
and derives custom_scale / view_height so the content fits the new
viewport with a 10% margin.
- Call auto_fit_viewport() in commit_entity() after a viewport is added
to a paper-space layout, so newly placed viewports immediately show
model-space content at a sensible scale.
- Scale line_weight_px by the viewport scale factor when projecting
model-space wires into paper space, so dimension arrows and annotation
lines appear at the correct visual thickness.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Viewport ID uniqueness: commit_entity assigns max_existing_id+1
instead of always using id=2
- Lock/On boolean toggles in Properties panel (vp_locked, vp_on)
backed by status.locked / status.is_on fields
- Standard scale Choice picker: 1:500 to 10:1 (also syncs view_height)
- Numeric scale edit now syncs view_height when changed
- Standard view Choice picker: Top/Bottom/Front/Back/Left/Right/4×Iso
updates view_direction vector via apply_geom_prop
- Viewport content not rendered when status.is_on is false
- current_layout_block_handle_pub() added for external access
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>