https://github.com/manishtanwar/CAD-Tool
manishtanwar/CAD-Tool | DeepWik
https://github.com/manishtanwar/CAD-Tool/blob/master/doc/Mathematical_Model.pdf
https://www.sciencedirect.com/science/article/abs/pii/0010448594900205?via%3Dihub
markdown在线转jpg - www.strerr.com
左乘行变换
第3视角
define
.
核心转换函数
CAD-Tool使用two_d_to_three_d
函数来执行从2D到3D的转换: 2d__to__3d_8h.html:112-113
该函数接受两个参数:
file
: 包含2D正交视图数据的输入文件路径outFile
: 生成3D模型的输出文件路径(.obj格式)
输入数据格式
系统需要特定格式的文本文件,包含三个正交视图(顶视图、前视图、侧视图)的数据: README.md:73-87
每个顶点需要提供在三个视图中的2D坐标:
- 顶视图投影坐标 (t.x, t.y)
- 前视图投影坐标 (f.x, f.y)
- 侧视图投影坐标 (s.x, s.y)
转换过程
转换过程包含以下步骤:
- 数据解析: 从输入文件读取顶点和边的信息
- 坐标变换: 应用坐标系转换
v.x = -b, v.y = a
- 对象构建: 创建
object_2d
对象存储三个视图的数据 - 3D重建: 通过
Object_3d
构造函数执行几何重建算法 - 输出生成: 将结果写入OBJ格式文件
输出格式
系统生成标准的Wavefront OBJ格式文件: README.md:111-120
输出包含:
- 顶点坐标 (
v x y z
) - 面定义 (
f v1 v2 v3...
)
相关头文件和依赖
从源码结构可以看出,Object_3d.cpp
包含了实现这些算法所需的关键头文件: _object__3d_8cpp.html:95-103
这些头文件对应重建过程中的关键算法:
planar_graph_generator.h
: 平面图生成算法faceloop_generator.h
: 面环生成算法body_loop.h
: 实体部分生成算法general_methods.h
: 通用几何计算方法
输入
205 0
5 0
0 05 3
5 0
3 02 3
2 0
3 02 5
2 0
5 05 5
5 0
5 05 6
5 0
6 00 6
0 0
6 00 0
0 0
0 05 2
5 2
2 25 3
5 2
3 22 3
2 2
3 22 5
2 2
5 25 5
5 2
5 25 6
5 2
6 20 6
0 2
6 20 2
0 2
2 20 2
0 5
2 55 2
5 5
2 55 0
5 5
0 50 0
0 5
0 513
0 6 5 6
5 6 5 5
5 5 2 5
2 5 2 3
2 3 5 3
5 3 5 2
5 2 0 2
0 2 0 6
0 2 0 0
0 0 0 6
0 0 5 0
5 0 5 2
5 0 5 314
0 0 2 0
0 0 5 0
2 0 5 0
0 2 2 2
0 2 5 2
2 2 5 2
0 5 5 5
0 0 0 2
0 0 0 5
0 2 0 5
2 0 2 2
5 0 5 2
5 0 5 5
5 2 5 518
0 0 0 5
2 5 2 2
3 2 3 0
5 2 5 0
6 2 6 0
0 5 2 5
0 0 3 0
0 0 5 0
0 0 6 0
3 0 5 0
3 0 6 0
5 0 6 0
2 2 3 2
2 2 5 2
2 2 6 2
3 2 5 2
3 2 6 2
5 2 6 2
这是CAD工具的输入文件格式,用于描述3D几何体的顶点和边的连接关系。
文件格式结构
这个格式包含三个主要部分:
1. 顶点定义部分
开头的数字20
表示总共有20个顶点,然后每3行定义一个顶点的x、y、z坐标:
5 0 <- x坐标
5 0 <- y坐标
0 0 <- z坐标
input:1-5
2. 边连接定义部分
接下来的数字13
、14
、18
分别表示三个不同视图或投影中的边数量,每行用四个数字定义一条边,格式为:
起点x 起点y 终点x 终点y
例如:0 6 5 6
表示从点(0,6)到点(5,6)的一条边。 input:83-96
3. 多个投影视图
这个格式支持多个投影视图的定义,每个视图都有自己的边集合,用于从不同角度描述同一个3D对象。 input:98-112
用途
这种格式被CAD工具用于:
- 2D到3D的转换处理
- 几何体的多视图表示
- 边界表示(B-rep)建模
Notes
这个输入格式在CAD-Tool项目的测试文件中广泛使用,类似的格式也出现在其他测试文件中,如input1
、input2_Tetrahedron_Pyramid
等,都遵循相同的结构模式:顶点数量→顶点坐标→边数量→边连接关系。
是的,这确实是一个顶点的3D坐标。
在CAD-Tool的2D到3D转换输入格式中,每个顶点用连续的三行来定义其在三个不同视图中的投影坐标:
5 0 <- 顶视图投影 (top view projection)
5 0 <- 前视图投影 (front view projection)
0 0 <- 侧视图投影 (side view projection)
input:3-5
根据README文档的说明,这种格式的结构是: README.md:76-87
所以5 0, 5 0, 0 0
这三行表示第一个顶点V(0)在三个正交视图中的投影坐标:
- 在顶视图中的坐标是(5, 0)
- 在前视图中的坐标是(5, 0)
- 在侧视图中的坐标是(0, 0)
通过这三个投影坐标,CAD工具可以重建出该顶点在3D空间中的实际位置。
你问的0 6 5 6
是CAD-Tool输入文件中边的定义格式。
边的定义格式
在2D到3D转换的输入文件中,13
表示顶视图中有13条边,接下来的每一行定义一条边:
0 6 5 6
这表示从坐标点(0,6)到坐标点(5,6)的一条边。格式是:
- 第1个数字:起点的x坐标 (0)
- 第2个数字:起点的y坐标 (6)
- 第3个数字:终点的x坐标 (5)
- 第4个数字:终点的y坐标 (6) input:83-84
在文件格式中的位置
根据README文档的说明,这种边定义出现在2D到3D输入格式的边连接部分: README.md:89-94
所以0 6 5 6
就是顶视图中第一条边,连接(0,6)和(5,6)两个点。
Notes
这个边定义格式在CAD-Tool的所有2D到3D测试输入文件中都是一致的,用于描述各个视图中线段的连接关系,帮助系统重建3D几何体的拓扑结构。
inFile>>a>>b
Object_3d::Object_3d(object_2d o)
{add_vertices(o.T_vertices, o.F_vertices, o.S_vertices);decision_tree(o);RER();std::vector< Full_plane > f_list;f_list = planar_graph_generator(v3d_list, e3d_list);std::vector< face_loop > face_loop_list;for(auto z : f_list){std::vector< face_loop > qface_loop_list;qface_loop_list = generate_face_loops(z.p, z.vertices_on_it, z.edges_on_it, v3d_list);for(auto zz : qface_loop_list){face_loop_list.pb(zz);}}std::vector< body_loop > body_loop_list = generate_body_loop(face_loop_list, v3d_list);for(int i=0;i<(int)body_loop_list[0].face_loop_list.size();i++){//side_of_face_loopfor(auto zz : body_loop_list[0].face_loop_list[i].basic_loop_list){std::vector<int> add_loop; add_loop.pb(zz.edge_list[0].f);for(auto z1 : zz.edge_list){add_loop.pb(z1.s);}if(zz.inner)std::reverse(add_loop.begin(), add_loop.end());if(body_loop_list[0].side_of_face_loop[i])std::reverse(add_loop.begin(), add_loop.end());surface_list.pb(add_loop);}}
}
不是三角面
v 5 0 0
v 5 3 0
v 2 3 0
v 2 5 0
v 5 5 0
v 5 6 0
v 0 6 0
v 0 0 0
v 5 2 2
v 5 3 2
v 2 3 2
v 2 5 2
v 5 5 2
v 5 6 2
v 0 6 2
v 0 2 2
v 0 2 5
v 5 2 5
v 5 0 5
v 0 0 5
f 6 7 8 1 2 3 4 5 6
f 6 5 4 3 2 1 8 7 6
f 2 3 11 10 2
f 2 10 11 3 2
f 3 4 12 11 3
f 3 11 12 4 3
f 4 5 13 12 4
f 4 12 13 5 4
f 6 7 15 14 6
f 6 14 15 7 6
f 14 15 16 9 10 11 12 13 14
f 14 13 12 11 10 9 16 15 14
f 16 9 18 17 16
f 16 17 18 9 16
f 5 6 14 13 5
f 9 10 2 1 19 18 9
f 5 13 14 6 5
f 9 18 19 1 2 10 9
f 17 18 19 20 17
f 17 20 19 18 17
f 15 16 17 20 8 7 15
f 15 7 8 20 17 16 15
f 1 8 20 19 1
f 1 19 20 8 1
freecad会先处理成mesh
obj导出
# FreeCAD v1.0 build0 Arch module
# https://www.freecad.org
mtllib 1-_________001.mtl
o _________001
usemtl color_cccce6
v 5.0 0.0 3.0
v 0.0 0.0 0.0
v 5.0 0.0 0.0
v 2.0 0.0 3.0
v 0.0 0.0 6.0
v 5.0 0.0 5.0
v 5.0 0.0 6.0
v 2.0 0.0 5.0
v 0.0 -5.0 0.0
v 5.0 -5.0 0.0
v 5.0 -2.0 3.0
v 2.0 -2.0 3.0
v 2.0 -2.0 5.0
v 5.0 -2.0 5.0
v 0.0 -2.0 6.0
v 5.0 -2.0 6.0
v 0.0 -2.0 2.0
v 5.0 -2.0 2.0
v 0.0 -5.0 2.0
v 5.0 -5.0 2.0
f 1 2 3
f 4 2 1
f 5 6 7
f 8 2 4
f 5 8 6
f 5 2 8
f 9 3 10
f 2 3 9
f 11 4 12
f 1 4 11
f 13 4 12
f 8 4 13
f 13 6 14
f 8 6 13
f 15 7 16
f 5 7 15
f 11 17 18
f 12 17 11
f 15 14 16
f 13 17 12
f 15 13 14
f 15 17 13
f 19 18 20
f 17 18 19
f 14 7 16
f 6 7 14
f 3 20 10
f 11 3 1
f 3 18 20
f 18 3 11
f 9 20 10
f 19 20 9
f 15 2 5
f 9 17 19
f 17 2 15
f 2 17 9
转solid可以编辑
它的3d数据是点边的,不是obj的点面
20
-5 0 0
-5 3 0
-2 3 0
-2 5 0
-5 5 0
-5 6 0
0 6 0
0 0 0
-5 2 -2
-5 3 -2
-2 3 -2
-2 5 -2
-5 5 -2
-5 6 -2
0 6 -2
0 2 -2
0 2 -5
-5 2 -5
-5 0 -5
0 0 -5 30
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 0
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 8
16 17
17 18
18 19
19 16
7 19
0 18
8 17
15 16
1 9
2 10
3 11
4 12
5 13
6 14
不想写了