Script liefert kein Ergebnis

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alois-Ge
User
Beiträge: 4
Registriert: Freitag 3. Februar 2017, 17:19

Hallo Zusammen!

Ich hätte eine Frage nachdem das folgende Script nicht das mach, was ich von ihm gerne möchte
und vielleicht der Fehler gar nicht in dem Script liegt, sondern es die von mir angegebenen Attribute gar nicht
so in der Datenbank benannt sind.

ich habe schon versucht den Inhalt der Listen zu drucken, aber auch hier bekomme ich kein Ergebnis-
Normalerweise sollte ich ja wenn ich vor Zeile 7"for HaltungRW in Haltungsliste:" diese Zeilen einfüge
print +Haltungsliste
print +Punktliste

zumindest der Inhalt gelistet werden, oder bin ich da am Holzweg :?:

Danke


Code: Alles auswählen

#Informationen von Schächten auf Haltung übertragen: 
#HaltungsID, Von Knoten, Bis Knoten, Höhe Rohranfang, Höhe Rohrende
#Leere Werte oder Null-Höhen werden nicht übernommen
Haltungsliste = list(Application.Project.GetObjects().WhereObjectClass('LineString').WhereObjectType('HaltungRW'))
PunktListe = list(Application.Project.GetObjects().WhereObjectClass('Point').WhereObjectType('SchachtRW'))
idList = []
for HaltungRW in Haltungsliste:
    vonKnoten=""
    bisKnoten=""
    myAHoehe=""
    myEHoehe=""
    myAID=""
    myEID=""
    myHID=""
    try:
        for SchachtRW in PunktListe:
            if str(str(SchachtRW.Geometry[0]) + str(SchachtRW.Geometry[1])) == str(str(HaltungRW.Geometry[0][0]) + str(HaltungRW.Geometry[0][1])):
                vonKnoten=SchachtRW.KNOTENID
                if SchachtRW.S_HOEHE > 0 and SchachtRW.S_HOEHE != HaltungRW.HOEHE_A:
                    myAHoehe = '    Änderung Höhe Anfang von ' + str(HaltungRW.HOEHE_A) + ' in ' + str(SchachtRW.S_HOEHE)
                    HaltungRW.HOEHE_A=SchachtRW.S_HOEHE
                if len(SchachtRW.KNOTENID)  > 0 and SchachtRW.KNOTENID != HaltungRW.VON_K:
                    myAID = '    Änderung VON_K von ' + str(HaltungRW.VON_K) + ' in ' + str(SchachtRW.KNOTENID)
                    HaltungRW.VON_K=SchachtRW.KNOTENID
                if len(SchachtRW.KNOTENID)  > 0 and SchachtRW.KNOTENID != HaltungRW.H_ID:
                    myHID = '    Änderung H_ID  von ' + str(HaltungRW.H_ID) + ' in ' + str(SchachtRW.KNOTENID)
                    HaltungRW.H_ID=SchachtRW.KNOTENID
        for SchachtRW in PunktListe:
            if str(str(SchachtRW.Geometry[0]) + str(SchachtRW.Geometry[1])) == str(str(HaltungRW.Geometry[len(HaltungRW.Geometry) - 1][0]) + str(HaltungRW.Geometry[len(HaltungRW.Geometry) - 1][1])):
                bisKnoten=(SchachtRW.KNOTENID)
                if SchachtRW.S_HOEHE > 0 and SchachtRW.S_HOEHE != HaltungRW.HOEHE_E:
                    myEHoehe = '    Änderung Höhe Ende   von ' + str(HaltungRW.HOEHE_E) + ' in ' + str(SchachtRW.S_HOEHE)
                    HaltungRW.HOEHE_E=SchachtRW.S_HOEHE
                if len(SchachtRW.KNOTENID) > 0 and SchachtRW.KNOTENID != HaltungRW.BIS_K:
                    myEID = '    Änderung BIS_K von ' + str(HaltungRW.BIS_K) + ' in ' + str(SchachtRW.KNOTENID)
                    HaltungRW.BIS_K=SchachtRW.KNOTENID
        if len(myAHoehe + myEHoehe + myAID + myEID + myHID) > 0:
            print '  Haltung: ' + HaltungRW.H_ID #+ ' ID: ' + str(HaltungRW.Id)
            idList.append(HaltungRW.Id)
            if len(myHID)>0:
                print myHID
            if len(myAID)>0:
                print myAID
            if len(myEID)>0:
                print myEID
            if len(myAHoehe)>0:
                print myAHoehe
            if len(myEHoehe)>0:
                print myEHoehe
    except:
        print '  Haltung: ' + HaltungRW.H_ID + ' Fehler beim Editieren'
