Commit Graph
4802 Commits
Author SHA1 Message Date
Hakan Seven 21f33e933e Merge pull request #1777 from ramox81/codex/refedit-dialog
REFEDIT: Reference Edit dialog and unique names for xref objects

# Conflicts:
#	locales/ar-SA/opencadstudio.ftl
#	locales/bg-BG/opencadstudio.ftl
#	locales/cs-CZ/opencadstudio.ftl
#	locales/de-DE/opencadstudio.ftl
#	locales/el-GR/opencadstudio.ftl
#	locales/en-US/opencadstudio.ftl
#	locales/es-ES/opencadstudio.ftl
#	locales/fi-FI/opencadstudio.ftl
#	locales/fr-FR/opencadstudio.ftl
#	locales/hi-IN/opencadstudio.ftl
#	locales/hu-HU/opencadstudio.ftl
#	locales/it-IT/opencadstudio.ftl
#	locales/ja-JP/opencadstudio.ftl
#	locales/ko-KR/opencadstudio.ftl
#	locales/lo-LA/opencadstudio.ftl
#	locales/nl-NL/opencadstudio.ftl
#	locales/pl-PL/opencadstudio.ftl
#	locales/pt-BR/opencadstudio.ftl
#	locales/ru-RU/opencadstudio.ftl
#	locales/tr-TR/opencadstudio.ftl
#	locales/zh-CN/opencadstudio.ftl
#	locales/zh-TW/opencadstudio.ftl
#	src/app/control/actions.rs
#	src/app/mod.rs
#	src/app/view/modal.rs
2026-10-14 12:10:40 +03:00
Hakan SevenandClaude Opus 5.5 006d85c362 i18n: translate the REFEDIT working-set buttons
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 12:06:32 +03:00
Hakan Seven dec3ba2743 Merge pull request #1778 from ramox81/codex/refedit-toolbar
REFEDIT session toolbar: definition name, working set count and REFSET buttons
2026-10-14 12:05:19 +03:00
Hakan SevenandClaude Opus 5.5 06e3a6976c i18n, mcp: translate Image Adjust; pin the schema with image_adjust
#1776 left its dialog in English outside tr-TR and added the
image_adjust automation action without re-pinning the MCP tool schema
digest, which failed tool_schema_digest_is_pinned.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 12:05:00 +03:00
Hakan Seven ff5833c35e Merge pull request #1776 from ramox81/codex/imageadjust-dialog
IMAGEADJUST: Image Adjust dialog for raster images
2026-10-14 12:01:13 +03:00
JuCeIbMo 278163bb22 i18n(es): translate the Sheet Set Manager
Translate the 159 Sheet Set Manager strings still in English, using the
terms already in the file: Conjunto de planos, plano, Presentación,
espacio modelo / papel. Variables, NEWSHEETSET and file masks are untouched.
2026-10-14 04:17:46 -04:00
Karim Jerbi 07fd162bd6 fix(history): preserve native networks during unrelated undo
Synchronize the native parametric graph only when replay changes constraints or named parameters. Geometry and visibility history preserve existing imported network identities and ownership. Add a regression for a rejected block copy followed by local undo and redo.
2026-10-14 09:11:55 +01:00
Karim Jerbi 78bdfa3c74 feat(block-editor): add Save Block As
Create a new named definition from current session edits, restore the source checkpoint, and continue editing the copy with fresh local history. Add the name dialog and Save dropdown, clone supported owned metadata onto independent handles, and refuse unsupported relationships atomically.
2026-10-14 09:11:55 +01:00
ramox81andClaude Opus 5.5 74d65c26be REFEDIT session toolbar: definition name, working set count, REFSET
The right-edge toolbar of a REFEDIT session now shows the definition
being edited (REFEDITNAME) as an accent pill with the number of objects
in the working set, Add to / Remove from Working Set buttons with their
own icons (REFSET Add / Remove, straight to object selection), and
Save / Discard in a separate group below a rule.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:51:22 +03:00
ramox81andClaude Opus 5.5 92a3a8ee4d REFEDIT: Edit Reference dialog and unique names for xref objects
REFEDIT opens a dialog after the pick: the nesting chain as chips with a
preview of the chosen definition, all objects or picking them in the
drawing, attribute definitions (offered only when the definition has
them), locking objects outside the working set and unique names for an
external reference's named objects. The settings are remembered.

