|
Funnily enough, I have some old code for this (from 2009). I haven't looked at it since, and don't have time to revise it just now (night time), but have a look and we can discuss it later. OPTIONS COORDSYS("Drawing" AS COMPONENT); PARAMETERS [Radius (m)] DOUBLE; SELECT [N], [M], [Cell] FROM (SELECT [D].[Box], [N], [M], ConvertToArea( AssignCoordSys( CASE [M] MOD 2 WHEN 0 THEN -- Even row NewLine( NewPoint( [OffsetX] + ([N] * 3 - 1) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ), NewPoint( [OffsetX] + ([N] * 3 - 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) + Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) + Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 1) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ), NewPoint( [OffsetX] + ([N] * 3 + 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) - Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 - 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) - Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 - 1) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ) ) WHEN 1 THEN -- Odd row NewLine( NewPoint( [OffsetX] + ([N] * 3 + 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ), NewPoint( [OffsetX] + ([N] * 3 + 1) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) + Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 2) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) + Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 2.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ), NewPoint( [OffsetX] + ([N] * 3 + 2) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) - Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 1) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) - Cos(Deg2Rad(30)) * [Radius (m)] ), NewPoint( [OffsetX] + ([N] * 3 + 0.5) * [Radius (m)], [OffsetY] + [M] * [Radius (m)] * Cos(Deg2Rad(30)) ) ) END, COORDSYS("Drawing" AS COMPONENT) ) ) AS [Cell] FROM (SELECT [Box], MinX([Box]) AS [OffsetX], MinY([Box]) AS [OffsetY] FROM (SELECT BoundingBox(UnionAll([Box])) AS [Box] FROM (SELECT CASE [Type (I)] WHEN 3 THEN UnionAll([Geom (I)]) -- Areas WHEN 2 THEN BoundingBox(AllBranches([Geom (I)])) -- Lines WHEN 1 THEN BoundingBox(AllCoords([Geom (I)])) -- Points END AS [Box] FROM [Drawing] WHERE [Selection (I)] GROUP BY [Type (I)] ) ) ) AS [D] LEFT JOIN (SELECT --[Digit 7] * 1e6 + --[Digit 6] * 1e5 + --[Digit 5] * 1e4 + [Digit 4] * 1e3 + [Digit 3] * 100 + [Digit 2] * 10 + [Digit 1] AS [N] FROM --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 7])) --CROSS JOIN --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 6])) --CROSS JOIN --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 5])) --CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 4])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 3])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 2])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 1])) ) AS [OffsetX] ON [OffsetX].[N] <= RectWidth([D].[Box]) / [Radius (m)] / 3 LEFT JOIN (SELECT --[Digit 7] * 1e6 + --[Digit 6] * 1e5 + --[Digit 5] * 1e4 + [Digit 4] * 1e3 + [Digit 3] * 100 + [Digit 2] * 10 + [Digit 1] AS [M] FROM --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 7])) --CROSS JOIN --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 6])) --CROSS JOIN --(VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 5])) --CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 4])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 3])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 2])) CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) NAMES ([Digit 1])) ) AS [OffsetY] ON [OffsetY].[M] <= RectHeight([D].[Box]) / ([Radius (m)] * Cos(Deg2Rad(30))) + 1 ) --WHERE Touches([Cell], [Box]) --AND NOT Adjacent([Cell], [Box]) ; Attachments: Draw hex grid.txt
|