forked from 1b-agent/opencadstudio-upstream
fix(blocks): one block definition service for delete, rename and purge on every path
new src/scene/block_service.rs (references, delete, rename, purge candidates, name validation, one error type and message). The command-line RENAME, palette Remove, plugin API, control/MCP block_delete and PURGE all use it. Layout, xref, dynamic-block, anonymous and open-in-editor records are protected; PURGE removes an anonymous block only when nothing references it. PROTOCOL CHANGE: control/MCP block_delete refuses a referenced block unless force=true (erases referencing INSERTs in one undo step). New REST route DELETE /api/v1/blocks/{name}?force=true. MCP tool digest re-pinned. Undo labels are Delete block X, Rename block X to Y and Purge.
This commit is contained in:
1 parent
5dfa41c032
commit
2b50b6c858
16 files changed
+2701
-262
No files matched your search
File diff suppressed because it is too large.
Load diff
@@ -6,6 +6,7 @@
|
||||
// view — camera, transforms, viewport, render pipeline driver
|
||||
// cache — block-definition and property caches
|
||||
pub mod annotative;
|
||||
pub mod block_service;
|
||||
pub mod cache;
|
||||
pub mod convert;
|
||||
pub mod creation_style;
|
||||
|
||||
@@ -1027,44 +1027,6 @@ pub fn entity_block_uses(
|
||||
uses
|
||||
}
|
||||
|
||||
/// Blocks referenced by document-level styles rather than a concrete entity.
|
||||
pub fn document_block_uses(document: &CadDocument) -> Vec<BlockUse> {
|
||||
let mut uses = Vec::new();
|
||||
for style in document.dim_styles.iter() {
|
||||
for handle in [style.dimblk, style.dimblk1, style.dimblk2, style.dimldrblk] {
|
||||
push_dependency_use(&mut uses, document, handle, BlockRole::ArrowHead);
|
||||
}
|
||||
for name in [&style.dimblk_name, &style.dimblk1_name, &style.dimblk2_name] {
|
||||
if let Some(record) = block_record_by_name(document, name) {
|
||||
push_dependency_use(&mut uses, document, record.handle, BlockRole::ArrowHead);
|
||||
}
|
||||
}
|
||||
}
|
||||
for object in document.objects.values() {
|
||||
let codec::objects::ObjectType::MultiLeaderStyle(style) = object else {
|
||||
continue;
|
||||
};
|
||||
if let Some(handle) = style.arrowhead_handle {
|
||||
push_dependency_use(&mut uses, document, handle, BlockRole::ArrowHead);
|
||||
}
|
||||
if let Some(handle) = style.block_content_handle {
|
||||
push_dependency_use(&mut uses, document, handle, BlockRole::MultiLeaderContent);
|
||||
}
|
||||
}
|
||||
for line_type in document.line_types.iter() {
|
||||
for symbol in crate::scene::convert::dgn_linestyle::symbol_blocks(document, &line_type.name)
|
||||
{
|
||||
push_dependency_use(
|
||||
&mut uses,
|
||||
document,
|
||||
symbol.block,
|
||||
BlockRole::LineStyleSymbol,
|
||||
);
|
||||
}
|
||||
}
|
||||
uses
|
||||
}
|
||||
|
||||
const MAX_MINSERT_INSTANCES: usize = 20_000;
|
||||
|
||||
pub fn array_offsets(insert: &Insert) -> Vec<[f64; 3]> {
|
||||
|
||||
Reference in new issue
Block a user