我仓库内cad python 有哪些应用到聚类的方法

根据仓库里的代码,CAD Python 没有使用 sklearn 等通用聚类库 (如 KMeans、DBSCAN),而是采用一套基于几何距离的自定义线段聚类,再叠加包围盒与下游业务处理。

1. 核心聚类算法:cluster_lines

实现位置:

  • AutoCAD 主线my_python/ptools/cad_server/dal_cluster_obb.py
  • DXF 处理线my_python/ptools/ezdxf_server/seg_part2dxf.pyseg_part2dxf_name_by_text.py
  • 脚本版my_python/ptools/ezdxf_server/seg_part.py(内联同类逻辑)

算法本质可概括为:带距离阈值的区域生长(Region Growing)+ AABB 合并

111:190:my_python/ptools/cad_server/dal_cluster_obb.py 复制代码
def cluster_lines(lines, distance_threshold=50.0):
    """对线段进行聚类,基于您之前成功的算法"""
    ...
    while remaining_lines:
        seed = remaining_lines.pop(0)
        current_cluster = [seed]
        ...
        while True:
            # 扩展边界
            expanded_min_x = min_x - distance_threshold
            ...
            # 寻找在扩展边界内的线段
            for line in list(remaining_lines):
                for point in line:
                    if (expanded_min_x <= point[0] <= expanded_max_x and
                        expanded_min_y <= point[1] <= expanded_max_y):
                        in_cluster = True
                        break
            ...
        # 检查是否有其他聚落被当前聚落完全包含,如果有则合并
        for cluster in clusters:
            if (min_x <= cluster.min_x and min_y <= cluster.min_y and
                max_x >= cluster.max_x and max_y >= cluster.max_y):
                current_cluster.extend(cluster.lines)
        ...
    return clusters

步骤简述:

步骤 做法
种子 从未处理线段中取一条作为种子
生长 将当前簇 AABB 四向扩展 distance_threshold,凡任一端点落入扩展框的线段并入簇
迭代 更新 AABB 后重复扩展,直到无法再吸收
合并 若新簇 AABB 完全包含 已有簇,则合并线段

与经典聚类的对应关系:

  • 类似 连通分量 / 洪水填充,但连通判据是「端点落在扩展矩形内」,不是严格的端点重合。
  • distance_threshold 控制「间隙多大仍算同一零件/图块」。
  • 不是 基于特征向量的 KMeans / 层次聚类 / DBSCAN。

两版实现的细微差别:

  • dal_cluster_obb.py:只做「新簇包含旧簇」的合并。
  • ezdxf 版额外支持「新簇被旧簇包含」时并入旧簇(双向 AABB 包含合并)。

2. 聚类前的几何预处理

get_lines_from_entities() 把 AutoCAD 实体转为线段再聚类:

  • AcDbLine → 直接线段
  • AcDbCircle → 圆周采样 80 点 → 折线段
  • AcDbArc → 弧上采样 40 点 → 折线段

圆/弧被离散成线段后,才能用同一套 cluster_lines 逻辑。


3. 聚类后的应用(不是聚类算法本身)

模块 文件 聚类之后做什么
OBB 标注 dal_cluster_obb.py get_points_from_clusterget_oriented_bounding_box_approx → 在 obb_clusters 图层画旋转包围盒
分簇打印 PDF combined_cluster_print.py cluster_lines(..., 2000.0) → 按 X 排序 → 每簇窗口打印为 cluster_N.pdf
DXF 拆分导出 seg_part2dxf.py 每簇导出独立 DXF,并算 OBB/AABB
仅 OBB(不聚类) OBB_box.pyobb_and_rotate.py 选中对象 算 OBB/AABB,不做 cluster_lines

典型阈值:

  • dal_cluster_obb.py 主流程:distance_threshold=200.0
  • combined_cluster_print.py2000.0(大图/多零件间距更大)
  • ezdxf:5(图纸单位更小)

4. 相关辅助逻辑(非聚类)

  • get_cluster_x_position:按簇最小 X 排序(打印顺序)。
  • get_cluster_boundaries:从簇内点算打印窗口边界。
  • OBB :PCA + 旋转搜索近似最小面积有向包围盒(numpy),属于簇内几何分析,不是聚类方法。

5. 总结

本仓库 CAD Python 的「聚类」可以概括为:

  1. 唯一实际使用的聚类方法cluster_lines --- 基于 distance_threshold2D 空间邻近线段聚类(区域生长 + AABB 合并)
  2. 未使用 :KMeans、DBSCAN、层次聚类、谱聚类等(sklearn 仅出现在 yolo_skill,与 CAD 无关)。
  3. 主要应用场景:零件/图块分离 → OBB 标注、按簇导出 DXF、按簇打印 PDF。

若要调效果,关键参数就是各脚本里的 distance_threshold:过小会碎成很多簇,过大则不同零件被并在一起。需要的话我可以按你的图纸尺度帮你估一版推荐阈值范围。

相关推荐
web3.088899911 小时前
电商数据化运营:速卖通API+Python打造竞品监控与选品利器
开发语言·python
小小编程路12 小时前
C++ 常用逻辑运算符
开发语言·c++·算法
眷蓝天12 小时前
Prometheus介绍及监控平台部署
java·开发语言
五月君_12 小时前
Rust 重写 AI 味太浓,Bun 被 yt-dlp 封版本、Electrobun 直接解绑
开发语言·后端·rust
y = xⁿ12 小时前
JUC:锁机制/关键字
java·开发语言
legendary_16312 小时前
Type-C浪潮席卷小家电:SINK芯片如何成为快充高压的“心脏“
c语言·开发语言
Struggle_975512 小时前
算法知识-堆相关知识
java·开发语言·算法
Dxy123931021612 小时前
js中Math.min.apply()详解
开发语言·javascript
摇滚侠13 小时前
Java 零基础全套教程,File 类与 IO 流,笔记 175-176
java·开发语言·笔记