fig-laba6-shpury_dxf.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. # -*- coding: utf-8 -*-
  2. """
  3. Лаба 6 — DXF «Схема расположения шпуров» в масштабе 1:1 (единицы — мм).
  4. Полностью редактируемая геометрия: LINE / ARC / CIRCLE / TEXT на слоях,
  5. размеры — выносные линии, засечки и текст с проектными значениями.
  6. Запуск: python calc/fig-laba6-shpury_dxf.py -> assets/cad/laba6-shpury.dxf
  7. """
  8. import numpy as np
  9. import ezdxf
  10. from ezdxf.enums import TextEntityAlignment
  11. # ---- параметры (мм, 1:1) ------------------------------------------------------
  12. R, YC = 2265.0, 1350.0 # свод: радиус и центр (высота стен)
  13. RC = 2095.0 # линия контурных шпуров
  14. VRUB_DY = (1050.0, 630.0, 210.0, -210.0)
  15. VRUB_X = 280.0
  16. OTB = ((0.0, 2710.0), (-870.0, 2230.0), (870.0, 2230.0),
  17. (-1230.0, 1070.0), (1230.0, 1070.0))
  18. POD_X = [-2200.0 + 550.0 * i for i in range(9)] # а_п = 550
  19. POD_Y = 520.0
  20. KONT_FLOOR = (-1765.0, -1265.0, -765.0, -265.0, 0.0,
  21. 265.0, 765.0, 1265.0, 1765.0)
  22. KONT_WALL_Y = (350.0, 875.0, 1400.0)
  23. KONT_ARC_Y = tuple(1350.0 + RC * np.sin(np.radians(a))
  24. for a in range(0, 181, 23)) # часть дуги
  25. KONT_ARC_ALL = tuple(1350.0 + RC * np.sin(np.radians(a / 2))
  26. for a in range(0, 361, 23))
  27. # ---- документ -----------------------------------------------------------------
  28. doc = ezdxf.new('R2018', setup=True)
  29. doc.units = ezdxf.units.MM
  30. doc.header['$INSUNITS'] = 4
  31. msp = doc.modelspace()
  32. doc.layers.add('KONTOUR', color=7, lineweight=50)
  33. doc.layers.add('KONTOUR_DASH', color=8, linetype='DASHED')
  34. doc.layers.add('VRUB', color=1)
  35. doc.layers.add('OTBOJ', color=5)
  36. doc.layers.add('PODOSHV', color=3)
  37. doc.layers.add('KONTUR_SP', color=8)
  38. doc.layers.add('OS', color=8, linetype='CENTER')
  39. doc.layers.add('RAZMER', color=7)
  40. doc.styles.add('GOST', font='GOST2304A.ttf')
  41. TICK = 90.0 # полузасечки 45
  42. EXT = 150.0 # выступ выносной
  43. GAP = 90.0 # зазор текста
  44. def line(p1, p2, layer='KONTOUR', lw=None):
  45. msp.add_line(p1, p2, dxfattribs={'layer': layer})
  46. def text(x, y, s, h=60.0, rot=0.0, layer='TEXT', align='mcenter'):
  47. t = msp.add_text(s, dxfattribs={'style': 'GOST', 'height': h,
  48. 'rotation': rot, 'layer': layer})
  49. t.set_placement((x, y), align=getattr(TextEntityAlignment, {'mcenter': 'MIDDLE_CENTER', 'mleft': 'MIDDLE_LEFT', 'mright': 'MIDDLE_RIGHT'}.get(align.lower(), align.upper())))
  50. return t
  51. def tick(x, y, size=TICK):
  52. line((x - size, y - size), (x + size, y + size), 'RAZMER')
  53. def dim_h(y_dim, x1, x2, label, y_ref1=None, y_ref2=None):
  54. line((x1, y_dim), (x2, y_dim), 'RAZMER')
  55. tick(x1, y_dim); tick(x2, y_dim)
  56. y1r = y_ref1 if y_ref1 is not None else y_dim + GAP
  57. y2r = y_ref2 if y_ref2 is not None else y_dim + GAP
  58. line((x1, y1r), (x1, y_dim - EXT), 'RAZMER')
  59. line((x2, y2r), (x2, y_dim - EXT), 'RAZMER')
  60. text((x1 + x2) / 2, y_dim - 110.0, label, 55.0)
  61. def dim_v(x_dim, y1, y2, label, x_text=None):
  62. line((x_dim, y1), (x_dim, y2), 'RAZMER')
  63. tick(x_dim, y1); tick(x_dim, y2)
  64. xt = x_dim + GAP if x_text is None else x_text
  65. text(xt, (y1 + y2) / 2, label, 55.0, rot=90)
  66. def solid(p1, p2, p3, layer='RAZMER'):
  67. msp.add_solid([p1, p2, p3, p3], dxfattribs={'layer': layer})
  68. # =============================== главный вид ==================================
  69. line((-R, 0), (R, 0)) # подошва
  70. line((-R, 0), (-R, YC)); line((R, 0), (R, YC)) # стены
  71. msp.add_arc((0, YC), R, 0, 180, dxfattribs={'layer': 'KONTOUR'})
  72. # линия контурных шпуров (штриховая)
  73. msp.add_arc((0, YC), RC, 0, 180, dxfattribs={'layer': 'KONTOUR_DASH'})
  74. line((-RC, 170), (-RC, YC), 'KONTUR_DASH')
  75. line((RC, 170), (RC, YC), 'KONTUR_DASH')
  76. line((-RC + 170, 170), (RC - 170, 170), 'KONTUR_DASH')
  77. # шпуры (окружности r=45)
  78. for x in (VRUB_X, -VRUB_X):
  79. for dy in VRUB_DY:
  80. msp.add_circle((x, YC + dy), 45, dxfattribs={'layer': 'VRUB'})
  81. for x, y in OTB:
  82. msp.add_circle((x, y), 45, dxfattribs={'layer': 'OTBOJ'})
  83. for x in POD_X:
  84. msp.add_circle((x, POD_Y), 45, dxfattribs={'layer': 'PODOSHV'})
  85. for a in range(0, 181, 12):
  86. msp.add_circle((RC * np.cos(np.radians(a)), YC + RC * np.sin(np.radians(a))),
  87. 45, dxfattribs={'layer': 'KONTUR_SP'})
  88. for y in KONT_WALL_Y:
  89. msp.add_circle((-RC, y), 45, dxfattribs={'layer': 'KONTUR_SP'})
  90. msp.add_circle((RC, y), 45, dxfattribs={'layer': 'KONTUR_SP'})
  91. for x in (-1265.0, -765.0, 765.0, 1265.0):
  92. msp.add_circle((x, 170.0), 45, dxfattribs={'layer': 'KONTUR_SP'})
  93. # ось тоннеля
  94. line((0, -700), (0, 4300), 'OS')
  95. text(120, 4380, 'ось тоннеля', 55.0, layer='TEXT', align='left')
  96. # размеры главного вида: B и H
  97. dim_h(-600, -R, R, 'B = 4530')
  98. dim_v(3015, 0, 3620, 'H = 3620', x_text=3130)
  99. # след секущей плоскости А-А и стрелки взгляда
  100. line((0, 3695), (0, 3915), 'VRUB')
  101. solid((-30, 3860), (60, 3910), (60, 3810))
  102. text(-450, 3860, 'А', 90.0, align='mright')
  103. line((0, -95), (0, -315), 'VRUB')
  104. solid((-30, -50), (60, -100), (60, 0))
  105. text(-450, -50, 'А', 90.0, align='mright')
  106. # =============================== разрез А-А ===================================
  107. X_F, X_DR, X_DC = 5500.0, 8200.0, 9350.0
  108. line((X_F, 3620), (X_DR, 3620))
  109. line((X_F, 0), (X_DR, 0))
  110. line((X_DR, 0), (X_DR, 3620), lw=None)
  111. line((X_F, 0), (X_F, 3620))
  112. line((X_DC, 0), (X_DC, 2400))
  113. text((X_F + X_DC) / 2, 3920, 'А-А', 70.0)
  114. for y in (2400.0, 1980.0, 1560.0, 1140.0):
  115. line((X_F, y), (X_DC, y), 'VRUB')
  116. for x, y in OTB:
  117. line((X_F, y), (X_DR, y), 'OTBOJ')
  118. line((X_F, 520), (X_DR, 520), 'PODOSHV')
  119. for y in (350.0, 875.0, 1400.0, 1758.0, 2151.0, 2511.0, 2831.0, 3091.0, 3287.0):
  120. line((X_F, y), (X_DR, y), 'KONTUR_SP')
  121. # l_вр — тонкая вертикаль на уровне врубовых + размер справа
  122. line((X_DC, 0), (X_DC, 2400))
  123. dim_v(9700, 1560, 1980, '420', x_text=9880)
  124. dim_v(9700, 2230, 2710, '480', x_text=9880)
  125. dim_h(-600, X_F, X_DR, 'l_зах = 3000', y_ref1=0, y_ref2=0)
  126. dim_h(-1100, X_F, X_DC, 'l_вр = 3850', y_ref1=0, y_ref2=0)
  127. # =============================== план Б-Б ====================================
  128. Y_PF, Y_PB = -1500.0, -5350.0
  129. line((-R, Y_PF), (R, Y_PF))
  130. line((-R, Y_PB), (R, Y_PB))
  131. line((-R, Y_PF), (-R, Y_PB))
  132. line((R, Y_PF), (R, Y_PB))
  133. text(0, Y_PF + 100, 'Б-Б', 70.0)
  134. line((-VRUB_X, Y_PF), (0, Y_PB), 'VRUB')
  135. line((VRUB_X, Y_PF), (0, Y_PB), 'VRUB')
  136. for x, y in OTB:
  137. line((x, Y_PF), (x, -4500), 'OTBOJ')
  138. for x in POD_X:
  139. line((x, Y_PF), (x, -4500), 'PODOSHV')
  140. for y in KONT_WALL_Y:
  141. pass
  142. line((-RC, Y_PF), (-RC, -4500), 'KONTUR_SP')
  143. line((RC, Y_PF), (RC, -4500), 'KONTUR_SP')
  144. for x in (-1265.0, -765.0, 765.0, 1265.0, 0.0):
  145. line((x, Y_PF), (x, -4500), 'KONTUR_SP')
  146. dim_h(-4850, -1100, -550, 'а_п = 550', y_ref1=Y_PB, y_ref2=Y_PB)
  147. dim_h(-4850, 600, 1200, 'а_о = 600', y_ref1=Y_PB, y_ref2=Y_PB)
  148. dim_h(-5150, 765, 1265, 'а_к = 500', y_ref1=Y_PB, y_ref2=Y_PB)
  149. dim_v(-2615, Y_PB, Y_PF, 'l_зах = 3000', x_text=-2770)
  150. dim_v(2615, Y_PB, Y_PF, 'l_вр = 3850', x_text=2770)
  151. # =============================== легенда ======================================
  152. LX, LY = 11000.0, 2200.0
  153. text(LX, LY + 150, 'Условные обозначения:', 65.0, layer='TEXT', align='left')
  154. legend = (('VRUB', 'врубовые — 1-8'), ('OTBOJ', 'отбойные — 9-13'),
  155. ('PODOSHV', 'подошвенные — 14-22'), ('KONTUR_SP', 'оконтуривающие — 23-48'))
  156. for i, (layer, name) in enumerate(legend):
  157. y = LY - i * 360.0
  158. line((LX, y), (LX + 300, y), layer)
  159. msp.add_circle((LX + 150, y), 45, dxfattribs={'layer': layer})
  160. text(LX + 420, y, name, 60.0, layer='TEXT', align='mleft')
  161. # заголовок
  162. text(750, 4500, 'СХЕМА РАСПОЛОЖЕНИЯ ШПУРОВ', 110.0, align='mcenter')
  163. import os
  164. os.makedirs('assets/cad', exist_ok=True)
  165. doc.saveas('assets/cad/laba6-shpury.dxf')
  166. print('сохранено: assets/cad/laba6-shpury.dxf')