# -*- coding: utf-8 -*- """ Лаба 6 — DXF «Схема расположения шпуров» в масштабе 1:1 (единицы — мм). Полностью редактируемая геометрия: LINE / ARC / CIRCLE / TEXT на слоях, размеры — выносные линии, засечки и текст с проектными значениями. Запуск: python calc/fig-laba6-shpury_dxf.py -> assets/cad/laba6-shpury.dxf """ import numpy as np import ezdxf from ezdxf.enums import TextEntityAlignment # ---- параметры (мм, 1:1) ------------------------------------------------------ R, YC = 2265.0, 1350.0 # свод: радиус и центр (высота стен) RC = 2095.0 # линия контурных шпуров VRUB_DY = (1050.0, 630.0, 210.0, -210.0) VRUB_X = 280.0 OTB = ((0.0, 2710.0), (-870.0, 2230.0), (870.0, 2230.0), (-1230.0, 1070.0), (1230.0, 1070.0)) POD_X = [-2200.0 + 550.0 * i for i in range(9)] # а_п = 550 POD_Y = 520.0 KONT_FLOOR = (-1765.0, -1265.0, -765.0, -265.0, 0.0, 265.0, 765.0, 1265.0, 1765.0) KONT_WALL_Y = (350.0, 875.0, 1400.0) KONT_ARC_Y = tuple(1350.0 + RC * np.sin(np.radians(a)) for a in range(0, 181, 23)) # часть дуги KONT_ARC_ALL = tuple(1350.0 + RC * np.sin(np.radians(a / 2)) for a in range(0, 361, 23)) # ---- документ ----------------------------------------------------------------- doc = ezdxf.new('R2018', setup=True) doc.units = ezdxf.units.MM doc.header['$INSUNITS'] = 4 msp = doc.modelspace() doc.layers.add('KONTOUR', color=7, lineweight=50) doc.layers.add('KONTOUR_DASH', color=8, linetype='DASHED') doc.layers.add('VRUB', color=1) doc.layers.add('OTBOJ', color=5) doc.layers.add('PODOSHV', color=3) doc.layers.add('KONTUR_SP', color=8) doc.layers.add('OS', color=8, linetype='CENTER') doc.layers.add('RAZMER', color=7) doc.styles.add('GOST', font='GOST2304A.ttf') TICK = 90.0 # полузасечки 45 EXT = 150.0 # выступ выносной GAP = 90.0 # зазор текста def line(p1, p2, layer='KONTOUR', lw=None): msp.add_line(p1, p2, dxfattribs={'layer': layer}) def text(x, y, s, h=60.0, rot=0.0, layer='TEXT', align='mcenter'): t = msp.add_text(s, dxfattribs={'style': 'GOST', 'height': h, 'rotation': rot, 'layer': layer}) t.set_placement((x, y), align=getattr(TextEntityAlignment, {'mcenter': 'MIDDLE_CENTER', 'mleft': 'MIDDLE_LEFT', 'mright': 'MIDDLE_RIGHT'}.get(align.lower(), align.upper()))) return t def tick(x, y, size=TICK): line((x - size, y - size), (x + size, y + size), 'RAZMER') def dim_h(y_dim, x1, x2, label, y_ref1=None, y_ref2=None): line((x1, y_dim), (x2, y_dim), 'RAZMER') tick(x1, y_dim); tick(x2, y_dim) y1r = y_ref1 if y_ref1 is not None else y_dim + GAP y2r = y_ref2 if y_ref2 is not None else y_dim + GAP line((x1, y1r), (x1, y_dim - EXT), 'RAZMER') line((x2, y2r), (x2, y_dim - EXT), 'RAZMER') text((x1 + x2) / 2, y_dim - 110.0, label, 55.0) def dim_v(x_dim, y1, y2, label, x_text=None): line((x_dim, y1), (x_dim, y2), 'RAZMER') tick(x_dim, y1); tick(x_dim, y2) xt = x_dim + GAP if x_text is None else x_text text(xt, (y1 + y2) / 2, label, 55.0, rot=90) def solid(p1, p2, p3, layer='RAZMER'): msp.add_solid([p1, p2, p3, p3], dxfattribs={'layer': layer}) # =============================== главный вид ================================== line((-R, 0), (R, 0)) # подошва line((-R, 0), (-R, YC)); line((R, 0), (R, YC)) # стены msp.add_arc((0, YC), R, 0, 180, dxfattribs={'layer': 'KONTOUR'}) # линия контурных шпуров (штриховая) msp.add_arc((0, YC), RC, 0, 180, dxfattribs={'layer': 'KONTOUR_DASH'}) line((-RC, 170), (-RC, YC), 'KONTUR_DASH') line((RC, 170), (RC, YC), 'KONTUR_DASH') line((-RC + 170, 170), (RC - 170, 170), 'KONTUR_DASH') # шпуры (окружности r=45) for x in (VRUB_X, -VRUB_X): for dy in VRUB_DY: msp.add_circle((x, YC + dy), 45, dxfattribs={'layer': 'VRUB'}) for x, y in OTB: msp.add_circle((x, y), 45, dxfattribs={'layer': 'OTBOJ'}) for x in POD_X: msp.add_circle((x, POD_Y), 45, dxfattribs={'layer': 'PODOSHV'}) for a in range(0, 181, 12): msp.add_circle((RC * np.cos(np.radians(a)), YC + RC * np.sin(np.radians(a))), 45, dxfattribs={'layer': 'KONTUR_SP'}) for y in KONT_WALL_Y: msp.add_circle((-RC, y), 45, dxfattribs={'layer': 'KONTUR_SP'}) msp.add_circle((RC, y), 45, dxfattribs={'layer': 'KONTUR_SP'}) for x in (-1265.0, -765.0, 765.0, 1265.0): msp.add_circle((x, 170.0), 45, dxfattribs={'layer': 'KONTUR_SP'}) # ось тоннеля line((0, -700), (0, 4300), 'OS') text(120, 4380, 'ось тоннеля', 55.0, layer='TEXT', align='left') # размеры главного вида: B и H dim_h(-600, -R, R, 'B = 4530') dim_v(3015, 0, 3620, 'H = 3620', x_text=3130) # след секущей плоскости А-А и стрелки взгляда line((0, 3695), (0, 3915), 'VRUB') solid((-30, 3860), (60, 3910), (60, 3810)) text(-450, 3860, 'А', 90.0, align='mright') line((0, -95), (0, -315), 'VRUB') solid((-30, -50), (60, -100), (60, 0)) text(-450, -50, 'А', 90.0, align='mright') # =============================== разрез А-А =================================== X_F, X_DR, X_DC = 5500.0, 8200.0, 9350.0 line((X_F, 3620), (X_DR, 3620)) line((X_F, 0), (X_DR, 0)) line((X_DR, 0), (X_DR, 3620), lw=None) line((X_F, 0), (X_F, 3620)) line((X_DC, 0), (X_DC, 2400)) text((X_F + X_DC) / 2, 3920, 'А-А', 70.0) for y in (2400.0, 1980.0, 1560.0, 1140.0): line((X_F, y), (X_DC, y), 'VRUB') for x, y in OTB: line((X_F, y), (X_DR, y), 'OTBOJ') line((X_F, 520), (X_DR, 520), 'PODOSHV') for y in (350.0, 875.0, 1400.0, 1758.0, 2151.0, 2511.0, 2831.0, 3091.0, 3287.0): line((X_F, y), (X_DR, y), 'KONTUR_SP') # l_вр — тонкая вертикаль на уровне врубовых + размер справа line((X_DC, 0), (X_DC, 2400)) dim_v(9700, 1560, 1980, '420', x_text=9880) dim_v(9700, 2230, 2710, '480', x_text=9880) dim_h(-600, X_F, X_DR, 'l_зах = 3000', y_ref1=0, y_ref2=0) dim_h(-1100, X_F, X_DC, 'l_вр = 3850', y_ref1=0, y_ref2=0) # =============================== план Б-Б ==================================== Y_PF, Y_PB = -1500.0, -5350.0 line((-R, Y_PF), (R, Y_PF)) line((-R, Y_PB), (R, Y_PB)) line((-R, Y_PF), (-R, Y_PB)) line((R, Y_PF), (R, Y_PB)) text(0, Y_PF + 100, 'Б-Б', 70.0) line((-VRUB_X, Y_PF), (0, Y_PB), 'VRUB') line((VRUB_X, Y_PF), (0, Y_PB), 'VRUB') for x, y in OTB: line((x, Y_PF), (x, -4500), 'OTBOJ') for x in POD_X: line((x, Y_PF), (x, -4500), 'PODOSHV') for y in KONT_WALL_Y: pass line((-RC, Y_PF), (-RC, -4500), 'KONTUR_SP') line((RC, Y_PF), (RC, -4500), 'KONTUR_SP') for x in (-1265.0, -765.0, 765.0, 1265.0, 0.0): line((x, Y_PF), (x, -4500), 'KONTUR_SP') dim_h(-4850, -1100, -550, 'а_п = 550', y_ref1=Y_PB, y_ref2=Y_PB) dim_h(-4850, 600, 1200, 'а_о = 600', y_ref1=Y_PB, y_ref2=Y_PB) dim_h(-5150, 765, 1265, 'а_к = 500', y_ref1=Y_PB, y_ref2=Y_PB) dim_v(-2615, Y_PB, Y_PF, 'l_зах = 3000', x_text=-2770) dim_v(2615, Y_PB, Y_PF, 'l_вр = 3850', x_text=2770) # =============================== легенда ====================================== LX, LY = 11000.0, 2200.0 text(LX, LY + 150, 'Условные обозначения:', 65.0, layer='TEXT', align='left') legend = (('VRUB', 'врубовые — 1-8'), ('OTBOJ', 'отбойные — 9-13'), ('PODOSHV', 'подошвенные — 14-22'), ('KONTUR_SP', 'оконтуривающие — 23-48')) for i, (layer, name) in enumerate(legend): y = LY - i * 360.0 line((LX, y), (LX + 300, y), layer) msp.add_circle((LX + 150, y), 45, dxfattribs={'layer': layer}) text(LX + 420, y, name, 60.0, layer='TEXT', align='mleft') # заголовок text(750, 4500, 'СХЕМА РАСПОЛОЖЕНИЯ ШПУРОВ', 110.0, align='mcenter') import os os.makedirs('assets/cad', exist_ok=True) doc.saveas('assets/cad/laba6-shpury.dxf') print('сохранено: assets/cad/laba6-shpury.dxf')