With unique names an xref's dependent layers, linetypes, text styles and
blocks are checked out as $N$NAME records of their own; without, under
the plain name, sharing a host record of that name. Save writes them back
under the reference's names, and the records made for the session are
removed when it closes. -REFEDIT uses the remembered settings.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:39:28 +03:00
ramox81andClaude Opus 5.5 2f55c73457 IMAGEADJUST: Image Adjust dialog for raster images
IMAGEADJUST (alias IAD) takes the selected raster images or asks
"Select image(s):", then opens a dialog with a before/after preview of
the first image and brightness, contrast and fade rows (bar plus
stepper, whole numbers 0-100). Apply writes the values to every chosen
image as one undo step; restore defaults sets 50/50/0. Adds the
image_adjust automation action and the image-adjust locale group.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:11:36 +03:00
Hakan SevenandClaude Opus 5.5 da8e976a60 feat(bedit): author visibility states of dynamic blocks
In the Block Editor, BVSTATE makes a new visibility state, makes one
current, renames or deletes one; BVHIDE and BVSHOW hide or show the
picked objects in the current state (BVSHOW shows every object of the
block while they are picked). The first use makes the block dynamic.

The states are stored as the format keeps them: a
BLOCKVISIBILITYPARAMETER in the block's ACAD_ENHANCEDBLOCK evaluation
graph with its visibility grip and the grip's two location expressions,
the round-trip purge preventer, AcDbDynamicBlockTrueName /
AcDbDynamicBlockGUID / AcDbBlockRepETag on the definition and element
tags on each of its objects. The definition shows its first state; a
reference given another state gets its own evaluated *U copy, tagged
AcDbBlockRepBTag and linked back through AcDbBlockRepresentation /
AcDbRepData, so it shows that state and the other references do not
change. Saving the block drops erased objects from the states.

Checked: a block authored this way reads back with its states and
reference link from DWG and DXF, and the ODA converter accepts the DWG.

Closes #1566

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:02:34 +03:00
Hakan SevenandClaude Opus 5.5 353c1b0d0f Cargo: codec 3bdc002, kernel a496394, graph 04ca67c
DXF references find their dynamic block; block classes can be given the
reference's flags.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:02:34 +03:00
Hakan SevenandClaude Opus 5.5 92bbafccd0 Cargo: codec 347c32a, kernel bbd1054, graph 1d2e3b5
Block records keep their own XDATA through DXF and DWG.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:25:31 +03:00
Hakan Seven 592289f4fd Merge pull request #1774 from megabrain-agent/feat/font-register
feat(web): font_register control op for host-supplied font files
2026-10-14 09:11:06 +03:00
Hakan SevenandClaude Opus 5.5 527e38839a style(overlay): describe the MATCHPROP brush without product names
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:10:58 +03:00
Hakan Seven c3cf45d859 Merge pull request #1773 from Ch4rlos/feat/matchprop-brush-cursor
feat(ui): paintbrush cursor while MATCHPROP is armed
2026-10-14 09:10:35 +03:00
Hakan SevenandClaude Opus 5.5 2ba368557c i18n(fr): product name, accents and the usual French command terms
Keep the product name Open CAD Studio, restore the accents of Colinéaire
and Égal, and use the established French terms for the array commands
(Réseau rectangulaire / polaire / trajectoire) and Lissage for loft.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:10:23 +03:00
Hakan Seven fad4643679 Merge pull request #1767 from NJdevPro/main
Improve French localization in opencadstudio.ftl
2026-10-14 09:09:02 +03:00
Hakan SevenandClaude Opus 5.5 39c830d213 fix(layout): a new layout keeps its sheet until it is saved unopened
add_layout took the sheet viewport out, so the first viewport added to
the layout afterwards (by automation, or a plugin) was read as the sheet
and the scale pill and paper camera followed it. The sheet now stays and
is fitted to the page when the layout first opens; a layout saved before
that is still written without viewports.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:08:39 +03:00
Hakan SevenandClaude Opus 5.5 0a0d57ed25 fix(layout): first opening fits the sheet, never drops the user's viewports
Opening a layout whose page setup was never filled in took every viewport
out of it, including viewports onto the model a file carries (plenty of
DXF writers leave the paper fields empty). With only the sheet taken out
instead, the next viewport would have been read as the sheet. The sheet
is now fitted to the new page and every other viewport stays.

