from compas.geometry import Polyline
+from compas_wood.binding import beam_volumes
+
+
+input_polylines = [
+ Polyline([
+ [297.037012066934, 126.422271499885, -178.188030913779],
+ [321.489409568039, 169.111942318764, -186.869036108803],
+ [345.941807069144, 211.801613137642, -195.550041303827],
+ [370.394204570249, 254.491283956521, -204.231046498851]
+ ]),
+ Polyline([
+ [182.634858082301, 98.7137182074149, -78.306080246581],
+ [211.235396578459, 105.640856530532, -103.27656791338],
+ [239.835935074617, 112.56799485365, -128.24705558018],
+ [268.436473570776, 119.495133176767, -153.217543246979],
+ [297.037012066934, 126.422271499885, -178.188030913779]
+ ]),
+ Polyline([
+ [-125.19241232501, 107.875422065027, -39.2649958323028],
+ [-75.705277009549, 107.25372412331, -42.5192301219386],
+ [-26.8203151230943, 105.243836458838, -50.6895979092208],
+ [21.1131439030443, 102.043760643015, -63.0656900444498],
+ [67.9151143837992, 97.8400491497485, -78.9813305497922],
+ [113.521085871532, 92.7952640964856, -97.8579657684805],
+ [157.936920791687, 87.0452505103035, -119.213391744547],
+ [201.207350715535, 80.7012045875338, -142.653744283013]
+ ]),
+ Polyline([
+ [-10.3599318150342, 38.7282123158674, -287.206518566188],
+ [-31.7764187502288, 49.1160173176098, -249.870793280387],
+ [-46.147480668278, 60.3975803199585, -209.510751764339],
+ [-54.662795188934, 72.1419219251921, -167.63145233557],
+ [-58.5361339307107, 84.0926783823342, -125.117457662038],
+ [-58.7606503977529, 96.1110401814458, -82.4406121991002],
+ [-56.0905042124202, 108.124674519414, -39.8417855305585],
+ [-51.0879024066377, 120.096820292103, 2.56039219002248],
+ [-44.1738209609492, 132.009588674272, 44.7113106559208],
+ ]),
+
+ Polyline([
+ [-188.240159298455, 75.8808592794907, -151.530383786316],
+ [-145.963074583616, 73.7325840014969, -160.05232439351],
+ [-103.685989868776, 71.5843087235031, -168.574265000704],
+ [-61.4089051539373, 69.4360334455093, -177.096205607898],
+ [-19.1318204390981, 67.2877581675155, -185.618146215092],
+ [23.1452642757411, 65.1394828895218, -194.140086822286],
+ ]),
+
+ Polyline([
+ [-96.6199846476256, 90.1021988025274, -110.227043500606],
+ [-48.9174102895825, 87.3983183807673, -111.648442107134],
+ [-1.21483593153943, 84.6944379590072, -113.069840713663],
+ [46.4877384265037, 81.9905575372471, -114.491239320191],
+ [94.1903127845467, 79.286677115487, -115.91263792672],
+ ]),
+
+ Polyline([
+ [132.972124919423, 138.449055887252, 86.074977722597],
+ [167.267793637183, 134.152861891673, 62.679797641331],
+ [201.563462354943, 129.856667896093, 39.2846175600651],
+ [235.859131072703, 125.560473900514, 15.8894374787991],
+ ]),
+
+ Polyline([
+ [129.410585091899, 71.8669625143157, -172.501597971961],
+ [151.870897769568, 83.1961266976715, -132.75167444875],
+ [174.331210447238, 94.5252908810273, -93.0017509255386],
+ [196.791523124907, 105.854455064383, -53.2518274023273],
+ [219.251835802577, 117.183619247739, -13.5019038791161],
+ [241.712148480247, 128.512783431095, 26.2480196440951],
+ [264.172461157916, 139.84194761445, 65.9979431673064],
+ ]),
+
+ Polyline([
+ [164.938767042065, 160.473718227021, 163.598974047964],
+ [147.837376054901, 149.074854470926, 123.488214523064],
+ [131.218069322568, 137.625923389656, 83.1894892076615],
+ [115.06311204992, 126.130413515365, 42.715559558341],
+ [99.3556294473208, 114.591526704951, 2.07815097714067],
+ [84.0795669982659, 103.012205524298, -38.7119491181474],
+ [69.2196466793098, 91.3951546375981, -79.6448144234582],
+ [54.7613339074588, 79.7428674496858, -120.71128445365],
+ [40.6907906778078, 68.0576389813056, -161.902917836579],
+ [26.9948513423117, 56.3415940716198, -203.2118916656],
+ ]),
+
+ Polyline([
+ [114.821035246594, 198.058111884719, 106.829580839264],
+ [139.879901144329, 179.26591505587, 135.214277443614],
+ [164.938767042065, 160.473718227021, 163.598974047964],
+ [189.9976329398, 141.681521398171, 191.983670652314],
+ [215.056498837535, 122.889324569322, 220.368367256664],
+ ]),
+
+ Polyline([
+ [264.172461157916, 139.84194761445, 65.9979431673064],
+ [312.86620413861, 146.859577749078, 57.3169379722823],
+ [361.559947119303, 153.877207883706, 48.6359327772582],
+ [410.253690099997, 160.894838018334, 39.954927582234],
+ ]),
+
+ Polyline([
+ [13.7562673016774, 164.804159616155, 178.132387775678],
+ [31.0555420852146, 160.035948344655, 140.217407062733],
+ [42.5288946455757, 155.666866376768, 100.123423196389],
+ [46.7750711952287, 151.895205966801, 58.5935066719183],
+ [42.9566247038049, 148.911475312983, 16.9636577178732],
+ [31.3140030201931, 146.81417226681, -23.2519859176756],
+ ]),
+]
+
+
+input_polylines_segment_radii = []
+
+for i in range(len(input_polylines)):
+ input_polyline_segment_radii = []
+ for j in range(len(input_polylines[i].points)):
+ input_polyline_segment_radii.append(10)
+ input_polylines_segment_radii.append(input_polyline_segment_radii)
+
+input_polylines_segment_direction = []
+for i in range(len(input_polylines)):
+ input_polyline_segment_direction = []
+ for j in range(len(input_polylines[i].points)-1):
+ input_polyline_segment_direction.append([0, 1, 0])
+ input_polylines_segment_direction.append(input_polyline_segment_direction)
+
+
+index_polylines, index_polylines_segment, distance, point_pairs, volume_pairs, joints_areas, joints_types = beam_volumes(
+ input_polylines,
+ input_polylines_segment_radii,
+ input_polylines_segment_direction,
+ input_allowed_types_per_polyline=[-1],
+ input_min_distance=20,
+ input_volume_length=75,
+ input_cross_or_side_to_end=0.91,
+)
+
+try:
+ from compas_viewer import Viewer
+ from compas.geometry import Scale
+ from compas.geometry import Polygon
+
+ colors = {
+ 10: (255, 0, 0), # Side-to-side rotated
+ 11: (0, 255, 0), # Side-to-side out-of-plane
+ 12: (0, 0, 255), # Side-to-side in-plane
+ 13: (100, 100, 100), # Side-to-side in-plane
+ 20: (255, 0, 150), # Top-to-side
+ 30: (0, 200, 255) # Cross
+ }
+
+ viewer = Viewer(show_grid=False, rendermode='lighted')
+ scale = 1e-2
+
+ for polyline in input_polylines:
+ polyline.transform(Scale.from_factors([scale, scale, scale]))
+ viewer.scene.add(polyline, show_points=False, lineswidth=1, linecolor=(150, 150, 150))
+
+ for id, p in enumerate(point_pairs):
+ for point in p:
+ point.transform(Scale.from_factors([scale, scale, scale]))
+ viewer.scene.add(point, size=10, pointcolor=colors[joints_types[id]])
+
+ for volume in volume_pairs:
+ for polyline in volume:
+ polyline.transform(Scale.from_factors([scale, scale, scale]))
+
+ viewer.scene.add(polyline, show_points=False, lineswidth=2, linecolor=(150, 150, 150))
+
+ for id, joint_area in enumerate(joints_areas):
+ joint_area.transform(Scale.from_factors([scale, scale, scale]))
+
+ viewer.scene.add(Polygon(joint_area.points[:-1]).to_mesh(),
+ show_points=False,
+ show_lines=False,
+ facecolor=colors[joints_types[id]])
+
+ viewer.show()
+
+except ImportError:
+ print("compas_viewer is not installed.")
+