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