After weeks of adjustments, the ROCO should be able to perform any kinds of multi-faces connection.
Part1: How to interpret the angles of connection: When user performs c.addConnection(("B","l"),("A","l"), angle=X), the interpretation is that: (1) Face B (the first argument) is stacked above Face A (the second argument). (2) Both Face B and Face A have their front side facing toward the same direction D. (3) Face A (the second argument) will push Face B (the first argument) an angle of X to direction D.
Part2: A summary of changes: 2.1: In component.py, a function organizeConnection is added to re-organize every possible combination of multi-faces connection. 2.2: In graph.py, the function mergeEdge would call mergeWith with flip parameter as False. 2.3: In face.py, the place function would skip edgeFrom and it will use the difference of the two angles instead.
Part3: Some demo of multi-faces connection: