You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
59 lines
1.7 KiB
#!/usr/local/bin/python3
|
|
"""
|
|
Script to generate a fixture of a chain with N complex links.
|
|
|
|
Usage: python generate_complex_chainmail_fixture.py N
|
|
"""
|
|
|
|
import json
|
|
import pathlib
|
|
import sys
|
|
|
|
import numpy
|
|
|
|
from fixture_utils import *
|
|
|
|
|
|
def generate_fixture(n_links: int) -> dict:
|
|
"""Generate a fixture of a chain with N complex links."""
|
|
link_geometry_path = (pathlib.Path(__file__).resolve().parent /
|
|
"complex-link.json")
|
|
with open(link_geometry_path) as link_file:
|
|
link_mesh = json.load(link_file)
|
|
vertices = numpy.array(link_mesh["vertices"], dtype=float)
|
|
edges = numpy.array(link_mesh["edges"], dtype=int)
|
|
fixture = generate_default_fixture()
|
|
rigid_bodies = fixture["rigid_body_problem"]["rigid_bodies"]
|
|
for i in range(n_links):
|
|
rigid_bodies.append({
|
|
"vertices": (vertices + [0, -1.9 * i]).tolist(),
|
|
"edges":
|
|
edges.tolist(),
|
|
"velocity": [0.0, -1.0 if i else 0.0, 0.0],
|
|
"is_dof_fixed":
|
|
numpy.full(3, i == 0, dtype=bool).tolist()
|
|
})
|
|
return fixture
|
|
|
|
|
|
def main() -> None:
|
|
"""Parse command-line arguments to generate the desired fixture."""
|
|
assert (len(sys.argv) >= 2)
|
|
|
|
n_links = int(sys.argv[1])
|
|
fixture = generate_fixture(n_links)
|
|
|
|
if (len(sys.argv) > 2):
|
|
out_path = pathlib.Path(sys.argv[2])
|
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
else:
|
|
directory = (pathlib.Path(__file__).resolve().parents[1] / "fixtures" /
|
|
"chain")
|
|
directory.mkdir(parents=True, exist_ok=True)
|
|
out_path = directory / f"complex_{n_links:d}_link_chain.json"
|
|
|
|
save_fixture(fixture, out_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|