compas-cem 0.7.0__tar.gz → 0.8.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. compas_cem-0.8.2/AUTHORS.rst +41 -0
  2. {compas_cem-0.7.0 → compas_cem-0.8.2}/CHANGELOG.rst +59 -0
  3. compas_cem-0.8.2/PKG-INFO +178 -0
  4. {compas_cem-0.7.0 → compas_cem-0.8.2}/README.rst +5 -8
  5. compas_cem-0.8.2/requirements.txt +5 -0
  6. {compas_cem-0.7.0 → compas_cem-0.8.2}/setup.py +2 -4
  7. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/__init__.py +1 -1
  8. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/diagram.py +16 -0
  9. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/topology/topology.py +6 -3
  10. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/equilibrium/__init__.py +1 -0
  11. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/equilibrium/force.py +9 -3
  12. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/equilibrium/force_numpy.py +9 -3
  13. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintEdgeDirection/code.py +17 -0
  14. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintEdgeDirection/metadata.json +35 -0
  15. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePolyline/code.py +16 -0
  16. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePolyline/metadata.json +36 -0
  17. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_TopologyDiagram/icon.png +0 -0
  18. compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_TrailsShift/icon.png +0 -0
  19. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistColors.ghuser +0 -0
  20. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistForm.ghuser +0 -0
  21. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistTopology.ghuser +0 -0
  22. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstrainedFormFinding.ghuser +0 -0
  23. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintDeviationEdgeLength.ghuser +0 -0
  24. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintEdgeDirection.ghuser +0 -0
  25. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodeLine.ghuser +0 -0
  26. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodePlane.ghuser +0 -0
  27. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodePoint.ghuser +0 -0
  28. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodePolyline.ghuser +0 -0
  29. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintReactionForce.ghuser +0 -0
  30. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintTrailEdgeForce.ghuser +0 -0
  31. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_DisassembleForm.ghuser +0 -0
  32. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_DisassembleTopology.ghuser +0 -0
  33. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_EdgeDeviation.ghuser +0 -0
  34. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_EdgeTrail.ghuser +0 -0
  35. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_FormFinding.ghuser +0 -0
  36. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_Info.ghuser +0 -0
  37. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONExportDiagram.ghuser +0 -0
  38. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONImportForm.ghuser +0 -0
  39. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONImportTopology.ghuser +0 -0
  40. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_NodeLoad.ghuser +0 -0
  41. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_NodeSupport.ghuser +0 -0
  42. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_OriginNodesMove.ghuser +0 -0
  43. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterDeviationEdge.ghuser +0 -0
  44. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadX.ghuser +0 -0
  45. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadY.ghuser +0 -0
  46. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadZ.ghuser +0 -0
  47. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginX.ghuser +0 -0
  48. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginY.ghuser +0 -0
  49. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginZ.ghuser +0 -0
  50. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterTrailEdge.ghuser +0 -0
  51. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_Proxy.ghuser +0 -0
  52. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ResultsEdges.ghuser +0 -0
  53. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_ResultsSupportNodes.ghuser +0 -0
  54. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_SearchEdgeKey.ghuser +0 -0
  55. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_SearchNodeKey.ghuser +0 -0
  56. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_TopologyDiagram.ghuser +0 -0
  57. compas_cem-0.8.2/src/compas_cem/ghpython/components/ghuser/CompasCem_TrailsShift.ghuser +0 -0
  58. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/__init__.py +2 -0
  59. compas_cem-0.8.2/src/compas_cem/optimization/constraints/direction.py +191 -0
  60. compas_cem-0.8.2/src/compas_cem/optimization/constraints/polyline.py +149 -0
  61. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/optimizer.py +2 -2
  62. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/load.py +4 -2
  63. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/diagramobject.py +1 -0
  64. compas_cem-0.8.2/src/compas_cem.egg-info/PKG-INFO +178 -0
  65. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem.egg-info/SOURCES.txt +10 -1
  66. compas_cem-0.8.2/src/compas_cem.egg-info/requires.txt +5 -0
  67. compas_cem-0.7.0/AUTHORS.rst +0 -41
  68. compas_cem-0.7.0/PKG-INFO +0 -182
  69. compas_cem-0.7.0/requirements.txt +0 -5
  70. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistColors.ghuser +0 -0
  71. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistForm.ghuser +0 -0
  72. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ArtistTopology.ghuser +0 -0
  73. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstrainedFormFinding.ghuser +0 -0
  74. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintDeviationEdgeLength.ghuser +0 -0
  75. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodeLine.ghuser +0 -0
  76. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodePlane.ghuser +0 -0
  77. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintNodePoint.ghuser +0 -0
  78. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintReactionForce.ghuser +0 -0
  79. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ConstraintTrailEdgeForce.ghuser +0 -0
  80. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_DisassembleForm.ghuser +0 -0
  81. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_DisassembleTopology.ghuser +0 -0
  82. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_EdgeDeviation.ghuser +0 -0
  83. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_EdgeTrail.ghuser +0 -0
  84. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_FormFinding.ghuser +0 -0
  85. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_Info.ghuser +0 -0
  86. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONExportDiagram.ghuser +0 -0
  87. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONImportForm.ghuser +0 -0
  88. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_JSONImportTopology.ghuser +0 -0
  89. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_NodeLoad.ghuser +0 -0
  90. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_NodeSupport.ghuser +0 -0
  91. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_OriginNodesMove.ghuser +0 -0
  92. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterDeviationEdge.ghuser +0 -0
  93. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadX.ghuser +0 -0
  94. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadY.ghuser +0 -0
  95. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeLoadZ.ghuser +0 -0
  96. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginX.ghuser +0 -0
  97. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginY.ghuser +0 -0
  98. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterNodeOriginZ.ghuser +0 -0
  99. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ParameterTrailEdge.ghuser +0 -0
  100. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_Proxy.ghuser +0 -0
  101. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ResultsEdges.ghuser +0 -0
  102. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_ResultsSupportNodes.ghuser +0 -0
  103. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_SearchEdgeKey.ghuser +0 -0
  104. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_SearchNodeKey.ghuser +0 -0
  105. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_TopologyDiagram.ghuser +0 -0
  106. compas_cem-0.7.0/src/compas_cem/ghpython/components/ghuser/CompasCem_TrailsShift.ghuser +0 -0
  107. compas_cem-0.7.0/src/compas_cem.egg-info/PKG-INFO +0 -182
  108. compas_cem-0.7.0/src/compas_cem.egg-info/entry_points.txt +0 -3
  109. compas_cem-0.7.0/src/compas_cem.egg-info/requires.txt +0 -5
  110. {compas_cem-0.7.0 → compas_cem-0.8.2}/LICENSE +0 -0
  111. {compas_cem-0.7.0 → compas_cem-0.8.2}/MANIFEST.in +0 -0
  112. {compas_cem-0.7.0 → compas_cem-0.8.2}/setup.cfg +0 -0
  113. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/data/__init__.py +0 -0
  114. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/data/data.py +0 -0
  115. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/__init__.py +0 -0
  116. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/form.py +0 -0
  117. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/mixins/__init__.py +0 -0
  118. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/mixins/edge_mixins.py +0 -0
  119. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/mixins/node_mixins.py +0 -0
  120. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/topology/__init__.py +0 -0
  121. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/diagrams/topology/mesh_mixins.py +0 -0
  122. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/elements/__init__.py +0 -0
  123. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/elements/deviation.py +0 -0
  124. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/elements/edge.py +0 -0
  125. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/elements/node.py +0 -0
  126. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/elements/trail.py +0 -0
  127. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/__init__.py +0 -0
  128. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/artists.py +0 -0
  129. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistColors/code.py +0 -0
  130. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistColors/icon.png +0 -0
  131. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistColors/metadata.json +0 -0
  132. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistForm/code.py +0 -0
  133. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistForm/icon.png +0 -0
  134. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistForm/metadata.json +0 -0
  135. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistTopology/code.py +0 -0
  136. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistTopology/icon.png +0 -0
  137. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ArtistTopology/metadata.json +0 -0
  138. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstrainedFormFinding/code.py +0 -0
  139. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstrainedFormFinding/icon.png +0 -0
  140. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstrainedFormFinding/metadata.json +0 -0
  141. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintDeviationEdgeLength/code.py +0 -0
  142. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintDeviationEdgeLength/icon.png +0 -0
  143. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintDeviationEdgeLength/metadata.json +0 -0
  144. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ConstraintNodeLine → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintEdgeDirection}/icon.png +0 -0
  145. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodeLine/code.py +0 -0
  146. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePlane → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodeLine}/icon.png +0 -0
  147. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodeLine/metadata.json +0 -0
  148. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePlane/code.py +0 -0
  149. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePoint → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePlane}/icon.png +0 -0
  150. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePlane/metadata.json +0 -0
  151. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePoint/code.py +0 -0
  152. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ConstraintReactionForce → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePoint}/icon.png +0 -0
  153. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePoint/metadata.json +0 -0
  154. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ConstraintTrailEdgeForce → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintNodePolyline}/icon.png +0 -0
  155. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintReactionForce/code.py +0 -0
  156. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_DisassembleForm → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintReactionForce}/icon.png +0 -0
  157. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintReactionForce/metadata.json +0 -0
  158. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintTrailEdgeForce/code.py +0 -0
  159. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_DisassembleTopology → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ConstraintTrailEdgeForce}/icon.png +0 -0
  160. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ConstraintTrailEdgeForce/metadata.json +0 -0
  161. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_DisassembleForm/code.py +0 -0
  162. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_EdgeDeviation → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_DisassembleForm}/icon.png +0 -0
  163. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_DisassembleForm/metadata.json +0 -0
  164. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_DisassembleTopology/code.py +0 -0
  165. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_EdgeTrail → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_DisassembleTopology}/icon.png +0 -0
  166. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_DisassembleTopology/metadata.json +0 -0
  167. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_EdgeDeviation/code.py +0 -0
  168. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_FormFinding → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_EdgeDeviation}/icon.png +0 -0
  169. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_EdgeDeviation/metadata.json +0 -0
  170. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_EdgeTrail/code.py +0 -0
  171. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_Info → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_EdgeTrail}/icon.png +0 -0
  172. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_EdgeTrail/metadata.json +0 -0
  173. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_FormFinding/code.py +0 -0
  174. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_JSONExportDiagram → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_FormFinding}/icon.png +0 -0
  175. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_FormFinding/metadata.json +0 -0
  176. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_Info/code.py +0 -0
  177. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_JSONImportForm → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_Info}/icon.png +0 -0
  178. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_Info/metadata.json +0 -0
  179. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONExportDiagram/code.py +0 -0
  180. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_JSONImportTopology → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_JSONExportDiagram}/icon.png +0 -0
  181. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONExportDiagram/metadata.json +0 -0
  182. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONImportForm/code.py +0 -0
  183. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_NodeLoad → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_JSONImportForm}/icon.png +0 -0
  184. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONImportForm/metadata.json +0 -0
  185. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONImportTopology/code.py +0 -0
  186. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_NodeSupport → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_JSONImportTopology}/icon.png +0 -0
  187. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_JSONImportTopology/metadata.json +0 -0
  188. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_NodeLoad/code.py +0 -0
  189. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_OriginNodesMove → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_NodeLoad}/icon.png +0 -0
  190. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_NodeLoad/metadata.json +0 -0
  191. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_NodeSupport/code.py +0 -0
  192. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterDeviationEdge → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_NodeSupport}/icon.png +0 -0
  193. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_NodeSupport/metadata.json +0 -0
  194. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_OriginNodesMove/code.py +0 -0
  195. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadX → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_OriginNodesMove}/icon.png +0 -0
  196. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_OriginNodesMove/metadata.json +0 -0
  197. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterDeviationEdge/code.py +0 -0
  198. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadY → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterDeviationEdge}/icon.png +0 -0
  199. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterDeviationEdge/metadata.json +0 -0
  200. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadX/code.py +0 -0
  201. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadZ → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadX}/icon.png +0 -0
  202. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadX/metadata.json +0 -0
  203. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadY/code.py +0 -0
  204. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginX → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadY}/icon.png +0 -0
  205. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadY/metadata.json +0 -0
  206. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadZ/code.py +0 -0
  207. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginY → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadZ}/icon.png +0 -0
  208. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeLoadZ/metadata.json +0 -0
  209. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginX/code.py +0 -0
  210. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginZ → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginX}/icon.png +0 -0
  211. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginX/metadata.json +0 -0
  212. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginY/code.py +0 -0
  213. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ParameterTrailEdge → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginY}/icon.png +0 -0
  214. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginY/metadata.json +0 -0
  215. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginZ/code.py +0 -0
  216. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_Proxy → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginZ}/icon.png +0 -0
  217. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterNodeOriginZ/metadata.json +0 -0
  218. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterTrailEdge/code.py +0 -0
  219. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ResultsEdges → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ParameterTrailEdge}/icon.png +0 -0
  220. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ParameterTrailEdge/metadata.json +0 -0
  221. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_Proxy/code.py +0 -0
  222. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_ResultsSupportNodes → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_Proxy}/icon.png +0 -0
  223. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_Proxy/metadata.json +0 -0
  224. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ResultsEdges/code.py +0 -0
  225. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_SearchEdgeKey → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ResultsEdges}/icon.png +0 -0
  226. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ResultsEdges/metadata.json +0 -0
  227. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ResultsSupportNodes/code.py +0 -0
  228. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_SearchNodeKey → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_ResultsSupportNodes}/icon.png +0 -0
  229. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_ResultsSupportNodes/metadata.json +0 -0
  230. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_SearchEdgeKey/code.py +0 -0
  231. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_TopologyDiagram → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_SearchEdgeKey}/icon.png +0 -0
  232. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_SearchEdgeKey/metadata.json +0 -0
  233. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_SearchNodeKey/code.py +0 -0
  234. {compas_cem-0.7.0/src/compas_cem/ghpython/components/CompasCem_TrailsShift → compas_cem-0.8.2/src/compas_cem/ghpython/components/CompasCem_SearchNodeKey}/icon.png +0 -0
  235. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_SearchNodeKey/metadata.json +0 -0
  236. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_TopologyDiagram/code.py +0 -0
  237. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_TopologyDiagram/metadata.json +0 -0
  238. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_TrailsShift/code.py +0 -0
  239. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/components/CompasCem_TrailsShift/metadata.json +0 -0
  240. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/install.py +0 -0
  241. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/register.py +0 -0
  242. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/ghpython/uninstall.py +0 -0
  243. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/loads/__init__.py +0 -0
  244. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/loads/node.py +0 -0
  245. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/__init__.py +0 -0
  246. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/constraint.py +0 -0
  247. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/force.py +0 -0
  248. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/length.py +0 -0
  249. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/line.py +0 -0
  250. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/mesh.py +0 -0
  251. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/plane.py +0 -0
  252. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/constraints/point.py +0 -0
  253. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/grad.py +0 -0
  254. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/nlopt.py +0 -0
  255. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/objective_func.py +0 -0
  256. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/__init__.py +0 -0
  257. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/deviation.py +0 -0
  258. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/edge.py +0 -0
  259. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/node.py +0 -0
  260. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/origin.py +0 -0
  261. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/parameter.py +0 -0
  262. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/parameters/trail.py +0 -0
  263. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/optimization/proxy.py +0 -0
  264. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/__init__.py +0 -0
  265. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/formartist.py +0 -0
  266. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/plotter.py +0 -0
  267. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/proxy.py +0 -0
  268. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/register.py +0 -0
  269. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/plotters/topologyartist.py +0 -0
  270. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/supports/__init__.py +0 -0
  271. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/supports/node.py +0 -0
  272. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/__init__.py +0 -0
  273. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/formobject.py +0 -0
  274. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/register.py +0 -0
  275. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/topologyobject.py +0 -0
  276. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem/viewers/viewer.py +0 -0
  277. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem.egg-info/dependency_links.txt +0 -0
  278. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem.egg-info/not-zip-safe +0 -0
  279. {compas_cem-0.7.0 → compas_cem-0.8.2}/src/compas_cem.egg-info/top_level.txt +0 -0
