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