Skip to main content

Python bindings for the Flexible Collision Library

Project description

python-fcl

Python Interface for the Flexible Collision Library

Python-FCL is an (unofficial) Python interface for the Flexible Collision Library (FCL), an excellent C++ library for performing proximity and collision queries on pairs of geometric models. Currently, this package is targeted for FCL 0.7.0.

This package supports three types of proximity queries for pairs of geometric models:

  • Collision Detection: Detecting whether two models overlap (and optionally where).
  • Distance Computation: Computing the minimum distance between a pair of models.
  • Continuous Collision Detection: Detecting whether two models overlap during motion (and optionally the time of contact).

This package also supports most of FCL's object shapes, including:

  • TriangleP
  • Box
  • Sphere
  • Ellipsoid
  • Capsule
  • Cone
  • Convex
  • Cylinder
  • Half-Space
  • Plane
  • Mesh
  • OcTree

Installation

First, install octomap, which is necessary to use OcTree. For Ubuntu, use sudo apt-get install liboctomap-dev. Second, install FCL using the instructions provided here. If you're on Ubuntu 17.04 or newer, you can install FCL using sudo apt-get install libfcl-dev. Otherwise, just compile FCL from source -- it's quick and easy, and its dependencies are all easily installed via apt or brew. Note: the provided install scripts (under build_dependencies) can automate this process as well.

In order to install the Python wrappers for FCL, simply run

pip install python-fcl

Objects

Collision Objects

The primary construct in FCL is the CollisionObject, which forms the backbone of all collision and distance computations. A CollisionObject consists of two components -- its geometry, defined by a CollisionGeometry object, and its pose, defined by a Transform object.

Collision Geometries

There are two main types of CollisionGeometry objects -- geometric primitives, such as boxes and spheres, and arbitrary triangular meshes. Here's some examples of how to instantiate geometric primitives. Note that the box, sphere, ellipsoid, capsule, cone, and cylinder are all centered at the origin.

import numpy as np
import fcl

v1 = np.array([1.0, 2.0, 3.0])
v2 = np.array([2.0, 1.0, 3.0])
v3 = np.array([3.0, 2.0, 1.0])
x, y, z = 1, 2, 3
rad, lz = 1.0, 3.0
n = np.array([1.0, 0.0, 0.0])
d = 5.0

t = fcl.TriangleP(v1, v2, v3) # Triangle defined by three points
b = fcl.Box(x, y, z)          # Axis-aligned box with given side lengths
s = fcl.Sphere(rad)           # Sphere with given radius
e = fcl.Ellipsoid(x, y, z)    # Axis-aligned ellipsoid with given radii
c = fcl.Capsule(rad, lz)      # Capsule with given radius and height along z-axis
c = fcl.Cone(rad, lz)         # Cone with given radius and cylinder height along z-axis
c = fcl.Cylinder(rad, lz)     # Cylinder with given radius and height along z-axis
h = fcl.Halfspace(n, d)       # Half-space defined by {x : <n, x> < d}
p = fcl.Plane(n, d)           # Plane defined by {x : <n, x> = d}

Triangular meshes are wrapped by the BVHModel class, and they are instantiated a bit differently.

verts = np.array([[1.0, 1.0, 1.0],
                  [2.0, 1.0, 1.0],
                  [1.0, 2.0, 1.0],
                  [1.0, 1.0, 2.0]])
tris  = np.array([[0,2,1],
                  [0,3,2],
                  [0,1,3],
                  [1,2,3]])

m = fcl.BVHModel()
m.beginModel(len(verts), len(tris))
m.addSubModel(verts, tris)
m.endModel()

If the mesh is convex, such as the example above, you can also wrap it in the Convex class. Note that the instantiation is a bit different because the Convex class supports arbitrary polygons for each face of the convex object.

verts = np.array([[1.0, 1.0, 1.0],
                  [2.0, 1.0, 1.0],
                  [1.0, 2.0, 1.0],
                  [1.0, 1.0, 2.0]])