if len(idList)>0:
    Application.IO.ZoomGoTo(idList)
    print
    print '  Es wurden ' + str(len(idList)) + ' Haltungen geändert.'
    print '  F4 drücken, um Auswahl in der Tabellenansicht anzuzeigen!'
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alois-Ge: als erstes löschst Du das try-except, denn das Verhindert effektiv, überhaupt irgendwelche Fehler zu finden.
Die vielen str-Aufrufe sind seltsam. Was steht denn in Geomertry jeweils drin? Dass eine KOTENID eine Länge haben soll ist auch komisch. len(HaltungRW.Geometry) - 1 als Index kann man einfach auch als -1 schreiben. Die Variablenschreibweise hält sich an keine Konvention. Strings formatiert man mit .format und baut sie nicht mit + zusammen.
Alois-Ge
User
Beiträge: 4
Registriert: Freitag 3. Februar 2017, 17:19

@Sirius3
In der Geometry stehen 2 bzw. 3 Koordinaten ( rechtswert + hochwert und ev. Höhe ). und die Haltung stellt die Linie zwischen 2 Schächten dar.
Jeder Schacht(RW,MW,IW,usw) hat eine KNOTENID als Indentifikation. Diese ID soll von den Schächten zu welchen die Haltungen gehen
in das Attribut vonKnoten und bisKnoten übernommen werden. Länge hat eine KNOTENID keine.

Z.B.
SchachtA HaltungA-B SchachtB HaltungB-C SchachtC

Ich habe in der Datenbank neue Objekte angelegt bzw. Kopiert (z.B. habe ich aus einem ehemaligen Objekttyp "Schacht" einen "SchachtRW" und aus der Haltung die HaltungRW gemacht). Vielleicht wäre es ja auch einfacherweise möglich mit einem wildcard das Problem zu lösen, so dass alle Objekte in die Haltungsliste und in die PunktListe übernommen werden ?!?
BlackJack

@Alois-Ge: Du sagst eine KNOTENID hat keine Länge, schreibst dann aber so etwas wie ``len(SchachtRW.KNOTENID) > 0`` in den Quelltext‽ Entweder hat die doch eine Länge, oder an der Stelle kommt eine Ausnahme die Du mit dem ``except`` ohne konkrete Angabe einer Ausnahme ”behandelst”, also einen reinen Programmierfehler den man genau deswegen nicht leicht findet. Wie Sirius3 schon sagte: Weg mit dem ``try``/``except``. Wer weiss was Du damit noch für Programmierfehler versteckst.

Wenn das Koordinaten sind, warum erstellst Du dann Zeichenketten zum Vergleichen? Und das auch noch auf eine Art und Weise die nicht eindeutig sein muss! Denn (10, 20) und (1, 120) würden bei Dir beide zu '1020' und wären damit gleich. Obwohl sie es nicht sind.
Alois-Ge
User
Beiträge: 4
Registriert: Freitag 3. Februar 2017, 17:19

@ BlackJack Ich habe das eben nicht geschreiben, sondern ich versuche das Script auf meine Objekte anzupassen, nur ist das auch
meine Meinung das hier ein paar grundlegende Fehler enthalten bzw. versteckt sind.
Der Koordinatenbereich ist in m angegeben ca. rechtswert 25523,330 hochwert 282546,330 und immer mit 3 kommastellen, somit
sollten die koordinaten eindeutig sein. Es wäre eher möglich bei den Koordinaten einen Wert(rechts bzw. hoch) zu haben der Ident ist,
vielleicht wurde deshalb eine Zahlenkette gewählt.
BlackJack

@Alois-Ge: Es ist trotzdem nicht wirklich sinnvoll Zahlen für einen Vergleich in Zeichenketten umzuwandeln.
BlackJack

@Alois-Ge: Wobei ich mich frage wenn Du das nicht geschrieben hast, dann hat das jemand anders geschrieben und das hat noch nie funktioniert. Etwas nicht-funktionierendes auf eigene Objekte anzupassen dürfte auch dort nicht funktionieren. Oder wenn, dann eher zufällig.
Alois-Ge
User
Beiträge: 4
Registriert: Freitag 3. Februar 2017, 17:19

@BlackJack Original funktioniert. Auch mein geändertes Script funktioniert zum Teil(Die 2 Listen werden ja mit meinen Objekten erzeugt), nur leider weiß ich nicht wo es hackt. Möglicherweise habe ich auch die falschen variablen eingefügt. Ich bin jetzt mal dabei mir die Objekte in eine CSV-Datei zu schreiben um hier vielleicht mehr Infos zum Fehler zu erhalten.
Antworten