园林算量 v0.4.13
它解决的一件事:把 cad-file-reader 的园林识图候选复算成可复核的苗木统计与铺装面积概算底稿,并明确区分“苗木表设计给定数量”“有坐标的块级实例计数”“无坐标块实例计数”“块引用总数候选”“图例文字标记次数”“铺装强算候选”等口径。
适用
- 苗木统计:按乔木、灌木、地被、其他分类;支持中英文常见植物图例词,并区分苗木表基线、平面图块级计数、底座无坐标块实例计数、块引用总数 P2 候选、图例文字 P2 候选。
- 植物名称参考库:内置区域/素材植物库(
rules/plant_library_*.json全部默认加载,含常用园林植物 349 名、西北温带荒漠区 131 条、图块素材 311 名与分区苗木选型 1022 名(去别名后新增约 700 名)),可用--plant-library叠加项目库;只做分类,不读规格/密度/单价,不推断规格或报价。 - 铺装面积:优先按铺装图层识别闭合区域,鞋带公式算面积,含洞/内岛按嵌套深度奇偶扣减;可选展开 DXF 图块内闭合铺装环,支持 HATCH/ARC/Bulge 圆弧边界。
- 概算底稿与物资计划草稿:苗木数量、铺装面积、缺项、依据分层落盘。
- 真图边界验证:图层名/块名缺失的转换版 DWG,不硬出铺装面积;强算结果只标 P3 候选。
前置(显式依赖)
- 底座
cad-file-reader >= 0.28.1的landscape-geometry包是显式依赖;不自行解析大 DWG。 - 苗木统计输入:底座
cad_landscape_geometry输出 JSON(plant_block_legends/plant_legends/plant_schedule_links/systems)与cad_scan文字/块引用详情。 - 苗木表解析:从图纸文字中识别“苗木表/苗木配置表”的表头、名称、数量、单位列;数量单位必须来自数量表头括号或单位列,缺失时不默认为株并降 P1。
- 铺装面积输入:
cad_scan --with-geom --with-geom-layer --detail-json详情 JSON;应有可用的铺装图层名。 - DXF 块内铺装回退:可选
--dxf-block-paving,使用底座vendor/ezdxf展开 INSERT 变换;只提取命中铺装 token 的闭合LWPOLYLINE/POLYLINE/HATCH/ARC,展开 LWPOLYLINE bulge 圆弧,结果强制 P3。 - DXF 块引用坐标回退:可选
--dxf-block-refs,读取模型空间顶层 INSERT 坐标,同名块按坐标去重;只有坐标命中的块引用才升级 P0,无坐标仍保持 P2。 - 扫描件/图片型 PDF 只出苗木文字候选,不给铺装面积。
使用流程
- 识图:用底座生成园林识图与几何详情。
- 复算:运行本技能脚本,得到苗木统计、铺装面积、缺项与台账。
- 复核:优先核对
需核对=是、P2/P3、含洞/内岛、强算候选行;数量/规格不确定时不猜默认。 - 交付:Excel 台账 + CSV + Markdown 报告,用于概算与物资计划核对,不用于结算。
脚本用法
# 1) 底座:园林识图(苗木图例/块分类/铺装闭合域候选)
scripts/cad_scan.sh 景观图.dwg --with-mtext --with-attrib --with-insert --with-blocks --with-block-geom \
--with-geom --with-geom-layer --detail-json 景观详情.json --format json -o 景观扫描
scripts/cad_landscape_geometry.sh 景观详情.json --out-dir 园林识图
# 2) 本技能:苗木统计 + 铺装面积
python3 scripts/yuanlin_qty.py \
--landscape 园林识图/景观详情.landscape.json \
--scan 景观详情.json \
--out-dir ./园林概算 \
--project "项目名"
# 3) 可选:DXF 图块内铺装回退(仍强制 P3)
python3 scripts/yuanlin_qty.py \
--landscape 园林识图/景观详情.landscape.json \
--scan 景观详情.json \
--dxf-block-paving 景观图.dxf \
--out-dir ./园林概算-块铺装候选 \
--project "项目名"
# 4) 可选:DXF 顶层块引用坐标去重(P2→P0;同名坐标重复不计)
python3 scripts/yuanlin_qty.py \
--landscape 园林识图/景观详情.landscape.json \
--scan 景观详情.json \
--dxf-block-refs 景观图.dxf \
--out-dir ./园林概算-块坐标 \
--project "项目名"
# 5) 可选:叠加项目植物名称参考库(只取中文名→大类)
python3 scripts/yuanlin_qty.py \
--landscape 园林识图/景观详情.landscape.json \
--scan 景观详情.json \
--plant-library 项目苗木清单.xlsx \
--out-dir ./园林概算-项目词库 \
--project "项目名"
可用参数:
--rules templates/项目专属规则示例.json:项目专属图层 token、植物词库、去重半径。--scale 100/--drawing-mm-per-unit 1:覆盖自动比例/单位检测;显式指定后不回改单位。--dedupe-tolerance 0.5:同名块同坐标去重半径(图纸单位)。--paving-all-geometry:图层缺失时对全部几何做闭环候选;结果强制 P3、final_quantity=false,不计入主线。--dxf-block-paving 图.dxf:可选回退,展开块内铺装闭合环;结果强制 P3、不计入主线。--dxf-block-refs 图.dxf:可选回退,读取顶层 INSERT 坐标,同名块按坐标去重;无坐标块引用仍保持 P2,不猜株数。--plant-library 参考库.{json,csv,xlsx}:可选叠加项目植物名称参考库;只读中文名与分类章节,规格/密度/苗价/综合单价等列一律不读、不写进输出;可重复指定。--no-default-plant-library:不加载全部内置区域库(rules/plant_library_*.json,默认全部加载);只影响分类,不影响数量口径。- 块引用 P2:底座
meta.block_refs中只有总数、没有坐标的植物块引用,只作复核线索,final_quantity=false。
输出
Yuanlin概算物资计划台账.xlsx:固定含使用边界、苗木统计、铺装面积、缺项核对、汇总、依据。园林苗木统计.csv:分类、来源、植物名/图例名、数量、单位、计量方式、平面图文字标记数、置信分层、证据坐标、需核对、分类依据、参考库命中、计入主线。园林铺装面积.csv:图层、区域、角色、面积、嵌套深度、计算式、证据坐标、需核对、计入主线。缺项核对.csv、汇总.csv、依据.csv、园林概算报告.md。
苗木口径(v0.4.13)
项目规则可加 exclude_layers、include_layers_regex 与 exclude_frame_bbox 缩小铺装候选;规则只会排除候选,不会改变置信分层。
| 来源 | 计量方式 | 置信 | 是否计入主线 | 说明 |
|---|---|---|---|---|
| 苗木表(单位证据完整) | 设计给定(非逐株点数) | P0 | 是,作为设计基线 | 从图纸“苗木表/苗木配置表”名称+数量+单位证据解析;不能冒充平面图逐株点数 |
| 苗木表(单位缺失) | 设计给定(非逐株点数) | P1 | 是,但 final_quantity=false |
单位列为“待核对”,不默认为株;不计入株/棵/丛汇总 |
| 苗木表(数量=0,面积式/密度式) | 仅复核线索 | P3 | 否 | 无标题表靠“名称类表头+数量/单位表头”同排组合自识别;支持「中文名称」表头;不按株数推算 |
| 平面图图例(有坐标) | 块级实例去重计数 | P0 | 是(无冲突时) | 同名块按坐标去重;与苗木表冲突时降 P3 并退出主线,逐名对照写入缺项核对 |
| 底座块实例(无坐标) | instance_count |
P1 | 是,标明未逐点去重 | 底座已给出实例数,但本技能无法复点坐标 |
| DXF 顶层块引用坐标回退 | 同名块坐标去重 | P0 | 是(无冲突时) | 只有显式提供 --dxf-block-refs 且读到 INSERT 坐标时启用;坐标重复按去重半径排除 |
| 平面图块引用总数 | meta.block_refs 计数 |
P2 | 否 | 只有引用总数、无坐标且未去重,只作人工核对线索 |
| 识图图例/种植文字 | 文字出现次数(非株数) | P2 | 否 | 来自 plant_legends 或 systems 种植文字;用于人工复核和交叉检查 |
| 块名/文字推断失败 | 未计算 | P3 | 否 | 输出降级原因,不猜数量 |
植物名称参考库(v0.4.13)
- 内置库
rules/plant_library_常用园林植物.json:349 个中文名 → 乔木/灌木/地被/其他,来源为《常用园林植物品种规格及价格清单》的名称与分类章节(不含规格、密度、价格)。 - 内置区域/素材库:
rules/plant_library_*.json全部默认加载(按文件名稳定排序,先加载者优先);当前含plant_library_常用园林植物.json(349 名)、plant_library_西北温带荒漠区.json(112 名 / 131 条别名)、plant_library_园林景观CAD图块素材.json(311 名)与plant_library_分区苗木选型.json(8 个气候区 1022 名 / 去别名后新增约 700 名)。 - 图块素材库只取《园林景观CAD图块》单个树图块的 DWG 文件名,并按乔木/灌木/地被/其他归大类;不读取块内几何作规格推断,不改变数量口径。
- 项目库:
--plant-library 文件.{json,csv,xlsx},xlsx 只按“中文名称”列 + 章节行识别;.json支持names/categories/plants三种结构;.csv支持 中文名称+分类/类别 或 名称+章节。 - 章节→大类顺序(顺序敏感):地被(小灌木及地被 / 水生 / 草坪 / 地被 / 草花)→ 灌木(球类灌木 / 大灌木 / 灌木)→ 乔木(常绿乔木 / 落叶乔木 / 乔木)→ 其他(藤本 / 竹类);避免“小灌木及地被”被误判成灌木。
- 保守口径:参考库只补原词库缺口;内建/项目词库已覆盖的名称保持原分类,因此不改变既有主线结果。
- 命中记录:
园林苗木统计.csv的参考库命中列(格式大类:名称)与分类依据;汇总输出植物名称参考库条目数、参考库命中分类条数。 - 硬边界:参考库不含也不读规格、标号、单价;不据此自动推断规格或报价,不进入任何金额计算。
铺装面积口径
面积(m²) = 鞋带面积(图纸单位²) × (图纸单位对应毫米数 × 比例)² ÷ 1e6。- 外轮廓相加,洞/内岛按嵌套深度奇偶扣减。
- 有铺装图层且能成环:P0/P1 候选,无复核项时可计入主线。
- 含洞、闭环候选超过 50、疑似重复环/文字几何混入:标
需核对,退出主线。 - 图层名缺失:默认只出 REVIEW,不给面积;加
--paving-all-geometry才出强算双口径——候选环面积合计与奇偶扣减净值,二者均强制 P3、不计入主线。 - DXF 块内铺装:只在
--dxf-block-paving时输出,展开 INSERT 变换与 HATCH/ARC/Bulge 边界后按环面积合计,强制 P3、不计入主线。 - 过滤“同一节点重复经过”的伪环;但不能替代真实洞、内岛与外轮廓关系确认。
置信分层
| 层 | 含义 | 处理 |
|---|---|---|
| P0 | 直接证据 0.86–0.95:块名/坐标直中、苗木表文字直读、干净闭环 | 计入主线;苗木表只作设计基线 |
| P1 | 几何模式/无坐标计数 0.6–0.85 | 计入主线并标注 |
| P2 | 名称/文字推断 0.5–0.6 | 只进候选,不进主线 |
| P3 | 需人工核对:苗木表冲突、无法成环、缺图层、块内铺装、强算候选 | 标 需核对=是,排除主线 |
证据坐标
汇总表记录比例与图纸单位判定来源(用户覆盖/DXF INSUNITS/图纸文字/规则配置/默认);每条统计/面积行保留 文件 | 图层 | 块名/图例名 | 坐标(sample_coords/bbox/center) | 计算式 | 需核对原因,便于按图复核。P2 图例文字也保留出现位置样例;无坐标块计数标 无坐标;块计数=N。
边界
- 苗木数量受块引用/图例命名质量影响:无坐标、块名乱码时只能给苗木表设计基线或 P2/P3 候选,必须人工点数复核。
- 苗木表数量单位缺失时显示“待核对”,不默认为株;需补看表头或单位列后再计入物资口径。
- 苗木表数量是设计给定基线,不是平面图逐株点数;二者口径不可混用。
- 铺装面积依赖可靠图层和闭合环;含洞、细缝、重复环、缺图层时进
需核对,不替代设计复核与现场核对。 - 转换版/净化版 DWG 若图层名为空、块名乱码,铺装面积不可用;强算候选只能作排查线索。
- 比例/单位自动检测失败时面积不可信,必须用
--scale/--drawing-mm-per-unit指定。 - 扫描件/图片型 PDF 不给铺装面积;苗木文字候选也需人工核对。
- 不自动把公司数据上传云端,不联网解析图纸。
- 输出只作概算底稿与物资计划草稿,不作为结算、对量、竣工计量或正式报价依据。
真图回归结论(2026-10-14)
- 公司转换版:某安置小区安置区景观施工图
_t3边界。02种植总图+苗木表_t3.dwg:苗木表 54 条、株数基线 1792;图例/种植文字 P2 15 类/115 次;因图层空、块名空,平面逐株计数不可用。04铺装详图一_t3.dwg:默认不硬出面积;强算 403 条 P3 候选、合计 235976.5657 m²,不计主线。v0.2.0 的 561 条/85374.0195 m² 差异来自伪环过滤与“候选环面积合计”口径修正,不是同一口径直接比较。01总图部分_t3.dwg、绿化样本图.dwg、绿化设计说明.dwg:主线 0,降级正确。
- 公开 DXF:
- riveryard:13 类植物;P0/P1 主线 7 株;P2 块引用 6 类/12 次;DXF 块内铺装 P3 候选 2.52 m²,主线 0。
- clifftop:40 类植物;P0/P1 主线 34 株;P2 块引用 15 类/46 次;P2 文字 6 类/6 次;铺装未命中,主线 0。
- drone、greenplan_demo、green-atlas-site、green-atlas-closed-loop、Synovia:主线 0,负向控制通过。
- 公开样例只作本机回归,不随技能分发;clifftop 许可为 CC-BY-NC-SA 4.0,riveryard 未声明许可证。公司图纸不上云。
依赖与降级
- 底座
cad-file-reader >= 0.28.1为显式依赖;缺失时提示先安装底座,不静默用旧数据。 - 只有 landscape 输出、无几何详情:苗木统计可用,铺装面积降级为 review。
- 只有几何详情、无 landscape 输出:铺装面积可用,苗木分类退回块名/文字推断并标注。
ezdxf仅用于可选 DXF 块内铺装回退;底座vendor/ezdxf已提供,未安装时该回退不可用,不影响主线。- 无
openpyxl:仍输出 CSV/Markdown,台账 xlsx 跳过。
