#!/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()