A layout saved as never opened keeps its state when it already holds a
viewport onto the model (one added by automation), and only its sheet is
taken out otherwise.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:04:38 +03:00
Hakan Seven 86df079182 Merge pull request #1744 from ramox81/codex/layout-first-open-followups
Layouts: first opening follows the page setup; viewports picked by their frame
2026-10-14 08:54:19 +03:00
Hakan SevenandClaude Opus 5.5 1eda5cd22d fix(refedit): write the whole definition back to an xref, keep a .bak
REFCLOSE Save on an xref replaced the referenced file's model space with
the working set alone. With the Nested selection method the objects that
were not checked out stay in the definition, but they were deleted from
the file on disk. Write back every object of the saved definition, and
copy the file to .bak first when ISAVEBAK is on, as a drawing save does.

Also translate the new REFEDIT prompts into the other 20 locales; the
catalog test requires every locale.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 08:51:23 +03:00
Hakan Seven 7e763080cb Merge pull request #1752 from ramox81/codex/refedit-parity
REFEDIT: reference prompts, -REFEDIT, REFSET, nested references and xref write-back
2026-10-14 08:46:42 +03:00
Hakan SevenandClaude Opus 5.5 46dec40f4d fix(image): adjusted rasters keep their source alive; doc back on resolve_image
The brightness/contrast cache keyed entries by the source buffer's
address without holding it, so a reloaded image whose new buffer landed
at the freed address could be shown with the old file's pixels. Each
entry now holds its source. The new functions had also been inserted
between resolve_image's doc comment and the function, merging that text
into the lookup table's documentation; it is back where it belongs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 08:45:22 +03:00
Hakan Seven f6fc244430 Merge pull request #1751 from ramox81/codex/adjust-parity
ADJUST: images and underlays, -IMAGEADJUST and PDF/DWF/DGNADJUST
2026-10-14 08:42:35 +03:00
Hakan Seven f8908e151f Merge pull request #1754 from ramox81/codex/attach-command-line
ATTACH: FILEDIA, -ATTACH command line and reference file types

# Conflicts:
#	src/app/settings.rs
#	src/app/update/file.rs
2026-10-14 08:39:34 +03:00
Hakan SevenandClaude Opus 5.5 d0c292aedd i18n: translate the Underlay OSnap vary state in every locale
#1753 added the string to en-US and tr-TR only; the catalog test requires
all 22 locales.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 08:38:36 +03:00
Hakan Seven 7d306eec5e Merge pull request #1753 from ramox81/codex/insert-reference-ribbon
Insert ribbon: Reference panel order and Snap to Underlays state
2026-10-14 08:35:47 +03:00
Hakan Seven 7f143d5be2 Merge pull request #1755 from ramox81/codex/external-references-close
External References palette: open/close commands, ERSTATE and reference aliases
2026-10-14 08:35:47 +03:00
Hakan Seven d0dddb03cb Merge pull request #1756 from ramox81/codex/xref-fade-setting
XDWGFADECTL: ask again after an invalid value and keep it in the profile
2026-10-14 08:35:34 +03:00
Hakan Seven 3196febb40 Merge pull request #1757 from ramox81/codex/ulayers-empty-drawing
ULAYERS opens without underlays; the ribbon button runs ULAYERS
2026-10-14 08:35:34 +03:00
Hakan Seven 77825c1b15 Merge pull request #1758 from ramox81/codex/clip-enter-silent
CLIP: Enter at the object prompt ends silently

