forked from 1b-agent/opencadstudio-upstream
feat(python): text and dimension styles (doc.text_styles, doc.dim_styles)
Extends TableOperation with text style create/modify, dimension style create/modify (DimStyle fields as a validated JSON object), rename, delete and set-current. Reuses OCS's style in-use scan and reference-following rename (four style_ops methods widened to pub(super)); a renamed text style also updates dimension styles that name it. Real-IPC audit with DWG/DXF persistence and undo, IPC and Python unit tests, docs. Four cadcodec findings are pinned by canaries. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b7b6e2cef5
commit
aaea15e4ef
11 files changed
+894
-8
No files matched your search
@@ -102,6 +102,49 @@ pub enum TableOperation {
|
||||
LayerDelete { name: String, erase_objects: bool },
|
||||
/// Make an existing layer current.
|
||||
LayerSetCurrent { name: String },
|
||||
/// Create a text style; unset properties take the AutoCAD defaults.
|
||||
TextStyleCreate { config: TextStyleConfig },
|
||||
/// Change only the properties `config` sets on an existing text style.
|
||||
TextStyleModify { config: TextStyleConfig },
|
||||
/// Create a dimension style, optionally copying an existing one first.
|
||||
/// `properties` is a JSON object of DimStyle fields (see the Python docs);
|
||||
/// handles and xref fields are managed by the host and refused.
|
||||
DimStyleCreate { name: String, copy_from: Option<String>, properties: String },
|
||||
/// Change only the DimStyle fields the JSON object `properties` names.
|
||||
DimStyleModify { name: String, properties: String },
|
||||
/// Rename a text or dimension style; references to it follow. `Standard`
|
||||
/// is never renamed and a case-only change is refused.
|
||||
StyleRename { kind: TableStyleKind, from: String, to: String },
|
||||
/// Delete a text or dimension style that is neither current nor in use.
|
||||
/// `Standard` is never deleted.
|
||||
StyleDelete { kind: TableStyleKind, name: String },
|
||||
/// Make a text or dimension style current.
|
||||
StyleSetCurrent { kind: TableStyleKind, name: String },
|
||||
}
|
||||
|
||||
/// The style tables `TableOperation` can rename, delete or make current.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub enum TableStyleKind {
|
||||
Text,
|
||||
Dim,
|
||||
}
|
||||
|
||||
/// Properties for creating or changing a text style; `None` leaves a property
|
||||
/// as it was (or the default for a new style). Angles are in radians.
|
||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
|
||||
pub struct TextStyleConfig {
|
||||
pub name: String,
|
||||
/// Fixed height; `0` lets each text choose its own.
|
||||
pub height: Option<f64>,
|
||||
pub width_factor: Option<f64>,
|
||||
pub oblique_angle: Option<f64>,
|
||||
pub font_file: Option<String>,
|
||||
pub big_font_file: Option<String>,
|
||||
pub true_type_font: Option<String>,
|
||||
pub backward: Option<bool>,
|
||||
pub upside_down: Option<bool>,
|
||||
pub vertical: Option<bool>,
|
||||
pub annotative: Option<bool>,
|
||||
}
|
||||
|
||||
/// A kernel operation on ACIS-backed solids (API v7, additive). The host owns
|
||||
|
||||
@@ -122,6 +122,15 @@ mod tests {
|
||||
TableOperation::LayerRename { from: "A".into(), to: "B".into() },
|
||||
TableOperation::LayerDelete { name: "A".into(), erase_objects: true },
|
||||
TableOperation::LayerSetCurrent { name: "A".into() },
|
||||
TableOperation::TextStyleCreate {
|
||||
config: crate::host::TextStyleConfig { name: "T".into(), height: Some(2.5), oblique_angle: Some(0.2), backward: Some(true), ..Default::default() },
|
||||
},
|
||||
TableOperation::TextStyleModify { config: crate::host::TextStyleConfig { name: "T".into(), font_file: Some("romans".into()), ..Default::default() } },
|
||||
TableOperation::DimStyleCreate { name: "D".into(), copy_from: Some("Standard".into()), properties: "{\"dimscale\":2}".into() },
|
||||
TableOperation::DimStyleModify { name: "D".into(), properties: "{}".into() },
|
||||
TableOperation::StyleRename { kind: crate::host::TableStyleKind::Text, from: "A".into(), to: "B".into() },
|
||||
TableOperation::StyleDelete { kind: crate::host::TableStyleKind::Dim, name: "A".into() },
|
||||
TableOperation::StyleSetCurrent { kind: crate::host::TableStyleKind::Dim, name: "A".into() },
|
||||
] {
|
||||
let bytes = bincode::serialize(&PluginRequest::TableOperation { operation: operation.clone() }).unwrap();
|
||||
assert!(matches!(bincode::deserialize::<PluginRequest>(&bytes).unwrap(),
|
||||
|
||||
Reference in new issue
Block a user