4 changed files with 1234 additions and 51 deletions
			
			
		@ -1,44 +0,0 @@ | 
				
			|||
## 做什么事情 | 
				
			|||
学习 brep 的sdf表示 | 
				
			|||
 | 
				
			|||
## 意义 | 
				
			|||
- brep方便控制 | 
				
			|||
- sdf方便运算和智能生成 | 
				
			|||
 | 
				
			|||
## 怎么做 | 
				
			|||
### 数据准备 | 
				
			|||
数据源: furniture | 
				
			|||
文件结构 | 
				
			|||
    brep( .step ) | 
				
			|||
        train | 
				
			|||
            chair | 
				
			|||
                chair_1.brep | 
				
			|||
                chair_2.brep | 
				
			|||
        test | 
				
			|||
        val | 
				
			|||
    sdf ( .npz ) | 
				
			|||
        train | 
				
			|||
            chair | 
				
			|||
                chair_1.sdf.npz | 
				
			|||
                chair_2.sdf.npz | 
				
			|||
 | 
				
			|||
数据结构 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
### brep to mesh | 
				
			|||
基本思路:采样,然后三角化 | 
				
			|||
 | 
				
			|||
- 重采样 | 
				
			|||
    《Mesh Generation from CAD Models》: sharp edge  | 
				
			|||
 | 
				
			|||
 | 
				
			|||
### mesh to sdf | 
				
			|||
基本思路:体素,然后积分 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
docker | 
				
			|||
``` | 
				
			|||
docker run -it -v /mnt/disk2/dataset:/data -v $(pwd):/app --name brep_sdf ubuntu:22.04  | 
				
			|||
``` | 
				
			|||
@ -0,0 +1,121 @@ | 
				
			|||
import os | 
				
			|||
import pickle | 
				
			|||
import numpy as np | 
				
			|||
import logging | 
				
			|||
from datetime import datetime | 
				
			|||
 | 
				
			|||
# 创建logs目录 | 
				
			|||
log_dir = 'logs' | 
				
			|||
os.makedirs(log_dir, exist_ok=True) | 
				
			|||
 | 
				
			|||
# 创建logger | 
				
			|||
logger = logging.getLogger(__name__) | 
				
			|||
logger.setLevel(logging.INFO) | 
				
			|||
 | 
				
			|||
# 生成日志文件名(使用时间戳) | 
				
			|||
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') | 
				
			|||
log_file = os.path.join(log_dir, f'brep_log_{timestamp}.log') | 
				
			|||
 | 
				
			|||
# 创建文件处理器 | 
				
			|||
file_handler = logging.FileHandler(log_file, encoding='utf-8') | 
				
			|||
file_handler.setLevel(logging.INFO) | 
				
			|||
 | 
				
			|||
# 创建控制台处理器 | 
				
			|||
console_handler = logging.StreamHandler() | 
				
			|||
console_handler.setLevel(logging.INFO) | 
				
			|||
 | 
				
			|||
# 创建格式器 | 
				
			|||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') | 
				
			|||
file_handler.setFormatter(formatter) | 
				
			|||
console_handler.setFormatter(formatter) | 
				
			|||
 | 
				
			|||
# 添加处理器到logger | 
				
			|||
logger.addHandler(file_handler) | 
				
			|||
logger.addHandler(console_handler) | 
				
			|||
 | 
				
			|||
# 防止日志重复 | 
				
			|||
logger.propagate = False | 
				
			|||
 | 
				
			|||