# Conflicts:
#	src/command.rs
2026-10-14 08:35:03 +03:00
Hakan Seven 4313f4b263 Merge pull request #1760 from ramox81/codex/dwf-set-origin
DWF underlays: read the W2D set-origin opcode
2026-10-14 08:34:21 +03:00
Hakan SevenandClaude Opus 5.5 25990e3713 Cargo: codec d1ebd21, kernel 0423154, graph 79570a2
Brings in the merged codec PRs (XCLIP transforms in the reference order,
table entries added after load get handles in DXF, default APPID handle
collision, viewport ShadePlot and grid flags) and the kernel's sweep and
off-plane revolve work.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 08:33:20 +03:00
Carlos Quiroga 1b72115f50 feat(ui): paintbrush cursor while MATCHPROP is armed
MATCHPROP transfers properties from a source object onto others, so the CAD
crosshair gives way to a monochrome paintbrush whose tip sits on the pick
point - the AutoCAD feel for the same command.

The glyph borrows the crosshair's own colour (including a user-customised
one) and uses a single stroke weight plus one filled wedge, so it reads as
part of the CAD cursor family rather than clip-art. It is drawn instead of
the crosshair, never on top of it, and only while the command is armed.
2026-10-13 20:32:25 -06:00
megabrain-agentandClaude Opus 5.5 0998cb9e88 feat(web): font_register control op for host-supplied font files
The web build has no font folder, so a text style whose TrueType file is
not a bundled Noto subset falls back to it. font_register takes the file
from the host page:

  {"op":"font_register","file_name":"Brand-Regular.ttf","data_base64":"…"}

The faces join the font database, file_name resolves to the family of
the first face (case-insensitive, without directory, like installed
fonts), and open drawings lay their text out again (fallback glyph
cache cleared, text geometry invalidated per tab). The reply names the
family and the number of faces. Bytes without a face fail with
font_invalid. SysFonts::by_file becomes updatable for this.

Proposed in #1771.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:26:51 +02:00
Karim Jerbi acb8c5ea54 scene: deep-clone extension-dictionary trees on in-drawing copy
A copied entity used to keep its source's extension-dictionary
handle, so the copy and source shared one tree and edits crossed
between them. In-drawing copy now clones the whole tree onto fresh
handles: dictionary entries, owners, reactors, nested xdictionary
links, and XRecord handle references that land inside the tree are
remapped; references leaving it stay pointed at the originals. A
dangling or missing root leaves the copy without an extension
dictionary rather than sharing. Annotative context trees and the
paste/export clone path are unchanged. Undo stays on the full
snapshot path when a tree is cloned.
2026-10-13 21:24:56 +01:00
Nicolas Janin 6adfc256cf Improve French localization in opencadstudio.ftl
Updated French translations for various UI elements and messages.
2026-10-13 22:02:06 +02:00
Hakan SevenandClaude Opus 5.5 881d237629 feat(array): ARRAYEDIT Source edits what an associative array repeats
ARRAYEDIT picks an associative array (or takes the preselected one) and
its Source option opens the objects every item repeats in the Block
Editor; saving there updates all items at once. Counts and spacings stay
in Properties.

Refs #1109

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 22:29:56 +03:00
Hakan SevenandClaude Opus 5.5 780b54489e feat(input): touch screen gestures on the drawing
One finger already worked as the mouse. Two or more fingers now make a
gesture instead of fighting over the cursor: two drag to pan and pinch to
zoom about the fingers, three drag to orbit; a quick two-finger tap opens
the context menu, a three-finger tap zooms to the extents and a quick
three-finger swipe up shows the isometric view. While a gesture runs the
drawing area's own pointer handling keeps out, and the press the first
finger started is dropped.

Refs #906

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 22:25:13 +03:00
Hakan SevenandClaude Opus 5.5 fcf1cedf52 feat(select): Ctrl+click picks one segment of a polyline
Ctrl+click on a polyline selects the segment under the cursor (again to
drop it); several segments can be picked. Only the picked segments are
highlighted, and MOVE, ROTATE, SCALE and MIRROR then change just their
vertices, so the neighbouring segments stretch to follow. Any other
selected objects are transformed whole as before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 22:14:56 +03:00
Hakan SevenandClaude Opus 5.5 11f68a1185 feat(clipboard): paste images from other programs on desktop too
A paste that finds no text now reads an image off the system clipboard
on desktop as well as on the web. The pixels are written as a PNG beside
the drawing (or in the config folder for a drawing never saved) and
placed as a raster image at the cursor, the same way the web paste
attaches a screenshot. PASTESPEC falls back to the same image paste when
the clipboard holds neither objects nor text.

