| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- # -*- 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')
|