tris  = np.array([[0,2,1],
                  [0,3,2],
                  [0,1,3],
                  [1,2,3]])
faces = np.concatenate((3 * np.ones((len(tris), 1), dtype=np.int64), tris), axis=1).flatten()
c = fcl.Convex(verts, len(tris), faces)

Transforms

In addition to a CollisionGeometry, a CollisionObject requires a Transform, which tells FCL where the CollisionGeometry is actually located in the world. All Transform objects specify a rigid transformation (i.e. a rotation and a translation). The translation is always a 3-entry vector, while the rotation can be specified by a 3x3 rotation matrix or a 4-entry quaternion.

Here are some examples of possible ways to instantiate and manipulate a Transform.

R = np.array([[0.0, -1.0, 0.0],
              [1.0,  0.0, 0.0],
              [0.0,  0.0, 1.0]])
T = np.array([1.0, 2.0, 3.0])
q = np.array([0.707, 0.0, 0.0, 0.707])

tf = fcl.Transform()     # Default gives identity transform
tf = fcl.Transform(q)    # Quaternion rotation, zero translation
tf = fcl.Transform(R)    # Matrix rotation, zero translation
tf = fcl.Transform(T)    # Translation, identity rotation
tf = fcl.Transform(q, T) # Quaternion rotation and translation
tf = fcl.Transform(R, T) # Matrix rotation and translation
tf1 = fcl.Transform(tf)  # Can also initialize with another Transform

Now, given a CollisionGeometry and a Transform, we can create a CollisionObject:

t = fcl.Transform(R, T)
b = fcl.Box(x, y, z)
obj = fcl.CollisionObject(b, t)

The transform of a collision object can be modified in-place:

t1 = fcl.Transform(R1, T1)
obj.setTransform(t1)   # Using a transform
obj.setRotation(R2)    # Specifying components individually
obj.setTranslation(T2)
obj.setQuatRotation(q2)

Commands

Pairwise Operations

Given a pair of collision objects, this library supports three types of queries:

  • Collision Detection
  • Distance Computation
  • Continuous Collision Detection

The interfaces for each of these operations follow a common pipeline. First, a query request data structure is initialized and populated with parameters. Then, an empty query response structure is initialized. Finally, the query function is called with the two CollisionObject items, the request structure, and the response structure as arguments. The query function returns a scalar result, and any additional information is stored in the query result data structure. Examples of all three operations are shown below.

Collision Checking

g1 = fcl.Box(1,2,3)
t1 = fcl.Transform()
o1 = fcl.CollisionObject(g1, t1)

g2 = fcl.Cone(1,3)
t2 = fcl.Transform()
o2 = fcl.CollisionObject(g2, t2)

request = fcl.CollisionRequest()
result = fcl.CollisionResult()

ret = fcl.collide(o1, o2, request, result)

After calling fcl.collide(), ret contains the number of contacts generated between the two objects, and result contains information about the collision and contacts. For more information about available parameters for collision requests and results, see fcl/collision_data.py.

Distance Checking

g1 = fcl.Box(1,2,3)
t1 = fcl.Transform()
o1 = fcl.CollisionObject(g1, t1)

g2 = fcl.Cone(1,3)
t2 = fcl.Transform()
o2 = fcl.CollisionObject(g2, t2)

request = fcl.DistanceRequest()
result = fcl.DistanceResult()

ret = fcl.distance(o1, o2, request, result)

After calling fcl.distance(), ret contains the minimum distance between the two objects and result contains information about the closest points on the objects. If ret is negative, the objects are in collision. For more information about available parameters for distance requests and results, see fcl/collision_data.py.

Continuous Collision Checking

g1 = fcl.Box(1,2,3)
t1 = fcl.Transform()
o1 = fcl.CollisionObject(g1, t1)
t1_final = fcl.Transform(np.array([1.0, 0.0, 0.0]))

g2 = fcl.Cone(1,3)
t2 = fcl.Transform()
o2 = fcl.CollisionObject(g2, t2)
t2_final = fcl.Transform(np.array([-1.0, 0.0, 0.0]))

