|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
from PySide.QtCore import *) I, O I; _ h+ t* f$ \: k. g
from PySide.QtGui import *
) H5 W4 R3 y1 ^) `; q' w7 k#from PyQt5.QtWidgets import *
* f- [; @$ G8 A9 O( k. wimport sys,re
$ v: D% T3 J7 @2 y* Pfrom BGA_GUI_002 import Ui_MainWindow
$ M3 Q% ]. N3 P3 M, q3 C6 [import win32gui,win32com.client,win32con,win32api: B0 s: D- S" `% v
. k8 n! C, w9 G- s. F- Q
#创建BGA_MainApp类,定义BGA_MainApp类继承了QMainWindow类和Ui_MainWindow类----->多重继承
) M9 k/ u( s) xclass BGA_MainApp(QMainWindow,Ui_MainWindow):( ~6 k b }- s( e2 s$ U s8 _3 i
#建立初始化构造函数,初始化BGA_MainApp对象,不指定父类3 q1 L9 ^- V7 k2 u; R! c( u" W* A
def __init__(self,parent=None):
# b6 b. ~3 u7 Q" M$ F% h1 F1 R! z #继承QMainWindow类中的方法2 w+ G* t1 T. i
super(BGA_MainApp,self).__init__(parent)
: q1 m, y6 A, e$ y #QMainWindow.__init__(self,parent)
6 W% {6 _6 F) b$ f) Q( E0 ^9 I/ A0 ^ #继承Ui_MainWindow的setupUi方法
3 [9 h0 s8 V/ i6 w$ ~ self.setupUi(self)
! o* M# B( x1 q% i/ b' m' V self.thread1 = Worker1()% R4 H% @5 g. u# {7 m" F5 B
self.btn_action()5 h5 z' R% Q7 Y& q4 j: t& L1 y# H
* l6 o+ f* N! v4 u, k' n ?3 P! N/ \& `4 ]! y+ i
- R2 K# r( x8 B: @1 D) s! m def slotAdd1(self,get_rc_value):
! t8 e" t! P/ Q2 {; ~7 @ #print (get_rc_value)
2 s. b. p5 N5 H- D. _5 v f1 = open('C:\\pads_scripts\\QT_GUI\\BGA_GUI_002\\save.txt', 'a+')
6 {6 L+ Z7 S- {$ o% k f1.writelines(get_rc_value + '\n')
. }, ]) V( t; V8 o P+ O f1.close()
- k1 e: ?( N+ z self.listWidget.addItem(get_rc_value)' C- I( S4 r5 n1 h l
3 c# W$ `! U. |2 e$ a3 Q( ~8 y" [& T, G* w; Z! H
- A3 q- X2 \: T2 B def slotStart1(self):
8 B o- _; @; r" h3 u self.thread1.start()
8 o, Y5 F6 k' n1 u: S' b# ]5 f" X3 n2 T0 i R1 V. N2 g9 r {9 K
5 ^# ]4 Q4 E- B# j) b& k& D # 创建界面中的按钮方法
0 j2 _, t; p9 d( ]: @+ Z7 @6 p def btn_action(self):
! ]) H* k* f9 E # 执行rc_select_btn按钮的方法. x4 ~! V- I) `) a% B0 |. k! m
self.rc_select_btn.clicked.connect(self.slotStart1)2 Z+ B5 A2 f) p4 Q1 S5 ]9 S7 n
self.thread1.sinOut1.connect(self.slotAdd1)
5 A8 a0 i8 w L, x! P& ^ self.lineEdit.returnPressed.connect(self.match_rc)7 [9 d: x3 H2 d$ Q
4 n1 b. M- ~; x1 L: P- h' P1 D- ]8 \0 j8 M7 X+ L! r! y- I n
#定义PADS中所选器件的属性方法
6 }* k: K9 V7 _* l1 V0 X2 i/ X def get_cmp_list(self):
# }1 d, a: B% f- a, |5 U cmp_list=[]2 g, W1 Q* I$ u+ z! J
self.powerPCBApp = win32com.client.Dispatch('PowerPCB.Application')2 n8 U1 p( O$ S2 t
comp_list = self.powerPCBApp.ActiveDocument.GetObjects(1, '', True)- K% G: e7 p2 Z# A
for comp_list_item in comp_list:0 a, ]- M& x- ^& ]9 @$ l8 F5 D
pin_name_list = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins( m/ {. N$ W% L X- u i
for item_pin in pin_name_list:3 A" W+ P' g% {
pin_name = item_pin.Name
& ]- R5 C9 {, ?- o pin_net_item = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins(pin_name).Net9 H# V0 M6 F+ a- Y) c" e
pin_lx = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins(pin_name).PositionX" ?* t* }: C/ p
pin_ly = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins(pin_name).PositionY/ x" `$ J4 A+ M) ~
get_cmp_attr = str(pin_name) + ' ' + str(pin_net_item) + "<" + str(pin_lx) + ',' + str(pin_ly) + '>'
% K* T5 _! i3 N$ h' n/ H& f( s X" ]8 I get_cmp_attr = BGA_MainApp.get_rc(self,get_cmp_attr)& \7 a( p. y5 O$ w7 Y6 \$ ^
self.sinOut1.emit(get_cmp_attr)
( j6 B. T% p/ \ return cmp_list1 w: q9 a7 O. N7 l9 K
' N7 C6 [/ U9 v K
def get_rc(self,cmp_list_item):0 G' y8 Z4 q" }* u' N: p
get_val = cmp_list_item* d5 ~+ L* y& j
#C310.1 SM_VREF_DQ2_A <19.567046,1.535388>7 g5 Q+ S" w3 z. W, A! g9 v& }
#R304.2 0.675V <29.767,32.5355>) u! ~* h U: P7 p8 L$ F: B- H
get_val = get_val.split(' '). y' O5 H5 y" [4 h) \; R
#C310.1
: U6 x+ q% E% J6 R5 k get_val_name = get_val[0]
- G$ p( ]9 i: N% _ get_val_net = get_val[1]
. M6 A7 V. a% E" y/ |* L #SM_VREF_DQ2_A<19.567046,1.535388>
/ u+ z+ B+ f) K) q; M get_val_net = get_val_net.split('<'). H% ~1 I: g; }/ A
#SM_VREF_DQ2_A
]! s) u; \" w6 F8 q3 m$ |/ c! V get_val_net = get_val_net[0]
& c- R0 L; ]) ^" Z4 Y" E get_val = str(get_val_name) + ' ' +str(get_val_net)
: t/ h2 E% p2 q& X return get_val. n9 X! }% w, v$ j. O! ]7 Z0 M
8 D) x; W" h" q4 [
def get_cmp_list_match(self):+ b. Y% E, B2 J+ K
rc_list = []
# O3 `+ X4 f% O0 n( E self.powerPCBApp = self.win32com.client.Dispatch('PowerPCB.Application')
: h6 n( z/ t6 Y comp_list = self.powerPCBApp.ActiveDocument.GetObjects(1, '', True)
" u. ?8 ^0 e1 R, R7 ~& A- z: H. |8 B- c8 s
for comp_list_item in comp_list:
# r5 _8 U9 R0 P. n+ G5 E$ z pin_name_list = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins
0 i1 n+ G7 E# E: _/ Z for item_pin in pin_name_list:% a, K2 O" ^# A" H8 K# u! ]
pin_name = item_pin.Name+ E/ l- m* t1 S; s' ^
pin_net_item = self.powerPCBApp.ActiveDocument.Components(str(comp_list_item)).Pins(pin_name).Net- g9 a6 u3 ^4 v. S6 p
pin_net_str = str(comp_list_item) + ' ' + str(pin_net_item)
3 \/ D, C$ A8 F rc_list.append(pin_net_str)
$ x) _3 t5 s) A: L return rc_list6 q& B5 r; D! F
; d5 {- `+ H6 l # rc模糊查询功能
3 C8 E, Q' J6 ~! g3 p def match_rc(self):
# T: O" [" V7 w1 A1 \6 s match_list = []( W$ v' u! ^& N# N8 z8 L
rc_list1 = []4 O) H, F( z5 M% i+ G. f( w
list_org = []. f: Q4 N* D7 l2 c1 G
index = 0
' S" t6 R @. a4 L( b; \7 J0 p txt1 = self.lineEdit.text()
5 ]' j7 t5 n2 Z y7 U) j with open('C:\\Pads_scripts\\QT_GUI\\BGA_GUI_002\\save.txt', 'r') as f2:
; _% A# x/ V5 n" w list_org = f2.readlines()3 Z- R0 i2 e- \$ Q
for i in range(0, len(list_org)):/ f8 T. O0 D& N6 d! ]3 ]
list_org = list_org.rstrip('\n')
1 Z; k( V$ J! L if txt1 == '':; w) J5 g, q0 H7 _
self.listWidget.clear()+ z- M1 |/ f' N; S
for count in range(0, len(list_org)):6 D# ?1 q" T% t% C3 V
self.listWidget.addItem(list_org[count])
2 K9 W9 Z! c7 i+ R else:! Z, @3 r$ i. s. R* @$ d
for row in range(0, len(list_org)):* l: v4 {7 Q4 i3 R
txt_row = self.listWidget.item(row).text()
; y6 z5 V9 h1 ~% ~ if txt1 in txt_row:
2 H5 n2 H R0 y0 z. S& a: j match_list.append(txt_row)( Z- A& a0 ^! _8 `, I8 D F
self.listWidget.clear(), L- O% G) S% ~' Q: b1 ^
for index in range(0, len(match_list)):
5 K R4 k. } R7 S self.listWidget.addItem(match_list[index])4 L: V, Q/ m5 m. f" z. F
T& T0 i/ M8 [* g
#线程1
7 z. Q* c! z$ P" {+ h$ X6 w& [class Worker1(QThread):
( W) U3 ?1 Y! n3 S, a' D( e sinOut1 = Signal(str)
: x+ J# p2 ]7 M- N% s" W def __init__(self, parent=None):
" Y* v& k: W) x, K" E+ x+ s6 E super(Worker1, self).__init__(parent)
6 W4 c! [5 b w% S$ }2 V" ^ #把需要循环计算的内容放在run()中. C1 V: c. P6 C8 A, [6 @6 ^. P9 a
def run(self):
7 I; ^ O: s# k" c8 o% w* Y #在多线程中调用COM,需要加以下两行代码,初始化COM Lib
; k/ b7 z. T4 u- I- o" F3 d import pythoncom# v1 D) V. R" w$ L; F
pythoncom.CoInitialize()
4 D" @- n: r* K' O. p1 v #---否则报错: pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)! J2 N4 ^) l# w- A4 c8 w: l2 T
BGA_MainApp.get_cmp_list(self)
( x! q9 u& I. ~0 p* `3 R
7 N& J2 \3 S5 V9 ]1 [ D! A7 ?8 S
& A& {1 L6 z1 Y
9 j0 e& ]7 P5 j( N" Eif __name__=='__main__': J9 L8 U5 X# T9 T% U& P& ?% a
# 注意QApplication的构造器接收sys.argv作为参数,从而允许用户通过命令行定制外观等行为。
: U9 x, L. G/ v" _1 Y# V+ @' p! l" C8 g6 z Program = QApplication(sys.argv)9 S6 j* v( O' r4 V S4 K
#print(QThread.currentThreadId)
2 F2 m4 ]! W. f5 Q* c7 c Window = BGA_MainApp(): s3 r, y4 ~( C4 p9 N
Window.show()
( x0 u0 M; @& Y) B B print(QThread.currentThreadId)$ x( v- q, ~0 I) H, x
Program.exec_()2 _% O) O. p( T7 f- L9 b1 f
* i: w4 |- p" q- W |
|