fix: open-issue sweep — drawing, plot, snap, layout and UI fixes

Fixes:
- Font prompt no longer lists bundled ltypeshp/qcadshp shape files (#1626)
- Wide polylines step at a discontinuous segment width; PEDIT marks the
  current vertex; keyword steps refresh the command preview (#1628)
- Radius-0 fillet drops the zero-length segment it left, so the corner
  fillets again (#1422)
- FILLET Trim / No trim option (#1558)
- True-colour wires plot in their own colour; colour picker stores the
  value it shows (#1621)
- Model tab keeps its page setup; "Save changes to layout" in Model (#1620)
- QNEW default template in Options > Files; .dwt in the open dialog
  (#1134, #1113)
- GRIDUNIT / GRIDMODE / PERSPECTIVE variables (#1618, #1524)
- PTYPE (#1433)
- ZOOM nX / nXP (#1465)
- CHSPACE between model and paper space through a viewport (#1428)
- Moving a dimension keeps its automatic text placement
- Shell icon; "&&" button labels (#1554)
- LINETYPE Load from a .lin file (#1588)
- XLINE / RAY hide the crosshair arms (#1437)
- Dynamic-input boxes keep clear of the crosshair and each other (#1546)
- Snap marker colour setting, dark default on light canvases
  (#1497, #1229, #1128)
- Dimension style precision as a 0.00 pattern dropdown (#1426)
- Node graph nodes left of the origin no longer clip away (#1592)
- Collapse button in the command history header (#1094)
- Freeze-in-current-viewport toggle in the ribbon layer list (#1466)
- Geometric Center object snap for closed polylines (#1369)

New strings translated in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 5.5 committed 2026-10-06 15:59:30 +03:00
1 parent abf302eba5
commit 178c7dff41
70 files changed
+1227 -145

No files matched your search

+4 -1
View File
@@ -82,7 +82,10 @@ pub fn missing_shx_fonts(doc: &CadDocument) -> Vec<String> {
// The primary font and the big font (Asian double-byte glyphs) are
// both plain .shx files the style depends on.
for file in [style.font_file.trim(), style.big_font_file.trim()] {
if file.is_empty() || !file.to_ascii_lowercase().ends_with(".shx") {
if file.is_empty()
|| !file.to_ascii_lowercase().ends_with(".shx")
|| crate::io::linetypes::is_bundled_shape_file(file)
{
continue;
}
let resolved = crate::io::resolve_image_file(file, base).is_some()
+7
View File
@@ -345,6 +345,13 @@ fn bundled_shape_name(file: &str, number: i16) -> Option<&'static str> {
.map(|(_, name, _)| *name)
}
/// Whether `file` is a shape file the bundled LFF substitutes stand in for,
/// so its absence on disk never needs reporting.
pub fn is_bundled_shape_file(file: &str) -> bool {
let stem = shape_file_stem(file);
BUNDLED_SHAPES.iter().any(|(f, _, _)| *f == stem)
}
/// The drawing's shape-file STYLE for `file`, added when missing (an empty
/// name, as shape files are stored).
fn shape_file_style(doc: &mut CadDocument, file: &str) -> codec::Handle {
+12 -1
View File
@@ -170,9 +170,10 @@ impl From<&str> for OpenLoadError {
pub async fn pick_open_path() -> Option<(PathBuf, u64)> {
let handle = crate::sys::file_dialog()
.set_title(crate::t!("Open CAD file").as_ref())
.add_filter(crate::t!("CAD Files").as_ref(), &["dwg", "dxf", "bak", "sv$", "DWG", "DXF", "BAK"])
.add_filter(crate::t!("CAD Files").as_ref(), &["dwg", "dxf", "dwt", "bak", "sv$", "DWG", "DXF", "DWT", "BAK"])
.add_filter(crate::t!("DWG Files").as_ref(), &["dwg", "DWG"])
.add_filter(crate::t!("DXF Files").as_ref(), &["dxf", "DXF"])
.add_filter(crate::t!("Drawing Template (*.dwt)").as_ref(), &["dwt", "DWT"])
.add_filter(crate::t!("Backup / Autosave").as_ref(), &["bak", "sv$", "BAK"])
.add_filter(crate::t!("All Files").as_ref(), &["*"])
.pick_file()
@@ -1761,6 +1762,16 @@ mod save_failure_tests {
/// picked from outside the plot styles folder is copied into it (unless a
/// file of that name is already there), so the dialog lists it from now on
/// and page setups naming it resolve after a restart.
/// Pick a `.lin` linetype definition file and return its text (#1588).
pub async fn pick_linetype_file() -> Option<String> {
let handle = crate::sys::file_dialog()
.set_title(crate::t!("Load Linetypes").as_ref())
.add_filter(crate::t!("Linetype Files").as_ref(), &["lin", "LIN"])
.pick_file()
.await?;
Some(String::from_utf8_lossy(&handle.read().await).into_owned())
}
pub async fn pick_plot_style() -> Result<Option<plot_style::PlotStyleTable>, String> {
let dialog = crate::sys::file_dialog()
.set_title(crate::t!("Load Plot Style Table").as_ref())
+3 -1
View File
@@ -771,7 +771,9 @@ fn append_pdf_page(
}
// Near-white and near-yellow (viewport active border) → dark grey for print
// (only when no CTB override was applied).
if !color_overridden {
// `aci == 0` is an explicit true colour and plots as drawn, like the
// hatch pass (#1621); only a pure white there is an unresolved colour 7.
if !color_overridden && (wire.aci != 0 || [r, g, b] == [1.0; 3]) {
// An authored white (not colour 7) plots as drawn, like on screen.
let is_light = r > 0.80
&& g > 0.80