#!/bin/sh # dxf.test # # Copyright (C) 2018-2021 Free Software Foundation, Inc. # # This program is free software, licensed under the terms of the GNU # General Public License as published by the Free Software Foundation, # either version 3 of the License, or (at your option) any later version. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # test DXF specific content # Author: Reini Urban [ -z "$DATADIR" ] && DATADIR="@top_srcdir@/test/test-data" top_builddir="@top_builddir@" EXEEXT="@EXEEXT@" # artefact for "shellcheck" [ -z "$top_builddir" ] && echo $top_builddir i=0 rm -f ./*dxf.log enable_debug="$(grep '^CFLAGS =' Makefile | grep 'DDEBUG_CLASSES')" is_release="$(grep -c 'IS_RELEASE 1' ../src/config.h)" check_subentity() { if [ -f "$dwg" ] && [ -f "$dxf" ]; then @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v4 -o "$tgt" "$dwg" 2>/dev/null grep -A8 ^VERTEX "$dxf" >tmp1 grep -A8 ^VERTEX "$tgt" >tmp2 d="$(diff -bu1 tmp1 tmp2)" test -z "$d" || echo "VERTEX $tgt $d" grep -A8 ^SEQEND "$dxf" >tmp1 grep -A8 ^SEQEND "$tgt" >tmp2 d="$(diff -bu1 tmp1 tmp2)" test -z "$d" || echo "SEQEND $tgt $d" grep -A8 ^POLYLINE "$dxf" >tmp1 grep -A8 ^POLYLINE "$tgt" >tmp2 d="$(diff -bu1 tmp1 tmp2)" test -z "$d" || echo "POLYLINE $tgt $d" rm tmp1 tmp2 # else # echo skip $dxf missing fi } # check subentity owners for year in r14 2000 2004 2007 2010 2013 2018 do for base in PolyLine3D PolyLine2D do dwg="$DATADIR/${year}/${base}.dwg" dxf="$DATADIR/${year}/${base}.dxf" tgt="../${base}_${year}.dxf" check_subentity done done for year in r14 2000 2004 2007 2010 2013 2018 do for base in example Drawing do dwg="$DATADIR/${base}_${year}.dwg" dxf="$DATADIR/${base}_${year}.dxf" tgt="../${base}_${year}.dxf" check_subentity done done check_acdb_dxfname() { if [ -f "$dwg" ] && [ -f "$dxf" ]; then @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null expect="$(grep -c "^$dxfname" "$dxf")" if [ -n "$1" ]; then expect="$1"; fi got=$(grep -c "^$dxfname" "$tgt") if [ "$got" = "$expect" ] then echo "$tgt $dxfname ok" else echo "$tgt $dxfname fail: $got != $expect" i=$((i+1)) grep -2 "^$dxfname" "$tgt" >"$log" fi fi } # check handled ACDB* dxfname's # UNHANDLED: ACDBDETAILVIEWSTYLE ACDBSECTIONVIEWSTYLE for dwg in "$DATADIR"/sample_2*.dwg; do dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" tgt="../$(basename "$dxf")" log="$(basename "$tgt").log" rm "./$log" 2>/dev/null for dxfname in ACDBDICTIONARYWDFLT ACDBPLACEHOLDER LAYOUT do check_acdb_dxfname done done # Note that UNSTABLE classes are now skipped, just the single CLASS entry for dwg in "$DATADIR"/example_*.dwg; do dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" tgt="../$(basename "$dxf")" log="$(basename "$tgt").log" rm "./$log" 2>/dev/null if [ "$tgt" != "../example_r14.dxf" ] && [ "$tgt" != "../example_r13.dxf" ]; then for dxfname in ACDBPERSSUBENTMANAGER ACDBASSOCDEPENDENCY do if [ -z "$enable_debug" ]; then check_acdb_dxfname 1 else check_acdb_dxfname fi done fi done for dwg in "$DATADIR"/2004/Underlay.dwg; do dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" tgt="../$(basename "$dxf" .dxf)_2004.dxf" log="$(basename "$tgt").log" rm "./$log" 2>/dev/null for dxfname in PDFDEFINITION PDFUNDERLAY do check_acdb_dxfname done done # check vertex - seqend order check_pline_order() { if [ -f "$dwg" ] && [ -f "$dxf" ]; then @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null got="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$tgt")" expect="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$dxf")" if [ "$got" = "$expect" ] then echo "$tgt" pline order ok else echo "$tgt" pline order fail: "$got" i=$((i+1)) echo "expect=$expect" >"$log" echo "got=$got" >>"$log" fi fi } # check insert - attrib - seqend order check_insert_order() { if [ -f "$dwg" ] && [ -f "$dxf" ]; then @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null got="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$tgt")" expect="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$dxf")" if [ "$got" = "$expect" ] then echo "$tgt" insert order ok else echo "$tgt" insert order fail: "$got" i=$((i+1)) echo "expect=$expect" >"$log" echo "got=$got" >>"$log" fi fi } check_roundtrip() { if [ -f "$dwg" ] && [ -x dxf2dwg ] then dxf="$(basename "$dwg" .dwg).dxf" tgt="$(basename "$dwg")" log1="$(basename "$dwg" .dwg).log1" log2="$(basename "$dwg" .dwg).log2" @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v2 -o "$dxf" "$dwg" 2>"$log1" >/dev/null @LTEXEC@ ./dxf2dwg${EXEEXT} -y -v0 -o "$tgt" "$dxf" 2>/dev/null >/dev/null @LTEXEC@ ./dwgread${EXEEXT} -v2 "$tgt" 2>"$log2" >/dev/null # We dont write unstable entities yet. WIPEOUT is converted to POINT in encode, but skipped at out_dxf if [ -n "$enable_debug" ] && [ -z "$is_release" ]; then expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|UNKNOWN_ENT)')" else expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|ARC_DIMENSION|HELIX|UNKNOWN_ENT)')" fi got="$(grep -E -c '^Add entity' "$log2")" rm "./$dxf" "./$tgt" 2>/dev/null if [ "$got" -eq "$expect" ] then echo "$dxf" roundtrip ok rm "$log1" "$log2" 2>/dev/null else echo "$dxf" "roundtrip fail: expect $expect, got $got entities" i=$((i+1)) echo "expect=$expect" >"$log" echo "got=$got" >>"$log" @PERL@ -nle'/^Add entity (\w+) / && print $1' "$log1" >"$log1".tmp @PERL@ -nle'/^Add entity (\w+) / && print $1' "$log2" >"$log2".tmp diff -bu0 "$log1".tmp "$log2".tmp | grep -v '^@@' | tee "$log" rm "$log1".tmp "$log2".tmp 2>/dev/null fi fi } for year in 2007 2018 do base=PolyLine3D dwg="$DATADIR/${year}/${base}.dwg" dxf="$DATADIR/2013/${base}.dxf" tgt="../${base}_${year}.dxf" log="$(basename "$tgt" .dxf)_pline.dxf.log" rm "./$log" 2>/dev/null check_pline_order done for year in 2000 2004 2007 2010 2013 2018 do base=example dwg="$DATADIR/${base}_${year}.dwg" dxf="$DATADIR/${base}_${year}.dxf" tgt="../${base}_${year}.dxf" log="$(basename "$tgt" .dxf)_pline.dxf.log" rm "./$log" 2>/dev/null check_pline_order done for year in 2000 2004 2007 2010 2013 2018 do base=example dwg="$DATADIR/${base}_${year}.dwg" dxf="$DATADIR/${base}_${year}.dxf" tgt="../${base}_${year}.dxf" log="$(basename "$tgt" .dxf)_insert.dxf.log" rm "./$log" 2>/dev/null check_insert_order done for year in 2000 2004 2007 2010 2013 2018 do base=example dwg="$DATADIR/${base}_${year}.dwg" tgt="../${base}_${year}" log="$tgt.dxf.log" rm "./$log" 2>/dev/null check_roundtrip done if test "0" = "$i" ; then rm ./*.dxf.log 2>/dev/null exit 0 else echo "$(basename "$0"): $i failures" ls -l ./*dxf.log exit 1 fi