Program za izračun geometrijskih karakteristik poligonalnih prerezov. Izvedba programa z možnostjo vnosa podatkov v različnih zapisih (TXT, XML, JSON, SQLite).
Izvorna koda#
geokar.py#
#! /usr/bin/env python
import geometrijske_karakteristike as gk
import sys
import collections
import xml.etree.cElementTree as et
import json
import sqlite3
def izpisi_vrednost(naslov, vrednost):
return "{:>5} = {:.3f}\n".format(naslov, vrednost)
def vnos_podatkov_txt():
# Vnos podatkov
dat = open(sys.argv[1], "r")
n = int(dat.readline())
x = []
y = []
for i in range(n):
vrstica = dat.readline()
besede = vrstica.split()
x.append(float(besede[0]))
y.append(float(besede[1]))
x.append(x[0])
y.append(y[0])
dat.close()
return n, x, y
def vnos_podatkov_xml():
# Vnos podatkov
xml_tree = et.parse(sys.argv[1])
xml_prerez = xml_tree.getroot()
xml_tocke = xml_prerez.find("tocke")
xml_tocke_seznam = xml_tocke.findall("tocka")
n = len(xml_tocke_seznam)
x = []
y = []
for xml_tocka in xml_tocke_seznam:
tocka_id = int(xml_tocka.get("id"))
tocka_x = float(xml_tocka.find("x").text)
tocka_y = float(xml_tocka.find("y").text)
x.insert(tocka_id - 1, tocka_x)
y.insert(tocka_id - 1, tocka_y)
x.append(x[0])
y.append(y[0])
return n, x, y
def vnos_podatkov_json():
# Vnos podatkov
with open(sys.argv[1], "r") as dat:
data = json.load(dat)
n = data["n"]
x = data["x"]
y = data["y"]
x.append(x[0])
y.append(y[0])
return n, x, y
def vnos_podatkov_sqlite():
db = sqlite3.connect(sys.argv[1])
cursor = db.cursor()
cursor.execute("SELECT * FROM tocke")
tocke = cursor.fetchall()
db.close()
n = len(tocke)
x = []
y = []
for tocka in tocke:
x.insert(tocka[0] - 1, float(tocka[1]))
y.insert(tocka[0] - 1, float(tocka[2]))
x.append(x[0])
y.append(y[0])
return n, x, y
def izracun(n, x, y):
vrednosti = collections.OrderedDict()
vrednosti["Ax"] = gk.Ax(n, x, y)
vrednosti["Sx"] = gk.Sx(n, x, y)
vrednosti["Sy"] = gk.Sy(n, x, y)
vrednosti["Iy"] = gk.Iy(n, x, y)
vrednosti["Ixy"] = gk.Ixy(n, x, y)
vrednosti["xt"] = gk.xt(n, x, y)
vrednosti["yt"] = gk.yt(n, x, y)
vrednosti["Ixt"] = gk.Ixt(n, x, y)
vrednosti["Iyt"] = gk.Iyt(n, x, y)
vrednosti["Ixyt"] = gk.Ixyt(n, x, y)
return vrednosti
def izpis(vrednosti):
s = ""
for k in vrednosti:
s = s + izpisi_vrednost(k, vrednosti[k])
izpis_na_zaslon(s)
izpis_v_datoteko(s)
def izpis_na_zaslon(s):
print(s)
def izpis_v_datoteko(s):
dat = open(sys.argv[2], "w")
dat.write(s)
dat.close()
def main():
# Vnos podatkov
print("Vnos podatkov ...")
vnos = {"txt": vnos_podatkov_txt, "xml": vnos_podatkov_xml, "json": vnos_podatkov_json, "sqlite": vnos_podatkov_sqlite}
fin = sys.argv[1]
ext = fin[fin.rfind(".") + 1:]
if ext not in vnos:
print("Napaka: Neznan zapis podatkov")
return
n, x, y = vnos[ext]()
# Izračun količin
print("Izračun ...")
vrednosti = izracun(n, x, y)
# Izpis rezultatov
print("Izpis ...")
izpis(vrednosti)
if __name__ == "__main__": main()
geometrijske_karakteristike.py#
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Funkcije za izračun geometrijskih karakteristik
def Ax(n, x, y):
v = 0.0
for i in range(n):
v = v + (x[i+1] + x[i]) * (y[i+1] - y[i])
return 0.5 * v
def Sx(n, x, y):
v = 0.0
for i in range(n):
v = v + (x[i+1] - x[i]) * (y[i+1]**2 + y[i] * y[i+1] + y[i]**2)
return -1. / 6. * v
def Sy(n, x, y):
v = 0.0
for i in range(n):
v = v + (y[i+1] - y[i]) * (x[i+1]**2 + x[i] * x[i+1] + x[i]**2)
return 1. / 6. * v
def Ix(n, x, y):
v = 0.0
for i in range(n):
v = v + (x[i+1] - x[i]) * (y[i+1]**3 + y[i+1]**2 * y[i] + y[i+1] * y[i]**2 + y[i]**3)
return -1. / 12. * v
def Iy(n, x, y):
v = 0.0
for i in range(n):
v = v + (y[i+1] - y[i]) * (x[i+1]**3 + x[i+1]**2 * x[i] + x[i+1] * x[i]**2 + x[i]**3)
return 1. / 12. * v
def Ixy(n, x, y):
v = 0.0
for i in range(n):
v = v + (y[i+1] - y[i]) * (y[i+1] * (3* x[i+1]**2 + 2 * x[i] * x[i+1] + x[i]**2) + y[i] * (3 * x[i]**2 + 2 * x[i] * x[i+1] + x[i+1]**2))
return -1. / 24. * v
def xt(n, x, y):
return Sy(n, x, y) / Ax(n, x, y)
def yt(n, x, y):
return Sx(n, x, y) / Ax(n, x, y)
def Ixt(n, x, y):
return Ix(n, x, y) - yt(n, x, y)**2 * Ax(n, x, y)
def Iyt(n, x, y):
return Iy(n, x, y) - xt(n, x, y)**2 * Ax(n, x, y)
def Ixyt(n, x, y):
return Ixy(n, x, y) + xt(n, x, y) * yt(n, x, y) * Ax(n, x, y)
Podatki in rezultati#
primer-1.txt#
4
0 0
1 0
1 1
0 1
primer-1.json#
{
"n": 4,
"x": [0,1,1,0],
"y": [0,0,1,1]
}
primer-1.xml#
<?xml version="1.0" encoding="UTF-8"?>
<prerez>
<tocke>
<tocka id="1">
<x>0.0</x>
<y>0.0</y>
</tocka>
<tocka id="2">
<x>1.0</x>
<y>0.0</y>
</tocka>
<tocka id="3">
<x>1.0</x>
<y>1.0</y>
</tocka>
<tocka id="4">
<x>0.0</x>
<y>1.0</y>
</tocka>
</tocke>
</prerez>
primer-1-rez.txt#
Iy = 0.333
Ixt = 0.083
xt = 0.500
Ixy = -0.250
Iyt = 0.083
Sy = 0.500
Ax = 1.000
Sx = 0.500
Ixyt = 0.000
yt = 0.500