# -*- coding: utf-8 -*- """ Лаба 6, рисунок «Схема расположения шпуров на забое» (вариант 6): выработка S = 14,17 м2, B = 4,53 м; 48 шпуров: 8 врубовых (вертикальный клиновой вруб, 4 пары, 65°), 5 отбойных (сводом параллельно контуру), 9 подошвенных, 26 оконтуривающих. Номера шпуров; справа — разрез А-А со следами всех шпуров в массиве (условно), с глубинами l_зах и l_вр. """ import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patheffects as pe # Чертёжный шрифт ГОСТ 2.304-81 тип А (прямой, из системных шрифтов Windows) import matplotlib.font_manager as fm fm.fontManager.addfont('C:/Windows/Fonts/GOST2304A.ttf') matplotlib.rcParams['font.family'] = 'GOST 2.304 type A' matplotlib.rcParams['mathtext.default'] = 'regular' B = 4.53 R = B / 2.0 # 2,265 — свод полуциркульный HW = 1.35 # высота стены: S = pi R^2/2 + B*HW = 14,17 YC = HW OFF = 0.17 # отступ линии контурных шпуров fig = plt.figure(figsize=(16.2 / 2.54, 15.5 / 2.54), dpi=250) ax = fig.add_axes([0, 0, 1, 1]) ax.set_aspect('equal'); ax.axis('off') XL, XR, YB, YT = -3.30, 7.35, -5.45, 4.75 ax.set_xlim(XL, XR); ax.set_ylim(YB, YT) C_CUT, C_AUX, C_TOE, C_CONT = '#cc1f2d', '#1f5fb4', '#1d8a4b', '#111111' # --- контур выработки и линия контурных шпуров ------------------------------- th = np.linspace(0, np.pi, 200) ax.plot(R * np.cos(th), YC + R * np.sin(th), color='black', lw=2.2) ax.plot([-R, -R], [0, YC], color='black', lw=2.2) ax.plot([R, R], [0, YC], color='black', lw=2.2) ax.plot([-R, R], [0, 0], color='black', lw=2.2) rc = R - OFF ax.plot(rc * np.cos(th), YC + rc * np.sin(th), color='0.4', lw=0.7, ls=(0, (4, 3))) ax.plot([-rc, -rc], [OFF, YC], color='0.4', lw=0.7, ls=(0, (4, 3))) ax.plot([rc, rc], [OFF, YC], color='0.4', lw=0.7, ls=(0, (4, 3))) ax.plot([-rc, rc], [OFF, OFF], color='0.4', lw=0.7, ls=(0, (4, 3))) # --- шпуры -------------------------------------------------------------------- holes = [] # (x, y, color, n, inward) n = 1 for dy in (1.05, 0.63, 0.21, -0.21): # врубовые 1-8: 4 пары, for sx in (-0.28, 0.28): # верхняя пара поднята выше holes.append((sx, YC + dy, C_CUT, n, False)); n += 1 # отбойные 9-13 — сводом параллельно контуру: 5 точек на эллиптической дуге # с равным угловым шагом; пятки дуги на уровне середины стены (y = YC - 0.28) AUX_A, AUX_B, AUX_Y0 = 1.23, 1.64, YC - 0.28 aux_pts = [(AUX_A * np.cos(t), AUX_Y0 + AUX_B * np.sin(t)) for t in np.radians([180, 135, 90, 45, 0])] for (x, y) in aux_pts: holes.append((x, y, C_AUX, n, False)); n += 1 for x in np.linspace(-1.9, 1.9, 9): # подошвенные 14-22 holes.append((x, 0.52, C_TOE, n, False)); n += 1 arc_pts = [(rc * np.cos(t), YC + rc * np.sin(t)) # контурные 23-48 for t in np.linspace(0, np.pi, 17)[1:-1]] for x, y in arc_pts: holes.append((x, y, C_CONT, n, True)); n += 1 for y in np.linspace(YC + 0.05, OFF + 0.30, 3): holes.append((-rc, y, C_CONT, n, True)); n += 1 holes.append((rc, y, C_CONT, n, True)); n += 1 for x in np.linspace(-rc + 0.4, rc - 0.4, 5): holes.append((x, OFF, C_CONT, n, True)); n += 1 assert n - 1 == 48, n - 1 AUX_LB = {9: (-0.11, 0.10, 'right'), 10: (-0.11, 0.10, 'right'), # подписи отбойных 11: (0, 0.16, 'center'), # снаружи дуги, 11 — над замком 12: (0.11, 0.10, 'left'), 13: (0.11, 0.10, 'left')} for x, y, c, num, inward in holes: ax.plot(x, y, 'o', ms=4.6, mfc='white' if c == C_CONT else c, mec=c, mew=1.15, zorder=5) if inward: # подписи контурных — внутрь v = np.array([0 - x, YC - 0.45 - y]); v = v / np.hypot(*v) dx, dy = 0.14 * v[0], 0.14 * v[1] if y <= OFF + 0.13: # нижняя линия — над кружком dx, dy, ha = 0.0, 0.17, 'center' elif y < 0.7 and abs(x) > 1.8: # углы у подошвы — выше, наружу от штриховой dx, dy, ha = (-0.05 if x < 0 else 0.05), 0.18, 'center' elif abs(x) < 0.35 and y > YC + 1.5: # у замка — под кружком: сверху дуга и контур dx, dy, ha = 0.0, -0.20, 'center' else: ha = 'left' if dx > 0 else 'right' elif num in AUX_LB: # подписи отбойных на дуге dx, dy, ha = AUX_LB[num] else: dx, dy, ha = 0.09, 0.09, 'left' if x > 1.8: # шпур 22: подпись влево, чтобы не наезжать на номер 43 dx, dy, ha = -0.09, 0.09, 'right' # белая подложка под цифрами: линии и штрихи не проходят сквозь номера ax.text(x + dx, y + dy, str(num), fontsize=6.3, color=c, zorder=6, ha=ha, va='center', path_effects=[pe.withStroke(linewidth=1.7, foreground='white')]) # --- размеры: засечки 45°, выносные с выступом, число у размерной линии --------- TICK = 0.10 # полудлина засечки EXT = 0.13 # выступ выносной линии за размерную def tick(x, y, color='black'): ax.plot([x - TICK, x + TICK], [y - TICK, y + TICK], color=color, lw=1.4, solid_capstyle='butt', zorder=4) # B — ширина выработки: выносные от пят контура вниз с выступом yb = -0.62 for xe in (-R, R): ax.plot([xe, xe], [0, yb - EXT], color='black', lw=0.55, zorder=1) ax.plot([-R, R], [yb, yb], color='black', lw=0.8, zorder=4) tick(-R, yb); tick(R, yb) ax.text(-1.42, yb - 0.16, 'B = 4530', fontsize=6.4, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # H — высота выработки: нижняя выносная от пяты, верхняя — от замка (верха выработки); # вынесена правее, чтобы не пересекать обозначение Б-Б у правой стены xh = R + 0.75 ax.plot([R, xh + EXT], [0, 0], color='black', lw=0.55, zorder=1) ax.plot([0, xh + EXT], [YC + R, YC + R], color='black', lw=0.55, zorder=1) ax.plot([xh, xh], [0, YC + R], color='black', lw=0.8, zorder=4) tick(xh, 0); tick(xh, YC + R) ax.text(xh - 0.13, (YC + R) / 2, 'H = 3620', fontsize=6.4, rotation=90, ha='center', va='center', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # a_к между соседними контурными на левой части дуги p1, p2 = arc_pts[10], arc_pts[11] ax.plot([p1[0], p2[0]], [p1[1], p2[1]], color='0.3', lw=0.7) mid = ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2) ax.text(mid[0] - 0.62, mid[1] - 0.06, 'a$_к$ = 500', fontsize=6.4, color='0.25', ha='right', va='center', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) ax.annotate('', xy=mid, xytext=(mid[0] - 0.60, mid[1] - 0.06), arrowprops=dict(arrowstyle='-', color='0.25', lw=0.6)) # w_к — от контурного шпура до контура выработки (слева) t = np.radians(118) pw = (rc * np.cos(t), YC + rc * np.sin(t)) qc = (R * np.cos(t), YC + R * np.sin(t)) ax.plot([pw[0], qc[0]], [pw[1], qc[1]], color='0.25', lw=0.7, zorder=4) tick(pw[0], pw[1], '0.25'); tick(qc[0], qc[1], '0.25') ax.text(pw[0] - 0.18, pw[1] + 0.16, 'w$_к$ = 630', fontsize=6.4, color='0.25', ha='right', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # след секущей плоскости А-А (ГОСТ 2.305, как на паспорте БВР): тонкая линия # сечения сквозь весь вид, на концах — толстые штрихи за контуром; стрелка # взгляда вплотную остриём к штриху, буква «А» со стороны хвоста стрелки s_top, s_bot = YC + R + 0.36, -0.38 ax.plot([0, 0], [-0.10, YC + R + 0.06], color='black', lw=0.6, zorder=3) for ys1, ys2 in ((YC + R + 0.06, s_top), (-0.10, s_bot)): ax.plot([0, 0], [ys1, ys2], color='black', lw=1.8, solid_capstyle='butt', zorder=4) for ys in (s_top - 0.05, s_bot + 0.05): ax.annotate('', xy=(0.0, ys), xytext=(-0.34, ys), arrowprops=dict(arrowstyle='-|>', color='black', lw=0.9, mutation_scale=11, shrinkA=0, shrinkB=0)) ax.text(-0.44, ys, 'А', fontsize=9, color='black', va='center', ha='right') # след секущей плоскости Б-Б: горизонтальная линия сечения у обеих стен, # штрихи за контуром вида, стрелки взгляда вниз (к разрезу, расположенному ниже) y_cut = 0.7 for xs in (-R - 0.33, R + 0.33): ax.plot([xs - 0.11, xs + 0.11], [y_cut, y_cut], color='black', lw=1.8, solid_capstyle='butt', zorder=4) ax.annotate('', xy=(xs, y_cut), xytext=(xs, y_cut + 0.28), arrowprops=dict(arrowstyle='-|>', color='black', lw=0.9, mutation_scale=11, shrinkA=0, shrinkB=0)) ax.text(xs, y_cut + 0.40, 'Б', fontsize=9, color='black', ha='center') # --- вид слева: все шпуры в разрезе (условно) — забой слева, массив вправо ------- x_f = 3.45 # линия забоя (толстая) K_D = 0.75 # горизонтальный масштаб глубины (условно) D_R, D_C = 3.0, 3.3 # глубина рядовых и врубовых шпуров, м x_dr, x_dc = x_f + K_D * D_R, x_f + K_D * D_C hgt = YC + R ax.plot([x_f, x_dc], [hgt, hgt], color='black', lw=1.0) ax.plot([x_f, x_dc], [0, 0], color='black', lw=1.0) ax.plot([x_dc] * 2, [0, hgt], color='black', lw=1.0) ax.plot([x_f] * 2, [0, hgt], color='black', lw=1.6) ax.text((x_f + x_dc) / 2, hgt + 0.30, 'А–А', fontsize=8.6, ha='center') for y_k in (2.40, 1.98, 1.56, 1.14): # врубовые: горизонтальные следы пар ax.plot([x_f, x_dc], [y_k, y_k], color=C_CUT, lw=0.9) for y_k in (2.71, 2.23, 1.07): # отбойные ax.plot([x_f, x_dr], [y_k, y_k], color=C_AUX, lw=0.9) ax.plot([x_f, x_dr], [0.52, 0.52], color=C_TOE, lw=0.9) # подошвенные t_arc = np.radians(np.arange(1, 16) * 180 / 16) # оконтуривающие: for y_k in sorted({round(YC + rc * np.sin(t), 3) for t in t_arc} # свод, стены, | {1.40, 0.875, 0.35, OFF}): # подошва ax.plot([x_f, x_dr], [y_k, y_k], color='0.25', lw=0.7) # l_зах и l_вр — размерные линии глубин под видом слева; текст под размерной линией for xd, dim_y, txt in ((x_dr, -0.38, 'l$_зах$ = 3000'), (x_dc, -0.86, 'l$_вр$ = 3850')): ax.plot([x_f, x_f], [0, dim_y - 0.09], color='black', lw=0.55, zorder=1) ax.plot([xd, xd], [0, dim_y - 0.09], color='black', lw=0.55, zorder=1) ax.plot([x_f, xd], [dim_y, dim_y], color='black', lw=0.8, zorder=4) tick(x_f, dim_y); tick(xd, dim_y) ax.text((x_f + xd) / 2, dim_y - 0.16, txt, fontsize=6.4, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # расстояния между шпурами по высоте — цепочки справа от вида А-А: # врубовые, отбойные и оконтуривающие (уровни следов); в мм chains = ((x_dc + 0.33, (1.14, 1.56, 1.98, 2.40)), (x_dc + 0.72, (1.07, 2.23, 2.71)), (x_dc + 1.11, (0.35, 0.875, 1.40, 1.758, 2.151, 2.511, 2.831, 3.091, 3.287))) for xd_c, y_rows in chains: for yk in y_rows: ax.plot([x_dc, xd_c + 0.09], [yk, yk], color='black', lw=0.55, zorder=1) ax.plot([xd_c, xd_c], [y_rows[0], y_rows[-1]], color='black', lw=0.8, zorder=4) for ya, yb in zip(y_rows[:-1], y_rows[1:]): tick(xd_c, ya); tick(xd_c, yb) if yb - ya >= 0.19: ax.text(xd_c + 0.17, (ya + yb) / 2, f'{(round((yb - ya) * 1000) + 5) // 10 * 10}', fontsize=6.4, rotation=90, ha='center', va='center', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # --- разрез Б-Б (план): забой сверху, массив вниз; врубовые сходятся к оси ------- y_pf = -1.15 # линия забоя (толстая) y_pb = y_pf - K_D * D_C # нижняя граница плана (глубина врубовых) ax.plot([-R, R], [y_pf, y_pf], color='black', lw=1.6) ax.plot([-R, R], [y_pb, y_pb], color='black', lw=1.0) ax.plot([-R] * 2, [y_pf, y_pb], color='black', lw=1.0) ax.plot([R] * 2, [y_pf, y_pb], color='black', lw=1.0) ax.text(0, y_pf + 0.30, 'Б–Б', fontsize=8.6, ha='center') for xs in (-0.28, 0.28): # врубовые: веер к оси на глубине вруба ax.plot([xs, 0], [y_pf, y_pb], color=C_CUT, lw=0.9) for xs, c, lw in ([(0, C_AUX, 0.9), (-0.87, C_AUX, 0.9), (0.87, C_AUX, 0.9), # отбойные (-1.23, C_AUX, 0.9), (1.23, C_AUX, 0.9)] + [(x, C_TOE, 0.9) for x in np.linspace(-1.9, 1.9, 9)] # подошвенные + [(-2.095, '0.25', 0.7), (2.095, '0.25', 0.7)] # стены + [(x, '0.25', 0.7) for x in np.linspace(-rc + 0.4, rc - 0.4, 5)]): # подошва ax.plot([xs, xs], [y_pf, y_pf - K_D * D_R], color=c, lw=lw) # размеры Б-Б: расстояния между подошвенными (а_п), отбойными (а_о) # и контурными (а_к) шпурами, глубина рядовых шпуров слева y_end = y_pf - K_D * D_R for xa, xb, txt in ((-1.425, -0.95, 'а$_п$ = 550'), (0.87, 1.23, 'а$_о$ = 600'), (0.84875, 1.6975, 'а$_к$ = 500')): dim_y = -3.90 if txt != 'а$_к$ = 500' else -4.42 for xe in (xa, xb): ax.plot([xe, xe], [y_end, dim_y - 0.09], color='black', lw=0.55, zorder=1) ax.plot([xa, xb], [dim_y, dim_y], color='black', lw=0.8, zorder=4) tick(xa, dim_y); tick(xb, dim_y) ax.text((xa + xb) / 2, dim_y - 0.16, txt, fontsize=6.4, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) xd_l = -(R + 0.35) ax.plot([xd_l, xd_l], [y_pf, y_end], color='black', lw=0.8, zorder=4) ax.plot([-R, xd_l - 0.09], [y_pf, y_pf], color='black', lw=0.55, zorder=1) ax.plot([-R, xd_l - 0.09], [y_end, y_end], color='black', lw=0.55, zorder=1) tick(xd_l, y_pf); tick(xd_l, y_end) ax.text(xd_l - 0.15, (y_pf + y_end) / 2, 'l$_зах$ = 3000', fontsize=6.4, rotation=90, ha='center', va='center', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # B — ширина выработки (низ плана) и l_вр — глубина врубовых шпуров (справа) yb_bb = -4.95 ax.plot([-R, -R], [y_pb, yb_bb - 0.09], color='black', lw=0.55, zorder=1) ax.plot([R, R], [y_pb, yb_bb - 0.09], color='black', lw=0.55, zorder=1) ax.plot([-R, R], [yb_bb, yb_bb], color='black', lw=0.8, zorder=4) tick(-R, yb_bb); tick(R, yb_bb) ax.text(0, yb_bb - 0.16, 'B = 4530', fontsize=6.4, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) xd_r = R + 0.35 ax.plot([xd_r, xd_r], [y_pf, y_pb], color='black', lw=0.8, zorder=4) ax.plot([R, xd_r + 0.09], [y_pf, y_pf], color='black', lw=0.55, zorder=1) ax.plot([R, xd_r + 0.09], [y_pb, y_pb], color='black', lw=0.55, zorder=1) tick(xd_r, y_pf); tick(xd_r, y_pb) ax.text(xd_r + 0.15, (y_pf + y_pb) / 2, 'l$_вр$ = 3850', fontsize=6.4, rotation=90, ha='center', va='center', bbox=dict(facecolor='white', edgecolor='none', pad=1.0)) # --- легенда и заголовок --------------------------------------------------------- lx, ly = 3.45, -2.00 # легенда — в правой графе, под разрезом А-А items = [('врубовые — 1-8', C_CUT), ('отбойные — 9-13', C_AUX), ('подошвенные — 14-22', C_TOE), ('оконтуривающие — 23-48', C_CONT)] ax.text(lx, ly + 0.36, 'Условные обозначения:', fontsize=8.0, weight='normal') for i, (txt, c) in enumerate(items): yy = ly - i * 0.36 ax.plot([lx, lx + 0.3], [yy, yy], color=c, lw=2.2) ax.plot(lx + 0.15, yy, 'o', ms=4.0, mfc='white' if c == C_CONT else c, mec=c, mew=1.1) ax.text(lx + 0.42, yy, txt, fontsize=7.6, va='center') ax.text(0.9, YT - 0.3, 'Схема расположения шпуров', fontsize=9.6, weight='normal', ha='center') fig.savefig('assets/images/laba6-shpury-zaboya.png', dpi=250, facecolor='white') print('сохранено: assets/images/laba6-shpury-zaboya.png')