Refs #645

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 22:08:14 +03:00
Hakan SevenandClaude Opus 5.5 d4b4fc37e1 feat(model): SECTIONCULL erases what lies outside a section
SECTIONCULL keeps only what the selected section object (or the live
section of the space) shows: solids, surfaces and closed meshes are cut
to it with the same planes the live section uses, open meshes are
clipped face by face, and every other object wholly outside it is
erased. Objects across the boundary that cannot be cut stay whole. One
undo step.

The section's bounding planes are gathered once (section_planes) and
shared by the live section and the cull.

Refs #1407

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 21:59:25 +03:00
Hakan SevenandClaude Opus 5.5 adbcac8a02 feat(start): recent files as a list, icons or large previews
Three toggles beside the Recent Documents title switch the panel between
the existing list, a grid of thumbnail tiles and one large preview per
file. The choice is kept in the recent section of the app config.

Refs #1494

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 21:46:40 +03:00
Hakan SevenandClaude Opus 5.5 58b2f22c09 feat(compare): COMPARE overlays what differs from another drawing
COMPARE picks a drawing (or takes its path) and matches its objects with
this drawing's by what they draw: type, layer and tessellated geometry,
so an unchanged copy matches whatever its handle. Objects only here are
outlined in green, objects only in the other drawing in red, over the
current drawing, and Next / Previous zoom from one difference to the
next with a count in the prompt. A moved or edited object shows as one
of each. eXit (or Esc) clears the overlay.

Refs #970

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 21:31:46 +03:00
Hakan SevenandClaude Opus 5.5 f0ac89629b feat(array): ARRAYRECT and ARRAYPOLAR create associative arrays
With the new Associative option on (the default), ARRAYRECT and
ARRAYPOLAR build the array the way the drawing format stores one: the
selected objects move into an anonymous source block, an anonymous
array block holds one ByBlock reference to it per item, an INSERT of
the array block takes their place, and an AcDbAssocAction with an
AcDbAssocArrayActionBody, its three dependencies, the BaseNormal /
Origin / basePoint parameters and the value parameters tie them
together in the model-space network. The array is then edited from
Properties like an array read from a file.

The option flips with AS and is remembered for the session; on a
rotated working plane the commands keep making plain copies. Saving
drops the action of an array whose reference was erased or exploded.

Checked: created arrays reopen as associative with their parameters
and items, and the ODA converter reads the saved DWG without errors.

Refs #1109

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 21:23:48 +03:00
Hakan SevenandClaude Opus 5.5 2bf77e4bd6 feat(array): edit associative arrays through their standard records
An associative array is an AcDbAssocAction with an
AcDbAssocArrayActionBody, dependencies on the array INSERT, the block
holding the item references and the block holding the source objects,
and value parameters (Items, ItemSpacing, Rows, …). Selecting the array
INSERT now shows its counts and spacings in Properties; changing one
places the items again and rewrites the item references, the body's
item records and the parameter values together, in one undo step, so
the drawing stays associative when saved.

Rectangular arrays follow their RowProfile axis, AxesAngle and base
normal; polar arrays turn about the centre recovered from their first
item, Radius and StartAngle. Both match the stored items of the
associative arrays in the sample drawings (122 of 123 rectangular, all
polar items of the polar samples). Path arrays are shown read-only.

Refs #1109

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:32:51 +03:00
Hakan SevenandClaude Opus 5.5 b371a0a59e Cargo: codec c6f5d51, kernel 3d77c6b, graph c4a341f
codec reads the line curve of edge action parameters, which carries the
row axis of associative rectangular arrays.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:32:51 +03:00
Karim Jerbi f39fb31137 feat(block-editor): isolate session history and add save checkpoints 2026-10-13 15:35:24 +01:00