第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 用途场景

  1. 版本降级:将高版本DWG转为低版本以提高兼容性
  2. 文件修复:某些损坏的DWG可通过重写修复
  3. 验证:测试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的命令行工具:

  1. dwgread:通用读取器,支持多种输出格式
  2. dwgwrite:从DXF/JSON创建DWG
  3. dwg2dxf/dxf2dwg:DWG与DXF互转
  4. dwglayers:图层信息提取
  5. dwggrep:DWG文本搜索
  6. dwg2SVG/dwg2ps:图形格式转换
  7. dwgbmp:缩略图提取
  8. dwgadd:脚本化添加图元
  9. dwgrewrite:DWG版本转换
  10. dwgfilter:JSON过滤器

这些工具可以组合使用,实现复杂的批处理任务。


下一章预告第06章 - C语言API编程基础 - 学习如何使用LibreDWG的C语言API进行开发。

posted @ 2026-01-11 00:40  我才是银古  阅读(9)  评论(0)    收藏  举报