def _load_brep_file(brep_path) -> dict: | 
				
			|||
    """加载并打印B-rep数据结构""" | 
				
			|||
    try: | 
				
			|||
        # 加载B-rep特征 | 
				
			|||
        with open(brep_path, 'rb') as f: | 
				
			|||
            brep_data = pickle.load(f) | 
				
			|||
             | 
				
			|||
        # 打印数据结构 | 
				
			|||
        logger.info(f"\nData structure from {os.path.basename(brep_path)}:") | 
				
			|||
        logger.info(brep_data.keys()) | 
				
			|||
         | 
				
			|||
        # 1. 几何数据 | 
				
			|||
        if 'surf_wcs' in brep_data: | 
				
			|||
            logger.info(f"  surf_wcs: list of {len(brep_data['surf_wcs'])} arrays") | 
				
			|||
            for i, surf in enumerate(brep_data['surf_wcs']): | 
				
			|||
                logger.info(f"    surface {i}: shape={np.array(surf).shape}, type={type(surf)}") | 
				
			|||
                 | 
				
			|||
        if 'surf_ncs' in brep_data: | 
				
			|||
            logger.info(f"  surf_ncs: list of {len(brep_data['surf_ncs'])} arrays") | 
				
			|||
            for i, surf in enumerate(brep_data['surf_ncs']): | 
				
			|||
                logger.info(f"    surface {i}: shape={np.array(surf).shape}, type={type(surf)}") | 
				
			|||
                 | 
				
			|||
        if 'edge_wcs' in brep_data: | 
				
			|||
            logger.info(f"  edge_wcs: list of {len(brep_data['edge_wcs'])} arrays") | 
				
			|||
            for i, edge in enumerate(brep_data['edge_wcs']): | 
				
			|||
                logger.info(f"    edge {i}: shape={np.array(edge).shape}, type={type(edge)}") | 
				
			|||
                 | 
				
			|||
        if 'edge_ncs' in brep_data: | 
				
			|||
            logger.info(f"  edge_ncs: list of {len(brep_data['edge_ncs'])} arrays") | 
				
			|||
            for i, edge in enumerate(brep_data['edge_ncs']): | 
				
			|||
                logger.info(f"    edge {i}: shape={np.array(edge).shape}, type={type(edge)}") | 
				
			|||
         | 
				
			|||
        # 2. 顶点数据 | 
				
			|||
        if 'corner_wcs' in brep_data: | 
				
			|||
            logger.info(f"  corner_wcs: shape={brep_data['corner_wcs'].shape}, type={type(brep_data['corner_wcs'])}") | 
				
			|||
             | 
				
			|||
        if 'corner_unique' in brep_data: | 
				
			|||
            logger.info(f"  corner_unique: shape={brep_data['corner_unique'].shape}, type={type(brep_data['corner_unique'])}") | 
				
			|||
         | 
				
			|||
        # 3. 包围盒数据 | 
				
			|||
        if 'surf_bbox_wcs' in brep_data: | 
				
			|||
            logger.info(f"  surf_bbox_wcs: shape={brep_data['surf_bbox_wcs'].shape}, type={type(brep_data['surf_bbox_wcs'])}") | 
				
			|||
             | 
				
			|||
        if 'edge_bbox_wcs' in brep_data: | 
				
			|||
            logger.info(f"  edge_bbox_wcs: shape={brep_data['edge_bbox_wcs'].shape}, type={type(brep_data['edge_bbox_wcs'])}") | 
				
			|||
         | 
				
			|||
        # 4. 邻接关系数据 | 
				
			|||
        if 'edgeFace_adj' in brep_data: | 
				
			|||
            logger.info(f"  edgeFace_adj: shape={brep_data['edgeFace_adj'].shape}, type={type(brep_data['edgeFace_adj'])}") | 
				
			|||
             | 
				
			|||
        if 'edgeCorner_adj' in brep_data: | 
				
			|||
            logger.info(f"  edgeCorner_adj: shape={brep_data['edgeCorner_adj'].shape}, type={type(brep_data['edgeCorner_adj'])}") | 
				
			|||
             | 
				
			|||
        if 'faceEdge_adj' in brep_data: | 
				
			|||
            logger.info(f"  faceEdge_adj: shape={brep_data['faceEdge_adj'].shape}, type={type(brep_data['faceEdge_adj'])}") | 
				
			|||
             | 
				
			|||
        return brep_data | 
				
			|||
         | 
				
			|||
    except Exception as e: | 
				
			|||
        logger.error(f"Error loading brep from {brep_path}: {str(e)}") | 
				
			|||
        raise | 
				
			|||
 | 
				
			|||
 | 
				
			|||
def test_load_brep(): | 
				
			|||
    """测试加载B-rep文件的功能""" | 
				
			|||
    try: | 
				
			|||
         | 
				
			|||
        # 测试文件路径(请替换为你实际的测试文件路径) | 
				
			|||
        test_file = "/home/wch/brep2sdf/test_data/pkl/train/chair_1105.pkl" | 
				
			|||
         | 
				
			|||
         | 
				
			|||
             | 
				
			|||
        # 测试加载功能 | 
				
			|||
        loaded_data = _load_brep_file(test_file) | 
				
			|||
         | 
				
			|||
        logger.info("测试成功完成!") | 
				
			|||
         | 
				
			|||
    except Exception as e: | 
				
			|||
        logger.error(f"测试失败: {str(e)}") | 
				
			|||
        raise | 
				
			|||
 | 
				
			|||
if __name__ == '__main__': | 
				
			|||
    test_load_brep() | 
				
			|||
								
									
										File diff suppressed because it is too large
									
								
							
						
					
					Loading…
					
					
				
		Reference in new issue