#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Aspose.CAD 真正问题调试脚本
功能：深入分析Aspose.CAD无法提取线条的真正原因
作者：AI Assistant
日期：2024
"""

import os
import sys
import traceback
from pathlib import Path

def print_separator(title=""):
    """打印分隔线"""
    print("=" * 60)
    if title:
        print(f" {title} ")
        print("=" * 60)

def debug_image_object():
    """深入调试Image对象"""
    print_separator("深入调试Image对象")
    
    try:
        import aspose.cad as cad
        
        # 查找DWG文件
        dwg_files = list(Path('.').glob('*.dwg'))
        if not dwg_files:
            print("✗ 未找到DWG文件")
            return
        
        test_file = str(dwg_files[0])
        print(f"使用文件: {test_file}")
        
        # 加载DWG文件
        with cad.Image.load(test_file) as image:
            print(f"成功加载DWG文件")
            print(f"图像类型: {type(image).__name__}")
            print(f"图像尺寸: {image.width} x {image.height}")
            
            # 检查Image对象的所有属性
            print(f"\nImage对象的所有属性:")
            all_attrs = [attr for attr in dir(image) if not attr.startswith('_')]
            for attr in all_attrs:
                try:
                    value = getattr(image, attr)
                    if callable(value):
                        print(f"  方法: {attr}()")
                    else:
                        print(f"  属性: {attr} = {value}")
                except Exception as e:
                    print(f"  属性: {attr} (访问失败: {e})")
            
            # 尝试不同的访问方式
            print(f"\n尝试不同的访问方式:")
            
            # 方法1：检查是否有CAD特定的属性
            cad_attrs = ['cad_image', 'cad_drawing', 'drawing', 'model', 'layout']
            for attr in cad_attrs:
                try:
                    if hasattr(image, attr):
                        value = getattr(image, attr)
                        print(f"  ✓ {attr}: {type(value).__name__}")
                        if hasattr(value, '__len__'):
                            print(f"    长度: {len(value)}")
                    else:
                        print(f"  ✗ {attr}: 不存在")
                except Exception as e:
                    print(f"  ✗ {attr}: 访问失败 - {e}")
            
            # 方法2：尝试转换为其他类型
            print(f"\n尝试类型转换:")
            try:
                # 检查是否有as_cad_image方法
                if hasattr(image, 'as_cad_image'):
                    cad_image = image.as_cad_image()
                    print(f"  ✓ as_cad_image(): {type(cad_image).__name__}")
                else:
                    print(f"  ✗ as_cad_image(): 不存在")
            except Exception as e:
                print(f"  ✗ as_cad_image(): 失败 - {e}")
            
            # 方法3：检查是否有get_entities方法
            try:
                if hasattr(image, 'get_entities'):
                    entities = image.get_entities()
                    print(f"  ✓ get_entities(): {type(entities).__name__}")
                    if hasattr(entities, '__len__'):
                        print(f"    实体数量: {len(entities)}")
                else:
                    print(f"  ✗ get_entities(): 不存在")
            except Exception as e:
                print(f"  ✗ get_entities(): 失败 - {e}")
            
            # 方法4：检查是否有get_blocks方法
            try:
                if hasattr(image, 'get_blocks'):
                    blocks = image.get_blocks()
                    print(f"  ✓ get_blocks(): {type(blocks).__name__}")
                    if hasattr(blocks, '__len__'):
                        print(f"    块数量: {len(blocks)}")
                else:
                    print(f"  ✗ get_blocks(): 不存在")
            except Exception as e:
                print(f"  ✗ get_blocks(): 失败 - {e}")
            
            # 方法5：检查是否有get_layers方法
            try:
                if hasattr(image, 'get_layers'):
                    layers = image.get_layers()
                    print(f"  ✓ get_layers(): {type(layers).__name__}")
                    if hasattr(layers, '__len__'):
                        print(f"    图层数量: {len(layers)}")
                else:
                    print(f"  ✗ get_layers(): 不存在")
            except Exception as e:
                print(f"  ✗ get_layers(): 失败 - {e}")
            
            # 方法6：尝试遍历图像对象
            try:
                if hasattr(image, '__iter__'):
                    print(f"  ✓ 图像对象可迭代")
                    count = 0
                    for item in image:
                        print(f"    项目 {count}: {type(item).__name__}")
                        count += 1
                        if count >= 5:
                            break
                    print(f"    总共找到 {count} 个项目")
                else:
                    print(f"  ✗ 图像对象不可迭代")
            except Exception as e:
                print(f"  ✗ 遍历图像对象失败: {e}")
            
    except Exception as e:
        print(f"✗ 调试Image对象失败: {e}")
        traceback.print_exc()

def check_cad_specific_classes():
    """检查CAD特定类"""
    print_separator("检查CAD特定类")
    
    try:
        import aspose.cad as cad
        
        # 尝试导入CAD特定的类
        cad_classes = [
            'CadImage',
            'CadDrawing',
            'CadDocument',
            'CadFile',
            'CadEntity',
            'CadLine',
            'CadPolyline',
            'CadBlock',
            'CadLayer'
        ]
        
        for class_name in cad_classes:
            try:
                # 尝试从不同模块导入
                modules_to_try = [
                    'aspose.cad',
                    'aspose.cad.fileformats',
                    'aspose.cad.fileformats.cad',
                    'aspose.cad.fileformats.cad.cadobjects',
                    'aspose.cad.fileformats.cad.cadobjects.cadentities'
                ]
                
                imported = False
                for module_name in modules_to_try:
                    try:
                        module = __import__(module_name, fromlist=[class_name])
                        if hasattr(module, class_name):
                            cls = getattr(module, class_name)
                            print(f"  ✓ {class_name}: 从 {module_name} 导入成功")
                            print(f"    类型: {type(cls).__name__}")
                            imported = True
                            break
                    except ImportError:
                        continue
                    except Exception as e:
                        print(f"    ✗ 导入失败: {e}")
                        continue
                
                if not imported:
                    print(f"  ✗ {class_name}: 无法导入")
                    
            except Exception as e:
                print(f"  ✗ {class_name}: 检查失败 - {e}")
        
    except Exception as e:
        print(f"✗ 检查CAD特定类失败: {e}")

def test_direct_cad_loading():
    """测试直接加载CAD文件"""
    print_separator("测试直接加载CAD文件")
    
    try:
        # 查找DWG文件
        dwg_files = list(Path('.').glob('*.dwg'))
        if not dwg_files:
            print("✗ 未找到DWG文件")
            return
        
        test_file = str(dwg_files[0])
        print(f"使用文件: {test_file}")
        
        # 方法1：尝试使用CadImage.load
        try:
            from aspose.cad.fileformats.cad import CadImage
            print("✓ 成功导入CadImage")
            
            cad_image = CadImage.load(test_file)
            print(f"✓ 成功使用CadImage.load加载文件")
            print(f"  类型: {type(cad_image).__name__}")
            
            # 检查CadImage的属性
            print(f"\nCadImage对象属性:")
            cad_attrs = [attr for attr in dir(cad_image) if not attr.startswith('_')]
            for attr in cad_attrs[:10]:  # 只显示前10个
                try:
                    value = getattr(cad_image, attr)
                    if callable(value):
                        print(f"  方法: {attr}()")
                    else:
                        print(f"  属性: {attr} = {value}")
                except Exception as e:
                    print(f"  属性: {attr} (访问失败: {e})")
            
            # 尝试获取实体
            if hasattr(cad_image, 'entities'):
                entities = cad_image.entities
                print(f"\n✓ 找到entities: {type(entities).__name__}")
                if hasattr(entities, '__len__'):
                    print(f"  实体数量: {len(entities)}")
                    
                    # 显示前几个实体
                    for i, entity in enumerate(entities[:5]):
                        print(f"    实体 {i}: {type(entity).__name__}")
                        if hasattr(entity, 'entity_type'):
                            print(f"      类型: {entity.entity_type}")
            
            # 尝试获取块
            if hasattr(cad_image, 'blocks'):
                blocks = cad_image.blocks
                print(f"\n✓ 找到blocks: {type(blocks).__name__}")
                if hasattr(blocks, '__len__'):
                    print(f"  块数量: {len(blocks)}")
                    
                    # 显示前几个块
                    for i, block in enumerate(blocks[:3]):
                        print(f"    块 {i}: {type(block).__name__}")
                        if hasattr(block, 'entities'):
                            block_entities = block.entities
                            if hasattr(block_entities, '__len__'):
                                print(f"      块中实体数量: {len(block_entities)}")
            
            # 尝试获取图层
            if hasattr(cad_image, 'layers'):
                layers = cad_image.layers
                print(f"\n✓ 找到layers: {type(layers).__name__}")
                if hasattr(layers, '__len__'):
                    print(f"  图层数量: {len(layers)}")
                    
                    # 显示前几个图层
                    for i, layer in enumerate(layers[:3]):
                        print(f"    图层 {i}: {type(layer).__name__}")
                        if hasattr(layer, 'name'):
                            print(f"      名称: {layer.name}")
                        if hasattr(layer, 'entities'):
                            layer_entities = layer.entities
                            if hasattr(layer_entities, '__len__'):
                                print(f"      图层中实体数量: {len(layer_entities)}")
            
        except ImportError as e:
            print(f"✗ 无法导入CadImage: {e}")
        except Exception as e:
            print(f"✗ 使用CadImage.load失败: {e}")
            traceback.print_exc()
        
        # 方法2：尝试使用其他加载方式
        try:
            import aspose.cad as cad
            
            # 尝试使用Image.load然后转换
            with cad.Image.load(test_file) as image:
                print(f"\n✓ 使用Image.load加载成功")
                print(f"  类型: {type(image).__name__}")
                
                # 检查是否有转换方法
                convert_methods = ['to_cad_image', 'as_cad_image', 'get_cad_image']
                for method in convert_methods:
                    if hasattr(image, method):
                        try:
                            cad_image = getattr(image, method)()
                            print(f"  ✓ {method}(): {type(cad_image).__name__}")
                        except Exception as e:
                            print(f"  ✗ {method}(): 失败 - {e}")
                    else:
                        print(f"  ✗ {method}(): 不存在")
        
        except Exception as e:
            print(f"✗ 使用Image.load失败: {e}")
        
    except Exception as e:
        print(f"✗ 测试直接加载CAD文件失败: {e}")

def check_file_format():
    """检查文件格式"""
    print_separator("检查文件格式")
    
    try:
        import aspose.cad as cad
        
        # 查找DWG文件
        dwg_files = list(Path('.').glob('*.dwg'))
        if not dwg_files:
            print("✗ 未找到DWG文件")
            return
        
        test_file = str(dwg_files[0])
        print(f"使用文件: {test_file}")
        
        # 检查文件格式
        try:
            file_format = cad.Image.get_file_format(test_file)
            print(f"✓ 文件格式: {file_format}")
        except Exception as e:
            print(f"✗ 获取文件格式失败: {e}")
        
        # 检查文件是否可以被加载
        try:
            can_load = cad.Image.can_load(test_file)
            print(f"✓ 可以加载: {can_load}")
        except Exception as e:
            print(f"✗ 检查是否可以加载失败: {e}")
        
        # 检查文件大小和内容
        file_size = os.path.getsize(test_file)
        print(f"✓ 文件大小: {file_size:,} 字节 ({file_size/1024/1024:.2f} MB)")
        
        # 读取文件头部信息
        try:
            with open(test_file, 'rb') as f:
                header = f.read(16)
                print(f"✓ 文件头部: {header.hex()}")
                
                # 检查DWG文件签名
                if header.startswith(b'AC10') or header.startswith(b'AC10'):
                    print(f"✓ 检测到DWG文件签名")
                else:
                    print(f"⚠ 未检测到标准DWG文件签名")
        except Exception as e:
            print(f"✗ 读取文件头部失败: {e}")
        
    except Exception as e:
        print(f"检查文件格式失败: {e}")

def main():
    """主函数"""
    print_separator("Aspose.CAD 真正问题调试工具")
    print("深入分析Aspose.CAD无法提取线条的真正原因")
    print()
    
    # 检查文件格式
    check_file_format()
    
    # 深入调试Image对象
    debug_image_object()
    
    # 检查CAD特定类
    check_cad_specific_classes()
    
    # 测试直接加载CAD文件
    test_direct_cad_loading()
    
    # 总结
    print_separator("调试总结")
    print("基于以上调试结果，可能的原因包括:")
    print("1. 文件格式问题 - DWG文件可能损坏或格式不标准")
    print("2. API使用方式问题 - 需要使用正确的CAD特定API")
    print("3. 文件内容问题 - DWG文件可能不包含线条实体")
    print("4. 版本兼容性问题 - Aspose.CAD版本与文件版本不兼容")
    print("\n建议:")
    print("- 尝试使用其他DWG文件进行测试")
    print("- 使用AutoCAD等软件验证DWG文件内容")
    print("- 尝试将DWG文件转换为DXF格式")
    print("- 联系Aspose技术支持获取帮助")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n用户中断了程序执行")
    except Exception as e:
        print(f"\n\n程序执行出错: {e}")
        traceback.print_exc()
