From 25513cc7c5122f7d7ccd8c18027fda2776ce7c73 Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Sat, 11 Feb 2023 21:14:34 +0100 Subject: [PATCH] Rotation rate csv file generator initial issue added --- Test cases/test_sequence_rotation.csv | 361 ++++++++++++++++++++++++++ src/rotating_field.py | 6 +- src/user_interface.py | 249 ++++++++++++++++-- src/utility.py | 17 ++ 4 files changed, 611 insertions(+), 22 deletions(-) create mode 100644 Test cases/test_sequence_rotation.csv diff --git a/Test cases/test_sequence_rotation.csv b/Test cases/test_sequence_rotation.csv new file mode 100644 index 0000000..aa2d882 --- /dev/null +++ b/Test cases/test_sequence_rotation.csv @@ -0,0 +1,361 @@ +"t [s]","x [T]","y [T]","z [T]" +0.0,0.0,-1.7452406437283511e-06,9.998476951563913e-05 +1.0,0.0,-3.489949670250097e-06,9.993908270190956e-05 +2.0,0.0,-5.233595624294383e-06,9.986295347545739e-05 +3.0,0.0,-6.9756473744125295e-06,9.975640502598241e-05 +4.0,0.0,-8.715574274765817e-06,9.961946980917455e-05 +5.0,0.0,-1.0452846326765347e-05,9.945218953682732e-05 +6.0,0.0,-1.2186934340514746e-05,9.92546151641322e-05 +7.0,0.0,-1.3917310096006543e-05,9.902680687415703e-05 +8.0,0.0,-1.5643446504023085e-05,9.876883405951377e-05 +9.0,0.0,-1.736481776669303e-05,9.84807753012208e-05 +10.0,0.0,-1.908089953765448e-05,9.81627183447664e-05 +11.0,0.0,-2.079116908177593e-05,9.781476007338056e-05 +12.0,0.0,-2.24951054343865e-05,9.743700647852352e-05 +13.0,0.0,-2.4192189559966768e-05,9.702957262759964e-05 +14.0,0.0,-2.5881904510252073e-05,9.659258262890682e-05 +15.0,0.0,-2.7563735581699915e-05,9.612616959383188e-05 +16.0,0.0,-2.9237170472273675e-05,9.563047559630354e-05 +17.0,0.0,-3.0901699437494747e-05,9.510565162951534e-05 +18.0,0.0,-3.2556815445715677e-05,9.455185755993167e-05 +19.0,0.0,-3.420201433256688e-05,9.396926207859082e-05 +20.0,0.0,-3.583679495453003e-05,9.335804264972018e-05 +21.0,0.0,-3.7460659341591216e-05,9.271838545667873e-05 +22.0,0.0,-3.9073112848927384e-05,9.205048534524402e-05 +23.0,0.0,-4.0673664307580036e-05,9.135454576426007e-05 +24.0,0.0,-4.226182617406996e-05,9.063077870366498e-05 +25.0,0.0,-4.3837114678907755e-05,8.987940462991669e-05 +26.0,0.0,-4.53990499739547e-05,8.910065241883677e-05 +27.0,0.0,-4.6947156278589106e-05,8.829475928589268e-05 +28.0,0.0,-4.8480962024633725e-05,8.746197071393956e-05 +29.0,0.0,-5.0000000000000016e-05,8.660254037844385e-05 +30.0,0.0,-5.150380749100544e-05,8.571673007021121e-05 +31.0,0.0,-5.299192642332052e-05,8.480480961564258e-05 +32.0,0.0,-5.4463903501502736e-05,8.386705679454238e-05 +33.0,0.0,-5.591929034707471e-05,8.290375725550414e-05 +34.0,0.0,-5.735764363510463e-05,8.191520442889916e-05 +35.0,0.0,-5.877852522924735e-05,8.090169943749473e-05 +36.0,0.0,-6.018150231520486e-05,7.986355100472926e-05 +37.0,0.0,-6.156614753256586e-05,7.880107536067216e-05 +38.0,0.0,-6.293203910498378e-05,7.771459614569705e-05 +39.0,0.0,-6.427876096865397e-05,7.660444431189777e-05 +40.0,0.0,-6.560590289905078e-05,7.547095802227717e-05 +41.0,0.0,-6.691306063588587e-05,7.431448254773938e-05 +42.0,0.0,-6.819983600624989e-05,7.313537016191701e-05 +43.0,0.0,-6.946583704589977e-05,7.193398003386506e-05 +44.0,0.0,-7.07106781186548e-05,7.071067811865471e-05 +45.0,0.0,-7.193398003386517e-05,6.946583704589967e-05 +46.0,0.0,-7.313537016191709e-05,6.81998360062498e-05 +47.0,0.0,-7.431448254773947e-05,6.691306063588577e-05 +48.0,0.0,-7.547095802227724e-05,6.560590289905067e-05 +49.0,0.0,-7.660444431189785e-05,6.427876096865388e-05 +50.0,0.0,-7.771459614569712e-05,6.293203910498368e-05 +51.0,0.0,-7.880107536067224e-05,6.156614753256577e-05 +52.0,0.0,-7.986355100472934e-05,6.0181502315204756e-05 +53.0,0.0,-8.090169943749478e-05,5.8778525229247246e-05 +54.0,0.0,-8.191520442889923e-05,5.735764363510454e-05 +55.0,0.0,-8.290375725550421e-05,5.5919290347074614e-05 +56.0,0.0,-8.386705679454245e-05,5.446390350150263e-05 +57.0,0.0,-8.480480961564264e-05,5.299192642332041e-05 +58.0,0.0,-8.571673007021128e-05,5.150380749100534e-05 +59.0,0.0,-8.660254037844392e-05,4.9999999999999914e-05 +60.0,0.0,-8.746197071393963e-05,4.848096202463361e-05 +61.0,0.0,-8.829475928589274e-05,4.6947156278588984e-05 +62.0,0.0,-8.910065241883682e-05,4.5399049973954584e-05 +63.0,0.0,-8.987940462991674e-05,4.383711467890765e-05 +64.0,0.0,-9.063077870366504e-05,4.2261826174069845e-05 +65.0,0.0,-9.135454576426014e-05,4.067366430757991e-05 +66.0,0.0,-9.205048534524408e-05,3.907311284892726e-05 +67.0,0.0,-9.271838545667878e-05,3.7460659341591094e-05 +68.0,0.0,-9.335804264972022e-05,3.583679495452991e-05 +69.0,0.0,-9.396926207859087e-05,3.420201433256675e-05 +70.0,0.0,-9.455185755993171e-05,3.255681544571555e-05 +71.0,0.0,-9.51056516295154e-05,3.0901699437494625e-05 +72.0,0.0,-9.563047559630358e-05,2.923717047227355e-05 +73.0,0.0,-9.612616959383192e-05,2.7563735581699786e-05 +74.0,0.0,-9.659258262890686e-05,2.5881904510251944e-05 +75.0,0.0,-9.702957262759967e-05,2.4192189559966636e-05 +76.0,0.0,-9.743700647852355e-05,2.2495105434386364e-05 +77.0,0.0,-9.781476007338059e-05,2.0791169081775793e-05 +78.0,0.0,-9.816271834476641e-05,1.908089953765434e-05 +79.0,0.0,-9.848077530122083e-05,1.7364817766692885e-05 +80.0,0.0,-9.876883405951378e-05,1.564344650402294e-05 +81.0,0.0,-9.902680687415704e-05,1.3917310096006394e-05 +82.0,0.0,-9.925461516413221e-05,1.2186934340514595e-05 +83.0,0.0,-9.945218953682734e-05,1.0452846326765189e-05 +84.0,0.0,-9.961946980917455e-05,8.715574274765657e-06 +85.0,0.0,-9.975640502598242e-05,6.975647374412368e-06 +86.0,0.0,-9.986295347545739e-05,5.233595624294219e-06 +87.0,0.0,-9.993908270190956e-05,3.4899496702499304e-06 +88.0,0.0,-9.998476951563913e-05,1.7452406437281821e-06 +89.0,0.0,-9.999999999999999e-05,-1.7151244994428827e-19 +90.0,0.0,-9.998476951563911e-05,-1.7452406437285252e-06 +91.0,0.0,-9.993908270190956e-05,-3.489949670250273e-06 +92.0,0.0,-9.986295347545739e-05,-5.233595624294562e-06 +93.0,0.0,-9.97564050259824e-05,-6.975647374412711e-06 +94.0,0.0,-9.961946980917452e-05,-8.715574274766e-06 +95.0,0.0,-9.945218953682731e-05,-1.0452846326765531e-05 +96.0,0.0,-9.925461516413217e-05,-1.2186934340514934e-05 +97.0,0.0,-9.9026806874157e-05,-1.3917310096006731e-05 +98.0,0.0,-9.876883405951374e-05,-1.564344650402328e-05 +99.0,0.0,-9.848077530122077e-05,-1.7364817766693227e-05 +100.0,0.0,-9.816271834476635e-05,-1.908089953765467e-05 +101.0,0.0,-9.781476007338052e-05,-2.079116908177613e-05 +102.0,0.0,-9.743700647852348e-05,-2.2495105434386696e-05 +103.0,0.0,-9.70295726275996e-05,-2.4192189559966968e-05 +104.0,0.0,-9.659258262890676e-05,-2.5881904510252273e-05 +105.0,0.0,-9.612616959383182e-05,-2.756373558170012e-05 +106.0,0.0,-9.563047559630347e-05,-2.9237170472273875e-05 +107.0,0.0,-9.510565162951529e-05,-3.090169943749494e-05 +108.0,0.0,-9.45518575599316e-05,-3.2556815445715866e-05 +109.0,0.0,-9.396926207859076e-05,-3.420201433256708e-05 +110.0,0.0,-9.335804264972008e-05,-3.583679495453023e-05 +111.0,0.0,-9.271838545667864e-05,-3.7460659341591406e-05 +112.0,0.0,-9.205048534524394e-05,-3.907311284892758e-05 +113.0,0.0,-9.135454576425999e-05,-4.067366430758023e-05 +114.0,0.0,-9.06307787036649e-05,-4.226182617407013e-05 +115.0,0.0,-8.987940462991662e-05,-4.3837114678907904e-05 +116.0,0.0,-8.910065241883671e-05,-4.539904997395483e-05 +117.0,0.0,-8.829475928589262e-05,-4.69471562785892e-05 +118.0,0.0,-8.746197071393952e-05,-4.8480962024633814e-05 +119.0,0.0,-8.66025403784438e-05,-5.00000000000001e-05 +120.0,0.0,-8.571673007021119e-05,-5.1503807491005496e-05 +121.0,0.0,-8.480480961564256e-05,-5.299192642332055e-05 +122.0,0.0,-8.386705679454238e-05,-5.446390350150276e-05 +123.0,0.0,-8.290375725550414e-05,-5.591929034707471e-05 +124.0,0.0,-8.191520442889917e-05,-5.735764363510461e-05 +125.0,0.0,-8.090169943749474e-05,-5.87785252292473e-05 +126.0,0.0,-7.98635510047293e-05,-6.01815023152048e-05 +127.0,0.0,-7.880107536067223e-05,-6.156614753256578e-05 +128.0,0.0,-7.771459614569712e-05,-6.29320391049837e-05 +129.0,0.0,-7.660444431189785e-05,-6.427876096865386e-05 +130.0,0.0,-7.547095802227727e-05,-6.560590289905064e-05 +131.0,0.0,-7.43144825477395e-05,-6.691306063588573e-05 +132.0,0.0,-7.313537016191715e-05,-6.819983600624973e-05 +133.0,0.0,-7.193398003386522e-05,-6.946583704589961e-05 +134.0,0.0,-7.071067811865489e-05,-7.071067811865462e-05 +135.0,0.0,-6.946583704589988e-05,-7.193398003386496e-05 +136.0,0.0,-6.819983600625e-05,-7.313537016191689e-05 +137.0,0.0,-6.691306063588599e-05,-7.431448254773925e-05 +138.0,0.0,-6.560590289905093e-05,-7.547095802227701e-05 +139.0,0.0,-6.427876096865415e-05,-7.660444431189762e-05 +140.0,0.0,-6.293203910498398e-05,-7.771459614569689e-05 +141.0,0.0,-6.156614753256608e-05,-7.880107536067199e-05 +142.0,0.0,-6.0181502315205095e-05,-7.986355100472907e-05 +143.0,0.0,-5.877852522924761e-05,-8.090169943749453e-05 +144.0,0.0,-5.735764363510492e-05,-8.191520442889896e-05 +145.0,0.0,-5.591929034707501e-05,-8.290375725550392e-05 +146.0,0.0,-5.446390350150306e-05,-8.386705679454216e-05 +147.0,0.0,-5.2991926423320864e-05,-8.480480961564236e-05 +148.0,0.0,-5.1503807491005815e-05,-8.571673007021098e-05 +149.0,0.0,-5.0000000000000416e-05,-8.660254037844362e-05 +150.0,0.0,-4.8480962024634146e-05,-8.746197071393933e-05 +151.0,0.0,-4.694715627858954e-05,-8.829475928589244e-05 +152.0,0.0,-4.539904997395516e-05,-8.910065241883652e-05 +153.0,0.0,-4.383711467890824e-05,-8.987940462991644e-05 +154.0,0.0,-4.226182617407047e-05,-9.063077870366475e-05 +155.0,0.0,-4.067366430758057e-05,-9.135454576425984e-05 +156.0,0.0,-3.9073112848927946e-05,-9.20504853452438e-05 +157.0,0.0,-3.74606593415918e-05,-9.27183854566785e-05 +158.0,0.0,-3.583679495453064e-05,-9.335804264971995e-05 +159.0,0.0,-3.420201433256751e-05,-9.39692620785906e-05 +160.0,0.0,-3.255681544571633e-05,-9.455185755993144e-05 +161.0,0.0,-3.0901699437495424e-05,-9.510565162951514e-05 +162.0,0.0,-2.923717047227438e-05,-9.563047559630332e-05 +163.0,0.0,-2.7563735581700646e-05,-9.612616959383168e-05 +164.0,0.0,-2.5881904510252828e-05,-9.659258262890663e-05 +165.0,0.0,-2.4192189559967547e-05,-9.702957262759945e-05 +166.0,0.0,-2.2495105434387296e-05,-9.743700647852332e-05 +167.0,0.0,-2.0791169081776752e-05,-9.78147600733804e-05 +168.0,0.0,-1.9080899537655325e-05,-9.816271834476623e-05 +169.0,0.0,-1.7364817766693902e-05,-9.848077530122065e-05 +170.0,0.0,-1.5643446504023976e-05,-9.876883405951363e-05 +171.0,0.0,-1.3917310096007455e-05,-9.90268068741569e-05 +172.0,0.0,-1.218693434051568e-05,-9.925461516413209e-05 +173.0,0.0,-1.04528463267663e-05,-9.945218953682723e-05 +174.0,0.0,-8.715574274766792e-06,-9.961946980917446e-05 +175.0,0.0,-6.9756473744135264e-06,-9.975640502598236e-05 +176.0,0.0,-5.233595624295401e-06,-9.986295347545735e-05 +177.0,0.0,-3.4899496702511345e-06,-9.993908270190952e-05 +178.0,0.0,-1.745240643729409e-06,-9.99847695156391e-05 +179.0,0.0,-1.0780605716316238e-18,-9.999999999999999e-05 +180.0,0.0,1.7452406437272534e-06,-9.998476951563914e-05 +181.0,0.0,3.4899496702489805e-06,-9.99390827019096e-05 +182.0,0.0,5.2335956242932474e-06,-9.986295347545744e-05 +183.0,0.0,6.975647374411375e-06,-9.975640502598249e-05 +184.0,0.0,8.715574274764644e-06,-9.961946980917466e-05 +185.0,0.0,1.0452846326764156e-05,-9.945218953682746e-05 +186.0,0.0,1.218693434051354e-05,-9.925461516413236e-05 +187.0,0.0,1.3917310096005318e-05,-9.90268068741572e-05 +188.0,0.0,1.5643446504021845e-05,-9.876883405951396e-05 +189.0,0.0,1.7364817766691777e-05,-9.848077530122103e-05 +190.0,0.0,1.9080899537653207e-05,-9.816271834476665e-05 +191.0,0.0,2.0791169081774648e-05,-9.781476007338083e-05 +192.0,0.0,2.24951054343852e-05,-9.743700647852382e-05 +193.0,0.0,2.4192189559965453e-05,-9.702957262759997e-05 +194.0,0.0,2.5881904510250748e-05,-9.659258262890718e-05 +195.0,0.0,2.756373558169858e-05,-9.612616959383227e-05 +196.0,0.0,2.923717047227232e-05,-9.563047559630396e-05 +197.0,0.0,3.090169943749338e-05,-9.510565162951579e-05 +198.0,0.0,3.2556815445714294e-05,-9.455185755993215e-05 +199.0,0.0,3.420201433256549e-05,-9.396926207859134e-05 +200.0,0.0,3.583679495452863e-05,-9.335804264972069e-05 +201.0,0.0,3.74606593415898e-05,-9.271838545667931e-05 +202.0,0.0,3.9073112848925954e-05,-9.205048534524464e-05 +203.0,0.0,4.067366430757859e-05,-9.135454576426072e-05 +204.0,0.0,4.226182617406852e-05,-9.063077870366565e-05 +205.0,0.0,4.383711467890631e-05,-8.987940462991739e-05 +206.0,0.0,4.5399049973953236e-05,-8.910065241883753e-05 +207.0,0.0,4.6947156278587635e-05,-8.829475928589346e-05 +208.0,0.0,4.8480962024632255e-05,-8.746197071394039e-05 +209.0,0.0,4.9999999999998545e-05,-8.660254037844469e-05 +210.0,0.0,5.150380749100397e-05,-8.57167300702121e-05 +211.0,0.0,5.299192642331904e-05,-8.48048096156435e-05 +212.0,0.0,5.446390350150125e-05,-8.386705679454334e-05 +213.0,0.0,5.591929034707323e-05,-8.290375725550516e-05 +214.0,0.0,5.7357643635103155e-05,-8.191520442890019e-05 +215.0,0.0,5.877852522924586e-05,-8.090169943749579e-05 +216.0,0.0,6.018150231520338e-05,-7.986355100473036e-05 +217.0,0.0,6.156614753256438e-05,-7.880107536067332e-05 +218.0,0.0,6.29320391049823e-05,-7.771459614569824e-05 +219.0,0.0,6.427876096865251e-05,-7.6604444311899e-05 +220.0,0.0,6.560590289904932e-05,-7.547095802227843e-05 +221.0,0.0,6.69130606358844e-05,-7.431448254774069e-05 +222.0,0.0,6.819983600624843e-05,-7.313537016191837e-05 +223.0,0.0,6.946583704589832e-05,-7.193398003386646e-05 +224.0,0.0,7.071067811865336e-05,-7.071067811865615e-05 +225.0,0.0,7.193398003386373e-05,-6.946583704590115e-05 +226.0,0.0,7.313537016191567e-05,-6.819983600625132e-05 +227.0,0.0,7.431448254773806e-05,-6.691306063588733e-05 +228.0,0.0,7.547095802227584e-05,-6.560590289905227e-05 +229.0,0.0,7.660444431189648e-05,-6.427876096865552e-05 +230.0,0.0,7.771459614569578e-05,-6.293203910498536e-05 +231.0,0.0,7.88010753606709e-05,-6.156614753256749e-05 +232.0,0.0,7.9863551004728e-05,-6.018150231520652e-05 +233.0,0.0,8.090169943749347e-05,-5.877852522924905e-05 +234.0,0.0,8.191520442889793e-05,-5.735764363510638e-05 +235.0,0.0,8.290375725550293e-05,-5.59192903470765e-05 +236.0,0.0,8.386705679454121e-05,-5.446390350150456e-05 +237.0,0.0,8.480480961564141e-05,-5.299192642332239e-05 +238.0,0.0,8.571673007021006e-05,-5.1503807491007346e-05 +239.0,0.0,8.660254037844273e-05,-5.000000000000197e-05 +240.0,0.0,8.746197071393847e-05,-4.84809620246357e-05 +241.0,0.0,8.829475928589161e-05,-4.6947156278591105e-05 +242.0,0.0,8.910065241883574e-05,-4.5399049973956746e-05 +243.0,0.0,8.987940462991567e-05,-4.383711467890985e-05 +244.0,0.0,9.063077870366399e-05,-4.226182617407208e-05 +245.0,0.0,9.135454576425911e-05,-4.06736643075822e-05 +246.0,0.0,9.205048534524308e-05,-3.9073112848929586e-05 +247.0,0.0,9.271838545667784e-05,-3.7460659341593446e-05 +248.0,0.0,9.33580426497193e-05,-3.583679495453231e-05 +249.0,0.0,9.396926207858998e-05,-3.420201433256919e-05 +250.0,0.0,9.455185755993087e-05,-3.2556815445718014e-05 +251.0,0.0,9.510565162951458e-05,-3.0901699437497125e-05 +252.0,0.0,9.563047559630281e-05,-2.9237170472276088e-05 +253.0,0.0,9.612616959383119e-05,-2.7563735581702364e-05 +254.0,0.0,9.659258262890617e-05,-2.588190451025455e-05 +255.0,0.0,9.702957262759902e-05,-2.419218955996928e-05 +256.0,0.0,9.743700647852293e-05,-2.2495105434389034e-05 +257.0,0.0,9.781476007338e-05,-2.0791169081778497e-05 +258.0,0.0,9.816271834476589e-05,-1.9080899537657073e-05 +259.0,0.0,9.848077530122034e-05,-1.7364817766695653e-05 +260.0,0.0,9.876883405951335e-05,-1.5643446504025735e-05 +261.0,0.0,9.902680687415665e-05,-1.3917310096009218e-05 +262.0,0.0,9.925461516413187e-05,-1.218693434051745e-05 +263.0,0.0,9.945218953682704e-05,-1.0452846326768074e-05 +264.0,0.0,9.96194698091743e-05,-8.715574274768568e-06 +265.0,0.0,9.975640502598223e-05,-6.975647374415304e-06 +266.0,0.0,9.986295347545723e-05,-5.23359562429718e-06 +267.0,0.0,9.993908270190947e-05,-3.4899496702529158e-06 +268.0,0.0,9.998476951563907e-05,-1.7452406437311914e-06 +269.0,0.0,9.999999999999999e-05,-2.860540645027611e-18 +270.0,0.0,9.998476951563917e-05,1.7452406437254714e-06 +271.0,0.0,9.993908270190969e-05,3.4899496702471983e-06 +272.0,0.0,9.986295347545754e-05,5.233595624291466e-06 +273.0,0.0,9.975640502598263e-05,6.975647374409598e-06 +274.0,0.0,9.961946980917481e-05,8.715574274762869e-06 +275.0,0.0,9.945218953682763e-05,1.0452846326762384e-05 +276.0,0.0,9.925461516413256e-05,1.218693434051177e-05 +277.0,0.0,9.902680687415744e-05,1.3917310096003553e-05 +278.0,0.0,9.876883405951424e-05,1.5643446504020087e-05 +279.0,0.0,9.848077530122133e-05,1.736481776669002e-05 +280.0,0.0,9.816271834476698e-05,1.9080899537651462e-05 +281.0,0.0,9.781476007338121e-05,2.0791169081772903e-05 +282.0,0.0,9.743700647852421e-05,2.249510543438346e-05 +283.0,0.0,9.70295726276004e-05,2.419218955996373e-05 +284.0,0.0,9.659258262890763e-05,2.5881904510249023e-05 +285.0,0.0,9.612616959383277e-05,2.7563735581696862e-05 +286.0,0.0,9.563047559630449e-05,2.9237170472270612e-05 +287.0,0.0,9.510565162951636e-05,3.090169943749168e-05 +288.0,0.0,9.455185755993274e-05,3.255681544571261e-05 +289.0,0.0,9.396926207859195e-05,3.420201433256381e-05 +290.0,0.0,9.335804264972136e-05,3.5836794954526964e-05 +291.0,0.0,9.271838545667996e-05,3.746065934158815e-05 +292.0,0.0,9.205048534524532e-05,3.907311284892432e-05 +293.0,0.0,9.135454576426144e-05,4.067366430757697e-05 +294.0,0.0,9.06307787036664e-05,4.2261826174066904e-05 +295.0,0.0,8.987940462991818e-05,4.383711467890471e-05 +296.0,0.0,8.910065241883834e-05,4.539904997395165e-05 +297.0,0.0,8.82947592858943e-05,4.694715627858606e-05 +298.0,0.0,8.746197071394126e-05,4.8480962024630696e-05 +299.0,0.0,8.66025403784456e-05,4.999999999999701e-05 +300.0,0.0,8.571673007021301e-05,5.150380749100244e-05 +301.0,0.0,8.480480961564445e-05,5.299192642331754e-05 +302.0,0.0,8.38670567945443e-05,5.446390350149976e-05 +303.0,0.0,8.290375725550615e-05,5.591929034707175e-05 +304.0,0.0,8.19152044289012e-05,5.735764363510169e-05 +305.0,0.0,8.090169943749684e-05,5.877852522924443e-05 +306.0,0.0,7.986355100473144e-05,6.018150231520196e-05 +307.0,0.0,7.880107536067441e-05,6.156614753256298e-05 +308.0,0.0,7.771459614569937e-05,6.293203910498092e-05 +309.0,0.0,7.660444431190015e-05,6.427876096865114e-05 +310.0,0.0,7.54709580222796e-05,6.560590289904795e-05 +311.0,0.0,7.43144825477419e-05,6.691306063588308e-05 +312.0,0.0,7.313537016191957e-05,6.819983600624714e-05 +313.0,0.0,7.19339800338677e-05,6.946583704589703e-05 +314.0,0.0,7.07106781186574e-05,7.07106781186521e-05 +315.0,0.0,6.946583704590244e-05,7.193398003386248e-05 +316.0,0.0,6.819983600625262e-05,7.313537016191446e-05 +317.0,0.0,6.691306063588866e-05,7.431448254773687e-05 +318.0,0.0,6.560590289905361e-05,7.547095802227468e-05 +319.0,0.0,6.427876096865689e-05,7.660444431189531e-05 +320.0,0.0,6.293203910498676e-05,7.771459614569464e-05 +321.0,0.0,6.156614753256888e-05,7.880107536066979e-05 +322.0,0.0,6.018150231520794e-05,7.986355100472693e-05 +323.0,0.0,5.8778525229250485e-05,8.090169943749244e-05 +324.0,0.0,5.7357643635107844e-05,8.191520442889691e-05 +325.0,0.0,5.5919290347077975e-05,8.290375725550196e-05 +326.0,0.0,5.446390350150605e-05,8.386705679454022e-05 +327.0,0.0,5.299192642332389e-05,8.480480961564048e-05 +328.0,0.0,5.150380749100887e-05,8.571673007020915e-05 +329.0,0.0,5.0000000000003506e-05,8.660254037844184e-05 +330.0,0.0,4.8480962024637256e-05,8.74619707139376e-05 +331.0,0.0,4.6947156278592683e-05,8.829475928589077e-05 +332.0,0.0,4.539904997395834e-05,8.910065241883492e-05 +333.0,0.0,4.3837114678911455e-05,8.987940462991489e-05 +334.0,0.0,4.22618261740737e-05,9.063077870366323e-05 +335.0,0.0,4.0673664307583824e-05,9.13545457642584e-05 +336.0,0.0,3.907311284893123e-05,9.205048534524239e-05 +337.0,0.0,3.74606593415951e-05,9.271838545667716e-05 +338.0,0.0,3.583679495453397e-05,9.335804264971866e-05 +339.0,0.0,3.420201433257086e-05,9.396926207858939e-05 +340.0,0.0,3.2556815445719695e-05,9.455185755993029e-05 +341.0,0.0,3.090169943749882e-05,9.510565162951402e-05 +342.0,0.0,2.923717047227779e-05,9.563047559630228e-05 +343.0,0.0,2.756373558170408e-05,9.612616959383069e-05 +344.0,0.0,2.5881904510256274e-05,9.659258262890569e-05 +345.0,0.0,2.4192189559971007e-05,9.702957262759859e-05 +346.0,0.0,2.2495105434390772e-05,9.743700647852253e-05 +347.0,0.0,2.0791169081780242e-05,9.781476007337964e-05 +348.0,0.0,1.908089953765882e-05,9.816271834476555e-05 +349.0,0.0,1.7364817766697412e-05,9.848077530122003e-05 +350.0,0.0,1.5643446504027497e-05,9.876883405951308e-05 +351.0,0.0,1.3917310096010983e-05,9.902680687415641e-05 +352.0,0.0,1.2186934340519218e-05,9.925461516413164e-05 +353.0,0.0,1.0452846326769846e-05,9.945218953682686e-05 +354.0,0.0,8.715574274770343e-06,9.961946980917414e-05 +355.0,0.0,6.975647374417082e-06,9.97564050259821e-05 +356.0,0.0,5.23359562429896e-06,9.986295347545714e-05 +357.0,0.0,3.489949670254698e-06,9.993908270190941e-05 +358.0,0.0,1.7452406437329738e-06,9.998476951563905e-05 +359.0,0.0,4.643020718423598e-18,9.999999999999999e-05 diff --git a/src/rotating_field.py b/src/rotating_field.py index 9ad6188..bbcfebd 100644 --- a/src/rotating_field.py +++ b/src/rotating_field.py @@ -3,18 +3,18 @@ import matplotlib.pyplot as plt plot_fontsize = 12 -in_rotvector = [0, 0, 1] # [-] +in_rot_vector = [0, 0, 1] # [-] in_rotcenter = [0, 0, 0] # [uT] in_rotmag = 10 # [uT] in_rotrate = 1 # [deg/s] in_timestep = 1 # [s] # Normalize rotation vector -if np.linalg.norm(in_rotvector)==0: +if np.linalg.norm(in_rot_vector)==0: # ui_print("Error: Rotation axis cannot be singular.") raise ValueError('Zero vector for rotation axis given!') else: - v = in_rotvector / np.linalg.norm(in_rotvector) + v = in_rot_vector / np.linalg.norm(in_rot_vector) # Find perpendiculat vectors if v[1] == 0 and v[2] == 0: a = np.cross(v, [0, 1, 0]) diff --git a/src/user_interface.py b/src/user_interface.py index f4a19c8..f66ece9 100644 --- a/src/user_interface.py +++ b/src/user_interface.py @@ -27,7 +27,7 @@ import src.csv_logging as log from src.calibration import AmbientFieldCalibration, CoilConstantCalibration, MagnetometerCalibrationSimple, \ MagnetometerCalibrationComplete from src.exceptions import DeviceAccessError, MagFieldOutOfBounds -from src.utility import ui_print, save_dict_list_to_csv, load_dict_list_from_csv +from src.utility import ui_print, save_dict_list_to_csv, save_dict_list_to_csv2, load_dict_list_from_csv import src.helmholtz_cage_device as helmholtz_cage_device # Define global font styles: @@ -43,6 +43,7 @@ DEFAULT_FONT = (font, points[2]) target_values = [np.nan, np.nan, np.nan, np.nan] + class HelmholtzGUI(Tk): # main application window, almost everything else here is called from this class # Inherited base class: Tk(), main application window class @@ -407,6 +408,13 @@ class ExecuteCSVMode(Frame): self.z_override = BooleanVar(value=False) # True to disable connection check for Z PSU self.arduino_override = BooleanVar(value=False) # True to disable connection check for arduino + # Generate CSV sequence variables + self.rot_vector_vars = [DoubleVar(value=1), DoubleVar(value=0), DoubleVar(value=0)] + self.rot_center_vars = [DoubleVar(value=0), DoubleVar(value=0), DoubleVar(value=0)] + self.rot_mag_vars = StringVar(value=100) + self.rot_rate_vars = StringVar(value=1) + self.time_step_vars = StringVar(value=1) + # --- UI ELEMENTS --- row_counter = 0 # keep track of which grid row we are in @@ -480,6 +488,81 @@ class ExecuteCSVMode(Frame): self.plot_canvas = None # Is generated upon plotting + # Second panel with CSV generator + # setup header + col_counter = 1 + row_counter = 0 # reset row counter + header = Label(self, text="Generate CSV File", font=HEADER_FONT, padx=100, pady=3) + header.grid(row=row_counter, column=col_counter, padx=100, sticky=W) + row_counter += 1 + generate_csv_button_frame = Frame(self) + generate_csv_button_frame.grid(row=row_counter, column=col_counter, padx=100, sticky=W) + # Generate and export csv sequence + self.generate_export_csv_button = Button(generate_csv_button_frame, text=" Generate and Export to CSV", + command=self.export_csv_sequence, + state="normal", + pady=5, padx=5) + self.generate_export_csv_button.grid(row=0, column=0, padx=5, pady=5) + # Generate and export csv sequence + self.generate_load_csv_button = Button(generate_csv_button_frame, text=" Generate and Load Sequence", + command=self.generate_load_csv_sequence, + state="normal", + pady=5, padx=5) + self.generate_load_csv_button.grid(row=0, column=1, padx=5, pady=5) + row_counter += 1 + info_text = Label(self, text="Generate data of a circular, counter clockwise motion around an arbitrary axis and strength.", + padx=100, pady=3) + info_text.grid(row=row_counter, column=col_counter, padx=0, sticky=W) + row_counter += 1 + + # Inputs and generation button + input_csv_gen_frame = LabelFrame(self, text="Input Parameters for Rotating Magnetic Field") + input_csv_gen_frame.grid(row=row_counter, column=col_counter, padx=(100, 0), pady=20, sticky="nw") + for i, label in enumerate(['X', 'Y', 'Z']): + axis_label = Label(input_csv_gen_frame, text=label) + axis_label.grid(row=row_counter, column=i + 1, padx=5, pady=5, sticky="nw") + row_counter += 1 + rot_vector_label = Label(input_csv_gen_frame, text="Axis of rotation: ") + rot_vector_label.grid(row=row_counter, column=0, padx=5, pady=5, sticky="nw") + for i in range(3): + rot_vector_data = Entry(input_csv_gen_frame, + textvariable=self.rot_vector_vars[i], + width=15) + rot_vector_data.grid(row=row_counter, column=i + 1, padx=5, pady=5, sticky="nw") + rot_vector_unit = Label(input_csv_gen_frame, text="-") + rot_vector_unit.grid(row=row_counter, column=4, padx=5, pady=5, sticky="nw") + row_counter += 1 + rot_center_label = Label(input_csv_gen_frame, text="Center of rotation: ") + rot_center_label.grid(row=row_counter, column=0, padx=5, pady=5, sticky="nw") + for i in range(3): + rot_center_data = Entry(input_csv_gen_frame, + textvariable=self.rot_center_vars[i], + width=15) + rot_center_data.grid(row=row_counter, column=i + 1, padx=5, pady=5, sticky="nw") + rot_center_unit = Label(input_csv_gen_frame, text="\u03BCT") + rot_center_unit.grid(row=row_counter, column=4, padx=5, pady=5, sticky="nw") + row_counter += 1 + rot_mag_label = Label(input_csv_gen_frame, text="Field magnitude: ") + rot_mag_label.grid(row=row_counter, column=0, padx=5, pady=5, sticky="nw") + rot_mag_data = Entry(input_csv_gen_frame, textvariable=self.rot_mag_vars, width=15) + rot_mag_data.grid(row=row_counter, column=1, padx=5, pady=5, sticky="nw") + rot_mag_unit = Label(input_csv_gen_frame, text="\u03BCT") + rot_mag_unit.grid(row=row_counter, column=4, padx=5, pady=5, sticky="nw") + row_counter += 1 + rot_rate_label = Label(input_csv_gen_frame, text="Rotation rate: ") + rot_rate_label.grid(row=row_counter, column=0, padx=5, pady=5, sticky="nw") + rot_rate_data = Entry(input_csv_gen_frame, textvariable=self.rot_rate_vars, width=15) + rot_rate_data.grid(row=row_counter, column=1, padx=5, pady=5, sticky="nw") + rot_rate_unit = Label(input_csv_gen_frame, text="\u00b0/s") + rot_rate_unit.grid(row=row_counter, column=4, padx=5, pady=5, sticky="s") + row_counter += 1 + time_step_label = Label(input_csv_gen_frame, text="Time step: ") + time_step_label.grid(row=row_counter, column=0, padx=5, pady=5, sticky="nw") + time_step_data = Entry(input_csv_gen_frame, textvariable=self.time_step_vars, width=15) + time_step_data.grid(row=row_counter, column=1, padx=5, pady=5, sticky="nw") + time_step_unit = Label(input_csv_gen_frame, text="s") + time_step_unit.grid(row=row_counter, column=4, padx=5, pady=5, sticky="s") + def page_switch(self): # function that is called when switching to this window # every class in the UI needs this, even if it doesn't do anything pass @@ -570,7 +653,8 @@ class ExecuteCSVMode(Frame): figure = csv_threading.plot_field_sequence(self.sequence_array, width, height) # create figure to be displayed # Clear previous plots first try: - self.plot_canvas.get_tk_widget().destroy() + if self.plot_canvas != None: + self.plot_canvas.get_tk_widget().destroy() except Exception as e: ui_print("Something went wrong while plotting csv data!", e) messagebox.showerror("Error!", "Something went wrong while plotting csv data: \n%s" % e) @@ -581,6 +665,132 @@ class ExecuteCSVMode(Frame): self.plot_canvas.draw() # equivalent to matplotlib.show() self.plot_canvas.get_tk_widget().grid(row=0, column=0, sticky="nesw") # place canvas in the UI + def export_csv_sequence(self): # Generate and export csv sequence + # Generate rotation data + t, x, y, z = self.generate_csv_sequence() + # Assemble data to export + rot_sequence = dict(enumerate(t)) + for i in range(len(t)): + rot_sequence[i] = {'Time (s)': t[i], 'xField (T)': x[i], 'yField (T)': y[i], 'zField (T)': z[i]} + # Save dictionary to disk + save_dict_list_to_csv2('test_sequence_rotation.csv', rot_sequence, query_path=True) + ui_print("Saved test sequence to disc.") + print("Flag1") + + def generate_load_csv_sequence(self): # Generate and load csv sequence + # Generate rotation data + t, x, y, z = self.generate_csv_sequence() + # Write data into array + temp_array = np.ndarray((len(t),4)) + for i in range(len(t)): + temp_array[i] = [t[i], x[i], y[i], z[i]] + self.sequence_array = temp_array + try: # try to check the values and display the plot + csv_threading.check_array_ok(self.sequence_array) # check for values exceeding limits + self.sequence_array_ok = True # Has nothing to do with limits. Just means the data was parsed + self.display_plot() # plot data and display + except Exception as e: # something went wrong + self.sequence_array_ok = False + # display error messages: + ui_print("Error while plotting rotation sequence:", e) + messagebox.showerror("Error!", "Error while plotting rotation sequence: \n%s" % e) + else: # nothing went wrong + self.execute_button["state"] = "normal" # activate run button --> enable execution + + + def generate_csv_sequence(self): + # Some fixed values + rot_center_gmean_max = 100 # [µT] Maximum geometric mean + rot_center_default = [0, 0, 0] # [µT] + rot_mag_default = 100 # [µT] + rot_mag_max = 180 # [µT] + rot_rate_default = 1 # [deg/s] + rot_rate_max = 360 # [deg/s] + rot_timestep_default = 1 # [s] + rot_timestep_min = 0.2 # [s] + # Initialize and get vectors + rot_vector = [0, 0, 0] + rot_center = [0, 0, 0] + for i in range(len(rot_vector)): + rot_vector[i] = float(self.rot_vector_vars[i].get()) # [-] + rot_center[i] = float(self.rot_center_vars[i].get()) # [uT] + rot_mag = float(self.rot_mag_vars.get()) # [uT] + rot_rate = float(self.rot_rate_vars.get()) # [deg/s] + rot_time_step = float(self.time_step_vars.get()) # [s] + # Normalize rotation vector + if np.linalg.norm(rot_vector) == 0: + ui_print("Error: Rotation axis cannot be singular.") + raise ValueError('Zero vector for rotation axis given!') + else: + v = rot_vector / np.linalg.norm(rot_vector) + if np.linalg.norm(rot_vector) != 1: + ui_print("Warning: Rotation axis not normalised. Normalising automatically.") + for i in range(len(rot_vector)): + self.rot_vector_vars[i].set("{:.3f}".format(v[i])) + # Checking magnitude + if rot_mag < 0: + ui_print("Warning: Magnetic field magnitude cannot be negative. Changing sign automatically.") + rot_mag = -rot_mag + elif rot_mag ==0: + ui_print("Warning: Magnetic field magnitude cannot be zero. Setting default automatically.") + rot_mag = rot_mag_default + elif rot_mag > rot_mag_max: + ui_print("Warning: Magnetic field magnitude too large. Setting default automatically.") + rot_mag = rot_mag_default + self.rot_mag_vars.set("{:.3f}".format(rot_mag)) + # Checking center point + if np.sqrt(rot_center[0]**2+rot_center[1]**2+rot_center[2]**2) > rot_center_gmean_max: + ui_print("Warning: Rotation center excessive. Setting to zero automatically.") + rot_center = rot_center_default + for i in range(len(rot_center)): + self.rot_center_vars[i].set("{:.3f}".format(rot_center[i])) + # Checking rotation rate + if rot_rate < 0: + ui_print("Warning: Rotation rate cannot be negative. Changing sign automatically.") + rot_rate = -rot_rate + elif rot_mag ==0: + ui_print("Warning: Rotation rate cannot be zero. Setting default automatically.") + rot_rate = rot_rate_default + elif rot_rate > rot_rate_max: + ui_print("Warning: Rotation rate too large. Setting default automatically.") + rot_rate = rot_rate_default + self.rot_rate_vars.set("{:.3f}".format(rot_rate)) + # Check time step + if rot_time_step < 0: + ui_print("Warning: Time step cannot be negative. Changing sign automatically.") + rot_time_step = -rot_time_step + elif rot_time_step ==0: + ui_print("Warning: Time step cannot be zero. Setting default automatically.") + rot_time_step = rot_timestep_default + elif rot_time_step < rot_timestep_min: + ui_print("Warning: Time step too small. Setting default automatically.") + rot_time_step = rot_timestep_default + self.time_step_vars.set("{:.3f}".format(rot_time_step)) + # Find perpendicular vectors + if v[1] == 0 and v[2] == 0: + a = np.cross(v, [0, 1, 0]) + else: + a = np.cross(v, [1, 0, 0]) + b = np.cross(v, a) + # Calculate timing + cycle_time = (360 / rot_rate) / rot_time_step + arr_len = int(np.floor(cycle_time / rot_time_step)) + # Initialize vectors + th = 0 # [rad] + t = np.zeros(arr_len) # [s] + x = np.zeros(arr_len) # [T] + y = np.zeros(arr_len) # [T] + z = np.zeros(arr_len) # [T] + # Calculate vectors + for i in range(arr_len): + th = th + rot_rate * np.pi / 180 + t[i] = i * rot_time_step + x[i] = (rot_center[0] + rot_mag * np.cos(th) * a[0] + rot_mag * np.sin(th) * b[0])*1e-6 + y[i] = (rot_center[1] + rot_mag * np.cos(th) * a[1] + rot_mag * np.sin(th) * b[1])*1e-6 + z[i] = (rot_center[2] + rot_mag * np.cos(th) * a[2] + rot_mag * np.sin(th) * b[2])*1e-6 + # Return vectors + return t, x, y, z + class CalibrateAmbientField(Frame): def __init__(self, parent, controller): @@ -651,22 +861,22 @@ class CalibrateAmbientField(Frame): axis_labels_hh = ['X_hh:', 'Y_hh:', 'Z_hh:', 'T_hh:'] for i in range(4): field_data_axis_label = Label(field_data_frame, text=axis_labels_mgm[i]) - field_data_axis_label.grid(row=i+1, column=0, padx=10, pady=3) + field_data_axis_label.grid(row=i + 1, column=0, padx=10, pady=3) field_data_axis_data = Label(field_data_frame, textvariable=self.field_value_vars[i]) - field_data_axis_data.grid(row=i+1, column=1, padx=(20, 0), pady=3) + field_data_axis_data.grid(row=i + 1, column=1, padx=(20, 0), pady=3) field_data_axis_units = Label(field_data_frame, text="\u03BCT") - field_data_axis_units.grid(row=i+1, column=2, padx=5, pady=3) + field_data_axis_units.grid(row=i + 1, column=2, padx=5, pady=3) field_data_axis_label = Label(field_data_frame, text=axis_labels_hh[i]) - field_data_axis_label.grid(row=i+1, column=3, padx=10, pady=3) + field_data_axis_label.grid(row=i + 1, column=3, padx=10, pady=3) field_data_axis_data = Label(field_data_frame, textvariable=self.target_value_vars[i]) - field_data_axis_data.grid(row=i+1, column=4, padx=(20, 0), pady=3) + field_data_axis_data.grid(row=i + 1, column=4, padx=(20, 0), pady=3) field_data_axis_units = Label(field_data_frame, text="\u03BCT") - field_data_axis_units.grid(row=i+1, column=5, padx=5, pady=3) + field_data_axis_units.grid(row=i + 1, column=5, padx=5, pady=3) row_counter += 1 # Calibration start and reinitialize buttons @@ -840,7 +1050,8 @@ class CalibrateAmbientField(Frame): # Display in uT self.field_value_vars[i].set("{:.3f}".format(new_field[i] * 1e6)) self.target_value_vars[i].set("{:.3f}".format(target_values[i] * 1e6)) - self.field_value_vars[3].set("{:.3f}".format(np.sqrt(new_field[0]**2+new_field[1]**2+new_field[2]**2) * 1e6)) + self.field_value_vars[3].set( + "{:.3f}".format(np.sqrt(new_field[0] ** 2 + new_field[1] ** 2 + new_field[2] ** 2) * 1e6)) self.target_value_vars[3].set("{:.3f}".format(target_values[3] * 1e6)) # Get mpi messages from calibration procedures @@ -1330,7 +1541,8 @@ class CalibrateMagnetometerSimple(Frame): # Display in uT self.field_value_vars[i].set("{:.3f}".format(new_field[i] * 1e6)) self.target_value_vars[i].set("{:.3f}".format(target_values[i] * 1e6)) - self.field_value_vars[3].set("{:.3f}".format(np.sqrt(new_field[0]**2+new_field[1]**2+new_field[2]**2)* 1e6)) + self.field_value_vars[3].set( + "{:.3f}".format(np.sqrt(new_field[0] ** 2 + new_field[1] ** 2 + new_field[2] ** 2) * 1e6)) self.target_value_vars[3].set("{:.3f}".format(target_values[3] * 1e6)) # Get mpi messages from calibration procedures @@ -1749,7 +1961,7 @@ class CalibrateMagnetometerComplete(Frame): state='readonly') axis_data.grid(row=row_counter + row, column=1 + column, padx=5, pady=5, sticky="nw") results_label_unit = Label(calibration_results_frame, text="-") - results_label_unit.grid(row=row_counter + row, column=1 + column+1, padx=5, pady=5, sticky="nw") + results_label_unit.grid(row=row_counter + row, column=1 + column + 1, padx=5, pady=5, sticky="nw") row_counter += 3 """ # A_mat @@ -1774,7 +1986,7 @@ class CalibrateMagnetometerComplete(Frame): state='readonly') axis_data.grid(row=row_counter, column=1 + row, padx=5, pady=5, sticky="nw") results_label_unit = Label(calibration_results_frame, text="T") - results_label_unit.grid(row=row_counter, column=1 + row+1, padx=5, pady=5, sticky="nw") + results_label_unit.grid(row=row_counter, column=1 + row + 1, padx=5, pady=5, sticky="nw") row_counter += 1 # Save calibration buttons @@ -1828,8 +2040,6 @@ class CalibrateMagnetometerComplete(Frame): pady=5, padx=5) self.export_figure_right_button.grid(row=1, column=2, padx=5, pady=5) - # FLAG Buttons - # This starts an endless polling loop self.update_view() @@ -1852,7 +2062,8 @@ class CalibrateMagnetometerComplete(Frame): # Display in uT self.field_value_vars[i].set("{:.3f}".format(new_field[i] * 1e6)) self.target_value_vars[i].set("{:.3f}".format(target_values[i] * 1e6)) - self.field_value_vars[3].set("{:.3f}".format(np.sqrt(new_field[0]**2+new_field[1]**2+new_field[2]**2)* 1e6)) + self.field_value_vars[3].set( + "{:.3f}".format(np.sqrt(new_field[0] ** 2 + new_field[1] ** 2 + new_field[2] ** 2) * 1e6)) self.target_value_vars[3].set("{:.3f}".format(target_values[3] * 1e6)) # Get mpi messages from calibration procedures @@ -2730,10 +2941,10 @@ class StatusDisplay(Frame): self.update_labels(new_status) target_values = [new_status['axes'][0]['target_field'], new_status['axes'][1]['target_field'], - new_status['axes'][2]['target_field'], - np.sqrt(new_status['axes'][0]['target_field']**2 + - new_status['axes'][1]['target_field']**2 + - new_status['axes'][2]['target_field']**2)] + new_status['axes'][2]['target_field'], + np.sqrt(new_status['axes'][0]['target_field'] ** 2 + + new_status['axes'][1]['target_field'] ** 2 + + new_status['axes'][2]['target_field'] ** 2)] except Empty: pass self.controller.after(200, self.update_label_poll_method) diff --git a/src/utility.py b/src/utility.py index 9497720..1c2781c 100644 --- a/src/utility.py +++ b/src/utility.py @@ -31,8 +31,25 @@ def save_dict_list_to_csv(filename, data, query_path=False): csv_writer.writeheader() for row in data: + print(row) csv_writer.writerow(row) +def save_dict_list_to_csv2(filename, data, query_path=False): + """Creates a csv file under the specified path containing one row for each dict in the list 'data'. + The file receives a header containing the keys of the first dict entry. + Each dict should use the same keys.""" + if query_path: + filename = filedialog.asksaveasfilename(initialfile=filename, title="Select csv save location...", + filetypes=(("CSV", "*.csv"),)) + + with open(filename, mode='w', newline='') as csv_file: + fieldnames = data[0].keys() + csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames, delimiter=',', quotechar='"', + quoting=csv.QUOTE_NONNUMERIC) + + csv_writer.writeheader() + for row in data: + csv_writer.writerow(data[row]) # this line makes issues in original file def load_dict_list_from_csv(filename, query_path=False): """ Reads a csv file under the specified path containing one row for each dict in the list 'data'.