import sqlite3 import os import tkinter as tk from tkinter import messagebox import math import numpy as np import math import tkinter as tk import numpy as np from tkinter import messagebox from tkinter import * from PySide6.QtWidgets import QMessageBox # region 各种方法 def to_utf8(text): str1 = text.encode('utf-8') return str1 def jzys1(listy, zxzby, listx, zxzbx, sf): rlist = [] listlen = len(listy) ll = 0 while ll < listlen: # 第一个的值 # num1 = round(((listx[ll] - zxzbx) / sf),0) # num2 = round(((listy[ll] - zxzby) / sf),0) num1 = listx[ll] - zxzbx num2 = listy[ll] - zxzby rlist.append(num1) rlist.append(num2) ll = ll + 1 return rlist def jzys2(listy, zxzby, listx, zxzbx, sf): rlist = [] listlen = len(listy) ll = 0 while ll < listlen: # 第一个的值 num2 = (-1) * (listx[ll] - zxzbx) / sf num1 = (listy[ll] - zxzby) / sf rlist.append(num1) rlist.append(num2) ll = ll + 1 return rlist def jzys3(listy, aa, bb): rlist = [] listlen = len(listy) ll = 0 while ll < listlen: # 第一个的值 num1 = aa num2 = bb rlist.append(num1) rlist.append(num2) ll = ll + 1 return rlist def jzys4(listpasty, zxzbpasty, listpastx, zxzbpastx, listnewy, zxzbnewy, listnewx, zxzbnewx, sf): rlist = [] listlen = len(listnewx) ll = 0 while ll < listlen: num1 = (listpastx[ll] - listnewx[ll] - zxzbpastx + zxzbnewx) / sf num2 = (listpasty[ll] - listnewy[ll] - zxzbpasty + zxzbnewy) / sf rlist.append(num1) rlist.append(num2) ll = ll + 1 return rlist def jzys5(listp, zxzbp, sf): rlist = [] listlen = len(listp) ll = 0 while ll < listlen: num1 = (listp[ll] - zxzbp) / sf rlist.append(num1) ll = ll + 1 return rlist def jzys6(listp, num): rlist = [] listlen = len(listp) ll = 0 while ll < listlen: num1 = listp[ll] * num rlist.append(num1) ll = ll + 1 return rlist def cjh(listp): rp = 0 listlen = len(listp) ll = 0 while ll < listlen: num1 = listp[ll] * listp[ll] rp = rp + num1 ll = ll + 1 return rp def cjh2(lista, listb): rp = 0 listlen = len(lista) ll = 0 while ll < listlen: num1 = lista[ll] * listb[ll] rp = rp + num1 ll = ll + 1 return rp def gsys(listnewp, jxlist1, jylist1, lxlist, lylist, arrz, sf, zxzbnewp, zxzbpastp, ii): # 新x+(矩阵[jx1 jy1 lx1 ly1]*矩阵z)*缩放-新重心坐标x+旧重心坐标x rlist = [] listlen = len(listnewp) ll = 0 while ll < listlen: arr0 = np.array((jxlist1[ll], jylist1[ll], lxlist[2 * ll + ii], lylist[2 * ll + ii])) arr1 = np.matmul(arr0, arrz) arr3 = sf * arr1 newp = listnewp[ll] + arr3 - zxzbnewp + zxzbpastp rlist.append(newp) ll = ll + 1 return rlist def xcys(newlist, pastlist): listlen = len(newlist) ll = 0 rlist = [] while ll < listlen: num1 = newlist[ll] - pastlist[ll] num2 = num1 * 1000 rlist.append(num2) ll = ll + 1 return rlist def takeFirst(elem): return elem[0] # endregion def insert_into_database1(database, pastname, newname, beforename, excelname, listname1, listpastx1, listpasty1, listcgcs1, listbex, listbey, sxylist, wypd, gsx, gsy, listcgcs): # 转换下汉字 utf_tn = to_utf8(excelname) utf_nn = to_utf8(newname) utf_pn = to_utf8(pastname) utf_bn = to_utf8(beforename) utf_bx = to_utf8('变形') utf_wd = to_utf8('稳定') # 将结果输出到数据库 db1 = sqlite3.connect(database) # 获取游标 cursor1 = db1.cursor() # 先清除已有数据,用来更新 try: sqlstr3 = 'delete from WD_Result_Param WHERE TableName = ?' sqlstr4 = 'delete from WD_Result_Point WHERE TableName = ?' cursor1.execute(sqlstr3, (utf_tn,)) cursor1.execute(sqlstr4, (utf_tn,)) except: pass cursor1.execute( 'INSERT INTO WD_Result_Param(TableName,Last_ResultName,New_ResultName,Formula_X1,Formula_X2,Formula_X3,Formula_Y1,Formula_Y2,Formula_Y3) VALUES(?,?,?,?,?,?,?,?,?)', (utf_tn, utf_pn, utf_nn, sxylist[0], sxylist[1], sxylist[2], sxylist[3], sxylist[4], sxylist[5],)) # WD_Result_Point的输入 kk = -1 kk1 = -1 if (-1) in listcgcs: kk = 1 # 记位移点个数 wyd = 0 for lname in listname1: # 获取对应索引号 index1 = listname1.index(lname) PointName = lname First_X = listbex[index1] First_Y = listbey[index1] Last_X = listpastx1[index1] Last_Y = listpasty1[index1] Last_Wight = listcgcs1[index1] New_Wight = listcgcs[index1] # 位移点 if New_Wight == -1: # 获取他原本的坐标和初始改算值进行对比 for smx in jslist: if First_X == smx[0] and First_Y == smx[1]: numa3 = sxylist[0] * jslist1[index1][0] numa4 = sxylist[1] * jslist1[index1][1] numa5 = numa3 + numa4 + sxylist[2] numa6 = sxylist[3] * jslist1[index1][0] numa7 = sxylist[4] * jslist1[index1][1] numa8 = numa6 + numa7 + sxylist[5] Result_X = numa5 Result_Y = numa8 New_Wight = 1 numb1 = (numa5 - First_X) * 1000 numb2 = (numa8 - First_Y) * 1000 numb3 = numb1 * numb1 numb4 = numb2 * numb2 numb5 = math.sqrt(numb3 + numb4) New_FirstX = numb1 New_FirstY = numb2 New_FirstP = numb5 # 新-首有个位移判定 if numb5 > wypd: NFDis_Ass = utf_bx else: NFDis_Ass = utf_wd numc1 = (numa5 - Last_X) * 1000 numc2 = (numa8 - Last_Y) * 1000 numc3 = numc1 * numc1 numc4 = numc2 * numc2 numc5 = math.sqrt(numc3 + numc4) New_LastX = numc1 New_LastY = numc2 New_LastP = numc5 NLDis_Ass = utf_bx kk1 = 1 wyd = wyd + 1 break # 不是位移点 else: # 全部都是稳定点 if kk == -1: num3 = Last_X * Last_Wight num4 = num3 + gsx[index1] num5 = Last_Wight + 1 num6 = num4 / num5 num7 = Last_Y * Last_Wight num8 = num7 + gsy[index1] num10 = num8 / num5 Result_X = num6 Result_Y = num10 New_Wight = num5 numd1 = (num6 - First_X) * 1000 numd2 = (num10 - First_Y) * 1000 numd3 = numd1 * numd1 numd4 = numd2 * numd2 numd5 = math.sqrt(numd3 + numd4) New_FirstX = numd1 New_FirstY = numd2 New_FirstP = numd5 # 新-首有个位移判定 if numd5 > wypd: NFDis_Ass = utf_bx else: NFDis_Ass = utf_wd nume1 = (num6 - Last_X) * 1000 nume2 = (num10 - Last_Y) * 1000 nume3 = nume1 * nume1 nume4 = nume2 * nume2 nume5 = math.sqrt(nume3 + nume4) New_LastX = nume1 New_LastY = nume2 New_LastP = nume5 NLDis_Ass = utf_wd # 有位移点,且已经走过了 if kk == 1 and kk1 == 1: num3 = Last_X * Last_Wight num4 = num3 + gsx[index1 - wyd] num5 = Last_Wight + 1 num6 = num4 / num5 num7 = Last_Y * Last_Wight num8 = num7 + gsy[index1 - wyd] num10 = num8 / num5 Result_X = num6 Result_Y = num10 New_Wight = num5 numd1 = (num6 - First_X) * 1000 numd2 = (num10 - First_Y) * 1000 numd3 = numd1 * numd1 numd4 = numd2 * numd2 numd5 = math.sqrt(numd3 + numd4) New_FirstX = numd1 New_FirstY = numd2 New_FirstP = numd5 # 新-首有个位移判定 if numd5 > wypd: NFDis_Ass = utf_bx else: NFDis_Ass = utf_wd nume1 = (num6 - Last_X) * 1000 nume2 = (num10 - Last_Y) * 1000 nume3 = nume1 * nume1 nume4 = nume2 * nume2 nume5 = math.sqrt(nume3 + nume4) New_LastX = nume1 New_LastY = nume2 New_LastP = nume5 NLDis_Ass = utf_wd # 有位移点,但没有走过 if kk == 1 and kk1 == -1: num3 = Last_X * Last_Wight num4 = num3 + gsx[index1] num5 = Last_Wight + 1 num6 = num4 / num5 num7 = Last_Y * Last_Wight num8 = num7 + gsy[index1] num10 = num8 / num5 Result_X = num6 Result_Y = num10 New_Wight = num5 numd1 = (num6 - First_X) * 1000 numd2 = (num10 - First_Y) * 1000 numd3 = numd1 * numd1 numd4 = numd2 * numd2 numd5 = math.sqrt(numd3 + numd4) New_FirstX = numd1 New_FirstY = numd2 New_FirstP = numd5 # 新-首有个位移判定 if numd5 > wypd: NFDis_Ass = utf_bx else: NFDis_Ass = utf_wd nume1 = (num6 - Last_X) * 1000 nume2 = (num10 - Last_Y) * 1000 nume3 = nume1 * nume1 nume4 = nume2 * nume2 nume5 = math.sqrt(nume3 + nume4) New_LastX = nume1 New_LastY = nume2 New_LastP = nume5 NLDis_Ass = utf_wd # 在这里整体输出 cursor1.execute( 'INSERT INTO WD_Result_Point(TableName,First_ResultName,Last_ResultName,New_ResultName,First_X,First_Y,Last_X,Last_Y,Result_X,Result_Y,Last_Wight,New_Wight,New_FirstX,New_FirstY,New_FirstP,NFDis_Ass,New_LastX,New_LastY,New_LastP,NLDis_Ass,PointName) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', ( utf_tn, utf_bn, utf_pn, utf_nn, First_X, First_Y, Last_X, Last_Y, Result_X, Result_Y, Last_Wight, New_Wight, New_FirstX, New_FirstY, New_FirstP, NFDis_Ass, New_LastX, New_LastY, New_LastP, NLDis_Ass, PointName,)) # 数据库执行 db1.commit() # 做完一切后,先关闭游标,再关闭数据库 cursor1.close() db1.close() gszbx = [] gszby = [] jslist = [] jslist1 = [] def bhjs(listcgcs1, listname1, listpastx1, listpasty1, wypd, listname, listnewx, listnewy, listpastx, listpasty, points, listcgcs, listbex, listbey, sf, dbpath, befname, finalname, lastname, js, file_name): np.set_printoptions(suppress=False) # pt用于给点数point计数 # point会随着回递函数而减少 pt = 0 sumnewx = 0 sumnewy = 0 sumpastx = 0 sumpasty = 0 while pt < points: sumnewx = sumnewx + listnewx[pt] sumnewy = sumnewy + listnewy[pt] sumpastx = sumpastx + listpastx[pt] sumpasty = sumpasty + listpasty[pt] pt = pt + 1 # 计算4个重心坐标(最新一期和上一期的) zxzbnewx = round((sumnewx / points), 7) zxzbnewy = round((sumnewy / points), 7) zxzbpastx = round((sumpastx / points), 7) zxzbpasty = round((sumpasty / points), 7) # 先计算平移参数 # pycsx = abs(zxzbnewx - zxzbpastx) * 1000 # pycsy = abs(zxzbnewy - zxzbpasty) * 1000 pycsx = abs(zxzbnewx - zxzbpastx) pycsy = abs(zxzbnewy - zxzbpasty) # 分别得k,sita的值 klist = jzys1(listnewy, zxzbnewy, listnewx, zxzbnewx, sf) slist = jzys2(listnewy, zxzbnewy, listnewx, zxzbnewx, sf) # 得dx,dy dxlist = jzys3(listnewy, 1, 0) dylist = jzys3(listnewy, 0, 1) # 矩阵太难用了,还是手动计算 # 分别计算k、s、dx、dy的乘积和 k2 = cjh(klist) s2 = cjh(slist) dx2 = cjh(dxlist) dy2 = cjh(dylist) # 这里再创建矩阵1 arr1 = np.array(((k2, 0, 0, 0), (0, s2, 0, 0), (0, 0, dx2, 0), (0, 0, 0, dy2))) # 矩阵1的逆矩阵矩阵2 arr2 = np.linalg.inv(arr1) # 求矩阵l llist = jzys4(listpasty, zxzbpasty, listpastx, zxzbpastx, listnewy, zxzbnewy, listnewx, zxzbnewx, sf) # 得到数列e1,e2,e3,e4 e1 = cjh2(klist, llist) e2 = cjh2(slist, llist) e3 = cjh2(dxlist, llist) e4 = cjh2(dylist, llist) arrl = np.array(((e1), (e2), (e3), (e4))) # 得到矩阵z arrz = np.matmul(arr2, arrl) # 求转换矩阵 jxlist1 = jzys5(listnewx, zxzbnewx, sf) jylist1 = jzys5(listnewy, zxzbnewy, sf) jxlist2 = jylist1 # jylist2 = jxlist1 * (-1) jylist2 = jzys6(jxlist1, -1) lxlist = jzys3(jylist1, 1, 0) lylist = jzys3(jylist1, 0, 1) # 求改算坐标 gsx = gsys(listnewx, jxlist1, jylist1, lxlist, lylist, arrz, sf, zxzbnewx, zxzbpastx, 0) gsy = gsys(listnewy, jxlist2, jylist2, lxlist, lylist, arrz, sf, zxzbnewy, zxzbpasty, 1) # 还是要先求较差 xcx = xcys(gsx, listpastx) xcy = xcys(gsy, listpasty) # 这里记录下第一次所有点的改算坐标 if js == 0: lengs = len(gsx) xx = 0 while xx < lengs: gszbx.append(gsx[xx]) gszby.append(gsy[xx]) zblist1 = [] zblist1.append(listbex[xx]) zblist1.append(listbey[xx]) zblist1.append(gsx[xx]) zblist1.append(gsy[xx]) zblist1.append(xcx[xx]) zblist1.append(xcy[xx]) jslist.append(zblist1) zblist2 = [] zblist2.append(listnewx[xx]) zblist2.append(listnewy[xx]) jslist1.append(zblist2) xx = xx + 1 # 后面不需要经过这个if # 判定方式是用差值平方和和位移对比 gxpd = 0 lenxc = len(xcx) yy = 0 while yy < lenxc: sumxcx = xcx[yy] * xcx[yy] sumxcy = xcy[yy] * xcy[yy] sumxc = sumxcx + sumxcy xcpd = math.sqrt(sumxc) if xcpd > wypd: gxpd = -1 break yy = yy + 1 if gxpd == 0: # 输出之前把转换参数都算出来 # X=(z1+1)*x+z2*y+(旧重心坐标x-新重心坐标x-新重心坐标x*z1-新重心坐标y*z2+z3) # Y=(-z2)*x+(z1+1)*y+(z1*新重心坐标y+新重心坐标x*z2+z4+旧重心坐标y-新重心坐标y) n1 = float(arrz[0]) + 1 n2 = float(arrz[1]) s1 = zxzbnewx * float(arrz[0]) s2 = zxzbnewy * float(arrz[1]) n3 = zxzbpastx - zxzbnewx - s1 - s2 + float(arrz[2]) n4 = (-1) * float(arrz[1]) n5 = n1 s3 = (-1) * float(arrz[0]) * zxzbnewy s4 = float(arrz[1]) * zxzbnewx n6 = s3 + s4 + float(arrz[3]) + zxzbpasty - zxzbnewy sxylist = [] sxylist.append(n1) sxylist.append(n2) sxylist.append(n3) sxylist.append(n4) sxylist.append(n5) sxylist.append(n6) # 输出 relist1 = [] relist1.append(listname) relist1.append(xcx) relist1.append(xcy) relist1.append(listcgcs) relist1.append(gszbx) relist1.append(gszby) relist1.append(sxylist) # 存入数据库 insert_into_database1(dbpath, lastname, finalname, befname, file_name, listname1, listpastx1, listpasty1, listcgcs1, listbex, listbey, sxylist, wypd, gsx, gsy, listcgcs) else: # 先把所有的合在一起,方便删除 lenlist1 = len(xcx) ii = 0 relist1 = [] while ii < lenlist1: smlist1 = [] nn2 = xcx[ii] * xcx[ii] mm2 = xcy[ii] * xcy[ii] nm2 = math.sqrt(nn2 + mm2) smlist1.append(nm2) smlist1.append(listname[ii]) smlist1.append(listnewx[ii]) smlist1.append(listnewy[ii]) smlist1.append(listpastx[ii]) smlist1.append(listpasty[ii]) relist1.append(smlist1) ii = ii + 1 # 直接删除最大的那个 relist1.sort(key=takeFirst, reverse=True) num1 = relist1[0] # 获取name num2 = num1[1] ii2 = 0 mm2 = 0 while ii2 < lenlist1: if listname[ii2] == num2: del listname[ii2] del listnewx[ii2] del listnewy[ii2] del listpastx[ii2] del listpasty[ii2] points = points - 1 break else: ii2 = ii2 + 1 while mm2 < len(listcgcs): if listname1[mm2] == num2: listcgcs[mm2] = -1 break else: mm2 = mm2 + 1 print(" Finish!") js1 = 1 bhjs(listcgcs1, listname1, listpastx1, listpasty1, wypd, listname, listnewx, listnewy, listpastx, listpasty, points, listcgcs, listbex, listbey, sf, dbpath, befname, finalname, lastname, js1, file_name) def tablein(dbpath, file_name): # 收集每一列的数据,方便后期计算 listname1 = [] listpastx1 = [] listpasty1 = [] listcgcs1 = [] listname = [] listnewx = [] listnewy = [] listpastx = [] listpasty = [] # 成果次数 listcgcs = [] # 最早的 listbex = [] listbey = [] points = 0 # 查询,提取需要的数据 db2 = sqlite3.connect(dbpath) cursor2 = db2.cursor() utfstr1 = to_utf8(file_name) sqlstr1 = 'SELECT * FROM WD_Input_Point WHERE TableName = ?' cursor2.execute(sqlstr1, (utfstr1,)) all_da = cursor2.fetchall() for da in all_da: listbex.append(da[4]) listbey.append(da[5]) listpastx.append(da[6]) listpastx1.append(da[6]) listpasty.append(da[7]) listpasty1.append(da[7]) listnewx.append(da[8]) listnewy.append(da[9]) listcgcs.append(da[10]) listcgcs1.append(da[10]) points = points + 1 listname.append(da[11]) listname1.append(da[11]) sqlstr2 = 'SELECT * FROM WD_Input_Param WHERE TableName = ?' cursor2.execute(sqlstr2, (utfstr1,)) all_par = cursor2.fetchall() befname = all_par[0][0].decode('utf-8') lastname = all_par[0][1].decode('utf-8') finalname = all_par[0][2].decode('utf-8') # pjbc是平均边长 # fxzwc是方向中误差,zrbzwc是最弱边边长相对中误差,pjbcs是平均边数,pjfxs是平均方向数,sf是缩放值 # 新增总边数zbs,总方向数zfxs # 先计算位移判断值 pjbc = all_par[0][3] fxzwc = all_par[0][4] zbs = all_par[0][5] zfxs = all_par[0][7] sf = all_par[0][9] pjbcs = zbs / points pjfxs = zfxs / points # 再拆细点 wy1 = pjbc / 1000 wy2 = wy1 + 1 wypd1 = wy2 * wy2 / pjbcs # 好像206.265是常数系数 wy3 = pjbc * fxzwc / 206.265 wypd2 = wy3 * wy3 / pjfxs wypd3 = math.sqrt(wypd1 + wypd2) wypd = round((wypd3 * 2 * math.sqrt(2)), 9) wypd0 = wypd js = 0 return listcgcs1, listname1, listpastx1, listpasty1, wypd0, listname, listnewx, listnewy, listpastx, listpasty, points, listcgcs, listbex, listbey, sf, befname, finalname, lastname, js # 主函数 计算 def main_function(file_name, dbpath): try: # 从数据库中调用 listcgcs1, listname1, listpastx1, listpasty1, wypd0, listname, listnewx, listnewy, listpastx, listpasty, points, listcgcs, listbex, listbey, sf, befname, finalname, lastname, js = tablein( dbpath, file_name) # 计算 bhjs(listcgcs1, listname1, listpastx1, listpasty1, wypd0, listname, listnewx, listnewy, listpastx, listpasty, points, listcgcs, listbex, listbey, sf, dbpath, befname, finalname, lastname, js, file_name) QMessageBox.information(None, "提示", f"文件 '{file_name}' 计算成功!") except Exception as e: QMessageBox.critical(None, "错误", f"文件 '{file_name}' 计算失败!错误信息: {str(e)}")