forked from 1b-agent/opencadstudio-upstream
feat(properties): resolve Hyperlink (XDATA) and custom Material name
Fill the two placeholder rows added earlier. Read the General group's Hyperlink from the entity's XDATA (the "PE_URL" application record's first string). When an entity carries an explicit material (material_flags == 3), resolve its material_handle to the Material object's name and show it in the 3D Visualization group instead of "Custom". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
1f2d543755
commit
41f4a062dc
2 files changed
+46
-1
No files matched your search
@@ -74,6 +74,39 @@ impl OpenCADStudio {
|
|||||||
let mut sections =
|
let mut sections =
|
||||||
dispatch::properties_sectioned(handle, entity, &text_style_names);
|
dispatch::properties_sectioned(handle, entity, &text_style_names);
|
||||||
|
|
||||||
|
// Resolve a custom material handle (material_flags == 3) to
|
||||||
|
// its name in the 3D Visualization group.
|
||||||
|
{
|
||||||
|
let common = entity.common();
|
||||||
|
if common.material_flags == 3 {
|
||||||
|
if let Some(mh) = common.material_handle {
|
||||||
|
if let Some(name) = self.tabs[i]
|
||||||
|
.scene
|
||||||
|
.document
|
||||||
|
.objects
|
||||||
|
.iter()
|
||||||
|
.find_map(|(h, o)| match o {
|
||||||
|
acadrust::objects::ObjectType::Material(m) if *h == mh => {
|
||||||
|
Some(m.name.clone())
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
{
|
||||||
|
for section in sections.iter_mut() {
|
||||||
|
if let Some(row) =
|
||||||
|
section.props.iter_mut().find(|p| p.field == "material")
|
||||||
|
{
|
||||||
|
row.value =
|
||||||
|
crate::scene::model::object::PropValue::ReadOnly(
|
||||||
|
name.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Inject viewport-only properties that require doc access.
|
// Inject viewport-only properties that require doc access.
|
||||||
if let acadrust::EntityType::Viewport(vp) = entity {
|
if let acadrust::EntityType::Viewport(vp) = entity {
|
||||||
let frozen_names: Vec<String> = vp
|
let frozen_names: Vec<String> = vp
|
||||||
|
|||||||
Vendored
+13
-1
@@ -11,6 +11,18 @@ pub fn general_section(entity: &EntityType) -> PropSection {
|
|||||||
};
|
};
|
||||||
let transp_pct = (common.transparency.alpha() as f64 / 255.0 * 100.0).round() as u32;
|
let transp_pct = (common.transparency.alpha() as f64 / 255.0 * 100.0).round() as u32;
|
||||||
|
|
||||||
|
// Hyperlink is stored in XDATA under the "PE_URL" application.
|
||||||
|
let hyperlink = common
|
||||||
|
.extended_data
|
||||||
|
.get_record("PE_URL")
|
||||||
|
.and_then(|r| {
|
||||||
|
r.values.iter().find_map(|v| match v {
|
||||||
|
acadrust::xdata::XDataValue::String(s) if !s.is_empty() => Some(s.clone()),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
PropSection {
|
PropSection {
|
||||||
title: "General".into(),
|
title: "General".into(),
|
||||||
props: vec![
|
props: vec![
|
||||||
@@ -64,7 +76,7 @@ pub fn general_section(entity: &EntityType) -> PropSection {
|
|||||||
Property {
|
Property {
|
||||||
label: "Hyperlink".into(),
|
label: "Hyperlink".into(),
|
||||||
field: "hyperlink",
|
field: "hyperlink",
|
||||||
value: PropValue::ReadOnly(String::new()),
|
value: PropValue::ReadOnly(hyperlink),
|
||||||
},
|
},
|
||||||
Property {
|
Property {
|
||||||
label: "Invisible".into(),
|
label: "Invisible".into(),
|
||||||
|
|||||||
Reference in new issue
Block a user