@@ -0,0 +1,41 @@
1
+ ********************************************************************************
2
+ Citing
3
+ ********************************************************************************
4
+
5
+ If you use **COMPAS CEM** for a project or research, please consider citing our journal paper:
6
+
7
+ .. code-block:: latex
8
+
9
+ @article{pastrana_constrainedformfinding_2022,
10
+ title = {Constrained {Form}-{Finding} of {Tension}–{Compression} {Structures} using {Automatic} {Differentiation}},
11
+ author = {Pastrana, Rafael and Ohlbrock, Patrick Ole and Oberbichler, Thomas and D’Acunto, Pierluigi and Parascho, Stefana},
12
+ journal = {Computer-Aided Design},
13
+ doi = {10.1016/j.cad.2022.103435},
14
+ volume = {155},
15
+ issn = {0010-4485},
16
+ url = {https://www.sciencedirect.com/science/article/pii/S0010448522001683},
17
+ month = feb,
18
+ year = {2022}}
19
+
20
+ And the code repository:
21
+
22
+ .. code-block:: latex
23
+
24
+ @software{compas_cem,
25
+ title={{COMPAS~CEM}: The {Combinatorial Equilibrium Modeling} framework for {COMPAS}},
26
+ author={Pastrana, Rafael and
27
+ Ohlbrock, Patrick Ole and
28
+ D'Acunto, Pierluigi and
29
+ Parascho, Stefana},
30
+ year={2021},
31
+ doi={10.5281/zenodo.5705740},
32
+ url={https://arpastrana.github.io/compas\_cem}}
33
+
34
+
35
+ Authors
36
+ =======
37
+
38
+ * Rafael Pastrana <arpastrana@princeton> `@arpastrana <https://github.com/arpastrana>`_
39
+ * Ole Ohlbrock <ohlbrock@arch.ethz.ch> `@OleOhlbrock <https://github.com/OleOhlbrock>`_
40
+ * Pierluigi D'Acunto <pierluigidacunto@tum.de> `@pierluigidacunto <https://github.com/pierluigidacunto>`_
41
+ * Stefana Parascho <stefana.parascho@epfl.ch> `@stefanaparascho <https://github.com/stefanaparascho>`_
@@ -6,6 +6,65 @@ All notable changes to this project will be documented in this file.
6
6
  The format is based on `Keep a Changelog <https://keepachangelog.com/en/1.0.0/>`_
7
7
  and this project adheres to `Semantic Versioning <https://semver.org/spec/v2.0.0.html>`_.
8
8
 
9
+ 0.8.2
10
+ ----------
11
+
12
+ **Added**
13
+
14
+ **Changed**
15
+
16
+ **Fixed**
17
+
18
+ **Deprecated**
19
+
20
+ **Removed**
21
+
22
+ 0.8.1
23
+ ----------
24
+
25
+ **Added**
26
+
27
+ - Added set conversion in `TopologyDiagram.is_auxiliary_trail_edge()`.
28
+
29
+ **Changed**
30
+
31
+ - Pinned dependency to `numpy==1.26.3`.
32
+ - Pinned dependency to `compas==1.17.10`.
33
+ - Updated installation instructions in docs website.
34
+ - Set minimum supported python version to `3.8`.
35
+ - Bumped to docs action to `docs@.2.21`.
36
+ - Pinned `sphinx, `pytest`, and `pytest-lazy-fixture` dependencies in `requirements_dev.txt`.
37
+ - Set `crazy-max/ghaction-github-pages@v3.1.0` in `docs` action.
38
+ - Set `compas-actions.docs@v2.2.1` in `docs` action.
39
+ - Updated grashopper components in examples.
40
+
41
+ **Fixed**
42
+
43
+ **Deprecated**
44
+
45
+ **Removed**
46
+
47
+ - Removed `compas_singular` dependency.
48
+
49
+ 0.8.0
50
+ ----------
51
+
52
+ **Added**
53
+
54
+ - Added `PolylineConstraint` component to grasshopper plugin.
55
+ - Implemented `constraints.PolylineConstraint`.
56
+ - Added `EdgeDirectionConstraint` component to grasshopper plugin.
57
+ - Implemented `constraints.EdgeDirectionConstraint`.
58
+ - Added `Diagram.edge_plane` to query the projection plane of an edge.
59
+
60
+ **Changed**
61
+
62
+ **Fixed**
63
+
64
+ **Deprecated**
65
+
66
+ **Removed**
67
+
9
68
  0.7.0
10
69
  ----------
11
70
 
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.1
2
+ Name: compas_cem
3
+ Version: 0.8.2
4
+ Summary: The Combinatorial Equilibrium Modeling framework for COMPAS
5
+ Home-page: https://github.com/arpastrana/compas_cem
6
+ Author: Rafael Pastrana
7
+ Author-email: arpj@princeton.edu
8
+ License: MIT license
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Topic :: Scientific/Engineering
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: Unix
14
+ Classifier: Operating System :: POSIX
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: Implementation :: CPython
21
+ Requires-Python: >=3.8
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ License-File: AUTHORS.rst
25
+
26
+ ********************************************************************************
27
+ COMPAS CEM
28
+ ********************************************************************************
29
+
30
+ .. start-badges
31
+
32
+ .. image:: https://github.com/arpastrana/compas_cem/workflows/build/badge.svg
33
+ :target: https://github.com/arpastrana/compas_cem/actions
34
+ :alt: Github Actions Build Status
35
+
36
+ .. image:: https://img.shields.io/github/license/arpastrana/compas_cem.svg
37
+ :target: https://github.com/arpastrana/compas_cem/blob/main/LICENSE
38
+ :alt: License
39
+
40
+ .. image:: https://img.shields.io/pypi/v/compas-cem.svg
41
+ :target: https://pypi.python.org/pypi/compas-cem
42
+ :alt: PyPI Package latest release
43
+
44
+ .. image:: https://img.shields.io/pypi/pyversions/compas-cem
45
+ :target: https://pypi.org/project/compas-cem
46
+ :alt: Python versions
47
+
48
+ .. image:: https://img.shields.io/badge/arXiv-2111.02607-b31b1b.svg
49
+ :target: https://arxiv.org/abs/2111.02607
50
+ :alt: ArXiv paper
51
+
52
+ .. image:: https://zenodo.org/badge/278780552.svg
53
+ :target: https://zenodo.org/badge/latestdoi/278780552
54
+ :alt: Zenodo DOI
55
+
56
+ .. end-badges
57
+
58
+ .. _COMPAS: https://compas.dev/
59
+ .. _COMPAS CEM Docs: https://arpastrana.github.io/compas_cem/latest/index.html
60
+ .. _CEM Framework: https://doi.org/10.1016/j.cad.2022.103435
61
+ .. _Rafael Pastrana: https://pastrana.xyz/
62
+ .. _Princeton: https://soa.princeton.edu/
63
+ .. _Ole Ohlbrock: https://schwartz.arch.ethz.ch/Team/patrickoleohlbrock.php?lan=en
64
+ .. _Pierluigi D'Acunto: https://www.professoren.tum.de/en/dacunto-pierluigi
65
+ .. _Stefana Parascho: https://people.epfl.ch/stefana.parascho?lang=en
66
+ .. _Anaconda: https://www.anaconda.com/
67
+ .. _Rhino: https://www.rhino3d.com/
68
+ .. _Blender: https://www.blender.org/
69
+ .. _Grasshopper: https://grasshopper3d.com/
70
+ .. _metaverse: https://apnews.com/article/meta-facebook-explaining-the-metaverse-f57e01cd5739840945e89fd668b0fa27
71
+
72
+
73
+ .. figure:: ./docs/images/staircase_24_fps_128_colors.gif
74
+ :figclass: figure
75
+ :class: figure-img img-fluid
76
+
77
+
78
+ The `Combinatorial Equilibrium Modeling (CEM) <https://doi.org/10.1016/j.cad.2022.103435>`_ framework for `COMPAS`_.
79
+
80
+ The `CEM framework`_ is a numerical form-finding approach to generate forms in static equilibrium for spatial bar structures subjected to combinations of tension-compression forces and design constraints.
81
+ **COMPAS CEM** encapsulates the `CEM framework`_ into an open-source structural design tool that enables the formulation and the solution of constrained form-finding problems in plain and simple `Python <https://www.python.org/>`_ code.
82
+
83
+
84
+ Main features
85
+ =============
86
+
87
+ * **Mix tension and compression forces:** Explore a wider spectrum of structural typologies by combining internal tension and compression forces in the same structure. Design space frames, bridges, tensegrities, and staircases and go beyond the conventional catalog of compression-only shells and cable-nets!
88
+
89
+ * **Solve constrained form-finding problems efficiently via automatic differentiation:** Generate forms in static equilibrium that simultaneously meet a priori design constraints such as best-fitting a global target shape, restraining bar lengths, and controlling the reaction forces at the supports of a structure.
90
+
91
+ * **Usable across different 3D modeling software and operating systems:** COMPAS CEM runs on Windows, MacOS and Linux (perhaps one day in the `metaverse`_) and it does not depend on any CAD software to work. However, it provides the necessary interfaces to be seamlessly used inside popular design environments like `Rhino`_, `Blender`_, and `Grasshopper`_. As a `COMPAS`_ extension, COMPAS CEM offers native integration and data exchange with other extensions and plugins in the COMPAS ecosystem.
92
+
93
+ * **Move those sliders with the Grasshopper plugin:** Are you a `Grasshopper`_ person? Worry not. COMPAS CEM is also shipped as a precooked Grasshopper plugin to readily integrate our constrained form-finding engine into your next spaghetti pipeline 🍝.
94
+
95
+
96
+ Installation
97
+ ============
98
+
99
+
100
+ These are succint instructions to install **COMPAS CEM** and its `Grasshopper`_ plugin.
101
+ For detailed guidance, please refer to the `COMPAS CEM Docs`_.
102
+
103
+ Install **COMPAS CEM** in a dedicated `Anaconda`_ environment via ``pip``:
104
+
105
+ ::
106
+
107
+ pip install compas-cem
108
+
109
+ To double-check that everything is up and running, type the following in the
110
+ command line and hit enter:
111
+
112
+ ::
113
+
114
+ python -c "import compas_cem"
115
+
116
+ If no errors show up, celebrate 🎉! You have a working installation of **COMPAS CEM**.
117
+
118
+
119
+ Grasshopper plugin
120
+ ------------------
121
+
122
+ **Warning**: Note that `Grasshopper`_ plugin of **COMPAS CEM** is only supported in **Rhino 6** and **Rhino 7**.
123
+
124
+ Once **COMPAS CEM** was installed from the comment line, we can additionally link it to `Rhino`_ and use it as `Grasshopper`_ plugin:
125
+
126
+ ::
127
+
128
+ python -m compas_rhino.install -v 7.0
129
+
130
+ The flag ``-v 7.0`` indicates that we will be installing **COMPAS CEM** and company in Rhino 7. If you are working with Rhino 6, replace that last bit with ``-v 6.0``.
131
+
132
+
133
+ First steps
134
+ ===========
135
+
136
+ * `COMPAS CEM Docs`_
137
+ * `COMPAS CEM Examples <https://arpastrana.github.io/compas_cem/latest/examples.html>`_
138
+ * `COMPAS CEM API Reference <https://arpastrana.github.io/compas_cem/latest/api.html>`_
139
+ * `COMPAS Tutorials <https://compas.dev/compas/latest/tutorial.html>`_
140
+ * `COMPAS API Reference <https://compas.dev/compas/latest/api.html>`_
141
+
142
+
143
+ Are you a bug hunter?
144
+ =====================
145
+
146
+ If you find a bug or want to suggest a potential enhancement,
147
+ please help us tackle it by filing a `report <https://github.com/arpastrana/compas_cem/issues>`_.
148
+
149
+
150
+ Questions and feedback
151
+ ======================
152
+
153
+ We encourage the use of the `COMPAS framework forum <https://forum.compas-framework.org/>`_ for questions and discussions.
154
+
155
+
156
+ Contributing
157
+ ============
158
+
159
+ Pull requests are warmly welcome! Check the `Contributor's Guide <https://github.com/arpastrana/compas_cem/blob/main/CONTRIBUTING.md>`_
160
+ for more details.
161
+
162
+
163
+ Citing
164
+ ======
165
+
166
+ If you use **COMPAS CEM** for a project or research, please cite us using these `references <https://arpastrana.github.io/compas_cem/latest/citing.html>`_.
167
+
168
+
169
+ Acknowledgements
170
+ ================
171
+
172
+ This work has been supported in part by the U.S. National Science Foundation under grant OAC-2118201 and the `NSF Institute for Data Driven Dynamical Design <https://www.mines.edu/id4>`_.
173
+
174
+
175
+ License
176
+ =======
177
+
178
+ MIT
@@ -28,20 +28,16 @@ COMPAS CEM
28
28
  :target: https://zenodo.org/badge/latestdoi/278780552
29
29
  :alt: Zenodo DOI
30
30
 
31
- .. image:: https://img.shields.io/twitter/follow/compas_dev?style=social
32
- :target: https://twitter.com/compas_dev
33
- :alt: Twitter follow
34
-
35
31
  .. end-badges
36
32
 
37
33
  .. _COMPAS: https://compas.dev/
38
34
  .. _COMPAS CEM Docs: https://arpastrana.github.io/compas_cem/latest/index.html
39
- .. _CEM Framework: https://arxiv.org/abs/2111.02607
35
+ .. _CEM Framework: https://doi.org/10.1016/j.cad.2022.103435
40
36
  .. _Rafael Pastrana: https://pastrana.xyz/
41
37
  .. _Princeton: https://soa.princeton.edu/
42
38
  .. _Ole Ohlbrock: https://schwartz.arch.ethz.ch/Team/patrickoleohlbrock.php?lan=en
43
39
  .. _Pierluigi D'Acunto: https://www.professoren.tum.de/en/dacunto-pierluigi
44
- .. _Stefana Parascho: https://soa.princeton.edu/content/stefana-parascho
40
+ .. _Stefana Parascho: https://people.epfl.ch/stefana.parascho?lang=en
45
41
  .. _Anaconda: https://www.anaconda.com/
46
42
  .. _Rhino: https://www.rhino3d.com/
47
43
  .. _Blender: https://www.blender.org/
@@ -49,13 +45,12 @@ COMPAS CEM
49
45
  .. _metaverse: https://apnews.com/article/meta-facebook-explaining-the-metaverse-f57e01cd5739840945e89fd668b0fa27
50
46
 
51
47
 
52
-
53
48
  .. figure:: ./docs/images/staircase_24_fps_128_colors.gif
54
49
  :figclass: figure
55
50
  :class: figure-img img-fluid
56
51
 
57
52
 
58
- The `Combinatorial Equilibrium Modeling (CEM) <https://arxiv.org/abs/2111.02607>`_ framework for `COMPAS`_.
53
+ The `Combinatorial Equilibrium Modeling (CEM) <https://doi.org/10.1016/j.cad.2022.103435>`_ framework for `COMPAS`_.
59
54
 
60
55
  The `CEM framework`_ is a numerical form-finding approach to generate forms in static equilibrium for spatial bar structures subjected to combinations of tension-compression forces and design constraints.
61
56
  **COMPAS CEM** encapsulates the `CEM framework`_ into an open-source structural design tool that enables the formulation and the solution of constrained form-finding problems in plain and simple `Python <https://www.python.org/>`_ code.
@@ -99,6 +94,8 @@ If no errors show up, celebrate 🎉! You have a working installation of **COMPA
99
94
  Grasshopper plugin
100
95
  ------------------
101
96
 
97
+ **Warning**: Note that `Grasshopper`_ plugin of **COMPAS CEM** is only supported in **Rhino 6** and **Rhino 7**.
98
+
102
99
  Once **COMPAS CEM** was installed from the comment line, we can additionally link it to `Rhino`_ and use it as `Grasshopper`_ plugin:
103
100
 
104
101
  ::
@@ -0,0 +1,5 @@
1
+ numpy==1.26.3
2
+ compas==1.17.10
3
+ trimesh==3.20.0
4
+ autograd==1.5
5
+ nlopt
@@ -28,7 +28,7 @@ optional_requirements = {}
28
28
 
29
29
  setup(
30
30
  name="compas_cem",
31
- version="0.7.0",
31
+ version="0.8.2",
32
32
  description="The Combinatorial Equilibrium Modeling framework for COMPAS",
33
33
  long_description=long_description,
34
34
  long_description_content_type="text/markdown",
@@ -46,8 +46,6 @@ setup(
46
46
  "Operating System :: Microsoft :: Windows",
47
47
  "Programming Language :: Python",
48
48
  "Programming Language :: Python :: 3",
49
- "Programming Language :: Python :: 3.6",
50
- "Programming Language :: Python :: 3.7",
51
49
  "Programming Language :: Python :: 3.8",
52
50
  "Programming Language :: Python :: 3.9",
53
51
  "Programming Language :: Python :: Implementation :: CPython",
@@ -61,7 +59,7 @@ setup(
61
59
  include_package_data=True,
62
60
  zip_safe=False,
63
61
  install_requires=requirements,
64
- python_requires=">=3.6",
62
+ python_requires=">=3.8",
65
63
  extras_require=optional_requirements,
66
64
  entry_points={
67
65
  "console_scripts": [],
@@ -27,7 +27,7 @@ __author__ = ["Rafael Pastrana"]
27
27
  __copyright__ = "Copyright 2020 - Princeton University"
28
28
  __license__ = "MIT License"
29
29
  __email__ = "arpj@princeton.edu"
30
- __version__ = "0.7.0"
30
+ __version__ = "0.8.2"
31
31
 
32
32
 
33
33
  # Directories
@@ -255,6 +255,22 @@ class Diagram(Data, NodeMixins, EdgeMixins, Network):
255
255
  """
256
256
  return self.edge_attribute(key=edge, name="length")
257
257
 
258
+ def edge_plane(self, edge):
259
+ """
260
+ Gets the projection plane at an edge.
261
+
262
+ Parameters
263
+ ----------
264
+ edge : ``tuple``
265
+ The u, v edge key.
266
+
267
+ Return
268
+ ------
269
+ plane : ``tuple``
270
+ The projection plane of the edge.
271
+ """
272
+ return self.edge_attribute(key=edge, name="plane")
273
+
258
274
  # ==============================================================================
259
275
  # Magic methods
260
276
  # ==============================================================================
@@ -737,7 +737,8 @@ class TopologyDiagram(Diagram, MeshMixins):
737
737
  flag : ``bool``
738
738
  ``True``if the edge is in an auxiliary trail. ``False`` otherwise.
739
739
  """
740
- if edge in set(self.auxiliary_trails()):
740
+ aux_trails = set([tuple(edge) for edge in self.auxiliary_trails()])
741
+ if edge in set(aux_trails):
741
742
  return True
742
743
  return False
743
744
 
@@ -910,7 +911,7 @@ class TopologyDiagram(Diagram, MeshMixins):
910
911
 
911
912
  def trail_sequences(self, key):
912
913
  """
913
- Create a mapping between the sequences in the diagram and the nodes in the trail.
914
+ Create a mapping between topological sequences and the nodes in a trail.
914
915
 
915
916
  Parameters
916
917
  ----------
@@ -930,7 +931,9 @@ class TopologyDiagram(Diagram, MeshMixins):
930
931
 
931
932
  def trails_sequences(self):
932
933
  """
933
- Creates a mapping between the nodes in all the trails and the available sequences.
934
+ Creates a mapping of mappings between the nodes of the trails and the sequences.
935
+
936
+ The mapping has the form ``{trail_key: {sequence: node}}``.
934
937
 
935
938
  Returns
936
939
  -------
@@ -29,4 +29,5 @@ import compas
29
29
  if not compas.IPY:
30
30
  from .force_numpy import * # noqa F403
31
31
 
32
+
32
33
  __all__ = [name for name in dir() if not name.startswith('_')]
@@ -69,6 +69,7 @@ def equilibrium_state(topology, kmax=None, tmax=100, eta=1e-6, verbose=False, ca
69
69
  # create data containers that describe equilibrium state
70
70
  reaction_forces = {}
71
71
  trail_forces = {}
72
+ trail_directions = {}
72
73
  residual_vectors = {node: topology.reaction_force(node) for node in topology.nodes()}
73
74
  node_xyz = {node: topology.node_coordinates(node) for node in topology.nodes()}
74
75
 
@@ -84,7 +85,7 @@ def equilibrium_state(topology, kmax=None, tmax=100, eta=1e-6, verbose=False, ca
84
85
  # store last positions for residual
85
86
  last_xyz = {k: v for k, v in node_xyz.items()}
86
87
 
87
- for k in range(klast + 1): # sequences
88
+ for k in range(topology.number_of_sequences()): # sequences
88
89
 
89
90
  for key, trail in topology.trails(keys=True):
90
91
 
@@ -144,12 +145,16 @@ def equilibrium_state(topology, kmax=None, tmax=100, eta=1e-6, verbose=False, ca
144
145
  length = plength
145
146
 
146
147
  # store next node position
147
- next_pos = add_vectors(pos, scale_vector(normalize_vector(rvec), length))
148
+ nrvec = normalize_vector(rvec)
149
+ next_pos = add_vectors(pos, scale_vector(nrvec, length))
148
150
  node_xyz[next_node] = next_pos
149
151
 
150
152
  # store trail force
151
153
  trail_forces[edge] = copysign(length_vector(rvec), length)
152
154
 
155
+ # store trail direction
156
+ trail_directions[edge] = nrvec
157
+
153
158
  # store residual vector
154
159
  residual_vectors[next_node] = rvec
155
160
 
@@ -185,11 +190,12 @@ def equilibrium_state(topology, kmax=None, tmax=100, eta=1e-6, verbose=False, ca
185
190
  eq_state["node_xyz"] = node_xyz
186
191
  eq_state["trail_forces"] = trail_forces
187
192
  eq_state["reaction_forces"] = reaction_forces
193
+ eq_state["trail_directions"] = trail_directions
188
194
 
189
195
  return eq_state
190
196
 
191
197
 
192
- def form_update(form, node_xyz, trail_forces, reaction_forces):
198
+ def form_update(form, node_xyz, trail_forces, reaction_forces, **kwargs):
193
199
  """
194
200
  Update the node and edge attributes of a form after equilibrating it.
195
201
  """
@@ -57,7 +57,7 @@ def equilibrium_state_numpy(topology, tmax=100, eta=1e-6, verbose=False, callbac
57
57
 
58
58
  # output, mutable
59
59
  edge_forces = {e: np.array(topology.edge_force(e)) for e in topology.edges()}
60
- edge_lengths = {e: np.array(topology.edge_attribute(e, "length")) for e in topology.edges()}
60
+ edge_lengths = {e: np.array(topology.edge_length_2(e)) for e in topology.edges()}
61
61
 
62
62
  # input, immutable
63
63
  # numpy
@@ -70,7 +70,7 @@ def equilibrium_state_numpy(topology, tmax=100, eta=1e-6, verbose=False, callbac
70
70
  # edge planes
71
71
  edge_planes = {}
72
72
  for edge in topology.trail_edges():
73
- plane = topology.edge_attribute(edge, "plane")
73
+ plane = topology.edge_plane(edge)
74
74
  if not plane:
75
75
  continue
76
76
  plane = [np.array(vector) for vector in plane]
@@ -82,6 +82,7 @@ def equilibrium_state_numpy(topology, tmax=100, eta=1e-6, verbose=False, callbac
82
82
  # output
83
83
  reaction_forces = {}
84
84
  trail_forces = {}
85
+ trail_directions = {}
85
86
 
86
87
  for t in range(tmax): # max iterations
87
88
 
@@ -152,11 +153,15 @@ def equilibrium_state_numpy(topology, tmax=100, eta=1e-6, verbose=False, callbac
152
153
  # compute trail force
153
154
  trail_force = length_vector_numpy(rvec) # always positive
154
155
 
156
+ # compute trail direction by normalizing residual vector
155
157
  # NOTE: to avoid NaNs, do not normalize residual vector if it is zero length
156
158
  nrvec = rvec / trail_force
157
159
  if np.isnan(length_vector_numpy(nrvec)):
158
160
  nrvec = rvec
159
161
 
162
+ # store trail direction
163
+ trail_directions[edge] = nrvec
164
+
160
165
  # store next node position
161
166
  next_pos = pos + length * nrvec
162
167
  node_xyz[next_node] = next_pos
@@ -203,13 +208,14 @@ def equilibrium_state_numpy(topology, tmax=100, eta=1e-6, verbose=False, callbac
203
208
  eq_state = {}
204
209
  eq_state["node_xyz"] = node_xyz
205
210
  eq_state["trail_forces"] = trail_forces
211
+ eq_state["trail_directions"] = trail_directions
206
212
  eq_state["reaction_forces"] = reaction_forces
207
213
 
208
214
  # return node_xyz, trail_forces, reaction_forces
209
215
  return eq_state
210
216
 
211
217
 
212
- def form_update(form, node_xyz, trail_forces, reaction_forces):
218
+ def form_update(form, node_xyz, trail_forces, reaction_forces, **kwargs):
213
219
  """
214
220
  Update the node and edge attributes of a form after equilibrating it.
215
221
  """
@@ -0,0 +1,17 @@
1
+ """
2
+ Align the direction of a trail or a deviation edge with a target vector.
3
+ """
4
+
5
+ from ghpythonlib.componentbase import executingcomponent as component
6
+
7
+ from compas_cem.optimization import EdgeDirectionConstraint
8
+ from compas_rhino.geometry import RhinoVector
9
+
10
+
11
+ class EdgeDirectionConstraintComponent(component):
12
+ def RunScript(self, edge_key, vector, weight):
13
+ weight = weight or 1.0
14
+ if not edge_key or not vector:
15
+ return
16
+ vector = RhinoVector.from_geometry(vector).to_compas()
17
+ return EdgeDirectionConstraint(edge_key, vector, weight)
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "Edge Direction Constraint",
3
+ "nickname": "EdgeDirectionConstraint",
4
+ "category": "COMPAS CEM",
5
+ "subcategory": "06_Optimization",
6
+ "description": "Align the direction of a trail or a deviation edge with a target vector.",
7
+ "exposure": 4,
8
+
9
+ "ghpython": {
10
+ "isAdvancedMode": true,
11
+ "inputParameters": [
12
+ {
13
+ "name": "edge_key",
14
+ "description": "The key of a COMPAS CEM trail or deviation edge."
15
+ },
16
+ {
17
+ "name": "vector",
18
+ "description": "The target vector.",
19
+ "typeHintID": "vector"
20
+ },
21
+ {
22
+ "name": "weight",
23
+ "description": "The weight of the constraint in the optimization problem. Defaults to one.",
24
+ "typeHintID": "float"
25
+ }
26
+ ],
27
+ "outputParameters": [
28
+ {
29
+ "name": "constraint",
30
+ "description": "A COMPAS CEM edge direction constraint.",
31
+ "optional": false
32
+ }
33
+ ]
34
+ }
35
+ }
@@ -0,0 +1,16 @@
1
+ """
2
+ Pull the position of a node to a target polyline.
3
+ """
4
+ from ghpythonlib.componentbase import executingcomponent as component
5
+
6
+ from compas_cem.optimization import PolylineConstraint
7
+ from compas_rhino.geometry import RhinoPolyline
8
+
9
+
10
+ class PolylineConstraintComponent(component):
11
+ def RunScript(self, node_key, polyline, weight):
12
+ weight = weight or 1.0
13
+ if node_key is None or not polyline:
14
+ return
15
+ polyline = RhinoPolyline.from_geometry(polyline).to_compas()
16
+ return PolylineConstraint(node_key, polyline, weight)
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "Polyline Constraint",
3
+ "nickname": "PolylineConstraint",
4
+ "category": "COMPAS CEM",
5
+ "subcategory": "06_Optimization",
6
+ "description": "Pull the position of a node to a target polyline.",
7
+ "exposure": 4,
8
+
9
+ "ghpython": {
10
+ "isAdvancedMode": true,
11
+ "inputParameters": [
12
+ {
13
+ "name": "node_key",
14
+ "description": "The key of a COMPAS CEM node.",
15
+ "typeHintID": "int"
16
+ },
17
+ {
18
+ "name": "polyline",
19
+ "description": "The target polyline.",
20
+ "typeHintID": "polyline"
21
+ },
22
+ {
23
+ "name": "weight",
24
+ "description": "The weight of the constraint in the optimization problem. Defaults to one.",
25
+ "typeHintID": "float"
26
+ }
27
+ ],
28
+ "outputParameters": [
29
+ {
30
+ "name": "constraint",
31
+ "description": "A COMPAS CEM node polyline constraint.",
32
+ "optional": false
33
+ }
34
+ ]
35
+ }
36
+ }