├── readme_images ├── introduction ├── OpenFile.png ├── progress.png └── Main interface.png ├── biaodian.txt ├── LICENSE ├── README.md ├── asstm.py ├── hime_ui2_0.py └── hime_main.py /readme_images/introduction: -------------------------------------------------------------------------------- 1 | 一个没什么用的介绍 2 | -------------------------------------------------------------------------------- /readme_images/OpenFile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HakuRemu/ZhouShen_Hime/HEAD/readme_images/OpenFile.png -------------------------------------------------------------------------------- /readme_images/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HakuRemu/ZhouShen_Hime/HEAD/readme_images/progress.png -------------------------------------------------------------------------------- /readme_images/Main interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HakuRemu/ZhouShen_Hime/HEAD/readme_images/Main interface.png -------------------------------------------------------------------------------- /biaodian.txt: -------------------------------------------------------------------------------- 1 | {'。。。': '...', '。': ' ', '‘': '「', '’': '」', '・・・': '...', '···': '...', '“': '「', '”': '」', '、': ' ', '~': '~', '!': '!', '?': '?', '\u3000': ' ', '【': '「', '】': '」'} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 HakuRemu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZhouShen_Hime 2 | 全自动轴审姬(A1高闪/引号杀手) 3 | 4 | # 介绍 5 | 你是否因为混沌联动的闪轴被闪瞎双眼? 6 | 你是否曾因为轴的A1高闪而头疼不已? 7 | 你是否曾因为翻译在ass里面写小说而血压暴涨? 8 | 9 | 现在有了强强轴审姬!!! 10 | 只要一键,就能光速锤爆轴翻\ 11 | 还能帮你自动修改闪轴\ 12 | 所有用过轴审姬的轴和轴校都哭了(确信 13 | 14 | # 1. 鹿乃也能看懂的轴审姬教程 15 | 因为有了GUI,所以操作起来变得更加简单了\ 16 | ![image](https://github.com/HakuRemu/ZhouShen_Hime/blob/master/readme_images/Main%20interface.png)\ 17 | GUI界面里面的无脑改闪轴默认是关闭的,所以需要的话要手动点出来\ 18 | 点击“打开文件”就可以打开要锤的ass文件了,为了避免调戏轴审姬,所以默认只能打开ass文件\ 19 | 顺带一提,默认的轴审姬打开ass文件是在main程序所在的文件夹里面,所以为了方便起见建议把exe程序丢到你经常放ass文件的文件夹里面\ 20 | ![image](https://github.com/HakuRemu/ZhouShen_Hime/blob/master/readme_images/OpenFile.png)\ 21 | 打开文件之后,会显示ass文件的路径,文件打开成功会显示“文件读取成功!”\ 22 | 接下来就是开始锤轴的时候了!\ 23 | ![image](https://github.com/HakuRemu/ZhouShen_Hime/blob/master/readme_images/progress.png)\ 24 | 锤轴时候的显示和之前的一样,在锤完之后会自动把改过的txt和ass文件保存到输入ass文件所在的目录里面 25 | 26 | # 2. 轴审姬的特性及高级使用方式 27 | 根据目前vtb字幕组的闪轴原则,单行轴时间少于500ms或者轴和轴之间时间少于300ms则被认为是闪轴\ 28 | 不过,在多人联动时,可能每个人的轴都在300ms外,但是合在一起时经常会少于300ms 29 | 30 | 还有一种情况是一边是连轴,但是另一个人的轴和连轴中的其中一个时间少于300ms\ 31 | 这时候就会被锤成闪轴,但实际上并不算\ 32 | 后来花费了好几天解决了这个问题\ 33 | 现在的轴审姬可以完美应付各类联动(嚣张.jpg) 34 | 35 | 因为歌回里面的歌轴是不用锤的,所以轴审姬跳过了所有的特效轴 36 | 37 | 文件里面附带了可定制的标点符号替换方案(biaodian.txt)\ 38 | 里面的格式是'需要替换的符号':'替换成的符号',不过现在改进了txt的显示方式,理解起来应该不会存在困难\ 39 | 标点替换那里做了简单的错误显示,不过只能检查低级错误,因此如果轴审姬在使用过程中出现错误的话,尝试删除biaodian.txt文件,让轴审姬给你生成一个默认的标点替换txt文件 40 | 41 | # 3. 最后想说的话 42 | 这个轴审姬是我2月末开始写的\ 43 | 当时是看到某位校对直播校对\ 44 | 然后看到他因为很多简单的轴的问题而头疼不已,也就想写一个能自动查轴的程序\ 45 | (其实实际上是想写这个来练习一下Python编程)\ 46 | 结果写出来实际用的时候遇到了数不清的问题,才发现这个东西一点都不简单\ 47 | 不过目前的版本已经稳定下来,可以放心大胆放到github上面了\ 48 | 虽说轴审姬的速度还是挺快的(2k条轴差不多5s-10s),不过不过非常欢迎哪位大佬用c++重新写一个出来\ 49 | \ 50 | 更新于2020/6/23\ 51 | 经过数天的努力,做出了一个简单的轴审姬GUI界面\ 52 | 原本是希望增加拖拽来打开文件的方式,但是发现实在是看不懂网上的教程……\ 53 | 除此之外,原本是想在不对ASS这个类大改的前提下写出python程序的,但是发现pyqt的gui调用ASS这个类之后不能在textbroser里面输出内容,所以如果有哪位大神发个邮件教教我的话那是在是太好了。 54 | -------------------------------------------------------------------------------- /asstm.py: -------------------------------------------------------------------------------- 1 | # 定义ass格式中加时间的函数 2 | # 输入的时间增量单位为秒 3 | # 只能进位一次(这本身就是拿来加几百毫秒时间的) 4 | 5 | 6 | def timeplus(time, plus): 7 | h, m, s=list(map(float, time.split(':'))) 8 | jnw_s = 0 # 秒向分钟进位 9 | jnw_m = 0 # 分向小时进位 10 | 11 | # 算秒 12 | if s+plus > 60: 13 | jnw_s = 1 14 | tp_s = s+plus-60 15 | else: 16 | tp_s = s+plus 17 | # 算分 18 | if m+jnw_s > 60: 19 | jnw_m = 1 20 | tp_m = m+jnw_s-60 21 | else: 22 | tp_m = m+jnw_s 23 | # 算时 24 | tp_h = h+jnw_m 25 | 26 | return '{}:{:0>2d}:{:0>5.2f}'.format(int(tp_h), int(tp_m), tp_s) 27 | 28 | # 定义计算ass格式中减时间的函数 29 | # 输入ass格式的时间和要减去的时间(单位秒),输出减完了之后的时间 30 | # 只能借位一次(尽量只拿来计算几百毫秒的) 31 | 32 | 33 | def timeminus(time, minus): 34 | h, m, s=list(map(float, time.split(':'))) 35 | jew_s = 0 # 秒向分钟借位 36 | jew_m = 0 # 分向小时借位 37 | 38 | if s-minus < 0: 39 | jew_s = 1 40 | tm_s = s-minus+60 41 | else: 42 | tm_s = s-minus 43 | if m-jew_s < 0: 44 | jew_m = 1 45 | tm_m = m-jew_m+60 46 | else: 47 | tm_m = m-jew_s 48 | tm_h = h-jew_m 49 | return '{}:{:0>2d}:{:0>5.2f}'.format(int(tm_h), int(tm_m), tm_s) 50 | 51 | # 定义计算ass格式的时间差的函数 52 | # 前减后(tm1-tm2) 53 | # 输出时间差(单位为秒) 54 | 55 | 56 | def timedelta(tm1, tm2): 57 | h1, m1, s1=list(map(float, tm1.split(':'))) 58 | h2, m2, s2=list(map(float, tm2.split(':'))) 59 | jiewei_m, jiewei_h = 0, 0 # 借位数 60 | 61 | jk_s = s1-s2 62 | if jk_s < 0: # 秒向分钟借位 63 | jiewei_m = 1 64 | jk_s += 60 65 | 66 | jk_m = m1-m2-jiewei_m 67 | if jk_m < 0: # 分向小时借位 68 | jiewei_h = 1 69 | jk_m += 60 70 | 71 | jk_h = h1-h2-jiewei_h 72 | 73 | return float('%.2f' % (jk_h*3600+jk_m*60+jk_s)) 74 | -------------------------------------------------------------------------------- /hime_ui2_0.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '.\zhoushen2.0.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.15.0 6 | # 7 | # WARNING: Any manual changes made to this file will be lost when pyuic5 is 8 | # run again. Do not edit this file unless you know what you are doing. 9 | 10 | 11 | from PyQt5 import QtCore, QtGui, QtWidgets 12 | 13 | from PyQt5.QtGui import QIcon 14 | 15 | 16 | class Ui_MainWindow(object): 17 | def setupUi(self, MainWindow): 18 | MainWindow.setObjectName("MainWindow") 19 | MainWindow.resize(523, 456) 20 | font = QtGui.QFont() 21 | font.setFamily("微软雅黑") 22 | MainWindow.setFont(font) 23 | self.setWindowIcon(QIcon('logo.jpg')) 24 | self.centralwidget = QtWidgets.QWidget(MainWindow) 25 | self.centralwidget.setObjectName("centralwidget") 26 | self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) 27 | self.gridLayout.setObjectName("gridLayout") 28 | self.label = QtWidgets.QLabel(self.centralwidget) 29 | font = QtGui.QFont() 30 | font.setFamily("微软雅黑") 31 | font.setPointSize(28) 32 | self.label.setFont(font) 33 | self.label.setObjectName("label") 34 | self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 35 | # self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget) 36 | # self.graphicsView.setObjectName("graphicsView") 37 | # self.gridLayout.addWidget(self.graphicsView, 0, 2, 1, 1) 38 | self.radioButton = QtWidgets.QRadioButton(self.centralwidget) 39 | self.radioButton.setObjectName("radioButton") 40 | self.gridLayout.addWidget(self.radioButton, 1, 0, 1, 1) 41 | self.StartProgram = QtWidgets.QPushButton(self.centralwidget) 42 | self.StartProgram.setObjectName("StartProgram") 43 | self.gridLayout.addWidget(self.StartProgram, 2, 0, 1, 3) 44 | self.OpenFile = QtWidgets.QPushButton(self.centralwidget) 45 | self.OpenFile.setObjectName("OpenFile") 46 | self.gridLayout.addWidget(self.OpenFile, 1, 2, 1, 1) 47 | self.progressBar = QtWidgets.QProgressBar(self.centralwidget) 48 | self.progressBar.setProperty("value", 24) 49 | self.progressBar.setObjectName("progressBar") 50 | self.gridLayout.addWidget(self.progressBar, 4, 0, 1, 3) 51 | self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) 52 | self.textBrowser.setObjectName("textBrowser") 53 | self.gridLayout.addWidget(self.textBrowser, 3, 0, 1, 3) 54 | MainWindow.setCentralWidget(self.centralwidget) 55 | self.menubar = QtWidgets.QMenuBar(MainWindow) 56 | self.menubar.setGeometry(QtCore.QRect(0, 0, 523, 23)) 57 | self.menubar.setObjectName("menubar") 58 | MainWindow.setMenuBar(self.menubar) 59 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 60 | self.statusbar.setObjectName("statusbar") 61 | MainWindow.setStatusBar(self.statusbar) 62 | 63 | self.retranslateUi(MainWindow) 64 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 65 | 66 | def retranslateUi(self, MainWindow): 67 | _translate = QtCore.QCoreApplication.translate 68 | MainWindow.setWindowTitle(_translate("MainWindow", "自动轴审姬2.0")) 69 | self.label.setText(_translate("MainWindow", "自动轴审姬")) 70 | self.radioButton.setText(_translate("MainWindow", "无脑改闪轴?")) 71 | self.StartProgram.setText(_translate("MainWindow", "给我锤!")) 72 | self.OpenFile.setText(_translate("MainWindow", "打开文件")) -------------------------------------------------------------------------------- /hime_main.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox 4 | from PyQt5.QtCore import QCoreApplication 5 | import os 6 | import re 7 | from asstm import * 8 | 9 | from hime_ui2_0 import Ui_MainWindow 10 | 11 | 12 | biaodian = {'。。。': '...', '。': ' ', '‘': '「', '’': '」', '・・・': '...', '···': '...', 13 | '“': '「', '”': '」', '、': ' ', '~': '~', '!': '!', '?': '?', ' ': ' ', '【': '「', '】': '」'} # 默认要替换的标点 14 | 15 | def open_dict(): 16 | with open('biaodian.txt', 'r', encoding='utf-8') as fx: 17 | lin = fx.readlines() 18 | for i in range(len(lin)): 19 | lin[i] = lin[i].replace('\n', '') 20 | test_dict = {} 21 | new_dict = {} 22 | for i in lin: 23 | tmp_dict = eval(i) 24 | for key, value in tmp_dict.items(): 25 | test_dict[key] = value 26 | new_dict[test_dict['想换的标点']] = test_dict['换成的标点'] 27 | return new_dict 28 | 29 | def write_dict(): 30 | bd2 = [] 31 | for key, value in biaodian.items(): 32 | tmp = {} 33 | tmp['想换的标点'] = key 34 | tmp['换成的标点'] = value 35 | bd2.append(tmp) 36 | with open('biaodian.txt', 'w', encoding='utf-8') as fx: 37 | for i in bd2: 38 | fx.write(str(i)) 39 | fx.write('\n') 40 | 41 | class zhoushen_GUi(QMainWindow, Ui_MainWindow): 42 | def __init__(self, parent=None): 43 | super(zhoushen_GUi, self).__init__(parent) 44 | self.gai_shan_zhou = False 45 | 46 | self.setupUi(self) 47 | self.progressBar.setValue(0) 48 | # 打开文件 49 | self.OpenFile.clicked.connect(self.fileopen) 50 | # 检查要不要连闪轴 51 | self.radioButton.toggled.connect(lambda :self.rBstate(self.radioButton)) 52 | # 开始锤 53 | self.StartProgram.clicked.connect(self.kai_shi) 54 | 55 | # 检查并打开符号替换的txt文件 56 | try: 57 | self.biaodian = open_dict() 58 | except FileNotFoundError: 59 | reply = QMessageBox.question(self, '信息', '没有找到字符替换文件!\n已自动重建', 60 | QMessageBox.Yes) 61 | if reply == QMessageBox.Yes: 62 | write_dict() 63 | self.biaodian = open_dict() 64 | except SyntaxError: 65 | reply = QMessageBox.question(self, '错误', '字符替换文件格式有误!\n是否重建?', 66 | QMessageBox.Yes | QMessageBox.No, QMessageBox.No) 67 | if reply == QMessageBox.Yes: 68 | write_dict() 69 | self.biaodian = open_dict() 70 | else: 71 | os._exit(5) 72 | 73 | 74 | def rBstate(self, radioButton): 75 | if radioButton.isChecked(): 76 | self.textBrowser.append('开启无脑连轴模式!') 77 | self.gai_shan_zhou = True 78 | # else: 79 | # self.gai_shan_zhou == False 80 | 81 | def fileopen(self): 82 | self.fileName_path, self.filetype = QFileDialog.getOpenFileName(self, 83 | "选取文件", 84 | "./", 85 | "ASS Files (*.ass)") #设置文件扩展名过滤,注意用双分号间隔 86 | if self.fileName_path == '': 87 | return None 88 | # 打开文件 89 | self.textBrowser.append(self.fileName_path) 90 | self.name = self.fileName_path.split('/')[-1] 91 | self.path = self.fileName_path[:-len(self.name)] 92 | with open(self.fileName_path, 'r', encoding='utf-8-sig') as fass: 93 | self.line, self.header = [], [] 94 | for i in fass.readlines(): 95 | if i[:8] == 'Dialogue': 96 | self.line.append(i) 97 | elif i[:7] == 'Comment': 98 | self.line.append(i) 99 | else: 100 | self.header.append(i) 101 | self.textBrowser.append('ass文件读取成功!') 102 | self.progress_point = 0 103 | self.progressBar.setValue(0) 104 | 105 | 106 | def kai_shi(self): 107 | # 读取时间和位置 108 | start, end, location= [], [], [] 109 | for i, l in enumerate(self.line): 110 | if (not re.search(r",fx,",l)) and l[:7] != 'Comment': 111 | start.append(l.split(',')[1]) 112 | end.append(l.split(',')[2]) 113 | location.append(i+1) 114 | # 先检查符号 115 | self.textBrowser.append('开始字符检查……') 116 | outlog = '源文件请放心,我一点没动\n\n花寄四人这么可爱,不关注一下吗┏(^ω^)=☞审核群718235402\n\n言归正传,这里是字符检查:\n' 117 | # 用于写入txt的内容 118 | bd1 = ["'", '"', ',', ','] # 不知道咋换的标点(逗号是因为可能会有注释) 119 | 120 | for i in range(len(self.line)): 121 | if self.line[i][:7] == 'Comment' or re.search(r",fx,", self.line[i]): # 跳过注释 122 | pass 123 | elif 'ong' in self.line[i].split(',')[9]: 124 | self.textBrowser.append('第{}行可能翻译没听懂,校对请注意一下————{}'.format( 125 | i+1, self.line[i].split(',')[9].replace('\n', ''))) 126 | outlog += '第{}行可能翻译没听懂,校对请注意一下————{}\n'.format( 127 | i+1, self.line[i].split(',')[9].replace('\n', '')) 128 | elif '???' in self.line[i].split(',')[9]: 129 | self.textBrowser.append('第{}行可能翻译没听懂,校对请注意一下————{}'.format( 130 | i+1, self.line[i].split(',')[9].replace('\n', ''))) 131 | outlog += '第{}行可能翻译没听懂,校对请注意一下————{}\n'.format( 132 | i+1, self.line[i].split(',')[9].replace('\n', '')) 133 | elif '???' in self.line[i].split(',')[9]: 134 | self.textBrowser.append('第{}行可能翻译没听懂,校对请注意一下————{}'.format( 135 | i+1, self.line[i].split(',')[9].replace('\n', ''))) 136 | outlog += '第{}行可能翻译没听懂,校对请注意一下————{}\n'.format( 137 | i+1, self.line[i].split(',')[9].replace('\n', '')) 138 | elif '校对' in self.line[i].split(',')[9]: 139 | self.textBrowser.append('第{}行可能翻译没听懂,校对请注意一下————{}'.format( 140 | i+1, self.line[i].split(',')[9].replace('\n', ''))) 141 | outlog += '第{}行可能翻译没听懂,校对请注意一下————{}\n'.format( 142 | i+1, self.line[i].split(',')[9].replace('\n', '')) 143 | else: 144 | for j in bd1: 145 | if j in self.line[i].split(',')[9]: 146 | self.textBrowser.append('第{}行轴标点有问题(不确定怎么改),请注意一下————{}'.format( 147 | i+1, self.line[i].split(',')[9])) 148 | outlog += '第{}行轴标点有问题(不确定怎么改),请注意一下————{}\n\n'.format( 149 | i+1, self.line[i].split(',')[9]) 150 | break 151 | for key, value in self.biaodian.items(): 152 | if key in self.line[i].split(',')[9]: 153 | self.line[i] = self.line[i].replace(key, value) 154 | self.textBrowser.append("第{}行轴的{}标点有问题,但是我给你换成了{}".format(i+1, key, value)) 155 | outlog += "第{}行轴的{}标点有问题,但是我给你换成了{}\n\n".format( 156 | i+1, key, value) 157 | self.textBrowser.append('字符检查完成!') 158 | self.progressBar.setValue(9) 159 | self.progress_point = 9 160 | # 开始锤轴啦 161 | self.textBrowser.append('开始查闪轴……') 162 | outlog += '这里是锤轴:\n' 163 | lenth = len(start) # 总行数 164 | ckpt = round(lenth / 90) # 进度条计数器 165 | # 先找出连轴 166 | zhou=[] 167 | for i in range(lenth): 168 | lianzhou=[] 169 | lianzhou_flag=False 170 | for k in zhou: 171 | if location[i] in k: 172 | lianzhou_flag=True 173 | break 174 | if lianzhou_flag: 175 | continue 176 | else: 177 | lianzhou.append(location[i]) 178 | tmp=end[i] 179 | for j in range(lenth): 180 | if start[j]==tmp: 181 | tmp=end[j] 182 | lianzhou.append(location[j]) 183 | zhou.append(lianzhou) 184 | # for i in zhou: 185 | # self.textBrowser.append(str(i)) 186 | 187 | # 查行内的闪轴 188 | for i in range(lenth): 189 | if i % ckpt == 0: 190 | if self.progress_point <= 99: 191 | self.progress_point += 1 192 | self.progressBar.setValue(self.progress_point) 193 | shenzhou = False # 是不是六亲不认轴 194 | # 先锤行自己的闪轴 195 | tdelta1 = timedelta(end[i], start[i]) # 轴的时间 196 | if tdelta1 <= 0.49 and tdelta1 > 0: 197 | tneeded = 0.5 - tdelta1 # 算出要加的时间 198 | for j in range(lenth): 199 | tdelta2 = timedelta(start[j], end[i]) 200 | if tdelta2 <= tneeded + 0.3 and tdelta2 > 0: 201 | shenzhou = True # 遇到神轴了 202 | if self.gai_shan_zhou: 203 | self.textBrowser.append( 204 | "第{}行轴({}ms)要是不闪就和第{}行轴之间是闪轴了,不过我姑且给你连上了({})".format( 205 | location[i], tdelta1*1000, location[j], start[j]) 206 | ) 207 | outlog += "第{}行轴({}ms)要是不闪就和第{}行轴之间是闪轴了,不过我姑且给你连上了({})\n".format( 208 | location[i], tdelta1*1000, location[j], start[j]) 209 | self.line[location[i]-1] = self.line[location[i]-1].replace( 210 | self.line[location[i]-1].split(',')[2], start[j]) 211 | end[i] = start[j] 212 | else: 213 | self.textBrowser.append("第{}行轴({}ms)要是不闪就和第{}行轴之间是闪轴了,草这啥神轴啊,你自己看着改吧".format( 214 | location[i], tdelta1*1000, location[j])) 215 | outlog += "第{}行轴({}ms)要是不闪就和第{}行轴之间是闪轴了,草这啥神轴啊,你自己看着改吧\n\n".format( 216 | location[i], tdelta1*1000, location[j]) 217 | break 218 | if not shenzhou: # 没遇到神轴 219 | # 看看有没有什么轴和它连着 220 | kanguole=False 221 | for j in zhou: 222 | if location[i] in j and len(j)>1 and location[i]1 and location[i] 0: 264 | # 发现有闪轴就检查一下这条是不是连轴的一部分 265 | for j in zhou: 266 | if location[k] in j and len(j)>1 and min(j)