1#!/bin/sh 2# dxf.test 3# 4# Copyright (C) 2018-2021 Free Software Foundation, Inc. 5# 6# This program is free software, licensed under the terms of the GNU 7# General Public License as published by the Free Software Foundation, 8# either version 3 of the License, or (at your option) any later version. 9# You should have received a copy of the GNU General Public License 10# along with this program. If not, see <http://www.gnu.org/licenses/>. 11# 12# test DXF specific content 13# Author: Reini Urban 14 15[ -z "$DATADIR" ] && DATADIR="@top_srcdir@/test/test-data" 16top_builddir="@top_builddir@" 17EXEEXT="@EXEEXT@" 18# artefact for "shellcheck" 19[ -z "$top_builddir" ] && echo $top_builddir 20 21i=0 22rm -f ./*dxf.log 23enable_debug="$(grep '^CFLAGS =' Makefile | grep 'DDEBUG_CLASSES')" 24is_release="$(grep -c 'IS_RELEASE 1' ../src/config.h)" 25 26check_subentity() { 27 if [ -f "$dwg" ] && [ -f "$dxf" ]; then 28 @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v4 -o "$tgt" "$dwg" 2>/dev/null 29 grep -A8 ^VERTEX "$dxf" >tmp1 30 grep -A8 ^VERTEX "$tgt" >tmp2 31 d="$(diff -bu1 tmp1 tmp2)" 32 test -z "$d" || echo "VERTEX $tgt $d" 33 grep -A8 ^SEQEND "$dxf" >tmp1 34 grep -A8 ^SEQEND "$tgt" >tmp2 35 d="$(diff -bu1 tmp1 tmp2)" 36 test -z "$d" || echo "SEQEND $tgt $d" 37 grep -A8 ^POLYLINE "$dxf" >tmp1 38 grep -A8 ^POLYLINE "$tgt" >tmp2 39 d="$(diff -bu1 tmp1 tmp2)" 40 test -z "$d" || echo "POLYLINE $tgt $d" 41 rm tmp1 tmp2 42# else 43# echo skip $dxf missing 44 fi 45} 46 47# check subentity owners 48for year in r14 2000 2004 2007 2010 2013 2018 49do 50 for base in PolyLine3D PolyLine2D 51 do 52 dwg="$DATADIR/${year}/${base}.dwg" 53 dxf="$DATADIR/${year}/${base}.dxf" 54 tgt="../${base}_${year}.dxf" 55 check_subentity 56 done 57done 58for year in r14 2000 2004 2007 2010 2013 2018 59do 60 for base in example Drawing 61 do 62 dwg="$DATADIR/${base}_${year}.dwg" 63 dxf="$DATADIR/${base}_${year}.dxf" 64 tgt="../${base}_${year}.dxf" 65 check_subentity 66 done 67done 68 69check_acdb_dxfname() { 70 if [ -f "$dwg" ] && [ -f "$dxf" ]; then 71 @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null 72 expect="$(grep -c "^$dxfname" "$dxf")" 73 if [ -n "$1" ]; then expect="$1"; fi 74 got=$(grep -c "^$dxfname" "$tgt") 75 if [ "$got" = "$expect" ] 76 then 77 echo "$tgt $dxfname ok" 78 else 79 echo "$tgt $dxfname fail: $got != $expect" 80 i=$((i+1)) 81 grep -2 "^$dxfname" "$tgt" >"$log" 82 fi 83 fi 84} 85 86# check handled ACDB* dxfname's 87# UNHANDLED: ACDBDETAILVIEWSTYLE ACDBSECTIONVIEWSTYLE 88for dwg in "$DATADIR"/sample_2*.dwg; do 89 dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" 90 tgt="../$(basename "$dxf")" 91 log="$(basename "$tgt").log" 92 rm "./$log" 2>/dev/null 93 for dxfname in ACDBDICTIONARYWDFLT ACDBPLACEHOLDER LAYOUT 94 do 95 check_acdb_dxfname 96 done 97done 98 99# Note that UNSTABLE classes are now skipped, just the single CLASS entry 100for dwg in "$DATADIR"/example_*.dwg; do 101 dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" 102 tgt="../$(basename "$dxf")" 103 log="$(basename "$tgt").log" 104 rm "./$log" 2>/dev/null 105 if [ "$tgt" != "../example_r14.dxf" ] && [ "$tgt" != "../example_r13.dxf" ]; then 106 for dxfname in ACDBPERSSUBENTMANAGER ACDBASSOCDEPENDENCY 107 do 108 if [ -z "$enable_debug" ]; then 109 check_acdb_dxfname 1 110 else 111 check_acdb_dxfname 112 fi 113 done 114 fi 115done 116for dwg in "$DATADIR"/2004/Underlay.dwg; do 117 dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')" 118 tgt="../$(basename "$dxf" .dxf)_2004.dxf" 119 log="$(basename "$tgt").log" 120 rm "./$log" 2>/dev/null 121 for dxfname in PDFDEFINITION PDFUNDERLAY 122 do 123 check_acdb_dxfname 124 done 125done 126 127# check vertex - seqend order 128check_pline_order() { 129 if [ -f "$dwg" ] && [ -f "$dxf" ]; then 130 @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null 131 got="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$tgt")" 132 expect="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$dxf")" 133 if [ "$got" = "$expect" ] 134 then 135 echo "$tgt" pline order ok 136 else 137 echo "$tgt" pline order fail: "$got" 138 i=$((i+1)) 139 echo "expect=$expect" >"$log" 140 echo "got=$got" >>"$log" 141 fi 142 fi 143} 144# check insert - attrib - seqend order 145check_insert_order() { 146 if [ -f "$dwg" ] && [ -f "$dxf" ]; then 147 @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null 148 got="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$tgt")" 149 expect="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$dxf")" 150 if [ "$got" = "$expect" ] 151 then 152 echo "$tgt" insert order ok 153 else 154 echo "$tgt" insert order fail: "$got" 155 i=$((i+1)) 156 echo "expect=$expect" >"$log" 157 echo "got=$got" >>"$log" 158 fi 159 fi 160} 161 162check_roundtrip() { 163 if [ -f "$dwg" ] && [ -x dxf2dwg ] 164 then 165 dxf="$(basename "$dwg" .dwg).dxf" 166 tgt="$(basename "$dwg")" 167 log1="$(basename "$dwg" .dwg).log1" 168 log2="$(basename "$dwg" .dwg).log2" 169 @LTEXEC@ ./dwg2dxf${EXEEXT} -y -v2 -o "$dxf" "$dwg" 2>"$log1" >/dev/null 170 @LTEXEC@ ./dxf2dwg${EXEEXT} -y -v0 -o "$tgt" "$dxf" 2>/dev/null >/dev/null 171 @LTEXEC@ ./dwgread${EXEEXT} -v2 "$tgt" 2>"$log2" >/dev/null 172 # We dont write unstable entities yet. WIPEOUT is converted to POINT in encode, but skipped at out_dxf 173 if [ -n "$enable_debug" ] && [ -z "$is_release" ]; then 174 expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|UNKNOWN_ENT)')" 175 else 176 expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|ARC_DIMENSION|HELIX|UNKNOWN_ENT)')" 177 fi 178 got="$(grep -E -c '^Add entity' "$log2")" 179 rm "./$dxf" "./$tgt" 2>/dev/null 180 if [ "$got" -eq "$expect" ] 181 then 182 echo "$dxf" roundtrip ok 183 rm "$log1" "$log2" 2>/dev/null 184 else 185 echo "$dxf" "roundtrip fail: expect $expect, got $got entities" 186 i=$((i+1)) 187 echo "expect=$expect" >"$log" 188 echo "got=$got" >>"$log" 189 @PERL@ -nle'/^Add entity (\w+) / && print $1' "$log1" >"$log1".tmp 190 @PERL@ -nle'/^Add entity (\w+) / && print $1' "$log2" >"$log2".tmp 191 diff -bu0 "$log1".tmp "$log2".tmp | grep -v '^@@' | tee "$log" 192 rm "$log1".tmp "$log2".tmp 2>/dev/null 193 fi 194 fi 195} 196 197for year in 2007 2018 198do 199 base=PolyLine3D 200 dwg="$DATADIR/${year}/${base}.dwg" 201 dxf="$DATADIR/2013/${base}.dxf" 202 tgt="../${base}_${year}.dxf" 203 log="$(basename "$tgt" .dxf)_pline.dxf.log" 204 rm "./$log" 2>/dev/null 205 check_pline_order 206done 207 208for year in 2000 2004 2007 2010 2013 2018 209do 210 base=example 211 dwg="$DATADIR/${base}_${year}.dwg" 212 dxf="$DATADIR/${base}_${year}.dxf" 213 tgt="../${base}_${year}.dxf" 214 log="$(basename "$tgt" .dxf)_pline.dxf.log" 215 rm "./$log" 2>/dev/null 216 check_pline_order 217done 218 219for year in 2000 2004 2007 2010 2013 2018 220do 221 base=example 222 dwg="$DATADIR/${base}_${year}.dwg" 223 dxf="$DATADIR/${base}_${year}.dxf" 224 tgt="../${base}_${year}.dxf" 225 log="$(basename "$tgt" .dxf)_insert.dxf.log" 226 rm "./$log" 2>/dev/null 227 check_insert_order 228done 229 230for year in 2000 2004 2007 2010 2013 2018 231do 232 base=example 233 dwg="$DATADIR/${base}_${year}.dwg" 234 tgt="../${base}_${year}" 235 log="$tgt.dxf.log" 236 rm "./$log" 2>/dev/null 237 check_roundtrip 238done 239 240if test "0" = "$i" ; then 241 rm ./*.dxf.log 2>/dev/null 242 exit 0 243else 244 echo "$(basename "$0"): $i failures" 245 ls -l ./*dxf.log 246 exit 1 247fi 248