import sqlite3 import os import math import numpy as np import math import numpy as np 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}' 计算成功!") return 1 except Exception as e: QMessageBox.critical(None, "错误", f"文件 '{file_name}' 计算失败!请检查表格是否规范。") return -1