import json import io import http.server from urllib.parse import quote import math from collections import Counter from pathlib import Path import tempfile import unittest import r2c class DrawingReconstructionTests(unittest.TestCase): @classmethod def setUpClass(cls): cls.entities, cls.blocks, cls.raw = r2c.read_dxf(r2c.DEFAULT_DXF) cls.model = r2c.extract_model(cls.entities, cls.raw) cls.meshes = r2c.make_mesh(cls.model) def test_diameter_and_dimensions_match_both_section_and_table(self): m = self.model self.assertEqual(m['diameter'], 1000) self.assertAlmostEqual(m['length'], 1620) self.assertAlmostEqual(m['width'], 1540) self.assertAlmostEqual(m['height'], 1486) self.assertAlmostEqual(m['axisHeight'], 666) self.assertEqual(len(m['table']), 7) self.assertEqual([r['D'] for r in m['table']], [700, 800, 900, 1000, 1100, 1200, 1350]) def test_inlet_is_rectangular_and_outlet_is_circular(self): profiles = self.model['profiles'] self.assertEqual(profiles[0]['kind'], 'rectangle') self.assertAlmostEqual(profiles[0]['halfWidth'] * 2, 1310) self.assertAlmostEqual(profiles[0]['top'] + profiles[0]['bottom'], 1205) self.assertEqual(profiles[2]['kind'], 'circle') self.assertEqual(profiles[2]['radius'], 500) self.assertEqual(profiles[2]['x'], 1400) self.assertAlmostEqual(profiles[-1]['x'], 1620) self.assertAlmostEqual(profiles[-1]['radius'], 615.8) def test_pipe_is_actual_revolved_polyline(self): self.assertEqual(self.model['evidence']['pipeProfile'], '195') profile = self.model['pipeProfile'] self.assertAlmostEqual(max(p[0] for p in profile), 2620) self.assertAlmostEqual(min(p[1] for p in profile), 500) self.assertAlmostEqual(max(p[1] for p in profile), 666) def test_closed_meshes_have_no_boundary_edges(self): for name, mesh in self.meshes.items(): edges = Counter() for face in mesh['faces']: self.assertEqual(len(set(face)), len(face)) for a, b in zip(face, face[1:] + face[:1]): edges[tuple(sorted((a, b)))] += 1 self.assertTrue(all(count == 2 for count in edges.values()), name) self.assertTrue(all(math.isfinite(n) for p in mesh['vertices'] for n in p)) def test_r2c_bounds_match_native_drawing(self): pts = self.meshes['r2c']['vertices'] for axis, expected in enumerate([1620, 1540, 1486]): self.assertAlmostEqual(max(p[axis] for p in pts) - min(p[axis] for p in pts), expected, places=5) def test_svg_preserves_curves_sections_and_korean_text(self): svg, omitted = r2c.drawing_svg(self.entities, self.blocks) self.assertIn('단면 A-A', svg) self.assertIn('단면 B-B', svg) self.assertIn('1,620', svg) self.assertNotIn('%%C', svg) self.assertGreater(svg.count('', 1)[0] self.assertGreater(scene.count('