request = fcl.ContinuousCollisionRequest()
result = fcl.ContinuousCollisionResult()

ret = fcl.continuousCollide(o1, t1_final, o2, t2_final, request, result)

After calling fcl.continuousCollide(), ret contains the time of contact in (0,1), or 1.0 if the objects did not collide during movement from their initial poses to their final poses. Additionally, result contains information about the collision time and status. For more information about available parameters for continuous collision requests and results, see fcl/collision_data.py.

Broadphase Checking

In addition to pairwise checks, FCL supports broadphase collision/distance queries between groups of objects and can avoid n-squared complexity. Specifically, CollisionObject items are registered with a DynamicAABBTreeCollisionManager before collision or distance checking is performed.

Three types of checks are possible:

  • One-to-many: Collision/distance checking between a stand-alone CollisionObject and all objects managed by a manager.
  • Internal many-to-many: Pairwise collision/distance checking between all pairs of objects managed by a manager.
  • Group many-to-many: Pairwise collision/distance checking between items from two managers.

In general, the collision methods can return all contact pairs, while the distance methods will just return the single closest distance between any pair of objects. Here are some examples of managed collision checking. The methods take a callback function -- use the defaults from python-fcl unless you have a special use case -- and a wrapper object, either CollisionData or DistanceData, that wraps a request-response pair. This object also has a field, done, that tells the recursive collision checker when to quit. Be sure to use a new Data object for each request or set the done attribute to False before reusing one.

objs1 = [fcl.CollisionObject(box), fcl.CollisionObject(sphere)]
objs2 = [fcl.CollisionObject(cone), fcl.CollisionObject(mesh)]

manager1 = fcl.DynamicAABBTreeCollisionManager()
manager2 = fcl.DynamicAABBTreeCollisionManager()

manager1.registerObjects(objs1)
manager2.registerObjects(objs2)

manager1.setup()
manager2.setup()

#=====================================================================
# Managed internal (sub-n^2) collision checking
#=====================================================================
cdata = fcl.CollisionData()
manager1.collide(cdata, fcl.defaultCollisionCallback)
print 'Collision within manager 1?: {}'.format(cdata.result.is_collision)

##=====================================================================
## Managed internal (sub-n^2) distance checking
##=====================================================================
ddata = fcl.DistanceData()
manager1.distance(ddata, fcl.defaultDistanceCallback)
print 'Closest distance within manager 1?: {}'.format(ddata.result.min_distance)

#=====================================================================
# Managed one to many collision checking
#=====================================================================
req = fcl.CollisionRequest(num_max_contacts=100, enable_contact=True)
rdata = fcl.CollisionData(request = req)

manager1.collide(fcl.CollisionObject(mesh), rdata, fcl.defaultCollisionCallback)
print 'Collision between manager 1 and Mesh?: {}'.format(rdata.result.is_collision)
print 'Contacts:'
for c in rdata.result.contacts:
    print '\tO1: {}, O2: {}'.format(c.o1, c.o2)

#=====================================================================
# Managed many to many collision checking
#=====================================================================
rdata = fcl.CollisionData(request = req)
manager1.collide(manager2, rdata, fcl.defaultCollisionCallback)
print 'Collision between manager 1 and manager 2?: {}'.format(rdata.result.is_collision)
print 'Contacts:'
for c in rdata.result.contacts:
    print '\tO1: {}, O2: {}'.format(c.o1, c.o2)

Extracting Which Objects Are In Collision

To determine which objects are actually in collision, you'll need parse the collision data's contacts and use an additional external data structure.

Specifically, the fcl.CollisionData object that is passed into any collide() call has an internal set of contacts, stored in cdata.result.contacts. This object is a simple list of Contact objects, each of which represents a contact point between two objects. Each contact object has two attributes, o1 and o2, that store references to the original fcl.CollisionGeometry objects were created for the two fcl.CollisionObject objects that are in collision. This is a bit wonky, but it's part of the FCL API.

