- 完成多版本测试(22.2, 23.6, 24.12, 25.3) - 发现API设计问题:无法访问CAD特定功能 - 提供5个解决方案,推荐使用ezdxf替代方案 - 创建完整的测试脚本和分析报告 - 包含详细的README文档
254 lines
9.4 KiB
Python
254 lines
9.4 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
DWG文件结构调试脚本
|
||
功能:详细分析DWG文件的内部结构,找出所有可访问的属性和方法
|
||
作者:AI Assistant
|
||
日期:2024
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
from pathlib import Path
|
||
import aspose.cad as cad
|
||
from aspose.cad.imageoptions import CadRasterizationOptions, PngOptions
|
||
from aspose.cad import Color
|
||
|
||
def print_separator(title=""):
|
||
"""打印分隔线"""
|
||
print("=" * 60)
|
||
if title:
|
||
print(f" {title} ")
|
||
print("=" * 60)
|
||
|
||
def analyze_object_structure(obj, name="Object", max_depth=2, current_depth=0):
|
||
"""递归分析对象结构"""
|
||
if current_depth >= max_depth:
|
||
return
|
||
|
||
print(f"{' ' * current_depth}{name}: {type(obj).__name__}")
|
||
|
||
# 获取所有属性
|
||
attrs = []
|
||
methods = []
|
||
|
||
for attr_name in dir(obj):
|
||
if not attr_name.startswith('_'):
|
||
try:
|
||
attr_value = getattr(obj, attr_name)
|
||
if callable(attr_value):
|
||
methods.append(attr_name)
|
||
else:
|
||
attrs.append((attr_name, attr_value))
|
||
except:
|
||
pass
|
||
|
||
# 打印属性
|
||
if attrs:
|
||
print(f"{' ' * (current_depth + 1)}属性:")
|
||
for attr_name, attr_value in attrs[:10]: # 只显示前10个属性
|
||
try:
|
||
if hasattr(attr_value, '__len__') and not isinstance(attr_value, str):
|
||
print(f"{' ' * (current_depth + 2)}{attr_name}: {type(attr_value).__name__} (长度: {len(attr_value)})")
|
||
else:
|
||
print(f"{' ' * (current_depth + 2)}{attr_name}: {attr_value}")
|
||
except:
|
||
print(f"{' ' * (current_depth + 2)}{attr_name}: <无法访问>")
|
||
|
||
# 打印方法
|
||
if methods:
|
||
print(f"{' ' * (current_depth + 1)}方法:")
|
||
for method_name in methods[:10]: # 只显示前10个方法
|
||
print(f"{' ' * (current_depth + 2)}{method_name}()")
|
||
|
||
print()
|
||
|
||
def debug_dwg_structure(dwg_path):
|
||
"""调试DWG文件结构"""
|
||
print_separator("DWG文件结构分析")
|
||
|
||
if not os.path.exists(dwg_path):
|
||
print(f"✗ 文件不存在: {dwg_path}")
|
||
return
|
||
|
||
try:
|
||
# 获取文件基本信息
|
||
file_size = os.path.getsize(dwg_path)
|
||
print(f"文件路径: {dwg_path}")
|
||
print(f"文件大小: {file_size:,} 字节 ({file_size/1024/1024:.2f} MB)")
|
||
|
||
# 加载DWG文件
|
||
print("正在加载DWG文件...")
|
||
with cad.Image.load(dwg_path) as image:
|
||
print(f"✓ 成功加载DWG文件")
|
||
|
||
# 分析图像对象
|
||
print_separator("图像对象分析")
|
||
analyze_object_structure(image, "Image", max_depth=1)
|
||
|
||
# 尝试访问各种可能的属性
|
||
print_separator("尝试访问图像属性")
|
||
|
||
# 基本属性
|
||
basic_attrs = ['width', 'height', 'size', 'format', 'bounds']
|
||
for attr in basic_attrs:
|
||
try:
|
||
value = getattr(image, attr)
|
||
print(f"✓ {attr}: {value}")
|
||
except Exception as e:
|
||
print(f"✗ {attr}: {e}")
|
||
|
||
# CAD相关属性
|
||
cad_attrs = ['entities', 'blocks', 'layers', 'styles', 'dimensions', 'texts', 'lines']
|
||
for attr in cad_attrs:
|
||
try:
|
||
value = getattr(image, attr)
|
||
if value is not None:
|
||
print(f"✓ {attr}: {type(value).__name__} (长度: {len(value) if hasattr(value, '__len__') else 'N/A'})")
|
||
|
||
# 如果是集合,分析第一个元素
|
||
if hasattr(value, '__len__') and len(value) > 0:
|
||
print(f" 第一个元素类型: {type(value[0]).__name__}")
|
||
analyze_object_structure(value[0], f"{attr}[0]", max_depth=1)
|
||
else:
|
||
print(f"✗ {attr}: None")
|
||
except Exception as e:
|
||
print(f"✗ {attr}: {e}")
|
||
|
||
# 尝试其他可能的属性
|
||
other_attrs = ['drawing', 'model', 'layout', 'paper_space', 'model_space']
|
||
for attr in other_attrs:
|
||
try:
|
||
value = getattr(image, attr)
|
||
if value is not None:
|
||
print(f"✓ {attr}: {type(value).__name__}")
|
||
analyze_object_structure(value, attr, max_depth=1)
|
||
else:
|
||
print(f"✗ {attr}: None")
|
||
except Exception as e:
|
||
print(f"✗ {attr}: {e}")
|
||
|
||
# 尝试遍历所有属性
|
||
print_separator("所有可用属性")
|
||
all_attrs = []
|
||
for attr_name in dir(image):
|
||
if not attr_name.startswith('_'):
|
||
try:
|
||
attr_value = getattr(image, attr_name)
|
||
all_attrs.append((attr_name, type(attr_value).__name__))
|
||
except:
|
||
all_attrs.append((attr_name, "无法访问"))
|
||
|
||
# 按类型分组显示
|
||
type_groups = {}
|
||
for attr_name, attr_type in all_attrs:
|
||
if attr_type not in type_groups:
|
||
type_groups[attr_type] = []
|
||
type_groups[attr_type].append(attr_name)
|
||
|
||
for attr_type, attrs in type_groups.items():
|
||
print(f"{attr_type}: {', '.join(attrs[:5])}{'...' if len(attrs) > 5 else ''}")
|
||
|
||
# 尝试获取CAD特定信息
|
||
print_separator("CAD特定信息")
|
||
try:
|
||
# 检查是否是CAD图像
|
||
if hasattr(image, 'is_cad'):
|
||
print(f"is_cad: {image.is_cad}")
|
||
|
||
# 检查CAD版本
|
||
if hasattr(image, 'cad_version'):
|
||
print(f"cad_version: {image.cad_version}")
|
||
|
||
# 检查单位
|
||
if hasattr(image, 'units'):
|
||
print(f"units: {image.units}")
|
||
|
||
# 检查坐标系
|
||
if hasattr(image, 'coordinate_system'):
|
||
print(f"coordinate_system: {image.coordinate_system}")
|
||
|
||
except Exception as e:
|
||
print(f"获取CAD特定信息失败: {e}")
|
||
|
||
# 尝试不同的访问方法
|
||
print_separator("尝试不同的访问方法")
|
||
|
||
# 方法1:尝试获取所有实体
|
||
try:
|
||
if hasattr(image, 'get_entities'):
|
||
entities = image.get_entities()
|
||
print(f"get_entities(): {type(entities).__name__} (长度: {len(entities) if hasattr(entities, '__len__') else 'N/A'})")
|
||
except Exception as e:
|
||
print(f"get_entities(): {e}")
|
||
|
||
# 方法2:尝试获取所有块
|
||
try:
|
||
if hasattr(image, 'get_blocks'):
|
||
blocks = image.get_blocks()
|
||
print(f"get_blocks(): {type(blocks).__name__} (长度: {len(blocks) if hasattr(blocks, '__len__') else 'N/A'})")
|
||
except Exception as e:
|
||
print(f"get_blocks(): {e}")
|
||
|
||
# 方法3:尝试获取所有图层
|
||
try:
|
||
if hasattr(image, 'get_layers'):
|
||
layers = image.get_layers()
|
||
print(f"get_layers(): {type(layers).__name__} (长度: {len(layers) if hasattr(layers, '__len__') else 'N/A'})")
|
||
except Exception as e:
|
||
print(f"get_layers(): {e}")
|
||
|
||
# 方法4:尝试遍历
|
||
try:
|
||
if hasattr(image, '__iter__'):
|
||
print("图像对象可迭代,尝试遍历...")
|
||
count = 0
|
||
for item in image:
|
||
print(f" 项目 {count}: {type(item).__name__}")
|
||
count += 1
|
||
if count >= 5: # 只显示前5个
|
||
break
|
||
print(f"总共找到 {count} 个项目")
|
||
except Exception as e:
|
||
print(f"遍历图像对象失败: {e}")
|
||
|
||
except Exception as e:
|
||
print(f"✗ 调试失败: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print_separator("DWG文件结构调试工具")
|
||
print("此工具将详细分析DWG文件的内部结构")
|
||
print()
|
||
|
||
# 查找DWG文件
|
||
dwg_files = list(Path('.').glob('*.dwg'))
|
||
|
||
if not dwg_files:
|
||
print("✗ 当前目录下未找到DWG文件")
|
||
print("请确保DWG文件在当前目录中")
|
||
return
|
||
|
||
print(f"找到 {len(dwg_files)} 个DWG文件:")
|
||
for i, dwg_file in enumerate(dwg_files, 1):
|
||
print(f" {i}. {dwg_file}")
|
||
|
||
# 使用第一个DWG文件进行调试
|
||
test_file = str(dwg_files[0])
|
||
print(f"\n使用文件进行调试: {test_file}")
|
||
|
||
# 调试文件结构
|
||
debug_dwg_structure(test_file)
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
main()
|
||
except KeyboardInterrupt:
|
||
print("\n\n用户中断了程序执行")
|
||
except Exception as e:
|
||
print(f"\n\n程序执行出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|