如何用Rust获取AutoCAD属性值?遇attribute.value无返回问题求助
问题原因及解决方案
你的问题核心是混淆了**属性定义(AttributeDefinition)和属性实例(Attribute)**的区别:
AttributeDefinition是块定义里的"属性模板",仅用来定义属性的名称、提示文本等结构,它的value字段通常为空,不会存储实际插入块时填写的属性值。- 带有实际值的属性,是存在**块引用(BlockReference)**中的
Attribute实体里——也就是当你把块插入到图纸中时,填写的属性值会保存在这里。
修正后的代码示例
#![allow(non_snake_case)] #![allow(unused_imports)] use dxf::entities::*; use dxf::Drawing; use std::collections::HashMap; #[allow(dead_code)] fn main() { let mut omap = HashMap::new(); let mut count: u16 = 0; // 加载DXF文件 let desenho = Drawing::load_file("file.dxf").unwrap(); // 遍历图纸中的所有实体,定位目标块的引用 for entity in desenho.entities() { match entity.specific { EntityType::BlockReference(ref block_ref) => { // 匹配目标块名称"FL01" if block_ref.name == "FL01" { count += 1; // 遍历块引用附带的属性实例 for attr in &block_ref.attributes { match attr.specific { EntityType::Attribute(ref attribute) => { match attribute.text_tag.as_str() { "TIPO" => { omap.insert(attribute.text_tag.clone(), attribute.value.clone()); println!("TIPO 值: {}", attribute.value); } "SEQ-1" => { omap.insert(attribute.text_tag.clone(), attribute.value.clone()); println!("SEQ-1 值: {}", attribute.value); } _ => {} } } _ => {} } } } } _ => {} } } println!("{:?}, 找到的块引用数量:{}", omap, count); }
关键说明
- 不要遍历
desenho.blocks()(块定义集合),而是遍历desenho.entities()(图纸中的实体),寻找BlockReference类型的实体——这才是块插入到图纸中的实际实例。 - 每个
BlockReference的attributes字段,才是存储用户输入的实际属性值的地方,这里的Attribute实体才有你需要的value。 - 原代码中的
AttributeDefinition仅用于块的结构定义,不会保存任何实际属性数据。
内容的提问来源于stack exchange,提问作者Loizm
相关产品推荐
相关产品推荐