Therefore, all you have to do is make a map from the id of each fcl.CollisionGeometry object to either the actual fcl.CollisionObject it corresponds to or to some string identifier for each object. Then, you can iterate over cdata.result.contacts, extract o1 and o2, apply the built-in id() function to each, and find the corresponding data you want in your map.

Here's an example.

import fcl
import numpy as np

# Create collision geometry and objects
geom1 = fcl.Cylinder(1.0, 1.0)
obj1 = fcl.CollisionObject(geom1)

geom2 = fcl.Cylinder(1.0, 1.0)
obj2 = fcl.CollisionObject(geom2, fcl.Transform(np.array([0.0, 0.0, 0.3])))

geom3 = fcl.Cylinder(1.0, 1.0)
obj3 = fcl.CollisionObject(geom3, fcl.Transform(np.array([0.0, 0.0, 3.0])))

geoms = [geom1, geom2, geom3]
objs = [obj1, obj2, obj3]
names = ['obj1', 'obj2', 'obj3']

# Create map from geometry IDs to objects
geom_id_to_obj = { id(geom) : obj for geom, obj in zip(geoms, objs) }

# Create map from geometry IDs to string names
geom_id_to_name = { id(geom) : name for geom, name in zip(geoms, names) }

# Create manager
manager = fcl.DynamicAABBTreeCollisionManager()
manager.registerObjects(objs)
manager.setup()

# Create collision request structure
crequest = fcl.CollisionRequest(num_max_contacts=100, enable_contact=True)
cdata = fcl.CollisionData(crequest, fcl.CollisionResult())

# Run collision request
manager.collide(cdata, fcl.defaultCollisionCallback)

# Extract collision data from contacts and use that to infer set of
# objects that are in collision
objs_in_collision = set()

for contact in cdata.result.contacts:
    # Extract collision geometries that are in contact
    coll_geom_0 = contact.o1
    coll_geom_1 = contact.o2

    # Get their names
    coll_names = [geom_id_to_name[id(coll_geom_0)], geom_id_to_name[id(coll_geom_1)]]
    coll_names = tuple(sorted(coll_names))
    objs_in_collision.add(coll_names)

for coll_pair in objs_in_collision:
    print('Object {} in collision with object {}!'.format(coll_pair[0], coll_pair[1]))
>>> Object obj1 in collision with object obj2!

For more examples, see examples/example.py.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

python_fcl-0.7.0.10-cp314-cp314t-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14tWindows x86-64

python_fcl-0.7.0.10-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp314-cp314t-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

python_fcl-0.7.0.10-cp314-cp314t-macosx_10_15_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

python_fcl-0.7.0.10-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

python_fcl-0.7.0.10-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp314-cp314-macosx_10_15_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

python_fcl-0.7.0.10-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

python_fcl-0.7.0.10-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp313-cp313-macosx_10_13_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

python_fcl-0.7.0.10-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

python_fcl-0.7.0.10-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp312-cp312-macosx_10_13_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

python_fcl-0.7.0.10-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

python_fcl-0.7.0.10-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp311-cp311-macosx_10_9_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

python_fcl-0.7.0.10-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

python_fcl-0.7.0.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp310-cp310-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp310-cp310-macosx_10_9_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

python_fcl-0.7.0.10-cp39-cp39-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9Windows x86-64

python_fcl-0.7.0.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

python_fcl-0.7.0.10-cp39-cp39-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

