Skip to content
Snippets Groups Projects
Commit 7a75dc5a authored by Ahmed Osman's avatar Ahmed Osman
Browse files

merge

parents 02c2272c d36567f6
No related branches found
No related tags found
No related merge requests found
stages:
- build
- triage
- run
build:
image: debian:stable
image: debian:oldstable
stage: build
script:
- apt-get update && apt-get -y install graphviz openjdk-11-jre-headless wget
......@@ -15,50 +13,3 @@ build:
artifacts:
paths:
- public
\ No newline at end of file
build-image:build:
stage: build
tags:
- docker
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:latest
only:
- master
- docker-dzwald
dry-run:triage:
image: ruby:2.5
stage: triage
script:
- gem install activesupport -v 6.1.4.4
- gem install gitlab-triage
- gitlab-triage --help
- gitlab-triage --dry-run --token $API_TOKEN --source projects --source-id $CI_PROJECT_PATH --host-url https://git-ce.rwth-aachen.de/
when: manual
except:
- schedules
policy:run:
image: ruby:2.5
stage: run
script:
- gem install activesupport -v 6.1.4.4
- gem install gitlab-triage
- gitlab-triage --token $API_TOKEN --source projects --source-id $CI_PROJECT_PATH --host-url https://git-ce.rwth-aachen.de
when: manual
except:
- schedules
schedule:policyrun:
image: ruby:2.5
stage: run
script:
- gem install activesupport -v 6.1.4.4
- gem install gitlab-triage
- gitlab-triage --token $API_TOKEN --source projects --source-id $CI_PROJECT_PATH --host-url https://git-ce.rwth-aachen.de
only:
- schedules
resource_rules:
issues:
rules:
- name: find all issues of milestone AP 0 and set label wp 0
conditions:
milestone: AP 0 - Projektmanagement und Dissemination
actions:
labels:
- WP 0
- name: find all issues of milestone AP 1 and set label wp 1
conditions:
milestone: AP 1 - Definition der Anwendungsszenarien
actions:
labels:
- WP 1
- name: find all issues of milestone AP 2 and set label wp 2
conditions:
milestone: AP 2 - Integration von BaSys 4 und WH4.0
actions:
labels:
- WP 2
- name: find all issues of milestone AP 3 and set label wp 3
conditions:
milestone: AP 3 - Entwicklung eines DZ Wald
actions:
labels:
- WP 3
- name: find all issues of milestone AP 4 and set label wp 4
conditions:
milestone: AP 4 - Integration eines Waldmanagementsystems
actions:
labels:
- WP 4
- name: find all issues of milestone AP 5 and set label wp 5
conditions:
milestone: AP 5 - Integration einer Holzhandelsplattform
actions:
labels:
- WP 5
- name: find all issues of milestone AP 6 and set label wp 6
conditions:
milestone: AP 6 - Entwicklung einer Demo-Applikation für die Abnehmerseite
actions:
labels:
- WP 6
- name: find all issues of milestone AP 7 and set label wp 7
conditions:
milestone: AP 7 - Integration Holzaufnahme-App
actions:
labels:
- WP 7
- name: find all issues of milestone AP 8 and set label wp 8
conditions:
milestone: AP 8 - Integration, Demonstration und Dokumentation der Ergebnisse
actions:
labels:
- WP 8
import os, sys, inspect
from typing import List, Set
import re
from typing import List
import basyx
from basyx.aas import model
......@@ -49,14 +50,15 @@ def create_sortiment():
sortimentstyp=enums.Sortimentstyp.Stammholz,
sorte=enums.Sorte.lang,
holzart=enums.Holzart.Fichte,
gueteklasse=enums.Gueteklasse.Qualitaet_A,
gueteklasseVon=enums.Gueteklasse.Qualitaet_A,
gueteklasseBis=enums.Gueteklasse.Qualitaet_B,
laenge_von=3.0,
laenge_bis=6.0,
mindestzopf=1.0,
max_durchmesser=10.0,
laengenzugabe=10.0,
mengenschaetzung=10.0,
kaeufer=models.Kontakt(kontaktrolle=enums.Kontaktrolle.Kaeufer),
kaeufer=create_example_contact(kontaktrolle=enums.Kontaktrolle.Kaeufer),
ergebnis=[model.ModelReference.from_referable(create_holzliste())]
)
return sortiment
......@@ -67,11 +69,11 @@ def create_arbeitsauftrag():
auftrag_id=model.Identifier("https://www.company.com/submodels/arbeitsauftrag"),
hiebsnummer="abc123",
kurzbeschreibung="beschreibung",
ansprechpartner=models.Kontakt(
ansprechpartner=create_example_contact(
kontaktrolle=enums.Kontaktrolle.Waldbesitzer),
unternehmer_holzrueckung=models.Kontakt(
unternehmer_holzrueckung=create_example_contact(
kontaktrolle=enums.Kontaktrolle.UnternehmerHolzrueckung),
unternehmer_holzernte=models.Kontakt(
unternehmer_holzernte=create_example_contact(
kontaktrolle=enums.Kontaktrolle.UnternehmerHolzernte),
zu_faellende_baeume=models.ModelReference.from_referable(
create_zu_faellende_baeume()),
......@@ -116,7 +118,7 @@ def create_lieferant_contact():
anrede="Herr",
vorname="Waldemar",
nachname="Schwarz",
adresse="Turmstr. 15, Aachen 52072",
adresse="Turmstr. 15, Aachen 52064",
telefonnummern=["0241-123456", "0176-123456"],
emailadressen=["schwarz@waldemar.de"],
umsatzbesteuerung=enums.Umsatzbesteuerung.regelbesteuert,
......@@ -131,12 +133,14 @@ def create_preismatrix():
models.Preismatrixeintrag(preis=50.5,
mittendurchmesser_von=45.0,
mittendurchmesser_bis=55.0,
gueteklasse=enums.Gueteklasse.Normale_Qualitaet
gueteklasse_von=enums.Gueteklasse.Normale_Qualitaet,
gueteklasse_bis=enums.Gueteklasse.Normale_Qualitaet
),
models.Preismatrixeintrag(preis=50.5,
mittendurchmesser_von=55.0,
mittendurchmesser_bis=65.0,
gueteklasse=enums.Gueteklasse.Qualitaet_A
gueteklasse_von=enums.Gueteklasse.Qualitaet_A,
gueteklasse_bis=enums.Gueteklasse.Qualitaet_A
),
]
return preismatrix
......@@ -170,8 +174,8 @@ def create_holzliste():
hieb=enums.Hieb.Durchforstung,
ernte=(datetime.date(2023, 12, 1), datetime.date(2023, 12, 31)),
lieferant=create_lieferant_contact(),
kaeufer=models.Kontakt(kontaktrolle=enums.Kontaktrolle.Kaeufer),
fuhrmann=models.Kontakt(kontaktrolle=enums.Kontaktrolle.Fuhrmann),
kaeufer=create_example_contact(kontaktrolle=enums.Kontaktrolle.Kaeufer),
fuhrmann=create_example_contact(kontaktrolle=enums.Kontaktrolle.Fuhrmann),
notiz="Dieses Holz ist sehr gut"
)
......@@ -272,7 +276,6 @@ def create_zu_faellende_baeume():
zufaellendebaeume = models.ZuFaellendeBaeume(
id="https://www.company.com/submodels/zu_faellende_baeume",
name="Baueme zu faellen",
beschreibung="Baueme sollen demnaechst gefaellt werden",
umring=umring,
position=create_standort(),
......@@ -330,7 +333,7 @@ def create_bestandesdaten():
bestandesdaten = models.Bestandesdaten(
id=model.Identifier("https://www.company.com/submodels/bestandesdaten"),
umring=create_umring(),
waldbesitzer=models.Kontakt(kontaktrolle=enums.Kontaktrolle.Waldbesitzer),
waldbesitzer=create_example_contact(kontaktrolle=enums.Kontaktrolle.Waldbesitzer),
baumarten=[enums.Holzart.Fichte]
)
......@@ -373,6 +376,44 @@ def create_aas():
zu_faellende_baeume,
events
]
def remove_iteration_ending(val: str):
# remove iteration ending like {00}
val = re.sub(r'\{\d+\}$', '', val)
# remove one or more digits at the end
val = re.sub(r'_?\d+$', '', val)
return val
def set_semantic_id(referable: model.SubmodelElement):
# example = "https://admin-shell.io/kwh40/forestml40/Waldweg/0/1/Beschreibung"
if isinstance(referable, model.Submodel):
base = "https://admin-shell.io/kwh40/forestml40"
postfix = f"{referable.id_short}/0/1"
else:
base = referable.parent.semantic_id.key[0].value
postfix = remove_iteration_ending(referable.id_short)
referable.semantic_id = model.GlobalReference(
(basyx.aas.model.Key(model.KeyTypes.GLOBAL_REFERENCE,
f"{base}/{postfix}"),)
)
def set_semantic_id_for_each_in(obj):
set_semantic_id(obj)
try:
iter(obj)
except TypeError as e:
print(e)
return
se_objects = list(obj)
for se in se_objects:
set_semantic_id_for_each_in(se)
for submodel in submodels:
set_semantic_id_for_each_in(submodel)
aas_dz_wald = models.DZWald(
dzwald_id="https://www.company.com/dz_wald/1",
asset=basyx.aas.model.AssetInformation(),
......@@ -396,7 +437,7 @@ def write_aas():
objstore = basyx.aas.model.DictObjectStore(submodels)
objstore.add(aas)
with open("dz_wald_example.json", "w") as file:
with open("dz_wald_example.json", "w", encoding='utf-8') as file:
json_serialization.write_aas_json_file(file, objstore)
......
This diff is collapsed.
import os, sys, inspect
from typing import List
import basyx
from basyx.aas import model
from basyx.aas.adapter.json import json_serialization
import datetime
from model import enums, generic_model
def create_arbeitsauftrag():
arbeitsauftrag = generic_model.Arbeitsauftrag(
id_="https://www.company.com/submodels/arbeitsauftrag",
hiebsnummer="abc123",
kurzbeschreibung="beschreibung",
ansprechpartner=generic_model.Arbeitsauftrag.Ansprechpartner(),
unternehmerHolzrueckung=generic_model.Arbeitsauftrag.UnternehmerHolzrueckung(),
unternehmerHolzernte=generic_model.Arbeitsauftrag.UnternehmerHolzernte(),
sortimente=[create_sortiment()],
zuFaellendeBaeume=model.ModelReference.from_referable(create_zu_faellende_baeume())
)
return arbeitsauftrag
def create_sortiment():
sortiment = generic_model.Arbeitsauftrag.Sortimente.Sortiment(
nummer=1,
sortimentstyp=enums.Sortimentstyp.Stammholz.value,
sorte=enums.Sorte.lang.value,
holzart=enums.Holzart.Fichte.value,
gueteklasseVon=enums.Gueteklasse.Qualitaet_A.value,
gueteklasseBis=enums.Gueteklasse.Qualitaet_B.value,
laengeVon=3.0,
laengeBis=6.0,
mindestzopf=1.0,
maxDurchmesser=10.0,
laengenzugabe=10.0,
mengenschaetzung=10.0,
bemerkung="Bemerkung",
ergebnis=generic_model.Arbeitsauftrag.Sortimente.Sortiment.Ergebnis([model.ModelReference.from_referable(create_holzliste())]),
kaeufer=generic_model.Arbeitsauftrag.Sortimente.Sortiment.Kaeufer(kontaktrolle=enums.Kontaktrolle.Kaeufer.value)
)
return sortiment
def create_zu_faellende_baeume():
umring = generic_model.ZuFaellendeBaeume.Umring(
name="name", beschreibung="beschreibung",
koordinaten=generic_model.ZuFaellendeBaeume.Umring.Koordinaten([
generic_model.ZuFaellendeBaeume.Umring.Koordinaten.Koordinate(x=30.00004, y=120.80),
generic_model.ZuFaellendeBaeume.Umring.Koordinaten.Koordinate(x=31.00004, y=121.80),
generic_model.ZuFaellendeBaeume.Umring.Koordinaten.Koordinate(x=32.00004, y=122.80),
]))
zufaellendebaeume = generic_model.ZuFaellendeBaeume(
id_="https://www.company.com/submodels/zu_faellende_baeume",
beschreibung="Baueme sollen demnaechst gefaellt werden",
umring=umring,
position=generic_model.ZuFaellendeBaeume.Position(
koordinate=generic_model.ZuFaellendeBaeume.Position.Koordinate(x=31.00004, y=121.80),
notiz="Die Position"
),
baumliste=(
generic_model.ZuFaellendeBaeume.Baumliste.StehenderBaum(
hoehe=15.3, bhd=20.2, baumart=enums.Holzart.Buche.value,
position=generic_model.ZuFaellendeBaeume.Baumliste.StehenderBaum.Position(
koordinate=generic_model.ZuFaellendeBaeume.Position.Koordinate(x=31.00004, y=121.80),
notiz="Position"
)),
),
)
return zufaellendebaeume
def create_holzliste():
kopfdaten = generic_model.Holzliste.Kopfdaten(
projekt="Eslohe2023",
hieb=enums.Hieb.Durchforstung.value,
ernte=generic_model.Holzliste.Kopfdaten.Ernte(min=datetime.date(2023, 12, 1), max=datetime.date(2023, 12, 31)),
lieferant=generic_model.Holzliste.Kopfdaten.Lieferant(),
kaeufer=generic_model.Holzliste.Kopfdaten.Kaeufer(),
fuhrmann=generic_model.Holzliste.Kopfdaten.Fuhrmann(),
notiz="Dieses Holz ist sehr gut"
)
messergebnis_einzelstammliste = generic_model.Holzliste.PolterListe.Polter.Messergebnis_EinzelstammListe(
generic_model.Holzliste.PolterListe.Polter.Messergebnis_EinzelstammListe.Einzelstaemme([
generic_model.Holzliste.PolterListe.Polter.Messergebnis_EinzelstammListe.Einzelstaemme.Einzelstamm(
menge=3.4,
stammlaenge=4.2,
stammnummer="1",
mittendurchmesser=47.0,
gueteklasse=enums.Gueteklasse.Normale_Qualitaet.value
)
])
)
polter = generic_model.Holzliste.PolterListe.Polter(
polternummer="100",
vermessungsverfahren=enums.Vermessungsverfahren.Mittenstaerkenvermessung.value,
polterstatus=enums.Polterstatus.Vermessen.value,
messergebnis_EinzelstammListe=messergebnis_einzelstammliste,
standort=generic_model.Holzliste.PolterListe.Polter.Standort(
koordinate=generic_model.Holzliste.PolterListe.Polter.Standort.Koordinate(x=31.00004, y=121.80),
notiz="Die Position"
),
fotos=[
"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Altenbrak_Holz.JPG/1920px-Altenbrak_Holz.JPG",
"https://de.wikipedia.org/wiki/Polter#/media/Datei:Baumst%C3%A4mme_bei_St%C3%BCbeckshorn.jpg"],
videos=["https://www.youtube.com/watch?v=b65SSRfDwUo"],
)
holzliste = generic_model.Holzliste(
id_="https://www.company.com/holzliste/1",
kopfdaten=kopfdaten,
polterListe=generic_model.Holzliste.PolterListe([polter]),
sortimentstyp=enums.Sortimentstyp.Stammholz.value,
sorte=enums.Sorte.lang.value,
holzart=enums.Holzart.Fichte.value)
return holzliste
def create_aas():
arbeitsauftrag = create_arbeitsauftrag()
holzliste = create_holzliste()
zu_faellende_baeume = create_zu_faellende_baeume()
submodels = [
arbeitsauftrag,
holzliste,
zu_faellende_baeume,
]
aas_dz_wald = model.AssetAdministrationShell(
id_="https://www.company.com/dz_wald/1",
id_short="DZWald",
asset_information=model.AssetInformation(),
submodel=submodels
)
return aas_dz_wald, submodels
def write_aas():
aas, submodels = create_aas()
objstore = basyx.aas.model.DictObjectStore(submodels)
objstore.add(aas)
with open("generic_dz_wald_example.json", "w", encoding='utf-8') as file:
json_serialization.write_aas_json_file(file, objstore)
if __name__ == "__main__":
write_aas()
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
from copy import deepcopy
from enum import Enum
from typing import Any, Iterable
......@@ -47,7 +48,7 @@ def init_items_and_add_to_se_list(se_list, values_of_items: Iterable[Any], item_
if isinstance(val, Enum):
val = val.value
# create item e.g. Property(value="example@email.de", value_type=str, ...)
item = item_type(value=val, **item_kwargs)
item = item_type(value=val, **deepcopy(item_kwargs))
# find free id_short in SubmodelElementList and set item's id_short to it
item.id_short = find_next_free_id_short(collection=se_list,
id_short_base=item_kwargs[ID_SHORT],
......
This diff is collapsed.
......@@ -58,7 +58,6 @@ class Beobachtung <<Submodel>>{
}
class ZuFaellendeBaeume <<Submodel>>{
Name: String [1]
Beschreibung: String [1]
Umring: SEC.Umring [1]
Position: SEC.Standort [0..1]
......@@ -92,7 +91,10 @@ class Preismatrixeintrag <<SubmodelElementCollection>>{
Preis: Float [1]
MittendurchmesserVon: Float [0..1]
MittendurchmesserBis: Float [0..1]
Gueteklasse: ENUM.Gueteklasse [0..1]
GueteklasseVon: ENUM.Gueteklasse [0..1]
GueteklasseBis: ENUM.Gueteklasse [0..1]
Sortimentstyp: ENUM.Sortimentstyp [0..1]
Sorte: ENUM.Sorte [0..1]
}
Verkaufslos *--> "0..*" Preismatrixeintrag
......@@ -154,7 +156,6 @@ class Holzliste <<Submodel>>{
Holzart: ENUM.Holzart [1]
' https://eldatstandard.de/dokumentation/1.0.2/species
Holzlistenstatus: ENUM.Holzlistenstatus[1]
Preismatrix: SEList.SEC.Preismatrixeintrag [0..n]
}
class Kopfdaten <<SubmodelElementCollection>>{
......@@ -174,7 +175,6 @@ class Kopfdaten <<SubmodelElementCollection>>{
class Kontakt <<SubmodelElementCollection>>{
'https://eldatstandard.de/dokumentation/1.0.2/consumer
Kontaktrolle: ENUM.Kontaktrolle [1]
Firmenname: String [0..1]
Anrede: String [0..1]
Vorname: String [0..1]
......@@ -195,9 +195,8 @@ class Polter <<SubmodelElementCollection>> {
Messergebnis_RaummassIndustrieholz : SEC.RaummassIndustrieholz [0..1]
Messergebnis_RaummassEnergieholz : SEC.RaummassEnergieholz [0..1]
Polterstatus: ENUM.Polterstatus [1]
Fotos: SEList.URL|Base64 [0..*]
Fotos: SEList.URL [0..*]
Videos: SEList.URL [0..*]
'Foto TBD
}
class Standort <<SubmodelElementCollection>> {
......@@ -246,7 +245,6 @@ class RaummassEnergieholz <<SubmodelElementCollection>> {
Holzliste *-> Kopfdaten
'Kopfdaten --> Kontakt
Holzliste --> "0..*" Preismatrixeintrag
Holzliste *-- "*" Polter
Polter *-- "0..1" RaummassIndustrieholz
Polter *-- "0..1" RaummassEnergieholz
......
......@@ -262,17 +262,6 @@ enum Hieb{
}
note top #FF0000: TODO Eigendefinition?
enum Kontaktrolle{
Waldbesitzer
Lieferant
Verkaeufer
Kaeufer
Fuhrmann
UnternehmerHolzernte
UnternehmerHolzrueckung
}
note top: Eigendefinition
enum Bereitstellungsart{
uws - Unfrei Waldstraße
uwe - Unfrei Werk
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment