Hallo zusammen,
momentan programmiere ich zwei Aufträge bzgl. Visualisierung von Prozess-Leitsystemen.
Die Rohrverbindungen habe ich zunächst "fest verdrahtet" programmiert. Vor ein paar Tagen kam mir die Idee, dies anhand einfacher Datenstrukturen umzusetzen.
Aus verständlichen Gründen kann ich hier keinen Code einer Auftragsentwicklung veröffentlihen, aber die paar Zeilen, mit denen Rohrsysteme gezeichnet werden können, ist wohl drin.
Code
link graphics
procedure rohr(breite, liste)
ecken := *liste / 3 # x,y-Koordinaten & string in einer Liste
every i := 0 to breite / 2 do
{ Fg(i * 65535 / breite*2 || "," || i * 65535 / breite*2 || "," || i * 65535 / breite*2)
every ecke := 1 to ecken - 1 do
{ ox1 := ox2 := oy1 := oy2 := 0
if liste[3 * (ecke - 1) + 1] = liste[3 * ecke + 1] then # Rohr vertikal
{ write("x:", liste[3 * ecke])
case liste[3 * ecke] of
{"_": {ox1 := 0; oy1 := 0}
"/": {ox1 := 0; oy1 := 1}
"\\": {ox1 := 0; oy1 := -1}
}
write("x+1:", liste[3 * (ecke + 1)])
case liste[3 * (ecke + 1)] of
{"_": {ox2 := 0; oy2 := 0}
"/": {ox2 := 0; oy2 := 1}
"\\": {ox2 := 0; oy2 := -1}
}
DrawLine(liste[3 * (ecke - 1) + 1] - breite / 2 + i, liste[3 * (ecke - 1) + 2] + oy1 * breite / 2 - oy1 * i, liste[3 * ecke + 1] - breite / 2 + i, liste[3 * ecke + 2] + oy2 * breite / 2 - oy2 * i)
DrawLine(liste[3 * (ecke - 1) + 1] + breite / 2 - i, liste[3 * (ecke - 1) + 2] - oy1 * breite / 2 + oy1 * i, liste[3 * ecke + 1] + breite / 2 - i, liste[3 * ecke + 2] - oy2 * breite / 2 + oy2 * i)
}
if liste[3 * (ecke - 1) + 2] = liste[3 * ecke + 2] then # Rohr horizontal
{ write("y:", liste[3 * ecke])
case liste[3 * ecke] of
{"|": {ox1 := 0; oy1 := 0}
"/": {ox1 := 1; oy1 := 0}
"\\": {ox1 := -1; oy1 := 0}
}
write("y+1:", liste[3 * (ecke + 1)])
case liste[3 * (ecke + 1)] of
{"|": {ox2 := 0; oy2 := 0}
"/": {ox2 := 1; oy2 := 0}
"\\": {ox2 := -1; oy2 := 0}
}
DrawLine(liste[3 * (ecke - 1) + 1] - ox1 * breite / 2 + ox1 * i, liste[3 * (ecke - 1) + 2] + breite / 2 - i, liste[3 * ecke + 1] - ox2 * breite / 2 + ox2 * i, liste[3 * ecke + 2] + breite / 2 - i)
DrawLine(liste[3 * (ecke - 1) + 1] + ox1 * breite / 2 - ox1 * i, liste[3 * (ecke - 1) + 2] - breite / 2 + i, liste[3 * ecke + 1] + ox2 * breite / 2 - ox2 * i, liste[3 * ecke + 2] - breite / 2 + i)
}
}
delay(250) # Zur Beschleunigung in # auskommentieren
}
delay(3000)
end
procedure main()
WIN := WOpen("size=1600,800", "label=Rohre \xa9 2015 by A. Schulz (IVQS)") | stop("Kein Fenster!")
rohr(20, [800, 100, "_", # 20: Breite des Rohrs, 800: X-Koordinate, 1000: y-Koordinate des Startpunktes
800, 200, "/", # Die Zeichenketten _, /, \\ beschreiben die Form des Rohres an dieser Koordinate
1000, 200, "/", # _ oder |: Ein vertikales Rohr mit geradem Schnitt oder ein horizontales Rohr mit geradem Schnitt
1000, 300, "\\", # / oder \\: Ein Rohr das vertikal oder horizontal mit diesem Winkel beginnt oder endet
900, 300, "\\", # Das erste Teilrohr verläuft vertikal, ist oben gerade und unten rechts abgeschnitten,
900,400, "/", # damit dort ein entsprechendes Stück angesetzt werden kann
1000, 400, "|",
1200, 400, "\\"]
)
WDone()
end
Alles anzeigen
Das zweite Bild enthält eine zufällig erzeugte "Rohrliste", die auf dem gleichen Code beruht.
Beste Grüße
Andreas