herbieh
Goto Top

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

Content-Key: 365254

Url: https://administrator.de/contentid/365254

Printed on: April 25, 2024 at 00:04 o'clock

Mitglied: 135333
Solution 135333 Feb 20, 2018 updated at 09:50:04 (UTC)
Goto Top
Zitat von @HerbieH:
$EXTMAX
...
Auszug aus einer DXF-Datei / Ende ------------------------------
Tja, leider lässt du den eigentlich interessanten Abschnitt weg und ersetzt ihn durch Punkte, wie soll man da vernünftig helfen face-sad?

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  
}
Member: HerbieH
HerbieH Feb 20, 2018 at 09:49:08 (UTC)
Goto Top
Sorry,

es geht um die Variable $EXTMIN, ich hatte versehentlich &EXTMAX in meiner Erläuterung geschrieben.

Danke für Deine Lösung. Ich suche allerdings eine Batch-Lösung.

Vielen Dank trotzdem.
Mitglied: 135333
135333 Feb 20, 2018 updated at 09:52:07 (UTC)
Goto Top
Ist oben angepasst. Powershell kannst du einfach in einer Batch ausführen
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.
Mitglied: 135333
135333 Feb 20, 2018 updated at 11:27:09 (UTC)
Goto Top
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
Member: HerbieH
HerbieH Feb 20, 2018 at 13:39:41 (UTC)
Goto Top
Batch as Batch can. face-smile

Vielen Dank snapdragon für Deine großartige Unterstützung!!