python_fcl-0.7.0.10-cp39-cp39-macosx_10_9_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 6ab961f459c294695385d518f7a6eb3a2577029ca008698045dac2b7253fa3f7
MD5 1f215c25449c159ecbd9fe476950c914
BLAKE2b-256 b906a4ddfd46794c7d6e175c34e8c10554949d1c17aeb78c188050b4746d4b48

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9bce8f0823bdf040a2b0668599afdcb7405ac7e6a272ffedf0c6acd6756d082e
MD5 a5e5dfc785e602f7e70677082260297d
BLAKE2b-256 032759296f3280169d3e39d29cfe8170e8edeaecb38270dacf467571c2ee85d0

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c6dd8534085f48d41b5171ae0f397b6d34ca046194826ff4dfa17a2139f323fa
MD5 401f16920c323dd91790efabbd532fa3
BLAKE2b-256 6e3fc664eb49a2370b0bdf6e98ec3927b45c2ded45b20db4bb325c606089bfbd

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e8f20a2e76c3728b4dc6741cb99dd2b0fdcb26e77bd24d3036b2d78fae398743
MD5 ae0468e50cf386b52a4d80576abbf82f
BLAKE2b-256 a6fc8c29bcbf7a0dc8419cec46e1081e4e5e981a018fce0669cc9cd5df824ee6

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 978f4f187ed04dcacb2ed975c081899a587bcbd053eafffc40abc6d0aefd2269
MD5 b04df2dcd13a5a9a9274c9751b939154
BLAKE2b-256 037768cd8914605a5d6657ba13c21d1d8c16000c4e8acc49237866c94a0a63ad

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 518391eee8033fdbae0e5de12644978c3ffe7c7c9ec0b2712fe9e501372022db
MD5 7befe5c39fa8513eaba44a990d905f54
BLAKE2b-256 c8c7c3f9832eabdfbe597691f43e59ee50af024a2152f8ff8fa7b12d9fd1e15f

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 288e60098004f41c458ac6835f00a87241ddcb2364476156f23cd040963c4e32
MD5 72ca493b303fae394dbce9e0c4d5e356
BLAKE2b-256 b2f54964d80affcf581b2e55a068737448f46ca48ad07281913e450e55d793a3

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3791d32c35b50f7b8b3941ecf3b6f8435ede3db16cf9255ef5577a78291dd954
MD5 3477e2a9f8d651fb7191a96f62b89c44
BLAKE2b-256 45db220c122653624901fdd50bfdb4f4103f326b2d5438d208af286ae4b6bf26

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7f2014f29a7ba65c9c4be2bd1ad1c80d91079b1e94f06fb59abbe4595b73d3a2
MD5 2726b9b75895eb87d74fd2eba878b94b
BLAKE2b-256 0814405b88ce34e2d05d4765b58b7f1f99b9afd91eef9bf4807ef6310669fed0

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c905bc8b6ebf86524d958b3f17e28f5f033331aed9dd8610c6896243a0003e4c
MD5 cf43d31f7c4bd27cbaa9b2f8f34d4076
BLAKE2b-256 576d344c46667901b4b0c64a44fa0f73ef4d9ce1757d86129083b820a27971b3

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb9bf7e768a433c3eabd0cae73c1a9c411f590b49d73eb38c91bb88f44b782cc
MD5 9b97e4c9d6d82091f7eef08a9c243755
BLAKE2b-256 00b6609147335621a9244bca472da4938a6145429803f67d1eb75722797058a7

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8bb37579eea7043cf8a2aa2ab7ee705e8438a08d22dcf7ebaf0c8ec6dfcf89b2
MD5 0a4933c4d7167bef856154e7547b0c1c
BLAKE2b-256 d7af28dd814aeeea6ca7ae7c6ceee3e8d44a9006158cec1b1b7da40cd68d562f

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 10ef439be61b591928ae0081f749b34aa68ca5a60504f60adbcbe19106d4b2bd
MD5 75ea78b30f724b5cb6235ea6f846daa8
BLAKE2b-256 03db324bba54308477bac0c9b3c6b5b91cbb0c2b4c65c4dc08c9cabc8adb215a

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2ad9b66dedd1f267bb1cc27a8c27fdefb180e9f782b8e670ef3a7e59bc6aec8d
MD5 4c77131181dc73524ec5293984aabb12
BLAKE2b-256 9746bda2b85d827b7c05effbac3563d8cd7635baa7e939fc8c183a0455ab973a

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 471f7f5c2cac5397835f009bb7d8f4efed86ab5ac232cf85f35f99d15bbab832
MD5 fb4fedd68b59552f13c00cf00b55f599
BLAKE2b-256 3d719761bd7f2d89e45afc199c797a6e70c556134b56827983fb874231f0affb

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 151112db1ab2cd9245046054cd632e6a6441a178704c69e40f2b4d040093be2c
MD5 098f4418ef0a0b414899511ddac42096
BLAKE2b-256 0d199453f061ef50746c8e1bc0b15b3549d8ec599e8d1b13413d0b44b4307775

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b569acd01fc9e86f83b2c185a299301ab494143fdb46b0c57c81aa657696a6a5
MD5 aa6d2497151cb7393e0fa9755f29fd30
BLAKE2b-256 9b63d4b8b2735806710835e94614c57551564218c25900eb47f62652b8250ff3

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f942fe9307287f9c4dd6288881883afe29c80730e670cd0ad83851d2d0e27fcd
MD5 da5613301b82bf14534cbfc38a9fe524
BLAKE2b-256 c671cfe8928d36463972a011afb127dfdf18f903dab4184f2cffdf818e592514

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4a4218ca935ca2306ac0f43600ca159919470e0702532dff14bace3e06ef98c2
MD5 7fc9ed9ce560e53a59a05a094bc27125
BLAKE2b-256 3216c468f3b2a5bef5ae0662b4a44ec1baf660c383b229a7836e636d83568d02

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 81eaf143c5fe478928c7012b26ab98f75deda2b01abff4f633b54a75bfa35eae
MD5 aeaf6b870c9829bdf45e4c4d76e86c81
BLAKE2b-256 68a662d3426e438991c1c97c6483045da8c22fd037972b9299fcf3e6e80b7c9e

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a25ffd460c1bfdcd296ad97bccff5bd7696cf5311e73260c1dcf46262cc84113
MD5 bce587d73f048961f76f226c53563909
BLAKE2b-256 9b6f4fc417d2e2ed7c2cc826ab992e06ce7297fec8966343be8d2f4ce74c4147

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3252c0e8420857e6a08a703be46a65b97d089bab8a571f4ddc3d3c9b604f665
MD5 a0407e5bc0386246d4d1cbeb5ad151d4
BLAKE2b-256 b184a13e09672d86eb12d6614537a30c649feedd143b56a2ce659723e64a3068

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9877c731ad80971afa89d87e8adb2edcd80c2804ad214dc7767661c33a40c5c0
MD5 0fa777a0d2831467640388de0a0bc99d
BLAKE2b-256 d5e40e3a47dba337c66f68468a5dcc4737a83b055347783de25bf2f1cee8d3f6

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9a2428768f6d1d3dab1e3f7ccbae3cd5e36287e74e1006773fdc5c1fc908b375
MD5 090132aecd5fa53a97231699c9834f14
BLAKE2b-256 ecff5f095a3f8a4ba918b14f61d6566fd50dcad0beb0f8f8e7f9569f4fc70469

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b0071f8546353fd6ec8d32173088782fcb40e28104f3c0a3e3dc53524b45be10
MD5 8011ca98b6115ffad121d23ecad6aa42
BLAKE2b-256 6c867fa7e020ce52f53566bd812775c750d12676051724255698083688d1d0c1

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 36b528f9a747c53cab3562a6f61f37f7d6adc1ee4794f1ac05483e0517ba260f
MD5 f2c8d5d15f40b6aa06acb876fdcb4884
BLAKE2b-256 d5fdd8bc72041ab1ab8e769756f94ba7ac9c8cd075acf4d9b624f0db065cde48

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 65961e64db1c93bc2ace10bb35edc4759f263a2a9ecd8a8dc21eaa0ced1ccbe9
MD5 372a0e9b612f372029261e9b57b8d9a0
BLAKE2b-256 df10e7f775d10f138f94f3882dfcb5ad12ca0a91ea3c22bc7eaa0658c53fb184

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.10-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.10-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e521e53f7f667c7bfc65cb423eceb7efb70b7cb5ef86b066bbc7e45741ead47e
MD5 52c280373bdcf6265e17ed8fe0dde275
BLAKE2b-256 688cb4a9a1fe3d16dc2dfc8cd992be6d201dfe33a68d6f336ca845d48072c758

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page