From 3f12b65db443395d96b24d52952e48f839de8167 Mon Sep 17 00:00:00 2001 From: Jingyan Ling <jingyanling2018@u.northwestern.edu> Date: Mon, 12 Aug 2019 14:21:39 -0700 Subject: [PATCH] update joranl,structrue --- README.md | 5 +- .../__pycache__/paperbot_draw.cpython-36.pyc | Bin 5970 -> 5982 bytes paperbot_ee_autoroute/fab_drawing.py | 3 +- paperbot_ee_autoroute/paperbot_draw.py | 135 +--------------- .../roco_ee_dwg_processing.py | 153 ++++++++++++++++++ 5 files changed, 161 insertions(+), 135 deletions(-) create mode 100644 paperbot_ee_autoroute/roco_ee_dwg_processing.py diff --git a/README.md b/README.md index 3cb9229..c2a5605 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,10 @@ - 3. Offset original path based on given width - 4. find intersect between paths with offset and angle bisectors - 5. connect intersect points and 4 end-points -- + +- Separate file `paperbot_draw` to a general useful file `roco_ee_dwg_processing.py` and operations specifically for paperbot `paperbot_draw.py` + - functions and classes in `roco_ee_dwg_processing.py` will be useful for future foldable robot project. + ### 08/09/2019 - Potential problem: diff --git a/paperbot_ee_autoroute/__pycache__/paperbot_draw.cpython-36.pyc b/paperbot_ee_autoroute/__pycache__/paperbot_draw.cpython-36.pyc index 5d7a6291f4b167c9ce2b62597dc32a8dfe7c9259..5a079a0f65bd77fc2378e2165cb2526a0871b0f2 100644 GIT binary patch delta 1643 zcmZ`)&2Jk;6yKTs@Ou4`k2a}I+QuO%#3He311bar4K#s@stExhSV*mvcav<e*Us#Q z*k~6Y%0E!ekvmePRu#$xi6eI;0;f6j!WE9(d2j4C!Gg8sw{L#)K4#u~vp%gnsm#Be z%UKJ*eYpMOWkvZzIrpd_--Ho<`e1%DXS(Tc729&jM@rfHq5Byjf}fI8a|$$$6*hbF zkdBd+37FYN)9HCE6l&ldl~r~HIZJZ&z-f8xc_7&AGbo`n&Hq;W8@6`m_T4q6BV!?G z0A-zBfS1q@4n5Wrs@vU>E`%<9mZ^*&h&Sr<68~8{UPW8>0>X>ZOBgvUvU9H2^dhhB z1(6^1hCWys)kbz!IC-R(D9Q6*QiW6&6w1Wrf2Hoto;jvZy|b4vgz5z@TjcxZ4PBm{ ze{Wtho<p57|J8hTd?Y~eWIBC^K!Ap|IJYPRumyPCg<Z*mn~v+&n||PxGwcd~Xl;#p znBn<My)uUprV%b76cCCCGYDrvrBveIWnLpo{P)bVh85+x?BnYfQSmB(NY#&g<_EjN z7`)jSE{!8#iP<E=1^#EYQh~NnhE<lfc4lBw?>N!kxv(WPnd9&09&Nmf;u69#fXE&O zepGL?gReXmv0KQ$g1iy6n|>G#oeK>e3ep+%xyEnhk3W7LEFfW+KemE0kx7K+kq)cK z*AQgc-aw5(YqAfJy@7C+qY_Tn`Rds96Fx!Iejev31cH!8FcAJPY<489o!#*RSw*+* z9mvBAHS`0aHrnAJ4F;6hY3>R=Y&RhjXZyUyir7a&Kl0sZ&(`;x=FZV@+x+U(d`jri zo)<ZMed_VWku$sphTrh?bibcsZ{vn<BCI0Fepy3l9RW4ZWnj=H$h`wlhY^|pCNalM z-Lxdzz{bZX2LrDv7B+kW5GyVzBGRHlm4qg0KPHkQLrP2Zn8w<d8rvLM0p$_%r@E9y zk+M%RimT2jiQ&>D71NB8m@Y}u!97@`u^y`hCDvkEP-c|-Br$+hW9n|vT?pp_?oyyF zNvp9gXBn7j`+97}nfo-!##y=5>~O0o2tbo`oQlmj9UD7%VYIK?7GE1*xZH`VE1!3( zOTFs0Rf4Az)nHy*>eaR_{$RYaHRu@GJJ>~KV^DnB@rB{AM&tyt{A>dj*(Pe_Y!$pB z)CBET1?^RB+6B2+V_TrW=O(6>|6OPCti9lqcJLD@h4__K%t<myOv1M(iV0;7Fy)NU zgTq#*H@JX!uZ6*!z-_mL*1{``MHO134Jx-mWcWWI%PsByt3`zQW~=QUHodpdHpI^a P^a=d3Ff^L~B>%-fDOF4~ delta 1660 zcmZ`(&2QX96!(lj*0H^tvS~J-B-^GHaTS(k8$J{@6(ubssBJ15Kx~z+%-Tt|*?6~O zr^!ZMEmHUg(DV;L;*<kakn%5Z;no`?#DyzY#0jbIjiV%5f$jOto8R+$Z)V<``J?o* zG<7YTwZ0X1*Pe|l%Ad-aM+NzPXwm&|rta(Hf#RA!e)R<*6)wn2^E_w{6*h77g7%a7 zb1)J{!)pgD5^5Oix+(*IO2v{~HT1Rvb^!=BaRQSl4f220?uyXvEZ@7$bY%JvGyqp; zdFX`xWG7&4q56C4(uL5aPnXIFf&{%j3;b8@&_-MK2EsJ&>f@t09d-qwX9`0{KkG$W z%z|n^kMnpa{VyzBT-=E-t}z=FE)o3i%%jOurxZO+Bg_B@H3)s?a%R4(V<5qQFfSV; zsJ_B~Gv7Yf6La`zqVEnNS-xdWUvS|!m#``5?!l_$qD{~DtBraXxHcQ-FRV{`J&f{# zT`d(c!XQEcVF+OuVHDvssFWu8clLW^j{k1I>G;;yN+sjlkX46go#$5v(BO3dk*V(1 zSv}kkM%uF+s`?Qy&FnRVJpaonmBv6k&U9*PrzX{w7jK>kFH>FQOWE&NK1Ayh!dn2s z*$L}$wbl%u1}tVDA^#5YM%--Fqxjgl(9oeEtzMr?{8sL8^*UI<#^FA)1(egxgaVQd zuOUB&Ak%jP|47S|tspy(aJpA=vdjEt|J5!Y0eo-=up}3uMLz)~#3v(&bVQ*_N9||{ zML9)a^p26JiM~bIQmi~Cw&JT}N+;vfj+v;o(&_U_#|j^TjwVK;4J(PBsKd&bazHv6 zVAVwR>8Bes(S5oBFVME6wZxDk2S(asJ+Tw#fOfJ;R!%5;JRuVT(2kXuNnc_mnRN~F ztnD9IMR@oxgO{dJXvMSh5BFwg+Oum?k#c3=$}{b9%5kGm>Y{=XST@Tb;7M@}nM6Tb zbzyj{7JFfuPy>qAYitNTYBrt*ZZ5qBRESjpC=0qbTcPb)=*!TTg&uDPu_p+8UkXwa z<fb576&0*cQnIQr%!zQ;>!Capel>Wq4@`tdP08d*o|?p=8Zn4L3#34D@aBm|_D5RH zD6Y0xvlc{A>8$-xtDmY}TuQnqxjYkx2EzZ9l+#;MYxp<TvrwaYDAZark{iJupkfu_ zwCXOWSC+n8_v6iqzG-`n_1)tl<krBH&OQeNJ~#0Ed`~@o4E!_x&p@|pvJcQHmLj`_ zP()ZlSVoW&!rxE!?^u#`eH#>2XpseA60_gbO~V{z$h(%%!=3F`J3XIR^ul0X=r^~8 uwv8tmE<NrHnTvNp#qe-QyZ;I#%<J1tf2R@Lz>6|MUl0vm2bxB6pS=Q6>ri0; diff --git a/paperbot_ee_autoroute/fab_drawing.py b/paperbot_ee_autoroute/fab_drawing.py index 09e4b83..bd64282 100644 --- a/paperbot_ee_autoroute/fab_drawing.py +++ b/paperbot_ee_autoroute/fab_drawing.py @@ -23,6 +23,7 @@ import sys import subprocess sys.path.insert(1,dsnwritier_dir) from sesreader import * +from roco_ee_dwg_processing import * #########for paperbot only######## import paperbot_dsn @@ -33,4 +34,4 @@ paperbot_dsn.brd_design(dwg_path,0,module_libpath,save_name) unrouted_dsn_file=save_name+'.dsn' subprocess.call(['java','-jar','freeRouting.jar','-de',unrouted_dsn_file,'-white','-s']) wiring_path=find_wire(save_name) -paperbot_draw.post_process(dwg_path,wiring_path) +post_process(dwg_path,wiring_path) diff --git a/paperbot_ee_autoroute/paperbot_draw.py b/paperbot_ee_autoroute/paperbot_draw.py index cdfc168..7a1ec41 100644 --- a/paperbot_ee_autoroute/paperbot_draw.py +++ b/paperbot_ee_autoroute/paperbot_draw.py @@ -4,6 +4,7 @@ import ezdxf import random from math import sqrt import copy +from roco_ee_dwg_processing import * unit_convert=10000 #ses to dxf class pre_process(): @@ -24,7 +25,7 @@ class pre_process(): self.remove_wheels() ##remove wheel drawings for this design, no need to call for other designs self.center_arr=self.find_pin() - self.cross_cut(2,self.center_arr) + cross_cut(self.msp,2,self.center_arr) self.dwg.saveas(self.save_name) @@ -73,135 +74,3 @@ class pre_process(): center_arr=np.unique(center_arr,axis=0) center_arr=center_arr[1:] return center_arr - - def cross_cut(self,cross_size,pin_loc): - """ - cross_size= lenght of bounding box of the cross cut - """ - tipat=cross_size/2 - for pt in pin_loc: - x=pt[0] - y=pt[1] - cross_s1=(x-tipat,y-tipat) - cross_e1=(x+tipat,y+tipat) - cross_s2=(x-tipat,y+tipat) - cross_e2=(x+tipat,y-tipat) - self.msp.add_line(cross_s1,cross_e1,dxfattribs={'linetype':'DASHDOT', 'layer':'Circuit'}) - self.msp.add_line(cross_s2,cross_e2,dxfattribs={'linetype':'DASHDOT', 'layer':'Circuit'}) - - # def line_to_path(self) - - -class post_process(): - def __init__(self,dxf_file,wiring_path): - if not dxf_file.endswith('.dxf'): - dxf_file+='.dxf' - self.dxf_file=dxf_file - self._wiring=wiring_path - self.wiring=[] - self.dwg=ezdxf.readfile(dxf_file) - self.msp=self.dwg.modelspace() - - self.convert_unit() - self.draw_wires() - self.parallel_trace(1) - - self.dwg.saveas('route_text.dxf') - - def convert_unit(self): - for path in self._wiring: - p=np.array(path)/unit_convert - p[:,1]*=-1 - self.wiring.append(p.tolist()) - def draw_wires(self): - for path in self.wiring: - for i in range(len(path)-1): - self.msp.add_line(path[i],path[i+1],dxfattribs={ - 'layer':'Circuit', - 'linetype':'DASHDOT'}) - def find_lind_eq(self,pt1,pt2): - """ - input: two points on a line - pt1:[x1,y1] - pt2:[x2,y2] - return: a,b,theta in terms of cy=ax+b - """ - x1,y1=pt1[0],pt1[1] - x2,y2=pt2[1],pt2[1] - - if x1==x2: - theta=-np.pi/2 - #x= number - a=1 - b=-x1 - c=0 - else: - theta=np.arctan((y2-y1)/(x2-x1)) - A=np.array([[x1,1],[x2,1]]) - k=np.array([y1,y2]) - sol=np.linalg.solve(A,k) - a,b=sol[0],sol[1] - c=1 - return a,b,c,theta - - - def parallel_trace(self,width): - halfw=width/2 - for path in self.wiring: - for i in range(len(path)-1): - start_x,start_y=path[i][0],path[i][1] - end_x,end_y=path[i+1][0],path[i+1][1] - - theta=self.find_lind_eq(path[i],path[i+1])[3] - sinw=np.sin(theta)*halfw - cosw=np.cos(theta)*halfw - s1i=[start_x-sinw,start_y+cosw] - s1o=[start_x+sinw,start_y-cosw] - e1i=[end_x-sinw,end_y+cosw] - e1o=[end_x+sinw,end_y-cosw] - - line1i=self.find_lind_eq(s1i,e1i) - line1o=self.find_lind_eq(s1o,e1o) - - if i==0: - s1=s1i - s2=s1o - else: - s1=e1 - s2=e2 - - if i<len(path)-2: - next_x,next_y=path[i+2][0],path[i+2][1] - theta2=self.find_lind_eq(path[i+1],path[i+2])[3] - - sinw2=np.sin(theta2)*halfw - cosw2=np.cos(theta2)*halfw - - s2i=[end_x-sinw2,end_y+cosw2] - s2o=[end_x+sinw2,end_y-cosw2] - e2i=[next_x-sinw2,next_y+cosw2] - e2o=[next_x+sinw2,next_y-cosw2] - - line2i=self.find_lind_eq(s2i,e2i) - line2o=self.find_lind_eq(s2o,e2o) - - Ainteri=np.array([[line1i[0],-line1i[2]],[line2i[0],-line2i[2]]]) - binteri=np.array([-line1i[1],-line2i[1]]) - Aintero=np.array([[line1o[0],-line1o[2]],[line2o[0],-line2o[2]]]) - bintero=np.array([-line1o[1],-line2o[1]]) - - e1=np.linalg.solve(Ainteri,binteri) - e2=np.linalg.solve(Aintero,bintero) - - else: - #from last end point to this end - e1=[end_x-sinw,end_y+cosw] - e2=[end_x+sinw,end_y-cosw] - - - self.msp.add_line(s1i,e1i,dxfattribs={ - 'layer':'Circuit', - 'linetype':'DASHDOT'}) - self.msp.add_line(s1o,e1o,dxfattribs={ - 'layer':'Circuit', - 'linetype':'DASHDOT'}) diff --git a/paperbot_ee_autoroute/roco_ee_dwg_processing.py b/paperbot_ee_autoroute/roco_ee_dwg_processing.py new file mode 100644 index 0000000..761b58d --- /dev/null +++ b/paperbot_ee_autoroute/roco_ee_dwg_processing.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 + +import numpy as np +import ezdxf +import random +from math import sqrt +import copy +unit_convert=10000 #ses to dxf + + +def cross_cut(msp,cross_size,pin_loc): + """ + cross_size= lenght of bounding box of the cross cut + """ + tipat=cross_size/2 + for pt in pin_loc: + x=pt[0] + y=pt[1] + cross_s1=(x-tipat,y-tipat) + cross_e1=(x+tipat,y+tipat) + cross_s2=(x-tipat,y+tipat) + cross_e2=(x+tipat,y-tipat) + msp.add_line(cross_s1,cross_e1,dxfattribs={'linetype':'DASHDOT', 'layer':'Circuit'}) + msp.add_line(cross_s2,cross_e2,dxfattribs={'linetype':'DASHDOT', 'layer':'Circuit'}) + +# def line_to_path() + +class post_process(): + def __init__(self,dxf_file,wiring_path): + if not dxf_file.endswith('.dxf'): + dxf_file+='.dxf' + self.dxf_file=dxf_file + self._wiring=wiring_path + self.wiring=[] + self.dwg=ezdxf.readfile(dxf_file) + self.msp=self.dwg.modelspace() + + self.convert_unitfrom_ses() + # self.draw_wires() + self.parallel_trace(1) + + self.dwg.saveas('route_text.dxf') + + def convert_unitfrom_ses(self): + for path in self._wiring: + p=np.array(path)/unit_convert + p[:,1]*=-1 + self.wiring.append(p.tolist()) + def draw_wires(self): + for path in self.wiring: + for i in range(len(path)-1): + self.msp.add_line(path[i],path[i+1],dxfattribs={ + 'layer':'Circuit', + 'linetype':'DASHDOT'}) + + def parallel_trace(self,width): + halfw=width/2 + for path in self.wiring: + for i in range(len(path)-1): + start_x,start_y=path[i][0],path[i][1] + end_x,end_y=path[i+1][0],path[i+1][1] + + theta=self.find_lind_eq(path[i],path[i+1])[3] + sinw=np.sin(theta)*halfw + cosw=np.cos(theta)*halfw + s1i=[start_x-sinw,start_y+cosw] + s1o=[start_x+sinw,start_y-cosw] + e1i=[end_x-sinw,end_y+cosw] + e1o=[end_x+sinw,end_y-cosw] + + line1i=self.find_lind_eq(s1i,e1i) + line1o=self.find_lind_eq(s1o,e1o) + + if i==0: + s1=s1i + s2=s1o + else: + s1=e1 + s2=e2 + + if i<len(path)-2: + next_x,next_y=path[i+2][0],path[i+2][1] + theta2=self.find_lind_eq(path[i+1],path[i+2])[3] + + sinw2=np.sin(theta2)*halfw + cosw2=np.cos(theta2)*halfw + + s2i=[end_x-sinw2,end_y+cosw2] + s2o=[end_x+sinw2,end_y-cosw2] + e2i=[next_x-sinw2,next_y+cosw2] + e2o=[next_x+sinw2,next_y-cosw2] + + line2i=find_lind_eq(s2i,e2i) + line2o=find_lind_eq(s2o,e2o) + + Ainteri=np.array([[line1i[0],-line1i[2]],[line2i[0],-line2i[2]]]) + binteri=np.array([-line1i[1],-line2i[1]]) + Aintero=np.array([[line1o[0],-line1o[2]],[line2o[0],-line2o[2]]]) + bintero=np.array([-line1o[1],-line2o[1]]) + + e1=np.linalg.solve(Ainteri,binteri) + e2=np.linalg.solve(Aintero,bintero) + + else: + #from last end point to this end + e1=[end_x-sinw,end_y+cosw] + e2=[end_x+sinw,end_y-cosw] + + + self.msp.add_line(s1i,e1i,dxfattribs={ + 'layer':'Circuit', + 'linetype':'DASHDOT'}) + self.msp.add_line(s1o,e1o,dxfattribs={ + 'layer':'Circuit', + 'linetype':'DASHDOT'}) + +def find_line_eq(pt1,pt2): + """ + input: two points on a line + pt1:[x1,y1] + pt2:[x2,y2] + return: a,b,theta in terms of cy=ax+b + """ + + x1,y1=pt1[0],pt1[1] + x2,y2=pt2[0],pt2[1] + if x1>x2: + x1,y1=pt2[0],pt2[1] + x2,y2=pt1[0],pt1[1] + + if x1==x2: + theta=-np.pi/2 + #x= number + a=1 + b=-x1 + c=0 + else: + theta=np.arctan((y2-y1)/(x2-x1)) + A=np.array([[x1,1],[x2,1]]) + k=np.array([y1,y2]) + sol=np.linalg.solve(A,k) + a,b=sol[0],sol[1] + c=1 + + return a,b,c,theta + +def find_angle_bisector(line_eq1,line_eq2): + """ + line_equation follows same pattern as find_line_eq() + eq=[a,b,c,theta] + which refers to cy=ax+b + """ + \ No newline at end of file -- GitLab