Compare commits

..

16 Commits

Author SHA1 Message Date
m.stangl aea8c5e029 Add CLAUDE.md for Claude Code guidance
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 23:22:47 +02:00
m.stangl eb04b9d73a Merge branch 'main' of https://gitea.schoenenberger.de/mistangl/SSG-Ruledesigner-Konfigurator 2026-05-06 19:16:53 +02:00
m.stangl 8e8ce9e676 Test der Grenzen impl. Doku erweitert 2026-05-06 19:16:13 +02:00
y.wang 9fa569e449 Die CP-Direction für Kurve 30 und 60 korrigiert. 2026-04-23 14:04:52 +02:00
y.wang b959208ddc Anpassung für Calculate Varioförderer 2026-04-10 11:29:48 +02:00
y.wang aeb34cd85a Merge branch 'main' of https://gitea.schoenenberger.de/mistangl/SSG-Ruledesigner-Konfigurator 2026-04-09 16:21:40 +02:00
y.wang a3715cd036 Die Funktion für CSV Export wurde angepasst. Der Varioförderer mit Gefällestrecke kann als Streckengruppe richtig exportiert Werden. 2026-04-09 16:21:37 +02:00
m.stangl 099630ca86 Schalter für minimiertes Laufen von SE dazu 2026-04-08 12:33:31 +02:00
m.stangl 0defdc24cc Pfadfeststellung ist nur noch in manage_interpreter.bat. Aufrufende Skripte etwas umgebaut 2026-04-08 12:17:16 +02:00
m.stangl fb25aca5ce Readme Doku aktualisiert. War veraltet. pip Abhängigkeiten in lib/requirements.txt ergänzt. Python Install Skript für venv dazu 2026-04-08 11:50:44 +02:00
m.stangl 901844fcb8 Alle Teile aus den Assemblies der Auf und Abwärtsbögen ausgeblendet, damit die Boundingboxen korrekt bestimmt werden 2026-04-08 11:11:48 +02:00
m.stangl a74f7e5e3a Verbinder für 12 Grad Elemente dazu 2026-04-07 14:04:10 +02:00
m.stangl af957c6ccd neue EInzelteile zur Verbindung und Abstandhalter hinzu 2026-04-07 14:00:43 +02:00
y.wang 6898a37570 die SVG Datei für Gefällebogen rechts korrigiert. 2026-04-02 15:27:22 +02:00
y.wang b72c792850 Merge branch 'main' of https://gitea.schoenenberger.de/mistangl/SSG-Ruledesigner-Konfigurator 2026-03-27 11:12:41 +01:00
y.wang b9a71ae07c Bug bei Funktion CalculateGefällestrecke behoben 2026-03-27 11:12:36 +01:00
55 changed files with 4759 additions and 4198 deletions
+14 -6
View File
@@ -1,10 +1,18 @@
@echo off @echo off
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt setlocal
SET "MANAGE=%~dp0manage_interpreter.bat"
call setenv.bat CALL "%MANAGE%" activate
if errorlevel 1 (
echo ERROR: Failed to activate Python environment
exit /b 1
)
REM Beispielaufruf mit Parametern: pushd "%PROJECT%"
REM --in: Ordner mit .par-Dateien (optional. Standard: Input)
REM --out: Zielverzeichnis (optional. Standard: Work)
python %PROJECT_LIB%\create_assemblies.py %* "%VIRTUAL_ENV%\Scripts\python.exe" -m lib.create_assemblies %*
set PYTHON_EXIT=%ERRORLEVEL%
popd
CALL "%MANAGE%" deactivate
exit /b %PYTHON_EXIT%
+15 -3
View File
@@ -1,6 +1,18 @@
@echo off @echo off
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt setlocal
SET "MANAGE=%~dp0manage_interpreter.bat"
call setenv.bat CALL "%MANAGE%" activate
if errorlevel 1 (
echo ERROR: Failed to activate Python environment
exit /b 1
)
python "%PROJECT_LIB%\diff_dimensions.py" %* pushd "%PROJECT%"
"%VIRTUAL_ENV%\Scripts\python.exe" -m lib.diff_dimensions %*
set PYTHON_EXIT=%ERRORLEVEL%
popd
CALL "%MANAGE%" deactivate
exit /b %PYTHON_EXIT%
+1 -1
View File
@@ -23,4 +23,4 @@ set /p TOLERANCE=Gib die Toleranz ein (Standard: %DEFAULT_TOLERANCE%):
if "%TOLERANCE%"=="" set "TOLERANCE=%DEFAULT_TOLERANCE%" if "%TOLERANCE%"=="" set "TOLERANCE=%DEFAULT_TOLERANCE%"
REM Aufruf des Skripts mit den eingegebenen oder Standardwerten REM Aufruf des Skripts mit den eingegebenen oder Standardwerten
call diff_dimensions.bat --type %TYPE% --json_2d %JSON2D% --json_dimensions %JSONDIM% --tolerance %TOLERANCE% call "%~dp0diff_dimensions.bat" --type %TYPE% --json_2d %JSON2D% --json_dimensions %JSONDIM% --tolerance %TOLERANCE%
+1 -1
View File
@@ -1,4 +1,4 @@
@echo off @echo off
call setenv.bat call "%~dp0setenv.bat"
start start
+14 -6
View File
@@ -1,10 +1,18 @@
@echo off @echo off
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt setlocal
SET "MANAGE=%~dp0manage_interpreter.bat"
call setenv.bat CALL "%MANAGE%" activate
if errorlevel 1 (
echo ERROR: Failed to activate Python environment
exit /b 1
)
REM Beispielaufruf mit Parametern: pushd "%PROJECT%"
REM --in: Ordner mit .asm-Dateien (optional. Standard: Work)
REM --out: Zielverzeichnis (optional. Standard: Work\stl_export)
python %PROJECT_LIB%\read_variables.py %* "%VIRTUAL_ENV%\Scripts\python.exe" -m lib.read_variables %*
set PYTHON_EXIT=%ERRORLEVEL%
popd
CALL "%MANAGE%" deactivate
exit /b %PYTHON_EXIT%
+15
View File
@@ -0,0 +1,15 @@
call setenv.bat
if not exist %PROJECT%\.venv (
ECHO Initialisiere Python virtual environment...
py -m venv %PROJECT%\.venv --upgrade-deps
ECHO Erfolgreich.
call %PROJECT%\.venv\Scripts\activate.bat
ECHO Installiere erforderliche Python Packages...
pip install -r %PROJECT_LIB%/requirements.txt -q
ECHO Erfolgreich
deactivate
) ELSE (
ECHO Erforderliche Python Packages bereits installiert!
)
+35
View File
@@ -0,0 +1,35 @@
@echo off
CALL "%~dp0setenv.bat"
IF /I "%1"=="activate" GOTO activate
IF /I "%1"=="deactivate" GOTO deactivate
IF /I "%1"=="activate_interpreter" GOTO activate
IF /I "%1"=="deactivate_interpreter" GOTO deactivate
GOTO :eof
:activate
REM Interpreter wählen
IF DEFINED NETWORK_PYTHON (
SET PYTHON_EXE=%NETWORK_PYTHON%\python.exe
) ELSE (
SET PYTHON_EXE=python
)
REM venv sicherstellen
IF NOT EXIST "%PROJECT%\.venv" (
"%PYTHON_EXE%" -m venv "%PROJECT%\.venv"
)
REM venv aktivieren
CALL "%PROJECT%\.venv\Scripts\activate.bat"
REM Interpreter festnageln
SET VIRTUAL_ENV_PYTHON=%PYTHON_EXE%
GOTO :eof
:deactivate
CALL "%PROJECT%\.venv\Scripts\deactivate.bat"
SET VIRTUAL_ENV_PYTHON=
GOTO :eof
+14 -6
View File
@@ -1,10 +1,18 @@
@echo off @echo off
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt setlocal
SET "MANAGE=%~dp0manage_interpreter.bat"
call setenv.bat CALL "%MANAGE%" activate
if errorlevel 1 (
echo ERROR: Failed to activate Python environment
exit /b 1
)
REM Beispielaufruf mit Parametern: pushd "%PROJECT%"
REM --in: Ordner mit .asm-Dateien (optional. Standard: Work)
REM --out: Zielverzeichnis (optional. Standard: Work\stl_export)
python %PROJECT_LIB%\save_stl.py %* "%VIRTUAL_ENV%\Scripts\python.exe" -m lib.save_stl %*
set PYTHON_EXIT=%ERRORLEVEL%
popd
CALL "%MANAGE%" deactivate
exit /b %PYTHON_EXIT%
+6 -9
View File
@@ -2,16 +2,13 @@
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt
pushd %~dp0\.. pushd %~dp0\..
REM for /f "delims=" %%i in ('git rev-parse --show-toplevel') do set SSG_RD_DIR=%%i set PROJECT=%cd%
set PROJECT_BIN=%PROJECT%\bin
set PROJECT_DIR=%cd% set PROJECT_LIB=%PROJECT%\lib
set PROJECT_WORK=%PROJECT%\work
set PROJECT_BIN=%PROJECT_DIR%\bin set PROJECT_DATA=%PROJECT%\data
set PROJECT_LIB=%PROJECT_DIR%\lib set PROJECT_INPUT=%PROJECT%\input
set PROJECT_WORK=%PROJECT_DIR%\work
set PROJECT_DATA=%PROJECT_DIR%\data
set PROJECT_INPUT=%PROJECT_DIR%\input
set PROJECT_TEMPLATE=\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies set PROJECT_TEMPLATE=\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies
if not exist %PROJECT_WORK% mkdir %PROJECT_WORK% if not exist %PROJECT_WORK% mkdir %PROJECT_WORK%
+147 -24
View File
@@ -1,24 +1,43 @@
# Dokumentation: create_assemblies, save_stl & read_variables # Dokumentation: CAD-Automatisierungsskripte
## Übersicht
| Skript | Batch-Datei | Zweck |
| ------ | ----------- | ----- |
| `lib/create_assemblies.py` | `bin/create_assemblies.bat` | Erzeugt .asm-Baugruppen aus .par-Dateien |
| `lib/save_stl.py` | `bin/save_stl.bat` | Exportiert .asm-Baugruppen als STL-Dateien |
| `lib/read_variables.py` | `bin/get_dimensions.bat` | Liest Maße aus .par-Dateien und speichert als JSON |
| `lib/diff_dimensions.py` | `bin/diff_dimensions.bat` | Vergleicht 3D-Maße (JSON) mit 2D-Zeichnungsmaßen |
| *(kein Python)* | `bin/get_all_differences.bat` | Interaktiver Wrapper für diff_dimensions |
| *(kein Python)* | `bin/get_cmd.bat` | Öffnet Kommandozeile mit gesetzten Umgebungsvariablen |
| *(kein Python)* | `bin/setenv.bat` | Setzt alle Umgebungsvariablen für das Projekt |
---
## 1. create_assemblies ## 1. create_assemblies
### Zweck ### Zweck
Das Skript erstellt für jede .par-Datei im Eingabeordner eine neue .asm-Baugruppe, indem es eine Platzhalter-Baugruppe (dummy.asm) kopiert und darin die Platzhalter-Komponente (dummy.par) durch die jeweilige .par-Datei ersetzt. Das Skript erstellt für jede .par-Datei im Eingabeordner eine neue .asm-Baugruppe, indem es eine Platzhalter-Baugruppe (dummy.asm) kopiert und darin die Platzhalter-Komponente (dummy.par) durch die jeweilige .par-Datei ersetzt.
### Aufrufmöglichkeiten ### Aufrufmöglichkeiten
#### Über die Batch-Datei (empfohlen unter Windows): **Über die Batch-Datei (empfohlen unter Windows):**
```bat ```bat
bin\create_assemblies.bat --in <Eingabeordner> --out <Ausgabeordner> bin\create_assemblies.bat --in <Eingabeordner> --out <Ausgabeordner>
``` ```
- Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
#### Direkt über die Kommandozeile: Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
**Direkt über die Kommandozeile:**
```sh ```sh
python lib/create_assemblies.py --in <Eingabeordner> --out <Ausgabeordner> python lib/create_assemblies.py --in <Eingabeordner> --out <Ausgabeordner>
``` ```
#### Parameter: **Parameter:**
- `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input) - `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input)
- `--out`: Zielordner für die erzeugten .asm-Dateien (optional, Standard: ./work) - `--out`: Zielordner für die erzeugten .asm-Dateien (optional, Standard: ./work)
@@ -26,14 +45,16 @@ python lib/create_assemblies.py --in <Eingabeordner> --out <Ausgabeordner>
- **Input:** - **Input:**
- .par-Dateien im angegebenen Eingabeordner - .par-Dateien im angegebenen Eingabeordner
- dummy.asm und dummy.par im data/-Verzeichnis (werden als Vorlage und Platzhalter verwendet) - dummy.asm und dummy.par im Netzwerkpfad PROJECT_TEMPLATE (werden als Vorlage und Platzhalter verwendet)
- **Output:** - **Output:**
- Für jede .par-Datei wird eine .asm-Datei im Ausgabeverzeichnis erzeugt. - Für jede .par-Datei wird eine .asm-Datei im Ausgabeverzeichnis erzeugt.
- Temporäre Dateien (_temp.asm, .cfg) werden nach Verarbeitung gelöscht. - Temporäre Dateien (_temp.asm, .cfg) werden nach Verarbeitung gelöscht.
### Hinweise ### Hinweise
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift. - Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
- Die Platzhalter-Komponente in dummy.asm muss exakt dummy.par heißen. - Die Platzhalter-Komponente in dummy.asm muss exakt dummy.par heißen.
- Die Vorlage (dummy.asm) wird aus dem Netzwerkpfad `PROJECT_TEMPLATE` geladen (Standard: `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies`).
- Fehlerhafte oder fehlende Platzhalter werden übersprungen und führen nicht zum Abbruch des gesamten Prozesses. - Fehlerhafte oder fehlende Platzhalter werden übersprungen und führen nicht zum Abbruch des gesamten Prozesses.
--- ---
@@ -41,22 +62,27 @@ python lib/create_assemblies.py --in <Eingabeordner> --out <Ausgabeordner>
## 2. save_stl ## 2. save_stl
### Zweck ### Zweck
Das Skript exportiert alle .asm-Baugruppen in einem Ordner als STL-Dateien. Es dient dazu, die zuvor erzeugten Baugruppen für die Weiterverarbeitung (z.B. 3D-Druck) bereitzustellen.
Das Skript exportiert alle .asm-Baugruppen in einem Ordner als STL-Dateien. Es dient dazu, die zuvor erzeugten Baugruppen für die Weiterverarbeitung (z.B. 3D-Druck oder Visualisierung) bereitzustellen.
### Aufrufmöglichkeiten ### Aufrufmöglichkeiten
#### Über die Batch-Datei (empfohlen unter Windows): **Über die Batch-Datei (empfohlen unter Windows):**
```bat ```bat
bin\save_stl.bat --in <Eingabeordner> --out <Ausgabeordner> bin\save_stl.bat --in <Eingabeordner> --out <Ausgabeordner>
``` ```
- Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
#### Direkt über die Kommandozeile: Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
**Direkt über die Kommandozeile:**
```sh ```sh
python lib/save_stl.py --in <Eingabeordner> --out <Ausgabeordner> python lib/save_stl.py --in <Eingabeordner> --out <Ausgabeordner>
``` ```
#### Parameter: **Parameter:**
- `--in`: Pfad zum Ordner mit .asm-Dateien (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work) - `--in`: Pfad zum Ordner mit .asm-Dateien (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work)
- `--out`: Zielordner für die STL-Dateien (optional, Standard: ./work/STL_Export) - `--out`: Zielordner für die STL-Dateien (optional, Standard: ./work/STL_Export)
@@ -69,6 +95,7 @@ python lib/save_stl.py --in <Eingabeordner> --out <Ausgabeordner>
- Temporäre .cfg- und .log-Dateien werden nach dem Export gelöscht. - Temporäre .cfg- und .log-Dateien werden nach dem Export gelöscht.
### Hinweise ### Hinweise
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift. - Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
- Das Skript ist robust gegenüber Fehlern beim Export einzelner Dateien (Fehler werden gemeldet, der Prozess läuft weiter). - Das Skript ist robust gegenüber Fehlern beim Export einzelner Dateien (Fehler werden gemeldet, der Prozess läuft weiter).
- Nach dem Export werden überflüssige .cfg- und .log-Dateien im Eingabe- und Ausgabeverzeichnis entfernt. - Nach dem Export werden überflüssige .cfg- und .log-Dateien im Eingabe- und Ausgabeverzeichnis entfernt.
@@ -78,16 +105,25 @@ python lib/save_stl.py --in <Eingabeordner> --out <Ausgabeordner>
## 3. read_variables ## 3. read_variables
### Zweck ### Zweck
Das Skript liest aus allen .par-Dateien in einem Verzeichnis die benutzerdefinierten Variablen 'Mittiges_Koordinatensystem_X_Translation' und 'Mittiges_Koordinatensystem_Y_Translation' aus und speichert die Werte als Breite und Höhe in einer JSON-Datei.
Das Skript liest aus allen .par-Dateien in einem Verzeichnis die benutzerdefinierten Variablen `Mittiges_Koordinatensystem_X_Translation` und `Mittiges_Koordinatensystem_Y_Translation` aus und speichert die Werte als Breite und Höhe in einer JSON-Datei.
### Aufrufmöglichkeiten ### Aufrufmöglichkeiten
#### Über die Kommandozeile oder Batch-Datei: **Über die Batch-Datei (empfohlen unter Windows):**
```bat
bin\get_dimensions.bat --in <Eingabeordner> --out <Ausgabeordner>
```
**Direkt über die Kommandozeile:**
```sh ```sh
python lib/read_variables.py --in <Eingabeordner> --out <Ausgabeordner> python lib/read_variables.py --in <Eingabeordner> --out <Ausgabeordner>
``` ```
#### Parameter: **Parameter:**
- `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input) - `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input)
- `--out`: Zielordner für die JSON-Ausgabe (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work) - `--out`: Zielordner für die JSON-Ausgabe (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work)
@@ -97,17 +133,18 @@ python lib/read_variables.py --in <Eingabeordner> --out <Ausgabeordner>
- .par-Dateien im angegebenen Eingabeordner - .par-Dateien im angegebenen Eingabeordner
- **Output:** - **Output:**
- Eine JSON-Datei im Ausgabeverzeichnis, benannt nach dem Eingabeordner (z.B. input.json), mit folgendem Aufbau: - Eine JSON-Datei im Ausgabeverzeichnis, benannt nach dem Eingabeordner (z.B. input.json), mit folgendem Aufbau:
```json ```json
{ {
"Dateiname_ohne_Endung": { "Dateiname_ohne_Endung": {
"breite": <Wert>, "breite": <Wert>,
"hoehe": <Wert> "hoehe": <Wert>
}, }
...
} }
``` ```
### Hinweise ### Hinweise
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift. - Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
- Die Variablen werden mit 2000 multipliziert und auf drei Nachkommastellen gerundet. - Die Variablen werden mit 2000 multipliziert und auf drei Nachkommastellen gerundet.
- Falls eine .par-Datei die benötigten Variablen nicht enthält, wird sie übersprungen. - Falls eine .par-Datei die benötigten Variablen nicht enthält, wird sie übersprungen.
@@ -115,14 +152,100 @@ python lib/read_variables.py --in <Eingabeordner> --out <Ausgabeordner>
--- ---
- **Umgebungsvariablen:** ## 4. diff_dimensions
Die Batch-Dateien rufen vorab setenv.bat auf, um Umgebungsvariablen wie PROJECT_LIB, PROJECT_WORK, PROJECT_INPUT, PROJECT_DATA zu setzen. Diese sollten korrekt konfiguriert sein.
- **Voraussetzungen:** ### Zweck
- Python (mit win32com)
- Solid Edge (für COM-Zugriff) Das Skript vergleicht 3D-Bauteilmaße (aus einer JSON-Datei erzeugt von `read_variables`) mit 2D-Zeichnungsmaßen (aus einer JSON-Datei des SVG-Editors). Einträge, bei denen Breite oder Höhe außerhalb der Toleranz abweichen, werden in einer Ausgabe-JSON gespeichert. So lassen sich Inkonsistenzen zwischen 3D-Modell und 2D-Zeichnung schnell identifizieren.
- **Fehlerbehandlung:**
Fehlerhafte oder fehlende Dateien werden übersprungen, der Prozess läuft weiter. ### Aufrufmöglichkeiten
**Über die Batch-Datei:**
```bat
bin\diff_dimensions.bat --type <Typ> --json_dimensions <3D-JSON> --json_2d <2D-JSON> [--tolerance <Wert>] [--result <Ausgabedatei>]
```
**Interaktiv (mit Abfragen):**
```bat
bin\get_all_differences.bat
```
Fragt Typ, Dateinamen und Toleranz interaktiv ab und ruft dann `diff_dimensions.bat` auf.
**Direkt über die Kommandozeile:**
```sh
python lib/diff_dimensions.py --type <Typ> --json_dimensions <3D-JSON> --json_2d <2D-JSON>
```
**Parameter:**
- `--type`: Art des Bauteils: `BOGEN`, `WEICHE`, `TEFBOGEN` oder `TEFWEICHE` (bestimmt das Eingabeverzeichnis für die 2D-JSON)
- `--json_dimensions`: Dateiname der 3D-Maße-JSON (aus `read_variables`, liegt in PROJECT_WORK)
- `--json_2d`: Dateiname der 2D-Maße-JSON (liegt im typabhängigen Verzeichnis)
- `--tolerance`: Toleranz in Millimetern (optional, Standard: `0.05`)
- `--result`: Dateiname der Ausgabedatei (optional, Standard: `Differenzen_2D_3D.json`)
- `--output_dir`: Ausgabeverzeichnis (optional, Standard: Umgebungsvariable PROJECT_WORK)
### Input/Output
- **Input:**
- `--json_dimensions`: JSON-Datei mit 3D-Maßen (Schlüssel: SIVAS-Nummer, Felder: `breite`, `hoehe`)
- `--json_2d`: JSON-Datei mit 2D-Maßen (Liste mit Feldern `Sivasnr`, `Objekte_width_mm`, `Objekte_height_mm`)
- **Output:**
- JSON-Datei mit allen Einträgen, deren Maße außerhalb der Toleranz liegen, inkl. Differenzwerten (`w_diff`, `h_diff`). Bei übereinstimmenden Maßen wird keine Ausgabedatei erzeugt.
### Beispielaufruf
```bat
bin\diff_dimensions.bat --type BOGEN --json_dimensions Bogen_3D.json --json_2d Bogen_2D.json --tolerance 0.1 --result diff_bogen.json
```
### Hinweise
- Erfordert kein Solid Edge — reine JSON-Verarbeitung.
- Die Umgebungsvariablen `PROJECT_JSON_BOGEN`, `PROJECT_JSON_WEICHE`, `PROJECT_JSON_TEFBOGEN`, `PROJECT_JSON_TEFWEICHE` müssen für den `--type`-Parameter korrekt gesetzt sein (via setenv.bat).
--- ---
Wenn du eine Beispielkonfiguration oder weitere Details (z.B. zu setenv.bat oder den Umgebungsvariablen) benötigst, sag gerne Bescheid! ## 5. Batch-Hilfsskripte
### setenv.bat
Setzt alle Projektumgebungsvariablen. Wird von allen anderen Batch-Dateien automatisch aufgerufen.
| Variable | Standardwert | Bedeutung |
| -------- | ------------ | --------- |
| `PROJECT_DIR` | Verzeichnis des Code-Ordners | Wurzelverzeichnis des Projekts |
| `PROJECT_BIN` | `%PROJECT_DIR%\bin` | Verzeichnis der Batch-Dateien |
| `PROJECT_LIB` | `%PROJECT_DIR%\lib` | Verzeichnis der Python-Skripte |
| `PROJECT_WORK` | `%PROJECT_DIR%\work` | Arbeitsverzeichnis (Zwischenergebnisse) |
| `PROJECT_DATA` | `%PROJECT_DIR%\data` | Datenverzeichnis |
| `PROJECT_INPUT` | `%PROJECT_DIR%\input` | Eingabeverzeichnis (.par-Dateien) |
| `PROJECT_TEMPLATE` | `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies` | Netzwerkpfad zur dummy.asm-Vorlage |
| `PROJECT_JSON_BOGEN` | `%SSG_RD_DIR%\SVGs\Omniflo\python\OFBogen\json` | 2D-JSON-Verzeichnis für Bögen |
| `PROJECT_JSON_WEICHE` | `%SSG_RD_DIR%\SVGs\Omniflo\python\OFWeiche\json` | 2D-JSON-Verzeichnis für Weichen |
| `PROJECT_JSON_TEFBOGEN` | `%SSG_RD_DIR%\SVGs\Omniflo\python\TEFBogen\json` | 2D-JSON-Verzeichnis für TEF-Bögen |
| `PROJECT_JSON_TEFWEICHE` | `%SSG_RD_DIR%\SVGs\Omniflo\python\TEFWeiche\json` | 2D-JSON-Verzeichnis für TEF-Weichen |
### get_cmd.bat
Ruft `setenv.bat` auf und öffnet anschließend eine Kommandozeile mit gesetzten Umgebungsvariablen. Nützlich, um Skripte manuell mit korrekter Umgebung zu testen.
### get_all_differences.bat
Interaktiver Wrapper für `diff_dimensions.bat`. Fragt Typ, JSON-Dateinamen und Toleranz per Eingabeaufforderung ab (mit vordefinierten Standardwerten) und startet dann den Vergleich.
---
## Voraussetzungen
- **Python** mit den Paketen `win32com` (pywin32) und `pythoncom`
- **Solid Edge** (für COM-Zugriff bei `create_assemblies`, `save_stl`, `read_variables`)
- **Netzwerkzugriff** auf `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies` (für `create_assemblies`)
## Fehlerbehandlung
Fehlerhafte oder fehlende Dateien werden bei allen Skripten übersprungen — der Prozess läuft jeweils weiter und gibt eine Fehlermeldung aus.
View File
+1
View File
@@ -0,0 +1 @@
pywin32
+11 -3
View File
@@ -4,13 +4,14 @@ import argparse
import win32com.client import win32com.client
import pythoncom import pythoncom
def export_assemblies_to_stl(input_dir, output_dir): def export_assemblies_to_stl(input_dir, output_dir, filter_name=None, minimized=False):
pythoncom.CoInitialize() pythoncom.CoInitialize()
try: try:
# Solid Edge starten oder verbinden # Solid Edge starten oder verbinden
se_app = win32com.client.Dispatch("SolidEdge.Application") se_app = win32com.client.Dispatch("SolidEdge.Application")
se_app.Visible = True se_app.Visible = True
se_app.WindowState = 2 if minimized else 1
documents = se_app.Documents documents = se_app.Documents
@@ -18,6 +19,8 @@ def export_assemblies_to_stl(input_dir, output_dir):
for filename in os.listdir(input_dir): for filename in os.listdir(input_dir):
if filename.lower().endswith(".asm"): if filename.lower().endswith(".asm"):
if filter_name and filter_name.lower() not in filename.lower():
continue
asm_path = os.path.join(input_dir, filename) asm_path = os.path.join(input_dir, filename)
stl_filename = os.path.splitext(filename)[0] + ".stl" stl_filename = os.path.splitext(filename)[0] + ".stl"
stl_path = os.path.join(output_dir, stl_filename) stl_path = os.path.join(output_dir, stl_filename)
@@ -29,7 +32,7 @@ def export_assemblies_to_stl(input_dir, output_dir):
doc = documents.Open(asm_path) doc = documents.Open(asm_path)
# STL exportieren in den Unterordner # STL exportieren in den Unterordner
doc.SaveAs(stl_path) doc.SaveAs(stl_path)
print(f" Exported to: {stl_path}") print(f"-> Exported to: {stl_path}")
except Exception as e: except Exception as e:
print(f"Error processing {filename}: {e}") print(f"Error processing {filename}: {e}")
finally: finally:
@@ -69,6 +72,8 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Exportiert alle .asm-Dateien in einem Ordner nach STL.") parser = argparse.ArgumentParser(description="Exportiert alle .asm-Dateien in einem Ordner nach STL.")
parser.add_argument("--in", dest="input_dir", required=False, help="Ordner mit .asm-Dateien (Standard: WORK oder ../work)") parser.add_argument("--in", dest="input_dir", required=False, help="Ordner mit .asm-Dateien (Standard: WORK oder ../work)")
parser.add_argument("--out", dest="output_dir", required=False, help="Zielordner für STL-Dateien (Standard: work/STL_Export)") parser.add_argument("--out", dest="output_dir", required=False, help="Zielordner für STL-Dateien (Standard: work/STL_Export)")
parser.add_argument("--filter", dest="filter_name", required=False, help="Nur Dateien verarbeiten, deren Name diesen String enthält")
parser.add_argument("--se-minimized", dest="minimized", action="store_true", default=False, help="Solid Edge minimiert starten")
if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"): if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"):
parser.print_help() parser.print_help()
@@ -97,4 +102,7 @@ if __name__ == "__main__":
print(f"Input folder not found: {input_dir}") print(f"Input folder not found: {input_dir}")
sys.exit(1) sys.exit(1)
export_assemblies_to_stl(input_dir, output_dir) if args.filter_name:
print(f"Filtering files containing: '{args.filter_name}'\n")
export_assemblies_to_stl(input_dir, output_dir, args.filter_name, args.minimized)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Projektübersicht
**SSG-Ruledesigner-Konfigurator** ist die Library der Schönenberger GmbH für den
RuleDesigner Fusion (RD Fusion) — ein PDM-System zur Verwaltung von CAD-Daten. Der
**RuleDesigner Configurator** ist eine *low-code*-Programmierumgebung, über die das PDM
an externe Systeme (Datenbanken, CAD wie Solid Edge, Export nach CSV/JSON) angebunden
wird. Dieses Repo bündelt Konfigurationen, Layouts, Bibliotheken und Schulungs-Doku für
den abteilungsübergreifenden Einsatz bei Schönenberger.
## Projektstruktur
```text
SSG-Ruledesigner-Konfigurator/
├── MAIN_SSG.rdx # Haupt-Konfiguration (RuleDesigner)
├── Sub_DWG2SWG.rdx # Teil-Konfiguration DWG→SWG
├── Editor2DLibrary/ # 2D-Editor-Bibliothek
├── CAD/ # CAD-Daten
├── CSV/ # CSV-Daten/Exporte
├── SVGs/ # SVG-Grafiken
├── Pictures/ # Bilder
├── HallenLayouts/ # Hallen-Layouts
├── Sessions/ # Session-Daten
├── Doku/ # Dokumentation
├── wiki/ # Wiki (Roadmap, Home, Schulungs-Doku)
├── _setenv.bat # Umgebung setzen
└── cleanLocalShapes.bat # Lokale Shapes bereinigen
```
## Hinweise
- Die `.rdx`-Dateien sind RuleDesigner-Configurator-Projekte (low code).
- Ausführliche Doku und Roadmap liegen im `wiki/` (siehe `Readme.md` für Links).
- Ziel: Programmierarbeiten künftig durch hauseigene Mitarbeiter (nach Schulung).
+91
View File
@@ -258,6 +258,51 @@ def md_tabelle(fall_name, h0_val, h1_val):
return "\n".join(lines) return "\n".join(lines)
def grenzen():
"""Erzeugt Übersichtstabellen: für welche (ΔH, L1) Kombinationen
existieren gültige Lösungen? Zeigt den kleinsten gültigen α_F.
ΔH von 0..5 m, L1 von 3..15 m."""
delta_h_list = [0, 1, 2, 3, 4, 5]
l1_list = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
lines = []
for richtung in ("aufwärts", "abwärts"):
lines.append(f"### {richtung.capitalize()}\n")
lines.append("Zelle = kleinster gültiger α_F [°], "
"**—** = keine Lösung\n")
# Header
header = "| ΔH \\ L₁ |" + "|".join(f" {l1} m " for l1 in l1_list) + "|"
sep = "|--------:|" + "|".join("------:" for _ in l1_list) + "|"
lines.append(header)
lines.append(sep)
for dh in delta_h_list:
if richtung == "aufwärts":
h0, h1 = 0, dh
else:
h0, h1 = dh, 0
row = f"| {dh} m |"
for l1 in l1_list:
min_alpha = None
for alpha_f_deg in ALPHA_F_LIST:
erg = berechne(h0, h1, l1, L_ES, H_ES, L_AS, H_AS,
alpha_f_deg, ALPHA_S)
if erg is not None:
gueltig, _ = validierung(erg)
if gueltig:
min_alpha = alpha_f_deg
break
if min_alpha is not None:
row += f" {min_alpha}° |"
else:
row += " — |"
lines.append(row)
lines.append("")
return "\n".join(lines)
def main(): def main():
md = [] md = []
md.append("# Förderer-Berechnung (2D-Modell)\n") md.append("# Förderer-Berechnung (2D-Modell)\n")
@@ -283,6 +328,9 @@ def main():
# Fall 2: Abwärts H0=5 → H1=2 (vertauscht!) # Fall 2: Abwärts H0=5 → H1=2 (vertauscht!)
md.append(md_tabelle("Fall 2: Abwärts", h0_val=H1, h1_val=H0)) md.append(md_tabelle("Fall 2: Abwärts", h0_val=H1, h1_val=H0))
md.append("## Grenzen der Varianten\n")
md.append(grenzen())
result = "\n".join(md) result = "\n".join(md)
print(result) print(result)
@@ -349,3 +397,46 @@ Probe: H_ES + H_F + H_S + H_AS = ΔH
| 39 | 2.7537 | 3.2463 | 2.2299 | 0.1701 | 3.0000 | ✓ gültig | | 39 | 2.7537 | 3.2463 | 2.2299 | 0.1701 | 3.0000 | ✓ gültig |
| 45 | 2.2009 | 3.7991 | 2.2009 | 0.1991 | 3.0000 | ✓ gültig | | 45 | 2.2009 | 3.7991 | 2.2009 | 0.1991 | 3.0000 | ✓ gültig |
| 51 | 1.7637 | 4.2363 | 2.1780 | 0.2220 | 3.0000 | ✓ gültig | | 51 | 1.7637 | 4.2363 | 2.1780 | 0.2220 | 3.0000 | ✓ gültig |
## Grenzen der Varianten
| Parameter | Wert |
|-----------|-----:|
| ΔH | 0 … 5 m |
| L₁ | 3 … 15 m |
| α_S | 3° |
| L_ES, L_AS | 1.000 m |
| H_ES, H_AS | 0.300 m |
Zelle = kleinster gültiger α_F [°], **—** = keine Lösung
### Aufwärts
| ΔH \ L₁ | 3 m | 4 m | 5 m | 6 m | 7 m | 8 m | 9 m | 10 m | 11 m | 12 m | 13 m | 14 m | 15 m |
|--------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|
| 0 m | 33° | 18° | 12° | 9° | 9° | 6° | 6° | 6° | 6° | 6° | 6° | 3° | 3° |
| 1 m | — | 39° | 33° | 24° | 18° | 15° | 15° | 12° | 12° | 12° | 9° | 9° | 9° |
| 2 m | — | — | 45° | 39° | 33° | 24° | 24° | 24° | 18° | 15° | 15° | 15° | 12° |
| 3 m | — | — | 51° | 45° | 39° | 33° | 33° | 27° | 24° | 24° | 24° | 18° | 18° |
| 4 m | — | — | — | 51° | 45° | 39° | 39° | 33° | 33° | 27° | 24° | 24° | 24° |
| 5 m | — | — | — | — | 51° | 45° | 39° | 39° | 33° | 33° | 27° | 27° | 24° |
### Abwärts
| ΔH \ L₁ | 3 m | 4 m | 5 m | 6 m | 7 m | 8 m | 9 m | 10 m | 11 m | 12 m | 13 m | 14 m | 15 m |
|--------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|------:|
| 0 m | 33° | 18° | 12° | 9° | 9° | 6° | 6° | 6° | 6° | 6° | 6° | 3° | 3° |
| 1 m | 24° | 12° | 9° | 6° | 6° | 6° | 6° | — | — | — | — | — | — |
| 2 m | — | 39° | 27° | 24° | 18° | 15° | 12° | 12° | 9° | 9° | 9° | 9° | 9° |
| 3 m | — | 51° | 39° | 33° | 27° | 24° | 24° | 18° | 15° | 15° | 15° | 12° | 12° |
| 4 m | — | — | 51° | 45° | 39° | 33° | 27° | 24° | 24° | 24° | 18° | 18° | 15° |
| 5 m | — | — | — | 51° | 45° | 39° | 33° | 33° | 27° | 24° | 24° | 24° | 24° |
**Lücke bei ΔH = 1 m, L₁ ≥ 10 m:** Im Abwärts-Fall ist der Zähler der L_F-Formel
$(ΔH - H_{ES} - H_{AS}) - L_{rest} \cdot \tan(α_S)$. Bei ΔH = 1 m und L₁ = 10 m wird
$L_{rest}$ = 8 m und der Zähler = (1 0,3 0,3) 8 · tan 3° = 0,4 0,419 = 0,019.
Da der Nenner für alle α_F > 3° positiv ist, wird L_F negativ — es gibt keine gültige Lösung.
Weil bei so kleinem Höhenunterschied die Reststrecke mit 3°-Neigung allein schon mehr Höhe verbraucht als verfügbar ist.
Die Reststrecke allein erzeugt durch die 3°-Neigung der S-Strecke plus H_ES + H_AS bereits mehr Höhe als der verfügbare Höhenunterschied ΔH = 1 m hergibt.
@@ -25,7 +25,7 @@
"zMin": "", "zMin": "",
"zMax": "", "zMax": "",
"zStep": "", "zStep": "",
"direction": 300.0, "direction": 330.0,
"linkClass": "Gefaellestrecke", "linkClass": "Gefaellestrecke",
"label": "H0", "label": "H0",
"isDimension": true "isDimension": true
@@ -25,7 +25,7 @@
"zMin": "", "zMin": "",
"zMax": "", "zMax": "",
"zStep": "", "zStep": "",
"direction": 60.0, "direction": 30.0,
"linkClass": "Gefaellestrecke", "linkClass": "Gefaellestrecke",
"label": "H0", "label": "H0",
"isDimension": true "isDimension": true
@@ -25,7 +25,7 @@
"zMin": "", "zMin": "",
"zMax": "", "zMax": "",
"zStep": "", "zStep": "",
"direction": 330.0, "direction": 300.0,
"linkClass": "Gefaellestrecke", "linkClass": "Gefaellestrecke",
"label": "H0", "label": "H0",
"isDimension": true "isDimension": true
@@ -25,7 +25,7 @@
"zMin": "", "zMin": "",
"zMax": "", "zMax": "",
"zStep": "", "zStep": "",
"direction": 30, "direction": 60.0,
"linkClass": "Gefaellestrecke", "linkClass": "Gefaellestrecke",
"label": "H0", "label": "H0",
"isDimension": true "isDimension": true
@@ -44,7 +44,7 @@
"zMin": "", "zMin": "",
"zMax": "", "zMax": "",
"zStep": "", "zStep": "",
"direction": 180, "direction": 180.0,
"linkClass": "Gefaellestrecke", "linkClass": "Gefaellestrecke",
"label": "H1", "label": "H1",
"isDimension": true "isDimension": true
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)"> <g transform="rotate(0)">
<svg viewBox="0 0 1000 882.1" preserveAspectRatio="none" position="absolute" overflow="visible"> <svg viewBox="0 0 1e3 882.1" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(2.7391 0 0 2.7391 .68435 -974.56)" fill="none" stroke-width=".73001"> <g transform="matrix(-2.7391 0 0 2.7391 999.32 -974.56)" fill="none" stroke-width=".73001">
<g transform="matrix(3.7552,0,0,3.7552,-1663.6,-941.99)" stroke="#000" stroke-width=".1944" vector-effect="non-scaling-stroke"> <g transform="matrix(3.7552,0,0,3.7552,-1663.6,-941.99)" stroke="#000" stroke-width=".1944" vector-effect="non-scaling-stroke">
<path d="m443.03 388.47 74.111-42.788" stroke-width="1px" /> <path d="m443.03 388.47 74.111-42.788" stroke-width="1px" />
<path d="m454.49 431.26h85.576" stroke-width="1px" /> <path d="m454.49 431.26h85.576" stroke-width="1px" />
@@ -14,7 +14,7 @@
<path d="m443.03 388.47a85.575 85.575 0 0 1 11.465 42.787" stroke-width="1px" /> <path d="m443.03 388.47a85.575 85.575 0 0 1 11.465 42.787" stroke-width="1px" />
</g> </g>
</g> </g>
<g transform="matrix(2.5866 -1.4935 1.4935 2.5866 -1167.5 -1614.9)" fill="none" stroke="#000" stroke-linecap="square" stroke-miterlimit="0" stroke-width="1.6736"> <g transform="matrix(-2.5866 -1.4935 -1.4935 2.5866 2167.5 -1614.9)" fill="none" stroke="#000" stroke-linecap="square" stroke-miterlimit="0" stroke-width="1.6736">
<path d="m64.808 1e3 82.894-181.61" stroke-width="1px" /> <path d="m64.808 1e3 82.894-181.61" stroke-width="1px" />
<path d="m231.92 1e3 -82.894-181.61" stroke-width="1px" /> <path d="m231.92 1e3 -82.894-181.61" stroke-width="1px" />
</g> </g>
+4283 -4065
View File
File diff suppressed because it is too large Load Diff