工具箱相关
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

drawDMtable_20241202_QT.py 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. from pyautocad import Autocad, APoint, aDouble
  2. import shapefile
  3. from shapefile import Reader
  4. def takeSec(elem):
  5. return elem[1]
  6. def fill3(str1):
  7. if len(str1) == 5:
  8. str2 = str1
  9. elif len(str1) == 4:
  10. str2 = '0' + str1
  11. elif len(str1) == 3:
  12. str2 = '00' + str1
  13. else:
  14. str2 = '000' + str1
  15. return str2
  16. def start():
  17. dmdpath = r'D:\4work_now\20241017dm\20241129\hltdm3\dmd.shp'
  18. dmxpath = r'D:\4work_now\20241017dm\20241129\hltdm3\dmx.shp'
  19. mbpath = r'D:\4work_now\20241017dm\20241129\hltdm3\mb.dwg'
  20. #要手动建
  21. outpath = r'D:\4work_now\20241017dm\20241129\hltdm3\HLT.dwg'
  22. txtpath = r'D:\4work_now\20241017dm\20241129\hltdm3\log.txt'
  23. #读取shapefile
  24. #线用来索引
  25. max1 = 0
  26. dmxdict = dict()
  27. with Reader(dmdpath) as dmd:
  28. dmdrec = dmd.records()
  29. with Reader(dmxpath) as dmx:
  30. dmxrec = dmx.records()
  31. for dmxr in dmxrec:
  32. knum = dmxr.KZ
  33. kzh = dmxr.ZH
  34. try:
  35. zzh = kzh.split('.',-1)[0]
  36. except:
  37. zzh = kzh
  38. if knum > max1:
  39. max1 = knum
  40. list1 = []
  41. #记录要删除的index,统一删
  42. index1 = []
  43. id = 0
  44. for dmdr in dmdrec:
  45. dzh = dmdr.ZH
  46. if dzh == kzh:
  47. lista = []
  48. #这里就计算累距
  49. lj1 = dmdr.LJ * dmdr.SFR
  50. lista.append(dmdr.height)
  51. lista.append(lj1)
  52. lista.append(dmdr.SFL)
  53. list1.append(lista)
  54. index1.append(id)
  55. id = id + 1
  56. # #因为会有区别,所以要用个值
  57. # zz = 0
  58. # for ind in index1:
  59. # num0 = ind - zz
  60. # dmdrec.pop(num0)
  61. # zz = zz + 1
  62. dmxdict[zzh] = list1
  63. kk = max1
  64. #链接cad
  65. acad = Autocad(create_if_not_exists=True)
  66. acad.Application.Documents.Open(outpath)
  67. target_doc = acad.ActiveDocument
  68. if kk > 20:
  69. #要那个大框的
  70. num1 = kk // 20
  71. nn = 0
  72. while nn <= num1:
  73. yy = 0
  74. if nn == num1:
  75. max2 = kk
  76. num2 = kk % 20
  77. min2 = max2 - num2
  78. numa1 = (nn*4200) + 10
  79. numa2 = ((nn+1) * 4200) + 120
  80. numa3 = (num2 * 200) + 270
  81. jx1 = [numa1,-10,0]
  82. jx2 = [numa2,-10,0]
  83. jx3 = [numa2,numa3,0]
  84. jx4 = [numa1,numa3,0]
  85. line1 = jx1 + jx2 + jx3 + jx4 + jx1
  86. pnts1 = aDouble(line1)
  87. plineObj1 = acad.model.AddPolyLine(pnts1)
  88. #文字
  89. stra1 = 'K' + str(min2) +'+000 - K' + str(max2) + '+950'
  90. numa5 = (numa1 + numa2) / 2
  91. numa6 = (num2 * 200) + 210
  92. p1 = APoint(numa5,numa6)
  93. text1 = acad.model.AddText(stra1,p1,30)
  94. text1.Color = 1
  95. else:
  96. max2 = 19 + (nn * 20)
  97. min2 = nn * 20
  98. numa1 = (nn*4200) + 10
  99. numa2 = ((nn+1) * 4200) +120
  100. numa3 = 4070
  101. jx1 = [numa1,-10,0]
  102. jx2 = [numa2,-10,0]
  103. jx3 = [numa2,numa3,0]
  104. jx4 = [numa1,numa3,0]
  105. line1 = jx1 + jx2 + jx3 + jx4 + jx1
  106. pnts1 = aDouble(line1)
  107. plineObj1 = acad.model.AddPolyLine(pnts1)
  108. #文字
  109. stra1 = 'K' + str(min2) +'+000 - K' + str(max2) + '+950'
  110. numa5 = (numa1 + numa2) / 2
  111. numa6 = 4010
  112. p1 = APoint(numa5,numa6)
  113. text1 = acad.model.AddText(stra1,p1,30)
  114. text1.Color = 1
  115. mm = max2
  116. x0 = (nn * 4220) + 300
  117. while mm >= min2:
  118. xx = x0
  119. jj = 0
  120. jj1 = 0
  121. while jj < 1000:
  122. zhA = 'K' + str(mm) + '+' + str(str(jj).zfill(3))
  123. key1 = dmxdict.get(zhA, 'none')
  124. if key1 == 'none':
  125. # pass
  126. xx = xx + 210
  127. else:
  128. if len(key1) == 0:
  129. dmxdict.pop(zhA,'nonevalue')
  130. xx = xx + 210
  131. else:
  132. list2 = key1
  133. list2.sort(key=takeSec)
  134. slj = 0
  135. list3 = []
  136. for li4 in list2:
  137. if li4[1] == list2[0][1]:
  138. slj = li4[1]
  139. xs = 1
  140. listb1 = []
  141. listb1.append(li4[0])
  142. listb1.append(li4[1])
  143. listb1.append(xs)
  144. listb1.append(li4[2])
  145. list3.append(listb1)
  146. else:
  147. listb1 = []
  148. #区分下正负交替的部分
  149. if slj < 0 and li4[1] >=0:
  150. dis = 5
  151. slj = li4[1]
  152. else:
  153. dis = abs(abs(slj) - abs(li4[1]))
  154. if dis >= 3:
  155. xs = 1
  156. slj = li4[1]
  157. else:
  158. xs = -1
  159. listb1.append(li4[0])
  160. listb1.append(li4[1])
  161. listb1.append(xs)
  162. listb1.append(li4[2])
  163. list3.append(listb1)
  164. #只对模板进行开关
  165. acad.Application.Documents.Open(mbpath)
  166. doc = acad.ActiveDocument
  167. #先写,再移动
  168. text1 = list(acad.iter_objects("Text"))
  169. #防止重复
  170. k1 = 1
  171. k2 = 1
  172. minnum = 0
  173. pd1 = -1
  174. if abs(list3[0][1])>=28.7 or abs(list3[len(list3)-1][1])>=28.7:
  175. pd1 = 1
  176. for t2 in text1:
  177. if 'K' in t2.TextString:
  178. #最下面那个桩号
  179. t2.TextString = zhA
  180. if '+' in t2.TextString and 'K' not in t2.TextString:
  181. if k1 == -1:
  182. pass
  183. else:
  184. for li1 in list3:
  185. if li1[2] == -1:
  186. pass
  187. else:
  188. #找到相对位置进行位移并赋值
  189. if li1[1] == list3[0][1]:
  190. if pd1 ==1:
  191. #就以那个为起点
  192. num4 = str(format(li1[1], '.1f')).replace('-','')
  193. str5 = fill3(num4)
  194. str2 = '-0+' + str5
  195. t2.TextString = str2
  196. else:
  197. # jl1 = abs(abs(li1[1]) - 28.7)
  198. # center = APoint(0,0,0)
  199. # pt = APoint(jl1,0,0)
  200. # t2.move(center,pt)
  201. num4 = str(format(li1[1], '.1f')).replace('-','')
  202. str5 = fill3(num4)
  203. str2 = '-0+' + str5
  204. t2.TextString = str2
  205. minnum = abs(li1[1])
  206. else:
  207. #复制
  208. copy = t2.Copy()
  209. #移动
  210. jl1 = minnum + li1[1]
  211. center = APoint(0,0,0)
  212. pt = APoint(jl1,0,0)
  213. copy.move(center,pt)
  214. #重新赋值
  215. if li1[1] < 0:
  216. num4 = str(format(li1[1], '.1f')).replace('-','')
  217. str5 = fill3(num4)
  218. str2 = '-0+' + str5
  219. else:
  220. try:
  221. num4 = str(format(li1[1], '.1f')).replace('-','')
  222. except:
  223. num4 = str(format(li1[1], '.1f'))
  224. str5 = fill3(num4)
  225. str2 = '0+' + str5
  226. copy.TextString = str2
  227. k1 = -1
  228. if '.' in t2.TextString and '+' not in t2.TextString:
  229. if k2 == -1:
  230. pass
  231. else:
  232. for li1 in list3:
  233. if li1[2] == -1:
  234. pass
  235. else:
  236. #找到相对位置进行位移并赋值
  237. if li1[1] == list3[0][1]:
  238. if pd1 == 1:
  239. #就以那个为起点
  240. str2 = str(format(li1[0], '.1f'))
  241. t2.TextString = str2
  242. else:
  243. # jl1 = abs(abs(li1[1]) - 28.7)
  244. # center = APoint(0,0,0)
  245. # pt = APoint(jl1,0,0)
  246. # t2.move(center,pt)
  247. str2 = str(format(li1[0], '.1f'))
  248. t2.TextString = str2
  249. else:
  250. #复制
  251. copy = t2.Copy()
  252. #移动
  253. jl1 = minnum + li1[1]
  254. center = APoint(0,0,0)
  255. pt = APoint(jl1,0,0)
  256. copy.move(center,pt)
  257. #重新赋值
  258. str2 = str(format(li1[0], '.1f'))
  259. copy.TextString = str2
  260. k2 = -1
  261. print('B')
  262. #设置一条二位多段线line
  263. line1 = []
  264. road = -1
  265. mn = 0
  266. for li3 in list3:
  267. hh = li3[0]
  268. #-----------------------------------------------------------------------------------------------------------------------
  269. gc = abs(410 - hh)
  270. #-----------------------------------------------------------------------------------------------------------------------
  271. # gc = abs(670 - hh)
  272. lj4 = minnum + li3[1]
  273. lj5 = 0
  274. # if pd1 == 1:
  275. # zbx = 91.6 + lj4
  276. # else:
  277. # lj5 = abs(abs(li3[1]) - 28.7)
  278. # zbx = 91.6 + lj4+lj5
  279. zbx = 91.6 + lj4
  280. zby = gc + 56.7
  281. pt1 = [zbx,zby,0]
  282. line1 = line1 + pt1
  283. if li3[2] ==-1:
  284. #那个竖线
  285. ptA = APoint(zbx,zby)
  286. ptB = APoint(zbx,57)
  287. # ptB = APoint(zbx,(yy+25+37))
  288. lnobj2 = acad.model.AddLine(ptA,ptB)
  289. #这个要调一下
  290. lnobj2.Color = 3
  291. else:
  292. #那个竖线
  293. ptA = APoint(zbx,zby)
  294. ptB = APoint(zbx,22)
  295. # ptB = APoint(zbx,(yy+27))
  296. lnobj2 = acad.model.AddLine(ptA,ptB)
  297. #这个要调一下
  298. lnobj2.Color = 3
  299. #单独看下需要写出路的部分
  300. try:
  301. if li3[3] == 1 and list3[mn+1][3] == 1 and abs(list3[mn+1][0] -li3[0]) <1:
  302. if road == -1:
  303. # str6 = '水泥路'
  304. # text3 = acad.model.AddText(str6,ptA,1)
  305. # text3.Color = 1
  306. text3 = list(acad.iter_objects("Text"))
  307. for t3 in text3:
  308. if '路' in t3.TextString:
  309. center = APoint(0,0)
  310. numb1 = 91.5+lj4
  311. # if pd1 == 1:
  312. # numb1 = 91.5+lj4
  313. # else:
  314. # numb1 = 91.5 + lj4+lj5
  315. numb2 = 58+gc
  316. pt3 = APoint(numb1,numb2)
  317. t3.move(center,pt3)
  318. road = 1
  319. except:
  320. pass
  321. mn = mn + 1
  322. if road == -1:
  323. #删除标注
  324. text3 = list(acad.iter_objects("Text"))
  325. for t3 in text3:
  326. if '路' in t3.TextString:
  327. t3.Delete()
  328. #把线绘制出来
  329. pnts = aDouble(line1)
  330. try:
  331. plineObj = acad.model.AddPolyLine(pnts)
  332. except:
  333. with open(txtpath,'a+')as line1:
  334. line1.write(zhA)
  335. line1.flush()
  336. print('C')
  337. handle_string = 'select'
  338. text1 = list(acad.iter_objects(["Text", "Line","Circle"]))
  339. for t1 in text1:
  340. handle_string += ' (handent "'+t1.Handle+'")'
  341. #命令
  342. handle_string += '\n\n'
  343. doc.SendCommand(handle_string)
  344. #移动的距离
  345. str1 = 'move\n0,0,0\n' + str(xx) + ','+ str(yy) + ',0\n'
  346. #移动
  347. # doc.SendCommand('move\n-80,-140,0\n760,-140,0\n')
  348. doc.SendCommand(str1)
  349. #再次选择
  350. doc.SendCommand(handle_string)
  351. doc.SendCommand('copybase\n0,0,0\n')
  352. # target_doc.SendCommand('PASTEORIG\n')
  353. target_doc.SendCommand('PASTEORIG\n')
  354. #过程的不保存(删除所有要素)
  355. doc.Close(False)
  356. print(zhA + 'Finish')
  357. xx = xx + 210
  358. dmxdict.pop(zhA,'nonevalue')
  359. jj = jj + 50
  360. mm = mm - 1
  361. yy =yy + 200
  362. nn = nn + 1
  363. else:
  364. yy = 0
  365. while kk >= 0:
  366. xx = 0
  367. jj = 0
  368. while jj < 1000:
  369. zhA = 'K' + str(kk) + '+' + str(str(jj).zfill(3))
  370. key1 = dmxdict.get(zhA, 'none')
  371. if key1 == 'none':
  372. # xx = xx + 210
  373. pass
  374. else:
  375. if len(key1) == 0:
  376. dmxdict.pop(zhA,'nonevalue')
  377. xx = xx + 210
  378. else:
  379. list2 = key1
  380. list2.sort(key=takeSec)
  381. slj = 0
  382. list3 = []
  383. for li4 in list2:
  384. if li4[1] == list2[0][1]:
  385. slj = li4[1]
  386. xs = 1
  387. listb1 = []
  388. listb1.append(li4[0])
  389. listb1.append(li4[1])
  390. listb1.append(xs)
  391. listb1.append(li4[2])
  392. list3.append(listb1)
  393. else:
  394. listb1 = []
  395. #区分下正负交替的部分
  396. if slj < 0 and li4[1] >=0:
  397. dis = 5
  398. slj = li4[1]
  399. else:
  400. dis = abs(abs(slj) - abs(li4[1]))
  401. if dis >= 3:
  402. xs = 1
  403. slj = li4[1]
  404. else:
  405. xs = -1
  406. listb1.append(li4[0])
  407. listb1.append(li4[1])
  408. listb1.append(xs)
  409. listb1.append(li4[2])
  410. list3.append(listb1)
  411. #只对模板进行开关
  412. acad.Application.Documents.Open(mbpath)
  413. doc = acad.ActiveDocument
  414. #先写,再移动
  415. text1 = list(acad.iter_objects("Text"))
  416. #防止重复
  417. k1 = 1
  418. k2 = 1
  419. minnum = 0
  420. pd1 = -1
  421. if abs(list3[0][1])>=28.7 or abs(list3[len(list3)-1][1])>=28.7:
  422. pd1 = 1
  423. for t2 in text1:
  424. if 'K' in t2.TextString:
  425. #最下面那个桩号
  426. t2.TextString = zhA
  427. if '+' in t2.TextString and 'K' not in t2.TextString:
  428. if k1 == -1:
  429. pass
  430. else:
  431. for li1 in list3:
  432. if li1[2] == -1:
  433. pass
  434. else:
  435. #找到相对位置进行位移并赋值
  436. if li1[1] == list3[0][1]:
  437. if pd1 ==1:
  438. #就以那个为起点
  439. num4 = str(format(li1[1], '.1f')).replace('-','')
  440. str5 = fill3(num4)
  441. str2 = '-0+' + str5
  442. t2.TextString = str2
  443. else:
  444. jl1 = abs(abs(li1[1]) - 28.7)
  445. center = APoint(0,0,0)
  446. pt = APoint(jl1,0,0)
  447. t2.move(center,pt)
  448. num4 = str(format(li1[1], '.1f')).replace('-','')
  449. str5 = fill3(num4)
  450. str2 = '-0+' + str5
  451. t2.TextString = str2
  452. minnum = abs(li1[1])
  453. else:
  454. #复制
  455. copy = t2.Copy()
  456. #移动
  457. jl1 = minnum + li1[1]
  458. center = APoint(0,0,0)
  459. pt = APoint(jl1,0,0)
  460. copy.move(center,pt)
  461. #重新赋值
  462. if li1[1] < 0:
  463. num4 = str(format(li1[1], '.1f')).replace('-','')
  464. str5 = fill3(num4)
  465. str2 = '-0+' + str5
  466. else:
  467. try:
  468. num4 = str(format(li1[1], '.1f')).replace('-','')
  469. except:
  470. num4 = str(format(li1[1], '.1f'))
  471. str5 = fill3(num4)
  472. str2 = '0+' + str5
  473. copy.TextString = str2
  474. k1 = -1
  475. if '.' in t2.TextString and '+' not in t2.TextString:
  476. if k2 == -1:
  477. pass
  478. else:
  479. for li1 in list3:
  480. if li1[2] == -1:
  481. pass
  482. else:
  483. #找到相对位置进行位移并赋值
  484. if li1[1] == list3[0][1]:
  485. if pd1 == 1:
  486. #就以那个为起点
  487. str2 = str(format(li1[0], '.1f'))
  488. t2.TextString = str2
  489. else:
  490. jl1 = abs(abs(li1[1]) - 28.7)
  491. center = APoint(0,0,0)
  492. pt = APoint(jl1,0,0)
  493. t2.move(center,pt)
  494. str2 = str(format(li1[0], '.1f'))
  495. t2.TextString = str2
  496. else:
  497. #复制
  498. copy = t2.Copy()
  499. #移动
  500. jl1 = minnum + li1[1]
  501. center = APoint(0,0,0)
  502. pt = APoint(jl1,0,0)
  503. copy.move(center,pt)
  504. #重新赋值
  505. str2 = str(format(li1[0], '.1f'))
  506. copy.TextString = str2
  507. k2 = -1
  508. print('B')
  509. #设置一条二位多段线line
  510. line1 = []
  511. road = -1
  512. mn = 0
  513. for li3 in list3:
  514. hh = li3[0]
  515. #-----------------------------------------------------------------------------------------------------------------------
  516. gc = abs(420- hh)
  517. #-----------------------------------------------------------------------------------------------------------------------
  518. # gc = abs(670 - hh)
  519. lj4 = minnum + li3[1]
  520. zbx = 91.6 + lj4
  521. zby = gc + 56.7
  522. pt1 = [zbx,zby,0]
  523. line1 = line1 + pt1
  524. if li3[2] ==-1:
  525. #那个竖线
  526. ptA = APoint(zbx,zby)
  527. ptB = APoint(zbx,56.7)
  528. # ptB = APoint(zbx,(yy+25+37))
  529. lnobj2 = acad.model.AddLine(ptA,ptB)
  530. #这个要调一下
  531. lnobj2.Color = 3
  532. else:
  533. #那个竖线
  534. ptA = APoint(zbx,zby)
  535. ptB = APoint(zbx,22)
  536. # ptB = APoint(zbx,(yy+27))
  537. lnobj2 = acad.model.AddLine(ptA,ptB)
  538. #这个要调一下
  539. lnobj2.Color = 3
  540. #单独看下需要写出路的部分
  541. try:
  542. if li3[3] == 1 and list3[mn+1][3] == 1 and abs(list3[mn+1][0] -li3[0]) <1:
  543. if road == -1:
  544. # str6 = '水泥路'
  545. # text3 = acad.model.AddText(str6,ptA,1)
  546. # text3.Color = 1
  547. text3 = list(acad.iter_objects("Text"))
  548. for t3 in text3:
  549. if '路' in t3.TextString:
  550. center = APoint(0,0)
  551. numb1 = 91.5+lj4
  552. numb2 = 58+gc
  553. pt3 = APoint(numb1,numb2)
  554. t3.move(center,pt3)
  555. gc1 = hh
  556. road = 1
  557. except:
  558. pass
  559. mn = mn + 1
  560. if road == -1:
  561. #删除标注
  562. text3 = list(acad.iter_objects("Text"))
  563. for t3 in text3:
  564. if '路' in t3.TextString:
  565. t3.Delete()
  566. #把线绘制出来
  567. pnts = aDouble(line1)
  568. try:
  569. plineObj = acad.model.AddPolyLine(pnts)
  570. except:
  571. with open(txtpath,'a+')as line1:
  572. line1.write(zhA)
  573. line1.flush()
  574. print('C')
  575. handle_string = 'select'
  576. text1 = list(acad.iter_objects(["Text", "Line","Circle"]))
  577. for t1 in text1:
  578. handle_string += ' (handent "'+t1.Handle+'")'
  579. #命令
  580. handle_string += '\n\n'
  581. doc.SendCommand(handle_string)
  582. #移动的距离
  583. str1 = 'move\n0,0,0\n' + str(xx) + ','+ str(yy) + ',0\n'
  584. #移动
  585. # doc.SendCommand('move\n-80,-140,0\n760,-140,0\n')
  586. doc.SendCommand(str1)
  587. #再次选择
  588. doc.SendCommand(handle_string)
  589. doc.SendCommand('copybase\n0,0,0\n')
  590. # target_doc.SendCommand('PASTEORIG\n')
  591. target_doc.SendCommand('PASTEORIG\n')
  592. #过程的不保存(删除所有要素)
  593. doc.Close(False)
  594. print(zhA + 'Finish')
  595. xx = xx + 210
  596. dmxdict.pop(zhA,'nonevalue')
  597. jj = jj + 10
  598. kk = kk - 1
  599. yy =yy + 200
  600. target_doc.Close()
  601. if __name__ == '__main__':
  602. start()