Browse Source

暂存

final
mckay 8 months ago
parent
commit
9a25fe7e6d
  1. 44
      README..md
  2. 18
      brep2sdf/data/data.py
  3. 121
      brep2sdf/data/test.py
  4. 1100
      brep2sdf/data/utils.py

44
README..md

@ -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
```

18
brep2sdf/data/data.py

@ -4,10 +4,14 @@ from torch.utils.data import Dataset
import numpy as np
import pickle
from brep2sdf.utils.logger import setup_logger
from .utils import process_brep_data
# 设置日志记录器
logger = setup_logger('dataset')
class BRepSDFDataset(Dataset):
def __init__(self, brep_dir:str, sdf_dir:str, split:str='train'):
"""
@ -82,19 +86,20 @@ class BRepSDFDataset(Dataset):
logger.error(f" {key}: type={type(value)}, dtype={value.dtype}, shape={value.shape}")
raise
def _load_brep_file(self, brep_path):
"""加载B-rep特征文件"""
try:
with open(brep_path, 'rb') as f:
brep_data = pickle.load(f)
features = {}
brep_data = {}
# 1. 处理几何数据(不等长序列)
for key in ['surf_wcs', 'surf_ncs', 'edge_wcs', 'edge_ncs']:
if key in brep_data:
try:
features[key] = [
brep_data[key] = [
torch.from_numpy(np.array(x, dtype=np.float32))
for x in brep_data[key]
]
@ -114,7 +119,7 @@ class BRepSDFDataset(Dataset):
if key in brep_data:
try:
data = np.array(brep_data[key], dtype=np.float32)
features[key] = torch.from_numpy(data)
brep_data[key] = torch.from_numpy(data)
except Exception as e:
logger.error(f"Error converting {key}:")
logger.error(f" Type: {type(brep_data[key])}")
@ -128,7 +133,7 @@ class BRepSDFDataset(Dataset):
if key in brep_data:
try:
data = np.array(brep_data[key], dtype=np.int32)
features[key] = torch.from_numpy(data)
brep_data[key] = torch.from_numpy(data)
except Exception as e:
logger.error(f"Error converting {key}:")
logger.error(f" Type: {type(brep_data[key])}")
@ -136,8 +141,9 @@ class BRepSDFDataset(Dataset):
logger.error(f" Shape: {brep_data[key].shape}")
logger.error(f" dtype: {brep_data[key].dtype}")
raise ValueError(f"Failed to convert {key}: {str(e)}")
feature_embedder = process_brep_data(brep_data, 70,70,1,)
return features
return feature_embedder
except Exception as e:
logger.error(f"\nError loading B-rep file: {brep_path}")

121
brep2sdf/data/test.py

@ -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()

1100
brep2sdf/data/utils.py

File diff suppressed because it is too large
Loading…
Cancel
Save