第05章 - 命令行工具详解
第05章 - 命令行工具详解
5.1 工具概览
LibreDWG提供了一系列实用的命令行工具,用于DWG文件的处理、转换和信息提取。
5.1.1 工具清单
| 工具名称 | 主要功能 | 输入格式 | 输出格式 |
|---|---|---|---|
dwgread |
通用DWG读取器 | DWG | JSON/DXF/DXFB/GeoJSON等 |
dwgwrite |
DWG写入器 | DXF/DXFB/JSON | DWG |
dwg2dxf |
DWG转DXF | DWG | DXF/DXFB |
dxf2dwg |
DXF转DWG | DXF/DXFB | DWG |
dwglayers |
图层提取 | DWG | 文本 |
dwggrep |
文本搜索 | DWG | 文本 |
dwg2SVG |
DWG转SVG | DWG | SVG |
dwg2ps |
DWG转PostScript | DWG | PS |
dwgbmp |
缩略图提取 | DWG | BMP/PNG |
dwgadd |
图元添加工具 | 脚本 | DWG/DXF/JSON |
dwgrewrite |
DWG重写 | DWG | DWG |
dwgfilter |
JSON过滤器 | DWG | JSON |
5.1.2 通用选项
大多数工具支持以下通用选项:
-v[erbose] # 详细输出(可重复使用增加级别:-v -v -v)
-h[elp] # 显示帮助信息
--version # 显示版本信息
-o FILE # 指定输出文件
-y # 覆盖已存在的输出文件
5.2 dwgread - 通用DWG读取器
5.2.1 基本用法
dwgread是最通用的DWG读取工具,支持多种输出格式:
# 基本语法
dwgread [选项] <输入文件.dwg>
# 输出为JSON
dwgread -o json drawing.dwg > drawing.json
# 输出为DXF
dwgread -o dxf drawing.dwg > drawing.dxf
# 输出为GeoJSON
dwgread -o geojson drawing.dwg > drawing.geojson
5.2.2 输出格式选项
-o FORMAT # 指定输出格式
# 支持的格式:
# json - JSON格式(完整数据)
# dxf - ASCII DXF格式
# dxfb - 二进制DXF格式
# geojson - GeoJSON格式
# svg - SVG格式
5.2.3 详细选项
-v # 输出详细信息
-v -v # 更详细
-v -v -v # 最详细
-m # 仅输出最小化信息
-a # 输出所有对象(包括未分配的)
5.2.4 实用示例
# 查看DWG文件基本信息
dwgread -v drawing.dwg 2>&1 | head -50
# 导出为格式化的JSON
dwgread -o json drawing.dwg | jq '.' > drawing_formatted.json
# 提取特定对象类型到JSON
dwgread -o json drawing.dwg | jq '.objects[] | select(.type == "LINE")' > lines.json
# 批量转换目录下所有DWG
for f in *.dwg; do
dwgread -o dxf "$f" > "${f%.dwg}.dxf"
done
# 提取图层信息并格式化
dwgread -o json drawing.dwg | jq '.objects[] | select(.type == "LAYER") | {name: .name, color: .color}'
5.3 dwgwrite - DWG写入器
5.3.1 基本用法
dwgwrite用于从DXF或JSON创建DWG文件:
# 基本语法
dwgwrite [选项] <输入文件> -o <输出文件.dwg>
# 从DXF创建DWG
dwgwrite drawing.dxf -o drawing.dwg
# 从JSON创建DWG
dwgwrite drawing.json -o drawing.dwg
5.3.2 版本控制
-r VERSION # 指定输出DWG版本
# 支持的版本:
# r14, r2000 (默认), r2004, r2007, r2010, r2013, r2018
# 注意:r2004+写入仍为实验性功能
5.3.3 实用示例
# 创建R2000版本DWG(兼容性最好)
dwgwrite -r r2000 drawing.dxf -o drawing_r2000.dwg
# 从JSON创建DWG
dwgwrite drawing.json -o drawing.dwg -y
# 批量转换DXF到DWG
for f in *.dxf; do
dwgwrite "$f" -o "${f%.dxf}.dwg"
done
5.4 dwg2dxf - DWG转DXF转换器
5.4.1 基本用法
# 基本转换
dwg2dxf drawing.dwg
# 指定输出文件
dwg2dxf drawing.dwg -o output.dxf
# 输出二进制DXF
dwg2dxf -b drawing.dwg -o output.dxf
# 指定输出版本
dwg2dxf -r r2000 drawing.dwg
5.4.2 完整选项
-h # 显示帮助
--version # 显示版本
-v # 详细输出
-b # 输出二进制DXF
-m # 最小化输出(不含无关数据)
-r VERSION # 指定输出版本
-o FILE # 指定输出文件
-y # 覆盖已存在文件
-a # 输出所有对象
5.4.3 版本转换示例
# 转换为R14兼容DXF
dwg2dxf -r r14 new_drawing.dwg -o old_compatible.dxf
# 转换为R2000 DXF
dwg2dxf -r r2000 drawing.dwg
# 转换为最小化DXF(适合解析)
dwg2dxf -m drawing.dwg -o minimal.dxf
# 批量转换
find . -name "*.dwg" -exec dwg2dxf {} \;
5.4.4 DXF输出精度控制
编译时可通过configure选项控制DXF小数精度:
# 编译时设置(推荐6位)
./configure --with-dxf-precision=6
5.5 dxf2dwg - DXF转DWG转换器
5.5.1 基本用法
# 基本转换
dxf2dwg drawing.dxf
# 指定输出
dxf2dwg drawing.dxf -o output.dwg
# 指定版本
dxf2dwg -r r2000 drawing.dxf
5.5.2 选项说明
-h # 帮助
--version # 版本
-v # 详细输出
-r VERSION # 输出版本(默认r2000)
-o FILE # 输出文件
-y # 覆盖文件
5.5.3 使用示例
# 从ASCII DXF转换
dxf2dwg ascii_drawing.dxf -o drawing.dwg
# 从二进制DXF转换
dxf2dwg binary_drawing.dxf -o drawing.dwg
# 批量转换
for f in *.dxf; do
dxf2dwg "$f" -o "${f%.dxf}.dwg"
done
# 创建特定版本
dxf2dwg input.dxf -r r2000 -o output.dwg
5.6 dwglayers - 图层信息提取
5.6.1 基本用法
# 列出所有图层
dwglayers drawing.dwg
# 详细输出
dwglayers -v drawing.dwg
# 输出扩展图层名
dwglayers --extnames drawing.dwg
5.6.2 输出格式
默认输出格式:
图层名
详细输出格式(-v):
图层名 颜色 线型 冻结/开启 锁定
5.6.3 选项说明
-h # 帮助
--version # 版本
-v # 详细输出(包含颜色、线型等)
--extnames # 输出扩展图层名
-o FILE # 输出到文件
5.6.4 实用示例
# 列出图层并排序
dwglayers drawing.dwg | sort
# 统计图层数量
dwglayers drawing.dwg | wc -l
# 查找特定图层
dwglayers drawing.dwg | grep -i "wall"
# 批量提取多个文件的图层
for f in *.dwg; do
echo "=== $f ==="
dwglayers "$f"
done > all_layers.txt
# 提取图层详细信息并格式化
dwglayers -v drawing.dwg | column -t
# 导出为CSV格式
dwglayers -v drawing.dwg | sed 's/\s\+/,/g' > layers.csv
5.7 dwggrep - DWG文本搜索
5.7.1 基本用法
# 搜索文本
dwggrep "TITLE" drawing.dwg
# 正则表达式搜索
dwggrep -E "A-[0-9]+" drawing.dwg
# 不区分大小写
dwggrep -i "title" drawing.dwg
5.7.2 选项说明
-h # 帮助
--version # 版本
-i # 不区分大小写
-c # 仅输出匹配计数
-H # 输出文件名(多文件时默认)
-r # 递归搜索目录
-E # 使用扩展正则表达式(需要pcre2)
-v # 输出不匹配的行
5.7.3 搜索示例
# 基本搜索
dwggrep "ROOM" floor_plan.dwg
# 搜索所有文本实体
dwggrep -i "note" drawing.dwg
# 使用正则表达式搜索门窗编号
dwggrep -E "^[DW][0-9]{3}$" building.dwg
# 统计匹配数量
dwggrep -c "WALL" drawing.dwg
# 搜索多个文件
dwggrep "TITLE" *.dwg
# 递归搜索目录
dwggrep -r "PROJECT" ./drawings/
# 搜索特定模式并显示文件名
dwggrep -H -i "rev" *.dwg
# 查找包含特殊字符的文本
dwggrep -E "[Φφ]" structural.dwg # 搜索直径符号
5.7.4 高级搜索技巧
# 搜索坐标范围内的文本(配合其他工具)
dwgread -o json drawing.dwg | \
jq '.objects[] | select(.type == "TEXT" and .text | contains("ROOM"))'
# 提取所有文本内容
dwgread -o json drawing.dwg | \
jq -r '.objects[] | select(.type == "TEXT" or .type == "MTEXT") | .text'
# 搜索并输出位置信息
dwgread -o json drawing.dwg | \
jq '.objects[] | select(.type == "TEXT" and (.text | contains("A-"))) | {text: .text, x: .ins_pt.x, y: .ins_pt.y}'
5.8 dwg2SVG - DWG转SVG转换器
5.8.1 基本用法
# 基本转换
dwg2SVG drawing.dwg > drawing.svg
# 指定输出文件
dwg2SVG drawing.dwg -o drawing.svg
5.8.2 选项说明
-h # 帮助
--version # 版本
-v # 详细输出
-o FILE # 输出文件
5.8.3 注意事项
- SVG仅支持2D内容,3D数据会被投影或忽略
- 部分复杂实体可能无法完美转换
- 建议在转换后用Inkscape等工具查看和编辑
5.8.4 使用示例
# 转换并优化
dwg2SVG drawing.dwg -o drawing.svg
# 批量转换
for f in *.dwg; do
dwg2SVG "$f" -o "${f%.dwg}.svg"
done
# 转换后用svgo优化
dwg2SVG drawing.dwg | svgo - -o drawing_optimized.svg
5.9 dwg2ps - DWG转PostScript
5.9.1 基本用法
# 基本转换
dwg2ps drawing.dwg > drawing.ps
# 指定输出
dwg2ps drawing.dwg -o drawing.ps
5.9.2 依赖要求
此工具需要pslib库支持:
# Ubuntu/Debian
sudo apt install libps-dev
# 编译LibreDWG时需要启用pslib支持
./configure --with-pslib
5.9.3 使用示例
# 转换为PostScript
dwg2ps drawing.dwg -o drawing.ps
# 转换为PDF(通过ps2pdf)
dwg2ps drawing.dwg | ps2pdf - drawing.pdf
# 批量转换为PDF
for f in *.dwg; do
dwg2ps "$f" | ps2pdf - "${f%.dwg}.pdf"
done
5.10 dwgbmp - 缩略图提取
5.10.1 基本用法
# 提取缩略图
dwgbmp drawing.dwg
# 指定输出文件名
dwgbmp drawing.dwg -o thumbnail.bmp
5.10.2 输出格式
默认输出BMP格式的缩略图。如果DWG文件中包含缩略图,将被提取出来。
5.10.3 使用示例
# 提取单个文件缩略图
dwgbmp drawing.dwg -o preview.bmp
# 批量提取缩略图
for f in *.dwg; do
dwgbmp "$f" -o "${f%.dwg}_thumb.bmp"
done
# 转换为PNG(需要ImageMagick)
dwgbmp drawing.dwg -o temp.bmp && convert temp.bmp preview.png && rm temp.bmp
# 检查DWG是否包含缩略图
dwgbmp drawing.dwg 2>&1 | grep -q "No thumbnail" && echo "无缩略图" || echo "有缩略图"
5.11 dwgadd - 图元添加工具
5.11.1 基本用法
dwgadd是一个通过脚本向DWG添加图元的工具:
# 创建新DWG
dwgadd script.txt -o new_drawing.dwg
# 向现有DWG添加图元
dwgadd script.txt drawing.dwg -o modified.dwg
5.11.2 脚本语法
脚本文件使用简单的命令格式:
# 注释
LINE 0,0,0 100,100,0
CIRCLE 50,50,0 25
POINT 75,75,0
TEXT 10,10,0 "Hello" 5
ARC 100,100,0 50 0 90
5.11.3 支持的命令
LINE x1,y1,z1 x2,y2,z2 # 直线
CIRCLE x,y,z radius # 圆
ARC x,y,z radius start_angle end_angle # 圆弧
POINT x,y,z # 点
TEXT x,y,z "content" height # 文字
LAYER name color # 创建图层
SETLAYER name # 设置当前图层
5.11.4 示例脚本
simple_drawing.txt:
# 创建图层
LAYER "Walls" 1
LAYER "Doors" 3
LAYER "Windows" 5
# 绘制墙体
SETLAYER "Walls"
LINE 0,0,0 1000,0,0
LINE 1000,0,0 1000,800,0
LINE 1000,800,0 0,800,0
LINE 0,800,0 0,0,0
# 绘制门
SETLAYER "Doors"
ARC 200,0,0 100 0 90
# 添加标注
SETLAYER "0"
TEXT 500,400,0 "ROOM 101" 50
使用脚本:
dwgadd simple_drawing.txt -o room.dwg
5.12 dwgrewrite - DWG重写工具
5.12.1 基本用法
dwgrewrite读取DWG文件并以不同版本重新写入:
# 重写为默认版本
dwgrewrite drawing.dwg -o rewritten.dwg
# 指定版本
dwgrewrite -r r2000 new_drawing.dwg -o old_version.dwg
5.12.2 选项说明
-h # 帮助
--version # 版本
-v # 详细输出
-r VERSION # 指定输出版本
-o FILE # 输出文件
-y # 覆盖文件
5.12.3 用途场景
- 版本降级:将高版本DWG转为低版本以提高兼容性
- 文件修复:某些损坏的DWG可通过重写修复
- 验证:测试LibreDWG的读写一致性
5.12.4 使用示例
# 版本降级
dwgrewrite -r r2000 r2018_drawing.dwg -o r2000_drawing.dwg
# 批量转换版本
for f in *.dwg; do
dwgrewrite -r r2000 "$f" -o "r2000/${f}"
done
# 文件修复尝试
dwgrewrite corrupted.dwg -o repaired.dwg -v
5.13 dwgfilter - JSON过滤器
5.13.1 基本用法
dwgfilter使用jq对DWG的JSON表示进行过滤:
# 应用jq过滤器
dwgfilter 'expression' drawing.dwg
5.13.2 依赖要求
需要安装jq:
# Ubuntu/Debian
sudo apt install jq
# macOS
brew install jq
5.13.3 实用示例
# 提取所有LINE实体
dwgfilter '.objects[] | select(.type == "LINE")' drawing.dwg
# 统计各类型实体数量
dwgfilter '.objects | group_by(.type) | map({type: .[0].type, count: length})' drawing.dwg
# 提取图层名称
dwgfilter '.objects[] | select(.type == "LAYER") | .name' drawing.dwg
# 提取特定图层的实体
dwgfilter '.objects[] | select(.layer == "WALLS")' drawing.dwg
# 计算所有线段总长度
dwgfilter '[.objects[] | select(.type == "LINE") |
pow(.end.x - .start.x; 2) + pow(.end.y - .start.y; 2) | sqrt] | add' drawing.dwg
5.14 批处理脚本示例
5.14.1 批量格式转换脚本
batch_convert.sh:
#!/bin/bash
# DWG批量转换脚本
# 配置
INPUT_DIR="./input"
OUTPUT_DIR="./output"
OUTPUT_FORMAT="dxf" # dxf, json, svg
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 转换函数
convert_dwg() {
local input="$1"
local filename=$(basename "$input" .dwg)
local output="$OUTPUT_DIR/${filename}.${OUTPUT_FORMAT}"
echo "转换: $input -> $output"
case $OUTPUT_FORMAT in
dxf)
dwg2dxf "$input" -o "$output"
;;
json)
dwgread -o json "$input" > "$output"
;;
svg)
dwg2SVG "$input" -o "$output"
;;
esac
if [ $? -eq 0 ]; then
echo " 成功"
else
echo " 失败"
fi
}
# 处理所有DWG文件
for dwg in "$INPUT_DIR"/*.dwg; do
[ -f "$dwg" ] && convert_dwg "$dwg"
done
echo "转换完成"
5.14.2 图层分析脚本
analyze_layers.sh:
#!/bin/bash
# DWG图层分析脚本
echo "文件名,图层数,图层列表"
for dwg in *.dwg; do
if [ -f "$dwg" ]; then
layers=$(dwglayers "$dwg" 2>/dev/null | sort | tr '\n' ';')
count=$(dwglayers "$dwg" 2>/dev/null | wc -l)
echo "$dwg,$count,$layers"
fi
done
5.14.3 文本提取脚本
extract_text.sh:
#!/bin/bash
# 从DWG提取所有文本内容
for dwg in "$@"; do
echo "=== $dwg ==="
dwgread -o json "$dwg" 2>/dev/null | \
jq -r '.objects[] | select(.type == "TEXT" or .type == "MTEXT") |
if .type == "TEXT" then .text_value else .text end' | \
sort -u
echo
done
5.14.4 DWG信息报告脚本
dwg_report.sh:
#!/bin/bash
# 生成DWG文件信息报告
report_dwg() {
local file="$1"
echo "========================================="
echo "文件: $file"
echo "========================================="
# 获取JSON数据
local json=$(dwgread -o json "$file" 2>/dev/null)
# 基本统计
echo "对象总数: $(echo "$json" | jq '.objects | length')"
echo ""
# 类型统计
echo "实体类型统计:"
echo "$json" | jq -r '.objects | group_by(.type) |
map({type: .[0].type, count: length}) |
sort_by(.count) | reverse[] |
"\(.type): \(.count)"' | head -20
echo ""
# 图层统计
echo "图层列表:"
dwglayers "$file" 2>/dev/null
echo ""
}
for dwg in "$@"; do
[ -f "$dwg" ] && report_dwg "$dwg"
done
5.15 故障排除
5.15.1 常见错误
错误:Command not found
# 检查安装
which dwg2dxf
# 添加到PATH
export PATH=/usr/local/bin:$PATH
错误:Library not found
# 更新库缓存
sudo ldconfig
# 设置库路径
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
错误:Unsupported version
# 某些高版本DWG可能不完全支持
# 尝试使用详细模式查看具体错误
dwgread -v -v drawing.dwg 2>&1 | head -100
5.15.2 调试技巧
# 启用跟踪
export LIBREDWG_TRACE=3
dwg2dxf drawing.dwg
# 更高级别跟踪
export LIBREDWG_TRACE=9
dwgread drawing.dwg
# 检查返回码
dwg2dxf drawing.dwg
echo "返回码: $?"
5.16 本章小结
本章详细介绍了LibreDWG的命令行工具:
- dwgread:通用读取器,支持多种输出格式
- dwgwrite:从DXF/JSON创建DWG
- dwg2dxf/dxf2dwg:DWG与DXF互转
- dwglayers:图层信息提取
- dwggrep:DWG文本搜索
- dwg2SVG/dwg2ps:图形格式转换
- dwgbmp:缩略图提取
- dwgadd:脚本化添加图元
- dwgrewrite:DWG版本转换
- dwgfilter:JSON过滤器
这些工具可以组合使用,实现复杂的批处理任务。
下一章预告:第06章 - C语言API编程基础 - 学习如何使用LibreDWG的C语言API进行开发。

浙公网安备 33010602011771号