Koordinatensystem von DXF-Files ermitteln
Hallo Zusammen,
ich komme gerade bei folgendem Problem nicht weiter. Vielleicht kann mir jemand von euch freundlicherweise auf die Sprünge helfen.
Ich habe ein Verzeichnis mit vielen hundert DXF-Dateien (AutoCAD). Es kommen immer wieder neue Dateien hinzu und dann werden auch wieder welche verschoben. Mein Batch soll nun prüfen, ob Dateien dabei sind, die nicht im GK-System (GK = Gauß-Krüger) liegen.
Dazu muss im Kopf (erste 50 Zeilen) jeder einzelnen Datei die Variable $EXTMAX (steht für "links unten") gefunden werden.
Zwei Zeilen nach der gefundenen Variable folgt die ...
X-Koordinate, die zwischen 3.000.000 und 4.000.000 liegen muss,
und dann wiederum 2 Zeilen weiter die ...
Y-Koordinate, die zwischen 5.000.000 und 6.000.000 liegen muss.
Ist das so, dann ist alles OK und es soll nach der Überprüfung aller Dateien (wenn ALLE im GK-System lagen) eine Meldung erfolgen, dass alle Dateien im GK-System liegen.
Liegen die Koordinaten (oder nur ein Wert von beiden) außerhalb der Grenzwerte, dann soll der Name der Datei in eine Protokolldatei eingetragen werden und am Ende der Überprüfung aller Dateien soll eine Meldung darüber erfolgen, dass es Dateien gibt, die nicht im GK-System liegen.
Auszug aus einer DXF-Datei / Start ------------------------------
0
SECTION
2
HEADER
999
Auftrag: xy
999
Erzeugt mit GG-DXF
999
Versionsnummer 5.0 (2146) - 2007/11/21
999
Installationsdatei: xy
999
Modus AutoCAD
999
NULLPOS x=0.000000 y=0.000000 DIM2=0 SCHRAFFMODE=0 OTYP=0
9
$ACADVER
1
AC1018
999
Koordinaten in [m]
9
$INSUNITS
70
6
9
$EXTMIN
10
3515846.83 {... Wert in Meter}
20
5443736.46 {... Wert in Meter}
9
$EXTMAX
...
Auszug aus einer DXF-Datei / Ende ------------------------------
Meine "unvollendete" Programmierung ...
REM DXF-Dateien prüfen
REM ================
@echo off & setlocal
set /a x = 0
set /a y = 0
set /a z = 0
set erg /a = 0
:: {0 = alle Dateien im GK-System / 1 = nicht alle Dateien im GK-System}
set "vrz=L:\SETUP\SCRIPT\TransferX"
set "FileType=DXF"
set "SearchKey=$EXTMIN"
set "LogFile=%vrz%\Protokoll.txt"
for %%f in ("%vrz%\*.%FileType%") do (
type "%%~f" | findstr /c:"%SearchKey%" > NUL && (
set /a z = {... Zeilennummer der Fundstelle}
set file=%%f
call :Pruefen !c! !file!
)
)
if #%erg%#==#0# (
echo Alle Dateien liegen im GK-System.
) else (
echo Nicht alle Dateien liegen im GX-System.
)
goto :eof
REM Prüfteil
:Pruefen
:: {... hier versagten mir die Kräfte ...}
set /a x=...
set /a y=...
:: {... hier kamen sie kurz zurück ...}
if %x% LSS 3000000 (
echo %x% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %x% GTR 4000000 (
echo %x% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %y% LSS 5000000 (
echo %y% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %y% GTR 6000000 (
echo %y% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
:: {... hier war dann finito ...}
goto :eof
Vielen Dank vorab für eure Unterstützung sagt
HerbieH
ich komme gerade bei folgendem Problem nicht weiter. Vielleicht kann mir jemand von euch freundlicherweise auf die Sprünge helfen.
Ich habe ein Verzeichnis mit vielen hundert DXF-Dateien (AutoCAD). Es kommen immer wieder neue Dateien hinzu und dann werden auch wieder welche verschoben. Mein Batch soll nun prüfen, ob Dateien dabei sind, die nicht im GK-System (GK = Gauß-Krüger) liegen.
Dazu muss im Kopf (erste 50 Zeilen) jeder einzelnen Datei die Variable $EXTMAX (steht für "links unten") gefunden werden.
Zwei Zeilen nach der gefundenen Variable folgt die ...
X-Koordinate, die zwischen 3.000.000 und 4.000.000 liegen muss,
und dann wiederum 2 Zeilen weiter die ...
Y-Koordinate, die zwischen 5.000.000 und 6.000.000 liegen muss.
Ist das so, dann ist alles OK und es soll nach der Überprüfung aller Dateien (wenn ALLE im GK-System lagen) eine Meldung erfolgen, dass alle Dateien im GK-System liegen.
Liegen die Koordinaten (oder nur ein Wert von beiden) außerhalb der Grenzwerte, dann soll der Name der Datei in eine Protokolldatei eingetragen werden und am Ende der Überprüfung aller Dateien soll eine Meldung darüber erfolgen, dass es Dateien gibt, die nicht im GK-System liegen.
Auszug aus einer DXF-Datei / Start ------------------------------
0
SECTION
2
HEADER
999
Auftrag: xy
999
Erzeugt mit GG-DXF
999
Versionsnummer 5.0 (2146) - 2007/11/21
999
Installationsdatei: xy
999
Modus AutoCAD
999
NULLPOS x=0.000000 y=0.000000 DIM2=0 SCHRAFFMODE=0 OTYP=0
9
$ACADVER
1
AC1018
999
Koordinaten in [m]
9
$INSUNITS
70
6
9
$EXTMIN
10
3515846.83 {... Wert in Meter}
20
5443736.46 {... Wert in Meter}
9
$EXTMAX
...
Auszug aus einer DXF-Datei / Ende ------------------------------
Meine "unvollendete" Programmierung ...
REM DXF-Dateien prüfen
REM ================
@echo off & setlocal
set /a x = 0
set /a y = 0
set /a z = 0
set erg /a = 0
:: {0 = alle Dateien im GK-System / 1 = nicht alle Dateien im GK-System}
set "vrz=L:\SETUP\SCRIPT\TransferX"
set "FileType=DXF"
set "SearchKey=$EXTMIN"
set "LogFile=%vrz%\Protokoll.txt"
for %%f in ("%vrz%\*.%FileType%") do (
type "%%~f" | findstr /c:"%SearchKey%" > NUL && (
set /a z = {... Zeilennummer der Fundstelle}
set file=%%f
call :Pruefen !c! !file!
)
)
if #%erg%#==#0# (
echo Alle Dateien liegen im GK-System.
) else (
echo Nicht alle Dateien liegen im GX-System.
)
goto :eof
REM Prüfteil
:Pruefen
:: {... hier versagten mir die Kräfte ...}
set /a x=...
set /a y=...
:: {... hier kamen sie kurz zurück ...}
if %x% LSS 3000000 (
echo %x% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %x% GTR 4000000 (
echo %x% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %y% LSS 5000000 (
echo %y% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
if %y% GTR 6000000 (
echo %y% >> %vrz%\Text.txt
set /a erg=1
goto :eof
)
:: {... hier war dann finito ...}
goto :eof
Vielen Dank vorab für eure Unterstützung sagt
HerbieH
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 365254
Url: https://administrator.de/contentid/365254
Ausgedruckt am: 19.03.2024 um 13:03 Uhr
5 Kommentare
Neuester Kommentar
Tja, leider lässt du den eigentlich interessanten Abschnitt weg und ersetzt ihn durch Punkte, wie soll man da vernünftig helfen ?
Gruß Snap
p.s. Habe mir gerade mal eine DXF angesehen. Folgender Powershell-Code macht das was du willst:
Gruß Snap
p.s. Habe mir gerade mal eine DXF angesehen. Folgender Powershell-Code macht das was du willst:
$xmin = 3000000
$xmax = 4000000
$ymin = 5000000
$ymax = 6000000
$logfile = "D:\Logs\log.txt"
$folderdxf = "D:\dxf"
$result = gci $folderdxf -filter *.dxf | ?{!$_.PSIsContainer} | ?{
$data = (select-string $_.Fullname -Pattern '$EXTMIN' -SimpleMatch -Context 4).Context.PostContext[1,3] | %{[double]$_}
if ([double]$data -ge $xmin -and [double]$data -le $xmax -and [double]$data[1] -ge $ymin -and [double]$data[1] -le $ymax ){$false}else{$true}
}
if ($result){
write-host "Folgende Dateien haben ungültige Koordinaten:" -F Yellow -B Red
write-host ($result.Fullname -join "`r`n") -F Yellow
($result.Fullname -join "`r`n") | sc $logfile
}else{
write-host "Alle Dateien sind konform." -F Green
}
Ist oben angepasst. Powershell kannst du einfach in einer Batch ausführen
Pure Batch kann ich dir auch liefern, aber wer macht sowas heutzutage noch, leben wir in den 80ern? Koppschüttel.
powershell-Executionpolicy ByPass -File "C:\PfadZumScript.ps1"
Pure Batch kann ich dir auch liefern, aber wer macht sowas heutzutage noch, leben wir in den 80ern? Koppschüttel.
Für die Batch-Oldies dann eben noch hier:
@echo off &setlocal enabledelayedexpansion
:: ===========VARIABLEN===========
set "folderdxf=D:\dxf"
set "logfile=D:\dxf\log.txt"
set xmin=3000000
set xmax=4000000
set ymin=5000000
set ymax=6000000
:: ================================
set errcnt=0
del "%logfile%" >nul 2>&1
for %%a in ("%folderdxf%\*.dxf") DO (
set "error="
for /f "tokens=1 delims=:" %%b in ('findstr /nc:"$EXTMIN" "%%a"') do (
set /a linex=%%b+2
set /a liney=%%b+4
)
call :checkvalues "%%a" !linex! !liney!
if !error! EQU 1 (
set /a errcnt+=1
echo Nicht konformes Koordinatensystem in Datei: '%%a'
echo(%%a>>"%logfile%"
)
)
if !errcnt! == 0 echo Alle Dateien haben korrekte Koordinatensysteme
exit /b
:checkvalues
for /f "tokens=2 delims=:." %%c in ('findstr /nr "^" "%~1" ^| findstr /br "%~2:"') do set "valuex=%%c"
for /f "tokens=2 delims=:." %%c in ('findstr /nr "^" "%~1" ^| findstr /br "%~3:"') do set "valuey=%%c"
if %valuex% LSS %xmin% set error=1
if %valuex% GTR %xmax% set error=1
if %valuey% LSS %ymin% set error=1
if %valuey% GTR %ymax% set error=1
exit /b